From xen-devel-bounces@lists.xensource.com Tue Nov 01 02:23:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 02:23:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLAZ7-0002hl-LS; Tue, 01 Nov 2011 02:23:30 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLAYJ-0002VA-Vh
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 02:22:40 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1320139344!53277415!1
X-Originating-IP: [213.199.154.204]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29233 invoked from network); 1 Nov 2011 09:22:24 -0000
Received: from am1ehsobe001.messaging.microsoft.com (HELO
	AM1EHSOBE001.bigfish.com) (213.199.154.204)
	by server-15.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	1 Nov 2011 09:22:24 -0000
Received: from mail42-am1-R.bigfish.com (10.3.201.245) by
	AM1EHSOBE001.bigfish.com (10.3.204.21) with Microsoft SMTP Server id
	14.1.225.22; Tue, 1 Nov 2011 09:22:23 +0000
Received: from mail42-am1 (localhost.localdomain [127.0.0.1])	by
	mail42-am1-R.bigfish.com (Postfix) with ESMTP id 08C51E702AE;
	Tue,  1 Nov 2011 09:22:30 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzc85dhzz1202hzz8275bhz32i668h839h34h61h)
X-Spam-TCS-SCL: 0:0
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
X-FB-SS: 0,0,
Received: from mail42-am1 (localhost.localdomain [127.0.0.1]) by mail42-am1
	(MessageSwitch) id 1320139349669123_18868;
	Tue,  1 Nov 2011 09:22:29 +0000 (UTC)
Received: from AM1EHSMHS003.bigfish.com (unknown [10.3.201.247])	by
	mail42-am1.bigfish.com (Postfix) with ESMTP id 94564BE8053;
	Tue,  1 Nov 2011 09:22:29 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	AM1EHSMHS003.bigfish.com (10.3.207.103) with Microsoft SMTP Server id
	14.1.225.22; Tue, 1 Nov 2011 09:22:21 +0000
X-WSS-ID: 0LTZ61H-02-3O3-02
X-M-MSG: 
Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com
	[163.181.249.73])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 2DDA2C8286;	Tue,  1 Nov 2011 04:22:28 -0500 (CDT)
Received: from SAUSEXDAG03.amd.com (163.181.55.3) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Tue, 1 Nov 2011 04:23:00 -0500
Received: from storexhtp02.amd.com (172.24.4.4) by sausexdag03.amd.com
	(163.181.55.3) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Tue, 1 Nov 2011 04:22:30 -0500
Received: from rhodium.osrc.amd.com (165.204.15.173) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.83.0;
	Tue, 1 Nov 2011 05:22:28 -0400
Message-ID: <4EAFBA53.4050009@amd.com>
Date: Tue, 1 Nov 2011 10:22:27 +0100
From: Christoph Egger <Christoph.Egger@amd.com>
User-Agent: Mozilla/5.0 (X11; U; NetBSD amd64; en-US;
	rv:1.9.2.17) Gecko/20110523 Lightning/1.0b3pre Thunderbird/3.1.10
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, Ian
	Jackson <Ian.Jackson@eu.citrix.com>
Content-Type: multipart/mixed; boundary="------------090801060704090003040100"
X-OriginatorOrg: amd.com
Cc: 
Subject: [Xen-devel] [PATCH] tools/ocaml: unify build process
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------090801060704090003040100
Content-Type: text/plain; charset="ISO-8859-15"; format=flowed
Content-Transfer-Encoding: 7bit


Unify ocaml build process for different platforms.

Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>

P.S.: Please apply this to xen-4.1-testing



-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632

--------------090801060704090003040100
Content-Type: text/plain; name="xen_tools_build.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="xen_tools_build.diff"
Content-Description: xen_tools_build.diff

diff -r 0d092359d86f tools/ocaml/common.make
--- a/tools/ocaml/common.make	Wed Oct 26 10:32:36 2011 +0200
+++ b/tools/ocaml/common.make	Tue Nov 01 10:05:59 2011 +0100
@@ -8,9 +8,7 @@ OCAMLDEP ?= ocamldep
 OCAMLLEX ?= ocamllex
 OCAMLYACC ?= ocamlyacc
 
-CFLAGS += -fPIC -Werror
-CFLAGS-$(CONFIG_Linux) += -I$(shell ocamlc -where)
-CFLAGS-$(CONFIG_NetBSD) += -I/usr/pkg/lib/ocaml -fPIC
+CFLAGS += -fPIC -Werror -I$(shell ocamlc -where)
 
 OCAMLOPTFLAG_G := $(shell $(OCAMLOPT) -h 2>&1 | sed -n 's/^  *\(-g\) .*/\1/p')
 OCAMLOPTFLAGS = $(OCAMLOPTFLAG_G) -ccopt "$(LDFLAGS)" -dtypes $(OCAMLINCLUDE) -cc $(CC) -w F -warn-error F

--------------090801060704090003040100
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------090801060704090003040100--


From xen-devel-bounces@lists.xensource.com Tue Nov 01 04:04:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 04:04:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLC8x-0005qv-5z; Tue, 01 Nov 2011 04:04:35 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLC86-0005eY-87
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 04:03:42 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320145383!61458161!1
X-Originating-IP: [216.32.180.31]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21359 invoked from network); 1 Nov 2011 11:03:04 -0000
Received: from va3ehsobe005.messaging.microsoft.com (HELO
	VA3EHSOBE005.bigfish.com) (216.32.180.31)
	by server-2.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	1 Nov 2011 11:03:04 -0000
Received: from mail24-va3-R.bigfish.com (10.7.14.249) by
	VA3EHSOBE005.bigfish.com (10.7.40.25) with Microsoft SMTP Server id
	14.1.225.22; Tue, 1 Nov 2011 11:03:24 +0000
Received: from mail24-va3 (localhost [127.0.0.1])	by mail24-va3-R.bigfish.com
	(Postfix) with ESMTP id 4387E80496;
	Tue,  1 Nov 2011 11:03:20 +0000 (UTC)
X-SpamScore: 0
X-BigFish: VPS0(zzc85dhzz1202hzz8275bhz2dh668h839h34h61h)
X-Spam-TCS-SCL: 0:0
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPV:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
Received: from mail24-va3 (localhost.localdomain [127.0.0.1]) by mail24-va3
	(MessageSwitch) id 1320145399961417_18824;
	Tue,  1 Nov 2011 11:03:19 +0000 (UTC)
Received: from VA3EHSMHS011.bigfish.com (unknown [10.7.14.240])	by
	mail24-va3.bigfish.com (Postfix) with ESMTP id B4431220042;
	Tue,  1 Nov 2011 11:03:19 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	VA3EHSMHS011.bigfish.com (10.7.99.21) with Microsoft SMTP Server id
	14.1.225.22; Tue, 1 Nov 2011 11:03:19 +0000
X-WSS-ID: 0LTZAPT-02-348-02
X-M-MSG: 
Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com
	[163.181.249.73])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 24D9CC8288;	Tue,  1 Nov 2011 06:03:29 -0500 (CDT)
Received: from SAUSEXDAG01.amd.com (163.181.55.1) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Tue, 1 Nov 2011 06:04:01 -0500
Received: from storexhtp02.amd.com (172.24.4.4) by sausexdag01.amd.com
	(163.181.55.1) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Tue, 1 Nov 2011 06:03:31 -0500
Received: from rhodium.osrc.amd.com (165.204.15.173) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.83.0;
	Tue, 1 Nov 2011 07:03:30 -0400
Message-ID: <4EAFD200.4010207@amd.com>
Date: Tue, 1 Nov 2011 12:03:28 +0100
From: Christoph Egger <Christoph.Egger@amd.com>
User-Agent: Mozilla/5.0 (X11; U; NetBSD amd64; en-US;
	rv:1.9.2.17) Gecko/20110523 Lightning/1.0b3pre Thunderbird/3.1.10
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, Ian
	Jackson <Ian.Jackson@eu.citrix.com>
Content-Type: multipart/mixed; boundary="------------030207080900090009000306"
X-OriginatorOrg: amd.com
Cc: 
Subject: [Xen-devel] [PATCH] libxl: allow to enable/disable cpuid bits
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------030207080900090009000306
Content-Type: text/plain; charset="ISO-8859-15"; format=flowed
Content-Transfer-Encoding: 7bit


Allow to enable/disable SVM specific cpuid bits
in the guest config file via cpuid config option.
Also allow to enable/disable the hypervisor cpuid bit
in the guest config file. We need to disable the
hypervisor cpuid bit to get Hyper-V going.

Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>

-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632

--------------030207080900090009000306
Content-Type: text/plain; name="xen_tools_libxl_cpuid.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="xen_tools_libxl_cpuid.diff"
Content-Description: xen_tools_libxl_cpuid.diff

diff -r 0d092359d86f tools/libxl/libxl_cpuid.c
--- a/tools/libxl/libxl_cpuid.c	Wed Oct 26 10:32:36 2011 +0200
+++ b/tools/libxl/libxl_cpuid.c	Tue Nov 01 11:59:17 2011 +0100
@@ -92,6 +92,7 @@ int libxl_cpuid_parse_config(libxl_cpuid
         {"proccount",    0x00000001, NA, CPUID_REG_EBX, 16,  8},
         {"clflush",      0x00000001, NA, CPUID_REG_EBX,  8,  8},
         {"brandid",      0x00000001, NA, CPUID_REG_EBX,  0,  8},
+        {"raz",          0x00000001, NA, CPUID_REG_ECX, 31,  1},
         {"f16c",         0x00000001, NA, CPUID_REG_ECX, 29,  1},
         {"avx",          0x00000001, NA, CPUID_REG_ECX, 28,  1},
         {"osxsave",      0x00000001, NA, CPUID_REG_ECX, 27,  1},
@@ -178,6 +179,13 @@ int libxl_cpuid_parse_config(libxl_cpuid
         {"procpkg",      0x00000004,  0, CPUID_REG_EAX, 26,  6},
         {"apicidsize",   0x80000008, NA, CPUID_REG_ECX, 12,  4},
         {"nc",           0x80000008, NA, CPUID_REG_ECX,  0,  8},
+        {"svm_npt",      0x8000000a, NA, CPUID_REG_EDX,  0,  1},
+        {"svm_lbrv",     0x8000000a, NA, CPUID_REG_EDX,  1,  1},
+        {"svm_nrips",    0x8000000a, NA, CPUID_REG_EDX,  3,  1},
+        {"svm_tscrate",  0x8000000a, NA, CPUID_REG_EDX,  4,  1},
+        {"svm_vmcbclean",0x8000000a, NA, CPUID_REG_EDX,  5,  1},
+        {"svm_decode",   0x8000000a, NA, CPUID_REG_EDX,  7,  1},
+        {"svm_pausefilt",0x8000000a, NA, CPUID_REG_EDX, 10,  1},
 
         {NULL, 0, CPUID_REG_INV, 0, 0}
     };

--------------030207080900090009000306
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------030207080900090009000306--


From xen-devel-bounces@lists.xensource.com Tue Nov 01 04:32:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 04:32:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLCZq-0006gH-Ph; Tue, 01 Nov 2011 04:32:22 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLCZ9-0006U4-G9
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 04:31:39 -0700
X-Env-Sender: dokter@icg.tugraz.at
X-Msg-Ref: server-14.tower-27.messagelabs.com!1320146979!42615315!1
X-Originating-IP: [129.27.2.202]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18073 invoked from network); 1 Nov 2011 11:29:40 -0000
Received: from smtp.tu-graz.ac.at (HELO mailrelay.tugraz.at) (129.27.2.202)
	by server-14.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 11:29:40 -0000
Received: from [10.0.24.109] ([84.115.181.40]) (authenticated bits=0)
	by mailrelay2.tugraz.at (8.14.4/8.14.4) with ESMTP id pA1BVUhd007604
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO)
	for <xen-devel@lists.xensource.com>;
	Tue, 1 Nov 2011 12:31:34 +0100 (CET)
X-DKIM: Sendmail DKIM Filter v2.8.3 mailrelay2.tugraz.at pA1BVUhd007604
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tugraz.at;
	s=mailrelay; t=1320147095; i=@icg.tugraz.at;
	bh=5Rin+ROLHjXdDV7MLWEuELMMkjJ3mw3vBg9VBGGnOS0=;
	h=Message-ID:Date:From:Reply-To:MIME-Version:To:Subject:References:
	In-Reply-To:Content-Type:Content-Transfer-Encoding;
	b=nsdfoHNqRTrhgl0dCS653nnsYGAb1948ChOcOSN1nRV7ijoUJG3Wjmyka9CiaW4JG
	bkoAaW6PO7DLcO+oHyYNUEYLTQTW+tRNaVXzJZcOrmf9OFEmccQehM3UoyTPlvtjTI
	tlKVTgvR28AdxdoKvnfDcNynQKEwQHPbx+oWWlaE=
Message-ID: <4EAFD891.8000204@icg.tugraz.at>
Date: Tue, 01 Nov 2011 12:31:29 +0100
From: Mark Dokter <dokter@icg.tugraz.at>
Organization: Institute for Computer Graphics and Vision
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20111031 Thunderbird/7.0.1
MIME-Version: 1.0
To: xen-devel@lists.xensource.com
Subject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark with
	Ubuntu 11.10
References: <20111031214036.GG12984@reaktio.net>
In-Reply-To: <20111031214036.GG12984@reaktio.net>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
X-TUG-Backscatter-control: rFbaswCq5sZ4TcOS98kMZA
X-Spam-Scanner: SpamAssassin 3.003000 
X-Spam-Score-relay: 2.2
X-Scanned-By: MIMEDefang 2.70 on 129.27.10.19
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: dokter@icg.tugraz.at
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 10/31/2011 10:40 PM, Pasi Kärkkäinen wrote:
> Hello,
> 


Hi!

> http://www.phoronix.com/scan.php?page=article&item=ubuntu_1110_xenkvm&num=1
> 
> Ubuntu 11.10 with Xen 4.1.1 and Linux 3.0.
> 

I've read the article and was surprised.

> Xen seems to be doing very poorly on that benchmark.
> If someone has time to repeat that benchmark it would be good..
> 
> Comparing the results to those from Stefano from XenSummit 2011 NA there has be something wrong..
> the results at XenSummit were pretty much the opposite compared to those by Phoronix.
> 

In that test, the KVM machine uses virtio disk and nic devices, while
the Xen machine uses the qemu emulated devices. Could that be the cause
for the poor performance?

> -- Pasi

Mark

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 04:59:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 04:59:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLD08-0007oR-UI; Tue, 01 Nov 2011 04:59:32 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLCy3-0007az-LT
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 04:57:24 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320148639!2459015!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24864 invoked from network); 1 Nov 2011 11:57:20 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 11:57:20 -0000
X-IronPort-AV: E=Sophos;i="4.69,437,1315195200"; d="scan'208";a="168911274"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 07:57:18 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Tue, 1 Nov 2011
	07:57:18 -0400
Message-ID: <1320148634.3084.12.camel@cthulhu.hellion.org.uk>
Subject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark with
	Ubuntu 11.10
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "dokter@icg.tugraz.at" <dokter@icg.tugraz.at>
Date: Tue, 1 Nov 2011 20:57:14 +0900
In-Reply-To: <4EAFD891.8000204@icg.tugraz.at>
References: <20111031214036.GG12984@reaktio.net>
	<4EAFD891.8000204@icg.tugraz.at>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-11-01 at 07:31 -0400, Mark Dokter wrote:
> In that test, the KVM machine uses virtio disk and nic devices, while
> the Xen machine uses the qemu emulated devices. Could that be the cause
> for the poor performance?

Very much so. Without using the PVHVM drivers in the Xen case this is
very much an apples to oranges comparison.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 05:20:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 05:20:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLDK2-0008US-1f; Tue, 01 Nov 2011 05:20:06 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLDJ9-0008Hv-Kx
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 05:19:12 -0700
X-Env-Sender: bderzhavets@yahoo.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1320149920!55503103!1
X-Originating-IP: [98.139.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9093 invoked from network); 1 Nov 2011 12:18:40 -0000
Received: from nm25-vm0.bullet.mail.ac4.yahoo.com (HELO
	nm25-vm0.bullet.mail.ac4.yahoo.com) (98.139.52.240)
	by server-6.tower-27.messagelabs.com with SMTP;
	1 Nov 2011 12:18:40 -0000
Received: from [98.139.52.192] by nm25.bullet.mail.ac4.yahoo.com with NNFMP;
	01 Nov 2011 12:19:07 -0000
Received: from [98.139.52.132] by tm5.bullet.mail.ac4.yahoo.com with NNFMP;
	01 Nov 2011 12:19:07 -0000
Received: from [127.0.0.1] by omp1015.mail.ac4.yahoo.com with NNFMP;
	01 Nov 2011 12:19:07 -0000
X-Yahoo-Newman-Property: ymail-3
X-Yahoo-Newman-Id: 863406.86217.bm@omp1015.mail.ac4.yahoo.com
Received: (qmail 5742 invoked by uid 60001); 1 Nov 2011 12:19:07 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024;
	t=1320149947; bh=vsM4W27J3D4TcCh+XK3z9NGquVUV6+1/Q3aIcjT7/0E=;
	h=X-YMail-OSG:Received:X-Mailer:Message-ID:Date:From:Subject:To:In-Reply-To:MIME-Version:Content-Type;
	b=EUHk4j5o6ishTligfvgFkxQxiwwwyeTVtkzi60HSmBafaxgoBifoxODGndmy3zZJ7m2iMeFWJv0uLQ/xBBPs7u8x8p8pUDQ/rfKKzBugPHGPJkiOnSMy8LwY8W9g5wMyudV9dIwNDgRo/1ZU5xT1YY2LAA/ZfudgjACfJgsm7Q0=
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com;
	h=X-YMail-OSG:Received:X-Mailer:Message-ID:Date:From:Subject:To:In-Reply-To:MIME-Version:Content-Type;
	b=y3crj2qThtz38Q3bmTVyChE272C1lQW6zdx9Ym5WRpNT6Zd7kpIDKSUrzHOJ7ASy68S4sGfb6Z4YWIzee1rf949v71G2WCq9FsWCTCq9VZZn7MFuhKnlCKpNvZ5b74LgT+BqzNBUgHrj/RorEVZxdTsDYbEe0+213Qppk8E7vqY=;
X-YMail-OSG: K9Qc7eAVM1nqsEkOr4A1XxQsW3LrL5leqX9XgpBg7nfl0l6
	hyiNqTZNTlsnehiRGAejlPER39q_ZRz.rTQzhUIxieics6yjsysQ9JzGq6Uj
	.f7G9s2RrFRKZU9nDKYHpdlkYrj5.fuvYbEgBzoCb2ASnq3mQhQxUSndU3gX
	m9rpHbdVb8lnfMg8Kj4M2jWq5EtnFNkX8NA_KrUTGS2lJkk.cmUN_52dJ6dx
	c11IItdVQplKgSLwpxaiP_ICUNcSRkE9KvUgLXa0oxrOJOuvBgrCo2L.UP0y
	TxwAyBdMiT7aZFIgLJX_sGfFckmMGDo2UmZB1qoiqEv9u7SVLi2GKIedBxEg
	OFaks5cnbOVGlFf1Exa6UL4MV2EK2kOxwf6XBc2ri0S6FzLvVh0as.oqQkKQ
	ILUbNOlJU7_GM8kBScVWRQXPi71J4kSAexaAd6dIT3mSa0u6U.9K8dlW2yWu
	jzl6W8XNP7u0DZ026zVpgejKLI32FUUJtMzVgfq4pv51TfuPqIKQa0a_n0c9
	arncq4NetReN7KkrlKTlz7bGfi6FtGeJIcj1pTo3oQdgKiQ8Ona0la64QiEK
	Fi.T1fHwSI.7I.eIPQEC5N7.exw67u0W6zdhDtKp6
Received: from [109.165.34.233] by web65918.mail.ac4.yahoo.com via HTTP;
	Tue, 01 Nov 2011 05:19:07 PDT
X-Mailer: YahooMailClassic/14.0.11 YahooMailWebService/0.8.114.317681
Message-ID: <1320149947.1840.YahooMailClassic@web65918.mail.ac4.yahoo.com>
Date: Tue, 1 Nov 2011 05:19:07 -0700 (PDT)
From: Boris Derzhavets <bderzhavets@yahoo.com>
Subject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark with
	Ubuntu 11.10
To: xen-devel@lists.xensource.com, dokter@icg.tugraz.at
In-Reply-To: <4EAFD891.8000204@icg.tugraz.at>
MIME-Version: 1.0
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============2112597675=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============2112597675==
Content-Type: multipart/alternative;
	boundary="-1719050810-819645898-1320149947=:1840"

---1719050810-819645898-1320149947=:1840
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

Pasi,

Have you asked yourself a question why Fedora and Ubuntu always patch and p=
ackage
Qemu-kvm-0.15(14)(13)(..).1.tar.gz , but not=A0 Qemu-0.15(14)(13)(..).1.tar=
.gz ?
Just install a couple of src.rpms to take a look - what's inside.

Boris.

--- On Tue, 11/1/11, Mark Dokter <dokter@icg.tugraz.at> wrote:

From: Mark Dokter <dokter@icg.tugraz.at>
Subject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark with U=
buntu 11.10
To: xen-devel@lists.xensource.com
Date: Tuesday, November 1, 2011, 7:31 AM

On 10/31/2011 10:40 PM, Pasi K=E4rkk=E4inen wrote:
> Hello,
>=20


Hi!

> http://www.phoronix.com/scan.php?page=3Darticle&item=3Dubuntu_1110_xenkvm=
&num=3D1
>=20
> Ubuntu 11.10 with Xen 4.1.1 and Linux 3.0.
>=20

I've read the article and was surprised.

> Xen seems to be doing very poorly on that benchmark.
> If someone has time to repeat that benchmark it would be good..
>=20
> Comparing the results to those from Stefano from XenSummit 2011 NA there =
has be something wrong..
> the results at XenSummit were pretty much the opposite compared to those =
by Phoronix.
>=20

In that test, the KVM machine uses virtio disk and nic devices, while
the Xen machine uses the qemu emulated devices. Could that be the cause
for the poor performance?

> -- Pasi

Mark

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

---1719050810-819645898-1320149947=:1840
Content-Type: text/html; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

<table cellspacing=3D"0" cellpadding=3D"0" border=3D"0" ><tr><td valign=3D"=
top" style=3D"font: inherit;">Pasi,<br><br>Have you asked yourself a questi=
on why Fedora and Ubuntu always patch and package<br>Qemu-kvm-0.15(14)(13)(=
..).1.tar.gz , but not&nbsp; Qemu-0.15(14)(13)(..).1.tar.gz ?<br>Just insta=
ll a couple of src.rpms to take a look - what's inside.<br><br>Boris.<br><b=
r>--- On <b>Tue, 11/1/11, Mark Dokter <i>&lt;dokter@icg.tugraz.at&gt;</i></=
b> wrote:<br><blockquote style=3D"border-left: 2px solid rgb(16, 16, 255); =
margin-left: 5px; padding-left: 5px;"><br>From: Mark Dokter &lt;dokter@icg.=
tugraz.at&gt;<br>Subject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox=
 benchmark with Ubuntu 11.10<br>To: xen-devel@lists.xensource.com<br>Date: =
Tuesday, November 1, 2011, 7:31 AM<br><br><div class=3D"plainMail">On 10/31=
/2011 10:40 PM, Pasi K=E4rkk=E4inen wrote:<br>&gt; Hello,<br>&gt; <br><br><=
br>Hi!<br><br>&gt; <a
 href=3D"http://www.phoronix.com/scan.php?page=3Darticle&amp;item=3Dubuntu_=
1110_xenkvm&amp;num=3D1" target=3D"_blank">http://www.phoronix.com/scan.php=
?page=3Darticle&amp;item=3Dubuntu_1110_xenkvm&amp;num=3D1</a><br>&gt; <br>&=
gt; Ubuntu 11.10 with Xen 4.1.1 and Linux 3.0.<br>&gt; <br><br>I've read th=
e article and was surprised.<br><br>&gt; Xen seems to be doing very poorly =
on that benchmark.<br>&gt; If someone has time to repeat that benchmark it =
would be good..<br>&gt; <br>&gt; Comparing the results to those from Stefan=
o from XenSummit 2011 NA there has be something wrong..<br>&gt; the results=
 at XenSummit were pretty much the opposite compared to those by Phoronix.<=
br>&gt; <br><br>In that test, the KVM machine uses virtio disk and nic devi=
ces, while<br>the Xen machine uses the qemu emulated devices. Could that be=
 the cause<br>for the poor performance?<br><br>&gt; -- Pasi<br><br>Mark<br>=
<br>_______________________________________________<br>Xen-devel mailing li=
st<br><a
 ymailto=3D"mailto:Xen-devel@lists.xensource.com" href=3D"/mc/compose?to=3D=
Xen-devel@lists.xensource.com">Xen-devel@lists.xensource.com</a><br><a href=
=3D"http://lists.xensource.com/xen-devel" target=3D"_blank">http://lists.xe=
nsource.com/xen-devel</a><br></div></blockquote></td></tr></table>
---1719050810-819645898-1320149947=:1840--


--===============2112597675==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============2112597675==--


From xen-devel-bounces@lists.xensource.com Tue Nov 01 05:28:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 05:28:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLDSN-0000Xk-Oj; Tue, 01 Nov 2011 05:28:43 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLDRd-0000Ky-KH
	for Xen-devel@lists.xensource.com; Tue, 01 Nov 2011 05:27:57 -0700
X-Env-Sender: hongkaixing@huawei.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1320150444!42219138!1
X-Originating-IP: [119.145.14.67]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8846 invoked from network); 1 Nov 2011 12:27:25 -0000
Received: from szxga04-in.huawei.com (HELO szxga04-in.huawei.com)
	(119.145.14.67) by server-10.tower-27.messagelabs.com with SMTP;
	1 Nov 2011 12:27:25 -0000
Received: from huawei.com (szxga04-in [172.24.2.12])
	by szxga04-in.huawei.com (iPlanet Messaging Server 5.2 HotFix 2.14
	(built Aug
	8 2006)) with ESMTP id <0LTZ00HJEEFNL5@szxga04-in.huawei.com> for
	Xen-devel@lists.xensource.com; Tue, 01 Nov 2011 20:23:48 +0800 (CST)
Received: from szxrg02-dlp.huawei.com ([172.24.2.119])
	by szxga04-in.huawei.com (iPlanet Messaging Server 5.2 HotFix 2.14
	(built Aug
	8 2006)) with ESMTP id <0LTZ00L12EEO1A@szxga04-in.huawei.com> for
	Xen-devel@lists.xensource.com; Tue, 01 Nov 2011 20:23:47 +0800 (CST)
Received: from szxeml203-edg.china.huawei.com ([172.24.2.119])
	by szxrg02-dlp.huawei.com (MOS 4.1.9-GA)	with ESMTP id AER34237; Tue,
	01 Nov 2011 20:23:46 +0800
Received: from SZXEML409-HUB.china.huawei.com (10.82.67.136)
	by szxeml203-edg.china.huawei.com (172.24.2.55) with Microsoft SMTP
	Server (TLS) id 14.1.270.1; Tue, 01 Nov 2011 20:23:44 +0800
Received: from SZXEML528-MBS.china.huawei.com ([169.254.5.113])
	by szxeml409-hub.china.huawei.com ([10.82.67.136])
	with mapi id 14.01.0270.001; Tue, 01 Nov 2011 20:23:38 +0800
Date: Tue, 01 Nov 2011 12:23:37 +0000
From: Hongkaixing <hongkaixing@huawei.com>
X-Originating-IP: [10.166.80.196]
To: "olaf@aepfle.de" <olaf@aepfle.de>
Message-id: <E0AF011477D2AE458DC8801E0E570709014C0556@szxeml528-mbs.china.huawei.com>
MIME-version: 1.0
Content-type: text/plain; charset=Windows-1252
Content-language: zh-CN
Content-transfer-encoding: quoted-printable
Accept-Language: zh-CN, en-US
Thread-topic: xenpaing: one way to avoid paging out the page,
	when the corresponding mfn is in use.
Thread-index: AcyYkBoFkms15JzMQkuSzw/WFaUE2g==
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
X-CFilter-Loop: Reflected
Cc: YangXiaowei <xiaowei.yang@huawei.com>,
	"Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	"Eric Li\(Zhentao\)" <lizhentao@huawei.com>,
	Yanqiangjun <yanqiangjun@huawei.com>, hanweidong <hanweidong@huawei.com>
Subject: [Xen-devel] xenpaing: one way to avoid paging out the page,
 when the corresponding mfn is in use.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hello,

   Recently many advanced memory mechanisms are introduced into Xen. One pr=
oblem we found is the conflict between p2m query and setting.
   For example, backend drivers always map domU=92s page to its own space, =
during the mapping procedure, situations as follow may happen,=20
when mfn is obtained by gfn_to_mfn(), this mfn is likely to be paged out.

first case:
   grant mapping                      xenpaing
  mfn =3D gfn_to_mfn();
                       <-----------  p2m_paging_nominate()
         |                                         |
     Check type ok                     paged out;
         |
     try to map
What we want is:=20
When the page (mfn) is accessed by gfn_to_mfn(), this page should never be =
paged out until the mapping action is end.=20

second case:
   grant mapping                            xenpaing=20
                                         p2m_paging_nominate()
                                    =20
                                                 gfn_to_mfn();   =20
  mfn =3D gfn_to_mfn();  ------------->     | =20
                                             check type ok
         |                                               |
     Check type ok                     paged out;
         |
     try to map
What we want is:
When the gfn_to_mfn() action happens during paging nomination, the nominati=
on should abort immediately.

Our solution prototype is like this :
1. Introduce a new member named last_access in page_info struct to save the=
 last access time and access tag.
2. when the mfn is obtained through gfn_to_mfn(), we save time stamp and ac=
cess tag in the page_info.
3. Paging nominate procedure use access information as a criterion.

How it works?=20
1.Using time stamp to avoid case 1. When the mfn is obtained by mapping pro=
cess,=20
   the time stamp can prevent the page from being selected by paging .
2.Using access tag to avoid case 2. During the paging nomination, if the ac=
cess tag of page is detected,=20
   paging should skip selecting this page.=20

The pseudo-code of step 3 can be written as follow:
int p2m_mem_paging_nominate(struct domain *d, unsigned long gfn)
{
  =20
    mfn =3D gfn_to_mfn_noreference(d, gfn, &p2mt);   -----> avoid saving ti=
mestamp and access tag=20
   =20
    if ( !mfn_valid(mfn) )
        goto out;
   =20
    clear_access_tag();   ----------> clear the access tag of this page
    if (test_page_hot())
       goto out;           ------> if the page is accessed recently, go to =
out
    ........
 =20
    set_p2m_entry(d, gfn, mfn, 0, p2m_ram_paging_out);
    if ( test_access_tag ( mfn ) )
        goto out;  --------> if access tag is set, the gfn_to_mfn must have=
 happened above, abort anyway.
    ret =3D 0;
 out:
    p2m_unlock(d->arch.p2m);
    return ret;
}
   Maybe this is an imperfect prototype, do you have any good ideas?

  Hong Kaixing
 =

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 05:48:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 05:48:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLDlT-0001Rb-Qc; Tue, 01 Nov 2011 05:48:28 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLDkS-0001FC-Kh
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 05:47:26 -0700
X-Env-Sender: heinlein@okit.de
X-Msg-Ref: server-14.tower-182.messagelabs.com!1320151639!1506734!1
X-Originating-IP: [87.234.195.223]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15162 invoked from network); 1 Nov 2011 12:47:19 -0000
Received: from yin.okit.de (HELO yin.okit.de) (87.234.195.223)
	by server-14.tower-182.messagelabs.com with SMTP;
	1 Nov 2011 12:47:19 -0000
Received: from [192.168.10.42] (p5DC5ECD0.dip.t-dialin.net [93.197.236.208])
	(using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits))
	(No client certificate requested)
	by pollux.okit.de (Postfix) with ESMTP id 72DDB13A101;
	Tue,  1 Nov 2011 13:47:16 +0100 (CET)
Message-ID: <4EAFEA53.7070009@okit.de>
Date: Tue, 01 Nov 2011 13:47:15 +0100
From: Tobias Heinlein <heinlein@okit.de>
User-Agent: Mutt/1.5.16 (2007-06-09)
MIME-Version: 1.0
To: xen-devel@lists.xensource.com
Subject: Re: [Xen-devel] Re: Xen dom0 linux kernel 3.1 boot failure
	ptwr_emulate: could not get_page_from_l1e
References: <05c3da5dc6158197e28d62e853ac2f04@tjhsst.edu>
	<loom.20111031T140651-901@post.gmane.org>
	<20111031140836.GA9245@phenom.dumpdata.com>
In-Reply-To: <20111031140836.GA9245@phenom.dumpdata.com>
Content-Type: multipart/mixed; boundary="------------010908070500020801070502"
Cc: 2013pfoley@tjhsst.edu
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--------------010908070500020801070502
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

I'm not sure if it was obvious, but yesterday I noticed that setting the
"MPS table mode" to 'Disabled' actually made SMP stop working, i.e. the
kernel only recognized a single CPU. This is of course not an option, so
I enabled (set to 'Full Table APIC') the setting again and played around
with my kernel config a bit. The kernel that crashed had
CONFIG_X86_MPPARSE=y, and if I disable that, it boots fine (with SMP,
and with the BIOS setting set to 'Full Table APIC').

So, I for one am quite happy now as I finally found a working
configuration. But I'd still like to know if this is a hardware-specific
issue, and/or a bug in Xen.

Konrad Rzeszutek Wilk wrote, on 10/31/2011 03:08 PM:
> Oh nice. What does you /proc/interrupts look like compared to
> baremetal?

While I was performing all my kernel tests, I saved the outputs of
`dmesg` and `cat /proc/interrupts`. Sorry for attaching a tarball, but
I'd like to give you as much information as possible. You'll probably
only need the latest tests (#5 to #7), but just in case, I also included
the others.

Contents of the tarball:

Baremetal tests:
xen-hp/1/: MPS mode 'Full Table APIC', CONFIG_X86_MPPARSE=y, SMP working
xen-hp/2/: MPS mode 'Full Table APIC', CONFIG_X86_MPPARSE=n, SMP working
xen-hp/3/: MPS mode 'Disabled', CONFIG_X86_MPPARSE=y, SMP not working
xen-hp/4/: MPS mode 'Disabled', CONFIG_X86_MPPARSE=n, SMP not working

Xen tests:
xen-hp/5/: MPS mode 'Disabled', CONFIG_X86_MPPARSE=n, SMP not working
xen-hp/6/: MPS mode 'Full Table APIC', CONFIG_X86_MPPARSE=n, SMP working
xen-hp/7/: MPS mode 'Full Table APIC', CONFIG_X86_MPPARSE=y, CRASHES

(Therefore, #6 is the best working solution; #7 is what originally
triggered the crash.)

Thanks.


--------------010908070500020801070502
Content-Type: application/x-bzip;
 name="xen-hp.tar.bz2"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="xen-hp.tar.bz2"

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
3vV3de/ZCslSSfAVRVVUX01rRkIsUUUUYW2pQA3o8k8Isz8L7dCSS7qxJJOD4+Svj1ffpEHx
OL3v9/IAGMYx8sbIQaOpkACI9KdFbBYePZvRlcGnzJ8uop9HcVLCtppLLQGkky8gzIqWHk3e
Xf2L7y0RDvF62VV/Ruj8u7hgcQW03q5bNmXTfyw0/soPb4Y/Z8/oj50HTnHD7qM6dsaxq2u+
/G9t+Fuj+760F/uqO1bFvq6ikZq1MWpu8eEGwpS5JaTS3OefGNAnnlPK7jArjin3z/oqLFq6
g1jn0Dfiet/1AxApB+nK/FQFk/itwY+sDBZ/D4cD2E0+nG/C+eKbUBbHcBo4A2X3vY2+Ct95
3vvzT7Oe3nHrlj4/jeVmcVNvb83ZsDNfrX59vu+jrPePjr6T3xvPTzElk+xvr83fvbwOeVfV
uvxrz49BfVORyWHmeX6ad929XTDtXnmvPXkXyvI2WTht5d+K9eZda73vdLi2J4HBZNNxp34r
ziX9dueeeZ5F9Z5HJZNtzp33Wbt0qN78+eTyL669B0LJy3TTvv2VP2dcl8annHyjx6eHtv6Z
lc9/KGbqOfT2r7Ovp6mmPYvU83zO+49ZZPU3r9Hfrbuc91fVuvhXnw6C+qcjksm25y78V8uZ
dq73XfTYvldjZZOG3l34r05l1rve90uLYngcFk03GnfivOJf2W5555nkX1nkclk23OnfdZu3
So3vy55PIvrr0HQsnLdNO+/ZU+yk+mSeg4Tp9kjZv6rb8MMTgYRVXdFhaLZ2ibZrTHWz+32N
zm+8MGZZ8PPnib0ZqRb2KOTMdeW12geX0+CcYpa2pp9dIY8293S3NrFefnIoaBR3r+NBbOct
eYEjFPQ4L3i2XTPPNuTzOmFmKfoBjKoiAdLatHhWoANpZEQIEUVFV9F44Ip+P0e1xb9gPT3x
IfqQASifV16UrS1Gp76C+PJ/1yPH15gk4VSSSSSSSSSZ/P2X2/i1nxqv62q8arWq1quwSqqq
qqqqqqqqqqqqqvytFVVVfNvwtVVVVVVVVVVW6zFVfj9u717cfB5VVVVXLVVVVVVV2H7vp9/O
v7Oee7c1/OQ48J6RRRRRRRRRSyS0U+WlVVpnJhKhd6wJUpaUSpS0olQ+lphbCnFp72nViQYR
vV1/b58aAtVfX9f6f4t7Vd2/Lz760uW7tV/nGqqqvy55JD9jCH4/us5+z0qqqqqr1+r6flva
qv81qqvVoqqqr5+dc+vzx7Jve97zQknPf1Ig9CEQKERVJJAJJE7zHPFxSOeLgr1y8qqq95n3
1V75gB5CBrbZlYhg4AAihMQBYh3BPjrRJJ8PFmxXlVVVVVVX7Wqqq+wB/TmKqqqqqqqqqqqq
qqqqvn1mKqqqq/rtVVVVF+2v0+fL/DXt75xzx39vFVVVVVVX6ecxVVVVVVVVVVVVVVVVVVVV
VVV+9qqiqqqqqqqqqqqqq5avq225a/K1paq/e1VVcF+WjWfh8Dvm+fr+n8FGTqPjn168Dk88
hebhc/b9rPq+T9P1eXT86D7Bbo15rTzozV6eVrU9Xq7H1vqGjca8Z+uwkdDnnlAAg9nKhAOp
sQgSpS9RYvnD19V1uiIAg9/H2d73+wHHWvjxvVK1o1PDZ1586/n78dePp4+/Havq1VVVVVRV
VVVVVVVVVVVVVVVVeLRVVVX1b6tVVW2qqqqqqqt1mKq8/xzy9O1VV5tVdWqqqqqqrwH9718/
Gt/v5vi3NfvIceE/Yiiiiiiiiilklop8dKqrTOTCVC71kmMMTC0olSlpRKh+FphbCnFp8rTq
xgMI3+HnvQFqr63/DWlXVvw351pct3ar/Aaqqq/DnkkP4JIb+Twqqqqqrx/L8/rvaqv81qqq
qqqr9e8xVd+/zgfJ9msIc7uyTVVQVTXGdausrlSOfWgiX5m5zw+G2222/Iu2+N0kl2VL0A94
sLC6NgBxwu+A6TWhfp49Kr7/TM888qqqqqqq/S1VVX8f4Ziqqqqqqqqqqqqqqqqr59Ziqqqq
qqqqqiqqqqqqq+2sxVVVVVVVVVVVVVVVVVVVVVVV4tVUVVVVVVVVVVVVVXLV3bbctVei1V/X
aqqv52qv/Bb9rVtqqqqqqq+/zzFVe74wrvWYvdv1tVUd2/2WqvNttVV5X8f7Px+w+MemJ/GB
+GF8tjkbwqrC3byHq6agGniy+BvyRjrr1c78Zn5en3iPtou6fmORsPBJJJJJJJJPy9y9e96a
FPDuvx4/P8W/LHvPstm/XzHJZPg3x7u/Vr37szHNyO711Xp668+GBfinI0WTbc5d+K3r6ucQ
197vvpgX0uxosnDby78VEdOZott73uki2Z4GSyabjTvxW/NiMYjynnnnnORfjPI4LJtudO+6
3mxE06XG9+PPJwL8deg4LJy3TT6+Gd/r6cz+i35rau7VVV8+39WtLbVVVVV/C1VVVVVVVVVV
VVVX18MxVVfNq/C3LVVVVVVVVVVVVVVV5tVVVVXi35292qqqu7VVVVV6t7tVVVVVVVV6v78q
Kqqqqvzsq+C11aqqr/J+3Mtqr++38rVtqqqqqqq+37sxVX42rrMxV/V7Ziqrtv77VX2ttqqv
L8L9ry1PnH0En2iE+Xy0OBesKsqufl9UUoT1KVqvXv6/lxTk+3Hh+pFt8xA31oxJJJJJJJJP
t+LsenRbx9Qjv819N/Lq319QE+fX6zzPGPf4jsWT5N8/J37te/kzbDr5TpfKl3t37dOvlkX5
p1HBZOjdcu/Fe0m215zX246dMdO+hfa9BssnLdMu/FcE16LziFvvcbpItmeBksmm4078Vv0s
y4xHaeeeeZyL8deg2WTlumnfdb5thcR1kb35V5OBfjr0HBZOW6ad/AcvLe83V3+ar2JVSaKp
JJJOePm7kraqqqqv4Wqqqqqqqr4LVVVVVV9vjmKqr6tX425aqqqqqqqqqq/qtVVVXu1VVVVe
bfrb5tVVVd2qqqqr3b5vnKqqqqqqtJa+L+/Kiqqqqru1fBaXVSSSST7Kge8oBFKUJOEPnWE3
YuFxb3+d59fft7lGTqPPlied+r6+qUdOlcBx7qIAFYU6dNdN9OiixvHTX5tQYx4vb7YElovF
Kdu3b1xf2Tt6HB8PAAfav5OFo5NAgXaPdSR2NchQos0XcLahMDnt47tMxo2JCo9Zrv3VT188
X9R6xERTNVGjvN/mufUR16VpbrIktx1jrZW9v2JM6vaz7WmyCIVczK6G6+u9PXAyW1uPGI4X
4W7Z7bHbvfORyy4+Knqo4emT3oLGllNlmoW1zVSIKjF+U6LhkRUzsmI2f7Wf0QKFdUb/JBbT
79QYhb3rI8Kny6oA1WZutndmJKCtIiEAo0L6CiSuXxUkqV3sGhffhy//z6f2//J/cx+1oy10
/k5P5K/tZYZfodX8n/c7HwUm7d8nJll8mE/5Xg/mdGHk+xzSOj72H5372G5/oYST8AVxV8ld
lD+Zuyyr8cuzk5Mtnd2ZbKaHuwj7XJ8WrLZod2gK1YZDKStmWrD8WWHFqP+Kjgp/g4sMP8lc
FTk4vRs/X+Q9e+Pza/f0up58G6M5PIQCwUlENgv6iPWFH3Aj0H2P52H9Lgce33ejo4OpPp+7
HSvi44km9Dwry8tMwD9xqCx/k/z+x8d5HgLinXjvlPrEDf/D/EX9lhYXZ8lin2K59a/P9+62
96r7rNdMc+vDAWHb0sD+wEdB9OePP0+/0GsenF/tiOwNO0WD+8gAlEzsdaVpajU/bQXx0f+M
jp1zBJ8SJJJJJJJJJn8/Zfb+61nxqv6Wq8arWq1qvGKqqqqqqqqqqqqqqqqvytFVVVfNvwtV
VVVVVVVVVW6zFVfj6z3dKqqqrlqqqqqr/nttqr/s2+1q21VVVVVVd/lmKq9WrrMxfa3u1VR3
b/Jaq+bbapJNSev4/v+EjAtZVWyr4ffOqU6KvJt36eHuqv8BQcB7Ekkkkkkkk+rzWdXp+8U3
+K/p5/l82/fj3nztm/X6RyWT5t8+7v1a9+7Mxzcju9dV6fVXnwwL8U5GiybbnLvxW9fVziGv
vd99MC+l2NFk4beXfiojpzNFtve90kWzPAyWCj+hhe9uzV/GBYtHEUpSY3GjY+n5H82Cu5OL
GSmOPHUxiBUtExrVfpzq/uI1ev0r4e4j+/KtfgZH9CJ6EFAkgQhOe1/D7z6frOf6YspbFnOZ
vnMz5Zmd67UhKPkLColfgZJJJfKP/kIUc6xUij/yrJKkdGXR2V9+Mvk1+zwjX+9/e7PrVpf7
DDClpjH/3fni//YX/r3rvR89dyMr2Kq7mq+x+ksbxifW+V0XsWZ+qvScHvuLi773X/n/9ofp
kk6wpiDgcl41fjfwzNHHDHy6Zy6X53bOedd+XG9rH5mri7XW63O9Luu67rxV/sIeiv/iCPzH
uH4iBje+o1rpTpXo9mei1gRoEEAfoKdS4udI04fFMQPFZhqxiGTUfku8Eh7cXyKdSHXM0qBU
ihmLPdQJZbwtz4D9Q9g/sGQgkokHgtbtid0REcvrEYXbtkWyS97mKdOtyUhodLNznHV/85PK
GiGgqwi1LUtQqwKBFUICgpFBZFJFICkihFUIsixSRYQUiwEYRGAqkgoKRRRRRQFCKCkUQZFk
RgiKiMAD4ngzvKJ29+R1IpjDiaY1fazGYkkDdqqXbG3Gt9rUuSZvKwGl2u9kjNg0sBpXCt6i
b2DjKDrlmW2G+RN8kO2RyyV0yG+VDjKdcVdso3yodMWYt8quMhvlI6ZXLK4wHbFU1gzBvkc8
F0yqm+RvkbYm2RdsFNsTfE5YnLKXPILnlNspvlOuFbZS65UO2FywtYWslc8Iu2S1kumSKSTp
hJyl7p463MCDFYxWMYQSMYsYxiDGJOECpNoFScIFSaYFSQ6YEsid6whhs8YUJNJZoFCQCJDM
xFr3UMgisWvQUMQ3cdv9wf2J5j0RFTuk9Xs7PJ2D8ElT9r8H+78Ew83Bh7N06P0P2J+k+lhw
7n9VbH6FKbWjU3NHJ/LWhpuGjMNOLDLUV8vk+i9kZF9GeXpqtz+y9E8DJojCHinHFLaScd0n
h0kG2ScHg+CfI8CSFVTVlyTkqlSqtlWWqlkKSxFSj0dSTifzq9w7v1Nk95u0xOVYsx4aq2cn
+ZS1WBBgJpiWTLP3WjVjFljVqGiyhSykhYgiiDIDFVQRj7mjFXAnNsfkjIW5ssxaq8FlTTrW
NSTGLGn8i56W5btVpaYW8MJoIys3ojg/Bo8VVXm7sus0Uz5ZqpMa1RaKjKK71kzKabapdWzV
VfOyiX72Uo3LKquSxDvjjVN1Yqrk55marksK08x7cC0PhUR87J8qGa0qWr8rb+WvCEcHm9Gi
l9tf/oPNYfev3OGrT2FXWg3aiMRn4lLKUsspZ+ozgDRqUhSylLKUspSylLKUsRnRKMIE+Mn6
pPZ4G9cnI9q2f2uh7q3X5F71mfWr+Vycq9jrWPmrdNLcv1i9K6P8w+T506hexf6lsbN5MQ+M
hzMPV/WBN05fZyx3Xw88s664gFuBAbSiDALKTEAQ2oBbgQ2oBbgfz1PKv2L/5FuVdK83kv4l
2dFstq5Xxr6EcDMU7HZ6vveE/CfP9m7iWcJopwcI4OA4dD2lpHWOy5Ryre5XA7V2rc6xsh/j
J3T4Po/C2wt4pwjvbY6zJkxIoo7SZSdfX1nV9jg8mziwwy/mVzZP3snkVl/ke5/Qf5FMssMv
800aNGGGGjRWnk9g9tL+6voKveu5T/OxdVppYxppp1H6Kj317699eh7q5+/NttWy0ajZae+t
e/La0t1e+t1e9WVtX9f1J+d+23bHgjS9xdC9tcH0PbD5zmYsrR7qxaqXz1qHvRsYn96NUaP+
dbm1zrVaKvJXZ/Yb300H4+P2r6RGKN2MMOsnBlcleKxpR5gxgxgxP5juSePzVWfySMYgWqq/
mquBqQnuRIxrbYtaJZZUwwtmq3c4H4n5z6HwPtPmbt27du3bt03Nzc3Nzc3Mq3fY/JxcXF9X
weB1NTaKbHN1dXWdZ167uJZwminBwjg4DVwTg+1lX8j38PQk+SvF6m79D+D5N38z9a5Ffj9o
fWR319L/zbP5WzZmZV/h/Vs2zM5zppLrbX71Db7tcbt9d75z7U+0vpL/B0r+kL8jF0ruNLcr
xbie5FB+t7z2luqK93wbP7V7ronwI/xtjpXaqVYVaNLs73BnNcj+ZfavBcLF6ejevFleyvyf
3Vt8GVt8Nm3KT5lXc7paPWJ41f+0k5VL7iUODGMYzMzCkQRERV5PqKqqvAfOTYiIiQSMIJEk
SaNCqqroNSaERESCRhBIkiTRoVVV0GpNCIiJBIyESJIkw0KqroNE0IiJgxZVYsoxb1sbVssq
rCysWSWLEmIrRi/IrEmK5iNlsFgxVgxS4WjhbKxjGMGLIMWUYq3LF4LEYowsWLFiMWFi0Wlp
YjFhYsWLEYsLFpG5sv9EmFlYsqYq2LCDCyQe47F68IxYP6a2PwXsWZ/XX+uHiOGVzr2VhXfX
BwxODDMrI41LUtmL+mvqr/Cu+vxr6K1X0NmZmq1WK4rK8Kyo7Q607NS1DTGosrKyWmNQysrJ
aZZWl9G2qMGzRajFhaao1VhgpuSl/rsIUZLfY+AqGpPsEjhP1E1Jir1SZW8ZC6NPhXvLesWS
YsruvrarGy1WmVgysbq90n9Aj/JYFixYsWLFixYsWLFixYsWLFixYsLFixYsWIT66xc1ixcj
xMeR2HZ+vo5l31yrRc3msHSTjL4uDYn+qc5Npu2ZPKT7HBwkNj0ZZJzfweujQm4om79bRknc
6jL+DQnWT8G71scz8H2n3K+asrKHUvmsLt7D9J9ZkHYL+pfOsylwrVYV0KuhG1iorSrEmjYw
5C5LVY2ZmFKmEqZSoYFCbipSkiUwuZVhaGCwwg4OHzNzcj8eMzpbFlYu6sX9lYtVi1WL8axZ
WLmTiwe25rvOEdyYv+CsXOsLRgtkfXDD/I7zojY6lPKvMUeh0NSi7i5x3GxVsnR6HU0ObD2K
IiJQoh4ADv+0+fC0/qOD7m96tuv+MvfhVe/B0ZZkq6YpOMa66iHGDhlmUqZkzKZ167Npl1xU
ueRWalqLrrlmLNakia1DgrQcgwTlYJM2LUXhwyzL/QE9n/mP0T80/U5kN07PaVbKj4SfMfpb
V6nsXZecf7n8b3O8RvXSvMTwlsuy61+NJfYXyNIOi3WFqo8a/orrXsr8a2f/NfF82aMe9ryt
uc4zdOMPyT/Song7E4bvGerlPVPeGia32F8RT6vUub7l5C/BPFN3Su6w0auaYhav+yfFA7tf
5lnY7nrieNyxjPqng+j1eZcn1Lq73Z5rqk7653tE1W7LP8Ky9cjPoRh+G5TJGfWeT6TY/A9x
H6fAzFy6OyejYuHRzdo6niVpNX5JfY2dDHg5M6OjhyTq/c6tnE2PAnKRlmdzHqXxr/kXg5v3
ubLSTmTnOJhjMPiJq4b397GWsbSWHzNzB2l1b/zrpPuPkeWMfG7ZwzdM95PrD9Lu+5fkafB8
D53fenhfXXtbXpV9q1o/WjV1M+NPsnm5OphcVhh0rLyk8nq8Wk2nOTm4TmTuzFnTSc5zfmc3
Nz4m8p3lOPxEwJpOU5P2Ozs7cznPXWi7rLuvBfM+Ebo6V1XF8r9J8Qn7p/Gfs1MiHt+K+SlG
ifo4jhTLfqfI5KOAmr3kh1P1pO6bD9alpaWmZdgeqjHrdSHU6E+quVd9fnKPzpNZPuk830Rj
5R8atyPR+t9HodG54Q+CaD1n9ZfKvff/OPqX6a1V1xH2tfqThsvXWn2SU5n2T8PFEZRsD0dH
m8XFx3MTj7R6EeKJI+8SJSEsiokr2Qp9GQCAFDpnQ0guZJ1J1fqfHtN5zYkqcXLnL+tzbNua
XqvZabvJMSfmcGsjzND9pVW5fwav0TkaenfHBoxHT9Tg0mk2rc7H6mzzbfI3nzasTo6eazd+
l+UnF9R+lrPKcQYOR+rswxfqrQ6ujjJu1Q4e5XWvzV81fmKPmXwwfJ/OJzrrX4vrfB6Inw2k
rzeGPdYyzh3RG/3LnSmqpqdgdEmaEif3g7k1JqfYGbHp2CGGVRVKJR2Wi4ZcYpglWMo1mo1w
agtEqotLVX6yNTC3af64f2BcBWn3LnPk+L2k+MlSDVOSazznYn6XI+lW/O3o+gup0PUvBsc6
vUcq+ivdX0SHK97Fie9Om3sWs1mU7ltqaj7tTZkz/ZVKuoz85MMMtLf3fy00E0WzzhnyPkfj
JZ+E+vKrb5yT+Q4H0Tkw0Uw+OM6GP21c3W5XX8ius1u2628b2Md/zQP1BP1iBMCbnJ7h+y6V
83qd94UuTg5L55dL517aEyvarovoXRfjXurTat5qnB8E0tnfsaalt5zbDwxJosZqsTwe/XU9
qv6k9nqTgfoJxbl7JbL1rtVJleasrFcXhPrNaejGMWsbJc2JMZKzKmZQ/GsX9C/bTWTbcwes
Ts5z/lQ/28LFsW2wti07fN26jseS3b3bT5PHZs3201+VJ63qXavzd/ZT4WfZbbVttuPuQ/JD
5Kh8iavA7pkl4Oq/NXmvFOS6WNrGXRpppppveu3fPq1MvDw0aNGGGGGGGGD8pMsCzo+9wfuf
i+p6n5H6mMfc8nV1dXV/IuPi+avgX4y0vpXvr0euvW95uulcq5rJcrd+rz145zP/fY5GxixZ
xi/Iu1bmx7/u1T+H9N6/fu5novU9S8a6ePTVu+t7cZ7TmX0K6uHfXcZR7pMq0n4oav0JJ9sm
0n0+ltttttvjJ8k/MJ6Sd/vr/NyX5n9jyaaf0PVXvfyvOD+hV+9/ER/vdD/6uq82MYxifJWV
hiXRV86/oHxHwHh9fw+/4Ub4LRaQvoIKmGPFntb7qgfH3z9FvMvZ/wwp1PF3Zn0Fd9Vg5pId
rZXM0uMBotW2V4vH4XC7odzrb8VracPoaEyKcSIJvrLxbd65q+AyV4OnN7k7zqyzXEB9apZx
oVyz0UvY1qKlZIux1qZ1R+Jzwsg2qywZYzDZKILBl1wG04s6i5StrakPveXG9PWQmSkqtQ88
botrU3rf3CwtnPN6NdaLSFsIKmGN7Pa2agY1PFuC9n5wp1PF3Zn0Fd9Vg5pIdrZXM0uMBotW
1ctw0c3C7odzrb8VracPoaEyKcSIJvrLxbd65q+AyV4OnN7k7zqyzXEB9apZxoVyz0UvY1qK
lZIux1qZ1R+Jzwsg2qywZYzDZKILBl1wG04s6i5StrakPveXG9PWQmSkqtQ88botrU3rcG1r
7W214xxNRTK41zqKV5jM6YPznPNb54VHxcfQ4uRqQX2fm9+uqBFZYY7RHAPT4tJhTMu5KFCb
WsZfQpwrw4rTd8SJSkzXi8nFlzPMrWsFXUYrxaMmEvWN0lVWkba+1i6zvU1FMrjWaPHFMXyw
feMbi/OclnKUkO1XF1ULumLX4lQIrLDHaI4B6fE+0j3syTw8JzMPZ+B/SmnFabviRKUma8Xk
4suZ5la1gq6jFeLRkwl6xukqvKMIxrcUay0WkLIgqYY3s9rc1A54ni2y9n3hH5362YifgUz8
uj6+iYz1e9ejwRWOIcU1vq81maimVxnNHjmmL5YPxjG4vjBVij3DtDi3KIGFeL+CZP0N8LdW
MMFtqn6JPtkhqfxKq/zuS61+LFaWLRfsQf9TdfmXo+c5oiQRkkRkEZEYRGRGRGAIslWSqlUq
lUqlUqlUqoqlUqlUqlUqlUqlUqlUqlUqlUqlUqlUqlUqlUqlUqlUqlUqlUqyVYVYhFWSVZKt
YysYDEypjCbLLssL7H7i+d5lfseBiqY/pP508DwWMcgcP7HY04XwrVPjP9DQvFfgtHqbVqsr
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
C9v1e68Hgisv36x2DH19Z58n273yPg9G6HkfWCgyMGTKra7K1bEA7lgmt6rbU1uChQ1ZsjAp
QOiscUo8b0o3bivHGqxooUMM2RkUoHRWLu1M5UZqkVnN6NZaLSFsIKmGNrPa3FQN7ni2ns+8
KdTxZ2Z9BX1WhzIZcnNnqMBoqucVRalQgJT0EetR8QeJHnASJBrq+vnWG4bX2+ruyMneppCC
VUrFTrh+Iiiro73VlGlFcBmCtXiaLNHe9VchUtTeXs1HecTxra6aoW9npqWdNtxQX0pU3xkb
D0U6kUtW0tvV9UZ+KDRiNRkMdSYVVht0Il38+w8+T4AXLgpw+H6+ER8her7NlqU4ES91oWCr
nTRTZ43wuNmbu6q58nkUvZ1S9yuKg5hoPun59dWX43MuAt0BP7EeavEPuxE886J+dObc5rem
tcc7I41Wz6hiRzjlOFpjA4lzQNQiiDeeGW6jI0mSEEPFHS5giLpXENBfljAlXxrnC9nQfVtC
/v58q6y3nxXXCQB81zkMHvRGGJXLLv7RFGamxG/XuShFvw1quMiAJPDCX19d63tv28NvLW/3
Lmdz5L3yvGuKLH1R6qutcV7XZbb9ieCftaP7lVbb8W6cvtT5Ic0y+r9rkxj12W7d+5pp3mrV
+KPufg5ruod1DKWqzm5tVK2r6a9dfXXKt6yOTd8drM/5nQ7PztWqqqqqq8HSRlmWWWWYpppj
HtpAnyPmWPApN3aGn9leyusdblYxjH0laaf3v53yXN/O+s/OvS+Hv/f/b/h/a/r/r/s3d3db
bb3d3d3d1ttvd3d3d3X9wAep6nOt68l8Ze8/Orm5tpN62bMY/M+ANmzGPZWrVzLe9lxcODGP
pqNNMrPk5k/glTOFVVVdJidZ5u7zebze73e73urq6urq6vUr/NWV+CfWJ8aj41ird6PR968a
9zo6jovLxZjRLq6vWXqWLFuvfLCwuifxvIq+1+wp9b6V6n0PpdTo/if6Xsbtz2mytLq1X3JD
wf4P2nqqneu2n4u6o1Xvvfd2mmWWMYxlljHySn7neT/Yr84FN52ZSvVJo0+Lsuf2p0dFVVVV
VVfbJ4t3c/U+cnE8nDrJ/vThJ513uGMbV49D/o+2tSele2u96qjs7P+p8YPKvO3X6Gz1Uo/E
9x4t79N0d59Zutl5mHlSjQ4ovwri2dCo3XtN1czKjZcONYbrd5VH2OzlDo3PVelll8U95ued
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
dy2XDwWq+zjMzPznB+o+euo8jH4vvp53uW9XF6HeWXwTkfyHeMu88a+8bn/bXJ3V3V/Gu9el
cIP1C6LgyTzrmd/flj1V5v/FeDdXMTFyA7zDoqbVpZSysWVkXSTZ/vamn8dsee3t2TcjXbnv
M82OFtznP/gVh+06CPBNJOUgbyBszLeDjLcOUtyzLs2s3ZZntPklPU/O9p+mu6XWu6vCu6Xa
T5SU6rLusujzl7PS1TxaH86TWQmmZdK0n8r3r2V/Bf2rvoup/TXlbL1V3O9jFtv3vr2wbJ6J
6J+pNjik6yeLk5KU6JqcSrVirVjLisHJKf2nun7zKPnE+gv/L9aBZ46qjXC+CfNJ/K7mWZML
J0J3J3J3J8CfVPgTZMErZs2bNg22222222222222gggwxMzMzMzMzMzMzMzL5xkQIEBhhttt
ttttttttttxyeckSJDEhhtttttttttttttoIIMMMNtttttttttttttBBBhhhtttttttttttt
twByecnnOckSGJDEzMzMzMzMzMzMzMsIIMMMNttttttttttttsluIhIlQYglQXxcAI4+c4ww
www22222222222220EEGGGG22222222222224ECBAYYbbbbbbbbb4444444444/NX4l9BdyT
8CPJeSwL4LFsqwq0LAXZdRaUWyxYsKX8EvtF865rBYsRuWwtlssCJGQFYIkWLKEkpKSyKiqr
EFRRFRFZAQklCdkDRP9If8l5ho/nfe8K9avFXQvWWGi+xfMo92ltlWWram0hCpk95N5MyHWC
ro/9auIltd5lfyMLgy6DL6lei7nolN7m9ZzUVfQsEYI9rg+J/3G22ZHwfNf9KPGT5jvfxGjx
V/Qthfsetfiv0hf1H7H54u54i/VT/MruVPkL3//m9T+hTorq5v7H1vQferkdJZdzV0eqk9Sf
rXzG7FjzE5TwK6V/PcNJ9Sf3sPsP/cfo8LbbbbbfGJ1InET/pGE9SDpHmuF0rS5F6Prfkrdy
UXqGFaPWNzomB84e5fsqftVdKj7DgPVPKTzQ4r+svW9Q+18n9R4nqWnrXU/wN7mbvZ616P8m
qXMZgIf+40aMDoT8v8q04PhRTavu/P8PXIM97CStu7cgyebq3UBBiFPPjEAfRXFgwcVGGX4u
TKstmem+vTbhOWXyTeXc7VydjGMM0Towe1iulYVudy+1uqSaKVyZK/UwXFuDCvhJ+9MyAf1B
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
MFVWrCYKplSGEVVKyyyypXVSYFVNVO8PcSj9SSiRySofa7q2YVVXmJZKUXzPrZWVtcpbvHEL
kWD6GGOjRMnolDBgYTCeqZYHN3cmG7gauZXJTLi3fzPFycmxudHiw2cnwZdXFhTs4Mujg2cm
rdq9m7icGGxMMN3GTCDzr8SxaF3Mh/bW1cjgXm06PzvFyP6HQ8nN4v0PNq5Nmru3f+uTVoPF
ycGh9GrV+KpqnJXxPzObg1ODybtUy5Pg+TunNxerg2fBPklYZcHyZZdHB6Orq1eLdzYc2ju5
MuDRh3aMmjLdzcGzo6q8E2V7OULP+2dHA1SpVOismyq0Mqquz8GEwww5qavBo3aOad2rDg0f
rasFNmgyasJsqNWh+x5qKqO8JRs0eLU8k8HZyV5MJlolYZZYNCkyywmEaNGXZo7uDRxKqpGj
ZGGp3FdWijVyZcjCbsKaKGWU4OyKMySt1HEqRyeJ97xYYMqYGVcWjKujZG7JHNMuSqqT8XEm
iomrR1NE7krKq6GjZs0aKKEpWrQ6NSnZWSurDKshVKqtGBWBEpRKJ0UKIIYCQoUohopNnc9V
bqsCZVRY5NRpWUqwYqmMWGxWleLDdzdU2fcsea8E8Xi0cykqKlVKpVSrJPRwSTQ6qk6MssmD
DCZYYJWGUwywipEIIkoJSUoFDCiUQSTClJhQiSgSkoJhQoYJgmCIkRPzuzkjwFHooeTsmBPJ
O70cmjsiVXUUbu5Jonm2YaFQ4qrVuy80rxVJGTBVfaPJopo4sm6dWEk0JoriTxScHow2dHuo
pVFSqqqKqqqpUqUqpRVElKpSpUqKSkqVKVJUVUUqqoqpVVKVKqVFSlVUqlSqpVKkqVSlVVKp
UqlKVVKlVSlSqpVVRVSVKSpSpUoqpKoUVKlVUqoqoqkVSKVVKqqiqVRVSUqKkqopVKlSlKpV
VKpVUVRUqpQqqKqqqUVVVSiqKUVUVVVKqpKpUopSKolRUqhVUqVKoqpVFRSqqhVIoqlSqCqk
kqoqopVVVVVVKqqVVKqqpVVFVUqKVVKkpSpSqpSoqqqKUJVUqSpVKVVKqilRSoqqqSqqkqqq
lClUpVUqlSqUqqqoqqqopRSpKqpVSqKpVVBUVVKhEiIiREkgiIiJESIkkRUqSaqYKqiqpSqq
VKUpUhVCqqVVRUqqqpSqVVVSUqqqqhVKVEqVSKVIqpVSUqqqiqgolVVKqlSlVIVUqkUUqUqq
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
vNlzbrhyLd0WzdbrTRaaeDdu2YuGz5ObTdLh63RO57D52Qj/Bio2S/gqYhI2Pm5HkmFYLJi3
DCqnJhl+IsrauleqvCtVuqY3GMfFKY04cMNUndsxJqbQ1bH4Kw5tGz3V9FNSuDzcnFlq+ast
GzuwerwaPoqdW7qwyng4sMuR3NHZ2Ze7c3bN2U8WrmmU0fR4Ozwcmrs6uCNCqd2rZ3dnJo4u
Tk6OTVXRVYcGjDDgy4sq0VsromyTcL0TzdnIq+h9Dh2c68HRyebo4TvZWl9qjEDgyrRDqP1u
Jzd27DKdzc7kiWSTPFll6vFs+jdTuVlwaODg3Zc1O6pu1bKy2NGzdk1asNWHic3BlWzmw6PJ
q5uSqwrmebDo4MOzyYc3FwdG7LLVlXFWiq4vtVl2YaHBo5N3Fo6OUjgywiP5KmzR8XdorCuL
yMByaqhuYYfmcGistFclJszJUisJoyjCNVVUmWhDKsKSYVGFRKqJVVhglV5vpJs7IaLJh4DB
p9bs04S83taRpjZfJw3dUbuzwbEyg5IRo6vR4MOKRs9nRq5MPAr73Vhh7sNGFVgcH+MnR0fy
cTDgw6mFTgNGXo6q8GiRzVDd9qvm7PA5mxPgnWI1anFTVlSuaYKlQ+1JgZZYQ2bI8FealVFV
HJxcBlODBoVuKYYRgydCTRJhq9GB4vg0NWx9LFo+DHVs6HveldE3dn7K8G7d8b8LYeT4NWXN
u6vR5nwVE2UjgVXUMtlTgqfvKh6MsNkYPdXBo5uTi+5WWFJgqKpSnAwwwymVVUw0OhspNWUG
GE2YYPJow4OJoywEqaOKOzLxT86WTyleLUruYDd3Ue7i/QdpMK8TDiwyqV9rCYfe+LkporDd
MtT9b5uzyer5t27DwOLJU92UrKI1T2aPR6Pkri4NxJwebo8CTRSCqkk+qub9js4ODYo4vdhI
4uidnMwZT0OjDyRuwcnzVgFUwrDLJhkeRVSdGCfNhgYdmXuwmiamHq5u8+U1O7yeweCTianI
V1cm79jDRls9jLDLBOTDRToOJg7mxqPRh6MsPBycG7gkp6ODImjgNk2MobObVsbsMsNmyN2i
NmTRhSqTDKjkZEbpIZTDkakcH2lYcGWrRN2jirVzZTDRukbGrD5ssOLs1NnEy8GrZqp5G7Ad
FOKVXq3YcngmzRlOZ1cnIczVsy4MN3V4K1aim6nVNnByYbOhqp3Vq4MtDCu6qm5xVu6q1aKw
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
Zc2Lb//iMaIzBGQ/xZRf/+LuSKcKEgMAM5pg
--------------010908070500020801070502
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------010908070500020801070502--


From xen-devel-bounces@lists.xensource.com Tue Nov 01 05:50:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 05:50:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLDna-00020a-8b; Tue, 01 Nov 2011 05:50:38 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLDmj-0001nU-I8; Tue, 01 Nov 2011 05:49:45 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1320151780!1518993!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26036 invoked from network); 1 Nov 2011 12:49:42 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 12:49:42 -0000
X-IronPort-AV: E=Sophos;i="4.69,438,1315195200"; d="scan'208";a="18711085"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 08:49:40 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Tue, 1 Nov 2011
	08:49:39 -0400
Message-ID: <1320151775.3084.16.camel@cthulhu.hellion.org.uk>
Subject: Re: [Xen-devel] Problems with 'xl create winxp' (hvm) on xen 4.1.2
	(also affects GPLPV)
From: Ian Campbell <Ian.Campbell@citrix.com>
To: jim burns <jim_burn@bellsouth.net>
Date: Tue, 1 Nov 2011 21:49:35 +0900
In-Reply-To: <15732981.uFr7VF8Mh1@dell4550>
References: <1758215.SCbitK4oVy@dell4550>
	<1320058232.23193.59.camel@zakaz.uk.xensource.com>
	<1320060379.23193.72.camel@zakaz.uk.xensource.com>
	<15732981.uFr7VF8Mh1@dell4550>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, 2011-10-31 at 19:00 -0400, jim burns wrote:
> > that's the source of one of the missing features. Fixing it should
> be a
> > case of adding the option to libxl_domain_build_info in the IDL,
> > reacting to it in libxl__build_device_model_args_old and
> > libxl__build_device_model_args_new and parsing the config file
> option
> > into it in parse_config_data().
> 
> Hopefully, the fix for 3) (vncconsole=1) is just as simple. 

Rather than having libxl__build_device..._args handling things I think
you would want to call libxl_vncviewer_exec from xl, at roughly the same
sort of place as libxl_console_exec is called when -c is passed to
create, that is wherever autoconnect_console is called.

(aside: would a command line option similar to -c but for VNC be as/more
useful than the vncauto thing in the cfg?).

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 06:27:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 06:27:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLENa-0003ea-DY; Tue, 01 Nov 2011 06:27:50 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLEMX-0003Qo-6a
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 06:26:46 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-13.tower-21.messagelabs.com!1320154000!490454!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28842 invoked from network); 1 Nov 2011 13:26:41 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-13.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 13:26:41 -0000
X-Originating-Ip: [194.89.68.22]
Received: from ydin.reaktio.net (reaktio.net [194.89.68.22])
	by smtp.tele.fi (Postfix) with ESMTP id AD6701977;
	Tue,  1 Nov 2011 15:26:39 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 7C43F20097; Tue,  1 Nov 2011 15:26:39 +0200 (EET)
Date: Tue, 1 Nov 2011 15:26:39 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark with
	Ubuntu 11.10
Message-ID: <20111101132639.GH12984@reaktio.net>
References: <20111031214036.GG12984@reaktio.net>
	<4EAFD891.8000204@icg.tugraz.at>
	<1320148634.3084.12.camel@cthulhu.hellion.org.uk>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1320148634.3084.12.camel@cthulhu.hellion.org.uk>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"dokter@icg.tugraz.at" <dokter@icg.tugraz.at>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 01, 2011 at 08:57:14PM +0900, Ian Campbell wrote:
> On Tue, 2011-11-01 at 07:31 -0400, Mark Dokter wrote:
> > In that test, the KVM machine uses virtio disk and nic devices, while
> > the Xen machine uses the qemu emulated devices. Could that be the cause
> > for the poor performance?
> 
> Very much so. Without using the PVHVM drivers in the Xen case this is
> very much an apples to oranges comparison.
> 

Actually the first page of the article says:
"The only Xen issue encountered when testing it with an Ubuntu 11.10 guest and host was the need for manually loading the xen-blkfront driver for disk support."

So it sounds like they actually did use PVHVM drivers..

-- Pasi


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 06:52:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 06:52:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLElc-0004ar-0I; Tue, 01 Nov 2011 06:52:40 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLEku-0004ON-Bd
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 06:51:56 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1320155511!1805706!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25752 invoked from network); 1 Nov 2011 13:51:53 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-11.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 1 Nov 2011 13:51:53 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA1Dpm2w009009
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 1 Nov 2011 13:51:49 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA1DpkES021594
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 1 Nov 2011 13:51:47 GMT
Received: from abhmt103.oracle.com (abhmt103.oracle.com [141.146.116.55])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA1DpfSF020978; Tue, 1 Nov 2011 08:51:41 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 01 Nov 2011 06:51:40 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 67FBE827DD; Tue,  1 Nov 2011 09:51:39 -0400 (EDT)
Date: Tue, 1 Nov 2011 09:51:39 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Jerome Glisse <j.glisse@gmail.com>
Message-ID: <20111101135139.GC22652@phenom.dumpdata.com>
References: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
	<1319062772-2793-9-git-send-email-konrad.wilk@oracle.com>
	<20111031193722.GB3036@homer.localdomain>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111031193722.GB3036@homer.localdomain>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090205.4EAFF976.0064,ss=1,re=0.000,fgs=0
Cc: thellstrom@vmware.com, xen-devel@lists.xensource.com, thomas@shipmail.org,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	j.glisse@redhat.com, airlied@redhat.com, bskeggs@redhat.com
Subject: [Xen-devel] Re: [PATCH 08/11] ttm: Provide DMA aware TTM page pool
	code.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> > +static struct dma_page *__ttm_dma_alloc_page(struct dma_pool *pool)
> > +{
> > +	struct dma_page *d_page;
> > +
> > +	d_page = kmalloc(sizeof(struct dma_page), GFP_KERNEL);
> > +	if (!d_page)
> > +		return NULL;
> > +
> > +	d_page->vaddr = dma_alloc_coherent(pool->dev, pool->size,
> > +					   &d_page->dma,
> > +					   pool->gfp_flags);
> > +	d_page->p = virt_to_page(d_page->vaddr);
> > +	if (!d_page->vaddr) {
> > +		kfree(d_page);
> > +		d_page = NULL;
> > +	}
> 
> Move d_page->p = virt_to_page(d_page->vaddr); after if (!d_page->vaddr)
> block.

Duh! Yes.

.. snip..
> > +#if 0
> > +	if (nr_free > 1) {
> > +		pr_debug("%s: (%s:%d) Attempting to free %d (%d) pages\n",
> > +			pool->dev_name, pool->name, current->pid,
> > +			npages_to_free, nr_free);
> > +	}
> > +#endif

What is your feeling on those #if 0? I was not sure to keep them - they are useful
when debugging, but not so much during run-time? Rip them out and I can just
keep them in my 'debug' patch queue in case things go wrong?

Or perhas do it (rip 'em out) in 3 months time-frame?

.. snip..
> > +static struct dma_pool *ttm_dma_find_pool(struct device *dev,
> > +					  enum pool_type type)
> > +{
> > +	struct dma_pool *pool, *tmp, *found = NULL;
> > +
> > +	if (type == IS_UNDEFINED)
> > +		return found;
> > +	/* NB: We iterate on the 'struct dev' which has no spinlock, but
> > +	 * it does have a kref which we have taken. */
> 
> I fail to see where we kref dev.

Ah, I should document that more extensivly. That is done way way
earlier. As in in the path of the initialization of the driver:

drm_pci_init
  for non-KMS calls pci_dev_get()

  for KMS calls pci_register_driver..
      which calls 'driver_register' which called 'device_register'

And then during teardown (so unbind on sysfs), it ends up calling the devres
deconstructors which cleans up the 'struct device' dev_res, - in our case
ttm_dma_pool_release. However the nice thing is at that point of time all of
the calls to the TTM have quiseced so nobody is calling ttm for this device
anymore.

Let me stick this in the comment section.

> See comment above, otherwise:
> Reviewed-by: Jerome Glisse <jglisse@redhat.com>

Great! Thank you! 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 07:12:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 07:12:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLF5E-0005Lr-7b; Tue, 01 Nov 2011 07:12:56 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLF48-00059D-0E
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 07:11:50 -0700
X-Env-Sender: K.Brink@cs.ru.nl
X-Msg-Ref: server-7.tower-21.messagelabs.com!1320156704!2516220!1
X-Originating-IP: [131.174.16.143]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29868 invoked from network); 1 Nov 2011 14:11:44 -0000
Received: from smeltpunt.science.ru.nl (HELO smeltpunt.science.ru.nl)
	(131.174.16.143)
	by server-7.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 14:11:44 -0000
Received: from lilo2.science.ru.nl (lilo2.science.ru.nl [131.174.16.131])
	by smeltpunt.science.ru.nl (8.13.7/5.31) with ESMTP id pA1EBQmJ023250; 
	Tue, 1 Nov 2011 15:11:26 +0100 (MET)
Date: Tue, 1 Nov 2011 15:11:26 +0100
From: Kasper Brink <K.Brink@cs.ru.nl>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [Xen-devel] pv-grub Solaris support
Message-ID: <20111101141125.GA18597@lilo2.science.ru.nl>
References: <20111012204011.GA7518@lilo2.science.ru.nl>
	<20134.64191.820416.210778@mariner.uk.xensource.com>
	<20111026092134.GA12432@lilo2.science.ru.nl>
	<20136.1111.58646.458830@mariner.uk.xensource.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="Qxx1br4bt0+wmkIi"
Content-Disposition: inline
In-Reply-To: <20136.1111.58646.458830@mariner.uk.xensource.com>
User-Agent: Mutt/1.5.20 (2009-06-14)
X-Spam-Score: -1.664 () ALL_TRUSTED,BAYES_50
X-Scanned-By: MIMEDefang 2.63 on 131.174.16.143
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--Qxx1br4bt0+wmkIi
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Wed, Oct 26, 2011 at 02:00:07PM +0100, Ian Jackson wrote:
> But I'm afraid I can't apply it because I need confirmation of the
> copyright status.  See the section on Signed-off-By on
>   http://wiki.xen.org/xenwiki/SubmittingXenPatches

The pv-grub_solaris patch I sent previously is:

 Signed-off-by: Kasper Brink <K.Brink@cs.ru.nl>

If you want, I will resubmit the patch according to the guidelines on the
wiki, along with any necessary changes to the license and copyright notices.

> Looking at the contents of your patch I see some worrying things.  Can
> you please find the licences for all the code you're including and
> arrange for appropriate copyright and licensing notices, copies of
> licences, etc. etc. ?

All the code in my patch was either taken from the "Oracle Solaris 11 Express
2010.11 GPL Source, Part 2" archive, downloaded from 
 http://dlc.sun.com/opensourcecode/solaris/sol-11-exp-201011-GPLSource_2.zip,
or written by me (small portions).

The code is licensed under the GNU GPL, version 2 or later ("GPL2+").
Each file from which I copied code contains a notice stating that it is
licensed under the GPL2+. Identical notices are present in the unpatched
pv-grub sources, so the diff itself does not contain this information (except
for newly added files).
I will add a GPL2+ notice to the header of the file 60zfs_solaris.diff. The
full GPL 2 license text is already in the Xen repository root, so I assume I
don't need to add that to the patch.

The copyright status is a bit more diverse (see the attached list for the full
details):
- all the files I copied code from have an FSF copyright notice
- most of these files also have a Sun Microsystems or Oracle copyright notice
- there are 7 files that contain ZFS- or Solaris-related code, but do not
  have Sun or Oracle copyright notices.
My patch preserves the copyright notices for all files, but does not add any
notices that are not present in the archive distributed by Oracle.

The files that do not have Sun or Oracle copyright notices are: builtins.c,
common.c, disk_io.c, filesys.h, pc_slice.h, shared.h, stage2.c.
I don't think I should add such notices myself, but I could add a comment
to each file along these lines:

/*
 * Portions of this file are derived from code distributed by Oracle in 2011,
 * licensed under the GNU General Public License, version 2 or later.
 */


In summary, I propose to do the following:
- add a "distributed by Oracle" comment to the files without Sun or Oracle
  copyright notices, and rediff
- add a GPL2+ license notice to the header of 60zfs_solaris.diff
- resubmit the patch according to the submission guidelines, with my sign-off,
  and Samuel Thibault's acked-by.
Will this be sufficient to clarify the copyright status? 

Best,

Kasper

--Qxx1br4bt0+wmkIi
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="pv-grub_solaris.copyright"

    pv-grub Solaris support: license and copyright info

The file 60zfs_solaris.diff contains code derived from the "Oracle Solaris
11 Express 2010.11 GPL Source, Part 2" archive, distributed by Oracle as:
  http://dlc.sun.com/opensourcecode/solaris/sol-11-exp-201011-GPLSource_2.zip
The relevant code is in the directory osnet/src/grub-0.97 of the archive.

The table below lists all files modified or newly added by the diff, along
with the license- and copyright notices of those files in the Oracle
archive, and a summary of the changes included in the diff.


== Modified files ==

file             license  copyright notice                changes
---------------------------------------------------------------------------------------------------
stage2/
 builtins.c        GPL2+  [1999-2004 FSF]                 Solaris-specific builtins
 char_io.c         GPL2+  [1999-2002,2004 FSF; 2008 Sun]  grub_str{ncmp,chr}; several #ifdefs
 common.c          GPL2+  [1999-2002,2004 FSF]            ZFS-related error messages
 disk_io.c         GPL2+  [1999-2004 FSF]                 add ZFS to fsys_table; read Solaris partitions
 filesys.h         GPL2+  [1999-2001,2004 FSF]            prototypes of ZFS operations
 pc_slice.h        GPL2+  [1999-2003 FSF]                 Solaris label/partition definitions
 shared.h          GPL2+  [1999-2004 FSF]                 ZFS-related definitions
 stage2.c          GPL2+  [2000-2002,2004,2005 FSF]       cmain: do findroot if configfile not found
AUTHORS            N/A    N/A                             Sun copyrights (ZFS: 2007; VTOC and UFS: 2005)

== Newly added files==

file             license  copyright notice                changes
---------------------------------------------------------------------------------------------------
stage2/
 fsys_zfs.c        GPL2+  [1999-2004 FSF; 2008,2010 Ora]  verbatim
 fsys_zfs.h        GPL2+  [1999-2004 FSF; 2010 Sun]       changed definition of symbol "MOS"   
 zfs_fletcher.c    GPL2+  [1999-2004 FSF; 2007 Sun]       verbatim
 zfs_lzjb.c        GPL2+  [1999-2004 FSF; 2007 Sun]       verbatim
 zfs_sha256.c      GPL2+  [1999-2004 FSF; 2007 Sun]       verbatim
stage2/zfs-include/
 dmu.h             GPL2+  [1999-2004 FSF; 2010 Sun]       verbatim
 dmu_objset.h      GPL2+  [1999-2004 FSF; 2009 Sun]       verbatim
 dnode.h           GPL2+  [1999-2004 FSF; 2010 Sun]       verbatim
 dsl_dataset.h     GPL2+  [1999-2004 FSF; 2007 Sun]       verbatim
 dsl_dir.h         GPL2+  [1999-2004 FSF; 2007 Sun]       verbatim
 sa_impl.h         GPL2+  [1999-2004 FSF; 2010 Sun]       verbatim
 spa.h             GPL2+  [1999-2004 FSF; 2008,2010 Ora]  verbatim
 uberblock_impl.h  GPL2+  [1999-2004 FSF; 2007 Sun]       verbatim
 vdev_impl.h       GPL2+  [1999-2004 FSF; 2010 Sun]       verbatim
 zap_impl.h        GPL2+  [1999-2004 FSF; 2009 Sun]       verbatim
 zap_leaf.h        GPL2+  [1999-2004 FSF; 2007 Sun]       verbatim
 zfs.h             GPL2+  [1999-2004 FSF; 2007,2010 Ora]  verbatim
 zfs_acl.h         GPL2+  [1999-2004 FSF; 2007 Sun]       added single "#ifndef __MINIOS__"
 zfs_znode.h       GPL2+  [1999-2004 FSF; 2010 Sun]       verbatim 
 zil.h             GPL2+  [1999-2004 FSF; 2009 Sun]       verbatim
 zio.h             GPL2+  [1999-2004 FSF; 2008,2010 Ora]  verbatim
 zio_checksum.h    GPL2+  [1999-2004 FSF; 2010 Sun]       verbatim


FSF : Free Software Foundation, Inc.
Sun : Sun Microsystems, Inc.
Ora : Oracle and/or its affiliates.
GPL2+ : GNU General Public License as published by FSF, version 2 or later

--Qxx1br4bt0+wmkIi
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--Qxx1br4bt0+wmkIi--


From xen-devel-bounces@lists.xensource.com Tue Nov 01 09:03:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 09:03:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLGoP-0000Na-8b; Tue, 01 Nov 2011 09:03:41 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLGna-0000Al-PY
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 09:02:51 -0700
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-12.tower-21.messagelabs.com!1320163364!2491041!1
X-Originating-IP: [142.103.6.52]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16179 invoked from network); 1 Nov 2011 16:02:46 -0000
Received: from smtp.cs.ubc.ca (HELO smtp.cs.ubc.ca) (142.103.6.52)
	by server-12.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 16:02:46 -0000
Received: from mail-bw0-f43.google.com (mail-bw0-f43.google.com
	[209.85.214.43]) (authenticated bits=0)
	by smtp.cs.ubc.ca (8.14.3/8.13.6) with ESMTP id pA1G2frY010898
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=FAIL)
	for <xen-devel@lists.xensource.com>; Tue, 1 Nov 2011 09:02:42 -0700
Received: by bkbzt12 with SMTP id zt12so2018010bkb.30
	for <xen-devel@lists.xensource.com>;
	Tue, 01 Nov 2011 09:02:40 -0700 (PDT)
Received: by 10.204.10.67 with SMTP id o3mr195636bko.3.1320163360104; Tue, 01
	Nov 2011 09:02:40 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.204.180.130 with HTTP; Tue, 1 Nov 2011 09:01:57 -0700 (PDT)
In-Reply-To: <patchbomb.1319050206@athos.nss.cs.ubc.ca>
References: <patchbomb.1319050206@athos.nss.cs.ubc.ca>
From: Shriram Rajagopalan <rshriram@cs.ubc.ca>
Date: Tue, 1 Nov 2011 09:01:57 -0700
Message-ID: <CAP8mzPMHZ=-Ar0RteLdp_GY5pvCxTTT3TpU3sJM4859m1md4gw@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 0 of 2 V4] libxc: checkpoint compression
To: xen-devel@lists.xensource.com
Cc: brendan@cs.ubc.ca, ian.jackson@eu.citrix.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: rshriram@cs.ubc.ca
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0221230365=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0221230365==
Content-Type: multipart/alternative; boundary=000e0cdf13261fe16304b0ae7ce4

--000e0cdf13261fe16304b0ae7ce4
Content-Type: text/plain; charset=ISO-8859-1

Ian, do you have any other comments ?

thanks
shriram

On Wed, Oct 19, 2011 at 11:50 AM, <rshriram@cs.ubc.ca> wrote:

> This patch series adds checkpoint compression functionality, while
> running under Remus.
>
> Tested under xen-4.2-unstable.
>
> A simple benchmark: SpecJBB (Java Benchmark)
> - 4 minute Remus run, with PV domU (2.6.32 xenolinux kernel), 1G memory
> and 2 VCPUs
> - Data sent without compression: ~70GB.
> - Data sent with compression: ~8GB.
>
> Changes since last version:
> 1. Added some more sanity checks and bounds check to the decompression
> code.
> 2. Bit of code cleanup.
> 3. Merged the wire protocol documentation and the libxc compression patch
> 4. Added comments to xc_domain_save.c, explaining the use of two outbufs.
>
> Shriram
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>

--000e0cdf13261fe16304b0ae7ce4
Content-Type: text/html; charset=ISO-8859-1

Ian, do you have any other comments ?<br><br>thanks<br>shriram<br><br><div class="gmail_quote">On Wed, Oct 19, 2011 at 11:50 AM,  <span dir="ltr">&lt;<a href="mailto:rshriram@cs.ubc.ca">rshriram@cs.ubc.ca</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">This patch series adds checkpoint compression functionality, while<br>
running under Remus.<br>
<br>
Tested under xen-4.2-unstable.<br>
<br>
A simple benchmark: SpecJBB (Java Benchmark)<br>
- 4 minute Remus run, with PV domU (2.6.32 xenolinux kernel), 1G memory and 2 VCPUs<br>
- Data sent without compression: ~70GB.<br>
- Data sent with compression: ~8GB.<br>
<br>
Changes since last version:<br>
1. Added some more sanity checks and bounds check to the decompression code.<br>
2. Bit of code cleanup.<br>
3. Merged the wire protocol documentation and the libxc compression patch<br>
4. Added comments to xc_domain_save.c, explaining the use of two outbufs.<br>
<br>
Shriram<br>
<br>
_______________________________________________<br>
Xen-devel mailing list<br>
<a href="mailto:Xen-devel@lists.xensource.com">Xen-devel@lists.xensource.com</a><br>
<a href="http://lists.xensource.com/xen-devel" target="_blank">http://lists.xensource.com/xen-devel</a><br>
</blockquote></div><br>

--000e0cdf13261fe16304b0ae7ce4--


--===============0221230365==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0221230365==--


From xen-devel-bounces@lists.xensource.com Tue Nov 01 09:08:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 09:08:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLGtR-0000pj-M1; Tue, 01 Nov 2011 09:08:53 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLGsd-0000cP-Ek
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 09:08:03 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1320163678!1550914!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10084 invoked from network); 1 Nov 2011 16:08:00 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-6.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 16:08:00 -0000
X-IronPort-AV: E=Sophos;i="4.69,438,1315195200"; d="scan'208";a="168952450"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 12:07:37 -0400
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 12:07:37 -0400
Received: from perard.uk.xensource.com (dhcp-3-28.uk.xensource.com
	[10.80.3.28] (may be forged))	by smtp01.ad.xensource.com
	(8.13.1/8.13.1) with
	ESMTP id pA1G7YND014577;	Tue, 1 Nov 2011 09:07:35 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Tue, 1 Nov 2011 16:07:13 +0000
Message-ID: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH V3 00/13] libxl: QMP client improvement + pci
	passthrougth insert through QMP
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This patch series improves the QMP client in lib XenLight to be able to insert
a PCI passthrough device with the upstream QEMU. This require to apply a patch
series for QEMU (named Xen PCI Passthrough).

The first three patches are fix.

The next patch creates a key in xenstore with the version of the running device
model, here: /libxl/$domid/dm-version


Changed since v2:
  > dm-version xenstore key patch:
    - small coding style improvement
    - libxl__device_model_version_running() now return an error on unexpected
      value in /libxl/$domid/dm-version
  > qmp_request_context patch:
    - rename handle to context
    - the context is now only used between qmp_sync.._send and qmp_send
    - return code of a callback is now return by qmp_sync.._send()
  > Handle number abrove LONG_MAX patch:
    - the new callback now also handle double.
  > two new patches to do a pci-detatch.
  

Change v1-v2:
  - 3 new patches, with small fix.
  - add a structure in qmp, qmp_request_handle, to carry the return code of a
    callback.
  - the xenstore key for the dm-version is now in /libxl/$domid, instead of
    /local/domain/$domid
  - new patch to parse number bigger than LONG_MAX for json.
  - an user specified vdevfn for a pci passthrough devices is now handle.
  - in the last patch, the code to handle a pci-add through xenstore have is
    own function. that help a bit to keep the code under 80col.


Anthony PERARD (13):
  libxl_qmp: Fix return check of fcntl
  libxl_json: Check the parser status before to call parse_complete
  libxl_qmp: Better error message after a parse error.
  libxl: Introduce dm-version xenstore key.
  libxl_qmp: Introduce an opaque argument to the callbacks.
  libxl_qmp: Introduce list of arguments to qmp_send
  libxl_qmp: Always insert a command id in the callback_list.
  libxl_qmp: Introduce qmp_request_context.
  libxl_json: Handle number abrove LONG_MAX.
  libxl_qmp: Introduce libxl__qmp_pci_add.
  libxl: Use QMP to insert a passthrough device when using upstream
    QEMU
  libxl_qmp: Introduce libxl__qmp_pci_del
  libxl: Remove a passthrough device through QMP.

 tools/libxl/libxl.c          |    2 +
 tools/libxl/libxl_create.c   |   29 +++++-
 tools/libxl/libxl_internal.c |   23 ++++
 tools/libxl/libxl_internal.h |   19 +++-
 tools/libxl/libxl_json.c     |  111 +++++++++++++-------
 tools/libxl/libxl_pci.c      |  143 +++++++++++++++++--------
 tools/libxl/libxl_qmp.c      |  236 +++++++++++++++++++++++++++++++++++------
 tools/libxl/libxl_xshelp.c   |    9 ++
 8 files changed, 450 insertions(+), 122 deletions(-)

-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 09:09:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 09:09:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLGuI-0001Ce-IM; Tue, 01 Nov 2011 09:09:46 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLGse-0000cf-7U
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 09:08:04 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320163643!61515542!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26779 invoked from network); 1 Nov 2011 16:07:26 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 16:07:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,438,1315195200"; d="scan'208";a="18718740"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 12:08:00 -0400
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 12:08:00 -0400
Received: from perard.uk.xensource.com (dhcp-3-28.uk.xensource.com
	[10.80.3.28] (may be forged))	by smtp01.ad.xensource.com
	(8.13.1/8.13.1) with
	ESMTP id pA1G7YNI014577;	Tue, 1 Nov 2011 09:07:58 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Tue, 1 Nov 2011 16:07:18 +0000
Message-ID: <1320163646-24291-6-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
References: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH V3 05/13] libxl_qmp: Introduce an opaque
	argument to the callbacks.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
---
 tools/libxl/libxl_qmp.c |   30 +++++++++++++++++++-----------
 1 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
index f61a87a..ddc0a4d 100644
--- a/tools/libxl/libxl_qmp.c
+++ b/tools/libxl/libxl_qmp.c
@@ -43,11 +43,13 @@
 #define QMP_RECEIVE_BUFFER_SIZE 4096
 
 typedef int (*qmp_callback_t)(libxl__qmp_handler *qmp,
-                              const libxl__json_object *tree);
+                              const libxl__json_object *tree,
+                              void *opaque);
 
 typedef struct callback_id_pair {
     int id;
     qmp_callback_t callback;
+    void *opaque;
     SIMPLEQ_ENTRY(callback_id_pair) next;
 } callback_id_pair;
 
@@ -70,7 +72,8 @@ struct libxl__qmp_handler {
 };
 
 static int qmp_send(libxl__qmp_handler *qmp,
-                    const char *cmd, qmp_callback_t callback);
+                    const char *cmd,
+                    qmp_callback_t callback, void *opaque);
 
 static const int QMP_SOCKET_CONNECT_TIMEOUT = 5;
 
@@ -100,7 +103,8 @@ static int store_serial_port_info(libxl__qmp_handler *qmp,
 }
 
 static int register_serials_chardev_callback(libxl__qmp_handler *qmp,
-                                             const libxl__json_object *o)
+                                             const libxl__json_object *o,
+                                             void *unused)
 {
     const libxl__json_object *obj = NULL;
     const libxl__json_object *label = NULL;
@@ -144,7 +148,7 @@ static int register_serials_chardev_callback(libxl__qmp_handler *qmp,
 }
 
 static int qmp_capabilities_callback(libxl__qmp_handler *qmp,
-                                     const libxl__json_object *o)
+                                     const libxl__json_object *o, void *unused)
 {
     qmp->connected = true;
 
@@ -157,7 +161,7 @@ static int qmp_capabilities_callback(libxl__qmp_handler *qmp,
 
 static int enable_qmp_capabilities(libxl__qmp_handler *qmp)
 {
-    return qmp_send(qmp, "qmp_capabilities", qmp_capabilities_callback);
+    return qmp_send(qmp, "qmp_capabilities", qmp_capabilities_callback, NULL);
 }
 
 /*
@@ -208,7 +212,7 @@ static void qmp_handle_error_response(libxl__qmp_handler *qmp,
     resp = libxl__json_map_get("desc", resp, JSON_STRING);
 
     if (pp) {
-        pp->callback(qmp, NULL);
+        pp->callback(qmp, NULL, pp->opaque);
         if (pp->id == qmp->wait_for_id) {
             /* tell that the id have been processed */
             qmp->wait_for_id = 0;
@@ -241,7 +245,8 @@ static int qmp_handle_response(libxl__qmp_handler *qmp,
 
         if (pp) {
             pp->callback(qmp,
-                         libxl__json_map_get("return", resp, JSON_ANY));
+                         libxl__json_map_get("return", resp, JSON_ANY),
+                         pp->opaque);
             if (pp->id == qmp->wait_for_id) {
                 /* tell that the id have been processed */
                 qmp->wait_for_id = 0;
@@ -424,7 +429,8 @@ static int qmp_next(libxl__gc *gc, libxl__qmp_handler *qmp)
 }
 
 static int qmp_send(libxl__qmp_handler *qmp,
-                    const char *cmd, qmp_callback_t callback)
+                    const char *cmd,
+                    qmp_callback_t callback, void *opaque)
 {
     yajl_gen_config conf = { 0, NULL };
     const unsigned char *buf;
@@ -462,6 +468,7 @@ static int qmp_send(libxl__qmp_handler *qmp,
         }
         elm->id = qmp->last_id_used;
         elm->callback = callback;
+        elm->opaque = opaque;
         SIMPLEQ_INSERT_TAIL(&qmp->callback_list, elm, next);
     }
 
@@ -484,13 +491,14 @@ error:
 }
 
 static int qmp_synchronous_send(libxl__qmp_handler *qmp, const char *cmd,
-                                qmp_callback_t callback, int ask_timeout)
+                                qmp_callback_t callback, void *opaque,
+                                int ask_timeout)
 {
     int id = 0;
     int ret = 0;
     libxl__gc gc = LIBXL_INIT_GC(qmp->ctx);
 
-    id = qmp_send(qmp, cmd, callback);
+    id = qmp_send(qmp, cmd, callback, opaque);
     if (id <= 0) {
         return -1;
     }
@@ -580,7 +588,7 @@ int libxl__qmp_query_serial(libxl__qmp_handler *qmp)
 {
     return qmp_synchronous_send(qmp, "query-chardev",
                                 register_serials_chardev_callback,
-                                qmp->timeout);
+                                NULL, qmp->timeout);
 }
 
 int libxl__qmp_initializations(libxl_ctx *ctx, uint32_t domid)
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 09:10:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 09:10:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLGv7-0001Zg-O7; Tue, 01 Nov 2011 09:10:37 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLGse-0000cO-45
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 09:08:04 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320163643!61515542!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26735 invoked from network); 1 Nov 2011 16:07:24 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 16:07:24 -0000
X-IronPort-AV: E=Sophos;i="4.69,438,1315195200"; d="scan'208";a="18718737"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 12:07:57 -0400
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 12:07:58 -0400
Received: from perard.uk.xensource.com (dhcp-3-28.uk.xensource.com
	[10.80.3.28] (may be forged))	by smtp01.ad.xensource.com
	(8.13.1/8.13.1) with
	ESMTP id pA1G7YNG014577;	Tue, 1 Nov 2011 09:07:55 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Tue, 1 Nov 2011 16:07:16 +0000
Message-ID: <1320163646-24291-4-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
References: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH V3 03/13] libxl_qmp: Better error message after
	a parse error.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

By setting the next string to parse after having printed any error messages.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/libxl/libxl_qmp.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
index ef36348..f61a87a 100644
--- a/tools/libxl/libxl_qmp.c
+++ b/tools/libxl/libxl_qmp.c
@@ -403,7 +403,6 @@ static int qmp_next(libxl__gc *gc, libxl__qmp_handler *qmp)
                 *end = '\0';
 
                 o = libxl__json_parse(gc, s);
-                s = end + 2;
 
                 if (o) {
                     qmp_handle_response(qmp, o);
@@ -413,6 +412,8 @@ static int qmp_next(libxl__gc *gc, libxl__qmp_handler *qmp)
                                "Parse error of : %s\n", s);
                     return -1;
                 }
+
+                s = end + 2;
             } else {
                 break;
             }
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 09:11:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 09:11:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLGwA-000238-Pj; Tue, 01 Nov 2011 09:11:42 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLGsg-0000d2-IH
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 09:08:06 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1320163678!1550914!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10234 invoked from network); 1 Nov 2011 16:08:03 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-6.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 16:08:03 -0000
X-IronPort-AV: E=Sophos;i="4.69,438,1315195200"; d="scan'208";a="168952471"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 12:07:43 -0400
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 12:07:43 -0400
Received: from perard.uk.xensource.com (dhcp-3-28.uk.xensource.com
	[10.80.3.28] (may be forged))	by smtp01.ad.xensource.com
	(8.13.1/8.13.1) with
	ESMTP id pA1G7YNE014577;	Tue, 1 Nov 2011 09:07:41 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Tue, 1 Nov 2011 16:07:14 +0000
Message-ID: <1320163646-24291-2-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
References: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH V3 01/13] libxl_qmp: Fix return check of fcntl
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/libxl/libxl_qmp.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
index 618f20f..ef36348 100644
--- a/tools/libxl/libxl_qmp.c
+++ b/tools/libxl/libxl_qmp.c
@@ -296,7 +296,7 @@ static int qmp_open(libxl__qmp_handler *qmp, const char *qmp_socket_path,
     if (qmp->qmp_fd < 0) {
         return -1;
     }
-    if ((flags = fcntl(qmp->qmp_fd, F_GETFL)) == 1) {
+    if ((flags = fcntl(qmp->qmp_fd, F_GETFL)) == -1) {
         flags = 0;
     }
     if (fcntl(qmp->qmp_fd, F_SETFL, flags | O_NONBLOCK) == -1) {
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 09:12:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 09:12:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLGww-0002QI-1u; Tue, 01 Nov 2011 09:12:30 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLGsk-0000dt-KT
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 09:08:20 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320163643!61515542!4
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27145 invoked from network); 1 Nov 2011 16:07:32 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 16:07:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,438,1315195200"; d="scan'208";a="18718748"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 12:08:07 -0400
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 12:08:07 -0400
Received: from perard.uk.xensource.com (dhcp-3-28.uk.xensource.com
	[10.80.3.28] (may be forged))	by smtp01.ad.xensource.com
	(8.13.1/8.13.1) with
	ESMTP id pA1G7YNN014577;	Tue, 1 Nov 2011 09:08:05 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Tue, 1 Nov 2011 16:07:23 +0000
Message-ID: <1320163646-24291-11-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
References: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH V3 10/13] libxl_qmp: Introduce
	libxl__qmp_pci_add.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This function insert a PCI passthrough device in qemu.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/libxl/libxl_internal.h |    4 ++
 tools/libxl/libxl_qmp.c      |   95 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 99 insertions(+), 0 deletions(-)

diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 09e0c51..718a417 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -119,6 +119,9 @@ typedef struct {
 } libxl__device;
 
 #define XC_PCI_BDF             "0x%x, 0x%x, 0x%x, 0x%x"
+#define PCI_DEVFN(slot, func)   ((((slot) & 0x1f) << 3) | ((func) & 0x07))
+#define PCI_SLOT(devfn)         (((devfn) >> 3) & 0x1f)
+#define PCI_FUNC(devfn)         ((devfn) & 0x07)
 #define AUTO_PHP_SLOT          0x100
 #define SYSFS_PCI_DEV          "/sys/bus/pci/devices"
 #define SYSFS_PCIBACK_DRIVER   "/sys/bus/pci/drivers/pciback"
@@ -446,6 +449,7 @@ _hidden libxl__qmp_handler *libxl__qmp_initialize(libxl_ctx *ctx,
                                                   uint32_t domid);
 /* ask to QEMU the serial port information and store it in xenstore. */
 _hidden int libxl__qmp_query_serial(libxl__qmp_handler *qmp);
+_hidden int libxl__qmp_pci_add(libxl__gc *gc, int d, libxl_device_pci *pcidev);
 /* close and free the QMP handler */
 _hidden void libxl__qmp_close(libxl__qmp_handler *qmp);
 /* remove the socket file, if the file has already been removed,
diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
index 6d80538..07ccf7a 100644
--- a/tools/libxl/libxl_qmp.c
+++ b/tools/libxl/libxl_qmp.c
@@ -41,6 +41,7 @@
  */
 
 #define QMP_RECEIVE_BUFFER_SIZE 4096
+#define PCI_PT_QDEV_ID "pci-pt-%02x_%02x.%01x"
 
 typedef int (*qmp_callback_t)(libxl__qmp_handler *qmp,
                               const libxl__json_object *tree,
@@ -618,6 +619,100 @@ int libxl__qmp_query_serial(libxl__qmp_handler *qmp)
                                 NULL, qmp->timeout);
 }
 
+static int pci_add_callback(libxl__qmp_handler *qmp,
+                            const libxl__json_object *response, void *opaque)
+{
+    libxl_device_pci *pcidev = opaque;
+    const libxl__json_object *bus = NULL;
+    libxl__gc gc = LIBXL_INIT_GC(qmp->ctx);
+    int i, j, rc = -1;
+    char *asked_id = libxl__sprintf(&gc, PCI_PT_QDEV_ID,
+                                    pcidev->bus, pcidev->dev, pcidev->func);
+
+    for (i = 0; (bus = libxl__json_array_get(response, i)); i++) {
+        const libxl__json_object *devices = NULL;
+        const libxl__json_object *device = NULL;
+        const libxl__json_object *o = NULL;
+        const char *id = NULL;
+
+        devices = libxl__json_map_get("devices", bus, JSON_ARRAY);
+
+        for (j = 0; (device = libxl__json_array_get(devices, j)); j++) {
+             o = libxl__json_map_get("qdev_id", device, JSON_STRING);
+             id = libxl__json_object_get_string(o);
+
+             if (id && strcmp(asked_id, id) == 0) {
+                 int dev_slot, dev_func;
+
+                 o = libxl__json_map_get("slot", device, JSON_INTEGER);
+                 if (!o)
+                     goto out;
+                 dev_slot = libxl__json_object_get_integer(o);
+                 o = libxl__json_map_get("function", device, JSON_INTEGER);
+                 if (!o)
+                     goto out;
+                 dev_func = libxl__json_object_get_integer(o);
+
+                 pcidev->vdevfn = PCI_DEVFN(dev_slot, dev_func);
+
+                 rc = 0;
+                 goto out;
+             }
+        }
+    }
+
+
+out:
+    libxl__free_all(&gc);
+    return rc;
+}
+
+int libxl__qmp_pci_add(libxl__gc *gc, int domid, libxl_device_pci *pcidev)
+{
+    libxl__qmp_handler *qmp = NULL;
+    flexarray_t *parameters = NULL;
+    libxl_key_value_list args = NULL;
+    char *hostaddr = NULL;
+    int rc = 0;
+
+    qmp = libxl__qmp_initialize(libxl__gc_owner(gc), domid);
+    if (!qmp)
+        return -1;
+
+    hostaddr = libxl__sprintf(gc, "%04x:%02x:%02x.%01x", pcidev->domain,
+                              pcidev->bus, pcidev->dev, pcidev->func);
+    if (!hostaddr)
+        return -1;
+
+    parameters = flexarray_make(6, 1);
+    flexarray_append_pair(parameters, "driver", "xen-pci-passthrough");
+    flexarray_append_pair(parameters, "id",
+                          libxl__sprintf(gc, PCI_PT_QDEV_ID,
+                                         pcidev->bus, pcidev->dev,
+                                         pcidev->func));
+    flexarray_append_pair(parameters, "hostaddr", hostaddr);
+    if (pcidev->vdevfn) {
+        flexarray_append_pair(parameters, "addr",
+                              libxl__sprintf(gc, "%x.%x",
+                                             PCI_SLOT(pcidev->vdevfn),
+                                             PCI_FUNC(pcidev->vdevfn)));
+    }
+    args = libxl__xs_kvs_of_flexarray(gc, parameters, parameters->count);
+    if (!args)
+        return -1;
+
+    rc = qmp_synchronous_send(qmp, "device_add", &args,
+                              NULL, NULL, qmp->timeout);
+    if (rc == 0) {
+        rc = qmp_synchronous_send(qmp, "query-pci", NULL,
+                                  pci_add_callback, pcidev, qmp->timeout);
+    }
+
+    flexarray_free(parameters);
+    libxl__qmp_close(qmp);
+    return rc;
+}
+
 int libxl__qmp_initializations(libxl_ctx *ctx, uint32_t domid)
 {
     libxl__qmp_handler *qmp = NULL;
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 09:13:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 09:13:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLGxu-0002nR-Mh; Tue, 01 Nov 2011 09:13:30 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLGsi-0000dM-K7
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 09:08:20 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320163643!61515542!3
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26988 invoked from network); 1 Nov 2011 16:07:30 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 16:07:30 -0000
X-IronPort-AV: E=Sophos;i="4.69,438,1315195200"; d="scan'208";a="18718747"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 12:08:04 -0400
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 12:08:04 -0400
Received: from perard.uk.xensource.com (dhcp-3-28.uk.xensource.com
	[10.80.3.28] (may be forged))	by smtp01.ad.xensource.com
	(8.13.1/8.13.1) with
	ESMTP id pA1G7YNL014577;	Tue, 1 Nov 2011 09:08:02 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Tue, 1 Nov 2011 16:07:21 +0000
Message-ID: <1320163646-24291-9-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
References: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH V3 08/13] libxl_qmp: Introduce
	qmp_request_context.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This structure helps to track the return code of a callback. It's only used
between qmp_synchronous_send and qmp_send.

Now, qmp_synchronous_send will return the rc of the callback if there is no
error.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/libxl/libxl_qmp.c |   49 ++++++++++++++++++++++++++++++++--------------
 1 files changed, 34 insertions(+), 15 deletions(-)

diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
index 47129c3..6d80538 100644
--- a/tools/libxl/libxl_qmp.c
+++ b/tools/libxl/libxl_qmp.c
@@ -46,10 +46,15 @@ typedef int (*qmp_callback_t)(libxl__qmp_handler *qmp,
                               const libxl__json_object *tree,
                               void *opaque);
 
+typedef struct qmp_request_context {
+    int rc;
+} qmp_request_context;
+
 typedef struct callback_id_pair {
     int id;
     qmp_callback_t callback;
     void *opaque;
+    qmp_request_context *context;
     SIMPLEQ_ENTRY(callback_id_pair) next;
 } callback_id_pair;
 
@@ -73,7 +78,8 @@ struct libxl__qmp_handler {
 
 static int qmp_send(libxl__qmp_handler *qmp,
                     const char *cmd, libxl_key_value_list *args,
-                    qmp_callback_t callback, void *opaque);
+                    qmp_callback_t callback, void *opaque,
+                    qmp_request_context *context);
 
 static const int QMP_SOCKET_CONNECT_TIMEOUT = 5;
 
@@ -162,7 +168,7 @@ static int qmp_capabilities_callback(libxl__qmp_handler *qmp,
 static int enable_qmp_capabilities(libxl__qmp_handler *qmp)
 {
     return qmp_send(qmp, "qmp_capabilities", NULL,
-                    qmp_capabilities_callback, NULL);
+                    qmp_capabilities_callback, NULL, NULL);
 }
 
 /*
@@ -214,7 +220,10 @@ static void qmp_handle_error_response(libxl__qmp_handler *qmp,
 
     if (pp) {
         if (pp->callback) {
-            pp->callback(qmp, NULL, pp->opaque);
+            int rc = pp->callback(qmp, NULL, pp->opaque);
+            if (pp->context) {
+                pp->context->rc = rc;
+            }
         }
         if (pp->id == qmp->wait_for_id) {
             /* tell that the id have been processed */
@@ -241,16 +250,18 @@ static int qmp_handle_response(libxl__qmp_handler *qmp,
     switch (type) {
     case LIBXL__QMP_MESSAGE_TYPE_QMP:
         /* On the greeting message from the server, enable QMP capabilities */
-        enable_qmp_capabilities(qmp);
-        break;
+        return enable_qmp_capabilities(qmp);
     case LIBXL__QMP_MESSAGE_TYPE_RETURN: {
         callback_id_pair *pp = qmp_get_callback_from_id(qmp, resp);
 
         if (pp) {
             if (pp->callback) {
-                pp->callback(qmp,
+                int rc = pp->callback(qmp,
                              libxl__json_map_get("return", resp, JSON_ANY),
                              pp->opaque);
+                if (pp->context) {
+                    pp->context->rc = rc;
+                }
             }
             if (pp->id == qmp->wait_for_id) {
                 /* tell that the id have been processed */
@@ -259,13 +270,13 @@ static int qmp_handle_response(libxl__qmp_handler *qmp,
             SIMPLEQ_REMOVE(&qmp->callback_list, pp, callback_id_pair, next);
             free(pp);
         }
-        break;
+        return 0;
     }
     case LIBXL__QMP_MESSAGE_TYPE_ERROR:
         qmp_handle_error_response(qmp, resp);
-        break;
+        return -1;
     case LIBXL__QMP_MESSAGE_TYPE_EVENT:
-        break;
+        return 0;
     case LIBXL__QMP_MESSAGE_TYPE_INVALID:
         return -1;
     }
@@ -358,6 +369,7 @@ static int qmp_next(libxl__gc *gc, libxl__qmp_handler *qmp)
 
     char *incomplete = NULL;
     size_t incomplete_size = 0;
+    int rc = 0;
 
     do {
         fd_set rfds;
@@ -415,7 +427,7 @@ static int qmp_next(libxl__gc *gc, libxl__qmp_handler *qmp)
                 o = libxl__json_parse(gc, s);
 
                 if (o) {
-                    qmp_handle_response(qmp, o);
+                    rc = qmp_handle_response(qmp, o);
                     libxl__json_object_free(gc, o);
                 } else {
                     LIBXL__LOG(qmp->ctx, LIBXL__LOG_ERROR,
@@ -430,12 +442,13 @@ static int qmp_next(libxl__gc *gc, libxl__qmp_handler *qmp)
         } while (s < s_end);
    } while (s < s_end);
 
-    return 1;
+    return rc;
 }
 
 static int qmp_send(libxl__qmp_handler *qmp,
                     const char *cmd, libxl_key_value_list *args,
-                    qmp_callback_t callback, void *opaque)
+                    qmp_callback_t callback, void *opaque,
+                    qmp_request_context *context)
 {
     yajl_gen_config conf = { 0, NULL };
     const unsigned char *buf;
@@ -477,6 +490,7 @@ static int qmp_send(libxl__qmp_handler *qmp,
     elm->id = qmp->last_id_used;
     elm->callback = callback;
     elm->opaque = opaque;
+    elm->context = context;
     SIMPLEQ_INSERT_TAIL(&qmp->callback_list, elm, next);
 
     LIBXL__LOG(qmp->ctx, LIBXL__LOG_DEBUG, "next qmp command: '%s'", buf);
@@ -505,8 +519,9 @@ static int qmp_synchronous_send(libxl__qmp_handler *qmp, const char *cmd,
     int id = 0;
     int ret = 0;
     libxl__gc gc = LIBXL_INIT_GC(qmp->ctx);
+    qmp_request_context context = { .rc = 0 };
 
-    id = qmp_send(qmp, cmd, args, callback, opaque);
+    id = qmp_send(qmp, cmd, args, callback, opaque, &context);
     if (id <= 0) {
         return -1;
     }
@@ -514,13 +529,17 @@ static int qmp_synchronous_send(libxl__qmp_handler *qmp, const char *cmd,
 
     while (qmp->wait_for_id == id) {
         if ((ret = qmp_next(&gc, qmp)) < 0) {
-            return ret;
+            break;
         }
     }
 
+    if (qmp->wait_for_id != id && ret == 0) {
+        ret = context.rc;
+    }
+
     libxl__free_all(&gc);
 
-    return 0;
+    return ret;
 }
 
 static void qmp_free_handler(libxl__qmp_handler *qmp)
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 09:14:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 09:14:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLGyv-0003AS-8V; Tue, 01 Nov 2011 09:14:33 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLGsm-0000e2-AK
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 09:08:20 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320163643!61515542!5
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27266 invoked from network); 1 Nov 2011 16:07:34 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 16:07:34 -0000
X-IronPort-AV: E=Sophos;i="4.69,438,1315195200"; d="scan'208";a="18718750"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 12:08:08 -0400
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 12:08:08 -0400
Received: from perard.uk.xensource.com (dhcp-3-28.uk.xensource.com
	[10.80.3.28] (may be forged))	by smtp01.ad.xensource.com
	(8.13.1/8.13.1) with
	ESMTP id pA1G7YNO014577;	Tue, 1 Nov 2011 09:08:06 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Tue, 1 Nov 2011 16:07:24 +0000
Message-ID: <1320163646-24291-12-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
References: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH V3 11/13] libxl: Use QMP to insert a passthrough
	device when using upstream QEMU
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Also move the xenstore specif code to a new function and add a message if
sscanf fail.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/libxl/libxl_pci.c |   74 +++++++++++++++++++++++++++++++++--------------
 1 files changed, 52 insertions(+), 22 deletions(-)

diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
index 33dd060..207ee33 100644
--- a/tools/libxl/libxl_pci.c
+++ b/tools/libxl/libxl_pci.c
@@ -599,11 +599,52 @@ static int pci_ins_check(libxl__gc *gc, uint32_t domid, const char *state, void
     return 1;
 }
 
-static int do_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting)
+static int qemu_pci_add_xenstore(libxl__gc *gc, uint32_t domid,
+                                 libxl_device_pci *pcidev)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
+    int rc = 0;
     char *path;
     char *state, *vdevfn;
+
+    path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
+    state = libxl__xs_read(gc, XBT_NULL, path);
+    path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/parameter",
+                          domid);
+    if (pcidev->vdevfn) {
+        libxl__xs_write(gc, XBT_NULL, path, PCI_BDF_VDEVFN,
+                        pcidev->domain, pcidev->bus, pcidev->dev,
+                        pcidev->func, pcidev->vdevfn);
+    } else {
+        libxl__xs_write(gc, XBT_NULL, path, PCI_BDF, pcidev->domain,
+                        pcidev->bus, pcidev->dev, pcidev->func);
+    }
+    path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/command",
+                          domid);
+    xs_write(ctx->xsh, XBT_NULL, path, "pci-ins", strlen("pci-ins"));
+    rc = libxl__wait_for_device_model(gc, domid, NULL, NULL,
+                                      pci_ins_check, state);
+    path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/parameter",
+                          domid);
+    vdevfn = libxl__xs_read(gc, XBT_NULL, path);
+    path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state",
+                          domid);
+    if ( rc < 0 )
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+                   "qemu refused to add device: %s", vdevfn);
+    else if ( sscanf(vdevfn, "0x%x", &pcidev->vdevfn) != 1 ) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+                   "wrong format for the vdevfn: '%s'", vdevfn);
+        rc = -1;
+    }
+    xs_write(ctx->xsh, XBT_NULL, path, state, strlen(state));
+
+    return rc;
+}
+
+static int do_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
     int rc, hvm = 0;
 
     switch (libxl__domain_type(gc, domid)) {
@@ -613,27 +654,16 @@ static int do_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, i
                                          NULL, NULL, NULL) < 0) {
             return ERROR_FAIL;
         }
-        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
-        state = libxl__xs_read(gc, XBT_NULL, path);
-        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/parameter", domid);
-        if (pcidev->vdevfn)
-            libxl__xs_write(gc, XBT_NULL, path, PCI_BDF_VDEVFN, pcidev->domain,
-                           pcidev->bus, pcidev->dev, pcidev->func, pcidev->vdevfn);
-        else
-            libxl__xs_write(gc, XBT_NULL, path, PCI_BDF, pcidev->domain,
-                           pcidev->bus, pcidev->dev, pcidev->func);
-        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/command", domid);
-        xs_write(ctx->xsh, XBT_NULL, path, "pci-ins", strlen("pci-ins"));
-        rc = libxl__wait_for_device_model(gc, domid, NULL, NULL,
-                                          pci_ins_check, state);
-        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/parameter", domid);
-        vdevfn = libxl__xs_read(gc, XBT_NULL, path);
-        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
-        if ( rc < 0 )
-            LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "qemu refused to add device: %s", vdevfn);
-        else if ( sscanf(vdevfn, "0x%x", &pcidev->vdevfn) != 1 )
-            rc = -1;
-        xs_write(ctx->xsh, XBT_NULL, path, state, strlen(state));
+        switch (libxl__device_model_version_running(gc, domid)) {
+            case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL:
+                rc = qemu_pci_add_xenstore(gc, domid, pcidev);
+                break;
+            case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN:
+                rc = libxl__qmp_pci_add(gc, domid, pcidev);
+                break;
+            default:
+                return ERROR_INVAL;
+        }
         if ( rc )
             return ERROR_FAIL;
         break;
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 09:15:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 09:15:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLH00-0003XV-5x; Tue, 01 Nov 2011 09:15:40 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLGso-0000e3-Us
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 09:08:20 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320163643!61515542!6
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27369 invoked from network); 1 Nov 2011 16:07:36 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 16:07:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,438,1315195200"; d="scan'208";a="18718752"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 12:08:10 -0400
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 12:08:11 -0400
Received: from perard.uk.xensource.com (dhcp-3-28.uk.xensource.com
	[10.80.3.28] (may be forged))	by smtp01.ad.xensource.com
	(8.13.1/8.13.1) with
	ESMTP id pA1G7YNQ014577;	Tue, 1 Nov 2011 09:08:09 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Tue, 1 Nov 2011 16:07:26 +0000
Message-ID: <1320163646-24291-14-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
References: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH V3 13/13] libxl: Remove a passthrough device
	through QMP.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/libxl/libxl_pci.c |   69 ++++++++++++++++++++++++++++++----------------
 1 files changed, 45 insertions(+), 24 deletions(-)

diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
index 207ee33..1f93e67 100644
--- a/tools/libxl/libxl_pci.c
+++ b/tools/libxl/libxl_pci.c
@@ -861,13 +861,45 @@ out:
     return rc;
 }
 
+static int qemu_pci_remove_xenstore(libxl__gc *gc, uint32_t domid,
+                                    libxl_device_pci *pcidev, int force)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    char *state;
+    char *path;
+
+    path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
+    state = libxl__xs_read(gc, XBT_NULL, path);
+    path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/parameter", domid);
+    libxl__xs_write(gc, XBT_NULL, path, PCI_BDF, pcidev->domain,
+                    pcidev->bus, pcidev->dev, pcidev->func);
+    path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/command", domid);
+
+    /* Remove all functions at once atomically by only signalling
+     * device-model for function 0 */
+    if ( !force && (pcidev->vdevfn & 0x7) == 0 ) {
+        xs_write(ctx->xsh, XBT_NULL, path, "pci-rem", strlen("pci-rem"));
+        if (libxl__wait_for_device_model(gc, domid, "pci-removed",
+                                         NULL, NULL, NULL) < 0) {
+            LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Device Model didn't respond in time");
+            /* This depends on guest operating system acknowledging the
+             * SCI, if it doesn't respond in time then we may wish to
+             * force the removal.
+             */
+            return ERROR_FAIL;
+        }
+    }
+    path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
+    xs_write(ctx->xsh, XBT_NULL, path, state, strlen(state));
+
+    return 0;
+}
+
 static int do_pci_remove(libxl__gc *gc, uint32_t domid,
                          libxl_device_pci *pcidev, int force)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     libxl_device_pci *assigned;
-    char *path;
-    char *state;
     int hvm = 0, rc, num;
     int stubdomid = 0;
 
@@ -886,29 +918,18 @@ static int do_pci_remove(libxl__gc *gc, uint32_t domid,
                                          NULL, NULL, NULL) < 0) {
             return ERROR_FAIL;
         }
-        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
-        state = libxl__xs_read(gc, XBT_NULL, path);
-        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/parameter", domid);
-        libxl__xs_write(gc, XBT_NULL, path, PCI_BDF, pcidev->domain,
-                       pcidev->bus, pcidev->dev, pcidev->func);
-        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/command", domid);
-
-        /* Remove all functions at once atomically by only signalling
-         * device-model for function 0 */
-        if ( !force && (pcidev->vdevfn & 0x7) == 0 ) {
-            xs_write(ctx->xsh, XBT_NULL, path, "pci-rem", strlen("pci-rem"));
-            if (libxl__wait_for_device_model(gc, domid, "pci-removed",
-                                             NULL, NULL, NULL) < 0) {
-                LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Device Model didn't respond in time");
-                /* This depends on guest operating system acknowledging the
-                 * SCI, if it doesn't respond in time then we may wish to
-                 * force the removal.
-                 */
-                return ERROR_FAIL;
-            }
+        switch (libxl__device_model_version_running(gc, domid)) {
+        case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL:
+            rc = qemu_pci_remove_xenstore(gc, domid, pcidev, force);
+            break;
+        case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN:
+            rc = libxl__qmp_pci_del(gc, domid, pcidev);
+            break;
+        default:
+            return ERROR_INVAL;
         }
-        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
-        xs_write(ctx->xsh, XBT_NULL, path, state, strlen(state));
+        if (rc)
+            return ERROR_FAIL;
         break;
     case LIBXL_DOMAIN_TYPE_PV:
     {
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 09:16:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 09:16:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLH19-0003uo-VC; Tue, 01 Nov 2011 09:16:52 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLGsl-0000e0-Om
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 09:08:20 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1320163678!1550914!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10469 invoked from network); 1 Nov 2011 16:08:08 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-6.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 16:08:08 -0000
X-IronPort-AV: E=Sophos;i="4.69,438,1315195200"; d="scan'208";a="168952513"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 12:07:52 -0400
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 12:07:52 -0400
Received: from perard.uk.xensource.com (dhcp-3-28.uk.xensource.com
	[10.80.3.28] (may be forged))	by smtp01.ad.xensource.com
	(8.13.1/8.13.1) with
	ESMTP id pA1G7YNF014577;	Tue, 1 Nov 2011 09:07:50 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Tue, 1 Nov 2011 16:07:15 +0000
Message-ID: <1320163646-24291-3-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
References: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH V3 02/13] libxl_json: Check the parser status
	before to call parse_complete
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Also, use goto to handle an error.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/libxl/libxl_json.c |   37 ++++++++++++++++++++-----------------
 1 files changed, 20 insertions(+), 17 deletions(-)

diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c
index 11f65fc..389b697 100644
--- a/tools/libxl/libxl_json.c
+++ b/tools/libxl/libxl_json.c
@@ -730,6 +730,8 @@ libxl__json_object *libxl__json_parse(libxl__gc *gc, const char *s)
 {
     yajl_status status;
     libxl__yajl_ctx yajl_ctx;
+    libxl__json_object *o = NULL;
+    unsigned char *str = NULL;
 
     memset(&yajl_ctx, 0, sizeof (yajl_ctx));
     yajl_ctx.gc = gc;
@@ -744,30 +746,31 @@ libxl__json_object *libxl__json_parse(libxl__gc *gc, const char *s)
         yajl_ctx.hand = yajl_alloc(&callbacks, &cfg, NULL, &yajl_ctx);
     }
     status = yajl_parse(yajl_ctx.hand, (const unsigned char *)s, strlen(s));
+    if (status != yajl_status_ok)
+        goto out;
+
     status = yajl_parse_complete(yajl_ctx.hand);
+    if (status != yajl_status_ok)
+        goto out;
 
-    if (status == yajl_status_ok) {
-        libxl__json_object *o = yajl_ctx.head;
+    o = yajl_ctx.head;
 
-        DEBUG_GEN_REPORT(&yajl_ctx);
+    DEBUG_GEN_REPORT(&yajl_ctx);
 
-        yajl_ctx.head = NULL;
+    yajl_ctx.head = NULL;
 
-        yajl_ctx_free(&yajl_ctx);
-        return o;
-    } else {
-        unsigned char *str = yajl_get_error(yajl_ctx.hand, 1,
-                                            (const unsigned char *)s,
-                                            strlen(s));
+    yajl_ctx_free(&yajl_ctx);
+    return o;
 
-        LIBXL__LOG(libxl__gc_owner(gc), LIBXL__LOG_ERROR,
-                   "yajl error: %s", str);
-        yajl_free_error(yajl_ctx.hand, str);
+out:
+    str = yajl_get_error(yajl_ctx.hand, 1, (const unsigned char*)s, strlen(s));
 
-        libxl__json_object_free(gc, yajl_ctx.head);
-        yajl_ctx_free(&yajl_ctx);
-        return NULL;
-    }
+    LIBXL__LOG(libxl__gc_owner(gc), LIBXL__LOG_ERROR, "yajl error: %s", str);
+    yajl_free_error(yajl_ctx.hand, str);
+
+    libxl__json_object_free(gc, yajl_ctx.head);
+    yajl_ctx_free(&yajl_ctx);
+    return NULL;
 }
 
 static const char *yajl_gen_status_to_string(yajl_gen_status s)
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 09:18:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 09:18:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLH2O-0004Ob-Rj; Tue, 01 Nov 2011 09:18:08 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLGsy-0000ew-Ls
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 09:08:25 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1320163682!46592330!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24958 invoked from network); 1 Nov 2011 16:08:04 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 16:08:04 -0000
X-IronPort-AV: E=Sophos;i="4.69,438,1315195200"; d="scan'208";a="168952571"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 12:08:01 -0400
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 12:08:01 -0400
Received: from perard.uk.xensource.com (dhcp-3-28.uk.xensource.com
	[10.80.3.28] (may be forged))	by smtp01.ad.xensource.com
	(8.13.1/8.13.1) with
	ESMTP id pA1G7YNJ014577;	Tue, 1 Nov 2011 09:07:59 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Tue, 1 Nov 2011 16:07:19 +0000
Message-ID: <1320163646-24291-7-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
References: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH V3 06/13] libxl_qmp: Introduce list of arguments
	to qmp_send
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
---
 tools/libxl/libxl_qmp.c |   16 +++++++++++-----
 1 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
index ddc0a4d..43c7d04 100644
--- a/tools/libxl/libxl_qmp.c
+++ b/tools/libxl/libxl_qmp.c
@@ -72,7 +72,7 @@ struct libxl__qmp_handler {
 };
 
 static int qmp_send(libxl__qmp_handler *qmp,
-                    const char *cmd,
+                    const char *cmd, libxl_key_value_list *args,
                     qmp_callback_t callback, void *opaque);
 
 static const int QMP_SOCKET_CONNECT_TIMEOUT = 5;
@@ -161,7 +161,8 @@ static int qmp_capabilities_callback(libxl__qmp_handler *qmp,
 
 static int enable_qmp_capabilities(libxl__qmp_handler *qmp)
 {
-    return qmp_send(qmp, "qmp_capabilities", qmp_capabilities_callback, NULL);
+    return qmp_send(qmp, "qmp_capabilities", NULL,
+                    qmp_capabilities_callback, NULL);
 }
 
 /*
@@ -429,7 +430,7 @@ static int qmp_next(libxl__gc *gc, libxl__qmp_handler *qmp)
 }
 
 static int qmp_send(libxl__qmp_handler *qmp,
-                    const char *cmd,
+                    const char *cmd, libxl_key_value_list *args,
                     qmp_callback_t callback, void *opaque)
 {
     yajl_gen_config conf = { 0, NULL };
@@ -448,6 +449,10 @@ static int qmp_send(libxl__qmp_handler *qmp,
     libxl__yajl_gen_asciiz(hand, cmd);
     libxl__yajl_gen_asciiz(hand, "id");
     yajl_gen_integer(hand, ++qmp->last_id_used);
+    if (args) {
+        libxl__yajl_gen_asciiz(hand, "arguments");
+        libxl_key_value_list_gen_json(hand, args);
+    }
     yajl_gen_map_close(hand);
 
     s = yajl_gen_get_buf(hand, &buf, &len);
@@ -491,6 +496,7 @@ error:
 }
 
 static int qmp_synchronous_send(libxl__qmp_handler *qmp, const char *cmd,
+                                libxl_key_value_list *args,
                                 qmp_callback_t callback, void *opaque,
                                 int ask_timeout)
 {
@@ -498,7 +504,7 @@ static int qmp_synchronous_send(libxl__qmp_handler *qmp, const char *cmd,
     int ret = 0;
     libxl__gc gc = LIBXL_INIT_GC(qmp->ctx);
 
-    id = qmp_send(qmp, cmd, callback, opaque);
+    id = qmp_send(qmp, cmd, args, callback, opaque);
     if (id <= 0) {
         return -1;
     }
@@ -586,7 +592,7 @@ void libxl__qmp_cleanup(libxl__gc *gc, uint32_t domid)
 
 int libxl__qmp_query_serial(libxl__qmp_handler *qmp)
 {
-    return qmp_synchronous_send(qmp, "query-chardev",
+    return qmp_synchronous_send(qmp, "query-chardev", NULL,
                                 register_serials_chardev_callback,
                                 NULL, qmp->timeout);
 }
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 09:19:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 09:19:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLH3H-0004lr-Vf; Tue, 01 Nov 2011 09:19:03 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLGt0-0000fI-Iq
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 09:08:27 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320163666!61515613!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27845 invoked from network); 1 Nov 2011 16:07:48 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 16:07:48 -0000
X-IronPort-AV: E=Sophos;i="4.69,438,1315195200"; d="scan'208";a="168952584"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 12:08:03 -0400
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 12:08:03 -0400
Received: from perard.uk.xensource.com (dhcp-3-28.uk.xensource.com
	[10.80.3.28] (may be forged))	by smtp01.ad.xensource.com
	(8.13.1/8.13.1) with
	ESMTP id pA1G7YNK014577;	Tue, 1 Nov 2011 09:08:01 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Tue, 1 Nov 2011 16:07:20 +0000
Message-ID: <1320163646-24291-8-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
References: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH V3 07/13] libxl_qmp: Always insert a command id
	in the callback_list.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Because the function qmp_synchronous_send rely on the presence of the id
in the callback_list.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
---
 tools/libxl/libxl_qmp.c |   34 ++++++++++++++++++----------------
 1 files changed, 18 insertions(+), 16 deletions(-)

diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
index 43c7d04..47129c3 100644
--- a/tools/libxl/libxl_qmp.c
+++ b/tools/libxl/libxl_qmp.c
@@ -213,7 +213,9 @@ static void qmp_handle_error_response(libxl__qmp_handler *qmp,
     resp = libxl__json_map_get("desc", resp, JSON_STRING);
 
     if (pp) {
-        pp->callback(qmp, NULL, pp->opaque);
+        if (pp->callback) {
+            pp->callback(qmp, NULL, pp->opaque);
+        }
         if (pp->id == qmp->wait_for_id) {
             /* tell that the id have been processed */
             qmp->wait_for_id = 0;
@@ -245,9 +247,11 @@ static int qmp_handle_response(libxl__qmp_handler *qmp,
         callback_id_pair *pp = qmp_get_callback_from_id(qmp, resp);
 
         if (pp) {
-            pp->callback(qmp,
-                         libxl__json_map_get("return", resp, JSON_ANY),
-                         pp->opaque);
+            if (pp->callback) {
+                pp->callback(qmp,
+                             libxl__json_map_get("return", resp, JSON_ANY),
+                             pp->opaque);
+            }
             if (pp->id == qmp->wait_for_id) {
                 /* tell that the id have been processed */
                 qmp->wait_for_id = 0;
@@ -438,6 +442,7 @@ static int qmp_send(libxl__qmp_handler *qmp,
     unsigned int len = 0;
     yajl_gen_status s;
     yajl_gen hand;
+    callback_id_pair *elm = NULL;
 
     hand = yajl_gen_alloc(&conf, NULL);
     if (!hand) {
@@ -463,19 +468,16 @@ static int qmp_send(libxl__qmp_handler *qmp,
         return -1;
     }
 
-    if (callback) {
-        callback_id_pair *elm = malloc(sizeof (callback_id_pair));
-        if (elm == NULL) {
-            LIBXL__LOG_ERRNO(qmp->ctx, LIBXL__LOG_ERROR,
-                             "Failed to allocate a QMP callback");
-            yajl_gen_free(hand);
-            return -1;
-        }
-        elm->id = qmp->last_id_used;
-        elm->callback = callback;
-        elm->opaque = opaque;
-        SIMPLEQ_INSERT_TAIL(&qmp->callback_list, elm, next);
+    elm = malloc(sizeof (callback_id_pair));
+    if (elm == NULL) {
+        LIBXL__LOG_ERRNO(qmp->ctx, LIBXL__LOG_ERROR,
+                         "Failed to allocate a QMP callback");
+        goto error;
     }
+    elm->id = qmp->last_id_used;
+    elm->callback = callback;
+    elm->opaque = opaque;
+    SIMPLEQ_INSERT_TAIL(&qmp->callback_list, elm, next);
 
     LIBXL__LOG(qmp->ctx, LIBXL__LOG_DEBUG, "next qmp command: '%s'", buf);
 
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 09:19:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 09:19:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLH48-000594-J2; Tue, 01 Nov 2011 09:19:56 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLGt1-0000fm-Dp
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 09:08:28 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1320163682!46592330!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25145 invoked from network); 1 Nov 2011 16:08:07 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 16:08:07 -0000
X-IronPort-AV: E=Sophos;i="4.69,438,1315195200"; d="scan'208";a="168952591"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 12:08:06 -0400
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 12:08:05 -0400
Received: from perard.uk.xensource.com (dhcp-3-28.uk.xensource.com
	[10.80.3.28] (may be forged))	by smtp01.ad.xensource.com
	(8.13.1/8.13.1) with
	ESMTP id pA1G7YNM014577;	Tue, 1 Nov 2011 09:08:03 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Tue, 1 Nov 2011 16:07:22 +0000
Message-ID: <1320163646-24291-10-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
References: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH V3 09/13] libxl_json: Handle number abrove
	LONG_MAX.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

The integers are now "long long" in the json_object.

If a number (decimal or integer) is too big (or too low), it is stored as it in
a string. So for that, we introduce a new type JSON_NUMBER.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/libxl/libxl_internal.h |    6 ++-
 tools/libxl/libxl_json.c     |   74 ++++++++++++++++++++++++++++++------------
 2 files changed, 57 insertions(+), 23 deletions(-)

diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 942d45b..09e0c51 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -468,6 +468,8 @@ typedef enum {
     JSON_FALSE,
     JSON_INTEGER,
     JSON_DOUBLE,
+    /* number is store in string, it's too big to be a long long or a double */
+    JSON_NUMBER,
     JSON_STRING,
     JSON_MAP,
     JSON_ARRAY,
@@ -477,7 +479,7 @@ typedef enum {
 typedef struct libxl__json_object {
     libxl__json_node_type type;
     union {
-        long i;
+        long long i;
         double d;
         char *string;
         /* List of libxl__json_object */
@@ -536,7 +538,7 @@ flexarray_t *libxl__json_object_get_array(const libxl__json_object *o)
     else
         return NULL;
 }
-static inline long libxl__json_object_get_integer(const libxl__json_object *o)
+static inline long long libxl__json_object_get_integer(const libxl__json_object *o)
 {
     if (libxl__json_object_is_integer(o))
         return o->u.i;
diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c
index 389b697..fd5e2aa 100644
--- a/tools/libxl/libxl_json.c
+++ b/tools/libxl/libxl_json.c
@@ -14,6 +14,7 @@
 
 #include <assert.h>
 #include <string.h>
+#include <math.h>
 
 #include <yajl/yajl_parse.h>
 #include <yajl/yajl_gen.h>
@@ -44,6 +45,7 @@ struct libxl__yajl_ctx {
 #  define DEBUG_GEN(ctx, type)              yajl_gen_##type(ctx->g)
 #  define DEBUG_GEN_VALUE(ctx, type, value) yajl_gen_##type(ctx->g, value)
 #  define DEBUG_GEN_STRING(ctx, str, n)     yajl_gen_string(ctx->g, str, n)
+#  define DEBUG_GEN_NUMBER(ctx, str, n)     yajl_gen_number(ctx->g, str, n)
 #  define DEBUG_GEN_REPORT(yajl_ctx) \
     do { \
         const unsigned char *buf = NULL; \
@@ -60,6 +62,7 @@ struct libxl__yajl_ctx {
 #  define DEBUG_GEN(ctx, type)                  ((void)0)
 #  define DEBUG_GEN_VALUE(ctx, type, value)     ((void)0)
 #  define DEBUG_GEN_STRING(ctx, value, lenght)  ((void)0)
+#  define DEBUG_GEN_NUMBER(ctx, value, lenght)  ((void)0)
 #  define DEBUG_GEN_REPORT(ctx)                 ((void)0)
 #endif
 
@@ -363,6 +366,7 @@ void libxl__json_object_free(libxl__gc *gc, libxl__json_object *obj)
         return;
     switch (obj->type) {
     case JSON_STRING:
+    case JSON_NUMBER:
         free(obj->u.string);
         break;
     case JSON_MAP: {
@@ -504,36 +508,64 @@ static int json_callback_boolean(void *opaque, int boolean)
     return 1;
 }
 
-static int json_callback_integer(void *opaque, long value)
+static bool is_decimal(const char *s, unsigned len)
+{
+    const char *end = s + len;
+    for (; s < end; s++) {
+        if (*s == '.')
+            return true;
+    }
+    return false;
+}
+
+static int json_callback_number(void *opaque, const char *s, unsigned int len)
 {
     libxl__yajl_ctx *ctx = opaque;
-    libxl__json_object *obj;
+    libxl__json_object *obj = NULL;
+    char *t = NULL;
 
-    DEBUG_GEN_VALUE(ctx, integer, value);
+    DEBUG_GEN_NUMBER(ctx, s, len);
 
-    if ((obj = json_object_alloc(ctx->gc, JSON_INTEGER)) == NULL)
-        return 0;
-    obj->u.i = value;
+    if (is_decimal(s, len)) {
+        double d = strtod(s, NULL);
 
-    if (json_object_append_to(ctx->gc, obj, ctx->current) == -1) {
-        libxl__json_object_free(ctx->gc, obj);
-        return 0;
-    }
+        if ((d == HUGE_VAL || d == HUGE_VAL) && errno == ERANGE) {
+            goto error;
+        }
 
-    return 1;
-}
+        if ((obj = json_object_alloc(ctx->gc, JSON_DOUBLE)) == NULL)
+            return 0;
+        obj->u.d = d;
+    } else {
+        long long i = strtoll(s, NULL, 10);
 
-static int json_callback_double(void *opaque, double value)
-{
-    libxl__yajl_ctx *ctx = opaque;
-    libxl__json_object *obj;
+        if ((i == LLONG_MIN || i == LLONG_MAX) && errno == ERANGE) {
+            goto error;
+        }
 
-    DEBUG_GEN_VALUE(ctx, double, value);
+        if ((obj = json_object_alloc(ctx->gc, JSON_INTEGER)) == NULL)
+            return 0;
+        obj->u.i = i;
+    }
+    goto out;
 
-    if ((obj = json_object_alloc(ctx->gc, JSON_DOUBLE)) == NULL)
+error:
+    /* If the conversion fail, we just store the original string. */
+    if ((obj = json_object_alloc(ctx->gc, JSON_NUMBER)) == NULL)
         return 0;
-    obj->u.d = value;
 
+    t = malloc(len + 1);
+    if (t == NULL) {
+        LIBXL__LOG_ERRNO(libxl__gc_owner(ctx->gc), LIBXL__LOG_ERROR,
+                         "Failed to allocate");
+        return 0;
+    }
+    strncpy(t, s, len);
+    t[len] = 0;
+
+    obj->u.string = t;
+
+out:
     if (json_object_append_to(ctx->gc, obj, ctx->current) == -1) {
         libxl__json_object_free(ctx->gc, obj);
         return 0;
@@ -706,9 +738,9 @@ static int json_callback_end_array(void *opaque)
 static yajl_callbacks callbacks = {
     json_callback_null,
     json_callback_boolean,
-    json_callback_integer,
-    json_callback_double,
     NULL,
+    NULL,
+    json_callback_number,
     json_callback_string,
     json_callback_start_map,
     json_callback_map_key,
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 09:20:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 09:20:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLH4u-0005WT-Rb; Tue, 01 Nov 2011 09:20:44 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLGt1-0000fK-D5
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 09:08:28 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1320163682!46592330!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25053 invoked from network); 1 Nov 2011 16:08:06 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 16:08:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,438,1315195200"; d="scan'208";a="168952562"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 12:08:00 -0400
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 12:07:59 -0400
Received: from perard.uk.xensource.com (dhcp-3-28.uk.xensource.com
	[10.80.3.28] (may be forged))	by smtp01.ad.xensource.com
	(8.13.1/8.13.1) with
	ESMTP id pA1G7YNH014577;	Tue, 1 Nov 2011 09:07:57 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Tue, 1 Nov 2011 16:07:17 +0000
Message-ID: <1320163646-24291-5-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
References: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH V3 04/13] libxl: Introduce dm-version xenstore
	key.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

The all key is /libxl/$domid/dm-version.

The /libxl/$domid dir is created with the domain and should be only accessible
by the toolstack domain. The function libxl__xs_libxl_path() give this path.

This come with libxl__device_model_version_running() helper function.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/libxl/libxl.c          |    2 ++
 tools/libxl/libxl_create.c   |   29 ++++++++++++++++++++++++++++-
 tools/libxl/libxl_internal.c |   23 +++++++++++++++++++++++
 tools/libxl/libxl_internal.h |    7 +++++++
 tools/libxl/libxl_xshelp.c   |    9 +++++++++
 5 files changed, 69 insertions(+), 1 deletions(-)

diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 064fbc4..22a7795 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -777,6 +777,8 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force)
     if (!xs_rm(ctx->xsh, XBT_NULL, dom_path))
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xs_rm failed for %s", dom_path);
 
+    xs_rm(ctx->xsh, XBT_NULL, libxl__xs_libxl_path(&gc, domid));
+
     libxl__userdata_destroyall(&gc, domid);
 
     rc = xc_domain_destroy(ctx->xch, domid);
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index 68d0fc3..9506aa4 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -316,12 +316,14 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_create_info *info,
     char *rw_paths[] = { "control/shutdown", "device", "device/suspend/event-channel" , "data"};
     char *ro_paths[] = { "cpu", "memory", "device", "error", "drivers",
                          "control", "attr", "messages" };
-    char *dom_path, *vm_path;
+    char *dom_path, *vm_path, *libxl_path;
     struct xs_permissions roperm[2];
     struct xs_permissions rwperm[1];
+    struct xs_permissions noperm[1];
     xs_transaction_t t = 0;
     xen_domain_handle_t handle;
 
+
     assert(!libxl_domid_valid_guest(*domid));
 
     uuid_string = libxl__uuid2string(gc, info->uuid);
@@ -368,6 +370,14 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_create_info *info,
         goto out;
     }
 
+    libxl_path = libxl__xs_libxl_path(gc, *domid);
+    if (!libxl_path) {
+        rc = ERROR_FAIL;
+        goto out;
+    }
+    noperm[0].id = 0;
+    noperm[0].perms = XS_PERM_NONE;
+
     roperm[0].id = 0;
     roperm[0].perms = XS_PERM_NONE;
     roperm[1].id = *domid;
@@ -386,6 +396,10 @@ retry_transaction:
     xs_mkdir(ctx->xsh, t, vm_path);
     xs_set_permissions(ctx->xsh, t, vm_path, roperm, ARRAY_SIZE(roperm));
 
+    xs_rm(ctx->xsh, t, libxl_path);
+    xs_mkdir(ctx->xsh, t, libxl_path);
+    xs_set_permissions(ctx->xsh, t, libxl_path, noperm, ARRAY_SIZE(noperm));
+
     xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/vm", dom_path), vm_path, strlen(vm_path));
     rc = libxl__domain_rename(gc, *domid, 0, info->name, t);
     if (rc)
@@ -429,6 +443,17 @@ retry_transaction:
     return rc;
 }
 
+static int store_libxl_entry(libxl__gc *gc, uint32_t domid,
+                             libxl_device_model_info *dm_info)
+{
+    char *path = NULL;
+
+    path = libxl__xs_libxl_path(gc, domid);
+    path = libxl__sprintf(gc, "%s/dm-version", path);
+    return libxl__xs_write(gc, XBT_NULL, path, libxl__strdup(gc,
+        libxl_device_model_version_to_string(dm_info->device_model_version)));
+}
+
 static int do_domain_create(libxl__gc *gc, libxl_domain_config *d_config,
                             libxl_console_ready cb, void *priv,
                             uint32_t *domid_out, int restore_fd)
@@ -485,6 +510,8 @@ static int do_domain_create(libxl__gc *gc, libxl_domain_config *d_config,
         goto error_out;
     }
 
+    store_libxl_entry(gc, domid, dm_info);
+
     for (i = 0; i < d_config->num_disks; i++) {
         ret = libxl_device_disk_add(ctx, domid, &d_config->disks[i]);
         if (ret) {
diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c
index 3993d8e..34edaf3 100644
--- a/tools/libxl/libxl_internal.c
+++ b/tools/libxl/libxl_internal.c
@@ -319,6 +319,29 @@ int libxl__fd_set_cloexec(int fd)
     return fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
 }
 
+libxl_device_model_version libxl__device_model_version_running(libxl__gc *gc,
+                                                               uint32_t domid)
+{
+    char *path = NULL;
+    char *dm_version = NULL;
+    libxl_device_model_version value;
+
+    path = libxl__xs_libxl_path(gc, domid);
+    path = libxl__sprintf(gc, "%s/dm-version", path);
+    dm_version = libxl__xs_read(gc, XBT_NULL, path);
+    if (!dm_version) {
+        return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL;
+    }
+
+    if (libxl_device_model_version_from_string(dm_version, &value) < 0) {
+        libxl_ctx *ctx = libxl__gc_owner(gc);
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+                   "fatal: %s contain a wrong value (%s)", path, dm_version);
+        return -1;
+    }
+    return value;
+}
+
 /*
  * Local variables:
  * mode: C
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 2e26ac6..942d45b 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -195,6 +195,8 @@ _hidden char **libxl__xs_directory(libxl__gc *gc, xs_transaction_t t,
                                    char *path, unsigned int *nb);
    /* On error: returns NULL, sets errno (no logging) */
 
+_hidden char *libxl__xs_libxl_path(libxl__gc *gc, uint32_t domid);
+
 /* from xl_dom */
 _hidden libxl_domain_type libxl__domain_type(libxl__gc *gc, uint32_t domid);
 _hidden int libxl__domain_shutdown_reason(libxl__gc *gc, uint32_t domid);
@@ -554,6 +556,11 @@ _hidden void libxl__json_object_free(libxl__gc *gc, libxl__json_object *obj);
 
 _hidden libxl__json_object *libxl__json_parse(libxl__gc *gc, const char *s);
 
+  /* Based on /local/domain/$domid/dm-version xenstore key
+   * default is qemu xen traditional */
+_hidden libxl_device_model_version
+libxl__device_model_version_running(libxl__gc *gc, uint32_t domid);
+
 #endif
 
 /*
diff --git a/tools/libxl/libxl_xshelp.c b/tools/libxl/libxl_xshelp.c
index e41f962..4b09be3 100644
--- a/tools/libxl/libxl_xshelp.c
+++ b/tools/libxl/libxl_xshelp.c
@@ -122,6 +122,15 @@ char **libxl__xs_directory(libxl__gc *gc, xs_transaction_t t, char *path, unsign
     return ret;
 }
 
+char *libxl__xs_libxl_path(libxl__gc *gc, uint32_t domid)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    char *s = libxl__sprintf(gc, "/libxl/%i", domid);
+    if (!s)
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot allocate create paths");
+    return s;
+}
+
 /*
  * Local variables:
  * mode: C
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 09:21:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 09:21:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLH5g-0005th-IP; Tue, 01 Nov 2011 09:21:32 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLGt2-0000fr-26
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 09:08:28 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320163666!61515613!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27863 invoked from network); 1 Nov 2011 16:07:49 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 16:07:49 -0000
X-IronPort-AV: E=Sophos;i="4.69,438,1315195200"; d="scan'208";a="168952612"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 12:08:09 -0400
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 12:08:09 -0400
Received: from perard.uk.xensource.com (dhcp-3-28.uk.xensource.com
	[10.80.3.28] (may be forged))	by smtp01.ad.xensource.com
	(8.13.1/8.13.1) with
	ESMTP id pA1G7YNP014577;	Tue, 1 Nov 2011 09:08:08 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Tue, 1 Nov 2011 16:07:25 +0000
Message-ID: <1320163646-24291-13-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
References: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH V3 12/13] libxl_qmp: Introduce libxl__qmp_pci_del
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

To remove a pci passthough device from QEMU (upstream).

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/libxl/libxl_internal.h |    2 ++
 tools/libxl/libxl_qmp.c      |   35 +++++++++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 0 deletions(-)

diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 718a417..5123578 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -450,6 +450,8 @@ _hidden libxl__qmp_handler *libxl__qmp_initialize(libxl_ctx *ctx,
 /* ask to QEMU the serial port information and store it in xenstore. */
 _hidden int libxl__qmp_query_serial(libxl__qmp_handler *qmp);
 _hidden int libxl__qmp_pci_add(libxl__gc *gc, int d, libxl_device_pci *pcidev);
+_hidden int libxl__qmp_pci_del(libxl__gc *gc, int domid,
+                               libxl_device_pci *pcidev);
 /* close and free the QMP handler */
 _hidden void libxl__qmp_close(libxl__qmp_handler *qmp);
 /* remove the socket file, if the file has already been removed,
diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
index 07ccf7a..e7eb8cc 100644
--- a/tools/libxl/libxl_qmp.c
+++ b/tools/libxl/libxl_qmp.c
@@ -713,6 +713,41 @@ int libxl__qmp_pci_add(libxl__gc *gc, int domid, libxl_device_pci *pcidev)
     return rc;
 }
 
+static int qmp_device_del(libxl__gc *gc, int domid, char *id)
+{
+    libxl__qmp_handler *qmp = NULL;
+    flexarray_t *parameters = NULL;
+    libxl_key_value_list args = NULL;
+    int rc = 0;
+
+    qmp = libxl__qmp_initialize(libxl__gc_owner(gc), domid);
+    if (!qmp)
+        return -1;
+
+    parameters = flexarray_make(2, 1);
+    flexarray_append_pair(parameters, "id", id);
+    args = libxl__xs_kvs_of_flexarray(gc, parameters, parameters->count);
+    if (!args)
+        return -1;
+
+    rc = qmp_synchronous_send(qmp, "device_del", &args,
+                              NULL, NULL, qmp->timeout);
+
+    flexarray_free(parameters);
+    libxl__qmp_close(qmp);
+    return rc;
+}
+
+int libxl__qmp_pci_del(libxl__gc *gc, int domid, libxl_device_pci *pcidev)
+{
+    char *id = NULL;
+
+    id = libxl__sprintf(gc, PCI_PT_QDEV_ID,
+                        pcidev->bus, pcidev->dev, pcidev->func);
+
+    return qmp_device_del(gc, domid, id);
+}
+
 int libxl__qmp_initializations(libxl_ctx *ctx, uint32_t domid)
 {
     libxl__qmp_handler *qmp = NULL;
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 10:08:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 10:08:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLHpX-0007dp-RC; Tue, 01 Nov 2011 10:08:55 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLHoi-0007Rx-NN
	for Xen-devel@lists.xensource.com; Tue, 01 Nov 2011 10:08:05 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-8.tower-21.messagelabs.com!1320167281!2542428!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12472 invoked from network); 1 Nov 2011 17:08:01 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-8.tower-21.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 1 Nov 2011 17:08:01 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320167281; l=1352;
	s=domk; d=aepfle.de;
	h=In-Reply-To:Content-Transfer-Encoding:Content-Type:MIME-Version:
	References:Subject:Cc:To:From:Date:X-RZG-CLASS-ID:X-RZG-AUTH;
	bh=uYvb7zW9lijytaCILA2WEbfyIPk=;
	b=Lw1mBeBEOFOnMAe3+XEt0gabo5T8w+KyWVWJDgMxjgv+Jtyu8FHpCyiLCLwzG9eodVi
	cGjQ1z7JYTOTIUXyMEGbhzdTtYg37eByg5o8lbvcGQtDhI5tJtKfr9sE19dQeICLQpCbh
	x/L6HRFSM0nCqJG0LMPpNXh5gg9EvRlrhRc=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV7HU=
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-6.vodafone-net.de [80.226.24.6])
	by post.strato.de (mrclete mo48) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id R01c14nA1FGCRW ;
	Tue, 1 Nov 2011 18:07:50 +0100 (MET)
Received: by probook.site (Postfix, from userid 1000)
	id 5895118638; Tue,  1 Nov 2011 18:07:48 +0100 (CET)
Date: Tue, 1 Nov 2011 18:07:48 +0100
From: Olaf Hering <olaf@aepfle.de>
To: Hongkaixing <hongkaixing@huawei.com>
Message-ID: <20111101170748.GA9034@aepfle.de>
References: <E0AF011477D2AE458DC8801E0E570709014C0556@szxeml528-mbs.china.huawei.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <E0AF011477D2AE458DC8801E0E570709014C0556@szxeml528-mbs.china.huawei.com>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
Cc: YangXiaowei <xiaowei.yang@huawei.com>,
	"Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	"Eric Li\(Zhentao\)" <lizhentao@huawei.com>,
	Yanqiangjun <yanqiangjun@huawei.com>, hanweidong <hanweidong@huawei.com>
Subject: [Xen-devel] Re: xenpaing: one way to avoid paging out the page,
 when the corresponding mfn is in use.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 01, Hongkaixing wrote:

>    Recently many advanced memory mechanisms are introduced into Xen.
>    One problem we found is the conflict between p2m query and setting.
>    For example, backend drivers always map domUâ€™s page to its own
>    space, during the mapping procedure, situations as follow may
>    happen, when mfn is obtained by gfn_to_mfn(), this mfn is likely to
>    be paged out.
> 
> first case:
>    grant mapping                      xenpaing
>   mfn = gfn_to_mfn();
>                        <-----------  p2m_paging_nominate()
>          |                                         |
>      Check type ok                     paged out;
>          |
>      try to map
> What we want is: 
> When the page (mfn) is accessed by gfn_to_mfn(), this page should
> never be paged out until the mapping action is end. 

The query+map and query+change opterations on p2m entries should be done
under some lock. I have recently updated the p2m_mem_paging* functions
to do their modifications with the p2m_lock held.

Furthermore the change below checks wether something mapped a page
between nominate and evict:

http://xenbits.xen.org/hg/xen-unstable.hg/rev/eda18b27de6e

While this certainly does not fix all possible races, it slightly
reduces the window.


A more complete approach to add locking around p2m modifcations was
recently started by Andres Lagar-Cavilla:

http://lists.xensource.com/archives/html/xen-devel/2011-10/msg01946.html

Olaf

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 10:10:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 10:10:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLHr7-00081n-Ja; Tue, 01 Nov 2011 10:10:34 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLHqg-0007pz-Fe
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 10:10:06 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1320167403!1904581!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9954 invoked from network); 1 Nov 2011 17:10:03 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 17:10:03 -0000
X-IronPort-AV: E=Sophos;i="4.69,439,1315180800"; 
   d="scan'208";a="8700478"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 17:10:03 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 17:10:03 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLHqd-00067Z-0a; Tue, 01 Nov 2011 17:10:03 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLHqd-0004LG-0A;
	Tue, 01 Nov 2011 17:10:03 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20144.10218.994174.715254@mariner.uk.xensource.com>
Date: Tue, 1 Nov 2011 17:10:02 +0000
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 00 of 27 v3] libxl: rationalise libxl_device_*
	APIs
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ian Campbell writes ("[Xen-devel] [PATCH 00 of 27 v3] libxl: rationalise libxl_device_* APIs"):
> The following series overhauls the libxl_device_* APIs in an attempt
> to make them more consistent across the types of devices and move
> towards something we can support as a stable API longterm.

I have applied all 27 of these (1 earlier, and 26 just now).  I did
notice a few of the lines of C code were >80 columns but I guess we
can fix that up later and now isn't really the right time.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 10:34:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 10:34:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLIDq-0000V0-FU; Tue, 01 Nov 2011 10:34:02 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLIDC-0000J0-PL
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 10:33:23 -0700
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1320168799!1912209!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24789 invoked from network); 1 Nov 2011 17:33:19 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 17:33:19 -0000
X-IronPort-AV: E=Sophos;i="4.69,439,1315180800"; 
   d="scan'208";a="8700804"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 17:33:19 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 17:33:19 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RLID9-0006Fq-4F;
	Tue, 01 Nov 2011 17:33:19 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RLID2-0006vz-QV;
	Tue, 01 Nov 2011 17:33:12 +0000
Date: Tue, 1 Nov 2011 17:33:12 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <20111101173312.GH20553@spongy.cam.xci-test.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="6Nae48J/T25AfBN4"
Content-Disposition: inline
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH] ioemu: Clone ioemu with --depth=1
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--6Nae48J/T25AfBN4
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline


Signed-off-by: Jean Guyader <jean.guyader@citrix.com>

--6Nae48J/T25AfBN4
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: attachment; filename="ioemu-clone-depth-1.patch"

diff --git a/tools/Makefile b/tools/Makefile
index 9389e1f..6c1dfe0 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -92,7 +92,7 @@ ioemu-dir-find:
 		if [ ! -d ioemu-remote ]; then \
 			rm -rf ioemu-remote ioemu-remote.tmp; \
 			mkdir ioemu-remote.tmp; rmdir ioemu-remote.tmp; \
-			$(GIT) clone $(CONFIG_QEMU) ioemu-remote.tmp; \
+			$(GIT) clone --depth=1 $(CONFIG_QEMU) ioemu-remote.tmp; \
 			if [ "$(QEMU_TAG)" ]; then			\
 				cd ioemu-remote.tmp;			\
 				$(GIT) branch -D dummy >/dev/null 2>&1 ||:; \

--6Nae48J/T25AfBN4
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--6Nae48J/T25AfBN4--


From xen-devel-bounces@lists.xensource.com Tue Nov 01 11:26:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 11:26:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJ2m-0001ow-1q; Tue, 01 Nov 2011 11:26:40 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJ1f-0001cP-Pc
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 11:25:32 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1320171928!1031047!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17540 invoked from network); 1 Nov 2011 18:25:28 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 18:25:28 -0000
X-IronPort-AV: E=Sophos;i="4.69,439,1315180800"; 
   d="scan'208";a="8701924"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 18:25:27 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 18:25:27 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLJ1b-0006Xs-HQ; Tue, 01 Nov 2011 18:25:27 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLJ1b-0004QX-Gb;
	Tue, 01 Nov 2011 18:25:27 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20144.14743.503103.199495@mariner.uk.xensource.com>
Date: Tue, 1 Nov 2011 18:25:27 +0000
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: Re: [Xen-devel] [PATCH] xenstored: Fix processing of zero-length
	messages
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1320086292-5058-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1320086292-5058-1-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Daniel De Graaf writes ("[Xen-devel] [PATCH] xenstored: Fix processing of zero-length messages"):
> When a message with zero length is sent to xenstore, the body of the
> message was not processed until the socket or ring had more data to
> read; this will cause deadlocks if the requestor is waiting on a
> response to continue.
> 
> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>

Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>

Thanks
Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 11:28:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 11:28:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJ4f-0002DV-S7; Tue, 01 Nov 2011 11:28:37 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJ43-00021J-Ra
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 11:28:00 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1320172060!46609307!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20266 invoked from network); 1 Nov 2011 18:27:40 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 18:27:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,439,1315180800"; 
   d="scan'208";a="8701960"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 18:27:56 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 18:27:56 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLJ40-0006Yh-B2; Tue, 01 Nov 2011 18:27:56 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLJ40-0004Qv-A7;
	Tue, 01 Nov 2011 18:27:56 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20144.14892.300556.340248@mariner.uk.xensource.com>
Date: Tue, 1 Nov 2011 18:27:56 +0000
To: Vasiliy Tolstov <v.tolstov@selfip.ru>
Subject: Re: [Xen-devel] [PATCH] xenstored: Fix processing of zero-length
	messages
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <CACaajQum+1XJZY2RN366eUPZqpJPPc-r6+X6OgfwxV+d6rjpBg@mail.gmail.com>
References: <1320086292-5058-1-git-send-email-dgdegra@tycho.nsa.gov>
	<CACaajQum+1XJZY2RN366eUPZqpJPPc-r6+X6OgfwxV+d6rjpBg@mail.gmail.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>, xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Vasiliy Tolstov writes ("Re: [Xen-devel] [PATCH] xenstored: Fix processing of zero-length messages"):
> Thanks! Can somebody check ocaml oxenstored for deadlocks when incorrect
> messages sent to xenstore?

Do you have some reason to think oxenstored has a bug in this area ?

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 11:30:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 11:30:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJ6G-0002bL-1S; Tue, 01 Nov 2011 11:30:16 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJ5p-0002PB-DN
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 11:29:49 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1320172186!1564598!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22418 invoked from network); 1 Nov 2011 18:29:46 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 18:29:46 -0000
X-IronPort-AV: E=Sophos;i="4.69,439,1315180800"; 
   d="scan'208";a="8702002"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 18:29:27 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 18:29:27 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLJ5T-0006ZI-0h; Tue, 01 Nov 2011 18:29:27 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLJ5S-0004RF-Vz;
	Tue, 01 Nov 2011 18:29:26 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20144.14982.858481.131050@mariner.uk.xensource.com>
Date: Tue, 1 Nov 2011 18:29:26 +0000
To: Anthony PERARD <anthony.perard@citrix.com>
Subject: Re: [Xen-devel] [PATCH V2] docs, Add HowTo use QEMU upstream.
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1319722394-13439-1-git-send-email-anthony.perard@citrix.com>
References: <1319722394-13439-1-git-send-email-anthony.perard@citrix.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	"Keir \(Xen.org\)" <keir@xen.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Anthony PERARD writes ("[Xen-devel] [PATCH V2] docs, Add HowTo use QEMU upstream."):
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>

Applied, thanks.  Keir, I assume there's no problem with me applying
docs patches.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 11:38:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 11:38:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJEd-0003A8-5M; Tue, 01 Nov 2011 11:38:55 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJDy-0002y3-Rk
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 11:38:15 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1320172691!1568532!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14147 invoked from network); 1 Nov 2011 18:38:11 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 18:38:11 -0000
X-IronPort-AV: E=Sophos;i="4.69,439,1315180800"; 
   d="scan'208";a="8702080"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 18:38:11 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 18:38:11 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLJDv-0006cL-94; Tue, 01 Nov 2011 18:38:11 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLJDv-0004vH-1f;
	Tue, 01 Nov 2011 18:38:11 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20144.15506.905525.618418@mariner.uk.xensource.com>
Date: Tue, 1 Nov 2011 18:38:10 +0000
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: [Xen-devel] Re: [PATCH] docs: import HVM emulated device unplug
	protocol spec
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1319646916.9436.44.camel@zakaz.uk.xensource.com>
References: <03b570c3792bb6abce46.1319646312@cosworth.uk.xensource.com>
	<1319646916.9436.44.camel@zakaz.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ian Campbell writes ("[Xen-devel] Re: [PATCH] docs: import HVM emulated device unplug protocol spec"):
> On Wed, 2011-10-26 at 17:25 +0100, Ian Campbell wrote:
> > +The master registry of product names and numbers is in
> > +qemu-xen-unstable's xenstore.c. 
> 
> As an aside: This doesn't seem like the right place anymore (if ever).
> Where would be better?

qemu upstream is where it's implemented ...

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 11:42:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 11:42:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJI3-0003aD-VR; Tue, 01 Nov 2011 11:42:28 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJHZ-0003No-Kg
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 11:41:57 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1320172914!1571707!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27104 invoked from network); 1 Nov 2011 18:41:54 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 18:41:54 -0000
X-IronPort-AV: E=Sophos;i="4.69,439,1315180800"; 
   d="scan'208";a="8702309"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 18:41:54 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 18:41:54 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLJHV-0006dc-Vm; Tue, 01 Nov 2011 18:41:54 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLJHV-0006z3-Uv;
	Tue, 01 Nov 2011 18:41:53 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20144.15729.803733.870305@mariner.uk.xensource.com>
Date: Tue, 1 Nov 2011 18:41:53 +0000
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 1 of 6 DOCDAY] docs: import HVM emulated device
	unplug protocol spec
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <03b570c3792bb6abce46.1319705917@cosworth.uk.xensource.com>
References: <patchbomb.1319705916@cosworth.uk.xensource.com>
	<03b570c3792bb6abce46.1319705917@cosworth.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: ian.jackson@citrix.com, xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ian Campbell writes ("[Xen-devel] [PATCH 1 of 6 DOCDAY] docs: import HVM emulated device unplug protocol spec"):
> docs: import HVM emulated device unplug protocol spec

Applied all six, thanks.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 11:44:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 11:44:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJJq-00044Q-Sl; Tue, 01 Nov 2011 11:44:19 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJIw-0003rP-FK
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 11:43:22 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320172999!2519391!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26513 invoked from network); 1 Nov 2011 18:43:19 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 18:43:19 -0000
X-IronPort-AV: E=Sophos;i="4.69,439,1315180800"; 
   d="scan'208";a="8702334"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 18:43:19 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 18:43:19 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLJIs-0006e4-LF; Tue, 01 Nov 2011 18:43:18 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLJIs-0006zb-K9;
	Tue, 01 Nov 2011 18:43:18 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20144.15814.410032.785774@mariner.uk.xensource.com>
Date: Tue, 1 Nov 2011 18:43:18 +0000
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] qemu-xen: remove
	i386-dm/README.hvm-pv-magic-ioport-disable
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1319646410-30168-1-git-send-email-ian.campbell@citrix.com>
References: <03b570c3792bb6abce46.1319646312@cosworth.uk.xensource.com>
	<1319646410-30168-1-git-send-email-ian.campbell@citrix.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ian Campbell writes ("[Xen-devel] [PATCH] qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable"):
> I have just proposed a patch to add this to xen-unstable.hg as
> docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
> look for docs, plus we are transitioning to upstream qemu.

Right.

Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 11:46:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 11:46:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJLj-0004ca-HT; Tue, 01 Nov 2011 11:46:15 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJL2-0004I4-6C
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 11:45:32 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1320173122!1901646!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31146 invoked from network); 1 Nov 2011 18:45:22 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 18:45:22 -0000
X-IronPort-AV: E=Sophos;i="4.69,439,1315180800"; 
   d="scan'208";a="8702380"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 18:45:22 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 18:45:22 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLJKr-0006er-MC; Tue, 01 Nov 2011 18:45:21 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLJKr-00071D-LT;
	Tue, 01 Nov 2011 18:45:21 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20144.15937.655455.992347@mariner.uk.xensource.com>
Date: Tue, 1 Nov 2011 18:45:21 +0000
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH DOCDAY] introduce an xl man page in pod format
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <alpine.DEB.2.00.1110271659380.3519@kaball-desktop>
References: <alpine.DEB.2.00.1110271659380.3519@kaball-desktop>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Stefano Stabellini writes ("[Xen-devel] [PATCH DOCDAY] introduce an xl man page in pod format"):
> This is the initial version of an xl man page, based on the old xm man
> page.

Thanks.  I have applied this.  There were various suggestions for
improvements in the thread, but I think this manpage is better than
nothing so it should go in ASAP.  Further improvents are indeed
welcome and should come as patches against this.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 11:53:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 11:53:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJT8-0005Ae-7q; Tue, 01 Nov 2011 11:53:54 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJSa-0004yg-08
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 11:53:20 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1320173596!2543891!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31719 invoked from network); 1 Nov 2011 18:53:17 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 18:53:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,439,1315180800"; 
   d="scan'208";a="8702447"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 18:53:16 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 18:53:16 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLJSW-0006hW-5q; Tue, 01 Nov 2011 18:53:16 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLJSW-00017Z-3B;
	Tue, 01 Nov 2011 18:53:16 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20144.16411.886176.254632@mariner.uk.xensource.com>
Date: Tue, 1 Nov 2011 18:53:15 +0000
To: Philipp Hahn <hahn@univention.de>
Subject: Re: [Xen-devel] [PATCH v2] Add HybridISO support for PyGrub2
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <201110280946.51201.hahn@univention.de>
References: <201110251057.06774.hahn@univention.de>
	<201110251233.45315.hahn@univention.de>
	<1319710865.9436.106.camel@zakaz.uk.xensource.com>
	<201110280946.51201.hahn@univention.de>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Philipp Hahn writes ("Re: [Xen-devel] [PATCH v2] Add HybridISO support for PyGrub2"):
> v2: For HybrisISOs use offset 0 in addition instead of replacement.

Thanks.  I tried to apply this but it has been linewrapped.  Can you
please resubmit it with a non-broken mailer ?  If you avoid lines >75
characters it probably won't linewrap, or you could attach it I guess.

Thanks,
Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 12:05:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 12:05:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJeh-000641-N9; Tue, 01 Nov 2011 12:05:52 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJbD-0005Yx-4o
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 12:02:18 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1320174114!46612665!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27137 invoked from network); 1 Nov 2011 19:01:55 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-13.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 19:01:55 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA1J28e9006214
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 1 Nov 2011 19:02:09 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA1J27WA008387
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 1 Nov 2011 19:02:08 GMT
Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA1J22Ux013522; Tue, 1 Nov 2011 14:02:02 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 01 Nov 2011 12:02:02 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 466ED82D0C; Tue,  1 Nov 2011 15:02:01 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, thellstrom@vmware.com, thomas@shipmail.org, 
	airlied@redhat.com, jglisse@redhat.com, bskeggs@redhat.com
Date: Tue,  1 Nov 2011 14:47:23 -0400
Message-Id: <1320173252-2812-3-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
References: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090205.4EB04231.016C,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 02/11] nouveau/radeon: Set coherent DMA mask
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

All the storage devices that use the dmapool set the coherent DMA
mask so they can properly use the dmapool. Since the TTM DMA pool
code is based on that and dma_alloc_coherent checks the
'coherent_dma_mask' and not 'dma_mask' we want to set it.

Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 drivers/gpu/drm/nouveau/nouveau_mem.c  |    5 +++++
 drivers/gpu/drm/radeon/radeon_device.c |    6 ++++++
 2 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c
index 5ee14d2..8b39520 100644
--- a/drivers/gpu/drm/nouveau/nouveau_mem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_mem.c
@@ -408,6 +408,11 @@ nouveau_mem_vram_init(struct drm_device *dev)
 	if (ret)
 		return ret;
 
+	ret = pci_set_consistent_dma_mask(dev->pdev, DMA_BIT_MASK(dma_bits));
+	if (ret) {
+		/* Reset to default value. */
+		pci_set_consistent_dma_mask(dev->pdev, DMA_BIT_MASK(32));
+	}
 	dev_priv->fb_phys = pci_resource_start(dev->pdev, 1);
 
 	ret = nouveau_ttm_global_init(dev_priv);
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index 7cfaa7e..0c0a970 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -757,8 +757,14 @@ int radeon_device_init(struct radeon_device *rdev,
 	r = pci_set_dma_mask(rdev->pdev, DMA_BIT_MASK(dma_bits));
 	if (r) {
 		rdev->need_dma32 = true;
+		dma_bits = 32;
 		printk(KERN_WARNING "radeon: No suitable DMA available.\n");
 	}
+	r = pci_set_consistent_dma_mask(rdev->pdev, DMA_BIT_MASK(dma_bits));
+	if (r) {
+		pci_set_consistent_dma_mask(rdev->pdev, DMA_BIT_MASK(32));
+		printk(KERN_WARNING "radeon: No coherent DMA available.\n");
+	}
 
 	/* Registers mapping */
 	/* TODO: block userspace mapping of io register */
-- 
1.7.6.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 12:07:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 12:07:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJgX-0006S7-8p; Tue, 01 Nov 2011 12:07:45 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJbD-0005Yt-1j
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 12:02:18 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1320174130!1575666!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24222 invoked from network); 1 Nov 2011 19:02:11 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-7.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 19:02:11 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA1J28mH031810
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 1 Nov 2011 19:02:09 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA1J27hk008386
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 1 Nov 2011 19:02:08 GMT
Received: from abhmt113.oracle.com (abhmt113.oracle.com [141.146.116.65])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA1J22qN015664; Tue, 1 Nov 2011 14:02:02 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 01 Nov 2011 12:02:02 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 3BCE082C26; Tue,  1 Nov 2011 15:02:01 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, thellstrom@vmware.com, thomas@shipmail.org, 
	airlied@redhat.com, jglisse@redhat.com, bskeggs@redhat.com
Date: Tue,  1 Nov 2011 14:47:22 -0400
Message-Id: <1320173252-2812-2-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
References: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090201.4EB04231.022E,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 01/11] swiotlb: Expose swiotlb_nr_tlb function
	to modules
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

As a mechanism to detect whether SWIOTLB is enabled or not.
We also fix the spelling - it was swioltb instead of
swiotlb.

Acked-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
[v1: Ripped out swiotlb_enabled]
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 drivers/xen/swiotlb-xen.c |    2 +-
 include/linux/swiotlb.h   |    2 +-
 lib/swiotlb.c             |    5 +++--
 3 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c
index 6e8c15a..cbcd8cc 100644
--- a/drivers/xen/swiotlb-xen.c
+++ b/drivers/xen/swiotlb-xen.c
@@ -149,7 +149,7 @@ void __init xen_swiotlb_init(int verbose)
 	int rc;
 	unsigned long nr_tbl;
 
-	nr_tbl = swioltb_nr_tbl();
+	nr_tbl = swiotlb_nr_tbl();
 	if (nr_tbl)
 		xen_io_tlb_nslabs = nr_tbl;
 	else {
diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h
index 445702c..e872526 100644
--- a/include/linux/swiotlb.h
+++ b/include/linux/swiotlb.h
@@ -24,7 +24,7 @@ extern int swiotlb_force;
 
 extern void swiotlb_init(int verbose);
 extern void swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose);
-extern unsigned long swioltb_nr_tbl(void);
+extern unsigned long swiotlb_nr_tbl(void);
 
 /*
  * Enumeration for sync targets
diff --git a/lib/swiotlb.c b/lib/swiotlb.c
index 99093b3..058935e 100644
--- a/lib/swiotlb.c
+++ b/lib/swiotlb.c
@@ -110,11 +110,11 @@ setup_io_tlb_npages(char *str)
 __setup("swiotlb=", setup_io_tlb_npages);
 /* make io_tlb_overflow tunable too? */
 
-unsigned long swioltb_nr_tbl(void)
+unsigned long swiotlb_nr_tbl(void)
 {
 	return io_tlb_nslabs;
 }
-
+EXPORT_SYMBOL_GPL(swiotlb_nr_tbl);
 /* Note that this doesn't work with highmem page */
 static dma_addr_t swiotlb_virt_to_bus(struct device *hwdev,
 				      volatile void *address)
@@ -321,6 +321,7 @@ void __init swiotlb_free(void)
 		free_bootmem_late(__pa(io_tlb_start),
 				  PAGE_ALIGN(io_tlb_nslabs << IO_TLB_SHIFT));
 	}
+	io_tlb_nslabs = 0;
 }
 
 static int is_swiotlb_buffer(phys_addr_t paddr)
-- 
1.7.6.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 12:09:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 12:09:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJic-0006qI-Kj; Tue, 01 Nov 2011 12:09:54 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJbD-0005Yy-6Q
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 12:02:18 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320174098!44266069!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4911 invoked from network); 1 Nov 2011 19:01:40 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 19:01:40 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA1J29DX006235
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 1 Nov 2011 19:02:10 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA1J28a3008435
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 1 Nov 2011 19:02:09 GMT
Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA1J23cR015677; Tue, 1 Nov 2011 14:02:03 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 01 Nov 2011 12:02:03 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 654A882EDA; Tue,  1 Nov 2011 15:02:01 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, thellstrom@vmware.com, thomas@shipmail.org, 
	airlied@redhat.com, jglisse@redhat.com, bskeggs@redhat.com
Date: Tue,  1 Nov 2011 14:47:26 -0400
Message-Id: <1320173252-2812-6-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
References: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090207.4EB04232.014C,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 05/11] ttm: Get rid of temporary scaffolding
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

which was used in the "ttm: Wrap ttm_[put|get]_pages and
extract GFP_* and caching states from 'struct ttm_tt" patch.

Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 drivers/gpu/drm/ttm/ttm_page_alloc.c |   83 ++++++++++++++++-----------------
 1 files changed, 40 insertions(+), 43 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
index c30d62b..24c0340 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
@@ -660,9 +660,48 @@ out:
 	return count;
 }
 
+/* Put all pages in pages list to correct pool to wait for reuse */
 static void __ttm_put_pages(struct list_head *pages, unsigned page_count,
 			    int flags, enum ttm_caching_state cstate,
-			    dma_addr_t *dma_address);
+			    dma_addr_t *dma_address)
+{
+	unsigned long irq_flags;
+	struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
+	struct page *p, *tmp;
+
+	if (pool == NULL) {
+		/* No pool for this memory type so free the pages */
+
+		list_for_each_entry_safe(p, tmp, pages, lru) {
+			__free_page(p);
+		}
+		/* Make the pages list empty */
+		INIT_LIST_HEAD(pages);
+		return;
+	}
+	if (page_count == 0) {
+		list_for_each_entry_safe(p, tmp, pages, lru) {
+			++page_count;
+		}
+	}
+
+	spin_lock_irqsave(&pool->lock, irq_flags);
+	list_splice_init(pages, &pool->list);
+	pool->npages += page_count;
+	/* Check that we don't go over the pool limit */
+	page_count = 0;
+	if (pool->npages > _manager->options.max_size) {
+		page_count = pool->npages - _manager->options.max_size;
+		/* free at least NUM_PAGES_TO_ALLOC number of pages
+		 * to reduce calls to set_memory_wb */
+		if (page_count < NUM_PAGES_TO_ALLOC)
+			page_count = NUM_PAGES_TO_ALLOC;
+	}
+	spin_unlock_irqrestore(&pool->lock, irq_flags);
+	if (page_count)
+		ttm_page_pool_free(pool, page_count);
+}
+
 /*
  * On success pages list will hold count number of correctly
  * cached pages.
@@ -736,48 +775,6 @@ static int __ttm_get_pages(struct list_head *pages, int flags,
 	return 0;
 }
 
-/* Put all pages in pages list to correct pool to wait for reuse */
-static void __ttm_put_pages(struct list_head *pages, unsigned page_count,
-			    int flags, enum ttm_caching_state cstate,
-			    dma_addr_t *dma_address)
-{
-	unsigned long irq_flags;
-	struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
-	struct page *p, *tmp;
-
-	if (pool == NULL) {
-		/* No pool for this memory type so free the pages */
-
-		list_for_each_entry_safe(p, tmp, pages, lru) {
-			__free_page(p);
-		}
-		/* Make the pages list empty */
-		INIT_LIST_HEAD(pages);
-		return;
-	}
-	if (page_count == 0) {
-		list_for_each_entry_safe(p, tmp, pages, lru) {
-			++page_count;
-		}
-	}
-
-	spin_lock_irqsave(&pool->lock, irq_flags);
-	list_splice_init(pages, &pool->list);
-	pool->npages += page_count;
-	/* Check that we don't go over the pool limit */
-	page_count = 0;
-	if (pool->npages > _manager->options.max_size) {
-		page_count = pool->npages - _manager->options.max_size;
-		/* free at least NUM_PAGES_TO_ALLOC number of pages
-		 * to reduce calls to set_memory_wb */
-		if (page_count < NUM_PAGES_TO_ALLOC)
-			page_count = NUM_PAGES_TO_ALLOC;
-	}
-	spin_unlock_irqrestore(&pool->lock, irq_flags);
-	if (page_count)
-		ttm_page_pool_free(pool, page_count);
-}
-
 static void ttm_page_pool_init_locked(struct ttm_page_pool *pool, int flags,
 		char *name)
 {
-- 
1.7.6.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 12:11:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 12:11:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJkP-0007EC-RQ; Tue, 01 Nov 2011 12:11:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJbD-0005Z5-Qw
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 12:02:18 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1320174131!538219!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24125 invoked from network); 1 Nov 2011 19:02:12 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-13.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 19:02:12 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA1J29BM006232
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 1 Nov 2011 19:02:10 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA1J28Db001291
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 1 Nov 2011 19:02:08 GMT
Received: from abhmt105.oracle.com (abhmt105.oracle.com [141.146.116.57])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA1J22PF004712; Tue, 1 Nov 2011 14:02:02 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 01 Nov 2011 12:02:02 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 5166A82D0D; Tue,  1 Nov 2011 15:02:01 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, thellstrom@vmware.com, thomas@shipmail.org, 
	airlied@redhat.com, jglisse@redhat.com, bskeggs@redhat.com
Date: Tue,  1 Nov 2011 14:47:24 -0400
Message-Id: <1320173252-2812-4-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
References: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090205.4EB04232.010F,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 03/11] ttm/radeon/nouveau: Check the DMA address
	from TTM against known value.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

. instead of checking against the DMA_ERROR_CODE value which is
per-platform specific. The zero value is a known invalid value
that the TTM layer sets on the dma_address array if it is not
used (ttm_tt_alloc_page_directory calls drm_calloc_large which
creates a page with GFP_ZERO).

We can't use pci_dma_mapping_error as that is IOMMU
specific (some check for a specific physical address, some
for ranges, some just do a check against zero).

Also update the comments in the header about the true state
of that parameter.

Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 drivers/gpu/drm/nouveau/nouveau_sgdma.c |    3 +--
 drivers/gpu/drm/radeon/radeon_gart.c    |    4 +---
 include/drm/ttm/ttm_page_alloc.h        |    4 ++--
 3 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
index 82fad91..9b570c3 100644
--- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c
+++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
@@ -42,8 +42,7 @@ nouveau_sgdma_populate(struct ttm_backend *be, unsigned long num_pages,
 
 	nvbe->nr_pages = 0;
 	while (num_pages--) {
-		/* this code path isn't called and is incorrect anyways */
-		if (0) { /*dma_addrs[nvbe->nr_pages] != DMA_ERROR_CODE)*/
+		if (dma_addrs[nvbe->nr_pages] != 0) {
 			nvbe->pages[nvbe->nr_pages] =
 					dma_addrs[nvbe->nr_pages];
 		 	nvbe->ttm_alloced[nvbe->nr_pages] = true;
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
index a533f52..068ba09 100644
--- a/drivers/gpu/drm/radeon/radeon_gart.c
+++ b/drivers/gpu/drm/radeon/radeon_gart.c
@@ -181,9 +181,7 @@ int radeon_gart_bind(struct radeon_device *rdev, unsigned offset,
 	p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE);
 
 	for (i = 0; i < pages; i++, p++) {
-		/* we reverted the patch using dma_addr in TTM for now but this
-		 * code stops building on alpha so just comment it out for now */
-		if (0) { /*dma_addr[i] != DMA_ERROR_CODE) */
+		if (dma_addr[i] != 0) {
 			rdev->gart.ttm_alloced[p] = true;
 			rdev->gart.pages_addr[p] = dma_addr[i];
 		} else {
diff --git a/include/drm/ttm/ttm_page_alloc.h b/include/drm/ttm/ttm_page_alloc.h
index 8062890..0017b17 100644
--- a/include/drm/ttm/ttm_page_alloc.h
+++ b/include/drm/ttm/ttm_page_alloc.h
@@ -36,7 +36,7 @@
  * @flags: ttm flags for page allocation.
  * @cstate: ttm caching state for the page.
  * @count: number of pages to allocate.
- * @dma_address: The DMA (bus) address of pages (if TTM_PAGE_FLAG_DMA32 set).
+ * @dma_address: The DMA (bus) address of pages - (by default zero).
  */
 int ttm_get_pages(struct list_head *pages,
 		  int flags,
@@ -51,7 +51,7 @@ int ttm_get_pages(struct list_head *pages,
  * count.
  * @flags: ttm flags for page allocation.
  * @cstate: ttm caching state.
- * @dma_address: The DMA (bus) address of pages (if TTM_PAGE_FLAG_DMA32 set).
+ * @dma_address: The DMA (bus) address of pages (by default zero).
  */
 void ttm_put_pages(struct list_head *pages,
 		   unsigned page_count,
-- 
1.7.6.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 12:13:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 12:13:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJm6-0007c9-RW; Tue, 01 Nov 2011 12:13:30 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJbD-0005Ys-0e
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 12:02:18 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1320174130!1564899!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3517 invoked from network); 1 Nov 2011 19:02:11 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-8.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 19:02:11 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA1J28Qk031812
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 1 Nov 2011 19:02:09 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA1J27Du001272
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 1 Nov 2011 19:02:08 GMT
Received: from abhmt112.oracle.com (abhmt112.oracle.com [141.146.116.64])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA1J22w3013519; Tue, 1 Nov 2011 14:02:02 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 01 Nov 2011 12:02:02 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 3388782CDE; Tue,  1 Nov 2011 15:02:01 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, thellstrom@vmware.com, thomas@shipmail.org, 
	airlied@redhat.com, jglisse@redhat.com, bskeggs@redhat.com
Date: Tue,  1 Nov 2011 14:47:21 -0400
Message-Id: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090208.4EB04231.02BA,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] TTM DMA pool v2.2 or [GIT PULL]
	(stable/ttm.dma_pool.v2.3) for 3.3
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

I am not sure what the right way to patches in Dave tree is for Linux 3.3, so I
am posting the patches and also providing the means of doing a git pull.

The git tree is:

git pull git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git stable/ttm.dma_pool.v2.3


Oh, and Thomas, should I add your Ack on the patches as well? I think it was an implied
Ack, but I do not want to presume. If so, I can respin this with your Ack shortly.

and it has since v2.1: https://lwn.net/Articles/463815/
 - Fixed bugs/mistakes pointed out by Jerome
 - Added Review-by: Jereme Glisse
Since v2.0: [not posted]
 - Redid the registration/override to be tightly integrated with the
   'struct ttm_backend_func' per Thomas's suggestion.
Since v1.9: [not posted]
 - Performance improvements - it was doing O(n^2) instead of O(n) on certain
   workloads.
Since v1.8: [lwn.net/Articles/458724/]
 - Removed swiotlb_enabled and used swiotlb_nr_tbl.
 - Added callback for changing cache types.
Since v1.7: [https://lkml.org/lkml/2011/8/30/460]
 - Fixed checking the DMA address in radeon/nouveau code.
Since v1: [http://lwn.net/Articles/456246/]
 - Ran it through the gauntlet of SubmitChecklist and fixed issues
 - Made radeon/nouveau driver set coherent_dma (which is required for dmapool)

[.. and this is what I said in v1 post]:

Way back in January this patchset:
http://lists.freedesktop.org/archives/dri-devel/2011-January/006905.html
was merged in, but pieces of it had to be reverted b/c they did not
work properly under PowerPC, ARM, and when swapping out pages to disk.

After a bit of discussion on the mailing list
http://marc.info/?i=4D769726.2030307@shipmail.org I started working on it, but
got waylaid by other things .. and finally I am able to post the RFC patches.

There was a lot of discussion about it and I am not sure if I captured
everybody's thoughts - if I did not - that is _not_ intentional - it has just
been quite some time..

Anyhow .. the patches explore what the "lib/dmapool.c" does - which is to have a
DMA pool that the device has associated with. I kind of married that code
along with drivers/gpu/drm/ttm/ttm_page_alloc.c to create a TTM DMA pool code.
The end result is DMA pool with extra features: can do write-combine, uncached,
writeback (and tracks them and sets back to WB when freed); tracks "cached"
pages that don't really need to be returned to a pool; and hooks up to
the shrinker code so that the pools can be shrunk.

If you guys think this set of patches make sense  - my future plans were
 1) Get this in large crowd of testing .. and if it works for a kernel release
 2) to move a bulk of this in the lib/dmapool.c (I spoke with Matthew Wilcox
    about it and he is OK as long as I don't introduce performance regressions).

In regards to testing, I've been running them non-stop for the last two months.
(and found some issues which I've fixed up) - and been quite happy with how
they work.

Michel (thanks!) took a spin of the patches on his PowerPC and they did not
cause any regressions (wheew).

The patches are also located in a git tree:

git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git stable/ttm.dma_pool.v2.3

Konrad Rzeszutek Wilk (11):
      swiotlb: Expose swiotlb_nr_tlb function to modules
      nouveau/radeon: Set coherent DMA mask
      ttm/radeon/nouveau: Check the DMA address from TTM against known value.
      ttm: Wrap ttm_[put|get]_pages and extract GFP_* and caching states from 'struct ttm_tt'
      ttm: Get rid of temporary scaffolding
      ttm/driver: Expand ttm_backend_func to include two overrides for TTM page pool.
      ttm: Do not set the ttm->be to NULL before calling the TTM page pool to free pages.
      ttm: Provide DMA aware TTM page pool code.
      ttm: Add 'no_dma' parameter to turn the TTM DMA pool off during runtime.
      nouveau/ttm/dma: Enable the TTM DMA pool if device can only do 32-bit DMA.
      radeon/ttm/dma: Enable the TTM DMA pool if the device can only do 32-bit.

 drivers/gpu/drm/nouveau/nouveau_debugfs.c |    1 +
 drivers/gpu/drm/nouveau/nouveau_mem.c     |    5 +
 drivers/gpu/drm/nouveau/nouveau_sgdma.c   |    8 +-
 drivers/gpu/drm/radeon/radeon_device.c    |    6 +
 drivers/gpu/drm/radeon/radeon_gart.c      |    4 +-
 drivers/gpu/drm/radeon/radeon_ttm.c       |   19 +-
 drivers/gpu/drm/ttm/Makefile              |    3 +
 drivers/gpu/drm/ttm/ttm_memory.c          |    5 +
 drivers/gpu/drm/ttm/ttm_page_alloc.c      |  108 ++-
 drivers/gpu/drm/ttm/ttm_page_alloc_dma.c  | 1409 +++++++++++++++++++++++++++++
 drivers/gpu/drm/ttm/ttm_tt.c              |   21 +-
 drivers/xen/swiotlb-xen.c                 |    2 +-
 include/drm/ttm/ttm_bo_driver.h           |   31 +
 include/drm/ttm/ttm_page_alloc.h          |   53 +-
 include/linux/swiotlb.h                   |    2 +-
 lib/swiotlb.c                             |    5 +-
 16 files changed, 1600 insertions(+), 82 deletions(-)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 12:14:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 12:14:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJnD-0007z8-DN; Tue, 01 Nov 2011 12:14:39 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJbD-0005Yz-F5
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 12:02:19 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1320174131!2553996!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12679 invoked from network); 1 Nov 2011 19:02:12 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-8.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 19:02:12 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA1J28ib006225
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 1 Nov 2011 19:02:09 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA1J27Gc001275
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 1 Nov 2011 19:02:08 GMT
Received: from abhmt107.oracle.com (abhmt107.oracle.com [141.146.116.59])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA1J22av015667; Tue, 1 Nov 2011 14:02:02 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 01 Nov 2011 12:02:02 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 5BC4982ED8; Tue,  1 Nov 2011 15:02:01 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, thellstrom@vmware.com, thomas@shipmail.org, 
	airlied@redhat.com, jglisse@redhat.com, bskeggs@redhat.com
Date: Tue,  1 Nov 2011 14:47:25 -0400
Message-Id: <1320173252-2812-5-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
References: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090206.4EB04232.008D,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 04/11] ttm: Wrap ttm_[put|get]_pages and extract
	GFP_* and caching states from 'struct ttm_tt'
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Instead of passing the 'int flags' and 'enum caching_state caching_state'
as parameters, pass in the 'struct ttm_tt' and let the ttm_[put|get]_pages
extract those parameters.

We also wrap the ttm_[put|get]_pages so that we can extract those two
parameters from the 'struct ttm_tt'. The reason for wrapping instead
of just changing the two functions declerations outright is to
support the next set of patches which will provide an
override mechanism for 'ttm_[put|get]_pages' functions.

Temporarily we put in a function declerations for the __ttm_put_pages,
which later on we will remove (by moving the __ttm_put_pages).

Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 drivers/gpu/drm/ttm/ttm_page_alloc.c |   29 +++++++++++++++++++++++------
 drivers/gpu/drm/ttm/ttm_tt.c         |    6 ++----
 include/drm/ttm/ttm_page_alloc.h     |   16 ++++++----------
 3 files changed, 31 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
index d948575..c30d62b 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
@@ -660,13 +660,16 @@ out:
 	return count;
 }
 
+static void __ttm_put_pages(struct list_head *pages, unsigned page_count,
+			    int flags, enum ttm_caching_state cstate,
+			    dma_addr_t *dma_address);
 /*
  * On success pages list will hold count number of correctly
  * cached pages.
  */
-int ttm_get_pages(struct list_head *pages, int flags,
-		  enum ttm_caching_state cstate, unsigned count,
-		  dma_addr_t *dma_address)
+static int __ttm_get_pages(struct list_head *pages, int flags,
+			   enum ttm_caching_state cstate, unsigned count,
+			   dma_addr_t *dma_address)
 {
 	struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
 	struct page *p = NULL;
@@ -724,7 +727,7 @@ int ttm_get_pages(struct list_head *pages, int flags,
 			printk(KERN_ERR TTM_PFX
 			       "Failed to allocate extra pages "
 			       "for large request.");
-			ttm_put_pages(pages, 0, flags, cstate, NULL);
+			__ttm_put_pages(pages, 0, flags, cstate, NULL);
 			return r;
 		}
 	}
@@ -734,8 +737,9 @@ int ttm_get_pages(struct list_head *pages, int flags,
 }
 
 /* Put all pages in pages list to correct pool to wait for reuse */
-void ttm_put_pages(struct list_head *pages, unsigned page_count, int flags,
-		   enum ttm_caching_state cstate, dma_addr_t *dma_address)
+static void __ttm_put_pages(struct list_head *pages, unsigned page_count,
+			    int flags, enum ttm_caching_state cstate,
+			    dma_addr_t *dma_address)
 {
 	unsigned long irq_flags;
 	struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
@@ -857,3 +861,16 @@ int ttm_page_alloc_debugfs(struct seq_file *m, void *data)
 	return 0;
 }
 EXPORT_SYMBOL(ttm_page_alloc_debugfs);
+int ttm_get_pages(struct ttm_tt *ttm, struct list_head *pages,
+		  unsigned count, dma_addr_t *dma_address)
+{
+	return __ttm_get_pages(pages, ttm->page_flags, ttm->caching_state,
+				count, dma_address);
+}
+{
+void ttm_put_pages(struct ttm_tt *ttm, struct list_head *pages,
+		   unsigned page_count, dma_addr_t *dma_address)
+{
+	__ttm_put_pages(pages, page_count, ttm->page_flags, ttm->caching_state,
+			dma_address);
+}
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
index 58c271e..76c982f 100644
--- a/drivers/gpu/drm/ttm/ttm_tt.c
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
@@ -110,8 +110,7 @@ static struct page *__ttm_tt_get_page(struct ttm_tt *ttm, int index)
 
 		INIT_LIST_HEAD(&h);
 
-		ret = ttm_get_pages(&h, ttm->page_flags, ttm->caching_state, 1,
-				    &ttm->dma_address[index]);
+		ret = ttm_get_pages(ttm, &h, 1, &ttm->dma_address[index]);
 
 		if (ret != 0)
 			return NULL;
@@ -304,8 +303,7 @@ static void ttm_tt_free_alloced_pages(struct ttm_tt *ttm)
 			count++;
 		}
 	}
-	ttm_put_pages(&h, count, ttm->page_flags, ttm->caching_state,
-		      ttm->dma_address);
+	ttm_put_pages(ttm, &h, count, ttm->dma_address);
 	ttm->state = tt_unpopulated;
 	ttm->first_himem_page = ttm->num_pages;
 	ttm->last_lomem_page = -1;
diff --git a/include/drm/ttm/ttm_page_alloc.h b/include/drm/ttm/ttm_page_alloc.h
index 0017b17..0aaac39 100644
--- a/include/drm/ttm/ttm_page_alloc.h
+++ b/include/drm/ttm/ttm_page_alloc.h
@@ -32,31 +32,27 @@
 /**
  * Get count number of pages from pool to pages list.
  *
+ * @ttm: ttm which contains flags for page allocation and caching state.
  * @pages: heado of empty linked list where pages are filled.
- * @flags: ttm flags for page allocation.
- * @cstate: ttm caching state for the page.
  * @count: number of pages to allocate.
  * @dma_address: The DMA (bus) address of pages - (by default zero).
  */
-int ttm_get_pages(struct list_head *pages,
-		  int flags,
-		  enum ttm_caching_state cstate,
+int ttm_get_pages(struct ttm_tt *ttm,
+		  struct list_head *pages,
 		  unsigned count,
 		  dma_addr_t *dma_address);
 /**
  * Put linked list of pages to pool.
  *
+ * @ttm: ttm which contains flags for page allocation and caching state.
  * @pages: list of pages to free.
  * @page_count: number of pages in the list. Zero can be passed for unknown
  * count.
- * @flags: ttm flags for page allocation.
- * @cstate: ttm caching state.
  * @dma_address: The DMA (bus) address of pages (by default zero).
  */
-void ttm_put_pages(struct list_head *pages,
+void ttm_put_pages(struct ttm_tt *ttm,
+		   struct list_head *pages,
 		   unsigned page_count,
-		   int flags,
-		   enum ttm_caching_state cstate,
 		   dma_addr_t *dma_address);
 /**
  * Initialize pool allocator.
-- 
1.7.6.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 12:15:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 12:15:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJoF-0008MB-Sr; Tue, 01 Nov 2011 12:15:43 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJbE-0005ZI-8X
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 12:02:19 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1320174131!1915692!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31424 invoked from network); 1 Nov 2011 19:02:13 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-3.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 19:02:13 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA1J290J031856
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 1 Nov 2011 19:02:10 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA1J28kG003737
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 1 Nov 2011 19:02:09 GMT
Received: from abhmt104.oracle.com (abhmt104.oracle.com [141.146.116.56])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA1J23nh015680; Tue, 1 Nov 2011 14:02:03 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 01 Nov 2011 12:02:03 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 983C082EDF; Tue,  1 Nov 2011 15:02:01 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, thellstrom@vmware.com, thomas@shipmail.org, 
	airlied@redhat.com, jglisse@redhat.com, bskeggs@redhat.com
Date: Tue,  1 Nov 2011 14:47:31 -0400
Message-Id: <1320173252-2812-11-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
References: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090208.4EB04233.0049,ss=1,re=0.000,fgs=0
Cc: Francisco Jerez <currojerez@riseup.net>, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 10/11] nouveau/ttm/dma: Enable the TTM DMA pool
	if device can only do 32-bit DMA.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

If the card is capable of more than 32-bit, then use the default
TTM page pool code which allocates from anywhere in the memory.

Note: If the 'ttm.no_dma' parameter is set, the override is ignored
and the default TTM pool is used.

CC: Ben Skeggs <bskeggs@redhat.com>
CC: Francisco Jerez <currojerez@riseup.net>
CC: Dave Airlie <airlied@redhat.com>
Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 drivers/gpu/drm/nouveau/nouveau_debugfs.c |    1 +
 drivers/gpu/drm/nouveau/nouveau_sgdma.c   |    5 +++++
 2 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_debugfs.c b/drivers/gpu/drm/nouveau/nouveau_debugfs.c
index 8e15923..f52c2db 100644
--- a/drivers/gpu/drm/nouveau/nouveau_debugfs.c
+++ b/drivers/gpu/drm/nouveau/nouveau_debugfs.c
@@ -178,6 +178,7 @@ static struct drm_info_list nouveau_debugfs_list[] = {
 	{ "memory", nouveau_debugfs_memory_info, 0, NULL },
 	{ "vbios.rom", nouveau_debugfs_vbios_image, 0, NULL },
 	{ "ttm_page_pool", ttm_page_alloc_debugfs, 0, NULL },
+	{ "ttm_dma_page_pool", ttm_dma_page_alloc_debugfs, 0, NULL },
 };
 #define NOUVEAU_DEBUGFS_ENTRIES ARRAY_SIZE(nouveau_debugfs_list)
 
diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
index 9b570c3..e0d4474 100644
--- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c
+++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
@@ -2,6 +2,7 @@
 #include "nouveau_drv.h"
 #include <linux/pagemap.h>
 #include <linux/slab.h>
+#include <ttm/ttm_page_alloc.h>
 
 #define NV_CTXDMA_PAGE_SHIFT 12
 #define NV_CTXDMA_PAGE_SIZE  (1 << NV_CTXDMA_PAGE_SHIFT)
@@ -417,6 +418,10 @@ nouveau_sgdma_init_ttm(struct drm_device *dev)
 	nvbe->dev = dev;
 
 	nvbe->backend.func = dev_priv->gart_info.func;
+	if ((dev->dev) && (dma_get_mask(dev->dev) <= DMA_BIT_MASK(32))) {
+		if (ttm_dma_override(nvbe->backend.func))
+			nvbe->backend.dev = dev->dev;
+	}
 	return &nvbe->backend;
 }
 
-- 
1.7.6.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 12:16:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 12:16:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJp4-0000Ho-2n; Tue, 01 Nov 2011 12:16:34 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJbE-0005ZE-7V
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 12:02:19 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1320174131!1914657!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29636 invoked from network); 1 Nov 2011 19:02:13 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-5.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 19:02:13 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA1J2ARF031865
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 1 Nov 2011 19:02:11 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA1J29k1010524
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 1 Nov 2011 19:02:09 GMT
Received: from abhmt113.oracle.com (abhmt113.oracle.com [141.146.116.65])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA1J23mZ004727; Tue, 1 Nov 2011 14:02:03 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 01 Nov 2011 12:02:03 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 8E73182EDE; Tue,  1 Nov 2011 15:02:01 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, thellstrom@vmware.com, thomas@shipmail.org, 
	airlied@redhat.com, jglisse@redhat.com, bskeggs@redhat.com
Date: Tue,  1 Nov 2011 14:47:30 -0400
Message-Id: <1320173252-2812-10-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
References: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090208.4EB04233.00C1,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 09/11] ttm: Add 'no_dma' parameter to turn the
	TTM DMA pool off during runtime.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

The TTM DMA only gets turned on when the SWIOTLB is enabled - but
we might also want to turn it off when SWIOTLB is on to
use the non-DMA TTM pool code.

In the future this parameter can be removed.

Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 drivers/gpu/drm/ttm/ttm_memory.c         |    7 +++++--
 drivers/gpu/drm/ttm/ttm_page_alloc_dma.c |    6 +++++-
 include/drm/ttm/ttm_page_alloc.h         |    2 ++
 3 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_memory.c b/drivers/gpu/drm/ttm/ttm_memory.c
index 6d24fe2..f883a28 100644
--- a/drivers/gpu/drm/ttm/ttm_memory.c
+++ b/drivers/gpu/drm/ttm/ttm_memory.c
@@ -395,7 +395,9 @@ int ttm_mem_global_init(struct ttm_mem_global *glob)
 		       zone->name, (unsigned long long) zone->max_mem >> 10);
 	}
 	ttm_page_alloc_init(glob, glob->zone_kernel->max_mem/(2*PAGE_SIZE));
-	ttm_dma_page_alloc_init(glob, glob->zone_kernel->max_mem/(2*PAGE_SIZE));
+	if (!ttm_dma_disable)
+		ttm_dma_page_alloc_init(glob, glob->zone_kernel->max_mem /
+					(2*PAGE_SIZE));
 	return 0;
 out_no_zone:
 	ttm_mem_global_release(glob);
@@ -411,7 +413,8 @@ void ttm_mem_global_release(struct ttm_mem_global *glob)
 	/* let the page allocator first stop the shrink work. */
 	ttm_page_alloc_fini();
 
-	ttm_dma_page_alloc_fini();
+	if (!ttm_dma_disable)
+		ttm_dma_page_alloc_fini();
 	flush_workqueue(glob->swap_queue);
 	destroy_workqueue(glob->swap_queue);
 	glob->swap_queue = NULL;
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
index 5a2d362..cfc8d9f 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
@@ -51,6 +51,10 @@
 #include <asm/agp.h>
 #endif
 
+int __read_mostly ttm_dma_disable;
+MODULE_PARM_DESC(no_dma, "Disable TTM DMA pool");
+module_param_named(no_dma, ttm_dma_disable, bool, S_IRUGO);
+
 #define NUM_PAGES_TO_ALLOC		(PAGE_SIZE/sizeof(struct page *))
 #define SMALL_ALLOCATION		16
 #define FREE_ALL_PAGES			(~0U)
@@ -1395,7 +1399,7 @@ int ttm_dma_page_alloc_debugfs(struct seq_file *m, void *data)
 EXPORT_SYMBOL_GPL(ttm_dma_page_alloc_debugfs);
 bool ttm_dma_override(struct ttm_backend_func *be)
 {
-	if (swiotlb_nr_tbl() && be) {
+	if (swiotlb_nr_tbl() && be && !ttm_dma_disable) {
 		be->get_pages = &ttm_dma_get_pages;
 		be->put_pages = &ttm_dma_put_pages;
 		return true;
diff --git a/include/drm/ttm/ttm_page_alloc.h b/include/drm/ttm/ttm_page_alloc.h
index 9c52fb7..daf5db6 100644
--- a/include/drm/ttm/ttm_page_alloc.h
+++ b/include/drm/ttm/ttm_page_alloc.h
@@ -32,6 +32,7 @@
 #ifdef CONFIG_SWIOTLB
 extern bool ttm_dma_override(struct ttm_backend_func *be);
 
+extern int ttm_dma_disable;
 /**
  * Initialize pool allocator.
  */
@@ -45,6 +46,7 @@ void ttm_dma_page_alloc_fini(void);
  */
 extern int ttm_dma_page_alloc_debugfs(struct seq_file *m, void *data);
 #else
+#define ttm_dma_disable (1)
 static inline bool ttm_dma_override(struct ttm_backend_func *be)
 {
 	return false;
-- 
1.7.6.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 12:17:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 12:17:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJpv-0000fS-Qa; Tue, 01 Nov 2011 12:17:27 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJbF-0005Zc-31
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 12:02:19 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1320174132!1913990!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6237 invoked from network); 1 Nov 2011 19:02:13 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-13.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 1 Nov 2011 19:02:13 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA1J2Af6031867
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 1 Nov 2011 19:02:11 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA1J29AA010528
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 1 Nov 2011 19:02:10 GMT
Received: from abhmt105.oracle.com (abhmt105.oracle.com [141.146.116.57])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA1J23ua004730; Tue, 1 Nov 2011 14:02:04 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 01 Nov 2011 12:02:03 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id A176C82EE0; Tue,  1 Nov 2011 15:02:01 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, thellstrom@vmware.com, thomas@shipmail.org, 
	airlied@redhat.com, jglisse@redhat.com, bskeggs@redhat.com
Date: Tue,  1 Nov 2011 14:47:32 -0400
Message-Id: <1320173252-2812-12-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
References: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090204.4EB04233.010C,ss=1,re=0.000,fgs=0
Cc: Alex Deucher <alexdeucher@gmail.com>, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 11/11] radeon/ttm/dma: Enable the TTM DMA pool
	if the device can only do 32-bit.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

. with the exception that we do not handle the AGP case. We only
deal with PCIe cards such as ATI ES1000 or HD3200 that have been
detected to only do DMA up to 32-bits.

Note: If the ttm.no_dma is set, this operation will not override
the TTM page pool to use the DMA one.

CC: Dave Airlie <airlied@redhat.com>
CC: Alex Deucher <alexdeucher@gmail.com>
Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 drivers/gpu/drm/radeon/radeon_ttm.c |   19 +++++++++++++++----
 1 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index 60125dd..2e7419f 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -761,6 +761,10 @@ struct ttm_backend *radeon_ttm_backend_create(struct radeon_device *rdev)
 	gtt->backend.bdev = &rdev->mman.bdev;
 	gtt->backend.flags = 0;
 	gtt->backend.func = &radeon_backend_func;
+	if (rdev->need_dma32) {
+		if (ttm_dma_override(gtt->backend.func))
+			gtt->backend.dev = rdev->dev;
+	}
 	gtt->rdev = rdev;
 	gtt->pages = NULL;
 	gtt->num_pages = 0;
@@ -792,8 +796,8 @@ static int radeon_mm_dump_table(struct seq_file *m, void *data)
 static int radeon_ttm_debugfs_init(struct radeon_device *rdev)
 {
 #if defined(CONFIG_DEBUG_FS)
-	static struct drm_info_list radeon_mem_types_list[RADEON_DEBUGFS_MEM_TYPES+1];
-	static char radeon_mem_types_names[RADEON_DEBUGFS_MEM_TYPES+1][32];
+	static struct drm_info_list radeon_mem_types_list[RADEON_DEBUGFS_MEM_TYPES+2];
+	static char radeon_mem_types_names[RADEON_DEBUGFS_MEM_TYPES+2][32];
 	unsigned i;
 
 	for (i = 0; i < RADEON_DEBUGFS_MEM_TYPES; i++) {
@@ -815,8 +819,15 @@ static int radeon_ttm_debugfs_init(struct radeon_device *rdev)
 	radeon_mem_types_list[i].name = radeon_mem_types_names[i];
 	radeon_mem_types_list[i].show = &ttm_page_alloc_debugfs;
 	radeon_mem_types_list[i].driver_features = 0;
-	radeon_mem_types_list[i].data = NULL;
-	return radeon_debugfs_add_files(rdev, radeon_mem_types_list, RADEON_DEBUGFS_MEM_TYPES+1);
+	radeon_mem_types_list[i++].data = NULL;
+	if (rdev->need_dma32) {
+		sprintf(radeon_mem_types_names[i], "ttm_dma_page_pool");
+		radeon_mem_types_list[i].name = radeon_mem_types_names[i];
+		radeon_mem_types_list[i].show = &ttm_dma_page_alloc_debugfs;
+		radeon_mem_types_list[i].driver_features = 0;
+		radeon_mem_types_list[i++].data = NULL;
+	}
+	return radeon_debugfs_add_files(rdev, radeon_mem_types_list, i);
 
 #endif
 	return 0;
-- 
1.7.6.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 12:18:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 12:18:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJqc-00012L-Vm; Tue, 01 Nov 2011 12:18:11 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJbE-0005ZD-5O
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 12:02:19 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320174097!61535293!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19593 invoked from network); 1 Nov 2011 19:01:38 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-2.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 19:01:38 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA1J2AOO031864
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 1 Nov 2011 19:02:11 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA1J29Wp003754
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 1 Nov 2011 19:02:09 GMT
Received: from abhmt112.oracle.com (abhmt112.oracle.com [141.146.116.64])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA1J23Sl004724; Tue, 1 Nov 2011 14:02:03 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 01 Nov 2011 12:02:03 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 793B482EDC; Tue,  1 Nov 2011 15:02:01 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, thellstrom@vmware.com, thomas@shipmail.org, 
	airlied@redhat.com, jglisse@redhat.com, bskeggs@redhat.com
Date: Tue,  1 Nov 2011 14:47:28 -0400
Message-Id: <1320173252-2812-8-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
References: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090201.4EB04233.00DA,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 07/11] ttm: Do not set the ttm->be to NULL
	before calling the TTM page pool to free pages.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

. as the ttm->be->func->[get|put]_pages can be called and they would
dereference on ttm->be which was set to NULL.

Instead of clearing it there, pass in a flag to thettm_tt_free_allocated_pages
whether to clear the pages or not (you are not suppose to clear the pages
when destroying them).

Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 drivers/gpu/drm/ttm/ttm_tt.c |   15 +++++++--------
 1 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
index 76c982f..31ae359 100644
--- a/drivers/gpu/drm/ttm/ttm_tt.c
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
@@ -276,7 +276,7 @@ int ttm_tt_set_placement_caching(struct ttm_tt *ttm, uint32_t placement)
 }
 EXPORT_SYMBOL(ttm_tt_set_placement_caching);
 
-static void ttm_tt_free_alloced_pages(struct ttm_tt *ttm)
+static void ttm_tt_free_alloced_pages(struct ttm_tt *ttm, bool call_clear)
 {
 	int i;
 	unsigned count = 0;
@@ -286,7 +286,7 @@ static void ttm_tt_free_alloced_pages(struct ttm_tt *ttm)
 
 	INIT_LIST_HEAD(&h);
 
-	if (be)
+	if (be && call_clear)
 		be->func->clear(be);
 	for (i = 0; i < ttm->num_pages; ++i) {
 
@@ -317,16 +317,14 @@ void ttm_tt_destroy(struct ttm_tt *ttm)
 		return;
 
 	be = ttm->be;
-	if (likely(be != NULL)) {
+	if (likely(be != NULL))
 		be->func->destroy(be);
-		ttm->be = NULL;
-	}
 
 	if (likely(ttm->pages != NULL)) {
 		if (ttm->page_flags & TTM_PAGE_FLAG_USER)
 			ttm_tt_free_user_pages(ttm);
 		else
-			ttm_tt_free_alloced_pages(ttm);
+			ttm_tt_free_alloced_pages(ttm, false);
 
 		ttm_tt_free_page_directory(ttm);
 	}
@@ -335,6 +333,7 @@ void ttm_tt_destroy(struct ttm_tt *ttm)
 	    ttm->swap_storage)
 		fput(ttm->swap_storage);
 
+	ttm->be = NULL;
 	kfree(ttm);
 }
 
@@ -509,7 +508,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
 
 	return 0;
 out_err:
-	ttm_tt_free_alloced_pages(ttm);
+	ttm_tt_free_alloced_pages(ttm, true);
 	return ret;
 }
 
@@ -573,7 +572,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistent_swap_storage)
 		page_cache_release(to_page);
 	}
 
-	ttm_tt_free_alloced_pages(ttm);
+	ttm_tt_free_alloced_pages(ttm, true);
 	ttm->swap_storage = swap_storage;
 	ttm->page_flags |= TTM_PAGE_FLAG_SWAPPED;
 	if (persistent_swap_storage)
-- 
1.7.6.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 12:19:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 12:19:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJrU-0001Pl-LS; Tue, 01 Nov 2011 12:19:04 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJbG-0005a0-Gv
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 12:02:19 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-16.tower-182.messagelabs.com!1320174134!1566603!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21068 invoked from network); 1 Nov 2011 19:02:15 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-16.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 1 Nov 2011 19:02:15 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA1J2CjO031924
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 1 Nov 2011 19:02:13 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA1J2BSA008576
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 1 Nov 2011 19:02:12 GMT
Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA1J231d013537; Tue, 1 Nov 2011 14:02:06 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 01 Nov 2011 12:02:03 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 6F3CF82EDB; Tue,  1 Nov 2011 15:02:01 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, thellstrom@vmware.com, thomas@shipmail.org, 
	airlied@redhat.com, jglisse@redhat.com, bskeggs@redhat.com
Date: Tue,  1 Nov 2011 14:47:27 -0400
Message-Id: <1320173252-2812-7-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
References: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090208.4EB04235.00C8,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 06/11] ttm/driver: Expand ttm_backend_func to
	include two overrides for TTM page pool.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

The two overrides will be choosen by the backends whether they
want to use a different TTM page pool than the default.

If the backend does not choose a new override, the default one
will be used.

Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 drivers/gpu/drm/ttm/ttm_page_alloc.c |   10 +++++++---
 include/drm/ttm/ttm_bo_driver.h      |   31 +++++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
index 24c0340..360afb3 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
@@ -861,13 +861,17 @@ EXPORT_SYMBOL(ttm_page_alloc_debugfs);
 int ttm_get_pages(struct ttm_tt *ttm, struct list_head *pages,
 		  unsigned count, dma_addr_t *dma_address)
 {
+	if (ttm->be && ttm->be->func && ttm->be->func->get_pages)
+		return ttm->be->func->get_pages(ttm, pages, count, dma_address);
 	return __ttm_get_pages(pages, ttm->page_flags, ttm->caching_state,
 				count, dma_address);
 }
-{
 void ttm_put_pages(struct ttm_tt *ttm, struct list_head *pages,
 		   unsigned page_count, dma_addr_t *dma_address)
 {
-	__ttm_put_pages(pages, page_count, ttm->page_flags, ttm->caching_state,
-			dma_address);
+	if (ttm->be && ttm->be->func && ttm->be->func->put_pages)
+		ttm->be->func->put_pages(ttm, pages, page_count, dma_address);
+	else
+		__ttm_put_pages(pages, page_count, ttm->page_flags,
+				ttm->caching_state, dma_address);
 }
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
index 09af2d7..1826c3b 100644
--- a/include/drm/ttm/ttm_bo_driver.h
+++ b/include/drm/ttm/ttm_bo_driver.h
@@ -100,6 +100,34 @@ struct ttm_backend_func {
 	 * Destroy the backend.
 	 */
 	void (*destroy) (struct ttm_backend *backend);
+
+	/**
+	 * ttm_get_pages override. The backend can override the default
+	 * TTM page pool code with a different one.
+	 *
+	 * Get count number of pages from pool to pages list.
+	 *
+	 * @ttm: ttm which contains flags for page allocation and caching state.
+	 * @pages: head of empty linked list where pages are filled.
+	 * @dma_address: The DMA (bus) address of pages
+	 */
+	int (*get_pages) (struct ttm_tt *ttm, struct list_head *pages,
+			  unsigned count, dma_addr_t *dma_address);
+
+	/**
+	 * ttm_put_pages override. The backend can override the default
+	 * TTM page pool code with a different implementation.
+	 *
+	 * Put linked list of pages to pool.
+	 *
+	 * @ttm: ttm which contains flags for page allocation and caching state.
+	 * @pages: list of pages to free.
+	 * @page_count: number of pages in the list. Zero can be passed for
+	 * unknown count.
+	 * @dma_address: The DMA (bus) address of pages
+	 */
+	void (*put_pages) (struct ttm_tt *ttm, struct list_head *pages,
+			   unsigned page_count, dma_addr_t *dma_address);
 };
 
 /**
@@ -109,6 +137,8 @@ struct ttm_backend_func {
  * @flags: For driver use.
  * @func: Pointer to a struct ttm_backend_func that describes
  * the backend methods.
+ * @dev: Pointer to a struct device which can be used by the TTM
+ *  [get|put)_pages overrides in 'struct ttm_backend_func'.
  *
  */
 
@@ -116,6 +146,7 @@ struct ttm_backend {
 	struct ttm_bo_device *bdev;
 	uint32_t flags;
 	struct ttm_backend_func *func;
+	struct device *dev;
 };
 
 #define TTM_PAGE_FLAG_USER            (1 << 1)
-- 
1.7.6.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 12:19:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 12:19:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJsJ-0001mY-RE; Tue, 01 Nov 2011 12:19:55 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJbF-0005Zd-30
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 12:02:20 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1320174110!42935053!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26346 invoked from network); 1 Nov 2011 19:01:52 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-12.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 19:01:52 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA1J2AWk031875
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 1 Nov 2011 19:02:11 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA1J29Sh001338
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 1 Nov 2011 19:02:10 GMT
Received: from abhmt111.oracle.com (abhmt111.oracle.com [141.146.116.63])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA1J243f004731; Tue, 1 Nov 2011 14:02:04 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 01 Nov 2011 12:02:03 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 843FA82EDD; Tue,  1 Nov 2011 15:02:01 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, thellstrom@vmware.com, thomas@shipmail.org, 
	airlied@redhat.com, jglisse@redhat.com, bskeggs@redhat.com
Date: Tue,  1 Nov 2011 14:47:29 -0400
Message-Id: <1320173252-2812-9-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
References: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090208.4EB04234.001E,ss=1,re=-2.601,fgs=0
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 08/11] ttm: Provide DMA aware TTM page pool code.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

In TTM world the pages for the graphic drivers are kept in three differen=
t
pools: write combined, uncached, and cached (write-back). When the pages
are used by the graphic driver the graphic adapter via its built in MMU
(or AGP) programs these pages in. The programming requires the virtual ad=
dress
(from the graphic adapter perspective) and the physical address (either S=
ystem RAM
or the memory on the card) which is obtained using the pci_map_* calls (w=
hich does the
virtual to physical - or bus address translation). During the graphic app=
lication's
"life" those pages can be shuffled around, swapped out to disk, moved fro=
m the
VRAM to System RAM or vice-versa. This all works with the existing TTM po=
ol code
- except when we want to use the software IOTLB (SWIOTLB) code to "map" t=
he physical
addresses to the graphic adapter MMU. We end up programming the bounce bu=
ffer's
physical address instead of the TTM pool memory's and get a non-worky dri=
ver.
There are two solutions:
1) using the DMA API to allocate pages that are screened by the DMA API, =
or
2) using the pci_sync_* calls to copy the pages from the bounce-buffer an=
d back.

This patch fixes the issue by allocating pages using the DMA API. The sec=
ond
is a viable option - but it has performance drawbacks and potential corre=
ctness
issues - think of the write cache page being bounced (SWIOTLB->TTM), the
WC is set on the TTM page and the copy from SWIOTLB not making it to the =
TTM
page until the page has been recycled in the pool (and used by another ap=
plication).

The bounce buffer does not get activated often - only in cases where we h=
ave
a 32-bit capable card and we want to use a page that is allocated above t=
he
4GB limit. The bounce buffer offers the solution of copying the contents
of that 4GB page to an location below 4GB and then back when the operatio=
n has been
completed (or vice-versa). This is done by using the 'pci_sync_*' calls.
Note: If you look carefully enough in the existing TTM page pool code you=
 will
notice the GFP_DMA32 flag is used  - which should guarantee that the prov=
ided page
is under 4GB. It certainly is the case, except this gets ignored in two c=
ases:
 - If user specifies 'swiotlb=3Dforce' which bounces _every_ page.
 - If user is using a Xen's PV Linux guest (which uses the SWIOTLB and th=
e
   underlaying PFN's aren't necessarily under 4GB).

To not have this extra copying done the other option is to allocate the p=
ages
using the DMA API so that there is not need to map the page and perform t=
he
expensive 'pci_sync_*' calls.

This DMA API capable TTM pool requires for this the 'struct device' to
properly call the DMA API. It also has to track the virtual and bus addre=
ss of
the page being handed out in case it ends up being swapped out or de-allo=
cated -
to make sure it is de-allocated using the proper's 'struct device'.

Implementation wise the code keeps two lists: one that is attached to the
'struct device' (via the dev->dma_pools list) and a global one to be used=
 when
the 'struct device' is unavailable (think shrinker code). The global list=
 can
iterate over all of the 'struct device' and its associated dma_pool. The =
list
in dev->dma_pools can only iterate the device's dma_pool.
                                                            /[struct devi=
ce_pool]\
        /---------------------------------------------------| dev        =
        |
       /                                            +-------| dma_pool   =
        |
 /-----+------\                                    /        \------------=
--------/
 |struct device|     /-->[struct dma_pool for WC]</         /[struct devi=
ce_pool]\
 | dma_pools   +----+                                     /-| dev        =
        |
 |  ...        |    \--->[struct dma_pool for uncached]<-/--| dma_pool   =
        |
 \-----+------/                                         /   \------------=
--------/
        \----------------------------------------------/
[Two pools associated with the device (WC and UC), and the parallel list
containing the 'struct dev' and 'struct dma_pool' entries]

The maximum amount of dma pools a device can have is six: write-combined,
uncached, and cached; then there are the DMA32 variants which are:
write-combined dma32, uncached dma32, and cached dma32.

Currently this code only gets activated when any variant of the SWIOTLB I=
OMMU
code is running (Intel without VT-d, AMD without GART, IBM Calgary and Xe=
n PV
with PCI devices).

Tested-by: Michel D=C3=A4nzer <michel@daenzer.net>
[v1: Using swiotlb_nr_tbl instead of swiotlb_enabled]
[v2: Major overhaul - added 'inuse_list' to seperate used from inuse and =
reorder
the order of lists to get better performance.]
[v3: Added comments/and some logic based on review, Added Jereme tag]
Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 drivers/gpu/drm/ttm/Makefile             |    3 +
 drivers/gpu/drm/ttm/ttm_memory.c         |    2 +
 drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 1405 ++++++++++++++++++++++++=
++++++
 include/drm/ttm/ttm_page_alloc.h         |   31 +
 4 files changed, 1441 insertions(+), 0 deletions(-)
 create mode 100644 drivers/gpu/drm/ttm/ttm_page_alloc_dma.c

diff --git a/drivers/gpu/drm/ttm/Makefile b/drivers/gpu/drm/ttm/Makefile
index f3cf6f0..8300bc0 100644
--- a/drivers/gpu/drm/ttm/Makefile
+++ b/drivers/gpu/drm/ttm/Makefile
@@ -7,4 +7,7 @@ ttm-y :=3D ttm_agp_backend.o ttm_memory.o ttm_tt.o ttm_bo=
.o \
 	ttm_object.o ttm_lock.o ttm_execbuf_util.o ttm_page_alloc.o \
 	ttm_bo_manager.o
=20
+ifeq ($(CONFIG_SWIOTLB),y)
+ttm-y +=3D ttm_page_alloc_dma.o
+endif
 obj-$(CONFIG_DRM_TTM) +=3D ttm.o
diff --git a/drivers/gpu/drm/ttm/ttm_memory.c b/drivers/gpu/drm/ttm/ttm_m=
emory.c
index e70ddd8..6d24fe2 100644
--- a/drivers/gpu/drm/ttm/ttm_memory.c
+++ b/drivers/gpu/drm/ttm/ttm_memory.c
@@ -395,6 +395,7 @@ int ttm_mem_global_init(struct ttm_mem_global *glob)
 		       zone->name, (unsigned long long) zone->max_mem >> 10);
 	}
 	ttm_page_alloc_init(glob, glob->zone_kernel->max_mem/(2*PAGE_SIZE));
+	ttm_dma_page_alloc_init(glob, glob->zone_kernel->max_mem/(2*PAGE_SIZE))=
;
 	return 0;
 out_no_zone:
 	ttm_mem_global_release(glob);
@@ -410,6 +411,7 @@ void ttm_mem_global_release(struct ttm_mem_global *gl=
ob)
 	/* let the page allocator first stop the shrink work. */
 	ttm_page_alloc_fini();
=20
+	ttm_dma_page_alloc_fini();
 	flush_workqueue(glob->swap_queue);
 	destroy_workqueue(glob->swap_queue);
 	glob->swap_queue =3D NULL;
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/t=
tm/ttm_page_alloc_dma.c
new file mode 100644
index 0000000..5a2d362
--- /dev/null
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
@@ -0,0 +1,1405 @@
+/*
+ * Copyright 2011 (c) Oracle Corp.
+
+ * Permission is hereby granted, free of charge, to any person obtaining=
 a
+ * copy of this software and associated documentation files (the "Softwa=
re"),
+ * to deal in the Software without restriction, including without limita=
tion
+ * the rights to use, copy, modify, merge, publish, distribute, sub lice=
nse,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portio=
ns
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRE=
SS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILI=
TY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SH=
ALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR =
OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISI=
NG
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+ */
+
+/*
+ * A simple DMA pool losely based on dmapool.c. It has certain advantage=
s
+ * over the DMA pools:
+ * - Pool collects resently freed pages for reuse (and hooks up to
+ *   the shrinker).
+ * - Tracks currently in use pages
+ * - Tracks whether the page is UC, WB or cached (and reverts to WB
+ *   when freed).
+ */
+
+#include <linux/dma-mapping.h>
+#include <linux/list.h>
+#include <linux/seq_file.h> /* for seq_printf */
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/highmem.h>
+#include <linux/mm_types.h>
+#include <linux/module.h>
+#include <linux/mm.h>
+#include <linux/atomic.h>
+#include <linux/device.h>
+#include <linux/kthread.h>
+#include "ttm/ttm_bo_driver.h"
+#include "ttm/ttm_page_alloc.h"
+#ifdef TTM_HAS_AGP
+#include <asm/agp.h>
+#endif
+
+#define NUM_PAGES_TO_ALLOC		(PAGE_SIZE/sizeof(struct page *))
+#define SMALL_ALLOCATION		16
+#define FREE_ALL_PAGES			(~0U)
+/* times are in msecs */
+#define IS_UNDEFINED			(0)
+#define IS_WC				(1<<1)
+#define IS_UC				(1<<2)
+#define IS_CACHED			(1<<3)
+#define IS_DMA32			(1<<4)
+
+enum pool_type {
+	POOL_IS_UNDEFINED,
+	POOL_IS_WC =3D IS_WC,
+	POOL_IS_UC =3D IS_UC,
+	POOL_IS_CACHED =3D IS_CACHED,
+	POOL_IS_WC_DMA32 =3D IS_WC | IS_DMA32,
+	POOL_IS_UC_DMA32 =3D IS_UC | IS_DMA32,
+	POOL_IS_CACHED_DMA32 =3D IS_CACHED | IS_DMA32,
+};
+/*
+ * The pool structure. There are usually six pools:
+ *  - generic (not restricted to DMA32):
+ *      - write combined, uncached, cached.
+ *  - dma32 (up to 2^32 - so up 4GB):
+ *      - write combined, uncached, cached.
+ * for each 'struct device'. The 'cached' is for pages that are actively=
 used.
+ * The other ones can be shrunk by the shrinker API if neccessary.
+ * @pools: The 'struct device->dma_pools' link.
+ * @type: Type of the pool
+ * @lock: Protects the inuse_list and free_list from concurrnet access. =
Must be
+ * used with irqsave/irqrestore variants because pool allocator maybe ca=
lled
+ * from delayed work.
+ * @inuse_list: Pool of pages that are in use. The order is very importa=
nt and
+ *   it is in the order that the TTM pages that are put back are in.
+ * @free_list: Pool of pages that are free to be used. No order requirem=
ents.
+ * @dev: The device that is associated with these pools.
+ * @size: Size used during DMA allocation.
+ * @npages_free: Count of available pages for re-use.
+ * @npages_in_use: Count of pages that are in use (each of them
+ *   is marked in_use.
+ * @nfrees: Stats when pool is shrinking.
+ * @nrefills: Stats when the pool is grown.
+ * @gfp_flags: Flags to pass for alloc_page.
+ * @fill_lock: Allows only one pool fill operation at time.
+ * @name: Name of the pool.
+ * @dev_name: Name derieved from dev - similar to how dev_info works.
+ *   Used during shutdown as the dev_info during release is unavailable.
+ */
+struct dma_pool {
+	struct list_head pools; /* The 'struct device->dma_pools link */
+	enum pool_type type;
+	spinlock_t lock;
+	struct list_head inuse_list;
+	struct list_head free_list;
+	struct device *dev;
+	unsigned size;
+	unsigned npages_free;
+	unsigned npages_in_use;
+	unsigned long nfrees; /* Stats when shrunk. */
+	unsigned long nrefills; /* Stats when grown. */
+	gfp_t gfp_flags;
+	bool fill_lock;
+	char name[13]; /* "cached dma32" */
+	char dev_name[64]; /* Constructed from dev */
+};
+
+/*
+ * The accounting page keeping track of the allocated page along with
+ * the DMA address.
+ * @page_list: The link to the 'page_list' in 'struct dma_pool'.
+ * @vaddr: The virtual address of the page
+ * @dma: The bus address of the page. If the page is not allocated
+ *   via the DMA API, it will be -1.
+ * @in_use: Set to true if in use. Should not be freed.
+ */
+struct dma_page {
+	struct list_head page_list;
+	void *vaddr;
+	struct page *p;
+	dma_addr_t dma;
+};
+
+/*
+ * Limits for the pool. They are handled without locks because only plac=
e where
+ * they may change is in sysfs store. They won't have immediate effect a=
nyway
+ * so forcing serialization to access them is pointless.
+ */
+
+struct ttm_pool_opts {
+	unsigned	alloc_size;
+	unsigned	max_size;
+	unsigned	small;
+};
+
+/*
+ * Contains the list of all of the 'struct device' and their correspondi=
ng
+ * DMA pools. Guarded by _mutex->lock.
+ * @pools: The link to 'struct ttm_pool_manager->pools'
+ * @dev: The 'struct device' associated with the 'pool'
+ * @pool: The 'struct dma_pool' associated with the 'dev'
+ */
+struct device_pools {
+	struct list_head pools;
+	struct device *dev;
+	struct dma_pool *pool;
+};
+
+/*
+ * struct ttm_pool_manager - Holds memory pools for fast allocation
+ *
+ * @lock: Lock used when adding/removing from pools
+ * @pools: List of 'struct device' and 'struct dma_pool' tuples.
+ * @options: Limits for the pool.
+ * @npools: Total amount of pools in existence.
+ * @shrinker: The structure used by [un|]register_shrinker
+ */
+struct ttm_pool_manager {
+	struct mutex		lock;
+	struct list_head	pools;
+	struct ttm_pool_opts	options;
+	unsigned		npools;
+	struct shrinker		mm_shrink;
+	struct kobject		kobj;
+};
+
+static struct ttm_pool_manager *_manager;
+
+static struct attribute ttm_page_pool_max =3D {
+	.name =3D "pool_max_size",
+	.mode =3D S_IRUGO | S_IWUSR
+};
+static struct attribute ttm_page_pool_small =3D {
+	.name =3D "pool_small_allocation",
+	.mode =3D S_IRUGO | S_IWUSR
+};
+static struct attribute ttm_page_pool_alloc_size =3D {
+	.name =3D "pool_allocation_size",
+	.mode =3D S_IRUGO | S_IWUSR
+};
+
+static struct attribute *ttm_pool_attrs[] =3D {
+	&ttm_page_pool_max,
+	&ttm_page_pool_small,
+	&ttm_page_pool_alloc_size,
+	NULL
+};
+
+static void ttm_pool_kobj_release(struct kobject *kobj)
+{
+	struct ttm_pool_manager *m =3D
+		container_of(kobj, struct ttm_pool_manager, kobj);
+	kfree(m);
+}
+
+static ssize_t ttm_pool_store(struct kobject *kobj, struct attribute *at=
tr,
+			      const char *buffer, size_t size)
+{
+	struct ttm_pool_manager *m =3D
+		container_of(kobj, struct ttm_pool_manager, kobj);
+	int chars;
+	unsigned val;
+	chars =3D sscanf(buffer, "%u", &val);
+	if (chars =3D=3D 0)
+		return size;
+
+	/* Convert kb to number of pages */
+	val =3D val / (PAGE_SIZE >> 10);
+
+	if (attr =3D=3D &ttm_page_pool_max)
+		m->options.max_size =3D val;
+	else if (attr =3D=3D &ttm_page_pool_small)
+		m->options.small =3D val;
+	else if (attr =3D=3D &ttm_page_pool_alloc_size) {
+		if (val > NUM_PAGES_TO_ALLOC*8) {
+			printk(KERN_ERR TTM_PFX
+			       "Setting allocation size to %lu "
+			       "is not allowed. Recommended size is "
+			       "%lu\n",
+			       NUM_PAGES_TO_ALLOC*(PAGE_SIZE >> 7),
+			       NUM_PAGES_TO_ALLOC*(PAGE_SIZE >> 10));
+			return size;
+		} else if (val > NUM_PAGES_TO_ALLOC) {
+			printk(KERN_WARNING TTM_PFX
+			       "Setting allocation size to "
+			       "larger than %lu is not recommended.\n",
+			       NUM_PAGES_TO_ALLOC*(PAGE_SIZE >> 10));
+		}
+		m->options.alloc_size =3D val;
+	}
+
+	return size;
+}
+
+static ssize_t ttm_pool_show(struct kobject *kobj, struct attribute *att=
r,
+			     char *buffer)
+{
+	struct ttm_pool_manager *m =3D
+		container_of(kobj, struct ttm_pool_manager, kobj);
+	unsigned val =3D 0;
+
+	if (attr =3D=3D &ttm_page_pool_max)
+		val =3D m->options.max_size;
+	else if (attr =3D=3D &ttm_page_pool_small)
+		val =3D m->options.small;
+	else if (attr =3D=3D &ttm_page_pool_alloc_size)
+		val =3D m->options.alloc_size;
+
+	val =3D val * (PAGE_SIZE >> 10);
+
+	return snprintf(buffer, PAGE_SIZE, "%u\n", val);
+}
+
+static const struct sysfs_ops ttm_pool_sysfs_ops =3D {
+	.show =3D &ttm_pool_show,
+	.store =3D &ttm_pool_store,
+};
+
+static struct kobj_type ttm_pool_kobj_type =3D {
+	.release =3D &ttm_pool_kobj_release,
+	.sysfs_ops =3D &ttm_pool_sysfs_ops,
+	.default_attrs =3D ttm_pool_attrs,
+};
+
+#ifndef CONFIG_X86
+static int set_pages_array_wb(struct page **pages, int addrinarray)
+{
+#ifdef TTM_HAS_AGP
+	int i;
+
+	for (i =3D 0; i < addrinarray; i++)
+		unmap_page_from_agp(pages[i]);
+#endif
+	return 0;
+}
+
+static int set_pages_array_wc(struct page **pages, int addrinarray)
+{
+#ifdef TTM_HAS_AGP
+	int i;
+
+	for (i =3D 0; i < addrinarray; i++)
+		map_page_into_agp(pages[i]);
+#endif
+	return 0;
+}
+
+static int set_pages_array_uc(struct page **pages, int addrinarray)
+{
+#ifdef TTM_HAS_AGP
+	int i;
+
+	for (i =3D 0; i < addrinarray; i++)
+		map_page_into_agp(pages[i]);
+#endif
+	return 0;
+}
+#endif /* for !CONFIG_X86 */
+
+static int ttm_set_pages_caching(struct dma_pool *pool,
+				 struct page **pages, unsigned cpages)
+{
+	int r =3D 0;
+	/* Set page caching */
+	if (pool->type & IS_UC) {
+		r =3D set_pages_array_uc(pages, cpages);
+		if (r)
+			pr_err(TTM_PFX
+			       "%s: Failed to set %d pages to uc!\n",
+			       pool->dev_name, cpages);
+	}
+	if (pool->type & IS_WC) {
+		r =3D set_pages_array_wc(pages, cpages);
+		if (r)
+			pr_err(TTM_PFX
+			       "%s: Failed to set %d pages to wc!\n",
+			       pool->dev_name, cpages);
+	}
+	return r;
+}
+
+static void __ttm_dma_free_page(struct dma_pool *pool, struct dma_page *=
d_page)
+{
+	dma_addr_t dma =3D d_page->dma;
+	dma_free_coherent(pool->dev, pool->size, d_page->vaddr, dma);
+
+	kfree(d_page);
+	d_page =3D NULL;
+}
+static struct dma_page *__ttm_dma_alloc_page(struct dma_pool *pool)
+{
+	struct dma_page *d_page;
+
+	d_page =3D kmalloc(sizeof(struct dma_page), GFP_KERNEL);
+	if (!d_page)
+		return NULL;
+
+	d_page->vaddr =3D dma_alloc_coherent(pool->dev, pool->size,
+					   &d_page->dma,
+					   pool->gfp_flags);
+	if (d_page->vaddr)
+		d_page->p =3D virt_to_page(d_page->vaddr);
+	else {
+		kfree(d_page);
+		d_page =3D NULL;
+	}
+	return d_page;
+}
+static enum pool_type ttm_to_type(int flags, enum ttm_caching_state csta=
te)
+{
+	enum pool_type type =3D IS_UNDEFINED;
+
+	if (flags & TTM_PAGE_FLAG_DMA32)
+		type |=3D IS_DMA32;
+	if (cstate =3D=3D tt_cached)
+		type |=3D IS_CACHED;
+	else if (cstate =3D=3D tt_uncached)
+		type |=3D IS_UC;
+	else
+		type |=3D IS_WC;
+
+	return type;
+}
+static void ttm_pool_update_free_locked(struct dma_pool *pool,
+					unsigned freed_pages)
+{
+	pool->npages_free -=3D freed_pages;
+	pool->nfrees +=3D freed_pages;
+
+}
+/* set memory back to wb and free the pages. */
+static void ttm_dma_pages_put(struct dma_pool *pool, struct list_head *d=
_pages,
+			struct page *pages[], unsigned npages)
+{
+	struct dma_page *d_page, *tmp;
+
+	if (npages && set_pages_array_wb(pages, npages))
+		pr_err(TTM_PFX "%s: Failed to set %d pages to wb!\n",
+			pool->dev_name, npages);
+
+	if (npages > 1) {
+		pr_debug("%s: (%s:%d) Freeing %d pages at once (lockless).\n",
+			pool->dev_name, pool->name, current->pid, npages);
+	}
+
+	list_for_each_entry_safe(d_page, tmp, d_pages, page_list) {
+		list_del(&d_page->page_list);
+		__ttm_dma_free_page(pool, d_page);
+	}
+}
+/*
+ * Free pages from pool.
+ *
+ * To prevent hogging the ttm_swap process we only free NUM_PAGES_TO_ALL=
OC
+ * number of pages in one go.
+ *
+ * @pool: to free the pages from
+ * @nr_free: If set to true will free all pages in pool
+ **/
+static unsigned ttm_dma_page_pool_free(struct dma_pool *pool, unsigned n=
r_free)
+{
+	unsigned long irq_flags;
+	struct dma_page *dma_p, *tmp;
+	struct page **pages_to_free;
+	struct list_head d_pages;
+	unsigned freed_pages =3D 0,
+		 npages_to_free =3D nr_free;
+
+	if (NUM_PAGES_TO_ALLOC < nr_free)
+		npages_to_free =3D NUM_PAGES_TO_ALLOC;
+#if 0
+	if (nr_free > 1) {
+		pr_debug("%s: (%s:%d) Attempting to free %d (%d) pages\n",
+			pool->dev_name, pool->name, current->pid,
+			npages_to_free, nr_free);
+	}
+#endif
+	pages_to_free =3D kmalloc(npages_to_free * sizeof(struct page *),
+			GFP_KERNEL);
+
+	if (!pages_to_free) {
+		pr_err(TTM_PFX
+		       "%s: Failed to allocate memory for pool free operation.\n",
+			pool->dev_name);
+		return 0;
+	}
+	INIT_LIST_HEAD(&d_pages);
+restart:
+	spin_lock_irqsave(&pool->lock, irq_flags);
+
+	/* We picking the oldest ones off the list */
+	list_for_each_entry_safe_reverse(dma_p, tmp, &pool->free_list,
+					 page_list) {
+		if (freed_pages >=3D npages_to_free)
+			break;
+
+		/* Move the dma_page from one list to another. */
+		list_move(&dma_p->page_list, &d_pages);
+
+		pages_to_free[freed_pages++] =3D dma_p->p;
+		/* We can only remove NUM_PAGES_TO_ALLOC at a time. */
+		if (freed_pages >=3D NUM_PAGES_TO_ALLOC) {
+
+			ttm_pool_update_free_locked(pool, freed_pages);
+			/**
+			 * Because changing page caching is costly
+			 * we unlock the pool to prevent stalling.
+			 */
+			spin_unlock_irqrestore(&pool->lock, irq_flags);
+
+			ttm_dma_pages_put(pool, &d_pages, pages_to_free,
+				      freed_pages);
+
+			INIT_LIST_HEAD(&d_pages);
+
+			if (likely(nr_free !=3D FREE_ALL_PAGES))
+				nr_free -=3D freed_pages;
+
+			if (NUM_PAGES_TO_ALLOC >=3D nr_free)
+				npages_to_free =3D nr_free;
+			else
+				npages_to_free =3D NUM_PAGES_TO_ALLOC;
+
+			freed_pages =3D 0;
+
+			/* free all so restart the processing */
+			if (nr_free)
+				goto restart;
+
+			/* Not allowed to fall through or break because
+			 * following context is inside spinlock while we are
+			 * outside here.
+			 */
+			goto out;
+
+		}
+	}
+
+	/* remove range of pages from the pool */
+	if (freed_pages) {
+		ttm_pool_update_free_locked(pool, freed_pages);
+		nr_free -=3D freed_pages;
+	}
+
+	spin_unlock_irqrestore(&pool->lock, irq_flags);
+
+	if (freed_pages)
+		ttm_dma_pages_put(pool, &d_pages, pages_to_free, freed_pages);
+out:
+	kfree(pages_to_free);
+	return nr_free;
+}
+
+static void ttm_dma_free_pool(struct device *dev, enum pool_type type)
+{
+	struct device_pools *p;
+	struct dma_pool *pool;
+	struct dma_page *d_page, *d_tmp;
+
+	if (!dev)
+		return;
+
+	mutex_lock(&_manager->lock);
+	list_for_each_entry_reverse(p, &_manager->pools, pools) {
+		if (p->dev !=3D dev)
+			continue;
+		pool =3D p->pool;
+		if (pool->type !=3D type)
+			continue;
+
+		list_del(&p->pools);
+		kfree(p);
+		_manager->npools--;
+		break;
+	}
+	list_for_each_entry_reverse(pool, &dev->dma_pools, pools) {
+		unsigned long irq_save;
+		if (pool->type !=3D type)
+			continue;
+		/* Takes a spinlock.. */
+		ttm_dma_page_pool_free(pool, FREE_ALL_PAGES);
+		/* .. but afterwards we can take it too */
+		spin_lock_irqsave(&pool->lock, irq_save);
+		list_for_each_entry_safe(d_page, d_tmp, &pool->inuse_list,
+					 page_list) {
+			pr_err("%s: (%s:%d) %p (%p DMA:0x%lx) busy!\n",
+				pool->dev_name, pool->name,
+				current->pid, d_page->vaddr,
+				virt_to_page(d_page->vaddr),
+				(unsigned long)d_page->dma);
+			list_del(&d_page->page_list);
+			kfree(d_page);
+			pool->npages_in_use--;
+		}
+		spin_unlock_irqrestore(&pool->lock, irq_save);
+		WARN_ON(((pool->npages_in_use + pool->npages_free) !=3D 0));
+		/* This code path is called after _all_ references to the
+		 * struct device has been dropped - so nobody should be
+		 * touching it. In case somebody is trying to _add_ we are
+		 * guarded by the mutex. */
+		list_del(&pool->pools);
+		kfree(pool);
+		break;
+	}
+	mutex_unlock(&_manager->lock);
+}
+/*
+ * On free-ing of the 'struct device' this deconstructor is run.
+ * Albeit the pool might have already been freed earlier.
+ */
+static void ttm_dma_pool_release(struct device *dev, void *res)
+{
+	struct dma_pool *pool =3D *(struct dma_pool **)res;
+
+	if (pool)
+		ttm_dma_free_pool(dev, pool->type);
+}
+
+static int ttm_dma_pool_match(struct device *dev, void *res, void *match=
_data)
+{
+	return *(struct dma_pool **)res =3D=3D match_data;
+}
+
+static struct dma_pool *ttm_dma_pool_init(struct device *dev, gfp_t flag=
s,
+					  enum pool_type type)
+{
+	char *n[] =3D {"wc", "uc", "cached", " dma32", "unknown",};
+	enum pool_type t[] =3D {IS_WC, IS_UC, IS_CACHED, IS_DMA32, IS_UNDEFINED=
};
+	struct device_pools *sec_pool =3D NULL;
+	struct dma_pool *pool =3D NULL, **ptr;
+	unsigned i;
+	int ret =3D -ENODEV;
+	char *p;
+
+	if (!dev)
+		return NULL;
+
+	ptr =3D devres_alloc(ttm_dma_pool_release, sizeof(*ptr), GFP_KERNEL);
+	if (!ptr)
+		return NULL;
+
+	ret =3D -ENOMEM;
+
+	pool =3D kmalloc_node(sizeof(struct dma_pool), GFP_KERNEL,
+			    dev_to_node(dev));
+	if (!pool)
+		goto err_mem;
+
+	sec_pool =3D kmalloc_node(sizeof(struct device_pools), GFP_KERNEL,
+				dev_to_node(dev));
+	if (!sec_pool)
+		goto err_mem;
+
+	INIT_LIST_HEAD(&sec_pool->pools);
+	sec_pool->dev =3D dev;
+	sec_pool->pool =3D  pool;
+
+	INIT_LIST_HEAD(&pool->free_list);
+	INIT_LIST_HEAD(&pool->inuse_list);
+	INIT_LIST_HEAD(&pool->pools);
+	spin_lock_init(&pool->lock);
+	pool->dev =3D dev;
+	pool->npages_free =3D pool->npages_in_use =3D 0;
+	pool->nfrees =3D 0;
+	pool->gfp_flags =3D flags;
+	pool->size =3D PAGE_SIZE;
+	pool->type =3D type;
+	pool->nrefills =3D 0;
+	pool->fill_lock =3D false;
+	p =3D pool->name;
+	for (i =3D 0; i < 5; i++) {
+		if (type & t[i]) {
+			p +=3D snprintf(p, sizeof(pool->name) - (p - pool->name),
+				      "%s", n[i]);
+		}
+	}
+	*p =3D 0;
+	/* We copy the name for pr_ calls b/c when dma_pool_destroy is called
+	 * - the kobj->name has already been deallocated.*/
+	snprintf(pool->dev_name, sizeof(pool->dev_name), "%s %s",
+		 dev_driver_string(dev), dev_name(dev));
+	mutex_lock(&_manager->lock);
+	/* You can get the dma_pool from either the global: */
+	list_add(&sec_pool->pools, &_manager->pools);
+	_manager->npools++;
+	/* or from 'struct device': */
+	list_add(&pool->pools, &dev->dma_pools);
+	mutex_unlock(&_manager->lock);
+
+	*ptr =3D pool;
+	devres_add(dev, ptr);
+
+	return pool;
+err_mem:
+	devres_free(ptr);
+	kfree(sec_pool);
+	kfree(pool);
+	return ERR_PTR(ret);
+}
+static struct dma_pool *ttm_dma_find_pool(struct device *dev,
+					  enum pool_type type)
+{
+	struct dma_pool *pool, *tmp, *found =3D NULL;
+
+	if (type =3D=3D IS_UNDEFINED)
+		return found;
+
+	/* NB: We iterate on the 'struct dev' which has no spinlock, but
+	 * it does have a kref which we have taken. The kref is taken during
+	 * graphic driver loading - in the drm_pci_init it calls either
+	 * pci_dev_get or pci_register_driver which both end up taking a kref
+	 * on 'struct device'.
+	 *
+	 * On teardown, the graphic drivers end up quiescing the TTM (put_pages=
)
+	 * and calls the dev_res deconstructors: ttm_dma_pool_release. The nice
+	 * thing is at that point of time there are no pages associated with th=
e
+	 * driver so this function will not be called.
+	 */
+	list_for_each_entry_safe(pool, tmp, &dev->dma_pools, pools) {
+		if (pool->type !=3D type)
+			continue;
+		found =3D pool;
+		break;
+	}
+	return found;
+}
+
+/*
+ * Free pages the pages that failed to change the caching state. If ther=
e
+ * are pages that have changed their caching state already put them to t=
he
+ * pool.
+ */
+static void ttm_dma_handle_caching_state_failure(struct dma_pool *pool,
+						 struct list_head *d_pages,
+						 struct page **failed_pages,
+						 unsigned cpages)
+{
+	struct dma_page *d_page, *tmp;
+	struct page *p;
+	unsigned i =3D 0;
+
+	p =3D failed_pages[0];
+	if (!p)
+		return;
+	/* Find the failed page. */
+	list_for_each_entry_safe(d_page, tmp, d_pages, page_list) {
+		if (d_page->p !=3D p)
+			continue;
+		/* .. and then progress over the full list. */
+		list_del(&d_page->page_list);
+		__ttm_dma_free_page(pool, d_page);
+		if (++i < cpages)
+			p =3D failed_pages[i];
+		else
+			break;
+	}
+
+}
+/*
+ * Allocate 'count' pages, and put 'need' number of them on the
+ * 'pages' and as well on the 'dma_address' starting at 'dma_offset' off=
set.
+ * The full list of pages should also be on 'd_pages'.
+ * We return zero for success, and negative numbers as errors.
+ */
+static int ttm_dma_pool_alloc_new_pages(struct dma_pool *pool,
+					struct list_head *d_pages,
+					unsigned count)
+{
+	struct page **caching_array;
+	struct dma_page *dma_p;
+	struct page *p;
+	int r =3D 0;
+	unsigned i, cpages;
+	unsigned max_cpages =3D min(count,
+			(unsigned)(PAGE_SIZE/sizeof(struct page *)));
+
+	/* allocate array for page caching change */
+	caching_array =3D kmalloc(max_cpages*sizeof(struct page *), GFP_KERNEL)=
;
+
+	if (!caching_array) {
+		pr_err(TTM_PFX
+		       "%s: Unable to allocate table for new pages.",
+			pool->dev_name);
+		return -ENOMEM;
+	}
+
+	if (count > 1) {
+		pr_debug("%s: (%s:%d) Getting %d pages\n",
+			pool->dev_name, pool->name, current->pid,
+			count);
+	}
+
+	for (i =3D 0, cpages =3D 0; i < count; ++i) {
+		dma_p =3D __ttm_dma_alloc_page(pool);
+		if (!dma_p) {
+			pr_err(TTM_PFX "%s: Unable to get page %u.\n",
+				pool->dev_name, i);
+
+			/* store already allocated pages in the pool after
+			 * setting the caching state */
+			if (cpages) {
+				r =3D ttm_set_pages_caching(pool, caching_array,
+							  cpages);
+				if (r)
+					ttm_dma_handle_caching_state_failure(
+						pool, d_pages, caching_array,
+						cpages);
+			}
+			r =3D -ENOMEM;
+			goto out;
+		}
+		p =3D dma_p->p;
+#ifdef CONFIG_HIGHMEM
+		/* gfp flags of highmem page should never be dma32 so we
+		 * we should be fine in such case
+		 */
+		if (!PageHighMem(p))
+#endif
+		{
+			caching_array[cpages++] =3D p;
+			if (cpages =3D=3D max_cpages) {
+				/* Note: Cannot hold the spinlock */
+				r =3D ttm_set_pages_caching(pool, caching_array,
+						 cpages);
+				if (r) {
+					ttm_dma_handle_caching_state_failure(
+						pool, d_pages, caching_array,
+						cpages);
+					goto out;
+				}
+				cpages =3D 0;
+			}
+		}
+		list_add(&dma_p->page_list, d_pages);
+	}
+
+	if (cpages) {
+		r =3D ttm_set_pages_caching(pool, caching_array, cpages);
+		if (r)
+			ttm_dma_handle_caching_state_failure(pool, d_pages,
+					caching_array, cpages);
+	}
+out:
+	kfree(caching_array);
+	return r;
+}
+static bool ttm_dma_iterate_reverse(struct dma_pool *pool,
+				    struct dma_page *d_page,
+				    struct page *p)
+{
+
+	/* Note: When TTM layer gets pages - it gets them one page at a time
+	 * and puts them on an array (so most recently allocated page is at
+	 * at the back). The inuse_list is a copy of those pages, but in the
+	 * exact opposite order. This is b/c when TTM puts pages back, it
+	 * constructs a stack with the oldest element on the top. Hence the
+	 * inuse_list is constructed with the same order so that it will
+	 * efficiently be matched against the stack.
+	 * But, just in case the pages are not in that order, we double check
+	 * the 'pages' against our inuse_list in case we have to go in reverse.
+	 */
+	struct page *p_next;
+	struct dma_page *tmp;
+
+	tmp =3D list_entry(d_page->page_list.prev, struct dma_page, page_list);
+	if (&tmp->page_list !=3D &pool->inuse_list) {
+		p_next =3D list_entry(p->lru.next, struct page, lru);
+		if (tmp->p =3D=3D p_next)
+			return true;
+	}
+	return false;
+}
+
+/*
+ * Iterate forward (or backwards if 'reverse' is true) by one element
+ * in the pool->in_use list. We use 'd_page' as the starting point.
+ * The 'd_page' upon completion of the iteration, is moved to the
+ * 'd_pages' list.
+ */
+static struct dma_page *ttm_dma_iterate_next(struct dma_pool *pool,
+					     struct dma_page *d_page,
+					     struct list_head *d_pages,
+					     bool reverse)
+{
+	struct dma_page *next =3D NULL;
+
+	if (unlikely(reverse)) {
+		if (&d_page->page_list !=3D &pool->inuse_list)
+			next =3D list_entry(d_page->page_list.prev,
+					  struct dma_page,
+					  page_list);
+		list_move(&d_page->page_list, d_pages);
+	} else {
+		if (&d_page->page_list !=3D &pool->inuse_list)
+			next =3D list_entry(d_page->page_list.next,
+					  struct dma_page,
+					  page_list);
+		list_move_tail(&d_page->page_list, d_pages);
+	}
+	return next;
+}
+/*
+ * Iterate forward (or backwards if 'reverse' is true), looking
+ * for page 'p' in the pool->inuse_list, starting at 'start'.
+ */
+static struct dma_page *ttm_dma_iterate_forward(struct dma_pool *pool,
+						struct dma_page *start,
+						struct page *p,
+						bool reverse)
+{
+	struct dma_page *tmp =3D start;
+
+	if (unlikely(reverse)) {
+		list_for_each_entry_continue_reverse(tmp, &pool->inuse_list,
+						     page_list) {
+			if (p =3D=3D tmp->p)
+				return tmp;
+		}
+	} else {
+		list_for_each_entry_continue(tmp, &pool->inuse_list,
+					     page_list) {
+			if (p =3D=3D tmp->p)
+				return tmp;
+		}
+	}
+	return NULL;
+}
+/*
+ * Recycle (or delete) the 'pages' that are on the 'pool'.
+ * @pool: The pool that the pages are associated with.
+ * @pages: The list of pages we are done with.
+ * @page_count: Count of how many pages (or zero if all).
+ * @erase: Instead of recycling - just free them.
+ */
+static unsigned int ttm_dma_put_pages_in_pool(struct dma_pool *pool,
+					      struct list_head *pages,
+					      unsigned page_count,
+					      bool erase)
+{
+	unsigned long uninitialized_var(irq_flags);
+	struct list_head uninitialized_var(d_pages);
+	struct page **uninitialized_var(array_pages);
+	unsigned uninitialized_var(freed_pages);
+	struct page *p, *tmp;
+	unsigned count =3D 0;
+	struct dma_page *d_tmp, *d_page =3D NULL;
+	bool rev =3D false;
+	if (unlikely(WARN_ON(list_empty(pages))))
+		return 0;
+
+	if (page_count =3D=3D 0) {
+		list_for_each_entry(p, pages, lru)
+			++page_count;
+
+	}
+	if (page_count > 1) {
+		pr_debug("%s: (%s:%d) %s %d pages\n",
+			pool->dev_name, pool->name, current->pid,
+			erase ? "Destroying" : "Recycling", page_count);
+	}
+
+	/* d_pages is the list of 'struct dma_page' */
+	INIT_LIST_HEAD(&d_pages);
+
+	if (erase) {
+		/* and pages_to_free is used for cache reset */
+		array_pages =3D kmalloc(page_count * sizeof(struct page *),
+				GFP_KERNEL);
+		if (!array_pages) {
+			dev_err(pool->dev, TTM_PFX
+			"Failed to allocate memory for pool free operation.\n");
+			return 0;
+		}
+		freed_pages =3D 0;
+	}
+
+	/* Find the first page of the "chunk" of pages. */
+	p =3D list_first_entry(pages, struct page, lru);
+	spin_lock_irqsave(&pool->lock, irq_flags);
+restart:
+	list_for_each_entry(d_tmp, &pool->inuse_list, page_list) {
+		if (p =3D=3D d_tmp->p) {
+			d_page =3D d_tmp;
+			break;
+		}
+	}
+	/* The pages are _not_ in this pool. */
+	if (!d_page) {
+		spin_unlock_irqrestore(&pool->lock, irq_flags);
+		return 0;
+	}
+	rev =3D ttm_dma_iterate_reverse(pool, d_page, p);
+	if (rev)
+		pr_debug("%s: (%s:%d) Traversing %d in reverse order\n",
+			pool->dev_name, pool->name, current->pid, page_count);
+	/* Continue iterating on both lists. */
+	list_for_each_entry_safe(p, tmp, pages, lru) {
+		if (d_page->p !=3D p && count !=3D page_count) {
+			/* Yikes! The inuse stack is swiss cheese. Have to
+			   start looking.*/
+			d_page =3D ttm_dma_iterate_forward(pool, d_page, p, rev);
+			if (!d_page)
+				goto restart;
+		}
+		/* Do not advance past what we were asked to delete. */
+		if (d_page->p !=3D p)
+			break;
+		list_del(&p->lru);
+
+		if (erase)
+			array_pages[freed_pages++] =3D d_page->p;
+		d_page =3D ttm_dma_iterate_next(pool, d_page, &d_pages, rev);
+		if (!d_page)
+			break;
+		count++;
+		/* Check if we should iterate. */
+		if (count =3D=3D page_count)
+			break;
+	}
+	if (!erase) /* And stick 'em on the free pool. */
+		list_splice(&d_pages, &pool->free_list);
+
+	spin_unlock_irqrestore(&pool->lock, irq_flags);
+
+	if (erase) {
+		/* Note: The caller of us updates the pool accounting. */
+		ttm_dma_pages_put(pool, &d_pages, array_pages /* to set WB */,
+				  freed_pages);
+		kfree(array_pages);
+	}
+	if (count > 1) {
+		pr_debug("%s: (%s:%d) %d/%d pages %s pool.\n",
+			pool->dev_name, pool->name, current->pid,
+			count, page_count,
+			erase ? "erased from inuse" : "put in free");
+	}
+	return count;
+}
+/*
+ * @return count of pages still required to fulfill the request.
+*/
+static int ttm_dma_page_pool_fill_locked(struct dma_pool *pool,
+					 unsigned count,
+					 unsigned long *irq_flags)
+{
+	int r =3D count;
+
+	if (pool->fill_lock)
+		return r;
+
+	pool->fill_lock =3D true;
+	if (count < _manager->options.small &&
+	    count > pool->npages_free) {
+		struct list_head d_pages;
+		unsigned alloc_size =3D  _manager->options.alloc_size;
+
+		INIT_LIST_HEAD(&d_pages);
+
+		spin_unlock_irqrestore(&pool->lock, *irq_flags);
+
+		/* Returns how many more are neccessary to fulfill the
+		 * request. */
+		r =3D ttm_dma_pool_alloc_new_pages(pool, &d_pages, alloc_size);
+
+		spin_lock_irqsave(&pool->lock, *irq_flags);
+		if (!r) {
+			/* Add the fresh to the end.. */
+			list_splice(&d_pages, &pool->free_list);
+			++pool->nrefills;
+			pool->npages_free +=3D alloc_size;
+		} else {
+			struct dma_page *d_page;
+			unsigned cpages =3D 0;
+
+			pr_err(TTM_PFX "%s: Failed to fill %s pool (r:%d)!\n",
+				pool->dev_name, pool->name, r);
+
+			list_for_each_entry(d_page, &d_pages, page_list) {
+				cpages++;
+			}
+			list_splice_tail(&d_pages, &pool->free_list);
+			pool->npages_free +=3D cpages;
+		}
+	}
+	pool->fill_lock =3D false;
+	return r;
+
+}
+
+/*
+ * @return count of pages still required to fulfill the request.
+ * The populate list is actually a stack (not that is matters as TTM
+ * allocates one page at a time.
+ */
+static int ttm_dma_pool_get_pages(struct dma_pool *pool,
+				  struct list_head *pages,
+				  dma_addr_t *dma_address, unsigned count)
+{
+	unsigned long irq_flags;
+	int r;
+	unsigned i;
+	struct dma_page *d_page, *tmp;
+	struct list_head d_pages;
+
+	spin_lock_irqsave(&pool->lock, irq_flags);
+	r =3D ttm_dma_page_pool_fill_locked(pool, count, &irq_flags);
+	if (r < 0) {
+		pr_debug("%s: (%s:%d) Asked for %d, got %d %s.\n",
+			pool->dev_name, pool->name, current->pid, count, r,
+			(r < 0) ? "err:" : "pages");
+		goto out;
+	}
+	if (!pool->npages_free)
+		goto out;
+	if (count > 1) {
+		pr_debug("%s: (%s:%d) Looking in free list for %d pages. "\
+			 "(have %d pages free)\n",
+			 pool->dev_name, pool->name, current->pid, count,
+			 pool->npages_free);
+	}
+	i =3D 0;
+	/* We are holding the spinlock.. */
+	INIT_LIST_HEAD(&d_pages);
+	/* Note: The  the 'pages' (and inuse_list) is expected to be a stack,
+	 * so we put the entries in the right order (and on the inuse list
+	 * in the reverse order to compenstate for freeing - which inverts the
+	 * 'pages' order).
+	 */
+	list_for_each_entry_safe(d_page, tmp, &pool->free_list, page_list) {
+		list_add_tail(&d_page->p->lru, pages);
+		dma_address[i++] =3D d_page->dma;
+		list_move(&d_page->page_list, &d_pages);
+		if (i =3D=3D count)
+			break;
+	}
+	/* Note: The 'inuse_list' must have the same order as the 'pages'
+	 * to be effective when pages are put back. And since 'pages' is
+	 * as stack, ergo inuse_list is a stack too. */
+	list_splice(&d_pages, &pool->inuse_list);
+	count -=3D i;
+	pool->npages_in_use +=3D i;
+	pool->npages_free -=3D i;
+out:
+	spin_unlock_irqrestore(&pool->lock, irq_flags);
+	if (count)
+		pr_debug("%s: (%s:%d) Need %d more.\n",
+			pool->dev_name, pool->name, current->pid, count);
+	return count;
+}
+/*
+ * On success pages list will hold count number of correctly
+ * cached pages. On failure will hold the negative return value (-ENOMEM=
, etc).
+ */
+int ttm_dma_get_pages(struct ttm_tt *ttm, struct list_head *pages,
+		      unsigned count, dma_addr_t *dma_address)
+
+{
+	int r =3D -ENOMEM;
+	struct dma_pool *pool;
+	gfp_t gfp_flags;
+	enum pool_type type;
+	struct device *dev =3D ttm->be->dev;
+
+	type =3D ttm_to_type(ttm->page_flags, ttm->caching_state);
+
+	if (ttm->page_flags & TTM_PAGE_FLAG_DMA32)
+		gfp_flags =3D GFP_USER | GFP_DMA32;
+	else
+		gfp_flags =3D GFP_HIGHUSER;
+
+	if (ttm->page_flags & TTM_PAGE_FLAG_ZERO_ALLOC)
+		gfp_flags |=3D __GFP_ZERO;
+
+	pool =3D ttm_dma_find_pool(dev, type);
+	if (!pool) {
+		pool =3D ttm_dma_pool_init(dev, gfp_flags, type);
+		if (IS_ERR_OR_NULL(pool))
+			return -ENOMEM;
+	}
+#if 0
+	if (count > 1) {
+		pr_debug("%s (%s:%d) Attempting to get %d pages type %x\n",
+			pool->dev_name, pool->name, current->pid, count,
+			cstate);
+	}
+#endif
+	/* Take pages out of a pool (if applicable) */
+	r =3D ttm_dma_pool_get_pages(pool, pages, dma_address, count);
+	/* clear the pages coming from the pool if requested */
+	if (ttm->page_flags & TTM_PAGE_FLAG_ZERO_ALLOC) {
+		struct page *p;
+		list_for_each_entry(p, pages, lru) {
+			clear_page(page_address(p));
+		}
+	}
+	/* If pool didn't have enough pages allocate new one. */
+	if (r > 0) {
+		struct list_head d_pages;
+		unsigned pages_need =3D r;
+		unsigned long irq_flags;
+
+		INIT_LIST_HEAD(&d_pages);
+
+		/* Note, we are running without locking here..
+		 * and we have to manually add the stack to the inuse pool. */
+		r =3D ttm_dma_pool_alloc_new_pages(pool, &d_pages, pages_need);
+
+		if (r =3D=3D 0) {
+			struct dma_page *d_page;
+			int i =3D count - 1;
+
+			/* Since the pages are directly going to the inuse_list
+			 * which is stack based, lets treat it as a stack.
+			 */
+			list_for_each_entry(d_page,  &d_pages, page_list) {
+				list_add(&d_page->p->lru, pages);
+				BUG_ON(i < 0);
+				dma_address[i--] =3D d_page->dma;
+			}
+			spin_lock_irqsave(&pool->lock, irq_flags);
+			pool->npages_in_use +=3D pages_need;
+			list_splice(&d_pages, &pool->inuse_list);
+			spin_unlock_irqrestore(&pool->lock, irq_flags);
+		} else {
+			/* If there is any pages in the list put them back to
+			 * the pool. */
+			pr_err(TTM_PFX
+			       "%s: Failed to allocate extra pages "
+			       "for large request.",
+				pool->dev_name);
+			spin_lock_irqsave(&pool->lock, irq_flags);
+			pool->npages_free +=3D r;
+			/* We don't care about ordering on the free_list. */
+			list_splice(&d_pages, &pool->free_list);
+			spin_unlock_irqrestore(&pool->lock, irq_flags);
+			return count;
+		}
+	}
+	return r;
+}
+
+/* Get good estimation how many pages are free in pools */
+static int ttm_dma_pool_get_num_unused_pages(void)
+{
+	struct device_pools *p;
+	unsigned total =3D 0;
+
+	mutex_lock(&_manager->lock);
+	list_for_each_entry(p, &_manager->pools, pools) {
+		if (p)
+			total +=3D p->pool->npages_free;
+	}
+	mutex_unlock(&_manager->lock);
+	return total;
+}
+
+/* Put all pages in pages list to correct pool to wait for reuse */
+void ttm_dma_put_pages(struct ttm_tt *ttm, struct list_head *pages,
+		       unsigned page_count, dma_addr_t *dma_address)
+{
+	struct dma_pool *pool;
+	enum pool_type type;
+	bool is_cached =3D false;
+	unsigned count =3D 0, i;
+	unsigned long irq_flags;
+	struct device *dev =3D ttm->be->dev;
+
+	if (list_empty(pages))
+		return;
+
+	type =3D ttm_to_type(ttm->page_flags, ttm->caching_state);
+	pool =3D ttm_dma_find_pool(dev, type);
+	if (!pool) {
+		WARN_ON(!pool);
+		return;
+	}
+	is_cached =3D (ttm_dma_find_pool(pool->dev,
+		     ttm_to_type(ttm->page_flags, tt_cached)) =3D=3D pool);
+
+	if (page_count > 1) {
+		dev_dbg(pool->dev, "(%s:%d) Attempting to %s %d pages.\n",
+			pool->name, current->pid,
+			(is_cached) ?  "destroy" : "recycle", page_count);
+	}
+
+	count =3D ttm_dma_put_pages_in_pool(pool, pages, page_count, is_cached)=
;
+
+	for (i =3D 0; i < count; i++)
+		dma_address[i] =3D 0;
+
+	spin_lock_irqsave(&pool->lock, irq_flags);
+	pool->npages_in_use -=3D count;
+	if (is_cached)
+		pool->nfrees +=3D count;
+	else
+		pool->npages_free +=3D count;
+	spin_unlock_irqrestore(&pool->lock, irq_flags);
+
+	page_count -=3D count;
+	WARN(page_count !=3D 0,
+		"Only freed %d page(s) in %s. Could not free the other %d!\n",
+		count, pool->name, page_count);
+
+	page_count =3D 0;
+	if (pool->npages_free > _manager->options.max_size) {
+		page_count =3D pool->npages_free - _manager->options.max_size;
+		if (page_count < NUM_PAGES_TO_ALLOC)
+			page_count =3D NUM_PAGES_TO_ALLOC;
+	}
+	if (page_count)
+		ttm_dma_page_pool_free(pool, page_count);
+}
+
+/**
+ * Callback for mm to request pool to reduce number of page held.
+ */
+static int ttm_dma_pool_mm_shrink(struct shrinker *shrink,
+				  struct shrink_control *sc)
+{
+	static atomic_t start_pool =3D ATOMIC_INIT(0);
+	unsigned idx =3D 0;
+	unsigned pool_offset =3D atomic_add_return(1, &start_pool);
+	unsigned shrink_pages =3D sc->nr_to_scan;
+	struct device_pools *p;
+
+	if (list_empty(&_manager->pools))
+		return 0;
+
+	mutex_lock(&_manager->lock);
+	pool_offset =3D pool_offset % _manager->npools;
+	list_for_each_entry(p, &_manager->pools, pools) {
+		unsigned nr_free;
+
+		if (!p && !p->dev)
+			continue;
+		if (shrink_pages =3D=3D 0)
+			break;
+		/* Do it in round-robin fashion. */
+		if (++idx < pool_offset)
+			continue;
+		nr_free =3D shrink_pages;
+		shrink_pages =3D ttm_dma_page_pool_free(p->pool, nr_free);
+		pr_debug("%s: (%s:%d) Asked to shrink %d, have %d more to go\n",
+			p->pool->dev_name, p->pool->name, current->pid, nr_free,
+			shrink_pages);
+	}
+	mutex_unlock(&_manager->lock);
+	/* return estimated number of unused pages in pool */
+	return ttm_dma_pool_get_num_unused_pages();
+}
+
+static void ttm_dma_pool_mm_shrink_init(struct ttm_pool_manager *manager=
)
+{
+	manager->mm_shrink.shrink =3D &ttm_dma_pool_mm_shrink;
+	manager->mm_shrink.seeks =3D 1;
+	register_shrinker(&manager->mm_shrink);
+}
+static void ttm_dma_pool_mm_shrink_fini(struct ttm_pool_manager *manager=
)
+{
+	unregister_shrinker(&manager->mm_shrink);
+}
+int ttm_dma_page_alloc_init(struct ttm_mem_global *glob,
+				   unsigned max_pages)
+{
+	int ret =3D -ENOMEM;
+
+	WARN_ON(_manager);
+
+	printk(KERN_INFO TTM_PFX "Initializing DMA pool allocator.\n");
+
+	_manager =3D kzalloc(sizeof(*_manager), GFP_KERNEL);
+	if (!_manager)
+		goto err_manager;
+
+	mutex_init(&_manager->lock);
+	INIT_LIST_HEAD(&_manager->pools);
+
+	_manager->options.max_size =3D max_pages;
+	_manager->options.small =3D SMALL_ALLOCATION;
+	_manager->options.alloc_size =3D NUM_PAGES_TO_ALLOC;
+
+	/* This takes care of auto-freeing the _manager */
+	ret =3D kobject_init_and_add(&_manager->kobj, &ttm_pool_kobj_type,
+				   &glob->kobj, "dma_pool");
+	if (unlikely(ret !=3D 0)) {
+		kobject_put(&_manager->kobj);
+		goto err;
+	}
+	ttm_dma_pool_mm_shrink_init(_manager);
+	return 0;
+err_manager:
+	kfree(_manager);
+	_manager =3D NULL;
+err:
+	return ret;
+}
+void ttm_dma_page_alloc_fini(void)
+{
+	struct device_pools *p, *t;
+
+	printk(KERN_INFO TTM_PFX "Finalizing DMA pool allocator.\n");
+	ttm_dma_pool_mm_shrink_fini(_manager);
+
+	list_for_each_entry_safe_reverse(p, t, &_manager->pools, pools) {
+		dev_dbg(p->dev, "(%s:%d) Freeing.\n", p->pool->name,
+			current->pid);
+		WARN_ON(devres_destroy(p->dev, ttm_dma_pool_release,
+			ttm_dma_pool_match, p->pool));
+		ttm_dma_free_pool(p->dev, p->pool->type);
+	}
+	kobject_put(&_manager->kobj);
+	_manager =3D NULL;
+}
+
+int ttm_dma_page_alloc_debugfs(struct seq_file *m, void *data)
+{
+	struct device_pools *p;
+	struct dma_pool *pool =3D NULL;
+	char *h[] =3D {"pool", "refills", "pages freed", "inuse", "available",
+		     "name", "virt", "busaddr"};
+
+	if (!_manager) {
+		seq_printf(m, "No pool allocator running.\n");
+		return 0;
+	}
+	seq_printf(m, "%13s %12s %13s %8s %8s %8s\n",
+		   h[0], h[1], h[2], h[3], h[4], h[5]);
+	mutex_lock(&_manager->lock);
+	list_for_each_entry(p, &_manager->pools, pools) {
+		struct device *dev =3D p->dev;
+		if (!dev)
+			continue;
+		pool =3D p->pool;
+		seq_printf(m, "%13s %12ld %13ld %8d %8d %8s\n",
+				pool->name, pool->nrefills,
+				pool->nfrees, pool->npages_in_use,
+				pool->npages_free,
+				pool->dev_name);
+	}
+	mutex_unlock(&_manager->lock);
+	return 0;
+}
+EXPORT_SYMBOL_GPL(ttm_dma_page_alloc_debugfs);
+bool ttm_dma_override(struct ttm_backend_func *be)
+{
+	if (swiotlb_nr_tbl() && be) {
+		be->get_pages =3D &ttm_dma_get_pages;
+		be->put_pages =3D &ttm_dma_put_pages;
+		return true;
+	}
+	return false;
+}
+EXPORT_SYMBOL_GPL(ttm_dma_override);
diff --git a/include/drm/ttm/ttm_page_alloc.h b/include/drm/ttm/ttm_page_=
alloc.h
index 0aaac39..9c52fb7 100644
--- a/include/drm/ttm/ttm_page_alloc.h
+++ b/include/drm/ttm/ttm_page_alloc.h
@@ -29,6 +29,37 @@
 #include "ttm_bo_driver.h"
 #include "ttm_memory.h"
=20
+#ifdef CONFIG_SWIOTLB
+extern bool ttm_dma_override(struct ttm_backend_func *be);
+
+/**
+ * Initialize pool allocator.
+ */
+int ttm_dma_page_alloc_init(struct ttm_mem_global *glob, unsigned max_pa=
ges);
+/**
+ * Free pool allocator.
+ */
+void ttm_dma_page_alloc_fini(void);
+/**
+ * Output the state of pools to debugfs file
+ */
+extern int ttm_dma_page_alloc_debugfs(struct seq_file *m, void *data);
+#else
+static inline bool ttm_dma_override(struct ttm_backend_func *be)
+{
+	return false;
+}
+static inline int ttm_dma_page_alloc_init(struct ttm_mem_global *glob,
+					  unsigned max_pages)
+{
+	return -ENODEV;
+}
+static inline void ttm_dma_page_alloc_fini(void) { return; }
+static inline int ttm_dma_page_alloc_debugfs(struct seq_file *m, void *d=
ata)
+{
+	return 0;
+}
+#endif
 /**
  * Get count number of pages from pool to pages list.
  *
--=20
1.7.6.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 12:21:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 12:21:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJtj-0002M1-Gb; Tue, 01 Nov 2011 12:21:23 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLJdc-0005s8-6B
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 12:04:45 -0700
X-Env-Sender: hahn@univention.de
X-Msg-Ref: server-5.tower-182.messagelabs.com!1320174280!1577002!1
X-Originating-IP: [82.198.197.8]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13677 invoked from network); 1 Nov 2011 19:04:40 -0000
Received: from mail.univention.de (HELO mail.univention.de) (82.198.197.8)
	by server-5.tower-182.messagelabs.com with SMTP;
	1 Nov 2011 19:04:40 -0000
Received: from localhost (localhost [127.0.0.1])
	by slugis.knut.univention.de (Postfix) with ESMTP id AFE97E5B113;
	Tue,  1 Nov 2011 20:04:37 +0100 (CET)
Received: from localhost (localhost [127.0.0.1])
	by slugis.knut.univention.de (Postfix) with ESMTP id 9D649164B10E;
	Tue,  1 Nov 2011 20:04:37 +0100 (CET)
X-Virus-Scanned: by amavisd-new-2.6.1 (20080629) (Debian) at knut.univention.de
Received: from mail.univention.de ([127.0.0.1])
	by localhost (slugis.knut.univention.de [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id ePMILj6OSoVX; Tue,  1 Nov 2011 20:04:36 +0100 (CET)
Received: from stave.knut.univention.de (stave.knut.univention.de
	[192.168.0.191])
	by slugis.knut.univention.de (Postfix) with ESMTPSA id B364EE5B102;
	Tue,  1 Nov 2011 20:04:36 +0100 (CET)
From: Philipp Hahn <hahn@univention.de>
Organization: Univention.de
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH v2] Add HybridISO support for PyGrub2
Date: Tue, 1 Nov 2011 20:04:25 +0100
User-Agent: KMail/1.9.10 (enterprise35 20100903.1171286)
References: <201110251057.06774.hahn@univention.de>
	<201110280946.51201.hahn@univention.de>
	<20144.16411.886176.254632@mariner.uk.xensource.com>
In-Reply-To: <20144.16411.886176.254632@mariner.uk.xensource.com>
X-KMail-QuotePrefix: > 
MIME-Version: 1.0
Message-Id: <201111012004.30624.hahn@univention.de>
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0559150883=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0559150883==
Content-Type: multipart/signed; boundary="nextPart1357777.BZilLcrcLS";
	protocol="application/pgp-signature"; micalg=pgp-sha1
Content-Transfer-Encoding: 7bit

--nextPart1357777.BZilLcrcLS
Content-Type: multipart/mixed;
  boundary="Boundary-01=_5KEsO+rQqTHcdin"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

--Boundary-01=_5KEsO+rQqTHcdin
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Hello Ian,

Am Dienstag 01 November 2011 19:53:15 schrieb Ian Jackson:
> Philipp Hahn writes ("Re: [Xen-devel] [PATCH v2] Add HybridISO support fo=
r=20
PyGrub2"):
> > v2: For HybrisISOs use offset 0 in addition instead of replacement.
>
> Thanks.  I tried to apply this but it has been linewrapped.  Can you
> please resubmit it with a non-broken mailer ?  If you avoid lines >75
> characters it probably won't linewrap, or you could attach it I guess.

I've attached the patch. Thank you for asking back.

Sincerely
Philipp
=2D-=20
Philipp Hahn           Open Source Software Engineer      hahn@univention.de
Univention GmbH        Linux for Your Business        fon: +49 421 22 232- 0
Mary-Somerville-Str.1  D-28359 Bremen                 fax: +49 421 22 232-99
                                                   http://www.univention.de/

--Boundary-01=_5KEsO+rQqTHcdin
Content-Type: text/x-diff; charset="iso-8859-15";
	name="0003-pygrub-hybridiso.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="0003-pygrub-hybridiso.patch"

Bug #23812: Add HybridISO support for PyGrub2

grub-mkrescue internally uses xorriso, which generates a so-called "Hybrid
ISO": The ISO images also contains a DOS partition table, which allows the
identical ISO file to be stored on an USB stick for booting from it. This
breaks PyGrub, since it (wrongly) detects only the DOS partition table and =
uses
the first partition instead of the complete ISO file.

Add a check to detect HybridISO files and use offset 0 in addition to parti=
tion
table parsing.
=2D-- a/tools/pygrub/src/pygrub
+++ b/tools/pygrub/src/pygrub
@@ -40,15 +40,20 @@ def enable_cursor(ison):
     except _curses.error:
         pass
=20
=2Ddef is_disk_image(file):
+DISK_TYPE_RAW, DISK_TYPE_HYBRIDISO, DISK_TYPE_DOS =3D range(3)
+def identify_disk_image(file):
+    """Detect DOS partition table or HybridISO format."""
     fd =3D os.open(file, os.O_RDONLY)
=2D    buf =3D os.read(fd, 512)
+    buf =3D os.read(fd, 0x8006)
     os.close(fd)
=20
     if len(buf) >=3D 512 and \
            struct.unpack("H", buf[0x1fe: 0x200]) =3D=3D (0xaa55,):
=2D        return True
=2D    return False
+        # HybridISO contains a DOS partition table for booting from USB de=
vices, but really is an ISO image
+        if len(buf) >=3D 0x8006 and buf[0x8001:0x8006] =3D=3D 'CD001':
+            return DISK_TYPE_HYBRIDISO
+        return DISK_TYPE_DOS
+    return DISK_TYPE_RAW
=20
 SECTOR_SIZE=3D512
 DK_LABEL_LOC=3D1
@@ -87,12 +92,19 @@ FDISK_PART_SOLARIS_OLD=3D0x82
 FDISK_PART_GPT=3D0xee
=20
 def get_partition_offsets(file):
=2D    if not is_disk_image(file):
+    image_type =3D identify_disk_image(file)
+    if image_type =3D=3D DISK_TYPE_RAW:
         # No MBR: assume whole disk filesystem, which is like a=20
         # single partition starting at 0
         return [0]
=2D
=2D    part_offs =3D []
+    elif image_type =3D=3D DISK_TYPE_HYBRIDISO:
+        # A HybridISO contains an ISO filesystem at 0 in addition
+        # to the DOS partition table
+        part_offs =3D [0]
+    elif image_type =3D=3D DISK_TYPE_DOS:
+        part_offs =3D []
+    else:
+        raise ValueError('Unhandled image type returnd by identify_disk_im=
age(): %d' % (image_type,))
=20
     fd =3D os.open(file, os.O_RDONLY)
     buf =3D os.read(fd, 512)

--Boundary-01=_5KEsO+rQqTHcdin--

--nextPart1357777.BZilLcrcLS
Content-Type: application/pgp-signature; name=signature.asc 
Content-Description: This is a digitally signed message part.

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iEYEABECAAYFAk6wQrkACgkQYPlgoZpUDjnTxwCeKbaPY+RGGE0rW+Ab0rcuD3wL
KzQAnj1aiVyPtwNwiG9VP+O6FyqYqI8w
=lnVm
-----END PGP SIGNATURE-----

--nextPart1357777.BZilLcrcLS--


--===============0559150883==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0559150883==--


From xen-devel-bounces@lists.xensource.com Tue Nov 01 12:22:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 12:22:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJuV-0002jG-D3; Tue, 01 Nov 2011 12:22:11 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJdg-0005tU-7l
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 12:04:48 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1320174285!2434392!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10366 invoked from network); 1 Nov 2011 19:04:45 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 19:04:45 -0000
X-IronPort-AV: E=Sophos;i="4.69,439,1315180800"; 
   d="scan'208";a="8702557"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 19:04:42 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 19:04:42 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLJda-0006lK-0g; Tue, 01 Nov 2011 19:04:42 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLJdZ-00019t-W7;
	Tue, 01 Nov 2011 19:04:41 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20144.17097.967889.755421@mariner.uk.xensource.com>
Date: Tue, 1 Nov 2011 19:04:41 +0000
To: Christoph Egger <Christoph.Egger@amd.com>
Subject: Re: [Xen-devel] [PATCH] tools/ocaml: unify build process
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <4EAFBA53.4050009@amd.com>
References: <4EAFBA53.4050009@amd.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Christoph Egger writes ("[Xen-devel] [PATCH] tools/ocaml: unify build process"):
> Unify ocaml build process for different platforms.
> 
> Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>

Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>

> P.S.: Please apply this to xen-4.1-testing

Can you remind me about this after this change has made it through the
automatic tester into xen-unstable.hg ?  I'd rather not just make the
same change to both trees at the same time, no matter how harmless it
looks...

Thanks,
Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 12:22:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 12:22:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLJvD-00036N-PE; Tue, 01 Nov 2011 12:22:55 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLJgL-0006QF-0i
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 12:07:33 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1320174415!55156789!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5621 invoked from network); 1 Nov 2011 19:06:55 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 19:06:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,439,1315180800"; 
   d="scan'208";a="8702595"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 19:07:30 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 19:07:30 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLJgH-0006mH-LF; Tue, 01 Nov 2011 19:07:29 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLJgH-0001AQ-KP;
	Tue, 01 Nov 2011 19:07:29 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20144.17265.621187.887785@mariner.uk.xensource.com>
Date: Tue, 1 Nov 2011 19:07:29 +0000
To: Christoph Egger <Christoph.Egger@amd.com>
Subject: Re: [Xen-devel] [PATCH] libxl: allow to enable/disable cpuid bits
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <4EAFD200.4010207@amd.com>
References: <4EAFD200.4010207@amd.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Christoph Egger writes ("[Xen-devel] [PATCH] libxl: allow to enable/disable cpuid bits"):
> 
> Allow to enable/disable SVM specific cpuid bits
> in the guest config file via cpuid config option.
> Also allow to enable/disable the hypervisor cpuid bit
> in the guest config file. We need to disable the
> hypervisor cpuid bit to get Hyper-V going.

The change itself looks plausible to me.  However I don't know much
about cpuid; can you get an ack from a hypervisor maintainer or an
suitable expert ?

Thanks,
Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 12:53:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 12:53:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLKOf-0004G3-6Z; Tue, 01 Nov 2011 12:53:22 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLKNq-00043R-DE
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 12:52:30 -0700
X-Env-Sender: jim_burn@bellsouth.net
X-Msg-Ref: server-11.tower-21.messagelabs.com!1320177146!2526449!1
X-Originating-IP: [98.139.44.164]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28872 invoked from network); 1 Nov 2011 19:52:26 -0000
Received: from nm15-vm0.access.bullet.mail.sp2.yahoo.com (HELO
	nm15-vm0.access.bullet.mail.sp2.yahoo.com) (98.139.44.164)
	by server-11.tower-21.messagelabs.com with SMTP;
	1 Nov 2011 19:52:26 -0000
Received: from [98.139.44.105] by nm15.access.bullet.mail.sp2.yahoo.com with
	NNFMP; 01 Nov 2011 19:52:25 -0000
Received: from [98.139.44.83] by tm10.access.bullet.mail.sp2.yahoo.com with
	NNFMP; 01 Nov 2011 19:52:25 -0000
Received: from [127.0.0.1] by omp1020.access.mail.sp2.yahoo.com with NNFMP;
	01 Nov 2011 19:52:25 -0000
X-Yahoo-Newman-Id: 523129.87519.bm@omp1020.access.mail.sp2.yahoo.com
Received: (qmail 29398 invoked from network); 1 Nov 2011 19:52:25 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bellsouth.net; s=s1024;
	t=1320177145; bh=QFJ490r64ublT3ld9OyxDszSM11SwQpyjJm03usmEbQ=;
	h=X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Received:From:To:Cc:Subject:Date:Message-ID:User-Agent:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Content-Type;
	b=29hmqNmji/iRA9vhK2QpUwVJTIyNedbY5SCtk9Dlo4w8h/TJEgHNnewPrZ4Kb4wF9UzSiWiga5dav3vSP2llS4RlHZJf3wAplB16TlhjmclzrraZ+eIueykNKkpTYbKJfnxKqGRwQBHzeuVCeebHob85ufk3TEz9WyN/YHJtu5g=
X-Yahoo-Newman-Property: ymail-3
X-YMail-OSG: 9ww.Zt0VM1nHypBXQSSirgR0AVSZBp0bWtxMa5z5R_kbKt7
	w7tjsnbD6gljj26_usvTRwUKdqkmN1XiYyG4ZOucyFOsyjbPYeDxcw3nsZOO
	xvmTvxTzQGbmxgq4Gm5r9CfybwMr6OcuHzsQ9k9gtE971w0C.vsBQK65sHCk
	acPthdKAxFNq8b495CTSwnf7giNFzMV4e2Du2mPwLtPTAKX3yQ.oap1k6jUb
	YmK6.P5aBNeVm1d42lpuWWyHja773ZRxZFSKLBM5oKr2LM3LmmQZoriLXyTV
	UbRHAA4Qpn6Ny_UcQKzk82LoALBP.ZaXtYCNRLqAmnao._YKdM5YhOcPmfUn
	7gmjV9i_wfLuvbDv7I6AnTABx71f_BLm37LV0WqsiPaEIQTw_8KsNgz.vGLY
	j5gkDspv6NqLLxD_5UiwiEwXrw7boMDB8QTCZAA--
X-Yahoo-SMTP: g0AhWW2swBA2djJKuhuwxPlPqLrHlDrycdPnfR9kZNrpKCA-
Received: from dell4550.localnet (jim_burn@184.36.206.203 with plain)
	by smtp108.sbc.mail.gq1.yahoo.com with SMTP;
	01 Nov 2011 12:52:24 -0700 PDT
From: jim burns <jim_burn@bellsouth.net>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] Problems with 'xl create winxp' (hvm) on xen 4.1.2
	(also affects GPLPV)
Date: Tue, 01 Nov 2011 15:52:14 -0400
Message-ID: <3160759.Xnf0bZpx0m@dell4550>
User-Agent: KMail/4.7.2 (Linux/2.6.37.6-0.7-default; KDE/4.7.2; i686; ; )
In-Reply-To: <1320151775.3084.16.camel@cthulhu.hellion.org.uk>
References: <1758215.SCbitK4oVy@dell4550> <15732981.uFr7VF8Mh1@dell4550>
	<1320151775.3084.16.camel@cthulhu.hellion.org.uk>
MIME-Version: 1.0
Content-Transfer-Encoding: 7Bit
Content-Type: text/plain; charset="us-ascii"
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue November 1 2011, 9:49:35 PM, Ian Campbell wrote:
> On Mon, 2011-10-31 at 19:00 -0400, jim burns wrote:
> > > that's the source of one of the missing features. Fixing it should
> > 
> > be a
> > 
> > > case of adding the option to libxl_domain_build_info in the IDL,
> > > reacting to it in libxl__build_device_model_args_old and
> > > libxl__build_device_model_args_new and parsing the config file
> > 
> > option
> > 
> > > into it in parse_config_data().
> > 
> > Hopefully, the fix for 3) (vncconsole=1) is just as simple.
> 
> Rather than having libxl__build_device..._args handling things I think
> you would want to call libxl_vncviewer_exec from xl, at roughly the same
> sort of place as libxl_console_exec is called when -c is passed to
> create, that is wherever autoconnect_console is called.
> 
> (aside: would a command line option similar to -c but for VNC be as/more
> useful than the vncauto thing in the cfg?).
>
Hmm - I suppose it would be more symmetric. You have '-c' for 'xm/xl create', 
corresponding to 'xm/xl console'. I suppose '-vnc' (or whatever) would then 
correspond to 'xm/xl vncviewer'.

I personally prefer the 'vncauto thing', as I always want to see the boot 
msgs, and I don't want to miss any because I forgot to add the option, and 
have to do a 'xm/xl vncviewer/console' after some of the msgs have scrolled 
away. (It's amazing how some stdout/errout msgs never make it into a log 
file.)


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 13:26:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 13:26:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLKuo-0005ol-3b; Tue, 01 Nov 2011 13:26:34 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLKtj-0005br-F1
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 13:25:27 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1320179123!1901029!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26120 invoked from network); 1 Nov 2011 20:25:24 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-4.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 20:25:24 -0000
X-IronPort-AV: E=Sophos;i="4.69,440,1315195200"; d="scan'208";a="18728366"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 16:25:22 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Tue, 1 Nov 2011
	16:25:21 -0400
Message-ID: <1320179117.3084.19.camel@cthulhu.hellion.org.uk>
Subject: Re: [Xen-devel] [PATCH] ioemu: Clone ioemu with --depth=1
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jean Guyader <jean.guyader@eu.citrix.com>
Date: Wed, 2 Nov 2011 05:25:17 +0900
In-Reply-To: <20111101173312.GH20553@spongy.cam.xci-test.com>
References: <20111101173312.GH20553@spongy.cam.xci-test.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Cc: Ian, "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Jackson <Ian.Jackson@eu.citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-11-01 at 13:33 -0400, Jean Guyader wrote:

<please insert rationale here>

> Signed-off-by: Jean Guyader <jean.guyader@citrix.com>

I suspect I know why but if someone has to run "git clone --help" to
figure out what the impact of a patch is that's a pretty good sign the
changelog is lacking.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 13:50:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 13:50:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLLHx-0006oE-08; Tue, 01 Nov 2011 13:50:29 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLLHC-0006bi-97
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 13:49:42 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1320180578!546853!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24100 invoked from network); 1 Nov 2011 20:49:39 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 20:49:39 -0000
X-IronPort-AV: E=Sophos;i="4.69,440,1315180800"; 
   d="scan'208";a="8704506"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 20:49:09 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 20:49:09 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RLLGe-0007Lz-M6;
	Tue, 01 Nov 2011 20:49:08 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RLLGe-0007J0-FZ;
	Tue, 01 Nov 2011 20:49:08 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9651-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 1 Nov 2011 20:49:08 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9651: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9651 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9651/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf      7 debian-install             fail REGR. vs. 9650

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  f60911281a1b
baseline version:
 xen                  0fea1ad50ce3

------------------------------------------------------------
People who touched revisions under test:
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Keir Fraser <keir@xen.org>
  Roger Pau Monne <roger.pau@entel.upc.edu>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

(No revision log; it would be 404 lines long.)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 13:56:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 13:56:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLLNy-0007RH-Gz; Tue, 01 Nov 2011 13:56:42 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLLNT-0007Fa-E8
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 13:56:12 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-14.tower-27.messagelabs.com!1320180851!42696198!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2501 invoked from network); 1 Nov 2011 20:54:12 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-14.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 20:54:12 -0000
X-Originating-Ip: [194.89.68.22]
Received: from ydin.reaktio.net (reaktio.net [194.89.68.22])
	by smtp.tele.fi (Postfix) with ESMTP id 06F552E67;
	Tue,  1 Nov 2011 22:56:07 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id D515920062; Tue,  1 Nov 2011 22:56:06 +0200 (EET)
Date: Tue, 1 Nov 2011 22:56:06 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Boris Derzhavets <bderzhavets@yahoo.com>
Subject: Re: [Xen-devel] Xen 4.1.2 HVM guest realtek nic problems (eth0
	8139cp transmit queue timed out) [PATCH]
Message-ID: <20111101205606.GK12984@reaktio.net>
References: <20111031184907.GA12984@reaktio.net>
	<1320089054.54459.YahooMailClassic@web65902.mail.ac4.yahoo.com>
	<20111031192924.GC12984@reaktio.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <20111031192924.GC12984@reaktio.net>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: xen@lists.fedoraproject.org, xen-devel@lists.xensource.com,
	Keir Fraser <keir@xen.org>, Keir Fraser <keir.xen@gmail.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Oct 31, 2011 at 09:29:24PM +0200, Pasi Kärkkäinen wrote:
> On Mon, Oct 31, 2011 at 12:24:14PM -0700, Boris Derzhavets wrote:
> >    Seems to related
> > 
> >    https://bugs.launchpad.net/ubuntu/+source/xen/+bug/854829
> > 
> 
> Thanks, that seems to be the same bug.
> 
> Is the bugfix patch from xen-unstable going to backported to xen-4.1-testing.hg ? 
> (4.1 backported patch available on ubuntu's launchpad above..)
> 

So the Ubuntu backport from xen-unstable to Xen 4.1.1 is here:
https://launchpadlibrarian.net/81948978/xen-pirq-resubmit-irq.patch

It seems to be shipping in Ubuntu 11.10 xen 4.1.1-2ubuntu4.1 packages.

Does that patch look suitable to be applied to xen-4.1-testing.hg ? 
This bug should be fixed for Xen 4.1.3.
 
-- Pasi


> 
> 
> >    Boris.
> > 
> >    --- On Mon, 10/31/11, Pasi Kärkkäinen <pasik@iki.fi> wrote:
> > 
> >      From: Pasi Kärkkäinen <pasik@iki.fi>
> >      Subject: [Xen-devel] Xen 4.1.2 HVM guest realtek nic problems (eth0
> >      8139cp transmit queue timed out)
> >      To: xen-devel@lists.xensource.com
> >      Date: Monday, October 31, 2011, 2:49 PM
> > 
> >      Hello,
> > 
> >      While testing Xen 4.1.2 and HVM guests I noticed the following problem
> >      with Fedora 16 HVM guests (using Linux 3.1.0 kernel in the VM):
> > 
> >      The errors (call trace) happens pretty much immediately when there's
> >      some network traffic going on..
> > 
> >      Simple "yum update" in the VM triggers the problem..
> > 
> >      [    0.000000] Linux version 3.1.0-5.fc16.x86_64
> >      ([1]mockbuild@x86-10.phx2.fedoraproject.org) (gcc version 4.6.1 20111003
> >      (Red Hat 4.6.1-10) (GCC) ) #1 SMP Thu Oct 27 03:46:50 UTC 2011
> >      [    0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.1.0-5.fc16.x86_64
> >      root=/dev/mapper/vg_f16test64hvm-lv_root ro
> >      rd.lvm.lv=vg_f16test64hvm/lv_root rd.dm=0 SYSFONT=latarcyrheb-sun16 rhgb
> >      KEYTABLE=fi rd.md=0 rd.luks=0 rd.lvm.lv=vg_f16test64hvm/lv_swap
> >      LANG=en_US.UTF-8 console=ttyS0,38400 console=tty0
> >      <snip>
> > 
> >      [   28.998481] 8139cp 0000:00:03.0: eth0: link up, 100Mbps, full-duplex,
> >      lpa 0x05E1
> >      [  149.712071] ------------[ cut here ]------------
> >      [  149.717216] WARNING: at net/sched/sch_generic.c:255
> >      dev_watchdog+0xf0/0x150()
> >      [  149.724709] Hardware name: HVM domU
> >      [  149.728738] NETDEV WATCHDOG: eth0 (8139cp): transmit queue 0 timed
> >      out
> >      [  149.735537] Modules linked in: ip6t_REJECT nf_conntrack_ipv6
> >      nf_defrag_ipv6 nf_conntrack_ipv4 nf_defrag_ipv4 ip6table_filter xt_state
> >      ip6_tables nf_conntrack 81
> >      39too 8139cp ppdev parport_pc mii parport i2c_piix4 i2c_core joydev
> >      [last unloaded: scsi_wait_scan]
> >      [  149.768028] Pid: 0, comm: swapper Not tainted 3.1.0-5.fc16.x86_64 #1
> >      [  149.774639] Call Trace:
> >      [  149.777765]  <IRQ>  [<ffffffff81057a56>]
> >      warn_slowpath_common+0x83/0x9b
> >      [  149.784024]  [<ffffffff81057b11>] warn_slowpath_fmt+0x46/0x48
> >      [  149.790141]  [<ffffffff813ef49d>] ? netif_tx_lock+0x4a/0x7c
> >      [  149.799007]  [<ffffffff813ef613>] dev_watchdog+0xf0/0x150
> >      [  149.806361]  [<ffffffff81064b51>] run_timer_softirq+0x19b/0x280
> >      [  149.814392]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd
> >      [  149.821650]  [<ffffffff813ef523>] ? netif_tx_unlock+0x54/0x54
> >      [  149.828926]  [<ffffffff8105d6b3>] __do_softirq+0xc9/0x1b5
> >      [  149.836803]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd
> >      [  149.843422]  [<ffffffff814be5ec>] call_softirq+0x1c/0x30
> >      [  149.850067]  [<ffffffff81010b45>] do_softirq+0x46/0x81
> >      [  149.856760]  [<ffffffff8105d97b>] irq_exit+0x57/0xb1
> >      [  149.863035]  [<ffffffff812a39d3>] xen_evtchn_do_upcall+0x31/0x3e
> >      [  149.871144]  [<ffffffff814be76e>] xen_hvm_callback_vector+0x6e/0x80
> >      [  149.879494]  <EOI>  [<ffffffff8102f2f1>] ? native_safe_halt+0xb/0xd
> >      [  149.888220]  [<ffffffff81015b7e>] default_idle+0x4e/0x86
> >      [  149.894962]  [<ffffffff8100e2ed>] cpu_idle+0xae/0xe8
> >      [  149.901461]  [<ffffffff814934ee>] rest_init+0x72/0x74
> >      [  149.908949]  [<ffffffff81b76b7d>] start_kernel+0x3ab/0x3b6
> >      [  149.916617]  [<ffffffff81b762c4>] x86_64_start_reservations+0xaf/0xb3
> >      [  149.929148]  [<ffffffff81b76140>] ? early_idt_handlers+0x140/0x140
> >      [  149.936797]  [<ffffffff81b763ca>] x86_64_start_kernel+0x102/0x111
> >      [  149.944336] ---[ end trace d8786cb7d6a57f8a ]---
> >      [  149.950406] 8139cp 0000:00:03.0: eth0: Transmit timeout, status
> >      d   3b   15 80ff
> >      [  149.961879] ------------[ cut here ]------------
> >      [  149.962245] WARNING: at kernel/softirq.c:159
> >      _local_bh_enable_ip+0x44/0x8e()
> >      [  149.962245] Hardware name: HVM domU
> >      [  149.962245] Modules linked in: ip6t_REJECT nf_conntrack_ipv6
> >      nf_defrag_ipv6 nf_conntrack_ipv4 nf_defrag_ipv4 ip6table_filter xt_state
> >      ip6_tables nf_conntrack 8139too 8139cp ppdev parport_pc mii parport
> >      i2c_piix4 i2c_core joydev [last unloaded: scsi_wait_scan]
> >      [  149.962245] Pid: 0, comm: swapper Tainted: G
> >      W   3.1.0-5.fc16.x86_64 #1
> >      [  149.962245] Call Trace:
> >      [  149.962245]  <IRQ>  [<ffffffff81057a56>]
> >      warn_slowpath_common+0x83/0x9b
> >      [  149.962245]  [<ffffffff813ce599>] ? skb_release_data+0xca/0xcf
> >      [  149.962245]  [<ffffffff81057a88>] warn_slowpath_null+0x1a/0x1c
> >      [  149.962245]  [<ffffffff8105d462>] _local_bh_enable_ip+0x44/0x8e
> >      [  149.962245]  [<ffffffff8105d4ba>] local_bh_enable_ip+0xe/0x10
> >      [  149.962245]  [<ffffffff814b5db4>] _raw_spin_unlock_bh+0x15/0x17
> >      [  149.962245]  [<ffffffffa0053969>] destroy_conntrack+0x9d/0xdc
> >      [nf_conntrack]
> >      [  149.962245]  [<ffffffff813fa343>] nf_conntrack_destroy+0x19/0x1b
> >      [  149.962245]  [<ffffffff813ce7ad>] skb_release_head_state+0xa7/0xef
> >      [  149.962245]  [<ffffffff813ce5b1>] __kfree_skb+0x13/0x83
> >      [  149.962245]  [<ffffffff813ce677>] consume_skb+0x56/0x6b
> >      [  149.962245]  [<ffffffffa003c1b9>] cp_clean_rings+0xb4/0x114 [8139cp]
> >      [  149.962245]  [<ffffffffa003c371>] cp_tx_timeout+0x88/0x10e [8139cp]
> >      [  149.962245]  [<ffffffff813ef627>] dev_watchdog+0x104/0x150
> >      [  149.962245]  [<ffffffff81064b51>] run_timer_softirq+0x19b/0x280
> >      [  149.962245]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd
> >      [  149.962245]  [<ffffffff813ef523>] ? netif_tx_unlock+0x54/0x54
> >      [  149.962245]  [<ffffffff8105d6b3>] __do_softirq+0xc9/0x1b5
> >      [  149.962245]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd
> >      [  149.962245]  [<ffffffff814be5ec>] call_softirq+0x1c/0x30
> >      [  149.962245]  [<ffffffff81010b45>] do_softirq+0x46/0x81
> >      [  149.962245]  [<ffffffff8105d97b>] irq_exit+0x57/0xb1
> >      [  149.962245]  [<ffffffff812a39d3>] xen_evtchn_do_upcall+0x31/0x3e
> >      [  149.962245]  [<ffffffff814be76e>] xen_hvm_callback_vector+0x6e/0x80
> >      [  149.962245]  <EOI>  [<ffffffff8102f2f1>] ? native_safe_halt+0xb/0xd
> >      [  149.962245]  [<ffffffff81015b7e>] default_idle+0x4e/0x86
> >      [  149.962245]  [<ffffffff8100e2ed>] cpu_idle+0xae/0xe8
> >      [  149.962245]  [<ffffffff814934ee>] rest_init+0x72/0x74
> >      [  149.962245]  [<ffffffff81b76b7d>] start_kernel+0x3ab/0x3b6
> >      [  149.962245]  [<ffffffff81b762c4>] x86_64_start_reservations+0xaf/0xb3
> >      [  149.962245]  [<ffffffff81b76140>] ? early_idt_handlers+0x140/0x140
> >      [  149.962245]  [<ffffffff81b763ca>] x86_64_start_kernel+0x102/0x111
> >      [  149.962245] ---[ end trace d8786cb7d6a57f8b ]---
> > 
> >      Full guest kernel dmesg attached to this email.
> >      The host is running F16 with Xen 4.1.2 and Linux 3.1.0 dom0 kernel.
> > 
> >      Xen cfgfile for the HVM domain:
> > 
> >      kernel = "hvmloader"
> >      builder='hvm'
> >      device_model = 'qemu-dm'
> >      name = "f16test64hvm"
> >      memory = 1024
> >      vcpus=1
> >      pae=1
> >      acpi=1
> >      apic=1
> >      vif = [ 'type=ioemu, mac=00:16:3f:03:01:14, bridge=virbr0' ]
> >      disk = [ 'phy:/dev/vg_f16/f16test64hvm,hda,w',
> >      'file:/root/iso/Fedora-16-Final-RC2-x86_64-DVD.iso,hdc:cdrom,r' ]
> >      boot='cd'
> >      xen_platform_pci=0
> >      on_poweroff = 'destroy'
> >      on_reboot   = 'restart'
> >      on_crash    = 'restart'
> >      sdl=0
> >      vnc=1
> >      vncpasswd=''
> >      stdvga=0
> >      serial='pty'
> >      tsc_mode=0
> >      usb=1
> >      usbdevice='tablet'
> >      keymap='fi'
> > 
> >      Using "model=e1000" instead for the vif works OK.. no problems with the
> >      emulated intel nic.
> > 
> >      Any ideas what the problem with the emulated realtek nic?
> > 
> >      Thanks,
> > 
> >      -- Pasi
> > 
> >      -----Inline Attachment Follows-----
> > 
> >      _______________________________________________
> >      Xen-devel mailing list
> >      [2]Xen-devel@lists.xensource.com
> >      [3]http://lists.xensource.com/xen-devel
> > 
> > References
> > 
> >    Visible links
> >    1. file:///mc/compose?to=mockbuild@x86-10.phx2.fedoraproject.org
> >    2. file:///mc/compose?to=Xen-devel@lists.xensource.com
> >    3. http://lists.xensource.com/xen-devel
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 13:58:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 13:58:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLLPx-0007qk-OW; Tue, 01 Nov 2011 13:58:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLLOW-0007dI-Qw
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 13:57:17 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-12.tower-21.messagelabs.com!1320181033!2520951!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19738 invoked from network); 1 Nov 2011 20:57:13 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-12.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 20:57:13 -0000
X-Originating-Ip: [194.89.68.22]
Received: from ydin.reaktio.net (reaktio.net [194.89.68.22])
	by smtp.tele.fi (Postfix) with ESMTP id AC8121B4E;
	Tue,  1 Nov 2011 22:57:12 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 842B520062; Tue,  1 Nov 2011 22:57:12 +0200 (EET)
Date: Tue, 1 Nov 2011 22:57:12 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Boris Derzhavets <bderzhavets@yahoo.com>
Subject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark with
	Ubuntu 11.10
Message-ID: <20111101205712.GL12984@reaktio.net>
References: <4EAFD891.8000204@icg.tugraz.at>
	<1320149947.1840.YahooMailClassic@web65918.mail.ac4.yahoo.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <1320149947.1840.YahooMailClassic@web65918.mail.ac4.yahoo.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: xen-devel@lists.xensource.com, dokter@icg.tugraz.at
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 01, 2011 at 05:19:07AM -0700, Boris Derzhavets wrote:
> Pasi,
> 
> Have you asked yourself a question why Fedora and Ubuntu always patch and
> package
> Qemu-kvm-0.15(14)(13)(..).1.tar.gz , but not  Qemu-0.15(14)(13)(..).1.tar.gz ?
> Just install a couple of src.rpms to take a look - what's inside.
> 

I assume that's because full kvm support hasn't be merged to upstream qemu
so they need to ship separate qemu-kvm package.

-- Pasi

> 
> --- On Tue, 11/1/11, Mark Dokter <dokter@icg.tugraz.at> wrote:
> 
>   From: Mark Dokter <dokter@icg.tugraz.at>
>   Subject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark with
>   Ubuntu 11.10
>   To: xen-devel@lists.xensource.com
>   Date: Tuesday, November 1, 2011, 7:31 AM
> 
>   On 10/31/2011 10:40 PM, Pasi Kärkkäinen wrote:
>   > Hello,
>   >
> 
>   Hi!
> 
>   >
>   [1]http://www.phoronix.com/scan.php?page=article&item=ubuntu_1110_xenkvm&num=1
>   >
>   > Ubuntu 11.10 with Xen 4.1.1 and Linux 3.0.
>   >
> 
>   I've read the article and was surprised.
> 
>   > Xen seems to be doing very poorly on that benchmark.
>   > If someone has time to repeat that benchmark it would be good..
>   >
>   > Comparing the results to those from Stefano from XenSummit 2011 NA there has
>   be something wrong..
>   > the results at XenSummit were pretty much the opposite compared to those by
>   Phoronix.
>   >
> 
>   In that test, the KVM machine uses virtio disk and nic devices, while
>   the Xen machine uses the qemu emulated devices. Could that be the cause
>   for the poor performance?
> 
>   > -- Pasi
> 
>   Mark
> 
>   _______________________________________________
>   Xen-devel mailing list
>   [2]Xen-devel@lists.xensource.com
>   [3]http://lists.xensource.com/xen-devel
> 
> References
> 
>    Visible links
>    1. http://www.phoronix.com/scan.php?page=article&item=ubuntu_1110_xenkvm&num=1
>    2. file:///mc/compose?to=Xen-devel@lists.xensource.com
>    3. http://lists.xensource.com/xen-devel

> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 14:33:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 14:33:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLLx7-0000JZ-Gz; Tue, 01 Nov 2011 14:33:01 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLLwC-00005N-41
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 14:32:04 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-3.tower-21.messagelabs.com!1320183120!2572302!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10254 invoked from network); 1 Nov 2011 21:32:00 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-3.tower-21.messagelabs.com with SMTP;
	1 Nov 2011 21:32:00 -0000
Received: from tarius.tycho.ncsc.mil (localhost [127.0.0.1])
	by msux-gh1-uea02.nsa.gov (8.12.10/8.12.10) with ESMTP id
	pA1LVvFD020820; Tue, 1 Nov 2011 21:31:57 GMT
Received: from moss-nexus.epoch.ncsc.mil (moss-nexus [144.51.25.48])
	by tarius.tycho.ncsc.mil (8.13.1/8.13.1) with ESMTP id pA1LVvVW005056; 
	Tue, 1 Nov 2011 17:31:57 -0400
Message-ID: <4EB0655F.5080107@tycho.nsa.gov>
Date: Tue, 01 Nov 2011 17:32:15 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Organization: National Security Agency
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Jean Guyader <jean.guyader@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH] ioemu: Clone ioemu with --depth=1
References: <20111101173312.GH20553@spongy.cam.xci-test.com>
In-Reply-To: <20111101173312.GH20553@spongy.cam.xci-test.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/01/2011 01:33 PM, Jean Guyader wrote:
> 
> Signed-off-by: Jean Guyader <jean.guyader@citrix.com>
> 
> diff --git a/tools/Makefile b/tools/Makefile
> index 9389e1f..6c1dfe0 100644
> --- a/tools/Makefile
> +++ b/tools/Makefile
> @@ -92,7 +92,7 @@ ioemu-dir-find:
>  		if [ ! -d ioemu-remote ]; then \
>  			rm -rf ioemu-remote ioemu-remote.tmp; \
>  			mkdir ioemu-remote.tmp; rmdir ioemu-remote.tmp; \
> -			$(GIT) clone $(CONFIG_QEMU) ioemu-remote.tmp; \
> +			$(GIT) clone --depth=1 $(CONFIG_QEMU) ioemu-remote.tmp; \
>  			if [ "$(QEMU_TAG)" ]; then			\
>  				cd ioemu-remote.tmp;			\
>  				$(GIT) branch -D dummy >/dev/null 2>&1 ||:; \

This will break if QEMU_TAG is pointing to any commit that is more than
one commit away from a branch or tag in the source repository. In order
to allow using older xen repositories, this requires that every update
to QEMU_TAG in xen-*.hg also add a tag or branch to the git repository.

It would be nice if you could use git clone --branch $(QEMU_TAG)
but this is not supported when $(QEMU_TAG) is a commit ID.

-- 
Daniel De Graaf
National Security Agency

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 14:44:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 14:44:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLM85-0000uB-6a; Tue, 01 Nov 2011 14:44:21 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLM7U-0000hY-PJ
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 14:43:45 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-3.tower-216.messagelabs.com!1320183821!1927786!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30122 invoked from network); 1 Nov 2011 21:43:41 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-3.tower-216.messagelabs.com with SMTP;
	1 Nov 2011 21:43:41 -0000
Received: from [192.168.100.16] (87-194-71-186.bethere.co.uk [87.194.71.186])
	by mail.avalus.com (Postfix) with ESMTPSA id 9EF6BC56102;
	Tue,  1 Nov 2011 21:43:40 +0000 (GMT)
Date: Tue, 01 Nov 2011 21:43:40 +0000
From: Alex Bligh <alex@alex.org.uk>
To: =?UTF-8?Q?Pasi_K=C3=A4rkk=C3=A4inen?= <pasik@iki.fi>,
	Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark
	with	Ubuntu 11.10
Message-ID: <C400AA9BBFCB73CAD5B1159E@nimrod.local>
In-Reply-To: <20111101132639.GH12984@reaktio.net>
References: <20111031214036.GG12984@reaktio.net>
	<4EAFD891.8000204@icg.tugraz.at>
	<1320148634.3084.12.camel@cthulhu.hellion.org.uk>
	<20111101132639.GH12984@reaktio.net>
X-Mailer: Mulberry/4.0.8 (Mac OS X)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com, Alex Bligh <alex@alex.org.uk>,
	dokter@icg.tugraz.at
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: Alex Bligh <alex@alex.org.uk>
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com



--On 1 November 2011 15:26:39 +0200 Pasi K=C3=A4rkk=C3=A4inen =
<pasik@iki.fi> wrote:

> Actually the first page of the article says:
> "The only Xen issue encountered when testing it with an Ubuntu 11.10
> guest and host was the need for manually loading the xen-blkfront driver
> for disk support."
>
> So it sounds like they actually did use PVHVM drivers..

Allegedly 11.10 supports Xen out the box. However, the installer does not
ship with the PV drivers in, which causes the IDE driver to be unplugged
and thus means the installer can't access its disk. It requires substantial
fiddling to fix this. It thus wouldn't entirely surprise me if they weren't
actually using PV drivers even if they thought they were.

An alternative explanation is that by default KVM uses write-through
caching (i.e. read caching) on block devices on Ubuntu in dom0. I don't
know what Xen uses by default on 4.1.1, but certainly this makes KVM
outperforms Xen 3.3 (where there is no such caching) using naive testing on
our platforms.

The article also does not say what the block devices were backended onto.
As discussed ad nauseam here at the end of last week, distributions do not
ship with blktap (certainly Ubuntu doesn't), so unless they are using
blkback and partitions, it will use (if I remember this right) the Qemu
drivers and be slow. Certainly my take away from the thread last week was
that there was no chance of decent performance with a file backed block
device (without loopback mount). I have to say, getting Xen 4.1 to work was
non-trivial, even though we have working 3.1 configs. Getting kvm to work
and work well was incredibly simple. So it's quite possible Phoronix
stumbled into a non-optimal configuration.

--=20
Alex Bligh

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 14:53:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 14:53:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLMGS-0001Pe-1a; Tue, 01 Nov 2011 14:53:00 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLMFx-0001Dp-AA
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 14:52:29 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1320184345!1941058!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5502 invoked from network); 1 Nov 2011 21:52:26 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-9.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 21:52:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,440,1315195200"; d="scan'208";a="18732853"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 17:52:24 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.65) with Microsoft SMTP Server id 8.3.137.0; Tue, 1 Nov 2011
	17:52:23 -0400
Message-ID: <1320184340.3084.23.camel@cthulhu.hellion.org.uk>
Subject: Re: [Xen-devel] [PATCH] ioemu: Clone ioemu with --depth=1
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Date: Wed, 2 Nov 2011 06:52:20 +0900
In-Reply-To: <4EB0655F.5080107@tycho.nsa.gov>
References: <20111101173312.GH20553@spongy.cam.xci-test.com>
	<4EB0655F.5080107@tycho.nsa.gov>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Jean Guyader <Jean.Guyader@citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-11-01 at 17:32 -0400, Daniel De Graaf wrote:
> On 11/01/2011 01:33 PM, Jean Guyader wrote:
> > 
> > Signed-off-by: Jean Guyader <jean.guyader@citrix.com>
> > 
> > diff --git a/tools/Makefile b/tools/Makefile
> > index 9389e1f..6c1dfe0 100644
> > --- a/tools/Makefile
> > +++ b/tools/Makefile
> > @@ -92,7 +92,7 @@ ioemu-dir-find:
> >  		if [ ! -d ioemu-remote ]; then \
> >  			rm -rf ioemu-remote ioemu-remote.tmp; \
> >  			mkdir ioemu-remote.tmp; rmdir ioemu-remote.tmp; \
> > -			$(GIT) clone $(CONFIG_QEMU) ioemu-remote.tmp; \
> > +			$(GIT) clone --depth=1 $(CONFIG_QEMU) ioemu-remote.tmp; \
> >  			if [ "$(QEMU_TAG)" ]; then			\
> >  				cd ioemu-remote.tmp;			\
> >  				$(GIT) branch -D dummy >/dev/null 2>&1 ||:; \
> 
> This will break if QEMU_TAG is pointing to any commit that is more than
> one commit away from a branch or tag in the source repository.

Good point. We could do e.g. --depth=2000 which takes history back to
some time in 2007.

On the other hand a full clone takes ~30s and a --depth=2000 takes ~20s
(both elapsed wallclock times) so it's not clear that there is all that
much benefit in the context of how long everything actually takes to
build, especially given the big clone only happens once per build tree.

>  In order
> to allow using older xen repositories, this requires that every update
> to QEMU_TAG in xen-*.hg also add a tag or branch to the git repository.
> 
> It would be nice if you could use git clone --branch $(QEMU_TAG)
> but this is not supported when $(QEMU_TAG) is a commit ID.
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 15:10:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 15:10:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLMXI-0002BJ-0x; Tue, 01 Nov 2011 15:10:24 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLMVL-0001xH-Fx
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 15:08:28 -0700
X-Env-Sender: jean.guyader@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320185264!61549163!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8982 invoked from network); 1 Nov 2011 22:07:45 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 22:07:45 -0000
Received: by qabg1 with SMTP id g1so9651960qab.30
	for <xen-devel@lists.xensource.com>;
	Tue, 01 Nov 2011 15:08:19 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:from:date:message-id:subject:to
	:cc:content-type:content-transfer-encoding;
	bh=r6agtwMGU7PdaDtOENJdPZqXZhl1h1ETJyBSYTTaeNE=;
	b=eJFbspSors+n0gtq2IXPKMQspnZdSVLkbaM6CeBYEQL9N6r7PH9t9AKPDjZFcXTcVV
	GvOW3oR22KE2771dTKuMieaPgeKgTIbJoVbsNG1f0WY9HlR+c1QcwWdiPKpoN4+3k4WK
	VxqNoiVVonA/5zzib27dMYEnJr56szr9kwjt4=
Received: by 10.182.44.9 with SMTP id a9mr303697obm.61.1320185299074; Tue, 01
	Nov 2011 15:08:19 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.182.11.34 with HTTP; Tue, 1 Nov 2011 15:07:58 -0700 (PDT)
In-Reply-To: <4EB0655F.5080107@tycho.nsa.gov>
References: <20111101173312.GH20553@spongy.cam.xci-test.com>
	<4EB0655F.5080107@tycho.nsa.gov>
From: Jean Guyader <jean.guyader@gmail.com>
Date: Tue, 1 Nov 2011 22:07:58 +0000
Message-ID: <CAEBdQ91hEbRdEtG7xaQKmPWYfPf0o6dUH9SPtPEv_SBJ6cT8Uw@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] ioemu: Clone ioemu with --depth=1
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Jean Guyader <jean.guyader@eu.citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 1 November 2011 21:32, Daniel De Graaf <dgdegra@tycho.nsa.gov> wrote:
> On 11/01/2011 01:33 PM, Jean Guyader wrote:
>>
>> Signed-off-by: Jean Guyader <jean.guyader@citrix.com>
>>
>> diff --git a/tools/Makefile b/tools/Makefile
>> index 9389e1f..6c1dfe0 100644
>> --- a/tools/Makefile
>> +++ b/tools/Makefile
>> @@ -92,7 +92,7 @@ ioemu-dir-find:
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 if [ ! -d ioemu-remote ]; then \
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 rm -rf ioemu-remote ioemu-re=
mote.tmp; \
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mkdir ioemu-remote.tmp; rmdi=
r ioemu-remote.tmp; \
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 $(GIT) clone $(CONFIG_QEMU) io=
emu-remote.tmp; \
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 $(GIT) clone --depth=3D1 $(CON=
FIG_QEMU) ioemu-remote.tmp; \
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if [ "$(QEMU_TAG)" ]; then =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0\
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 cd ioemu-rem=
ote.tmp; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0\
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 $(GIT) branc=
h -D dummy >/dev/null 2>&1 ||:; \
>
> This will break if QEMU_TAG is pointing to any commit that is more than
> one commit away from a branch or tag in the source repository. In order
> to allow using older xen repositories, this requires that every update
> to QEMU_TAG in xen-*.hg also add a tag or branch to the git repository.
>
> It would be nice if you could use git clone --branch $(QEMU_TAG)
> but this is not supported when $(QEMU_TAG) is a commit ID.
>

Yes, that a good point.
I think we should use --depth=3D1 only when QEMU_TAG isn't set.

Jean

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 15:17:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 15:17:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLMdk-0002jh-6Q; Tue, 01 Nov 2011 15:17:04 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLMdB-0002XF-9x
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 15:16:29 -0700
X-Env-Sender: jean.guyader@gmail.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1320185784!2537556!1
X-Originating-IP: [209.85.216.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18615 invoked from network); 1 Nov 2011 22:16:25 -0000
Received: from mail-qy0-f171.google.com (HELO mail-qy0-f171.google.com)
	(209.85.216.171)
	by server-10.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 22:16:25 -0000
Received: by qyk33 with SMTP id 33so6394955qyk.9
	for <xen-devel@lists.xensource.com>;
	Tue, 01 Nov 2011 15:16:24 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:from:date:message-id:subject:to
	:cc:content-type:content-transfer-encoding;
	bh=OFt9yHdosonzUcoX5fLqUFmOfZIa8fOe9TQWlhu7Kj8=;
	b=NSrx6jHPp+iD3/NhLlZOHRTrX2cwLET2+McyT7SbKSIK3owH5zfJQfLV3H12kitZV7
	kDD5ageoOjCQbK2lBe0ppGpyb6u0ANVl3AoXgHDMmXOKUmMW9K2UzsndmqdQkDmUO1NX
	aoVnV0Oqb2X6DTdN3DfVjEtwD1KsmQj6VI+ZE=
Received: by 10.182.202.68 with SMTP id kg4mr337559obc.21.1320185784136; Tue,
	01 Nov 2011 15:16:24 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.182.11.34 with HTTP; Tue, 1 Nov 2011 15:16:03 -0700 (PDT)
In-Reply-To: <1320184340.3084.23.camel@cthulhu.hellion.org.uk>
References: <20111101173312.GH20553@spongy.cam.xci-test.com>
	<4EB0655F.5080107@tycho.nsa.gov>
	<1320184340.3084.23.camel@cthulhu.hellion.org.uk>
From: Jean Guyader <jean.guyader@gmail.com>
Date: Tue, 1 Nov 2011 22:16:03 +0000
Message-ID: <CAEBdQ90x9FTW6L5njV3GDbTqmKDtuOGfe1nL23ZgfgoT2Tk_cA@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] ioemu: Clone ioemu with --depth=1
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Jean Guyader <Jean.Guyader@citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 1 November 2011 21:52, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> On Tue, 2011-11-01 at 17:32 -0400, Daniel De Graaf wrote:
>> On 11/01/2011 01:33 PM, Jean Guyader wrote:
>> >
>> > Signed-off-by: Jean Guyader <jean.guyader@citrix.com>
>> >
>> > diff --git a/tools/Makefile b/tools/Makefile
>> > index 9389e1f..6c1dfe0 100644
>> > --- a/tools/Makefile
>> > +++ b/tools/Makefile
>> > @@ -92,7 +92,7 @@ ioemu-dir-find:
>> > =A0 =A0 =A0 =A0 =A0 =A0 if [ ! -d ioemu-remote ]; then \
>> > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 rm -rf ioemu-remote ioemu-remo=
te.tmp; \
>> > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mkdir ioemu-remote.tmp; rmdir =
ioemu-remote.tmp; \
>> > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 $(GIT) clone $(CONFIG_QEMU) ioem=
u-remote.tmp; \
>> > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 $(GIT) clone --depth=3D1 $(CONFI=
G_QEMU) ioemu-remote.tmp; \
>> > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if [ "$(QEMU_TAG)" ]; then =A0=
 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0\
>> > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 cd ioemu-remot=
e.tmp; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0\
>> > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 $(GIT) branch =
-D dummy >/dev/null 2>&1 ||:; \
>>
>> This will break if QEMU_TAG is pointing to any commit that is more than
>> one commit away from a branch or tag in the source repository.
>
> Good point. We could do e.g. --depth=3D2000 which takes history back to
> some time in 2007.
>
> On the other hand a full clone takes ~30s and a --depth=3D2000 takes ~20s
> (both elapsed wallclock times) so it's not clear that there is all that
> much benefit in the context of how long everything actually takes to
> build, especially given the big clone only happens once per build tree.
>

I don't think it's fair to measure things in seconds here since it's very m=
uch
depend on the Internet connection people are using. When building tip
of xen-unstable
we are actually downloading 3 times as much data that we actually need
(9.9M instead of 29.11M).

I figured that if we don't need to download everything to build we
shouldn't. I submitted a patch
because I ended up downloading the tree manually to speed thing up,
but if you think my patch isn't
appropriate that is fine.

I think this sort of patch would have a much bigger impact when we are
cloning the Linux
kernel.

Jean

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 15:19:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 15:19:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLMff-00038z-Ps; Tue, 01 Nov 2011 15:19:03 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLMfF-0002wm-CO
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 15:18:37 -0700
X-Env-Sender: jean.guyader@gmail.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320185913!2535842!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9553 invoked from network); 1 Nov 2011 22:18:34 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 22:18:34 -0000
Received: by qabg1 with SMTP id g1so9662135qab.30
	for <xen-devel@lists.xensource.com>;
	Tue, 01 Nov 2011 15:18:33 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:from:date:message-id:subject:to
	:cc:content-type;
	bh=xcs0/txE6+c5PFySI0Y3vik2A2HtvMZ7G4Px/bfgGBg=;
	b=CQGPeMgTDT2dTb6cvDKUIbwEI7bKTvRMDucNt/HPnq3RySXKwqNsDtIboq7RPURS/6
	VF6XSehDStqF2eyYc4wy0+o47xYB0bLCm1HRkgNRGp4RDlIt7Y5MCtB2E0goYOv8oCY6
	VEHvMB8f37WizFkNh4vWmuGjTp8TMVZPcxPNU=
Received: by 10.182.44.9 with SMTP id a9mr310642obm.61.1320185913055; Tue, 01
	Nov 2011 15:18:33 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.182.11.34 with HTTP; Tue, 1 Nov 2011 15:18:12 -0700 (PDT)
In-Reply-To: <1320179117.3084.19.camel@cthulhu.hellion.org.uk>
References: <20111101173312.GH20553@spongy.cam.xci-test.com>
	<1320179117.3084.19.camel@cthulhu.hellion.org.uk>
From: Jean Guyader <jean.guyader@gmail.com>
Date: Tue, 1 Nov 2011 22:18:12 +0000
Message-ID: <CAEBdQ93wtdwmnZ=JVVrTOm0jEbc-yeUfaMSs-jhJFgmEs0gdow@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] ioemu: Clone ioemu with --depth=1
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=ISO-8859-1
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Jackson <Ian.Jackson@eu.citrix.com>,
	Jean Guyader <jean.guyader@eu.citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 1 November 2011 20:25, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> On Tue, 2011-11-01 at 13:33 -0400, Jean Guyader wrote:
>
> <please insert rationale here>
>
>> Signed-off-by: Jean Guyader <jean.guyader@citrix.com>
>
> I suspect I know why but if someone has to run "git clone --help" to
> figure out what the impact of a patch is that's a pretty good sign the
> changelog is lacking.
>

Ok I couldn't figure out something better than what the man page said
so I didn't put anything. I'll be more verbose next time.

Jean

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 16:03:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 16:03:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLNN7-0004WF-Fr; Tue, 01 Nov 2011 16:03:57 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLNK5-0004GE-04
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 16:01:22 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1320188442!2540350!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18749 invoked from network); 1 Nov 2011 23:00:43 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-16.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 23:00:43 -0000
X-IronPort-AV: E=Sophos;i="4.69,440,1315195200"; d="scan'208";a="169017466"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 19:00:42 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Tue, 1 Nov 2011
	19:00:42 -0400
Message-ID: <1320188437.3084.28.camel@cthulhu.hellion.org.uk>
Subject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark with
	Ubuntu 11.10
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Pasi =?ISO-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
Date: Wed, 2 Nov 2011 08:00:37 +0900
In-Reply-To: <20111101132639.GH12984@reaktio.net>
References: <20111031214036.GG12984@reaktio.net>
	<4EAFD891.8000204@icg.tugraz.at>
	<1320148634.3084.12.camel@cthulhu.hellion.org.uk>
	<20111101132639.GH12984@reaktio.net>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 8bit
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"dokter@icg.tugraz.at" <dokter@icg.tugraz.at>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-11-01 at 09:26 -0400, Pasi KÃ¤rkkÃ¤inen wrote:
> On Tue, Nov 01, 2011 at 08:57:14PM +0900, Ian Campbell wrote:
> > On Tue, 2011-11-01 at 07:31 -0400, Mark Dokter wrote:
> > > In that test, the KVM machine uses virtio disk and nic devices, while
> > > the Xen machine uses the qemu emulated devices. Could that be the cause
> > > for the poor performance?
> > 
> > Very much so. Without using the PVHVM drivers in the Xen case this is
> > very much an apples to oranges comparison.
> > 
> 
> Actually the first page of the article says:
> "The only Xen issue encountered when testing it with an Ubuntu 11.10
> guest and host was the need for manually loading the xen-blkfront
> driver for disk support."
> 
> So it sounds like they actually did use PVHVM drivers..

Perhaps, the table of configuration details doesn't make it particularly
obvious (and as Alex points out they may not have been running what they
thought). Also as Alex mentioned it's not obvious which backend they
used in each case, e.g. the qemu based disk backend is not known to be
all that great.

It'd definitely be worth someone having a go at repeating even one of
the benchmarks where we did badly, to rule out these sorts of slip ups.

Ian.
> 
> -- Pasi
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 16:09:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 16:09:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLNSn-0004zt-KH; Tue, 01 Nov 2011 16:09:50 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLNRq-0004n4-Kl
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 16:08:52 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1320188898!55579751!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17619 invoked from network); 1 Nov 2011 23:08:19 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 23:08:19 -0000
X-IronPort-AV: E=Sophos;i="4.69,440,1315195200"; d="scan'208";a="18734354"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 19:08:45 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.65) with Microsoft SMTP Server id 8.3.137.0; Tue, 1 Nov 2011
	19:08:45 -0400
Message-ID: <1320188921.3084.30.camel@cthulhu.hellion.org.uk>
Subject: Re: [Xen-devel] [PATCH] ioemu: Clone ioemu with --depth=1
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jean Guyader <jean.guyader@gmail.com>
Date: Wed, 2 Nov 2011 08:08:41 +0900
In-Reply-To: <CAEBdQ93wtdwmnZ=JVVrTOm0jEbc-yeUfaMSs-jhJFgmEs0gdow@mail.gmail.com>
References: <20111101173312.GH20553@spongy.cam.xci-test.com>
	<1320179117.3084.19.camel@cthulhu.hellion.org.uk>
	<CAEBdQ93wtdwmnZ=JVVrTOm0jEbc-yeUfaMSs-jhJFgmEs0gdow@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Jean Guyader <Jean.Guyader@citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-11-01 at 18:18 -0400, Jean Guyader wrote:
> On 1 November 2011 20:25, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > On Tue, 2011-11-01 at 13:33 -0400, Jean Guyader wrote:
> >
> > <please insert rationale here>
> >
> >> Signed-off-by: Jean Guyader <jean.guyader@citrix.com>
> >
> > I suspect I know why but if someone has to run "git clone --help" to
> > figure out what the impact of a patch is that's a pretty good sign the
> > changelog is lacking.
> >
> 
> Ok I couldn't figure out something better than what the man page said
> so I didn't put anything. I'll be more verbose next time.

Well, the rationale is not "what does git clone --depth" do but rather
"why do I want --depth in this case". I think you've explained that in
the other subthread though.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 16:11:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 16:11:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLNUH-0005Nq-IG; Tue, 01 Nov 2011 16:11:21 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLNTl-0005BO-9A
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 16:10:49 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320189020!51108106!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21246 invoked from network); 1 Nov 2011 23:10:21 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 23:10:21 -0000
X-IronPort-AV: E=Sophos;i="4.69,440,1315195200"; d="scan'208";a="18734375"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 19:10:44 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.65) with Microsoft SMTP Server id 8.3.137.0; Tue, 1 Nov 2011
	19:10:43 -0400
Message-ID: <1320189039.3084.32.camel@cthulhu.hellion.org.uk>
Subject: Re: [Xen-devel] [PATCH] ioemu: Clone ioemu with --depth=1
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jean Guyader <jean.guyader@gmail.com>
Date: Wed, 2 Nov 2011 08:10:39 +0900
In-Reply-To: <CAEBdQ90x9FTW6L5njV3GDbTqmKDtuOGfe1nL23ZgfgoT2Tk_cA@mail.gmail.com>
References: <20111101173312.GH20553@spongy.cam.xci-test.com>
	<4EB0655F.5080107@tycho.nsa.gov>
	<1320184340.3084.23.camel@cthulhu.hellion.org.uk>
	<CAEBdQ90x9FTW6L5njV3GDbTqmKDtuOGfe1nL23ZgfgoT2Tk_cA@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Jean Guyader <Jean.Guyader@citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-11-01 at 18:16 -0400, Jean Guyader wrote:
> On 1 November 2011 21:52, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > On Tue, 2011-11-01 at 17:32 -0400, Daniel De Graaf wrote:
> >> On 11/01/2011 01:33 PM, Jean Guyader wrote:
> >> >
> >> > Signed-off-by: Jean Guyader <jean.guyader@citrix.com>
> >> >
> >> > diff --git a/tools/Makefile b/tools/Makefile
> >> > index 9389e1f..6c1dfe0 100644
> >> > --- a/tools/Makefile
> >> > +++ b/tools/Makefile
> >> > @@ -92,7 +92,7 @@ ioemu-dir-find:
> >> >             if [ ! -d ioemu-remote ]; then \
> >> >                     rm -rf ioemu-remote ioemu-remote.tmp; \
> >> >                     mkdir ioemu-remote.tmp; rmdir ioemu-remote.tmp; \
> >> > -                   $(GIT) clone $(CONFIG_QEMU) ioemu-remote.tmp; \
> >> > +                   $(GIT) clone --depth=1 $(CONFIG_QEMU) ioemu-remote.tmp; \
> >> >                     if [ "$(QEMU_TAG)" ]; then                      \
> >> >                             cd ioemu-remote.tmp;                    \
> >> >                             $(GIT) branch -D dummy >/dev/null 2>&1 ||:; \
> >>
> >> This will break if QEMU_TAG is pointing to any commit that is more than
> >> one commit away from a branch or tag in the source repository.
> >
> > Good point. We could do e.g. --depth=2000 which takes history back to
> > some time in 2007.
> >
> > On the other hand a full clone takes ~30s and a --depth=2000 takes ~20s
> > (both elapsed wallclock times) so it's not clear that there is all that
> > much benefit in the context of how long everything actually takes to
> > build, especially given the big clone only happens once per build tree.
> >
> 
> I don't think it's fair to measure things in seconds here since it's very much
> depend on the Internet connection people are using. When building tip
> of xen-unstable we are actually downloading 3 times as much data that we actually need
> (9.9M instead of 29.11M).

Fair enough.

> I figured that if we don't need to download everything to build we
> shouldn't. I submitted a patch
> because I ended up downloading the tree manually to speed thing up,
> but if you think my patch isn't
> appropriate that is fine.

If we can resolve the issue which Daniel points out then I have no
problem with it conceptually.

> I think this sort of patch would have a much bigger impact when we are
> cloning the Linux kernel.

Note that the Xen build system doesn't clone a Linux kernel any more.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 16:15:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 16:15:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLNYZ-0005zk-Hd; Tue, 01 Nov 2011 16:15:47 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLNXs-0005hp-5a
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 16:15:04 -0700
X-Env-Sender: greg@kroah.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320189275!51108341!1
X-Originating-IP: [66.111.4.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24903 invoked from network); 1 Nov 2011 23:14:36 -0000
Received: from out4.smtp.messagingengine.com (HELO
	out4.smtp.messagingengine.com) (66.111.4.28)
	by server-9.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 23:14:36 -0000
Received: from compute1.internal (compute1.nyi.mail.srv.osa [10.202.2.41])
	by gateway1.nyi.mail.srv.osa (Postfix) with ESMTP id 063F220997;
	Tue,  1 Nov 2011 19:15:00 -0400 (EDT)
Received: from frontend1.nyi.mail.srv.osa ([10.202.2.160])
	by compute1.internal (MEProxy); Tue, 01 Nov 2011 19:15:00 -0400
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=date:from:to:cc:subject:message-id
	:references:mime-version:content-type:in-reply-to; s=smtpout;
	bh=GptuwjAiZzPmn6O8Tz/SU4rmQns=; b=cMOOlDBPrlytAaNYxtpJ7YEkoJoQ
	ApQns/7lD5HZF6bg2G5RMq6G2kNuWwDX0iV5aRo52xZKBL2V6O9UiIIm2L/VvigX
	zv+JfIxsiD44MXMmIvB5NweRd8VlCsKTKL6O2SC2Gw6LwL/iOwHx4NNV6z+6Sk2A
	Cowa6Vl7mCk1guo=
X-Sasl-enc: OxbbGnvK3Kcw/9GtFtsGp7TtSTDSuFyKvUHMoYvA0vhF 1320189299
Received: from localhost (c-76-121-69-168.hsd1.wa.comcast.net [76.121.69.168])
	by mail.messagingengine.com (Postfix) with ESMTPSA id 8481F8E0F3F;
	Tue,  1 Nov 2011 19:14:59 -0400 (EDT)
Date: Tue, 1 Nov 2011 16:09:51 -0700
From: Greg KH <greg@kroah.com>
To: Ian Campbell <ian.campbell@citrix.com>,
	Thomas Gleixner <tglx@linutronix.de>
Message-ID: <20111101230951.GA21951@kroah.com>
References: <20111026210539.64BA823EB@git.kroah.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111026210539.64BA823EB@git.kroah.org>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>,
	Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	xen-devel <xen-devel@lists.xensource.com>, stable@vger.kernel.org,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: Patch Upstream: genirq: Add IRQF_RESUME_EARLY and
 resume such IRQs earlier
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

If someone wants this in .32-stable, can they provide me a backported
version, as this doesn't backport very easily (i.e. I tried and failed.)

thanks,

greg k-h

On Wed, Oct 26, 2011 at 05:05:39PM -0400, Gregs git-bot wrote:
> commit: 9bab0b7fbaceec47d32db51cd9e59c82fb071f5a
> From: Ian Campbell <ian.campbell@citrix.com>
> Date: Mon, 3 Oct 2011 15:37:00 +0100
> Subject: genirq: Add IRQF_RESUME_EARLY and resume such IRQs earlier
> 
> This adds a mechanism to resume selected IRQs during syscore_resume
> instead of dpm_resume_noirq.
> 
> Under Xen we need to resume IRQs associated with IPIs early enough
> that the resched IPI is unmasked and we can therefore schedule
> ourselves out of the stop_machine where the suspend/resume takes
> place.
> 
> This issue was introduced by 676dc3cf5bc3 "xen: Use IRQF_FORCE_RESUME".
> 
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
> Cc: Rafael J. Wysocki <rjw@sisk.pl>
> Cc: Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>
> Cc: xen-devel <xen-devel@lists.xensource.com>
> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> Link: http://lkml.kernel.org/r/1318713254.11016.52.camel@dagon.hellion.org.uk
> Cc: stable@kernel.org (at least to 2.6.32.y)
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
>  drivers/xen/events.c      |    2 +-
>  include/linux/interrupt.h |    3 ++
>  kernel/irq/pm.c           |   48 ++++++++++++++++++++++++++++++++++++++------
>  3 files changed, 45 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/xen/events.c b/drivers/xen/events.c
> index da70f5c..a758bc1 100644
> --- a/drivers/xen/events.c
> +++ b/drivers/xen/events.c
> @@ -1021,7 +1021,7 @@ int bind_ipi_to_irqhandler(enum ipi_vector ipi,
>  	if (irq < 0)
>  		return irq;
>  
> -	irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME;
> +	irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME | IRQF_EARLY_RESUME;
>  	retval = request_irq(irq, handler, irqflags, devname, dev_id);
>  	if (retval != 0) {
>  		unbind_from_irq(irq);
> diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
> index 664544f..a64b00e 100644
> --- a/include/linux/interrupt.h
> +++ b/include/linux/interrupt.h
> @@ -59,6 +59,8 @@
>   * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend
>   * IRQF_FORCE_RESUME - Force enable it on resume even if IRQF_NO_SUSPEND is set
>   * IRQF_NO_THREAD - Interrupt cannot be threaded
> + * IRQF_EARLY_RESUME - Resume IRQ early during syscore instead of at device
> + *                resume time.
>   */
>  #define IRQF_DISABLED		0x00000020
>  #define IRQF_SAMPLE_RANDOM	0x00000040
> @@ -72,6 +74,7 @@
>  #define IRQF_NO_SUSPEND		0x00004000
>  #define IRQF_FORCE_RESUME	0x00008000
>  #define IRQF_NO_THREAD		0x00010000
> +#define IRQF_EARLY_RESUME	0x00020000
>  
>  #define IRQF_TIMER		(__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD)
>  
> diff --git a/kernel/irq/pm.c b/kernel/irq/pm.c
> index f76fc00..15e53b1 100644
> --- a/kernel/irq/pm.c
> +++ b/kernel/irq/pm.c
> @@ -9,6 +9,7 @@
>  #include <linux/irq.h>
>  #include <linux/module.h>
>  #include <linux/interrupt.h>
> +#include <linux/syscore_ops.h>
>  
>  #include "internals.h"
>  
> @@ -39,25 +40,58 @@ void suspend_device_irqs(void)
>  }
>  EXPORT_SYMBOL_GPL(suspend_device_irqs);
>  
> -/**
> - * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs()
> - *
> - * Enable all interrupt lines previously disabled by suspend_device_irqs() that
> - * have the IRQS_SUSPENDED flag set.
> - */
> -void resume_device_irqs(void)
> +static void resume_irqs(bool want_early)
>  {
>  	struct irq_desc *desc;
>  	int irq;
>  
>  	for_each_irq_desc(irq, desc) {
>  		unsigned long flags;
> +		bool is_early = desc->action &&
> +			desc->action->flags & IRQF_EARLY_RESUME;
> +
> +		if (is_early != want_early)
> +			continue;
>  
>  		raw_spin_lock_irqsave(&desc->lock, flags);
>  		__enable_irq(desc, irq, true);
>  		raw_spin_unlock_irqrestore(&desc->lock, flags);
>  	}
>  }
> +
> +/**
> + * irq_pm_syscore_ops - enable interrupt lines early
> + *
> + * Enable all interrupt lines with %IRQF_EARLY_RESUME set.
> + */
> +static void irq_pm_syscore_resume(void)
> +{
> +	resume_irqs(true);
> +}
> +
> +static struct syscore_ops irq_pm_syscore_ops = {
> +	.resume		= irq_pm_syscore_resume,
> +};
> +
> +static int __init irq_pm_init_ops(void)
> +{
> +	register_syscore_ops(&irq_pm_syscore_ops);
> +	return 0;
> +}
> +
> +device_initcall(irq_pm_init_ops);
> +
> +/**
> + * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs()
> + *
> + * Enable all non-%IRQF_EARLY_RESUME interrupt lines previously
> + * disabled by suspend_device_irqs() that have the IRQS_SUSPENDED flag
> + * set as well as those with %IRQF_FORCE_RESUME.
> + */
> +void resume_device_irqs(void)
> +{
> +	resume_irqs(false);
> +}
>  EXPORT_SYMBOL_GPL(resume_device_irqs);
>  
>  /**
> -- 
> 1.7.3.4

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 16:31:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 16:31:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLNnu-0006f0-PR; Tue, 01 Nov 2011 16:31:38 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLNnG-0006Sb-H5
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 16:30:58 -0700
X-Env-Sender: greg@kroah.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1320190254!1934076!1
X-Originating-IP: [66.111.4.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26760 invoked from network); 1 Nov 2011 23:30:55 -0000
Received: from out4.smtp.messagingengine.com (HELO
	out4.smtp.messagingengine.com) (66.111.4.28)
	by server-3.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 23:30:55 -0000
Received: from compute2.internal (compute2.nyi.mail.srv.osa [10.202.2.42])
	by gateway1.nyi.mail.srv.osa (Postfix) with ESMTP id D0C9820DEF;
	Tue,  1 Nov 2011 19:30:53 -0400 (EDT)
Received: from frontend1.nyi.mail.srv.osa ([10.202.2.160])
	by compute2.internal (MEProxy); Tue, 01 Nov 2011 19:30:53 -0400
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=subject:to:cc:from:date:message-id
	:mime-version:content-type:content-transfer-encoding; s=smtpout;
	bh=IasVa9pXaNzeGEVl1HduOtAkZvY=; b=X2BLUTph0latDWc+A0bgqvJARPPH
	kpWPcsexb5ncapFgK29b1et/aWDLu9gFW7uEWhByi2tU3W9uHfbW4MmRx0q/7Ov4
	WrXebia7t8+HM1UHDzAStd+tthGsUcKihUbVwXsFKT5uHpkNpJZtHBJbeEsYkllS
	bSXQPA5tgmA/EnE=
X-Sasl-enc: WdTA/LEuctGlWcRiv24FC+oy6DC/gicM63vyRAC4CNs8 1320190253
Received: from localhost (c-76-121-69-168.hsd1.wa.comcast.net [76.121.69.168])
	by mail.messagingengine.com (Postfix) with ESMTPSA id F3CC98E1001;
	Tue,  1 Nov 2011 19:30:52 -0400 (EDT)
To: ian.campbell@citrix.com, gregkh@suse.de, Jeremy.Fitzhardinge@citrix.com,
	konrad.wilk@oracle.com, rjw@sisk.pl, tglx@linutronix.de,
	xen-devel@lists.xensource.com
From: <gregkh@suse.de>
Date: Tue, 01 Nov 2011 16:30:33 -0700
Message-ID: <1320190233695@kroah.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=ASCII
Content-Transfer-Encoding: 8bit
Cc: stable@vger.kernel.org, stable-commits@vger.kernel.org
Subject: [Xen-devel] Patch "genirq: Add IRQF_RESUME_EARLY and resume such
	IRQs earlier" has been added to the 3.0-stable tree
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


This is a note to let you know that I've just added the patch titled

    genirq: Add IRQF_RESUME_EARLY and resume such IRQs earlier

to the 3.0-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     genirq-add-irqf_resume_early-and-resume-such-irqs-earlier.patch
and it can be found in the queue-3.0 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@vger.kernel.org> know about it.


>From 9bab0b7fbaceec47d32db51cd9e59c82fb071f5a Mon Sep 17 00:00:00 2001
From: Ian Campbell <ian.campbell@citrix.com>
Date: Mon, 3 Oct 2011 15:37:00 +0100
Subject: genirq: Add IRQF_RESUME_EARLY and resume such IRQs earlier

From: Ian Campbell <ian.campbell@citrix.com>

commit 9bab0b7fbaceec47d32db51cd9e59c82fb071f5a upstream.

This adds a mechanism to resume selected IRQs during syscore_resume
instead of dpm_resume_noirq.

Under Xen we need to resume IRQs associated with IPIs early enough
that the resched IPI is unmasked and we can therefore schedule
ourselves out of the stop_machine where the suspend/resume takes
place.

This issue was introduced by 676dc3cf5bc3 "xen: Use IRQF_FORCE_RESUME".

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Cc: Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>
Cc: xen-devel <xen-devel@lists.xensource.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Link: http://lkml.kernel.org/r/1318713254.11016.52.camel@dagon.hellion.org.uk
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 drivers/xen/events.c      |    2 -
 include/linux/interrupt.h |    3 ++
 kernel/irq/pm.c           |   48 +++++++++++++++++++++++++++++++++++++++-------
 3 files changed, 45 insertions(+), 8 deletions(-)

--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -1026,7 +1026,7 @@ int bind_ipi_to_irqhandler(enum ipi_vect
 	if (irq < 0)
 		return irq;
 
-	irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME;
+	irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME | IRQF_EARLY_RESUME;
 	retval = request_irq(irq, handler, irqflags, devname, dev_id);
 	if (retval != 0) {
 		unbind_from_irq(irq);
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -59,6 +59,8 @@
  * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend
  * IRQF_FORCE_RESUME - Force enable it on resume even if IRQF_NO_SUSPEND is set
  * IRQF_NO_THREAD - Interrupt cannot be threaded
+ * IRQF_EARLY_RESUME - Resume IRQ early during syscore instead of at device
+ *                resume time.
  */
 #define IRQF_DISABLED		0x00000020
 #define IRQF_SAMPLE_RANDOM	0x00000040
@@ -72,6 +74,7 @@
 #define IRQF_NO_SUSPEND		0x00004000
 #define IRQF_FORCE_RESUME	0x00008000
 #define IRQF_NO_THREAD		0x00010000
+#define IRQF_EARLY_RESUME	0x00020000
 
 #define IRQF_TIMER		(__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD)
 
--- a/kernel/irq/pm.c
+++ b/kernel/irq/pm.c
@@ -9,6 +9,7 @@
 #include <linux/irq.h>
 #include <linux/module.h>
 #include <linux/interrupt.h>
+#include <linux/syscore_ops.h>
 
 #include "internals.h"
 
@@ -39,25 +40,58 @@ void suspend_device_irqs(void)
 }
 EXPORT_SYMBOL_GPL(suspend_device_irqs);
 
-/**
- * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs()
- *
- * Enable all interrupt lines previously disabled by suspend_device_irqs() that
- * have the IRQS_SUSPENDED flag set.
- */
-void resume_device_irqs(void)
+static void resume_irqs(bool want_early)
 {
 	struct irq_desc *desc;
 	int irq;
 
 	for_each_irq_desc(irq, desc) {
 		unsigned long flags;
+		bool is_early = desc->action &&
+			desc->action->flags & IRQF_EARLY_RESUME;
+
+		if (is_early != want_early)
+			continue;
 
 		raw_spin_lock_irqsave(&desc->lock, flags);
 		__enable_irq(desc, irq, true);
 		raw_spin_unlock_irqrestore(&desc->lock, flags);
 	}
 }
+
+/**
+ * irq_pm_syscore_ops - enable interrupt lines early
+ *
+ * Enable all interrupt lines with %IRQF_EARLY_RESUME set.
+ */
+static void irq_pm_syscore_resume(void)
+{
+	resume_irqs(true);
+}
+
+static struct syscore_ops irq_pm_syscore_ops = {
+	.resume		= irq_pm_syscore_resume,
+};
+
+static int __init irq_pm_init_ops(void)
+{
+	register_syscore_ops(&irq_pm_syscore_ops);
+	return 0;
+}
+
+device_initcall(irq_pm_init_ops);
+
+/**
+ * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs()
+ *
+ * Enable all non-%IRQF_EARLY_RESUME interrupt lines previously
+ * disabled by suspend_device_irqs() that have the IRQS_SUSPENDED flag
+ * set as well as those with %IRQF_FORCE_RESUME.
+ */
+void resume_device_irqs(void)
+{
+	resume_irqs(false);
+}
 EXPORT_SYMBOL_GPL(resume_device_irqs);
 
 /**


Patches currently in stable-queue which might be from ian.campbell@citrix.com are

queue-3.0/genirq-add-irqf_resume_early-and-resume-such-irqs-earlier.patch

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 16:33:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 16:33:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLNpO-0007D7-ID; Tue, 01 Nov 2011 16:33:10 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLNny-0006fr-N9
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 16:31:43 -0700
X-Env-Sender: greg@kroah.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1320190298!3271021!1
X-Originating-IP: [66.111.4.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 343 invoked from network); 1 Nov 2011 23:31:39 -0000
Received: from out4.smtp.messagingengine.com (HELO
	out4.smtp.messagingengine.com) (66.111.4.28)
	by server-2.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Nov 2011 23:31:39 -0000
Received: from compute4.internal (compute4.nyi.mail.srv.osa [10.202.2.44])
	by gateway1.nyi.mail.srv.osa (Postfix) with ESMTP id 715DA2048C;
	Tue,  1 Nov 2011 19:31:38 -0400 (EDT)
Received: from frontend1.nyi.mail.srv.osa ([10.202.2.160])
	by compute4.internal (MEProxy); Tue, 01 Nov 2011 19:31:38 -0400
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=subject:to:cc:from:date:message-id
	:mime-version:content-type:content-transfer-encoding; s=smtpout;
	bh=xt1Jj6PObxkEkEq068i1UhuLxVo=; b=PN68dpGMTdccRXem0YRx9sjgQRZ/
	iOfL9C62iC6+RzfOnOlLyFF2vrCH+kmjf8QC70BM/2jPDuAQKJlJKCsub8G8FDMZ
	LhpuvpuB5wyAP/mmvttHN+/i0fwnAeeU4YnBRhCdw29QFNb4sOkXJZ++OSScsIcX
	+azhTLARPB1nTFM=
X-Sasl-enc: jORurhvwi5uYCNmB2z4NY/2f3s5R7PL9dpNMCXtQmb0C 1320190298
Received: from localhost (c-76-121-69-168.hsd1.wa.comcast.net [76.121.69.168])
	by mail.messagingengine.com (Postfix) with ESMTPSA id 023D78E1005;
	Tue,  1 Nov 2011 19:31:37 -0400 (EDT)
To: ian.campbell@citrix.com, gregkh@suse.de, Jeremy.Fitzhardinge@citrix.com,
	konrad.wilk@oracle.com, rjw@sisk.pl, tglx@linutronix.de,
	xen-devel@lists.xensource.com
From: <gregkh@suse.de>
Date: Tue, 01 Nov 2011 16:31:19 -0700
Message-ID: <13201902791826@kroah.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=ASCII
Content-Transfer-Encoding: 8bit
Cc: stable@vger.kernel.org, stable-commits@vger.kernel.org
Subject: [Xen-devel] Patch "genirq: Add IRQF_RESUME_EARLY and resume such
	IRQs earlier" has been added to the 3.1-stable tree
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


This is a note to let you know that I've just added the patch titled

    genirq: Add IRQF_RESUME_EARLY and resume such IRQs earlier

to the 3.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     genirq-add-irqf_resume_early-and-resume-such-irqs-earlier.patch
and it can be found in the queue-3.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@vger.kernel.org> know about it.


>From 9bab0b7fbaceec47d32db51cd9e59c82fb071f5a Mon Sep 17 00:00:00 2001
From: Ian Campbell <ian.campbell@citrix.com>
Date: Mon, 3 Oct 2011 15:37:00 +0100
Subject: genirq: Add IRQF_RESUME_EARLY and resume such IRQs earlier

From: Ian Campbell <ian.campbell@citrix.com>

commit 9bab0b7fbaceec47d32db51cd9e59c82fb071f5a upstream.

This adds a mechanism to resume selected IRQs during syscore_resume
instead of dpm_resume_noirq.

Under Xen we need to resume IRQs associated with IPIs early enough
that the resched IPI is unmasked and we can therefore schedule
ourselves out of the stop_machine where the suspend/resume takes
place.

This issue was introduced by 676dc3cf5bc3 "xen: Use IRQF_FORCE_RESUME".

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Cc: Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>
Cc: xen-devel <xen-devel@lists.xensource.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Link: http://lkml.kernel.org/r/1318713254.11016.52.camel@dagon.hellion.org.uk
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 drivers/xen/events.c      |    2 -
 include/linux/interrupt.h |    3 ++
 kernel/irq/pm.c           |   48 +++++++++++++++++++++++++++++++++++++++-------
 3 files changed, 45 insertions(+), 8 deletions(-)

--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -1021,7 +1021,7 @@ int bind_ipi_to_irqhandler(enum ipi_vect
 	if (irq < 0)
 		return irq;
 
-	irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME;
+	irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME | IRQF_EARLY_RESUME;
 	retval = request_irq(irq, handler, irqflags, devname, dev_id);
 	if (retval != 0) {
 		unbind_from_irq(irq);
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -59,6 +59,8 @@
  * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend
  * IRQF_FORCE_RESUME - Force enable it on resume even if IRQF_NO_SUSPEND is set
  * IRQF_NO_THREAD - Interrupt cannot be threaded
+ * IRQF_EARLY_RESUME - Resume IRQ early during syscore instead of at device
+ *                resume time.
  */
 #define IRQF_DISABLED		0x00000020
 #define IRQF_SAMPLE_RANDOM	0x00000040
@@ -72,6 +74,7 @@
 #define IRQF_NO_SUSPEND		0x00004000
 #define IRQF_FORCE_RESUME	0x00008000
 #define IRQF_NO_THREAD		0x00010000
+#define IRQF_EARLY_RESUME	0x00020000
 
 #define IRQF_TIMER		(__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD)
 
--- a/kernel/irq/pm.c
+++ b/kernel/irq/pm.c
@@ -9,6 +9,7 @@
 #include <linux/irq.h>
 #include <linux/module.h>
 #include <linux/interrupt.h>
+#include <linux/syscore_ops.h>
 
 #include "internals.h"
 
@@ -39,25 +40,58 @@ void suspend_device_irqs(void)
 }
 EXPORT_SYMBOL_GPL(suspend_device_irqs);
 
-/**
- * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs()
- *
- * Enable all interrupt lines previously disabled by suspend_device_irqs() that
- * have the IRQS_SUSPENDED flag set.
- */
-void resume_device_irqs(void)
+static void resume_irqs(bool want_early)
 {
 	struct irq_desc *desc;
 	int irq;
 
 	for_each_irq_desc(irq, desc) {
 		unsigned long flags;
+		bool is_early = desc->action &&
+			desc->action->flags & IRQF_EARLY_RESUME;
+
+		if (is_early != want_early)
+			continue;
 
 		raw_spin_lock_irqsave(&desc->lock, flags);
 		__enable_irq(desc, irq, true);
 		raw_spin_unlock_irqrestore(&desc->lock, flags);
 	}
 }
+
+/**
+ * irq_pm_syscore_ops - enable interrupt lines early
+ *
+ * Enable all interrupt lines with %IRQF_EARLY_RESUME set.
+ */
+static void irq_pm_syscore_resume(void)
+{
+	resume_irqs(true);
+}
+
+static struct syscore_ops irq_pm_syscore_ops = {
+	.resume		= irq_pm_syscore_resume,
+};
+
+static int __init irq_pm_init_ops(void)
+{
+	register_syscore_ops(&irq_pm_syscore_ops);
+	return 0;
+}
+
+device_initcall(irq_pm_init_ops);
+
+/**
+ * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs()
+ *
+ * Enable all non-%IRQF_EARLY_RESUME interrupt lines previously
+ * disabled by suspend_device_irqs() that have the IRQS_SUSPENDED flag
+ * set as well as those with %IRQF_FORCE_RESUME.
+ */
+void resume_device_irqs(void)
+{
+	resume_irqs(false);
+}
 EXPORT_SYMBOL_GPL(resume_device_irqs);
 
 /**


Patches currently in stable-queue which might be from ian.campbell@citrix.com are

queue-3.1/genirq-add-irqf_resume_early-and-resume-such-irqs-earlier.patch

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 16:47:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 16:47:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLO2q-0007oZ-BW; Tue, 01 Nov 2011 16:47:04 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLO2B-0007cG-4q
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 16:46:23 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1320191179!1935042!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3193 invoked from network); 1 Nov 2011 23:46:20 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 23:46:20 -0000
X-IronPort-AV: E=Sophos;i="4.69,440,1315180800"; 
   d="scan'208";a="8706605"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 23:46:18 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 1 Nov 2011 23:46:18 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RLO26-0008LV-G6;
	Tue, 01 Nov 2011 23:46:18 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RLO26-0008C8-FY;
	Tue, 01 Nov 2011 23:46:18 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9652-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 1 Nov 2011 23:46:18 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9652: tolerable FAIL - PUSHED
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9652 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9652/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10       fail    like 9650
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  068d3d55ce6e
baseline version:
 xen                  0fea1ad50ce3

------------------------------------------------------------
People who touched revisions under test:
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Daniel De Graaf <dgdegra@tycho.nsa.gov>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Keir Fraser <keir@xen.org>
  Roger Pau Monne <roger.pau@entel.upc.edu>
  Stefano Stabellini <stefano.stabellini@eu.citrix.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Pushing revision :

+ branch=xen-unstable
+ revision=068d3d55ce6e
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x '!=' x/export/home/osstest/repos/lock ']'
++ OSSTEST_REPOS_LOCK_LOCKED=/export/home/osstest/repos/lock
++ exec with-lock-ex -w /export/home/osstest/repos/lock ./ap-push xen-unstable 068d3d55ce6e
+ branch=xen-unstable
+ revision=068d3d55ce6e
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x/export/home/osstest/repos/lock '!=' x/export/home/osstest/repos/lock ']'
+ : xen@xenbits.xensource.com
+ : xen@xenbits.xensource.com:git/linux-pvops
+ : master
+ : tested/2.6.39.x
+ case "$branch" in
+ cd /export/home/osstest/repos/xen-unstable.hg
+ hg push -r 068d3d55ce6e ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
pushing to ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 36 changesets with 105 changes to 34 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 17:33:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 17:33:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLOlZ-0004jF-74; Tue, 01 Nov 2011 17:33:17 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLOkr-0004Wc-NW
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 17:32:34 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-8.tower-21.messagelabs.com!1320193948!2577230!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6635 invoked from network); 2 Nov 2011 00:32:30 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-8.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 2 Nov 2011 00:32:30 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:f2de:f1ff:fe5c:34ed])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id A9F909A12;
	Tue,  1 Nov 2011 17:32:27 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 33A16202D6;
	Tue,  1 Nov 2011 14:02:58 -0700 (PDT)
Message-ID: <4EB05E82.4010303@goop.org>
Date: Tue, 01 Nov 2011 14:02:58 -0700
From: Jeremy Fitzhardinge <jeremy@goop.org>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: Linus Torvalds <torvalds@linux-foundation.org>
References: <4EA70B22.2020508@goop.org>
In-Reply-To: <4EA70B22.2020508@goop.org>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [GIT PULL] Xen time-setting
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 10/25/2011 12:16 PM, Jeremy Fitzhardinge wrote:
> Hi Linus,
>
> This just wires up "set system time" through to Xen so it can set the
> actual RTC hardware.  The bulk of the patch is a new header to define
> the Xen platform interface ABI, which will also get used by other
> patches in this merge window (I hope).

Ping?


>
> Thanks,
>     J
>
> The following changes since commit 02f8c6aee8df3cdc935e9bdd4f2d020306035dbe:
>
>   Linux 3.0 (2011-07-21 19:17:23 -0700)
>
> are available in the git repository at:
>   git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen.git upstream/xen-settime
>
> Jeremy Fitzhardinge (2):
>       xen: add dom0_op hypercall
>       xen/dom0: set wallclock time in Xen
>
> Yu Ke (1):
>       xen/acpi: Domain0 acpi parser related platform hypercall
>
>  arch/ia64/include/asm/xen/interface.h |    1 +
>  arch/x86/include/asm/xen/hypercall.h  |    8 +
>  arch/x86/include/asm/xen/interface.h  |    1 +
>  arch/x86/xen/time.c                   |   16 ++-
>  include/xen/interface/platform.h      |  320 +++++++++++++++++++++++++++++++++
>  include/xen/interface/xen.h           |    1 +
>  6 files changed, 346 insertions(+), 1 deletions(-)
>  create mode 100644 include/xen/interface/platform.h
>
> diff --git a/arch/ia64/include/asm/xen/interface.h b/arch/ia64/include/asm/xen/interface.h
> index e951e74..1d2427d 100644
> --- a/arch/ia64/include/asm/xen/interface.h
> +++ b/arch/ia64/include/asm/xen/interface.h
> @@ -76,6 +76,7 @@ DEFINE_GUEST_HANDLE(char);
>  DEFINE_GUEST_HANDLE(int);
>  DEFINE_GUEST_HANDLE(long);
>  DEFINE_GUEST_HANDLE(void);
> +DEFINE_GUEST_HANDLE(uint64_t);
>  
>  typedef unsigned long xen_pfn_t;
>  DEFINE_GUEST_HANDLE(xen_pfn_t);
> diff --git a/arch/x86/include/asm/xen/hypercall.h b/arch/x86/include/asm/xen/hypercall.h
> index d240ea9..0c9894e 100644
> --- a/arch/x86/include/asm/xen/hypercall.h
> +++ b/arch/x86/include/asm/xen/hypercall.h
> @@ -45,6 +45,7 @@
>  #include <xen/interface/xen.h>
>  #include <xen/interface/sched.h>
>  #include <xen/interface/physdev.h>
> +#include <xen/interface/platform.h>
>  
>  /*
>   * The hypercall asms have to meet several constraints:
> @@ -299,6 +300,13 @@ HYPERVISOR_set_timer_op(u64 timeout)
>  }
>  
>  static inline int
> +HYPERVISOR_dom0_op(struct xen_platform_op *platform_op)
> +{
> +	platform_op->interface_version = XENPF_INTERFACE_VERSION;
> +	return _hypercall1(int, dom0_op, platform_op);
> +}
> +
> +static inline int
>  HYPERVISOR_set_debugreg(int reg, unsigned long value)
>  {
>  	return _hypercall2(int, set_debugreg, reg, value);
> diff --git a/arch/x86/include/asm/xen/interface.h b/arch/x86/include/asm/xen/interface.h
> index 5d4922a..a1f2db5 100644
> --- a/arch/x86/include/asm/xen/interface.h
> +++ b/arch/x86/include/asm/xen/interface.h
> @@ -55,6 +55,7 @@ DEFINE_GUEST_HANDLE(char);
>  DEFINE_GUEST_HANDLE(int);
>  DEFINE_GUEST_HANDLE(long);
>  DEFINE_GUEST_HANDLE(void);
> +DEFINE_GUEST_HANDLE(uint64_t);
>  #endif
>  
>  #ifndef HYPERVISOR_VIRT_START
> diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
> index 5158c50..8c9cdfa 100644
> --- a/arch/x86/xen/time.c
> +++ b/arch/x86/xen/time.c
> @@ -200,8 +200,22 @@ static unsigned long xen_get_wallclock(void)
>  
>  static int xen_set_wallclock(unsigned long now)
>  {
> +	struct xen_platform_op op;
> +	int rc;
> +
>  	/* do nothing for domU */
> -	return -1;
> +	if (!xen_initial_domain())
> +		return -1;
> +
> +	op.cmd = XENPF_settime;
> +	op.u.settime.secs = now;
> +	op.u.settime.nsecs = 0;
> +	op.u.settime.system_time = xen_clocksource_read();
> +
> +	rc = HYPERVISOR_dom0_op(&op);
> +	WARN(rc != 0, "XENPF_settime failed: now=%ld\n", now);
> +
> +	return rc;
>  }
>  
>  static struct clocksource xen_clocksource __read_mostly = {
> diff --git a/include/xen/interface/platform.h b/include/xen/interface/platform.h
> new file mode 100644
> index 0000000..c168468
> --- /dev/null
> +++ b/include/xen/interface/platform.h
> @@ -0,0 +1,320 @@
> +/******************************************************************************
> + * platform.h
> + *
> + * Hardware platform operations. Intended for use by domain-0 kernel.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a copy
> + * of this software and associated documentation files (the "Software"), to
> + * deal in the Software without restriction, including without limitation the
> + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
> + * sell copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> + * DEALINGS IN THE SOFTWARE.
> + *
> + * Copyright (c) 2002-2006, K Fraser
> + */
> +
> +#ifndef __XEN_PUBLIC_PLATFORM_H__
> +#define __XEN_PUBLIC_PLATFORM_H__
> +
> +#include "xen.h"
> +
> +#define XENPF_INTERFACE_VERSION 0x03000001
> +
> +/*
> + * Set clock such that it would read <secs,nsecs> after 00:00:00 UTC,
> + * 1 January, 1970 if the current system time was <system_time>.
> + */
> +#define XENPF_settime             17
> +struct xenpf_settime {
> +	/* IN variables. */
> +	uint32_t secs;
> +	uint32_t nsecs;
> +	uint64_t system_time;
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(xenpf_settime_t);
> +
> +/*
> + * Request memory range (@mfn, @mfn+@nr_mfns-1) to have type @type.
> + * On x86, @type is an architecture-defined MTRR memory type.
> + * On success, returns the MTRR that was used (@reg) and a handle that can
> + * be passed to XENPF_DEL_MEMTYPE to accurately tear down the new setting.
> + * (x86-specific).
> + */
> +#define XENPF_add_memtype         31
> +struct xenpf_add_memtype {
> +	/* IN variables. */
> +	unsigned long mfn;
> +	uint64_t nr_mfns;
> +	uint32_t type;
> +	/* OUT variables. */
> +	uint32_t handle;
> +	uint32_t reg;
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(xenpf_add_memtype_t);
> +
> +/*
> + * Tear down an existing memory-range type. If @handle is remembered then it
> + * should be passed in to accurately tear down the correct setting (in case
> + * of overlapping memory regions with differing types). If it is not known
> + * then @handle should be set to zero. In all cases @reg must be set.
> + * (x86-specific).
> + */
> +#define XENPF_del_memtype         32
> +struct xenpf_del_memtype {
> +	/* IN variables. */
> +	uint32_t handle;
> +	uint32_t reg;
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(xenpf_del_memtype_t);
> +
> +/* Read current type of an MTRR (x86-specific). */
> +#define XENPF_read_memtype        33
> +struct xenpf_read_memtype {
> +	/* IN variables. */
> +	uint32_t reg;
> +	/* OUT variables. */
> +	unsigned long mfn;
> +	uint64_t nr_mfns;
> +	uint32_t type;
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(xenpf_read_memtype_t);
> +
> +#define XENPF_microcode_update    35
> +struct xenpf_microcode_update {
> +	/* IN variables. */
> +	GUEST_HANDLE(void) data;          /* Pointer to microcode data */
> +	uint32_t length;                  /* Length of microcode data. */
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(xenpf_microcode_update_t);
> +
> +#define XENPF_platform_quirk      39
> +#define QUIRK_NOIRQBALANCING      1 /* Do not restrict IO-APIC RTE targets */
> +#define QUIRK_IOAPIC_BAD_REGSEL   2 /* IO-APIC REGSEL forgets its value    */
> +#define QUIRK_IOAPIC_GOOD_REGSEL  3 /* IO-APIC REGSEL behaves properly     */
> +struct xenpf_platform_quirk {
> +	/* IN variables. */
> +	uint32_t quirk_id;
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(xenpf_platform_quirk_t);
> +
> +#define XENPF_firmware_info       50
> +#define XEN_FW_DISK_INFO          1 /* from int 13 AH=08/41/48 */
> +#define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */
> +#define XEN_FW_VBEDDC_INFO        3 /* from int 10 AX=4f15 */
> +struct xenpf_firmware_info {
> +	/* IN variables. */
> +	uint32_t type;
> +	uint32_t index;
> +	/* OUT variables. */
> +	union {
> +		struct {
> +			/* Int13, Fn48: Check Extensions Present. */
> +			uint8_t device;                   /* %dl: bios device number */
> +			uint8_t version;                  /* %ah: major version      */
> +			uint16_t interface_support;       /* %cx: support bitmap     */
> +			/* Int13, Fn08: Legacy Get Device Parameters. */
> +			uint16_t legacy_max_cylinder;     /* %cl[7:6]:%ch: max cyl # */
> +			uint8_t legacy_max_head;          /* %dh: max head #         */
> +			uint8_t legacy_sectors_per_track; /* %cl[5:0]: max sector #  */
> +			/* Int13, Fn41: Get Device Parameters (as filled into %ds:%esi). */
> +			/* NB. First uint16_t of buffer must be set to buffer size.      */
> +			GUEST_HANDLE(void) edd_params;
> +		} disk_info; /* XEN_FW_DISK_INFO */
> +		struct {
> +			uint8_t device;                   /* bios device number  */
> +			uint32_t mbr_signature;           /* offset 0x1b8 in mbr */
> +		} disk_mbr_signature; /* XEN_FW_DISK_MBR_SIGNATURE */
> +		struct {
> +			/* Int10, AX=4F15: Get EDID info. */
> +			uint8_t capabilities;
> +			uint8_t edid_transfer_time;
> +			/* must refer to 128-byte buffer */
> +			GUEST_HANDLE(uchar) edid;
> +		} vbeddc_info; /* XEN_FW_VBEDDC_INFO */
> +	} u;
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(xenpf_firmware_info_t);
> +
> +#define XENPF_enter_acpi_sleep    51
> +struct xenpf_enter_acpi_sleep {
> +	/* IN variables */
> +	uint16_t pm1a_cnt_val;      /* PM1a control value. */
> +	uint16_t pm1b_cnt_val;      /* PM1b control value. */
> +	uint32_t sleep_state;       /* Which state to enter (Sn). */
> +	uint32_t flags;             /* Must be zero. */
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(xenpf_enter_acpi_sleep_t);
> +
> +#define XENPF_change_freq         52
> +struct xenpf_change_freq {
> +	/* IN variables */
> +	uint32_t flags; /* Must be zero. */
> +	uint32_t cpu;   /* Physical cpu. */
> +	uint64_t freq;  /* New frequency (Hz). */
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(xenpf_change_freq_t);
> +
> +/*
> + * Get idle times (nanoseconds since boot) for physical CPUs specified in the
> + * @cpumap_bitmap with range [0..@cpumap_nr_cpus-1]. The @idletime array is
> + * indexed by CPU number; only entries with the corresponding @cpumap_bitmap
> + * bit set are written to. On return, @cpumap_bitmap is modified so that any
> + * non-existent CPUs are cleared. Such CPUs have their @idletime array entry
> + * cleared.
> + */
> +#define XENPF_getidletime         53
> +struct xenpf_getidletime {
> +	/* IN/OUT variables */
> +	/* IN: CPUs to interrogate; OUT: subset of IN which are present */
> +	GUEST_HANDLE(uchar) cpumap_bitmap;
> +	/* IN variables */
> +	/* Size of cpumap bitmap. */
> +	uint32_t cpumap_nr_cpus;
> +	/* Must be indexable for every cpu in cpumap_bitmap. */
> +	GUEST_HANDLE(uint64_t) idletime;
> +	/* OUT variables */
> +	/* System time when the idletime snapshots were taken. */
> +	uint64_t now;
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(xenpf_getidletime_t);
> +
> +#define XENPF_set_processor_pminfo      54
> +
> +/* ability bits */
> +#define XEN_PROCESSOR_PM_CX	1
> +#define XEN_PROCESSOR_PM_PX	2
> +#define XEN_PROCESSOR_PM_TX	4
> +
> +/* cmd type */
> +#define XEN_PM_CX   0
> +#define XEN_PM_PX   1
> +#define XEN_PM_TX   2
> +
> +/* Px sub info type */
> +#define XEN_PX_PCT   1
> +#define XEN_PX_PSS   2
> +#define XEN_PX_PPC   4
> +#define XEN_PX_PSD   8
> +
> +struct xen_power_register {
> +	uint32_t     space_id;
> +	uint32_t     bit_width;
> +	uint32_t     bit_offset;
> +	uint32_t     access_size;
> +	uint64_t     address;
> +};
> +
> +struct xen_processor_csd {
> +	uint32_t    domain;      /* domain number of one dependent group */
> +	uint32_t    coord_type;  /* coordination type */
> +	uint32_t    num;         /* number of processors in same domain */
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(xen_processor_csd);
> +
> +struct xen_processor_cx {
> +	struct xen_power_register  reg; /* GAS for Cx trigger register */
> +	uint8_t     type;     /* cstate value, c0: 0, c1: 1, ... */
> +	uint32_t    latency;  /* worst latency (ms) to enter/exit this cstate */
> +	uint32_t    power;    /* average power consumption(mW) */
> +	uint32_t    dpcnt;    /* number of dependency entries */
> +	GUEST_HANDLE(xen_processor_csd) dp; /* NULL if no dependency */
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(xen_processor_cx);
> +
> +struct xen_processor_flags {
> +	uint32_t bm_control:1;
> +	uint32_t bm_check:1;
> +	uint32_t has_cst:1;
> +	uint32_t power_setup_done:1;
> +	uint32_t bm_rld_set:1;
> +};
> +
> +struct xen_processor_power {
> +	uint32_t count;  /* number of C state entries in array below */
> +	struct xen_processor_flags flags;  /* global flags of this processor */
> +	GUEST_HANDLE(xen_processor_cx) states; /* supported c states */
> +};
> +
> +struct xen_pct_register {
> +	uint8_t  descriptor;
> +	uint16_t length;
> +	uint8_t  space_id;
> +	uint8_t  bit_width;
> +	uint8_t  bit_offset;
> +	uint8_t  reserved;
> +	uint64_t address;
> +};
> +
> +struct xen_processor_px {
> +	uint64_t core_frequency; /* megahertz */
> +	uint64_t power;      /* milliWatts */
> +	uint64_t transition_latency; /* microseconds */
> +	uint64_t bus_master_latency; /* microseconds */
> +	uint64_t control;        /* control value */
> +	uint64_t status;     /* success indicator */
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(xen_processor_px);
> +
> +struct xen_psd_package {
> +	uint64_t num_entries;
> +	uint64_t revision;
> +	uint64_t domain;
> +	uint64_t coord_type;
> +	uint64_t num_processors;
> +};
> +
> +struct xen_processor_performance {
> +	uint32_t flags;     /* flag for Px sub info type */
> +	uint32_t platform_limit;  /* Platform limitation on freq usage */
> +	struct xen_pct_register control_register;
> +	struct xen_pct_register status_register;
> +	uint32_t state_count;     /* total available performance states */
> +	GUEST_HANDLE(xen_processor_px) states;
> +	struct xen_psd_package domain_info;
> +	uint32_t shared_type;     /* coordination type of this processor */
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(xen_processor_performance);
> +
> +struct xenpf_set_processor_pminfo {
> +	/* IN variables */
> +	uint32_t id;    /* ACPI CPU ID */
> +	uint32_t type;  /* {XEN_PM_CX, XEN_PM_PX} */
> +	union {
> +		struct xen_processor_power          power;/* Cx: _CST/_CSD */
> +		struct xen_processor_performance    perf; /* Px: _PPC/_PCT/_PSS/_PSD */
> +	};
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(xenpf_set_processor_pminfo);
> +
> +struct xen_platform_op {
> +	uint32_t cmd;
> +	uint32_t interface_version; /* XENPF_INTERFACE_VERSION */
> +	union {
> +		struct xenpf_settime           settime;
> +		struct xenpf_add_memtype       add_memtype;
> +		struct xenpf_del_memtype       del_memtype;
> +		struct xenpf_read_memtype      read_memtype;
> +		struct xenpf_microcode_update  microcode;
> +		struct xenpf_platform_quirk    platform_quirk;
> +		struct xenpf_firmware_info     firmware_info;
> +		struct xenpf_enter_acpi_sleep  enter_acpi_sleep;
> +		struct xenpf_change_freq       change_freq;
> +		struct xenpf_getidletime       getidletime;
> +		struct xenpf_set_processor_pminfo set_pminfo;
> +		uint8_t                        pad[128];
> +	} u;
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(xen_platform_op_t);
> +
> +#endif /* __XEN_PUBLIC_PLATFORM_H__ */
> diff --git a/include/xen/interface/xen.h b/include/xen/interface/xen.h
> index 70213b4..d83cc08 100644
> --- a/include/xen/interface/xen.h
> +++ b/include/xen/interface/xen.h
> @@ -453,6 +453,7 @@ struct start_info {
>  /* These flags are passed in the 'flags' field of start_info_t. */
>  #define SIF_PRIVILEGED    (1<<0)  /* Is the domain privileged? */
>  #define SIF_INITDOMAIN    (1<<1)  /* Is this the initial control domain? */
> +#define SIF_PM_MASK       (0xFF<<8) /* reserve 1 byte for xen-pm options */
>  
>  typedef uint64_t cpumap_t;
>  
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
>


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 18:14:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 18:14:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLPPK-00067R-Ng; Tue, 01 Nov 2011 18:14:22 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLPOS-0005tm-6t
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 18:13:28 -0700
X-Env-Sender: sfr@canb.auug.org.au
X-Msg-Ref: server-15.tower-21.messagelabs.com!1320196403!2548309!1
X-Originating-IP: [203.10.76.15]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21250 invoked from network); 2 Nov 2011 01:13:24 -0000
Received: from calzone.tip.net.au (HELO calzone.tip.net.au) (203.10.76.15)
	by server-15.tower-21.messagelabs.com with SMTP;
	2 Nov 2011 01:13:24 -0000
Received: from canb.auug.org.au (ibmaus65.lnk.telstra.net [165.228.126.9])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	by calzone.tip.net.au (Postfix) with ESMTPSA id C0233128436;
	Wed,  2 Nov 2011 12:13:15 +1100 (EST)
Date: Wed, 2 Nov 2011 12:13:09 +1100
From: Stephen Rothwell <sfr@canb.auug.org.au>
To: Greg KH <gregkh@suse.de>
Message-Id: <20111102121309.4dbb0d2ac90d2879130820dd@canb.auug.org.au>
In-Reply-To: <20111027054806.GA1377@suse.de>
References: <20111027053007.GA32765@phenom.dumpdata.com>
	<20111027054806.GA1377@suse.de>
X-Mailer: Sylpheed 3.2.0beta3 (GTK+ 2.24.6; i486-pc-linux-gnu)
Mime-Version: 1.0
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, Anton,
	Rusty Russell <rusty@rustcorp.com.au>, miche@google.com,
	linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org,
	Linus <torvalds@linux-foundation.org>, Blanchard <anton@samba.org>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Amit Shah <amit.shah@redhat.com>, ppc-dev <linuxppc-dev@lists.ozlabs.org>
Subject: [Xen-devel] Re: Regression: patch
 " hvc_console: display printk messages on console." causing infinite loop
 with 3.2-rc0 + Xen.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1915654457=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1915654457==
Content-Type: multipart/signed; protocol="application/pgp-signature";
	micalg="PGP-SHA256";
	boundary="Signature=_Wed__2_Nov_2011_12_13_09_+1100_lsOPgMWQm04RXl/E"

--Signature=_Wed__2_Nov_2011_12_13_09_+1100_lsOPgMWQm04RXl/E
Content-Type: text/plain; charset=US-ASCII
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

Hi Greg,

On Thu, 27 Oct 2011 07:48:06 +0200 Greg KH <gregkh@suse.de> wrote:
>
> On Thu, Oct 27, 2011 at 01:30:08AM -0400, Konrad Rzeszutek Wilk wrote:
> > Hey Miche.
> >=20
> > The git commit 361162459f62dc0826b82c9690a741a940f457f0:
> >=20
> >     hvc_console: display printk messages on console.
> >=20
> > is causing an infinite loop when booting Linux under Xen, as so:
>=20
> Ick, not good, thanks for letting us know.

Indeed. I am wondering why it was put in a tree and sent to Linus without
any Acks or even being replied to by anyone.  It appeared in the tty tree
between Oct 14 and Oct 25 (while I was unfortunately on vacation).  If
anyone had tried to boot this on any PowerPC server, it would have been
immediately obvious (as it was when I booted Linus' tree last night).

And the original author expressed doubts as to his understanding of how
it should all work anyway.

Just a little more care, please.

I would vote for reverting the original and having it resubmitted with
corrections at some later date.
--=20
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

--Signature=_Wed__2_Nov_2011_12_13_09_+1100_lsOPgMWQm04RXl/E
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iQIcBAEBCAAGBQJOsJklAAoJEECxmPOUX5FE9UYP/2GMqOVKG+lC9uiq85ulDaGJ
rIfH6kGOwyMER5NpeTdJM4XaOnJwVKum0R4vA1F/Uz4JpO7CtWZjc8+bOYyGHLtV
uVc1Hf8dv8hLmy0YEFuVE+SvuacI70txycM9Uv6eGEYvCwh/c1BkOZk2/kb27vK2
zkDQ24l7BblWIm3fE31xPgtH8X2mmmHrMpdbq1fmOxz83Xa3IS82yksD0/fGjDNn
54RLMtxXwe4bdIRiDhUxLSqJT3UKmXZRiI24SwzSNzC//rIxxe9M39CaxWHCdWXL
0PCEbzE2EQof7aWypkDVJmOHYQGNg2uxdP7ZxeNZNkGR7scblvxHxtq906/xG53N
uVg6e6qS8CwjHPMlQl6WSRTBEXReMDKffeAQ9aACEvQAHtFW1HVqDOLSU1lS45vy
Y9LRGMB8WqvsLw35MaY74/yidnD60Zgl2pDN5KL2RTfh1wgEGh5YilunXvCxaD8l
J8hHXpFtG0n1r/pfsq876AGmNEnOF1IdfFmrsa8ZnUnCKNgGAuw7cUem8X8t7k8y
U1KM6Qu0cWdaCVMcvAP3bcfKlYYgYnclDxH/jXtjgFJlujb3ZZ5Yj4IHaq3mDS2I
A1qWnbU3FvI5ck5C81gEUqoL0Zp5EeN7g9wDLGVLKPO3f/HH7sMONlAL8nmBhyna
YbsmYz14IPXe4mZ02U2c
=/vwG
-----END PGP SIGNATURE-----

--Signature=_Wed__2_Nov_2011_12_13_09_+1100_lsOPgMWQm04RXl/E--


--===============1915654457==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1915654457==--


From xen-devel-bounces@lists.xensource.com Tue Nov 01 21:28:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 21:28:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLSQk-0005fX-M8; Tue, 01 Nov 2011 21:28:02 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLSPz-0005Se-T9
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 21:27:16 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1320208032!1598512!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21044 invoked from network); 2 Nov 2011 04:27:12 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 04:27:12 -0000
X-IronPort-AV: E=Sophos;i="4.69,441,1315180800"; 
   d="scan'208";a="8707657"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 04:27:12 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 04:27:12 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RLSPw-0001XO-0B;
	Wed, 02 Nov 2011 04:27:12 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RLSPv-0000eq-Mg;
	Wed, 02 Nov 2011 04:27:11 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9655-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 2 Nov 2011 04:27:11 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9655: tolerable FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9655 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9655/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-i386-xl-multivcpu  8 debian-fixup                 fail pass in 9652
 test-amd64-i386-xl-credit2    8 debian-fixup                 fail pass in 9652
 test-amd64-amd64-xl-sedf      5 xen-boot                     fail pass in 9652

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-sedf 14 guest-localmigrate/x10 fail in 9652 blocked in 9655

version targeted for testing:
 xen                  068d3d55ce6e
baseline version:
 xen                  068d3d55ce6e

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Published tested tree is already up to date.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 01 21:54:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 01 Nov 2011 21:54:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLSqH-0006Wm-VO; Tue, 01 Nov 2011 21:54:25 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLSpM-0006KG-K6
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 21:53:29 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1320209603!1621970!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30138 invoked from network); 2 Nov 2011 04:53:25 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 04:53:25 -0000
X-IronPort-AV: E=Sophos;i="4.69,442,1315195200"; d="scan'208";a="169039329"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 00:53:23 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Wed, 2 Nov 2011
	00:53:22 -0400
Message-ID: <1320209597.3084.36.camel@cthulhu.hellion.org.uk>
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Greg KH <greg@kroah.com>
Date: Wed, 2 Nov 2011 13:53:17 +0900
In-Reply-To: <20111101230951.GA21951@kroah.com>
References: <20111026210539.64BA823EB@git.kroah.org>
	<20111101230951.GA21951@kroah.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Cc: Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	"stable@vger.kernel.org" <stable@vger.kernel.org>,
	"Rafael J. Wysocki" <rjw@sisk.pl>,
	xen-devel <xen-devel@lists.xensource.com>,
	Stefan Bader <stefan.bader@canonical.com>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: Patch Upstream: genirq: Add IRQF_RESUME_EARLY and
 resume such IRQs earlier
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi Greg,

On Tue, 2011-11-01 at 19:09 -0400, Greg KH wrote:
> If someone wants this in .32-stable, can they provide me a backported
> version, as this doesn't backport very easily (i.e. I tried and failed.)

Please see <1318859710.16132.15.camel@zakaz.uk.xensource.com> which
contains a backported version of the patch.

Stefan Bader reported that he was still having some issues even with
this patch which I haven't had a chance to investigate fully, however I
think the patch is correct in its own right.

Ian.

> 
> thanks,
> 
> greg k-h
> 
> On Wed, Oct 26, 2011 at 05:05:39PM -0400, Gregs git-bot wrote:
> > commit: 9bab0b7fbaceec47d32db51cd9e59c82fb071f5a
> > From: Ian Campbell <ian.campbell@citrix.com>
> > Date: Mon, 3 Oct 2011 15:37:00 +0100
> > Subject: genirq: Add IRQF_RESUME_EARLY and resume such IRQs earlier
> > 
> > This adds a mechanism to resume selected IRQs during syscore_resume
> > instead of dpm_resume_noirq.
> > 
> > Under Xen we need to resume IRQs associated with IPIs early enough
> > that the resched IPI is unmasked and we can therefore schedule
> > ourselves out of the stop_machine where the suspend/resume takes
> > place.
> > 
> > This issue was introduced by 676dc3cf5bc3 "xen: Use IRQF_FORCE_RESUME".
> > 
> > Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
> > Cc: Rafael J. Wysocki <rjw@sisk.pl>
> > Cc: Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>
> > Cc: xen-devel <xen-devel@lists.xensource.com>
> > Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > Link: http://lkml.kernel.org/r/1318713254.11016.52.camel@dagon.hellion.org.uk
> > Cc: stable@kernel.org (at least to 2.6.32.y)
> > Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> > ---
> >  drivers/xen/events.c      |    2 +-
> >  include/linux/interrupt.h |    3 ++
> >  kernel/irq/pm.c           |   48 ++++++++++++++++++++++++++++++++++++++------
> >  3 files changed, 45 insertions(+), 8 deletions(-)
> > 
> > diff --git a/drivers/xen/events.c b/drivers/xen/events.c
> > index da70f5c..a758bc1 100644
> > --- a/drivers/xen/events.c
> > +++ b/drivers/xen/events.c
> > @@ -1021,7 +1021,7 @@ int bind_ipi_to_irqhandler(enum ipi_vector ipi,
> >  	if (irq < 0)
> >  		return irq;
> >  
> > -	irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME;
> > +	irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME | IRQF_EARLY_RESUME;
> >  	retval = request_irq(irq, handler, irqflags, devname, dev_id);
> >  	if (retval != 0) {
> >  		unbind_from_irq(irq);
> > diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
> > index 664544f..a64b00e 100644
> > --- a/include/linux/interrupt.h
> > +++ b/include/linux/interrupt.h
> > @@ -59,6 +59,8 @@
> >   * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend
> >   * IRQF_FORCE_RESUME - Force enable it on resume even if IRQF_NO_SUSPEND is set
> >   * IRQF_NO_THREAD - Interrupt cannot be threaded
> > + * IRQF_EARLY_RESUME - Resume IRQ early during syscore instead of at device
> > + *                resume time.
> >   */
> >  #define IRQF_DISABLED		0x00000020
> >  #define IRQF_SAMPLE_RANDOM	0x00000040
> > @@ -72,6 +74,7 @@
> >  #define IRQF_NO_SUSPEND		0x00004000
> >  #define IRQF_FORCE_RESUME	0x00008000
> >  #define IRQF_NO_THREAD		0x00010000
> > +#define IRQF_EARLY_RESUME	0x00020000
> >  
> >  #define IRQF_TIMER		(__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD)
> >  
> > diff --git a/kernel/irq/pm.c b/kernel/irq/pm.c
> > index f76fc00..15e53b1 100644
> > --- a/kernel/irq/pm.c
> > +++ b/kernel/irq/pm.c
> > @@ -9,6 +9,7 @@
> >  #include <linux/irq.h>
> >  #include <linux/module.h>
> >  #include <linux/interrupt.h>
> > +#include <linux/syscore_ops.h>
> >  
> >  #include "internals.h"
> >  
> > @@ -39,25 +40,58 @@ void suspend_device_irqs(void)
> >  }
> >  EXPORT_SYMBOL_GPL(suspend_device_irqs);
> >  
> > -/**
> > - * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs()
> > - *
> > - * Enable all interrupt lines previously disabled by suspend_device_irqs() that
> > - * have the IRQS_SUSPENDED flag set.
> > - */
> > -void resume_device_irqs(void)
> > +static void resume_irqs(bool want_early)
> >  {
> >  	struct irq_desc *desc;
> >  	int irq;
> >  
> >  	for_each_irq_desc(irq, desc) {
> >  		unsigned long flags;
> > +		bool is_early = desc->action &&
> > +			desc->action->flags & IRQF_EARLY_RESUME;
> > +
> > +		if (is_early != want_early)
> > +			continue;
> >  
> >  		raw_spin_lock_irqsave(&desc->lock, flags);
> >  		__enable_irq(desc, irq, true);
> >  		raw_spin_unlock_irqrestore(&desc->lock, flags);
> >  	}
> >  }
> > +
> > +/**
> > + * irq_pm_syscore_ops - enable interrupt lines early
> > + *
> > + * Enable all interrupt lines with %IRQF_EARLY_RESUME set.
> > + */
> > +static void irq_pm_syscore_resume(void)
> > +{
> > +	resume_irqs(true);
> > +}
> > +
> > +static struct syscore_ops irq_pm_syscore_ops = {
> > +	.resume		= irq_pm_syscore_resume,
> > +};
> > +
> > +static int __init irq_pm_init_ops(void)
> > +{
> > +	register_syscore_ops(&irq_pm_syscore_ops);
> > +	return 0;
> > +}
> > +
> > +device_initcall(irq_pm_init_ops);
> > +
> > +/**
> > + * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs()
> > + *
> > + * Enable all non-%IRQF_EARLY_RESUME interrupt lines previously
> > + * disabled by suspend_device_irqs() that have the IRQS_SUSPENDED flag
> > + * set as well as those with %IRQF_FORCE_RESUME.
> > + */
> > +void resume_device_irqs(void)
> > +{
> > +	resume_irqs(false);
> > +}
> >  EXPORT_SYMBOL_GPL(resume_device_irqs);
> >  
> >  /**
> > -- 
> > 1.7.3.4



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 00:00:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 00:00:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLUo6-00013w-3L; Wed, 02 Nov 2011 00:00:18 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLUmu-0000qw-Em
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 23:59:08 -0700
X-Env-Sender: cyliu@suse.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1320217105!55201819!1
X-Originating-IP: [137.65.248.33]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16665 invoked from network); 2 Nov 2011 06:58:25 -0000
Received: from novprvlin0050.provo.novell.com (HELO
	novprvlin0050.provo.novell.com) (137.65.248.33)
	by server-7.tower-27.messagelabs.com with SMTP;
	2 Nov 2011 06:58:25 -0000
Received: from INET-PRV1-MTA by novprvlin0050.provo.novell.com
	with Novell_GroupWise; Wed, 02 Nov 2011 00:58:59 -0600
Message-Id: <4EB184DE020000660000603E@novprvlin0050.provo.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 Beta 
Date: Wed, 02 Nov 2011 00:58:54 -0600
From: "Chun Yan Liu" <cyliu@suse.com>
To: "Stefano Stabellini" <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images
 fail
References: <1319808450-9617-1-git-send-email-cyliu@suse.com>
In-Reply-To: <1319808450-9617-1-git-send-email-cyliu@suse.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part426DB13E.2__="
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part426DB13E.2__=
Content-Type: multipart/alternative; boundary="=__Part426DB13E.3__="

--=__Part426DB13E.3__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable


Stefano, could you review the revised patch and share your comments? =
Thanks.=20

>>> Chunyan Liu <cyliu@suse.com> 10/28/2011 9:27 PM >>>
Start qemu-nbd to mount non-raw qdisk in dom0 so that xl can create PV =
guest with qcow/qcow2 disk image and using pygrub.
v2: use fork and exec instead of system(3)

Signed-off-by: Chunyan Liu <cyliu@suse.com>

diff -r b4cf57bbc3fb tools/libxl/libxl.c
--- a/tools/libxl/libxl.cThu Oct 20 15:24:46 2011 +0800
+++ b/tools/libxl/libxl.cFri Oct 28 20:50:36 2011 +0800
@@ -1077,6 +1077,58 @@ out_free:
     libxl__free_all(&gc);
     return rc;
}
+static int fork_exec(char *arg0, char **args)
+{
+    pid_t pid;
+    int status;
+
+    pid =3D fork();
+    if (pid < 0)
+        return -1;
+    else if (pid =3D=3D 0){
+        execvp(arg0, args);
+        exit(127);
+    }
+    sleep(1);  =20
+    while (waitpid(pid, &status, 0) < 0) {
+        if (errno !=3D EINTR) {
+            status =3D -1;
+            break;
+        }
+    }
+
+    return status;
+}
+
+static char * nbd_mount_disk(libxl__gc *gc, libxl_device_disk *disk)
+{
+    int i;
+    int nbds_max =3D 16;
+    char *nbd_dev =3D NULL;
+    char *args[] =3D {"qemu-nbd","-c",NULL,NULL,NULL};
+    char *ret =3D NULL;
+
+    for (i =3D 0; i < nbds_max; i++) {
+        nbd_dev =3D libxl__sprintf(gc, "/dev/nbd%d", i);
+        args[2] =3D libxl__sprintf(gc, "%s", nbd_dev);
+        args[3] =3D libxl__sprintf(gc, "%s", disk->pdev_path);
+        if (fork_exec(args[0], args) =3D=3D 0) {
+            ret =3D strdup(nbd_dev);
+            break;
+        }
+    }
+
+    return ret;
+}
+
+static int nbd_unmount_disk(libxl__gc *gc, char *diskpath) {
+    char *args[] =3D {"qemu-nbd","-d",NULL,NULL};
+    args[2] =3D libxl__sprintf(gc, "%s", diskpath);
+    if (fork_exec(args[0], args))
+        return 0;
+    else
+        return ERROR_FAIL;
+}

char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk =
*disk)
{
@@ -1084,6 +1136,7 @@ char * libxl_device_disk_local_attach(li
     char *dev =3D NULL;
     char *ret =3D NULL;
     int rc;
+    char *mdev =3D NULL;

     rc =3D libxl__device_disk_set_backend(&gc, disk);
     if (rc) goto out;
@@ -1118,8 +1171,12 @@ char * libxl_device_disk_local_attach(li
             break;
         case LIBXL_DISK_BACKEND_QDISK:
             if (disk->format !=3D LIBXL_DISK_FORMAT_RAW) {
-                LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot locally"
-                           " attach a qdisk image if the format is not =
raw");
+                LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "attaching a non-raw =
qdisk image to domain 0\n");
+                mdev =3D nbd_mount_disk(&gc, disk);
+                if (mdev)
+                    dev =3D mdev;
+                else
+                    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "fail to mount =
image with qemu-nbd");
                 break;
             }
             LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "locally attaching qdisk =
%s\n",
@@ -1135,11 +1192,13 @@ char * libxl_device_disk_local_attach(li
  out:
     if (dev !=3D NULL)
         ret =3D strdup(dev);
+    if (mdev)
+        free(mdev);
     libxl__free_all(&gc);
     return ret;
}

-int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk =
*disk)
+int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk =
*disk, char *diskpath)
{
     /* Nothing to do for PHYSTYPE_PHY. */

@@ -1147,7 +1206,22 @@ int libxl_device_disk_local_detach(libxl
      * For other device types assume that the blktap2 process is
      * needed by the soon to be started domain and do nothing.
      */
+    libxl__gc gc =3D LIBXL_INIT_GC(ctx);
+    int ret;

+    switch (disk->backend) {
+        case LIBXL_DISK_BACKEND_QDISK:
+            if (disk->format !=3D LIBXL_DISK_FORMAT_RAW) {
+                LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Locally detach a =
non-raw "
+                    "qdisk image");
+                ret =3D nbd_unmount_disk(&gc, diskpath);
+                return ret;
+            }
+        default:
+            break;
+    }
+
+    libxl__free_all(&gc);
     return 0;
}

diff -r b4cf57bbc3fb tools/libxl/libxl.h
--- a/tools/libxl/libxl.hThu Oct 20 15:24:46 2011 +0800
+++ b/tools/libxl/libxl.hFri Oct 28 20:50:36 2011 +0800
@@ -390,7 +390,7 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u
  * Make a disk available in this domain. Returns path to a device.
  */
char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk =
*disk);
-int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk =
*disk);
+int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk =
*disk, char *diskpath);

int libxl_device_nic_init(libxl_device_nic *nic, int dev_num);
int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic =
*nic);
diff -r b4cf57bbc3fb tools/libxl/libxl_bootloader.c
--- a/tools/libxl/libxl_bootloader.cThu Oct 20 15:24:46 2011 +0800
+++ b/tools/libxl/libxl_bootloader.cFri Oct 28 20:50:36 2011 +0800
@@ -424,7 +424,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,
     rc =3D 0;
out_close:
     if (diskpath) {
-        libxl_device_disk_local_detach(ctx, disk);
+        libxl_device_disk_local_detach(ctx, disk, diskpath);
         free(diskpath);
     }
     if (fifo_fd > -1)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part426DB13E.3__=
Content-Type: text/html; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

<html>=0A  <head>=0A=0A  </head>=0A  <body style=3D"font-variant: normal; =
margin-right: 4px; margin-bottom: 1px; font-size: 10pt; font-weight: =
normal; margin-top: 4px; line-height: normal; font-family: Dialog; =
margin-left: 4px; font-style: normal">=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">Stefano&#44; =
could you review the revised patch and share your comments&#63; Thanks.</fo=
nt>    </p>=0A<br>      =0A    <p style=3D"margin-top: 0; margin-bottom: =
0">=0A      &gt;&gt;&gt; Chunyan Liu &lt;cyliu@suse.com&gt; 10/28/2011 =
9:27 PM &gt;&gt;&gt;<br>Start qemu-nbd to mount non-raw qdisk in dom0 so =
that xl can create PV guest with qcow/qcow2 disk image and using pygrub.<br=
>v2: use fork and exec instead of system&#40;3&#41;<br><br>Signed-off-by: =
Chunyan Liu &lt;cyliu@suse.com&gt;<br><br>diff -r b4cf57bbc3fb tools/libxl/=
libxl.c<br>--- a/tools/libxl/libxl.cThu Oct 20 15:24:46 2011 &#43;0800<br>&=
#43;&#43;&#43; b/tools/libxl/libxl.cFri Oct 28 20:50:36 2011 &#43;0800<br>@=
@ -1077&#44;6 &#43;1077&#44;58 @@ out_free:<br>&#160;&#160;&#160;&#160;&#32=
;libxl__free_all&#40;&amp;gc&#41;&#59;<br>&#160;&#160;&#160;&#160;&#32;retu=
rn rc&#59;<br>&#125;<br>&#43;static int fork_exec&#40;char &#42;arg0&#44; =
char &#42;&#42;args&#41;<br>&#43;&#123;<br>&#43;&#160;&#160;&#160;&#32;pid_=
t pid&#59;<br>&#43;&#160;&#160;&#160;&#32;int status&#59;<br>&#43;<br>&#43;=
&#160;&#160;&#160;&#32;pid &#61; fork&#40;&#41;&#59;<br>&#43;&#160;&#160;&#=
160;&#32;if &#40;pid &lt; 0&#41;<br>&#43;&#160;&#160;&#160;&#160;&#160;&#16=
0;&#160;&#32;return -1&#59;<br>&#43;&#160;&#160;&#160;&#32;else if =
&#40;pid &#61;&#61; 0&#41;&#123;<br>&#43;&#160;&#160;&#160;&#160;&#160;&#16=
0;&#160;&#32;execvp&#40;arg0&#44; args&#41;&#59;<br>&#43;&#160;&#160;&#160;=
&#160;&#160;&#160;&#160;&#32;exit&#40;127&#41;&#59;<br>&#43;&#160;&#160;&#1=
60;&#32;&#125;<br>&#43;&#160;&#160;&#160;&#32;sleep&#40;1&#41;&#59;&#160;&#=
160;&#160;<br>&#43;&#160;&#160;&#160;&#32;while &#40;waitpid&#40;pid&#44; =
&amp;status&#44; 0&#41; &lt; 0&#41;&#32;&#123;<br>&#43;&#160;&#160;&#160;&#=
160;&#160;&#160;&#160;&#32;if &#40;errno &#33;&#61; EINTR&#41;&#32;&#123;<b=
r>&#43;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#=
32;status &#61; -1&#59;<br>&#43;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&=
#160;&#160;&#160;&#160;&#32;break&#59;<br>&#43;&#160;&#160;&#160;&#160;&#16=
0;&#160;&#160;&#32;&#125;<br>&#43;&#160;&#160;&#160;&#32;&#125;<br>&#43;<br=
>&#43;&#160;&#160;&#160;&#32;return status&#59;<br>&#43;&#125;<br>&#43;<br>=
&#43;static char &#42; nbd_mount_disk&#40;libxl__gc &#42;gc&#44; libxl_devi=
ce_disk &#42;disk&#41;<br>&#43;&#123;<br>&#43;&#160;&#160;&#160;&#32;int =
i&#59;<br>&#43;&#160;&#160;&#160;&#32;int nbds_max &#61; 16&#59;<br>&#43;&#=
160;&#160;&#160;&#32;char &#42;nbd_dev &#61; NULL&#59;<br>&#43;&#160;&#160;=
&#160;&#32;char &#42;args&#91;&#93; &#61;&#32;&#123;&quot;qemu-nbd&quot;&#4=
4;&quot;-c&quot;&#44;NULL&#44;NULL&#44;NULL&#125;&#59;<br>&#43;&#160;&#160;=
&#160;&#32;char &#42;ret &#61; NULL&#59;<br>&#43;<br>&#43;&#160;&#160;&#160=
;&#32;for &#40;i &#61; 0&#59; i &lt; nbds_max&#59; i&#43;&#43;&#41;&#32;&#1=
23;<br>&#43;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#32;nbd_dev &#61; =
libxl__sprintf&#40;gc&#44; &quot;/dev/nbd&#37;d&quot;&#44; i&#41;&#59;<br>&=
#43;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#32;args&#91;2&#93; &#61; =
libxl__sprintf&#40;gc&#44; &quot;&#37;s&quot;&#44; nbd_dev&#41;&#59;<br>&#4=
3;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#32;args&#91;3&#93; &#61; =
libxl__sprintf&#40;gc&#44; &quot;&#37;s&quot;&#44; disk-&gt;pdev_path&#41;&=
#59;<br>&#43;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#32;if &#40;fork_ex=
ec&#40;args&#91;0&#93;&#44; args&#41; &#61;&#61; 0&#41;&#32;&#123;<br>&#43;=
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#32;ret =
&#61; strdup&#40;nbd_dev&#41;&#59;<br>&#43;&#160;&#160;&#160;&#160;&#160;&#=
160;&#160;&#160;&#160;&#160;&#160;&#32;break&#59;<br>&#43;&#160;&#160;&#160=
;&#160;&#160;&#160;&#160;&#32;&#125;<br>&#43;&#160;&#160;&#160;&#32;&#125;<=
br>&#43;<br>&#43;&#160;&#160;&#160;&#32;return ret&#59;<br>&#43;&#125;<br>&=
#43;<br>&#43;static int nbd_unmount_disk&#40;libxl__gc &#42;gc&#44; char =
&#42;diskpath&#41;&#32;&#123;<br>&#43;&#160;&#160;&#160;&#32;char =
&#42;args&#91;&#93; &#61;&#32;&#123;&quot;qemu-nbd&quot;&#44;&quot;-d&quot;=
&#44;NULL&#44;NULL&#125;&#59;<br>&#43;&#160;&#160;&#160;&#32;args&#91;2&#93=
; &#61; libxl__sprintf&#40;gc&#44; &quot;&#37;s&quot;&#44; diskpath&#41;&#5=
9;<br>&#43;&#160;&#160;&#160;&#32;if &#40;fork_exec&#40;args&#91;0&#93;&#44=
; args&#41;&#41;<br>&#43;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#32;ret=
urn 0&#59;<br>&#43;&#160;&#160;&#160;&#32;else<br>&#43;&#160;&#160;&#160;&#=
160;&#160;&#160;&#160;&#32;return ERROR_FAIL&#59;<br>&#43;&#125;<br><br>cha=
r &#42; libxl_device_disk_local_attach&#40;libxl_ctx &#42;ctx&#44; =
libxl_device_disk &#42;disk&#41;<br>&#123;<br>@@ -1084&#44;6 &#43;1136&#44;=
7 @@ char &#42; libxl_device_disk_local_attach&#40;li<br>&#160;&#160;&#160;=
&#160;&#32;char &#42;dev &#61; NULL&#59;<br>&#160;&#160;&#160;&#160;&#32;ch=
ar &#42;ret &#61; NULL&#59;<br>&#160;&#160;&#160;&#160;&#32;int rc&#59;<br>=
&#43;&#160;&#160;&#160;&#32;char &#42;mdev &#61; NULL&#59;<br><br>&#160;&#1=
60;&#160;&#160;&#32;rc &#61; libxl__device_disk_set_backend&#40;&amp;gc&#44=
; disk&#41;&#59;<br>&#160;&#160;&#160;&#160;&#32;if &#40;rc&#41; goto =
out&#59;<br>@@ -1118&#44;8 &#43;1171&#44;12 @@ char &#42; libxl_device_disk=
_local_attach&#40;li<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1=
60;&#160;&#160;&#160;&#32;break&#59;<br>&#160;&#160;&#160;&#160;&#160;&#160=
;&#160;&#160;&#32;case LIBXL_DISK_BACKEND_QDISK:<br>&#160;&#160;&#160;&#160=
;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#32;if &#40;disk-&gt;form=
at &#33;&#61; LIBXL_DISK_FORMAT_RAW&#41;&#32;&#123;<br>-&#160;&#160;&#160;&=
#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#32=
;LIBXL__LOG&#40;ctx&#44; LIBXL__LOG_ERROR&#44; &quot;cannot locally&quot;<b=
r>-&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;=
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1=
60;&#160;&#32;&quot; attach a qdisk image if the format is not raw&quot;&#4=
1;&#59;<br>&#43;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160=
;&#160;&#160;&#160;&#160;&#160;&#32;LIBXL__LOG&#40;ctx&#44; LIBXL__LOG_DEBU=
G&#44; &quot;attaching a non-raw qdisk image to domain 0&#92;n&quot;&#41;&#=
59;<br>&#43;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1=
60;&#160;&#160;&#160;&#160;&#32;mdev &#61; nbd_mount_disk&#40;&amp;gc&#44; =
disk&#41;&#59;<br>&#43;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16=
0;&#160;&#160;&#160;&#160;&#160;&#160;&#32;if &#40;mdev&#41;<br>&#43;&#160;=
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1=
60;&#160;&#160;&#160;&#160;&#160;&#32;dev &#61; mdev&#59;<br>&#43;&#160;&#1=
60;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;=
&#160;&#32;else<br>&#43;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1=
60;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#32;LIBXL__=
LOG&#40;ctx&#44; LIBXL__LOG_ERROR&#44; &quot;fail to mount image with =
qemu-nbd&quot;&#41;&#59;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160=
;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#32;break&#59;<br>&#160;&=
#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#32;&#125=
;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16=
0;&#32;LIBXL__LOG&#40;ctx&#44; LIBXL__LOG_DEBUG&#44; &quot;locally =
attaching qdisk &#37;s&#92;n&quot;&#44;<br>@@ -1135&#44;11 &#43;1192&#44;13=
 @@ char &#42; libxl_device_disk_local_attach&#40;li<br>&#160;&#32;out:<br>=
&#160;&#160;&#160;&#160;&#32;if &#40;dev &#33;&#61; NULL&#41;<br>&#160;&#16=
0;&#160;&#160;&#160;&#160;&#160;&#160;&#32;ret &#61; strdup&#40;dev&#41;&#5=
9;<br>&#43;&#160;&#160;&#160;&#32;if &#40;mdev&#41;<br>&#43;&#160;&#160;&#1=
60;&#160;&#160;&#160;&#160;&#32;free&#40;mdev&#41;&#59;<br>&#160;&#160;&#16=
0;&#160;&#32;libxl__free_all&#40;&amp;gc&#41;&#59;<br>&#160;&#160;&#160;&#1=
60;&#32;return ret&#59;<br>&#125;<br><br>-int libxl_device_disk_local_detac=
h&#40;libxl_ctx &#42;ctx&#44; libxl_device_disk &#42;disk&#41;<br>&#43;int =
libxl_device_disk_local_detach&#40;libxl_ctx &#42;ctx&#44; libxl_device_dis=
k &#42;disk&#44; char &#42;diskpath&#41;<br>&#123;<br>&#160;&#160;&#160;&#1=
60;&#32;/&#42; Nothing to do for PHYSTYPE_PHY. &#42;/<br><br>@@ -1147&#44;7=
 &#43;1206&#44;22 @@ int libxl_device_disk_local_detach&#40;libxl<br>&#160;=
&#160;&#160;&#160;&#160;&#32;&#42; For other device types assume that the =
blktap2 process is<br>&#160;&#160;&#160;&#160;&#160;&#32;&#42; needed by =
the soon to be started domain and do nothing.<br>&#160;&#160;&#160;&#160;&#=
160;&#32;&#42;/<br>&#43;&#160;&#160;&#160;&#32;libxl__gc gc &#61; =
LIBXL_INIT_GC&#40;ctx&#41;&#59;<br>&#43;&#160;&#160;&#160;&#32;int =
ret&#59;<br><br>&#43;&#160;&#160;&#160;&#32;switch &#40;disk-&gt;backend&#4=
1;&#32;&#123;<br>&#43;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#32;case =
LIBXL_DISK_BACKEND_QDISK:<br>&#43;&#160;&#160;&#160;&#160;&#160;&#160;&#160=
;&#160;&#160;&#160;&#160;&#32;if &#40;disk-&gt;format &#33;&#61; LIBXL_DISK=
_FORMAT_RAW&#41;&#32;&#123;<br>&#43;&#160;&#160;&#160;&#160;&#160;&#160;&#1=
60;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#32;LIBXL__LOG&#40;ctx&=
#44; LIBXL__LOG_DEBUG&#44; &quot;Locally detach a non-raw &quot;<br>&#43;&#=
160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160=
;&#160;&#160;&#160;&#160;&#160;&#160;&#32;&quot;qdisk image&quot;&#41;&#59;=
<br>&#43;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;=
&#160;&#160;&#160;&#160;&#32;ret &#61; nbd_unmount_disk&#40;&amp;gc&#44; =
diskpath&#41;&#59;<br>&#43;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;=
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#32;return ret&#59;<br>&#43;&#16=
0;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#32;&#125;<b=
r>&#43;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#32;default:<br>&#43;&#16=
0;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#32;break&#5=
9;<br>&#43;&#160;&#160;&#160;&#32;&#125;<br>&#43;<br>&#43;&#160;&#160;&#160=
;&#32;libxl__free_all&#40;&amp;gc&#41;&#59;<br>&#160;&#160;&#160;&#160;&#32=
;return 0&#59;<br>&#125;<br><br>diff -r b4cf57bbc3fb tools/libxl/libxl.h<br=
>--- a/tools/libxl/libxl.hThu Oct 20 15:24:46 2011 &#43;0800<br>&#43;&#43;&=
#43; b/tools/libxl/libxl.hFri Oct 28 20:50:36 2011 &#43;0800<br>@@ =
-390&#44;7 &#43;390&#44;7 @@ int libxl_cdrom_insert&#40;libxl_ctx =
&#42;ctx&#44; u<br>&#160;&#32;&#42; Make a disk available in this domain. =
Returns path to a device.<br>&#160;&#32;&#42;/<br>char &#42; libxl_device_d=
isk_local_attach&#40;libxl_ctx &#42;ctx&#44; libxl_device_disk &#42;disk&#4=
1;&#59;<br>-int libxl_device_disk_local_detach&#40;libxl_ctx &#42;ctx&#44; =
libxl_device_disk &#42;disk&#41;&#59;<br>&#43;int libxl_device_disk_local_d=
etach&#40;libxl_ctx &#42;ctx&#44; libxl_device_disk &#42;disk&#44; char =
&#42;diskpath&#41;&#59;<br><br>int libxl_device_nic_init&#40;libxl_device_n=
ic &#42;nic&#44; int dev_num&#41;&#59;<br>int libxl_device_nic_add&#40;libx=
l_ctx &#42;ctx&#44; uint32_t domid&#44; libxl_device_nic &#42;nic&#41;&#59;=
<br>diff -r b4cf57bbc3fb tools/libxl/libxl_bootloader.c<br>--- a/tools/libx=
l/libxl_bootloader.cThu Oct 20 15:24:46 2011 &#43;0800<br>&#43;&#43;&#43; =
b/tools/libxl/libxl_bootloader.cFri Oct 28 20:50:36 2011 &#43;0800<br>@@ =
-424&#44;7 &#43;424&#44;7 @@ int libxl_run_bootloader&#40;libxl_ctx =
&#42;ctx&#44;<br>&#160;&#160;&#160;&#160;&#32;rc &#61; 0&#59;<br>out_close:=
<br>&#160;&#160;&#160;&#160;&#32;if &#40;diskpath&#41;&#32;&#123;<br>-&#160=
;&#160;&#160;&#160;&#160;&#160;&#160;&#32;libxl_device_disk_local_detach&#4=
0;ctx&#44; disk&#41;&#59;<br>&#43;&#160;&#160;&#160;&#160;&#160;&#160;&#160=
;&#32;libxl_device_disk_local_detach&#40;ctx&#44; disk&#44; diskpath&#41;&#=
59;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#32;free&#40;diskpa=
th&#41;&#59;<br>&#160;&#160;&#160;&#160;&#32;&#125;<br>&#160;&#160;&#160;&#=
160;&#32;if &#40;fifo_fd &gt; -1&#41;<br><br>______________________________=
_________________<br>Xen-devel mailing list<br>Xen-devel@lists.xensource.co=
m<br><a href=3D"http://lists.xensource.com/xen-devel">http://lists.xensourc=
e.com/xen-devel</a><br>=0A    </p>=0A  </body>=0A</html>=0A

--=__Part426DB13E.3__=--

--=__Part426DB13E.2__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part426DB13E.2__=--


From xen-devel-bounces@lists.xensource.com Wed Nov 02 01:50:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 01:50:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLWWU-0003WF-Mc; Wed, 02 Nov 2011 01:50:14 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLWVW-0003Jj-P2
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 01:49:15 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1320223751!1991721!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4543 invoked from network); 2 Nov 2011 08:49:11 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 2 Nov 2011 08:49:11 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 02 Nov 2011 08:49:10 +0000
Message-Id: <4EB11212020000780005E5F5@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 02 Nov 2011 08:49:06 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Yang Z Zhang" <yang.z.zhang@intel.com>,
	 "Keir Fraser" <keir@xen.org>
Subject: Re: [Xen-devel] [PATCH] pm : provide CC7/PC2 residency
References: <749B9D3DBF0F054390025D9EAFF47F2212D2A848E5@shsmsx501.ccr.corp.intel.com>
In-Reply-To: <749B9D3DBF0F054390025D9EAFF47F2212D2A848E5@shsmsx501.ccr.corp.intel.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 25.10.11 at 15:34, "Zhang, Yang Z" <yang.z.zhang@intel.com> wrote:
> --- a/xen/include/public/sysctl.h       Mon Oct 24 18:01:07 2011 +0100
> +++ b/xen/include/public/sysctl.h       Fri Oct 28 21:33:07 2011 +0800
> @@ -225,11 +225,13 @@
>      uint64_aligned_t idle_time;                 /* idle time from boot =
*/
>      XEN_GUEST_HANDLE_64(uint64) triggers;    /* Cx trigger counts */
>      XEN_GUEST_HANDLE_64(uint64) residencies; /* Cx residencies */
> +    uint64_aligned_t pc2;
>      uint64_aligned_t pc3;
>      uint64_aligned_t pc6;
>      uint64_aligned_t pc7;
>      uint64_aligned_t cc3;
>      uint64_aligned_t cc6;
> +    uint64_aligned_t cc7;
>  };
>=20
>  struct xen_sysctl_get_pmstat {

Structure layout changes like this should be accompanied by a bump
of XEN_SYSCTL_INTERFACE_VERSION - is there any reason not to
do so in this case?

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 02:24:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 02:24:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLX3f-0004X9-JR; Wed, 02 Nov 2011 02:24:31 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLX2m-0004KO-5O
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 02:23:36 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1320225811!3321688!1
X-Originating-IP: [216.32.181.186]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12948 invoked from network); 2 Nov 2011 09:23:32 -0000
Received: from ch1ehsobe006.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.186)
	by server-2.tower-216.messagelabs.com with AES128-SHA encrypted SMTP;
	2 Nov 2011 09:23:32 -0000
Received: from mail118-ch1-R.bigfish.com (10.43.68.245) by
	CH1EHSOBE014.bigfish.com (10.43.70.64) with Microsoft SMTP Server id
	14.1.225.22; Wed, 2 Nov 2011 09:23:17 +0000
Received: from mail118-ch1 (localhost.localdomain [127.0.0.1])	by
	mail118-ch1-R.bigfish.com (Postfix) with ESMTP id 001D52E02DB;
	Wed,  2 Nov 2011 09:23:24 +0000 (UTC)
X-SpamScore: -11
X-BigFish: VPS-11(zzbb2dK1432N98dKzz1202hzzz32i668h839h)
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
X-FB-SS: 13,
Received: from mail118-ch1 (localhost.localdomain [127.0.0.1]) by mail118-ch1
	(MessageSwitch) id 1320225803725620_1091;
	Wed,  2 Nov 2011 09:23:23 +0000 (UTC)
Received: from CH1EHSMHS026.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.241])	by mail118-ch1.bigfish.com (Postfix) with ESMTP id
	A388C1920056;	Wed,  2 Nov 2011 09:23:23 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	CH1EHSMHS026.bigfish.com (10.43.70.26) with Microsoft SMTP Server id
	14.1.225.22; Wed, 2 Nov 2011 09:23:24 +0000
X-WSS-ID: 0LU10QZ-02-258-02
X-M-MSG: 
Received: from sausexedgep01.amd.com (sausexedgep01-ext.amd.com
	[163.181.249.72])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 2F812C8008;	Wed,  2 Nov 2011 04:23:22 -0500 (CDT)
Received: from SAUSEXDAG01.amd.com (163.181.55.1) by sausexedgep01.amd.com
	(163.181.36.54) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Wed, 2 Nov 2011 04:23:59 -0500
Received: from storexhtp02.amd.com (172.24.4.4) by sausexdag01.amd.com
	(163.181.55.1) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Wed, 2 Nov 2011 04:23:23 -0500
Received: from rhodium.osrc.amd.com (165.204.15.173) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.83.0;
	Wed, 2 Nov 2011 05:23:14 -0400
Message-ID: <4EB10C00.10601@amd.com>
Date: Wed, 2 Nov 2011 10:23:12 +0100
From: Christoph Egger <Christoph.Egger@amd.com>
User-Agent: Mozilla/5.0 (X11; U; NetBSD amd64; en-US;
	rv:1.9.2.17) Gecko/20110523 Lightning/1.0b3pre Thunderbird/3.1.10
MIME-Version: 1.0
To: Ian Jackson <Ian.Jackson@eu.citrix.com>, Keir Fraser <keir@xen.org>, Tim
	Deegan <tim@xen.org>
Subject: Re: [Xen-devel] [PATCH] libxl: allow to enable/disable cpuid bits
References: <4EAFD200.4010207@amd.com>
	<20144.17265.621187.887785@mariner.uk.xensource.com>
In-Reply-To: <20144.17265.621187.887785@mariner.uk.xensource.com>
Content-Type: text/plain; charset="ISO-8859-1"; format=flowed
Content-Transfer-Encoding: 7bit
X-OriginatorOrg: amd.com
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/01/11 20:07, Ian Jackson wrote:
> Christoph Egger writes ("[Xen-devel] [PATCH] libxl: allow to enable/disable cpuid bits"):
>>
>> Allow to enable/disable SVM specific cpuid bits
>> in the guest config file via cpuid config option.
>> Also allow to enable/disable the hypervisor cpuid bit
>> in the guest config file. We need to disable the
>> hypervisor cpuid bit to get Hyper-V going.
>
> The change itself looks plausible to me.  However I don't know much
> about cpuid; can you get an ack from a hypervisor maintainer or an
> suitable expert ?

Keir? Tim?



Christoph

-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 02:25:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 02:25:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLX4s-0004uT-Hz; Wed, 02 Nov 2011 02:25:46 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLX3x-0004bB-Ax
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 02:24:50 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1320225884!2593756!1
X-Originating-IP: [65.55.88.14]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13866 invoked from network); 2 Nov 2011 09:24:46 -0000
Received: from tx2ehsobe004.messaging.microsoft.com (HELO
	TX2EHSOBE007.bigfish.com) (65.55.88.14)
	by server-16.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	2 Nov 2011 09:24:46 -0000
Received: from mail106-tx2-R.bigfish.com (10.9.14.253) by
	TX2EHSOBE007.bigfish.com (10.9.40.27) with Microsoft SMTP Server id
	14.1.225.22; Wed, 2 Nov 2011 09:24:30 +0000
Received: from mail106-tx2 (localhost.localdomain [127.0.0.1])	by
	mail106-tx2-R.bigfish.com (Postfix) with ESMTP id 7CC5913D8065;
	Wed,  2 Nov 2011 09:24:36 +0000 (UTC)
X-SpamScore: -11
X-BigFish: VPS-11(zzbb2dK1432N98dKzz1202hzz8275bhz32i668h839h61h)
X-Spam-TCS-SCL: 0:0
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
Received: from mail106-tx2 (localhost.localdomain [127.0.0.1]) by mail106-tx2
	(MessageSwitch) id 1320225876297453_2805;
	Wed,  2 Nov 2011 09:24:36 +0000 (UTC)
Received: from TX2EHSMHS036.bigfish.com (unknown [10.9.14.254])	by
	mail106-tx2.bigfish.com (Postfix) with ESMTP id 43C511AD804E;
	Wed,  2 Nov 2011 09:24:36 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	TX2EHSMHS036.bigfish.com (10.9.99.136) with Microsoft SMTP Server id
	14.1.225.22; Wed, 2 Nov 2011 09:24:29 +0000
X-WSS-ID: 0LU10T4-02-27X-02
X-M-MSG: 
Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com
	[163.181.249.73])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 2AB07C800C;	Wed,  2 Nov 2011 04:24:40 -0500 (CDT)
Received: from sausexhtp02.amd.com (163.181.3.152) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Wed, 2 Nov 2011 04:25:15 -0500
Received: from storexhtp02.amd.com (172.24.4.4) by sausexhtp02.amd.com
	(163.181.3.152) with Microsoft SMTP Server (TLS) id 8.3.83.0;
	Wed, 2 Nov 2011 04:24:41 -0500
Received: from rhodium.osrc.amd.com (165.204.15.173) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.83.0;
	Wed, 2 Nov 2011 05:24:40 -0400
Message-ID: <4EB10C56.2070409@amd.com>
Date: Wed, 2 Nov 2011 10:24:38 +0100
From: Christoph Egger <Christoph.Egger@amd.com>
User-Agent: Mozilla/5.0 (X11; U; NetBSD amd64; en-US;
	rv:1.9.2.17) Gecko/20110523 Lightning/1.0b3pre Thunderbird/3.1.10
MIME-Version: 1.0
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH] tools/ocaml: unify build process
References: <4EAFBA53.4050009@amd.com>
	<20144.17097.967889.755421@mariner.uk.xensource.com>
In-Reply-To: <20144.17097.967889.755421@mariner.uk.xensource.com>
Content-Type: text/plain; charset="ISO-8859-1"; format=flowed
Content-Transfer-Encoding: 7bit
X-OriginatorOrg: amd.com
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/01/11 20:04, Ian Jackson wrote:
> Christoph Egger writes ("[Xen-devel] [PATCH] tools/ocaml: unify build process"):
>> Unify ocaml build process for different platforms.
>>
>> Signed-off-by: Christoph Egger<Christoph.Egger@amd.com>
>
> Acked-by: Ian Jackson<ian.jackson@eu.citrix.com>
> Committed-by: Ian Jackson<ian.jackson@eu.citrix.com>
>
>> P.S.: Please apply this to xen-4.1-testing
>
> Can you remind me about this after this change has made it through the
> automatic tester into xen-unstable.hg ?  I'd rather not just make the
> same change to both trees at the same time, no matter how harmless it
> looks...

It already happened as of reading your mail. :) So take this as a
reminder: Please apply this to xen-4.1-testing.

Christoph


-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 02:26:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 02:26:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLX5k-0005Hr-SZ; Wed, 02 Nov 2011 02:26:40 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLX5D-00053L-W6
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 02:26:10 -0700
X-Env-Sender: wanjia19870902@gmail.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1320225963!1645802!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26003 invoked from network); 2 Nov 2011 09:26:04 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-7.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 09:26:04 -0000
Received: by ggnv5 with SMTP id v5so13230948ggn.30
	for <xen-devel@lists.xensource.com>;
	Wed, 02 Nov 2011 02:26:03 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type;
	bh=+0VtkbrX5K5wvV8+I7SDh4EWXW3EQSKofL9kJlJ23EM=;
	b=pafH68zQLNZ9Z2ItCHn2uZiDG9yA273+y1UfYUcEa66kibJ8M6EpROBng+CBlpA+zF
	Jrp36Hv5gkZ0oyca3j029KNtlbU+rs1kZduHuE4cd4S4pYFA1wM+9ayCMWIgxijipx/z
	DtDyZuV9D0pcs/T6Sw1uY/5AWnP0gTzMhst0w=
MIME-Version: 1.0
Received: by 10.68.16.6 with SMTP id b6mr3755667pbd.64.1320225963110; Wed, 02
	Nov 2011 02:26:03 -0700 (PDT)
Received: by 10.68.55.7 with HTTP; Wed, 2 Nov 2011 02:26:03 -0700 (PDT)
In-Reply-To: <CALU+m0kFqP2xOhFyDe2wmYLz4BTq=JCDYewACrF3HUqiQtNp0g@mail.gmail.com>
References: <CALU+m0kFqP2xOhFyDe2wmYLz4BTq=JCDYewACrF3HUqiQtNp0g@mail.gmail.com>
Date: Wed, 2 Nov 2011 17:26:03 +0800
Message-ID: <CAKQ7UJ=PakTaWzffeM-FFEqsKH9k03nj0j7=y4K+SbFtyY6=Pg@mail.gmail.com>
Subject: Re: [Xen-devel] signall 7 crash
From: alice wan <wanjia19870902@gmail.com>
To: jbuy0710 <juby0710@gmail.com>
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1859271813=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1859271813==
Content-Type: multipart/alternative; boundary=bcaec5215fbd8def5204b0bd0f1a

--bcaec5215fbd8def5204b0bd0f1a
Content-Type: text/plain; charset=ISO-8859-1

well, i also met the qemu-dm crash due to signal 7, but the stack of
coredump is different.

#0  0x00000000004ae0c3 in memcpy_words (dst=0x7f35cc5c5008,
src=0x7f35cb9da000, n=1) at exec-dm.c:492
#1  0x00000000004ae3c2 in cpu_physical_memory_rw (_addr=1068576768,
buf=0x7f35cc5c5008 <Address 0x7f35cc5c5008 out of bounds>, _len=1,
    is_write=0) at exec-dm.c:613
#2  0x00000000004af60f in read_physical (addr=1068576768, size=1,
val=0x7f35cc5c5008) at helper2.c:322
#3  0x00000000004af6ae in cpu_ioreq_move (env=0xb1e710, req=0x7f35cc5c5000)
at helper2.c:374
#4  0x00000000004afa0c in __handle_ioreq (env=0xb1e710, req=0x7f35cc5c5000)
at helper2.c:449
#5  0x00000000004afca3 in cpu_handle_ioreq (opaque=0xb1e710) at
helper2.c:515
#6  0x000000000040bdd2 in main_loop_wait (timeout=10) at
/usr/src/redhat/BUILD/xen-4.0.1/tools/ioemu-dir/vl.c:3788
#7  0x00000000004afe86 in main_loop () at helper2.c:576
#8  0x000000000040f1ab in main (argc=25, argv=0x7fff2ece6df8,
envp=0x7fff2ece6ec8)
    at /usr/src/redhat/BUILD/xen-4.0.1/tools/ioemu-dir/vl.c:6150

the stack seems the read operation of addr 1068576768 shouldn't be walked
 to helper2.c:374.

the crashed vm is windows 2003 64 r2, installed windows gpl pvdriver.

i found the Xen has four mmio range,
    &hpet_mmio,
    &vlapic_mmio,
    &vioapic_mmio,
    &msixtbl_mmio

addr 1068576768 isn't in this four range, and also doesn't exist in qemu's
mmio range

i guess the addr is invalid for the operation.

Could anybody have some idea or give some advice?



Regards,
wanjia

2011/7/14 jbuy0710 <juby0710@gmail.com>

> Hi ,
>
> We encounter a signal 7 crash in our enviroment with xen 4.0.1 one time.
> We start about 10~15 VMs at the same time and stop them after about 15
> minutes repeately.
>
> I found the following log in xend.log wehn we want to stop this VM.
> [2011-07-13 06:50:12 12757] WARNING (image:552) domain
> 5f244213-2dc1-4700-9714-6b20c3f85fc4: device model failure: pid 4110:
> died due to signal 7 (core dumped); see
> /var/log/xen/qemu-dm-5f244213-2dc1-4700-9714-6b20c3f85fc4.log
> [2011-07-13 06:50:12 12757] WARNING (XendDomainInfo:2071) Domain has
> crashed: name=5f244213-2dc1-4700-9714-6b20c3f85fc4 id=144.
>
> The xml file of our VMs is like this
> <domain type='xen' id='274'>
>  <name>45087c07-c929-4e41-bc11-215fa7088ee5</name>
>  <uuid>45087c07-c929-4e41-bc11-215fa7088ee5</uuid>
>  <memory>256000</memory>
>  <currentMemory>256000</currentMemory>
>  <vcpu cpuset='1-3'>1</vcpu>
>  <os>
>    <type>hvm</type>
>    <loader>/usr/lib/xen/boot/hvmloader</loader>
>    <boot dev='hd'/>
>  </os>
>  <features>
>    <acpi/>
>    <apic/>
>    <pae/>
>  </features>
>  <clock offset='utc'/>
>  <on_poweroff>destroy</on_poweroff>
>  <on_reboot>restart</on_reboot>
>  <on_crash>destroy</on_crash>
>  <devices>
>    <emulator>/usr/lib64/xen/bin/qemu-dm</emulator>
>    <disk type='file' device='disk'>
>      <driver name='file'/>
>      <source file='/07dbc62b-3bd7-41d7-865a-6632019e2f2b'/>
>      <target dev='hda' bus='ide'/>
>    </disk>
>    <interface type='bridge'>
>      <mac address='00:16:3e:00:01:00'/>
>      <source bridge='teprod'/>
>      <script path='/etc/xen/scripts/vif-bridge'/>
>      <target dev='vif274.0'/>
>      <model type='e1000'/>
>    </interface>
>    <serial type='pty'>
>      <source path='/dev/pts/3'/>
>      <target port='0'/>
>    </serial>
>    <console type='pty' tty='/dev/pts/3'>
>      <source path='/dev/pts/3'/>
>      <target type='serial' port='0'/>
>    </console>
>    <input type='tablet' bus='usb'/>
>    <input type='mouse' bus='ps2'/>
>    <graphics type='vnc' port='5903' autoport='yes' keymap='en-us'/>
>  </devices>
> </domain>
>
>
> We try to use the core dump file of qemu-dm and gdb to find the root
> cause, it shows
> (gdb) bt
> #0  0x00000000004765d4 in memcpy_words (_addr=<value optimized out>,
> buf=<value optimized out>, _len=<value optimized out>, is_write=1)
>    at exec-dm.c:492
> #1  cpu_physical_memory_rw (_addr=<value optimized out>, buf=<value
> optimized out>, _len=<value optimized out>, is_write=1) at
> exec-dm.c:581
> #2  0x00000000004292ad in cpu_physical_memory_write
> (opaque=0x7fce7d55d010, buf=<value optimized out>, size=64) at
> ../cpu-all.h:932
> #3  e1000_receive (opaque=0x7fce7d55d010, buf=<value optimized out>,
> size=64) at /root/rpmbuild/BUILD/xen-4.0.1/tools/ioemu-dir/hw/e1000.c:640
> #4  0x0000000000497c11 in qemu_send_packet (vc1=0x11dc9c0,
> buf=0x7fff0186ba10 "\377\377\377\377\377\377\270\254o}\202\343\b\006",
> size=60) at net.c:412
> #5  0x00000000004985a8 in tap_send (opaque=<value optimized out>) at
> net.c:751
> #6  0x000000000040895c in main_loop_wait (timeout=<value optimized
> out>) at /root/rpmbuild/BUILD/xen-4.0.1/tools/ioemu-dir/vl.c:3788
> #7  0x000000000047798a in main_loop () at helper2.c:576
> #8  0x000000000040ccd1 in main (argc=<value optimized out>,
> argv=<value optimized out>, envp=<value optimized out>)
>    at /root/rpmbuild/BUILD/xen-4.0.1/tools/ioemu-dir/vl.c:6150
>
>
> Is this a known issue or is there any patch to fix it?
>
> Thanks
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>

--bcaec5215fbd8def5204b0bd0f1a
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

well, i also met the qemu-dm crash due to signal 7, but the stack of coredu=
mp is different.<div><br></div><div><div><div>#0 =A00x00000000004ae0c3 in m=
emcpy_words (dst=3D0x7f35cc5c5008, src=3D0x7f35cb9da000, n=3D1) at exec-dm.=
c:492</div>
<div>#1 =A00x00000000004ae3c2 in cpu_physical_memory_rw (_addr=3D1068576768=
, buf=3D0x7f35cc5c5008 &lt;Address 0x7f35cc5c5008 out of bounds&gt;, _len=
=3D1,=A0</div><div>=A0 =A0 is_write=3D0) at exec-dm.c:613</div><div>#2 =A00=
x00000000004af60f in read_physical (addr=3D1068576768, size=3D1, val=3D0x7f=
35cc5c5008) at helper2.c:322</div>
<div>#3 =A00x00000000004af6ae in cpu_ioreq_move (env=3D0xb1e710, req=3D0x7f=
35cc5c5000) at helper2.c:374</div><div>#4 =A00x00000000004afa0c in __handle=
_ioreq (env=3D0xb1e710, req=3D0x7f35cc5c5000) at helper2.c:449</div><div>#5=
 =A00x00000000004afca3 in cpu_handle_ioreq (opaque=3D0xb1e710) at helper2.c=
:515</div>
<div>#6 =A00x000000000040bdd2 in main_loop_wait (timeout=3D10) at /usr/src/=
redhat/BUILD/xen-4.0.1/tools/ioemu-dir/vl.c:3788</div><div>#7 =A00x00000000=
004afe86 in main_loop () at helper2.c:576</div><div>#8 =A00x000000000040f1a=
b in main (argc=3D25, argv=3D0x7fff2ece6df8, envp=3D0x7fff2ece6ec8)</div>
<div>=A0 =A0 at /usr/src/redhat/BUILD/xen-4.0.1/tools/ioemu-dir/vl.c:6150</=
div></div><div><br>the stack seems the read operation of addr=A01068576768 =
shouldn&#39;t be walked =A0to=A0helper2.c:374.=A0</div><div><br></div><div>=
the crashed vm is=A0windows 2003 64 r2, installed windows gpl pvdriver.</di=
v>
<div><br></div><div>i found the Xen has four mmio range,</div><div>=A0 =A0=
=A0&amp;hpet_mmio,</div><div>=A0 =A0 &amp;vlapic_mmio,</div><div>=A0 =A0 &a=
mp;vioapic_mmio,</div><div>=A0 =A0 &amp;msixtbl_mmio</div><div><br></div><d=
iv>addr=A01068576768=A0isn&#39;t in this four range, and also doesn&#39;t e=
xist in qemu&#39;s mmio range</div>
<div><br></div><div>i guess the addr is invalid for the operation.</div><di=
v><br></div><div>Could anybody have some idea or give some advice?=A0</div>=
<div><br></div><div><br></div><div><br></div><div>Regards,</div><div>wanjia=
</div>
<div><br><div class=3D"gmail_quote">2011/7/14 jbuy0710 <span dir=3D"ltr">&l=
t;<a href=3D"mailto:juby0710@gmail.com">juby0710@gmail.com</a>&gt;</span><b=
r><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:=
1px #ccc solid;padding-left:1ex;">
Hi ,<br>
<br>
We encounter a signal 7 crash in our enviroment with xen 4.0.1 one time.<br=
>
We start about 10~15 VMs at the same time and stop them after about 15<br>
minutes repeately.<br>
<br>
I found the following log in xend.log wehn we want to stop this VM.<br>
[2011-07-13 06:50:12 12757] WARNING (image:552) domain<br>
5f244213-2dc1-4700-9714-6b20c3f85fc4: device model failure: pid 4110:<br>
died due to signal 7 (core dumped); see<br>
/var/log/xen/qemu-dm-5f244213-2dc1-4700-9714-6b20c3f85fc4.log<br>
[2011-07-13 06:50:12 12757] WARNING (XendDomainInfo:2071) Domain has<br>
crashed: name=3D5f244213-2dc1-4700-9714-6b20c3f85fc4 id=3D144.<br>
<br>
The xml file of our VMs is like this<br>
&lt;domain type=3D&#39;xen&#39; id=3D&#39;274&#39;&gt;<br>
 =A0&lt;name&gt;45087c07-c929-4e41-bc11-215fa7088ee5&lt;/name&gt;<br>
 =A0&lt;uuid&gt;45087c07-c929-4e41-bc11-215fa7088ee5&lt;/uuid&gt;<br>
 =A0&lt;memory&gt;256000&lt;/memory&gt;<br>
 =A0&lt;currentMemory&gt;256000&lt;/currentMemory&gt;<br>
 =A0&lt;vcpu cpuset=3D&#39;1-3&#39;&gt;1&lt;/vcpu&gt;<br>
 =A0&lt;os&gt;<br>
 =A0 =A0&lt;type&gt;hvm&lt;/type&gt;<br>
 =A0 =A0&lt;loader&gt;/usr/lib/xen/boot/hvmloader&lt;/loader&gt;<br>
 =A0 =A0&lt;boot dev=3D&#39;hd&#39;/&gt;<br>
 =A0&lt;/os&gt;<br>
 =A0&lt;features&gt;<br>
 =A0 =A0&lt;acpi/&gt;<br>
 =A0 =A0&lt;apic/&gt;<br>
 =A0 =A0&lt;pae/&gt;<br>
 =A0&lt;/features&gt;<br>
 =A0&lt;clock offset=3D&#39;utc&#39;/&gt;<br>
 =A0&lt;on_poweroff&gt;destroy&lt;/on_poweroff&gt;<br>
 =A0&lt;on_reboot&gt;restart&lt;/on_reboot&gt;<br>
 =A0&lt;on_crash&gt;destroy&lt;/on_crash&gt;<br>
 =A0&lt;devices&gt;<br>
 =A0 =A0&lt;emulator&gt;/usr/lib64/xen/bin/qemu-dm&lt;/emulator&gt;<br>
 =A0 =A0&lt;disk type=3D&#39;file&#39; device=3D&#39;disk&#39;&gt;<br>
 =A0 =A0 =A0&lt;driver name=3D&#39;file&#39;/&gt;<br>
 =A0 =A0 =A0&lt;source file=3D&#39;/07dbc62b-3bd7-41d7-865a-6632019e2f2b&#3=
9;/&gt;<br>
 =A0 =A0 =A0&lt;target dev=3D&#39;hda&#39; bus=3D&#39;ide&#39;/&gt;<br>
 =A0 =A0&lt;/disk&gt;<br>
 =A0 =A0&lt;interface type=3D&#39;bridge&#39;&gt;<br>
 =A0 =A0 =A0&lt;mac address=3D&#39;00:16:3e:00:01:00&#39;/&gt;<br>
 =A0 =A0 =A0&lt;source bridge=3D&#39;teprod&#39;/&gt;<br>
 =A0 =A0 =A0&lt;script path=3D&#39;/etc/xen/scripts/vif-bridge&#39;/&gt;<br=
>
 =A0 =A0 =A0&lt;target dev=3D&#39;vif274.0&#39;/&gt;<br>
 =A0 =A0 =A0&lt;model type=3D&#39;e1000&#39;/&gt;<br>
 =A0 =A0&lt;/interface&gt;<br>
 =A0 =A0&lt;serial type=3D&#39;pty&#39;&gt;<br>
 =A0 =A0 =A0&lt;source path=3D&#39;/dev/pts/3&#39;/&gt;<br>
 =A0 =A0 =A0&lt;target port=3D&#39;0&#39;/&gt;<br>
 =A0 =A0&lt;/serial&gt;<br>
 =A0 =A0&lt;console type=3D&#39;pty&#39; tty=3D&#39;/dev/pts/3&#39;&gt;<br>
 =A0 =A0 =A0&lt;source path=3D&#39;/dev/pts/3&#39;/&gt;<br>
 =A0 =A0 =A0&lt;target type=3D&#39;serial&#39; port=3D&#39;0&#39;/&gt;<br>
 =A0 =A0&lt;/console&gt;<br>
 =A0 =A0&lt;input type=3D&#39;tablet&#39; bus=3D&#39;usb&#39;/&gt;<br>
 =A0 =A0&lt;input type=3D&#39;mouse&#39; bus=3D&#39;ps2&#39;/&gt;<br>
 =A0 =A0&lt;graphics type=3D&#39;vnc&#39; port=3D&#39;5903&#39; autoport=3D=
&#39;yes&#39; keymap=3D&#39;en-us&#39;/&gt;<br>
 =A0&lt;/devices&gt;<br>
&lt;/domain&gt;<br>
<br>
<br>
We try to use the core dump file of qemu-dm and gdb to find the root<br>
cause, it shows<br>
(gdb) bt<br>
#0 =A00x00000000004765d4 in memcpy_words (_addr=3D&lt;value optimized out&g=
t;,<br>
buf=3D&lt;value optimized out&gt;, _len=3D&lt;value optimized out&gt;, is_w=
rite=3D1)<br>
 =A0 =A0at exec-dm.c:492<br>
#1 =A0cpu_physical_memory_rw (_addr=3D&lt;value optimized out&gt;, buf=3D&l=
t;value<br>
optimized out&gt;, _len=3D&lt;value optimized out&gt;, is_write=3D1) at<br>
exec-dm.c:581<br>
#2 =A00x00000000004292ad in cpu_physical_memory_write<br>
(opaque=3D0x7fce7d55d010, buf=3D&lt;value optimized out&gt;, size=3D64) at<=
br>
../cpu-all.h:932<br>
#3 =A0e1000_receive (opaque=3D0x7fce7d55d010, buf=3D&lt;value optimized out=
&gt;,<br>
size=3D64) at /root/rpmbuild/BUILD/xen-4.0.1/tools/ioemu-dir/hw/e1000.c:640=
<br>
#4 =A00x0000000000497c11 in qemu_send_packet (vc1=3D0x11dc9c0,<br>
buf=3D0x7fff0186ba10 &quot;\377\377\377\377\377\377\270\254o}\202\343\b\006=
&quot;,<br>
size=3D60) at net.c:412<br>
#5 =A00x00000000004985a8 in tap_send (opaque=3D&lt;value optimized out&gt;)=
 at net.c:751<br>
#6 =A00x000000000040895c in main_loop_wait (timeout=3D&lt;value optimized<b=
r>
out&gt;) at /root/rpmbuild/BUILD/xen-4.0.1/tools/ioemu-dir/vl.c:3788<br>
#7 =A00x000000000047798a in main_loop () at helper2.c:576<br>
#8 =A00x000000000040ccd1 in main (argc=3D&lt;value optimized out&gt;,<br>
argv=3D&lt;value optimized out&gt;, envp=3D&lt;value optimized out&gt;)<br>
 =A0 =A0at /root/rpmbuild/BUILD/xen-4.0.1/tools/ioemu-dir/vl.c:6150<br>
<br>
<br>
Is this a known issue or is there any patch to fix it?<br>
<br>
Thanks<br>
<br>
_______________________________________________<br>
Xen-devel mailing list<br>
<a href=3D"mailto:Xen-devel@lists.xensource.com">Xen-devel@lists.xensource.=
com</a><br>
<a href=3D"http://lists.xensource.com/xen-devel" target=3D"_blank">http://l=
ists.xensource.com/xen-devel</a><br>
</blockquote></div><br></div></div>

--bcaec5215fbd8def5204b0bd0f1a--


--===============1859271813==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1859271813==--


From xen-devel-bounces@lists.xensource.com Wed Nov 02 02:28:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 02:28:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLX7s-0005gc-Tb; Wed, 02 Nov 2011 02:28:52 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLX78-0005Uc-3O
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 02:28:06 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1320226060!43004901!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29236 invoked from network); 2 Nov 2011 09:27:41 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 09:27:41 -0000
Received: by gyg8 with SMTP id 8so422550gyg.30
	for <xen-devel@lists.xensource.com>;
	Wed, 02 Nov 2011 02:28:01 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:cc:content-type;
	bh=G8VuTgdv+dU0y7s86F/ycllSxbjBZZWtAz6Gaa5FZnA=;
	b=hYbEnFLD0mUMaznBEa5A28k5zUWXEq0zrq+rR467uxjnJj2q2EsHftEB7LlQvnG+lO
	YIEMM10z66lh05cUTEI1jew7rE1VY0FJ2t1z1DiYMZ5CUqV/VztYRMYjyW3i4yw8daiq
	04H8Y3om2h/bzs30kgpD37XSFEj5hN4le83Kk=
MIME-Version: 1.0
Received: by 10.68.21.97 with SMTP id u1mr3733218pbe.48.1320226081448; Wed, 02
	Nov 2011 02:28:01 -0700 (PDT)
Received: by 10.142.13.5 with HTTP; Wed, 2 Nov 2011 02:28:01 -0700 (PDT)
In-Reply-To: <1319016990.3385.90.camel@zakaz.uk.xensource.com>
References: <patchbomb.1317386580@loki> <156626fef95b36184ad4.1317386584@loki>
	<1318943767.3385.13.camel@zakaz.uk.xensource.com>
	<CAPLaKK4t5Ecfc-RmGgj-fNADpM-Bf8eAd1teeuKUxfDW+pTo+Q@mail.gmail.com>
	<1319016990.3385.90.camel@zakaz.uk.xensource.com>
Date: Wed, 2 Nov 2011 10:28:01 +0100
X-Google-Sender-Auth: cZge45hj4DhVrzIbmCu8Jy5jc_8
Message-ID: <CAPLaKK4WGXw5JUE0MEq2o-kfq-QTr4dKqsA_hTdSD2t6TYqLTA@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 4 of 9] libxl: create pci backend only when
	there are pci devices
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=UTF-8
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Please remember that this patch fixing the removal of PCI entries has
not been applied along with the "libxl: rationalise libxl_device_*
APIs" series.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 02:52:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 02:52:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLXUd-0007L9-9d; Wed, 02 Nov 2011 02:52:23 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLXTc-00073i-Jd
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 02:51:21 -0700
X-Env-Sender: yang.z.zhang@intel.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1320227464!44077545!1
X-Originating-IP: [143.182.124.21]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10536 invoked from network); 2 Nov 2011 09:51:04 -0000
Received: from mga03.intel.com (HELO mga03.intel.com) (143.182.124.21)
	by server-11.tower-27.messagelabs.com with SMTP;
	2 Nov 2011 09:51:04 -0000
Received: from azsmga002.ch.intel.com ([10.2.17.35])
	by azsmga101.ch.intel.com with ESMTP; 02 Nov 2011 02:51:16 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.69,443,1315206000"; d="scan'208";a="32477122"
Received: from pgsmsx602.gar.corp.intel.com ([10.221.43.81])
	by AZSMGA002.ch.intel.com with ESMTP; 02 Nov 2011 02:51:14 -0700
Received: from pgsmsx102.gar.corp.intel.com (10.221.44.80) by
	pgsmsx602.gar.corp.intel.com (10.221.43.81) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Wed, 2 Nov 2011 17:48:41 +0800
Received: from shsmsx602.ccr.corp.intel.com (10.239.4.104) by
	PGSMSX102.gar.corp.intel.com (10.221.44.80) with Microsoft SMTP Server
	(TLS) id 14.1.323.3; Wed, 2 Nov 2011 17:48:41 +0800
Received: from shsmsx501.ccr.corp.intel.com ([10.239.4.141]) by
	SHSMSX602.ccr.corp.intel.com ([10.239.4.104]) with mapi; Wed, 2 Nov 2011
	17:48:40 +0800
From: "Zhang, Yang Z" <yang.z.zhang@intel.com>
To: Jan Beulich <JBeulich@suse.com>, Keir Fraser <keir@xen.org>
Date: Wed, 2 Nov 2011 17:48:39 +0800
Subject: RE: [Xen-devel] [PATCH] pm : provide CC7/PC2 residency
Thread-Topic: [Xen-devel] [PATCH] pm : provide CC7/PC2 residency
Thread-Index: AcyZPExkCggotfq4TfipVJSHIf3ewwAB/4Dw
Message-ID: <749B9D3DBF0F054390025D9EAFF47F2212D5AEEE4A@shsmsx501.ccr.corp.intel.com>
References: <749B9D3DBF0F054390025D9EAFF47F2212D2A848E5@shsmsx501.ccr.corp.intel.com>
	<4EB11212020000780005E5F5@nat28.tlf.novell.com>
In-Reply-To: <4EB11212020000780005E5F5@nat28.tlf.novell.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> From: Jan Beulich [mailto:JBeulich@suse.com]
> >>> On 25.10.11 at 15:34, "Zhang, Yang Z" <yang.z.zhang@intel.com> wrote:
> > --- a/xen/include/public/sysctl.h       Mon Oct 24 18:01:07 2011 +0100
> > +++ b/xen/include/public/sysctl.h       Fri Oct 28 21:33:07 2011 +0800
> > @@ -225,11 +225,13 @@
> >      uint64_aligned_t idle_time;                 /* idle time from boot=
 */
> >      XEN_GUEST_HANDLE_64(uint64) triggers;    /* Cx trigger counts */
> >      XEN_GUEST_HANDLE_64(uint64) residencies; /* Cx residencies */
> > +    uint64_aligned_t pc2;
> >      uint64_aligned_t pc3;
> >      uint64_aligned_t pc6;
> >      uint64_aligned_t pc7;
> >      uint64_aligned_t cc3;
> >      uint64_aligned_t cc6;
> > +    uint64_aligned_t cc7;
> >  };
> >
> >  struct xen_sysctl_get_pmstat {
>=20
> Structure layout changes like this should be accompanied by a bump of
> XEN_SYSCTL_INTERFACE_VERSION - is there any reason not to do so in this c=
ase?
Can you explain what's the problem? Are you mean new xen with old tools wil=
l have problem or anything else?

best regards
yang

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 02:58:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 02:58:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLXaO-0007zF-N1; Wed, 02 Nov 2011 02:58:20 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLXZ3-0007kp-U2
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 02:56:58 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1320227814!1108297!1
X-Originating-IP: [213.199.154.139]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4363 invoked from network); 2 Nov 2011 09:56:55 -0000
Received: from db3ehsobe001.messaging.microsoft.com (HELO
	DB3EHSOBE001.bigfish.com) (213.199.154.139)
	by server-13.tower-182.messagelabs.com with AES128-SHA encrypted SMTP;
	2 Nov 2011 09:56:55 -0000
Received: from mail12-db3-R.bigfish.com (10.3.81.249) by
	DB3EHSOBE001.bigfish.com (10.3.84.21) with Microsoft SMTP Server id
	14.1.225.22; Wed, 2 Nov 2011 09:56:40 +0000
Received: from mail12-db3 (localhost.localdomain [127.0.0.1])	by
	mail12-db3-R.bigfish.com (Postfix) with ESMTP id 8DDF81A3019C;
	Wed,  2 Nov 2011 09:56:48 +0000 (UTC)
X-SpamScore: -11
X-BigFish: VPS-11(zzbb2dK1432N98dKzz1202hzz8275bhz32i668h839h)
X-Forefront-Antispam-Report: CIP:163.181.249.108; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp01.amd.com; RD:none; EFVD:NLI
Received: from mail12-db3 (localhost.localdomain [127.0.0.1]) by mail12-db3
	(MessageSwitch) id 1320227808320100_9941;
	Wed,  2 Nov 2011 09:56:48 +0000 (UTC)
Received: from DB3EHSMHS012.bigfish.com (unknown [10.3.81.243])	by
	mail12-db3.bigfish.com (Postfix) with ESMTP id 384EB1698056;
	Wed,  2 Nov 2011 09:56:48 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	DB3EHSMHS012.bigfish.com (10.3.87.112) with Microsoft SMTP Server id
	14.1.225.22; Wed, 2 Nov 2011 09:56:38 +0000
X-WSS-ID: 0LU12AP-01-1UM-02
X-M-MSG: 
Received: from sausexedgep01.amd.com (sausexedgep01-ext.amd.com
	[163.181.249.72])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp01.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 23208102800B;	Wed,  2 Nov 2011 04:56:49 -0500 (CDT)
Received: from SAUSEXDAG01.amd.com (163.181.55.1) by sausexedgep01.amd.com
	(163.181.36.54) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Wed, 2 Nov 2011 04:57:25 -0500
Received: from storexhtp01.amd.com (172.24.4.3) by sausexdag01.amd.com
	(163.181.55.1) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Wed, 2 Nov 2011 04:56:50 -0500
Received: from rhodium.osrc.amd.com (165.204.15.173) by storexhtp01.amd.com
	(172.24.4.3) with Microsoft SMTP Server id 8.3.83.0;
	Wed, 2 Nov 2011 05:56:41 -0400
Message-ID: <4EB113D6.4010807@amd.com>
Date: Wed, 2 Nov 2011 10:56:38 +0100
From: Christoph Egger <Christoph.Egger@amd.com>
User-Agent: Mozilla/5.0 (X11; U; NetBSD amd64; en-US;
	rv:1.9.2.17) Gecko/20110523 Lightning/1.0b3pre Thunderbird/3.1.10
MIME-Version: 1.0
To: "Zhang, Yang Z" <yang.z.zhang@intel.com>
Subject: Re: [Xen-devel] [PATCH] pm : provide CC7/PC2 residency
References: <749B9D3DBF0F054390025D9EAFF47F2212D2A848E5@shsmsx501.ccr.corp.intel.com>	<4EB11212020000780005E5F5@nat28.tlf.novell.com>
	<749B9D3DBF0F054390025D9EAFF47F2212D5AEEE4A@shsmsx501.ccr.corp.intel.com>
In-Reply-To: <749B9D3DBF0F054390025D9EAFF47F2212D5AEEE4A@shsmsx501.ccr.corp.intel.com>
Content-Type: text/plain; charset="ISO-8859-1"; format=flowed
Content-Transfer-Encoding: 7bit
X-OriginatorOrg: amd.com
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Keir Fraser <keir@xen.org>, Jan Beulich <JBeulich@suse.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/02/11 10:48, Zhang, Yang Z wrote:
>> From: Jan Beulich [mailto:JBeulich@suse.com]
>>>>> On 25.10.11 at 15:34, "Zhang, Yang Z"<yang.z.zhang@intel.com>  wrote:
>>> --- a/xen/include/public/sysctl.h       Mon Oct 24 18:01:07 2011 +0100
>>> +++ b/xen/include/public/sysctl.h       Fri Oct 28 21:33:07 2011 +0800
>>> @@ -225,11 +225,13 @@
>>>       uint64_aligned_t idle_time;                 /* idle time from boot */
>>>       XEN_GUEST_HANDLE_64(uint64) triggers;    /* Cx trigger counts */
>>>       XEN_GUEST_HANDLE_64(uint64) residencies; /* Cx residencies */
>>> +    uint64_aligned_t pc2;
>>>       uint64_aligned_t pc3;
>>>       uint64_aligned_t pc6;
>>>       uint64_aligned_t pc7;
>>>       uint64_aligned_t cc3;
>>>       uint64_aligned_t cc6;
>>> +    uint64_aligned_t cc7;
>>>   };
>>>
>>>   struct xen_sysctl_get_pmstat {
>>
>> Structure layout changes like this should be accompanied by a bump of
>> XEN_SYSCTL_INTERFACE_VERSION - is there any reason not to do so in this case?
> Can you explain what's the problem? Are you mean new xen with old tools will have problem or anything else?

The problem is API/ABI backward-compatibility.

Christoph

-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 03:03:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 03:03:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLXfq-0008QR-4j; Wed, 02 Nov 2011 03:03:58 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLXZl-0007ul-Ji
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 02:57:42 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1320227742!42763604!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21675 invoked from network); 2 Nov 2011 09:55:42 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-14.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 2 Nov 2011 09:55:42 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 02 Nov 2011 09:57:37 +0000
Message-Id: <4EB1221F020000780005E635@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 02 Nov 2011 09:57:35 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jinsong Liu" <jinsong.liu@intel.com>
References: <BC00F5384FCFC9499AF06F92E8B78A9E26A4F3C1DA@shsmsx502.ccr.corp.intel.com>
In-Reply-To: <BC00F5384FCFC9499AF06F92E8B78A9E26A4F3C1DA@shsmsx502.ccr.corp.intel.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"keir.xen@gmail.com" <keir.xen@gmail.com>,
	Haitao Shan <haitao.shan@intel.com>,
	"tim.deegan@citrix.com" <tim.deegan@citrix.com>,
	Yunhong Jiang <yunhong.jiang@intel.com>
Subject: [Xen-devel] Re: [PATCH] X86 MCE: Add SRAR handler
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 21.10.11 at 22:25, "Liu, Jinsong" <jinsong.liu@intel.com> wrote:
> I update a little for my former patch, as attached.
> For my former patch, you mainly have 2 concerns (list below). I double =
check=20
> xen mce code, w/ my opinion append:

Those concerns were really just triggered by the patch, not directly
related to it. The patch itself looks okay to me.

> Concern 1: for SRAR IFU error, since RIPV=3DEIPV=3D0, it maybe an async =
error=20
> which occur at guest but root from hypervisor.
> [Jinsong]:=20
>     Yes, but EIPV didn't tell us where the error root from (it's just =
a=20
> hint, warning us async possibility).=20
>     It no need to overkill xen at mce isr, instead, at mce softirq we =
can=20
> find out error root location and then handle accordingly:
>     * at mce isr:
>             /* a total insurance */
>             /* if error is async, we delay handle it at mce softirq */
>             if ( !(gstatus & MCG_STATUS_RIPV) && !guest_mode(regs))
>                 return -1;

I continue to think that guest_mode() must not be used without
EIPV, no matter what the purpose of the use.

>     * at mce softirq:
>             /* detect error location by bank->mc_addr */
>             /* handle different page OWNER cases at intel_memerr_dhandler=
()=20
> and offline_page() */
>             /* who own, who take */
>             if (error page owner is guest)
>                 trigger vmce to guest;
>             else
>                 panic xen;

That part is certainly fine.

> Concern 2: If a guest accesses the hypervisor part of the GDT or page=20
> tables, or some other shared data structure owned by the hypervisor =
(like the=20
> M2P table), its handler may get utterly confused by being presented =
an=20
> address it doesn't own and knows nothing about.
> [Jinsong]: for such cases, page owner would be dom_xen/dom_cow or NULL, =
but=20
> not guest --> it would be handled at hypervisor, not triggering vmce to =
guest -->=20
> who own, who take.

That latter part of your explanation is fine too, but with the caveat that
the bogus use of guest_mode() above may have an overall effect on the
behavior.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 03:06:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 03:06:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLXiF-0000No-IN; Wed, 02 Nov 2011 03:06:27 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLXcI-00089p-Fo
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 03:00:28 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320227979!61611944!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25704 invoked from network); 2 Nov 2011 09:59:40 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-2.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 2 Nov 2011 09:59:40 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 02 Nov 2011 10:00:14 +0000
Message-Id: <4EB122BB020000780005E638@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 02 Nov 2011 10:00:11 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Ian Campbell" <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [xen-unstable test] 9593: regressions -
	trouble: broken/fail/pass
References: <osstest-9593-mainreport@xen.org>
	<1319530986.3385.219.camel@zakaz.uk.xensource.com>
In-Reply-To: <1319530986.3385.219.camel@zakaz.uk.xensource.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: KeirFraser <keir@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>, Tim Deegan <tim@xen.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 25.10.11 at 10:23, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> This doesn't appear to be a quirk of the test systems log generation,
> the patch appears to have ended up in the changelog. There is some stuff
> actually applied too so perhaps it is ok but someone who knows what was
> supposed to be in there should probably double check!

Yeah, I somehow managed to leave the patch body in the file that was
to become the commit message. I'm sorry for that, and as I realized this
only after pushing I also didn't know how to rectify it.

Jan

>  On Mon, 2011-10-24 at 20:40 +0100, xen.org wrote:
>>=20
>>=20
>> changeset:   23987:2682094bc243
>> user:        Jan Beulich <jbeulich@suse.com>
>> date:        Fri Oct 21 09:42:47 2011 +0200
>>=20
>>     x86/p2m: allocate CPU masks dynamically
>>=20
>>     Signed-off-by: Jan Beulich <jbeulich@suse.com>
>>     Acked-by: Tim Deegan <tim@xen.org>
>>     Acked-by: Keir Fraser <keir@xen.org>
>>=20
>>     --- 2011-10-18.orig/xen/arch/x86/hvm/nestedhvm.c    2011-10-11
>> 17:24:46.000000000 +0200
>>     +++ 2011-10-18/xen/arch/x86/hvm/nestedhvm.c 2011-10-18
>> 16:45:02.000000000 +0200
>>     @@ -114,9 +114,9 @@ nestedhvm_flushtlb_ipi(void *info)
>>      void
>>      nestedhvm_vmcx_flushtlb(struct p2m_domain *p2m)
>>      {
>>     -    on_selected_cpus(&p2m->p2m_dirty_cpumask,
>> nestedhvm_flushtlb_ipi,
>>     +    on_selected_cpus(p2m->dirty_cpumask, nestedhvm_flushtlb_ipi,
>>              p2m->domain, 1);
>>     -    cpumask_clear(&p2m->p2m_dirty_cpumask);
>>     +    cpumask_clear(p2m->dirty_cpumask);
>>      }
>>=20
>>      bool_t
>>     --- 2011-10-18.orig/xen/arch/x86/mm/hap/nested_hap.c
>> 2011-10-21 09:24:51.000000000 +0200
>>     +++ 2011-10-18/xen/arch/x86/mm/hap/nested_hap.c     2011-10-18
>> 16:44:35.000000000 +0200
>>     @@ -88,7 +88,7 @@ nestedp2m_write_p2m_entry(struct p2m_dom
>>          safe_write_pte(p, new);
>>=20
>>          if (old_flags & _PAGE_PRESENT)
>>     -        flush_tlb_mask(&p2m->p2m_dirty_cpumask);
>>     +        flush_tlb_mask(p2m->dirty_cpumask);
>>=20
>>          paging_unlock(d);
>>      }
>>     --- 2011-10-18.orig/xen/arch/x86/mm/p2m.c   2011-10-14
>> 09:47:46.000000000 +0200
>>     +++ 2011-10-18/xen/arch/x86/mm/p2m.c        2011-10-21
>> 09:28:33.000000000 +0200
>>     @@ -81,7 +81,6 @@ static void p2m_initialise(struct domain
>>          p2m->default_access =3D p2m_access_rwx;
>>=20
>>          p2m->cr3 =3D CR3_EADDR;
>>     -    cpumask_clear(&p2m->p2m_dirty_cpumask);
>>=20
>>          if ( hap_enabled(d) && (boot_cpu_data.x86_vendor =3D=3D
>> X86_VENDOR_INTEL) )
>>              ept_p2m_init(p2m);
>>     @@ -102,6 +101,8 @@ p2m_init_nestedp2m(struct domain *d)
>>              d->arch.nested_p2m[i] =3D p2m =3D xzalloc(struct p2m_domain=
);
>>              if (p2m =3D=3D NULL)
>>                  return -ENOMEM;
>>     +        if ( !zalloc_cpumask_var(&p2m->dirty_cpumask) )
>>     +            return -ENOMEM;
>>              p2m_initialise(d, p2m);
>>              p2m->write_p2m_entry =3D nestedp2m_write_p2m_entry;
>>              list_add(&p2m->np2m_list,
>> &p2m_get_hostp2m(d)->np2m_list);
>>     @@ -118,6 +119,11 @@ int p2m_init(struct domain *d)
>>          p2m_get_hostp2m(d) =3D p2m =3D xzalloc(struct p2m_domain);
>>          if ( p2m =3D=3D NULL )
>>              return -ENOMEM;
>>     +    if ( !zalloc_cpumask_var(&p2m->dirty_cpumask) )
>>     +    {
>>     +        xfree(p2m);
>>     +        return -ENOMEM;
>>     +    }
>>          p2m_initialise(d, p2m);
>>=20
>>          /* Must initialise nestedp2m unconditionally
>>     @@ -333,6 +339,9 @@ static void p2m_teardown_nestedp2m(struc
>>          uint8_t i;
>>=20
>>          for (i =3D 0; i < MAX_NESTEDP2M; i++) {
>>     +        if ( !d->arch.nested_p2m[i] )
>>     +            continue;
>>     +        free_cpumask_var(d->arch.nested_p2m[i]->dirty_cpumask);
>>              xfree(d->arch.nested_p2m[i]);
>>              d->arch.nested_p2m[i] =3D NULL;
>>          }
>>     @@ -341,8 +350,12 @@ static void p2m_teardown_nestedp2m(struc
>>      void p2m_final_teardown(struct domain *d)
>>      {
>>          /* Iterate over all p2m tables per domain */
>>     -    xfree(d->arch.p2m);
>>     -    d->arch.p2m =3D NULL;
>>     +    if ( d->arch.p2m )
>>     +    {
>>     +        free_cpumask_var(d->arch.p2m->dirty_cpumask);
>>     +        xfree(d->arch.p2m);
>>     +        d->arch.p2m =3D NULL;
>>     +    }
>>=20
>>          /* We must teardown unconditionally because
>>           * we initialise them unconditionally.
>>     @@ -1200,7 +1213,7 @@ p2m_get_nestedp2m(struct vcpu *v, uint64
>>                  if (p2m->cr3 =3D=3D CR3_EADDR)
>>                      hvm_asid_flush_vcpu(v);
>>                  p2m->cr3 =3D cr3;
>>     -            cpu_set(v->processor, p2m->p2m_dirty_cpumask);
>>     +            cpumask_set_cpu(v->processor, p2m->dirty_cpumask);
>>                  p2m_unlock(p2m);
>>                  nestedp2m_unlock(d);
>>                  return p2m;
>>     @@ -1217,7 +1230,7 @@ p2m_get_nestedp2m(struct vcpu *v, uint64
>>          p2m->cr3 =3D cr3;
>>          nv->nv_flushp2m =3D 0;
>>          hvm_asid_flush_vcpu(v);
>>     -    cpu_set(v->processor, p2m->p2m_dirty_cpumask);
>>     +    cpumask_set_cpu(v->processor, p2m->dirty_cpumask);
>>          p2m_unlock(p2m);
>>          nestedp2m_unlock(d);
>>=20
>>     --- 2011-10-18.orig/xen/include/asm-x86/p2m.h       2011-10-21
>> 09:24:51.000000000 +0200
>>     +++ 2011-10-18/xen/include/asm-x86/p2m.h    2011-10-18
>> 16:39:34.000000000 +0200
>>     @@ -198,7 +198,7 @@ struct p2m_domain {
>>           * this p2m and those physical cpus whose vcpu's are in
>>           * guestmode.
>>           */
>>     -    cpumask_t          p2m_dirty_cpumask;
>>     +    cpumask_var_t      dirty_cpumask;
>>=20
>>          struct domain     *domain;   /* back pointer to domain */
>>=20
>>=20
>>=20



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 03:12:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 03:12:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLXo7-0000q2-Qm; Wed, 02 Nov 2011 03:12:31 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLXk8-0000ac-A6
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 03:08:50 -0700
X-Env-Sender: njudroid@gmail.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1320228500!1646475!1
X-Originating-IP: [209.85.161.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10009 invoked from network); 2 Nov 2011 10:08:20 -0000
Received: from mail-fx0-f43.google.com (HELO mail-fx0-f43.google.com)
	(209.85.161.43)
	by server-9.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 10:08:20 -0000
Received: by faat9 with SMTP id t9so351006faa.30
	for <xen-devel@lists.xensource.com>;
	Wed, 02 Nov 2011 03:08:20 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=pg0YSJCC6COrvWbi5zdqi8sGtFcmEMJmaomyhuoS154=;
	b=cgOVs//TQE9p4t+bW3p7z8eea9kFoSQ0JBLWtpfvoyozdoec6KptBwWmsiOD8kxlZe
	rgBR+h6Am7ddiTpSRZlcNLJo83L0QLNQ9nrNidsWHXvilvsPoL1VS5NtM1wMK5hi1Cs1
	jubObMwMij++GK8vtOHcO4SdzH04N6Ya4CVVw=
MIME-Version: 1.0
Received: by 10.223.17.3 with SMTP id q3mr7385646faa.28.1320228423911; Wed, 02
	Nov 2011 03:07:03 -0700 (PDT)
Received: by 10.152.37.8 with HTTP; Wed, 2 Nov 2011 03:07:03 -0700 (PDT)
Date: Wed, 2 Nov 2011 18:07:03 +0800
Message-ID: <CAP31Ad=0YjZPkwRdunbkETtdcsDWktq4m2m+JEuoQq7Zp8GoyA@mail.gmail.com>
From: software NJU <njudroid@gmail.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] Question about SR-IOV migration
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============2109359693=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============2109359693==
Content-Type: multipart/alternative; boundary=00151743f8463ac9ac04b0bda216

--00151743f8463ac9ac04b0bda216
Content-Type: text/plain; charset=ISO-8859-1

Hello,
  Can HVM using SR-IOV live-migrate to the other Host and still in SR-IOV?
  If SR-IOV can, does Xen support it now? And if so, where is the code for
it.

Thanks.

--00151743f8463ac9ac04b0bda216
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hello,<div>=A0=A0Can HVM using SR-IOV live-migrate to the other Host and st=
ill in SR-IOV?=A0</div><div>=A0=A0If SR-IOV can, does Xen support it now? A=
nd if so, where is the code for it.</div><div><br></div><div>Thanks.</div>

--00151743f8463ac9ac04b0bda216--


--===============2109359693==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============2109359693==--


From xen-devel-bounces@lists.xensource.com Wed Nov 02 03:21:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 03:21:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLXwt-00020J-Mw; Wed, 02 Nov 2011 03:21:35 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLXw7-0001nt-B7
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 03:20:48 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-2.tower-182.messagelabs.com!1320229244!1664944!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22015 invoked from network); 2 Nov 2011 10:20:44 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-2.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 2 Nov 2011 10:20:44 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RLXvz-000A7O-MP; Wed, 02 Nov 2011 10:20:39 +0000
Date: Wed, 2 Nov 2011 10:20:39 +0000
From: Tim Deegan <tim@xen.org>
To: Christoph Egger <Christoph.Egger@amd.com>
Subject: Re: [Xen-devel] [PATCH] libxl: allow to enable/disable cpuid bits
Message-ID: <20111102102039.GA35143@ocelot.phlegethon.org>
References: <4EAFD200.4010207@amd.com>
	<20144.17265.621187.887785@mariner.uk.xensource.com>
	<4EB10C00.10601@amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4EB10C00.10601@amd.com>
User-Agent: Mutt/1.4.2.1i
Cc: Keir Fraser <keir@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 10:23 +0100 on 02 Nov (1320229392), Christoph Egger wrote:
> On 11/01/11 20:07, Ian Jackson wrote:
> >Christoph Egger writes ("[Xen-devel] [PATCH] libxl: allow to 
> >enable/disable cpuid bits"):
> >>
> >>Allow to enable/disable SVM specific cpuid bits
> >>in the guest config file via cpuid config option.
> >>Also allow to enable/disable the hypervisor cpuid bit
> >>in the guest config file. We need to disable the
> >>hypervisor cpuid bit to get Hyper-V going.
> >
> >The change itself looks plausible to me.  However I don't know much
> >about cpuid; can you get an ack from a hypervisor maintainer or an
> >suitable expert ?
> 
> Keir? Tim?

I think the hypervisor bit should be given a better name than 'raz' --
although it is read-as-zero on real hardware that doesn't distinguish it
from other raz bits, or describe what it does. 

'hypervisor' maybe, to match 'X86_FEATURE_HYPERVISOR' elsewhere in the
Xen code? 

With that change, Acked-by: Tim Deegan <tim@xen.org>

Cheers,

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 03:35:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 03:35:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLYA3-0002lV-99; Wed, 02 Nov 2011 03:35:11 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLY9H-0002Y4-69
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 03:34:23 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1320230059!1654134!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22181 invoked from network); 2 Nov 2011 10:34:20 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-3.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 2 Nov 2011 10:34:20 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 02 Nov 2011 10:34:19 +0000
Message-Id: <4EB12AB6020000780005E679@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 02 Nov 2011 10:34:14 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "liang tang" <liang.tang@oracle.com>
References: <4EAEAC4B.4000004@oracle.com>
In-Reply-To: <4EAEAC4B.4000004@oracle.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: Need some help about the build xen.efi
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 31.10.11 at 15:10, liang tang <liang.tang@oracle.com> wrote:
> Hi,Jan
> I have download xen unstable tree which include your efi patch,and =
try=20
> to build xen.efi ,but there only have xen.gz ,don't have xen.efi .I =
find=20
> the file xen\arch\x86\efi\disable have report some error : ld don't =20
> support -m i386pep.  my gcc version is 4.6.1.

Apart from an up-to-date compiler you also need an up-to-date (and
properly configured) static linker (binutils 2.22 will be the first =
upstream
version to have the necessary support).

> if modify the i386pep to elf_x86_64 ,the build can continue ,and =
report=20
> other error --subsystem=3D10 and --image-base=3D0xffff82c480000000 =
unrecognized.
> do you have any suggestion about that?  thank you very much!
>=20
> the detail is follow.
> ld: unrecognized option '--image-base=3D0xffff82c480000000'

Quite obviously, as it's wrong.. You want an EFI binary, not an ELF
one.

> In the xen/arch/x86/efi/disabled
> ld: unrecognized emulation mode: i386pep
> Supported emulations: elf_x86_64 elf32_x86_64 elf_i386 i386linux =
elf_l1om

That just points out what I said above about the ld to use.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 03:36:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 03:36:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLYBc-0003Ep-6P; Wed, 02 Nov 2011 03:36:48 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLYAk-0002xf-9A
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 03:35:55 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1320230150!1655552!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10114 invoked from network); 2 Nov 2011 10:35:51 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-10.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 2 Nov 2011 10:35:51 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 02 Nov 2011 10:35:50 +0000
Message-Id: <4EB12B14020000780005E67C@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 02 Nov 2011 10:35:48 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Yang Z Zhang" <yang.z.zhang@intel.com>
Subject: RE: [Xen-devel] [PATCH] pm : provide CC7/PC2 residency
References: <749B9D3DBF0F054390025D9EAFF47F2212D2A848E5@shsmsx501.ccr.corp.intel.com>
	<4EB11212020000780005E5F5@nat28.tlf.novell.com>
	<749B9D3DBF0F054390025D9EAFF47F2212D5AEEE4A@shsmsx501.ccr.corp.intel.com>
In-Reply-To: <749B9D3DBF0F054390025D9EAFF47F2212D5AEEE4A@shsmsx501.ccr.corp.intel.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Keir Fraser <keir@xen.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 02.11.11 at 10:48, "Zhang, Yang Z" <yang.z.zhang@intel.com> wrote:
>>  From: Jan Beulich [mailto:JBeulich@suse.com]=20
>> >>> On 25.10.11 at 15:34, "Zhang, Yang Z" <yang.z.zhang@intel.com> =
wrote:
>> > --- a/xen/include/public/sysctl.h       Mon Oct 24 18:01:07 2011 =
+0100
>> > +++ b/xen/include/public/sysctl.h       Fri Oct 28 21:33:07 2011 =
+0800
>> > @@ -225,11 +225,13 @@
>> >      uint64_aligned_t idle_time;                 /* idle time from =
boot */
>> >      XEN_GUEST_HANDLE_64(uint64) triggers;    /* Cx trigger counts */
>> >      XEN_GUEST_HANDLE_64(uint64) residencies; /* Cx residencies */
>> > +    uint64_aligned_t pc2;
>> >      uint64_aligned_t pc3;
>> >      uint64_aligned_t pc6;
>> >      uint64_aligned_t pc7;
>> >      uint64_aligned_t cc3;
>> >      uint64_aligned_t cc6;
>> > +    uint64_aligned_t cc7;
>> >  };
>> >
>> >  struct xen_sysctl_get_pmstat {
>>=20
>> Structure layout changes like this should be accompanied by a bump of
>> XEN_SYSCTL_INTERFACE_VERSION - is there any reason not to do so in this =
case?
> Can you explain what's the problem? Are you mean new xen with old tools =
will=20
> have problem or anything else?

Yes, the more that xenpm is really a mostly standalone utility. Further
interface changes imply that eventual out-of-tree users also get broken
if they don't have a clean way to detect the change.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 03:45:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 03:45:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLYJq-0003n6-Fl; Wed, 02 Nov 2011 03:45:18 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLYJI-0003Z2-Mu
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 03:44:45 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1320230651!42366551!1
X-Originating-IP: [216.32.180.13]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3967 invoked from network); 2 Nov 2011 10:44:12 -0000
Received: from va3ehsobe003.messaging.microsoft.com (HELO
	VA3EHSOBE003.bigfish.com) (216.32.180.13)
	by server-10.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	2 Nov 2011 10:44:12 -0000
Received: from mail85-va3-R.bigfish.com (10.7.14.235) by
	VA3EHSOBE003.bigfish.com (10.7.40.23) with Microsoft SMTP Server id
	14.1.225.22; Wed, 2 Nov 2011 10:44:26 +0000
Received: from mail85-va3 (localhost [127.0.0.1])	by mail85-va3-R.bigfish.com
	(Postfix) with ESMTP id B474C3002C5;
	Wed,  2 Nov 2011 10:43:42 +0000 (UTC)
X-SpamScore: -12
X-BigFish: VPS-12(zzbb2dKc85dh1432N98dKzz1202hzz8275bh8275dhz2dh668h839h34h61h)
X-Spam-TCS-SCL: 0:0
X-Forefront-Antispam-Report: CIP:163.181.249.108; KIP:(null); UIP:(null);
	IPV:NLI; H:ausb3twp01.amd.com; RD:none; EFVD:NLI
Received: from mail85-va3 (localhost.localdomain [127.0.0.1]) by mail85-va3
	(MessageSwitch) id 1320230622393513_11869;
	Wed,  2 Nov 2011 10:43:42 +0000 (UTC)
Received: from VA3EHSMHS009.bigfish.com (unknown [10.7.14.245])	by
	mail85-va3.bigfish.com (Postfix) with ESMTP id 51AC1E015E;
	Wed,  2 Nov 2011 10:43:42 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	VA3EHSMHS009.bigfish.com (10.7.99.19) with Microsoft SMTP Server id
	14.1.225.22; Wed, 2 Nov 2011 10:44:24 +0000
X-WSS-ID: 0LU14IB-01-0J1-02
X-M-MSG: 
Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com
	[163.181.249.73])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp01.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 267A81028297;	Wed,  2 Nov 2011 05:44:35 -0500 (CDT)
Received: from SAUSEXDAG04.amd.com (163.181.55.4) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Wed, 2 Nov 2011 05:45:10 -0500
Received: from storexhtp02.amd.com (172.24.4.4) by sausexdag04.amd.com
	(163.181.55.4) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Wed, 2 Nov 2011 05:44:36 -0500
Received: from rhodium.osrc.amd.com (165.204.15.173) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.83.0;
	Wed, 2 Nov 2011 06:44:35 -0400
Message-ID: <4EB11F10.2030605@amd.com>
Date: Wed, 2 Nov 2011 11:44:32 +0100
From: Christoph Egger <Christoph.Egger@amd.com>
User-Agent: Mozilla/5.0 (X11; U; NetBSD amd64; en-US;
	rv:1.9.2.17) Gecko/20110523 Lightning/1.0b3pre Thunderbird/3.1.10
MIME-Version: 1.0
To: Tim Deegan <tim@xen.org>
Subject: Re: [Xen-devel] [PATCH] libxl: allow to enable/disable cpuid bits
References: <4EAFD200.4010207@amd.com>
	<20144.17265.621187.887785@mariner.uk.xensource.com>
	<4EB10C00.10601@amd.com>
	<20111102102039.GA35143@ocelot.phlegethon.org>
In-Reply-To: <20111102102039.GA35143@ocelot.phlegethon.org>
Content-Type: multipart/mixed; boundary="------------070409060508010001020908"
X-OriginatorOrg: amd.com
Cc: Keir Fraser <keir@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------070409060508010001020908
Content-Type: text/plain; charset="ISO-8859-1"; format=flowed
Content-Transfer-Encoding: 7bit

On 11/02/11 11:20, Tim Deegan wrote:
> At 10:23 +0100 on 02 Nov (1320229392), Christoph Egger wrote:
>> On 11/01/11 20:07, Ian Jackson wrote:
>>> Christoph Egger writes ("[Xen-devel] [PATCH] libxl: allow to
>>> enable/disable cpuid bits"):
>>>>
>>>> Allow to enable/disable SVM specific cpuid bits
>>>> in the guest config file via cpuid config option.
>>>> Also allow to enable/disable the hypervisor cpuid bit
>>>> in the guest config file. We need to disable the
>>>> hypervisor cpuid bit to get Hyper-V going.
>>>
>>> The change itself looks plausible to me.  However I don't know much
>>> about cpuid; can you get an ack from a hypervisor maintainer or an
>>> suitable expert ?
>>
>> Keir? Tim?
>
> I think the hypervisor bit should be given a better name than 'raz' --
> although it is read-as-zero on real hardware that doesn't distinguish it
> from other raz bits, or describe what it does.
>
> 'hypervisor' maybe, to match 'X86_FEATURE_HYPERVISOR' elsewhere in the
> Xen code?
>
> With that change, Acked-by: Tim Deegan<tim@xen.org>

New version with that change attached.

Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>


-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632

--------------070409060508010001020908
Content-Type: text/plain; name="xen_tools_libxl_cpuid.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="xen_tools_libxl_cpuid.diff"
Content-Description: xen_tools_libxl_cpuid.diff

diff -r 0d092359d86f tools/libxl/libxl_cpuid.c
--- a/tools/libxl/libxl_cpuid.c	Wed Oct 26 10:32:36 2011 +0200
+++ b/tools/libxl/libxl_cpuid.c	Wed Nov 02 11:41:51 2011 +0100
@@ -92,6 +92,7 @@ int libxl_cpuid_parse_config(libxl_cpuid
         {"proccount",    0x00000001, NA, CPUID_REG_EBX, 16,  8},
         {"clflush",      0x00000001, NA, CPUID_REG_EBX,  8,  8},
         {"brandid",      0x00000001, NA, CPUID_REG_EBX,  0,  8},
+        {"hypervisor",   0x00000001, NA, CPUID_REG_ECX, 31,  1},
         {"f16c",         0x00000001, NA, CPUID_REG_ECX, 29,  1},
         {"avx",          0x00000001, NA, CPUID_REG_ECX, 28,  1},
         {"osxsave",      0x00000001, NA, CPUID_REG_ECX, 27,  1},
@@ -178,6 +179,13 @@ int libxl_cpuid_parse_config(libxl_cpuid
         {"procpkg",      0x00000004,  0, CPUID_REG_EAX, 26,  6},
         {"apicidsize",   0x80000008, NA, CPUID_REG_ECX, 12,  4},
         {"nc",           0x80000008, NA, CPUID_REG_ECX,  0,  8},
+        {"svm_npt",      0x8000000a, NA, CPUID_REG_EDX,  0,  1},
+        {"svm_lbrv",     0x8000000a, NA, CPUID_REG_EDX,  1,  1},
+        {"svm_nrips",    0x8000000a, NA, CPUID_REG_EDX,  3,  1},
+        {"svm_tscrate",  0x8000000a, NA, CPUID_REG_EDX,  4,  1},
+        {"svm_vmcbclean",0x8000000a, NA, CPUID_REG_EDX,  5,  1},
+        {"svm_decode",   0x8000000a, NA, CPUID_REG_EDX,  7,  1},
+        {"svm_pausefilt",0x8000000a, NA, CPUID_REG_EDX, 10,  1},
 
         {NULL, 0, CPUID_REG_INV, 0, 0}
     };

--------------070409060508010001020908
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------070409060508010001020908--


From xen-devel-bounces@lists.xensource.com Wed Nov 02 05:49:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 05:49:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLaGA-0000jm-On; Wed, 02 Nov 2011 05:49:38 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLaFK-0000XJ-Vy
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 05:48:47 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1320238122!1955456!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32319 invoked from network); 2 Nov 2011 12:48:43 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-11.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 12:48:43 -0000
X-IronPort-AV: E=Sophos;i="4.69,443,1315195200"; d="scan'208";a="18748362"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 08:48:42 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Wed, 2 Nov 2011
	08:48:41 -0400
Message-ID: <1320238119.3084.43.camel@cthulhu.hellion.org.uk>
Subject: Re: [Xen-devel] Question about SR-IOV migration
From: Ian Campbell <Ian.Campbell@citrix.com>
To: software NJU <njudroid@gmail.com>
Date: Wed, 2 Nov 2011 21:48:39 +0900
In-Reply-To: <CAP31Ad=0YjZPkwRdunbkETtdcsDWktq4m2m+JEuoQq7Zp8GoyA@mail.gmail.com>
References: <CAP31Ad=0YjZPkwRdunbkETtdcsDWktq4m2m+JEuoQq7Zp8GoyA@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-02 at 06:07 -0400, software NJU wrote:
> Hello,
>   Can HVM using SR-IOV live-migrate to the other Host and still in
> SR-IOV? 
>   If SR-IOV can, does Xen support it now? And if so, where is the code
> for it.

It is not possible to live migrate a guest which has a PCI device passed
through to it.

However you can use PCI hotplug to unplug a device right before
migration and reintroduce another (possibly even different) device at
the other end. This requires hotplug to be correctly configured in your
guest to load the right drivers etc in response to hotplug events.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 06:03:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 06:03:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLaTg-0001RM-9w; Wed, 02 Nov 2011 06:03:36 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLaPt-0001AN-KE
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 06:00:10 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1320238774!2022145!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16030 invoked from network); 2 Nov 2011 12:59:36 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 12:59:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,443,1315195200"; d="scan'208";a="18748725"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 08:59:34 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.65) with Microsoft SMTP Server id 8.3.137.0; Wed, 2 Nov 2011
	08:59:33 -0400
Message-ID: <1320238770.3084.51.camel@cthulhu.hellion.org.uk>
Subject: Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images fail
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Chun Yan Liu <cyliu@suse.com>
Date: Wed, 2 Nov 2011 21:59:30 +0900
In-Reply-To: <4EB184DE020000660000603E@novprvlin0050.provo.novell.com>
References: <1319808450-9617-1-git-send-email-cyliu@suse.com>
	<4EB184DE020000660000603E@novprvlin0050.provo.novell.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-02 at 02:58 -0400, Chun Yan Liu wrote:
> Stefano, could you review the revised patch and share your comments?
> Thanks. 
> 
> 
> >>> Chunyan Liu <cyliu@suse.com> 10/28/2011 9:27 PM >>>
> Start qemu-nbd to mount non-raw qdisk in dom0 so that xl can create PV
> guest with qcow/qcow2 disk image and using pygrub.
> v2: use fork and exec instead of system(3)
> 
> Signed-off-by: Chunyan Liu <cyliu@suse.com>
> 
> diff -r b4cf57bbc3fb tools/libxl/libxl.c
> --- a/tools/libxl/libxl.cThu Oct 20 15:24:46 2011 +0800
> +++ b/tools/libxl/libxl.cFri Oct 28 20:50:36 2011 +0800
> @@ -1077,6 +1077,58 @@ out_free:
>      libxl__free_all(&gc);
>      return rc;
> }
> +static int fork_exec(char *arg0, char **args)
> +{
> +    pid_t pid;
> +    int status;
> +
> +    pid = fork();

This needs to be libxl_fork, I think. Perhaps even this whole thing
should be libxl__spawn_spawn (not sure about that)?

> +    if (pid < 0)
> +        return -1;
> +    else if (pid == 0){
> +        execvp(arg0, args);
> +        exit(127);
> +    }
> +    sleep(1);   

Why do you need this sleep?

> +    while (waitpid(pid, &status, 0) < 0) {
> +        if (errno != EINTR) {
> +            status = -1;
> +            break;
> +        }
> +    }
> +
> +    return status;
> +}
> +
> +static char * nbd_mount_disk(libxl__gc *gc, libxl_device_disk *disk)
> +{
> +    int i;
> +    int nbds_max = 16;
> +    char *nbd_dev = NULL;
> +    char *args[] = {"qemu-nbd","-c",NULL,NULL,NULL};

"-r" perhaps?

> +    char *ret = NULL;
> +
> +    for (i = 0; i < nbds_max; i++) {
> +        nbd_dev = libxl__sprintf(gc, "/dev/nbd%d", i);

We can't get qemu-nbd to find a free device on our behalf and tell us
what it was?

> +        args[2] = libxl__sprintf(gc, "%s", nbd_dev);
> +        args[3] = libxl__sprintf(gc, "%s", disk->pdev_path);
> +        if (fork_exec(args[0], args) == 0) {
> +            ret = strdup(nbd_dev);
> +            break;
> +        }
> +    }
> +
> +    return ret;
> +}
> +
> +static int nbd_unmount_disk(libxl__gc *gc, char *diskpath) {
> +    char *args[] = {"qemu-nbd","-d",NULL,NULL};
> +    args[2] = libxl__sprintf(gc, "%s", diskpath);
> +    if (fork_exec(args[0], args))
> +        return 0;
> +    else
> +        return ERROR_FAIL;
> +}
> 
> char * libxl_device_disk_local_attach(libxl_ctx *ctx,
> libxl_device_disk *disk)
> {
> @@ -1084,6 +1136,7 @@ char * libxl_device_disk_local_attach(li
>      char *dev = NULL;
>      char *ret = NULL;
>      int rc;
> +    char *mdev = NULL;
> 
>      rc = libxl__device_disk_set_backend(&gc, disk);
>      if (rc) goto out;
> @@ -1118,8 +1171,12 @@ char * libxl_device_disk_local_attach(li
>              break;
>          case LIBXL_DISK_BACKEND_QDISK:
>              if (disk->format != LIBXL_DISK_FORMAT_RAW) {
> -                LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot locally"
> -                           " attach a qdisk image if the format is
> not raw");
> +                LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "attaching a
> non-raw qdisk image to domain 0\n");
> +                mdev = nbd_mount_disk(&gc, disk);
> +                if (mdev)
> +                    dev = mdev;
> +                else
> +                    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "fail to mount
> image with qemu-nbd");
>                  break;
>              }
>              LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "locally attaching
> qdisk %s\n",
> @@ -1135,11 +1192,13 @@ char * libxl_device_disk_local_attach(li
>   out:
>      if (dev != NULL)
>          ret = strdup(dev);
> +    if (mdev)
> +        free(mdev);

free(NULL) is acceptable.

>      libxl__free_all(&gc);
>      return ret;
> }
> 
> -int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk
> *disk)
> +int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk
> *disk, char *diskpath)
> {
>      /* Nothing to do for PHYSTYPE_PHY. */
This should be moved into the switch which you have added e.g.
	case LIBXL_DISKBACK_END_PHY:
		/* nothing to do */
		break;

> 
> @@ -1147,7 +1206,22 @@ int libxl_device_disk_local_detach(libxl
>       * For other device types assume that the blktap2 process is
>       * needed by the soon to be started domain and do nothing.

should be another explicit case statement.

>       */
> +    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    int ret;

Please declare these at the top of the function.

> 
> +    switch (disk->backend) {
> +        case LIBXL_DISK_BACKEND_QDISK:
> +            if (disk->format != LIBXL_DISK_FORMAT_RAW) {
> +                LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Locally detach a
> non-raw "
> +                    "qdisk image");
> +                ret = nbd_unmount_disk(&gc, diskpath);
> +                return ret;
> +            }
> +        default:
> +            break;
> +    }
> +
> +    libxl__free_all(&gc);
>      return 0;
> }
> 
> diff -r b4cf57bbc3fb tools/libxl/libxl.h
> --- a/tools/libxl/libxl.hThu Oct 20 15:24:46 2011 +0800
> +++ b/tools/libxl/libxl.hFri Oct 28 20:50:36 2011 +0800
> @@ -390,7 +390,7 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u
>   * Make a disk available in this domain. Returns path to a device.
>   */
> char * libxl_device_disk_local_attach(libxl_ctx *ctx,
> libxl_device_disk *disk);
> -int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk
> *disk);
> +int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk
> *disk, char *diskpath);
> 
> int libxl_device_nic_init(libxl_device_nic *nic, int dev_num);
> int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid,
> libxl_device_nic *nic);
> diff -r b4cf57bbc3fb tools/libxl/libxl_bootloader.c
> --- a/tools/libxl/libxl_bootloader.cThu Oct 20 15:24:46 2011 +0800
> +++ b/tools/libxl/libxl_bootloader.cFri Oct 28 20:50:36 2011 +0800
> @@ -424,7 +424,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,
>      rc = 0;
> out_close:
>      if (diskpath) {
> -        libxl_device_disk_local_detach(ctx, disk);
> +        libxl_device_disk_local_detach(ctx, disk, diskpath);
>          free(diskpath);
>      }
>      if (fifo_fd > -1)
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
> 
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 06:09:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 06:09:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLaZS-0001x3-6c; Wed, 02 Nov 2011 06:09:34 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLaYU-0001ki-Rk
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 06:08:41 -0700
X-Env-Sender: bderzhavets@yahoo.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1320239298!53487778!1
X-Originating-IP: [98.139.52.201]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15930 invoked from network); 2 Nov 2011 13:08:18 -0000
Received: from nm4.bullet.mail.ac4.yahoo.com (HELO
	nm4.bullet.mail.ac4.yahoo.com) (98.139.52.201)
	by server-15.tower-27.messagelabs.com with SMTP;
	2 Nov 2011 13:08:18 -0000
Received: from [98.139.52.197] by nm4.bullet.mail.ac4.yahoo.com with NNFMP;
	02 Nov 2011 13:08:30 -0000
Received: from [98.139.52.169] by tm10.bullet.mail.ac4.yahoo.com with NNFMP;
	02 Nov 2011 13:08:30 -0000
Received: from [127.0.0.1] by omp1052.mail.ac4.yahoo.com with NNFMP;
	02 Nov 2011 13:08:30 -0000
X-Yahoo-Newman-Property: ymail-3
X-Yahoo-Newman-Id: 525427.61914.bm@omp1052.mail.ac4.yahoo.com
Received: (qmail 16657 invoked by uid 60001); 2 Nov 2011 13:08:30 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024;
	t=1320239310; bh=j3N8M2QoNfux7sSTKrbe/5zdMXNrhG5AWalEXE3wvhU=;
	h=X-YMail-OSG:Received:X-Mailer:Message-ID:Date:From:Subject:To:Cc:MIME-Version:Content-Type;
	b=g7f9XIEZBT1eFhxT4jlyMEP4kaFJMI+eGYnf1gC7qArx79bO5mhc84ayc9Q3BcFFwb/uSJy7pdfpZpWv4CQoeOA7S/hpOh3nMK/7fAbPI4jO1P9vPNJgYg0UG/Q11Dw8CBnhpybvcjZaWa05/D0hEJiJwagcLBDbKwbLjFkGOBE=
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com;
	h=X-YMail-OSG:Received:X-Mailer:Message-ID:Date:From:Subject:To:Cc:MIME-Version:Content-Type;
	b=FGVx1CYis2/in5iYunmR6hLQxbamGh7Id1mQW3ebZ+aHwGfJYPnChCTbfn/sks36fSr8AZ3jpcaX7hboI2LRQnTbILQHJw4PWch1dwbG71nisUIR675dZQzjJu8HtyDYT24LO4WXbVIj3tpu5Im/So5Sa9Jr5Xil11rDGqssr8A=;
X-YMail-OSG: v1TrIgkVM1l2Ykw.n_oiCDS3Rown5kig_7c.YXJTXcQ2cNE
	vturKG7GGm2O2.PdeHeslC9nRzYIO5RtnsbF4dHXuSP9Ok4bu7ZBvEMX.nKh
	haPWRhP.jjq7Nx22yFDhvOmVR4pOOq77E8dUhEXNXZLLA9TxsozF869xWYqV
	0xR78VQCmi6AO1pxjutJHRoN9N7MGyqXbx7nkE5SIGShC.QDbiAImHw8bK6d
	0kb_gyF58lLBbVYWkPSKtd07q_mFAg4DjkkBbDmWUYMWdkZpOG1wrAwXdrHV
	kFNROsZLgaWHqpRV29wKKJswf2mUjxHcmT.eH623L95mTCOPSIchFcRlTLPe
	Tq63Y5a4a0lym1i1LtuH8njlD1EbUgE.plw7vzPIBrKjYfthXfbrnYjV2Ncs
	SATK6nj.SAWsZ8NKr5hhoLXZd1fSCpRtcNW2_DXfAu20oEite.gG0QM7Q1Ey
	P9TnGFO1mBdRBA7u0gWMTJejvO.qu
Received: from [109.165.7.148] by web65915.mail.ac4.yahoo.com via HTTP;
	Wed, 02 Nov 2011 06:08:30 PDT
X-Mailer: YahooMailClassic/14.0.11 YahooMailWebService/0.8.115.325013
Message-ID: <1320239310.13696.YahooMailClassic@web65915.mail.ac4.yahoo.com>
Date: Wed, 2 Nov 2011 06:08:30 -0700 (PDT)
From: Boris Derzhavets <bderzhavets@yahoo.com>
Subject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark with
	Ubuntu 11.10
To: =?iso-8859-1?Q?Pasi_K=E4rkk=E4inen?= <pasik@iki.fi>,
	Ian Campbell <Ian.Campbell@citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed;
	boundary="1321782915-1493526364-1320239310=:13696"
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"dokter@icg.tugraz.at" <dokter@icg.tugraz.at>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--1321782915-1493526364-1320239310=:13696
Content-Type: multipart/alternative;
	boundary="1321782915-886441707-1320239310=:13696"

--1321782915-886441707-1320239310=:13696
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

I was able to load Oneiric as PV on HVM at Xen 4.1.2 Oneiric Dom0 (3.1.0-03=
0100-generic)=A0 after rebuilding the recent 3.1.0-3 Ubuntu's kernel with=
=20
CONFIG_XEN_PLATFORM_PCI=3Dy , uploading debian packages=A0 :-

linux-headers-3.1.0-2_3.1.0-2.3_all.deb
linux-headers-3.1.0-2-i7_3.1.0-2.3_amd64.deb
linux-image-3.1.0-2-i7_3.1.0-2.3_amd64.deb

to regular Oneiric HVM and new kernel install.
Then same HVM was restarted with
xen_platform_pci=3D1
and this time it gets loaded ( vs hanging with regular kernel)

I got in dmesg log :-

[=A0=A0=A0 0.000000] Initializing cgroup subsys cpuset
[=A0=A0=A0 0.000000] Initializing cgroup subsys cpu
[=A0=A0=A0 0.000000] Linux version 3.1.0-2-i7 (root@boris-System-P5Q3) (gcc=
 version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) ) #3 SMP Wed Nov 2 15:15:13 M=
SK 2011 (Ubuntu 3.1.0-2.3-i7 3.1.0)
[=A0=A0=A0 0.000000] Command line: BOOT_IMAGE=3D/boot/vmlinuz-3.1.0-2-i7 ro=
ot=3DUUID=3Dbff48eed-20df-4abf-b788-935c75ea6226 ro quiet splash vt.handoff=
=3D7
[=A0=A0=A0 0.000000] KERNEL supported cpus:
[=A0=A0=A0 0.000000]=A0=A0 Intel GenuineIntel
[=A0=A0=A0 0.000000]=A0=A0 AMD AuthenticAMD
[=A0=A0=A0 0.000000]=A0=A0 Centaur CentaurHauls
[=A0=A0=A0 0.000000] BIOS-provided physical RAM map:
[=A0=A0=A0 0.000000]=A0 BIOS-e820: 0000000000000000 - 000000000009e000 (usa=
ble)
[=A0=A0=A0 0.000000]=A0 BIOS-e820: 000000000009e000 - 00000000000a0000 (res=
erved)
[=A0=A0=A0 0.000000]=A0 BIOS-e820: 00000000000e0000 - 0000000000100000 (res=
erved)
[=A0=A0=A0 0.000000]=A0 BIOS-e820: 0000000000100000 - 000000003f800000 (usa=
ble)
[=A0=A0=A0 0.000000]=A0 BIOS-e820: 00000000fc000000 - 0000000100000000 (res=
erved)
[=A0=A0=A0 0.000000] NX (Execute Disable) protection: active
[=A0=A0=A0 0.000000] DMI 2.4 present.
[=A0=A0=A0 0.000000] DMI: Xen HVM domU, BIOS 4.1.2 10/20/2011
[=A0=A0=A0 0.000000] Hypervisor detected: Xen HVM
[=A0=A0=A0 0.000000] Xen version 4.1.
[=A0=A0=A0 0.000000] Xen Platform PCI: I/O protocol version 1
[=A0=A0=A0 0.000000] Netfront and the Xen platform PCI driver have been com=
piled for this kernel: unplug emulated NICs.
[=A0=A0=A0 0.000000] Blkfront and the Xen platform PCI driver have been com=
piled for this kernel: unplug emulated disks.
[=A0=A0=A0 0.000000] You might have to change the root device
[=A0=A0=A0 0.000000] from /dev/hd[a-d] to /dev/xvd[a-d]
[=A0=A0=A0 0.000000] in your root=3D kernel command line option
[=A0=A0=A0 0.000000] e820 update range: 0000000000000000 - 0000000000010000=
 (usable) =3D=3D> (reserved)
[=A0=A0=A0 0.000000] e820 remove range: 00000000000a0000 - 0000000000100000=
 (usable)
[=A0=A0=A0 0.000000] No AGP bridge found
[=A0=A0=A0 0.000000] last_pfn =3D 0x3f800 max_arch_pfn =3D 0x400000000
[=A0=A0=A0 0.000000] MTRR default type: write-back
[=A0=A0=A0 0.000000] MTRR fixed ranges enabled:
[=A0=A0=A0 0.000000]=A0=A0 00000-9FFFF write-back
[=A0=A0=A0 0.000000]=A0=A0 A0000-BFFFF write-combining
[=A0=A0=A0 0.000000]=A0=A0 C0000-FFFFF write-back
. . . . .=20

Boris.

--- On Tue, 11/1/11, Ian Campbell <Ian.Campbell@citrix.com> wrote:

From: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark with U=
buntu 11.10
To: "Pasi K=E4rkk=E4inen" <pasik@iki.fi>
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, "dokte=
r@icg.tugraz.at" <dokter@icg.tugraz.at>
Date: Tuesday, November 1, 2011, 7:00 PM

On Tue, 2011-11-01 at 09:26 -0400, Pasi K=E4rkk=E4inen wrote:
> On Tue, Nov 01, 2011 at 08:57:14PM +0900, Ian Campbell wrote:
> > On Tue, 2011-11-01 at 07:31 -0400, Mark Dokter wrote:
> > > In that test, the KVM machine uses virtio disk and nic devices, while
> > > the Xen machine uses the qemu emulated devices. Could that be the cau=
se
> > > for the poor performance?
> >=20
> > Very much so. Without using the PVHVM drivers in the Xen case this is
> > very much an apples to oranges comparison.
> >=20
>=20
> Actually the first page of the article says:
> "The only Xen issue encountered when testing it with an Ubuntu 11.10
> guest and host was the need for manually loading the xen-blkfront
> driver for disk support."
>=20
> So it sounds like they actually did use PVHVM drivers..

Perhaps, the table of configuration details doesn't make it particularly
obvious (and as Alex points out they may not have been running what they
thought). Also as Alex mentioned it's not obvious which backend they
used in each case, e.g. the qemu based disk backend is not known to be
all that great.

It'd definitely be worth someone having a go at repeating even one of
the benchmarks where we did badly, to rule out these sorts of slip ups.

Ian.
>=20
> -- Pasi
>=20



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--1321782915-886441707-1320239310=:13696
Content-Type: text/html; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

<table cellspacing=3D"0" cellpadding=3D"0" border=3D"0" ><tr><td valign=3D"=
top" style=3D"font: inherit;">I was able to load Oneiric as PV on HVM at Xe=
n 4.1.2 Oneiric Dom0 (3.1.0-030100-generic)&nbsp; after rebuilding the rece=
nt 3.1.0-3 Ubuntu's kernel with <br>CONFIG_XEN_PLATFORM_PCI=3Dy , uploading=
 debian packages&nbsp; :-<br><br>linux-headers-3.1.0-2_3.1.0-2.3_all.deb<br=
>linux-headers-3.1.0-2-i7_3.1.0-2.3_amd64.deb<br>linux-image-3.1.0-2-i7_3.1=
.0-2.3_amd64.deb<br><br>to regular Oneiric HVM and new kernel install.<br>T=
hen same HVM was restarted with<br>xen_platform_pci=3D1<br>and this time it=
 gets loaded ( vs hanging with regular kernel)<br><br>I got in dmesg log :-=
<br><br>[&nbsp;&nbsp;&nbsp; 0.000000] Initializing cgroup subsys cpuset<br>=
[&nbsp;&nbsp;&nbsp; 0.000000] Initializing cgroup subsys cpu<br>[&nbsp;&nbs=
p;&nbsp; 0.000000] Linux version 3.1.0-2-i7 (root@boris-System-P5Q3) (gcc v=
ersion 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) ) #3 SMP Wed Nov 2 15:15:13 MSK=
 2011
 (Ubuntu 3.1.0-2.3-i7 3.1.0)<br>[&nbsp;&nbsp;&nbsp; 0.000000] Command line:=
 BOOT_IMAGE=3D/boot/vmlinuz-3.1.0-2-i7 root=3DUUID=3Dbff48eed-20df-4abf-b78=
8-935c75ea6226 ro quiet splash vt.handoff=3D7<br>[&nbsp;&nbsp;&nbsp; 0.0000=
00] KERNEL supported cpus:<br>[&nbsp;&nbsp;&nbsp; 0.000000]&nbsp;&nbsp; Int=
el GenuineIntel<br>[&nbsp;&nbsp;&nbsp; 0.000000]&nbsp;&nbsp; AMD AuthenticA=
MD<br>[&nbsp;&nbsp;&nbsp; 0.000000]&nbsp;&nbsp; Centaur CentaurHauls<br>[&n=
bsp;&nbsp;&nbsp; 0.000000] BIOS-provided physical RAM map:<br>[&nbsp;&nbsp;=
&nbsp; 0.000000]&nbsp; BIOS-e820: 0000000000000000 - 000000000009e000 (usab=
le)<br>[&nbsp;&nbsp;&nbsp; 0.000000]&nbsp; BIOS-e820: 000000000009e000 - 00=
000000000a0000 (reserved)<br>[&nbsp;&nbsp;&nbsp; 0.000000]&nbsp; BIOS-e820:=
 00000000000e0000 - 0000000000100000 (reserved)<br>[&nbsp;&nbsp;&nbsp; 0.00=
0000]&nbsp; BIOS-e820: 0000000000100000 - 000000003f800000 (usable)<br>[&nb=
sp;&nbsp;&nbsp; 0.000000]&nbsp; BIOS-e820: 00000000fc000000 -
 0000000100000000 (reserved)<br>[&nbsp;&nbsp;&nbsp; 0.000000] NX (Execute D=
isable) protection: active<br>[&nbsp;&nbsp;&nbsp; 0.000000] DMI 2.4 present=
.<br>[&nbsp;&nbsp;&nbsp; 0.000000] DMI: Xen HVM domU, BIOS 4.1.2 10/20/2011=
<br>[&nbsp;&nbsp;&nbsp; 0.000000] Hypervisor detected: Xen HVM<br>[&nbsp;&n=
bsp;&nbsp; 0.000000] Xen version 4.1.<br>[&nbsp;&nbsp;&nbsp; 0.000000] Xen =
Platform PCI: I/O protocol version 1<br>[&nbsp;&nbsp;&nbsp; 0.000000] Netfr=
ont and the Xen platform PCI driver have been compiled for this kernel: unp=
lug emulated NICs.<br>[&nbsp;&nbsp;&nbsp; 0.000000] Blkfront and the Xen pl=
atform PCI driver have been compiled for this kernel: unplug emulated disks=
.<br>[&nbsp;&nbsp;&nbsp; 0.000000] You might have to change the root device=
<br>[&nbsp;&nbsp;&nbsp; 0.000000] from /dev/hd[a-d] to /dev/xvd[a-d]<br>[&n=
bsp;&nbsp;&nbsp; 0.000000] in your root=3D kernel command line option<br>[&=
nbsp;&nbsp;&nbsp; 0.000000] e820 update range: 0000000000000000 -
 0000000000010000 (usable) =3D=3D&gt; (reserved)<br>[&nbsp;&nbsp;&nbsp; 0.0=
00000] e820 remove range: 00000000000a0000 - 0000000000100000 (usable)<br>[=
&nbsp;&nbsp;&nbsp; 0.000000] No AGP bridge found<br>[&nbsp;&nbsp;&nbsp; 0.0=
00000] last_pfn =3D 0x3f800 max_arch_pfn =3D 0x400000000<br>[&nbsp;&nbsp;&n=
bsp; 0.000000] MTRR default type: write-back<br>[&nbsp;&nbsp;&nbsp; 0.00000=
0] MTRR fixed ranges enabled:<br>[&nbsp;&nbsp;&nbsp; 0.000000]&nbsp;&nbsp; =
00000-9FFFF write-back<br>[&nbsp;&nbsp;&nbsp; 0.000000]&nbsp;&nbsp; A0000-B=
FFFF write-combining<br>[&nbsp;&nbsp;&nbsp; 0.000000]&nbsp;&nbsp; C0000-FFF=
FF write-back<br>. . . . . <br><br>Boris.<br><br>--- On <b>Tue, 11/1/11, Ia=
n Campbell <i>&lt;Ian.Campbell@citrix.com&gt;</i></b> wrote:<br><blockquote=
 style=3D"border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; paddin=
g-left: 5px;"><br>From: Ian Campbell &lt;Ian.Campbell@citrix.com&gt;<br>Sub=
ject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark with Ubun=
tu
 11.10<br>To: "Pasi K=E4rkk=E4inen" &lt;pasik@iki.fi&gt;<br>Cc: "xen-devel@=
lists.xensource.com" &lt;xen-devel@lists.xensource.com&gt;, "dokter@icg.tug=
raz.at" &lt;dokter@icg.tugraz.at&gt;<br>Date: Tuesday, November 1, 2011, 7:=
00 PM<br><br><div class=3D"plainMail">On Tue, 2011-11-01 at 09:26 -0400, Pa=
si K=E4rkk=E4inen wrote:<br>&gt; On Tue, Nov 01, 2011 at 08:57:14PM +0900, =
Ian Campbell wrote:<br>&gt; &gt; On Tue, 2011-11-01 at 07:31 -0400, Mark Do=
kter wrote:<br>&gt; &gt; &gt; In that test, the KVM machine uses virtio dis=
k and nic devices, while<br>&gt; &gt; &gt; the Xen machine uses the qemu em=
ulated devices. Could that be the cause<br>&gt; &gt; &gt; for the poor perf=
ormance?<br>&gt; &gt; <br>&gt; &gt; Very much so. Without using the PVHVM d=
rivers in the Xen case this is<br>&gt; &gt; very much an apples to oranges =
comparison.<br>&gt; &gt; <br>&gt; <br>&gt; Actually the first page of the a=
rticle says:<br>&gt; "The only Xen issue encountered when testing it with
 an Ubuntu 11.10<br>&gt; guest and host was the need for manually loading t=
he xen-blkfront<br>&gt; driver for disk support."<br>&gt; <br>&gt; So it so=
unds like they actually did use PVHVM drivers..<br><br>Perhaps, the table o=
f configuration details doesn't make it particularly<br>obvious (and as Ale=
x points out they may not have been running what they<br>thought). Also as =
Alex mentioned it's not obvious which backend they<br>used in each case, e.=
g. the qemu based disk backend is not known to be<br>all that great.<br><br=
>It'd definitely be worth someone having a go at repeating even one of<br>t=
he benchmarks where we did badly, to rule out these sorts of slip ups.<br><=
br>Ian.<br>&gt; <br>&gt; -- Pasi<br>&gt; <br><br><br><br>__________________=
_____________________________<br>Xen-devel mailing list<br><a ymailto=3D"ma=
ilto:Xen-devel@lists.xensource.com" href=3D"/mc/compose?to=3DXen-devel@list=
s.xensource.com">Xen-devel@lists.xensource.com</a><br><a
 href=3D"http://lists.xensource.com/xen-devel" target=3D"_blank">http://lis=
ts.xensource.com/xen-devel</a><br></div></blockquote></td></tr></table>
--1321782915-886441707-1320239310=:13696--
--1321782915-1493526364-1320239310=:13696
Content-Type: text/x-log; name="dmesg-PV-on-HVM-oneiric.log"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="dmesg-PV-on-HVM-oneiric.log"

WyAgICAwLjAwMDAwMF0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgY3B1
c2V0ClsgICAgMC4wMDAwMDBdIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lz
IGNwdQpbICAgIDAuMDAwMDAwXSBMaW51eCB2ZXJzaW9uIDMuMS4wLTItaTcg
KHJvb3RAYm9yaXMtU3lzdGVtLVA1UTMpIChnY2MgdmVyc2lvbiA0LjYuMSAo
VWJ1bnR1L0xpbmFybyA0LjYuMS05dWJ1bnR1MykgKSAjMyBTTVAgV2VkIE5v
diAyIDE1OjE1OjEzIE1TSyAyMDExIChVYnVudHUgMy4xLjAtMi4zLWk3IDMu
MS4wKQpbICAgIDAuMDAwMDAwXSBDb21tYW5kIGxpbmU6IEJPT1RfSU1BR0U9
L2Jvb3Qvdm1saW51ei0zLjEuMC0yLWk3IHJvb3Q9VVVJRD1iZmY0OGVlZC0y
MGRmLTRhYmYtYjc4OC05MzVjNzVlYTYyMjYgcm8gcXVpZXQgc3BsYXNoIHZ0
LmhhbmRvZmY9NwpbICAgIDAuMDAwMDAwXSBLRVJORUwgc3VwcG9ydGVkIGNw
dXM6ClsgICAgMC4wMDAwMDBdICAgSW50ZWwgR2VudWluZUludGVsClsgICAg
MC4wMDAwMDBdICAgQU1EIEF1dGhlbnRpY0FNRApbICAgIDAuMDAwMDAwXSAg
IENlbnRhdXIgQ2VudGF1ckhhdWxzClsgICAgMC4wMDAwMDBdIEJJT1MtcHJv
dmlkZWQgcGh5c2ljYWwgUkFNIG1hcDoKWyAgICAwLjAwMDAwMF0gIEJJT1Mt
ZTgyMDogMDAwMDAwMDAwMDAwMDAwMCAtIDAwMDAwMDAwMDAwOWUwMDAgKHVz
YWJsZSkKWyAgICAwLjAwMDAwMF0gIEJJT1MtZTgyMDogMDAwMDAwMDAwMDA5
ZTAwMCAtIDAwMDAwMDAwMDAwYTAwMDAgKHJlc2VydmVkKQpbICAgIDAuMDAw
MDAwXSAgQklPUy1lODIwOiAwMDAwMDAwMDAwMGUwMDAwIC0gMDAwMDAwMDAw
MDEwMDAwMCAocmVzZXJ2ZWQpClsgICAgMC4wMDAwMDBdICBCSU9TLWU4MjA6
IDAwMDAwMDAwMDAxMDAwMDAgLSAwMDAwMDAwMDNmODAwMDAwICh1c2FibGUp
ClsgICAgMC4wMDAwMDBdICBCSU9TLWU4MjA6IDAwMDAwMDAwZmMwMDAwMDAg
LSAwMDAwMDAwMTAwMDAwMDAwIChyZXNlcnZlZCkKWyAgICAwLjAwMDAwMF0g
TlggKEV4ZWN1dGUgRGlzYWJsZSkgcHJvdGVjdGlvbjogYWN0aXZlClsgICAg
MC4wMDAwMDBdIERNSSAyLjQgcHJlc2VudC4KWyAgICAwLjAwMDAwMF0gRE1J
OiBYZW4gSFZNIGRvbVUsIEJJT1MgNC4xLjIgMTAvMjAvMjAxMQpbICAgIDAu
MDAwMDAwXSBIeXBlcnZpc29yIGRldGVjdGVkOiBYZW4gSFZNClsgICAgMC4w
MDAwMDBdIFhlbiB2ZXJzaW9uIDQuMS4KWyAgICAwLjAwMDAwMF0gWGVuIFBs
YXRmb3JtIFBDSTogSS9PIHByb3RvY29sIHZlcnNpb24gMQpbICAgIDAuMDAw
MDAwXSBOZXRmcm9udCBhbmQgdGhlIFhlbiBwbGF0Zm9ybSBQQ0kgZHJpdmVy
IGhhdmUgYmVlbiBjb21waWxlZCBmb3IgdGhpcyBrZXJuZWw6IHVucGx1ZyBl
bXVsYXRlZCBOSUNzLgpbICAgIDAuMDAwMDAwXSBCbGtmcm9udCBhbmQgdGhl
IFhlbiBwbGF0Zm9ybSBQQ0kgZHJpdmVyIGhhdmUgYmVlbiBjb21waWxlZCBm
b3IgdGhpcyBrZXJuZWw6IHVucGx1ZyBlbXVsYXRlZCBkaXNrcy4KWyAgICAw
LjAwMDAwMF0gWW91IG1pZ2h0IGhhdmUgdG8gY2hhbmdlIHRoZSByb290IGRl
dmljZQpbICAgIDAuMDAwMDAwXSBmcm9tIC9kZXYvaGRbYS1kXSB0byAvZGV2
L3h2ZFthLWRdClsgICAgMC4wMDAwMDBdIGluIHlvdXIgcm9vdD0ga2VybmVs
IGNvbW1hbmQgbGluZSBvcHRpb24KWyAgICAwLjAwMDAwMF0gZTgyMCB1cGRh
dGUgcmFuZ2U6IDAwMDAwMDAwMDAwMDAwMDAgLSAwMDAwMDAwMDAwMDEwMDAw
ICh1c2FibGUpID09PiAocmVzZXJ2ZWQpClsgICAgMC4wMDAwMDBdIGU4MjAg
cmVtb3ZlIHJhbmdlOiAwMDAwMDAwMDAwMGEwMDAwIC0gMDAwMDAwMDAwMDEw
MDAwMCAodXNhYmxlKQpbICAgIDAuMDAwMDAwXSBObyBBR1AgYnJpZGdlIGZv
dW5kClsgICAgMC4wMDAwMDBdIGxhc3RfcGZuID0gMHgzZjgwMCBtYXhfYXJj
aF9wZm4gPSAweDQwMDAwMDAwMApbICAgIDAuMDAwMDAwXSBNVFJSIGRlZmF1
bHQgdHlwZTogd3JpdGUtYmFjawpbICAgIDAuMDAwMDAwXSBNVFJSIGZpeGVk
IHJhbmdlcyBlbmFibGVkOgpbICAgIDAuMDAwMDAwXSAgIDAwMDAwLTlGRkZG
IHdyaXRlLWJhY2sKWyAgICAwLjAwMDAwMF0gICBBMDAwMC1CRkZGRiB3cml0
ZS1jb21iaW5pbmcKWyAgICAwLjAwMDAwMF0gICBDMDAwMC1GRkZGRiB3cml0
ZS1iYWNrClsgICAgMC4wMDAwMDBdIE1UUlIgdmFyaWFibGUgcmFuZ2VzIGVu
YWJsZWQ6ClsgICAgMC4wMDAwMDBdICAgMCBiYXNlIDBGMDAwMDAwMCBtYXNr
IEZGODAwMDAwMCB1bmNhY2hhYmxlClsgICAgMC4wMDAwMDBdICAgMSBiYXNl
IDBGODAwMDAwMCBtYXNrIEZGQzAwMDAwMCB1bmNhY2hhYmxlClsgICAgMC4w
MDAwMDBdICAgMiBkaXNhYmxlZApbICAgIDAuMDAwMDAwXSAgIDMgZGlzYWJs
ZWQKWyAgICAwLjAwMDAwMF0gICA0IGRpc2FibGVkClsgICAgMC4wMDAwMDBd
ICAgNSBkaXNhYmxlZApbICAgIDAuMDAwMDAwXSAgIDYgZGlzYWJsZWQKWyAg
ICAwLjAwMDAwMF0gICA3IGRpc2FibGVkClsgICAgMC4wMDAwMDBdIHg4NiBQ
QVQgZW5hYmxlZDogY3B1IDAsIG9sZCAweDcwNDA2MDAwNzA0MDYsIG5ldyAw
eDcwMTA2MDAwNzAxMDYKWyAgICAwLjAwMDAwMF0gZm91bmQgU01QIE1QLXRh
YmxlIGF0IFtmZmZmODgwMDAwMGZiYzkwXSBmYmM5MApbICAgIDAuMDAwMDAw
XSBpbml0aWFsIG1lbW9yeSBtYXBwZWQgOiAwIC0gMjAwMDAwMDAKWyAgICAw
LjAwMDAwMF0gQmFzZSBtZW1vcnkgdHJhbXBvbGluZSBhdCBbZmZmZjg4MDAw
MDA5OTAwMF0gOTkwMDAgc2l6ZSAyMDQ4MApbICAgIDAuMDAwMDAwXSBpbml0
X21lbW9yeV9tYXBwaW5nOiAwMDAwMDAwMDAwMDAwMDAwLTAwMDAwMDAwM2Y4
MDAwMDAKWyAgICAwLjAwMDAwMF0gIDAwMDAwMDAwMDAgLSAwMDNmODAwMDAw
IHBhZ2UgMk0KWyAgICAwLjAwMDAwMF0ga2VybmVsIGRpcmVjdCBtYXBwaW5n
IHRhYmxlcyB1cCB0byAzZjgwMDAwMCBAIDFmZmZlMDAwLTIwMDAwMDAwClsg
ICAgMC4wMDAwMDBdIFJBTURJU0s6IDM2NThjMDAwIC0gMzcyYmUwMDAKWyAg
ICAwLjAwMDAwMF0gQUNQSTogUlNEUCAwMDAwMDAwMDAwMGVhMDIwIDAwMDI0
ICh2MDIgICAgWGVuKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBYU0RUIDAwMDAw
MDAwZmMwMTM0ZjAgMDAwM0MgKHYwMSAgICBYZW4gICAgICBIVk0gMDAwMDAw
MDAgSFZNTCAwMDAwMDAwMCkKWyAgICAwLjAwMDAwMF0gQUNQSTogRkFDUCAw
MDAwMDAwMGZjMDEzMmQwIDAwMEY0ICh2MDQgICAgWGVuICAgICAgSFZNIDAw
MDAwMDAwIEhWTUwgMDAwMDAwMDApClsgICAgMC4wMDAwMDBdIEFDUEk6IERT
RFQgMDAwMDAwMDBmYzAwMzQ0MCAwRkUwNSAodjAyICAgIFhlbiAgICAgIEhW
TSAwMDAwMDAwMCBJTlRMIDIwMTAwNTI4KQpbICAgIDAuMDAwMDAwXSBBQ1BJ
OiBGQUNTIDAwMDAwMDAwZmMwMDM0MDAgMDAwNDAKWyAgICAwLjAwMDAwMF0g
QUNQSTogQVBJQyAwMDAwMDAwMGZjMDEzM2QwIDAwMEQ4ICh2MDIgICAgWGVu
ICAgICAgSFZNIDAwMDAwMDAwIEhWTUwgMDAwMDAwMDApClsgICAgMC4wMDAw
MDBdIEFDUEk6IEhQRVQgMDAwMDAwMDBmYzAxMzRiMCAwMDAzOCAodjAxICAg
IFhlbiAgICAgIEhWTSAwMDAwMDAwMCBIVk1MIDAwMDAwMDAwKQpbICAgIDAu
MDAwMDAwXSBBQ1BJOiBMb2NhbCBBUElDIGFkZHJlc3MgMHhmZWUwMDAwMApb
ICAgIDAuMDAwMDAwXSBObyBOVU1BIGNvbmZpZ3VyYXRpb24gZm91bmQKWyAg
ICAwLjAwMDAwMF0gRmFraW5nIGEgbm9kZSBhdCAwMDAwMDAwMDAwMDAwMDAw
LTAwMDAwMDAwM2Y4MDAwMDAKWyAgICAwLjAwMDAwMF0gSW5pdG1lbSBzZXR1
cCBub2RlIDAgMDAwMDAwMDAwMDAwMDAwMC0wMDAwMDAwMDNmODAwMDAwClsg
ICAgMC4wMDAwMDBdICAgTk9ERV9EQVRBIFswMDAwMDAwMDNmN2ZiMDAwIC0g
MDAwMDAwMDAzZjdmZmZmZl0KWyAgICAwLjAwMDAwMF0gIFtmZmZmZWEwMDAw
MDAwMDAwLWZmZmZlYTAwMDBmZmZmZmZdIFBNRCAtPiBbZmZmZjg4MDAzZGUw
MDAwMC1mZmZmODgwMDNlZGZmZmZmXSBvbiBub2RlIDAKWyAgICAwLjAwMDAw
MF0gWm9uZSBQRk4gcmFuZ2VzOgpbICAgIDAuMDAwMDAwXSAgIERNQSAgICAg
IDB4MDAwMDAwMTAgLT4gMHgwMDAwMTAwMApbICAgIDAuMDAwMDAwXSAgIERN
QTMyICAgIDB4MDAwMDEwMDAgLT4gMHgwMDEwMDAwMApbICAgIDAuMDAwMDAw
XSAgIE5vcm1hbCAgIGVtcHR5ClsgICAgMC4wMDAwMDBdIE1vdmFibGUgem9u
ZSBzdGFydCBQRk4gZm9yIGVhY2ggbm9kZQpbICAgIDAuMDAwMDAwXSBlYXJs
eV9ub2RlX21hcFsyXSBhY3RpdmUgUEZOIHJhbmdlcwpbICAgIDAuMDAwMDAw
XSAgICAgMDogMHgwMDAwMDAxMCAtPiAweDAwMDAwMDllClsgICAgMC4wMDAw
MDBdICAgICAwOiAweDAwMDAwMTAwIC0+IDB4MDAwM2Y4MDAKWyAgICAwLjAw
MDAwMF0gT24gbm9kZSAwIHRvdGFscGFnZXM6IDI1OTk4MgpbICAgIDAuMDAw
MDAwXSAgIERNQSB6b25lOiA2NCBwYWdlcyB1c2VkIGZvciBtZW1tYXAKWyAg
ICAwLjAwMDAwMF0gICBETUEgem9uZTogNSBwYWdlcyByZXNlcnZlZApbICAg
IDAuMDAwMDAwXSAgIERNQSB6b25lOiAzOTEzIHBhZ2VzLCBMSUZPIGJhdGNo
OjAKWyAgICAwLjAwMDAwMF0gICBETUEzMiB6b25lOiA0MDAwIHBhZ2VzIHVz
ZWQgZm9yIG1lbW1hcApbICAgIDAuMDAwMDAwXSAgIERNQTMyIHpvbmU6IDI1
MjAwMCBwYWdlcywgTElGTyBiYXRjaDozMQpbICAgIDAuMDAwMDAwXSBBQ1BJ
OiBQTS1UaW1lciBJTyBQb3J0OiAweGIwMDgKWyAgICAwLjAwMDAwMF0gQUNQ
STogTG9jYWwgQVBJQyBhZGRyZXNzIDB4ZmVlMDAwMDAKWyAgICAwLjAwMDAw
MF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwMF0gbGFwaWNfaWRbMHgwMF0g
ZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRb
MHgwMV0gbGFwaWNfaWRbMHgwMl0gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0g
QUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwMl0gbGFwaWNfaWRbMHgwNF0gZGlz
YWJsZWQpClsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDIChhY3BpX2lkWzB4
MDNdIGxhcGljX2lkWzB4MDZdIGRpc2FibGVkKQpbICAgIDAuMDAwMDAwXSBB
Q1BJOiBMQVBJQyAoYWNwaV9pZFsweDA0XSBsYXBpY19pZFsweDA4XSBkaXNh
YmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgw
NV0gbGFwaWNfaWRbMHgwYV0gZGlzYWJsZWQpClsgICAgMC4wMDAwMDBdIEFD
UEk6IExBUElDIChhY3BpX2lkWzB4MDZdIGxhcGljX2lkWzB4MGNdIGRpc2Fi
bGVkKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDA3
XSBsYXBpY19pZFsweDBlXSBkaXNhYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQ
STogTEFQSUMgKGFjcGlfaWRbMHgwOF0gbGFwaWNfaWRbMHgxMF0gZGlzYWJs
ZWQpClsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDIChhY3BpX2lkWzB4MDld
IGxhcGljX2lkWzB4MTJdIGRpc2FibGVkKQpbICAgIDAuMDAwMDAwXSBBQ1BJ
OiBMQVBJQyAoYWNwaV9pZFsweDBhXSBsYXBpY19pZFsweDE0XSBkaXNhYmxl
ZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwYl0g
bGFwaWNfaWRbMHgxNl0gZGlzYWJsZWQpClsgICAgMC4wMDAwMDBdIEFDUEk6
IExBUElDIChhY3BpX2lkWzB4MGNdIGxhcGljX2lkWzB4MThdIGRpc2FibGVk
KQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDBkXSBs
YXBpY19pZFsweDFhXSBkaXNhYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTog
TEFQSUMgKGFjcGlfaWRbMHgwZV0gbGFwaWNfaWRbMHgxY10gZGlzYWJsZWQp
ClsgICAgMC4wMDAwMDBdIEFDUEk6IElPQVBJQyAoaWRbMHgwMV0gYWRkcmVz
c1sweGZlYzAwMDAwXSBnc2lfYmFzZVswXSkKWyAgICAwLjAwMDAwMF0gSU9B
UElDWzBdOiBhcGljX2lkIDEsIHZlcnNpb24gMTcsIGFkZHJlc3MgMHhmZWMw
MDAwMCwgR1NJIDAtNDcKWyAgICAwLjAwMDAwMF0gQUNQSTogSU5UX1NSQ19P
VlIgKGJ1cyAwIGJ1c19pcnEgMCBnbG9iYWxfaXJxIDIgZGZsIGRmbCkKWyAg
ICAwLjAwMDAwMF0gQUNQSTogSU5UX1NSQ19PVlIgKGJ1cyAwIGJ1c19pcnEg
NSBnbG9iYWxfaXJxIDUgbG93IGxldmVsKQpbICAgIDAuMDAwMDAwXSBBQ1BJ
OiBJTlRfU1JDX09WUiAoYnVzIDAgYnVzX2lycSAxMCBnbG9iYWxfaXJxIDEw
IGxvdyBsZXZlbCkKWyAgICAwLjAwMDAwMF0gQUNQSTogSU5UX1NSQ19PVlIg
KGJ1cyAwIGJ1c19pcnEgMTEgZ2xvYmFsX2lycSAxMSBsb3cgbGV2ZWwpClsg
ICAgMC4wMDAwMDBdIEFDUEk6IElSUTAgdXNlZCBieSBvdmVycmlkZS4KWyAg
ICAwLjAwMDAwMF0gQUNQSTogSVJRMiB1c2VkIGJ5IG92ZXJyaWRlLgpbICAg
IDAuMDAwMDAwXSBBQ1BJOiBJUlE1IHVzZWQgYnkgb3ZlcnJpZGUuClsgICAg
MC4wMDAwMDBdIEFDUEk6IElSUTkgdXNlZCBieSBvdmVycmlkZS4KWyAgICAw
LjAwMDAwMF0gQUNQSTogSVJRMTAgdXNlZCBieSBvdmVycmlkZS4KWyAgICAw
LjAwMDAwMF0gQUNQSTogSVJRMTEgdXNlZCBieSBvdmVycmlkZS4KWyAgICAw
LjAwMDAwMF0gVXNpbmcgQUNQSSAoTUFEVCkgZm9yIFNNUCBjb25maWd1cmF0
aW9uIGluZm9ybWF0aW9uClsgICAgMC4wMDAwMDBdIEFDUEk6IEhQRVQgaWQ6
IDB4ODA4NmEyMDEgYmFzZTogMHhmZWQwMDAwMApbICAgIDAuMDAwMDAwXSBT
TVA6IEFsbG93aW5nIDE1IENQVXMsIDEzIGhvdHBsdWcgQ1BVcwpbICAgIDAu
MDAwMDAwXSBucl9pcnFzX2dzaTogNjQKWyAgICAwLjAwMDAwMF0gUE06IFJl
Z2lzdGVyZWQgbm9zYXZlIG1lbW9yeTogMDAwMDAwMDAwMDA5ZTAwMCAtIDAw
MDAwMDAwMDAwYTAwMDAKWyAgICAwLjAwMDAwMF0gUE06IFJlZ2lzdGVyZWQg
bm9zYXZlIG1lbW9yeTogMDAwMDAwMDAwMDBhMDAwMCAtIDAwMDAwMDAwMDAw
ZTAwMDAKWyAgICAwLjAwMDAwMF0gUE06IFJlZ2lzdGVyZWQgbm9zYXZlIG1l
bW9yeTogMDAwMDAwMDAwMDBlMDAwMCAtIDAwMDAwMDAwMDAxMDAwMDAKWyAg
ICAwLjAwMDAwMF0gQWxsb2NhdGluZyBQQ0kgcmVzb3VyY2VzIHN0YXJ0aW5n
IGF0IDNmODAwMDAwIChnYXA6IDNmODAwMDAwOmJjODAwMDAwKQpbICAgIDAu
MDAwMDAwXSBCb290aW5nIHBhcmF2aXJ0dWFsaXplZCBrZXJuZWwgb24gWGVu
IEhWTQpbICAgIDAuMDAwMDAwXSBzZXR1cF9wZXJjcHU6IE5SX0NQVVM6MjU2
IG5yX2NwdW1hc2tfYml0czoyNTYgbnJfY3B1X2lkczoxNSBucl9ub2RlX2lk
czoxClsgICAgMC4wMDAwMDBdIFBFUkNQVTogRW1iZWRkZWQgMjcgcGFnZXMv
Y3B1IEBmZmZmODgwMDNmNDAwMDAwIHM4MTI4MCByODE5MiBkMjExMjAgdTEz
MTA3MgpbICAgIDAuMDAwMDAwXSBwY3B1LWFsbG9jOiBzODEyODAgcjgxOTIg
ZDIxMTIwIHUxMzEwNzIgYWxsb2M9MSoyMDk3MTUyClsgICAgMC4wMDAwMDBd
IHBjcHUtYWxsb2M6IFswXSAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAw
OSAxMCAxMSAxMiAxMyAxNCAtLSAKWyAgICAwLjAwMDAwMF0gQnVpbHQgMSB6
b25lbGlzdHMgaW4gTm9kZSBvcmRlciwgbW9iaWxpdHkgZ3JvdXBpbmcgb24u
ICBUb3RhbCBwYWdlczogMjU1OTEzClsgICAgMC4wMDAwMDBdIFBvbGljeSB6
b25lOiBETUEzMgpbICAgIDAuMDAwMDAwXSBLZXJuZWwgY29tbWFuZCBsaW5l
OiBCT09UX0lNQUdFPS9ib290L3ZtbGludXotMy4xLjAtMi1pNyByb290PVVV
SUQ9YmZmNDhlZWQtMjBkZi00YWJmLWI3ODgtOTM1Yzc1ZWE2MjI2IHJvIHF1
aWV0IHNwbGFzaCB2dC5oYW5kb2ZmPTcKWyAgICAwLjAwMDAwMF0gUElEIGhh
c2ggdGFibGUgZW50cmllczogNDA5NiAob3JkZXI6IDMsIDMyNzY4IGJ5dGVz
KQpbICAgIDAuMDAwMDAwXSBDaGVja2luZyBhcGVydHVyZS4uLgpbICAgIDAu
MDAwMDAwXSBObyBBR1AgYnJpZGdlIGZvdW5kClsgICAgMC4wMDAwMDBdIENh
bGdhcnk6IGRldGVjdGluZyBDYWxnYXJ5IHZpYSBCSU9TIEVCREEgYXJlYQpb
ICAgIDAuMDAwMDAwXSBDYWxnYXJ5OiBVbmFibGUgdG8gbG9jYXRlIFJpbyBH
cmFuZGUgdGFibGUgaW4gRUJEQSAtIGJhaWxpbmchClsgICAgMC4wMDAwMDBd
IE1lbW9yeTogOTkyNjQway8xMDQwMzg0ayBhdmFpbGFibGUgKDYzNDdrIGtl
cm5lbCBjb2RlLCA0NTZrIGFic2VudCwgNDcyODhrIHJlc2VydmVkLCA2ODIw
ayBkYXRhLCA5MDRrIGluaXQpClsgICAgMC4wMDAwMDBdIFNMVUI6IEdlbnNs
YWJzPTE1LCBIV2FsaWduPTY0LCBPcmRlcj0wLTMsIE1pbk9iamVjdHM9MCwg
Q1BVcz0xNSwgTm9kZXM9MQpbICAgIDAuMDAwMDAwXSBIaWVyYXJjaGljYWwg
UkNVIGltcGxlbWVudGF0aW9uLgpbICAgIDAuMDAwMDAwXSAJUkNVIGR5bnRp
Y2staWRsZSBncmFjZS1wZXJpb2QgYWNjZWxlcmF0aW9uIGlzIGVuYWJsZWQu
ClsgICAgMC4wMDAwMDBdIE5SX0lSUVM6MTY2NDAgbnJfaXJxczoxMjA4IDE2
ClsgICAgMC4wMDAwMDBdIFhlbiBIVk0gY2FsbGJhY2sgdmVjdG9yIGZvciBl
dmVudCBkZWxpdmVyeSBpcyBlbmFibGVkClsgICAgMC4wMDAwMDBdIHZ0IGhh
bmRvZmY6IHRyYW5zcGFyZW50IFZUIG9uIHZ0IzcKWyAgICAwLjAwMDAwMF0g
Q29uc29sZTogY29sb3VyIGR1bW15IGRldmljZSA4MHgyNQpbICAgIDAuMDAw
MDAwXSBjb25zb2xlIFt0dHkwXSBlbmFibGVkClsgICAgMC4wMDAwMDBdIGFs
bG9jYXRlZCA4Mzg4NjA4IGJ5dGVzIG9mIHBhZ2VfY2dyb3VwClsgICAgMC4w
MDAwMDBdIHBsZWFzZSB0cnkgJ2Nncm91cF9kaXNhYmxlPW1lbW9yeScgb3B0
aW9uIGlmIHlvdSBkb24ndCB3YW50IG1lbW9yeSBjZ3JvdXBzClsgICAgMC4w
MDAwMDBdIGhwZXQgY2xvY2tldmVudCByZWdpc3RlcmVkClsgICAgMC4wMDAw
MDBdIERldGVjdGVkIDI4MzMuMDQwIE1IeiBwcm9jZXNzb3IuClsgICAgMC4w
MDgwMDBdIENhbGlicmF0aW5nIGRlbGF5IGxvb3AgKHNraXBwZWQpLCB2YWx1
ZSBjYWxjdWxhdGVkIHVzaW5nIHRpbWVyIGZyZXF1ZW5jeS4uIDU2NjYuMDgg
Qm9nb01JUFMgKGxwaj0xMTMzMjE2MCkKWyAgICAwLjAwODAwMF0gcGlkX21h
eDogZGVmYXVsdDogMzI3NjggbWluaW11bTogMzAxClsgICAgMC4wMDgwMDBd
IFNlY3VyaXR5IEZyYW1ld29yayBpbml0aWFsaXplZApbICAgIDAuMDA4MDAw
XSBBcHBBcm1vcjogQXBwQXJtb3IgaW5pdGlhbGl6ZWQKWyAgICAwLjAwODAw
MF0gWWFtYTogYmVjb21pbmcgbWluZGZ1bC4KWyAgICAwLjAwODAwMF0gRGVu
dHJ5IGNhY2hlIGhhc2ggdGFibGUgZW50cmllczogMTMxMDcyIChvcmRlcjog
OCwgMTA0ODU3NiBieXRlcykKWyAgICAwLjAwODAwMF0gSW5vZGUtY2FjaGUg
aGFzaCB0YWJsZSBlbnRyaWVzOiA2NTUzNiAob3JkZXI6IDcsIDUyNDI4OCBi
eXRlcykKWyAgICAwLjAwODAwMF0gTW91bnQtY2FjaGUgaGFzaCB0YWJsZSBl
bnRyaWVzOiAyNTYKWyAgICAwLjAwODAwMF0gSW5pdGlhbGl6aW5nIGNncm91
cCBzdWJzeXMgY3B1YWNjdApbICAgIDAuMDA4MDAwXSBJbml0aWFsaXppbmcg
Y2dyb3VwIHN1YnN5cyBtZW1vcnkKWyAgICAwLjAwODAwMF0gSW5pdGlhbGl6
aW5nIGNncm91cCBzdWJzeXMgZGV2aWNlcwpbICAgIDAuMDA4MDAwXSBJbml0
aWFsaXppbmcgY2dyb3VwIHN1YnN5cyBmcmVlemVyClsgICAgMC4wMDgwMDBd
IEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIG5ldF9jbHMKWyAgICAwLjAw
ODAwMF0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgYmxraW8KWyAgICAw
LjAwODAwMF0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgcGVyZl9ldmVu
dApbICAgIDAuMDA4MDAwXSBDUFU6IFBoeXNpY2FsIFByb2Nlc3NvciBJRDog
MApbICAgIDAuMDA4MDAwXSBDUFU6IFByb2Nlc3NvciBDb3JlIElEOiAwClsg
ICAgMC4wMDgwMDBdIG1jZTogQ1BVIHN1cHBvcnRzIDYgTUNFIGJhbmtzClsg
ICAgMC4wMDg1NjFdIEFDUEk6IENvcmUgcmV2aXNpb24gMjAxMTA2MjMKWyAg
ICAwLjAxMzA0Nl0gZnRyYWNlOiBhbGxvY2F0aW5nIDI2Mjc4IGVudHJpZXMg
aW4gMTA0IHBhZ2VzClsgICAgMC4wNDQ3MTRdIE5vdCBlbmFibGluZyB4MmFw
aWMsIEludHItcmVtYXBwaW5nIGluaXQgZmFpbGVkLgpbICAgIDAuMDQ0NzE4
XSBTd2l0Y2hlZCBBUElDIHJvdXRpbmcgdG8gcGh5c2ljYWwgZmxhdC4KWyAg
ICAwLjA0NTY0N10gLi5USU1FUjogdmVjdG9yPTB4MzAgYXBpYzE9MCBwaW4x
PTIgYXBpYzI9MCBwaW4yPTAKWyAgICAwLjA4NTM2M10gQ1BVMDogSW50ZWwo
UikgQ29yZShUTSkyIFF1YWQgQ1BVICAgIFE5NTUwICBAIDIuODNHSHogc3Rl
cHBpbmcgMGEKWyAgICAwLjA4NTM3NV0gWGVuOiB1c2luZyB2Y3B1b3AgdGlt
ZXIgaW50ZXJmYWNlClsgICAgMC4wODUzODFdIGluc3RhbGxpbmcgWGVuIHRp
bWVyIGZvciBDUFUgMApbICAgIDAuMDg1NDM1XSBQZXJmb3JtYW5jZSBFdmVu
dHM6IHVuc3VwcG9ydGVkIHA2IENQVSBtb2RlbCAyMyBubyBQTVUgZHJpdmVy
LCBzb2Z0d2FyZSBldmVudHMgb25seS4KWyAgICAwLjA4NjM5OF0gQm9vdGlu
ZyBOb2RlICAgMCwgUHJvY2Vzc29ycyAgIzEKWyAgICAwLjA4NjQwMV0gc21w
Ym9vdCBjcHUgMTogc3RhcnRfaXAgPSA5OTAwMApbICAgIDAuMTgwMDU1XSBC
cm91Z2h0IHVwIDIgQ1BVcwpbICAgIDAuMTgwMDU4XSBUb3RhbCBvZiAyIHBy
b2Nlc3NvcnMgYWN0aXZhdGVkICgxMTQwMi44OCBCb2dvTUlQUykuClsgICAg
MC4xODAwNTJdIGluc3RhbGxpbmcgWGVuIHRpbWVyIGZvciBDUFUgMQpbICAg
IDAuMTgwNDAzXSBkZXZ0bXBmczogaW5pdGlhbGl6ZWQKWyAgICAwLjE4MTE5
OF0gcHJpbnRfY29uc3RyYWludHM6IGR1bW15OiAKWyAgICAwLjE4MTIyOF0g
UlRDIHRpbWU6IDEyOjM3OjQzLCBkYXRlOiAxMS8wMi8xMQpbICAgIDAuMTgx
MjgwXSBORVQ6IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFtaWx5IDE2ClsgICAg
MC4xODEzOTFdIFRyeWluZyB0byB1bnBhY2sgcm9vdGZzIGltYWdlIGFzIGlu
aXRyYW1mcy4uLgpbICAgIDAuMTk2MjUxXSBBQ1BJOiBidXMgdHlwZSBwY2kg
cmVnaXN0ZXJlZApbICAgIDAuMTk2NzM2XSBQQ0k6IFVzaW5nIGNvbmZpZ3Vy
YXRpb24gdHlwZSAxIGZvciBiYXNlIGFjY2VzcwpbICAgIDAuMTk3OTc5XSBi
aW86IGNyZWF0ZSBzbGFiIDxiaW8tMD4gYXQgMApbICAgIDAuMTk4MTQwXSBB
Q1BJOiBBZGRlZCBfT1NJKE1vZHVsZSBEZXZpY2UpClsgICAgMC4xOTgxNDNd
IEFDUEk6IEFkZGVkIF9PU0koUHJvY2Vzc29yIERldmljZSkKWyAgICAwLjE5
ODE0Nl0gQUNQSTogQWRkZWQgX09TSSgzLjAgX1NDUCBFeHRlbnNpb25zKQpb
ICAgIDAuMTk4MTQ5XSBBQ1BJOiBBZGRlZCBfT1NJKFByb2Nlc3NvciBBZ2dy
ZWdhdG9yIERldmljZSkKWyAgICAwLjIwMDE5Ml0gQUNQSTogRUM6IExvb2sg
dXAgRUMgaW4gRFNEVApbICAgIDAuMjA0NDQwXSBBQ1BJOiBJbnRlcnByZXRl
ciBlbmFibGVkClsgICAgMC4yMDQ0NDRdIEFDUEk6IChzdXBwb3J0cyBTMCBT
MyBTNCBTNSkKWyAgICAwLjIwNDQ1OF0gQUNQSTogVXNpbmcgSU9BUElDIGZv
ciBpbnRlcnJ1cHQgcm91dGluZwpbICAgIDAuMzY5MjkwXSBBQ1BJOiBObyBk
b2NrIGRldmljZXMgZm91bmQuClsgICAgMC4zNjkyOTVdIEhFU1Q6IFRhYmxl
IG5vdCBmb3VuZC4KWyAgICAwLjM2OTMwMF0gUENJOiBVc2luZyBob3N0IGJy
aWRnZSB3aW5kb3dzIGZyb20gQUNQSTsgaWYgbmVjZXNzYXJ5LCB1c2UgInBj
aT1ub2NycyIgYW5kIHJlcG9ydCBhIGJ1ZwpbICAgIDAuMzY5MzYyXSBBQ1BJ
OiBQQ0kgUm9vdCBCcmlkZ2UgW1BDSTBdIChkb21haW4gMDAwMCBbYnVzIDAw
LWZmXSkKWyAgICAwLjM2OTQ4NV0gcGNpX3Jvb3QgUE5QMEEwMzowMDogaG9z
dCBicmlkZ2Ugd2luZG93IFtpbyAgMHgwMDAwLTB4MGNmN10KWyAgICAwLjM2
OTQ4OF0gcGNpX3Jvb3QgUE5QMEEwMzowMDogaG9zdCBicmlkZ2Ugd2luZG93
IFtpbyAgMHgwZDAwLTB4ZmZmZl0KWyAgICAwLjM2OTQ5MV0gcGNpX3Jvb3Qg
UE5QMEEwMzowMDogaG9zdCBicmlkZ2Ugd2luZG93IFttZW0gMHgwMDBhMDAw
MC0weDAwMGJmZmZmXQpbICAgIDAuMzY5NDk0XSBwY2lfcm9vdCBQTlAwQTAz
OjAwOiBob3N0IGJyaWRnZSB3aW5kb3cgW21lbSAweGYwMDAwMDAwLTB4ZmJm
ZmZmZmZdClsgICAgMC4zNjk3NDRdIHBjaSAwMDAwOjAwOjAwLjA6IFs4MDg2
OjEyMzddIHR5cGUgMCBjbGFzcyAweDAwMDYwMApbICAgIDAuMzcxOTM5XSBw
Y2kgMDAwMDowMDowMS4wOiBbODA4Njo3MDAwXSB0eXBlIDAgY2xhc3MgMHgw
MDA2MDEKWyAgICAwLjM3NTMyNF0gcGNpIDAwMDA6MDA6MDEuMTogWzgwODY6
NzAxMF0gdHlwZSAwIGNsYXNzIDB4MDAwMTAxClsgICAgMC4zNzczMzRdIHBj
aSAwMDAwOjAwOjAxLjE6IHJlZyAyMDogW2lvICAweGMxNjAtMHhjMTZmXQpb
ICAgIDAuMzg4NDE3XSBwY2kgMDAwMDowMDowMS4yOiBbODA4Njo3MDIwXSB0
eXBlIDAgY2xhc3MgMHgwMDBjMDMKWyAgICAwLjM5MDU0OV0gcGNpIDAwMDA6
MDA6MDEuMjogcmVnIDIwOiBbaW8gIDB4YzE0MC0weGMxNWZdClsgICAgMC4z
OTE5MTZdIHBjaSAwMDAwOjAwOjAxLjM6IFs4MDg2OjcxMTNdIHR5cGUgMCBj
bGFzcyAweDAwMDY4MApbICAgIDAuMzkxOTg5XSAqIEZvdW5kIFBNLVRpbWVy
IEJ1ZyBvbiB0aGUgY2hpcHNldC4gRHVlIHRvIHdvcmthcm91bmRzIGZvciBh
IGJ1ZywKWyAgICAwLjM5MTk5MV0gKiB0aGlzIGNsb2NrIHNvdXJjZSBpcyBz
bG93LiBDb25zaWRlciB0cnlpbmcgb3RoZXIgY2xvY2sgc291cmNlcwpbICAg
IDAuMzk0OTk0XSBwY2kgMDAwMDowMDowMS4zOiBxdWlyazogW2lvICAweGIw
MDAtMHhiMDNmXSBjbGFpbWVkIGJ5IFBJSVg0IEFDUEkKWyAgICAwLjM5NTk5
OF0gcGNpIDAwMDA6MDA6MDIuMDogWzEwMTM6MDBiOF0gdHlwZSAwIGNsYXNz
IDB4MDAwMzAwClsgICAgMC4zOTY0MTldIHBjaSAwMDAwOjAwOjAyLjA6IHJl
ZyAxMDogW21lbSAweGYwMDAwMDAwLTB4ZjFmZmZmZmYgcHJlZl0KWyAgICAw
LjM5NjgxOV0gcGNpIDAwMDA6MDA6MDIuMDogcmVnIDE0OiBbbWVtIDB4ZjMw
MjAwMDAtMHhmMzAyMGZmZl0KWyAgICAwLjQwODI4MV0gcGNpIDAwMDA6MDA6
MDMuMDogWzU4NTM6MDAwMV0gdHlwZSAwIGNsYXNzIDB4MDBmZjgwClsgICAg
MC40MDg5MDZdIHBjaSAwMDAwOjAwOjAzLjA6IHJlZyAxMDogW2lvICAweGMw
MDAtMHhjMGZmXQpbICAgIDAuNDA5MzEwXSBwY2kgMDAwMDowMDowMy4wOiBy
ZWcgMTQ6IFttZW0gMHhmMjAwMDAwMC0weGYyZmZmZmZmIHByZWZdClsgICAg
MC40MTMxNjRdIEFDUEk6IFBDSSBJbnRlcnJ1cHQgUm91dGluZyBUYWJsZSBb
XF9TQl8uUENJMC5fUFJUXQpbICAgIDAuNDEzNDcwXSAgcGNpMDAwMDowMDog
VW5hYmxlIHRvIHJlcXVlc3QgX09TQyBjb250cm9sIChfT1NDIHN1cHBvcnQg
bWFzazogMHgxZSkKWyAgICAwLjU4Mjc0NV0gRnJlZWluZyBpbml0cmQgbWVt
b3J5OiAxMzUxMmsgZnJlZWQKWyAgICAwLjc0NjcxNF0gQUNQSTogUENJIElu
dGVycnVwdCBMaW5rIFtMTktBXSAoSVJRcyAqNSAxMCAxMSkKWyAgICAwLjc0
Njk1OV0gQUNQSTogUENJIEludGVycnVwdCBMaW5rIFtMTktCXSAoSVJRcyA1
ICoxMCAxMSkKWyAgICAwLjc0NzIwNF0gQUNQSTogUENJIEludGVycnVwdCBM
aW5rIFtMTktDXSAoSVJRcyA1IDEwICoxMSkKWyAgICAwLjc0NzQ0OF0gQUNQ
STogUENJIEludGVycnVwdCBMaW5rIFtMTktEXSAoSVJRcyAqNSAxMCAxMSkK
WyAgICAwLjc0NzYxNl0geGVuL2JhbGxvb246IEluaXRpYWxpc2luZyBiYWxs
b29uIGRyaXZlci4KWyAgICAwLjc0NzYyMV0gbGFzdF9wZm4gPSAweDNmODAw
IG1heF9hcmNoX3BmbiA9IDB4NDAwMDAwMDAwClsgICAgMC43NDc2MzldIHhl
bi1iYWxsb29uOiBJbml0aWFsaXNpbmcgYmFsbG9vbiBkcml2ZXIuClsgICAg
MC43NDc3MDZdIHZnYWFyYjogZGV2aWNlIGFkZGVkOiBQQ0k6MDAwMDowMDow
Mi4wLGRlY29kZXM9aW8rbWVtLG93bnM9aW8rbWVtLGxvY2tzPW5vbmUKWyAg
ICAwLjc0NzcwNl0gdmdhYXJiOiBsb2FkZWQKWyAgICAwLjc0NzcwNl0gdmdh
YXJiOiBicmlkZ2UgY29udHJvbCBwb3NzaWJsZSAwMDAwOjAwOjAyLjAKWyAg
ICAwLjc0NzcwNl0gaTJjLWNvcmU6IGRyaXZlciBbYWF0Mjg3MF0gdXNpbmcg
bGVnYWN5IHN1c3BlbmQgbWV0aG9kClsgICAgMC43NDc3MDZdIGkyYy1jb3Jl
OiBkcml2ZXIgW2FhdDI4NzBdIHVzaW5nIGxlZ2FjeSByZXN1bWUgbWV0aG9k
ClsgICAgMC43NDgwNjldIFNDU0kgc3Vic3lzdGVtIGluaXRpYWxpemVkClsg
ICAgMC43NDgxMjJdIGxpYmF0YSB2ZXJzaW9uIDMuMDAgbG9hZGVkLgpbICAg
IDAuNzQ4MTI4XSB1c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2Ug
ZHJpdmVyIHVzYmZzClsgICAgMC43NDgxMzldIHVzYmNvcmU6IHJlZ2lzdGVy
ZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgaHViClsgICAgMC43NDgxNjVdIHVz
YmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGRldmljZSBkcml2ZXIgdXNiClsgICAg
MC43NDgxNjVdIFBDSTogVXNpbmcgQUNQSSBmb3IgSVJRIHJvdXRpbmcKWyAg
ICAwLjc0ODE2NV0gUENJOiBwY2lfY2FjaGVfbGluZV9zaXplIHNldCB0byA2
NCBieXRlcwpbICAgIDAuNzQ4OTcwXSByZXNlcnZlIFJBTSBidWZmZXI6IDAw
MDAwMDAwMDAwOWUwMDAgLSAwMDAwMDAwMDAwMDlmZmZmIApbICAgIDAuNzQ4
OTc3XSByZXNlcnZlIFJBTSBidWZmZXI6IDAwMDAwMDAwM2Y4MDAwMDAgLSAw
MDAwMDAwMDNmZmZmZmZmIApbICAgIDAuNzQ5MDYwXSBOZXRMYWJlbDogSW5p
dGlhbGl6aW5nClsgICAgMC43NDkwNjJdIE5ldExhYmVsOiAgZG9tYWluIGhh
c2ggc2l6ZSA9IDEyOApbICAgIDAuNzQ5MDY0XSBOZXRMYWJlbDogIHByb3Rv
Y29scyA9IFVOTEFCRUxFRCBDSVBTT3Y0ClsgICAgMC43NDkwNzZdIE5ldExh
YmVsOiAgdW5sYWJlbGVkIHRyYWZmaWMgYWxsb3dlZCBieSBkZWZhdWx0Clsg
ICAgMC43NDkwOTldIEhQRVQ6IDMgdGltZXJzIGluIHRvdGFsLCAwIHRpbWVy
cyB3aWxsIGJlIHVzZWQgZm9yIHBlci1jcHUgdGltZXIKWyAgICAwLjc0OTA5
OV0gaHBldDA6IGF0IE1NSU8gMHhmZWQwMDAwMCwgSVJRcyAyLCA4LCAwClsg
ICAgMC43NDkwOTldIGhwZXQwOiAzIGNvbXBhcmF0b3JzLCA2NC1iaXQgNjIu
NTAwMDAwIE1IeiBjb3VudGVyClsgICAgMC43NTIwODJdIFN3aXRjaGluZyB0
byBjbG9ja3NvdXJjZSB4ZW4KWyAgICAwLjc1MjU0NV0gU3dpdGNoZWQgdG8g
Tk9IeiBtb2RlIG9uIENQVSAjMApbICAgIDAuNzU1OTQ0XSBTd2l0Y2hlZCB0
byBOT0h6IG1vZGUgb24gQ1BVICMxClsgICAgMC43NTkyNThdIEFwcEFybW9y
OiBBcHBBcm1vciBGaWxlc3lzdGVtIEVuYWJsZWQKWyAgICAwLjc1OTI4NV0g
cG5wOiBQblAgQUNQSSBpbml0ClsgICAgMC43NTkyOTddIEFDUEk6IGJ1cyB0
eXBlIHBucCByZWdpc3RlcmVkClsgICAgMC43NTkzMjNdIHBucCAwMDowMDog
W21lbSAweDAwMDAwMDAwLTB4MDAwOWZmZmZdClsgICAgMC43NTkzNTJdIHN5
c3RlbSAwMDowMDogW21lbSAweDAwMDAwMDAwLTB4MDAwOWZmZmZdIGNvdWxk
IG5vdCBiZSByZXNlcnZlZApbICAgIDAuNzU5MzU3XSBzeXN0ZW0gMDA6MDA6
IFBsdWcgYW5kIFBsYXkgQUNQSSBkZXZpY2UsIElEcyBQTlAwYzAyIChhY3Rp
dmUpClsgICAgMC43NTk0MjNdIHBucCAwMDowMTogW2J1cyAwMC1mZl0KWyAg
ICAwLjc1OTQyN10gcG5wIDAwOjAxOiBbaW8gIDB4MGNmOC0weDBjZmZdClsg
ICAgMC43NTk0MzBdIHBucCAwMDowMTogW2lvICAweDAwMDAtMHgwY2Y3IHdp
bmRvd10KWyAgICAwLjc1OTQzNl0gcG5wIDAwOjAxOiBbaW8gIDB4MGQwMC0w
eGZmZmYgd2luZG93XQpbICAgIDAuNzU5NDM5XSBwbnAgMDA6MDE6IFttZW0g
MHgwMDBhMDAwMC0weDAwMGJmZmZmIHdpbmRvd10KWyAgICAwLjc1OTQ0Ml0g
cG5wIDAwOjAxOiBbbWVtIDB4ZjAwMDAwMDAtMHhmYmZmZmZmZiB3aW5kb3dd
ClsgICAgMC43NTk0NzFdIHBucCAwMDowMTogUGx1ZyBhbmQgUGxheSBBQ1BJ
IGRldmljZSwgSURzIFBOUDBhMDMgKGFjdGl2ZSkKWyAgICAwLjc1OTQ4MF0g
cG5wIDAwOjAyOiBbaW8gIDB4MTBjMC0weDExNDFdClsgICAgMC43NTk0ODNd
IHBucCAwMDowMjogW2lvICAweGIwNDQtMHhiMDQ3XQpbICAgIDAuNzU5NTA2
XSBzeXN0ZW0gMDA6MDI6IFtpbyAgMHgxMGMwLTB4MTE0MV0gaGFzIGJlZW4g
cmVzZXJ2ZWQKWyAgICAwLjc1OTUwOV0gc3lzdGVtIDAwOjAyOiBbaW8gIDB4
YjA0NC0weGIwNDddIGhhcyBiZWVuIHJlc2VydmVkClsgICAgMC43NTk1MTNd
IHN5c3RlbSAwMDowMjogUGx1ZyBhbmQgUGxheSBBQ1BJIGRldmljZSwgSURz
IFBOUDBjMDIgKGFjdGl2ZSkKWyAgICAwLjc1OTUzM10gcG5wIDAwOjAzOiBb
bWVtIDB4ZmVkMDAwMDAtMHhmZWQwMDNmZl0KWyAgICAwLjc1OTU1MV0gcG5w
IDAwOjAzOiBQbHVnIGFuZCBQbGF5IEFDUEkgZGV2aWNlLCBJRHMgUE5QMDEw
MyAoYWN0aXZlKQpbICAgIDAuNzU5NTY4XSBwbnAgMDA6MDQ6IFtpbyAgMHgw
MDEwLTB4MDAxZl0KWyAgICAwLjc1OTU3MV0gcG5wIDAwOjA0OiBbaW8gIDB4
MDAyMi0weDAwMmRdClsgICAgMC43NTk1NzNdIHBucCAwMDowNDogW2lvICAw
eDAwMzAtMHgwMDNmXQpbICAgIDAuNzU5NTc2XSBwbnAgMDA6MDQ6IFtpbyAg
MHgwMDQ0LTB4MDA1Zl0KWyAgICAwLjc1OTU3OV0gcG5wIDAwOjA0OiBbaW8g
IDB4MDA2Mi0weDAwNjNdClsgICAgMC43NTk1ODFdIHBucCAwMDowNDogW2lv
ICAweDAwNjUtMHgwMDZmXQpbICAgIDAuNzU5NTg0XSBwbnAgMDA6MDQ6IFtp
byAgMHgwMDcyLTB4MDA3Zl0KWyAgICAwLjc1OTU4Nl0gcG5wIDAwOjA0OiBb
aW8gIDB4MDA4MF0KWyAgICAwLjc1OTU4OV0gcG5wIDAwOjA0OiBbaW8gIDB4
MDA4NC0weDAwODZdClsgICAgMC43NTk1OTJdIHBucCAwMDowNDogW2lvICAw
eDAwODhdClsgICAgMC43NTk1OTRdIHBucCAwMDowNDogW2lvICAweDAwOGMt
MHgwMDhlXQpbICAgIDAuNzU5NTk3XSBwbnAgMDA6MDQ6IFtpbyAgMHgwMDkw
LTB4MDA5Zl0KWyAgICAwLjc1OTYwMF0gcG5wIDAwOjA0OiBbaW8gIDB4MDBh
Mi0weDAwYmRdClsgICAgMC43NTk2MDJdIHBucCAwMDowNDogW2lvICAweDAw
ZTAtMHgwMGVmXQpbICAgIDAuNzU5NjA1XSBwbnAgMDA6MDQ6IFtpbyAgMHgw
OGEwLTB4MDhhM10KWyAgICAwLjc1OTYwOF0gcG5wIDAwOjA0OiBbaW8gIDB4
MGNjMC0weDBjY2ZdClsgICAgMC43NTk2MTBdIHBucCAwMDowNDogW2lvICAw
eDA0ZDAtMHgwNGQxXQpbICAgIDAuNzU5NjQzXSBzeXN0ZW0gMDA6MDQ6IFtp
byAgMHgwOGEwLTB4MDhhM10gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjc1
OTY0Nl0gc3lzdGVtIDAwOjA0OiBbaW8gIDB4MGNjMC0weDBjY2ZdIGhhcyBi
ZWVuIHJlc2VydmVkClsgICAgMC43NTk2NDldIHN5c3RlbSAwMDowNDogW2lv
ICAweDA0ZDAtMHgwNGQxXSBoYXMgYmVlbiByZXNlcnZlZApbICAgIDAuNzU5
NjUzXSBzeXN0ZW0gMDA6MDQ6IFBsdWcgYW5kIFBsYXkgQUNQSSBkZXZpY2Us
IElEcyBQTlAwYzAyIChhY3RpdmUpClsgICAgMC43NTk2NjRdIHBucCAwMDow
NTogW2RtYSA0XQpbICAgIDAuNzU5NjY3XSBwbnAgMDA6MDU6IFtpbyAgMHgw
MDAwLTB4MDAwZl0KWyAgICAwLjc1OTY2OV0gcG5wIDAwOjA1OiBbaW8gIDB4
MDA4MS0weDAwODNdClsgICAgMC43NTk2NzJdIHBucCAwMDowNTogW2lvICAw
eDAwODddClsgICAgMC43NTk2NzVdIHBucCAwMDowNTogW2lvICAweDAwODkt
MHgwMDhiXQpbICAgIDAuNzU5Njc3XSBwbnAgMDA6MDU6IFtpbyAgMHgwMDhm
XQpbICAgIDAuNzU5NjgwXSBwbnAgMDA6MDU6IFtpbyAgMHgwMGMwLTB4MDBk
Zl0KWyAgICAwLjc1OTY4Ml0gcG5wIDAwOjA1OiBbaW8gIDB4MDQ4MC0weDA0
OGZdClsgICAgMC43NTk3MDFdIHBucCAwMDowNTogUGx1ZyBhbmQgUGxheSBB
Q1BJIGRldmljZSwgSURzIFBOUDAyMDAgKGFjdGl2ZSkKWyAgICAwLjc1OTcx
MF0gcG5wIDAwOjA2OiBbaW8gIDB4MDA3MC0weDAwNzFdClsgICAgMC43NTk3
MjRdIHhlbjogLS0+IHBpcnE9MTYgLT4gaXJxPTggKGdzaT04KQpbICAgIDAu
NzU5NzI4XSBwbnAgMDA6MDY6IFtpcnEgOF0KWyAgICAwLjc1OTc2MV0gcG5w
IDAwOjA2OiBQbHVnIGFuZCBQbGF5IEFDUEkgZGV2aWNlLCBJRHMgUE5QMGIw
MCAoYWN0aXZlKQpbICAgIDAuNzU5NzcwXSBwbnAgMDA6MDc6IFtpbyAgMHgw
MDYxXQpbICAgIDAuNzU5Nzg4XSBwbnAgMDA6MDc6IFBsdWcgYW5kIFBsYXkg
QUNQSSBkZXZpY2UsIElEcyBQTlAwODAwIChhY3RpdmUpClsgICAgMC43NTk4
MDddIHhlbjogLS0+IHBpcnE9MTcgLT4gaXJxPTEyIChnc2k9MTIpClsgICAg
MC43NTk4MTBdIHBucCAwMDowODogW2lycSAxMl0KWyAgICAwLjc1OTgzNV0g
cG5wIDAwOjA4OiBQbHVnIGFuZCBQbGF5IEFDUEkgZGV2aWNlLCBJRHMgUE5Q
MGYxMyAoYWN0aXZlKQpbICAgIDAuNzU5ODQ4XSBwbnAgMDA6MDk6IFtpbyAg
MHgwMDYwXQpbICAgIDAuNzU5ODUxXSBwbnAgMDA6MDk6IFtpbyAgMHgwMDY0
XQpbICAgIDAuNzU5ODU4XSB4ZW46IC0tPiBwaXJxPTE4IC0+IGlycT0xIChn
c2k9MSkKWyAgICAwLjc1OTg2MV0gcG5wIDAwOjA5OiBbaXJxIDFdClsgICAg
MC43NTk4ODVdIHBucCAwMDowOTogUGx1ZyBhbmQgUGxheSBBQ1BJIGRldmlj
ZSwgSURzIFBOUDAzMDMgUE5QMDMwYiAoYWN0aXZlKQpbICAgIDAuNzU5ODk4
XSBwbnAgMDA6MGE6IFtpbyAgMHgwM2YwLTB4MDNmNV0KWyAgICAwLjc1OTkw
MV0gcG5wIDAwOjBhOiBbaW8gIDB4MDNmN10KWyAgICAwLjc1OTkwOF0geGVu
OiAtLT4gcGlycT0xOSAtPiBpcnE9NiAoZ3NpPTYpClsgICAgMC43NTk5MTFd
IHBucCAwMDowYTogW2lycSA2XQpbICAgIDAuNzU5OTE2XSBwbnAgMDA6MGE6
IFtkbWEgMl0KWyAgICAwLjc1OTkzNl0gcG5wIDAwOjBhOiBQbHVnIGFuZCBQ
bGF5IEFDUEkgZGV2aWNlLCBJRHMgUE5QMDcwMCAoYWN0aXZlKQpbICAgIDAu
NzU5OTU5XSBwbnAgMDA6MGI6IFtpbyAgMHgwM2Y4LTB4MDNmZl0KWyAgICAw
Ljc1OTk2Nl0geGVuOiAtLT4gcGlycT0yMCAtPiBpcnE9NCAoZ3NpPTQpClsg
ICAgMC43NTk5NjldIHBucCAwMDowYjogW2lycSA0XQpbICAgIDAuNzU5OTg5
XSBwbnAgMDA6MGI6IFBsdWcgYW5kIFBsYXkgQUNQSSBkZXZpY2UsIElEcyBQ
TlAwNTAxIChhY3RpdmUpClsgICAgMC43NjAwMThdIHBucCAwMDowYzogW2lv
ICAweDAzNzgtMHgwMzdmXQpbICAgIDAuNzYwMDI1XSB4ZW46IC0tPiBwaXJx
PTIxIC0+IGlycT03IChnc2k9NykKWyAgICAwLjc2MDAyOF0gcG5wIDAwOjBj
OiBbaXJxIDddClsgICAgMC43NjAwNDhdIHBucCAwMDowYzogUGx1ZyBhbmQg
UGxheSBBQ1BJIGRldmljZSwgSURzIFBOUDA0MDAgKGFjdGl2ZSkKWyAgICAw
Ljc5MzYzNl0gcG5wOiBQblAgQUNQSTogZm91bmQgMTMgZGV2aWNlcwpbICAg
IDAuNzkzNjM5XSBBQ1BJOiBBQ1BJIGJ1cyB0eXBlIHBucCB1bnJlZ2lzdGVy
ZWQKWyAgICAwLjgwMzg5OV0gUENJOiBtYXggYnVzIGRlcHRoOiAwIHBjaV90
cnlfbnVtOiAxClsgICAgMC44MDM5MDVdIHBjaV9idXMgMDAwMDowMDogcmVz
b3VyY2UgNCBbaW8gIDB4MDAwMC0weDBjZjddClsgICAgMC44MDM5MDhdIHBj
aV9idXMgMDAwMDowMDogcmVzb3VyY2UgNSBbaW8gIDB4MGQwMC0weGZmZmZd
ClsgICAgMC44MDM5MTFdIHBjaV9idXMgMDAwMDowMDogcmVzb3VyY2UgNiBb
bWVtIDB4MDAwYTAwMDAtMHgwMDBiZmZmZl0KWyAgICAwLjgwMzkxNF0gcGNp
X2J1cyAwMDAwOjAwOiByZXNvdXJjZSA3IFttZW0gMHhmMDAwMDAwMC0weGZi
ZmZmZmZmXQpbICAgIDAuODAzOTQ5XSBORVQ6IFJlZ2lzdGVyZWQgcHJvdG9j
b2wgZmFtaWx5IDIKWyAgICAwLjgwNDA0NV0gSVAgcm91dGUgY2FjaGUgaGFz
aCB0YWJsZSBlbnRyaWVzOiAzMjc2OCAob3JkZXI6IDYsIDI2MjE0NCBieXRl
cykKWyAgICAwLjgwNDQ0Ml0gVENQIGVzdGFibGlzaGVkIGhhc2ggdGFibGUg
ZW50cmllczogMTMxMDcyIChvcmRlcjogOSwgMjA5NzE1MiBieXRlcykKWyAg
ICAwLjgwNTMzMV0gVENQIGJpbmQgaGFzaCB0YWJsZSBlbnRyaWVzOiA2NTUz
NiAob3JkZXI6IDgsIDEwNDg1NzYgYnl0ZXMpClsgICAgMC44MDU2OTNdIFRD
UDogSGFzaCB0YWJsZXMgY29uZmlndXJlZCAoZXN0YWJsaXNoZWQgMTMxMDcy
IGJpbmQgNjU1MzYpClsgICAgMC44MDU2OTZdIFRDUCByZW5vIHJlZ2lzdGVy
ZWQKWyAgICAwLjgwNTcwMV0gVURQIGhhc2ggdGFibGUgZW50cmllczogNTEy
IChvcmRlcjogMiwgMTYzODQgYnl0ZXMpClsgICAgMC44MDU3MTVdIFVEUC1M
aXRlIGhhc2ggdGFibGUgZW50cmllczogNTEyIChvcmRlcjogMiwgMTYzODQg
Ynl0ZXMpClsgICAgMC44MDU4MTBdIE5FVDogUmVnaXN0ZXJlZCBwcm90b2Nv
bCBmYW1pbHkgMQpbICAgIDAuODA1ODIwXSBwY2kgMDAwMDowMDowMC4wOiBM
aW1pdGluZyBkaXJlY3QgUENJL1BDSSB0cmFuc2ZlcnMKWyAgICAwLjgwNTg5
Nl0gcGNpIDAwMDA6MDA6MDEuMDogUElJWDM6IEVuYWJsaW5nIFBhc3NpdmUg
UmVsZWFzZQpbICAgIDAuODA2MDI4XSBwY2kgMDAwMDowMDowMS4wOiBBY3Rp
dmF0aW5nIElTQSBETUEgaGFuZyB3b3JrYXJvdW5kcwpbICAgIDAuODA2Njky
XSBwY2kgMDAwMDowMDowMi4wOiBCb290IHZpZGVvIGRldmljZQpbICAgIDAu
ODA2ODMzXSBQQ0k6IENMUyAwIGJ5dGVzLCBkZWZhdWx0IDY0ClsgICAgMC44
MDcyNDldIGF1ZGl0OiBpbml0aWFsaXppbmcgbmV0bGluayBzb2NrZXQgKGRp
c2FibGVkKQpbICAgIDAuODA3MjYwXSB0eXBlPTIwMDAgYXVkaXQoMTMyMDIz
NzQ2NS41MjE6MSk6IGluaXRpYWxpemVkClsgICAgMC44Mjc1ODFdIEh1Z2VU
TEIgcmVnaXN0ZXJlZCAyIE1CIHBhZ2Ugc2l6ZSwgcHJlLWFsbG9jYXRlZCAw
IHBhZ2VzClsgICAgMC44MzM2ODFdIFZGUzogRGlzayBxdW90YXMgZHF1b3Rf
Ni41LjIKWyAgICAwLjgzMzc0Ml0gRHF1b3QtY2FjaGUgaGFzaCB0YWJsZSBl
bnRyaWVzOiA1MTIgKG9yZGVyIDAsIDQwOTYgYnl0ZXMpClsgICAgMC44MzQ0
MDJdIGZ1c2UgaW5pdCAoQVBJIHZlcnNpb24gNy4xNykKWyAgICAwLjgzNDUy
Nl0gbXNnbW5pIGhhcyBiZWVuIHNldCB0byAxOTY1ClsgICAgMC44MzU1NDld
IEJsb2NrIGxheWVyIFNDU0kgZ2VuZXJpYyAoYnNnKSBkcml2ZXIgdmVyc2lv
biAwLjQgbG9hZGVkIChtYWpvciAyNTMpClsgICAgMC44MzU2MzRdIGlvIHNj
aGVkdWxlciBub29wIHJlZ2lzdGVyZWQKWyAgICAwLjgzNTYzNl0gaW8gc2No
ZWR1bGVyIGRlYWRsaW5lIHJlZ2lzdGVyZWQKWyAgICAwLjgzNTY3N10gaW8g
c2NoZWR1bGVyIGNmcSByZWdpc3RlcmVkIChkZWZhdWx0KQpbICAgIDAuODM1
NzU2XSBwY2lfaG90cGx1ZzogUENJIEhvdCBQbHVnIFBDSSBDb3JlIHZlcnNp
b246IDAuNQpbICAgIDAuODM1Nzc1XSBwY2llaHA6IFBDSSBFeHByZXNzIEhv
dCBQbHVnIENvbnRyb2xsZXIgRHJpdmVyIHZlcnNpb246IDAuNApbICAgIDAu
ODM1ODI1XSBlZmlmYjogcHJvYmluZyBmb3IgZWZpZmIKWyAgICAwLjgzNjAw
Ml0gZWZpZmI6IGZyYW1lYnVmZmVyIGF0IDB4ZjAwMDAwMDAsIG1hcHBlZCB0
byAweGZmZmZjOTAwMDA1MDAwMDAsIHVzaW5nIDE0MDhrLCB0b3RhbCAxNDA4
awpbICAgIDAuODM2MDA2XSBlZmlmYjogbW9kZSBpcyA4MDB4NjAweDI0LCBs
aW5lbGVuZ3RoPTI0MDAsIHBhZ2VzPTEKWyAgICAwLjgzNjAwOF0gZWZpZmI6
IHNjcm9sbGluZzogcmVkcmF3ClsgICAgMC44MzYwMTFdIGVmaWZiOiBUcnVl
Y29sb3I6IHNpemU9MDo4Ojg6OCwgc2hpZnQ9MDoxNjo4OjAKWyAgICAwLjgz
NjEzNl0gQ29uc29sZTogc3dpdGNoaW5nIHRvIGNvbG91ciBmcmFtZSBidWZm
ZXIgZGV2aWNlIDEwMHgzNwpbICAgIDAuODM2MTQ5XSBmYjA6IEVGSSBWR0Eg
ZnJhbWUgYnVmZmVyIGRldmljZQpbICAgIDAuODM2MjEyXSBpbnB1dDogUG93
ZXIgQnV0dG9uIGFzIC9kZXZpY2VzL0xOWFNZU1RNOjAwL0xOWFBXUkJOOjAw
L2lucHV0L2lucHV0MApbICAgIDAuODM2MjE4XSBBQ1BJOiBQb3dlciBCdXR0
b24gW1BXUkZdClsgICAgMC44MzYyNTVdIGlucHV0OiBTbGVlcCBCdXR0b24g
YXMgL2RldmljZXMvTE5YU1lTVE06MDAvTE5YU0xQQk46MDAvaW5wdXQvaW5w
dXQxClsgICAgMC44MzYyNTldIEFDUEk6IFNsZWVwIEJ1dHRvbiBbU0xQRl0K
WyAgICAwLjgzNjI4Ml0gQUNQSTogYWNwaV9pZGxlIHJlZ2lzdGVyZWQgd2l0
aCBjcHVpZGxlClsgICAgMC44NzEyODNdIEVSU1Q6IFRhYmxlIGlzIG5vdCBm
b3VuZCEKWyAgICAwLjg3MTI4Nl0gR0hFUzogSEVTVCBpcyBub3QgZW5hYmxl
ZCEKWyAgICAwLjg3MTM4NF0geGVuOiAtLT4gcGlycT0yMiAtPiBpcnE9Mjgg
KGdzaT0yOCkKWyAgICAwLjg3MTM4OF0geGVuLXBsYXRmb3JtLXBjaSAwMDAw
OjAwOjAzLjA6IFBDSSBJTlQgQSAtPiBHU0kgMjggKGxldmVsLCBsb3cpIC0+
IElSUSAyOApbICAgIDAuODczNTQyXSBHcmFudCB0YWJsZSBpbml0aWFsaXpl
ZApbICAgIDAuODc1Nzc5XSBTZXJpYWw6IDgyNTAvMTY1NTAgZHJpdmVyLCAz
MiBwb3J0cywgSVJRIHNoYXJpbmcgZW5hYmxlZApbICAgIDAuOTA3ODk2XSBz
ZXJpYWw4MjUwOiB0dHlTMCBhdCBJL08gMHgzZjggKGlycSA9IDQpIGlzIGEg
MTY1NTBBClsgICAgMC45NTEzMjVdIDAwOjBiOiB0dHlTMCBhdCBJL08gMHgz
ZjggKGlycSA9IDQpIGlzIGEgMTY1NTBBClsgICAgMC45NjA0MDNdIExpbnV4
IGFncGdhcnQgaW50ZXJmYWNlIHYwLjEwMwpbICAgIDAuOTYyNDEyXSBicmQ6
IG1vZHVsZSBsb2FkZWQKWyAgICAwLjk2MzU3Ml0gbG9vcDogbW9kdWxlIGxv
YWRlZApbICAgIDAuOTY1NTA2XSBibGtmcm9udCBkZXZpY2UvdmJkLzc2OCBu
dW0tcmluZy1wYWdlcyAxIG5yX2VudHMgMzIuClsgICAgMC45NjU4ODJdIGF0
YV9waWl4IDAwMDA6MDA6MDEuMTogdmVyc2lvbiAyLjEzClsgICAgMC45NjY3
OTldIGF0YV9waWl4IDAwMDA6MDA6MDEuMTogc2V0dGluZyBsYXRlbmN5IHRp
bWVyIHRvIDY0ClsgICAgMC45Njc1MzddIHNjc2kwIDogYXRhX3BpaXgKWyAg
ICAwLjk2NzY3NV0gc2NzaTEgOiBhdGFfcGlpeApbICAgIDAuOTY3NzE2XSBh
dGExOiBQQVRBIG1heCBNV0RNQTIgY21kIDB4MWYwIGN0bCAweDNmNiBibWRt
YSAweGMxNjAgaXJxIDE0ClsgICAgMC45Njc3MTldIGF0YTI6IFBBVEEgbWF4
IE1XRE1BMiBjbWQgMHgxNzAgY3RsIDB4Mzc2IGJtZG1hIDB4YzE2OCBpcnEg
MTUKWyAgICAwLjk2ODA5NF0gRml4ZWQgTURJTyBCdXM6IHByb2JlZApbICAg
IDAuOTY4MTE3XSBQUFAgZ2VuZXJpYyBkcml2ZXIgdmVyc2lvbiAyLjQuMgpb
ICAgIDAuOTY4MTY5XSBJbml0aWFsaXNpbmcgWGVuIHZpcnR1YWwgZXRoZXJu
ZXQgZHJpdmVyLgpbICAgIDAuOTY5NTkzXSBibGtmcm9udDogeHZkYTogZmx1
c2ggZGlza2NhY2hlOiBlbmFibGVkClsgICAgMC45NzE4OTRdIHR1bjogVW5p
dmVyc2FsIFRVTi9UQVAgZGV2aWNlIGRyaXZlciwgMS42ClsgICAgMC45NzE4
OThdIHR1bjogKEMpIDE5OTktMjAwNCBNYXggS3Jhc255YW5za3kgPG1heGtA
cXVhbGNvbW0uY29tPgpbICAgIDAuOTcyMTgxXSBlaGNpX2hjZDogVVNCIDIu
MCAnRW5oYW5jZWQnIEhvc3QgQ29udHJvbGxlciAoRUhDSSkgRHJpdmVyClsg
ICAgMC45NzIyMTldIG9oY2lfaGNkOiBVU0IgMS4xICdPcGVuJyBIb3N0IENv
bnRyb2xsZXIgKE9IQ0kpIERyaXZlcgpbICAgIDAuOTcyMjI4XSB1aGNpX2hj
ZDogVVNCIFVuaXZlcnNhbCBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlIGRy
aXZlcgpbICAgIDAuOTcyMzg2XSB4ZW46IC0tPiBwaXJxPTIzIC0+IGlycT0y
MyAoZ3NpPTIzKQpbICAgIDAuOTcyMzk0XSB1aGNpX2hjZCAwMDAwOjAwOjAx
LjI6IFBDSSBJTlQgRCAtPiBHU0kgMjMgKGxldmVsLCBsb3cpIC0+IElSUSAy
MwpbICAgIDAuOTcyNTA1XSB1aGNpX2hjZCAwMDAwOjAwOjAxLjI6IHNldHRp
bmcgbGF0ZW5jeSB0aW1lciB0byA2NApbICAgIDAuOTcyNTcxXSB1aGNpX2hj
ZCAwMDAwOjAwOjAxLjI6IFVIQ0kgSG9zdCBDb250cm9sbGVyClsgICAgMC45
NzI2MTZdIHVoY2lfaGNkIDAwMDA6MDA6MDEuMjogbmV3IFVTQiBidXMgcmVn
aXN0ZXJlZCwgYXNzaWduZWQgYnVzIG51bWJlciAxClsgICAgMC45NzMwMjBd
IHVoY2lfaGNkIDAwMDA6MDA6MDEuMjogaXJxIDIzLCBpbyBiYXNlIDB4MDAw
MGMxNDAKWyAgICAwLjk3ODkwMF0gaHViIDEtMDoxLjA6IFVTQiBodWIgZm91
bmQKWyAgICAwLjk3ODkwNV0gaHViIDEtMDoxLjA6IDIgcG9ydHMgZGV0ZWN0
ZWQKWyAgICAwLjk3OTE3OF0gaTgwNDI6IFBOUDogUFMvMiBDb250cm9sbGVy
IFtQTlAwMzAzOlBTMkssUE5QMGYxMzpQUzJNXSBhdCAweDYwLDB4NjQgaXJx
IDEsMTIKWyAgICAwLjk4MTYzN10gc2VyaW86IGk4MDQyIEtCRCBwb3J0IGF0
IDB4NjAsMHg2NCBpcnEgMQpbICAgIDAuOTgxNjQ5XSBzZXJpbzogaTgwNDIg
QVVYIHBvcnQgYXQgMHg2MCwweDY0IGlycSAxMgpbICAgIDAuOTgxNzY5XSBt
b3VzZWRldjogUFMvMiBtb3VzZSBkZXZpY2UgY29tbW9uIGZvciBhbGwgbWlj
ZQpbICAgIDAuOTgyOTU4XSBpbnB1dDogQVQgVHJhbnNsYXRlZCBTZXQgMiBr
ZXlib2FyZCBhcyAvZGV2aWNlcy9wbGF0Zm9ybS9pODA0Mi9zZXJpbzAvaW5w
dXQvaW5wdXQyClsgICAgMC45ODI5ODVdICB4dmRhOiB4dmRhMSB4dmRhMiA8
IHh2ZGE1ID4KWyAgICAwLjk4NDIzNF0gcnRjX2Ntb3MgMDA6MDY6IHJ0YyBj
b3JlOiByZWdpc3RlcmVkIHJ0Y19jbW9zIGFzIHJ0YzAKWyAgICAwLjk4NDI3
OV0gcnRjMDogYWxhcm1zIHVwIHRvIG9uZSBkYXksIDExNCBieXRlcyBudnJh
bSwgaHBldCBpcnFzClsgICAgMC45ODQzNjJdIGRldmljZS1tYXBwZXI6IHVl
dmVudDogdmVyc2lvbiAxLjAuMwpbICAgIDAuOTg0NDcyXSBkZXZpY2UtbWFw
cGVyOiBpb2N0bDogNC4yMS4wLWlvY3RsICgyMDExLTA3LTA2KSBpbml0aWFs
aXNlZDogZG0tZGV2ZWxAcmVkaGF0LmNvbQpbICAgIDAuOTg0NDkyXSBjcHVp
ZGxlOiB1c2luZyBnb3Zlcm5vciBsYWRkZXIKWyAgICAwLjk4NDQ5NV0gY3B1
aWRsZTogdXNpbmcgZ292ZXJub3IgbWVudQpbICAgIDAuOTg0NDk3XSBFRkkg
VmFyaWFibGVzIEZhY2lsaXR5IHYwLjA4IDIwMDQtTWF5LTE3ClsgICAgMC45
ODQ3NjNdIFRDUCBjdWJpYyByZWdpc3RlcmVkClsgICAgMC45ODQ4NzddIE5F
VDogUmVnaXN0ZXJlZCBwcm90b2NvbCBmYW1pbHkgMTAKWyAgICAwLjk4NTY5
M10gTkVUOiBSZWdpc3RlcmVkIHByb3RvY29sIGZhbWlseSAxNwpbICAgIDAu
OTg1NzEwXSBSZWdpc3RlcmluZyB0aGUgZG5zX3Jlc29sdmVyIGtleSB0eXBl
ClsgICAgMC45ODU4ODldIFBNOiBIaWJlcm5hdGlvbiBpbWFnZSBub3QgcHJl
c2VudCBvciBjb3VsZCBub3QgYmUgbG9hZGVkLgpbICAgIDAuOTg1OTAxXSBy
ZWdpc3RlcmVkIHRhc2tzdGF0cyB2ZXJzaW9uIDEKWyAgICAxLjAxOTI3MV0g
ICBNYWdpYyBudW1iZXI6IDM6MzQ6NjMyClsgICAgMS4wMTk0MDhdIHJ0Y19j
bW9zIDAwOjA2OiBzZXR0aW5nIHN5c3RlbSBjbG9jayB0byAyMDExLTExLTAy
IDEyOjM3OjQ0IFVUQyAoMTMyMDIzNzQ2NCkKWyAgICAxLjAxOTQzNV0gQklP
UyBFREQgZmFjaWxpdHkgdjAuMTYgMjAwNC1KdW4tMjUsIDAgZGV2aWNlcyBm
b3VuZApbICAgIDEuMDE5NDM3XSBFREQgaW5mb3JtYXRpb24gbm90IGF2YWls
YWJsZS4KWyAgICAxLjEyNjQ3Nl0gRnJlZWluZyB1bnVzZWQga2VybmVsIG1l
bW9yeTogOTA0ayBmcmVlZApbICAgIDEuMTI2NzQwXSBXcml0ZSBwcm90ZWN0
aW5nIHRoZSBrZXJuZWwgcmVhZC1vbmx5IGRhdGE6IDEyMjg4awpbICAgIDEu
MTM0MjY3XSBGcmVlaW5nIHVudXNlZCBrZXJuZWwgbWVtb3J5OiAxODI4ayBm
cmVlZApbICAgIDEuMTM4MzAwXSBGcmVlaW5nIHVudXNlZCBrZXJuZWwgbWVt
b3J5OiAxMjk2ayBmcmVlZApbICAgIDEuMjg4MDg4XSB1c2IgMS0yOiBuZXcg
ZnVsbCBzcGVlZCBVU0IgZGV2aWNlIG51bWJlciAyIHVzaW5nIHVoY2lfaGNk
ClsgICAgMS4zOTA2NzVdIHVkZXZkWzg3XTogc3RhcnRpbmcgdmVyc2lvbiAx
NzMKWyAgICAxLjU1NzE3MF0gRkRDIDAgaXMgYSBTODIwNzhCClsgICAgMS42
NTQwOTBdIEVYVDQtZnMgKHh2ZGExKTogbW91bnRlZCBmaWxlc3lzdGVtIHdp
dGggb3JkZXJlZCBkYXRhIG1vZGUuIE9wdHM6IChudWxsKQpbICAgIDEuODA0
MDk5XSBSZWZpbmVkIFRTQyBjbG9ja3NvdXJjZSBjYWxpYnJhdGlvbjogMjgz
My4wNDEgTUh6LgpbICAgIDguNzU1Njc5XSB1ZGV2ZFsyNjddOiBzdGFydGlu
ZyB2ZXJzaW9uIDE3MwpbICAgIDguNzc2NDM1XSBBZGRpbmcgMTAzNjE1Nmsg
c3dhcCBvbiAvZGV2L3h2ZGE1LiAgUHJpb3JpdHk6LTEgZXh0ZW50czoxIGFj
cm9zczoxMDM2MTU2ayBTUwpbICAgIDguODIyMTQ1XSBscDogZHJpdmVyIGxv
YWRlZCBidXQgbm8gZGV2aWNlcyBmb3VuZApbICAgIDguODUxMzk5XSBwaWl4
NF9zbWJ1cyAwMDAwOjAwOjAxLjM6IFNNQnVzIGJhc2UgYWRkcmVzcyB1bmlu
aXRpYWxpemVkIC0gdXBncmFkZSBCSU9TIG9yIHVzZSBmb3JjZV9hZGRyPTB4
YWRkcgpbICAgIDguOTU0Njg1XSBFWFQ0LWZzICh4dmRhMSk6IHJlLW1vdW50
ZWQuIE9wdHM6IGVycm9ycz1yZW1vdW50LXJvClsgICAgOS4xMzk4ODhdIHR5
cGU9MTQwMCBhdWRpdCgxMzIwMjM3NDcyLjYxNjoyKTogYXBwYXJtb3I9IlNU
QVRVUyIgb3BlcmF0aW9uPSJwcm9maWxlX2xvYWQiIG5hbWU9Ii9zYmluL2Ro
Y2xpZW50IiBwaWQ9NDI1IGNvbW09ImFwcGFybW9yX3BhcnNlciIKWyAgICA5
LjE0MDI3MV0gdHlwZT0xNDAwIGF1ZGl0KDEzMjAyMzc0NzIuNjIwOjMpOiBh
cHBhcm1vcj0iU1RBVFVTIiBvcGVyYXRpb249InByb2ZpbGVfbG9hZCIgbmFt
ZT0iL3Vzci9saWIvTmV0d29ya01hbmFnZXIvbm0tZGhjcC1jbGllbnQuYWN0
aW9uIiBwaWQ9NDI1IGNvbW09ImFwcGFybW9yX3BhcnNlciIKWyAgICA5LjE0
MDQ3M10gdHlwZT0xNDAwIGF1ZGl0KDEzMjAyMzc0NzIuNjIwOjQpOiBhcHBh
cm1vcj0iU1RBVFVTIiBvcGVyYXRpb249InByb2ZpbGVfbG9hZCIgbmFtZT0i
L3Vzci9saWIvY29ubm1hbi9zY3JpcHRzL2RoY2xpZW50LXNjcmlwdCIgcGlk
PTQyNSBjb21tPSJhcHBhcm1vcl9wYXJzZXIiClsgICAgOS4xNjMzMDRdIHBh
cnBvcnRfcGMgMDA6MGM6IHJlcG9ydGVkIGJ5IFBsdWcgYW5kIFBsYXkgQUNQ
SQpbICAgIDkuMTY0MTk0XSBwYXJwb3J0MDogUEMtc3R5bGUgYXQgMHgzNzgs
IGlycSA3IFtQQ1NQUCxUUklTVEFURV0KWyAgICA5LjM4OTY4NF0gaW5wdXQ6
IEltRXhQUy8yIEdlbmVyaWMgRXhwbG9yZXIgTW91c2UgYXMgL2RldmljZXMv
cGxhdGZvcm0vaTgwNDIvc2VyaW8xL2lucHV0L2lucHV0MwpbICAgIDkuNDQ0
MjMxXSBscDA6IHVzaW5nIHBhcnBvcnQwIChpbnRlcnJ1cHQtZHJpdmVuKS4K
WyAgICA5LjYzMjk0M10gdHlwZT0xNDAwIGF1ZGl0KDEzMjAyMzc0NzMuMTEy
OjUpOiBhcHBhcm1vcj0iU1RBVFVTIiBvcGVyYXRpb249InByb2ZpbGVfcmVw
bGFjZSIgbmFtZT0iL3NiaW4vZGhjbGllbnQiIHBpZD02MzMgY29tbT0iYXBw
YXJtb3JfcGFyc2VyIgpbICAgIDkuNjM1MjY4XSB0eXBlPTE0MDAgYXVkaXQo
MTMyMDIzNzQ3My4xMTI6Nik6IGFwcGFybW9yPSJTVEFUVVMiIG9wZXJhdGlv
bj0icHJvZmlsZV9yZXBsYWNlIiBuYW1lPSIvdXNyL2xpYi9OZXR3b3JrTWFu
YWdlci9ubS1kaGNwLWNsaWVudC5hY3Rpb24iIHBpZD02MzMgY29tbT0iYXBw
YXJtb3JfcGFyc2VyIgpbICAgIDkuNjM2MjcyXSB0eXBlPTE0MDAgYXVkaXQo
MTMyMDIzNzQ3My4xMTY6Nyk6IGFwcGFybW9yPSJTVEFUVVMiIG9wZXJhdGlv
bj0icHJvZmlsZV9yZXBsYWNlIiBuYW1lPSIvdXNyL2xpYi9jb25ubWFuL3Nj
cmlwdHMvZGhjbGllbnQtc2NyaXB0IiBwaWQ9NjMzIGNvbW09ImFwcGFybW9y
X3BhcnNlciIKWyAgICA5LjY0NDk2N10gdHlwZT0xNDAwIGF1ZGl0KDEzMjAy
Mzc0NzMuMTI0OjgpOiBhcHBhcm1vcj0iU1RBVFVTIiBvcGVyYXRpb249InBy
b2ZpbGVfbG9hZCIgbmFtZT0iL3Vzci9saWIvbGlnaHRkbS9saWdodGRtLWd1
ZXN0LXNlc3Npb24td3JhcHBlciIgcGlkPTYzMiBjb21tPSJhcHBhcm1vcl9w
YXJzZXIiClsgICAgOS43NDgyNTNdIGlucHV0OiBRRU1VIDAuMTAuMiBRRU1V
IFVTQiBUYWJsZXQgYXMgL2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjAx
LjIvdXNiMS8xLTIvMS0yOjEuMC9pbnB1dC9pbnB1dDQKWyAgICA5Ljc0OTEx
Ml0gZ2VuZXJpYy11c2IgMDAwMzowNjI3OjAwMDEuMDAwMTogaW5wdXQsaGlk
cmF3MDogVVNCIEhJRCB2MC4wMSBQb2ludGVyIFtRRU1VIDAuMTAuMiBRRU1V
IFVTQiBUYWJsZXRdIG9uIHVzYi0wMDAwOjAwOjAxLjItMi9pbnB1dDAKWyAg
ICA5Ljc0OTE1NV0gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNl
IGRyaXZlciB1c2JoaWQKWyAgICA5Ljc0OTE1OF0gdXNiaGlkOiBVU0IgSElE
IGNvcmUgZHJpdmVyClsgICAgOS43NTM2MThdIHR5cGU9MTQwMCBhdWRpdCgx
MzIwMjM3NDczLjIzMjo5KTogYXBwYXJtb3I9IlNUQVRVUyIgb3BlcmF0aW9u
PSJwcm9maWxlX2xvYWQiIG5hbWU9Ii91c3IvbGliL3RlbGVwYXRoeS9taXNz
aW9uLWNvbnRyb2wtNSIgcGlkPTY1NyBjb21tPSJhcHBhcm1vcl9wYXJzZXIi
ClsgICAgOS43NTM5NjNdIHR5cGU9MTQwMCBhdWRpdCgxMzIwMjM3NDczLjIz
MjoxMCk6IGFwcGFybW9yPSJTVEFUVVMiIG9wZXJhdGlvbj0icHJvZmlsZV9s
b2FkIiBuYW1lPSIvdXNyL2xpYi90ZWxlcGF0aHkvdGVsZXBhdGh5LSoiIHBp
ZD02NTcgY29tbT0iYXBwYXJtb3JfcGFyc2VyIgpbICAgIDkuNzU5MTk3XSB0
eXBlPTE0MDAgYXVkaXQoMTMyMDIzNzQ3My4yMzY6MTEpOiBhcHBhcm1vcj0i
U1RBVFVTIiBvcGVyYXRpb249InByb2ZpbGVfbG9hZCIgbmFtZT0iL3Vzci9s
aWIvY3Vwcy9iYWNrZW5kL2N1cHMtcGRmIiBwaWQ9NjkyIGNvbW09ImFwcGFy
bW9yX3BhcnNlciIKWyAgICA5Ljc4Mzc3Ml0gcHBkZXY6IHVzZXItc3BhY2Ug
cGFyYWxsZWwgcG9ydCBkcml2ZXIKWyAgICA5Ljk0OTQxM10gaW5pdDogZmFp
bHNhZmUgbWFpbiBwcm9jZXNzICg2MjkpIGtpbGxlZCBieSBURVJNIHNpZ25h
bApbICAgIDkuOTUxOTI2XSBpbml0OiBhcHBvcnQgcHJlLXN0YXJ0IHByb2Nl
c3MgKDc1OCkgdGVybWluYXRlZCB3aXRoIHN0YXR1cyAxClsgICAgOS45ODc3
MjldIGluaXQ6IGFwcG9ydCBwb3N0LXN0b3AgcHJvY2VzcyAoNzg3KSB0ZXJt
aW5hdGVkIHdpdGggc3RhdHVzIDEKWyAgIDEwLjExNjk0MV0gbXRycjogbm8g
TVRSUiBmb3IgZjAwMDAwMDAsMTAwMDAwIGZvdW5kClsgICAxMC4xMzI1MTdd
IEJsdWV0b290aDogQ29yZSB2ZXIgMi4xNgpbICAgMTAuMTMyNTY3XSBORVQ6
IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFtaWx5IDMxClsgICAxMC4xMzI1Njld
IEJsdWV0b290aDogSENJIGRldmljZSBhbmQgY29ubmVjdGlvbiBtYW5hZ2Vy
IGluaXRpYWxpemVkClsgICAxMC4xMzI1NzNdIEJsdWV0b290aDogSENJIHNv
Y2tldCBsYXllciBpbml0aWFsaXplZApbICAgMTAuMTMyNTc1XSBCbHVldG9v
dGg6IEwyQ0FQIHNvY2tldCBsYXllciBpbml0aWFsaXplZApbICAgMTAuMTMy
NTg2XSBCbHVldG9vdGg6IFNDTyBzb2NrZXQgbGF5ZXIgaW5pdGlhbGl6ZWQK
WyAgIDEwLjEzODU0OV0gQmx1ZXRvb3RoOiBSRkNPTU0gVFRZIGxheWVyIGlu
aXRpYWxpemVkClsgICAxMC4xMzg1NTRdIEJsdWV0b290aDogUkZDT01NIHNv
Y2tldCBsYXllciBpbml0aWFsaXplZApbICAgMTAuMTM4NTU3XSBCbHVldG9v
dGg6IFJGQ09NTSB2ZXIgMS4xMQpbICAgMTAuMTUxODcyXSBCbHVldG9vdGg6
IEJORVAgKEV0aGVybmV0IEVtdWxhdGlvbikgdmVyIDEuMwpbICAgMTAuMTUx
ODc3XSBCbHVldG9vdGg6IEJORVAgZmlsdGVyczogcHJvdG9jb2wgbXVsdGlj
YXN0ClsgICAxMC41ODM0NThdIEVYVDQtZnMgKHh2ZGExKTogcmUtbW91bnRl
ZC4gT3B0czogZXJyb3JzPXJlbW91bnQtcm8sY29tbWl0PTAKWyAgIDE1LjE4
MDk4MV0gRVhUNC1mcyAoeHZkYTEpOiByZS1tb3VudGVkLiBPcHRzOiBlcnJv
cnM9cmVtb3VudC1ybyxjb21taXQ9MApbICAgMTkuNjQ4MDkwXSBldGgwOiBu
byBJUHY2IHJvdXRlcnMgcHJlc2VudAo=

--1321782915-1493526364-1320239310=:13696
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--1321782915-1493526364-1320239310=:13696--


From xen-devel-bounces@lists.xensource.com Wed Nov 02 06:28:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 06:28:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLare-0002hQ-JO; Wed, 02 Nov 2011 06:28:22 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLar3-0002Ut-Rs
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 06:27:46 -0700
X-Env-Sender: njudroid@gmail.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1320240462!2040088!1
X-Originating-IP: [209.85.161.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11405 invoked from network); 2 Nov 2011 13:27:42 -0000
Received: from mail-fx0-f43.google.com (HELO mail-fx0-f43.google.com)
	(209.85.161.43)
	by server-9.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 13:27:42 -0000
Received: by faat9 with SMTP id t9so595587faa.30
	for <xen-devel@lists.xensource.com>;
	Wed, 02 Nov 2011 06:27:42 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type;
	bh=1WBPmehh+6s+f+BsCpiqFvcbcRP82J/i4YJMviNAcUM=;
	b=Djkb1bcVPNwcqUdPapnoKUXSAaFxse/a/zFC8ln4pfWGVKMDkUTX3ZWSIKvu3DKvYd
	0jl005m9nD4VZPTQram97pNBuPHGRi96usd3uqrk8ZJd0MTi4RaKcUiYN20FxEGZzve6
	TEVc3ADDltealHQacVxq2Gm+tbLdYpLx42zsw=
MIME-Version: 1.0
Received: by 10.223.30.149 with SMTP id u21mr8568811fac.18.1320240461832; Wed,
	02 Nov 2011 06:27:41 -0700 (PDT)
Received: by 10.152.37.8 with HTTP; Wed, 2 Nov 2011 06:27:41 -0700 (PDT)
In-Reply-To: <1320238119.3084.43.camel@cthulhu.hellion.org.uk>
References: <CAP31Ad=0YjZPkwRdunbkETtdcsDWktq4m2m+JEuoQq7Zp8GoyA@mail.gmail.com>
	<1320238119.3084.43.camel@cthulhu.hellion.org.uk>
Date: Wed, 2 Nov 2011 21:27:41 +0800
Message-ID: <CAP31AdkJMw7vN34Q8XBKviA=TYYOL6XPAb=CeS-v+JJTdjbj1w@mail.gmail.com>
Subject: Re: [Xen-devel] Question about SR-IOV migration
From: software NJU <njudroid@gmail.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0438855213=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0438855213==
Content-Type: multipart/alternative; boundary=000e0ce00828bee32b04b0c06f7a

--000e0ce00828bee32b04b0c06f7a
Content-Type: text/plain; charset=ISO-8859-1

Thanks for your quick reply and great solution.
However, I'm still not sure one thing: Do you mean that live migration is
impossible because of hardware limitation? I'm reading the SR-IOV
specification now. And it mentioned that a VF can migrate to another system
through some kind of methods. But the migration may need the support of
MR-IOV.
What do you think of the saying in the specification? I'm not sure what the
migration is in the specification.

regards,

2011/11/2 Ian Campbell <Ian.Campbell@citrix.com>

> On Wed, 2011-11-02 at 06:07 -0400, software NJU wrote:
> > Hello,
> >   Can HVM using SR-IOV live-migrate to the other Host and still in
> > SR-IOV?
> >   If SR-IOV can, does Xen support it now? And if so, where is the code
> > for it.
>
> It is not possible to live migrate a guest which has a PCI device passed
> through to it.
>
> However you can use PCI hotplug to unplug a device right before
> migration and reintroduce another (possibly even different) device at
> the other end. This requires hotplug to be correctly configured in your
> guest to load the right drivers etc in response to hotplug events.
>
> Ian.
>
>

--000e0ce00828bee32b04b0c06f7a
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Thanks for your quick reply and great solution.=A0<div>However, I&#39;m sti=
ll not sure one thing: Do you mean that live migration is impossible becaus=
e of hardware limitation?=A0I&#39;m reading the SR-IOV specification now. A=
nd it mentioned that a VF can migrate to another system through some kind o=
f methods. But the migration may need the support of MR-IOV.</div>
<div>What do you think of the saying in the specification? I&#39;m not sure=
 what the migration is in the specification.</div><div><br></div><div>regar=
ds,=A0<div><br><div class=3D"gmail_quote">2011/11/2 Ian Campbell <span dir=
=3D"ltr">&lt;<a href=3D"mailto:Ian.Campbell@citrix.com">Ian.Campbell@citrix=
.com</a>&gt;</span><br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex;"><div><div></div><div class=3D"h5">On Wed, 2=
011-11-02 at 06:07 -0400, software NJU wrote:<br>
&gt; Hello,<br>
&gt; =A0 Can HVM using SR-IOV live-migrate to the other Host and still in<b=
r>
&gt; SR-IOV?<br>
&gt; =A0 If SR-IOV can, does Xen support it now? And if so, where is the co=
de<br>
&gt; for it.<br>
<br>
</div></div>It is not possible to live migrate a guest which has a PCI devi=
ce passed<br>
through to it.<br>
<br>
However you can use PCI hotplug to unplug a device right before<br>
migration and reintroduce another (possibly even different) device at<br>
the other end. This requires hotplug to be correctly configured in your<br>
guest to load the right drivers etc in response to hotplug events.<br>
<font color=3D"#888888"><br>
Ian.<br>
<br>
</font></blockquote></div><br></div></div>

--000e0ce00828bee32b04b0c06f7a--


--===============0438855213==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0438855213==--


From xen-devel-bounces@lists.xensource.com Wed Nov 02 06:32:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 06:32:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLavT-00037S-33; Wed, 02 Nov 2011 06:32:19 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLauv-0002uk-U2
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 06:31:46 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1320240678!50707156!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22382 invoked from network); 2 Nov 2011 13:31:19 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-8.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 2 Nov 2011 13:31:19 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA2DUMZC007532
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 2 Nov 2011 13:30:23 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA2DULYX028455
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 2 Nov 2011 13:30:21 GMT
Received: from abhmt109.oracle.com (abhmt109.oracle.com [141.146.116.61])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA2DUGEY021516; Wed, 2 Nov 2011 08:30:16 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 02 Nov 2011 06:30:15 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 5B77F83486; Wed,  2 Nov 2011 09:30:14 -0400 (EDT)
Date: Wed, 2 Nov 2011 09:30:14 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Boris Derzhavets <bderzhavets@yahoo.com>
Subject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark with
	Ubuntu 11.10
Message-ID: <20111102133014.GA21835@phenom.dumpdata.com>
References: <1320239310.13696.YahooMailClassic@web65915.mail.ac4.yahoo.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <1320239310.13696.YahooMailClassic@web65915.mail.ac4.yahoo.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Content-Transfer-Encoding: quoted-printable
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090206.4EB145EF.011C,ss=1,re=1.599,fgs=0
Cc: "dokter@icg.tugraz.at" <dokter@icg.tugraz.at>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Nov 02, 2011 at 06:08:30AM -0700, Boris Derzhavets wrote:
> I was able to load Oneiric as PV on HVM at Xen 4.1.2 Oneiric Dom0 (3.1.=
0-030100-generic)=A0 after rebuilding the recent 3.1.0-3 Ubuntu's kernel =
with=20
> CONFIG_XEN_PLATFORM_PCI=3Dy , uploading debian packages=A0 :-
>=20
> linux-headers-3.1.0-2_3.1.0-2.3_all.deb
> linux-headers-3.1.0-2-i7_3.1.0-2.3_amd64.deb
> linux-image-3.1.0-2-i7_3.1.0-2.3_amd64.deb
>=20
> to regular Oneiric HVM and new kernel install.

Sure, but  Ian was talking about the backend - whether they were using:

disk =3D ['phy:/dev/vg/test,xvda,w']
or
disk=3D['file:/test.img,xvda,w']

The first uses the kernel blkback while the later uses the QEMU qdisk whi=
ch is not very fast.


> Then same HVM was restarted with
> xen_platform_pci=3D1
> and this time it gets loaded ( vs hanging with regular kernel)
>=20
> I got in dmesg log :-
>=20
> [=A0=A0=A0 0.000000] Initializing cgroup subsys cpuset
> [=A0=A0=A0 0.000000] Initializing cgroup subsys cpu
> [=A0=A0=A0 0.000000] Linux version 3.1.0-2-i7 (root@boris-System-P5Q3) =
(gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) ) #3 SMP Wed Nov 2 15:1=
5:13 MSK 2011 (Ubuntu 3.1.0-2.3-i7 3.1.0)
> [=A0=A0=A0 0.000000] Command line: BOOT_IMAGE=3D/boot/vmlinuz-3.1.0-2-i=
7 root=3DUUID=3Dbff48eed-20df-4abf-b788-935c75ea6226 ro quiet splash vt.h=
andoff=3D7
> [=A0=A0=A0 0.000000] KERNEL supported cpus:
> [=A0=A0=A0 0.000000]=A0=A0 Intel GenuineIntel
> [=A0=A0=A0 0.000000]=A0=A0 AMD AuthenticAMD
> [=A0=A0=A0 0.000000]=A0=A0 Centaur CentaurHauls
> [=A0=A0=A0 0.000000] BIOS-provided physical RAM map:
> [=A0=A0=A0 0.000000]=A0 BIOS-e820: 0000000000000000 - 000000000009e000 =
(usable)
> [=A0=A0=A0 0.000000]=A0 BIOS-e820: 000000000009e000 - 00000000000a0000 =
(reserved)
> [=A0=A0=A0 0.000000]=A0 BIOS-e820: 00000000000e0000 - 0000000000100000 =
(reserved)
> [=A0=A0=A0 0.000000]=A0 BIOS-e820: 0000000000100000 - 000000003f800000 =
(usable)
> [=A0=A0=A0 0.000000]=A0 BIOS-e820: 00000000fc000000 - 0000000100000000 =
(reserved)
> [=A0=A0=A0 0.000000] NX (Execute Disable) protection: active
> [=A0=A0=A0 0.000000] DMI 2.4 present.
> [=A0=A0=A0 0.000000] DMI: Xen HVM domU, BIOS 4.1.2 10/20/2011
> [=A0=A0=A0 0.000000] Hypervisor detected: Xen HVM
> [=A0=A0=A0 0.000000] Xen version 4.1.
> [=A0=A0=A0 0.000000] Xen Platform PCI: I/O protocol version 1
> [=A0=A0=A0 0.000000] Netfront and the Xen platform PCI driver have been=
 compiled for this kernel: unplug emulated NICs.
> [=A0=A0=A0 0.000000] Blkfront and the Xen platform PCI driver have been=
 compiled for this kernel: unplug emulated disks.
> [=A0=A0=A0 0.000000] You might have to change the root device
> [=A0=A0=A0 0.000000] from /dev/hd[a-d] to /dev/xvd[a-d]
> [=A0=A0=A0 0.000000] in your root=3D kernel command line option
> [=A0=A0=A0 0.000000] e820 update range: 0000000000000000 - 000000000001=
0000 (usable) =3D=3D> (reserved)
> [=A0=A0=A0 0.000000] e820 remove range: 00000000000a0000 - 000000000010=
0000 (usable)
> [=A0=A0=A0 0.000000] No AGP bridge found
> [=A0=A0=A0 0.000000] last_pfn =3D 0x3f800 max_arch_pfn =3D 0x400000000
> [=A0=A0=A0 0.000000] MTRR default type: write-back
> [=A0=A0=A0 0.000000] MTRR fixed ranges enabled:
> [=A0=A0=A0 0.000000]=A0=A0 00000-9FFFF write-back
> [=A0=A0=A0 0.000000]=A0=A0 A0000-BFFFF write-combining
> [=A0=A0=A0 0.000000]=A0=A0 C0000-FFFFF write-back
> . . . . .=20
>=20
> Boris.
>=20
> --- On Tue, 11/1/11, Ian Campbell <Ian.Campbell@citrix.com> wrote:
>=20
> From: Ian Campbell <Ian.Campbell@citrix.com>
> Subject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark wi=
th Ubuntu 11.10
> To: "Pasi K=E4rkk=E4inen" <pasik@iki.fi>
> Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, "d=
okter@icg.tugraz.at" <dokter@icg.tugraz.at>
> Date: Tuesday, November 1, 2011, 7:00 PM
>=20
> On Tue, 2011-11-01 at 09:26 -0400, Pasi K=E4rkk=E4inen wrote:
> > On Tue, Nov 01, 2011 at 08:57:14PM +0900, Ian Campbell wrote:
> > > On Tue, 2011-11-01 at 07:31 -0400, Mark Dokter wrote:
> > > > In that test, the KVM machine uses virtio disk and nic devices, w=
hile
> > > > the Xen machine uses the qemu emulated devices. Could that be the=
 cause
> > > > for the poor performance?
> > >=20
> > > Very much so. Without using the PVHVM drivers in the Xen case this =
is
> > > very much an apples to oranges comparison.
> > >=20
> >=20
> > Actually the first page of the article says:
> > "The only Xen issue encountered when testing it with an Ubuntu 11.10
> > guest and host was the need for manually loading the xen-blkfront
> > driver for disk support."
> >=20
> > So it sounds like they actually did use PVHVM drivers..
>=20
> Perhaps, the table of configuration details doesn't make it particularl=
y
> obvious (and as Alex points out they may not have been running what the=
y
> thought). Also as Alex mentioned it's not obvious which backend they
> used in each case, e.g. the qemu based disk backend is not known to be
> all that great.
>=20
> It'd definitely be worth someone having a go at repeating even one of
> the benchmarks where we did badly, to rule out these sorts of slip ups.
>=20
> Ian.
> >=20
> > -- Pasi
> >=20
>=20
>=20
>=20
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

> [    0.000000] Initializing cgroup subsys cpuset
> [    0.000000] Initializing cgroup subsys cpu
> [    0.000000] Linux version 3.1.0-2-i7 (root@boris-System-P5Q3) (gcc v=
ersion 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) ) #3 SMP Wed Nov 2 15:15:13 M=
SK 2011 (Ubuntu 3.1.0-2.3-i7 3.1.0)
> [    0.000000] Command line: BOOT_IMAGE=3D/boot/vmlinuz-3.1.0-2-i7 root=
=3DUUID=3Dbff48eed-20df-4abf-b788-935c75ea6226 ro quiet splash vt.handoff=
=3D7
> [    0.000000] KERNEL supported cpus:
> [    0.000000]   Intel GenuineIntel
> [    0.000000]   AMD AuthenticAMD
> [    0.000000]   Centaur CentaurHauls
> [    0.000000] BIOS-provided physical RAM map:
> [    0.000000]  BIOS-e820: 0000000000000000 - 000000000009e000 (usable)
> [    0.000000]  BIOS-e820: 000000000009e000 - 00000000000a0000 (reserve=
d)
> [    0.000000]  BIOS-e820: 00000000000e0000 - 0000000000100000 (reserve=
d)
> [    0.000000]  BIOS-e820: 0000000000100000 - 000000003f800000 (usable)
> [    0.000000]  BIOS-e820: 00000000fc000000 - 0000000100000000 (reserve=
d)
> [    0.000000] NX (Execute Disable) protection: active
> [    0.000000] DMI 2.4 present.
> [    0.000000] DMI: Xen HVM domU, BIOS 4.1.2 10/20/2011
> [    0.000000] Hypervisor detected: Xen HVM
> [    0.000000] Xen version 4.1.
> [    0.000000] Xen Platform PCI: I/O protocol version 1
> [    0.000000] Netfront and the Xen platform PCI driver have been compi=
led for this kernel: unplug emulated NICs.
> [    0.000000] Blkfront and the Xen platform PCI driver have been compi=
led for this kernel: unplug emulated disks.
> [    0.000000] You might have to change the root device
> [    0.000000] from /dev/hd[a-d] to /dev/xvd[a-d]
> [    0.000000] in your root=3D kernel command line option
> [    0.000000] e820 update range: 0000000000000000 - 0000000000010000 (=
usable) =3D=3D> (reserved)
> [    0.000000] e820 remove range: 00000000000a0000 - 0000000000100000 (=
usable)
> [    0.000000] No AGP bridge found
> [    0.000000] last_pfn =3D 0x3f800 max_arch_pfn =3D 0x400000000
> [    0.000000] MTRR default type: write-back
> [    0.000000] MTRR fixed ranges enabled:
> [    0.000000]   00000-9FFFF write-back
> [    0.000000]   A0000-BFFFF write-combining
> [    0.000000]   C0000-FFFFF write-back
> [    0.000000] MTRR variable ranges enabled:
> [    0.000000]   0 base 0F0000000 mask FF8000000 uncachable
> [    0.000000]   1 base 0F8000000 mask FFC000000 uncachable
> [    0.000000]   2 disabled
> [    0.000000]   3 disabled
> [    0.000000]   4 disabled
> [    0.000000]   5 disabled
> [    0.000000]   6 disabled
> [    0.000000]   7 disabled
> [    0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x70106=
00070106
> [    0.000000] found SMP MP-table at [ffff8800000fbc90] fbc90
> [    0.000000] initial memory mapped : 0 - 20000000
> [    0.000000] Base memory trampoline at [ffff880000099000] 99000 size =
20480
> [    0.000000] init_memory_mapping: 0000000000000000-000000003f800000
> [    0.000000]  0000000000 - 003f800000 page 2M
> [    0.000000] kernel direct mapping tables up to 3f800000 @ 1fffe000-2=
0000000
> [    0.000000] RAMDISK: 3658c000 - 372be000
> [    0.000000] ACPI: RSDP 00000000000ea020 00024 (v02    Xen)
> [    0.000000] ACPI: XSDT 00000000fc0134f0 0003C (v01    Xen      HVM 0=
0000000 HVML 00000000)
> [    0.000000] ACPI: FACP 00000000fc0132d0 000F4 (v04    Xen      HVM 0=
0000000 HVML 00000000)
> [    0.000000] ACPI: DSDT 00000000fc003440 0FE05 (v02    Xen      HVM 0=
0000000 INTL 20100528)
> [    0.000000] ACPI: FACS 00000000fc003400 00040
> [    0.000000] ACPI: APIC 00000000fc0133d0 000D8 (v02    Xen      HVM 0=
0000000 HVML 00000000)
> [    0.000000] ACPI: HPET 00000000fc0134b0 00038 (v01    Xen      HVM 0=
0000000 HVML 00000000)
> [    0.000000] ACPI: Local APIC address 0xfee00000
> [    0.000000] No NUMA configuration found
> [    0.000000] Faking a node at 0000000000000000-000000003f800000
> [    0.000000] Initmem setup node 0 0000000000000000-000000003f800000
> [    0.000000]   NODE_DATA [000000003f7fb000 - 000000003f7fffff]
> [    0.000000]  [ffffea0000000000-ffffea0000ffffff] PMD -> [ffff88003de=
00000-ffff88003edfffff] on node 0
> [    0.000000] Zone PFN ranges:
> [    0.000000]   DMA      0x00000010 -> 0x00001000
> [    0.000000]   DMA32    0x00001000 -> 0x00100000
> [    0.000000]   Normal   empty
> [    0.000000] Movable zone start PFN for each node
> [    0.000000] early_node_map[2] active PFN ranges
> [    0.000000]     0: 0x00000010 -> 0x0000009e
> [    0.000000]     0: 0x00000100 -> 0x0003f800
> [    0.000000] On node 0 totalpages: 259982
> [    0.000000]   DMA zone: 64 pages used for memmap
> [    0.000000]   DMA zone: 5 pages reserved
> [    0.000000]   DMA zone: 3913 pages, LIFO batch:0
> [    0.000000]   DMA32 zone: 4000 pages used for memmap
> [    0.000000]   DMA32 zone: 252000 pages, LIFO batch:31
> [    0.000000] ACPI: PM-Timer IO Port: 0xb008
> [    0.000000] ACPI: Local APIC address 0xfee00000
> [    0.000000] ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
> [    0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x02] enabled)
> [    0.000000] ACPI: LAPIC (acpi_id[0x02] lapic_id[0x04] disabled)
> [    0.000000] ACPI: LAPIC (acpi_id[0x03] lapic_id[0x06] disabled)
> [    0.000000] ACPI: LAPIC (acpi_id[0x04] lapic_id[0x08] disabled)
> [    0.000000] ACPI: LAPIC (acpi_id[0x05] lapic_id[0x0a] disabled)
> [    0.000000] ACPI: LAPIC (acpi_id[0x06] lapic_id[0x0c] disabled)
> [    0.000000] ACPI: LAPIC (acpi_id[0x07] lapic_id[0x0e] disabled)
> [    0.000000] ACPI: LAPIC (acpi_id[0x08] lapic_id[0x10] disabled)
> [    0.000000] ACPI: LAPIC (acpi_id[0x09] lapic_id[0x12] disabled)
> [    0.000000] ACPI: LAPIC (acpi_id[0x0a] lapic_id[0x14] disabled)
> [    0.000000] ACPI: LAPIC (acpi_id[0x0b] lapic_id[0x16] disabled)
> [    0.000000] ACPI: LAPIC (acpi_id[0x0c] lapic_id[0x18] disabled)
> [    0.000000] ACPI: LAPIC (acpi_id[0x0d] lapic_id[0x1a] disabled)
> [    0.000000] ACPI: LAPIC (acpi_id[0x0e] lapic_id[0x1c] disabled)
> [    0.000000] ACPI: IOAPIC (id[0x01] address[0xfec00000] gsi_base[0])
> [    0.000000] IOAPIC[0]: apic_id 1, version 17, address 0xfec00000, GS=
I 0-47
> [    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
> [    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 5 global_irq 5 low leve=
l)
> [    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 10 global_irq 10 low le=
vel)
> [    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 11 global_irq 11 low le=
vel)
> [    0.000000] ACPI: IRQ0 used by override.
> [    0.000000] ACPI: IRQ2 used by override.
> [    0.000000] ACPI: IRQ5 used by override.
> [    0.000000] ACPI: IRQ9 used by override.
> [    0.000000] ACPI: IRQ10 used by override.
> [    0.000000] ACPI: IRQ11 used by override.
> [    0.000000] Using ACPI (MADT) for SMP configuration information
> [    0.000000] ACPI: HPET id: 0x8086a201 base: 0xfed00000
> [    0.000000] SMP: Allowing 15 CPUs, 13 hotplug CPUs
> [    0.000000] nr_irqs_gsi: 64
> [    0.000000] PM: Registered nosave memory: 000000000009e000 - 0000000=
0000a0000
> [    0.000000] PM: Registered nosave memory: 00000000000a0000 - 0000000=
0000e0000
> [    0.000000] PM: Registered nosave memory: 00000000000e0000 - 0000000=
000100000
> [    0.000000] Allocating PCI resources starting at 3f800000 (gap: 3f80=
0000:bc800000)
> [    0.000000] Booting paravirtualized kernel on Xen HVM
> [    0.000000] setup_percpu: NR_CPUS:256 nr_cpumask_bits:256 nr_cpu_ids=
:15 nr_node_ids:1
> [    0.000000] PERCPU: Embedded 27 pages/cpu @ffff88003f400000 s81280 r=
8192 d21120 u131072
> [    0.000000] pcpu-alloc: s81280 r8192 d21120 u131072 alloc=3D1*209715=
2
> [    0.000000] pcpu-alloc: [0] 00 01 02 03 04 05 06 07 08 09 10 11 12 1=
3 14 --=20
> [    0.000000] Built 1 zonelists in Node order, mobility grouping on.  =
Total pages: 255913
> [    0.000000] Policy zone: DMA32
> [    0.000000] Kernel command line: BOOT_IMAGE=3D/boot/vmlinuz-3.1.0-2-=
i7 root=3DUUID=3Dbff48eed-20df-4abf-b788-935c75ea6226 ro quiet splash vt.=
handoff=3D7
> [    0.000000] PID hash table entries: 4096 (order: 3, 32768 bytes)
> [    0.000000] Checking aperture...
> [    0.000000] No AGP bridge found
> [    0.000000] Calgary: detecting Calgary via BIOS EBDA area
> [    0.000000] Calgary: Unable to locate Rio Grande table in EBDA - bai=
ling!
> [    0.000000] Memory: 992640k/1040384k available (6347k kernel code, 4=
56k absent, 47288k reserved, 6820k data, 904k init)
> [    0.000000] SLUB: Genslabs=3D15, HWalign=3D64, Order=3D0-3, MinObjec=
ts=3D0, CPUs=3D15, Nodes=3D1
> [    0.000000] Hierarchical RCU implementation.
> [    0.000000] 	RCU dyntick-idle grace-period acceleration is enabled.
> [    0.000000] NR_IRQS:16640 nr_irqs:1208 16
> [    0.000000] Xen HVM callback vector for event delivery is enabled
> [    0.000000] vt handoff: transparent VT on vt#7
> [    0.000000] Console: colour dummy device 80x25
> [    0.000000] console [tty0] enabled
> [    0.000000] allocated 8388608 bytes of page_cgroup
> [    0.000000] please try 'cgroup_disable=3Dmemory' option if you don't=
 want memory cgroups
> [    0.000000] hpet clockevent registered
> [    0.000000] Detected 2833.040 MHz processor.
> [    0.008000] Calibrating delay loop (skipped), value calculated using=
 timer frequency.. 5666.08 BogoMIPS (lpj=3D11332160)
> [    0.008000] pid_max: default: 32768 minimum: 301
> [    0.008000] Security Framework initialized
> [    0.008000] AppArmor: AppArmor initialized
> [    0.008000] Yama: becoming mindful.
> [    0.008000] Dentry cache hash table entries: 131072 (order: 8, 10485=
76 bytes)
> [    0.008000] Inode-cache hash table entries: 65536 (order: 7, 524288 =
bytes)
> [    0.008000] Mount-cache hash table entries: 256
> [    0.008000] Initializing cgroup subsys cpuacct
> [    0.008000] Initializing cgroup subsys memory
> [    0.008000] Initializing cgroup subsys devices
> [    0.008000] Initializing cgroup subsys freezer
> [    0.008000] Initializing cgroup subsys net_cls
> [    0.008000] Initializing cgroup subsys blkio
> [    0.008000] Initializing cgroup subsys perf_event
> [    0.008000] CPU: Physical Processor ID: 0
> [    0.008000] CPU: Processor Core ID: 0
> [    0.008000] mce: CPU supports 6 MCE banks
> [    0.008561] ACPI: Core revision 20110623
> [    0.013046] ftrace: allocating 26278 entries in 104 pages
> [    0.044714] Not enabling x2apic, Intr-remapping init failed.
> [    0.044718] Switched APIC routing to physical flat.
> [    0.045647] ..TIMER: vector=3D0x30 apic1=3D0 pin1=3D2 apic2=3D0 pin2=
=3D0
> [    0.085363] CPU0: Intel(R) Core(TM)2 Quad CPU    Q9550  @ 2.83GHz st=
epping 0a
> [    0.085375] Xen: using vcpuop timer interface
> [    0.085381] installing Xen timer for CPU 0
> [    0.085435] Performance Events: unsupported p6 CPU model 23 no PMU d=
river, software events only.
> [    0.086398] Booting Node   0, Processors  #1
> [    0.086401] smpboot cpu 1: start_ip =3D 99000
> [    0.180055] Brought up 2 CPUs
> [    0.180058] Total of 2 processors activated (11402.88 BogoMIPS).
> [    0.180052] installing Xen timer for CPU 1
> [    0.180403] devtmpfs: initialized
> [    0.181198] print_constraints: dummy:=20
> [    0.181228] RTC time: 12:37:43, date: 11/02/11
> [    0.181280] NET: Registered protocol family 16
> [    0.181391] Trying to unpack rootfs image as initramfs...
> [    0.196251] ACPI: bus type pci registered
> [    0.196736] PCI: Using configuration type 1 for base access
> [    0.197979] bio: create slab <bio-0> at 0
> [    0.198140] ACPI: Added _OSI(Module Device)
> [    0.198143] ACPI: Added _OSI(Processor Device)
> [    0.198146] ACPI: Added _OSI(3.0 _SCP Extensions)
> [    0.198149] ACPI: Added _OSI(Processor Aggregator Device)
> [    0.200192] ACPI: EC: Look up EC in DSDT
> [    0.204440] ACPI: Interpreter enabled
> [    0.204444] ACPI: (supports S0 S3 S4 S5)
> [    0.204458] ACPI: Using IOAPIC for interrupt routing
> [    0.369290] ACPI: No dock devices found.
> [    0.369295] HEST: Table not found.
> [    0.369300] PCI: Using host bridge windows from ACPI; if necessary, =
use "pci=3Dnocrs" and report a bug
> [    0.369362] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
> [    0.369485] pci_root PNP0A03:00: host bridge window [io  0x0000-0x0c=
f7]
> [    0.369488] pci_root PNP0A03:00: host bridge window [io  0x0d00-0xff=
ff]
> [    0.369491] pci_root PNP0A03:00: host bridge window [mem 0x000a0000-=
0x000bffff]
> [    0.369494] pci_root PNP0A03:00: host bridge window [mem 0xf0000000-=
0xfbffffff]
> [    0.369744] pci 0000:00:00.0: [8086:1237] type 0 class 0x000600
> [    0.371939] pci 0000:00:01.0: [8086:7000] type 0 class 0x000601
> [    0.375324] pci 0000:00:01.1: [8086:7010] type 0 class 0x000101
> [    0.377334] pci 0000:00:01.1: reg 20: [io  0xc160-0xc16f]
> [    0.388417] pci 0000:00:01.2: [8086:7020] type 0 class 0x000c03
> [    0.390549] pci 0000:00:01.2: reg 20: [io  0xc140-0xc15f]
> [    0.391916] pci 0000:00:01.3: [8086:7113] type 0 class 0x000680
> [    0.391989] * Found PM-Timer Bug on the chipset. Due to workarounds =
for a bug,
> [    0.391991] * this clock source is slow. Consider trying other clock=
 sources
> [    0.394994] pci 0000:00:01.3: quirk: [io  0xb000-0xb03f] claimed by =
PIIX4 ACPI
> [    0.395998] pci 0000:00:02.0: [1013:00b8] type 0 class 0x000300
> [    0.396419] pci 0000:00:02.0: reg 10: [mem 0xf0000000-0xf1ffffff pre=
f]
> [    0.396819] pci 0000:00:02.0: reg 14: [mem 0xf3020000-0xf3020fff]
> [    0.408281] pci 0000:00:03.0: [5853:0001] type 0 class 0x00ff80
> [    0.408906] pci 0000:00:03.0: reg 10: [io  0xc000-0xc0ff]
> [    0.409310] pci 0000:00:03.0: reg 14: [mem 0xf2000000-0xf2ffffff pre=
f]
> [    0.413164] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT]
> [    0.413470]  pci0000:00: Unable to request _OSC control (_OSC suppor=
t mask: 0x1e)
> [    0.582745] Freeing initrd memory: 13512k freed
> [    0.746714] ACPI: PCI Interrupt Link [LNKA] (IRQs *5 10 11)
> [    0.746959] ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11)
> [    0.747204] ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11)
> [    0.747448] ACPI: PCI Interrupt Link [LNKD] (IRQs *5 10 11)
> [    0.747616] xen/balloon: Initialising balloon driver.
> [    0.747621] last_pfn =3D 0x3f800 max_arch_pfn =3D 0x400000000
> [    0.747639] xen-balloon: Initialising balloon driver.
> [    0.747706] vgaarb: device added: PCI:0000:00:02.0,decodes=3Dio+mem,=
owns=3Dio+mem,locks=3Dnone
> [    0.747706] vgaarb: loaded
> [    0.747706] vgaarb: bridge control possible 0000:00:02.0
> [    0.747706] i2c-core: driver [aat2870] using legacy suspend method
> [    0.747706] i2c-core: driver [aat2870] using legacy resume method
> [    0.748069] SCSI subsystem initialized
> [    0.748122] libata version 3.00 loaded.
> [    0.748128] usbcore: registered new interface driver usbfs
> [    0.748139] usbcore: registered new interface driver hub
> [    0.748165] usbcore: registered new device driver usb
> [    0.748165] PCI: Using ACPI for IRQ routing
> [    0.748165] PCI: pci_cache_line_size set to 64 bytes
> [    0.748970] reserve RAM buffer: 000000000009e000 - 000000000009ffff=20
> [    0.748977] reserve RAM buffer: 000000003f800000 - 000000003fffffff=20
> [    0.749060] NetLabel: Initializing
> [    0.749062] NetLabel:  domain hash size =3D 128
> [    0.749064] NetLabel:  protocols =3D UNLABELED CIPSOv4
> [    0.749076] NetLabel:  unlabeled traffic allowed by default
> [    0.749099] HPET: 3 timers in total, 0 timers will be used for per-c=
pu timer
> [    0.749099] hpet0: at MMIO 0xfed00000, IRQs 2, 8, 0
> [    0.749099] hpet0: 3 comparators, 64-bit 62.500000 MHz counter
> [    0.752082] Switching to clocksource xen
> [    0.752545] Switched to NOHz mode on CPU #0
> [    0.755944] Switched to NOHz mode on CPU #1
> [    0.759258] AppArmor: AppArmor Filesystem Enabled
> [    0.759285] pnp: PnP ACPI init
> [    0.759297] ACPI: bus type pnp registered
> [    0.759323] pnp 00:00: [mem 0x00000000-0x0009ffff]
> [    0.759352] system 00:00: [mem 0x00000000-0x0009ffff] could not be r=
eserved
> [    0.759357] system 00:00: Plug and Play ACPI device, IDs PNP0c02 (ac=
tive)
> [    0.759423] pnp 00:01: [bus 00-ff]
> [    0.759427] pnp 00:01: [io  0x0cf8-0x0cff]
> [    0.759430] pnp 00:01: [io  0x0000-0x0cf7 window]
> [    0.759436] pnp 00:01: [io  0x0d00-0xffff window]
> [    0.759439] pnp 00:01: [mem 0x000a0000-0x000bffff window]
> [    0.759442] pnp 00:01: [mem 0xf0000000-0xfbffffff window]
> [    0.759471] pnp 00:01: Plug and Play ACPI device, IDs PNP0a03 (activ=
e)
> [    0.759480] pnp 00:02: [io  0x10c0-0x1141]
> [    0.759483] pnp 00:02: [io  0xb044-0xb047]
> [    0.759506] system 00:02: [io  0x10c0-0x1141] has been reserved
> [    0.759509] system 00:02: [io  0xb044-0xb047] has been reserved
> [    0.759513] system 00:02: Plug and Play ACPI device, IDs PNP0c02 (ac=
tive)
> [    0.759533] pnp 00:03: [mem 0xfed00000-0xfed003ff]
> [    0.759551] pnp 00:03: Plug and Play ACPI device, IDs PNP0103 (activ=
e)
> [    0.759568] pnp 00:04: [io  0x0010-0x001f]
> [    0.759571] pnp 00:04: [io  0x0022-0x002d]
> [    0.759573] pnp 00:04: [io  0x0030-0x003f]
> [    0.759576] pnp 00:04: [io  0x0044-0x005f]
> [    0.759579] pnp 00:04: [io  0x0062-0x0063]
> [    0.759581] pnp 00:04: [io  0x0065-0x006f]
> [    0.759584] pnp 00:04: [io  0x0072-0x007f]
> [    0.759586] pnp 00:04: [io  0x0080]
> [    0.759589] pnp 00:04: [io  0x0084-0x0086]
> [    0.759592] pnp 00:04: [io  0x0088]
> [    0.759594] pnp 00:04: [io  0x008c-0x008e]
> [    0.759597] pnp 00:04: [io  0x0090-0x009f]
> [    0.759600] pnp 00:04: [io  0x00a2-0x00bd]
> [    0.759602] pnp 00:04: [io  0x00e0-0x00ef]
> [    0.759605] pnp 00:04: [io  0x08a0-0x08a3]
> [    0.759608] pnp 00:04: [io  0x0cc0-0x0ccf]
> [    0.759610] pnp 00:04: [io  0x04d0-0x04d1]
> [    0.759643] system 00:04: [io  0x08a0-0x08a3] has been reserved
> [    0.759646] system 00:04: [io  0x0cc0-0x0ccf] has been reserved
> [    0.759649] system 00:04: [io  0x04d0-0x04d1] has been reserved
> [    0.759653] system 00:04: Plug and Play ACPI device, IDs PNP0c02 (ac=
tive)
> [    0.759664] pnp 00:05: [dma 4]
> [    0.759667] pnp 00:05: [io  0x0000-0x000f]
> [    0.759669] pnp 00:05: [io  0x0081-0x0083]
> [    0.759672] pnp 00:05: [io  0x0087]
> [    0.759675] pnp 00:05: [io  0x0089-0x008b]
> [    0.759677] pnp 00:05: [io  0x008f]
> [    0.759680] pnp 00:05: [io  0x00c0-0x00df]
> [    0.759682] pnp 00:05: [io  0x0480-0x048f]
> [    0.759701] pnp 00:05: Plug and Play ACPI device, IDs PNP0200 (activ=
e)
> [    0.759710] pnp 00:06: [io  0x0070-0x0071]
> [    0.759724] xen: --> pirq=3D16 -> irq=3D8 (gsi=3D8)
> [    0.759728] pnp 00:06: [irq 8]
> [    0.759761] pnp 00:06: Plug and Play ACPI device, IDs PNP0b00 (activ=
e)
> [    0.759770] pnp 00:07: [io  0x0061]
> [    0.759788] pnp 00:07: Plug and Play ACPI device, IDs PNP0800 (activ=
e)
> [    0.759807] xen: --> pirq=3D17 -> irq=3D12 (gsi=3D12)
> [    0.759810] pnp 00:08: [irq 12]
> [    0.759835] pnp 00:08: Plug and Play ACPI device, IDs PNP0f13 (activ=
e)
> [    0.759848] pnp 00:09: [io  0x0060]
> [    0.759851] pnp 00:09: [io  0x0064]
> [    0.759858] xen: --> pirq=3D18 -> irq=3D1 (gsi=3D1)
> [    0.759861] pnp 00:09: [irq 1]
> [    0.759885] pnp 00:09: Plug and Play ACPI device, IDs PNP0303 PNP030=
b (active)
> [    0.759898] pnp 00:0a: [io  0x03f0-0x03f5]
> [    0.759901] pnp 00:0a: [io  0x03f7]
> [    0.759908] xen: --> pirq=3D19 -> irq=3D6 (gsi=3D6)
> [    0.759911] pnp 00:0a: [irq 6]
> [    0.759916] pnp 00:0a: [dma 2]
> [    0.759936] pnp 00:0a: Plug and Play ACPI device, IDs PNP0700 (activ=
e)
> [    0.759959] pnp 00:0b: [io  0x03f8-0x03ff]
> [    0.759966] xen: --> pirq=3D20 -> irq=3D4 (gsi=3D4)
> [    0.759969] pnp 00:0b: [irq 4]
> [    0.759989] pnp 00:0b: Plug and Play ACPI device, IDs PNP0501 (activ=
e)
> [    0.760018] pnp 00:0c: [io  0x0378-0x037f]
> [    0.760025] xen: --> pirq=3D21 -> irq=3D7 (gsi=3D7)
> [    0.760028] pnp 00:0c: [irq 7]
> [    0.760048] pnp 00:0c: Plug and Play ACPI device, IDs PNP0400 (activ=
e)
> [    0.793636] pnp: PnP ACPI: found 13 devices
> [    0.793639] ACPI: ACPI bus type pnp unregistered
> [    0.803899] PCI: max bus depth: 0 pci_try_num: 1
> [    0.803905] pci_bus 0000:00: resource 4 [io  0x0000-0x0cf7]
> [    0.803908] pci_bus 0000:00: resource 5 [io  0x0d00-0xffff]
> [    0.803911] pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff]
> [    0.803914] pci_bus 0000:00: resource 7 [mem 0xf0000000-0xfbffffff]
> [    0.803949] NET: Registered protocol family 2
> [    0.804045] IP route cache hash table entries: 32768 (order: 6, 2621=
44 bytes)
> [    0.804442] TCP established hash table entries: 131072 (order: 9, 20=
97152 bytes)
> [    0.805331] TCP bind hash table entries: 65536 (order: 8, 1048576 by=
tes)
> [    0.805693] TCP: Hash tables configured (established 131072 bind 655=
36)
> [    0.805696] TCP reno registered
> [    0.805701] UDP hash table entries: 512 (order: 2, 16384 bytes)
> [    0.805715] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
> [    0.805810] NET: Registered protocol family 1
> [    0.805820] pci 0000:00:00.0: Limiting direct PCI/PCI transfers
> [    0.805896] pci 0000:00:01.0: PIIX3: Enabling Passive Release
> [    0.806028] pci 0000:00:01.0: Activating ISA DMA hang workarounds
> [    0.806692] pci 0000:00:02.0: Boot video device
> [    0.806833] PCI: CLS 0 bytes, default 64
> [    0.807249] audit: initializing netlink socket (disabled)
> [    0.807260] type=3D2000 audit(1320237465.521:1): initialized
> [    0.827581] HugeTLB registered 2 MB page size, pre-allocated 0 pages
> [    0.833681] VFS: Disk quotas dquot_6.5.2
> [    0.833742] Dquot-cache hash table entries: 512 (order 0, 4096 bytes=
)
> [    0.834402] fuse init (API version 7.17)
> [    0.834526] msgmni has been set to 1965
> [    0.835549] Block layer SCSI generic (bsg) driver version 0.4 loaded=
 (major 253)
> [    0.835634] io scheduler noop registered
> [    0.835636] io scheduler deadline registered
> [    0.835677] io scheduler cfq registered (default)
> [    0.835756] pci_hotplug: PCI Hot Plug PCI Core version: 0.5
> [    0.835775] pciehp: PCI Express Hot Plug Controller Driver version: =
0.4
> [    0.835825] efifb: probing for efifb
> [    0.836002] efifb: framebuffer at 0xf0000000, mapped to 0xffffc90000=
500000, using 1408k, total 1408k
> [    0.836006] efifb: mode is 800x600x24, linelength=3D2400, pages=3D1
> [    0.836008] efifb: scrolling: redraw
> [    0.836011] efifb: Truecolor: size=3D0:8:8:8, shift=3D0:16:8:0
> [    0.836136] Console: switching to colour frame buffer device 100x37
> [    0.836149] fb0: EFI VGA frame buffer device
> [    0.836212] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/=
input/input0
> [    0.836218] ACPI: Power Button [PWRF]
> [    0.836255] input: Sleep Button as /devices/LNXSYSTM:00/LNXSLPBN:00/=
input/input1
> [    0.836259] ACPI: Sleep Button [SLPF]
> [    0.836282] ACPI: acpi_idle registered with cpuidle
> [    0.871283] ERST: Table is not found!
> [    0.871286] GHES: HEST is not enabled!
> [    0.871384] xen: --> pirq=3D22 -> irq=3D28 (gsi=3D28)
> [    0.871388] xen-platform-pci 0000:00:03.0: PCI INT A -> GSI 28 (leve=
l, low) -> IRQ 28
> [    0.873542] Grant table initialized
> [    0.875779] Serial: 8250/16550 driver, 32 ports, IRQ sharing enabled
> [    0.907896] serial8250: ttyS0 at I/O 0x3f8 (irq =3D 4) is a 16550A
> [    0.951325] 00:0b: ttyS0 at I/O 0x3f8 (irq =3D 4) is a 16550A
> [    0.960403] Linux agpgart interface v0.103
> [    0.962412] brd: module loaded
> [    0.963572] loop: module loaded
> [    0.965506] blkfront device/vbd/768 num-ring-pages 1 nr_ents 32.
> [    0.965882] ata_piix 0000:00:01.1: version 2.13
> [    0.966799] ata_piix 0000:00:01.1: setting latency timer to 64
> [    0.967537] scsi0 : ata_piix
> [    0.967675] scsi1 : ata_piix
> [    0.967716] ata1: PATA max MWDMA2 cmd 0x1f0 ctl 0x3f6 bmdma 0xc160 i=
rq 14
> [    0.967719] ata2: PATA max MWDMA2 cmd 0x170 ctl 0x376 bmdma 0xc168 i=
rq 15
> [    0.968094] Fixed MDIO Bus: probed
> [    0.968117] PPP generic driver version 2.4.2
> [    0.968169] Initialising Xen virtual ethernet driver.
> [    0.969593] blkfront: xvda: flush diskcache: enabled
> [    0.971894] tun: Universal TUN/TAP device driver, 1.6
> [    0.971898] tun: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
> [    0.972181] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driv=
er
> [    0.972219] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
> [    0.972228] uhci_hcd: USB Universal Host Controller Interface driver
> [    0.972386] xen: --> pirq=3D23 -> irq=3D23 (gsi=3D23)
> [    0.972394] uhci_hcd 0000:00:01.2: PCI INT D -> GSI 23 (level, low) =
-> IRQ 23
> [    0.972505] uhci_hcd 0000:00:01.2: setting latency timer to 64
> [    0.972571] uhci_hcd 0000:00:01.2: UHCI Host Controller
> [    0.972616] uhci_hcd 0000:00:01.2: new USB bus registered, assigned =
bus number 1
> [    0.973020] uhci_hcd 0000:00:01.2: irq 23, io base 0x0000c140
> [    0.978900] hub 1-0:1.0: USB hub found
> [    0.978905] hub 1-0:1.0: 2 ports detected
> [    0.979178] i8042: PNP: PS/2 Controller [PNP0303:PS2K,PNP0f13:PS2M] =
at 0x60,0x64 irq 1,12
> [    0.981637] serio: i8042 KBD port at 0x60,0x64 irq 1
> [    0.981649] serio: i8042 AUX port at 0x60,0x64 irq 12
> [    0.981769] mousedev: PS/2 mouse device common for all mice
> [    0.982958] input: AT Translated Set 2 keyboard as /devices/platform=
/i8042/serio0/input/input2
> [    0.982985]  xvda: xvda1 xvda2 < xvda5 >
> [    0.984234] rtc_cmos 00:06: rtc core: registered rtc_cmos as rtc0
> [    0.984279] rtc0: alarms up to one day, 114 bytes nvram, hpet irqs
> [    0.984362] device-mapper: uevent: version 1.0.3
> [    0.984472] device-mapper: ioctl: 4.21.0-ioctl (2011-07-06) initiali=
sed: dm-devel@redhat.com
> [    0.984492] cpuidle: using governor ladder
> [    0.984495] cpuidle: using governor menu
> [    0.984497] EFI Variables Facility v0.08 2004-May-17
> [    0.984763] TCP cubic registered
> [    0.984877] NET: Registered protocol family 10
> [    0.985693] NET: Registered protocol family 17
> [    0.985710] Registering the dns_resolver key type
> [    0.985889] PM: Hibernation image not present or could not be loaded=
.
> [    0.985901] registered taskstats version 1
> [    1.019271]   Magic number: 3:34:632
> [    1.019408] rtc_cmos 00:06: setting system clock to 2011-11-02 12:37=
:44 UTC (1320237464)
> [    1.019435] BIOS EDD facility v0.16 2004-Jun-25, 0 devices found
> [    1.019437] EDD information not available.
> [    1.126476] Freeing unused kernel memory: 904k freed
> [    1.126740] Write protecting the kernel read-only data: 12288k
> [    1.134267] Freeing unused kernel memory: 1828k freed
> [    1.138300] Freeing unused kernel memory: 1296k freed
> [    1.288088] usb 1-2: new full speed USB device number 2 using uhci_h=
cd
> [    1.390675] udevd[87]: starting version 173
> [    1.557170] FDC 0 is a S82078B
> [    1.654090] EXT4-fs (xvda1): mounted filesystem with ordered data mo=
de. Opts: (null)
> [    1.804099] Refined TSC clocksource calibration: 2833.041 MHz.
> [    8.755679] udevd[267]: starting version 173
> [    8.776435] Adding 1036156k swap on /dev/xvda5.  Priority:-1 extents=
:1 across:1036156k SS
> [    8.822145] lp: driver loaded but no devices found
> [    8.851399] piix4_smbus 0000:00:01.3: SMBus base address uninitializ=
ed - upgrade BIOS or use force_addr=3D0xaddr
> [    8.954685] EXT4-fs (xvda1): re-mounted. Opts: errors=3Dremount-ro
> [    9.139888] type=3D1400 audit(1320237472.616:2): apparmor=3D"STATUS"=
 operation=3D"profile_load" name=3D"/sbin/dhclient" pid=3D425 comm=3D"app=
armor_parser"
> [    9.140271] type=3D1400 audit(1320237472.620:3): apparmor=3D"STATUS"=
 operation=3D"profile_load" name=3D"/usr/lib/NetworkManager/nm-dhcp-clien=
t.action" pid=3D425 comm=3D"apparmor_parser"
> [    9.140473] type=3D1400 audit(1320237472.620:4): apparmor=3D"STATUS"=
 operation=3D"profile_load" name=3D"/usr/lib/connman/scripts/dhclient-scr=
ipt" pid=3D425 comm=3D"apparmor_parser"
> [    9.163304] parport_pc 00:0c: reported by Plug and Play ACPI
> [    9.164194] parport0: PC-style at 0x378, irq 7 [PCSPP,TRISTATE]
> [    9.389684] input: ImExPS/2 Generic Explorer Mouse as /devices/platf=
orm/i8042/serio1/input/input3
> [    9.444231] lp0: using parport0 (interrupt-driven).
> [    9.632943] type=3D1400 audit(1320237473.112:5): apparmor=3D"STATUS"=
 operation=3D"profile_replace" name=3D"/sbin/dhclient" pid=3D633 comm=3D"=
apparmor_parser"
> [    9.635268] type=3D1400 audit(1320237473.112:6): apparmor=3D"STATUS"=
 operation=3D"profile_replace" name=3D"/usr/lib/NetworkManager/nm-dhcp-cl=
ient.action" pid=3D633 comm=3D"apparmor_parser"
> [    9.636272] type=3D1400 audit(1320237473.116:7): apparmor=3D"STATUS"=
 operation=3D"profile_replace" name=3D"/usr/lib/connman/scripts/dhclient-=
script" pid=3D633 comm=3D"apparmor_parser"
> [    9.644967] type=3D1400 audit(1320237473.124:8): apparmor=3D"STATUS"=
 operation=3D"profile_load" name=3D"/usr/lib/lightdm/lightdm-guest-sessio=
n-wrapper" pid=3D632 comm=3D"apparmor_parser"
> [    9.748253] input: QEMU 0.10.2 QEMU USB Tablet as /devices/pci0000:0=
0/0000:00:01.2/usb1/1-2/1-2:1.0/input/input4
> [    9.749112] generic-usb 0003:0627:0001.0001: input,hidraw0: USB HID =
v0.01 Pointer [QEMU 0.10.2 QEMU USB Tablet] on usb-0000:00:01.2-2/input0
> [    9.749155] usbcore: registered new interface driver usbhid
> [    9.749158] usbhid: USB HID core driver
> [    9.753618] type=3D1400 audit(1320237473.232:9): apparmor=3D"STATUS"=
 operation=3D"profile_load" name=3D"/usr/lib/telepathy/mission-control-5"=
 pid=3D657 comm=3D"apparmor_parser"
> [    9.753963] type=3D1400 audit(1320237473.232:10): apparmor=3D"STATUS=
" operation=3D"profile_load" name=3D"/usr/lib/telepathy/telepathy-*" pid=3D=
657 comm=3D"apparmor_parser"
> [    9.759197] type=3D1400 audit(1320237473.236:11): apparmor=3D"STATUS=
" operation=3D"profile_load" name=3D"/usr/lib/cups/backend/cups-pdf" pid=3D=
692 comm=3D"apparmor_parser"
> [    9.783772] ppdev: user-space parallel port driver
> [    9.949413] init: failsafe main process (629) killed by TERM signal
> [    9.951926] init: apport pre-start process (758) terminated with sta=
tus 1
> [    9.987729] init: apport post-stop process (787) terminated with sta=
tus 1
> [   10.116941] mtrr: no MTRR for f0000000,100000 found
> [   10.132517] Bluetooth: Core ver 2.16
> [   10.132567] NET: Registered protocol family 31
> [   10.132569] Bluetooth: HCI device and connection manager initialized
> [   10.132573] Bluetooth: HCI socket layer initialized
> [   10.132575] Bluetooth: L2CAP socket layer initialized
> [   10.132586] Bluetooth: SCO socket layer initialized
> [   10.138549] Bluetooth: RFCOMM TTY layer initialized
> [   10.138554] Bluetooth: RFCOMM socket layer initialized
> [   10.138557] Bluetooth: RFCOMM ver 1.11
> [   10.151872] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
> [   10.151877] Bluetooth: BNEP filters: protocol multicast
> [   10.583458] EXT4-fs (xvda1): re-mounted. Opts: errors=3Dremount-ro,c=
ommit=3D0
> [   15.180981] EXT4-fs (xvda1): re-mounted. Opts: errors=3Dremount-ro,c=
ommit=3D0
> [   19.648090] eth0: no IPv6 routers present

> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 06:34:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 06:34:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLaxz-0003c9-Jn; Wed, 02 Nov 2011 06:34:55 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLaxX-0003QP-4r
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 06:34:27 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-15.tower-216.messagelabs.com!1320240864!2031352!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8964 invoked from network); 2 Nov 2011 13:34:24 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-15.tower-216.messagelabs.com with SMTP;
	2 Nov 2011 13:34:24 -0000
Received: from [192.168.100.15] (87-194-71-186.bethere.co.uk [87.194.71.186])
	by mail.avalus.com (Postfix) with ESMTPSA id 47A44C5610B;
	Wed,  2 Nov 2011 13:34:21 +0000 (GMT)
Date: Wed, 02 Nov 2011 13:34:21 +0000
From: Alex Bligh <alex@alex.org.uk>
To: Boris Derzhavets <bderzhavets@yahoo.com>,
	=?UTF-8?Q?Pasi_K=C3=A4rkk=C3=A4inen?= <pasik@iki.fi>,
	Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark
	with	Ubuntu 11.10
Message-ID: <4C629AA62C7654E9DCCA3890@Ximines.local>
In-Reply-To: <1320239310.13696.YahooMailClassic@web65915.mail.ac4.yahoo.com>
References: <1320239310.13696.YahooMailClassic@web65915.mail.ac4.yahoo.com>
X-Mailer: Mulberry/4.0.8 (Mac OS X)
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com, Alex Bligh <alex@alex.org.uk>,
	dokter@icg.tugraz.at
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: Alex Bligh <alex@alex.org.uk>
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Boris,

--On 2 November 2011 06:08:30 -0700 Boris Derzhavets 
<bderzhavets@yahoo.com> wrote:

> I was able to load Oneiric as PV on HVM at Xen 4.1.2 Oneiric Dom0
> (3.1.0-030100-generic)  after rebuilding the recent 3.1.0-3 Ubuntu's
> kernel with
> CONFIG_XEN_PLATFORM_PCI=y , uploading debian packages  :-

I very much doubt the reviewer did this. The -server variant (certainly
on one of the Oneiric pre-releases) had CONFIG_XEN_PLATFORM_PCI=m so
it should have been brought in by modprobe. I would guess -virtual
is the same. The installer OTOH does /not/ have the module in the udeb
which is an omission.

I am pretty sure we (eventually) got the standard -server kernel
to boot without rebuilding it, and have /dev/xvda etc. show up.

-- 
Alex Bligh


fgrep XEN /boot/config-3.0.0-12-server
CONFIG_XEN=y
CONFIG_XEN_DOM0=y
CONFIG_XEN_PRIVILEGED_GUEST=y
CONFIG_XEN_PVHVM=y
CONFIG_XEN_MAX_DOMAIN_MEMORY=128
CONFIG_XEN_SAVE_RESTORE=y
# CONFIG_XEN_DEBUG_FS is not set
# CONFIG_XEN_DEBUG is not set
CONFIG_PCI_XEN=y
CONFIG_XEN_PCIDEV_FRONTEND=m
CONFIG_XEN_BLKDEV_FRONTEND=m
CONFIG_XEN_BLKDEV_BACKEND=m
CONFIG_NETXEN_NIC=m
CONFIG_XEN_NETDEV_FRONTEND=m
CONFIG_XEN_NETDEV_BACKEND=m
CONFIG_INPUT_XEN_KBDDEV_FRONTEND=m
CONFIG_HVC_XEN=y
CONFIG_XEN_WDT=m
CONFIG_XEN_FBDEV_FRONTEND=m
CONFIG_XEN_BALLOON=y
CONFIG_XEN_SCRUB_PAGES=y
CONFIG_XEN_DEV_EVTCHN=m
CONFIG_XEN_BACKEND=y
CONFIG_XENFS=m
CONFIG_XEN_COMPAT_XENFS=y
CONFIG_XEN_SYS_HYPERVISOR=y
CONFIG_XEN_XENBUS_FRONTEND=m
CONFIG_XEN_GNTDEV=m
CONFIG_XEN_GRANT_DEV_ALLOC=m
CONFIG_XEN_PLATFORM_PCI=m
CONFIG_SWIOTLB_XEN=y


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 06:42:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 06:42:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLb5H-0004CO-By; Wed, 02 Nov 2011 06:42:27 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLb4m-000408-6n
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 06:41:56 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1320241313!2637407!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12441 invoked from network); 2 Nov 2011 13:41:53 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-11.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 2 Nov 2011 13:41:53 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 02 Nov 2011 13:41:52 +0000
Message-Id: <4EB156AD020000780005E703@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 02 Nov 2011 13:41:49 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Wang" <wei.wang2@amd.com>
Subject: Re: [Xen-devel] [PATCH 1 of 6] ats: Move some ats functions to
	a new directory
References: <patchbomb.1319548052@gran.amd.com>
	<217c4a82b202975c2fdf.1319548053@gran.amd.com>
In-Reply-To: <217c4a82b202975c2fdf.1319548053@gran.amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 25.10.11 at 15:07, Wei Wang <wei.wang2@amd.com> wrote:
> # HG changeset patch
> # User Wei Wang <wei.wang2@amd.com>
> # Date 1319472683 -7200
> # Node ID 217c4a82b202975c2fdff9ae499f065471e5c87b
> # Parent  121af976b2988de389db139231103ceedd11bb8a
> ats: Move some ats functions to a new directory.
> passhrough/x86 holds vendor neutral codes for x86 architecture.
>=20
> Signed-off-by: Wei Wang <wei.wang2@amd.com>
>
> diff -r 121af976b298 -r 217c4a82b202 xen/drivers/passthrough/Makefile
> --- a/xen/drivers/passthrough/Makefile	Fri Oct 14 10:17:22 2011 =
+0200
> +++ b/xen/drivers/passthrough/Makefile	Mon Oct 24 18:11:23 2011 =
+0200
> @@ -1,6 +1,7 @@
>  subdir-$(x86) +=3D vtd
>  subdir-$(ia64) +=3D vtd
>  subdir-$(x86) +=3D amd
> +subdir-$(x86) +=3D x86
> =20
>  obj-y +=3D iommu.o
>  obj-y +=3D io.o
> diff -r 121af976b298 -r 217c4a82b202 xen/drivers/passthrough/vtd/extern.h=

> --- a/xen/drivers/passthrough/vtd/extern.h	Fri Oct 14 10:17:22 2011 =
+0200
> +++ b/xen/drivers/passthrough/vtd/extern.h	Mon Oct 24 18:11:23 2011 =
+0200
> @@ -57,13 +57,9 @@ struct acpi_drhd_unit * iommu_to_drhd(st
>  struct acpi_rhsa_unit * drhd_to_rhsa(struct acpi_drhd_unit *drhd);
> =20
>  #ifdef CONFIG_X86_64
> -extern bool_t ats_enabled;
> -
>  struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu);
> =20
>  int ats_device(int seg, int bus, int devfn);
> -int enable_ats_device(int seg, int bus, int devfn);
> -void disable_ats_device(int seg, int bus, int devfn);
>  int invalidate_ats_tcs(struct iommu *iommu);
> =20
>  int dev_invalidate_iotlb(struct iommu *iommu, u16 did,
> diff -r 121af976b298 -r 217c4a82b202 xen/drivers/passthrough/vtd/iommu.c
> --- a/xen/drivers/passthrough/vtd/iommu.c	Fri Oct 14 10:17:22 2011 =
+0200
> +++ b/xen/drivers/passthrough/vtd/iommu.c	Mon Oct 24 18:11:23 2011 =
+0200
> @@ -40,6 +40,7 @@
>  #include "dmar.h"
>  #include "extern.h"
>  #include "vtd.h"
> +#include "../x86/ats.h"

#include <asm/ats.h>

which would imply that ia64 needs such a header, too, so perhaps even

#include <xen/ats.h>

or maybe

#include "../ats.h"

But there's no way you can include x86-only headers here.

Beyond that, this patch looks fine to me.

Jan

>  #ifdef __ia64__
>  #define nr_ioapics              iosapic_get_nr_iosapics()
> diff -r 121af976b298 -r 217c4a82b202 xen/drivers/passthrough/vtd/x86/ats.=
c
> --- a/xen/drivers/passthrough/vtd/x86/ats.c	Fri Oct 14 10:17:22 2011 =
+0200
> +++ b/xen/drivers/passthrough/vtd/x86/ats.c	Mon Oct 24 18:11:23 2011 =
+0200
> @@ -27,51 +27,10 @@
>  #include "../dmar.h"
>  #include "../vtd.h"
>  #include "../extern.h"
> +#include "../../x86/ats.h"
> =20
>  static LIST_HEAD(ats_dev_drhd_units);
> =20
> -#define ATS_REG_CAP    4
> -#define ATS_REG_CTL    6
> -#define ATS_QUEUE_DEPTH_MASK     0xF
> -#define ATS_ENABLE               (1<<15)
> -
> -struct pci_ats_dev {
> -    struct list_head list;
> -    u16 seg;
> -    u8 bus;
> -    u8 devfn;
> -    u16 ats_queue_depth;    /* ATS device invalidation queue depth */
> -};
> -static LIST_HEAD(ats_devices);
> -
> -static void parse_ats_param(char *s);
> -custom_param("ats", parse_ats_param);
> -
> -bool_t __read_mostly ats_enabled =3D 1;
> -
> -static void __init parse_ats_param(char *s)
> -{
> -    char *ss;
> -
> -    do {
> -        ss =3D strchr(s, ',');
> -        if ( ss )
> -            *ss =3D '\0';
> -
> -        switch ( parse_bool(s) )
> -        {
> -        case 0:
> -            ats_enabled =3D 0;
> -            break;
> -        case 1:
> -            ats_enabled =3D 1;
> -            break;
> -        }
> -
> -        s =3D ss + 1;
> -    } while ( ss );
> -}
> -
>  struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu)
>  {
>      struct acpi_drhd_unit *drhd;
> @@ -121,97 +80,6 @@ int ats_device(int seg, int bus, int dev
>      return pos;
>  }
> =20
> -int enable_ats_device(int seg, int bus, int devfn)
> -{
> -    struct pci_ats_dev *pdev =3D NULL;
> -    u32 value;
> -    int pos;
> -
> -    pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS)=
;
> -    BUG_ON(!pos);
> -
> -    if ( iommu_verbose )
> -        dprintk(XENLOG_INFO VTDPREFIX,
> -                "%04x:%02x:%02x.%u: ATS capability found\n",
> -                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
> -
> -    value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> -                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
> -    if ( value & ATS_ENABLE )
> -    {
> -        list_for_each_entry ( pdev, &ats_devices, list )
> -        {
> -            if ( pdev->seg =3D=3D seg && pdev->bus =3D=3D bus && =
pdev->devfn =3D=3D devfn )
> -            {
> -                pos =3D 0;
> -                break;
> -            }
> -        }
> -    }
> -    if ( pos )
> -        pdev =3D xmalloc(struct pci_ats_dev);
> -    if ( !pdev )
> -        return -ENOMEM;
> -
> -    if ( !(value & ATS_ENABLE) )
> -    {
> -        value |=3D ATS_ENABLE;
> -        pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> -                         pos + ATS_REG_CTL, value);
> -    }
> -
> -    if ( pos )
> -    {
> -        pdev->seg =3D seg;
> -        pdev->bus =3D bus;
> -        pdev->devfn =3D devfn;
> -        value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> -                                PCI_FUNC(devfn), pos + ATS_REG_CAP);
> -        pdev->ats_queue_depth =3D value & ATS_QUEUE_DEPTH_MASK;
> -        list_add(&pdev->list, &ats_devices);
> -    }
> -
> -    if ( iommu_verbose )
> -        dprintk(XENLOG_INFO VTDPREFIX,
> -                "%04x:%02x:%02x.%u: ATS %s enabled\n",
> -                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> -                pos ? "is" : "was");
> -
> -    return pos;
> -}
> -
> -void disable_ats_device(int seg, int bus, int devfn)
> -{
> -    struct pci_ats_dev *pdev;
> -    u32 value;
> -    int pos;
> -
> -    pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS)=
;
> -    BUG_ON(!pos);
> -
> -    value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> -                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
> -    value &=3D ~ATS_ENABLE;
> -    pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> -                     pos + ATS_REG_CTL, value);
> -
> -    list_for_each_entry ( pdev, &ats_devices, list )
> -    {
> -        if ( pdev->seg =3D=3D seg && pdev->bus =3D=3D bus && pdev->devfn=
 =3D=3D devfn )
> -        {
> -            list_del(&pdev->list);
> -            xfree(pdev);
> -            break;
> -        }
> -    }
> -
> -    if ( iommu_verbose )
> -        dprintk(XENLOG_INFO VTDPREFIX,
> -                "%04x:%02x:%02x.%u: ATS is disabled\n",
> -                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
> -}
> -
> -
>  static int device_in_domain(struct iommu *iommu, struct pci_ats_dev =
*pdev,=20
> u16 did)
>  {
>      struct root_entry *root_entry =3D NULL;
> diff -r 121af976b298 -r 217c4a82b202 xen/drivers/passthrough/x86/Makefile=

> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/xen/drivers/passthrough/x86/Makefile	Mon Oct 24 18:11:23 2011 =
+0200
> @@ -0,0 +1,1 @@
> +obj-y +=3D ats.o
> \ No newline at end of file
> diff -r 121af976b298 -r 217c4a82b202 xen/drivers/passthrough/x86/ats.c
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/xen/drivers/passthrough/x86/ats.c	Mon Oct 24 18:11:23 2011 =
+0200
> @@ -0,0 +1,139 @@
> +/*
> + * This program is free software; you can redistribute it and/or modify =
it
> + * under the terms and conditions of the GNU General Public License,
> + * version 2, as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope it will be useful, but =
WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY =
or
> + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public =
License=20
> for
> + * more details.
> + *
> + * You should have received a copy of the GNU General Public License =
along=20
> with
> + * this program; if not, write to the Free Software Foundation, Inc., =
59=20
> Temple
> + * Place - Suite 330, Boston, MA 02111-1307 USA.
> + */
> +
> +#include <xen/sched.h>
> +#include <xen/pci.h>
> +#include <xen/pci_regs.h>
> +#include "ats.h"
> +
> +LIST_HEAD(ats_devices);
> +
> +static void parse_ats_param(char *s);
> +custom_param("ats", parse_ats_param);
> +
> +bool_t __read_mostly ats_enabled =3D 1;
> +
> +static void __init parse_ats_param(char *s)
> +{
> +    char *ss;
> +
> +    do {
> +        ss =3D strchr(s, ',');
> +        if ( ss )
> +            *ss =3D '\0';
> +
> +        switch ( parse_bool(s) )
> +        {
> +        case 0:
> +            ats_enabled =3D 0;
> +            break;
> +        case 1:
> +            ats_enabled =3D 1;
> +            break;
> +        }
> +
> +        s =3D ss + 1;
> +    } while ( ss );
> +}
> +
> +int enable_ats_device(int seg, int bus, int devfn)
> +{
> +    struct pci_ats_dev *pdev =3D NULL;
> +    u32 value;
> +    int pos;
> +
> +    pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS)=
;
> +    BUG_ON(!pos);
> +
> +    if ( iommu_verbose )
> +        dprintk(XENLOG_INFO VTDPREFIX,
> +                "%04x:%02x:%02x.%u: ATS capability found\n",
> +                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
> +
> +    value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> +                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
> +    if ( value & ATS_ENABLE )
> +    {
> +        list_for_each_entry ( pdev, &ats_devices, list )
> +        {
> +            if ( pdev->seg =3D=3D seg && pdev->bus =3D=3D bus && =
pdev->devfn =3D=3D devfn )
> +            {
> +                pos =3D 0;
> +                break;
> +            }
> +        }
> +    }
> +    if ( pos )
> +        pdev =3D xmalloc(struct pci_ats_dev);
> +    if ( !pdev )
> +        return -ENOMEM;
> +
> +    if ( !(value & ATS_ENABLE) )
> +    {
> +        value |=3D ATS_ENABLE;
> +        pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> +                         pos + ATS_REG_CTL, value);
> +    }
> +
> +    if ( pos )
> +    {
> +        pdev->seg =3D seg;
> +        pdev->bus =3D bus;
> +        pdev->devfn =3D devfn;
> +        value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> +                                PCI_FUNC(devfn), pos + ATS_REG_CAP);
> +        pdev->ats_queue_depth =3D value & ATS_QUEUE_DEPTH_MASK;
> +        list_add(&pdev->list, &ats_devices);
> +    }
> +
> +    if ( iommu_verbose )
> +        dprintk(XENLOG_INFO VTDPREFIX,
> +                "%04x:%02x:%02x.%u: ATS %s enabled\n",
> +                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> +                pos ? "is" : "was");
> +
> +    return pos;
> +}
> +
> +void disable_ats_device(int seg, int bus, int devfn)
> +{
> +    struct pci_ats_dev *pdev;
> +    u32 value;
> +    int pos;
> +
> +    pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS)=
;
> +    BUG_ON(!pos);
> +
> +    value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> +                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
> +    value &=3D ~ATS_ENABLE;
> +    pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> +                     pos + ATS_REG_CTL, value);
> +
> +    list_for_each_entry ( pdev, &ats_devices, list )
> +    {
> +        if ( pdev->seg =3D=3D seg && pdev->bus =3D=3D bus && pdev->devfn=
 =3D=3D devfn )
> +        {
> +            list_del(&pdev->list);
> +            xfree(pdev);
> +            break;
> +        }
> +    }
> +
> +    if ( iommu_verbose )
> +        dprintk(XENLOG_INFO VTDPREFIX,
> +                "%04x:%02x:%02x.%u: ATS is disabled\n",
> +                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
> +}
> diff -r 121af976b298 -r 217c4a82b202 xen/drivers/passthrough/x86/ats.h
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/xen/drivers/passthrough/x86/ats.h	Mon Oct 24 18:11:23 2011 =
+0200
> @@ -0,0 +1,38 @@
> +/*
> + * This program is free software; you can redistribute it and/or modify =
it
> + * under the terms and conditions of the GNU General Public License,
> + * version 2, as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope it will be useful, but =
WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY =
or
> + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public =
License=20
> for
> + * more details.
> + *
> + * You should have received a copy of the GNU General Public License =
along=20
> with
> + * this program; if not, write to the Free Software Foundation, Inc., =
59=20
> Temple
> + * Place - Suite 330, Boston, MA 02111-1307 USA.
> + */
> +
> +#ifndef _X86_ATS_H_
> +#define _X86_ATS_H_
> +
> +#define ATS_REG_CAP    4
> +#define ATS_REG_CTL    6
> +#define ATS_QUEUE_DEPTH_MASK     0xF
> +#define ATS_ENABLE               (1<<15)
> +
> +struct pci_ats_dev {
> +    struct list_head list;
> +    u16 seg;
> +    u8 bus;
> +    u8 devfn;
> +    u16 ats_queue_depth;    /* ATS device invalidation queue depth */
> +};
> +
> +extern struct list_head ats_devices;
> +extern bool_t ats_enabled;
> +
> +int enable_ats_device(int seg, int bus, int devfn);
> +void disable_ats_device(int seg, int bus, int devfn);
> +
> +#endif /* _X86_ATS_H_ */
>=20
>=20
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com=20
> http://lists.xensource.com/xen-devel=20



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 06:43:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 06:43:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLb6B-0004a1-4W; Wed, 02 Nov 2011 06:43:23 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLb5c-0004JC-II
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 06:42:48 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1320241365!2639273!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3491 invoked from network); 2 Nov 2011 13:42:45 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 2 Nov 2011 13:42:45 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 02 Nov 2011 13:42:45 +0000
Message-Id: <4EB156E1020000780005E706@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 02 Nov 2011 13:42:41 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Wang" <wei.wang2@amd.com>
Subject: Re: [Xen-devel] [PATCH 2 of 6] ats: Remove VTD prefix from
	debug output
References: <patchbomb.1319548052@gran.amd.com>
	<0d17087f9e495c1b9eb4.1319548054@gran.amd.com>
In-Reply-To: <0d17087f9e495c1b9eb4.1319548054@gran.amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 25.10.11 at 15:07, Wei Wang <wei.wang2@amd.com> wrote:
> # HG changeset patch
> # User Wei Wang <wei.wang2@amd.com>
> # Date 1319472689 -7200
> # Node ID 0d17087f9e495c1b9eb43bc0f6a21319097f3043
> # Parent  217c4a82b202975c2fdff9ae499f065471e5c87b
> ats: Remove VTD prefix from debug output.

Personally I would prefer if you folded this into patch 1.

Jan

> Signed-off-by: Wei Wang <wei.wang2@amd.com>
>=20
> diff -r 217c4a82b202 -r 0d17087f9e49 xen/drivers/passthrough/x86/ats.c
> --- a/xen/drivers/passthrough/x86/ats.c	Mon Oct 24 18:11:23 2011 =
+0200
> +++ b/xen/drivers/passthrough/x86/ats.c	Mon Oct 24 18:11:29 2011 =
+0200
> @@ -58,7 +58,7 @@ int enable_ats_device(int seg, int bus,=20
>      BUG_ON(!pos);
> =20
>      if ( iommu_verbose )
> -        dprintk(XENLOG_INFO VTDPREFIX,
> +        dprintk(XENLOG_INFO,
>                  "%04x:%02x:%02x.%u: ATS capability found\n",
>                  seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
> =20
> @@ -99,7 +99,7 @@ int enable_ats_device(int seg, int bus,=20
>      }
> =20
>      if ( iommu_verbose )
> -        dprintk(XENLOG_INFO VTDPREFIX,
> +        dprintk(XENLOG_INFO,
>                  "%04x:%02x:%02x.%u: ATS %s enabled\n",
>                  seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
>                  pos ? "is" : "was");
> @@ -133,7 +133,8 @@ void disable_ats_device(int seg, int bus
>      }
> =20
>      if ( iommu_verbose )
> -        dprintk(XENLOG_INFO VTDPREFIX,
> +        dprintk(XENLOG_INFO,
>                  "%04x:%02x:%02x.%u: ATS is disabled\n",
>                  seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
>  }
> +
>=20
>=20
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com=20
> http://lists.xensource.com/xen-devel=20




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 06:47:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 06:47:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLb9n-00050i-4m; Wed, 02 Nov 2011 06:47:07 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLb9D-0004oK-Uz
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 06:46:32 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1320241576!53494859!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 905 invoked from network); 2 Nov 2011 13:46:16 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-15.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 2 Nov 2011 13:46:16 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 02 Nov 2011 13:46:28 +0000
Message-Id: <4EB157C0020000780005E717@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 02 Nov 2011 13:46:24 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Wang" <wei.wang2@amd.com>,<xen-devel@lists.xensource.com>
Subject: Re: [Xen-devel] [PATCH 3 of 6] amd iommu: Fix iommu page size
	encoding when page order > 0
References: <patchbomb.1319548052@gran.amd.com>
	<18088bd3e8f6c16b7aef.1319548055@gran.amd.com>
In-Reply-To: <18088bd3e8f6c16b7aef.1319548055@gran.amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 25.10.11 at 15:07, Wei Wang <wei.wang2@amd.com> wrote:
> # HG changeset patch
> # User Wei Wang <wei.wang2@amd.com>
> # Date 1319472692 -7200
> # Node ID 18088bd3e8f6c16b7aef3d8652f2b9878117fcd5
> # Parent  0d17087f9e495c1b9eb43bc0f6a21319097f3043
> amd iommu: Fix iommu page size encoding when page order > 0
>=20
> Signed-off-by: Wei Wang <wei.wang2@amd.com>
>=20
> diff -r 0d17087f9e49 -r 18088bd3e8f6 xen/drivers/passthrough/amd/iommu_ma=
p.c
> --- a/xen/drivers/passthrough/amd/iommu_map.c	Mon Oct 24 18:11:29 2011 =
+0200
> +++ b/xen/drivers/passthrough/amd/iommu_map.c	Mon Oct 24 18:11:32 2011 =
+0200
> @@ -77,23 +77,24 @@ static void invalidate_iommu_pages(struc
>  {
>      u64 addr_lo, addr_hi;
>      u32 cmd[4], entry;
> -    u64 mask =3D 0;
>      int sflag =3D 0, pde =3D 0;
> =20
> +    ASSERT ( order =3D=3D 0 || order =3D=3D 9 || order =3D=3D 18 );
> +
> +    /* All pages associated with the domainID are invalidated */
> +    if ( order || (io_addr =3D=3D INV_IOMMU_ALL_PAGES_ADDRESS ) )
> +    {
> +        sflag =3D 1;
> +        pde =3D 1;
> +    }
> +
>      /* If sflag =3D=3D 1, the size of the invalidate command is =
determined
>       by the first zero bit in the address starting from Address[12] */
> -    if ( order =3D=3D 9 || order =3D=3D 18 )
> +    if ( order )
>      {
> -        mask =3D ((1ULL << (order - 1)) - 1) << PAGE_SHIFT;
> -        io_addr |=3D mask;
> -        sflag =3D 1;
> -    }
> -
> -    /* All pages associated with the domainID are invalidated */
> -    else if ( io_addr =3D=3D 0x7FFFFFFFFFFFF000ULL )
> -    {
> -        sflag =3D 1;
> -        pde =3D 1;
> +        u64 mask =3D 1ULL << (order - 1 + PAGE_SHIFT);
> +        io_addr &=3D ~mask;
> +        io_addr |=3D mask - 1;
>      }
> =20
>      addr_lo =3D io_addr & DMA_32BIT_MASK;
> @@ -917,7 +918,7 @@ static void _amd_iommu_flush_pages(struc
> =20
>  void amd_iommu_flush_all_pages(struct domain *d)
>  {
> -    _amd_iommu_flush_pages(d, 0x7FFFFFFFFFFFFULL, 0);
> +    _amd_iommu_flush_pages(d, INV_IOMMU_ALL_PAGES_ADDRESS, 0);
>  }
> =20
>  void amd_iommu_flush_pages(struct domain *d,
> diff -r 0d17087f9e49 -r 18088bd3e8f6 xen/include/asm-x86/hvm/svm/amd-iomm=
u-defs.h
> --- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Mon Oct 24 =
18:11:29 2011 +0200
> +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Mon Oct 24 =
18:11:32 2011=20
> +0200
> @@ -407,4 +407,6 @@
>  #define INT_REMAP_ENTRY_VECTOR_MASK     0x00FF0000
>  #define INT_REMAP_ENTRY_VECTOR_SHIFT    16
> =20
> +#define INV_IOMMU_ALL_PAGES_ADDRESS     0x7FFFFFFFFFFFFULL

((1ULL << 51) - 1)

would make this much easier to understand. But - doe the IOMMU really
have its limit at 51 bits (as opposed to the architectural limit of 52 in =
the
CPU's MMU)?

Jan

> +
>  #endif /* _ASM_X86_64_AMD_IOMMU_DEFS_H */
>=20
>=20
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com=20
> http://lists.xensource.com/xen-devel=20




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 06:50:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 06:50:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLbDR-0005Rp-I5; Wed, 02 Nov 2011 06:50:53 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLbCp-0005ES-G9
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 06:50:15 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1320241789!50710620!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29409 invoked from network); 2 Nov 2011 13:49:49 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-8.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 2 Nov 2011 13:49:49 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 02 Nov 2011 13:50:12 +0000
Message-Id: <4EB158A1020000780005E71A@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 02 Nov 2011 13:50:09 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Wang" <wei.wang2@amd.com>
Subject: Re: [Xen-devel] [PATCH 4 of 6] ats: Add new ATS helper
	 functions
References: <patchbomb.1319548052@gran.amd.com>
	<3dc5e805d9142cbe1074.1319548056@gran.amd.com>
In-Reply-To: <3dc5e805d9142cbe1074.1319548056@gran.amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 25.10.11 at 15:07, Wei Wang <wei.wang2@amd.com> wrote:
> # HG changeset patch
> # User Wei Wang <wei.wang2@amd.com>
> # Date 1319472696 -7200
> # Node ID 3dc5e805d9142cbe1074610879e258b6fab43409
> # Parent  18088bd3e8f6c16b7aef3d8652f2b9878117fcd5
> ats: Add new ATS helper functions
>=20
> Signed-off-by Wei Wang <wei.wang2@amd.com>
>=20
> diff -r 18088bd3e8f6 -r 3dc5e805d914 xen/drivers/passthrough/x86/ats.c
> --- a/xen/drivers/passthrough/x86/ats.c	Mon Oct 24 18:11:32 2011 =
+0200
> +++ b/xen/drivers/passthrough/x86/ats.c	Mon Oct 24 18:11:36 2011 =
+0200
> @@ -138,3 +138,42 @@ void disable_ats_device(int seg, int bus
>                  seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
>  }
> =20
> +int pci_ats_enabled(int seg, int bus, int devfn)
> +{
> +    u32 value;
> +    int pos;
> +
> +    pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS)=
;
> +    BUG_ON(!pos);
> +
> +    value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> +                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
> +    return value & ATS_ENABLE;
> +}
> +
> +int pci_ats_device(int seg, int bus, int devfn)
> +{
> +    if ( !ats_enabled )
> +        return 0;
> +
> +    if ( !pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS) =
)
> +        return 0;
> +
> +    return 1;
> +}

At least this one would certainly be a candidate for inlining.

> +
> +struct pci_ats_dev* get_ats_device(int seg, int bus, int devfn)

Formatting (asterisk and space should switch places).

> +{
> +    struct pci_ats_dev *pdev;
> +
> +    if ( !pci_ats_device(seg, bus, devfn) )
> +        return NULL;
> +
> +    list_for_each_entry ( pdev, &ats_devices, list )
> +    {
> +        if ( pdev->seg =3D=3D seg && pdev->bus =3D=3D bus && pdev->devfn=
 =3D=3D devfn )
> +            return pdev;
> +    }
> +
> +    return NULL;
> +}
> diff -r 18088bd3e8f6 -r 3dc5e805d914 xen/drivers/passthrough/x86/ats.h
> --- a/xen/drivers/passthrough/x86/ats.h	Mon Oct 24 18:11:32 2011 =
+0200
> +++ b/xen/drivers/passthrough/x86/ats.h	Mon Oct 24 18:11:36 2011 =
+0200
> @@ -34,5 +34,8 @@ extern bool_t ats_enabled;
> =20
>  int enable_ats_device(int seg, int bus, int devfn);
>  void disable_ats_device(int seg, int bus, int devfn);
> +int pci_ats_enabled(int seg, int bus, int devfn);
> +int pci_ats_device(int seg, int bus, int devfn);
> +struct pci_ats_dev* get_ats_device(int seg, int bus, int devfn);

Formatting again.

Jan

> =20
>  #endif /* _X86_ATS_H_ */
>=20
>=20
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com=20
> http://lists.xensource.com/xen-devel=20




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 06:58:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 06:58:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLbKr-000683-2K; Wed, 02 Nov 2011 06:58:34 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLbJP-0005q8-TN
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 06:57:04 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1320242219!43676!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4675 invoked from network); 2 Nov 2011 13:56:59 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-5.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	2 Nov 2011 13:56:59 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 02 Nov 2011 13:56:58 +0000
Message-Id: <4EB15A37020000780005E72F@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 02 Nov 2011 13:56:55 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Wang" <wei.wang2@amd.com>
Subject: Re: [Xen-devel] [PATCH 6 of 6] amd iommu: enable ats devices
References: <patchbomb.1319548052@gran.amd.com>
	<b84967db0efb875bca4d.1319548058@gran.amd.com>
In-Reply-To: <b84967db0efb875bca4d.1319548058@gran.amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 25.10.11 at 15:07, Wei Wang <wei.wang2@amd.com> wrote:
> # HG changeset patch
> # User Wei Wang <wei.wang2@amd.com>
> # Date 1319472702 -7200
> # Node ID b84967db0efb875bca4d95f47fc77b46cd065665
> # Parent  8ec947b278afaf89acadf905237c95ba7b64524a
> amd iommu: enable ats devices
>=20
> Signed-off-by: Wei Wang <wei.wang2@amd.com=20
>=20
> diff -r 8ec947b278af -r b84967db0efb xen/drivers/passthrough/amd/iommu_ma=
p.c
> --- a/xen/drivers/passthrough/amd/iommu_map.c	Mon Oct 24 18:11:40 2011 =
+0200
> +++ b/xen/drivers/passthrough/amd/iommu_map.c	Mon Oct 24 18:11:42 2011 =
+0200
> @@ -369,6 +369,17 @@ void amd_iommu_set_root_page_table(
>      dte[0] =3D entry;
>  }
> =20
> +void iommu_dte_set_iotlb(u32 *dte, u8 i)
> +{
> +    u32 entry;
> +
> +    entry =3D dte[3];
> +    set_field_in_reg_u32(!!i, entry,
> +                         IOMMU_DEV_TABLE_IOTLB_SUPPORT_MASK,
> +                         IOMMU_DEV_TABLE_IOTLB_SUPPORT_SHIFT, &entry);
> +    dte[3] =3D entry;
> +}
> +
>  void __init amd_iommu_set_intremap_table(
>      u32 *dte, u64 intremap_ptr, u8 int_valid)
>  {
> diff -r 8ec947b278af -r b84967db0efb=20
> xen/drivers/passthrough/amd/pci_amd_iommu.c
> --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c	Mon Oct 24 =
18:11:40 2011 +0200
> +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c	Mon Oct 24 =
18:11:42 2011=20
> +0200
> @@ -25,6 +25,7 @@
>  #include <asm/hvm/iommu.h>
>  #include <asm/amd-iommu.h>
>  #include <asm/hvm/svm/amd-iommu-proto.h>
> +#include "../x86/ats.h"
> =20
>  struct amd_iommu *find_iommu_for_device(int seg, int bdf)
>  {
> @@ -81,11 +82,12 @@ static void disable_translation(u32 *dte
>  }
> =20
>  static void amd_iommu_setup_domain_device(
> -    struct domain *domain, struct amd_iommu *iommu, int bdf)
> +    struct domain *domain, struct amd_iommu *iommu, u8 bus, u8 devfn)
>  {
>      void *dte;
>      unsigned long flags;
>      int req_id, valid =3D 1;
> +    int dte_i =3D 0;
> =20
>      struct hvm_iommu *hd =3D domain_hvm_iommu(domain);
> =20
> @@ -94,8 +96,11 @@ static void amd_iommu_setup_domain_devic
>      if ( iommu_passthrough && (domain->domain_id =3D=3D 0) )
>          valid =3D 0;
> =20
> +    if ( ats_enabled )
> +        dte_i =3D 1;
> +
>      /* get device-table entry */
> -    req_id =3D get_dma_requestor_id(iommu->seg, bdf);
> +    req_id =3D get_dma_requestor_id(iommu->seg, (bus << 8) | devfn);
>      dte =3D iommu->dev_table.buffer + (req_id * IOMMU_DEV_TABLE_ENTRY_SI=
ZE);
> =20
>      spin_lock_irqsave(&iommu->lock, flags);
> @@ -107,6 +112,9 @@ static void amd_iommu_setup_domain_devic
>              (u32 *)dte, page_to_maddr(hd->root_table), hd->domain_id,
>              hd->paging_mode, valid);
> =20
> +        if ( pci_ats_device(iommu->seg, bus, devfn) && iommu->iotlb_supp=
ort )
> +            iommu_dte_set_iotlb((u32 *)dte, dte_i);
> +
>          invalidate_dev_table_entry(iommu, req_id);
>          flush_command_buffer(iommu);
> =20
> @@ -118,6 +126,21 @@ static void amd_iommu_setup_domain_devic
>      }
> =20
>      spin_unlock_irqrestore(&iommu->lock, flags);
> +
> +    ASSERT(spin_is_locked(&pcidevs_lock));
> +
> +    if ( pci_ats_device(iommu->seg, bus, devfn) && ats_enabled &&

Iirc pci_ats_device() returning non-zero already implies ats_enabled.

> +         !pci_ats_enabled(iommu->seg, bus, devfn) )
> +    {
> +        struct pci_dev* pdev;

Formatting (need a newline here, plus asterisk and space again should
switch places).

> +        enable_ats_device(iommu->seg, bus, devfn);
> +
> +        ASSERT(spin_is_locked(&pcidevs_lock));
> +        pdev =3D pci_get_pdev(iommu->seg, bus, devfn);
> +
> +        if ( pdev )

Is it actually possible/valid for pdev to be NULL here? If not, you'd
want ASSERT()/BUG_ON() instead of if() here.

> +            amd_iommu_flush_iotlb(pdev, INV_IOMMU_ALL_PAGES_ADDRESS, =
0);
> +    }
>  }
> =20
>  static void __init amd_iommu_setup_dom0_device(struct pci_dev *pdev)
> @@ -126,7 +149,8 @@ static void __init amd_iommu_setup_dom0_
>      struct amd_iommu *iommu =3D find_iommu_for_device(pdev->seg, bdf);
> =20
>      if ( likely(iommu !=3D NULL) )
> -        amd_iommu_setup_domain_device(pdev->domain, iommu, bdf);
> +        amd_iommu_setup_domain_device(pdev->domain, iommu, pdev->bus,=20=

> +                                      pdev->devfn);
>      else
>          AMD_IOMMU_DEBUG("No iommu for device %04x:%02x:%02x.%u\n",
>                          pdev->seg, pdev->bus,
> @@ -261,21 +285,26 @@ static void __init amd_iommu_dom0_init(s
>      setup_dom0_pci_devices(d, amd_iommu_setup_dom0_device);
>  }
> =20
> -static void amd_iommu_disable_domain_device(
> -    struct domain *domain, struct amd_iommu *iommu, int bdf)
> +void amd_iommu_disable_domain_device(struct domain *domain,=20
> +                                     struct amd_iommu *iommu, u8 bus, =
u8 devfn)

If you really want to do this, then ...

>  {
>      void *dte;
>      unsigned long flags;
>      int req_id;
> =20
>      BUG_ON ( iommu->dev_table.buffer =3D=3D NULL );
> -    req_id =3D get_dma_requestor_id(iommu->seg, bdf);
> +
> +    req_id =3D get_dma_requestor_id(iommu->seg, (bus << 8) | devfn);

... you want to use PCI_BDF2() here.

>      dte =3D iommu->dev_table.buffer + (req_id * IOMMU_DEV_TABLE_ENTRY_SI=
ZE);
> =20
>      spin_lock_irqsave(&iommu->lock, flags);
>      if ( is_translation_valid((u32 *)dte) )
>      {
>          disable_translation((u32 *)dte);
> +
> +        if ( pci_ats_device(iommu->seg, bus, devfn) && iommu->iotlb_supp=
ort )
> +            iommu_dte_set_iotlb((u32 *)dte, 0);
> +
>          invalidate_dev_table_entry(iommu, req_id);
>          flush_command_buffer(iommu);
>          AMD_IOMMU_DEBUG("Disable: device id =3D 0x%04x, "
> @@ -284,6 +313,12 @@ static void amd_iommu_disable_domain_dev
>                          domain_hvm_iommu(domain)->paging_mode);
>      }
>      spin_unlock_irqrestore(&iommu->lock, flags);
> +
> +    ASSERT(spin_is_locked(&pcidevs_lock));
> +
> +    if ( pci_ats_device(iommu->seg, bus, devfn) && ats_enabled &&=20

See above.

> +         pci_ats_enabled(iommu->seg, bus, devfn) )
> +       disable_ats_device(iommu->seg, bus, devfn);=20
>  }
> =20
>  static int reassign_device( struct domain *source, struct domain =
*target,
> @@ -310,7 +345,7 @@ static int reassign_device( struct domai
>          return -ENODEV;
>      }
> =20
> -    amd_iommu_disable_domain_device(source, iommu, bdf);
> +    amd_iommu_disable_domain_device(source, iommu, bus, devfn);
> =20
>      list_move(&pdev->domain_list, &target->arch.pdev_list);
>      pdev->domain =3D target;
> @@ -320,7 +355,7 @@ static int reassign_device( struct domai
>      if ( t->root_table =3D=3D NULL )
>          allocate_domain_resources(t);
> =20
> -    amd_iommu_setup_domain_device(target, iommu, bdf);
> +    amd_iommu_setup_domain_device(target, iommu, bus, devfn);
>      AMD_IOMMU_DEBUG("Re-assign %04x:%02x:%02x.%u from dom%d to =
dom%d\n",
>                      seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
>                      source->domain_id, target->domain_id);
> @@ -432,7 +467,8 @@ static int amd_iommu_add_device(struct p
>          return -ENODEV;
>      }
> =20
> -    amd_iommu_setup_domain_device(pdev->domain, iommu, bdf);
> +    amd_iommu_setup_domain_device(pdev->domain, iommu,=20
> +                                  pdev->bus, pdev->devfn);
>      return 0;
>  }
> =20
> @@ -454,7 +490,8 @@ static int amd_iommu_remove_device(struc
>          return -ENODEV;
>      }
> =20
> -    amd_iommu_disable_domain_device(pdev->domain, iommu, bdf);
> +    amd_iommu_disable_domain_device(pdev->domain, iommu,=20
> +                                    pdev->bus, pdev->devfn);
>      return 0;
>  }
> =20
> diff -r 8ec947b278af -r b84967db0efb=20
> xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
> --- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Mon Oct 24 =
18:11:40 2011 +0200
> +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Mon Oct 24 =
18:11:42 2011=20
> +0200
> @@ -75,6 +75,7 @@ void amd_iommu_set_intremap_table(
>      u32 *dte, u64 intremap_ptr, u8 int_valid);
>  void amd_iommu_set_root_page_table(
>      u32 *dte, u64 root_ptr, u16 domain_id, u8 paging_mode, u8 valid);
> +void iommu_dte_set_iotlb(u32 *dte, u8 i);
>  void invalidate_dev_table_entry(struct amd_iommu *iommu, u16 devic_id);
> =20
>  /* send cmd to iommu */


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 07:03:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 07:03:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLbPc-0006aD-Lg; Wed, 02 Nov 2011 07:03:29 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLbLS-0006BK-6G
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 06:59:12 -0700
X-Env-Sender: andres@lagarcavilla.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1320242345!1693638!1
X-Originating-IP: [208.97.132.81]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5460 invoked from network); 2 Nov 2011 13:59:06 -0000
Received: from caiajhbdcaib.dreamhost.com (HELO homiemail-a23.g.dreamhost.com)
	(208.97.132.81) by server-7.tower-182.messagelabs.com with SMTP;
	2 Nov 2011 13:59:06 -0000
Received: from homiemail-a23.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a23.g.dreamhost.com (Postfix) with ESMTP id 2F1544B0084;
	Wed,  2 Nov 2011 06:59:04 -0700 (PDT)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.com; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:mime-version
	:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.com; b=IFA+ggc22kMZt7vrc7EFAawzA6zD0BfO0b3MiEa4kA8J
	sbd0gYipZ57WNyrOCkgABGrnYeYEiktZVZrx9lOd/Xeyyc8xRCYkXjsZpJba+9Qg
	cuJ4lndvjkXIT/TYOWtPhdEn3ryJmfIS4LEPguiTYvDFU8D1h3EPYYsy//mu7tw=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.com; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:mime-version:content-type:content-transfer-encoding; s=
	lagarcavilla.com; bh=5uvJj4hImQkmDhIstzkF117CGFA=; b=j5gK+jfcZp1
	31MhyEjcBIDAdXZaV1zhFRNw9Jscy1preGs1yAtU/MDE6sr49zwSNgsKvsthzE7E
	OqppGtMJoTpAyd4RI4aXr1QBMZcQXEAfVi3HP6A870TK6vbk+JewKuuDeCKvestR
	XBmsFo2KtwUt3AXLqs3ZDmSjgGeq9Kws=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a23.g.dreamhost.com (Postfix) with ESMTPA id A23B94B007C; 
	Wed,  2 Nov 2011 06:59:03 -0700 (PDT)
Received: from 206.223.182.18 (proxying for 206.223.182.18)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP; Wed, 2 Nov 2011 06:59:04 -0700
Message-ID: <fd271c556383c8b929e9095ead91f5e7.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <20111027133622.GJ59656@ocelot.phlegethon.org>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<332775f72a3055c47c2b.1319690028@xdev.gridcentric.ca>
	<20111027133622.GJ59656@ocelot.phlegethon.org>
Date: Wed, 2 Nov 2011 06:59:04 -0700
Subject: Re: [Xen-devel] [PATCH 3 of 9] Enforce ordering constraints for the
	page alloc lock in the PoD code
From: andres@lagarcavilla.com
To: "Tim Deegan" <tim@xen.org>
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, andres@gridcentric.ca,
	keir.xen@gmail.com, Andres Lagar-Cavilla <andres@lagarcavilla.org>,
	adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi also,
> Hi,
>
> The intent of these first three patches looks good to me, but:
>
> - I think it would be better to generate generic spin-lock-with-level
>   and unlock-with-level wrapper functions rather than generating the
>   various checks and having to assemble them into lock_page_alloc() and
>   unlock_page_alloc() by hand.

The final intent is to have these macros establish ordering constraints
for the fine-grained p2m lock, which is not only "grab a spinlock".
Granted, we do not know yet whether we'll need such a fine-grained
approach, but I think it's worth keeping things separate.

As a side-note, an earlier version of my patches did enforce ordering,
except things got really hairy with mem_sharing_unshare_page (which would
jump levels up to grab shr_lock) and pod sweeps. I (think I) have
solutions for both, but I'm not ready to push those yet.

> - p2m->pod.page_alloc_unlock_level is wrong, I think; I can see that yo=
u
>   need somewhere to store the unlock-level but it shouldn't live in
>   the p2m state - it's at most a per-domain variable, so it should
>   live in the struct domain; might as well be beside the lock itself.

Ok, sure. Although I think I need to make clear that this ordering
constraint only applies within the pod code, and that's why I wanted to
keep the book-keeping within the pod struct.

Andres
> Tim.
>
> At 00:33 -0400 on 27 Oct (1319675628), Andres Lagar-Cavilla wrote:
>>  xen/arch/x86/mm/mm-locks.h |  11 +++++++++++
>>  xen/arch/x86/mm/p2m-pod.c  |  40
>> +++++++++++++++++++++++++++-------------
>>  xen/include/asm-x86/p2m.h  |   5 +++++
>>  3 files changed, 43 insertions(+), 13 deletions(-)
>>
>>
>> The page alloc lock is sometimes used in the PoD code, with an
>> explicit expectation of ordering. Use our ordering constructs in the
>> mm layer to enforce this.
>>
>> Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
>>
>> diff -r c915609e4235 -r 332775f72a30 xen/arch/x86/mm/mm-locks.h
>> --- a/xen/arch/x86/mm/mm-locks.h
>> +++ b/xen/arch/x86/mm/mm-locks.h
>> @@ -155,6 +155,17 @@ declare_mm_lock(p2m)
>>  #define p2m_unlock(p)         mm_unlock(&(p)->lock)
>>  #define p2m_locked_by_me(p)   mm_locked_by_me(&(p)->lock)
>>
>> +/* Page alloc lock (per-domain)
>> + *
>> + * This is an external lock, not represented by an mm_lock_t. However=
,
>> + * pod code uses it in conjunction with the p2m lock, and expecting
>> + * the ordering which we enforce here */
>> +
>> +declare_mm_order_constraint(page_alloc)
>> +#define page_alloc_mm_pre_lock()
>> mm_enforce_order_lock_pre_page_alloc()
>> +#define page_alloc_mm_post_lock(l)
>> mm_enforce_order_lock_post_page_alloc(&(l))
>> +#define page_alloc_mm_unlock(l)    mm_enforce_order_unlock((l))
>> +
>>  /* Paging lock (per-domain)
>>   *
>>   * For shadow pagetables, this lock protects
>> diff -r c915609e4235 -r 332775f72a30 xen/arch/x86/mm/p2m-pod.c
>> --- a/xen/arch/x86/mm/p2m-pod.c
>> +++ b/xen/arch/x86/mm/p2m-pod.c
>> @@ -45,6 +45,20 @@
>>
>>  #define superpage_aligned(_x)  (((_x)&(SUPERPAGE_PAGES-1))=3D=3D0)
>>
>> +/* Enforce lock ordering when grabbing the "external" page_alloc lock
>> */
>> +static inline void lock_page_alloc(struct p2m_domain *p2m)
>> +{
>> +    page_alloc_mm_pre_lock();
>> +    spin_lock(&(p2m->domain->page_alloc_lock));
>> +    page_alloc_mm_post_lock(p2m->pod.page_alloc_unlock_level);
>> +}
>> +
>> +static inline void unlock_page_alloc(struct p2m_domain *p2m)
>> +{
>> +    page_alloc_mm_unlock(p2m->pod.page_alloc_unlock_level);
>> +    spin_unlock(&(p2m->domain->page_alloc_lock));
>> +}
>> +
>>  /*
>>   * Populate-on-demand functionality
>>   */
>> @@ -100,7 +114,7 @@ p2m_pod_cache_add(struct p2m_domain *p2m
>>          unmap_domain_page(b);
>>      }
>>
>> -    spin_lock(&d->page_alloc_lock);
>> +    lock_page_alloc(p2m);
>>
>>      /* First, take all pages off the domain list */
>>      for(i=3D0; i < 1 << order ; i++)
>> @@ -128,7 +142,7 @@ p2m_pod_cache_add(struct p2m_domain *p2m
>>       * This may cause "zombie domains" since the page will never be
>> freed. */
>>      BUG_ON( d->arch.relmem !=3D RELMEM_not_started );
>>
>> -    spin_unlock(&d->page_alloc_lock);
>> +    unlock_page_alloc(p2m);
>>
>>      return 0;
>>  }
>> @@ -245,7 +259,7 @@ p2m_pod_set_cache_target(struct p2m_doma
>>
>>          /* Grab the lock before checking that pod.super is empty, or
>> the last
>>           * entries may disappear before we grab the lock. */
>> -        spin_lock(&d->page_alloc_lock);
>> +        lock_page_alloc(p2m);
>>
>>          if ( (p2m->pod.count - pod_target) > SUPERPAGE_PAGES
>>               && !page_list_empty(&p2m->pod.super) )
>> @@ -257,7 +271,7 @@ p2m_pod_set_cache_target(struct p2m_doma
>>
>>          ASSERT(page !=3D NULL);
>>
>> -        spin_unlock(&d->page_alloc_lock);
>> +        unlock_page_alloc(p2m);
>>
>>          /* Then free them */
>>          for ( i =3D 0 ; i < (1 << order) ; i++ )
>> @@ -378,7 +392,7 @@ p2m_pod_empty_cache(struct domain *d)
>>      BUG_ON(!d->is_dying);
>>      spin_barrier(&p2m->lock.lock);
>>
>> -    spin_lock(&d->page_alloc_lock);
>> +    lock_page_alloc(p2m);
>>
>>      while ( (page =3D page_list_remove_head(&p2m->pod.super)) )
>>      {
>> @@ -403,7 +417,7 @@ p2m_pod_empty_cache(struct domain *d)
>>
>>      BUG_ON(p2m->pod.count !=3D 0);
>>
>> -    spin_unlock(&d->page_alloc_lock);
>> +    unlock_page_alloc(p2m);
>>  }
>>
>>  int
>> @@ -417,7 +431,7 @@ p2m_pod_offline_or_broken_hit(struct pag
>>      if ( !(d =3D page_get_owner(p)) || !(p2m =3D p2m_get_hostp2m(d)) =
)
>>          return 0;
>>
>> -    spin_lock(&d->page_alloc_lock);
>> +    lock_page_alloc(p2m);
>>      bmfn =3D mfn_x(page_to_mfn(p));
>>      page_list_for_each_safe(q, tmp, &p2m->pod.super)
>>      {
>> @@ -448,12 +462,12 @@ p2m_pod_offline_or_broken_hit(struct pag
>>          }
>>      }
>>
>> -    spin_unlock(&d->page_alloc_lock);
>> +    unlock_page_alloc(p2m);
>>      return 0;
>>
>>  pod_hit:
>>      page_list_add_tail(p, &d->arch.relmem_list);
>> -    spin_unlock(&d->page_alloc_lock);
>> +    unlock_page_alloc(p2m);
>>      return 1;
>>  }
>>
>> @@ -994,7 +1008,7 @@ p2m_pod_demand_populate(struct p2m_domai
>>      if ( q =3D=3D p2m_guest && gfn > p2m->pod.max_guest )
>>          p2m->pod.max_guest =3D gfn;
>>
>> -    spin_lock(&d->page_alloc_lock);
>> +    lock_page_alloc(p2m);
>>
>>      if ( p2m->pod.count =3D=3D 0 )
>>          goto out_of_memory;
>> @@ -1008,7 +1022,7 @@ p2m_pod_demand_populate(struct p2m_domai
>>
>>      BUG_ON((mfn_x(mfn) & ((1 << order)-1)) !=3D 0);
>>
>> -    spin_unlock(&d->page_alloc_lock);
>> +    unlock_page_alloc(p2m);
>>
>>      gfn_aligned =3D (gfn >> order) << order;
>>
>> @@ -1040,7 +1054,7 @@ p2m_pod_demand_populate(struct p2m_domai
>>
>>      return 0;
>>  out_of_memory:
>> -    spin_unlock(&d->page_alloc_lock);
>> +    unlock_page_alloc(p2m);
>>
>>      printk("%s: Out of populate-on-demand memory! tot_pages %" PRIu32=
 "
>> pod_entries %" PRIi32 "\n",
>>             __func__, d->tot_pages, p2m->pod.entry_count);
>> @@ -1049,7 +1063,7 @@ out_fail:
>>      return -1;
>>  remap_and_retry:
>>      BUG_ON(order !=3D PAGE_ORDER_2M);
>> -    spin_unlock(&d->page_alloc_lock);
>> +    unlock_page_alloc(p2m);
>>
>>      /* Remap this 2-meg region in singleton chunks */
>>      gfn_aligned =3D (gfn>>order)<<order;
>> diff -r c915609e4235 -r 332775f72a30 xen/include/asm-x86/p2m.h
>> --- a/xen/include/asm-x86/p2m.h
>> +++ b/xen/include/asm-x86/p2m.h
>> @@ -270,6 +270,10 @@ struct p2m_domain {
>>       * + p2m_pod_demand_populate() grabs both; the p2m lock to avoid
>>       *   double-demand-populating of pages, the page_alloc lock to
>>       *   protect moving stuff from the PoD cache to the domain page
>> list.
>> +     *
>> +     * We enforce this lock ordering through a construct in mm-locks.=
h.
>> +     * This demands, however, that we store the previous lock-orderin=
g
>> +     * level in effect before grabbing the page_alloc lock.
>>       */
>>      struct {
>>          struct page_list_head super,   /* List of superpages
>>     */
>> @@ -279,6 +283,7 @@ struct p2m_domain {
>>          unsigned         reclaim_super; /* Last gpfn of a scan */
>>          unsigned         reclaim_single; /* Last gpfn of a scan */
>>          unsigned         max_guest;    /* gpfn of max guest
>> demand-populate */
>> +        int              page_alloc_unlock_level; /* To enforce lock
>> ordering */
>>      } pod;
>>  };
>>
>>
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com
>> http://lists.xensource.com/xen-devel
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 07:07:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 07:07:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLbTL-00070Y-4Y; Wed, 02 Nov 2011 07:07:19 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLbQW-0006j8-9B
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 07:04:25 -0700
X-Env-Sender: andres@lagarcavilla.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1320242660!45409!1
X-Originating-IP: [208.97.132.119]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10511 invoked from network); 2 Nov 2011 14:04:20 -0000
Received: from caiajhbdcbbj.dreamhost.com (HELO homiemail-a76.g.dreamhost.com)
	(208.97.132.119) by server-7.tower-174.messagelabs.com with SMTP;
	2 Nov 2011 14:04:20 -0000
Received: from homiemail-a76.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a76.g.dreamhost.com (Postfix) with ESMTP id DC9BE45807C;
	Wed,  2 Nov 2011 07:04:19 -0700 (PDT)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.com; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:mime-version
	:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.com; b=KJLCbFGQCuOGAeC4QfQxPP3xUO/dksIY7mp7Yx7hLPvY
	I0eKa4ajjPnTslVC+IzNQkMKwNJ0031QR7yP2fhWhVxiedMCyMphef5g50fgKzLg
	4NlXINRKP3InzPGKCN5WyE3teovcFzmt1m0Z6CQFFw689xJZo1GRS3KUSTV3LLI=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.com; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:mime-version:content-type:content-transfer-encoding; s=
	lagarcavilla.com; bh=b3Iopr6eb3idXTB4APTrWzQ/8Fg=; b=Wa0GUFfIRNl
	dQLfiYTUQEuM2dKIG+BGpkz5cT8OHgb376RfnAn6HvbxPeXKtJtB/iHcZNLcyJAn
	7BVTNCracC4d/hMC7JKP23xCOSYGdF2gTY55lQopunQKVJjgaTrkwRjJxs2umrfi
	aEQiNwEI2SeSkf5QZf/GN6cwtoVGfxpw=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a76.g.dreamhost.com (Postfix) with ESMTPA id 72F2745807B; 
	Wed,  2 Nov 2011 07:04:19 -0700 (PDT)
Received: from 206.223.182.18 (proxying for 206.223.182.18)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP; Wed, 2 Nov 2011 07:04:19 -0700
Message-ID: <83009a1d1d36b3ab821a9727309421aa.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <20111027135555.GK59656@ocelot.phlegethon.org>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<981073d78f7f0c92a7f5.1319690029@xdev.gridcentric.ca>
	<20111027135555.GK59656@ocelot.phlegethon.org>
Date: Wed, 2 Nov 2011 07:04:19 -0700
Subject: Re: [Xen-devel] [PATCH 4 of 9] Rework locking in the PoD layer
From: andres@lagarcavilla.com
To: "Tim Deegan" <tim@xen.org>,
 George.Dunlap@eu.citrix.com
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, andres@gridcentric.ca,
	keir.xen@gmail.com, Andres Lagar-Cavilla <andres@lagarcavilla.org>,
	adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

All righty, I'll include George from now on.

The chunk at the bottom was an irrelevant refactor. I'l repost without it

Good point on the asserts. I'll come up with some constructs that are
forwards-compatible with the fin-grained case. e.g:
(ASSERT(p2m_gfn_locked_by_me(p2m, gfn))

Andres

> At 00:33 -0400 on 27 Oct (1319675629), Andres Lagar-Cavilla wrote:
>> The PoD layer has a fragile locking discipline. It relies on the
>> p2m being globally locked, and it also relies on the page alloc
>> lock to protect some of its data structures. Replace this all by an
>> explicit pod lock: per p2m, order enforced.
>>
>> Two consequences:
>>     - Critical sections in the pod code protected by the page alloc
>>       lock are now reduced to modifications of the domain page list.
>>     - When the p2m lock becomes fine-grained, there are no
>>       assumptions broken in the PoD layer.
>>
>> Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
>
> The bulk of this looks OK to me, but will definitely need an Ack from
> George Dunlap as well.  Two comments:
>
>> diff -r 332775f72a30 -r 981073d78f7f xen/arch/x86/mm/mm-locks.h
>> --- a/xen/arch/x86/mm/mm-locks.h
>> +++ b/xen/arch/x86/mm/mm-locks.h
>> @@ -155,6 +155,15 @@ declare_mm_lock(p2m)
>>  #define p2m_unlock(p)         mm_unlock(&(p)->lock)
>>  #define p2m_locked_by_me(p)   mm_locked_by_me(&(p)->lock)
>>
>> +/* PoD lock (per-p2m-table)
>> + *
>> + * Protects private PoD data structs. */
>> +
>> +declare_mm_lock(pod)
>> +#define pod_lock(p)           mm_lock(pod, &(p)->pod.lock)
>> +#define pod_unlock(p)         mm_unlock(&(p)->pod.lock)
>> +#define pod_locked_by_me(p)   mm_locked_by_me(&(p)->pod.lock)
>
> Can the explanatory comment be more explicit about what it covers? It i=
s
> everything in the struct pod or just the page-lists that were mentioned
> in the comment you removed from p2m.h?
>
>> @@ -841,7 +854,6 @@ p2m_pod_zero_check(struct p2m_domain *p2
>>              if( *(map[i]+j) !=3D 0 )
>>                  break;
>>
>> -        unmap_domain_page(map[i]);
>>
>>          /* See comment in p2m_pod_zero_check_superpage() re gnttab
>>           * check timing.  */
>> @@ -849,8 +861,15 @@ p2m_pod_zero_check(struct p2m_domain *p2
>>          {
>>              set_p2m_entry(p2m, gfns[i], mfns[i], PAGE_ORDER_4K,
>>                  types[i], p2m->default_access);
>> +            unmap_domain_page(map[i]);
>> +            map[i] =3D NULL;
>>          }
>> -        else
>> +    }
>> +
>> +    /* Finally, add to cache */
>> +    for ( i=3D0; i < count; i++ )
>> +    {
>> +        if ( map[i] )
>>          {
>>              if ( tb_init_done )
>>              {
>> @@ -867,6 +886,8 @@ p2m_pod_zero_check(struct p2m_domain *p2
>>                  __trace_var(TRC_MEM_POD_ZERO_RECLAIM, 0, sizeof(t),
>> &t);
>>              }
>>
>> +            unmap_domain_page(map[i]);
>> +
>>              /* Add to cache, and account for the new p2m PoD entry */
>>              p2m_pod_cache_add(p2m, mfn_to_page(mfns[i]),
>> PAGE_ORDER_4K);
>>              p2m->pod.entry_count++;
>
> That seems to be reshuffling the running order of this function but I
> don't see how it's related to locking.  Is this an unrelated change
> that snuck in?
>
> (Oh, a third thing just occurred to me - might be worth making some of
> those 'lock foo held on entry' comments into ASSERT(lock_held_by_me()).=
 )
>
> Cheers,
>
> Tim.
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 07:19:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 07:19:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLbeg-0007cz-1X; Wed, 02 Nov 2011 07:19:02 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLbde-0007Pw-9A
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 07:18:07 -0700
X-Env-Sender: vase@selfip.ru
X-Msg-Ref: server-3.tower-216.messagelabs.com!1320243474!2036573!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20496 invoked from network); 2 Nov 2011 14:17:54 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-3.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 14:17:54 -0000
Received: by wwf4 with SMTP id 4so283924wwf.24
	for <xen-devel@lists.xensource.com>;
	Wed, 02 Nov 2011 07:17:54 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=selfip.ru; s=google;
	h=mime-version:sender:x-originating-ip:in-reply-to:references:from
	:date:x-google-sender-auth:message-id:subject:to:cc:content-type;
	bh=gnAtYuHptdkwWD/ZrCbudDsDakCEvUHtiLk7ilXLEWg=;
	b=DN3YAN4kC3vq7O8hGybM2B9PvuteC35wR9whPzY4APhFJBLjaMaXbWmMS/EVZb5Oih
	dEj8cVsjzFajY2btZmfTcb5+vYHRKGbhq04pvjzACf3yGYIT2NNkR7vVYKi8HSOG48a5
	EVRRuAWoyUiRnS/W1VmF5r67XKnIKQSZ3YnNs=
Received: by 10.216.186.79 with SMTP id v57mr1347741wem.72.1320243474189; Wed,
	02 Nov 2011 07:17:54 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.216.0.84 with HTTP; Wed, 2 Nov 2011 07:17:38 -0700 (PDT)
X-Originating-IP: [85.143.161.18]
In-Reply-To: <20111018151630.GB9832@router-fw-old.local.net-space.pl>
References: <20111017174036.GD29445@router-fw-old.local.net-space.pl>
	<4ffd9c88-88d2-437f-9af1-f3f0149334d9@default>
	<1318925941.16132.36.camel@zakaz.uk.xensource.com>
	<20111018151630.GB9832@router-fw-old.local.net-space.pl>
From: Vasiliy Tolstov <v.tolstov@selfip.ru>
Date: Wed, 2 Nov 2011 18:17:38 +0400
X-Google-Sender-Auth: aywW4acUuY1ydNN377ZJaRd7oJs
Message-ID: <CACaajQuZWA=F4-yX5cKXbawb1=TRFJdHqwuEy8reK2h3jcFpoA@mail.gmail.com>
Subject: Re: [Xen-devel] Strange (???) xl behavior for save,
	migrate and migrate-receive
To: Daniel Kiper <dkiper@net-space.pl>
Cc: Dan Magenheimer <dan.magenheimer@oracle.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Konrad Wilk <konrad.wilk@oracle.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	"jeremy@goop.org" <jeremy@goop.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0447566958=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0447566958==
Content-Type: multipart/alternative; boundary=0016e6542dae4bcd4c04b0c12326

--0016e6542dae4bcd4c04b0c12326
Content-Type: text/plain; charset=UTF-8

2011/10/18 Daniel Kiper <dkiper@net-space.pl>

> Guest/host administartor could allocate for given guest no more memory
> than
> maxmem (its value could be changed by xl mem-max <domain> <new_size>)
> allows,
> regardless of mechanism (ballooning or memory hotplug) used for that
> allocation.
> It means that memory hotplug does not pose any security threat in that
> area.
>

Sorry for bumping thread. Does this mean, that if i use memory=512,
maxmem=4096 grows via balloon to 4096, after that set maxmem to 8192 and
grows guest to 7000mb and do live migration - nothing bad happening and
guest migrate process successed?

-- 
Vasiliy Tolstov,
Clodo.ru
e-mail: v.tolstov@selfip.ru
jabber: vase@selfip.ru

--0016e6542dae4bcd4c04b0c12326
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<br><br><div class=3D"gmail_quote">2011/10/18 Daniel Kiper <span dir=3D"ltr=
">&lt;<a href=3D"mailto:dkiper@net-space.pl">dkiper@net-space.pl</a>&gt;</s=
pan><br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border=
-left:1px #ccc solid;padding-left:1ex;">

<div id=3D":1v4">Guest/host administartor could allocate <span class=3D"il"=
>for</span> given guest no more memory than<br>
maxmem (its value could be changed by <span class=3D"il">xl</span> mem-max =
&lt;domain&gt; &lt;new_size&gt;) allows,<br>
regardless of mechanism (ballooning or memory hotplug) used <span class=3D"=
il">for</span> that allocation.<br>
It means that memory hotplug does not pose any security threat in that area=
.</div></blockquote></div><br>Sorry for bumping thread. Does this mean, tha=
t if i use memory=3D512, maxmem=3D4096 grows via balloon to 4096, after tha=
t set maxmem to 8192 and grows guest to 7000mb and do live migration - noth=
ing bad happening and guest migrate process successed?<br clear=3D"all">

<div><br></div>-- <br><span style=3D"border-collapse:collapse;color:rgb(136=
, 136, 136);font-family:arial, sans-serif;font-size:13px"><div><div>Vasiliy=
 Tolstov,</div><div>Clodo.ru</div><div>e-mail: <a href=3D"mailto:v.tolstov@=
selfip.ru" target=3D"_blank">v.tolstov@selfip.ru</a></div>

<div>jabber: <a href=3D"mailto:vase@selfip.ru" target=3D"_blank">vase@selfi=
p.ru</a></div></div></span><br>

--0016e6542dae4bcd4c04b0c12326--


--===============0447566958==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0447566958==--


From xen-devel-bounces@lists.xensource.com Wed Nov 02 07:21:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 07:21:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLbgh-00087T-15; Wed, 02 Nov 2011 07:21:07 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLbft-0007uj-9x
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 07:20:18 -0700
X-Env-Sender: andres@lagarcavilla.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1320243610!2021140!1
X-Originating-IP: [208.97.132.81]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21296 invoked from network); 2 Nov 2011 14:20:10 -0000
Received: from caiajhbdcaib.dreamhost.com (HELO homiemail-a20.g.dreamhost.com)
	(208.97.132.81) by server-16.tower-216.messagelabs.com with SMTP;
	2 Nov 2011 14:20:10 -0000
Received: from homiemail-a20.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a20.g.dreamhost.com (Postfix) with ESMTP id 705317EC065;
	Wed,  2 Nov 2011 07:20:09 -0700 (PDT)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.com; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:mime-version
	:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.com; b=mLgX8Nt2PiFGWGrps9eqWDfZrrE3gr4rxfzSdiSIy2Dv
	BgQRzGIEWf5JMMJc8MseJk8/cAso0ov5olrxP4HMd/3kWx176v9YURs6pmkcszIb
	l+0CsA37TUqMYuQdEVZewFZ2YKKp/K3P6zj7bB9ekSNQZAU0tp0vUHDWYRORycs=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.com; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:mime-version:content-type:content-transfer-encoding; s=
	lagarcavilla.com; bh=wfWnPBMh1rowyXlHw17cPa1KlEE=; b=WR3/Az/ed1O
	L1Cf7pGSAZIyGjolqViOC7N5q7/Q/sY9pXrx7kIzpiM/kUdBOiTFYyCv0qz3PzJZ
	1P9Gwwc8p2TQ/PLV5jChOl6FQDsLKQUViUES4UgLPd4ZOaR3PiJZZI0nYstDT2u/
	LMFa8jCS0dkjtThlXLXfJJO6gVryiMYA=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a20.g.dreamhost.com (Postfix) with ESMTPA id A234A7EC063; 
	Wed,  2 Nov 2011 07:20:08 -0700 (PDT)
Received: from 206.223.182.18 (proxying for 206.223.182.18)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP; Wed, 2 Nov 2011 07:20:09 -0700
Message-ID: <69a325bb9604ffab3cd84c4951c34641.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <20111027144333.GM59656@ocelot.phlegethon.org>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<a23e1262b1240dcabfa0.1319690030@xdev.gridcentric.ca>
	<20111027144333.GM59656@ocelot.phlegethon.org>
Date: Wed, 2 Nov 2011 07:20:09 -0700
Subject: Re: [Xen-devel] [PATCH 5 of 9] Fine-grained concurrency control
	structure for the p2m
From: andres@lagarcavilla.com
To: "Tim Deegan" <tim@xen.org>
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, andres@gridcentric.ca,
	keir.xen@gmail.com, Andres Lagar-Cavilla <andres@lagarcavilla.org>,
	adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hey there,
(many inlines on this one)

> At 00:33 -0400 on 27 Oct (1319675630), Andres Lagar-Cavilla wrote:
>> Introduce a fine-grained concurrency control structure for the p2m. Th=
is
>> allows for locking 2M-aligned chunks of the p2m at a time, exclusively=
.
>> Recursive locking is allowed. Global locking of the whole p2m is also
>> allowed for certain operations. Simple deadlock detection heuristics a=
re
>> put in place.
>>
>> Note the patch creates backwards-compatible shortcuts that will lock t=
he
>> p2m globally. So it should remain functionally identical to what is
>> currently
>> in place.
>>
>> Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
>
> Wow.  What a lot of code. :)  I took a look through, but I can't
> guarantee to have got all the details.  Things I saw:
>
> - You use atomic_t for the count but only ever update it under a
>   lock. :)  If you just need to be sure of atomic writes, then
>   atomic_set will do that without using a locked increment/decrement.

I'm a bit flaky on my atomics. And paranoid. I'll be less lenient next ti=
me.

>
> - You allocate the bitmaps from xenheap - they should really be using
>   p2m memory, so as to avoid changing the memory overhead of the domain
>   as it runs.   That will involve map_domain_page()ing the bitmaps as
>   you go, but at least on x86_64 that's very cheap.

p2m_alloc_ptp? Sure.

>
> - panic() on out-of-memory is pretty rude.
>
Yeah, but unwinding all possible lock callers to handle ENOMEM was over m=
y
threshold. Reality is that on your run-of-the-mill 4GB domain you have 4
or 5 single page allocations. You have bigger problems if that fails.

> But stepping back, I'm not sure that we need all this just yet.  I thin=
k
> it would be worth doing the interface changes with a single p2m lock an=
d
> measuring how bad it is before getting stuck in to fine-grained locking
> (fun though it might be).

Completely agree. I think this will also ease adoption and bug isolation.
It'll allow me to be more gradual. I'll rework the order. Thanks, very
good.

>
> I suspect that if this is a contention point, allowing multiple readers
> will become important, especially if there are particular pages that
> often get emulated access.
>
> And also, I'd  like to get some sort of plan for handling long-lived
> foreign mappings, if only to make sure that this phase-1 fix doesn't
> conflict wih it.
>

If foreign mappings will hold a lock/ref on a p2m subrange, then they'll
disallow global operations, and you'll get a clash between log-dirty and,
say, qemu. Ka-blam live migration.

Read-only foreign mappings are only problematic insofar paging happens.
With proper p2m update/lookups serialization (global or fine-grained) tha=
t
problem is gone.

Write-able foreign mappings are trickier because of sharing and w^x. Is
there a reason left, today, to not type PGT_writable an hvm-domain's page
when a foreign mapping happens? That would solve sharing problems. w^x
really can't be solved short of putting the vcpu on a waitqueue
(preferable to me), or destroying the mapping and forcing the foreign OS
to remap later. All a few steps ahead, I hope.

Who/what's using w^x by the way? If the refcount is zero, I think I know
what I'll do ;)

That is my current "long term plan".

> Oh, one more thing:
>
>> +/* Some deadlock book-keeping. Say CPU A holds a lock on range A, CPU=
 B
>> holds a
>> + * lock on range B. Now, CPU A wants to lock range B and vice-versa.
>> Deadlock.
>> + * We detect this by remembering the start of the current locked rang=
e.
>> + * We keep a fairly small stack of guards (8), because we don't
>> anticipate
>> + * a great deal of recursive locking because (a) recursive locking is
>> rare
>> + * (b) it is evil (c) only PoD seems to do it (is PoD therefore evil?=
)
>> */
>
> If PoD could ba adjusted not to do it, could we get rid of all the
> recursive locking entirely?  That would simplify things a lot.
>

My comment is an exaggeration. In a fine-grained scenario, recursive
locking happens massively throughout the code. We just need to live with
it. I was ranting for free on the "evil" adjective.

What is a real problem is that pod sweeps can cause deadlocks. There is a
simple step to mitigate this: start the sweep from the current gfn and
never wrap around -- too bad if the gfn is too high. But this alters the
sweeping algorithm. I'll deal with it when its it's turn.

Andres
> Tim.
>
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 07:25:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 07:25:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLbkx-00006F-1Z; Wed, 02 Nov 2011 07:25:31 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLbk6-0008LN-7M
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 07:24:38 -0700
X-Env-Sender: andres@lagarcavilla.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1320243874!2683931!1
X-Originating-IP: [208.97.132.5]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21769 invoked from network); 2 Nov 2011 14:24:34 -0000
Received: from mailbigip.dreamhost.com (HELO homiemail-a20.g.dreamhost.com)
	(208.97.132.5) by server-3.tower-21.messagelabs.com with SMTP;
	2 Nov 2011 14:24:34 -0000
Received: from homiemail-a20.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a20.g.dreamhost.com (Postfix) with ESMTP id 3F30F7EC074;
	Wed,  2 Nov 2011 07:24:34 -0700 (PDT)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.com; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:mime-version
	:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.com; b=Dc3Ig7wKGo5kcdiPa64HuA7bmwQAplZ4MjjV0MGxAFKX
	zFL0seNQA2aIWkR8m5YYH3bQ9fL+wE20RJgeR5vqb8QdhT9BwdY01sJU+ljhO/uq
	Il3o+PS8kQVNe3Sg+PGYDo/iu/32Z6Y2uJQ8l7h5l5LlgEOMzqvkABZiwVt1YC4=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.com; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:mime-version:content-type:content-transfer-encoding; s=
	lagarcavilla.com; bh=CBjBU5lJjvMs8MQTCbPFlzyoveU=; b=jmdIU68CM3z
	twN8Yiw4G9+eSMfFP90/FnetCAlZZQ89+nr9rP9pQy2wxIVt8c/tUTx6rdeqkSZ4
	iEgn56j4j6mGReKNbo6hUrYa9ah/j/Z9l8gsPGYe6DLKOEqnDvHhkQkAWrBxxVx3
	3Q2dMbrEH8B5PuTqAembrGfis+oYMUlU=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a20.g.dreamhost.com (Postfix) with ESMTPA id C7DC07EC072; 
	Wed,  2 Nov 2011 07:24:33 -0700 (PDT)
Received: from 206.223.182.18 (proxying for 206.223.182.18)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP; Wed, 2 Nov 2011 07:24:34 -0700
Message-ID: <6aba1d62ce4c04d03baacb87c5453273.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <20111027145711.GN59656@ocelot.phlegethon.org>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<471d4f2754d6516d5926.1319690033@xdev.gridcentric.ca>
	<20111027145711.GN59656@ocelot.phlegethon.org>
Date: Wed, 2 Nov 2011 07:24:34 -0700
Subject: Re: [Xen-devel] [PATCH 8 of 9] Modify all internal p2m functions to
	use the new fine-grained locking
From: andres@lagarcavilla.com
To: "Tim Deegan" <tim@xen.org>
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, andres@gridcentric.ca,
	keir.xen@gmail.com, Andres Lagar-Cavilla <andres@lagarcavilla.org>,
	adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hello,
> Hi,
>
> At 00:33 -0400 on 27 Oct (1319675633), Andres Lagar-Cavilla wrote:
>> This patch only modifies code internal to the p2m, adding convenience
>> macros, etc. It will yield a compiling code base but an incorrect
>> hypervisor (external callers of queries into the p2m will not unlock).
>> Next patch takes care of external callers, split done for the benefit
>> of conciseness.
>
> Better to do it the other way round: put the enormous change-all-caller=
s
> patch first, with noop unlock functions, and then hook in the unlocks.
> That way you won't cause chaos when people try to bisect to find when a
> bug was introduced.

Indeed, excellent point.

>
>> diff -r 8a98179666de -r 471d4f2754d6 xen/include/asm-x86/p2m.h
>> --- a/xen/include/asm-x86/p2m.h
>> +++ b/xen/include/asm-x86/p2m.h
>> @@ -220,7 +220,7 @@ struct p2m_domain {
>>       * tables on every host-p2m change.  The setter of this flag
>>       * is responsible for performing the full flush before releasing
>> the
>>       * host p2m's lock. */
>> -    int                defer_nested_flush;
>> +    atomic_t           defer_nested_flush;
>>
>>      /* Pages used to construct the p2m */
>>      struct page_list_head pages;
>> @@ -298,6 +298,15 @@ struct p2m_domain *p2m_get_p2m(struct vc
>>  #define p2m_get_pagetable(p2m)  ((p2m)->phys_table)
>>
>>
>> +/* No matter what value you get out of a query, the p2m has been lock=
ed
>> for
>> + * that range. No matter what you do, you need to drop those locks.
>> + * You need to pass back the mfn obtained when locking, not the new
>> one,
>> + * as the refcount of the original mfn was bumped. */
>
> Surely the caller doesn't need to remember the old MFN for this?  After
> allm, the whole point of the lock was that nobody else could change the
> p2m entry under our feet!
>
> In any case, I thing there needs to be a big block comment a bit futher
> up that describes what all this locking and refcounting does, and why.

Comment will be added. I was being doubly-paranoid. I can undo the
get_page/put_page of the old mfn. I'm not a 100% behind it.

Andres

>
>> +void drop_p2m_gfn(struct p2m_domain *p2m, unsigned long gfn,
>> +                        unsigned long mfn);
>> +#define drop_p2m_gfn_domain(d, g, m)    \
>> +        drop_p2m_gfn(p2m_get_hostp2m((d)), (g), (m))
>> +
>>  /* Read a particular P2M table, mapping pages as we go.  Most callers
>>   * should _not_ call this directly; use the other gfn_to_mfn_*
>> functions
>>   * below unless you know you want to walk a p2m that isn't a domain's
>> @@ -327,6 +336,28 @@ static inline mfn_t gfn_to_mfn_type(stru
>>  #define gfn_to_mfn_guest(d, g, t)   gfn_to_mfn_type((d), (g), (t),
>> p2m_guest)
>>  #define gfn_to_mfn_unshare(d, g, t) gfn_to_mfn_type((d), (g), (t),
>> p2m_unshare)
>>
>> +/* This one applies to very specific situations in which you're
>> querying
>> + * a p2m entry and will be done "immediately" (such as a printk or
>> computing a
>> + * return value). Use this only if there are no expectations of the p=
2m
>> entry
>> + * holding steady. */
>> +static inline mfn_t gfn_to_mfn_type_unlocked(struct domain *d,
>> +                                        unsigned long gfn, p2m_type_t
>> *t,
>> +                                        p2m_query_t q)
>> +{
>> +    mfn_t mfn =3D gfn_to_mfn_type(d, gfn, t, q);
>> +    drop_p2m_gfn_domain(d, gfn, mfn_x(mfn));
>> +    return mfn;
>> +}
>> +
>> +#define gfn_to_mfn_unlocked(d, g, t)            \
>> +    gfn_to_mfn_type_unlocked((d), (g), (t), p2m_alloc)
>> +#define gfn_to_mfn_query_unlocked(d, g, t)    \
>> +    gfn_to_mfn_type_unlocked((d), (g), (t), p2m_query)
>> +#define gfn_to_mfn_guest_unlocked(d, g, t)    \
>> +    gfn_to_mfn_type_unlocked((d), (g), (t), p2m_guest)
>> +#define gfn_to_mfn_unshare_unlocked(d, g, t)    \
>> +    gfn_to_mfn_type_unlocked((d), (g), (t), p2m_unshare)
>> +
>
> Ugh.  This could really benefit from having the gfn_to_mfn_* functions
> take a set of flags instead of an enum.  This exponential blowup in
> interface is going too far. :)

I don't think these names are the most terrible -- we've all seen far
worse :) I mean, the naming encodes the arguments, and I don't see an
intrinsic advantage to
gfn_to_mfn(d, g, t, p2m_guest, p2m_unlocked)
over
gfn_to_mfn_guest_unlocked(d,g,t)


Andres
>
> That oughtn't to stop this interface from going in, of course, but if
> we're going to tinker with the p2m callers once, we should do it all
> together.
>
> Tim.
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 07:28:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 07:28:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLbnV-0000Vv-Vu; Wed, 02 Nov 2011 07:28:10 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLbms-0000Iw-GZ
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 07:27:30 -0700
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1320244047!48513!1
X-Originating-IP: [80.70.172.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23060 invoked from network); 2 Nov 2011 14:27:27 -0000
Received: from dgate10.ts.fujitsu.com (HELO dgate10.ts.fujitsu.com)
	(80.70.172.49)
	by server-4.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 14:27:27 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Content-Type:MIME-Version:Subject:
	X-Mercurial-Node:Message-Id:Date:From:To;
	b=YynJ6ZJxWaJNtISXVW122p/jjvrSWc4QG8dbyVnGQ1PwOhjNNHeY5Ymz
	MaDXnTtEW1JCtt7qIlugdwJYRk4LdFbJTwt+Z41RyyMlB//rQ792fnpNF
	FLQbrNnUDA6c4cIRk62kEioTltlbmV2e7q34vW5ZEhlKhC6XW6ms+b3KG
	1DZczN9D1Ko+yyUilXk+7WTJgJhAHLXY0DhjIr6Vmtzt2Jy+gaBLf6uDg
	T2Ic81PIT2iqO1ENisOSRFhLGcy7u;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1320244047; x=1351780047;
	h=mime-version:subject:message-id:date:from:to;
	bh=0Akfc6gm1P/T9TTJBn4o687cG1ER/V6xMZtArRaFyX4=;
	b=YheIlIdfob875YmyGINpbr/lDM1bZRX6Cz11mbwU2cPusXBbOU6gpb8b
	mqK0spMrQ7FibX/Eg94O22kHc6R+/+eA8qqEZSLu0Obo20qKDmjrRR4oI
	ZARt7auHxcgHMP5VM94QHPeATDNiIuiMW6oBbsqtQ+h5+sPZ7HJU9rjD4
	jl+2sOAlAhuJ3yx2qvvN/oF2c6627R8HVEA7cT77+5a+mksCTHIKkLKh3
	WtwKYTHJuO21sSiCWqYnVigvDHh/V;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,443,1315173600"; d="scan'208";a="91931011"
Received: from abgdgate40u.abg.fsc.net ([172.25.138.90])
	by dgate10u.abg.fsc.net with ESMTP; 02 Nov 2011 15:27:27 +0100
X-IronPort-AV: E=Sophos;i="4.69,443,1315173600"; d="scan'208";a="122713298"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate40u.abg.fsc.net with ESMTP; 02 Nov 2011 15:27:26 +0100
Received: from [172.17.21.25] (nehalem1.osd.mch.fsc.net [172.17.21.25])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id CDC0C9F6BD;
	Wed,  2 Nov 2011 15:27:26 +0100 (CET)
Content-Type: multipart/mixed; boundary="===============2168635720336628849=="
MIME-Version: 1.0
X-Mercurial-Node: 57044b74a69d68fee06f6da5ca27b0e3def934f8
Message-Id: <57044b74a69d68fee06f.1320243801@nehalem1>
Date: Wed, 02 Nov 2011 15:23:21 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] Correct man page of xl regarding cpu-pools
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============2168635720336628849==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

Signed-off-by: juergen.gross@ts.fujitsu.com


1 file changed, 16 insertions(+), 12 deletions(-)
docs/man/xl.pod.1 |   28 ++++++++++++++++------------



--===============2168635720336628849==
Content-Type: text/x-patch; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=xen-staging.hg.patch

# HG changeset patch
# User Juergen Gross <juergen.gross@ts.fujitsu.com>
# Date 1320243784 -3600
# Node ID 57044b74a69d68fee06f6da5ca27b0e3def934f8
# Parent  068d3d55ce6e0862e83b443d4e1c83c84b26754d
Correct man page of xl regarding cpu-pools

Signed-off-by: juergen.gross@ts.fujitsu.com

diff -r 068d3d55ce6e -r 57044b74a69d docs/man/xl.pod.1
--- a/docs/man/xl.pod.1	Tue Nov 01 19:03:38 2011 +0000
+++ b/docs/man/xl.pod.1	Wed Nov 02 15:23:04 2011 +0100
@@ -615,14 +615,17 @@ assigned at most to one cpu-pool. Domain
 assigned at most to one cpu-pool. Domains are each restricted to a single
 cpu-pool. Scheduling does not cross cpu-pool boundaries, so each cpu-pool has
 an own scheduler.
-Physical cpus and domains can be moved from one pool to another only by an
+Physical cpus and domains can be moved from one cpu-pool to another only by an
 explicit command.
+Cpu-pools can be specified either by name or by id.
 
 =over 4
 
-=item B<cpupool-create> [I<OPTIONS>] I<ConfigFile>
+=item B<cpupool-create> [I<OPTIONS>] I<ConfigFile> [I<Variable=Value> ...]
 
 Create a cpu pool based an I<ConfigFile>.
+Variable settings from the I<ConfigFile> may be altered by specifying new
+or additional assignments on the command line.
 
 B<OPTIONS>
 
@@ -638,7 +641,7 @@ Dry run - prints the resulting configura
 
 =back
 
-=item B<cpupool-list> [I<-c|--cpus> I<cpu-pool>]
+=item B<cpupool-list> [I<-c|--cpus>] [I<cpu-pool>]
 
 List CPU pools on the host.
 If I<-c> is specified, B<xl> prints a list of CPUs used by I<cpu-pool>.
@@ -646,26 +649,27 @@ If I<-c> is specified, B<xl> prints a li
 =item B<cpupool-destroy> I<cpu-pool>
 
 Deactivates a cpu pool.
+This is possible only if no domain is active in the cpu-pool.
 
 =item B<cpupool-rename> I<cpu-pool> <newname>
 
-Renames a cpu pool to I<newname>.
+Renames a cpu-pool to I<newname>.
 
-=item B<cpupool-cpu-add> I<cpu-pool> I<cpu-nr|node-nr>
+=item B<cpupool-cpu-add> I<cpu-pool> I<cpu-nr|node:node-nr>
 
-Adds a cpu or a numa node to a cpu pool.
+Adds a cpu or all cpus of a numa node to a cpu-pool.
 
-=item B<cpupool-cpu-remove> I<cpu-nr|node-nr>
+=item B<cpupool-cpu-remove> I<cpu-nr|node:node-nr>
 
-Removes a cpu or a numa node from a cpu pool.
+Removes a cpu or all cpus of a numa node from a cpu-pool.
 
-=item B<cpupool-migrate> I<domain-id> I<cpu-pool>
+=item B<cpupool-migrate> I<domain> I<cpu-pool>
 
-Moves a domain into a cpu pool.
+Moves a domain specified by domain-id or domain-name into a cpu-pool.
 
 =item B<cpupool-numa-split>
 
-Splits up the machine into one cpu pool per numa node.
+Splits up the machine into one cpu-pool per numa node.
 
 =back
 
@@ -791,7 +795,7 @@ List pass-through pci devices for a doma
 
 =head1 SEE ALSO
 
-B<xldomain.cfg>(5), B<xentop>(1)
+B<xldomain.cfg>(5), B<xlcpupool.cfg>(5), B<xentop>(1)
 
 =head1 AUTHOR
 

--===============2168635720336628849==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============2168635720336628849==--


From xen-devel-bounces@lists.xensource.com Wed Nov 02 07:33:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 07:33:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLbsj-00011A-PP; Wed, 02 Nov 2011 07:33:33 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLbsB-0000nS-VC
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 07:33:00 -0700
X-Env-Sender: andres@lagarcavilla.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1320244376!1683227!1
X-Originating-IP: [208.97.132.145]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26380 invoked from network); 2 Nov 2011 14:32:56 -0000
Received: from caiajhbdcbef.dreamhost.com (HELO homiemail-a19.g.dreamhost.com)
	(208.97.132.145) by server-14.tower-182.messagelabs.com with SMTP;
	2 Nov 2011 14:32:56 -0000
Received: from homiemail-a19.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a19.g.dreamhost.com (Postfix) with ESMTP id DEF06604079;
	Wed,  2 Nov 2011 07:32:55 -0700 (PDT)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.com; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:mime-version
	:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.com; b=pCOCfsmykj9s+QRmpGMIBmc+NGNv6AaYMUukdpxA70Se
	g30kvo6CCEhdaPFDrVSGdqloCiDBGbJSZQU4j2qYkd3xCDvCUbe7gjH6+aKv5683
	MPpITj8+BivdTle7gWUnvLpYG83aBu9MqnmBMq/Qbnge2CgjmHvYBZa63YjMNl4=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.com; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:mime-version:content-type:content-transfer-encoding; s=
	lagarcavilla.com; bh=dMipiz3MyORwvZ4Ekrvt5HfYmVw=; b=QQiVlbvk9nr
	YTC0rhoRZJp3XR1RmF0uMUunKIYcjjPZTOT9oyEG4+glUVNrbnwrmkajYBITEomn
	dKjWRWrzeqH84IthntvmZAi9rQlszDRhexCc9WJoTYNxP9GyaIfPsp8y5uMCEke1
	Ht+TtoOEj6iJcdyjY0ski8zXHJxmP7bE=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a19.g.dreamhost.com (Postfix) with ESMTPA id 70E85604076; 
	Wed,  2 Nov 2011 07:32:55 -0700 (PDT)
Received: from 206.223.182.18 (proxying for 206.223.182.18)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP; Wed, 2 Nov 2011 07:32:55 -0700
Message-ID: <2edecee6fa102acb9973b1ef1e71a65d.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <20111027150207.GO59656@ocelot.phlegethon.org>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<d13f91c2fe18d58ad27f.1319690034@xdev.gridcentric.ca>
	<20111027150207.GO59656@ocelot.phlegethon.org>
Date: Wed, 2 Nov 2011 07:32:55 -0700
Subject: Re: [Xen-devel] [PATCH 9 of 9] Modify all call sites of queries into
	the p2m to use the new fine-grained locking
From: andres@lagarcavilla.com
To: "Tim Deegan" <tim@xen.org>
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, andres@gridcentric.ca,
	keir.xen@gmail.com, Andres Lagar-Cavilla <andres@lagarcavilla.org>,
	adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

I don't know that a massive sed on all these names is a good idea. I gues=
s
forcing everyone to compile-fail will also make them realize they need to
add a call to drop the p2m locks they got...

Can you elaborate on the naming preferences here: would you prefer
gfn_to_mfn/put_gfn? get_p2m_gfn/put_p2m_gfn? get_gfn/put_gfn

Andres

> At 00:33 -0400 on 27 Oct (1319675634), Andres Lagar-Cavilla wrote:
>>  28 files changed, 519 insertions(+), 101 deletions(-)
>
> And I thought patch 5 was big :)
>
> I'm not going to read the detail of this this time around - I'd like to
> only have to review it once. :)
>
> I wonder whether it would be worth changing the name/signature of the
> generic p2m functions in an incompatime way while we're there.  It woul=
d
> have three advantages:
>
>  - allow the lookup/drop pairs to have nice matching names
>  - get rid of the confusingly-named 'gmfn_to_mfn' function
>  - avoid later bugs if patches are forward-ported across this chaneg
>    that add p2m lookups (but not corresoponding drops)
>
> Tim.
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 07:45:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 07:45:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLc4L-0001q1-L7; Wed, 02 Nov 2011 07:45:33 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLc3e-0001dW-4V
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 07:44:50 -0700
X-Env-Sender: andres@lagarcavilla.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1320245086!2041928!1
X-Originating-IP: [208.97.132.66]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5913 invoked from network); 2 Nov 2011 14:44:46 -0000
Received: from caiajhbdcagg.dreamhost.com (HELO homiemail-a15.g.dreamhost.com)
	(208.97.132.66) by server-15.tower-216.messagelabs.com with SMTP;
	2 Nov 2011 14:44:46 -0000
Received: from homiemail-a15.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a15.g.dreamhost.com (Postfix) with ESMTP id CE64376C073;
	Wed,  2 Nov 2011 07:44:45 -0700 (PDT)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.com; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:mime-version
	:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.com; b=TxcfvXTJCHMDD7LEtci7Vo5Ue5LRcAZ9HOTYR1ykER6R
	83kGH6sTgKXGJdE1Gryv7ni2aNAFJaUs4/Gc9hmPQtPmtycY268sPO1JrQcKEQ/s
	kGXoKwHcvEj3qRmsSVd9o3BjFUTIUIxc85tRnOhRQi++EQPnKsxej6IFPOAdV64=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.com; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:mime-version:content-type:content-transfer-encoding; s=
	lagarcavilla.com; bh=v1R+WO46sbdkfbcdFLAJ1NcdSZY=; b=Vtekasea27S
	gtpWCNi6pmknHq418kDADyblIy5vzZM6HsPm/6NruG41AhxL9Bs9fd2CfOBsD0oV
	xheM4jb4xj1ADnnDTB58qxR+6WtZrMoiIJYWN9AqeUsOYvqplBqc5J9I/CMUa2An
	rzCLFXkeBccIrwwnAkkr6FUbRstvTP24=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a15.g.dreamhost.com (Postfix) with ESMTPA id 8D68576C072; 
	Wed,  2 Nov 2011 07:44:45 -0700 (PDT)
Received: from 206.223.182.18 (proxying for 206.223.182.18)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP; Wed, 2 Nov 2011 07:44:45 -0700
Message-ID: <00c61c467ccb4627968d152cd3a2c34a.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <20111101124941.583FA72C415@homiemail-mx8.g.dreamhost.com>
References: <20111101124941.583FA72C415@homiemail-mx8.g.dreamhost.com>
Date: Wed, 2 Nov 2011 07:44:45 -0700
From: andres@lagarcavilla.com
To: xen-devel@lists.xensource.com
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: hongkaixing@huawei.com
Subject: [Xen-devel] Re: xenpaing: one way to avoid paging out the page,
 when the corresponding mfn is in use.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Page_info structs are carefully laid out to occupy 64 bytes (I think -- o=
r
some other power of two cache-line-friendly thing).

Were you thinking of this new field to be part of a union? which one?
Otherwise you change the size of page_info and hell breaks loose.

The RFC patches I posted a week ago (which are not ready for primetime)
try to ensure serialization of lookups and modification of p2m entries.
That should solve the issue of paging a foreign-mapped page.

Actually the patches attempt to achieve what you state ("When the page
(mfn) is accessed by gfn_to_mfn(), this page should never be paged out
until the mapping action is end"). And hopefully in a much more general
way.

So, stay posted...

Andres

> Date: Tue, 01 Nov 2011 12:23:37 +0000
> From: Hongkaixing <hongkaixing@huawei.com>
> Subject: [Xen-devel] xenpaing: one way to avoid paging out the page,
> 	when the corresponding mfn is in use.
> To: "olaf@aepfle.de" <olaf@aepfle.de>
> Cc: YangXiaowei <xiaowei.yang@huawei.com>,
> 	"Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,	"Eric
> 	Li\(Zhentao\)" <lizhentao@huawei.com>,	Yanqiangjun
> 	<yanqiangjun@huawei.com>, hanweidong <hanweidong@huawei.com>
> Message-ID:
> 	<E0AF011477D2AE458DC8801E0E570709014C0556@szxeml528-mbs.china.huawei.c=
om>
>
> Content-Type: text/plain; charset=3DWindows-1252
>
> Hello,
>
>    Recently many advanced memory mechanisms are introduced into Xen. On=
e
> problem we found is the conflict between p2m query and setting.
>    For example, backend drivers always map domU=92s page to its own spa=
ce,
> during the mapping procedure, situations as follow may happen,
> when mfn is obtained by gfn_to_mfn(), this mfn is likely to be paged ou=
t.
>
> first case:
>    grant mapping                      xenpaing
>   mfn =3D gfn_to_mfn();
>                        <-----------  p2m_paging_nominate()
>          |                                         |
>      Check type ok                     paged out;
>          |
>      try to map
> What we want is:
> When the page (mfn) is accessed by gfn_to_mfn(), this page should never=
 be
> paged out until the mapping action is end.
>
> second case:
>    grant mapping                            xenpaing
>                                          p2m_paging_nominate()
>
>                                                  gfn_to_mfn();
>   mfn =3D gfn_to_mfn();  ------------->     |
>                                              check type ok
>          |                                               |
>      Check type ok                     paged out;
>          |
>      try to map
> What we want is:
> When the gfn_to_mfn() action happens during paging nomination, the
> nomination should abort immediately.
>
> Our solution prototype is like this :
> 1. Introduce a new member named last_access in page_info struct to save
> the last access time and access tag.
> 2. when the mfn is obtained through gfn_to_mfn(), we save time stamp an=
d
> access tag in the page_info.
> 3. Paging nominate procedure use access information as a criterion.
>
> How it works?
> 1.Using time stamp to avoid case 1. When the mfn is obtained by mapping
> process,
>    the time stamp can prevent the page from being selected by paging .
> 2.Using access tag to avoid case 2. During the paging nomination, if th=
e
> access tag of page is detected,
>    paging should skip selecting this page.
>
> The pseudo-code of step 3 can be written as follow:
> int p2m_mem_paging_nominate(struct domain *d, unsigned long gfn)
> {
>
>     mfn =3D gfn_to_mfn_noreference(d, gfn, &p2mt);   -----> avoid savin=
g
> timestamp and access tag
>
>     if ( !mfn_valid(mfn) )
>         goto out;
>
>     clear_access_tag();   ----------> clear the access tag of this page
>     if (test_page_hot())
>        goto out;           ------> if the page is accessed recently, go=
 to
> out
>     ........
>
>     set_p2m_entry(d, gfn, mfn, 0, p2m_ram_paging_out);
>     if ( test_access_tag ( mfn ) )
>         goto out;  --------> if access tag is set, the gfn_to_mfn must
> have happened above, abort anyway.
>     ret =3D 0;
>  out:
>     p2m_unlock(d->arch.p2m);
>     return ret;
> }
>    Maybe this is an imperfect prototype, do you have any good ideas?
>
>   Hong Kaixing
>
>
>
> ------------------------------
>
> Message: 4
> Date: Tue, 01 Nov 2011 13:47:15 +0100
> From: Tobias Heinlein <heinlein@okit.de>
> Subject: Re: [Xen-devel] Re: Xen dom0 linux kernel 3.1 boot failure
> 	ptwr_emulate: could not get_page_from_l1e
> To: xen-devel@lists.xensource.com
> Cc: 2013pfoley@tjhsst.edu
> Message-ID: <4EAFEA53.7070009@okit.de>
> Content-Type: text/plain; charset=3D"iso-8859-1"
>
> I'm not sure if it was obvious, but yesterday I noticed that setting th=
e
> "MPS table mode" to 'Disabled' actually made SMP stop working, i.e. the
> kernel only recognized a single CPU. This is of course not an option, s=
o
> I enabled (set to 'Full Table APIC') the setting again and played aroun=
d
> with my kernel config a bit. The kernel that crashed had
> CONFIG_X86_MPPARSE=3Dy, and if I disable that, it boots fine (with SMP,
> and with the BIOS setting set to 'Full Table APIC').
>
> So, I for one am quite happy now as I finally found a working
> configuration. But I'd still like to know if this is a hardware-specifi=
c
> issue, and/or a bug in Xen.
>
> Konrad Rzeszutek Wilk wrote, on 10/31/2011 03:08 PM:
>> Oh nice. What does you /proc/interrupts look like compared to
>> baremetal?
>
> While I was performing all my kernel tests, I saved the outputs of
> `dmesg` and `cat /proc/interrupts`. Sorry for attaching a tarball, but
> I'd like to give you as much information as possible. You'll probably
> only need the latest tests (#5 to #7), but just in case, I also include=
d
> the others.
>
> Contents of the tarball:
>
> Baremetal tests:
> xen-hp/1/: MPS mode 'Full Table APIC', CONFIG_X86_MPPARSE=3Dy, SMP work=
ing
> xen-hp/2/: MPS mode 'Full Table APIC', CONFIG_X86_MPPARSE=3Dn, SMP work=
ing
> xen-hp/3/: MPS mode 'Disabled', CONFIG_X86_MPPARSE=3Dy, SMP not working
> xen-hp/4/: MPS mode 'Disabled', CONFIG_X86_MPPARSE=3Dn, SMP not working
>
> Xen tests:
> xen-hp/5/: MPS mode 'Disabled', CONFIG_X86_MPPARSE=3Dn, SMP not working
> xen-hp/6/: MPS mode 'Full Table APIC', CONFIG_X86_MPPARSE=3Dn, SMP work=
ing
> xen-hp/7/: MPS mode 'Full Table APIC', CONFIG_X86_MPPARSE=3Dy, CRASHES
>
> (Therefore, #6 is the best working solution; #7 is what originally
> triggered the crash.)
>
> Thanks.
>
> -------------- next part --------------
> A non-text attachment was scrubbed...
> Name: xen-hp.tar.bz2
> Type: application/x-bzip
> Size: 97821 bytes
> Desc: not available
> Url :
> http://lists.xensource.com/archives/html/xen-devel/attachments/20111101=
/4f96b9e7/xen-hp.tar.bin
>
> ------------------------------
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>
>
> End of Xen-devel Digest, Vol 81, Issue 2
> ****************************************
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 07:47:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 07:47:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLc5y-0002LF-18; Wed, 02 Nov 2011 07:47:14 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLc5M-000275-Um
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 07:46:37 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-11.tower-27.messagelabs.com!1320245180!44130743!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9125 invoked from network); 2 Nov 2011 14:46:21 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-11.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 2 Nov 2011 14:46:21 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320245193; l=3253;
	s=domk; d=aepfle.de;
	h=Cc:To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=qV5FdYit9UzJab4NSAC75Eslg5k=;
	b=YeF5Onq2urQgrnzYH8ZauiW/4L3xOT3HTtY0zNRBg4E3GJ5H5++7l+OxXhYwvqrhZgb
	yp5ML5Ba2u0qWQx1EE8NT5mqvvJfY+3iLQxVFsKMfoZ/8b1+q1m/9hGLajbeNHpNVyki6
	ADJjW0bdBnRFYQ2820c7g8922ql11WDRkHU=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV71Y=
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-5.vodafone-net.de [80.226.24.5])
	by smtp.strato.de (klopstock mo58) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id p06d34nA2EXi6H ;
	Wed, 2 Nov 2011 15:46:19 +0100 (MET)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id CD7C718639;
	Wed,  2 Nov 2011 15:46:16 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 434f0b4da9148b101e184e0108be6c31f67038f4
Message-Id: <434f0b4da9148b101e18.1320245138@probook.site>
In-Reply-To: <patchbomb.1320245136@probook.site>
References: <patchbomb.1320245136@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Wed, 02 Nov 2011 15:45:38 +0100
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Cc: George.Dunlap@eu.citrix.com, Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH 2 of 4] xenpaging: watch the guests
 memory/target-tot_pages xenstore value
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1320244383 -3600
# Node ID 434f0b4da9148b101e184e0108be6c31f67038f4
# Parent  0d872bf1203dd36200477f688908797875035b50
xenpaging: watch the guests memory/target-tot_pages xenstore value

Subsequent patches will use xenstored to store the numbers of pages
xenpaging is suppose to page-out.
Remove num_pages and use target_pages instead.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 0d872bf1203d -r 434f0b4da914 tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -19,8 +19,10 @@
  */
 
 #define _XOPEN_SOURCE	600
+#define _GNU_SOURCE
 
 #include <inttypes.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <stdarg.h>
 #include <time.h>
@@ -35,6 +37,10 @@
 #include "policy.h"
 #include "xenpaging.h"
 
+/* Defines number of mfns a guest should use at a time, in KiB */
+#define WATCH_TARGETPAGES "memory/target-tot_pages"
+static char *watch_target_tot_pages;
+static char *dom_path;
 static char watch_token[16];
 static char filename[80];
 static int interrupted;
@@ -72,7 +78,7 @@ static int xenpaging_wait_for_event_or_t
 {
     xc_interface *xch = paging->xc_handle;
     xc_evtchn *xce = paging->mem_event.xce_handle;
-    char **vec;
+    char **vec, *val;
     unsigned int num;
     struct pollfd fd[2];
     int port;
@@ -111,6 +117,25 @@ static int xenpaging_wait_for_event_or_t
                     rc = 0;
                 }
             }
+            else if ( strcmp(vec[XS_WATCH_PATH], watch_target_tot_pages) == 0 )
+            {
+                int ret, target_tot_pages;
+                val = xs_read(paging->xs_handle, XBT_NULL, vec[XS_WATCH_PATH], NULL);
+                if ( val )
+                {
+                    ret = sscanf(val, "%d", &target_tot_pages);
+                    if ( ret > 0 )
+                    {
+                        /* KiB to pages */
+                        target_tot_pages >>= 2;
+                        if ( target_tot_pages < 0 || target_tot_pages > paging->max_pages )
+                            target_tot_pages = paging->max_pages;
+                        paging->target_tot_pages = target_tot_pages;
+                        DPRINTF("new target_tot_pages %d\n", target_tot_pages);
+                    }
+                    free(val);
+                }
+            }
             free(vec);
         }
     }
@@ -216,6 +241,25 @@ static xenpaging_t *xenpaging_init(domid
         goto err;
     }
 
+    /* Watch xenpagings working target */
+    dom_path = xs_get_domain_path(paging->xs_handle, domain_id);
+    if ( !dom_path )
+    {
+        PERROR("Could not find domain path\n");
+        goto err;
+    }
+    if ( asprintf(&watch_target_tot_pages, "%s/%s", dom_path, WATCH_TARGETPAGES) < 0 )
+    {
+        PERROR("Could not alloc watch path\n");
+        goto err;
+    }
+    DPRINTF("watching '%s'\n", watch_target_tot_pages);
+    if ( xs_watch(paging->xs_handle, watch_target_tot_pages, "") == false )
+    {
+        PERROR("Could not bind to xenpaging watch\n");
+        goto err;
+    }
+
     p = getenv("XENPAGING_POLICY_MRU_SIZE");
     if ( p && *p )
     {
@@ -342,6 +386,8 @@ static xenpaging_t *xenpaging_init(domid
             free(paging->mem_event.ring_page);
         }
 
+        free(dom_path);
+        free(watch_target_tot_pages);
         free(paging->bitmap);
         free(paging);
     }
@@ -357,6 +403,9 @@ static int xenpaging_teardown(xenpaging_
     if ( paging == NULL )
         return 0;
 
+    xs_unwatch(paging->xs_handle, watch_target_tot_pages, "");
+    xs_unwatch(paging->xs_handle, "@releaseDomain", watch_token);
+
     xch = paging->xc_handle;
     paging->xc_handle = NULL;
     /* Tear down domain paging in Xen */

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 07:48:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 07:48:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLc6s-0002il-Hq; Wed, 02 Nov 2011 07:48:10 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLc5P-00027Q-OM
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 07:46:40 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-12.tower-21.messagelabs.com!1320245196!2638884!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31586 invoked from network); 2 Nov 2011 14:46:36 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-12.tower-21.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 2 Nov 2011 14:46:36 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320245196; l=5383;
	s=domk; d=aepfle.de;
	h=Cc:To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=+H0AO3gGvHunox/tbAeomT8Ctg4=;
	b=HOQujHROrYFaLiMzMND1RK2v8P5zt8tuRgXDHbhzlxCfCkm9yy7vN3fGALtFHpbegWh
	ztfpUad86p0ff37mumft/9yL2FXeAKxLh868ImfQcLBrxSny+FJEdR+teeJ1BVTIVo936
	x+LUuEn5mrPP6jevxHmc9qIZW4D9c5Jyyo0=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV71Y=
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-5.vodafone-net.de [80.226.24.5])
	by smtp.strato.de (fruni mo12) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id N02af3nA2E4Cv0 ;
	Wed, 2 Nov 2011 15:46:19 +0100 (MET)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 3887218638;
	Wed,  2 Nov 2011 15:46:16 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 0d872bf1203dd36200477f688908797875035b50
Message-Id: <0d872bf1203dd3620047.1320245137@probook.site>
In-Reply-To: <patchbomb.1320245136@probook.site>
References: <patchbomb.1320245136@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Wed, 02 Nov 2011 15:45:37 +0100
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Cc: George.Dunlap@eu.citrix.com, Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH 1 of 4] xenpaging: use guests tot_pages as
	working target
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1320244382 -3600
# Node ID 0d872bf1203dd36200477f688908797875035b50
# Parent  f057eb06706e2bacaadb41cf80fa45001e786e69
xenpaging: use guests tot_pages as working target

This change reverses the task of xenpaging. Before this change a fixed number
of pages was paged out. With this change the guest will not have access to
more than the given number of pages at the same time.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r f057eb06706e -r 0d872bf1203d tools/xenpaging/policy_default.c
--- a/tools/xenpaging/policy_default.c
+++ b/tools/xenpaging/policy_default.c
@@ -71,7 +71,6 @@ int policy_init(xenpaging_t *paging)
 
     /* Start in the middle to avoid paging during BIOS startup */
     current_gfn = max_pages / 2;
-    current_gfn -= paging->num_pages / 2;
 
     rc = 0;
  out:
diff -r f057eb06706e -r 0d872bf1203d tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -136,6 +136,21 @@ err:
     return rc;
 }
 
+static int xenpaging_get_tot_pages(xenpaging_t *paging)
+{
+    xc_interface *xch = paging->xc_handle;
+    xc_domaininfo_t domain_info;
+    int rc;
+
+    rc = xc_domain_getinfolist(xch, paging->mem_event.domain_id, 1, &domain_info);
+    if ( rc != 1 )
+    {
+        PERROR("Error getting domain info");
+        return -1;
+    }
+    return domain_info.tot_pages;
+}
+
 static void *init_page(void)
 {
     void *buffer;
@@ -161,7 +176,7 @@ static void *init_page(void)
     return NULL;
 }
 
-static xenpaging_t *xenpaging_init(domid_t domain_id, int num_pages)
+static xenpaging_t *xenpaging_init(domid_t domain_id, int target_tot_pages)
 {
     xenpaging_t *paging;
     xc_domaininfo_t domain_info;
@@ -296,12 +311,7 @@ static xenpaging_t *xenpaging_init(domid
     }
     DPRINTF("max_pages = %d\n", paging->max_pages);
 
-    if ( num_pages < 0 || num_pages > paging->max_pages )
-    {
-        num_pages = paging->max_pages;
-        DPRINTF("setting num_pages to %d\n", num_pages);
-    }
-    paging->num_pages = num_pages;
+    paging->target_tot_pages = target_tot_pages;
 
     /* Initialise policy */
     rc = policy_init(paging);
@@ -648,7 +658,9 @@ int main(int argc, char *argv[])
     xenpaging_victim_t *victims;
     mem_event_request_t req;
     mem_event_response_t rsp;
+    int num, prev_num = 0;
     int i;
+    int tot_pages;
     int rc = -1;
     int rc1;
     xc_interface *xch;
@@ -659,7 +671,7 @@ int main(int argc, char *argv[])
 
     if ( argc != 3 )
     {
-        fprintf(stderr, "Usage: %s <domain_id> <num_pages>\n", argv[0]);
+        fprintf(stderr, "Usage: %s <domain_id> <tot_pages>\n", argv[0]);
         return -1;
     }
 
@@ -672,7 +684,7 @@ int main(int argc, char *argv[])
     }
     xch = paging->xc_handle;
 
-    DPRINTF("starting %s %u %d\n", argv[0], paging->mem_event.domain_id, paging->num_pages);
+    DPRINTF("starting %s %u %d\n", argv[0], paging->mem_event.domain_id, paging->target_tot_pages);
 
     /* Open file */
     sprintf(filename, "page_cache_%u", paging->mem_event.domain_id);
@@ -704,9 +716,6 @@ int main(int argc, char *argv[])
     /* listen for page-in events to stop pager */
     create_page_in_thread(paging);
 
-    i = evict_pages(paging, fd, victims, paging->num_pages);
-    DPRINTF("%d pages evicted. Done.\n", i);
-
     /* Swap pages in and out */
     while ( 1 )
     {
@@ -771,12 +780,8 @@ int main(int argc, char *argv[])
                     goto out;
                 }
 
-                /* Evict a new page to replace the one we just paged in,
-                 * or clear this pagefile slot on exit */
-                if ( interrupted )
-                    victims[i].gfn = INVALID_MFN;
-                else
-                    evict_victim(paging, &victims[i], fd, i);
+                /* Clear this pagefile slot */
+                victims[i].gfn = INVALID_MFN;
             }
             else
             {
@@ -823,6 +828,43 @@ int main(int argc, char *argv[])
         if ( interrupted )
             break;
 
+        /* Check if the target has been reached already */
+        tot_pages = xenpaging_get_tot_pages(paging);
+        if ( tot_pages < 0 )
+            goto out;
+
+        /* Resume all pages if paging is disabled or no target was set */
+        if ( paging->target_tot_pages == 0 )
+        {
+            if ( paging->num_paged_out )
+                resume_pages(paging, paging->num_paged_out);
+        }
+        /* Evict more pages if target not reached */
+        else if ( tot_pages > paging->target_tot_pages )
+        {
+            num = tot_pages - paging->target_tot_pages;
+            if ( num != prev_num )
+            {
+                DPRINTF("Need to evict %d pages to reach %d target_tot_pages\n", num, paging->target_tot_pages);
+                prev_num = num;
+            }
+            /* Limit the number of evicts to be able to process page-in requests */
+            if ( num > 42 )
+                num = 42;
+            evict_pages(paging, fd, victims, num);
+        }
+        /* Resume some pages if target not reached */
+        else if ( tot_pages < paging->target_tot_pages && paging->num_paged_out )
+        {
+            num = paging->target_tot_pages - tot_pages;
+            if ( num != prev_num )
+            {
+                DPRINTF("Need to resume %d pages to reach %d target_tot_pages\n", num, paging->target_tot_pages);
+                prev_num = num;
+            }
+            resume_pages(paging, num);
+        }
+
     }
     DPRINTF("xenpaging got signal %d\n", interrupted);
 
diff -r f057eb06706e -r 0d872bf1203d tools/xenpaging/xenpaging.h
--- a/tools/xenpaging/xenpaging.h
+++ b/tools/xenpaging/xenpaging.h
@@ -50,7 +50,7 @@ typedef struct xenpaging {
     /* number of pages for which data structures were allocated */
     int max_pages;
     int num_paged_out;
-    int num_pages;
+    int target_tot_pages;
     int policy_mru_size;
     unsigned long pagein_queue[XENPAGING_PAGEIN_QUEUE_SIZE];
 } xenpaging_t;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 07:48:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 07:48:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLc7d-00035m-VR; Wed, 02 Nov 2011 07:48:58 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLc5P-00027R-Vc
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 07:46:40 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320245164!44394847!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2642 invoked from network); 2 Nov 2011 14:46:04 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 2 Nov 2011 14:46:04 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320245196; l=13214;
	s=domk; d=aepfle.de;
	h=Cc:To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=7/sZOlfDdFQveNIyfNGfRydF5c0=;
	b=HPnMkB5vvQmXxZH23OKyEz/hyVqd/BE266m2EW1XS7siVHnZSKmWyC0S6EgR6JqAr58
	Fem6PpqaOf/orr2AVILUeAC4TdIO4e5lEi3LPSJfwRCKx7inTvu0oE3crQRmrytvPNVQj
	Ufn5euGnN6mXk4xDjkMjgrO7DAjV8LD/xGo=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV71Y=
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-5.vodafone-net.de [80.226.24.5])
	by smtp.strato.de (cohen mo22) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id R060dfnA2Dh08i ;
	Wed, 2 Nov 2011 15:46:22 +0100 (MET)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id A42EB1863B;
	Wed,  2 Nov 2011 15:46:17 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: ab5406a5b1d01e3828f0dcd833f99b70e4fbad72
Message-Id: <ab5406a5b1d01e3828f0.1320245140@probook.site>
In-Reply-To: <patchbomb.1320245136@probook.site>
References: <patchbomb.1320245136@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Wed, 02 Nov 2011 15:45:40 +0100
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Cc: George.Dunlap@eu.citrix.com, Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH 4 of 4] xenpaging: initial libxl support
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1320244864 -3600
# Node ID ab5406a5b1d01e3828f0dcd833f99b70e4fbad72
# Parent  a51d4fab351d2d1a38b82cbd7ad925f76fce9e9a
xenpaging: initial libxl support

Add initial support to libxl for starting xenpaging.

The patch adds three new config options:
actmem=<int>, the amount of memory in MiB for the guest
xenpaging_file=<string>, pagefile to use (optional)
xenpaging_extra=[ 'string', 'string' ], additional args for xenpaging (optional)

If 'actmem=' is not specified in config file, xenpaging will not start.
If 'xenpaging_file=' is not specified in config file,
/var/lib/xen/xenpaging/<domain_name>.<domaind_id>.paging is used.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r a51d4fab351d -r ab5406a5b1d0 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -261,6 +261,7 @@ int libxl_init_dm_info(libxl_ctx *ctx,
 typedef int (*libxl_console_ready)(libxl_ctx *ctx, uint32_t domid, void *priv);
 int libxl_domain_create_new(libxl_ctx *ctx, libxl_domain_config *d_config, libxl_console_ready cb, void *priv, uint32_t *domid);
 int libxl_domain_create_restore(libxl_ctx *ctx, libxl_domain_config *d_config, libxl_console_ready cb, void *priv, uint32_t *domid, int restore_fd);
+int libxl__create_xenpaging(libxl_ctx *ctx, libxl_domain_config *d_config, uint32_t domid, char *path);
 void libxl_domain_config_destroy(libxl_domain_config *d_config);
 int libxl_domain_suspend(libxl_ctx *ctx, libxl_domain_suspend_info *info,
                           uint32_t domid, int fd);
diff -r a51d4fab351d -r ab5406a5b1d0 tools/libxl/libxl_create.c
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -429,6 +429,122 @@ retry_transaction:
     return rc;
 }
 
+static int create_xenpaging(libxl__gc *gc, char *dom_name, uint32_t domid,
+                            libxl_domain_build_info *b_info)
+{
+    libxl__spawner_starting *buf_starting;
+    libxl_string_list xpe = b_info->u.hvm.xenpaging_extra;
+    int i, rc;
+    char *logfile;
+    int logfile_w, null;
+    char *path, *dom_path, *value;
+    char **args;
+    char *xp;
+    flexarray_t *xp_args;
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+
+    /* Nothing to do */
+    if (!b_info->tot_memkb)
+        return 0;
+
+    /* Check if paging is already enabled */
+    dom_path = libxl__xs_get_dompath(gc, domid);
+    if (!dom_path ) {
+        rc = ERROR_NOMEM;
+        goto out;
+    }
+    path = libxl__sprintf(gc, "%s/xenpaging/state", dom_path);
+    if (!path ) {
+        rc = ERROR_NOMEM;
+        goto out;
+    }
+    value = xs_read(ctx->xsh, XBT_NULL, path, NULL);
+    rc = value && strcmp(value, "running") == 0;
+    free(value);
+    /* Already running, nothing to do */
+    if (rc)
+        return 0;
+
+    /* Check if xenpaging is present */
+    xp = libxl__abs_path(gc, "xenpaging", libxl_libexec_path());
+    if (access(xp, X_OK) < 0) {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "%s is not executable", xp);
+        rc = ERROR_FAIL;
+        goto out;
+    }
+
+    /* Initialise settings for child */
+    buf_starting = calloc(sizeof(*buf_starting), 1);
+    if (!buf_starting) {
+        rc = ERROR_NOMEM;
+        goto out;
+    }
+    buf_starting->domid = domid;
+    buf_starting->dom_path = dom_path;
+    buf_starting->pid_path = "xenpaging/xenpaging-pid";
+    buf_starting->for_spawn = calloc(sizeof(libxl__spawn_starting), 1);
+    if (!buf_starting->for_spawn) {
+        rc = ERROR_NOMEM;
+        goto out;
+    }
+
+    /* Assemble arguments for xenpaging */
+    xp_args = flexarray_make(8, 1);
+    if (!xp_args) {
+        rc = ERROR_NOMEM;
+        goto out;
+    }
+    /* Set executable path */
+    flexarray_append(xp_args, xp);
+
+    /* Append pagefile option */
+    flexarray_append(xp_args, "-f");
+    if (b_info->u.hvm.xenpaging_file)
+        flexarray_append(xp_args, b_info->u.hvm.xenpaging_file);
+    else
+        flexarray_append(xp_args, libxl__sprintf(gc, "%s/%s.%u.paging",
+                         libxl_xenpaging_dir_path(), dom_name, domid));
+
+    /* Set maximum amount of memory xenpaging should handle */
+    flexarray_append(xp_args, "-m");
+    flexarray_append(xp_args, libxl__sprintf(gc, "%d", b_info->max_memkb));
+
+    /* Append extra args for pager */
+    for (i = 0; xpe && xpe[i]; i++)
+        flexarray_append(xp_args, xpe[i]);
+    /* Append domid for pager */
+    flexarray_append(xp_args, "-d");
+    flexarray_append(xp_args, libxl__sprintf(gc, "%u", domid));
+    flexarray_append(xp_args, NULL);
+    args = (char **) flexarray_contents(xp_args);
+
+    /* Initialise logfile */
+    libxl_create_logfile(ctx, libxl__sprintf(gc, "xenpaging-%s", dom_name),
+                         &logfile);
+    logfile_w = open(logfile, O_WRONLY|O_CREAT, 0644);
+    free(logfile);
+    null = open("/dev/null", O_RDONLY);
+
+    /* Spawn the child */
+    rc = libxl__spawn_spawn(gc, buf_starting->for_spawn, "xenpaging",
+                            libxl_spawner_record_pid, buf_starting);
+    if (rc < 0)
+        goto out_close;
+    if (!rc) { /* inner child */
+        setsid();
+        /* Finally run xenpaging */
+        libxl__exec(null, logfile_w, logfile_w, xp, args);
+    }
+    rc = libxl__spawn_confirm_offspring_startup(gc, 5, "xenpaging", path,
+                                                "running", buf_starting);
+out_close:
+    close(null);
+    close(logfile_w);
+    free(args);
+out:
+    return rc;
+}
+
 static int do_domain_create(libxl__gc *gc, libxl_domain_config *d_config,
                             libxl_console_ready cb, void *priv,
                             uint32_t *domid_out, int restore_fd)
@@ -614,6 +730,16 @@ static int do_domain_create(libxl__gc *g
             goto error_out;
     }
 
+    if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_HVM) {
+        ret = create_xenpaging(gc, d_config->dm_info.dom_name, domid,
+                              &d_config->b_info);
+        if (ret) {
+            LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
+                      "Failed to start xenpaging.\n");
+            goto error_out;
+	}
+    }
+
     *domid_out = domid;
     return 0;
 
diff -r a51d4fab351d -r ab5406a5b1d0 tools/libxl/libxl_dom.c
--- a/tools/libxl/libxl_dom.c
+++ b/tools/libxl/libxl_dom.c
@@ -108,7 +108,7 @@ int libxl__build_post(libxl__gc *gc, uin
     if (info->cpuid != NULL)
         libxl_cpuid_set(ctx, domid, info->cpuid);
 
-    ents = libxl__calloc(gc, 12 + (info->max_vcpus * 2) + 2, sizeof(char *));
+    ents = libxl__calloc(gc, 14 + (info->max_vcpus * 2) + 2, sizeof(char *));
     ents[0] = "memory/static-max";
     ents[1] = libxl__sprintf(gc, "%d", info->max_memkb);
     ents[2] = "memory/target";
@@ -121,9 +121,11 @@ int libxl__build_post(libxl__gc *gc, uin
     ents[9] = libxl__sprintf(gc, "%"PRIu32, state->store_port);
     ents[10] = "store/ring-ref";
     ents[11] = libxl__sprintf(gc, "%lu", state->store_mfn);
+    ents[12] = "memory/target-tot_pages";
+    ents[13] = libxl__sprintf(gc, "%d", info->tot_memkb);
     for (i = 0; i < info->max_vcpus; i++) {
-        ents[12+(i*2)]   = libxl__sprintf(gc, "cpu/%d/availability", i);
-        ents[12+(i*2)+1] = (i && info->cur_vcpus && !(info->cur_vcpus & (1 << i)))
+        ents[14+(i*2)]   = libxl__sprintf(gc, "cpu/%d/availability", i);
+        ents[14+(i*2)+1] = (i && info->cur_vcpus && !(info->cur_vcpus & (1 << i)))
                             ? "offline" : "online";
     }
 
diff -r a51d4fab351d -r ab5406a5b1d0 tools/libxl/libxl_memory.txt
--- a/tools/libxl/libxl_memory.txt
+++ b/tools/libxl/libxl_memory.txt
@@ -1,28 +1,28 @@
 /* === Domain memory breakdown: HVM guests ==================================
                            
-             +  +----------+                                     +            
-             |  | shadow   |                                     |            
-             |  +----------+                                     |            
-    overhead |  | extra    |                                     |            
-             |  | external |                                     |            
-             |  +----------+                          +          |            
-             |  | extra    |                          |          |            
-             |  | internal |                          |          |            
-             +  +----------+                +         |          | footprint  
-             |  | video    |                |         |          |            
-             |  +----------+  +    +        |         | xen      |            
-             |  |          |  |    |        | actual  | maximum  |            
-             |  |          |  |    |        | target  |          |            
-             |  | guest    |  |    | build  |         |          |            
-             |  |          |  |    | start  |         |          |            
-      static |  |          |  |    |        |         |          |            
-     maximum |  +----------+  |    +        +         +          +            
-             |  |          |  |                                               
-             |  |          |  |                                               
-             |  | balloon  |  | build                                         
-             |  |          |  | maximum                                       
-             |  |          |  |                                               
-             +  +----------+  +                                               
+             +  +----------+                                                 +            
+             |  | shadow   |                                                 |            
+             |  +----------+                                                 |            
+    overhead |  | extra    |                                                 |            
+             |  | external |                                                 |            
+             |  +----------+                                      +          |            
+             |  | extra    |                                      |          |            
+             |  | internal |                                      |          |            
+             +  +----------+                            +         |          | footprint  
+             |  | video    |                            |         |          |            
+             |  +----------+  +           +    +        |         | xen      |            
+             |  |          |  | guest OS  |    |        | actual  | maximum  |            
+             |  | guest    |  | real RAM  |    |        | target  |          |            
+             |  |          |  |           |    | build  |         |          |            
+             |  |----------+  +           |    | start  +         |          |            
+      static |  | paging   |              |    |                  |          |            
+     maximum |  +----------+              |    +                  +          +            
+             |  |          |              |                                               
+             |  |          |              |                                               
+             |  | balloon  |              | build                                         
+             |  |          |              | maximum                                       
+             |  |          |              |                                               
+             +  +----------+              +                                               
                 
                 
     extra internal = LIBXL_MAXMEM_CONSTANT
@@ -34,6 +34,17 @@
     libxl_domain_setmaxmem -> xen maximum
     libxl_set_memory_target -> actual target
                 
+    build maximum = RAM as seen inside the virtual machine
+                    Guest OS has to configure itself for this amount of memory
+                    Increase/Decrease via memory hotplug of virtual hardware.
+		    xl mem-max
+    build start   = RAM usable by the guest OS
+                    Guest OS sees balloon driver as memory hog
+                    Increase/Decrease via commands to the balloon driver
+		    xl mem-set
+    actual target = RAM allocated for the guest
+                    Increase/Decrease via commands to paging daemon
+		    xl mem-paging_target (?)
                 
  === Domain memory breakdown: PV guests ==================================
                 
diff -r a51d4fab351d -r ab5406a5b1d0 tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -157,6 +157,7 @@ libxl_domain_build_info = Struct("domain
     ("tsc_mode",        integer),
     ("max_memkb",       uint32),
     ("target_memkb",    uint32),
+    ("tot_memkb",       uint32),
     ("video_memkb",     uint32),
     ("shadow_memkb",    uint32),
     ("disable_migrate", bool),
@@ -174,6 +175,8 @@ libxl_domain_build_info = Struct("domain
                                        ("vpt_align", bool),
                                        ("timer_mode", integer),
                                        ("nested_hvm", bool),
+                                       ("xenpaging_file", string),
+                                       ("xenpaging_extra", libxl_string_list),
                                        ])),
                  ("pv", Struct(None, [("kernel", libxl_file_reference),
                                       ("slack_memkb", uint32),
diff -r a51d4fab351d -r ab5406a5b1d0 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -346,6 +346,7 @@ static void printf_info(int domid,
         printf("\t\t\t(firmware %s)\n", b_info->u.hvm.firmware);
         printf("\t\t\t(video_memkb %d)\n", b_info->video_memkb);
         printf("\t\t\t(shadow_memkb %d)\n", b_info->shadow_memkb);
+        printf("\t\t\t(tot_memkb %d)\n", b_info->tot_memkb);
         printf("\t\t\t(pae %d)\n", b_info->u.hvm.pae);
         printf("\t\t\t(apic %d)\n", b_info->u.hvm.apic);
         printf("\t\t\t(acpi %d)\n", b_info->u.hvm.acpi);
@@ -380,6 +381,7 @@ static void printf_info(int domid,
         printf("\t\t\t(spicedisable_ticketing %d)\n",
                     dm_info->spicedisable_ticketing);
         printf("\t\t\t(spiceagent_mouse %d)\n", dm_info->spiceagent_mouse);
+        printf("\t\t\t(xenpaging_file %s)\n", b_info->u.hvm.xenpaging_file);
         printf("\t\t)\n");
         break;
     case LIBXL_DOMAIN_TYPE_PV:
@@ -515,6 +517,28 @@ static void parse_disk_config(XLU_Config
     parse_disk_config_multistring(config, 1, &spec, disk);
 }
 
+static void parse_xenpaging_extra(const XLU_Config *config, libxl_string_list *xpe)
+{
+    XLU_ConfigList *args;
+    libxl_string_list l;
+    const char *val;
+    int nr_args = 0, i;
+
+    if (xlu_cfg_get_list(config, "xenpaging_extra", &args, &nr_args, 1))
+        return;
+
+    l = xmalloc(sizeof(char*)*(nr_args + 1));
+    if (!l)
+        return;
+
+    l[nr_args] = NULL;
+    for (i = 0; i < nr_args; i++) {
+        val = xlu_cfg_get_listitem(args, i);
+        l[i] = val ? strdup(val) : NULL;
+    }
+    *xpe = l;
+}
+
 static void parse_config_data(const char *configfile_filename_report,
                               const char *configfile_data,
                               int configfile_len,
@@ -620,6 +644,9 @@ static void parse_config_data(const char
     if (!xlu_cfg_get_long (config, "maxmem", &l))
         b_info->max_memkb = l * 1024;
 
+    if (!xlu_cfg_get_long (config, "actmem", &l))
+        b_info->tot_memkb = l * 1024;
+
     if (xlu_cfg_get_string (config, "on_poweroff", &buf))
         buf = "destroy";
     if (!parse_action_on_shutdown(buf, &d_config->on_poweroff)) {
@@ -695,6 +722,10 @@ static void parse_config_data(const char
             b_info->u.hvm.timer_mode = l;
         if (!xlu_cfg_get_long (config, "nestedhvm", &l))
             b_info->u.hvm.nested_hvm = l;
+
+        xlu_cfg_replace_string (config, "xenpaging_file", &b_info->u.hvm.xenpaging_file);
+        parse_xenpaging_extra(config, &b_info->u.hvm.xenpaging_extra);
+
         break;
     case LIBXL_DOMAIN_TYPE_PV:
     {
diff -r a51d4fab351d -r ab5406a5b1d0 tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -40,6 +40,8 @@
 
 /* Defines number of mfns a guest should use at a time, in KiB */
 #define WATCH_TARGETPAGES "memory/target-tot_pages"
+/* Defines path to startup confirmation */
+#define WATCH_STARTUP "xenpaging/state"
 static char *watch_target_tot_pages;
 static char *dom_path;
 static char watch_token[16];
@@ -772,6 +774,20 @@ static int evict_pages(xenpaging_t *pagi
     return num;
 }
 
+static void xenpaging_confirm_startup(xenpaging_t *paging)
+{
+    xc_interface *xch = paging->xc_handle;
+    char *path;
+    int len;
+
+    len = asprintf(&path, "%s/%s", dom_path, WATCH_STARTUP);
+    if ( len < 0 )
+        return;
+    DPRINTF("confirming startup in %s\n", path);
+    xs_write(paging->xs_handle, XBT_NULL, path, "running", len);
+    free(path);
+}
+
 int main(int argc, char *argv[])
 {
     struct sigaction act;
@@ -830,6 +846,9 @@ int main(int argc, char *argv[])
     /* listen for page-in events to stop pager */
     create_page_in_thread(paging);
 
+    /* Confirm startup to caller */
+    xenpaging_confirm_startup(paging);
+
     /* Swap pages in and out */
     while ( 1 )
     {

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 07:50:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 07:50:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLc9A-0003aF-CP; Wed, 02 Nov 2011 07:50:32 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLc5R-00027g-SJ
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 07:46:42 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-5.tower-21.messagelabs.com!1320245198!1100665!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28531 invoked from network); 2 Nov 2011 14:46:38 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-5.tower-21.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 2 Nov 2011 14:46:38 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320245197; l=7611;
	s=domk; d=aepfle.de;
	h=Cc:To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=C6nA4clR/PQ8Tz7sPmt+uqVH86o=;
	b=iRy0NY5hOjhLVXJihYoXPmxsYZpWD37SPyKhIoHz6Aq2pAyyb1ES5zS24gQ9MMZS5Rx
	SQ0MrjoeADQY/YzH7KOej59SiqTfD7Vwo+nCbTuuQSc+OmXRcSEFGdKbKP+btCdeGOlbL
	CqB/RB9pouyt0IBQoft1tUTIcHhJW5164vk=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV71Y=
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-5.vodafone-net.de [80.226.24.5])
	by smtp.strato.de (klopstock mo53) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id 206bd6nA2Dk1D5 ;
	Wed, 2 Nov 2011 15:46:21 +0100 (MET)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 3132B1863A;
	Wed,  2 Nov 2011 15:46:17 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: a51d4fab351d2d1a38b82cbd7ad925f76fce9e9a
Message-Id: <a51d4fab351d2d1a38b8.1320245139@probook.site>
In-Reply-To: <patchbomb.1320245136@probook.site>
References: <patchbomb.1320245136@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Wed, 02 Nov 2011 15:45:39 +0100
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Cc: George.Dunlap@eu.citrix.com, Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH 3 of 4] xenpaging: add cmdline interface for
	pager
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1320244384 -3600
# Node ID a51d4fab351d2d1a38b82cbd7ad925f76fce9e9a
# Parent  434f0b4da9148b101e184e0108be6c31f67038f4
xenpaging: add cmdline interface for pager

Introduce a cmdline handling for the pager. This simplifies libxl support,
debug and mru_size are not passed via the environment anymore.
The new interface looks like this:

xenpaging [options] -f <pagefile> -d <domain_id>
options:
 -d <domid>     --domain=<domid>         numerical domain_id of guest. This option is required.
 -f <file>      --pagefile=<file>        pagefile to use. This option is required.
 -m <max_memkb> --max_memkb=<max_memkb>  maximum amount of memory to handle.
 -r <num>       --mru_size=<num>         number of paged-in pages to keep in memory.
 -d             --debug                  enable debug output.
 -h             --help                   this output.


Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 434f0b4da914 -r a51d4fab351d tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -31,6 +31,7 @@
 #include <poll.h>
 #include <xc_private.h>
 #include <xs.h>
+#include <getopt.h>
 
 #include "xc_bitops.h"
 #include "file_ops.h"
@@ -42,12 +43,12 @@
 static char *watch_target_tot_pages;
 static char *dom_path;
 static char watch_token[16];
-static char filename[80];
+static char *filename;
 static int interrupted;
 
 static void unlink_pagefile(void)
 {
-    if ( filename[0] )
+    if ( filename && filename[0] )
     {
         unlink(filename);
         filename[0] = '\0';
@@ -201,11 +202,85 @@ static void *init_page(void)
     return NULL;
 }
 
-static xenpaging_t *xenpaging_init(domid_t domain_id, int target_tot_pages)
+static void usage(void)
+{
+    printf("usage:\n\n");
+
+    printf("  xenpaging [options] -f <pagefile> -d <domain_id>\n\n");
+
+    printf("options:\n");
+    printf(" -d <domid>     --domain=<domid>         numerical domain_id of guest. This option is required.\n");
+    printf(" -f <file>      --pagefile=<file>        pagefile to use. This option is required.\n");
+    printf(" -m <max_memkb> --max_memkb=<max_memkb>  maximum amount of memory to handle.\n");
+    printf(" -r <num>       --mru_size=<num>         number of paged-in pages to keep in memory.\n");
+    printf(" -v             --verbose                enable debug output.\n");
+    printf(" -h             --help                   this output.\n");
+}
+
+static int xenpaging_getopts(xenpaging_t *paging, int argc, char *argv[])
+{
+    int ch;
+    static const char sopts[] = "hvd:f:m:r:";
+    static const struct option lopts[] = {
+        {"help", 0, NULL, 'h'},
+        {"verbose", 0, NULL, 'v'},
+        {"domain", 1, NULL, 'd'},
+        {"pagefile", 1, NULL, 'f'},
+        {"mru_size", 1, NULL, 'm'},
+        { }
+    };
+
+    while ((ch = getopt_long(argc, argv, sopts, lopts, NULL)) != -1)
+    {
+        switch(ch) {
+        case 'd':
+            paging->mem_event.domain_id = atoi(optarg);
+            break;
+        case 'f':
+            filename = strdup(optarg);
+            break;
+        case 'm':
+            /* KiB to pages */
+            paging->max_pages = atoi(optarg) >> 2;
+            break;
+        case 'r':
+            paging->policy_mru_size = atoi(optarg);
+            break;
+        case 'v':
+            paging->debug = 1;
+            break;
+        case 'h':
+        case '?':
+            usage();
+            return 1;
+        }
+    }
+
+    argv += optind; argc -= optind;
+    
+    /* Path to pagefile is required */
+    if ( !filename )
+    {
+        printf("Filename for pagefile missing!\n");
+        usage();
+        return 1;
+    }
+
+    /* Set domain id */
+    if ( !paging->mem_event.domain_id )
+    {
+        printf("Numerical <domain_id> missing!\n");
+        return 1;
+    }
+
+    return 0;
+}
+
+static xenpaging_t *xenpaging_init(int argc, char *argv[])
 {
     xenpaging_t *paging;
     xc_domaininfo_t domain_info;
-    xc_interface *xch;
+    xc_interface *xch = NULL;
     xentoollog_logger *dbg = NULL;
     char *p;
     int rc;
@@ -215,7 +290,12 @@ static xenpaging_t *xenpaging_init(domid
     if ( !paging )
         goto err;
 
-    if ( getenv("XENPAGING_DEBUG") )
+    /* Get cmdline options and domain_id */
+    if ( xenpaging_getopts(paging, argc, argv) )
+        goto err;
+
+    /* Enable debug output */
+    if ( paging->debug )
         dbg = (xentoollog_logger *)xtl_createlogger_stdiostream(stderr, XTL_DEBUG, 0);
 
     /* Open connection to xen */
@@ -234,7 +314,7 @@ static xenpaging_t *xenpaging_init(domid
     }
 
     /* write domain ID to watch so we can ignore other domain shutdowns */
-    snprintf(watch_token, sizeof(watch_token), "%u", domain_id);
+    snprintf(watch_token, sizeof(watch_token), "%u", paging->mem_event.domain_id);
     if ( xs_watch(paging->xs_handle, "@releaseDomain", watch_token) == false )
     {
         PERROR("Could not bind to shutdown watch\n");
@@ -242,7 +322,7 @@ static xenpaging_t *xenpaging_init(domid
     }
 
     /* Watch xenpagings working target */
-    dom_path = xs_get_domain_path(paging->xs_handle, domain_id);
+    dom_path = xs_get_domain_path(paging->xs_handle, paging->mem_event.domain_id);
     if ( !dom_path )
     {
         PERROR("Could not find domain path\n");
@@ -260,16 +340,6 @@ static xenpaging_t *xenpaging_init(domid
         goto err;
     }
 
-    p = getenv("XENPAGING_POLICY_MRU_SIZE");
-    if ( p && *p )
-    {
-         paging->policy_mru_size = atoi(p);
-         DPRINTF("Setting policy mru_size to %d\n", paging->policy_mru_size);
-    }
-
-    /* Set domain id */
-    paging->mem_event.domain_id = domain_id;
-
     /* Initialise shared page */
     paging->mem_event.shared_page = init_page();
     if ( paging->mem_event.shared_page == NULL )
@@ -335,17 +405,21 @@ static xenpaging_t *xenpaging_init(domid
 
     paging->mem_event.port = rc;
 
-    rc = xc_domain_getinfolist(xch, paging->mem_event.domain_id, 1,
-                               &domain_info);
-    if ( rc != 1 )
+    /* Get max_pages from guest if not provided via cmdline */
+    if ( !paging->max_pages )
     {
-        PERROR("Error getting domain info");
-        goto err;
+        rc = xc_domain_getinfolist(xch, paging->mem_event.domain_id, 1,
+                                   &domain_info);
+        if ( rc != 1 )
+        {
+            PERROR("Error getting domain info");
+            goto err;
+        }
+
+        /* Record number of max_pages */
+        paging->max_pages = domain_info.max_pages;
     }
 
-    /* Record number of max_pages */
-    paging->max_pages = domain_info.max_pages;
-
     /* Allocate bitmap for tracking pages that have been paged out */
     paging->bitmap = bitmap_alloc(paging->max_pages);
     if ( !paging->bitmap )
@@ -355,8 +429,6 @@ static xenpaging_t *xenpaging_init(domid
     }
     DPRINTF("max_pages = %d\n", paging->max_pages);
 
-    paging->target_tot_pages = target_tot_pages;
-
     /* Initialise policy */
     rc = policy_init(paging);
     if ( rc != 0 )
@@ -718,25 +790,18 @@ int main(int argc, char *argv[])
     mode_t open_mode = S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR | S_IWGRP | S_IWOTH;
     int fd;
 
-    if ( argc != 3 )
-    {
-        fprintf(stderr, "Usage: %s <domain_id> <tot_pages>\n", argv[0]);
-        return -1;
-    }
-
     /* Initialise domain paging */
-    paging = xenpaging_init(atoi(argv[1]), atoi(argv[2]));
+    paging = xenpaging_init(argc, argv);
     if ( paging == NULL )
     {
-        fprintf(stderr, "Error initialising paging");
+        fprintf(stderr, "Error initialising paging\n");
         return 1;
     }
     xch = paging->xc_handle;
 
-    DPRINTF("starting %s %u %d\n", argv[0], paging->mem_event.domain_id, paging->target_tot_pages);
+    DPRINTF("starting %s for domain_id %u with pagefile %s\n", argv[0], paging->mem_event.domain_id, filename);
 
     /* Open file */
-    sprintf(filename, "page_cache_%u", paging->mem_event.domain_id);
     fd = open(filename, open_flags, open_mode);
     if ( fd < 0 )
     {
diff -r 434f0b4da914 -r a51d4fab351d tools/xenpaging/xenpaging.h
--- a/tools/xenpaging/xenpaging.h
+++ b/tools/xenpaging/xenpaging.h
@@ -52,6 +52,7 @@ typedef struct xenpaging {
     int num_paged_out;
     int target_tot_pages;
     int policy_mru_size;
+    int debug;
     unsigned long pagein_queue[XENPAGING_PAGEIN_QUEUE_SIZE];
 } xenpaging_t;
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 07:51:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 07:51:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLcAE-0003xl-8X; Wed, 02 Nov 2011 07:51:38 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLc5T-000288-TD
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 07:46:44 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-9.tower-21.messagelabs.com!1320245200!2560497!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16303 invoked from network); 2 Nov 2011 14:46:40 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-9.tower-21.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 2 Nov 2011 14:46:40 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320245199; l=2812;
	s=domk; d=aepfle.de;
	h=Cc:To:From:Date:Subject:Content-Transfer-Encoding:MIME-Version:
	Content-Type:X-RZG-CLASS-ID:X-RZG-AUTH;
	bh=xNX4dghLowcvCgHT/1vJBK3KuFU=;
	b=CVG5+mPv1WMKS9nueKqHbsNvPVYFOd+D1y8Q0Ab/JW9iB2UXUc42EBZmTEfKi86kcOT
	Pfe2WHVjsMK/yviyg4Fq6Wq/WbUZAxHajdFhbVtQEgTYxWLVt7FKYtyR8cs+6/glLo/Ml
	0BM9Xi45n/m5z1FZfrCxdyBbyBUlfcYkbJo=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV71Y=
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-5.vodafone-net.de [80.226.24.5])
	by smtp.strato.de (klopstock mo39) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id q0675enA2EWFhF ;
	Wed, 2 Nov 2011 15:46:18 +0100 (MET)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id BF24018637;
	Wed,  2 Nov 2011 15:46:15 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1320245136@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Wed, 02 Nov 2011 15:45:36 +0100
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Cc: George.Dunlap@eu.citrix.com, Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH 0 of 4] libxl: initial support for xenpaging
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


The following series adds initial support for xenpaging to libxl.
It depends on two series I sent earlier:

tools/xenpaging fixes for xen-unstable, sent on 2011-10-21
http://lists.xensource.com/archives/html/xen-devel/2011-10/msg01542.html

libxl: make spawn interface more generic, sent on 2011-10-27
http://lists.xensource.com/archives/html/xen-devel/2011-10/msg01912.html


The logic of xenpaging was reversed by this series.
It does now monitor the guests tot_pages value and work toward that number by
either paging out more pages, or write pages back into the guest.
Target changes will received from the guests "memory/target-tot_pages" path.

Three new configuration file options specific for xenpaging were added:
  actmem=<int>
  xenpaging_file=<string> (optional)
  xenpaging_extra=[ 'string', 'string' ] (optional)
xenpaging will only be started if actmem= is set and not zero.


A xl mem-SOMETHING command is not yet part of this series. I will add it once
a suitable name is found.


There has been some discussion regarding the naming of the config option, and
how to drive xenpaging via xl commands. 
http://lists.xensource.com/archives/html/xen-devel/2011-10/msg00110.html

The term "actual memory" was suggested by IanC, thats why the option is now
'actmem=' instead of 'totmem='. So far I couldnt come up with a better name
that follows the current scheme.

George Dunlap suggested the following off-list for the related xl mem-*
commands:
'xl mem-set' should continue to change the balloon target as it does today.
But it should also update "memory/target-tot_pages" with the same value. There
could be some churn when the balloon driver and xenpaging try to reach that
value. Eventually xenpaging will be faster to free pages, while the balloon
driver still tries to reach its target. In my opinion thats not an issue if
mem-set really means 'release as much memory back to Xen, as fast as
possible'. If the guest is actually using much memory then the balloon driver
(in its role as memory hog) can not do much to reach its target. But xenpaging
swap some parts of the guest to free memory on the host.

Two other 'xl mem-*' commands should be added to tweak just the balloon driver
and xenpaging. 'xl mem-balloon-target' does what 'mem-set' does today, and 'xl
mem-swap-target' will tweak "memory/target-tot_pages".



Olaf


 tools/libxl/libxl.h          |    1 
 tools/libxl/libxl_create.c   |  126 ++++++++++++++++++++++++++
 tools/libxl/libxl_dom.c      |    8 +
 tools/libxl/libxl_memory.txt |   57 +++++++-----
 tools/libxl/libxl_types.idl  |    3 
 tools/libxl/xl_cmdimpl.c     |   31 ++++++
 tools/xenpaging/xenpaging.c  |  201 +++++++++++++++++++++++++++++++++++--------
 tools/xenpaging/xenpaging.h  |    1 
 8 files changed, 368 insertions(+), 60 deletions(-)


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 08:14:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 08:14:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLcW7-0004kl-3K; Wed, 02 Nov 2011 08:14:15 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLcUT-0004X2-AH
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 08:12:43 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1320245506!52089!1
X-Originating-IP: [213.199.154.208]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26551 invoked from network); 2 Nov 2011 14:51:46 -0000
Received: from am1ehsobe005.messaging.microsoft.com (HELO
	AM1EHSOBE005.bigfish.com) (213.199.154.208)
	by server-10.tower-174.messagelabs.com with AES128-SHA encrypted SMTP;
	2 Nov 2011 14:51:46 -0000
Received: from mail21-am1-R.bigfish.com (10.3.201.243) by
	AM1EHSOBE005.bigfish.com (10.3.204.25) with Microsoft SMTP Server id
	14.1.225.22; Wed, 2 Nov 2011 14:51:31 +0000
Received: from mail21-am1 (localhost.localdomain [127.0.0.1])	by
	mail21-am1-R.bigfish.com (Postfix) with ESMTP id 7E71C2B0363;
	Wed,  2 Nov 2011 14:51:40 +0000 (UTC)
X-SpamScore: -19
X-BigFish: VPS-19(zz1b0aL146fK1432N98dK4015Lzz1202hzz8275bhz32i668h839h61h)
X-Spam-TCS-SCL: 0:0
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
X-FB-SS: 0,
Received: from mail21-am1 (localhost.localdomain [127.0.0.1]) by mail21-am1
	(MessageSwitch) id 1320245472851727_13338;
	Wed,  2 Nov 2011 14:51:12 +0000 (UTC)
Received: from AM1EHSMHS002.bigfish.com (unknown [10.3.201.243])	by
	mail21-am1.bigfish.com (Postfix) with ESMTP id C2D6F17D8056;
	Wed,  2 Nov 2011 14:51:12 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	AM1EHSMHS002.bigfish.com (10.3.207.102) with Microsoft SMTP Server id
	14.1.225.22; Wed, 2 Nov 2011 14:51:02 +0000
X-WSS-ID: 0LU1FXD-02-2YM-02
X-M-MSG: 
Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com
	[163.181.249.73])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 20A1EC800C;	Wed,  2 Nov 2011 09:51:12 -0500 (CDT)
Received: from sausexhtp02.amd.com (163.181.3.152) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Wed, 2 Nov 2011 09:51:49 -0500
Received: from storexhtp01.amd.com (172.24.4.3) by sausexhtp02.amd.com
	(163.181.3.152) with Microsoft SMTP Server (TLS) id 8.3.83.0;
	Wed, 2 Nov 2011 09:51:14 -0500
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp01.amd.com
	(172.24.4.3) with Microsoft SMTP Server id 8.3.83.0;
	Wed, 2 Nov 2011 10:49:12 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 04A0349C1FF; Wed,  2 Nov 2011
	14:49:11 +0000 (GMT)
Received: from gran.osrc.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id DA78B5940FF; Wed,  2 Nov 2011
	15:49:10 +0100 (CET)
From: Wei Wang2 <wei.wang2@amd.com>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 3 of 6] amd iommu: Fix iommu page size
	encoding when page order > 0
Date: Wed, 2 Nov 2011 16:52:12 +0200
User-Agent: KMail/1.9.6 (enterprise 20070904.708012)
References: <patchbomb.1319548052@gran.amd.com>
	<18088bd3e8f6c16b7aef.1319548055@gran.amd.com>
	<4EB157C0020000780005E717@nat28.tlf.novell.com>
In-Reply-To: <4EB157C0020000780005E717@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Message-ID: <201111021552.12489.wei.wang2@amd.com>
X-OriginatorOrg: amd.com
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wednesday 02 November 2011 14:46:24 Jan Beulich wrote:
> >>> On 25.10.11 at 15:07, Wei Wang <wei.wang2@amd.com> wrote:
> >
> > # HG changeset patch
> > # User Wei Wang <wei.wang2@amd.com>
> > # Date 1319472692 -7200
> > # Node ID 18088bd3e8f6c16b7aef3d8652f2b9878117fcd5
> > # Parent  0d17087f9e495c1b9eb43bc0f6a21319097f3043
> > amd iommu: Fix iommu page size encoding when page order > 0
> >
> > Signed-off-by: Wei Wang <wei.wang2@amd.com>
> >
> > diff -r 0d17087f9e49 -r 18088bd3e8f6
> > xen/drivers/passthrough/amd/iommu_map.c ---
> > a/xen/drivers/passthrough/amd/iommu_map.c	Mon Oct 24 18:11:29 2011 +0200
> > +++ b/xen/drivers/passthrough/amd/iommu_map.c	Mon Oct 24 18:11:32 2011
> > +0200 @@ -77,23 +77,24 @@ static void invalidate_iommu_pages(struc
> >  {
> >      u64 addr_lo, addr_hi;
> >      u32 cmd[4], entry;
> > -    u64 mask = 0;
> >      int sflag = 0, pde = 0;
> >
> > +    ASSERT ( order == 0 || order == 9 || order == 18 );
> > +
> > +    /* All pages associated with the domainID are invalidated */
> > +    if ( order || (io_addr == INV_IOMMU_ALL_PAGES_ADDRESS ) )
> > +    {
> > +        sflag = 1;
> > +        pde = 1;
> > +    }
> > +
> >      /* If sflag == 1, the size of the invalidate command is determined
> >       by the first zero bit in the address starting from Address[12] */
> > -    if ( order == 9 || order == 18 )
> > +    if ( order )
> >      {
> > -        mask = ((1ULL << (order - 1)) - 1) << PAGE_SHIFT;
> > -        io_addr |= mask;
> > -        sflag = 1;
> > -    }
> > -
> > -    /* All pages associated with the domainID are invalidated */
> > -    else if ( io_addr == 0x7FFFFFFFFFFFF000ULL )
> > -    {
> > -        sflag = 1;
> > -        pde = 1;
> > +        u64 mask = 1ULL << (order - 1 + PAGE_SHIFT);
> > +        io_addr &= ~mask;
> > +        io_addr |= mask - 1;
> >      }
> >
> >      addr_lo = io_addr & DMA_32BIT_MASK;
> > @@ -917,7 +918,7 @@ static void _amd_iommu_flush_pages(struc
> >
> >  void amd_iommu_flush_all_pages(struct domain *d)
> >  {
> > -    _amd_iommu_flush_pages(d, 0x7FFFFFFFFFFFFULL, 0);
> > +    _amd_iommu_flush_pages(d, INV_IOMMU_ALL_PAGES_ADDRESS, 0);
> >  }
> >
> >  void amd_iommu_flush_pages(struct domain *d,
> > diff -r 0d17087f9e49 -r 18088bd3e8f6
> > xen/include/asm-x86/hvm/svm/amd-iommu-defs.h ---
> > a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Mon Oct 24 18:11:29 2011
> > +0200 +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Mon Oct 24
> > 18:11:32 2011 +0200
> > @@ -407,4 +407,6 @@
> >  #define INT_REMAP_ENTRY_VECTOR_MASK     0x00FF0000
> >  #define INT_REMAP_ENTRY_VECTOR_SHIFT    16
> >
> > +#define INV_IOMMU_ALL_PAGES_ADDRESS     0x7FFFFFFFFFFFFULL
>
> ((1ULL << 51) - 1)
>
> would make this much easier to understand. But - doe the IOMMU really
> have its limit at 51 bits (as opposed to the architectural limit of 52 in
> the CPU's MMU)?

Maybe the name is confusing. Actually it is a special frame number not an 
address. Bit 63 = 0 indicates all page frames should be invalidated. Or I 
should use INV_IOMMU_ALL_PAGES_PFN  instead. Anyway, I will fix that in the 
next version. Thanks for all your comments. Other issues will also be fixed 
in the new version.
Thanks,
Wei  

> Jan
>
> > +
> >  #endif /* _ASM_X86_64_AMD_IOMMU_DEFS_H */
> >
> >
> > _______________________________________________
> > Xen-devel mailing list
> > Xen-devel@lists.xensource.com
> > http://lists.xensource.com/xen-devel




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 08:15:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 08:15:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLcXa-00058I-FZ; Wed, 02 Nov 2011 08:15:46 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLcV9-0004aW-Qv
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 08:13:17 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1320246792!2042453!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10679 invoked from network); 2 Nov 2011 15:13:12 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-13.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 2 Nov 2011 15:13:12 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 02 Nov 2011 15:13:12 +0000
Message-Id: <4EB16C15020000780005E798@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 02 Nov 2011 15:13:09 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Wang2" <wei.wang2@amd.com>
Subject: Re: [Xen-devel] [PATCH 3 of 6] amd iommu: Fix iommu page size
	encoding when page order > 0
References: <patchbomb.1319548052@gran.amd.com>
	<18088bd3e8f6c16b7aef.1319548055@gran.amd.com>
	<4EB157C0020000780005E717@nat28.tlf.novell.com>
	<201111021552.12489.wei.wang2@amd.com>
In-Reply-To: <201111021552.12489.wei.wang2@amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 02.11.11 at 15:52, Wei Wang2 <wei.wang2@amd.com> wrote:
> On Wednesday 02 November 2011 14:46:24 Jan Beulich wrote:
>> >>> On 25.10.11 at 15:07, Wei Wang <wei.wang2@amd.com> wrote:
>> >
>> > # HG changeset patch
>> > # User Wei Wang <wei.wang2@amd.com>
>> > # Date 1319472692 -7200
>> > # Node ID 18088bd3e8f6c16b7aef3d8652f2b9878117fcd5
>> > # Parent  0d17087f9e495c1b9eb43bc0f6a21319097f3043
>> > amd iommu: Fix iommu page size encoding when page order > 0
>> >
>> > Signed-off-by: Wei Wang <wei.wang2@amd.com>
>> >
>> > diff -r 0d17087f9e49 -r 18088bd3e8f6
>> > xen/drivers/passthrough/amd/iommu_map.c ---
>> > a/xen/drivers/passthrough/amd/iommu_map.c	Mon Oct 24 18:11:29 2011 =
+0200
>> > +++ b/xen/drivers/passthrough/amd/iommu_map.c	Mon Oct 24 =
18:11:32 2011
>> > +0200 @@ -77,23 +77,24 @@ static void invalidate_iommu_pages(struc
>> >  {
>> >      u64 addr_lo, addr_hi;
>> >      u32 cmd[4], entry;
>> > -    u64 mask =3D 0;
>> >      int sflag =3D 0, pde =3D 0;
>> >
>> > +    ASSERT ( order =3D=3D 0 || order =3D=3D 9 || order =3D=3D 18 );
>> > +
>> > +    /* All pages associated with the domainID are invalidated */
>> > +    if ( order || (io_addr =3D=3D INV_IOMMU_ALL_PAGES_ADDRESS ) )
>> > +    {
>> > +        sflag =3D 1;
>> > +        pde =3D 1;
>> > +    }
>> > +
>> >      /* If sflag =3D=3D 1, the size of the invalidate command is =
determined
>> >       by the first zero bit in the address starting from Address[12] =
*/
>> > -    if ( order =3D=3D 9 || order =3D=3D 18 )
>> > +    if ( order )
>> >      {
>> > -        mask =3D ((1ULL << (order - 1)) - 1) << PAGE_SHIFT;
>> > -        io_addr |=3D mask;
>> > -        sflag =3D 1;
>> > -    }
>> > -
>> > -    /* All pages associated with the domainID are invalidated */
>> > -    else if ( io_addr =3D=3D 0x7FFFFFFFFFFFF000ULL )
>> > -    {
>> > -        sflag =3D 1;
>> > -        pde =3D 1;
>> > +        u64 mask =3D 1ULL << (order - 1 + PAGE_SHIFT);
>> > +        io_addr &=3D ~mask;
>> > +        io_addr |=3D mask - 1;
>> >      }
>> >
>> >      addr_lo =3D io_addr & DMA_32BIT_MASK;
>> > @@ -917,7 +918,7 @@ static void _amd_iommu_flush_pages(struc
>> >
>> >  void amd_iommu_flush_all_pages(struct domain *d)
>> >  {
>> > -    _amd_iommu_flush_pages(d, 0x7FFFFFFFFFFFFULL, 0);
>> > +    _amd_iommu_flush_pages(d, INV_IOMMU_ALL_PAGES_ADDRESS, 0);
>> >  }
>> >
>> >  void amd_iommu_flush_pages(struct domain *d,
>> > diff -r 0d17087f9e49 -r 18088bd3e8f6
>> > xen/include/asm-x86/hvm/svm/amd-iommu-defs.h ---
>> > a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Mon Oct 24 =
18:11:29 2011
>> > +0200 +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Mon Oct 24
>> > 18:11:32 2011 +0200
>> > @@ -407,4 +407,6 @@
>> >  #define INT_REMAP_ENTRY_VECTOR_MASK     0x00FF0000
>> >  #define INT_REMAP_ENTRY_VECTOR_SHIFT    16
>> >
>> > +#define INV_IOMMU_ALL_PAGES_ADDRESS     0x7FFFFFFFFFFFFULL
>>
>> ((1ULL << 51) - 1)
>>
>> would make this much easier to understand. But - doe the IOMMU really
>> have its limit at 51 bits (as opposed to the architectural limit of 52 =
in
>> the CPU's MMU)?
>=20
> Maybe the name is confusing. Actually it is a special frame number not =
an=20
> address. Bit 63 =3D 0 indicates all page frames should be invalidated. =
Or I=20
> should use INV_IOMMU_ALL_PAGES_PFN  instead. Anyway, I will fix that in =
the=20

Yes, if this is a PFN, then the name should say so. And then it becomes
all the more relevant to express this as a decremented shift expression
(as it depends on PAGE_SHIFT).

Jan

> next version. Thanks for all your comments. Other issues will also be =
fixed=20
> in the new version.
> Thanks,
> Wei =20
>=20
>> Jan
>>
>> > +
>> >  #endif /* _ASM_X86_64_AMD_IOMMU_DEFS_H */
>> >
>> >
>> > _______________________________________________
>> > Xen-devel mailing list
>> > Xen-devel@lists.xensource.com=20
>> > http://lists.xensource.com/xen-devel=20




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 08:32:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 08:32:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLcnj-0006Qz-SO; Wed, 02 Nov 2011 08:32:27 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLcmn-0006Di-Qr
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 08:31:30 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1320247886!2045088!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11250 invoked from network); 2 Nov 2011 15:31:26 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 15:31:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8722294"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 15:31:26 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 15:31:26 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLcmk-0005HB-8u; Wed, 02 Nov 2011 15:31:26 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLcmj-00040g-Vg;
	Wed, 02 Nov 2011 15:31:26 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20145.25165.817884.837374@mariner.uk.xensource.com>
Date: Wed, 2 Nov 2011 15:31:25 +0000
To: rshriram@cs.ubc.ca
Subject: Re: [Xen-devel] [PATCH 0 of 2 V4] libxc: checkpoint compression
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <patchbomb.1319050206@athos.nss.cs.ubc.ca>
References: <patchbomb.1319050206@athos.nss.cs.ubc.ca>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: brendan@cs.ubc.ca, xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

rshriram@cs.ubc.ca writes ("[Xen-devel] [PATCH 0 of 2 V4] libxc: checkpoint compression"):
> This patch series adds checkpoint compression functionality, while
> running under Remus.

Thanks.  I tried to apply this but it broke the stubdom build:

cc1: warnings being treated as errors
xc_compression.c: In function 'xc_compression_create_context':
xc_compression.c:487: error: implicit declaration of function 'posix_memalign'
make[3]: *** [xc_compression.o] Error 1
make[3]: Leaving directory `/u/iwj/work/xen-unstable-tools.hg/stubdom/libxc-x86_32'
make[2]: *** [build] Error 2
make[2]: Leaving directory `/u/iwj/work/xen-unstable-tools.hg/stubdom/libxc-x86_32'
make[1]: *** [libxc-x86_32/libxenctrl.a] Error 2
make[1]: Leaving directory `/u/iwj/work/xen-unstable-tools.hg/stubdom'
make: *** [install-stubdom] Error 2

I think you may need to #ifdef some of the code, or somehow provide
posix_memalign in stubdom.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 08:35:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 08:35:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLcqq-0006x0-Hk; Wed, 02 Nov 2011 08:35:40 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLcqI-0006lL-Gj
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 08:35:06 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1320248078!46962927!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26140 invoked from network); 2 Nov 2011 15:34:38 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 15:34:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8722415"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 15:35:03 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 15:35:03 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLcqF-0005IJ-65; Wed, 02 Nov 2011 15:35:03 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLcqF-00041U-3v;
	Wed, 02 Nov 2011 15:35:03 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20145.25383.109650.481496@mariner.uk.xensource.com>
Date: Wed, 2 Nov 2011 15:35:03 +0000
To: rshriram@cs.ubc.ca
Subject: Re: [Xen-devel] [PATCH 0 of 2 V4] libxc: checkpoint compression
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <CAP8mzPMHZ=-Ar0RteLdp_GY5pvCxTTT3TpU3sJM4859m1md4gw@mail.gmail.com>
References: <patchbomb.1319050206@athos.nss.cs.ubc.ca>
	<CAP8mzPMHZ=-Ar0RteLdp_GY5pvCxTTT3TpU3sJM4859m1md4gw@mail.gmail.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: brendan@cs.ubc.ca, xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Shriram Rajagopalan writes ("Re: [Xen-devel] [PATCH 0 of 2 V4] libxc: checkpoint compression"):
> Ian, do you have any other comments ?

No, I didn't, and tried to apply it.  Unfortunately my test build
failed - see my other mail.

Thanks,
Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 08:42:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 08:42:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLcxG-0007SC-Rk; Wed, 02 Nov 2011 08:42:18 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLcwQ-0007EB-JW
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 08:41:26 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1320248367!42828560!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5024 invoked from network); 2 Nov 2011 15:39:27 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 15:39:27 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8722576"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 15:41:23 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 15:41:23 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLcwM-0005KS-Rx; Wed, 02 Nov 2011 15:41:22 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLcwM-0006aq-Kp;
	Wed, 02 Nov 2011 15:41:22 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20145.25762.198289.568015@mariner.uk.xensource.com>
Date: Wed, 2 Nov 2011 15:41:22 +0000
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH 0 of 7] libxl: make spawn interface more
	generic
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <patchbomb.1319709792@probook.site>
References: <patchbomb.1319709792@probook.site>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Olaf Hering writes ("[Xen-devel] [PATCH 0 of 7] libxl: make spawn interface more generic"):
> The following series makes the libxl spawn interface more generic, so that it
> can be used for device model and xenpaging. The functions move from dm.c to
> exec.c. Some documentation about the interface is added as well.
> 
> Please review and apply.

Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>

For all seven, thanks.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 08:47:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 08:47:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLd2S-00084e-Nq; Wed, 02 Nov 2011 08:47:40 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLd21-0007sx-36
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 08:47:13 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1320248802!55703295!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3758 invoked from network); 2 Nov 2011 15:46:42 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 15:46:42 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8722743"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 15:47:10 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 15:47:10 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLd1x-0005MX-RB; Wed, 02 Nov 2011 15:47:09 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLd1x-0000Zc-Nk;
	Wed, 02 Nov 2011 15:47:09 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20145.26109.496100.139824@mariner.uk.xensource.com>
Date: Wed, 2 Nov 2011 15:47:09 +0000
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH v5] libxl: reimplement buffer for bootloading
	and drop data if buffer is full
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <ecc4637da82e62d4ff77.1319021250@loki>
References: <ecc4637da82e62d4ff77.1319021250@loki>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Roger Pau Monne writes ("[Xen-devel] [PATCH v5] libxl: reimplement buffer for bootloading and drop data if buffer is full"):
> libxl: reimplement buffer for bootloading and drop data if buffer is full.

Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>

Thanks,
Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 08:54:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 08:54:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLd95-00006m-TN; Wed, 02 Nov 2011 08:54:31 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLd8a-0008Lv-Il
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 08:54:00 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1320249237!1718541!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22685 invoked from network); 2 Nov 2011 15:53:57 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 15:53:57 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8722929"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 15:53:56 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 15:53:56 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLd8V-0005Ou-U3; Wed, 02 Nov 2011 15:53:55 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLd8V-0003gH-NK;
	Wed, 02 Nov 2011 15:53:55 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20145.26507.304000.889647@mariner.uk.xensource.com>
Date: Wed, 2 Nov 2011 15:53:47 +0000
To: Christoph Egger <Christoph.Egger@amd.com>
Subject: Re: [Xen-devel] [PATCH] tools/ocaml: unify build process
In-Reply-To: <4EB10C56.2070409@amd.com>
References: <4EAFBA53.4050009@amd.com>
	<20144.17097.967889.755421@mariner.uk.xensource.com>
	<4EB10C56.2070409@amd.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Christoph Egger writes ("Re: [Xen-devel] [PATCH] tools/ocaml: unify build process"):
> On 11/01/11 20:04, Ian Jackson wrote:
> > Can you remind me about this after this change has made it through the
> > automatic tester into xen-unstable.hg ?  I'd rather not just make the
> > same change to both trees at the same time, no matter how harmless it
> > looks...
> 
> It already happened as of reading your mail. :) So take this as a
> reminder: Please apply this to xen-4.1-testing.

The patch didn't apply cleanly, but I have fixed it up in
4.1-testing.hg's 23180:8c2d76193eaf (currently in staging).  Please do
double-check it works for you.

Thanks,
Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 09:04:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 09:04:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLdIi-0000kt-Ls; Wed, 02 Nov 2011 09:04:28 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLdFQ-0000TU-0w
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 09:01:32 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1320249660!62087!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17833 invoked from network); 2 Nov 2011 16:01:00 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 16:01:00 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8723095"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 16:01:00 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 16:01:00 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLdFL-0005RO-Pz; Wed, 02 Nov 2011 16:00:59 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLdFK-0006Lx-QM;
	Wed, 02 Nov 2011 16:00:59 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20145.26937.295743.89169@mariner.uk.xensource.com>
Date: Wed, 2 Nov 2011 16:00:57 +0000
To: Jean Guyader <jean.guyader@gmail.com>
Subject: Re: [Xen-devel] [PATCH] ioemu: Clone ioemu with --depth=1
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <CAEBdQ90x9FTW6L5njV3GDbTqmKDtuOGfe1nL23ZgfgoT2Tk_cA@mail.gmail.com>
References: <20111101173312.GH20553@spongy.cam.xci-test.com>
	<4EB0655F.5080107@tycho.nsa.gov>
	<1320184340.3084.23.camel@cthulhu.hellion.org.uk>
	<CAEBdQ90x9FTW6L5njV3GDbTqmKDtuOGfe1nL23ZgfgoT2Tk_cA@mail.gmail.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Jean Guyader <Jean.Guyader@citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Jean Guyader writes ("Re: [Xen-devel] [PATCH] ioemu: Clone ioemu with --depth=1"):
> I don't think it's fair to measure things in seconds here since it's
> very much depend on the Internet connection people are using. When
> building tip of xen-unstable we are actually downloading 3 times as
> much data that we actually need (9.9M instead of 29.11M).

I don't have an objection in principle to this patch, but it needs to
be made to work properly and that's difficult.

We haven't in the past made tags for every revision that is mentioned
in QEMU_TAG in xen-{*-testing,unstable}.hg.  In principle I guess we
could retrospectively make such tags.  (I think it is necessary that
"hg clone; hg up <revision>; make" should always work even if
<revision> is very old.)

Also I'm worried that some old versions of git may not have --depth.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 09:08:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 09:08:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLdMH-0001Fj-3f; Wed, 02 Nov 2011 09:08:09 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLdGK-0000UZ-Md
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 09:02:03 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1320249717!2063410!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13291 invoked from network); 2 Nov 2011 16:01:57 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 16:01:57 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8723113"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 16:01:57 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 16:01:57 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLdGH-0005Rk-9J; Wed, 02 Nov 2011 16:01:57 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLdGH-0006pa-7O;
	Wed, 02 Nov 2011 16:01:57 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20145.26997.102572.265189@mariner.uk.xensource.com>
Date: Wed, 2 Nov 2011 16:01:57 +0000
To: Jean Guyader <jean.guyader@gmail.com>
Subject: Re: [Xen-devel] [PATCH] ioemu: Clone ioemu with --depth=1
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <CAEBdQ91hEbRdEtG7xaQKmPWYfPf0o6dUH9SPtPEv_SBJ6cT8Uw@mail.gmail.com>
References: <20111101173312.GH20553@spongy.cam.xci-test.com>
	<4EB0655F.5080107@tycho.nsa.gov>
	<CAEBdQ91hEbRdEtG7xaQKmPWYfPf0o6dUH9SPtPEv_SBJ6cT8Uw@mail.gmail.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Jean Guyader <jean.guyader@eu.citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Jean Guyader writes ("Re: [Xen-devel] [PATCH] ioemu: Clone ioemu with --depth=1"> Yes, that a good point.
> I think we should use --depth=1 only when QEMU_TAG isn't set.

It's almost always set, pointing at a specific revision id, nowadays.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 09:10:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 09:10:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLdOr-0001e2-R8; Wed, 02 Nov 2011 09:10:50 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLdKv-00012O-MT
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 09:06:47 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-16.tower-174.messagelabs.com!1320249995!61786!1
X-Originating-IP: [216.32.181.184]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1558 invoked from network); 2 Nov 2011 16:06:37 -0000
Received: from ch1ehsobe004.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.184)
	by server-16.tower-174.messagelabs.com with AES128-SHA encrypted SMTP;
	2 Nov 2011 16:06:37 -0000
Received: from mail114-ch1-R.bigfish.com (10.43.68.248) by
	CH1EHSOBE004.bigfish.com (10.43.70.54) with Microsoft SMTP Server id
	14.1.225.22; Wed, 2 Nov 2011 16:06:20 +0000
Received: from mail114-ch1 (localhost.localdomain [127.0.0.1])	by
	mail114-ch1-R.bigfish.com (Postfix) with ESMTP id DA34FBE0112;
	Wed,  2 Nov 2011 16:06:28 +0000 (UTC)
X-SpamScore: -14
X-BigFish: VPS-14(zzbb2dK3b49K1432N98dKzz1202hzzz32i668h839h)
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
X-FB-SS: 13,
Received: from mail114-ch1 (localhost.localdomain [127.0.0.1]) by mail114-ch1
	(MessageSwitch) id 1320249987437376_10267;
	Wed,  2 Nov 2011 16:06:27 +0000 (UTC)
Received: from CH1EHSMHS015.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.246])	by mail114-ch1.bigfish.com (Postfix) with ESMTP id
	43EF3200054;	Wed,  2 Nov 2011 16:06:27 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	CH1EHSMHS015.bigfish.com (10.43.70.15) with Microsoft SMTP Server id
	14.1.225.22; Wed, 2 Nov 2011 16:06:17 +0000
X-WSS-ID: 0LU1JES-02-B7J-02
X-M-MSG: 
Received: from sausexedgep01.amd.com (sausexedgep01-ext.amd.com
	[163.181.249.72])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 2CBB9C8017;	Wed,  2 Nov 2011 11:06:27 -0500 (CDT)
Received: from SAUSEXDAG03.amd.com (163.181.55.3) by sausexedgep01.amd.com
	(163.181.36.54) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Wed, 2 Nov 2011 11:07:05 -0500
Received: from storexhtp02.amd.com (172.24.4.4) by sausexdag03.amd.com
	(163.181.55.3) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Wed, 2 Nov 2011 11:06:29 -0500
Received: from rhodium.osrc.amd.com (165.204.15.173) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.83.0;
	Wed, 2 Nov 2011 12:05:57 -0400
Message-ID: <4EB16A63.9040504@amd.com>
Date: Wed, 2 Nov 2011 17:05:55 +0100
From: Christoph Egger <Christoph.Egger@amd.com>
User-Agent: Mozilla/5.0 (X11; U; NetBSD amd64; en-US;
	rv:1.9.2.17) Gecko/20110523 Lightning/1.0b3pre Thunderbird/3.1.10
MIME-Version: 1.0
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH] tools/ocaml: unify build process
References: <4EAFBA53.4050009@amd.com>	<20144.17097.967889.755421@mariner.uk.xensource.com>	<4EB10C56.2070409@amd.com>
	<20145.26507.304000.889647@mariner.uk.xensource.com>
In-Reply-To: <20145.26507.304000.889647@mariner.uk.xensource.com>
Content-Type: text/plain; charset="ISO-8859-1"; format=flowed
Content-Transfer-Encoding: 7bit
X-OriginatorOrg: amd.com
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/02/11 16:53, Ian Jackson wrote:
> Christoph Egger writes ("Re: [Xen-devel] [PATCH] tools/ocaml: unify build process"):
>> On 11/01/11 20:04, Ian Jackson wrote:
>>> Can you remind me about this after this change has made it through the
>>> automatic tester into xen-unstable.hg ?  I'd rather not just make the
>>> same change to both trees at the same time, no matter how harmless it
>>> looks...
>>
>> It already happened as of reading your mail. :) So take this as a
>> reminder: Please apply this to xen-4.1-testing.
>
> The patch didn't apply cleanly, but I have fixed it up in
> 4.1-testing.hg's 23180:8c2d76193eaf (currently in staging).  Please do
> double-check it works for you.

It does. Thank you.

Christoph


-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 09:25:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 09:25:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLdcf-0002Jv-4q; Wed, 02 Nov 2011 09:25:05 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLdbL-00026h-O7
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 09:23:45 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1320251020!62534!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26309 invoked from network); 2 Nov 2011 16:23:40 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 16:23:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8723639"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 16:23:39 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 16:23:40 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLdbH-0005bv-Hr; Wed, 02 Nov 2011 16:23:39 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLdbH-0007CD-G1;
	Wed, 02 Nov 2011 16:23:39 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20145.28299.341643.693374@mariner.uk.xensource.com>
Date: Wed, 2 Nov 2011 16:23:39 +0000
To: Christoph Egger <Christoph.Egger@amd.com>
Subject: Re: [Xen-devel] [PATCH] libxl: allow to enable/disable cpuid bits
In-Reply-To: <4EB11F10.2030605@amd.com>
References: <4EAFD200.4010207@amd.com>
	<20144.17265.621187.887785@mariner.uk.xensource.com>
	<4EB10C00.10601@amd.com>
	<20111102102039.GA35143@ocelot.phlegethon.org>
	<4EB11F10.2030605@amd.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "Keir \(Xen.org\)" <keir@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Tim \(Xen.org\)" <tim@xen.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Christoph Egger writes ("Re: [Xen-devel] [PATCH] libxl: allow to enable/disable cpuid bits"):
> New version with that change attached.
> 
> Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>

Applied, thanks to both of you.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 09:26:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 09:26:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLdeK-0002ho-Mg; Wed, 02 Nov 2011 09:26:48 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLddn-0002Vl-DD
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 09:26:15 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-16.tower-174.messagelabs.com!1320251171!63997!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27666 invoked from network); 2 Nov 2011 16:26:12 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 16:26:12 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8723710"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 16:26:08 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 16:26:08 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLddg-0005cj-5Z; Wed, 02 Nov 2011 16:26:08 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLddg-0007Dn-47;
	Wed, 02 Nov 2011 16:26:08 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8bit
Message-ID: <20145.28448.10510.954331@mariner.uk.xensource.com>
Date: Wed, 2 Nov 2011 16:26:08 +0000
To: Roger Pau =?iso-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH 4 of 9] libxl: create pci backend only when
	there are pci devices
In-Reply-To: <CAPLaKK4WGXw5JUE0MEq2o-kfq-QTr4dKqsA_hTdSD2t6TYqLTA@mail.gmail.com>
References: <patchbomb.1317386580@loki> <156626fef95b36184ad4.1317386584@loki>
	<1318943767.3385.13.camel@zakaz.uk.xensource.com>
	<CAPLaKK4t5Ecfc-RmGgj-fNADpM-Bf8eAd1teeuKUxfDW+pTo+Q@mail.gmail.com>
	<1319016990.3385.90.camel@zakaz.uk.xensource.com>
	<CAPLaKK4WGXw5JUE0MEq2o-kfq-QTr4dKqsA_hTdSD2t6TYqLTA@mail.gmail.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Roger Pau Monné writes ("Re: [Xen-devel] [PATCH 4 of 9] libxl: create pci backend only when there are pci devices"):
> Please remember that this patch fixing the removal of PCI entries has
> not been applied along with the "libxl: rationalise libxl_device_*
> APIs" series.

Thanks for the reminder.  (I did have to dig a bit to find which patch
you meant.)

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 09:28:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 09:28:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLdgB-0003Cb-KE; Wed, 02 Nov 2011 09:28:43 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLdeB-0002dP-Vt
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 09:26:40 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1320251196!1704943!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2172 invoked from network); 2 Nov 2011 16:26:37 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 16:26:37 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8723735"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 16:26:36 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 16:26:36 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLde8-0005cu-4o; Wed, 02 Nov 2011 16:26:36 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLde8-0007E2-3c;
	Wed, 02 Nov 2011 16:26:36 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8bit
Message-ID: <20145.28475.994215.546700@mariner.uk.xensource.com>
Date: Wed, 2 Nov 2011 16:26:35 +0000
To: Roger Pau =?iso-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>, Ian Campbell
	<Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 4 of 9] libxl: create pci backend only when
	there are pci devices [and 1 more messages]
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1318943767.3385.13.camel@zakaz.uk.xensource.com>,
	<CAPLaKK4t5Ecfc-RmGgj-fNADpM-Bf8eAd1teeuKUxfDW+pTo+Q@mail.gmail.com>
References: <patchbomb.1317386580@loki> <156626fef95b36184ad4.1317386584@loki>
	<1318943767.3385.13.camel@zakaz.uk.xensource.com>
	<CAPLaKK4t5Ecfc-RmGgj-fNADpM-Bf8eAd1teeuKUxfDW+pTo+Q@mail.gmail.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ian Campbell writes ("Re: [Xen-devel] [PATCH 4 of 9] libxl: create pci backend only when there are pci devices"):
> libxl: libxl__device_pci_destroy_all should succeed if there is no PCI bus on the domain

Roger Pau Monné writes ("Re: [Xen-devel] [PATCH 4 of 9] libxl: create pci backend only when there are pci devices"):
> Acked-by: Roger Pau Monne <roger.pau@entel.upc.edu>

Applied, thanks.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 09:30:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 09:30:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLdhd-0003ah-AL; Wed, 02 Nov 2011 09:30:13 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLdh9-0003OL-6M
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 09:29:43 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1320251379!1959076!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7867 invoked from network); 2 Nov 2011 16:29:40 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 16:29:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8723809"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 16:29:03 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 16:29:04 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLdgV-0005dl-GJ; Wed, 02 Nov 2011 16:29:03 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLdgV-0007EO-FB;
	Wed, 02 Nov 2011 16:29:03 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20145.28623.303095.30428@mariner.uk.xensource.com>
Date: Wed, 2 Nov 2011 16:29:03 +0000
To: Philipp Hahn <hahn@univention.de>
Subject: Re: [Xen-devel] [PATCH v2] Add HybridISO support for PyGrub2
In-Reply-To: <201111012004.30624.hahn@univention.de>
References: <201110251057.06774.hahn@univention.de>
	<201110280946.51201.hahn@univention.de>
	<20144.16411.886176.254632@mariner.uk.xensource.com>
	<201111012004.30624.hahn@univention.de>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Philipp Hahn writes ("Re: [Xen-devel] [PATCH v2] Add HybridISO support for PyGrub2"):
> Am Dienstag 01 November 2011 19:53:15 schrieb Ian Jackson:
> > Thanks.  I tried to apply this but it has been linewrapped.  Can you
> > please resubmit it with a non-broken mailer ?  If you avoid lines >75
> > characters it probably won't linewrap, or you could attach it I guess.
> 
> I've attached the patch. Thank you for asking back.

Great, thanks, applied.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 09:36:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 09:36:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLdnR-00049b-0u; Wed, 02 Nov 2011 09:36:13 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLdmy-0003wU-Ej
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 09:35:44 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-16.tower-174.messagelabs.com!1320251741!65250!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3241 invoked from network); 2 Nov 2011 16:35:41 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 16:35:41 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8723981"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 16:35:41 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 16:35:41 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLdmu-0005gC-PB; Wed, 02 Nov 2011 16:35:40 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLdmu-0007Hq-OD;
	Wed, 02 Nov 2011 16:35:40 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20145.29020.585199.963856@mariner.uk.xensource.com>
Date: Wed, 2 Nov 2011 16:35:40 +0000
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH RFC v2 02/13] libxenstore: Provide
	xs_check_watch
In-Reply-To: <1320053998.23193.20.camel@zakaz.uk.xensource.com>
References: <1319827031-15395-1-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-2-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-3-git-send-email-ian.jackson@eu.citrix.com>
	<1320053998.23193.20.camel@zakaz.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ian Campbell writes ("Re: [Xen-devel] [PATCH RFC v2 02/13] libxenstore: Provide xs_check_watch"):
> Since setnonblock cannot itself return an error should it always
> preserve errno on behalf of the caller?

Good idea.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 09:37:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 09:37:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLdoT-0004Yx-Cv; Wed, 02 Nov 2011 09:37:17 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLdo1-0004MW-0H
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 09:36:49 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1320251805!63885!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31147 invoked from network); 2 Nov 2011 16:36:45 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 16:36:45 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8724023"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 16:36:45 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 16:36:45 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLdnx-0005ga-A7; Wed, 02 Nov 2011 16:36:45 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLdnx-0007I1-9N;
	Wed, 02 Nov 2011 16:36:45 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20145.29085.278257.629473@mariner.uk.xensource.com>
Date: Wed, 2 Nov 2011 16:36:45 +0000
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH RFC v2 06/13] libxl: permit declaration
	after statement
In-Reply-To: <1320054652.23193.28.camel@zakaz.uk.xensource.com>
References: <1319827031-15395-1-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-2-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-3-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-4-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-5-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-6-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-7-git-send-email-ian.jackson@eu.citrix.com>
	<1320054652.23193.28.camel@zakaz.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ian Campbell writes ("Re: [Xen-devel] [PATCH RFC v2 06/13] libxl: permit declaration after statement"):
> I suspect there isn't much scope for abuse of this capability but would
> a few words of guidance in CODING_STYLE make sense?

I don't think there's anything I feel needs saying.  If you think
people are likely to abuse it in a particular way then do say :-).

Otherwise we can wait and see what results and add stuff to
CODING_STYLE as necessary ?

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 09:38:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 09:38:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLdpa-0004wb-Sm; Wed, 02 Nov 2011 09:38:26 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLdpA-0004k1-JQ
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 09:38:00 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1320251877!2698520!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10469 invoked from network); 2 Nov 2011 16:37:57 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 16:37:57 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8724060"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 16:37:57 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 16:37:57 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLdp7-0005h1-3L; Wed, 02 Nov 2011 16:37:57 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLdp7-0007IC-26;
	Wed, 02 Nov 2011 16:37:57 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20145.29157.52893.552989@mariner.uk.xensource.com>
Date: Wed, 2 Nov 2011 16:37:57 +0000
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH RFC v2 07/13] libxl: internal convenience
	macros
In-Reply-To: <1320054815.23193.30.camel@zakaz.uk.xensource.com>
References: <1319827031-15395-1-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-2-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-3-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-4-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-5-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-6-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-7-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-8-git-send-email-ian.jackson@eu.citrix.com>
	<1320054815.23193.30.camel@zakaz.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ian Campbell writes ("Re: [Xen-devel] [PATCH RFC v2 07/13] libxl: internal convenience macros"):
> On Fri, 2011-10-28 at 19:37 +0100, Ian Jackson wrote:
> > +#define GC_INIT(ctx)  libxl__gc gc[1] = { LIBXL_INIT_GC(ctx) }
...
> Is there a massive conversion patch somewhere downseries?

Not yet.  I decided I didn't want to put that on the critical path for
my event handling series, and also of course I didn't want a large
style cleanup patch at the end of my series to keep getting conflicts.

However this is something I have my eye on.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 09:39:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 09:39:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLdqh-0005KE-6U; Wed, 02 Nov 2011 09:39:36 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLdqA-00057j-W5
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 09:39:03 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1320251939!2043053!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29931 invoked from network); 2 Nov 2011 16:39:00 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 16:39:00 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8724095"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 16:38:59 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 16:38:59 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLdq7-0005hQ-CW; Wed, 02 Nov 2011 16:38:59 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLdq7-0007II-Br;
	Wed, 02 Nov 2011 16:38:59 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20145.29219.355664.444870@mariner.uk.xensource.com>
Date: Wed, 2 Nov 2011 16:38:59 +0000
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH RFC v2 09/13] libxl: introduce lock in
	libxl_ctx
In-Reply-To: <1320055382.23193.38.camel@zakaz.uk.xensource.com>
References: <1319827031-15395-1-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-2-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-3-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-4-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-5-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-6-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-7-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-8-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-9-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-10-git-send-email-ian.jackson@eu.citrix.com>
	<1320055382.23193.38.camel@zakaz.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ian Campbell writes ("Re: [Xen-devel] [PATCH RFC v2 09/13] libxl: introduce lock in libxl_ctx"):
> On Fri, 2011-10-28 at 19:37 +0100, Ian Jackson wrote:
> > +    const pthread_mutex_t mutex_value = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
...
> > +    memcpy(&ctx->lock, &mutex_value, sizeof(ctx->lock));
> 
> Is this subtly different to
>        ctx->lock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
> in some way I'm missing?

Yes.  PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP is formally valid only as
an initialiser, not necessarily as an expression.  I'm not sure that
relevant GCC extensions mean the two are always equivalent.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 09:46:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 09:46:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLdxK-0006ZR-1i; Wed, 02 Nov 2011 09:46:26 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLdwp-0006N7-PH
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 09:45:56 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1320252327!46972899!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13804 invoked from network); 2 Nov 2011 16:45:27 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 16:45:27 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8724242"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 16:45:52 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 16:45:52 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLdwm-0005jx-1h; Wed, 02 Nov 2011 16:45:52 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLdwm-0007Iw-0r;
	Wed, 02 Nov 2011 16:45:52 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20145.29631.51700.316092@mariner.uk.xensource.com>
Date: Wed, 2 Nov 2011 16:45:51 +0000
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images fail
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1320238770.3084.51.camel@cthulhu.hellion.org.uk>
References: <1319808450-9617-1-git-send-email-cyliu@suse.com>
	<4EB184DE020000660000603E@novprvlin0050.provo.novell.com>
	<1320238770.3084.51.camel@cthulhu.hellion.org.uk>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Chun Yan Liu <cyliu@suse.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ian Campbell writes ("Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images fail"):
> On Wed, 2011-11-02 at 02:58 -0400, Chun Yan Liu wrote:
> > +    pid = fork();
> 
> This needs to be libxl_fork, I think. Perhaps even this whole thing
> should be libxl__spawn_spawn (not sure about that)?

libxl__spawn_spawn is for processes which are going to survive past
the lifetime of the call to libxl.  I think that for bootloaders this
is going to be the case when we do event handling, so probably that's
correct.

NB that you want the version from staging as that has important
changes from Olaf regarding subprocesses.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 10:02:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 10:02:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLeCg-0000Wv-Mj; Wed, 02 Nov 2011 10:02:18 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLe8s-0000Gw-HS
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 09:58:23 -0700
X-Env-Sender: davidoftheold@gmail.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1320253098!1708971!1
X-Originating-IP: [209.85.161.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7564 invoked from network); 2 Nov 2011 16:58:19 -0000
Received: from mail-fx0-f43.google.com (HELO mail-fx0-f43.google.com)
	(209.85.161.43)
	by server-8.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 16:58:19 -0000
Received: by faat9 with SMTP id t9so864764faa.30
	for <xen-devel@lists.xensource.com>;
	Wed, 02 Nov 2011 09:58:18 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:from:date
	:x-google-sender-auth:message-id:subject:to:cc:content-type;
	bh=ZuMNVNcoZhPJ6Avt2t5NLpKrQroTgOh2sIVqUWk2ReQ=;
	b=CM0InGv8tpKmQ5RS0McveAobfKzrFNEIWWgqxNF1lACdc6i1kzJQcNB88Lykmv2phr
	e+QVQcEEPBLZBiU95PhcJzKEjgHCZKPhSslKUf8H8i4Q3vzgEVF1bgmIInIC7WIwzqy+
	Ul3dCbNoByV5+KNF5jp8MYUp7fukHPGzLdviI=
Received: by 10.223.5.201 with SMTP id 9mr10041187faw.5.1320253046056; Wed, 02
	Nov 2011 09:57:26 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.223.125.143 with HTTP; Wed, 2 Nov 2011 09:57:04 -0700 (PDT)
In-Reply-To: <4EB17360.2020201@pcann.com>
References: <205BE649-7DF5-41EA-BB59-8089A0C5BD8D@di.uminho.pt>
	<CAEGWhjHQzKqZ3BD3Gsz5NeRaP87VWQdX+jRA8ZQXVGP2+LyTBA@mail.gmail.com>
	<4EB17360.2020201@pcann.com>
From: David Della Vecchia <ddv@darkholdings.com>
Date: Wed, 2 Nov 2011 12:57:04 -0400
X-Google-Sender-Auth: 0Q5fs2G7Yo-RMCRsdpkSIfICrgA
Message-ID: <CAEGWhjHhq+f6c8tBfJhOJ_oUQtwDgp2DGuCRkdwur0-H4T9yuA@mail.gmail.com>
To: Steven Wilcoxon <stevew@pcann.com>
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: [Xen-users] Blktap in mainline kernel 3.x
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============2034000250=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============2034000250==
Content-Type: multipart/alternative; boundary=000e0ce0ceaad2e8b804b0c35dcd

--000e0ce0ceaad2e8b804b0c35dcd
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

I've had it running for about a month now with no issues, i've got 35 beta
tester domU's on the box and everything seems to be going swimmingly.

A few things to keep in mind:

For some reason the debian xen packages do not have pv-grub so you need to
acquire that elsewhere, it doesn't need to be built on your system though,
i downloaded mine from a forum post somewhere (i used to download the xen
source and compile from scratch to get it).
This next one isn't so much a dom0 problem as a domU one but for some
reason debian squeeze (stable) guests are not capable of saving and
restoring their state. On restore the console and/or network devices will
be locked/frozen. I was able to get it to kinda work by custom compiling a
3.0.4 kernel but even then it was not reliable; however the centos domU's
are able to save/restore flawlessly. This was all on the wheezy dom0.

The xen packages in debian, and this might be the default for xen4.1+ now,
expect you to setup your own bridge, the network-bridge line of the
xend-config.sxp will be commented out or just not there at all. I put it
back in, I let the script the handle the bridging since it works fine for
my needs; that and my attempts to manually create a bridge following the
xen instructions always fail for some reason.

Stuff gets put into /usr/lib/xen-4.1 instead of /usr/lib/xen so i had to
update a lot of my scripts and config files when i switched to debian.

Also as far as i can tell, wheezy uses the stock 3.0.0-1 kernel for xen so
no custom kernel required like in squeeze with its 2.6.32-5-xen (its my
understanding this is the pvops option?).

As far as hvm guests go, as long as you use the hvmloader from the package
you'll be fine, if you custom compile xen there's a good chance your
hvmloader will be corrupted, it has something to do with the newer version
of gcc, though this may have been fixed in 4.1.2.

Hope that helps,
David





On Wed, Nov 2, 2011 at 12:44 PM, Steven Wilcoxon <stevew@pcann.com> wrote:

>  I've been thinking of doing a Wheezy install myself. How stable does it
> feel to you?
>
> S.W.
>
>
> On 11/2/2011 10:26 AM, David Della Vecchia wrote:
>
> I run a debian wheezy (testing) dom0 and it's 3.0.1 kernel does not have
> blktap(2) as you said however I did install the blktap dkms and was able =
to
> get the kernel module installed and running yet still domU's with blktap
> devices would just hang on boot with no error messages ever. I even tried
> recompiling the kernel and statically linking the blktap driver but it wa=
s
> the same results as using it modularized.
>
>  Sorry i can't help but to confirm your issue. I was also unable to get
> blktap working in centos6 with the 2.6 kernel. I use lvm-backed domU's bu=
t
> it would be nice to be able to store the swap or something locally with a
> tap: instead of file:
>
>  Thanks,
> DDV
>
> On Wed, Nov 2, 2011 at 7:14 AM, Jo=E3o Paulo <jtpaulo@di.uminho.pt> wrote=
:
>
>> Hi guys,
>>
>> I am using blktap for implementing a custom disk device for XEN DomUs. I
>> was using a previous version of Ubuntu that I need to upgrade to version
>> 11.10.  If i understood correctly, the blktap kernel module is not prese=
nt
>> in the mainline kernel 3.x. So my questions are:
>>
>> Can I get blktap/blktap2 working on ubuntu 11.10? If yes, can you point
>> me the procedure?
>>
>> I saw that project Kronos is aiming at a blktap dkms module for
>> debian/ubuntu http://blog.xen.org/index.php/2011/07/22/project-kronos/ .
>> However, i tried it in a AMD64 bit distribution and the module was deplo=
yed
>> correctly but blktap is still not working.
>>
>> Is there any other linux distro, or alternative better than Ubuntu 11.10
>> for my objectives?
>>
>> Finally, is there a better alternative for implementing custom I/O disk
>> drivers for VMs instead of the blktap mechanism? I have not looked deepl=
y
>> to HVM-XEN and Qemu, would this solution be less painful?
>>
>> Thanks for your help,
>>
>> Kind Regards,
>>
>> Jo=E3o Paulo
>> -----BEGIN PGP SIGNATURE-----
>>
>> iQEcBAEBAgAGBQJOsSYwAAoJEAY8eTZG4klmvLoIAJYn1YVD+a3ELsqcgM6EUa46
>> FORwKuXgOplz1iyXf354v7Qc1BJ9R0SJvNO6Ruf7XKqfiS+fx7SYkeN7GxvGsK9q
>> lSjKKDvZwnKNxe4BPPQ6JWZaifjgLDLgArhBZdPN204D67Hs6GhGo9g2af0q8h7k
>> ad/hkuiLkjroo2dDX908Y06WrCIArGTu6TDIezaV/CX4buKJrdb+HCBDezJRoxst
>> KjIxbZCo7c+uyjDhgKItaO981LxSBXngomctMJZp26QAyW7JcaqQX2y3H++c6DJF
>> ihlmy0DcRlKK3B7gV/HqZvLS4h04nP0Gm+CBWX7Hd7T2yhQqrxZGDm5gkviJtG8=3D
>> =3D22dU
>> -----END PGP SIGNATURE-----
>>
>> _______________________________________________
>> Xen-users mailing list
>> Xen-users@lists.xensource.com
>> http://lists.xensource.com/xen-users
>>
>
>
>
> _______________________________________________
> Xen-users mailing listXen-users@lists.xensource.comhttp://lists.xensource=
.com/xen-users
>
>
>

--000e0ce0ceaad2e8b804b0c35dcd
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

I&#39;ve had it running for about a month now with no issues, i&#39;ve got =
35 beta tester domU&#39;s on the box and everything seems to be going swimm=
ingly.<div><br></div><div>A few things to keep in mind:</div><div><br></div=
>

<div>For some reason the debian xen packages do not have pv-grub so you nee=
d to acquire that elsewhere, it doesn&#39;t need to be built on your system=
 though, i downloaded mine from a forum post somewhere (i used to download =
the xen source and compile from scratch to get it).=A0</div>

<div>This next one isn&#39;t so much a dom0 problem as a domU one but for s=
ome reason debian squeeze (stable) guests are not capable of saving and res=
toring their state. On restore the console and/or network devices will be l=
ocked/frozen. I was able to get it to kinda work by custom compiling a 3.0.=
4 kernel but even then it was not reliable; however the centos domU&#39;s a=
re able to save/restore flawlessly. This was all on the wheezy dom0.</div>

<div><br></div><div>The xen packages in debian, and this might be the defau=
lt for xen4.1+ now, expect you to setup your own bridge, the network-bridge=
 line of the xend-config.sxp will be commented out or just not there at all=
. I put it back in, I let the script the handle the bridging since it works=
 fine for my needs; that and my attempts to manually create a bridge follow=
ing the xen instructions always fail for some reason.=A0</div>

<div><br></div><div>Stuff gets put into /usr/lib/xen-4.1 instead of /usr/li=
b/xen so i had to update a lot of my scripts and config files when i switch=
ed to debian.=A0</div><div><br></div><div>Also as far as i can tell, wheezy=
 uses the stock 3.0.0-1 kernel for xen so no custom kernel required like in=
 squeeze with its 2.6.32-5-xen<span style=3D"background-color: transparent;=
 ">=A0(its my understanding this is the pvops option?).=A0</span></div>

<div><span style=3D"background-color: transparent; "><br></span></div><div>=
<span style=3D"background-color: transparent; ">As far as hvm guests go, as=
 long as you use the hvmloader from the package you&#39;ll be fine, if you =
custom compile xen there&#39;s a good chance your hvmloader will be corrupt=
ed, it has something to do with the newer version of gcc, though this may h=
ave been fixed in 4.1.2.=A0</span></div>

<div><span style=3D"background-color: transparent; "><br></span></div><div>=
<span style=3D"background-color: transparent; ">Hope that helps,</span></di=
v><div><span style=3D"background-color: transparent; ">David</span></div><d=
iv>

<span style=3D"background-color: transparent; "><br></span></div><div><span=
 style=3D"background-color: transparent; "><br></span></div><div><br></div>=
<div><br><br><div class=3D"gmail_quote">On Wed, Nov 2, 2011 at 12:44 PM, St=
even Wilcoxon <span dir=3D"ltr">&lt;<a href=3D"mailto:stevew@pcann.com">ste=
vew@pcann.com</a>&gt;</span> wrote:<br>

<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex;">
 =20
   =20
 =20
  <div bgcolor=3D"#FFFFFF" text=3D"#000000">
    I&#39;ve been thinking of doing a Wheezy install myself. How stable doe=
s
    it feel to you?<span class=3D"HOEnZb"><font color=3D"#888888"><br>
    <br>
    S.W.</font></span><div><div class=3D"h5"><br>
    <br>
    On 11/2/2011 10:26 AM, David Della Vecchia wrote:
    <blockquote type=3D"cite">I run a debian wheezy (testing) dom0 and it&#=
39;s 3.0.1
      kernel does not have blktap(2) as you said however I did install
      the blktap dkms and was able to get the kernel module installed
      and running yet still domU&#39;s with blktap devices would just hang
      on boot with no error messages ever. I even tried recompiling the
      kernel and statically linking the blktap driver but it was the
      same results as using it modularized.
      <div>
        <br>
      </div>
      <div>Sorry i can&#39;t help but to confirm your issue. I was also
        unable to get blktap working in centos6 with the 2.6 kernel. I
        use lvm-backed domU&#39;s but it would be nice to be able to store
        the swap or something locally with a tap: instead of file:=A0</div>
      <div><br>
      </div>
      <div>Thanks,</div>
      <div>DDV<br>
        <div><br>
          <div class=3D"gmail_quote">On Wed, Nov 2, 2011 at 7:14 AM, Jo=E3o
            Paulo <span dir=3D"ltr">&lt;<a href=3D"mailto:jtpaulo@di.uminho=
.pt" target=3D"_blank">jtpaulo@di.uminho.pt</a>&gt;</span>
            wrote:<br>
            <blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;bo=
rder-left:1px #ccc solid;padding-left:1ex">Hi
              guys,<br>
              <br>
              I am using blktap for implementing a custom disk device
              for XEN DomUs. I was using a previous version of Ubuntu
              that I need to upgrade to version 11.10. =A0If i understood
              correctly, the blktap kernel module is not present in the
              mainline kernel 3.x. So my questions are:<br>
              <br>
              Can I get blktap/blktap2 working on ubuntu 11.10? If yes,
              can you point me the procedure?<br>
              <br>
              I saw that project Kronos is aiming at a blktap dkms
              module for debian/ubuntu <a href=3D"http://blog.xen.org/index=
.php/2011/07/22/project-kronos/" target=3D"_blank">http://blog.xen.org/inde=
x.php/2011/07/22/project-kronos/</a>
              . However, i tried it in a AMD64 bit distribution and the
              module was deployed correctly but blktap is still not
              working.<br>
              <br>
              Is there any other linux distro, or alternative better
              than Ubuntu 11.10 for my objectives?<br>
              <br>
              Finally, is there a better alternative for implementing
              custom I/O disk drivers for VMs instead of the blktap
              mechanism? I have not looked deeply to HVM-XEN and Qemu,
              would this solution be less painful?<br>
              <br>
              Thanks for your help,<br>
              <br>
              Kind Regards,<br>
              <span><font color=3D"#888888"><br>
                  Jo=E3o Paulo</font></span><br>
              -----BEGIN PGP SIGNATURE-----<br>
              <br>
iQEcBAEBAgAGBQJOsSYwAAoJEAY8eTZG4klmvLoIAJYn1YVD+a3ELsqcgM6EUa46<br>
FORwKuXgOplz1iyXf354v7Qc1BJ9R0SJvNO6Ruf7XKqfiS+fx7SYkeN7GxvGsK9q<br>
lSjKKDvZwnKNxe4BPPQ6JWZaifjgLDLgArhBZdPN204D67Hs6GhGo9g2af0q8h7k<br>
ad/hkuiLkjroo2dDX908Y06WrCIArGTu6TDIezaV/CX4buKJrdb+HCBDezJRoxst<br>
KjIxbZCo7c+uyjDhgKItaO981LxSBXngomctMJZp26QAyW7JcaqQX2y3H++c6DJF<br>
ihlmy0DcRlKK3B7gV/HqZvLS4h04nP0Gm+CBWX7Hd7T2yhQqrxZGDm5gkviJtG8=3D<br>
              =3D22dU<br>
              -----END PGP SIGNATURE-----<br>
              <br>
              _______________________________________________<br>
              Xen-users mailing list<br>
              <a href=3D"mailto:Xen-users@lists.xensource.com" target=3D"_b=
lank">Xen-users@lists.xensource.com</a><br>
              <a href=3D"http://lists.xensource.com/xen-users" target=3D"_b=
lank">http://lists.xensource.com/xen-users</a><br>
            </blockquote>
          </div>
          <br>
        </div>
      </div>
      <br>
      <fieldset></fieldset>
      <br>
      <pre>_______________________________________________
Xen-users mailing list
<a href=3D"mailto:Xen-users@lists.xensource.com" target=3D"_blank">Xen-user=
s@lists.xensource.com</a>
<a href=3D"http://lists.xensource.com/xen-users" target=3D"_blank">http://l=
ists.xensource.com/xen-users</a></pre>
    </blockquote>
    <br>
  </div></div></div>

</blockquote></div><br></div>

--000e0ce0ceaad2e8b804b0c35dcd--


--===============2034000250==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============2034000250==--


From xen-devel-bounces@lists.xensource.com Wed Nov 02 10:09:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 10:09:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLeJq-0001kn-1l; Wed, 02 Nov 2011 10:09:42 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLeGp-0001KY-GZ
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 10:06:39 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1320253592!1716427!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25769 invoked from network); 2 Nov 2011 17:06:32 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 17:06:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8724641"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 17:06:32 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 17:06:31 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLeGl-0005qy-O4; Wed, 02 Nov 2011 17:06:31 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLeGl-0007RS-NO;
	Wed, 02 Nov 2011 17:06:31 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20145.30871.555628.244018@mariner.uk.xensource.com>
Date: Wed, 2 Nov 2011 17:06:31 +0000
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH v2] libxl: handle the return value of
	wait_for_dev_destroy select and pass it to caller function
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <52c8717d2e0841e08e35.1319033498@loki>
References: <52c8717d2e0841e08e35.1319033498@loki>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Roger Pau Monne writes ("[Xen-devel] [PATCH v2] libxl: handle the return value of wait_for_dev_destroy select and pass it to caller function"):
> libxl: handle the return value of wait_for_dev_destroy select and pass it to caller function.

Thanks.  I have applied this, although it will probably benefit from
some rework after my event patches go in.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 10:12:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 10:12:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLeMM-0002AD-Ur; Wed, 02 Nov 2011 10:12:18 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLeHo-0001T7-CT
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 10:07:36 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-6.tower-182.messagelabs.com!1320253653!1712335!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24672 invoked from network); 2 Nov 2011 17:07:33 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-6.tower-182.messagelabs.com with SMTP;
	2 Nov 2011 17:07:33 -0000
Received: from [192.168.100.15] (87-194-71-186.bethere.co.uk [87.194.71.186])
	by mail.avalus.com (Postfix) with ESMTPSA id C4BBCC5610B;
	Wed,  2 Nov 2011 17:07:28 +0000 (GMT)
Date: Wed, 02 Nov 2011 17:07:27 +0000
From: Alex Bligh <alex@alex.org.uk>
To: Alex Bligh <alex@alex.org.uk>, Boris Derzhavets <bderzhavets@yahoo.com>,
	=?UTF-8?Q?Pasi_K=C3=A4rkk=C3=A4inen?= <pasik@iki.fi>,
	Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark
	with	Ubuntu 11.10
Message-ID: <F7A5BDDF49A262AD874C0148@Ximines.local>
In-Reply-To: <4C629AA62C7654E9DCCA3890@Ximines.local>
References: <1320239310.13696.YahooMailClassic@web65915.mail.ac4.yahoo.com>
	<4C629AA62C7654E9DCCA3890@Ximines.local>
X-Mailer: Mulberry/4.0.8 (Mac OS X)
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com, Alex Bligh <alex@alex.org.uk>,
	dokter@icg.tugraz.at
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: Alex Bligh <alex@alex.org.uk>
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com



--On 2 November 2011 13:34:21 +0000 Alex Bligh <alex@alex.org.uk> wrote:

>> I was able to load Oneiric as PV on HVM at Xen 4.1.2 Oneiric Dom0
>> (3.1.0-030100-generic)  after rebuilding the recent 3.1.0-3 Ubuntu's
>> kernel with
>> CONFIG_XEN_PLATFORM_PCI=y , uploading debian packages  :-
>
> I very much doubt the reviewer did this. The -server variant (certainly
> on one of the Oneiric pre-releases) had CONFIG_XEN_PLATFORM_PCI=m so
> it should have been brought in by modprobe. I would guess -virtual
> is the same. The installer OTOH does /not/ have the module in the udeb
> which is an omission.

Actually, my mistake. -server does include CONFIG_XEN_PLATFORM_PCI
but
 /lib/modules/3.0.0-12-server/kernel/drivers/xen/xen-platform-pci.ko
(at the very least) is not being built into the initrd for some
reason, even on the distributed version.

I somehow doubt the Phoronix guys built their own kernel.  That
would imply they were using emulated disks.

-- 
Alex Bligh

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 10:14:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 10:14:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLeOJ-0002YE-Ew; Wed, 02 Nov 2011 10:14:19 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLeJs-0001ku-Bv
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 10:09:45 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1320253781!2667282!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13430 invoked from network); 2 Nov 2011 17:09:41 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 17:09:41 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8724698"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 17:09:18 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 17:09:18 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RLeJS-0005ru-Ae; Wed, 02 Nov 2011 17:09:18 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RLeJS-0007Sz-9v;
	Wed, 02 Nov 2011 17:09:18 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20145.31038.296391.346481@mariner.uk.xensource.com>
Date: Wed, 2 Nov 2011 17:09:18 +0000
To: Juergen Gross <juergen.gross@ts.fujitsu.com>
Subject: Re: [Xen-devel] [PATCH] Correct man page of xl regarding cpu-pools
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <57044b74a69d68fee06f.1320243801@nehalem1>
References: <57044b74a69d68fee06f.1320243801@nehalem1>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Juergen Gross writes ("[Xen-devel] [PATCH] Correct man page of xl regarding cpu-pools"):
> Signed-off-by: juergen.gross@ts.fujitsu.com

Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>

Thanks,
Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 10:16:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 10:16:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLeQB-0002xG-G3; Wed, 02 Nov 2011 10:16:15 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLeMQ-0002AU-CW
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 10:12:22 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1320253937!2690747!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24626 invoked from network); 2 Nov 2011 17:12:19 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-4.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 2 Nov 2011 17:12:19 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA2HCCd9012970
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 2 Nov 2011 17:12:12 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA2HCB6o020047
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 2 Nov 2011 17:12:11 GMT
Received: from abhmt103.oracle.com (abhmt103.oracle.com [141.146.116.55])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA2HC4WD021128; Wed, 2 Nov 2011 12:12:04 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 02 Nov 2011 10:12:04 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id DF4FF83487; Wed,  2 Nov 2011 13:12:03 -0400 (EDT)
Date: Wed, 2 Nov 2011 13:12:03 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: David Della Vecchia <ddv@darkholdings.com>,
	Ian Campbell <Ian.Campbell@eu.citrix.com>
Subject: Re: [Xen-devel] Re: [Xen-users] Blktap in mainline kernel 3.x
Message-ID: <20111102171203.GA24741@phenom.dumpdata.com>
References: <205BE649-7DF5-41EA-BB59-8089A0C5BD8D@di.uminho.pt>
	<CAEGWhjHQzKqZ3BD3Gsz5NeRaP87VWQdX+jRA8ZQXVGP2+LyTBA@mail.gmail.com>
	<4EB17360.2020201@pcann.com>
	<CAEGWhjHhq+f6c8tBfJhOJ_oUQtwDgp2DGuCRkdwur0-H4T9yuA@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAEGWhjHhq+f6c8tBfJhOJ_oUQtwDgp2DGuCRkdwur0-H4T9yuA@mail.gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090203.4EB179ED.0088,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, Steven Wilcoxon <stevew@pcann.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Nov 02, 2011 at 12:57:04PM -0400, David Della Vecchia wrote:
> I've had it running for about a month now with no issues, i've got 35 beta
> tester domU's on the box and everything seems to be going swimmingly.
> 
> A few things to keep in mind:
> 
> For some reason the debian xen packages do not have pv-grub so you need to
> acquire that elsewhere, it doesn't need to be built on your system though,
> i downloaded mine from a forum post somewhere (i used to download the xen
> source and compile from scratch to get it).
> This next one isn't so much a dom0 problem as a domU one but for some
> reason debian squeeze (stable) guests are not capable of saving and
> restoring their state. On restore the console and/or network devices will


That is the 2.6.32 kernel? Yeah, there are couple of bug-fixes floating
around for that. Ian might know exactly which ones.

> be locked/frozen. I was able to get it to kinda work by custom compiling a
> 3.0.4 kernel but even then it was not reliable; however the centos domU's
> are able to save/restore flawlessly. This was all on the wheezy dom0.
> 
> The xen packages in debian, and this might be the default for xen4.1+ now,
> expect you to setup your own bridge, the network-bridge line of the
> xend-config.sxp will be commented out or just not there at all. I put it
> back in, I let the script the handle the bridging since it works fine for
> my needs; that and my attempts to manually create a bridge following the
> xen instructions always fail for some reason.
> 
> Stuff gets put into /usr/lib/xen-4.1 instead of /usr/lib/xen so i had to
> update a lot of my scripts and config files when i switched to debian.
> 
> Also as far as i can tell, wheezy uses the stock 3.0.0-1 kernel for xen so
> no custom kernel required like in squeeze with its 2.6.32-5-xen (its my
> understanding this is the pvops option?).

<nods>
> 
> As far as hvm guests go, as long as you use the hvmloader from the package
> you'll be fine, if you custom compile xen there's a good chance your
> hvmloader will be corrupted, it has something to do with the newer version
> of gcc, though this may have been fixed in 4.1.2.

Yeah, it was something about __main being placed in the wrong offset.
I *hope* that has been fixed in 4.1.2.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 10:30:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 10:30:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLedp-0003WR-6p; Wed, 02 Nov 2011 10:30:21 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLecR-0003J4-Ns
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 10:28:56 -0700
X-Env-Sender: anil@recoil.org
X-Msg-Ref: server-6.tower-216.messagelabs.com!1320254932!2048537!1
X-Originating-IP: [89.16.177.154]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30840 invoked from network); 2 Nov 2011 17:28:52 -0000
Received: from recoil.dh.bytemark.co.uk (HELO dark.recoil.org) (89.16.177.154)
	by server-6.tower-216.messagelabs.com with SMTP;
	2 Nov 2011 17:28:52 -0000
Received: (qmail 18786 invoked by uid 634); 2 Nov 2011 17:28:52 -0000
X-Spam-Level: *
X-Spam-Status: No, hits=-1.4 required=5.0
	tests=ALL_TRUSTED
X-Spam-Check-By: dark.recoil.org
Received: from freak-0.srg.cl.cam.ac.uk (HELO freak-0.srg.cl.cam.ac.uk)
	(128.232.32.220)
	(smtp-auth username remote@recoil.org, mechanism cram-md5)
	by dark.recoil.org (qpsmtpd/0.83) with ESMTPA;
	Wed, 02 Nov 2011 17:28:51 +0000
Subject: Re: [Xen-devel] [PATCH RFC v2 03/13] libxl: Provide a version of
	bsd's queue.h as _libxl_list.h
Mime-Version: 1.0 (Apple Message framework v1251.1)
Content-Type: text/plain; charset=us-ascii
From: Anil Madhavapeddy <anil@recoil.org>
In-Reply-To: <1320054210.23193.23.camel@zakaz.uk.xensource.com>
Date: Wed, 2 Nov 2011 17:28:50 +0000
Content-Transfer-Encoding: quoted-printable
Message-Id: <63525D85-B6C7-480F-853B-4980BC1B612F@recoil.org>
References: <1319827031-15395-1-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-2-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-3-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-4-git-send-email-ian.jackson@eu.citrix.com>
	<1320054210.23193.23.camel@zakaz.uk.xensource.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
X-Mailer: Apple Mail (2.1251.1)
X-Virus-Checked: Checked by ClamAV on dark.recoil.org
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 31 Oct 2011, at 09:43, Ian Campbell wrote:

> On Fri, 2011-10-28 at 19:37 +0100, Ian Jackson wrote:
>> @@ -18,6 +18,14 @@ GPLv2. See the FSF's definition of GPL =
compatibility:
>> And how this applies to a range of open source licenses:
>>  http://www.gnu.org/licenses/license-list.html
>>=20
>> +Additionally, the documentation file =
tools/libxl/external/bsd-queue.3
>> +has the 4-clause BSD licence.  It is present in the Xen source tree
>> +for reference purposes for people developing Xen.  It is not =
installed
>> +by "make install" and is bundled in the source only for convenience =
of
>> +distribution.  We do not intend that we or Xen users or distributors
>> +should make any reference to "features or use" of that manpage.
>=20
> Anil pointed to the OpenBSD version of this page which has that clause
> removed. It would simplify things to use their version (of the header
> too for consistency)?  We are probably not comfortable with just
> rescinding the clause ourselves?

If you rescind it yourself, you'll need to go through the FreeBSD CVS =
history to make sure that there were no other contributors other than =
Berkeley. OpenBSD already did that in 2002 (and subsequent patches take =
on the new license, so it doesn't matter).

-anil=

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 10:31:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 10:31:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLef8-0003ti-OW; Wed, 02 Nov 2011 10:31:42 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLee9-0003bJ-Qq
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 10:30:44 -0700
X-Env-Sender: bderzhavets@yahoo.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1320255038!2660931!1
X-Originating-IP: [98.139.53.212]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26312 invoked from network); 2 Nov 2011 17:30:38 -0000
Received: from nm19-vm0.bullet.mail.ac4.yahoo.com (HELO
	nm19-vm0.bullet.mail.ac4.yahoo.com) (98.139.53.212)
	by server-12.tower-21.messagelabs.com with SMTP;
	2 Nov 2011 17:30:38 -0000
Received: from [98.139.52.193] by nm19.bullet.mail.ac4.yahoo.com with NNFMP;
	02 Nov 2011 17:30:37 -0000
Received: from [98.139.52.155] by tm6.bullet.mail.ac4.yahoo.com with NNFMP;
	02 Nov 2011 17:30:37 -0000
Received: from [127.0.0.1] by omp1038.mail.ac4.yahoo.com with NNFMP;
	02 Nov 2011 17:30:37 -0000
X-Yahoo-Newman-Property: ymail-3
X-Yahoo-Newman-Id: 439237.64081.bm@omp1038.mail.ac4.yahoo.com
Received: (qmail 84867 invoked by uid 60001); 2 Nov 2011 17:30:37 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024;
	t=1320255037; bh=OtnM3E/3cAY2wcuc7m7DguhfXuQbgfi3R3+D+0eIBgA=;
	h=X-YMail-OSG:Received:X-Mailer:Message-ID:Date:From:Subject:To:Cc:In-Reply-To:MIME-Version:Content-Type;
	b=YbuUjWKqwn00f0mf0HbNs3ItVmYdfV07gAO/iUtD6id+oLle/jm4H5Vjzc1gI1RiYoCLpclEJseAufAQTS72m1uOzZkcreJGAM5K01eVI5R9g2oKqXLSTnxaYr2jbY+eQzvmYDlJ5Nn2cGasny05mcK8ZWpd6owSvj+0VkjlW1w=
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com;
	h=X-YMail-OSG:Received:X-Mailer:Message-ID:Date:From:Subject:To:Cc:In-Reply-To:MIME-Version:Content-Type;
	b=dppTO3rUjA9DIi1m8YF6kwtUPT+mF7nMAule6Z7EM7bGutgKC0AK7TqrFSkDHifdAaPMclrW8lvsKj+9hIjh7l9+Ykgann11lxN13QsRs4FuPCGq/BxovBY+FyMw/ROPCdLxa8DNG/K/2DisqMZhxZIElVZdHXV2mezm7iB7p9I=;
X-YMail-OSG: NHv1CeUVM1nBIzUxy84aeTFZelm7DBxKn2.d3FKNwoWndSe
	uVtlwW_FWLka9aiIK9VwceRj5M1XxcpA.pgjHNfLBnv7_NHeb_08MjCVOjEz
	wXJnoHJ_DOC9P6MDwY8WR_meN7eGtBYYvllPmQ7eQIa.3vaW6B3cRqddrs_v
	UqD6WZU11wMPrmzfIKaeRgLnBjaRmTuTafCkPmqfz8GlGI_p1hz8CVRuycbS
	sT_T3X2TwJVtVGBibY4jXTZTkXNXk_UKfNgqGmww1EIFMF9hVvgnwd8SGm4y
	89VaYOmOqBqPs7TG8XZllMv0PhvKIsPYaGJjuy1_gs6xwza3FXNxprHdsAbz
	45ndvi6OrSDclHqDbIsWfDcTg1jnAoxk6pgycdItfX.wgDzCjpjHUoR_5IlJ
	tVfAMM_sp3fJtKJXtaZ2Z9pxOBO2WGxA1e_Jvn0clNzAXrzQ5M.Td7LPlEWc
	SbABuoaSK82D.y_giuPSIzeC6AfMT
Received: from [109.165.7.148] by web65905.mail.ac4.yahoo.com via HTTP;
	Wed, 02 Nov 2011 10:30:37 PDT
X-Mailer: YahooMailClassic/14.0.11 YahooMailWebService/0.8.115.325013
Message-ID: <1320255037.83938.YahooMailClassic@web65905.mail.ac4.yahoo.com>
Date: Wed, 2 Nov 2011 10:30:37 -0700 (PDT)
From: Boris Derzhavets <bderzhavets@yahoo.com>
Subject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark with
	Ubuntu 11.10
To: Alex Bligh <alex@alex.org.uk>,
	=?iso-8859-1?Q?Pasi_K=E4rkk=E4inen?= <pasik@iki.fi>,
	Ian Campbell <Ian.Campbell@citrix.com>
In-Reply-To: <F7A5BDDF49A262AD874C0148@Ximines.local>
MIME-Version: 1.0
Cc: xen-devel@lists.xensource.com, dokter@icg.tugraz.at,
	Alex Bligh <alex@alex.org.uk>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0558531236=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0558531236==
Content-Type: multipart/alternative;
	boundary="762225645-2109589161-1320255037=:83938"

--762225645-2109589161-1320255037=:83938
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

I didn't benchmarking too much but same Ubuntu Oneiric Instance ( on my box=
) may be loaded for virsh "Qemu" connection=A0 and may be loaded for "Xen 4=
.1.2" connection.
I see significant performance improvement for Oneiric PVHVM.=A0 It has perf=
ormance pretty
close to KVM guests (virtio disks and NICs, Qemu-kvm 0.15.1).=A0 I suspect =
Phoronix
tested just HVM, regardless kernel rebuild in Ubuntu's style is very well d=
ocumented.
It's a question of basic debian background nothing else.

Boris.

--- On Wed, 11/2/11, Alex Bligh <alex@alex.org.uk> wrote:

From: Alex Bligh <alex@alex.org.uk>
Subject: Re: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark with U=
buntu 11.10
To: "Alex Bligh" <alex@alex.org.uk>, "Boris Derzhavets" <bderzhavets@yahoo.=
com>, "Pasi K=E4rkk=E4inen" <pasik@iki.fi>, "Ian Campbell" <Ian.Campbell@ci=
trix.com>
Cc: xen-devel@lists.xensource.com, "Alex Bligh" <alex@alex.org.uk>, dokter@=
icg.tugraz.at
Date: Wednesday, November 2, 2011, 1:07 PM



--On 2 November 2011 13:34:21 +0000 Alex Bligh <alex@alex.org.uk> wrote:

>> I was able to load Oneiric as PV on HVM at Xen 4.1.2 Oneiric Dom0
>> (3.1.0-030100-generic)=A0 after rebuilding the recent 3.1.0-3 Ubuntu's
>> kernel with
>> CONFIG_XEN_PLATFORM_PCI=3Dy , uploading debian packages=A0 :-
>=20
> I very much doubt the reviewer did this. The -server variant (certainly
> on one of the Oneiric pre-releases) had CONFIG_XEN_PLATFORM_PCI=3Dm so
> it should have been brought in by modprobe. I would guess -virtual
> is the same. The installer OTOH does /not/ have the module in the udeb
> which is an omission.

Actually, my mistake. -server does include CONFIG_XEN_PLATFORM_PCI
but
/lib/modules/3.0.0-12-server/kernel/drivers/xen/xen-platform-pci.ko
(at the very least) is not being built into the initrd for some
reason, even on the distributed version.

I somehow doubt the Phoronix guys built their own kernel.=A0 That
would imply they were using emulated disks.

-- Alex Bligh

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--762225645-2109589161-1320255037=:83938
Content-Type: text/html; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

<table cellspacing=3D"0" cellpadding=3D"0" border=3D"0" ><tr><td valign=3D"=
top" style=3D"font: inherit;">I didn't benchmarking too much but same Ubunt=
u Oneiric Instance ( on my box) may be loaded for virsh "Qemu" connection&n=
bsp; and may be loaded for "Xen 4.1.2" connection.<br>I see significant per=
formance improvement for Oneiric PVHVM.&nbsp; It has performance pretty<br>=
close to KVM guests (virtio disks and NICs, Qemu-kvm 0.15.1).&nbsp; I suspe=
ct Phoronix<br>tested just HVM, regardless kernel rebuild in Ubuntu's style=
 is very well documented.<br>It's a question of basic debian background not=
hing else.<br><br>Boris.<br><br>--- On <b>Wed, 11/2/11, Alex Bligh <i>&lt;a=
lex@alex.org.uk&gt;</i></b> wrote:<br><blockquote style=3D"border-left: 2px=
 solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><br>From: Al=
ex Bligh &lt;alex@alex.org.uk&gt;<br>Subject: Re: [Xen-devel] Phoronix Xen =
vs KVM vs Virtualbox benchmark with Ubuntu 11.10<br>To: "Alex Bligh"
 &lt;alex@alex.org.uk&gt;, "Boris Derzhavets" &lt;bderzhavets@yahoo.com&gt;=
, "Pasi K=E4rkk=E4inen" &lt;pasik@iki.fi&gt;, "Ian Campbell" &lt;Ian.Campbe=
ll@citrix.com&gt;<br>Cc: xen-devel@lists.xensource.com, "Alex Bligh" &lt;al=
ex@alex.org.uk&gt;, dokter@icg.tugraz.at<br>Date: Wednesday, November 2, 20=
11, 1:07 PM<br><br><div class=3D"plainMail"><br><br>--On 2 November 2011 13=
:34:21 +0000 Alex Bligh &lt;<a ymailto=3D"mailto:alex@alex.org.uk" href=3D"=
/mc/compose?to=3Dalex@alex.org.uk">alex@alex.org.uk</a>&gt; wrote:<br><br>&=
gt;&gt; I was able to load Oneiric as PV on HVM at Xen 4.1.2 Oneiric Dom0<b=
r>&gt;&gt; (3.1.0-030100-generic)&nbsp; after rebuilding the recent 3.1.0-3=
 Ubuntu's<br>&gt;&gt; kernel with<br>&gt;&gt; CONFIG_XEN_PLATFORM_PCI=3Dy ,=
 uploading debian packages&nbsp; :-<br>&gt; <br>&gt; I very much doubt the =
reviewer did this. The -server variant (certainly<br>&gt; on one of the One=
iric pre-releases) had CONFIG_XEN_PLATFORM_PCI=3Dm so<br>&gt; it should hav=
e been
 brought in by modprobe. I would guess -virtual<br>&gt; is the same. The in=
staller OTOH does /not/ have the module in the udeb<br>&gt; which is an omi=
ssion.<br><br>Actually, my mistake. -server does include CONFIG_XEN_PLATFOR=
M_PCI<br>but<br>/lib/modules/3.0.0-12-server/kernel/drivers/xen/xen-platfor=
m-pci.ko<br>(at the very least) is not being built into the initrd for some=
<br>reason, even on the distributed version.<br><br>I somehow doubt the Pho=
ronix guys built their own kernel.&nbsp; That<br>would imply they were usin=
g emulated disks.<br><br>-- Alex Bligh<br><br>_____________________________=
__________________<br>Xen-devel mailing list<br><a ymailto=3D"mailto:Xen-de=
vel@lists.xensource.com" href=3D"/mc/compose?to=3DXen-devel@lists.xensource=
.com">Xen-devel@lists.xensource.com</a><br><a href=3D"http://lists.xensourc=
e.com/xen-devel" target=3D"_blank">http://lists.xensource.com/xen-devel</a>=
<br></div></blockquote></td></tr></table>
--762225645-2109589161-1320255037=:83938--


--===============0558531236==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0558531236==--


From xen-devel-bounces@lists.xensource.com Wed Nov 02 10:35:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 10:35:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLeie-0004U6-Lr; Wed, 02 Nov 2011 10:35:20 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLeiB-0004I2-2e
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 10:34:51 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1320255288!2702980!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20177 invoked from network); 2 Nov 2011 17:34:48 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 17:34:48 -0000
X-IronPort-AV: E=Sophos;i="4.69,444,1315180800"; 
   d="scan'208";a="8725170"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 17:34:47 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 17:34:47 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RLei6-00061O-T4;
	Wed, 02 Nov 2011 17:34:46 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RLei6-0002VW-MJ;
	Wed, 02 Nov 2011 17:34:46 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9656-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 2 Nov 2011 17:34:46 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9656: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9656 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9656/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf      7 debian-install             fail REGR. vs. 9652

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  119bccb1cc5e
baseline version:
 xen                  068d3d55ce6e

------------------------------------------------------------
People who touched revisions under test:
  "Kay, Allen M" <allen.m.kay@intel.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Roger Pau Monne <roger.pau@entel.upc.edu>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24052:119bccb1cc5e
tag:         tip
user:        Jan Beulich <jbeulich@suse.com>
date:        Wed Nov 02 13:53:05 2011 +0100
    
    passthrough: re-attempt ACS and ATS enabling when devices get reported by Dom0
    
    Since extended config space accesses may not be possible when
    scan_pci_devices() runs (due to MMCFG resources not being reserved in
    the E820 table, which the specification allows to be the case),
    functionality enabling of which requires such must be re-attempted
    when it is known whether MMCFG is safe to use.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: "Kay, Allen M" <allen.m.kay@intel.com>
    
    
changeset:   24051:6da8953b7a90
user:        Jan Beulich <jbeulich@suse.com>
date:        Wed Nov 02 13:51:28 2011 +0100
    
    VT-d/ATS: cleanup
    
    - make acpi_find_matched_atsr_unit() consistent with
      acpi_find_matched_drhd_unit() (and constify their parameter)
    - make ats_device() take a struct pci_dev * instead of seg:bus:devfn
      and additionally the matching DRHD (as its callers already worked
      that out)
    - remove a stale prototype
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: "Kay, Allen M" <allen.m.kay@intel.com>
    
    
changeset:   24050:068d3d55ce6e
user:        Christoph Egger <Christoph.Egger@amd.com>
date:        Tue Nov 01 19:03:38 2011 +0000
    
    tools/ocaml: unify build process
    
    Unify ocaml build process for different platforms.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 25378e0a76b282127e9ab8933a4defbc91db3862
Author: Roger Pau Monne <roger.pau@entel.upc.edu>
Date:   Thu Oct 6 18:38:08 2011 +0100

    remove blktap when building for NetBSD
    
    NetBSD has no blktap support, so remove the use of the blktap if the
    OS is NetBSD.
    
    Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 10:38:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 10:38:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLelY-00050T-4t; Wed, 02 Nov 2011 10:38:20 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLel6-0004nW-Ot
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 10:37:53 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-11.tower-27.messagelabs.com!1320255456!44154243!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20267 invoked from network); 2 Nov 2011 17:37:37 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-11.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 2 Nov 2011 17:37:37 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320255469; l=928;
	s=domk; d=aepfle.de;
	h=To:From:Date:Subject:Content-Transfer-Encoding:MIME-Version:
	Content-Type:X-RZG-CLASS-ID:X-RZG-AUTH;
	bh=OX53zo4e2zuN/W08XaIcnidXbPQ=;
	b=emmEumlEZLvldxpSsCfdqi0zCmbnLERRjCl2fZjtHMM5FhjPG+nsPT4aQtbvJ5hhI3j
	EilkTC3KrPxgK0/qQlqCJoM1UX0R5CwsT9odbcF7VA4b824FDZ2u+56ExpLCkxa8mO0wR
	E7xvzKqEeY5nMrjB2U3igB7BO6pp42z00XQ=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV71Y=
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-5.vodafone-net.de [80.226.24.5])
	by smtp.strato.de (fruni mo29) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id u0312fnA2H1wjv
	for <xen-devel@lists.xensource.com>;
	Wed, 2 Nov 2011 18:37:30 +0100 (MET)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 3766F18637
	for <xen-devel@lists.xensource.com>;
	Wed,  2 Nov 2011 18:37:28 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 79677f532a2406ca501250b50fa8b33965a8d7d7
Message-Id: <79677f532a2406ca5012.1320255446@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Wed, 02 Nov 2011 18:37:26 +0100
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] xenpaging: munmap all pages after page-in
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1320254973 -3600
# Node ID 79677f532a2406ca501250b50fa8b33965a8d7d7
# Parent  951a9879c34bee1dd2fa0329a541ae089f271c11
xenpaging: munmap all pages after page-in

Do munmap() on all mapped pages, not just the first one.  Without this
change the gfns backing the remaining pages can not be paged out again
because the page count does not go down to 1. This change was missing
from changeset 23827:d1d6abc1db20.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 951a9879c34b -r 79677f532a24 tools/xenpaging/pagein.c
--- a/tools/xenpaging/pagein.c
+++ b/tools/xenpaging/pagein.c
@@ -44,7 +44,7 @@ static void *page_in(void *arg)
         /* Ignore errors */
         page = xc_map_foreign_pages(pia->xch, pia->dom, PROT_READ, gfns, num);
         if (page)
-            munmap(page, PAGE_SIZE);
+            munmap(page, PAGE_SIZE * num);
     }
     page_in_possible = 0;
     pthread_exit(NULL);

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 11:35:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 11:35:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLfeV-0006SD-Tj; Wed, 02 Nov 2011 11:35:07 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLfdd-0006Ef-PG
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 11:34:14 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-7.tower-182.messagelabs.com!1320258850!1728186!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16723 invoked from network); 2 Nov 2011 18:34:10 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-7.tower-182.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 2 Nov 2011 18:34:10 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320258850; l=3690;
	s=domk; d=aepfle.de;
	h=To:From:Date:Subject:Content-Transfer-Encoding:MIME-Version:
	Content-Type:X-RZG-CLASS-ID:X-RZG-AUTH;
	bh=byyaGAAJjvUURgev/n0DpWppUsU=;
	b=gpiIgq1aDpR46Db6uqGbZQW1VEHTwDdt/qRyJdI0cyCXAPpiIq5rlOxZRJhMeC9BGsS
	krroaamkSaD2nh2ZJTWeVaoaoHwo8U2/YcAQzxAoS8kxXM6W2Qx9D3kmcvdqFMBH17NV9
	2xdid11rIhWWw3ZtNu03fcRXPOdp0uqfQAE=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV71Y=
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-5.vodafone-net.de [80.226.24.5])
	by post.strato.de (mrclete mo57) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id w01ed2nA2H2M3h
	for <xen-devel@lists.xensource.com>;
	Wed, 2 Nov 2011 19:34:00 +0100 (MET)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 88F5A18637
	for <xen-devel@lists.xensource.com>;
	Wed,  2 Nov 2011 19:33:58 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: af9eb3b6c6d874e54d28bec61c32e0c4668d2b47
Message-Id: <af9eb3b6c6d874e54d28.1320258837@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Wed, 02 Nov 2011 19:33:57 +0100
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] xenpaging: improve policy mru list handling
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1320258644 -3600
# Node ID af9eb3b6c6d874e54d28bec61c32e0c4668d2b47
# Parent  79677f532a2406ca501250b50fa8b33965a8d7d7
xenpaging: improve policy mru list handling

Without this change it is not possible to page-out all guest pages, then
trigger a page-in for all pages, and then page-out everything once
again. All pages in the mru list can not be paged out because they
remain active in the internal bitmap of paged pages.

Use the mru list only if the number of paged-out pages is larger than
the mru list. If the number is smaller, start to clear the mru list. In
case the number of paged-out pages drops to zero the mru list and the
internal bitmap will be empty as well.

Also add a new interface for dropped pages. If a gfn was dropped there
is no need to adjust the mru list because dropping a page is not usage
of a page.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 79677f532a24 -r af9eb3b6c6d8 tools/xenpaging/policy.h
--- a/tools/xenpaging/policy.h
+++ b/tools/xenpaging/policy.h
@@ -32,6 +32,8 @@ int policy_init(xenpaging_t *paging);
 int policy_choose_victim(xenpaging_t *paging, xenpaging_victim_t *victim);
 void policy_notify_paged_out(unsigned long gfn);
 void policy_notify_paged_in(unsigned long gfn);
+void policy_notify_paged_in_nomru(unsigned long gfn);
+void policy_notify_dropped(unsigned long gfn);
 
 #endif // __XEN_PAGING_POLICY_H__
 
diff -r 79677f532a24 -r af9eb3b6c6d8 tools/xenpaging/policy_default.c
--- a/tools/xenpaging/policy_default.c
+++ b/tools/xenpaging/policy_default.c
@@ -57,7 +57,7 @@ int policy_init(xenpaging_t *paging)
     if ( paging->policy_mru_size > 0 )
         mru_size = paging->policy_mru_size;
     else
-        mru_size = DEFAULT_MRU_SIZE;
+        mru_size = paging->policy_mru_size = DEFAULT_MRU_SIZE;
 
     mru = malloc(sizeof(*mru) * mru_size);
     if ( mru == NULL )
@@ -120,17 +120,38 @@ void policy_notify_paged_out(unsigned lo
     clear_bit(gfn, unconsumed);
 }
 
-void policy_notify_paged_in(unsigned long gfn)
+static void policy_handle_paged_in(unsigned long gfn, int do_mru)
 {
     unsigned long old_gfn = mru[i_mru & (mru_size - 1)];
 
     if ( old_gfn != INVALID_MFN )
         clear_bit(old_gfn, bitmap);
     
-    mru[i_mru & (mru_size - 1)] = gfn;
+    if (do_mru) {
+        mru[i_mru & (mru_size - 1)] = gfn;
+    } else {
+        clear_bit(gfn, bitmap);
+        mru[i_mru & (mru_size - 1)] = INVALID_MFN;
+    }
+
     i_mru++;
 }
 
+void policy_notify_paged_in(unsigned long gfn)
+{
+    policy_handle_paged_in(gfn, 1);
+}
+
+void policy_notify_paged_in_nomru(unsigned long gfn)
+{
+    policy_handle_paged_in(gfn, 0);
+}
+
+void policy_notify_dropped(unsigned long gfn)
+{
+    clear_bit(gfn, bitmap);
+}
+
 
 /*
  * Local variables:
diff -r 79677f532a24 -r af9eb3b6c6d8 tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -618,7 +618,14 @@ static int xenpaging_resume_page(xenpagi
     /* Notify policy of page being paged in */
     if ( notify_policy )
     {
-        policy_notify_paged_in(rsp->gfn);
+        /*
+         * Do not add gfn to mru list if the target is lower than mru size.
+         * This allows page-out of these gfns if the target grows again.
+         */
+        if (paging->num_paged_out > paging->policy_mru_size)
+            policy_notify_paged_in(rsp->gfn);
+        else
+            policy_notify_paged_in_nomru(rsp->gfn);
 
        /* Record number of resumed pages */
        paging->num_paged_out--;
@@ -889,7 +896,7 @@ int main(int argc, char *argv[])
                 {
                     DPRINTF("drop_page ^ gfn %"PRIx64" pageslot %d\n", req.gfn, i);
                     /* Notify policy of page being dropped */
-                    policy_notify_paged_in(req.gfn);
+                    policy_notify_dropped(req.gfn);
                 }
                 else
                 {

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 12:19:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 12:19:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLgLm-0008BD-Qp; Wed, 02 Nov 2011 12:19:50 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLgKg-0007ye-MI
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 12:18:44 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1320261517!79367!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14252 invoked from network); 2 Nov 2011 19:18:39 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-14.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 19:18:39 -0000
X-IronPort-AV: E=Sophos;i="4.69,445,1315195200"; d="scan'208";a="169164703"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 15:18:37 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Wed, 2 Nov 2011
	15:18:36 -0400
Message-ID: <1320261513.3084.53.camel@cthulhu.hellion.org.uk>
Subject: Re: [Xen-devel] [PATCH] Correct man page of xl regarding cpu-pools
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Juergen Gross <juergen.gross@ts.fujitsu.com>
Date: Thu, 3 Nov 2011 04:18:33 +0900
In-Reply-To: <57044b74a69d68fee06f.1320243801@nehalem1>
References: <57044b74a69d68fee06f.1320243801@nehalem1>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-02 at 10:23 -0400, Juergen Gross wrote:
> @@ -791,7 +795,7 @@ List pass-through pci devices for a doma
>  
>  =head1 SEE ALSO
>  
> -B<xldomain.cfg>(5), B<xentop>(1)
> +B<xldomain.cfg>(5), B<xlcpupool.cfg>(5), B<xentop>(1)

Does xlcpupoo.cfg(5) exist? I couldn't find it (I know xldomain.cfg
doesn't, I have a pending action item to change that link).

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 12:34:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 12:34:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLgZp-0000M5-2f; Wed, 02 Nov 2011 12:34:21 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLgZH-00009Q-7a
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 12:33:47 -0700
X-Env-Sender: greg@kroah.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1320262423!2074043!1
X-Originating-IP: [66.111.4.29]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10994 invoked from network); 2 Nov 2011 19:33:44 -0000
Received: from out5.smtp.messagingengine.com (HELO
	out5.smtp.messagingengine.com) (66.111.4.29)
	by server-7.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 2 Nov 2011 19:33:44 -0000
Received: from compute3.internal (compute3.nyi.mail.srv.osa [10.202.2.43])
	by gateway1.nyi.mail.srv.osa (Postfix) with ESMTP id 0C43820744;
	Wed,  2 Nov 2011 15:33:43 -0400 (EDT)
Received: from frontend2.nyi.mail.srv.osa ([10.202.2.161])
	by compute3.internal (MEProxy); Wed, 02 Nov 2011 15:33:43 -0400
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=date:from:to:cc:subject:message-id
	:references:mime-version:content-type:in-reply-to; s=smtpout;
	bh=aLgl9YYYijZbpUK2pNA/toX5bPk=; b=o5neIGsy3k4WwIHEovB9/pLaAfy3
	LZ2aLS/gYK0ae4M1JR0NoNxAgOSIJ5yHQArdAgqfn5XUaT6e3l43F9fjteTPD8d4
	bbxDVdLtxt75xe1Qsq05La4j4jLS36wMOkklzSr1MO60V+aMHll3QKkoJuKj45Lc
	5uSAID3NAWymshU=
X-Sasl-enc: p8cDzw1UnjLYWv9Ip+UGnX1gTJRY0KVcQ0IPV11JFosS 1320262422
Received: from localhost (c-76-121-69-168.hsd1.wa.comcast.net [76.121.69.168])
	by mail.messagingengine.com (Postfix) with ESMTPSA id 7CA95483403;
	Wed,  2 Nov 2011 15:33:42 -0400 (EDT)
Date: Wed, 2 Nov 2011 12:21:10 -0700
From: Greg KH <greg@kroah.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Message-ID: <20111102192110.GA25413@kroah.com>
References: <20111026210539.64BA823EB@git.kroah.org>
	<20111101230951.GA21951@kroah.com>
	<1320209597.3084.36.camel@cthulhu.hellion.org.uk>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1320209597.3084.36.camel@cthulhu.hellion.org.uk>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	"stable@vger.kernel.org" <stable@vger.kernel.org>,
	"Rafael J. Wysocki" <rjw@sisk.pl>,
	xen-devel <xen-devel@lists.xensource.com>,
	Stefan Bader <stefan.bader@canonical.com>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: Patch Upstream: genirq: Add IRQF_RESUME_EARLY and
 resume such IRQs earlier
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Nov 02, 2011 at 01:53:17PM +0900, Ian Campbell wrote:
> Hi Greg,
> 
> On Tue, 2011-11-01 at 19:09 -0400, Greg KH wrote:
> > If someone wants this in .32-stable, can they provide me a backported
> > version, as this doesn't backport very easily (i.e. I tried and failed.)
> 
> Please see <1318859710.16132.15.camel@zakaz.uk.xensource.com> which
> contains a backported version of the patch.

Hm, any chance you could forward that to me?  I don't see it in my
archives and my google-foo doesn't seem to turn it up either :(

thanks,

greg k-h

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 12:35:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 12:35:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLgaz-0000jz-01; Wed, 02 Nov 2011 12:35:33 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLgZz-0000QT-N8
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 12:34:32 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1320262467!2671210!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17955 invoked from network); 2 Nov 2011 19:34:28 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-12.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 19:34:28 -0000
X-IronPort-AV: E=Sophos;i="4.69,445,1315195200"; d="scan'208";a="169166948"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 15:34:22 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.65) with Microsoft SMTP Server id 8.3.137.0; Wed, 2 Nov 2011
	15:34:21 -0400
Message-ID: <1320262456.3084.54.camel@cthulhu.hellion.org.uk>
Subject: Re: [Xen-devel] [PATCH DOCDAY] introduce an xl man page in pod format
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Thu, 3 Nov 2011 04:34:16 +0900
In-Reply-To: <20144.15937.655455.992347@mariner.uk.xensource.com>
References: <alpine.DEB.2.00.1110271659380.3519@kaball-desktop>
	<20144.15937.655455.992347@mariner.uk.xensource.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-11-01 at 14:45 -0400, Ian Jackson wrote:
> Stefano Stabellini writes ("[Xen-devel] [PATCH DOCDAY] introduce an xl man page in pod format"):
> > This is the initial version of an xl man page, based on the old xm man
> > page.
> 
> Thanks.  I have applied this.  There were various suggestions for
> improvements in the thread, but I think this manpage is better than
> nothing so it should go in ASAP.  Further improvents are indeed
> welcome and should come as patches against this.

Sure. Stefano, are you going to address the review or shall I do it?

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 12:43:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 12:43:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLgj0-0001LH-C6; Wed, 02 Nov 2011 12:43:50 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLgiO-00019C-L5
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 12:43:12 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1320262988!1187118!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19092 invoked from network); 2 Nov 2011 19:43:09 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 19:43:09 -0000
X-IronPort-AV: E=Sophos;i="4.69,445,1315195200"; d="scan'208";a="169168274"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 15:43:07 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.65) with Microsoft SMTP Server id 8.3.137.0; Wed, 2 Nov 2011
	15:43:06 -0400
Message-ID: <1320262982.3084.60.camel@cthulhu.hellion.org.uk>
Subject: Re: [Xen-devel] Question about SR-IOV migration
From: Ian Campbell <Ian.Campbell@citrix.com>
To: software NJU <njudroid@gmail.com>
Date: Thu, 3 Nov 2011 04:43:02 +0900
In-Reply-To: <CAP31AdkJMw7vN34Q8XBKviA=TYYOL6XPAb=CeS-v+JJTdjbj1w@mail.gmail.com>
References: <CAP31Ad=0YjZPkwRdunbkETtdcsDWktq4m2m+JEuoQq7Zp8GoyA@mail.gmail.com>
	<1320238119.3084.43.camel@cthulhu.hellion.org.uk>
	<CAP31AdkJMw7vN34Q8XBKviA=TYYOL6XPAb=CeS-v+JJTdjbj1w@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Please don't top post, see
http://wiki.xen.org/xenwiki/AskingXenDevelQuestions

On Wed, 2011-11-02 at 09:27 -0400, software NJU wrote:
> Thanks for your quick reply and great solution. 
> However, I'm still not sure one thing: Do you mean that live migration
> is impossible because of hardware limitation? I'm reading the SR-IOV
> specification now. And it mentioned that a VF can migrate to another
> system through some kind of methods. But the migration may need the
> support of MR-IOV.
> What do you think of the saying in the specification? I'm not sure
> what the migration is in the specification.

I'm afraid I don't know precisely what the spec says here but (guessing)
I suppose MR-IOV might allow you to ensure that you see the actual same
device from two different host machines which would alleviate some of
the problems associated with managing the hardware constraints when
migrating.

However I think in order to migrate with a piece of hardware attached
somebody (either guest or tooling) would still need to know how to save
the state of that specific device and restore it on the other end.
Nothing in a Xen system today performs that function. I'm not sure that
MR-IOV helps with that problem AFAIK.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 12:44:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 12:44:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLgjy-0001ik-Qn; Wed, 02 Nov 2011 12:44:50 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLgiT-00019J-9d
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 12:43:18 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1320262992!81680!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20469 invoked from network); 2 Nov 2011 19:43:13 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-11.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 19:43:13 -0000
X-IronPort-AV: E=Sophos;i="4.69,445,1315195200"; d="scan'208";a="18769309"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 15:43:11 -0400
Received: from cthulhu.docomointertouch.net (10.80.16.67) by
	smtprelay.citrix.com (10.13.107.65) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 15:43:10 -0400
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Date: Thu, 3 Nov 2011 04:43:05 +0900
Message-ID: <1320262986-23352-1-git-send-email-ian.campbell@citrix.com>
X-Mailer: git-send-email 1.7.7.1
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH] docs: report if we do not build a doc due to
	lack of the necessary tool
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Previously only some targets did this. An alternative would be to make a hard
dependency on these tools, this might make more sense especially for markdown?

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
---
 docs/Makefile |    9 ++++++---
 1 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/docs/Makefile b/docs/Makefile
index 2054541..3b2aaa3 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -58,7 +58,8 @@ python-dev-docs:
 .PHONY: man-pages
 man-pages:
 	@if which $(POD2MAN) 1>/dev/null 2>/dev/null; then \
-	$(MAKE) $(DOC_MAN1) $(DOC_MAN5); fi
+	$(MAKE) $(DOC_MAN1) $(DOC_MAN5); else              \
+	echo "pod2man not installed; skipping man-pages."; fi
 
 man1/%.1: man/%.pod.1 Makefile
 	$(INSTALL_DIR) $(@D)
@@ -120,14 +121,16 @@ html/%/index.html: src/%.tex
         echo "Running latex2html to generate $*/index.html ... "; \
 	$(LATEX2HTML) -split 0 -show_section_numbers -toc_depth 3 -nonavigation \
 	-numbered_footnotes -local_icons -noinfo -math -dir $(@D) \
-	$< 1>/dev/null 2>/dev/null ;fi
+	$< 1>/dev/null 2>/dev/null ; else \
+	echo "latex2html not installed; skipping $*."; fi
 
 html/%.html: %.markdown
 	@$(INSTALL_DIR) $(@D)
 	@set -e ; if which $(MARKDOWN) 1>/dev/null 2>/dev/null; then \
 	echo "Running markdown to generate $*.html ... "; \
 	$(MARKDOWN) $< > $@.tmp ; \
-	$(call move-if-changed,$@.tmp,$@) ; fi
+	$(call move-if-changed,$@.tmp,$@) ; else \
+	echo "markdown not installed; skipping $*.html."; fi
 
 txt/%.txt: %.txt
 	$(INSTALL_DIR) $(@D)
-- 
1.7.7.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 12:45:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 12:45:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLgks-00026A-VM; Wed, 02 Nov 2011 12:45:47 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLgj2-0001LF-Q4
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 12:43:53 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-16.tower-182.messagelabs.com!1320263028!1717149!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24019 invoked from network); 2 Nov 2011 19:43:49 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-16.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 19:43:49 -0000
X-IronPort-AV: E=Sophos;i="4.69,445,1315195200"; d="scan'208";a="18769317"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 15:43:47 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.65) with Microsoft SMTP Server id 8.3.137.0; Wed, 2 Nov 2011
	15:43:46 -0400
Message-ID: <1320263024.3084.61.camel@cthulhu.hellion.org.uk>
Subject: Re: [Xen-devel] [PATCH RFC v2 06/13] libxl: permit declaration
	after statement
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Thu, 3 Nov 2011 04:43:44 +0900
In-Reply-To: <20145.29085.278257.629473@mariner.uk.xensource.com>
References: <1319827031-15395-1-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-2-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-3-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-4-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-5-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-6-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-7-git-send-email-ian.jackson@eu.citrix.com>
	<1320054652.23193.28.camel@zakaz.uk.xensource.com>
	<20145.29085.278257.629473@mariner.uk.xensource.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-02 at 12:36 -0400, Ian Jackson wrote:
> Ian Campbell writes ("Re: [Xen-devel] [PATCH RFC v2 06/13] libxl: permit declaration after statement"):
> > I suspect there isn't much scope for abuse of this capability but would
> > a few words of guidance in CODING_STYLE make sense?
> 
> I don't think there's anything I feel needs saying.  If you think
> people are likely to abuse it in a particular way then do say :-).
> 
> Otherwise we can wait and see what results and add stuff to
> CODING_STYLE as necessary ?

Yes, lets do that.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 12:46:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 12:46:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLgln-0002Tg-Fs; Wed, 02 Nov 2011 12:46:43 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLgjc-0001Y1-I1
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 12:44:28 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1320263063!79744!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5995 invoked from network); 2 Nov 2011 19:44:25 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-7.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 19:44:25 -0000
X-IronPort-AV: E=Sophos;i="4.69,445,1315195200"; d="scan'208";a="169168428"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 15:44:12 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.65) with Microsoft SMTP Server id 8.3.137.0; Wed, 2 Nov 2011
	15:44:11 -0400
Message-ID: <1320263048.3084.62.camel@cthulhu.hellion.org.uk>
Subject: Re: [Xen-devel] [PATCH RFC v2 07/13] libxl: internal convenience
	macros
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Thu, 3 Nov 2011 04:44:08 +0900
In-Reply-To: <20145.29157.52893.552989@mariner.uk.xensource.com>
References: <1319827031-15395-1-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-2-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-3-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-4-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-5-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-6-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-7-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-8-git-send-email-ian.jackson@eu.citrix.com>
	<1320054815.23193.30.camel@zakaz.uk.xensource.com>
	<20145.29157.52893.552989@mariner.uk.xensource.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-02 at 12:37 -0400, Ian Jackson wrote:
> Ian Campbell writes ("Re: [Xen-devel] [PATCH RFC v2 07/13] libxl: internal convenience macros"):
> > On Fri, 2011-10-28 at 19:37 +0100, Ian Jackson wrote:
> > > +#define GC_INIT(ctx)  libxl__gc gc[1] = { LIBXL_INIT_GC(ctx) }
> ...
> > Is there a massive conversion patch somewhere downseries?
> 
> Not yet.  I decided I didn't want to put that on the critical path for
> my event handling series, and also of course I didn't want a large
> style cleanup patch at the end of my series to keep getting conflicts.
> 
> However this is something I have my eye on.

Great, thanks.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 12:49:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 12:49:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLgoh-0002sk-88; Wed, 02 Nov 2011 12:49:43 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLgo3-0002gH-Qa
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 12:49:04 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1320263339!2071597!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3782 invoked from network); 2 Nov 2011 19:49:00 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 19:49:00 -0000
X-IronPort-AV: E=Sophos;i="4.69,445,1315195200"; d="scan'208";a="18769525"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 15:48:58 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Wed, 2 Nov 2011
	15:48:58 -0400
Message-ID: <1320263332.3084.65.camel@cthulhu.hellion.org.uk>
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Greg KH <greg@kroah.com>
Date: Thu, 3 Nov 2011 04:48:52 +0900
In-Reply-To: <20111102192110.GA25413@kroah.com>
References: <20111026210539.64BA823EB@git.kroah.org>
	<20111101230951.GA21951@kroah.com>
	<1320209597.3084.36.camel@cthulhu.hellion.org.uk>
	<20111102192110.GA25413@kroah.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Cc: Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	"stable@vger.kernel.org" <stable@vger.kernel.org>,
	"Rafael J. Wysocki" <rjw@sisk.pl>,
	xen-devel <xen-devel@lists.xensource.com>,
	Stefan Bader <stefan.bader@canonical.com>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: Patch Upstream: genirq: Add IRQF_RESUME_EARLY and
 resume such IRQs earlier
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-02 at 15:21 -0400, Greg KH wrote:
> On Wed, Nov 02, 2011 at 01:53:17PM +0900, Ian Campbell wrote:
> > Hi Greg,
> > 
> > On Tue, 2011-11-01 at 19:09 -0400, Greg KH wrote:
> > > If someone wants this in .32-stable, can they provide me a backported
> > > version, as this doesn't backport very easily (i.e. I tried and failed.)
> > 
> > Please see <1318859710.16132.15.camel@zakaz.uk.xensource.com> which
> > contains a backported version of the patch.
> 
> Hm, any chance you could forward that to me?  I don't see it in my
> archives and my google-foo doesn't seem to turn it up either :(

I seem to have sent it only to stable@ and not to you direct, sorry.
I've just bounced you a copy.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 12:55:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 12:55:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLguC-0003cC-CF; Wed, 02 Nov 2011 12:55:24 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLgtF-0003PH-JR
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 12:54:25 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1320263661!2713783!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26790 invoked from network); 2 Nov 2011 19:54:22 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-8.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 19:54:22 -0000
X-IronPort-AV: E=Sophos;i="4.69,445,1315195200"; d="scan'208";a="18769674"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 15:54:20 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Wed, 2 Nov 2011
	15:54:20 -0400
Message-ID: <1320263656.3084.66.camel@cthulhu.hellion.org.uk>
Subject: Re: [Xen-devel] [PATCH RFC v2 09/13] libxl: introduce lock in
	libxl_ctx
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Thu, 3 Nov 2011 04:54:16 +0900
In-Reply-To: <20145.29219.355664.444870@mariner.uk.xensource.com>
References: <1319827031-15395-1-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-2-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-3-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-4-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-5-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-6-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-7-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-8-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-9-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-10-git-send-email-ian.jackson@eu.citrix.com>
	<1320055382.23193.38.camel@zakaz.uk.xensource.com>
	<20145.29219.355664.444870@mariner.uk.xensource.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-02 at 12:38 -0400, Ian Jackson wrote:
> Ian Campbell writes ("Re: [Xen-devel] [PATCH RFC v2 09/13] libxl: introduce lock in libxl_ctx"):
> > On Fri, 2011-10-28 at 19:37 +0100, Ian Jackson wrote:
> > > +    const pthread_mutex_t mutex_value = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
> ...
> > > +    memcpy(&ctx->lock, &mutex_value, sizeof(ctx->lock));
> > 
> > Is this subtly different to
> >        ctx->lock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
> > in some way I'm missing?
> 
> Yes.  PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP is formally valid only as
> an initialiser, not necessarily as an expression.  I'm not sure that
> relevant GCC extensions mean the two are always equivalent.

OK, thanks.

I just had a read of pthread_mutex(3) and I'm surprised how many hoops
one has to jump through to use pthread_mutex_init(). Well, I say
surprised...

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 13:11:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 13:11:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLh9M-0004GL-En; Wed, 02 Nov 2011 13:11:04 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLh82-000430-0I
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 13:09:43 -0700
X-Env-Sender: greg@kroah.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1320264578!82484!1
X-Originating-IP: [66.111.4.29]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11679 invoked from network); 2 Nov 2011 20:09:38 -0000
Received: from out5.smtp.messagingengine.com (HELO
	out5.smtp.messagingengine.com) (66.111.4.29)
	by server-14.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	2 Nov 2011 20:09:38 -0000
Received: from compute3.internal (compute3.nyi.mail.srv.osa [10.202.2.43])
	by gateway1.nyi.mail.srv.osa (Postfix) with ESMTP id CBB7020F26;
	Wed,  2 Nov 2011 16:09:37 -0400 (EDT)
Received: from frontend1.nyi.mail.srv.osa ([10.202.2.160])
	by compute3.internal (MEProxy); Wed, 02 Nov 2011 16:09:37 -0400
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=date:from:to:cc:subject:message-id
	:references:mime-version:content-type:in-reply-to; s=smtpout;
	bh=6KPIb2l96flfzJQzPPud5WujOr8=; b=miDL9xc9LDw2Y70qIMpmzU4N7/Uz
	K0Jf2QQmV1UYXl0HLaqiUSVQ4Nxjxa2tmzpdmnMTaLtaPJvMfODbIgQwZn6U9SmY
	DpT0BmZ+YldLg56mJB4OU6RlzbiSvCd9Nd/D/0dvpcsl1QJOzZCNET2MbH6Cwq7t
	dryVrS3yZtNHWyU=
X-Sasl-enc: KS+bDycMmdMTryxqCQgSFHW3lgUd30Hv6NGZwMLSxxzf 1320264577
Received: from localhost (c-76-121-69-168.hsd1.wa.comcast.net [76.121.69.168])
	by mail.messagingengine.com (Postfix) with ESMTPSA id 44FA78E100B;
	Wed,  2 Nov 2011 16:09:37 -0400 (EDT)
Date: Wed, 2 Nov 2011 13:01:33 -0700
From: Greg KH <greg@kroah.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Message-ID: <20111102200133.GB17269@kroah.com>
References: <20111026210539.64BA823EB@git.kroah.org>
	<20111101230951.GA21951@kroah.com>
	<1320209597.3084.36.camel@cthulhu.hellion.org.uk>
	<20111102192110.GA25413@kroah.com>
	<1320263332.3084.65.camel@cthulhu.hellion.org.uk>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1320263332.3084.65.camel@cthulhu.hellion.org.uk>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	"stable@vger.kernel.org" <stable@vger.kernel.org>,
	"Rafael J. Wysocki" <rjw@sisk.pl>,
	xen-devel <xen-devel@lists.xensource.com>,
	Stefan Bader <stefan.bader@canonical.com>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: Patch Upstream: genirq: Add IRQF_RESUME_EARLY and
 resume such IRQs earlier
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Nov 03, 2011 at 04:48:52AM +0900, Ian Campbell wrote:
> On Wed, 2011-11-02 at 15:21 -0400, Greg KH wrote:
> > On Wed, Nov 02, 2011 at 01:53:17PM +0900, Ian Campbell wrote:
> > > Hi Greg,
> > > 
> > > On Tue, 2011-11-01 at 19:09 -0400, Greg KH wrote:
> > > > If someone wants this in .32-stable, can they provide me a backported
> > > > version, as this doesn't backport very easily (i.e. I tried and failed.)
> > > 
> > > Please see <1318859710.16132.15.camel@zakaz.uk.xensource.com> which
> > > contains a backported version of the patch.
> > 
> > Hm, any chance you could forward that to me?  I don't see it in my
> > archives and my google-foo doesn't seem to turn it up either :(
> 
> I seem to have sent it only to stable@ and not to you direct, sorry.
> I've just bounced you a copy.

Wonderful, I now have it and will go queue it up.

greg k-h

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 13:27:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 13:27:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLhPI-0004zT-9A; Wed, 02 Nov 2011 13:27:32 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLhOZ-0004my-H4
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 13:26:48 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1320265569!55324528!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25319 invoked from network); 2 Nov 2011 20:26:09 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 20:26:09 -0000
X-IronPort-AV: E=Sophos;i="4.69,445,1315180800"; 
   d="scan'208";a="8727396"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 20:26:44 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 20:26:44 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RLhOV-0006yu-Mj;
	Wed, 02 Nov 2011 20:26:43 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RLhOV-0000ME-Fs;
	Wed, 02 Nov 2011 20:26:43 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9658-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 2 Nov 2011 20:26:43 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9658: tolerable FAIL - PUSHED
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9658 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9658/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  8c2d76193eaf
baseline version:
 xen                  c33e15835e33

------------------------------------------------------------
People who touched revisions under test:
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Keir Fraser <keir@xen.org>
  Laszlo Ersek <lersek@redhat.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     pass    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Pushing revision :

+ branch=xen-4.1-testing
+ revision=8c2d76193eaf
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x '!=' x/export/home/osstest/repos/lock ']'
++ OSSTEST_REPOS_LOCK_LOCKED=/export/home/osstest/repos/lock
++ exec with-lock-ex -w /export/home/osstest/repos/lock ./ap-push xen-4.1-testing 8c2d76193eaf
+ branch=xen-4.1-testing
+ revision=8c2d76193eaf
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x/export/home/osstest/repos/lock '!=' x/export/home/osstest/repos/lock ']'
+ : xen@xenbits.xensource.com
+ : xen@xenbits.xensource.com:git/linux-pvops
+ : master
+ : tested/2.6.39.x
+ case "$branch" in
+ cd /export/home/osstest/repos/xen-4.1-testing.hg
+ hg push -r 8c2d76193eaf ssh://xen@xenbits.xensource.com/HG/xen-4.1-testing.hg
pushing to ssh://xen@xenbits.xensource.com/HG/xen-4.1-testing.hg
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 13:34:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 13:34:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLhVq-0005Zj-P4; Wed, 02 Nov 2011 13:34:19 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLhVB-0005My-RY
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 13:33:38 -0700
X-Env-Sender: dkiper@net-space.pl
X-Msg-Ref: server-8.tower-174.messagelabs.com!1320266014!81271!1
X-Originating-IP: [89.174.63.77]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21744 invoked from network); 2 Nov 2011 20:33:34 -0000
Received: from router-fw.net-space.pl (HELO router-fw.net-space.pl)
	(89.174.63.77)
	by server-8.tower-174.messagelabs.com with DES-CBC3-SHA encrypted SMTP;
	2 Nov 2011 20:33:34 -0000
Received: (from localhost user: 'dkiper' uid#4000 fake: STDIN
	(dkiper@router-fw.net-space.pl)) by router-fw-old.local.net-space.pl
	id S1602729Ab1KBUdF (ORCPT <rfc822;xen-devel@lists.xensource.com>);
	Wed, 2 Nov 2011 21:33:05 +0100
Date: Wed, 2 Nov 2011 21:33:05 +0100
From: Daniel Kiper <dkiper@net-space.pl>
To: Vasiliy Tolstov <v.tolstov@selfip.ru>
Subject: Re: [Xen-devel] Strange (???) xl behavior for save,
	migrate and migrate-receive
Message-ID: <20111102203305.GA748@router-fw-old.local.net-space.pl>
References: <20111017174036.GD29445@router-fw-old.local.net-space.pl>
	<4ffd9c88-88d2-437f-9af1-f3f0149334d9@default>
	<1318925941.16132.36.camel@zakaz.uk.xensource.com>
	<20111018151630.GB9832@router-fw-old.local.net-space.pl>
	<CACaajQuZWA=F4-yX5cKXbawb1=TRFJdHqwuEy8reK2h3jcFpoA@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CACaajQuZWA=F4-yX5cKXbawb1=TRFJdHqwuEy8reK2h3jcFpoA@mail.gmail.com>
User-Agent: Mutt/1.3.28i
Cc: Dan Magenheimer <dan.magenheimer@oracle.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Konrad Wilk <konrad.wilk@oracle.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	"jeremy@goop.org" <jeremy@goop.org>, Daniel Kiper <dkiper@net-space.pl>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Nov 02, 2011 at 06:17:38PM +0400, Vasiliy Tolstov wrote:
> 2011/10/18 Daniel Kiper <dkiper@net-space.pl>
>
> > Guest/host administartor could allocate for given guest no more memory than
> > maxmem (its value could be changed by xl mem-max <domain> <new_size>) allows,
> > regardless of mechanism (ballooning or memory hotplug) used for that allocation.
> > It means that memory hotplug does not pose any security threat in that
> > area.
>
> Sorry for bumping thread. Does this mean, that if i use memory=512,
> maxmem=4096 grows via balloon to 4096, after that set maxmem to 8192 and
> grows guest to 7000mb and do live migration - nothing bad happening and
> guest migrate process successed?

Yep, however, now you must use workaround for xl (which was described)
earlier in this thread. I have idea how to fix xl but I do not have
time to do it. I am going to do that next year.

Daniel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 13:39:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 13:39:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLhac-000638-OB; Wed, 02 Nov 2011 13:39:14 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLha2-0005qb-Nr
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 13:38:39 -0700
X-Env-Sender: greg@kroah.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1320266314!1136206!1
X-Originating-IP: [66.111.4.29]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24639 invoked from network); 2 Nov 2011 20:38:35 -0000
Received: from out5.smtp.messagingengine.com (HELO
	out5.smtp.messagingengine.com) (66.111.4.29)
	by server-5.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 2 Nov 2011 20:38:35 -0000
Received: from compute2.internal (compute2.nyi.mail.srv.osa [10.202.2.42])
	by gateway1.nyi.mail.srv.osa (Postfix) with ESMTP id CEFC72058E;
	Wed,  2 Nov 2011 16:38:33 -0400 (EDT)
Received: from frontend2.nyi.mail.srv.osa ([10.202.2.161])
	by compute2.internal (MEProxy); Wed, 02 Nov 2011 16:38:33 -0400
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=subject:to:cc:from:date:message-id
	:mime-version:content-type:content-transfer-encoding; s=smtpout;
	bh=+EA0jZKspZRJECIUW6PIjOdsCxA=; b=QItnuRXuzjTyj0xqYzz275M6XxKN
	1f9VvB9TBJdUCfxZh0Yd+CtQKjSiF370fNl2/TAMbK4DAObC08oQ2K6cOPv036Nk
	fBeQyPg7Jei9MbydlDM8fpTiGLQhzxjzCFn2m4epijUdfzw73lPHkss2jqhQLOIp
	P2BPlS1lXUtlCkY=
X-Sasl-enc: ztEytvENuGioS+ubp3fXtuvF0u5WYhT7SV7cX7NhpKpR 1320266313
Received: from localhost (c-76-121-69-168.hsd1.wa.comcast.net [76.121.69.168])
	by mail.messagingengine.com (Postfix) with ESMTPSA id 1581D4833A4;
	Wed,  2 Nov 2011 16:38:32 -0400 (EDT)
To: ian.campbell@citrix.com, gregkh@suse.de, Jeremy.Fitzhardinge@citrix.com,
	konrad.wilk@oracle.com, rjw@sisk.pl, tglx@linutronix.de,
	xen-devel@lists.xensource.com
From: <gregkh@suse.de>
Date: Wed, 02 Nov 2011 13:38:24 -0700
Message-ID: <13202663042997@kroah.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=ASCII
Content-Transfer-Encoding: 8bit
Cc: stable@vger.kernel.org, stable-commits@vger.kernel.org
Subject: [Xen-devel] Patch "genirq: Add IRQF_RESUME_EARLY and resume such
	IRQs earlier" has been added to the 2.6.32-longterm tree
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


This is a note to let you know that I've just added the patch titled

    genirq: Add IRQF_RESUME_EARLY and resume such IRQs earlier

to the 2.6.32-longterm tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/longterm/longterm-queue-2.6.32.git;a=summary

The filename of the patch is:
     genirq-add-irqf_resume_early-and-resume-such-irqs-earlier.patch
and it can be found in the queue-2.6.32 subdirectory.

If you, or anyone else, feels it should not be added to the 2.6.32 longterm tree,
please let <stable@vger.kernel.org> know about it.


>From 0e3acef83438e502ca5a1985cc5231c325ca73e2 Mon Sep 17 00:00:00 2001
From: Ian Campbell <ian.campbell@citrix.com>
Date: Mon, 3 Oct 2011 15:37:00 +0100
Subject: genirq: Add IRQF_RESUME_EARLY and resume such IRQs earlier

From: Ian Campbell <ian.campbell@citrix.com>

commit 9bab0b7fbaceec47d32db51cd9e59c82fb071f5a upstream

This adds a mechanism to resume selected IRQs during syscore_resume
instead of dpm_resume_noirq.

Under Xen we need to resume IRQs associated with IPIs early enough
that the resched IPI is unmasked and we can therefore schedule
ourselves out of the stop_machine where the suspend/resume takes
place.

This issue was introduced by 676dc3cf5bc3 "xen: Use IRQF_FORCE_RESUME".

Back ported to 2.6.32 (which lacks syscore support) by calling the relavant
resume function directly from sysdev_resume).

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Cc: Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>
Cc: xen-devel <xen-devel@lists.xensource.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Link: http://lkml.kernel.org/r/1318713254.11016.52.camel@dagon.hellion.org.uk
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 drivers/base/sys.c        |    6 ++++++
 drivers/xen/events.c      |    2 +-
 include/linux/interrupt.h |    5 +++++
 kernel/irq/pm.c           |   35 ++++++++++++++++++++++++++++-------
 4 files changed, 40 insertions(+), 8 deletions(-)

--- a/drivers/base/sys.c
+++ b/drivers/base/sys.c
@@ -471,6 +471,12 @@ int sysdev_resume(void)
 {
 	struct sysdev_class *cls;
 
+	/*
+	 * Called from syscore in mainline but called directly here
+	 * since syscore does not exist in this tree.
+	 */
+	irq_pm_syscore_resume();
+
 	WARN_ONCE(!irqs_disabled(),
 		"Interrupts enabled while resuming system devices\n");
 
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -536,7 +536,7 @@ int bind_ipi_to_irqhandler(enum ipi_vect
 	if (irq < 0)
 		return irq;
 
-	irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME;
+	irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME | IRQF_EARLY_RESUME;
 	retval = request_irq(irq, handler, irqflags, devname, dev_id);
 	if (retval != 0) {
 		unbind_from_irq(irq);
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -54,6 +54,8 @@
  *                irq line disabled until the threaded handler has been run.
  * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend
  * IRQF_FORCE_RESUME - Force enable it on resume even if IRQF_NO_SUSPEND is set
+ * IRQF_EARLY_RESUME - Resume IRQ early during syscore instead of at device
+ *                resume time.
  */
 #define IRQF_DISABLED		0x00000020
 #define IRQF_SAMPLE_RANDOM	0x00000040
@@ -66,6 +68,7 @@
 #define IRQF_ONESHOT		0x00002000
 #define IRQF_NO_SUSPEND		0x00004000
 #define IRQF_FORCE_RESUME	0x00008000
+#define IRQF_EARLY_RESUME	0x00020000
 
 #define IRQF_TIMER		(__IRQF_TIMER | IRQF_NO_SUSPEND)
 
@@ -196,6 +199,7 @@ extern void enable_irq(unsigned int irq)
 #ifdef CONFIG_GENERIC_HARDIRQS
 extern void suspend_device_irqs(void);
 extern void resume_device_irqs(void);
+extern void irq_pm_syscore_resume(void);
 #ifdef CONFIG_PM_SLEEP
 extern int check_wakeup_irqs(void);
 #else
@@ -204,6 +208,7 @@ static inline int check_wakeup_irqs(void
 #else
 static inline void suspend_device_irqs(void) { };
 static inline void resume_device_irqs(void) { };
+static inline void irq_pm_syscore_resume(void) { };
 static inline int check_wakeup_irqs(void) { return 0; }
 #endif
 
--- a/kernel/irq/pm.c
+++ b/kernel/irq/pm.c
@@ -39,25 +39,46 @@ void suspend_device_irqs(void)
 }
 EXPORT_SYMBOL_GPL(suspend_device_irqs);
 
-/**
- * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs()
- *
- * Enable all interrupt lines previously disabled by suspend_device_irqs() that
- * have the IRQ_SUSPENDED flag set.
- */
-void resume_device_irqs(void)
+static void resume_irqs(bool want_early)
 {
 	struct irq_desc *desc;
 	int irq;
 
 	for_each_irq_desc(irq, desc) {
 		unsigned long flags;
+		bool is_early = desc->action &&
+			desc->action->flags & IRQF_EARLY_RESUME;
+
+		if (is_early != want_early)
+			continue;
 
 		spin_lock_irqsave(&desc->lock, flags);
 		__enable_irq(desc, irq, true);
 		spin_unlock_irqrestore(&desc->lock, flags);
 	}
 }
+
+/**
+ * irq_pm_syscore_ops - enable interrupt lines early
+ *
+ * Enable all interrupt lines with %IRQF_EARLY_RESUME set.
+ */
+void irq_pm_syscore_resume(void)
+{
+	resume_irqs(true);
+}
+
+/**
+ * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs()
+ *
+ * Enable all non-%IRQF_EARLY_RESUME interrupt lines previously
+ * disabled by suspend_device_irqs() that have the IRQS_SUSPENDED flag
+ * set as well as those with %IRQF_FORCE_RESUME.
+ */
+void resume_device_irqs(void)
+{
+	resume_irqs(false);
+}
 EXPORT_SYMBOL_GPL(resume_device_irqs);
 
 /**


Patches currently in longterm-queue-2.6.32 which might be from ian.campbell@citrix.com are

/home/gregkh/linux/longterm/longterm-queue-2.6.32/queue-2.6.32/sparc-fix-array-bounds-error-setting-up-pcic-nmi-trap.patch
/home/gregkh/linux/longterm/longterm-queue-2.6.32/queue-2.6.32/xen-timer-missing-irqf_no_suspend-in-timer-code-broke-suspend.patch
/home/gregkh/linux/longterm/longterm-queue-2.6.32/queue-2.6.32/genirq-add-irqf_resume_early-and-resume-such-irqs-earlier.patch

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 15:03:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 15:03:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLitm-0000bH-Et; Wed, 02 Nov 2011 15:03:06 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLirD-00084u-5w
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 15:00:28 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1320271222!1748499!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21289 invoked from network); 2 Nov 2011 22:00:23 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 22:00:23 -0000
X-IronPort-AV: E=Sophos;i="4.69,446,1315180800"; 
   d="scan'208";a="8728411"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Nov 2011 22:00:19 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 2 Nov 2011 22:00:19 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RLir5-0007Va-26;
	Wed, 02 Nov 2011 22:00:19 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RLir4-0001dW-Vt;
	Wed, 02 Nov 2011 22:00:19 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9659-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 2 Nov 2011 22:00:18 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9659: tolerable FAIL - PUSHED
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9659 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9659/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10       fail    like 9652
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  54a5e994a241
baseline version:
 xen                  068d3d55ce6e

------------------------------------------------------------
People who touched revisions under test:
  "Kay, Allen M" <allen.m.kay@intel.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Olaf Hering <olaf@aepfle.de>
  Philipp Hahn <hahn@univention.de>
  Roger Pau Monne <roger.pau@entel.upc.edu>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Pushing revision :

+ branch=xen-unstable
+ revision=54a5e994a241
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x '!=' x/export/home/osstest/repos/lock ']'
++ OSSTEST_REPOS_LOCK_LOCKED=/export/home/osstest/repos/lock
++ exec with-lock-ex -w /export/home/osstest/repos/lock ./ap-push xen-unstable 54a5e994a241
+ branch=xen-unstable
+ revision=54a5e994a241
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x/export/home/osstest/repos/lock '!=' x/export/home/osstest/repos/lock ']'
+ : xen@xenbits.xensource.com
+ : xen@xenbits.xensource.com:git/linux-pvops
+ : master
+ : tested/2.6.39.x
+ case "$branch" in
+ cd /export/home/osstest/repos/xen-unstable.hg
+ hg push -r 54a5e994a241 ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
pushing to ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 16 changesets with 36 changes to 21 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 15:31:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 15:31:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLjKw-0001fF-Rs; Wed, 02 Nov 2011 15:31:10 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLjKA-0001SY-HI
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 15:30:23 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1320273017!89237!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21781 invoked from network); 2 Nov 2011 22:30:19 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-14.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 22:30:19 -0000
Received: by iaen33 with SMTP id n33so784181iae.30
	for <xen-devel@lists.xensource.com>;
	Wed, 02 Nov 2011 15:30:17 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:cc:content-type
	:content-transfer-encoding;
	bh=N64k4z/7ieJPMwfd+/gVfvDwwACOFYX/hs/uMyZZGRg=;
	b=k5kGTD29unpCaQ/6A4ZNuv8vVhdCzNQPN/+T3698PnCI0gv/dgjMagnRW24Jwzs2/N
	FYrY8+oqLVfucBLUI4zT3YLwIcPIk5kl/rhKkR2M3iFYtzQTYRdOFw8N3xYgszLItb0l
	o4sg6bjnNM0nS1o7IBPN5Ue1nyMAlgv7V4dlI=
MIME-Version: 1.0
Received: by 10.231.68.130 with SMTP id v2mr1119758ibi.71.1320273017305; Wed,
	02 Nov 2011 15:30:17 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Wed, 2 Nov 2011 15:30:17 -0700 (PDT)
In-Reply-To: <981073d78f7f0c92a7f5.1319690029@xdev.gridcentric.ca>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<981073d78f7f0c92a7f5.1319690029@xdev.gridcentric.ca>
Date: Thu, 3 Nov 2011 07:30:17 +0900
X-Google-Sender-Auth: qG6T-AF7lhpOAWAw-lhuXo-AzWk
Message-ID: <CAFLBxZZ4h+3rvCVSmCwZ-197R1_Ox7hqwF4fDVD4JJaxop4cgQ@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 4 of 9] Rework locking in the PoD layer
From: George Dunlap <dunlapg@umich.edu>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Oct 27, 2011 at 1:33 PM, Andres Lagar-Cavilla
<andres@lagarcavilla.org> wrote:
> =A0xen/arch/x86/mm/mm-locks.h | =A0 =A09 ++
> =A0xen/arch/x86/mm/p2m-pod.c =A0| =A0145 +++++++++++++++++++++++++++-----=
-------------
> =A0xen/arch/x86/mm/p2m-pt.c =A0 | =A0 =A03 +
> =A0xen/arch/x86/mm/p2m.c =A0 =A0 =A0| =A0 =A07 +-
> =A0xen/include/asm-x86/p2m.h =A0| =A0 25 ++-----
> =A05 files changed, 113 insertions(+), 76 deletions(-)
>
>
> The PoD layer has a fragile locking discipline. It relies on the
> p2m being globally locked, and it also relies on the page alloc
> lock to protect some of its data structures. Replace this all by an
> explicit pod lock: per p2m, order enforced.
>
> Two consequences:
> =A0 =A0- Critical sections in the pod code protected by the page alloc
> =A0 =A0 =A0lock are now reduced to modifications of the domain page list.
> =A0 =A0- When the p2m lock becomes fine-grained, there are no
> =A0 =A0 =A0assumptions broken in the PoD layer.
>
> Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
>
> diff -r 332775f72a30 -r 981073d78f7f xen/arch/x86/mm/mm-locks.h
> --- a/xen/arch/x86/mm/mm-locks.h
> +++ b/xen/arch/x86/mm/mm-locks.h
> @@ -155,6 +155,15 @@ declare_mm_lock(p2m)
> =A0#define p2m_unlock(p) =A0 =A0 =A0 =A0 mm_unlock(&(p)->lock)
> =A0#define p2m_locked_by_me(p) =A0 mm_locked_by_me(&(p)->lock)
>
> +/* PoD lock (per-p2m-table)
> + *
> + * Protects private PoD data structs. */
> +
> +declare_mm_lock(pod)
> +#define pod_lock(p) =A0 =A0 =A0 =A0 =A0 mm_lock(pod, &(p)->pod.lock)
> +#define pod_unlock(p) =A0 =A0 =A0 =A0 mm_unlock(&(p)->pod.lock)
> +#define pod_locked_by_me(p) =A0 mm_locked_by_me(&(p)->pod.lock)
> +
> =A0/* Page alloc lock (per-domain)
> =A0*
> =A0* This is an external lock, not represented by an mm_lock_t. However,
> diff -r 332775f72a30 -r 981073d78f7f xen/arch/x86/mm/p2m-pod.c
> --- a/xen/arch/x86/mm/p2m-pod.c
> +++ b/xen/arch/x86/mm/p2m-pod.c
> @@ -63,6 +63,7 @@ static inline void unlock_page_alloc(str
> =A0* Populate-on-demand functionality
> =A0*/
>
> +/* PoD lock held on entry */
> =A0static int
> =A0p2m_pod_cache_add(struct p2m_domain *p2m,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct page_info *page,
> @@ -114,43 +115,42 @@ p2m_pod_cache_add(struct p2m_domain *p2m
> =A0 =A0 =A0 =A0 unmap_domain_page(b);
> =A0 =A0 }
>
> + =A0 =A0/* First, take all pages off the domain list */
> =A0 =A0 lock_page_alloc(p2m);
> -
> - =A0 =A0/* First, take all pages off the domain list */
> =A0 =A0 for(i=3D0; i < 1 << order ; i++)
> =A0 =A0 {
> =A0 =A0 =A0 =A0 p =3D page + i;
> =A0 =A0 =A0 =A0 page_list_del(p, &d->page_list);
> =A0 =A0 }
>
> - =A0 =A0/* Then add the first one to the appropriate populate-on-demand =
list */
> - =A0 =A0switch(order)
> - =A0 =A0{
> - =A0 =A0case PAGE_ORDER_2M:
> - =A0 =A0 =A0 =A0page_list_add_tail(page, &p2m->pod.super); /* lock: page=
_alloc */
> - =A0 =A0 =A0 =A0p2m->pod.count +=3D 1 << order;
> - =A0 =A0 =A0 =A0break;
> - =A0 =A0case PAGE_ORDER_4K:
> - =A0 =A0 =A0 =A0page_list_add_tail(page, &p2m->pod.single); /* lock: pag=
e_alloc */
> - =A0 =A0 =A0 =A0p2m->pod.count +=3D 1;
> - =A0 =A0 =A0 =A0break;
> - =A0 =A0default:
> - =A0 =A0 =A0 =A0BUG();
> - =A0 =A0}
> -
> =A0 =A0 /* Ensure that the PoD cache has never been emptied.
> =A0 =A0 =A0* This may cause "zombie domains" since the page will never be=
 freed. */
> =A0 =A0 BUG_ON( d->arch.relmem !=3D RELMEM_not_started );
>
> =A0 =A0 unlock_page_alloc(p2m);
>
> + =A0 =A0/* Then add the first one to the appropriate populate-on-demand =
list */
> + =A0 =A0switch(order)
> + =A0 =A0{
> + =A0 =A0case PAGE_ORDER_2M:
> + =A0 =A0 =A0 =A0page_list_add_tail(page, &p2m->pod.super);
> + =A0 =A0 =A0 =A0p2m->pod.count +=3D 1 << order;
> + =A0 =A0 =A0 =A0break;
> + =A0 =A0case PAGE_ORDER_4K:
> + =A0 =A0 =A0 =A0page_list_add_tail(page, &p2m->pod.single);
> + =A0 =A0 =A0 =A0p2m->pod.count +=3D 1;
> + =A0 =A0 =A0 =A0break;
> + =A0 =A0default:
> + =A0 =A0 =A0 =A0BUG();
> + =A0 =A0}
> +
> =A0 =A0 return 0;
> =A0}
>
> =A0/* Get a page of size order from the populate-on-demand cache. =A0Will=
 break
> =A0* down 2-meg pages into singleton pages automatically. =A0Returns null=
 if
> - * a superpage is requested and no superpages are available. =A0Must be =
called
> - * with the d->page_lock held. */
> + * a superpage is requested and no superpages are available. */
> +/* PoD lock held on entry */
> =A0static struct page_info * p2m_pod_cache_get(struct p2m_domain *p2m,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 unsigned long order)
> =A0{
> @@ -185,7 +185,7 @@ static struct page_info * p2m_pod_cache_
> =A0 =A0 case PAGE_ORDER_2M:
> =A0 =A0 =A0 =A0 BUG_ON( page_list_empty(&p2m->pod.super) );
> =A0 =A0 =A0 =A0 p =3D page_list_remove_head(&p2m->pod.super);
> - =A0 =A0 =A0 =A0p2m->pod.count -=3D 1 << order; /* Lock: page_alloc */
> + =A0 =A0 =A0 =A0p2m->pod.count -=3D 1 << order;
> =A0 =A0 =A0 =A0 break;
> =A0 =A0 case PAGE_ORDER_4K:
> =A0 =A0 =A0 =A0 BUG_ON( page_list_empty(&p2m->pod.single) );
> @@ -197,16 +197,19 @@ static struct page_info * p2m_pod_cache_
> =A0 =A0 }
>
> =A0 =A0 /* Put the pages back on the domain page_list */
> + =A0 =A0lock_page_alloc(p2m);
> =A0 =A0 for ( i =3D 0 ; i < (1 << order); i++ )
> =A0 =A0 {
> =A0 =A0 =A0 =A0 BUG_ON(page_get_owner(p + i) !=3D p2m->domain);
> =A0 =A0 =A0 =A0 page_list_add_tail(p + i, &p2m->domain->page_list);
> =A0 =A0 }
> + =A0 =A0unlock_page_alloc(p2m);
>
> =A0 =A0 return p;
> =A0}
>
> =A0/* Set the size of the cache, allocating or freeing as necessary. */
> +/* PoD lock held on entry */
> =A0static int
> =A0p2m_pod_set_cache_target(struct p2m_domain *p2m, unsigned long pod_tar=
get, int preemptible)
> =A0{
> @@ -259,8 +262,6 @@ p2m_pod_set_cache_target(struct p2m_doma
>
> =A0 =A0 =A0 =A0 /* Grab the lock before checking that pod.super is empty,=
 or the last
> =A0 =A0 =A0 =A0 =A0* entries may disappear before we grab the lock. */
> - =A0 =A0 =A0 =A0lock_page_alloc(p2m);
> -
> =A0 =A0 =A0 =A0 if ( (p2m->pod.count - pod_target) > SUPERPAGE_PAGES
> =A0 =A0 =A0 =A0 =A0 =A0 =A0&& !page_list_empty(&p2m->pod.super) )
> =A0 =A0 =A0 =A0 =A0 =A0 order =3D PAGE_ORDER_2M;
> @@ -271,8 +272,6 @@ p2m_pod_set_cache_target(struct p2m_doma
>
> =A0 =A0 =A0 =A0 ASSERT(page !=3D NULL);
>
> - =A0 =A0 =A0 =A0unlock_page_alloc(p2m);
> -
> =A0 =A0 =A0 =A0 /* Then free them */
> =A0 =A0 =A0 =A0 for ( i =3D 0 ; i < (1 << order) ; i++ )
> =A0 =A0 =A0 =A0 {
> @@ -348,7 +347,7 @@ p2m_pod_set_mem_target(struct domain *d,
> =A0 =A0 int ret =3D 0;
> =A0 =A0 unsigned long populated;
>
> - =A0 =A0p2m_lock(p2m);
> + =A0 =A0pod_lock(p2m);
>
> =A0 =A0 /* P =3D=3D B: Nothing to do. */
> =A0 =A0 if ( p2m->pod.entry_count =3D=3D 0 )
> @@ -377,7 +376,7 @@ p2m_pod_set_mem_target(struct domain *d,
> =A0 =A0 ret =3D p2m_pod_set_cache_target(p2m, pod_target, 1/*preemptible*=
/);
>
> =A0out:
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0pod_unlock(p2m);
>
> =A0 =A0 return ret;
> =A0}
> @@ -390,7 +389,7 @@ p2m_pod_empty_cache(struct domain *d)
>
> =A0 =A0 /* After this barrier no new PoD activities can happen. */
> =A0 =A0 BUG_ON(!d->is_dying);
> - =A0 =A0spin_barrier(&p2m->lock.lock);
> + =A0 =A0spin_barrier(&p2m->pod.lock.lock);
>
> =A0 =A0 lock_page_alloc(p2m);
>
> @@ -431,7 +430,8 @@ p2m_pod_offline_or_broken_hit(struct pag
> =A0 =A0 if ( !(d =3D page_get_owner(p)) || !(p2m =3D p2m_get_hostp2m(d)) =
)
> =A0 =A0 =A0 =A0 return 0;
>
> - =A0 =A0lock_page_alloc(p2m);
> + =A0 =A0pod_lock(p2m);
> +
> =A0 =A0 bmfn =3D mfn_x(page_to_mfn(p));
> =A0 =A0 page_list_for_each_safe(q, tmp, &p2m->pod.super)
> =A0 =A0 {
> @@ -462,12 +462,14 @@ p2m_pod_offline_or_broken_hit(struct pag
> =A0 =A0 =A0 =A0 }
> =A0 =A0 }
>
> - =A0 =A0unlock_page_alloc(p2m);
> + =A0 =A0pod_unlock(p2m);
> =A0 =A0 return 0;
>
> =A0pod_hit:
> + =A0 =A0lock_page_alloc(p2m);
> =A0 =A0 page_list_add_tail(p, &d->arch.relmem_list);
> =A0 =A0 unlock_page_alloc(p2m);
> + =A0 =A0pod_unlock(p2m);
> =A0 =A0 return 1;
> =A0}
>
> @@ -486,9 +488,9 @@ p2m_pod_offline_or_broken_replace(struct
> =A0 =A0 if ( unlikely(!p) )
> =A0 =A0 =A0 =A0 return;
>
> - =A0 =A0p2m_lock(p2m);
> + =A0 =A0pod_lock(p2m);
> =A0 =A0 p2m_pod_cache_add(p2m, p, PAGE_ORDER_4K);
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0pod_unlock(p2m);
> =A0 =A0 return;
> =A0}
>
> @@ -512,6 +514,7 @@ p2m_pod_decrease_reservation(struct doma
> =A0 =A0 int steal_for_cache =3D 0;
> =A0 =A0 int pod =3D 0, nonpod =3D 0, ram =3D 0;
>
> + =A0 =A0pod_lock(p2m);
>
> =A0 =A0 /* If we don't have any outstanding PoD entries, let things take =
their
> =A0 =A0 =A0* course */
> @@ -521,11 +524,10 @@ p2m_pod_decrease_reservation(struct doma
> =A0 =A0 /* Figure out if we need to steal some freed memory for our cache=
 */
> =A0 =A0 steal_for_cache =3D =A0( p2m->pod.entry_count > p2m->pod.count );
>
> - =A0 =A0p2m_lock(p2m);
> =A0 =A0 audit_p2m(p2m, 1);
>
> =A0 =A0 if ( unlikely(d->is_dying) )
> - =A0 =A0 =A0 =A0goto out_unlock;
> + =A0 =A0 =A0 =A0goto out;
>
> =A0 =A0 /* See what's in here. */
> =A0 =A0 /* FIXME: Add contiguous; query for PSE entries? */

I don't think this can be quite right.

The point of holding the p2m lock here is so that the p2m entries
don't change between the gfn_to_mfn_query() here and the
set_p2m_entries() below.  The balloon driver racing with other vcpus
populating pages is exactly the kind of race we expect to experience.
And in any case, this change will cause set_p2m_entry() to ASSERT()
because we're not holding the p2m lock.

Or am I missing something?

I haven't yet looked at the rest of the patch series, but it would
definitely be better for people in the future looking back and trying
to figure out why the code is the way that it is if even transitory
changesets don't introduce "temporary" violations of invariants. :-)

> @@ -547,14 +549,14 @@ p2m_pod_decrease_reservation(struct doma
>
> =A0 =A0 /* No populate-on-demand? =A0Don't need to steal anything? =A0The=
n we're done!*/
> =A0 =A0 if(!pod && !steal_for_cache)
> - =A0 =A0 =A0 =A0goto out_unlock;
> + =A0 =A0 =A0 =A0goto out_audit;
>
> =A0 =A0 if ( !nonpod )
> =A0 =A0 {
> =A0 =A0 =A0 =A0 /* All PoD: Mark the whole region invalid and tell caller
> =A0 =A0 =A0 =A0 =A0* we're done. */
> =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gpfn, _mfn(INVALID_MFN), order, p2m_in=
valid, p2m->default_access);
> - =A0 =A0 =A0 =A0p2m->pod.entry_count-=3D(1<<order); /* Lock: p2m */
> + =A0 =A0 =A0 =A0p2m->pod.entry_count-=3D(1<<order);
> =A0 =A0 =A0 =A0 BUG_ON(p2m->pod.entry_count < 0);
> =A0 =A0 =A0 =A0 ret =3D 1;
> =A0 =A0 =A0 =A0 goto out_entry_check;
> @@ -577,7 +579,7 @@ p2m_pod_decrease_reservation(struct doma
> =A0 =A0 =A0 =A0 if ( t =3D=3D p2m_populate_on_demand )
> =A0 =A0 =A0 =A0 {
> =A0 =A0 =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gpfn + i, _mfn(INVALID_MFN), 0=
, p2m_invalid, p2m->default_access);
> - =A0 =A0 =A0 =A0 =A0 =A0p2m->pod.entry_count--; /* Lock: p2m */
> + =A0 =A0 =A0 =A0 =A0 =A0p2m->pod.entry_count--;
> =A0 =A0 =A0 =A0 =A0 =A0 BUG_ON(p2m->pod.entry_count < 0);
> =A0 =A0 =A0 =A0 =A0 =A0 pod--;
> =A0 =A0 =A0 =A0 }
> @@ -613,11 +615,11 @@ out_entry_check:
> =A0 =A0 =A0 =A0 p2m_pod_set_cache_target(p2m, p2m->pod.entry_count, 0/*ca=
n't preempt*/);
> =A0 =A0 }
>
> -out_unlock:
> +out_audit:
> =A0 =A0 audit_p2m(p2m, 1);
> - =A0 =A0p2m_unlock(p2m);
>
> =A0out:
> + =A0 =A0pod_unlock(p2m);
> =A0 =A0 return ret;
> =A0}
>
> @@ -630,20 +632,24 @@ void p2m_pod_dump_data(struct domain *d)
>
>
> =A0/* Search for all-zero superpages to be reclaimed as superpages for th=
e
> - * PoD cache. Must be called w/ p2m lock held, page_alloc lock not held.=
 */
> -static int
> + * PoD cache. Must be called w/ pod lock held, page_alloc lock not held.=
 */
> +static void

For the same reason, this must be called with the p2m lock held: it
calls gfn_to_mfn_query() and then calls set_p2m_entry().  As it
happens, this always *is* called with the p2m lock held at the moment;
but the comment still needs to reflect this.  Similarly in
p2m_pod_zero_check().

> =A0p2m_pod_zero_check_superpage(struct p2m_domain *p2m, unsigned long gfn=
)
> =A0{
> =A0 =A0 mfn_t mfn, mfn0 =3D _mfn(INVALID_MFN);
> =A0 =A0 p2m_type_t type, type0 =3D 0;
> =A0 =A0 unsigned long * map =3D NULL;
> - =A0 =A0int ret=3D0, reset =3D 0;
> + =A0 =A0int success =3D 0, reset =3D 0;
> =A0 =A0 int i, j;
> =A0 =A0 int max_ref =3D 1;
> =A0 =A0 struct domain *d =3D p2m->domain;
>
> =A0 =A0 if ( !superpage_aligned(gfn) )
> - =A0 =A0 =A0 =A0goto out;
> + =A0 =A0 =A0 =A0return;
> +
> + =A0 =A0/* If we were enforcing ordering against p2m locks, this is a pl=
ace
> + =A0 =A0 * to drop the PoD lock and re-acquire it once we're done muckin=
g with
> + =A0 =A0 * the p2m. */
>
> =A0 =A0 /* Allow an extra refcount for one shadow pt mapping in shadowed =
domains */
> =A0 =A0 if ( paging_mode_shadow(d) )
> @@ -751,19 +757,24 @@ p2m_pod_zero_check_superpage(struct p2m_
> =A0 =A0 =A0 =A0 __trace_var(TRC_MEM_POD_ZERO_RECLAIM, 0, sizeof(t), &t);
> =A0 =A0 }
>
> - =A0 =A0/* Finally! =A0We've passed all the checks, and can add the mfn =
superpage
> - =A0 =A0 * back on the PoD cache, and account for the new p2m PoD entrie=
s */
> - =A0 =A0p2m_pod_cache_add(p2m, mfn_to_page(mfn0), PAGE_ORDER_2M);
> - =A0 =A0p2m->pod.entry_count +=3D SUPERPAGE_PAGES;
> + =A0 =A0success =3D 1;
> +
>
> =A0out_reset:
> =A0 =A0 if ( reset )
> =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gfn, mfn0, 9, type0, p2m->default_acce=
ss);
>
> =A0out:
> - =A0 =A0return ret;
> + =A0 =A0if ( success )
> + =A0 =A0{
> + =A0 =A0 =A0 =A0/* Finally! =A0We've passed all the checks, and can add =
the mfn superpage
> + =A0 =A0 =A0 =A0 * back on the PoD cache, and account for the new p2m Po=
D entries */
> + =A0 =A0 =A0 =A0p2m_pod_cache_add(p2m, mfn_to_page(mfn0), PAGE_ORDER_2M)=
;
> + =A0 =A0 =A0 =A0p2m->pod.entry_count +=3D SUPERPAGE_PAGES;
> + =A0 =A0}
> =A0}
>
> +/* On entry, PoD lock is held */
> =A0static void
> =A0p2m_pod_zero_check(struct p2m_domain *p2m, unsigned long *gfns, int co=
unt)
> =A0{
> @@ -775,6 +786,8 @@ p2m_pod_zero_check(struct p2m_domain *p2
> =A0 =A0 int i, j;
> =A0 =A0 int max_ref =3D 1;
>
> + =A0 =A0/* Also the right time to drop pod_lock if enforcing ordering ag=
ainst p2m_lock */
> +
> =A0 =A0 /* Allow an extra refcount for one shadow pt mapping in shadowed =
domains */
> =A0 =A0 if ( paging_mode_shadow(d) )
> =A0 =A0 =A0 =A0 max_ref++;
> @@ -841,7 +854,6 @@ p2m_pod_zero_check(struct p2m_domain *p2
> =A0 =A0 =A0 =A0 =A0 =A0 if( *(map[i]+j) !=3D 0 )
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
>
> - =A0 =A0 =A0 =A0unmap_domain_page(map[i]);
>
> =A0 =A0 =A0 =A0 /* See comment in p2m_pod_zero_check_superpage() re gntta=
b
> =A0 =A0 =A0 =A0 =A0* check timing. =A0*/
> @@ -849,8 +861,15 @@ p2m_pod_zero_check(struct p2m_domain *p2
> =A0 =A0 =A0 =A0 {
> =A0 =A0 =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gfns[i], mfns[i], PAGE_ORDER_4=
K,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 types[i], p2m->default_access);
> + =A0 =A0 =A0 =A0 =A0 =A0unmap_domain_page(map[i]);
> + =A0 =A0 =A0 =A0 =A0 =A0map[i] =3D NULL;
> =A0 =A0 =A0 =A0 }
> - =A0 =A0 =A0 =A0else
> + =A0 =A0}
> +
> + =A0 =A0/* Finally, add to cache */
> + =A0 =A0for ( i=3D0; i < count; i++ )
> + =A0 =A0{
> + =A0 =A0 =A0 =A0if ( map[i] )
> =A0 =A0 =A0 =A0 {
> =A0 =A0 =A0 =A0 =A0 =A0 if ( tb_init_done )
> =A0 =A0 =A0 =A0 =A0 =A0 {
> @@ -867,6 +886,8 @@ p2m_pod_zero_check(struct p2m_domain *p2
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 __trace_var(TRC_MEM_POD_ZERO_RECLAIM, 0, =
sizeof(t), &t);
> =A0 =A0 =A0 =A0 =A0 =A0 }
>
> + =A0 =A0 =A0 =A0 =A0 =A0unmap_domain_page(map[i]);
> +
> =A0 =A0 =A0 =A0 =A0 =A0 /* Add to cache, and account for the new p2m PoD =
entry */
> =A0 =A0 =A0 =A0 =A0 =A0 p2m_pod_cache_add(p2m, mfn_to_page(mfns[i]), PAGE=
_ORDER_4K);
> =A0 =A0 =A0 =A0 =A0 =A0 p2m->pod.entry_count++;
> @@ -876,6 +897,7 @@ p2m_pod_zero_check(struct p2m_domain *p2
> =A0}
>
> =A0#define POD_SWEEP_LIMIT 1024
> +/* Only one CPU at a time is guaranteed to enter a sweep */
> =A0static void
> =A0p2m_pod_emergency_sweep_super(struct p2m_domain *p2m)
> =A0{
> @@ -964,7 +986,8 @@ p2m_pod_demand_populate(struct p2m_domai
>
> =A0 =A0 ASSERT(p2m_locked_by_me(p2m));
>
> - =A0 =A0/* This check is done with the p2m lock held. =A0This will make =
sure that
> + =A0 =A0pod_lock(p2m);
> + =A0 =A0/* This check is done with the pod lock held. =A0This will make =
sure that
> =A0 =A0 =A0* even if d->is_dying changes under our feet, p2m_pod_empty_ca=
che()
> =A0 =A0 =A0* won't start until we're done. */
> =A0 =A0 if ( unlikely(d->is_dying) )
> @@ -974,6 +997,7 @@ p2m_pod_demand_populate(struct p2m_domai
> =A0 =A0 =A0* 1GB region to 2MB chunks for a retry. */
> =A0 =A0 if ( order =3D=3D PAGE_ORDER_1G )
> =A0 =A0 {
> + =A0 =A0 =A0 =A0pod_unlock(p2m);
> =A0 =A0 =A0 =A0 gfn_aligned =3D (gfn >> order) << order;
> =A0 =A0 =A0 =A0 /* Note that we are supposed to call set_p2m_entry() 512 =
times to
> =A0 =A0 =A0 =A0 =A0* split 1GB into 512 2MB pages here. But We only do on=
ce here because
> @@ -983,6 +1007,7 @@ p2m_pod_demand_populate(struct p2m_domai
> =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gfn_aligned, _mfn(0), PAGE_ORDER_2M,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 p2m_populate_on_demand, p2m->=
default_access);
> =A0 =A0 =A0 =A0 audit_p2m(p2m, 1);
> + =A0 =A0 =A0 =A0/* This is because the ept/pt caller locks the p2m recur=
sively */
> =A0 =A0 =A0 =A0 p2m_unlock(p2m);
> =A0 =A0 =A0 =A0 return 0;
> =A0 =A0 }
> @@ -996,11 +1021,15 @@ p2m_pod_demand_populate(struct p2m_domai
>
> =A0 =A0 =A0 =A0 /* If we're low, start a sweep */
> =A0 =A0 =A0 =A0 if ( order =3D=3D PAGE_ORDER_2M && page_list_empty(&p2m->=
pod.super) )
> + =A0 =A0 =A0 =A0 =A0 =A0/* Note that sweeps scan other ranges in the p2m=
. In an scenario
> + =A0 =A0 =A0 =A0 =A0 =A0 * in which p2m locks are order-enforced wrt pod=
 lock and p2m
> + =A0 =A0 =A0 =A0 =A0 =A0 * locks are fine grained, this will result in d=
eadlock */
> =A0 =A0 =A0 =A0 =A0 =A0 p2m_pod_emergency_sweep_super(p2m);
>
> =A0 =A0 =A0 =A0 if ( page_list_empty(&p2m->pod.single) &&
> =A0 =A0 =A0 =A0 =A0 =A0 =A0( ( order =3D=3D PAGE_ORDER_4K )
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0|| (order =3D=3D PAGE_ORDER_2M && page_lis=
t_empty(&p2m->pod.super) ) ) )
> + =A0 =A0 =A0 =A0 =A0 =A0/* Same comment regarding deadlock applies */
> =A0 =A0 =A0 =A0 =A0 =A0 p2m_pod_emergency_sweep(p2m);
> =A0 =A0 }
>
> @@ -1008,8 +1037,6 @@ p2m_pod_demand_populate(struct p2m_domai
> =A0 =A0 if ( q =3D=3D p2m_guest && gfn > p2m->pod.max_guest )
> =A0 =A0 =A0 =A0 p2m->pod.max_guest =3D gfn;
>
> - =A0 =A0lock_page_alloc(p2m);
> -
> =A0 =A0 if ( p2m->pod.count =3D=3D 0 )
> =A0 =A0 =A0 =A0 goto out_of_memory;
>
> @@ -1022,8 +1049,6 @@ p2m_pod_demand_populate(struct p2m_domai
>
> =A0 =A0 BUG_ON((mfn_x(mfn) & ((1 << order)-1)) !=3D 0);
>
> - =A0 =A0unlock_page_alloc(p2m);
> -
> =A0 =A0 gfn_aligned =3D (gfn >> order) << order;
>
> =A0 =A0 set_p2m_entry(p2m, gfn_aligned, mfn, order, p2m_ram_rw, p2m->defa=
ult_access);
> @@ -1034,8 +1059,9 @@ p2m_pod_demand_populate(struct p2m_domai
> =A0 =A0 =A0 =A0 paging_mark_dirty(d, mfn_x(mfn) + i);
> =A0 =A0 }
>
> - =A0 =A0p2m->pod.entry_count -=3D (1 << order); /* Lock: p2m */
> + =A0 =A0p2m->pod.entry_count -=3D (1 << order);
> =A0 =A0 BUG_ON(p2m->pod.entry_count < 0);
> + =A0 =A0pod_unlock(p2m);
>
> =A0 =A0 if ( tb_init_done )
> =A0 =A0 {
> @@ -1054,16 +1080,17 @@ p2m_pod_demand_populate(struct p2m_domai
>
> =A0 =A0 return 0;
> =A0out_of_memory:
> - =A0 =A0unlock_page_alloc(p2m);
> + =A0 =A0pod_unlock(p2m);
>
> =A0 =A0 printk("%s: Out of populate-on-demand memory! tot_pages %" PRIu32=
 " pod_entries %" PRIi32 "\n",
> =A0 =A0 =A0 =A0 =A0 =A0__func__, d->tot_pages, p2m->pod.entry_count);
> =A0 =A0 domain_crash(d);
> =A0out_fail:
> + =A0 =A0pod_unlock(p2m);
> =A0 =A0 return -1;
> =A0remap_and_retry:
> =A0 =A0 BUG_ON(order !=3D PAGE_ORDER_2M);
> - =A0 =A0unlock_page_alloc(p2m);
> + =A0 =A0pod_unlock(p2m);
>
> =A0 =A0 /* Remap this 2-meg region in singleton chunks */
> =A0 =A0 gfn_aligned =3D (gfn>>order)<<order;
> @@ -1133,9 +1160,11 @@ guest_physmap_mark_populate_on_demand(st
> =A0 =A0 =A0 =A0 rc =3D -EINVAL;
> =A0 =A0 else
> =A0 =A0 {
> - =A0 =A0 =A0 =A0p2m->pod.entry_count +=3D 1 << order; /* Lock: p2m */
> + =A0 =A0 =A0 =A0pod_lock(p2m);
> + =A0 =A0 =A0 =A0p2m->pod.entry_count +=3D 1 << order;
> =A0 =A0 =A0 =A0 p2m->pod.entry_count -=3D pod_count;
> =A0 =A0 =A0 =A0 BUG_ON(p2m->pod.entry_count < 0);
> + =A0 =A0 =A0 =A0pod_unlock(p2m);
> =A0 =A0 }
>
> =A0 =A0 audit_p2m(p2m, 1);
> diff -r 332775f72a30 -r 981073d78f7f xen/arch/x86/mm/p2m-pt.c
> --- a/xen/arch/x86/mm/p2m-pt.c
> +++ b/xen/arch/x86/mm/p2m-pt.c
> @@ -1001,6 +1001,7 @@ void audit_p2m(struct p2m_domain *p2m, i
> =A0 =A0 if ( !paging_mode_translate(d) )
> =A0 =A0 =A0 =A0 return;
>
> + =A0 =A0pod_lock(p2m);
> =A0 =A0 //P2M_PRINTK("p2m audit starts\n");
>
> =A0 =A0 test_linear =3D ( (d =3D=3D current->domain)
> @@ -1247,6 +1248,8 @@ void audit_p2m(struct p2m_domain *p2m, i
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0pmbad, mpbad);
> =A0 =A0 =A0 =A0 WARN();
> =A0 =A0 }
> +
> + =A0 =A0pod_unlock(p2m);
> =A0}
> =A0#endif /* P2M_AUDIT */
>
> diff -r 332775f72a30 -r 981073d78f7f xen/arch/x86/mm/p2m.c
> --- a/xen/arch/x86/mm/p2m.c
> +++ b/xen/arch/x86/mm/p2m.c
> @@ -72,6 +72,7 @@ boolean_param("hap_2mb", opt_hap_2mb);
> =A0static void p2m_initialise(struct domain *d, struct p2m_domain *p2m)
> =A0{
> =A0 =A0 mm_lock_init(&p2m->lock);
> + =A0 =A0mm_lock_init(&p2m->pod.lock);
> =A0 =A0 INIT_LIST_HEAD(&p2m->np2m_list);
> =A0 =A0 INIT_PAGE_LIST_HEAD(&p2m->pages);
> =A0 =A0 INIT_PAGE_LIST_HEAD(&p2m->pod.super);
> @@ -506,8 +507,10 @@ guest_physmap_add_entry(struct domain *d
> =A0 =A0 =A0 =A0 =A0 =A0 rc =3D -EINVAL;
> =A0 =A0 =A0 =A0 else
> =A0 =A0 =A0 =A0 {
> - =A0 =A0 =A0 =A0 =A0 =A0p2m->pod.entry_count -=3D pod_count; /* Lock: p2=
m */
> + =A0 =A0 =A0 =A0 =A0 =A0pod_lock(p2m);
> + =A0 =A0 =A0 =A0 =A0 =A0p2m->pod.entry_count -=3D pod_count;
> =A0 =A0 =A0 =A0 =A0 =A0 BUG_ON(p2m->pod.entry_count < 0);
> + =A0 =A0 =A0 =A0 =A0 =A0pod_unlock(p2m);
> =A0 =A0 =A0 =A0 }
> =A0 =A0 }
>
> @@ -1125,8 +1128,10 @@ p2m_flush_table(struct p2m_domain *p2m)
> =A0 =A0 /* "Host" p2m tables can have shared entries &c that need a bit m=
ore
> =A0 =A0 =A0* care when discarding them */
> =A0 =A0 ASSERT(p2m_is_nestedp2m(p2m));
> + =A0 =A0pod_lock(p2m);
> =A0 =A0 ASSERT(page_list_empty(&p2m->pod.super));
> =A0 =A0 ASSERT(page_list_empty(&p2m->pod.single));
> + =A0 =A0pod_unlock(p2m);
>
> =A0 =A0 /* This is no longer a valid nested p2m for any address space */
> =A0 =A0 p2m->cr3 =3D CR3_EADDR;
> diff -r 332775f72a30 -r 981073d78f7f xen/include/asm-x86/p2m.h
> --- a/xen/include/asm-x86/p2m.h
> +++ b/xen/include/asm-x86/p2m.h
> @@ -257,24 +257,13 @@ struct p2m_domain {
> =A0 =A0 unsigned long max_mapped_pfn;
>
> =A0 =A0 /* Populate-on-demand variables
> - =A0 =A0 * NB on locking. =A0{super,single,count} are
> - =A0 =A0 * covered by d->page_alloc_lock, since they're almost always us=
ed in
> - =A0 =A0 * conjunction with that functionality. =A0{entry_count} is cove=
red by
> - =A0 =A0 * the domain p2m lock, since it's almost always used in conjunc=
tion
> - =A0 =A0 * with changing the p2m tables.
> =A0 =A0 =A0*
> - =A0 =A0 * At this point, both locks are held in two places. =A0In both,
> - =A0 =A0 * the order is [p2m,page_alloc]:
> - =A0 =A0 * + p2m_pod_decrease_reservation() calls p2m_pod_cache_add(),
> - =A0 =A0 * =A0 which grabs page_alloc
> - =A0 =A0 * + p2m_pod_demand_populate() grabs both; the p2m lock to avoid
> - =A0 =A0 * =A0 double-demand-populating of pages, the page_alloc lock to
> - =A0 =A0 * =A0 protect moving stuff from the PoD cache to the domain pag=
e list.
> - =A0 =A0 *
> - =A0 =A0 * We enforce this lock ordering through a construct in mm-locks=
.h.
> - =A0 =A0 * This demands, however, that we store the previous lock-orderi=
ng
> - =A0 =A0 * level in effect before grabbing the page_alloc lock.
> - =A0 =A0 */
> + =A0 =A0 * All variables are protected with the pod lock. We cannot rely=
 on
> + =A0 =A0 * the p2m lock if it's turned into a fine-grained lock.
> + =A0 =A0 * We only use the domain page_alloc lock for additions and
> + =A0 =A0 * deletions to the domain's page list. Because we use it nested
> + =A0 =A0 * within the PoD lock, we enforce it's ordering (by remembering
> + =A0 =A0 * the unlock level). */
> =A0 =A0 struct {
> =A0 =A0 =A0 =A0 struct page_list_head super, =A0 /* List of superpages =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0single; =A0 =A0 =A0 /*=
 Non-super lists =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 */
> @@ -283,6 +272,8 @@ struct p2m_domain {
> =A0 =A0 =A0 =A0 unsigned =A0 =A0 =A0 =A0 reclaim_super; /* Last gpfn of a=
 scan */
> =A0 =A0 =A0 =A0 unsigned =A0 =A0 =A0 =A0 reclaim_single; /* Last gpfn of =
a scan */
> =A0 =A0 =A0 =A0 unsigned =A0 =A0 =A0 =A0 max_guest; =A0 =A0/* gpfn of max=
 guest demand-populate */
> + =A0 =A0 =A0 =A0mm_lock_t =A0 =A0 =A0 =A0lock; =A0 =A0 =A0 =A0 /* Lockin=
g of private pod structs, =A0 *
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0* not relying on the p2m lock. =A0 =A0 =A0*/
> =A0 =A0 =A0 =A0 int =A0 =A0 =A0 =A0 =A0 =A0 =A0page_alloc_unlock_level; /=
* To enforce lock ordering */
> =A0 =A0 } pod;
> =A0};
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 16:04:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 16:04:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLjqk-00030N-Gk; Wed, 02 Nov 2011 16:04:02 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLjn0-0002ls-K8
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 16:00:33 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1320274805!2086104!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8847 invoked from network); 2 Nov 2011 23:00:06 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-3.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Nov 2011 23:00:06 -0000
Received: by gyg8 with SMTP id 8so875227gyg.30
	for <xen-devel@lists.xensource.com>;
	Wed, 02 Nov 2011 16:00:05 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:cc:content-type
	:content-transfer-encoding;
	bh=uhv4uQ3NitBed2YDk5pxv6rxKmJPZWRLMb9Q3RLDSeA=;
	b=Mis8oKjMqET0H+AkuOQSQTAGagz+DzgK4Q3hV3vSr1dBgjVeLFB53DPHo3q44M/nkB
	T7vKCDmlPsO3oWlyWOA0x/CoUMEDf82cw45bHkoZlpwGfG0ug9qOuGbXE3ROTfYcMxoi
	jPlrfYX+ywTTs3d6AQSyebVrkajU13FCPFTc0=
MIME-Version: 1.0
Received: by 10.50.41.196 with SMTP id h4mr771043igl.42.1320274805031; Wed, 02
	Nov 2011 16:00:05 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Wed, 2 Nov 2011 16:00:04 -0700 (PDT)
In-Reply-To: <471d4f2754d6516d5926.1319690033@xdev.gridcentric.ca>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<471d4f2754d6516d5926.1319690033@xdev.gridcentric.ca>
Date: Thu, 3 Nov 2011 08:00:04 +0900
X-Google-Sender-Auth: iq_LjiUBx4rodDye_fXFVodgV2s
Message-ID: <CAFLBxZafobe6=-bRr=c2KrqnXjFuYREJXb38HC+Zf7x1N-tTRA@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 8 of 9] Modify all internal p2m functions to
	use the new fine-grained locking
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Oct 27, 2011 at 1:33 PM, Andres Lagar-Cavilla
<andres@lagarcavilla.org> wrote:
> =A0xen/arch/x86/mm/hap/hap.c =A0 =A0 =A0 =A0| =A0 =A02 +-
> =A0xen/arch/x86/mm/hap/nested_hap.c | =A0 21 ++-
> =A0xen/arch/x86/mm/p2m-ept.c =A0 =A0 =A0 =A0| =A0 26 +----
> =A0xen/arch/x86/mm/p2m-pod.c =A0 =A0 =A0 =A0| =A0 42 +++++--
> =A0xen/arch/x86/mm/p2m-pt.c =A0 =A0 =A0 =A0 | =A0 20 +---
> =A0xen/arch/x86/mm/p2m.c =A0 =A0 =A0 =A0 =A0 =A0| =A0185 ++++++++++++++++=
++++++++--------------
> =A0xen/include/asm-ia64/mm.h =A0 =A0 =A0 =A0| =A0 =A05 +
> =A0xen/include/asm-x86/p2m.h =A0 =A0 =A0 =A0| =A0 45 +++++++++-
> =A08 files changed, 217 insertions(+), 129 deletions(-)
>
>
> This patch only modifies code internal to the p2m, adding convenience
> macros, etc. It will yield a compiling code base but an incorrect
> hypervisor (external callers of queries into the p2m will not unlock).
> Next patch takes care of external callers, split done for the benefit
> of conciseness.

It's not obvious to me where in this patch to find a description of
what the new locking regime is.  What does the _unlocked() mean?  When
do I have to call that vs a different one, and when do I have to lock
/ unlock / whatever?

I think that should ideally be both in the commit message (at least a
summary), and also in a comment in a header somewhere.  Perhaps it is
already in the patch somewhere, but a quick glance through didn't find
it...

>
> Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
>
> diff -r 8a98179666de -r 471d4f2754d6 xen/arch/x86/mm/hap/hap.c
> --- a/xen/arch/x86/mm/hap/hap.c
> +++ b/xen/arch/x86/mm/hap/hap.c
> @@ -861,7 +861,7 @@ hap_write_p2m_entry(struct vcpu *v, unsi
> =A0 =A0 old_flags =3D l1e_get_flags(*p);
>
> =A0 =A0 if ( nestedhvm_enabled(d) && (old_flags & _PAGE_PRESENT)
> - =A0 =A0 =A0 =A0 && !p2m_get_hostp2m(d)->defer_nested_flush ) {
> + =A0 =A0 =A0 =A0 && !atomic_read(&(p2m_get_hostp2m(d)->defer_nested_flus=
h)) ) {
> =A0 =A0 =A0 =A0 /* We are replacing a valid entry so we need to flush nes=
ted p2ms,
> =A0 =A0 =A0 =A0 =A0* unless the only change is an increase in access righ=
ts. */
> =A0 =A0 =A0 =A0 mfn_t omfn =3D _mfn(l1e_get_pfn(*p));
> diff -r 8a98179666de -r 471d4f2754d6 xen/arch/x86/mm/hap/nested_hap.c
> --- a/xen/arch/x86/mm/hap/nested_hap.c
> +++ b/xen/arch/x86/mm/hap/nested_hap.c
> @@ -105,8 +105,6 @@ nestedhap_fix_p2m(struct vcpu *v, struct
> =A0 =A0 ASSERT(p2m);
> =A0 =A0 ASSERT(p2m->set_entry);
>
> - =A0 =A0p2m_lock(p2m);
> -
> =A0 =A0 /* If this p2m table has been flushed or recycled under our feet,
> =A0 =A0 =A0* leave it alone. =A0We'll pick up the right one as we try to
> =A0 =A0 =A0* vmenter the guest. */
> @@ -122,11 +120,13 @@ nestedhap_fix_p2m(struct vcpu *v, struct
> =A0 =A0 =A0 =A0 gfn =3D (L2_gpa >> PAGE_SHIFT) & mask;
> =A0 =A0 =A0 =A0 mfn =3D _mfn((L0_gpa >> PAGE_SHIFT) & mask);
>
> + =A0 =A0 =A0 =A0/* Not bumping refcount of pages underneath because we'r=
e getting
> + =A0 =A0 =A0 =A0 * rid of whatever was there */
> + =A0 =A0 =A0 =A0get_p2m(p2m, gfn, page_order);
> =A0 =A0 =A0 =A0 rv =3D set_p2m_entry(p2m, gfn, mfn, page_order, p2mt, p2m=
a);
> + =A0 =A0 =A0 =A0put_p2m(p2m, gfn, page_order);
> =A0 =A0 }
>
> - =A0 =A0p2m_unlock(p2m);
> -
> =A0 =A0 if (rv =3D=3D 0) {
> =A0 =A0 =A0 =A0 gdprintk(XENLOG_ERR,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"failed to set entry for 0x%"PRIx64" -> 0x=
%"PRIx64"\n",
> @@ -146,19 +146,26 @@ nestedhap_walk_L0_p2m(struct p2m_domain
> =A0 =A0 mfn_t mfn;
> =A0 =A0 p2m_type_t p2mt;
> =A0 =A0 p2m_access_t p2ma;
> + =A0 =A0int rc;
>
> =A0 =A0 /* walk L0 P2M table */
> =A0 =A0 mfn =3D gfn_to_mfn_type_p2m(p2m, L1_gpa >> PAGE_SHIFT, &p2mt, &p2=
ma,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 p2m_query, pa=
ge_order);
>
> + =A0 =A0rc =3D NESTEDHVM_PAGEFAULT_ERROR;
> =A0 =A0 if ( p2m_is_paging(p2mt) || p2m_is_shared(p2mt) || !p2m_is_ram(p2=
mt) )
> - =A0 =A0 =A0 =A0return NESTEDHVM_PAGEFAULT_ERROR;
> + =A0 =A0 =A0 =A0goto out;
>
> + =A0 =A0rc =3D NESTEDHVM_PAGEFAULT_ERROR;
> =A0 =A0 if ( !mfn_valid(mfn) )
> - =A0 =A0 =A0 =A0return NESTEDHVM_PAGEFAULT_ERROR;
> + =A0 =A0 =A0 =A0goto out;
>
> =A0 =A0 *L0_gpa =3D (mfn_x(mfn) << PAGE_SHIFT) + (L1_gpa & ~PAGE_MASK);
> - =A0 =A0return NESTEDHVM_PAGEFAULT_DONE;
> + =A0 =A0rc =3D NESTEDHVM_PAGEFAULT_DONE;
> +
> +out:
> + =A0 =A0drop_p2m_gfn(p2m, L1_gpa >> PAGE_SHIFT, mfn_x(mfn));
> + =A0 =A0return rc;
> =A0}
>
> =A0/* This function uses L2_gpa to walk the P2M page table in L1. If the
> diff -r 8a98179666de -r 471d4f2754d6 xen/arch/x86/mm/p2m-ept.c
> --- a/xen/arch/x86/mm/p2m-ept.c
> +++ b/xen/arch/x86/mm/p2m-ept.c
> @@ -43,29 +43,16 @@
> =A0#define is_epte_present(ept_entry) =A0 =A0 =A0((ept_entry)->epte & 0x7=
)
> =A0#define is_epte_superpage(ept_entry) =A0 =A0((ept_entry)->sp)
>
> -/* Non-ept "lock-and-check" wrapper */
> +/* Ept-specific check wrapper */
> =A0static int ept_pod_check_and_populate(struct p2m_domain *p2m, unsigned=
 long gfn,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 ept_entry_t *entry, int order,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 p2m_query_t q)
> =A0{
> - =A0 =A0int r;
> -
> - =A0 =A0/* This is called from the p2m lookups, which can happen with or
> - =A0 =A0 * without the lock hed. */
> - =A0 =A0p2m_lock_recursive(p2m);
> -
> =A0 =A0 /* Check to make sure this is still PoD */
> =A0 =A0 if ( entry->sa_p2mt !=3D p2m_populate_on_demand )
> - =A0 =A0{
> - =A0 =A0 =A0 =A0p2m_unlock(p2m);
> =A0 =A0 =A0 =A0 return 0;
> - =A0 =A0}
>
> - =A0 =A0r =3D p2m_pod_demand_populate(p2m, gfn, order, q);
> -
> - =A0 =A0p2m_unlock(p2m);
> -
> - =A0 =A0return r;
> + =A0 =A0return p2m_pod_demand_populate(p2m, gfn, order, q);
> =A0}
>
> =A0static void ept_p2m_type_to_flags(ept_entry_t *entry, p2m_type_t type,=
 p2m_access_t access)
> @@ -265,9 +252,9 @@ static int ept_next_level(struct p2m_dom
>
> =A0 =A0 ept_entry =3D (*table) + index;
>
> - =A0 =A0/* ept_next_level() is called (sometimes) without a lock. =A0Rea=
d
> + =A0 =A0/* ept_next_level() is called (never) without a lock. =A0Read
> =A0 =A0 =A0* the entry once, and act on the "cached" entry after that to
> - =A0 =A0 * avoid races. */
> + =A0 =A0 * avoid races. AAA */
> =A0 =A0 e =3D atomic_read_ept_entry(ept_entry);
>
> =A0 =A0 if ( !is_epte_present(&e) )
> @@ -733,7 +720,8 @@ void ept_change_entry_emt_with_range(str
> =A0 =A0 int order =3D 0;
> =A0 =A0 struct p2m_domain *p2m =3D p2m_get_hostp2m(d);
>
> - =A0 =A0p2m_lock(p2m);
> + =A0 =A0/* This is a global operation, essentially */
> + =A0 =A0get_p2m_global(p2m);
> =A0 =A0 for ( gfn =3D start_gfn; gfn <=3D end_gfn; gfn++ )
> =A0 =A0 {
> =A0 =A0 =A0 =A0 int level =3D 0;
> @@ -773,7 +761,7 @@ void ept_change_entry_emt_with_range(str
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ept_set_entry(p2m, gfn, mfn, order, e.sa_=
p2mt, e.access);
> =A0 =A0 =A0 =A0 }
> =A0 =A0 }
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0put_p2m_global(p2m);
> =A0}
>
> =A0/*
> diff -r 8a98179666de -r 471d4f2754d6 xen/arch/x86/mm/p2m-pod.c
> --- a/xen/arch/x86/mm/p2m-pod.c
> +++ b/xen/arch/x86/mm/p2m-pod.c
> @@ -102,8 +102,6 @@ p2m_pod_cache_add(struct p2m_domain *p2m
> =A0 =A0 }
> =A0#endif
>
> - =A0 =A0ASSERT(p2m_locked_by_me(p2m));
> -
> =A0 =A0 /*
> =A0 =A0 =A0* Pages from domain_alloc and returned by the balloon driver a=
ren't
> =A0 =A0 =A0* guaranteed to be zero; but by reclaiming zero pages, we impl=
icitly
> @@ -536,7 +534,7 @@ p2m_pod_decrease_reservation(struct doma
> =A0 =A0 {
> =A0 =A0 =A0 =A0 p2m_type_t t;
>
> - =A0 =A0 =A0 =A0gfn_to_mfn_query(d, gpfn + i, &t);
> + =A0 =A0 =A0 =A0gfn_to_mfn_query_unlocked(d, gpfn + i, &t);
>
> =A0 =A0 =A0 =A0 if ( t =3D=3D p2m_populate_on_demand )
> =A0 =A0 =A0 =A0 =A0 =A0 pod++;

The rest of the code makes it seem like gfn_to_mfn_query() will grab
the p2m lock for a range, but the _unlocked() version will not.  Is
that correct?

Shouldn't this remain as it is then?

> @@ -602,6 +600,7 @@ p2m_pod_decrease_reservation(struct doma
> =A0 =A0 =A0 =A0 =A0 =A0 nonpod--;
> =A0 =A0 =A0 =A0 =A0 =A0 ram--;
> =A0 =A0 =A0 =A0 }
> + =A0 =A0 =A0 =A0drop_p2m_gfn(p2m, gpfn + i, mfn_x(mfn));
> =A0 =A0 }

And how does this fit with the _query() call above?

>
> =A0 =A0 /* If there are no more non-PoD entries, tell decrease_reservatio=
n() that
> @@ -661,12 +660,15 @@ p2m_pod_zero_check_superpage(struct p2m_
> =A0 =A0 for ( i=3D0; i<SUPERPAGE_PAGES; i++ )
> =A0 =A0 {
>
> - =A0 =A0 =A0 =A0mfn =3D gfn_to_mfn_query(d, gfn + i, &type);
> -
> =A0 =A0 =A0 =A0 if ( i =3D=3D 0 )
> =A0 =A0 =A0 =A0 {
> + =A0 =A0 =A0 =A0 =A0 =A0/* Only lock the p2m entry the first time, that =
will lock
> + =A0 =A0 =A0 =A0 =A0 =A0 * server for the whole superpage */
> + =A0 =A0 =A0 =A0 =A0 =A0mfn =3D gfn_to_mfn_query(d, gfn + i, &type);
> =A0 =A0 =A0 =A0 =A0 =A0 mfn0 =3D mfn;
> =A0 =A0 =A0 =A0 =A0 =A0 type0 =3D type;
> + =A0 =A0 =A0 =A0} else {
> + =A0 =A0 =A0 =A0 =A0 =A0mfn =3D gfn_to_mfn_query_unlocked(d, gfn + i, &t=
ype);
> =A0 =A0 =A0 =A0 }
>
> =A0 =A0 =A0 =A0 /* Conditions that must be met for superpage-superpage:
> @@ -773,6 +775,10 @@ out:
> =A0 =A0 =A0 =A0 p2m_pod_cache_add(p2m, mfn_to_page(mfn0), PAGE_ORDER_2M);
> =A0 =A0 =A0 =A0 p2m->pod.entry_count +=3D SUPERPAGE_PAGES;
> =A0 =A0 }
> +
> + =A0 =A0/* We got p2m locks once for the whole superpage, with the origi=
nal
> + =A0 =A0 * mfn0. We drop it here. */
> + =A0 =A0drop_p2m_gfn(p2m, gfn, mfn_x(mfn0));
> =A0}
>
> =A0/* On entry, PoD lock is held */
> @@ -894,6 +900,12 @@ p2m_pod_zero_check(struct p2m_domain *p2
> =A0 =A0 =A0 =A0 =A0 =A0 p2m->pod.entry_count++;
> =A0 =A0 =A0 =A0 }
> =A0 =A0 }
> +
> + =A0 =A0/* Drop all p2m locks and references */
> + =A0 =A0for ( i=3D0; i<count; i++ )
> + =A0 =A0{
> + =A0 =A0 =A0 =A0drop_p2m_gfn(p2m, gfns[i], mfn_x(mfns[i]));
> + =A0 =A0}
>
> =A0}
>
> @@ -928,7 +940,9 @@ p2m_pod_emergency_sweep_super(struct p2m
> =A0 =A0 p2m->pod.reclaim_super =3D i ? i - SUPERPAGE_PAGES : 0;
> =A0}
>
> -#define POD_SWEEP_STRIDE =A016
> +/* Note that spinlock recursion counters have 4 bits, so 16 or higher
> + * will overflow a single 2M spinlock in a zero check. */
> +#define POD_SWEEP_STRIDE =A015
> =A0static void
> =A0p2m_pod_emergency_sweep(struct p2m_domain *p2m)
> =A0{
> @@ -946,7 +960,7 @@ p2m_pod_emergency_sweep(struct p2m_domai
> =A0 =A0 /* FIXME: Figure out how to avoid superpages */
> =A0 =A0 for ( i=3Dp2m->pod.reclaim_single; i > 0 ; i-- )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0gfn_to_mfn_query(p2m->domain, i, &t );
> + =A0 =A0 =A0 =A0gfn_to_mfn_query_unlocked(p2m->domain, i, &t );
> =A0 =A0 =A0 =A0 if ( p2m_is_ram(t) )
> =A0 =A0 =A0 =A0 {
> =A0 =A0 =A0 =A0 =A0 =A0 gfns[j] =3D i;
> @@ -974,6 +988,7 @@ p2m_pod_emergency_sweep(struct p2m_domai
>
> =A0}
>
> +/* The gfn and order need to be locked in the p2m before you walk in her=
e */
> =A0int
> =A0p2m_pod_demand_populate(struct p2m_domain *p2m, unsigned long gfn,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 unsigned int order,
> @@ -985,8 +1000,6 @@ p2m_pod_demand_populate(struct p2m_domai
> =A0 =A0 mfn_t mfn;
> =A0 =A0 int i;
>
> - =A0 =A0ASSERT(p2m_locked_by_me(p2m));
> -
> =A0 =A0 pod_lock(p2m);
> =A0 =A0 /* This check is done with the pod lock held. =A0This will make s=
ure that
> =A0 =A0 =A0* even if d->is_dying changes under our feet, p2m_pod_empty_ca=
che()
> @@ -1008,8 +1021,6 @@ p2m_pod_demand_populate(struct p2m_domai
> =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gfn_aligned, _mfn(0), PAGE_ORDER_2M,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 p2m_populate_on_demand, p2m->=
default_access);
> =A0 =A0 =A0 =A0 audit_p2m(p2m, 1);
> - =A0 =A0 =A0 =A0/* This is because the ept/pt caller locks the p2m recur=
sively */
> - =A0 =A0 =A0 =A0p2m_unlock(p2m);
> =A0 =A0 =A0 =A0 return 0;
> =A0 =A0 }
>
> @@ -1132,7 +1143,9 @@ guest_physmap_mark_populate_on_demand(st
> =A0 =A0 if ( rc !=3D 0 )
> =A0 =A0 =A0 =A0 return rc;
>
> - =A0 =A0p2m_lock(p2m);
> + =A0 =A0/* Pre-lock all the p2m entries. We don't take refs to the
> + =A0 =A0 * pages, because there shouldn't be any pages underneath. */
> + =A0 =A0get_p2m(p2m, gfn, order);
> =A0 =A0 audit_p2m(p2m, 1);
>
> =A0 =A0 P2M_DEBUG("mark pod gfn=3D%#lx\n", gfn);
> @@ -1140,7 +1153,8 @@ guest_physmap_mark_populate_on_demand(st
> =A0 =A0 /* Make sure all gpfns are unused */
> =A0 =A0 for ( i =3D 0; i < (1UL << order); i++ )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0omfn =3D gfn_to_mfn_query(d, gfn + i, &ot);
> + =A0 =A0 =A0 =A0p2m_access_t a;
> + =A0 =A0 =A0 =A0omfn =3D p2m->get_entry(p2m, gfn + i, &ot, &a, p2m_query=
, NULL);
> =A0 =A0 =A0 =A0 if ( p2m_is_ram(ot) )
> =A0 =A0 =A0 =A0 {
> =A0 =A0 =A0 =A0 =A0 =A0 printk("%s: gfn_to_mfn returned type %d!\n",
> @@ -1169,9 +1183,9 @@ guest_physmap_mark_populate_on_demand(st
> =A0 =A0 }
>
> =A0 =A0 audit_p2m(p2m, 1);
> - =A0 =A0p2m_unlock(p2m);
>
> =A0out:
> + =A0 =A0put_p2m(p2m, gfn, order);
> =A0 =A0 return rc;
> =A0}
>
> diff -r 8a98179666de -r 471d4f2754d6 xen/arch/x86/mm/p2m-pt.c
> --- a/xen/arch/x86/mm/p2m-pt.c
> +++ b/xen/arch/x86/mm/p2m-pt.c
> @@ -487,31 +487,16 @@ out:
> =A0}
>
>
> -/* Non-ept "lock-and-check" wrapper */
> +/* PT-specific check wrapper */
> =A0static int p2m_pod_check_and_populate(struct p2m_domain *p2m, unsigned=
 long gfn,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 l1_pgentry_t *p2m_entry, int order,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 p2m_query_t q)
> =A0{
> - =A0 =A0int r;
> -
> - =A0 =A0/* This is called from the p2m lookups, which can happen with or
> - =A0 =A0 * without the lock hed. */
> - =A0 =A0p2m_lock_recursive(p2m);
> - =A0 =A0audit_p2m(p2m, 1);
> -
> =A0 =A0 /* Check to make sure this is still PoD */
> =A0 =A0 if ( p2m_flags_to_type(l1e_get_flags(*p2m_entry)) !=3D p2m_popula=
te_on_demand )
> - =A0 =A0{
> - =A0 =A0 =A0 =A0p2m_unlock(p2m);
> =A0 =A0 =A0 =A0 return 0;
> - =A0 =A0}
>
> - =A0 =A0r =3D p2m_pod_demand_populate(p2m, gfn, order, q);
> -
> - =A0 =A0audit_p2m(p2m, 1);
> - =A0 =A0p2m_unlock(p2m);
> -
> - =A0 =A0return r;
> + =A0 =A0return p2m_pod_demand_populate(p2m, gfn, order, q);
> =A0}
>
> =A0/* Read the current domain's p2m table (through the linear mapping). *=
/
> @@ -894,6 +879,7 @@ static void p2m_change_type_global(struc
> =A0 =A0 if ( pagetable_get_pfn(p2m_get_pagetable(p2m)) =3D=3D 0 )
> =A0 =A0 =A0 =A0 return;
>
> + =A0 =A0/* Checks for exclusive lock */
> =A0 =A0 ASSERT(p2m_locked_by_me(p2m));
>
> =A0#if CONFIG_PAGING_LEVELS =3D=3D 4
> diff -r 8a98179666de -r 471d4f2754d6 xen/arch/x86/mm/p2m.c
> --- a/xen/arch/x86/mm/p2m.c
> +++ b/xen/arch/x86/mm/p2m.c
> @@ -143,9 +143,9 @@ void p2m_change_entry_type_global(struct
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 p2m_t=
ype_t ot, p2m_type_t nt)
> =A0{
> =A0 =A0 struct p2m_domain *p2m =3D p2m_get_hostp2m(d);
> - =A0 =A0p2m_lock(p2m);
> + =A0 =A0get_p2m_global(p2m);
> =A0 =A0 p2m->change_entry_type_global(p2m, ot, nt);
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0put_p2m_global(p2m);
> =A0}
>
> =A0mfn_t gfn_to_mfn_type_p2m(struct p2m_domain *p2m, unsigned long gfn,
> @@ -162,12 +162,17 @@ mfn_t gfn_to_mfn_type_p2m(struct p2m_dom
> =A0 =A0 =A0 =A0 return _mfn(gfn);
> =A0 =A0 }
>
> + =A0 =A0/* We take the lock for this single gfn. The caller has to put t=
his lock */
> + =A0 =A0get_p2m_gfn(p2m, gfn);
> +
> =A0 =A0 mfn =3D p2m->get_entry(p2m, gfn, t, a, q, page_order);
>
> =A0#ifdef __x86_64__
> =A0 =A0 if ( q =3D=3D p2m_unshare && p2m_is_shared(*t) )
> =A0 =A0 {
> =A0 =A0 =A0 =A0 ASSERT(!p2m_is_nestedp2m(p2m));
> + =A0 =A0 =A0 =A0/* p2m locking is recursive, so we won't deadlock going
> + =A0 =A0 =A0 =A0 * into the sharing code */
> =A0 =A0 =A0 =A0 mem_sharing_unshare_page(p2m->domain, gfn, 0);
> =A0 =A0 =A0 =A0 mfn =3D p2m->get_entry(p2m, gfn, t, a, q, page_order);
> =A0 =A0 }
> @@ -179,13 +184,28 @@ mfn_t gfn_to_mfn_type_p2m(struct p2m_dom
> =A0 =A0 =A0 =A0 /* Return invalid_mfn to avoid caller's access */
> =A0 =A0 =A0 =A0 mfn =3D _mfn(INVALID_MFN);
> =A0 =A0 =A0 =A0 if (q =3D=3D p2m_guest)
> + =A0 =A0 =A0 =A0{
> + =A0 =A0 =A0 =A0 =A0 =A0put_p2m_gfn(p2m, gfn);
> =A0 =A0 =A0 =A0 =A0 =A0 domain_crash(p2m->domain);
> + =A0 =A0 =A0 =A0}
> =A0 =A0 }
> =A0#endif
>
> + =A0 =A0/* Take an extra reference to the page. It won't disappear benea=
th us */
> + =A0 =A0if ( mfn_valid(mfn) )
> + =A0 =A0{
> + =A0 =A0 =A0 =A0/* Use this because we don't necessarily know who owns t=
he page */
> + =A0 =A0 =A0 =A0if ( !page_get_owner_and_reference(mfn_to_page(mfn)) )
> + =A0 =A0 =A0 =A0{
> + =A0 =A0 =A0 =A0 =A0 =A0mfn =3D _mfn(INVALID_MFN);
> + =A0 =A0 =A0 =A0}
> + =A0 =A0}
> +
> + =A0 =A0/* We leave holding the p2m lock for this gfn */
> =A0 =A0 return mfn;
> =A0}
>
> +/* Appropriate locks held on entry */
> =A0int set_p2m_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn=
,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 unsigned int page_order, p2m_type_t p=
2mt, p2m_access_t p2ma)
> =A0{
> @@ -194,8 +214,6 @@ int set_p2m_entry(struct p2m_domain *p2m
> =A0 =A0 unsigned int order;
> =A0 =A0 int rc =3D 1;
>
> - =A0 =A0ASSERT(p2m_locked_by_me(p2m));
> -
> =A0 =A0 while ( todo )
> =A0 =A0 {
> =A0 =A0 =A0 =A0 if ( hap_enabled(d) )
> @@ -217,6 +235,18 @@ int set_p2m_entry(struct p2m_domain *p2m
> =A0 =A0 return rc;
> =A0}
>
> +void drop_p2m_gfn(struct p2m_domain *p2m, unsigned long gfn,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0unsigned long frame)
> +{
> + =A0 =A0mfn_t mfn =3D _mfn(frame);
> + =A0 =A0/* For non-translated domains, locks are never taken */
> + =A0 =A0if ( !p2m || !paging_mode_translate(p2m->domain) )
> + =A0 =A0 =A0 =A0return;
> + =A0 =A0if ( mfn_valid(mfn) )
> + =A0 =A0 =A0 =A0put_page(mfn_to_page(mfn));
> + =A0 =A0put_p2m_gfn(p2m, gfn);
> +}
> +
> =A0struct page_info *p2m_alloc_ptp(struct p2m_domain *p2m, unsigned long =
type)
> =A0{
> =A0 =A0 struct page_info *pg;
> @@ -262,12 +292,12 @@ int p2m_alloc_table(struct p2m_domain *p
> =A0 =A0 unsigned long gfn =3D -1UL;
> =A0 =A0 struct domain *d =3D p2m->domain;
>
> - =A0 =A0p2m_lock(p2m);
> + =A0 =A0get_p2m_global(p2m);
>
> =A0 =A0 if ( pagetable_get_pfn(p2m_get_pagetable(p2m)) !=3D 0 )
> =A0 =A0 {
> =A0 =A0 =A0 =A0 P2M_ERROR("p2m already allocated for this domain\n");
> - =A0 =A0 =A0 =A0p2m_unlock(p2m);
> + =A0 =A0 =A0 =A0put_p2m_global(p2m);
> =A0 =A0 =A0 =A0 return -EINVAL;
> =A0 =A0 }
>
> @@ -283,7 +313,7 @@ int p2m_alloc_table(struct p2m_domain *p
>
> =A0 =A0 if ( p2m_top =3D=3D NULL )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0p2m_unlock(p2m);
> + =A0 =A0 =A0 =A0put_p2m_global(p2m);
> =A0 =A0 =A0 =A0 return -ENOMEM;
> =A0 =A0 }
>
> @@ -295,7 +325,7 @@ int p2m_alloc_table(struct p2m_domain *p
> =A0 =A0 P2M_PRINTK("populating p2m table\n");
>
> =A0 =A0 /* Initialise physmap tables for slot zero. Other code assumes th=
is. */
> - =A0 =A0p2m->defer_nested_flush =3D 1;
> + =A0 =A0atomic_set(&p2m->defer_nested_flush, 1);
> =A0 =A0 if ( !set_p2m_entry(p2m, 0, _mfn(INVALID_MFN), 0,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 p2m_invalid, p2m->default=
_access) )
> =A0 =A0 =A0 =A0 goto error;
> @@ -323,10 +353,10 @@ int p2m_alloc_table(struct p2m_domain *p
> =A0 =A0 =A0 =A0 }
> =A0 =A0 =A0 =A0 spin_unlock(&p2m->domain->page_alloc_lock);
> =A0 =A0 }
> - =A0 =A0p2m->defer_nested_flush =3D 0;
> + =A0 =A0atomic_set(&p2m->defer_nested_flush, 0);
>
> =A0 =A0 P2M_PRINTK("p2m table initialised (%u pages)\n", page_count);
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0put_p2m_global(p2m);
> =A0 =A0 return 0;
>
> =A0error_unlock:
> @@ -334,7 +364,7 @@ error_unlock:
> =A0error:
> =A0 =A0 P2M_PRINTK("failed to initialize p2m table, gfn=3D%05lx, mfn=3D%"
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0PRI_mfn "\n", gfn, mfn_x(mfn));
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0put_p2m_global(p2m);
> =A0 =A0 return -ENOMEM;
> =A0}
>
> @@ -354,26 +384,28 @@ void p2m_teardown(struct p2m_domain *p2m
> =A0 =A0 if (p2m =3D=3D NULL)
> =A0 =A0 =A0 =A0 return;
>
> + =A0 =A0get_p2m_global(p2m);
> +
> =A0#ifdef __x86_64__
> =A0 =A0 for ( gfn=3D0; gfn < p2m->max_mapped_pfn; gfn++ )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0mfn =3D gfn_to_mfn_type_p2m(p2m, gfn, &t, &a, p2m_query,=
 NULL);
> + =A0 =A0 =A0 =A0mfn =3D p2m->get_entry(p2m, gfn, &t, &a, p2m_query, NULL=
);
> =A0 =A0 =A0 =A0 if ( mfn_valid(mfn) && (t =3D=3D p2m_ram_shared) )
> =A0 =A0 =A0 =A0 {
> =A0 =A0 =A0 =A0 =A0 =A0 ASSERT(!p2m_is_nestedp2m(p2m));
> + =A0 =A0 =A0 =A0 =A0 =A0/* The p2m allows an exclusive global holder to =
recursively
> + =A0 =A0 =A0 =A0 =A0 =A0 * lock sub-ranges. For this. */
> =A0 =A0 =A0 =A0 =A0 =A0 BUG_ON(mem_sharing_unshare_page(d, gfn, MEM_SHARI=
NG_DESTROY_GFN));
> =A0 =A0 =A0 =A0 }
>
> =A0 =A0 }
> =A0#endif
>
> - =A0 =A0p2m_lock(p2m);
> -
> =A0 =A0 p2m->phys_table =3D pagetable_null();
>
> =A0 =A0 while ( (pg =3D page_list_remove_head(&p2m->pages)) )
> =A0 =A0 =A0 =A0 d->arch.paging.free_page(d, pg);
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0put_p2m_global(p2m);
> =A0}
>
> =A0static void p2m_teardown_nestedp2m(struct domain *d)
> @@ -401,6 +433,7 @@ void p2m_final_teardown(struct domain *d
> =A0}
>
>
> +/* Locks held on entry */
> =A0static void
> =A0p2m_remove_page(struct p2m_domain *p2m, unsigned long gfn, unsigned lo=
ng mfn,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 unsigned int page_order)
> @@ -438,11 +471,11 @@ guest_physmap_remove_page(struct domain
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 unsigned long mfn, un=
signed int page_order)
> =A0{
> =A0 =A0 struct p2m_domain *p2m =3D p2m_get_hostp2m(d);
> - =A0 =A0p2m_lock(p2m);
> + =A0 =A0get_p2m(p2m, gfn, page_order);
> =A0 =A0 audit_p2m(p2m, 1);
> =A0 =A0 p2m_remove_page(p2m, gfn, mfn, page_order);
> =A0 =A0 audit_p2m(p2m, 1);
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0put_p2m(p2m, gfn, page_order);
> =A0}
>
> =A0int
> @@ -480,7 +513,7 @@ guest_physmap_add_entry(struct domain *d
> =A0 =A0 if ( rc !=3D 0 )
> =A0 =A0 =A0 =A0 return rc;
>
> - =A0 =A0p2m_lock(p2m);
> + =A0 =A0get_p2m(p2m, gfn, page_order);
> =A0 =A0 audit_p2m(p2m, 0);
>
> =A0 =A0 P2M_DEBUG("adding gfn=3D%#lx mfn=3D%#lx\n", gfn, mfn);
> @@ -488,12 +521,13 @@ guest_physmap_add_entry(struct domain *d
> =A0 =A0 /* First, remove m->p mappings for existing p->m mappings */
> =A0 =A0 for ( i =3D 0; i < (1UL << page_order); i++ )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0omfn =3D gfn_to_mfn_query(d, gfn + i, &ot);
> + =A0 =A0 =A0 =A0p2m_access_t a;
> + =A0 =A0 =A0 =A0omfn =3D p2m->get_entry(p2m, gfn + i, &ot, &a, p2m_query=
, NULL);
> =A0 =A0 =A0 =A0 if ( p2m_is_grant(ot) )
> =A0 =A0 =A0 =A0 {
> =A0 =A0 =A0 =A0 =A0 =A0 /* Really shouldn't be unmapping grant maps this =
way */
> + =A0 =A0 =A0 =A0 =A0 =A0put_p2m(p2m, gfn, page_order);
> =A0 =A0 =A0 =A0 =A0 =A0 domain_crash(d);
> - =A0 =A0 =A0 =A0 =A0 =A0p2m_unlock(p2m);
> =A0 =A0 =A0 =A0 =A0 =A0 return -EINVAL;
> =A0 =A0 =A0 =A0 }
> =A0 =A0 =A0 =A0 else if ( p2m_is_ram(ot) )
> @@ -523,11 +557,12 @@ guest_physmap_add_entry(struct domain *d
> =A0 =A0 =A0 =A0 =A0 =A0 && (ogfn !=3D INVALID_M2P_ENTRY)
> =A0 =A0 =A0 =A0 =A0 =A0 && (ogfn !=3D gfn + i) )
> =A0 =A0 =A0 =A0 {
> + =A0 =A0 =A0 =A0 =A0 =A0p2m_access_t a;
> =A0 =A0 =A0 =A0 =A0 =A0 /* This machine frame is already mapped at anothe=
r physical
> =A0 =A0 =A0 =A0 =A0 =A0 =A0* address */
> =A0 =A0 =A0 =A0 =A0 =A0 P2M_DEBUG("aliased! mfn=3D%#lx, old gfn=3D%#lx, n=
ew gfn=3D%#lx\n",
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn + i, ogfn, gfn + i);
> - =A0 =A0 =A0 =A0 =A0 =A0omfn =3D gfn_to_mfn_query(d, ogfn, &ot);
> + =A0 =A0 =A0 =A0 =A0 =A0omfn =3D p2m->get_entry(p2m, ogfn, &ot, &a, p2m_=
query, NULL);
> =A0 =A0 =A0 =A0 =A0 =A0 if ( p2m_is_ram(ot) )
> =A0 =A0 =A0 =A0 =A0 =A0 {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ASSERT(mfn_valid(omfn));
> @@ -567,7 +602,7 @@ guest_physmap_add_entry(struct domain *d
> =A0 =A0 }
>
> =A0 =A0 audit_p2m(p2m, 1);
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0put_p2m(p2m, gfn, page_order);
>
> =A0 =A0 return rc;
> =A0}
> @@ -579,18 +614,19 @@ p2m_type_t p2m_change_type(struct domain
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0p2m_type_t ot, p2m=
_type_t nt)
> =A0{
> =A0 =A0 p2m_type_t pt;
> + =A0 =A0p2m_access_t a;
> =A0 =A0 mfn_t mfn;
> =A0 =A0 struct p2m_domain *p2m =3D p2m_get_hostp2m(d);
>
> =A0 =A0 BUG_ON(p2m_is_grant(ot) || p2m_is_grant(nt));
>
> - =A0 =A0p2m_lock(p2m);
> + =A0 =A0get_p2m_gfn(p2m, gfn);
>
> - =A0 =A0mfn =3D gfn_to_mfn_query(d, gfn, &pt);
> + =A0 =A0mfn =3D p2m->get_entry(p2m, gfn, &pt, &a, p2m_query, NULL);
> =A0 =A0 if ( pt =3D=3D ot )
> =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gfn, mfn, 0, nt, p2m->default_access);
>
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0put_p2m_gfn(p2m, gfn);
>
> =A0 =A0 return pt;
> =A0}
> @@ -608,20 +644,23 @@ void p2m_change_type_range(struct domain
>
> =A0 =A0 BUG_ON(p2m_is_grant(ot) || p2m_is_grant(nt));
>
> - =A0 =A0p2m_lock(p2m);
> - =A0 =A0p2m->defer_nested_flush =3D 1;
> + =A0 =A0atomic_set(&p2m->defer_nested_flush, 1);
>
> + =A0 =A0/* We've been given a number instead of an order, so lock each
> + =A0 =A0 * gfn individually */
> =A0 =A0 for ( gfn =3D start; gfn < end; gfn++ )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0mfn =3D gfn_to_mfn_query(d, gfn, &pt);
> + =A0 =A0 =A0 =A0p2m_access_t a;
> + =A0 =A0 =A0 =A0get_p2m_gfn(p2m, gfn);
> + =A0 =A0 =A0 =A0mfn =3D p2m->get_entry(p2m, gfn, &pt, &a, p2m_query, NUL=
L);
> =A0 =A0 =A0 =A0 if ( pt =3D=3D ot )
> =A0 =A0 =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gfn, mfn, 0, nt, p2m->default_=
access);
> + =A0 =A0 =A0 =A0put_p2m_gfn(p2m, gfn);
> =A0 =A0 }
>
> - =A0 =A0p2m->defer_nested_flush =3D 0;
> + =A0 =A0atomic_set(&p2m->defer_nested_flush, 0);
> =A0 =A0 if ( nestedhvm_enabled(d) )
> =A0 =A0 =A0 =A0 p2m_flush_nestedp2m(d);
> - =A0 =A0p2m_unlock(p2m);
> =A0}
>
>
> @@ -631,17 +670,18 @@ set_mmio_p2m_entry(struct domain *d, uns
> =A0{
> =A0 =A0 int rc =3D 0;
> =A0 =A0 p2m_type_t ot;
> + =A0 =A0p2m_access_t a;
> =A0 =A0 mfn_t omfn;
> =A0 =A0 struct p2m_domain *p2m =3D p2m_get_hostp2m(d);
>
> =A0 =A0 if ( !paging_mode_translate(d) )
> =A0 =A0 =A0 =A0 return 0;
>
> - =A0 =A0p2m_lock(p2m);
> - =A0 =A0omfn =3D gfn_to_mfn_query(d, gfn, &ot);
> + =A0 =A0get_p2m_gfn(p2m, gfn);
> + =A0 =A0omfn =3D p2m->get_entry(p2m, gfn, &ot, &a, p2m_query, NULL);
> =A0 =A0 if ( p2m_is_grant(ot) )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0p2m_unlock(p2m);
> + =A0 =A0 =A0 =A0put_p2m_gfn(p2m, gfn);
> =A0 =A0 =A0 =A0 domain_crash(d);
> =A0 =A0 =A0 =A0 return 0;
> =A0 =A0 }
> @@ -654,11 +694,11 @@ set_mmio_p2m_entry(struct domain *d, uns
> =A0 =A0 P2M_DEBUG("set mmio %lx %lx\n", gfn, mfn_x(mfn));
> =A0 =A0 rc =3D set_p2m_entry(p2m, gfn, mfn, 0, p2m_mmio_direct, p2m->defa=
ult_access);
> =A0 =A0 audit_p2m(p2m, 1);
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0put_p2m_gfn(p2m, gfn);
> =A0 =A0 if ( 0 =3D=3D rc )
> =A0 =A0 =A0 =A0 gdprintk(XENLOG_ERR,
> =A0 =A0 =A0 =A0 =A0 =A0 "set_mmio_p2m_entry: set_p2m_entry failed! mfn=3D=
%08lx\n",
> - =A0 =A0 =A0 =A0 =A0 =A0mfn_x(gfn_to_mfn_query(d, gfn, &ot)));
> + =A0 =A0 =A0 =A0 =A0 =A0mfn_x(gfn_to_mfn_query_unlocked(d, gfn, &ot)));
> =A0 =A0 return rc;
> =A0}
>
> @@ -668,13 +708,14 @@ clear_mmio_p2m_entry(struct domain *d, u
> =A0 =A0 int rc =3D 0;
> =A0 =A0 mfn_t mfn;
> =A0 =A0 p2m_type_t t;
> + =A0 =A0p2m_access_t a;
> =A0 =A0 struct p2m_domain *p2m =3D p2m_get_hostp2m(d);
>
> =A0 =A0 if ( !paging_mode_translate(d) )
> =A0 =A0 =A0 =A0 return 0;
>
> - =A0 =A0p2m_lock(p2m);
> - =A0 =A0mfn =3D gfn_to_mfn_query(d, gfn, &t);
> + =A0 =A0get_p2m_gfn(p2m, gfn);
> + =A0 =A0mfn =3D p2m->get_entry(p2m, gfn, &t, &a, p2m_query, NULL);
>
> =A0 =A0 /* Do not use mfn_valid() here as it will usually fail for MMIO p=
ages. */
> =A0 =A0 if ( (INVALID_MFN =3D=3D mfn_x(mfn)) || (t !=3D p2m_mmio_direct) =
)
> @@ -687,8 +728,7 @@ clear_mmio_p2m_entry(struct domain *d, u
> =A0 =A0 audit_p2m(p2m, 1);
>
> =A0out:
> - =A0 =A0p2m_unlock(p2m);
> -
> + =A0 =A0put_p2m_gfn(p2m, gfn);
> =A0 =A0 return rc;
> =A0}
>
> @@ -698,13 +738,14 @@ set_shared_p2m_entry(struct domain *d, u
> =A0 =A0 struct p2m_domain *p2m =3D p2m_get_hostp2m(d);
> =A0 =A0 int rc =3D 0;
> =A0 =A0 p2m_type_t ot;
> + =A0 =A0p2m_access_t a;
> =A0 =A0 mfn_t omfn;
>
> =A0 =A0 if ( !paging_mode_translate(p2m->domain) )
> =A0 =A0 =A0 =A0 return 0;
>
> - =A0 =A0p2m_lock(p2m);
> - =A0 =A0omfn =3D gfn_to_mfn_query(p2m->domain, gfn, &ot);
> + =A0 =A0get_p2m_gfn(p2m, gfn);
> + =A0 =A0omfn =3D p2m->get_entry(p2m, gfn, &ot, &a, p2m_query, NULL);
> =A0 =A0 /* At the moment we only allow p2m change if gfn has already been=
 made
> =A0 =A0 =A0* sharable first */
> =A0 =A0 ASSERT(p2m_is_shared(ot));
> @@ -714,11 +755,11 @@ set_shared_p2m_entry(struct domain *d, u
>
> =A0 =A0 P2M_DEBUG("set shared %lx %lx\n", gfn, mfn_x(mfn));
> =A0 =A0 rc =3D set_p2m_entry(p2m, gfn, mfn, 0, p2m_ram_shared, p2m->defau=
lt_access);
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0put_p2m_gfn(p2m, gfn);
> =A0 =A0 if ( 0 =3D=3D rc )
> =A0 =A0 =A0 =A0 gdprintk(XENLOG_ERR,
> =A0 =A0 =A0 =A0 =A0 =A0 "set_shared_p2m_entry: set_p2m_entry failed! mfn=
=3D%08lx\n",
> - =A0 =A0 =A0 =A0 =A0 =A0mfn_x(gfn_to_mfn_query(d, gfn, &ot)));
> + =A0 =A0 =A0 =A0 =A0 =A0mfn_x(gfn_to_mfn_query_unlocked(d, gfn, &ot)));
> =A0 =A0 return rc;
> =A0}
>
> @@ -732,7 +773,7 @@ int p2m_mem_paging_nominate(struct domai
> =A0 =A0 mfn_t mfn;
> =A0 =A0 int ret;
>
> - =A0 =A0p2m_lock(p2m);
> + =A0 =A0get_p2m_gfn(p2m, gfn);
>
> =A0 =A0 mfn =3D p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
>
> @@ -765,7 +806,7 @@ int p2m_mem_paging_nominate(struct domai
> =A0 =A0 ret =3D 0;
>
> =A0out:
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0put_p2m_gfn(p2m, gfn);
> =A0 =A0 return ret;
> =A0}
>
> @@ -778,7 +819,7 @@ int p2m_mem_paging_evict(struct domain *
> =A0 =A0 struct p2m_domain *p2m =3D p2m_get_hostp2m(d);
> =A0 =A0 int ret =3D -EINVAL;
>
> - =A0 =A0p2m_lock(p2m);
> + =A0 =A0get_p2m_gfn(p2m, gfn);
>
> =A0 =A0 /* Get mfn */
> =A0 =A0 mfn =3D p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
> @@ -824,7 +865,7 @@ int p2m_mem_paging_evict(struct domain *
> =A0 =A0 put_page(page);
>
> =A0out:
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0put_p2m_gfn(p2m, gfn);
> =A0 =A0 return ret;
> =A0}
>
> @@ -863,7 +904,7 @@ void p2m_mem_paging_populate(struct doma
> =A0 =A0 req.type =3D MEM_EVENT_TYPE_PAGING;
>
> =A0 =A0 /* Fix p2m mapping */
> - =A0 =A0p2m_lock(p2m);
> + =A0 =A0get_p2m_gfn(p2m, gfn);
> =A0 =A0 mfn =3D p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
> =A0 =A0 /* Allow only nominated or evicted pages to enter page-in path */
> =A0 =A0 if ( p2mt =3D=3D p2m_ram_paging_out || p2mt =3D=3D p2m_ram_paged =
)
> @@ -875,7 +916,7 @@ void p2m_mem_paging_populate(struct doma
> =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gfn, mfn, 0, p2m_ram_paging_in_start, =
a);
> =A0 =A0 =A0 =A0 audit_p2m(p2m, 1);
> =A0 =A0 }
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0put_p2m_gfn(p2m, gfn);
>
> =A0 =A0 /* Pause domain if request came from guest and gfn has paging typ=
e */
> =A0 =A0 if ( =A0p2m_is_paging(p2mt) && v->domain->domain_id =3D=3D d->dom=
ain_id )
> @@ -908,7 +949,7 @@ int p2m_mem_paging_prep(struct domain *d
> =A0 =A0 struct p2m_domain *p2m =3D p2m_get_hostp2m(d);
> =A0 =A0 int ret =3D -ENOMEM;
>
> - =A0 =A0p2m_lock(p2m);
> + =A0 =A0get_p2m_gfn(p2m, gfn);
>
> =A0 =A0 mfn =3D p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
>
> @@ -931,7 +972,7 @@ int p2m_mem_paging_prep(struct domain *d
> =A0 =A0 ret =3D 0;
>
> =A0out:
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0put_p2m_gfn(p2m, gfn);
> =A0 =A0 return ret;
> =A0}
>
> @@ -949,12 +990,12 @@ void p2m_mem_paging_resume(struct domain
> =A0 =A0 /* Fix p2m entry if the page was not dropped */
> =A0 =A0 if ( !(rsp.flags & MEM_EVENT_FLAG_DROP_PAGE) )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0p2m_lock(p2m);
> + =A0 =A0 =A0 =A0get_p2m_gfn(p2m, rsp.gfn);
> =A0 =A0 =A0 =A0 mfn =3D p2m->get_entry(p2m, rsp.gfn, &p2mt, &a, p2m_query=
, NULL);
> =A0 =A0 =A0 =A0 set_p2m_entry(p2m, rsp.gfn, mfn, 0, p2m_ram_rw, a);
> =A0 =A0 =A0 =A0 set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
> =A0 =A0 =A0 =A0 audit_p2m(p2m, 1);
> - =A0 =A0 =A0 =A0p2m_unlock(p2m);
> + =A0 =A0 =A0 =A0put_p2m_gfn(p2m, rsp.gfn);
> =A0 =A0 }
>
> =A0 =A0 /* Unpause domain */
> @@ -979,16 +1020,16 @@ void p2m_mem_access_check(unsigned long
> =A0 =A0 p2m_access_t p2ma;
>
> =A0 =A0 /* First, handle rx2rw conversion automatically */
> - =A0 =A0p2m_lock(p2m);
> + =A0 =A0get_p2m_gfn(p2m, gfn);
> =A0 =A0 mfn =3D p2m->get_entry(p2m, gfn, &p2mt, &p2ma, p2m_query, NULL);
>
> =A0 =A0 if ( access_w && p2ma =3D=3D p2m_access_rx2rw )
> =A0 =A0 {
> =A0 =A0 =A0 =A0 p2m->set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2mt, p2m_ac=
cess_rw);
> - =A0 =A0 =A0 =A0p2m_unlock(p2m);
> + =A0 =A0 =A0 =A0put_p2m_gfn(p2m, gfn);
> =A0 =A0 =A0 =A0 return;
> =A0 =A0 }
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0put_p2m_gfn(p2m, gfn);
>
> =A0 =A0 /* Otherwise, check if there is a memory event listener, and send=
 the message along */
> =A0 =A0 res =3D mem_event_check_ring(d, &d->mem_access);
> @@ -1006,9 +1047,9 @@ void p2m_mem_access_check(unsigned long
> =A0 =A0 =A0 =A0 else
> =A0 =A0 =A0 =A0 {
> =A0 =A0 =A0 =A0 =A0 =A0 /* A listener is not required, so clear the acces=
s restrictions */
> - =A0 =A0 =A0 =A0 =A0 =A0p2m_lock(p2m);
> + =A0 =A0 =A0 =A0 =A0 =A0get_p2m_gfn(p2m, gfn);
> =A0 =A0 =A0 =A0 =A0 =A0 p2m->set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2mt=
, p2m_access_rwx);
> - =A0 =A0 =A0 =A0 =A0 =A0p2m_unlock(p2m);
> + =A0 =A0 =A0 =A0 =A0 =A0put_p2m_gfn(p2m, gfn);
> =A0 =A0 =A0 =A0 }
>
> =A0 =A0 =A0 =A0 return;
> @@ -1064,7 +1105,7 @@ int p2m_set_mem_access(struct domain *d,
> =A0{
> =A0 =A0 struct p2m_domain *p2m =3D p2m_get_hostp2m(d);
> =A0 =A0 unsigned long pfn;
> - =A0 =A0p2m_access_t a;
> + =A0 =A0p2m_access_t a, _a;
> =A0 =A0 p2m_type_t t;
> =A0 =A0 mfn_t mfn;
> =A0 =A0 int rc =3D 0;
> @@ -1095,17 +1136,20 @@ int p2m_set_mem_access(struct domain *d,
> =A0 =A0 =A0 =A0 return 0;
> =A0 =A0 }
>
> - =A0 =A0p2m_lock(p2m);
> + =A0 =A0/* Because we don't get an order, rather a number, we need to lo=
ck each
> + =A0 =A0 * entry individually */
> =A0 =A0 for ( pfn =3D start_pfn; pfn < start_pfn + nr; pfn++ )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0mfn =3D gfn_to_mfn_query(d, pfn, &t);
> + =A0 =A0 =A0 =A0get_p2m_gfn(p2m, pfn);
> + =A0 =A0 =A0 =A0mfn =3D p2m->get_entry(p2m, pfn, &t, &_a, p2m_query, NUL=
L);
> =A0 =A0 =A0 =A0 if ( p2m->set_entry(p2m, pfn, mfn, PAGE_ORDER_4K, t, a) =
=3D=3D 0 )
> =A0 =A0 =A0 =A0 {
> + =A0 =A0 =A0 =A0 =A0 =A0put_p2m_gfn(p2m, pfn);
> =A0 =A0 =A0 =A0 =A0 =A0 rc =3D -ENOMEM;
> =A0 =A0 =A0 =A0 =A0 =A0 break;
> =A0 =A0 =A0 =A0 }
> + =A0 =A0 =A0 =A0put_p2m_gfn(p2m, pfn);
> =A0 =A0 }
> - =A0 =A0p2m_unlock(p2m);
> =A0 =A0 return rc;
> =A0}
>
> @@ -1138,7 +1182,10 @@ int p2m_get_mem_access(struct domain *d,
> =A0 =A0 =A0 =A0 return 0;
> =A0 =A0 }
>
> + =A0 =A0get_p2m_gfn(p2m, pfn);
> =A0 =A0 mfn =3D p2m->get_entry(p2m, pfn, &t, &a, p2m_query, NULL);
> + =A0 =A0put_p2m_gfn(p2m, pfn);
> +
> =A0 =A0 if ( mfn_x(mfn) =3D=3D INVALID_MFN )
> =A0 =A0 =A0 =A0 return -ESRCH;
>
> @@ -1175,7 +1222,7 @@ p2m_flush_table(struct p2m_domain *p2m)
> =A0 =A0 struct domain *d =3D p2m->domain;
> =A0 =A0 void *p;
>
> - =A0 =A0p2m_lock(p2m);
> + =A0 =A0get_p2m_global(p2m);
>
> =A0 =A0 /* "Host" p2m tables can have shared entries &c that need a bit m=
ore
> =A0 =A0 =A0* care when discarding them */
> @@ -1203,7 +1250,7 @@ p2m_flush_table(struct p2m_domain *p2m)
> =A0 =A0 =A0 =A0 =A0 =A0 d->arch.paging.free_page(d, pg);
> =A0 =A0 page_list_add(top, &p2m->pages);
>
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0put_p2m_global(p2m);
> =A0}
>
> =A0void
> @@ -1245,7 +1292,7 @@ p2m_get_nestedp2m(struct vcpu *v, uint64
> =A0 =A0 p2m =3D nv->nv_p2m;
> =A0 =A0 if ( p2m )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0p2m_lock(p2m);
> + =A0 =A0 =A0 =A0get_p2m_global(p2m);
> =A0 =A0 =A0 =A0 if ( p2m->cr3 =3D=3D cr3 || p2m->cr3 =3D=3D CR3_EADDR )
> =A0 =A0 =A0 =A0 {
> =A0 =A0 =A0 =A0 =A0 =A0 nv->nv_flushp2m =3D 0;
> @@ -1255,24 +1302,24 @@ p2m_get_nestedp2m(struct vcpu *v, uint64
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 hvm_asid_flush_vcpu(v);
> =A0 =A0 =A0 =A0 =A0 =A0 p2m->cr3 =3D cr3;
> =A0 =A0 =A0 =A0 =A0 =A0 cpu_set(v->processor, p2m->p2m_dirty_cpumask);
> - =A0 =A0 =A0 =A0 =A0 =A0p2m_unlock(p2m);
> + =A0 =A0 =A0 =A0 =A0 =A0put_p2m_global(p2m);
> =A0 =A0 =A0 =A0 =A0 =A0 nestedp2m_unlock(d);
> =A0 =A0 =A0 =A0 =A0 =A0 return p2m;
> =A0 =A0 =A0 =A0 }
> - =A0 =A0 =A0 =A0p2m_unlock(p2m);
> + =A0 =A0 =A0 =A0put_p2m_global(p2m);
> =A0 =A0 }
>
> =A0 =A0 /* All p2m's are or were in use. Take the least recent used one,
> =A0 =A0 =A0* flush it and reuse. */
> =A0 =A0 p2m =3D p2m_getlru_nestedp2m(d, NULL);
> =A0 =A0 p2m_flush_table(p2m);
> - =A0 =A0p2m_lock(p2m);
> + =A0 =A0get_p2m_global(p2m);
> =A0 =A0 nv->nv_p2m =3D p2m;
> =A0 =A0 p2m->cr3 =3D cr3;
> =A0 =A0 nv->nv_flushp2m =3D 0;
> =A0 =A0 hvm_asid_flush_vcpu(v);
> =A0 =A0 cpu_set(v->processor, p2m->p2m_dirty_cpumask);
> - =A0 =A0p2m_unlock(p2m);
> + =A0 =A0put_p2m_global(p2m);
> =A0 =A0 nestedp2m_unlock(d);
>
> =A0 =A0 return p2m;
> diff -r 8a98179666de -r 471d4f2754d6 xen/include/asm-ia64/mm.h
> --- a/xen/include/asm-ia64/mm.h
> +++ b/xen/include/asm-ia64/mm.h
> @@ -561,6 +561,11 @@ extern u64 translate_domain_pte(u64 ptev
> =A0 =A0 ((get_gpfn_from_mfn((madr) >> PAGE_SHIFT) << PAGE_SHIFT) | \
> =A0 =A0 ((madr) & ~PAGE_MASK))
>
> +/* Because x86-specific p2m fine-grained lock releases are called from c=
ommon
> + * code, we put a dummy placeholder here */
> +#define drop_p2m_gfn(p, g, m) =A0 =A0 =A0 =A0 =A0 ((void)0)
> +#define drop_p2m_gfn_domain(p, g, m) =A0 =A0((void)0)
> +
> =A0/* Internal use only: returns 0 in case of bad address. =A0*/
> =A0extern unsigned long paddr_to_maddr(unsigned long paddr);
>
> diff -r 8a98179666de -r 471d4f2754d6 xen/include/asm-x86/p2m.h
> --- a/xen/include/asm-x86/p2m.h
> +++ b/xen/include/asm-x86/p2m.h
> @@ -220,7 +220,7 @@ struct p2m_domain {
> =A0 =A0 =A0* tables on every host-p2m change. =A0The setter of this flag
> =A0 =A0 =A0* is responsible for performing the full flush before releasin=
g the
> =A0 =A0 =A0* host p2m's lock. */
> - =A0 =A0int =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0defer_nested_flush;
> + =A0 =A0atomic_t =A0 =A0 =A0 =A0 =A0 defer_nested_flush;
>
> =A0 =A0 /* Pages used to construct the p2m */
> =A0 =A0 struct page_list_head pages;
> @@ -298,6 +298,15 @@ struct p2m_domain *p2m_get_p2m(struct vc
> =A0#define p2m_get_pagetable(p2m) =A0((p2m)->phys_table)
>
>
> +/* No matter what value you get out of a query, the p2m has been locked =
for
> + * that range. No matter what you do, you need to drop those locks.
> + * You need to pass back the mfn obtained when locking, not the new one,
> + * as the refcount of the original mfn was bumped. */
> +void drop_p2m_gfn(struct p2m_domain *p2m, unsigned long gfn,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0unsigned long mfn);
> +#define drop_p2m_gfn_domain(d, g, m) =A0 =A0\
> + =A0 =A0 =A0 =A0drop_p2m_gfn(p2m_get_hostp2m((d)), (g), (m))
> +
> =A0/* Read a particular P2M table, mapping pages as we go. =A0Most caller=
s
> =A0* should _not_ call this directly; use the other gfn_to_mfn_* function=
s
> =A0* below unless you know you want to walk a p2m that isn't a domain's
> @@ -327,6 +336,28 @@ static inline mfn_t gfn_to_mfn_type(stru
> =A0#define gfn_to_mfn_guest(d, g, t) =A0 gfn_to_mfn_type((d), (g), (t), p=
2m_guest)
> =A0#define gfn_to_mfn_unshare(d, g, t) gfn_to_mfn_type((d), (g), (t), p2m=
_unshare)
>
> +/* This one applies to very specific situations in which you're querying
> + * a p2m entry and will be done "immediately" (such as a printk or compu=
ting a
> + * return value). Use this only if there are no expectations of the p2m =
entry
> + * holding steady. */
> +static inline mfn_t gfn_to_mfn_type_unlocked(struct domain *d,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0unsigned long gfn, p2m_type_t *t,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0p2m_query_t q)
> +{
> + =A0 =A0mfn_t mfn =3D gfn_to_mfn_type(d, gfn, t, q);
> + =A0 =A0drop_p2m_gfn_domain(d, gfn, mfn_x(mfn));
> + =A0 =A0return mfn;
> +}
> +
> +#define gfn_to_mfn_unlocked(d, g, t) =A0 =A0 =A0 =A0 =A0 =A0\
> + =A0 =A0gfn_to_mfn_type_unlocked((d), (g), (t), p2m_alloc)
> +#define gfn_to_mfn_query_unlocked(d, g, t) =A0 =A0\
> + =A0 =A0gfn_to_mfn_type_unlocked((d), (g), (t), p2m_query)
> +#define gfn_to_mfn_guest_unlocked(d, g, t) =A0 =A0\
> + =A0 =A0gfn_to_mfn_type_unlocked((d), (g), (t), p2m_guest)
> +#define gfn_to_mfn_unshare_unlocked(d, g, t) =A0 =A0\
> + =A0 =A0gfn_to_mfn_type_unlocked((d), (g), (t), p2m_unshare)
> +
> =A0/* Compatibility function exporting the old untyped interface */
> =A0static inline unsigned long gmfn_to_mfn(struct domain *d, unsigned lon=
g gpfn)
> =A0{
> @@ -338,6 +369,15 @@ static inline unsigned long gmfn_to_mfn(
> =A0 =A0 return INVALID_MFN;
> =A0}
>
> +/* Same comments apply re unlocking */
> +static inline unsigned long gmfn_to_mfn_unlocked(struct domain *d,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 =A0 =A0 =A0 =A0 unsigned long gpfn)
> +{
> + =A0 =A0unsigned long mfn =3D gmfn_to_mfn(d, gpfn);
> + =A0 =A0drop_p2m_gfn_domain(d, gpfn, mfn);
> + =A0 =A0return mfn;
> +}
> +
> =A0/* General conversion function from mfn to gfn */
> =A0static inline unsigned long mfn_to_gfn(struct domain *d, mfn_t mfn)
> =A0{
> @@ -521,7 +561,8 @@ static inline int p2m_gfn_check_limit(
> =A0#define p2m_gfn_check_limit(d, g, o) 0
> =A0#endif
>
> -/* Directly set a p2m entry: only for use by p2m code */
> +/* Directly set a p2m entry: only for use by p2m code. It expects locks =
to
> + * be held on entry */
> =A0int set_p2m_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn=
,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 unsigned int page_order, p2m_type_t p=
2mt, p2m_access_t p2ma);
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 18:33:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 18:33:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLmB2-0001RF-LC; Wed, 02 Nov 2011 18:33:08 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLmAG-0001BQ-2K
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 18:32:20 -0700
X-Env-Sender: gregkh@suse.de
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320283912!51273924!1
X-Originating-IP: [195.135.220.15]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6676 invoked from network); 3 Nov 2011 01:31:52 -0000
Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15)
	by server-9.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Nov 2011 01:31:52 -0000
Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	by mx2.suse.de (Postfix) with ESMTP id 5D4408A908;
	Thu,  3 Nov 2011 02:32:14 +0100 (CET)
Date: Wed, 2 Nov 2011 18:30:12 -0700
From: Greg KH <gregkh@suse.de>
To: Stephen Rothwell <sfr@canb.auug.org.au>
Message-ID: <20111103013012.GB3449@suse.de>
References: <20111027053007.GA32765@phenom.dumpdata.com>
	<20111027054806.GA1377@suse.de>
	<20111102121309.4dbb0d2ac90d2879130820dd@canb.auug.org.au>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111102121309.4dbb0d2ac90d2879130820dd@canb.auug.org.au>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Rusty Russell <rusty@rustcorp.com.au>, miche@google.com,
	linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org,
	Linus <torvalds@linux-foundation.org>, Anton Blanchard <anton@samba.org>,
	Amit Shah <amit.shah@redhat.com>, ppc-dev <linuxppc-dev@lists.ozlabs.org>
Subject: [Xen-devel] Re: Regression: patch " hvc_console: display printk
 messages on console." causing infinite loop with 3.2-rc0 + Xen.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Nov 02, 2011 at 12:13:09PM +1100, Stephen Rothwell wrote:
> Hi Greg,
> 
> On Thu, 27 Oct 2011 07:48:06 +0200 Greg KH <gregkh@suse.de> wrote:
> >
> > On Thu, Oct 27, 2011 at 01:30:08AM -0400, Konrad Rzeszutek Wilk wrote:
> > > Hey Miche.
> > > 
> > > The git commit 361162459f62dc0826b82c9690a741a940f457f0:
> > > 
> > >     hvc_console: display printk messages on console.
> > > 
> > > is causing an infinite loop when booting Linux under Xen, as so:
> > 
> > Ick, not good, thanks for letting us know.
> 
> Indeed. I am wondering why it was put in a tree and sent to Linus without
> any Acks or even being replied to by anyone.  It appeared in the tty tree
> between Oct 14 and Oct 25 (while I was unfortunately on vacation).  If
> anyone had tried to boot this on any PowerPC server, it would have been
> immediately obvious (as it was when I booted Linus' tree last night).
> 
> And the original author expressed doubts as to his understanding of how
> it should all work anyway.
> 
> Just a little more care, please.
> 
> I would vote for reverting the original and having it resubmitted with
> corrections at some later date.

You are right, I will go do that, sorry for the problems.

greg k-h

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 18:38:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 18:38:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLmFt-0001zd-Gj; Wed, 02 Nov 2011 18:38:09 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLmEs-0001mm-7T
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 18:37:06 -0700
X-Env-Sender: gregkh@suse.de
X-Msg-Ref: server-11.tower-27.messagelabs.com!1320284210!44182105!1
X-Originating-IP: [195.135.220.15]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20191 invoked from network); 3 Nov 2011 01:36:50 -0000
Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15)
	by server-11.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Nov 2011 01:36:50 -0000
Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	by mx2.suse.de (Postfix) with ESMTP id C53A68BB22;
	Thu,  3 Nov 2011 02:37:02 +0100 (CET)
X-Mailbox-Line: From gregkh@clark.kroah.org Wed Nov  2 15:14:58 2011
Message-Id: <20111102221458.645704243@clark.kroah.org>
User-Agent: quilt/0.48-16.4
Date: Wed, 02 Nov 2011 15:14:59 -0700
From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
In-Reply-To: <20111102221600.GA26650@kroah.com>
Cc: Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	Ian Campbell <ian.campbell@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	"Rafael J. Wysocki" <rjw@sisk.pl>,
	xen-devel <xen-devel@lists.xensource.com>,
	akpm@linux-foundation.org, torvalds@linux-foundation.org,
	Thomas Gleixner <tglx@linutronix.de>, alan@lxorguk.ukuu.org.uk
Subject: [Xen-devel] [093/107] genirq: Add IRQF_RESUME_EARLY and resume such
	IRQs earlier
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

2.6.32-longterm review patch.  If anyone has any objections, please let us know.

------------------

From: Ian Campbell <ian.campbell@citrix.com>

commit 9bab0b7fbaceec47d32db51cd9e59c82fb071f5a upstream

This adds a mechanism to resume selected IRQs during syscore_resume
instead of dpm_resume_noirq.

Under Xen we need to resume IRQs associated with IPIs early enough
that the resched IPI is unmasked and we can therefore schedule
ourselves out of the stop_machine where the suspend/resume takes
place.

This issue was introduced by 676dc3cf5bc3 "xen: Use IRQF_FORCE_RESUME".

Back ported to 2.6.32 (which lacks syscore support) by calling the relavant
resume function directly from sysdev_resume).

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Cc: Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>
Cc: xen-devel <xen-devel@lists.xensource.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Link: http://lkml.kernel.org/r/1318713254.11016.52.camel@dagon.hellion.org.uk
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 drivers/base/sys.c        |    6 ++++++
 drivers/xen/events.c      |    2 +-
 include/linux/interrupt.h |    5 +++++
 kernel/irq/pm.c           |   35 ++++++++++++++++++++++++++++-------
 4 files changed, 40 insertions(+), 8 deletions(-)

--- a/drivers/base/sys.c
+++ b/drivers/base/sys.c
@@ -471,6 +471,12 @@ int sysdev_resume(void)
 {
 	struct sysdev_class *cls;
 
+	/*
+	 * Called from syscore in mainline but called directly here
+	 * since syscore does not exist in this tree.
+	 */
+	irq_pm_syscore_resume();
+
 	WARN_ONCE(!irqs_disabled(),
 		"Interrupts enabled while resuming system devices\n");
 
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -536,7 +536,7 @@ int bind_ipi_to_irqhandler(enum ipi_vect
 	if (irq < 0)
 		return irq;
 
-	irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME;
+	irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME | IRQF_EARLY_RESUME;
 	retval = request_irq(irq, handler, irqflags, devname, dev_id);
 	if (retval != 0) {
 		unbind_from_irq(irq);
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -54,6 +54,8 @@
  *                irq line disabled until the threaded handler has been run.
  * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend
  * IRQF_FORCE_RESUME - Force enable it on resume even if IRQF_NO_SUSPEND is set
+ * IRQF_EARLY_RESUME - Resume IRQ early during syscore instead of at device
+ *                resume time.
  */
 #define IRQF_DISABLED		0x00000020
 #define IRQF_SAMPLE_RANDOM	0x00000040
@@ -66,6 +68,7 @@
 #define IRQF_ONESHOT		0x00002000
 #define IRQF_NO_SUSPEND		0x00004000
 #define IRQF_FORCE_RESUME	0x00008000
+#define IRQF_EARLY_RESUME	0x00020000
 
 #define IRQF_TIMER		(__IRQF_TIMER | IRQF_NO_SUSPEND)
 
@@ -196,6 +199,7 @@ extern void enable_irq(unsigned int irq)
 #ifdef CONFIG_GENERIC_HARDIRQS
 extern void suspend_device_irqs(void);
 extern void resume_device_irqs(void);
+extern void irq_pm_syscore_resume(void);
 #ifdef CONFIG_PM_SLEEP
 extern int check_wakeup_irqs(void);
 #else
@@ -204,6 +208,7 @@ static inline int check_wakeup_irqs(void
 #else
 static inline void suspend_device_irqs(void) { };
 static inline void resume_device_irqs(void) { };
+static inline void irq_pm_syscore_resume(void) { };
 static inline int check_wakeup_irqs(void) { return 0; }
 #endif
 
--- a/kernel/irq/pm.c
+++ b/kernel/irq/pm.c
@@ -39,25 +39,46 @@ void suspend_device_irqs(void)
 }
 EXPORT_SYMBOL_GPL(suspend_device_irqs);
 
-/**
- * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs()
- *
- * Enable all interrupt lines previously disabled by suspend_device_irqs() that
- * have the IRQ_SUSPENDED flag set.
- */
-void resume_device_irqs(void)
+static void resume_irqs(bool want_early)
 {
 	struct irq_desc *desc;
 	int irq;
 
 	for_each_irq_desc(irq, desc) {
 		unsigned long flags;
+		bool is_early = desc->action &&
+			desc->action->flags & IRQF_EARLY_RESUME;
+
+		if (is_early != want_early)
+			continue;
 
 		spin_lock_irqsave(&desc->lock, flags);
 		__enable_irq(desc, irq, true);
 		spin_unlock_irqrestore(&desc->lock, flags);
 	}
 }
+
+/**
+ * irq_pm_syscore_ops - enable interrupt lines early
+ *
+ * Enable all interrupt lines with %IRQF_EARLY_RESUME set.
+ */
+void irq_pm_syscore_resume(void)
+{
+	resume_irqs(true);
+}
+
+/**
+ * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs()
+ *
+ * Enable all non-%IRQF_EARLY_RESUME interrupt lines previously
+ * disabled by suspend_device_irqs() that have the IRQS_SUSPENDED flag
+ * set as well as those with %IRQF_FORCE_RESUME.
+ */
+void resume_device_irqs(void)
+{
+	resume_irqs(false);
+}
 EXPORT_SYMBOL_GPL(resume_device_irqs);
 
 /**



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 21:29:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 21:29:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLovy-0006Ex-AK; Wed, 02 Nov 2011 21:29:46 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLov8-00062P-JM
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 21:28:55 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1320294530!2088760!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22877 invoked from network); 3 Nov 2011 04:28:51 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-6.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 04:28:51 -0000
Received: by iaen33 with SMTP id n33so1104481iae.30
	for <xen-devel@lists.xensource.com>;
	Wed, 02 Nov 2011 21:28:49 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:cc:content-type;
	bh=S5bk6ZI7wBqusaYUZjrXFvTkC5llADSeWnvEy3PHQVc=;
	b=iSwBup+RYUH93VHsCfdguavn6MATDtGbVXVRBR8eIKOzgTfugvR5h3cPAeE4JVO6s4
	vovbezwel9kNalde7rM0wnl2UxT4PcbeY0PwG/Qi4BgTAJE+E1ErervzKY+HA8lrn81q
	/44EwX0Jna77lfZnrh12UBGQua6YKuIY6SYeo=
MIME-Version: 1.0
Received: by 10.50.36.168 with SMTP id r8mr1745283igj.49.1320294529772; Wed,
	02 Nov 2011 21:28:49 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Wed, 2 Nov 2011 21:28:49 -0700 (PDT)
In-Reply-To: <C10D3FB0CD45994C8A51FEC1227CE22F34B3905D03@shsmsx502.ccr.corp.intel.com>
References: <C10D3FB0CD45994C8A51FEC1227CE22F340768D793@shsmsx502.ccr.corp.intel.com>
	<CAFLBxZZ9nqeb7CVqTZCsEtJRjgGMTHF2Ak929kvauj2KUFSOyg@mail.gmail.com>
	<C10D3FB0CD45994C8A51FEC1227CE22F3428CB5EF9@shsmsx502.ccr.corp.intel.com>
	<1319789425.19320.12.camel@Abyss>
	<C10D3FB0CD45994C8A51FEC1227CE22F3428CB61F2@shsmsx502.ccr.corp.intel.com>
	<1319796584.19320.31.camel@Abyss>
	<1319818714.21033.414.camel@elijah>
	<C10D3FB0CD45994C8A51FEC1227CE22F34B3905D03@shsmsx502.ccr.corp.intel.com>
Date: Thu, 3 Nov 2011 13:28:49 +0900
X-Google-Sender-Auth: oXZUgoQT2ka8EBIgU_MHsvt7fV4
Message-ID: <CAFLBxZa5v_YgnC1LTa4a5wis4h6eQPijCAfUDLDsR4ucMuBXWg@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] scheduler rate controller
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: "Lv, Hui" <hui.lv@intel.com>
Content-Type: multipart/mixed; boundary=14dae9340a25722bab04b0cd064c
Cc: "Tian, Kevin" <kevin.tian@intel.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Keir \(Xen.org\)" <keir@xen.org>, "Dong, Eddie" <eddie.dong@intel.com>,
	George Dunlap <george.dunlap@citrix.com>, "Duan,
	Jiangang" <jiangang.duan@intel.com>, Dario Faggioli <raistlin@linux.it>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--14dae9340a25722bab04b0cd064c
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

On Sat, Oct 29, 2011 at 11:05 AM, Lv, Hui <hui.lv@intel.com> wrote:
> I have tried one way very similar as your idea.
> 1) to check whether current running vcpu runs less than 1ms, if yes, we w=
ill return current vcpu directly without preemption.
> It try to guarantee vcpu to run as long as 1ms, if it wants.
> It can reduce the scheduling frequency to some degree, but not very signi=
ficant. Because 1ms is too light/weak with comparison to 10ms delay (SRC pa=
tch used).

Hey Hui,  Sorry for the delay in response -- FYI I'm at the XenSummit
Korea now, and I'll be on holiday next week.

Do you have the patch that you wrote for the 1ms delay handy, and any
numbers that you ran?  I'm a bit surprised that a 1ms delay didn't
have much effect; but in any case, it seems dialing that up should
have a similar effect -- e.g., if we changed that to 10ms, then it
should have a similar effect to the patch that you sent before.

> As you said, if applying the seveal_ms_delay, it will happen whenever sys=
tem is normal or not (excessive frequency). It may possible have the conseq=
uence that 1)under normal condition, it will produce worse Qos than that wi=
thout applying such delay,

Perhaps; but the current credit scheduler may already allow a VM to
run exclusively for 30ms, so I don't think that overall it should have
a big influence.

> 2) under excessive frequency condition, the mitigation effect of 1ms-dela=
y may be too weak. In addition, your idea is to delay scheduling instead of=
 reducing, which means the total number of scheduling would probably not ch=
ange.

Well it will prevent preemption; so as long as at least one VM does
not yield, it will reduce the number of schedule events to 1000 times
per second.  If all VMs yield, then you can't really reduce the number
of scheduling events anyway (even with your preemption-disable patch).

> I think one possible solution, is to make the value of 1ms-delay adaptive=
 according to the system status (low load or high load). If so, SRC patch j=
ust covered the excessive condition currently :). That's why I mentioned to=
 treat normal and excessive conditions separately and don't influence the n=
ormal case as much as possible. Because we never know the consequence witho=
ut amount of testing work. :)

Yes, exactly. :-)

> Some of my stupid thinking :)

Well, you've obviously done a lot more looking recently than I have. :-)

I'm attaching a prototype minimum timeslice patch that I threw
together last week.  It currently hangs during boot, but it will give
you the idea of what I was thinking of.

Hui, can you let me know what you think of the idea, and if you find
it interesting, could you try to fix it up, and test it?  Testing it
with bigger values like 5ms would be really interesting.

 -George

>
> Best regards,
>
> Lv, Hui
>
>
> -----Original Message-----
> From: George Dunlap [mailto:george.dunlap@citrix.com]
> Sent: Saturday, October 29, 2011 12:19 AM
> To: Dario Faggioli
> Cc: Lv, Hui; George Dunlap; Duan, Jiangang; Tian, Kevin; xen-devel@lists.=
xensource.com; Keir (Xen.org); Dong, Eddie
> Subject: RE: [Xen-devel] [PATCH] scheduler rate controller
>
> On Fri, 2011-10-28 at 11:09 +0100, Dario Faggioli wrote:
>> Not sure yet, I can imagine it's tricky and I need to dig a bit more
>> in the code, but I'll let know if I found a way of doing that...
>
> There are lots of reasons why the SCHEDULE_SOFTIRQ gets raised. =A0But I =
think we want to focus on the scheduler itself raising it as a result of th=
e .wake() callback. =A0Whether the .wake() happens as a result of a HW inte=
rrupt or something else, I don't think really matters.
>
> Dario and Hui, =A0neither of you have commented on my idea, which is simp=
ly don't preempt a VM if it has run for less than some amount of time (say,=
 500us or 1ms). =A0If a higher-priority VM is woken up, see how long the cu=
rrent VM has run. =A0If it's less than 1ms, set a 1ms timer and call schedu=
le() then.
>
>> > > More generally speaking, I see how this feature can be useful, and
>> > > I also think it could live in the generic schedule.c code, but (as
>> > > George was saying) the algorithm by which rate-limiting is
>> > > happening needs to be well known, documented and exposed to the
>> > > user (more than by means of a couple of perf-counters).
>> > >
>> >
>> > One question is that, what is the right palace to document such inform=
ation? I'd like to make it as clear as possible to the users.
>> >
>> Well, don't know, maybe a WARN (a WARN_ONCE alike thing would probably
>> be better), or in general something that leave a footstep in the logs,
>> so that one can find out by means of `xl dmesg' or related. Obviously,
>> I'm not suggesting of printk-ing each suppressed schedule invocation,
>> or the overhead would get even worse... :-P
>>
>> I'm thinking of something that happens the very first time the
>> limiting fires, or maybe oncee some period/number of suppressions,
>> just to remind the user that he's getting weird behaviour because
>> _he_enabled_ rate-limiting. Hopefully, that might also be useful for
>> the user itself to fine tune the limiting parameters, although I think
>> the perf-counters are already quite well suited for this.
>
> As much as possible, we want the system to Just Work. =A0Under normal cir=
cumstances it wouldn't be too unusual for a VM to have a several-ms delay b=
etween receiving a physical interrupt and being scheduled; I think that if =
the 1ms delay works, having it on all the time would probably be the best s=
olution. =A0That's another reason I'm in favor of trying it -- it's simple =
and easy to understand, and doesn't require detecting when to "turn it on".
>
> =A0-George
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>
>

--14dae9340a25722bab04b0cd064c
Content-Type: text/x-diff; charset=US-ASCII; name="credit2-min-tslice.diff"
Content-Disposition: attachment; filename="credit2-min-tslice.diff"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_guj99nt40

ZGlmZiAtciAwNTI2NjQ0YWQyYTYgeGVuL2NvbW1vbi9zY2hlZF9jcmVkaXQuYwotLS0gYS94ZW4v
Y29tbW9uL3NjaGVkX2NyZWRpdC5jCVRodSBPY3QgMjcgMTY6MDc6MTggMjAxMSArMDEwMAorKysg
Yi94ZW4vY29tbW9uL3NjaGVkX2NyZWRpdC5jCVRodSBOb3YgMDMgMDM6Mjg6MjQgMjAxMSArMDAw
MApAQCAtMTA5LDYgKzEwOSwxMSBAQCBib29sZWFuX3BhcmFtKCJzY2hlZF9jcmVkaXRfZGVmYXVs
dF95aWVsCiBib29sZWFuX3BhcmFtKCJzY2hlZF9jcmVkaXRfZGVmYXVsdF95aWVsZCIsIHNjaGVk
X2NyZWRpdF9kZWZhdWx0X3lpZWxkKTsKIHN0YXRpYyBpbnQgX19yZWFkX21vc3RseSBzY2hlZF9j
cmVkaXRfdHNsaWNlX21zID0gQ1NDSEVEX0RFRkFVTFRfVFNMSUNFX01TOwogaW50ZWdlcl9wYXJh
bSgic2NoZWRfY3JlZGl0X3RzbGljZV9tcyIsIHNjaGVkX2NyZWRpdF90c2xpY2VfbXMpOworCisv
KgorICogU2NoZWR1bGVyIGdlbmVyaWMgcGFyYW1ldGVycworICovCitleHRlcm4gaW50IHNjaGVk
X3JhdGVsaW1pdF91czsKIAogLyoKICAqIFBoeXNpY2FsIENQVQpAQCAtMTI5Nyw5ICsxMzAyLDE0
IEBAIGNzY2hlZF9zY2hlZHVsZSgKICAgICBzdHJ1Y3QgY3NjaGVkX3ByaXZhdGUgKnBydiA9IENT
Q0hFRF9QUklWKG9wcyk7CiAgICAgc3RydWN0IGNzY2hlZF92Y3B1ICpzbmV4dDsKICAgICBzdHJ1
Y3QgdGFza19zbGljZSByZXQ7CisgICAgc190aW1lX3QgcnVudGltZSwgdHNsaWNlOwogCiAgICAg
Q1NDSEVEX1NUQVRfQ1JBTksoc2NoZWR1bGUpOwogICAgIENTQ0hFRF9WQ1BVX0NIRUNLKGN1cnJl
bnQpOworCisgICAgcnVudGltZSA9IG5vdyAtIGN1cnJlbnQtPnJ1bnN0YXRlLnN0YXRlX2VudHJ5
X3RpbWU7CisgICAgaWYgKCBydW50aW1lIDwgMCApIC8qIERvZXMgdGhpcyBldmVyIGhhcHBlbj8g
Ki8KKyAgICAgICAgcnVudGltZSA9IDA7CiAKICAgICBpZiAoICFpc19pZGxlX3ZjcHUoc2N1cnIt
PnZjcHUpICkKICAgICB7CkBAIC0xMzE0LDE0ICsxMzI0LDQ2IEBAIGNzY2hlZF9zY2hlZHVsZSgK
ICAgICB9CiAKICAgICAvKgotICAgICAqIFNlbGVjdCBuZXh0IHJ1bm5hYmxlIGxvY2FsIFZDUFUg
KGllIHRvcCBvZiBsb2NhbCBydW5xKQorICAgICAqIENob2ljZXMsIGNob2ljZXM6CisgICAgICog
LSBJZiB3ZSBoYXZlIGEgdGFza2xldCwgd2UgbmVlZCB0byBydW4gdGhlIGlkbGUgdmNwdSBubyBt
YXR0ZXIgd2hhdC4KKyAgICAgKiAtIElmIHNjaGVkIHJhdGUgbGltaXRpbmcgaXMgaW4gZWZmZWN0
LCBhbmQgdGhlIGN1cnJlbnQgdmNwdSBoYXMKKyAgICAgKiAgIHJ1biBmb3IgbGVzcyB0aGFuIHRo
YXQgYW1vdW50IG9mIHRpbWUsIGNvbnRpbnVlIHRoZSBjdXJyZW50IG9uZSwKKyAgICAgKiAgIGJ1
dCB3aXRoIGEgc2hvcnRlciB0aW1lc2xpY2UuCisgICAgICogLSBPdGhlcndpc2UsIGNob3NlIHRo
ZSBvbmUgd2l0aCB0aGUgaGlnaGVzdCBwcmlvcml0eSAod2hpY2ggbWF5CisgICAgICogICBiZSB0
aGUgb25lIGN1cnJlbnRseSBydW5uaW5nKQorICAgICAqIC0gSWYgdGhlIGN1cnJlbnRseSBydW5u
aW5nIG9uZSBpcyBUU19PVkVSLCBzZWUgaWYgdGhlcmUKKyAgICAgKiAgIGlzIGEgaGlnaGVyIHBy
aW9yaXR5IG9uZSB3YWl0aW5nIG9uIHRoZSBydW5xdWV1ZSBvZiBhbm90aGVyCisgICAgICogICBj
cHUgYW5kIHN0ZWFsIGl0LgorICAgICAqCisgICAgICogQ3VycmVudCBpbnZhcmlhbnQgaXMgdGhh
dCB3ZSBhbHdheXMgcHV0IHRoZSBjdXJyZW50bHkgcnVubmluZyB2Y3B1CisgICAgICogb24gdGhl
IHJ1bnF1ZXVlLCBiZWNhdXNlIHdlIGFsd2F5cyB0YWtlIGhpbSBvZmYgYWdhaW4gYmVsb3cuCiAg
ICAgICovCisKICAgICBpZiAoIHZjcHVfcnVubmFibGUoY3VycmVudCkgKQogICAgICAgICBfX3J1
bnFfaW5zZXJ0KGNwdSwgc2N1cnIpOwogICAgIGVsc2UKICAgICAgICAgQlVHX09OKCBpc19pZGxl
X3ZjcHUoY3VycmVudCkgfHwgbGlzdF9lbXB0eShydW5xKSApOwogCi0gICAgc25leHQgPSBfX3J1
bnFfZWxlbShydW5xLT5uZXh0KTsKKyAgICAvKiBJZiB3ZSBoYXZlIHNjaGVkdWxlIHJhdGUgbGlt
aXRpbmcgZW5hYmxlZCwgY2hlY2sgdG8gc2VlCisgICAgICogaG93IGxvbmcgd2UndmUgcnVuIGZv
ci4gKi8KKyAgICBpZiAoIHNjaGVkX3JhdGVsaW1pdF91cworICAgICAgICAgJiYgdmNwdV9ydW5u
YWJsZShjdXJyZW50KQorICAgICAgICAgJiYgIWlzX2lkbGVfdmNwdShjdXJyZW50KQorICAgICAg
ICAgJiYgcnVudGltZSA8IE1JQ1JPU0VDUyhzY2hlZF9yYXRlbGltaXRfdXMpICkKKyAgICB7Cisg
ICAgICAgIHNuZXh0ID0gc2N1cnI7CisgICAgICAgIC8qIEZJWE1FOiBVc2UgcHJ2LT50c2xpY2Vf
bXMgaWYgd2UncmUgYWxzbyB0aGUgaGVhZCBvZiBodGUgcXVldWUgKi8KKyAgICAgICAgdHNsaWNl
ID0gTUlDUk9TRUNTKHNjaGVkX3JhdGVsaW1pdF91cyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7
CisgICAgICAgIC8qCisgICAgICAgICAqIFNlbGVjdCBuZXh0IHJ1bm5hYmxlIGxvY2FsIFZDUFUg
KGllIHRvcCBvZiBsb2NhbCBydW5xKQorICAgICAgICAgKi8KKyAgICAgICAgc25leHQgPSBfX3J1
bnFfZWxlbShydW5xLT5uZXh0KTsKKyAgICAgICAgdHNsaWNlID0gTUlMTElTRUNTKHBydi0+dHNs
aWNlX21zKSk7CisgICAgfQorCiAgICAgcmV0Lm1pZ3JhdGVkID0gMDsKIAogICAgIC8qIFRhc2ts
ZXQgd29yayAod2hpY2ggcnVucyBpbiBpZGxlIFZDUFUgY29udGV4dCkgb3ZlcnJpZGVzIGFsbCBl
bHNlLiAqLwpAQCAtMTM3MSw3ICsxNDEzLDcgQEAgY3NjaGVkX3NjaGVkdWxlKAogICAgICAqIFJl
dHVybiB0YXNrIHRvIHJ1biBuZXh0Li4uCiAgICAgICovCiAgICAgcmV0LnRpbWUgPSAoaXNfaWRs
ZV92Y3B1KHNuZXh0LT52Y3B1KSA/Ci0gICAgICAgICAgICAgICAgLTEgOiBNSUxMSVNFQ1MocHJ2
LT50c2xpY2VfbXMpKTsKKyAgICAgICAgICAgICAgICAtMSA6IHRzbGljZTsKICAgICByZXQudGFz
ayA9IHNuZXh0LT52Y3B1OwogCiAgICAgQ1NDSEVEX1ZDUFVfQ0hFQ0socmV0LnRhc2spOwpkaWZm
IC1yIDA1MjY2NDRhZDJhNiB4ZW4vY29tbW9uL3NjaGVkdWxlLmMKLS0tIGEveGVuL2NvbW1vbi9z
Y2hlZHVsZS5jCVRodSBPY3QgMjcgMTY6MDc6MTggMjAxMSArMDEwMAorKysgYi94ZW4vY29tbW9u
L3NjaGVkdWxlLmMJVGh1IE5vdiAwMyAwMzoyODoyNCAyMDExICswMDAwCkBAIC00Niw2ICs0Niw5
IEBAIHN0cmluZ19wYXJhbSgic2NoZWQiLCBvcHRfc2NoZWQpOwogICovCiBib29sX3Qgc2NoZWRf
c210X3Bvd2VyX3NhdmluZ3MgPSAwOwogYm9vbGVhbl9wYXJhbSgic2NoZWRfc210X3Bvd2VyX3Nh
dmluZ3MiLCBzY2hlZF9zbXRfcG93ZXJfc2F2aW5ncyk7CisvKiBEZWZhdWx0IHNjaGVkdWxpbmcg
cmF0ZSBsaW1pdDogMW1zICovCitpbnQgc2NoZWRfcmF0ZWxpbWl0X3VzID0gMTAwMDsKK2ludGVn
ZXJfcGFyYW0oInNjaGVkX3JhdGVsaW1pdF91cyIsIHNjaGVkX3JhdGVsaW1pdF91cyk7CiAKIC8q
IFZhcmlvdXMgdGltZXIgaGFuZGxlcnMuICovCiBzdGF0aWMgdm9pZCBzX3RpbWVyX2ZuKHZvaWQg
KnVudXNlZCk7Cg==
--14dae9340a25722bab04b0cd064c
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--14dae9340a25722bab04b0cd064c--


From xen-devel-bounces@lists.xensource.com Wed Nov 02 21:35:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 21:35:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLp1n-0006gZ-B9; Wed, 02 Nov 2011 21:35:47 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLp0j-0006Tu-Cq
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 21:34:41 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1320294878!105282!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 392 invoked from network); 3 Nov 2011 04:34:38 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 04:34:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,447,1315180800"; 
   d="scan'208";a="8730447"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	03 Nov 2011 04:34:37 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 3 Nov 2011 04:34:37 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RLp0f-0001L1-Ap;
	Thu, 03 Nov 2011 04:34:37 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RLp0e-0003NW-VN;
	Thu, 03 Nov 2011 04:34:37 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9661-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 3 Nov 2011 04:34:37 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9661: tolerable FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9661 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9661/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf      5 xen-boot                     fail pass in 9659

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-sedf 14 guest-localmigrate/x10 fail in 9659 blocked in 9661

version targeted for testing:
 xen                  54a5e994a241
baseline version:
 xen                  54a5e994a241

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Published tested tree is already up to date.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 02 23:46:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 02 Nov 2011 23:46:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLr4V-0002J2-9C; Wed, 02 Nov 2011 23:46:43 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLr3i-00022Q-4s; Wed, 02 Nov 2011 23:45:54 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1320302750!1775677!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3966 invoked from network); 3 Nov 2011 06:45:51 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 06:45:51 -0000
X-IronPort-AV: E=Sophos;i="4.69,448,1315180800"; 
   d="scan'208";a="8731349"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	03 Nov 2011 06:45:50 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 3 Nov 2011 06:45:50 +0000
Date: Thu, 3 Nov 2011 06:46:16 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] Problems with 'xl create winxp' (hvm) on xen 4.1.2
	(also affects GPLPV)
In-Reply-To: <1320058232.23193.59.camel@zakaz.uk.xensource.com>
Message-ID: <alpine.DEB.2.00.1111030645070.3519@kaball-desktop>
References: <1758215.SCbitK4oVy@dell4550>
	<1320058232.23193.59.camel@zakaz.uk.xensource.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	jim burns <jim_burn@bellsouth.net>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, 31 Oct 2011, Ian Campbell wrote:
> > 3) Specifying vncviewer=1/vncconsole=1 in your config (don't remember which 
> > works - I use both) will automatically start a vnc viewer for you when you 'xm 
> > create' an hvm domain. (Sadly, this never worked for a pv domain. You have to 
> > use the xm/xl vncviewer domainname command.) This does not work with 'xl 
> > create'.
> 
> I think this is just a missing feature.
> 

Nope, it should work. IanJ implemented this feature a while back.
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-users-bounces@lists.xensource.com Thu Nov 03 01:41:03 2011
Return-path: <xen-users-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 01:41:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLsr9-0007Ki-IR; Thu, 03 Nov 2011 01:41:03 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLsq2-0006ze-GS; Thu, 03 Nov 2011 01:39:54 -0700
X-Env-Sender: fbcyborg@gmail.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1320309590!2122121!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10629 invoked from network); 3 Nov 2011 08:39:51 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 08:39:51 -0000
Received: by vcbfk14 with SMTP id fk14so217245vcb.30
	for <multiple recipients>; Thu, 03 Nov 2011 01:39:50 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:from:date:message-id:subject:to
	:cc:content-type;
	bh=FjhgXXTbkIaAQBAZvTW/P9u6kjg6oQ/A3EZ2mM2SSuw=;
	b=B+BCWeQtME+Of/XK9Hmnu2acjKkLiw1tAy5L1U5dws2qx+FBDHGolwiZJSwwWquJx5
	XUNYja+J1wEW2JRKNg7mZZsLr1JJhks+ajbLynYBl7hD3TJthIyHr+4cw3iYoCU3r3kj
	KI+qrh2F1CJr2qyZ4WqiWhg1XLu1cVFfqqJI8=
Received: by 10.52.33.50 with SMTP id o18mr8528831vdi.42.1320309590086; Thu,
	03 Nov 2011 01:39:50 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.52.185.231 with HTTP; Thu, 3 Nov 2011 01:39:29 -0700 (PDT)
In-Reply-To: <alpine.DEB.2.00.1111030645070.3519@kaball-desktop>
References: <1758215.SCbitK4oVy@dell4550>
	<1320058232.23193.59.camel@zakaz.uk.xensource.com>
	<alpine.DEB.2.00.1111030645070.3519@kaball-desktop>
From: Flavio <fbcyborg@gmail.com>
Date: Thu, 3 Nov 2011 09:39:29 +0100
Message-ID: <CAP8Jb=paAsq754ermXsjytD3a3mgwELwtDdHNAoq7su8GLO_qg@mail.gmail.com>
Subject: Re: [Xen-users] Re: [Xen-devel] Problems with 'xl create winxp' (hvm)
	on xen 4.1.2 (also affects GPLPV)
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Content-Type: text/plain; charset=ISO-8859-1
Cc: jim burns <jim_burn@bellsouth.net>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>
X-BeenThere: xen-users@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen user discussion <xen-users.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-users>,
	<mailto:xen-users-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-users@lists.xensource.com>
List-Help: <mailto:xen-users-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-users>,
	<mailto:xen-users-request@lists.xensource.com?subject=subscribe>
Sender: xen-users-bounces@lists.xensource.com
Errors-To: xen-users-bounces@lists.xensource.com

On 3 November 2011 07:46, Stefano Stabellini
<stefano.stabellini@eu.citrix.com> wrote:
> On Mon, 31 Oct 2011, Ian Campbell wrote:
>> > 3) Specifying vncviewer=1/vncconsole=1 in your config (don't remember which
>> > works - I use both) will automatically start a vnc viewer for you when you 'xm
>> > create' an hvm domain. (Sadly, this never worked for a pv domain. You have to
>> > use the xm/xl vncviewer domainname command.) This does not work with 'xl
>> > create'.
>>
>> I think this is just a missing feature.
>>
>
> Nope, it should work. IanJ implemented this feature a while back.
I doesn't work to me using xl. I am obliged to do xl vncviewer <domain_id>
once the domU has started.
-- 
Flavio

_______________________________________________
Xen-users mailing list
Xen-users@lists.xensource.com
http://lists.xensource.com/xen-users

From xen-devel-bounces@lists.xensource.com Thu Nov 03 02:25:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 02:25:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLtXm-00009x-DP; Thu, 03 Nov 2011 02:25:07 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLtWg-0008OK-S5
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 02:23:59 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1320312230!128568!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31179 invoked from network); 3 Nov 2011 09:23:50 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-2.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	3 Nov 2011 09:23:50 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 03 Nov 2011 09:23:49 +0000
Message-Id: <4EB26BB1020000780005EA78@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 03 Nov 2011 09:23:45 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Haitao Shan" <maillists.shan@gmail.com>,
	"Haitao Shan" <haitao.shan@intel.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Keir Fraser <keir@xen.org>, Jun Nakajima <jun.nakajima@intel.com>,
	Donald D Dugger <donald.d.dugger@intel.com>
Subject: [Xen-devel] Ping#2: [PATCH] VMX: extend last branch MSR info to
	cover newer CPU models
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

VMX: extend last branch MSR info to cover newer CPU models #2

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -1738,10 +1738,9 @@ static const struct lbr_info *last_branc
         case 23:
             return c2_lbr;
             break;
-        /* Nehalem */
-        case 26: case 30: case 31: case 46:
-        /* Sandy Bridge */
-        case 42: case 45:
+        /* Nehalem/Sandy Bridge */
+        case 26: case 30: case 31: case 37:
+        case 42: case 44: case 45: case 46: case 47:
             return nh_lbr;
             break;
         /* Atom */




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 02:27:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 02:27:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLtaO-0000ZE-NZ; Thu, 03 Nov 2011 02:27:48 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLtZv-0000N3-2t
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 02:27:19 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1320312435!127862!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26253 invoked from network); 3 Nov 2011 09:27:16 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-7.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	3 Nov 2011 09:27:16 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 03 Nov 2011 09:27:15 +0000
Message-Id: <4EB26C80020000780005EA7F@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 03 Nov 2011 09:27:12 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: <mark.langsdorf@amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Ping: [PATCH] powernow: don't read never initialized
	structure member
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

c/s 20361:51b031b0737e removed the writing of struct
processor_performance's shared_cpu_map member, but the powernow driver
still has code to read it (though presumably that code path can't be
taken on actual hardware supported by the powernow driver). Remove the
use of the field along with the field itself.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/acpi/cpufreq/powernow.c
+++ b/xen/arch/x86/acpi/cpufreq/powernow.c
@@ -200,16 +200,13 @@ static int powernow_cpufreq_cpu_init(str
     perf =3D data->acpi_data;
     policy->shared_type =3D perf->shared_type;
=20
-    /*
-     * Will let policy->cpus know about dependency only when software
-     * coordination is required.
-     */
     if (policy->shared_type =3D=3D CPUFREQ_SHARED_TYPE_ALL ||
         policy->shared_type =3D=3D CPUFREQ_SHARED_TYPE_ANY) {
-        policy->cpus =3D perf->shared_cpu_map;
-    } else {
-        policy->cpus =3D cpumask_of_cpu(cpu);   =20
+        printk("Unsupported sharing type\n");
+        result =3D -ENODEV;
+        goto err_unreg;
     }
+    cpumask_copy(&policy->cpus, cpumask_of(cpu));
=20
     /* capability check */
     if (perf->state_count <=3D 1) {
--- a/xen/include/acpi/cpufreq/processor_perf.h
+++ b/xen/include/acpi/cpufreq/processor_perf.h
@@ -29,7 +29,6 @@ struct processor_performance {
     uint32_t state_count;
     struct xen_processor_px *states;
     struct xen_psd_package domain_info;
-    cpumask_t shared_cpu_map;
     uint32_t shared_type;
=20
     uint32_t init;




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 02:44:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 02:44:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLtqu-0001FM-C8; Thu, 03 Nov 2011 02:44:52 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLtqB-00013G-6g
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 02:44:07 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1320313444!2136833!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9306 invoked from network); 3 Nov 2011 09:44:04 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-12.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 09:44:04 -0000
Received: by wwf4 with SMTP id 4so1270020wwf.24
	for <xen-devel@lists.xensource.com>;
	Thu, 03 Nov 2011 02:44:03 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:content-type:mime-version:content-transfer-encoding:subject
	:message-id:user-agent:date:from:to;
	bh=YXVTj8Qz7C/Hp9ctbNocffw2yNJWG+JuZq8lNvCquGc=;
	b=D5XQjOkR/WEPO5DKEV4RfhFtjTDseGy0OIyKOI4i2bbJ7OUjWfxz+WG+y2utGP6VFa
	HL9mrzv8jtJobOt9R7KAqqO+o905ZyonO61jWMqfzAtU5eoma6U2+OuKZGmnCkjCOQeb
	B3BKXyzS8Iw5ya00NzPs/E+d5UoK30EZeex9Q=
Received: by 10.227.60.143 with SMTP id p15mr10792260wbh.28.1320313443861;
	Thu, 03 Nov 2011 02:44:03 -0700 (PDT)
Received: from loki.upc.es (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id fy13sm9084361wbb.18.2011.11.03.02.44.01
	(version=TLSv1/SSLv3 cipher=OTHER);
	Thu, 03 Nov 2011 02:44:02 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1320313292@loki.upc.es>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Thu, 03 Nov 2011 10:41:32 +0100
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 0 of 2 RESEND] tools: add two new compile flags
 and perform checks on user defined folders.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Added two new sets of compile flags, and pass them to the check scripts, so libraries and includes are searched there also.  

Resend this patches because they suffered some modifications and where scattered along the mailing list.

Please review, thanks Roger.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 02:46:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 02:46:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLts2-0001cy-Nl; Thu, 03 Nov 2011 02:46:02 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLtqD-00013I-DV
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 02:44:10 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1320313446!2132408!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22881 invoked from network); 3 Nov 2011 09:44:06 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 09:44:06 -0000
Received: by wyh11 with SMTP id 11so1344872wyh.30
	for <xen-devel@lists.xensource.com>;
	Thu, 03 Nov 2011 02:44:06 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:content-type:mime-version:content-transfer-encoding:subject
	:x-mercurial-node:message-id:in-reply-to:references:user-agent:date
	:from:to; bh=JGEpWV6xXTdL/l4vx7VDseBbmBb6fgssX7E/grQAJg0=;
	b=gGDtzkUXWYSxBR8bQggzyTCRzTDnhpHujvIdf/N/pjHSjibCCquhj106cUyYysLDo8
	qr7IS2Ulsls9HtV7aPtF+e8IxplajcIlPjpgFn/gTTOUaGFRNqVxISAuCtpZuLD5GyNa
	7AlPdAo0W281cs9WQZbFvbc0x1F8l4S+N+pXs=
Received: by 10.227.202.149 with SMTP id fe21mr10868132wbb.15.1320313446067;
	Thu, 03 Nov 2011 02:44:06 -0700 (PDT)
Received: from loki.upc.es (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id fy13sm9084361wbb.18.2011.11.03.02.44.03
	(version=TLSv1/SSLv3 cipher=OTHER);
	Thu, 03 Nov 2011 02:44:04 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 38cd302b40b49194b6addf871383b17661563ab3
Message-Id: <38cd302b40b49194b6ad.1320313293@loki.upc.es>
In-Reply-To: <patchbomb.1320313292@loki.upc.es>
References: <patchbomb.1320313292@loki.upc.es>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Thu, 03 Nov 2011 10:41:33 +0100
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 1 of 2 RESEND] tools/check: check for headers
 and libraries in user defined folders
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Roger Pau Monne <roger.pau@entel.upc.edu>
# Date 1320310734 -3600
# Node ID 38cd302b40b49194b6addf871383b17661563ab3
# Parent  29f463265cd30f16d0c6049ba6da78363fd5e5be
tools/check: check for headers and libraries in user defined folders.

Parse EXTRA_INCLUDES, EXTRA_LIB, PREPEND_INCLUDES, PREPEND_LIB, APPEND_INCLUDES, APPEND_LIB during checks, to search for required files.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 29f463265cd3 -r 38cd302b40b4 Config.mk
--- a/Config.mk	Thu Nov 03 09:58:54 2011 +0100
+++ b/Config.mk	Thu Nov 03 09:58:54 2011 +0100
@@ -176,6 +176,9 @@ CFLAGS += $(foreach i, $(PREPEND_INCLUDE
 APPEND_LDFLAGS += $(foreach i, $(APPEND_LIB), -L$(i))
 APPEND_CFLAGS += $(foreach i, $(APPEND_INCLUDES), -I$(i))
 
+CHECK_LIB = $(EXTRA_LIB) $(PREPEND_LIB) $(APPEND_LIB)
+CHECK_INCLUDES = $(EXTRA_INCLUDES) $(PREPEND_INCLUDES) $(APPEND_INCLUDES)
+
 EMBEDDED_EXTRA_CFLAGS := -nopie -fno-stack-protector -fno-stack-protector-all
 EMBEDDED_EXTRA_CFLAGS += -fno-exceptions
 
diff -r 29f463265cd3 -r 38cd302b40b4 tools/check/Makefile
--- a/tools/check/Makefile	Thu Nov 03 09:58:54 2011 +0100
+++ b/tools/check/Makefile	Thu Nov 03 09:58:54 2011 +0100
@@ -1,18 +1,24 @@
 XEN_ROOT = $(CURDIR)/../..
 include $(XEN_ROOT)/tools/Rules.mk
 
+# Export the necessary environment variables for the tests
+export PYTHON
+export LIBXENAPI_BINDINGS
+export CHECK_INCLUDES
+export CHECK_LIB
+
 .PHONY: all install
 all install: check-build
 
 # Check this machine is OK for building on.
 .PHONY: check-build
 check-build:
-	PYTHON=$(PYTHON) LIBXENAPI_BINDINGS=$(LIBXENAPI_BINDINGS) ./chk build
+	./chk build
 
 # Check this machine is OK for installing on.
 .PHONY: check-install
 check-install:
-	PYTHON=$(PYTHON) LIBXENAPI_BINDINGS=$(LIBXENAPI_BINDINGS) ./chk install
+	./chk install
 
 .PHONY: clean
 clean:
diff -r 29f463265cd3 -r 38cd302b40b4 tools/check/funcs.sh
--- a/tools/check/funcs.sh	Thu Nov 03 09:58:54 2011 +0100
+++ b/tools/check/funcs.sh	Thu Nov 03 09:58:54 2011 +0100
@@ -25,15 +25,23 @@ has_or_fail() {
 }
 
 has_header() {
+	check_sys_root || return 1
+
 	case $1 in
 		/*) ;;
-		*) set -- "/usr/include/$1" ;;
+		*)
+		if [ -r "$CROSS_SYS_ROOT/usr/include/$1" ]; then
+			return 0
+		fi
+		for path in ${CHECK_INCLUDES}; do
+			if [ -r "$CROSS_SYS_ROOT${path}/$1" ]; then
+				return 0
+			fi
+		done
+		;;
 	esac
 
-	check_sys_root || return 1
-
-	test -r "$CROSS_SYS_ROOT$1"
-	return $?
+	return 1
 }
 
 has_lib() {
@@ -42,6 +50,7 @@ has_lib() {
 	# subshell to prevent pollution of caller's environment
 	(
 	PATH=/sbin:$PATH        # for ldconfig
+	LIBRARIES="$CHECK_LIB /usr/lib"
 
 	# This relatively common in a sys-root; libs are installed but
 	# ldconfig hasn't run there, so ldconfig -p won't work.
@@ -49,8 +58,15 @@ has_lib() {
 	    echo "Please run ldconfig -r \"$CROSS_SYS_ROOT\" to generate ld.so.cache"
 	    # fall through; ldconfig test below should fail
 	fi
-	ldconfig -p ${CROSS_SYS_ROOT+-r "$CROSS_SYS_ROOT"} | grep -Fq "$1"
-	return $?
+	if [ "${OS}" = "Linux" ]; then
+		ldconfig -p ${CROSS_SYS_ROOT+-r "$CROSS_SYS_ROOT"} | grep -Fq "$1"
+		return $?
+	fi
+	if [ "${OS}" = "NetBSD" ]; then
+		ls -1 ${LIBRARIES} | grep -Fq "$1"
+		return $?
+	fi
+	return 1
 	)
 }
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 02:47:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 02:47:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLtt2-00020K-9Z; Thu, 03 Nov 2011 02:47:04 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLtqF-00013Q-GB
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 02:44:13 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1320313446!2132408!2
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23029 invoked from network); 3 Nov 2011 09:44:08 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 09:44:08 -0000
Received: by mail-wy0-f171.google.com with SMTP id 11so1344872wyh.30
	for <xen-devel@lists.xensource.com>;
	Thu, 03 Nov 2011 02:44:08 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:content-type:mime-version:content-transfer-encoding:subject
	:x-mercurial-node:message-id:in-reply-to:references:user-agent:date
	:from:to; bh=UIQjd8BzkL3/HaSURP9m6xZU5l1dlWc2KG6eFTiP9Fc=;
	b=BlmgGLLZWxQ+sqQpx88CB4hMSqTIEcvVyjVPoricGIz18/HjXRe1UHWTX9Vd031n+G
	FbLXAq/WyGhYVDr4hvfatFOer4GaYqjdQ/OaGzbrzixsbLYPDE5H0i5k6YAzsoAKlZFU
	45OCZ3mTwvUnb9FatEf7ktGuM7N65njakj7xo=
Received: by 10.227.208.81 with SMTP id gb17mr10646807wbb.24.1320313448263;
	Thu, 03 Nov 2011 02:44:08 -0700 (PDT)
Received: from loki.upc.es (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id fy13sm9084361wbb.18.2011.11.03.02.44.06
	(version=TLSv1/SSLv3 cipher=OTHER);
	Thu, 03 Nov 2011 02:44:07 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 29f463265cd30f16d0c6049ba6da78363fd5e5be
Message-Id: <29f463265cd30f16d0c6.1320313294@loki.upc.es>
In-Reply-To: <patchbomb.1320313292@loki.upc.es>
References: <patchbomb.1320313292@loki.upc.es>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Thu, 03 Nov 2011 10:41:34 +0100
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 2 of 2 RESEND] tools/build: create two new
 variables called APPEND_
 and PREPEND_ to add compile flags at the beginning or at the end of the
 search path
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Roger Pau Monne <roger.pau@entel.upc.edu>
# Date 1320310734 -3600
# Node ID 29f463265cd30f16d0c6049ba6da78363fd5e5be
# Parent  9b236beffcb30ea7c544c9727a2c82b7ff6c3d05
tools/build: create two new variables called APPEND_ and PREPEND_ to add compile flags at the beginning or at the end of the search path.

Added a new semantic for user defined compile flags, here is the list of possible options:

PREPEND_LIB: add libraries to the search path before xen (before xen installation folders).
PREPEND_INCLUDES: add headers to the search path before xen (before xen installation folders).
APPEND_LIB: add libraries to the search path at the end (after all xen installation folders have been added).
APPEND_INCLUDES: add libraries to the search path at the end (after all xen installation folders have been added).

EXTRA_INCLUDES and EXTRA_LIB can still be used, and they will have the same effect as PREPEND_INCLUDES and PREPEND_LIB.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 9b236beffcb3 -r 29f463265cd3 Config.mk
--- a/Config.mk	Fri Sep 30 14:38:55 2011 +0200
+++ b/Config.mk	Thu Nov 03 09:58:54 2011 +0100
@@ -171,6 +171,10 @@ CFLAGS-$(clang) += -Wno-parentheses -Wno
 
 LDFLAGS += $(foreach i, $(EXTRA_LIB), -L$(i)) 
 CFLAGS += $(foreach i, $(EXTRA_INCLUDES), -I$(i))
+LDFLAGS += $(foreach i, $(PREPEND_LIB), -L$(i))
+CFLAGS += $(foreach i, $(PREPEND_INCLUDES), -I$(i))
+APPEND_LDFLAGS += $(foreach i, $(APPEND_LIB), -L$(i))
+APPEND_CFLAGS += $(foreach i, $(APPEND_INCLUDES), -I$(i))
 
 EMBEDDED_EXTRA_CFLAGS := -nopie -fno-stack-protector -fno-stack-protector-all
 EMBEDDED_EXTRA_CFLAGS += -fno-exceptions
diff -r 9b236beffcb3 -r 29f463265cd3 tools/Rules.mk
--- a/tools/Rules.mk	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/Rules.mk	Thu Nov 03 09:58:54 2011 +0100
@@ -86,18 +86,18 @@ INSTALL_PYTHON_PROG = \
 	$(XEN_ROOT)/tools/python/install-wrap "$(PYTHON_PATH)" $(INSTALL_PROG)
 
 %.opic: %.c
-	$(CC) $(CPPFLAGS) -DPIC $(CFLAGS) $(CFLAGS_$*.opic) -fPIC -c -o $@ $<
+	$(CC) $(CPPFLAGS) -DPIC $(CFLAGS) $(CFLAGS_$*.opic) -fPIC -c -o $@ $< $(APPEND_CFLAGS)
 
 %.o: %.c
-	$(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_$*.o) -c -o $@ $<
+	$(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_$*.o) -c -o $@ $< $(APPEND_CFLAGS)
 
 %.o: %.cc
-	$(CC) $(CPPFLAGS) $(CXXFLAGS) $(CXXFLAGS_$*.o) -c -o $@ $<
+	$(CC) $(CPPFLAGS) $(CXXFLAGS) $(CXXFLAGS_$*.o) -c -o $@ $< $(APPEND_CFLAGS)
 
 %.o: %.S
-	$(CC) $(CFLAGS) $(CFLAGS_$*.o) -c $< -o $@
+	$(CC) $(CFLAGS) $(CFLAGS_$*.o) -c $< -o $@ $(APPEND_CFLAGS)
 %.opic: %.S
-	$(CC) $(CPPFLAGS) -DPIC $(CFLAGS) $(CFLAGS.opic) -fPIC -c -o $@ $<
+	$(CC) $(CPPFLAGS) -DPIC $(CFLAGS) $(CFLAGS.opic) -fPIC -c -o $@ $< $(APPEND_CFLAGS)
 
 subdirs-all subdirs-clean subdirs-install subdirs-distclean: .phony
 	@set -e; for subdir in $(SUBDIRS) $(SUBDIRS-y); do \
diff -r 9b236beffcb3 -r 29f463265cd3 tools/console/Makefile
--- a/tools/console/Makefile	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/console/Makefile	Thu Nov 03 09:58:54 2011 +0100
@@ -23,10 +23,10 @@ clean:
 	$(RM) client/*.o daemon/*.o
 
 xenconsoled: $(patsubst %.c,%.o,$(wildcard daemon/*.c))
-	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS) $(LDLIBS_xenconsoled)
+	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS) $(LDLIBS_xenconsoled) $(APPEND_LDFLAGS)
 
 xenconsole: $(patsubst %.c,%.o,$(wildcard client/*.c))
-	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS) $(LDLIBS_xenconsole)
+	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS) $(LDLIBS_xenconsole) $(APPEND_LDFLAGS)
 
 .PHONY: install
 install: $(BIN)
diff -r 9b236beffcb3 -r 29f463265cd3 tools/libfsimage/Rules.mk
--- a/tools/libfsimage/Rules.mk	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/libfsimage/Rules.mk	Thu Nov 03 09:58:54 2011 +0100
@@ -24,7 +24,7 @@ fs-install: fs-all
 	$(INSTALL_PROG) $(FSLIB) $(DESTDIR)$(FSDIR)
 
 $(FSLIB): $(PIC_OBJS)
-	$(CC) $(LDFLAGS) $(SHLIB_LDFLAGS) -o $@ $^ -lfsimage $(FS_LIBDEPS)
+	$(CC) $(LDFLAGS) $(SHLIB_LDFLAGS) -o $@ $^ -lfsimage $(FS_LIBDEPS) $(APPEND_LDFLAGS)
 
 clean distclean:
 	rm -f $(PIC_OBJS) $(FSLIB) $(DEPS)
diff -r 9b236beffcb3 -r 29f463265cd3 tools/libvchan/Makefile
--- a/tools/libvchan/Makefile	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/libvchan/Makefile	Thu Nov 03 09:58:54 2011 +0100
@@ -29,16 +29,16 @@ libxenvchan.so.$(MAJOR): libxenvchan.so.
 	ln -sf $< $@
 
 libxenvchan.so.$(MAJOR).$(MINOR): $(LIBVCHAN_PIC_OBJS)
-	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenvchan.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LIBVCHAN_LIBS)
+	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenvchan.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LIBVCHAN_LIBS) $(APPEND_LDFLAGS)
 
 libxenvchan.a: $(LIBVCHAN_OBJS)
 	$(AR) rcs libxenvchan.a $^
 
 vchan-node1: $(NODE_OBJS) libxenvchan.so
-	$(CC) $(LDFLAGS) -o $@ $(NODE_OBJS) $(LDLIBS_libxenvchan)
+	$(CC) $(LDFLAGS) -o $@ $(NODE_OBJS) $(LDLIBS_libxenvchan) $(APPEND_LDFLAGS)
 
 vchan-node2: $(NODE2_OBJS) libxenvchan.so
-	$(CC) $(LDFLAGS) -o $@ $(NODE2_OBJS) $(LDLIBS_libxenvchan)
+	$(CC) $(LDFLAGS) -o $@ $(NODE2_OBJS) $(LDLIBS_libxenvchan) $(APPEND_LDFLAGS)
 
 .PHONY: install
 install: all
diff -r 9b236beffcb3 -r 29f463265cd3 tools/libxc/Makefile
--- a/tools/libxc/Makefile	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/libxc/Makefile	Thu Nov 03 09:58:54 2011 +0100
@@ -156,7 +156,7 @@ libxenctrl.so.$(MAJOR): libxenctrl.so.$(
 	ln -sf $< $@
 
 libxenctrl.so.$(MAJOR).$(MINOR): $(CTRL_PIC_OBJS)
-	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(DLOPEN_LIBS) $(PTHREAD_LIBS)
+	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(DLOPEN_LIBS) $(PTHREAD_LIBS) $(APPEND_LDFLAGS)
 
 # libxenguest
 
@@ -192,10 +192,10 @@ xc_dom_bzimageloader.opic: CFLAGS += $(c
 
 libxenguest.so.$(MAJOR).$(MINOR): COMPRESSION_LIBS = $(call zlib-options,l)
 libxenguest.so.$(MAJOR).$(MINOR): $(GUEST_PIC_OBJS) libxenctrl.so
-	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenguest.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $(GUEST_PIC_OBJS) $(COMPRESSION_LIBS) -lz $(LDLIBS_libxenctrl) $(PTHREAD_LIBS)
+	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenguest.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $(GUEST_PIC_OBJS) $(COMPRESSION_LIBS) -lz $(LDLIBS_libxenctrl) $(PTHREAD_LIBS) $(APPEND_LDFLAGS)
 
 xenctrl_osdep_ENOSYS.so: $(OSDEP_PIC_OBJS) libxenctrl.so
-	$(CC) -g $(LDFLAGS) $(SHLIB_LDFLAGS) -o $@ $(OSDEP_PIC_OBJS) $(LDLIBS_libxenctrl)
+	$(CC) -g $(LDFLAGS) $(SHLIB_LDFLAGS) -o $@ $(OSDEP_PIC_OBJS) $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
 
 -include $(DEPS)
 
diff -r 9b236beffcb3 -r 29f463265cd3 tools/libxen/Makefile
--- a/tools/libxen/Makefile	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/libxen/Makefile	Thu Nov 03 09:58:54 2011 +0100
@@ -44,13 +44,13 @@ libxenapi.so.$(MAJOR): libxenapi.so.$(MA
 	ln -sf $< $@
 
 libxenapi.so.$(MAJOR).$(MINOR): $(LIBXENAPI_OBJS)
-	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenapi.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^
+	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenapi.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(APPEND_LDFLAGS)
 
 libxenapi.a: $(LIBXENAPI_OBJS)
 	$(AR) rcs libxenapi.a $^
 
 $(TEST_PROGRAMS): test/%: test/%.o libxenapi.so
-	$(CC) $(LDFLAGS) -o $@ $< -L . -lxenapi
+	$(CC) $(LDFLAGS) -o $@ $< -L . -lxenapi $(APPEND_LDFLAGS)
 
 
 .PHONY: install
diff -r 9b236beffcb3 -r 29f463265cd3 tools/libxl/Makefile
--- a/tools/libxl/Makefile	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/libxl/Makefile	Thu Nov 03 09:58:54 2011 +0100
@@ -112,7 +112,7 @@ libxenlight.so.$(MAJOR): libxenlight.so.
 	ln -sf $< $@
 
 libxenlight.so.$(MAJOR).$(MINOR): $(LIBXL_OBJS)
-	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenlight.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LIBXL_LIBS)
+	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenlight.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LIBXL_LIBS) $(APPEND_LDFLAGS)
 
 libxenlight.a: $(LIBXL_OBJS)
 	$(AR) rcs libxenlight.a $^
@@ -124,16 +124,16 @@ libxlutil.so.$(XLUMAJOR): libxlutil.so.$
 	ln -sf $< $@
 
 libxlutil.so.$(XLUMAJOR).$(XLUMINOR): $(LIBXLU_OBJS)
-	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxlutil.so.$(XLUMAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LIBXLU_LIBS)
+	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxlutil.so.$(XLUMAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LIBXLU_LIBS) $(APPEND_LDFLAGS)
 
 libxlutil.a: $(LIBXLU_OBJS)
 	$(AR) rcs libxlutil.a $^
 
 xl: $(XL_OBJS) libxlutil.so libxenlight.so
-	$(CC) $(LDFLAGS) -o $@ $(XL_OBJS) libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl)
+	$(CC) $(LDFLAGS) -o $@ $(XL_OBJS) libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
 
 testidl: testidl.o libxlutil.so libxenlight.so
-	$(CC) $(LDFLAGS) -o $@ testidl.o libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl)
+	$(CC) $(LDFLAGS) -o $@ testidl.o libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
 
 .PHONY: install
 install: all
diff -r 9b236beffcb3 -r 29f463265cd3 tools/misc/Makefile
--- a/tools/misc/Makefile	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/misc/Makefile	Thu Nov 03 09:58:54 2011 +0100
@@ -47,30 +47,30 @@ clean:
 	set -e; for d in $(SUBDIRS); do $(MAKE) -C $$d clean; done
 
 xen-hvmctx: xen-hvmctx.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
 
 xen-hvmcrash: xen-hvmcrash.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
 
 xenperf: xenperf.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
 
 xenpm: xenpm.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
 
 gtracestat: gtracestat.o
-	$(CC) $(LDFLAGS) -o $@ $<
+	$(CC) $(LDFLAGS) -o $@ $< $(APPEND_LDFLAGS)
 
 xenlockprof: xenlockprof.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
 
 xen-hptool: xen-hptool.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(APPEND_LDFLAGS)
 
 xenwatchdogd: xenwatchdogd.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
 
 gtraceview: gtraceview.o
-	$(CC) $(LDFLAGS) -o $@ $< $(CURSES_LIBS)
+	$(CC) $(LDFLAGS) -o $@ $< $(CURSES_LIBS) $(APPEND_LDFLAGS)
 
 -include $(DEPS)
diff -r 9b236beffcb3 -r 29f463265cd3 tools/xcutils/Makefile
--- a/tools/xcutils/Makefile	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/xcutils/Makefile	Thu Nov 03 09:58:54 2011 +0100
@@ -27,16 +27,16 @@ all: build
 build: $(PROGRAMS)
 
 xc_restore: xc_restore.o
-	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest)
+	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(APPEND_LDFLAGS)
 
 xc_save: xc_save.o
-	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore)
+	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(APPEND_LDFLAGS)
 
 readnotes: readnotes.o
-	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest)
+	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(APPEND_LDFLAGS)
 
 lsevtchn: lsevtchn.o
-	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS_libxenctrl)
+	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
 
 .PHONY: install
 install: build
diff -r 9b236beffcb3 -r 29f463265cd3 tools/xenbackendd/Makefile
--- a/tools/xenbackendd/Makefile	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/xenbackendd/Makefile	Thu Nov 03 09:58:54 2011 +0100
@@ -33,6 +33,6 @@ clean:
 	rm -f $(DEPS)
 
 xenbackendd: xenbackendd.o
-	$(CC) $(LDFLAGS) $< -o $@ $(LDLIBS)
+	$(CC) $(LDFLAGS) $< -o $@ $(LDLIBS) $(APPEND_LDFLAGS)
 
 -include $(DEPS)
diff -r 9b236beffcb3 -r 29f463265cd3 tools/xenmon/Makefile
--- a/tools/xenmon/Makefile	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/xenmon/Makefile	Thu Nov 03 09:58:54 2011 +0100
@@ -41,9 +41,9 @@ clean:
 	$(RM) -f xentrace_setmake setmask.o
 
 xenbaked: xenbaked.o Makefile
-	$(CC) $(LDFLAGS) $< -o $@ $(LDLIBS)
+	$(CC) $(LDFLAGS) $< -o $@ $(LDLIBS) $(APPEND_LDFLAGS)
 
 xentrace_setmask: setmask.o Makefile
-	$(CC) $(LDFLAGS) $< -o $@ $(LDLIBS)
+	$(CC) $(LDFLAGS) $< -o $@ $(LDLIBS) $(APPEND_LDFLAGS)
 
 -include $(DEPS)
diff -r 9b236beffcb3 -r 29f463265cd3 tools/xenpaging/Makefile
--- a/tools/xenpaging/Makefile	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/xenpaging/Makefile	Thu Nov 03 09:58:54 2011 +0100
@@ -20,7 +20,7 @@ IBINS    = xenpaging
 all: $(IBINS)
 
 xenpaging: $(OBJS)
-	$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
+	$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS) $(APPEND_LDFLAGS)
 
 install: all
 	$(INSTALL_DIR) $(DESTDIR)/var/lib/xen/xenpaging
diff -r 9b236beffcb3 -r 29f463265cd3 tools/xenpmd/Makefile
--- a/tools/xenpmd/Makefile	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/xenpmd/Makefile	Thu Nov 03 09:58:54 2011 +0100
@@ -19,6 +19,6 @@ clean:
 	$(RM) -f xenpmd xenpmd.o $(DEPS)
 
 xenpmd: xenpmd.o Makefile
-	$(CC) $(LDFLAGS) $< -o $@ $(LDLIBS)
+	$(CC) $(LDFLAGS) $< -o $@ $(LDLIBS) $(APPEND_LDFLAGS)
 
 -include $(DEPS)
diff -r 9b236beffcb3 -r 29f463265cd3 tools/xenstat/libxenstat/Makefile
--- a/tools/xenstat/libxenstat/Makefile	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/xenstat/libxenstat/Makefile	Thu Nov 03 09:58:54 2011 +0100
@@ -51,7 +51,7 @@ all: $(LIB) $(SHLIB) $(SHLIB_LINKS)
 
 $(SHLIB): $(OBJECTS-y)
 	$(CC) $(LDFLAGS) $(SONAME_FLAGS) $(SHLIB_LDFLAGS) -o $@ \
-	    $(OBJECTS-y) $(LDLIBS-y)
+	    $(OBJECTS-y) $(LDLIBS-y) $(APPEND_LDFLAGS)
 
 src/libxenstat.so.$(MAJOR): $(SHLIB)
 	$(MAKE_LINK) $(<F) $@
@@ -95,7 +95,7 @@ PYTHON_FLAGS=-I/usr/include/python$(PYTH
 	swig -python $(SWIG_FLAGS) -outdir $(@D) -o $(PYSRC) $<
 
 $(PYLIB): $(PYSRC)
-	$(CC) $(CFLAGS) $(LDFLAGS) $(PYTHON_FLAGS) $(SHLIB_LDFLAGS) -lxenstat -o $@ $<
+	$(CC) $(CFLAGS) $(LDFLAGS) $(PYTHON_FLAGS) $(SHLIB_LDFLAGS) -lxenstat -o $@ $< $(APPEND_LDFLAGS)
 
 python-bindings: $(PYLIB) $(PYMOD)
 
@@ -117,7 +117,7 @@ PERL_FLAGS=`perl -MConfig -e 'print "$$C
 	swig -perl $(SWIG_FLAGS) -outdir $(@D) -o $(PERLSRC) $<
 
 $(PERLLIB): $(PERLSRC)
-	$(CC) $(CFLAGS) $(LDFLAGS) $(PERL_FLAGS) $(SHLIB_LDFLAGS) -lxenstat -o $@ $<
+	$(CC) $(CFLAGS) $(LDFLAGS) $(PERL_FLAGS) $(SHLIB_LDFLAGS) -lxenstat -o $@ $< $(APPEND_LDFLAGS)
 
 .PHONY: perl-bindings
 perl-bindings: $(PERLLIB) $(PERLMOD)
diff -r 9b236beffcb3 -r 29f463265cd3 tools/xenstore/Makefile
--- a/tools/xenstore/Makefile	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/xenstore/Makefile	Thu Nov 03 09:58:54 2011 +0100
@@ -47,19 +47,19 @@ CFLAGS += -DHAVE_DTRACE=1
 endif
  
 xenstored: $(XENSTORED_OBJS)
-	$(CC) $(LDFLAGS) $^ $(LDLIBS_libxenctrl) $(SOCKET_LIBS) -o $@
+	$(CC) $(LDFLAGS) $^ $(LDLIBS_libxenctrl) $(SOCKET_LIBS) -o $@ $(APPEND_LDFLAGS)
 
 $(CLIENTS): xenstore
 	ln -f xenstore $@
 
 xenstore: xenstore_client.o $(LIBXENSTORE)
-	$(CC) $(LDFLAGS) $< $(LDLIBS_libxenstore) $(SOCKET_LIBS) -o $@
+	$(CC) $(LDFLAGS) $< $(LDLIBS_libxenstore) $(SOCKET_LIBS) -o $@ $(APPEND_LDFLAGS)
 
 xenstore-control: xenstore_control.o $(LIBXENSTORE)
-	$(CC) $(LDFLAGS) $< $(LDLIBS_libxenstore) $(SOCKET_LIBS) -o $@
+	$(CC) $(LDFLAGS) $< $(LDLIBS_libxenstore) $(SOCKET_LIBS) -o $@ $(APPEND_LDFLAGS)
 
 xs_tdb_dump: xs_tdb_dump.o utils.o tdb.o talloc.o
-	$(CC) $(LDFLAGS) $^ -o $@
+	$(CC) $(LDFLAGS) $^ -o $@ $(APPEND_LDFLAGS)
 
 libxenstore.so: libxenstore.so.$(MAJOR)
 	ln -sf $< $@
@@ -69,7 +69,7 @@ libxenstore.so.$(MAJOR): libxenstore.so.
 xs.opic: CFLAGS += -DUSE_PTHREAD
 
 libxenstore.so.$(MAJOR).$(MINOR): xs.opic xs_lib.opic
-	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenstore.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(SOCKET_LIBS) -lpthread
+	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenstore.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(SOCKET_LIBS) -lpthread $(APPEND_LDFLAGS)
 
 libxenstore.a: xs.o xs_lib.o
 	$(AR) rcs $@ $^
diff -r 9b236beffcb3 -r 29f463265cd3 tools/xentrace/Makefile
--- a/tools/xentrace/Makefile	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/xentrace/Makefile	Thu Nov 03 09:58:54 2011 +0100
@@ -35,13 +35,13 @@ clean:
 	$(RM) *.a *.so *.o *.rpm $(BIN) $(LIBBIN) $(DEPS)
 
 xentrace: xentrace.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS) $(APPEND_LDFLAGS)
 
 xenctx: xenctx.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS) $(APPEND_LDFLAGS)
 
 xentrace_setsize: setsize.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS) $(APPEND_LDFLAGS)
 
 -include $(DEPS)
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 03:03:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 03:03:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLu8v-0002is-EH; Thu, 03 Nov 2011 03:03:29 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLu56-0002TA-2q
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 02:59:44 -0700
X-Env-Sender: liang.tang@oracle.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1320314366!2138533!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30965 invoked from network); 3 Nov 2011 09:59:27 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-3.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Nov 2011 09:59:27 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA39xLNY026571
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 3 Nov 2011 09:59:22 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA39xKkZ021801
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 3 Nov 2011 09:59:20 GMT
Received: from abhmt118.oracle.com (abhmt118.oracle.com [141.146.116.70])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA39xEBp016907; Thu, 3 Nov 2011 04:59:14 -0500
Received: from [10.182.38.104] (/10.182.38.104)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 03 Nov 2011 02:59:14 -0700
Message-ID: <4EB265EC.2050702@oracle.com>
Date: Thu, 03 Nov 2011 17:59:08 +0800
From: liang tang <liang.tang@oracle.com>
Organization: Oracle Corporation
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;
	rv:1.9.2.23) Gecko/20110920 Thunderbird/3.1.15
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
References: <4EAEAC4B.4000004@oracle.com>
	<4EB12AB6020000780005E679@nat28.tlf.novell.com>
In-Reply-To: <4EB12AB6020000780005E679@nat28.tlf.novell.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090203.4EB265FD.017E,ss=1,re=0.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: Need some help about the build xen.efi
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi,konrad,Jan
Thank you very much for your help, now i can build xen.efi and i use 
basevideo and cfg file
kernel=vmlinuz-3.0.0+
ramdisk=initramfs-3.0.0+.img

after run xen.efi I got debug message "tangl debug xen loader debug 1" 
don't got the "tangl debug xen loader debug 2" .
     PrintStr(L"tangl debug xen loader debug 1\n");
     status = efi_bs->ExitBootServices(ImageHandle, map_key);
     if ( EFI_ERROR(status) )
         PrintErrMesg(L"Cannot exit boot services", status);

     PrintStr(L"tangl debug xen loader debug 2\n");

if I mark //status = efi_bs->ExitBootServices(ImageHandle, map_key); xen 
will halt in here load the domain 0.


     if ( (rc = bzimage_parse(image_base, &image_start, &image_len)) != 0 )
         return rc;
is configure file ok? any idea about that?
thank you very much!

On 2011-11-2 18:34, Jan Beulich wrote:
>>>> On 31.10.11 at 15:10, liang tang<liang.tang@oracle.com>  wrote:
>> Hi,Jan
>> I have download xen unstable tree which include your efi patch,and try
>> to build xen.efi ,but there only have xen.gz ,don't have xen.efi .I find
>> the file xen\arch\x86\efi\disable have report some error : ld don't
>> support -m i386pep.  my gcc version is 4.6.1.
> Apart from an up-to-date compiler you also need an up-to-date (and
> properly configured) static linker (binutils 2.22 will be the first upstream
> version to have the necessary support).
>
>> if modify the i386pep to elf_x86_64 ,the build can continue ,and report
>> other error --subsystem=10 and --image-base=0xffff82c480000000 unrecognized.
>> do you have any suggestion about that?  thank you very much!
>>
>> the detail is follow.
>> ld: unrecognized option '--image-base=0xffff82c480000000'
> Quite obviously, as it's wrong.. You want an EFI binary, not an ELF
> one.
>
>> In the xen/arch/x86/efi/disabled
>> ld: unrecognized emulation mode: i386pep
>> Supported emulations: elf_x86_64 elf32_x86_64 elf_i386 i386linux elf_l1om
> That just points out what I said above about the ld to use.
>
> Jan
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 03:08:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 03:08:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLuDa-00038y-I2; Thu, 03 Nov 2011 03:08:19 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLuBs-0002ve-M4
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 03:06:34 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1320314787!133259!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26535 invoked from network); 3 Nov 2011 10:06:28 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-10.tower-174.messagelabs.com with AES256-SHA encrypted
	SMTP; 3 Nov 2011 10:06:28 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 03 Nov 2011 10:06:27 +0000
Message-Id: <4EB275B0020000780005EABE@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 03 Nov 2011 10:06:24 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "liang tang" <liang.tang@oracle.com>
References: <4EAEAC4B.4000004@oracle.com>
	<4EB12AB6020000780005E679@nat28.tlf.novell.com>
	<4EB265EC.2050702@oracle.com>
In-Reply-To: <4EB265EC.2050702@oracle.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: Need some help about the build xen.efi
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 03.11.11 at 10:59, liang tang <liang.tang@oracle.com> wrote:
> Hi,konrad,Jan
> Thank you very much for your help, now i can build xen.efi and i use=20
> basevideo and cfg file
> kernel=3Dvmlinuz-3.0.0+
> ramdisk=3Dinitramfs-3.0.0+.img
>=20
> after run xen.efi I got debug message "tangl debug xen loader debug =
1"=20
> don't got the "tangl debug xen loader debug 2" .
>      PrintStr(L"tangl debug xen loader debug 1\n");
>      status =3D efi_bs->ExitBootServices(ImageHandle, map_key);
>      if ( EFI_ERROR(status) )
>          PrintErrMesg(L"Cannot exit boot services", status);
>=20
>      PrintStr(L"tangl debug xen loader debug 2\n");

You can't PrintStr() anymore after ExitBootServices().

> if I mark //status =3D efi_bs->ExitBootServices(ImageHandle, map_key); =
xen=20
> will halt in here load the domain 0.

And you also can't just arbitrarily remove code and expect things to
still work.

>=20
>      if ( (rc =3D bzimage_parse(image_base, &image_start, &image_len)) =
!=3D 0 )
>          return rc;
> is configure file ok?

Looks like it is (otherwise you would see some sort of error message).

> any idea about that?

If you're having real problems, the may be connected to the EFI
implementation on your system and/or the EFI version being too
old (no minimum version was established so far, but it may well be
that some things aren't working as expected in older versions).

I take it that native Linux boots okay on that system?

Jan



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 03:14:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 03:14:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLuJp-0003ap-O6; Thu, 03 Nov 2011 03:14:46 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLuIw-0003Np-1L
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 03:13:50 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1320315225!1792369!1
X-Originating-IP: [65.55.88.11]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26983 invoked from network); 3 Nov 2011 10:13:46 -0000
Received: from tx2ehsobe001.messaging.microsoft.com (HELO
	TX2EHSOBE002.bigfish.com) (65.55.88.11)
	by server-12.tower-182.messagelabs.com with AES128-SHA encrypted SMTP;
	3 Nov 2011 10:13:46 -0000
Received: from mail38-tx2-R.bigfish.com (10.9.14.242) by
	TX2EHSOBE002.bigfish.com (10.9.40.22) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 10:13:29 +0000
Received: from mail38-tx2 (localhost.localdomain [127.0.0.1])	by
	mail38-tx2-R.bigfish.com (Postfix) with ESMTP id 28CAE518183;
	Thu,  3 Nov 2011 10:13:38 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzz8275bhz32i668h839h944h61h)
X-Spam-TCS-SCL: 0:0
X-Forefront-Antispam-Report: CIP:163.181.249.108; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp01.amd.com; RD:none; EFVD:NLI
Received: from mail38-tx2 (localhost.localdomain [127.0.0.1]) by mail38-tx2
	(MessageSwitch) id 1320315217878581_30211;
	Thu,  3 Nov 2011 10:13:37 +0000 (UTC)
Received: from TX2EHSMHS040.bigfish.com (unknown [10.9.14.249])	by
	mail38-tx2.bigfish.com (Postfix) with ESMTP id D05F61750046;
	Thu,  3 Nov 2011 10:13:37 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	TX2EHSMHS040.bigfish.com (10.9.99.140) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 10:13:44 +0000
X-WSS-ID: 0LU2XQT-01-IQ2-02
X-M-MSG: 
Received: from sausexedgep01.amd.com (sausexedgep01-ext.amd.com
	[163.181.249.72])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp01.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 2C79D1028024;	Thu,  3 Nov 2011 05:13:41 -0500 (CDT)
Received: from SAUSEXDAG03.amd.com (163.181.55.3) by sausexedgep01.amd.com
	(163.181.36.54) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Thu, 3 Nov 2011 05:14:20 -0500
Received: from storexhtp01.amd.com (172.24.4.3) by sausexdag03.amd.com
	(163.181.55.3) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Thu, 3 Nov 2011 05:13:41 -0500
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp01.amd.com
	(172.24.4.3) with Microsoft SMTP Server id 8.3.83.0;
	Thu, 3 Nov 2011 06:13:30 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id DD2E249C627; Thu,  3 Nov 2011
	10:13:28 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id C9DC2594885; Thu,  3 Nov 2011
	11:13:28 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: c9dcbe6d80a355f1e50ff910d618660a78b40653
Message-ID: <c9dcbe6d80a355f1e50f.1320315184@gran.amd.com>
In-Reply-To: <patchbomb.1320315180@gran.amd.com>
References: <patchbomb.1320315180@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Thu, 3 Nov 2011 11:13:04 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Cc: JBeulich@novell.com
Subject: [Xen-devel] [PATCH 4 of 5] amd iommu: add iotlb invalidation command
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Wei Wang <wei.wang2@amd.com>
# Date 1320314694 -3600
# Node ID c9dcbe6d80a355f1e50ff910d618660a78b40653
# Parent  c839972486f86a0833595bebae0baa0cd2c0d15e
amd iommu: add iotlb invalidation command

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r c839972486f8 -r c9dcbe6d80a3 xen/drivers/passthrough/amd/iommu_map.c
--- a/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 11:04:23 2011 +0100
+++ b/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 11:04:54 2011 +0100
@@ -23,6 +23,8 @@
 #include <xen/hvm/iommu.h>
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
+#include "../ats.h"
+#include <xen/pci.h>
 
 static int queue_iommu_command(struct amd_iommu *iommu, u32 cmd[])
 {
@@ -128,6 +130,75 @@ static void invalidate_iommu_pages(struc
     send_iommu_command(iommu, cmd);
 }
 
+static void invalidate_iotlb_pages(struct amd_iommu *iommu,
+                                   u16 maxpend, u32 pasid, u16 queueid,
+                                   u64 io_addr, u16 dev_id, u16 order)
+{
+    u64 addr_lo, addr_hi;
+    u32 cmd[4], entry;
+    int sflag = 0;
+
+    ASSERT ( order == 0 || order == 9 || order == 18 );
+
+    if ( order || (io_addr == INV_IOMMU_ALL_PAGES_ADDRESS ) )
+        sflag = 1;
+
+    /* If sflag == 1, the size of the invalidate command is determined
+     by the first zero bit in the address starting from Address[12] */
+    if ( order )
+    {
+        u64 mask = 1ULL << (order - 1 + PAGE_SHIFT);
+        io_addr &= ~mask;
+        io_addr |= mask - 1;
+    }
+
+    addr_lo = io_addr & DMA_32BIT_MASK;
+    addr_hi = io_addr >> 32;
+
+    set_field_in_reg_u32(dev_id, 0,
+                         IOMMU_INV_IOTLB_PAGES_DEVICE_ID_MASK,
+                         IOMMU_INV_IOTLB_PAGES_DEVICE_ID_SHIFT, &entry);
+
+    set_field_in_reg_u32(maxpend, entry,
+                         IOMMU_INV_IOTLB_PAGES_MAXPEND_MASK,
+                         IOMMU_INV_IOTLB_PAGES_MAXPEND_SHIFT, &entry);
+
+    set_field_in_reg_u32(pasid & 0xff, entry,
+                         IOMMU_INV_IOTLB_PAGES_PASID1_MASK,
+                         IOMMU_INV_IOTLB_PAGES_PASID1_SHIFT, &entry);
+    cmd[0] = entry;
+
+    set_field_in_reg_u32(IOMMU_CMD_INVALIDATE_IOTLB_PAGES, 0,
+                         IOMMU_CMD_OPCODE_MASK, IOMMU_CMD_OPCODE_SHIFT,
+                         &entry);
+
+    set_field_in_reg_u32(pasid >> 8, entry,
+                         IOMMU_INV_IOTLB_PAGES_PASID2_MASK, 
+                         IOMMU_INV_IOTLB_PAGES_PASID2_SHIFT,
+                         &entry);
+
+    set_field_in_reg_u32(queueid, entry,
+                         IOMMU_INV_IOTLB_PAGES_QUEUEID_MASK, 
+                         IOMMU_INV_IOTLB_PAGES_QUEUEID_SHIFT,
+                         &entry);
+    cmd[1] = entry;
+
+    set_field_in_reg_u32(sflag, 0,
+                         IOMMU_INV_IOTLB_PAGES_S_FLAG_MASK,
+                         IOMMU_INV_IOTLB_PAGES_S_FLAG_MASK, &entry);
+
+    set_field_in_reg_u32((u32)addr_lo >> PAGE_SHIFT, entry,
+                         IOMMU_INV_IOTLB_PAGES_ADDR_LOW_MASK,
+                         IOMMU_INV_IOTLB_PAGES_ADDR_LOW_SHIFT, &entry);
+    cmd[2] = entry;
+
+    set_field_in_reg_u32((u32)addr_hi, 0,
+                         IOMMU_INV_IOTLB_PAGES_ADDR_HIGH_MASK,
+                         IOMMU_INV_IOTLB_PAGES_ADDR_HIGH_SHIFT, &entry);
+    cmd[3] = entry;
+
+    send_iommu_command(iommu, cmd);
+}
 void flush_command_buffer(struct amd_iommu *iommu)
 {
     u32 cmd[4], status;
@@ -896,6 +967,63 @@ int amd_iommu_reserve_domain_unity_map(s
     return 0;
 }
 
+void amd_iommu_flush_iotlb(struct pci_dev *pdev,
+                           uint64_t gaddr, unsigned int order)
+{
+    unsigned long flags;
+    struct amd_iommu *iommu;
+    unsigned int bdf, req_id, queueid, maxpend;
+    struct pci_ats_dev *ats_pdev;
+
+    if ( !ats_enabled )
+        return;
+
+    ats_pdev = get_ats_device(pdev->seg, pdev->bus, pdev->devfn);
+    if ( ats_pdev == NULL )
+        return;
+
+    if ( !pci_ats_enabled(ats_pdev->seg, 
+                          ats_pdev->bus, ats_pdev->devfn) )
+        return;
+
+    bdf = PCI_BDF2(ats_pdev->bus, ats_pdev->devfn);
+    iommu = find_iommu_for_device(ats_pdev->seg, bdf);
+
+    if ( !iommu )
+    {
+        AMD_IOMMU_DEBUG("%s: Fail to find iommu for device %04x:%02x:%02x.%u\n",
+                        __func__, ats_pdev->seg, ats_pdev->bus, 
+                        PCI_SLOT(ats_pdev->devfn),
+                        PCI_FUNC(ats_pdev->devfn));
+        return;
+    }
+
+    if ( !iommu->iotlb_support )
+        return;
+
+    req_id = get_dma_requestor_id(iommu->seg, bdf);
+    queueid = req_id;
+    maxpend = (ats_pdev->ats_queue_depth + 32) & 0xff;
+
+    /* send INVALIDATE_IOTLB_PAGES command */
+    spin_lock_irqsave(&iommu->lock, flags);
+    invalidate_iotlb_pages(iommu, maxpend, 0, queueid,
+                           gaddr, req_id, order);
+    flush_command_buffer(iommu);
+    spin_unlock_irqrestore(&iommu->lock, flags);
+}
+
+static void amd_iommu_flush_all_iotlbs(struct domain *d, 
+                                       uint64_t gaddr, unsigned int order)
+{
+    struct pci_dev *pdev;
+
+    if ( !ats_enabled )
+        return;
+
+    for_each_pdev( d, pdev )
+        amd_iommu_flush_iotlb(pdev, gaddr, order);
+}
 
 /* Flush iommu cache after p2m changes. */
 static void _amd_iommu_flush_pages(struct domain *d,
@@ -914,6 +1042,9 @@ static void _amd_iommu_flush_pages(struc
         flush_command_buffer(iommu);
         spin_unlock_irqrestore(&iommu->lock, flags);
     }
+
+    if ( ats_enabled )
+        amd_iommu_flush_all_iotlbs(d, gaddr, order);
 }
 
 void amd_iommu_flush_all_pages(struct domain *d)
diff -r c839972486f8 -r c9dcbe6d80a3 xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 11:04:23 2011 +0100
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 11:04:54 2011 +0100
@@ -233,6 +233,24 @@
 #define IOMMU_INV_INT_TABLE_DEVICE_ID_MASK   0x0000FFFF
 #define IOMMU_INV_INT_TABLE_DEVICE_ID_SHIFT  0
 
+/* INVALIDATE_IOTLB_PAGES command */
+#define IOMMU_INV_IOTLB_PAGES_MAXPEND_MASK          0xff000000
+#define IOMMU_INV_IOTLB_PAGES_MAXPEND_SHIFT         24
+#define IOMMU_INV_IOTLB_PAGES_PASID1_MASK           0x00ff0000
+#define IOMMU_INV_IOTLB_PAGES_PASID1_SHIFT          16
+#define IOMMU_INV_IOTLB_PAGES_PASID2_MASK           0x0fff0000
+#define IOMMU_INV_IOTLB_PAGES_PASID2_SHIFT          16
+#define IOMMU_INV_IOTLB_PAGES_QUEUEID_MASK          0x0000ffff
+#define IOMMU_INV_IOTLB_PAGES_QUEUEID_SHIFT         0
+#define IOMMU_INV_IOTLB_PAGES_DEVICE_ID_MASK        0x0000FFFF
+#define IOMMU_INV_IOTLB_PAGES_DEVICE_ID_SHIFT       0
+#define IOMMU_INV_IOTLB_PAGES_ADDR_LOW_MASK         0xFFFFF000
+#define IOMMU_INV_IOTLB_PAGES_ADDR_LOW_SHIFT        12
+#define IOMMU_INV_IOTLB_PAGES_ADDR_HIGH_MASK        0xFFFFFFFF
+#define IOMMU_INV_IOTLB_PAGES_ADDR_HIGH_SHIFT       0
+#define IOMMU_INV_IOTLB_PAGES_S_FLAG_MASK           0x00000001
+#define IOMMU_INV_IOTLB_PAGES_S_FLAG_SHIFT          0
+
 /* Event Log */
 #define IOMMU_EVENT_LOG_BASE_LOW_OFFSET		0x10
 #define IOMMU_EVENT_LOG_BASE_HIGH_OFFSET	0x14
diff -r c839972486f8 -r c9dcbe6d80a3 xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Thu Nov 03 11:04:23 2011 +0100
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Thu Nov 03 11:04:54 2011 +0100
@@ -55,6 +55,8 @@ int amd_iommu_unmap_page(struct domain *
 void amd_iommu_flush_pages(struct domain *d, unsigned long gfn,
                            unsigned int order);
 void amd_iommu_flush_all_pages(struct domain *d);
+void amd_iommu_flush_iotlb(struct pci_dev *pdev,
+                           uint64_t gaddr, unsigned int order);
 
 u64 amd_iommu_get_next_table_from_pte(u32 *entry);
 int amd_iommu_reserve_domain_unity_map(struct domain *domain,


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 03:16:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 03:16:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLuLC-0003ye-HD; Thu, 03 Nov 2011 03:16:10 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLuIx-0003Nq-Kk
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 03:13:52 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1320315227!2749173!1
X-Originating-IP: [216.32.181.182]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19502 invoked from network); 3 Nov 2011 10:13:48 -0000
Received: from ch1ehsobe002.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.182)
	by server-10.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	3 Nov 2011 10:13:48 -0000
Received: from mail25-ch1-R.bigfish.com (10.43.68.240) by
	CH1EHSOBE001.bigfish.com (10.43.70.51) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 10:13:31 +0000
Received: from mail25-ch1 (localhost.localdomain [127.0.0.1])	by
	mail25-ch1-R.bigfish.com (Postfix) with ESMTP id 3132011E019F;
	Thu,  3 Nov 2011 10:13:39 +0000 (UTC)
X-SpamScore: 3
X-BigFish: VPS3(zz8d0Ic8kzz1202hzz8275bhz32i668h839h944h)
X-Forefront-Antispam-Report: CIP:163.181.249.108; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp01.amd.com; RD:none; EFVD:NLI
X-FB-SS: 13,
Received: from mail25-ch1 (localhost.localdomain [127.0.0.1]) by mail25-ch1
	(MessageSwitch) id 1320315218408284_32181;
	Thu,  3 Nov 2011 10:13:38 +0000 (UTC)
Received: from CH1EHSMHS015.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.248])	by mail25-ch1.bigfish.com (Postfix) with ESMTP id
	5A99FAB0052;	Thu,  3 Nov 2011 10:13:38 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	CH1EHSMHS015.bigfish.com (10.43.70.15) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 10:13:48 +0000
X-WSS-ID: 0LU2XQU-01-IQ3-02
X-M-MSG: 
Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com
	[163.181.249.73])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp01.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 2D7801028020;	Thu,  3 Nov 2011 05:13:41 -0500 (CDT)
Received: from SAUSEXDAG03.amd.com (163.181.55.3) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Thu, 3 Nov 2011 05:14:20 -0500
Received: from storexhtp01.amd.com (172.24.4.3) by sausexdag03.amd.com
	(163.181.55.3) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Thu, 3 Nov 2011 05:13:42 -0500
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp01.amd.com
	(172.24.4.3) with Microsoft SMTP Server id 8.3.83.0;
	Thu, 3 Nov 2011 06:13:29 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id A728B49C623; Thu,  3 Nov 2011
	10:13:28 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 98196594882; Thu,  3 Nov 2011
	11:13:28 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: d422e3cf7976c76c57fc2d455b784d0fcc24d06b
Message-ID: <d422e3cf7976c76c57fc.1320315181@gran.amd.com>
In-Reply-To: <patchbomb.1320315180@gran.amd.com>
References: <patchbomb.1320315180@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Thu, 3 Nov 2011 11:13:01 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Cc: JBeulich@novell.com
Subject: [Xen-devel] [PATCH 1 of 5] ats: Move some ats functions to a new
	directory
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Wei Wang <wei.wang2@amd.com>
# Date 1320314537 -3600
# Node ID d422e3cf7976c76c57fc2d455b784d0fcc24d06b
# Parent  119bccb1cc5eee1364bbbd3bd1a30f22e9db703a
ats: Move some ats functions to a new directory.
Remove VTD prefix from debug output.
passhrough/x86 holds vendor neutral codes for x86 architecture.

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r 119bccb1cc5e -r d422e3cf7976 xen/drivers/passthrough/Makefile
--- a/xen/drivers/passthrough/Makefile	Wed Nov 02 13:53:05 2011 +0100
+++ b/xen/drivers/passthrough/Makefile	Thu Nov 03 11:02:17 2011 +0100
@@ -1,6 +1,7 @@
 subdir-$(x86) += vtd
 subdir-$(ia64) += vtd
 subdir-$(x86) += amd
+subdir-$(x86) += x86
 
 obj-y += iommu.o
 obj-y += io.o
diff -r 119bccb1cc5e -r d422e3cf7976 xen/drivers/passthrough/ats.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/drivers/passthrough/ats.h	Thu Nov 03 11:02:17 2011 +0100
@@ -0,0 +1,39 @@
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place - Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _ATS_H_
+#define _ATS_H_
+
+#define ATS_REG_CAP    4
+#define ATS_REG_CTL    6
+#define ATS_QUEUE_DEPTH_MASK     0xF
+#define ATS_ENABLE               (1<<15)
+
+struct pci_ats_dev {
+    struct list_head list;
+    u16 seg;
+    u8 bus;
+    u8 devfn;
+    u16 ats_queue_depth;    /* ATS device invalidation queue depth */
+};
+
+extern struct list_head ats_devices;
+extern bool_t ats_enabled;
+
+int enable_ats_device(int seg, int bus, int devfn);
+void disable_ats_device(int seg, int bus, int devfn);
+
+#endif /* _ATS_H_ */
+
diff -r 119bccb1cc5e -r d422e3cf7976 xen/drivers/passthrough/vtd/extern.h
--- a/xen/drivers/passthrough/vtd/extern.h	Wed Nov 02 13:53:05 2011 +0100
+++ b/xen/drivers/passthrough/vtd/extern.h	Thu Nov 03 11:02:17 2011 +0100
@@ -57,13 +57,9 @@ struct acpi_drhd_unit * iommu_to_drhd(st
 struct acpi_rhsa_unit * drhd_to_rhsa(struct acpi_drhd_unit *drhd);
 
 #ifdef CONFIG_X86_64
-extern bool_t ats_enabled;
-
 struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu);
 
 int ats_device(const struct pci_dev *, const struct acpi_drhd_unit *);
-int enable_ats_device(int seg, int bus, int devfn);
-void disable_ats_device(int seg, int bus, int devfn);
 
 int dev_invalidate_iotlb(struct iommu *iommu, u16 did,
                          u64 addr, unsigned int size_order, u64 type);
diff -r 119bccb1cc5e -r d422e3cf7976 xen/drivers/passthrough/vtd/iommu.c
--- a/xen/drivers/passthrough/vtd/iommu.c	Wed Nov 02 13:53:05 2011 +0100
+++ b/xen/drivers/passthrough/vtd/iommu.c	Thu Nov 03 11:02:17 2011 +0100
@@ -40,6 +40,7 @@
 #include "dmar.h"
 #include "extern.h"
 #include "vtd.h"
+#include "../ats.h"
 
 #ifdef __ia64__
 #define nr_ioapics              iosapic_get_nr_iosapics()
diff -r 119bccb1cc5e -r d422e3cf7976 xen/drivers/passthrough/vtd/x86/ats.c
--- a/xen/drivers/passthrough/vtd/x86/ats.c	Wed Nov 02 13:53:05 2011 +0100
+++ b/xen/drivers/passthrough/vtd/x86/ats.c	Thu Nov 03 11:02:17 2011 +0100
@@ -27,51 +27,10 @@
 #include "../dmar.h"
 #include "../vtd.h"
 #include "../extern.h"
+#include "../../ats.h"
 
 static LIST_HEAD(ats_dev_drhd_units);
 
-#define ATS_REG_CAP    4
-#define ATS_REG_CTL    6
-#define ATS_QUEUE_DEPTH_MASK     0xF
-#define ATS_ENABLE               (1<<15)
-
-struct pci_ats_dev {
-    struct list_head list;
-    u16 seg;
-    u8 bus;
-    u8 devfn;
-    u16 ats_queue_depth;    /* ATS device invalidation queue depth */
-};
-static LIST_HEAD(ats_devices);
-
-static void parse_ats_param(char *s);
-custom_param("ats", parse_ats_param);
-
-bool_t __read_mostly ats_enabled = 1;
-
-static void __init parse_ats_param(char *s)
-{
-    char *ss;
-
-    do {
-        ss = strchr(s, ',');
-        if ( ss )
-            *ss = '\0';
-
-        switch ( parse_bool(s) )
-        {
-        case 0:
-            ats_enabled = 0;
-            break;
-        case 1:
-            ats_enabled = 1;
-            break;
-        }
-
-        s = ss + 1;
-    } while ( ss );
-}
-
 struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu)
 {
     struct acpi_drhd_unit *drhd;
@@ -113,97 +72,6 @@ int ats_device(const struct pci_dev *pde
     return pos;
 }
 
-int enable_ats_device(int seg, int bus, int devfn)
-{
-    struct pci_ats_dev *pdev = NULL;
-    u32 value;
-    int pos;
-
-    pos = pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
-    BUG_ON(!pos);
-
-    if ( iommu_verbose )
-        dprintk(XENLOG_INFO VTDPREFIX,
-                "%04x:%02x:%02x.%u: ATS capability found\n",
-                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
-
-    value = pci_conf_read16(seg, bus, PCI_SLOT(devfn),
-                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
-    if ( value & ATS_ENABLE )
-    {
-        list_for_each_entry ( pdev, &ats_devices, list )
-        {
-            if ( pdev->seg == seg && pdev->bus == bus && pdev->devfn == devfn )
-            {
-                pos = 0;
-                break;
-            }
-        }
-    }
-    if ( pos )
-        pdev = xmalloc(struct pci_ats_dev);
-    if ( !pdev )
-        return -ENOMEM;
-
-    if ( !(value & ATS_ENABLE) )
-    {
-        value |= ATS_ENABLE;
-        pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
-                         pos + ATS_REG_CTL, value);
-    }
-
-    if ( pos )
-    {
-        pdev->seg = seg;
-        pdev->bus = bus;
-        pdev->devfn = devfn;
-        value = pci_conf_read16(seg, bus, PCI_SLOT(devfn),
-                                PCI_FUNC(devfn), pos + ATS_REG_CAP);
-        pdev->ats_queue_depth = value & ATS_QUEUE_DEPTH_MASK;
-        list_add(&pdev->list, &ats_devices);
-    }
-
-    if ( iommu_verbose )
-        dprintk(XENLOG_INFO VTDPREFIX,
-                "%04x:%02x:%02x.%u: ATS %s enabled\n",
-                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
-                pos ? "is" : "was");
-
-    return pos;
-}
-
-void disable_ats_device(int seg, int bus, int devfn)
-{
-    struct pci_ats_dev *pdev;
-    u32 value;
-    int pos;
-
-    pos = pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
-    BUG_ON(!pos);
-
-    value = pci_conf_read16(seg, bus, PCI_SLOT(devfn),
-                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
-    value &= ~ATS_ENABLE;
-    pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
-                     pos + ATS_REG_CTL, value);
-
-    list_for_each_entry ( pdev, &ats_devices, list )
-    {
-        if ( pdev->seg == seg && pdev->bus == bus && pdev->devfn == devfn )
-        {
-            list_del(&pdev->list);
-            xfree(pdev);
-            break;
-        }
-    }
-
-    if ( iommu_verbose )
-        dprintk(XENLOG_INFO VTDPREFIX,
-                "%04x:%02x:%02x.%u: ATS is disabled\n",
-                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
-}
-
-
 static int device_in_domain(struct iommu *iommu, struct pci_ats_dev *pdev, u16 did)
 {
     struct root_entry *root_entry = NULL;
diff -r 119bccb1cc5e -r d422e3cf7976 xen/drivers/passthrough/x86/Makefile
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/drivers/passthrough/x86/Makefile	Thu Nov 03 11:02:17 2011 +0100
@@ -0,0 +1,1 @@
+obj-y += ats.o
\ No newline at end of file
diff -r 119bccb1cc5e -r d422e3cf7976 xen/drivers/passthrough/x86/ats.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/drivers/passthrough/x86/ats.c	Thu Nov 03 11:02:17 2011 +0100
@@ -0,0 +1,139 @@
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place - Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include <xen/sched.h>
+#include <xen/pci.h>
+#include <xen/pci_regs.h>
+#include "../ats.h"
+
+LIST_HEAD(ats_devices);
+
+static void parse_ats_param(char *s);
+custom_param("ats", parse_ats_param);
+
+bool_t __read_mostly ats_enabled = 1;
+
+static void __init parse_ats_param(char *s)
+{
+    char *ss;
+
+    do {
+        ss = strchr(s, ',');
+        if ( ss )
+            *ss = '\0';
+
+        switch ( parse_bool(s) )
+        {
+        case 0:
+            ats_enabled = 0;
+            break;
+        case 1:
+            ats_enabled = 1;
+            break;
+        }
+
+        s = ss + 1;
+    } while ( ss );
+}
+
+int enable_ats_device(int seg, int bus, int devfn)
+{
+    struct pci_ats_dev *pdev = NULL;
+    u32 value;
+    int pos;
+
+    pos = pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
+    BUG_ON(!pos);
+
+    if ( iommu_verbose )
+        dprintk(XENLOG_INFO,
+                "%04x:%02x:%02x.%u: ATS capability found\n",
+                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
+
+    value = pci_conf_read16(seg, bus, PCI_SLOT(devfn),
+                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
+    if ( value & ATS_ENABLE )
+    {
+        list_for_each_entry ( pdev, &ats_devices, list )
+        {
+            if ( pdev->seg == seg && pdev->bus == bus && pdev->devfn == devfn )
+            {
+                pos = 0;
+                break;
+            }
+        }
+    }
+    if ( pos )
+        pdev = xmalloc(struct pci_ats_dev);
+    if ( !pdev )
+        return -ENOMEM;
+
+    if ( !(value & ATS_ENABLE) )
+    {
+        value |= ATS_ENABLE;
+        pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
+                         pos + ATS_REG_CTL, value);
+    }
+
+    if ( pos )
+    {
+        pdev->seg = seg;
+        pdev->bus = bus;
+        pdev->devfn = devfn;
+        value = pci_conf_read16(seg, bus, PCI_SLOT(devfn),
+                                PCI_FUNC(devfn), pos + ATS_REG_CAP);
+        pdev->ats_queue_depth = value & ATS_QUEUE_DEPTH_MASK;
+        list_add(&pdev->list, &ats_devices);
+    }
+
+    if ( iommu_verbose )
+        dprintk(XENLOG_INFO,
+                "%04x:%02x:%02x.%u: ATS %s enabled\n",
+                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
+                pos ? "is" : "was");
+
+    return pos;
+}
+
+void disable_ats_device(int seg, int bus, int devfn)
+{
+    struct pci_ats_dev *pdev;
+    u32 value;
+    int pos;
+
+    pos = pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
+    BUG_ON(!pos);
+
+    value = pci_conf_read16(seg, bus, PCI_SLOT(devfn),
+                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
+    value &= ~ATS_ENABLE;
+    pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
+                     pos + ATS_REG_CTL, value);
+
+    list_for_each_entry ( pdev, &ats_devices, list )
+    {
+        if ( pdev->seg == seg && pdev->bus == bus && pdev->devfn == devfn )
+        {
+            list_del(&pdev->list);
+            xfree(pdev);
+            break;
+        }
+    }
+
+    if ( iommu_verbose )
+        dprintk(XENLOG_INFO,
+                "%04x:%02x:%02x.%u: ATS is disabled\n",
+                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
+}


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 03:17:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 03:17:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLuM7-0004Lo-59; Thu, 03 Nov 2011 03:17:07 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLuIy-0003Nr-P6
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 03:13:53 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320315200!51673531!1
X-Originating-IP: [216.32.181.186]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28438 invoked from network); 3 Nov 2011 10:13:21 -0000
Received: from ch1ehsobe006.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.186)
	by server-5.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	3 Nov 2011 10:13:21 -0000
Received: from mail11-ch1-R.bigfish.com (10.43.68.248) by
	CH1EHSOBE016.bigfish.com (10.43.70.66) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 10:13:32 +0000
Received: from mail11-ch1 (localhost.localdomain [127.0.0.1])	by
	mail11-ch1-R.bigfish.com (Postfix) with ESMTP id 047ED14C841E;
	Thu,  3 Nov 2011 10:13:40 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzz8275bhz32i668h839h944h)
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
Received: from mail11-ch1 (localhost.localdomain [127.0.0.1]) by mail11-ch1
	(MessageSwitch) id 1320315217721365_2468;
	Thu,  3 Nov 2011 10:13:37 +0000 (UTC)
Received: from CH1EHSMHS027.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.240])	by mail11-ch1.bigfish.com (Postfix) with ESMTP id
	A141FAC0050;	Thu,  3 Nov 2011 10:13:37 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	CH1EHSMHS027.bigfish.com (10.43.70.27) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 10:13:27 +0000
X-WSS-ID: 0LU2XQS-02-4HZ-02
X-M-MSG: 
Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com
	[163.181.249.73])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 2C0F6C8002;	Thu,  3 Nov 2011 05:13:40 -0500 (CDT)
Received: from SAUSEXDAG03.amd.com (163.181.55.3) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Thu, 3 Nov 2011 05:14:18 -0500
Received: from storexhtp01.amd.com (172.24.4.3) by sausexdag03.amd.com
	(163.181.55.3) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Thu, 3 Nov 2011 05:13:41 -0500
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp01.amd.com
	(172.24.4.3) with Microsoft SMTP Server id 8.3.83.0;
	Thu, 3 Nov 2011 06:13:29 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id B7B3249C625; Thu,  3 Nov 2011
	10:13:28 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id A6DED594883; Thu,  3 Nov 2011
	11:13:28 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: d0c38cb215cd96e01de27eadf5ec0a5e711de448
Message-ID: <d0c38cb215cd96e01de2.1320315182@gran.amd.com>
In-Reply-To: <patchbomb.1320315180@gran.amd.com>
References: <patchbomb.1320315180@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Thu, 3 Nov 2011 11:13:02 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Cc: JBeulich@novell.com
Subject: [Xen-devel] [PATCH 2 of 5] amd iommu: Fix iommu page size encoding
 when page order > 0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Wei Wang <wei.wang2@amd.com>
# Date 1320314617 -3600
# Node ID d0c38cb215cd96e01de27eadf5ec0a5e711de448
# Parent  d422e3cf7976c76c57fc2d455b784d0fcc24d06b
amd iommu: Fix iommu page size encoding when page order > 0

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r d422e3cf7976 -r d0c38cb215cd xen/drivers/passthrough/amd/iommu_map.c
--- a/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 11:02:17 2011 +0100
+++ b/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 11:03:37 2011 +0100
@@ -77,23 +77,24 @@ static void invalidate_iommu_pages(struc
 {
     u64 addr_lo, addr_hi;
     u32 cmd[4], entry;
-    u64 mask = 0;
     int sflag = 0, pde = 0;
 
+    ASSERT ( order == 0 || order == 9 || order == 18 );
+
+    /* All pages associated with the domainID are invalidated */
+    if ( order || (io_addr == INV_IOMMU_ALL_PAGES_ADDRESS ) )
+    {
+        sflag = 1;
+        pde = 1;
+    }
+
     /* If sflag == 1, the size of the invalidate command is determined
      by the first zero bit in the address starting from Address[12] */
-    if ( order == 9 || order == 18 )
+    if ( order )
     {
-        mask = ((1ULL << (order - 1)) - 1) << PAGE_SHIFT;
-        io_addr |= mask;
-        sflag = 1;
-    }
-
-    /* All pages associated with the domainID are invalidated */
-    else if ( io_addr == 0x7FFFFFFFFFFFF000ULL )
-    {
-        sflag = 1;
-        pde = 1;
+        u64 mask = 1ULL << (order - 1 + PAGE_SHIFT);
+        io_addr &= ~mask;
+        io_addr |= mask - 1;
     }
 
     addr_lo = io_addr & DMA_32BIT_MASK;
@@ -917,7 +918,7 @@ static void _amd_iommu_flush_pages(struc
 
 void amd_iommu_flush_all_pages(struct domain *d)
 {
-    _amd_iommu_flush_pages(d, 0x7FFFFFFFFFFFFULL, 0);
+    _amd_iommu_flush_pages(d, INV_IOMMU_ALL_PAGES_ADDRESS, 0);
 }
 
 void amd_iommu_flush_pages(struct domain *d,
diff -r d422e3cf7976 -r d0c38cb215cd xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 11:02:17 2011 +0100
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 11:03:37 2011 +0100
@@ -407,4 +407,6 @@
 #define INT_REMAP_ENTRY_VECTOR_MASK     0x00FF0000
 #define INT_REMAP_ENTRY_VECTOR_SHIFT    16
 
+#define INV_IOMMU_ALL_PAGES_ADDRESS      0x7FFFFFFFFFFFFFFFULL
+
 #endif /* _ASM_X86_64_AMD_IOMMU_DEFS_H */


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 03:18:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 03:18:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLuNp-0004ph-9h; Thu, 03 Nov 2011 03:18:53 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLuJ0-0003Nz-TM
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 03:13:55 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320315230!2745532!1
X-Originating-IP: [216.32.181.181]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3552 invoked from network); 3 Nov 2011 10:13:51 -0000
Received: from ch1ehsobe001.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.181)
	by server-14.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	3 Nov 2011 10:13:51 -0000
Received: from mail49-ch1-R.bigfish.com (10.43.68.241) by
	CH1EHSOBE001.bigfish.com (10.43.70.51) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 10:13:34 +0000
Received: from mail49-ch1 (localhost.localdomain [127.0.0.1])	by
	mail49-ch1-R.bigfish.com (Postfix) with ESMTP id 82F376283CB;
	Thu,  3 Nov 2011 10:13:43 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzz8275bhz32i668h839h944h)
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
Received: from mail49-ch1 (localhost.localdomain [127.0.0.1]) by mail49-ch1
	(MessageSwitch) id 1320315220755829_14051;
	Thu,  3 Nov 2011 10:13:40 +0000 (UTC)
Received: from CH1EHSMHS023.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.252])	by mail49-ch1.bigfish.com (Postfix) with ESMTP id
	B43811AA004F;	Thu,  3 Nov 2011 10:13:40 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	CH1EHSMHS023.bigfish.com (10.43.70.23) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 10:13:29 +0000
X-WSS-ID: 0LU2XQU-02-4I0-02
X-M-MSG: 
Received: from sausexedgep01.amd.com (sausexedgep01-ext.amd.com
	[163.181.249.72])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 23AC6C8006;	Thu,  3 Nov 2011 05:13:42 -0500 (CDT)
Received: from SAUSEXDAG03.amd.com (163.181.55.3) by sausexedgep01.amd.com
	(163.181.36.54) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Thu, 3 Nov 2011 05:14:21 -0500
Received: from storexhtp01.amd.com (172.24.4.3) by sausexdag03.amd.com
	(163.181.55.3) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Thu, 3 Nov 2011 05:13:43 -0500
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp01.amd.com
	(172.24.4.3) with Microsoft SMTP Server id 8.3.83.0;
	Thu, 3 Nov 2011 06:13:31 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id F18B049C628; Thu,  3 Nov 2011
	10:13:28 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id DDCE7594886; Thu,  3 Nov 2011
	11:13:28 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 7316595e8f47fcf5a106d897f99105a14d7e646c
Message-ID: <7316595e8f47fcf5a106.1320315185@gran.amd.com>
In-Reply-To: <patchbomb.1320315180@gran.amd.com>
References: <patchbomb.1320315180@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Thu, 3 Nov 2011 11:13:05 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Cc: JBeulich@novell.com
Subject: [Xen-devel] [PATCH 5 of 5] amd iommu: enable ats devices
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Wei Wang <wei.wang2@amd.com>
# Date 1320314731 -3600
# Node ID 7316595e8f47fcf5a106d897f99105a14d7e646c
# Parent  c9dcbe6d80a355f1e50ff910d618660a78b40653
amd iommu: enable ats devices

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r c9dcbe6d80a3 -r 7316595e8f47 xen/drivers/passthrough/amd/iommu_map.c
--- a/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 11:04:54 2011 +0100
+++ b/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 11:05:31 2011 +0100
@@ -370,6 +370,17 @@ void amd_iommu_set_root_page_table(
     dte[0] = entry;
 }
 
+void iommu_dte_set_iotlb(u32 *dte, u8 i)
+{
+    u32 entry;
+
+    entry = dte[3];
+    set_field_in_reg_u32(!!i, entry,
+                         IOMMU_DEV_TABLE_IOTLB_SUPPORT_MASK,
+                         IOMMU_DEV_TABLE_IOTLB_SUPPORT_SHIFT, &entry);
+    dte[3] = entry;
+}
+
 void __init amd_iommu_set_intremap_table(
     u32 *dte, u64 intremap_ptr, u8 int_valid)
 {
diff -r c9dcbe6d80a3 -r 7316595e8f47 xen/drivers/passthrough/amd/pci_amd_iommu.c
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c	Thu Nov 03 11:04:54 2011 +0100
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c	Thu Nov 03 11:05:31 2011 +0100
@@ -25,6 +25,7 @@
 #include <asm/hvm/iommu.h>
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
+#include "../ats.h"
 
 struct amd_iommu *find_iommu_for_device(int seg, int bdf)
 {
@@ -86,6 +87,9 @@ static void amd_iommu_setup_domain_devic
     void *dte;
     unsigned long flags;
     int req_id, valid = 1;
+    int dte_i = 0;
+    u8 bus = PCI_BUS(bdf);
+    u8 devfn = PCI_DEVFN2(bdf);
 
     struct hvm_iommu *hd = domain_hvm_iommu(domain);
 
@@ -94,6 +98,9 @@ static void amd_iommu_setup_domain_devic
     if ( iommu_passthrough && (domain->domain_id == 0) )
         valid = 0;
 
+    if ( ats_enabled )
+        dte_i = 1;
+
     /* get device-table entry */
     req_id = get_dma_requestor_id(iommu->seg, bdf);
     dte = iommu->dev_table.buffer + (req_id * IOMMU_DEV_TABLE_ENTRY_SIZE);
@@ -107,6 +114,10 @@ static void amd_iommu_setup_domain_devic
             (u32 *)dte, page_to_maddr(hd->root_table), hd->domain_id,
             hd->paging_mode, valid);
 
+        if ( pci_ats_device(iommu->seg, bus, devfn) &&
+             iommu->iotlb_support )
+            iommu_dte_set_iotlb((u32 *)dte, dte_i);
+
         invalidate_dev_table_entry(iommu, req_id);
         flush_command_buffer(iommu);
 
@@ -118,11 +129,27 @@ static void amd_iommu_setup_domain_devic
     }
 
     spin_unlock_irqrestore(&iommu->lock, flags);
+
+    ASSERT(spin_is_locked(&pcidevs_lock));
+
+    if ( pci_ats_device(iommu->seg, bus, devfn) &&
+         !pci_ats_enabled(iommu->seg, bus, devfn) )
+    {
+        struct pci_dev *pdev;
+
+        enable_ats_device(iommu->seg, bus, devfn);
+
+        ASSERT(spin_is_locked(&pcidevs_lock));
+        pdev = pci_get_pdev(iommu->seg, bus, devfn);
+
+        ASSERT( pdev != NULL );
+        amd_iommu_flush_iotlb(pdev, INV_IOMMU_ALL_PAGES_ADDRESS, 0);
+    }
 }
 
 static void __init amd_iommu_setup_dom0_device(struct pci_dev *pdev)
 {
-    int bdf = (pdev->bus << 8) | pdev->devfn;
+    int bdf = PCI_BDF2(pdev->bus, pdev->devfn);
     struct amd_iommu *iommu = find_iommu_for_device(pdev->seg, bdf);
 
     if ( likely(iommu != NULL) )
@@ -261,12 +288,14 @@ static void __init amd_iommu_dom0_init(s
     setup_dom0_pci_devices(d, amd_iommu_setup_dom0_device);
 }
 
-static void amd_iommu_disable_domain_device(
-    struct domain *domain, struct amd_iommu *iommu, int bdf)
+void amd_iommu_disable_domain_device(struct domain *domain, 
+                                     struct amd_iommu *iommu, int bdf)
 {
     void *dte;
     unsigned long flags;
     int req_id;
+    u8 bus = PCI_BUS(bdf);
+    u8 devfn = PCI_DEVFN2(bdf);
 
     BUG_ON ( iommu->dev_table.buffer == NULL );
     req_id = get_dma_requestor_id(iommu->seg, bdf);
@@ -276,6 +305,11 @@ static void amd_iommu_disable_domain_dev
     if ( is_translation_valid((u32 *)dte) )
     {
         disable_translation((u32 *)dte);
+
+        if ( pci_ats_device(iommu->seg, bus, devfn) &&
+             iommu->iotlb_support )
+            iommu_dte_set_iotlb((u32 *)dte, 0);
+
         invalidate_dev_table_entry(iommu, req_id);
         flush_command_buffer(iommu);
         AMD_IOMMU_DEBUG("Disable: device id = 0x%04x, "
@@ -284,6 +318,12 @@ static void amd_iommu_disable_domain_dev
                         domain_hvm_iommu(domain)->paging_mode);
     }
     spin_unlock_irqrestore(&iommu->lock, flags);
+
+    ASSERT(spin_is_locked(&pcidevs_lock));
+
+    if ( pci_ats_device(iommu->seg, bus, devfn) && 
+         pci_ats_enabled(iommu->seg, bus, devfn) )
+       disable_ats_device(iommu->seg, bus, devfn); 
 }
 
 static int reassign_device( struct domain *source, struct domain *target,
@@ -299,7 +339,7 @@ static int reassign_device( struct domai
     if ( !pdev )
         return -ENODEV;
 
-    bdf = (bus << 8) | devfn;
+    bdf = PCI_BDF2(bus, devfn);
     iommu = find_iommu_for_device(seg, bdf);
     if ( !iommu )
     {
@@ -421,7 +461,7 @@ static int amd_iommu_add_device(struct p
     if ( !pdev->domain )
         return -EINVAL;
 
-    bdf = (pdev->bus << 8) | pdev->devfn;
+    bdf = PCI_BDF2(pdev->bus, pdev->devfn);
     iommu = find_iommu_for_device(pdev->seg, bdf);
     if ( !iommu )
     {
@@ -443,7 +483,7 @@ static int amd_iommu_remove_device(struc
     if ( !pdev->domain )
         return -EINVAL;
 
-    bdf = (pdev->bus << 8) | pdev->devfn;
+    bdf = PCI_BDF2(pdev->bus, pdev->devfn);
     iommu = find_iommu_for_device(pdev->seg, bdf);
     if ( !iommu )
     {
diff -r c9dcbe6d80a3 -r 7316595e8f47 xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Thu Nov 03 11:04:54 2011 +0100
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Thu Nov 03 11:05:31 2011 +0100
@@ -75,6 +75,7 @@ void amd_iommu_set_intremap_table(
     u32 *dte, u64 intremap_ptr, u8 int_valid);
 void amd_iommu_set_root_page_table(
     u32 *dte, u64 root_ptr, u16 domain_id, u8 paging_mode, u8 valid);
+void iommu_dte_set_iotlb(u32 *dte, u8 i);
 void invalidate_dev_table_entry(struct amd_iommu *iommu, u16 devic_id);
 
 /* send cmd to iommu */


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 03:19:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 03:19:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLuOa-0005Cl-Fu; Thu, 03 Nov 2011 03:19:40 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLuJz-0003by-Kt
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 03:14:56 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1320315175!42918096!1
X-Originating-IP: [216.32.181.184]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28748 invoked from network); 3 Nov 2011 10:12:56 -0000
Received: from ch1ehsobe004.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.184)
	by server-14.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	3 Nov 2011 10:12:56 -0000
Received: from mail164-ch1-R.bigfish.com (10.43.68.254) by
	CH1EHSOBE008.bigfish.com (10.43.70.58) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 10:14:35 +0000
Received: from mail164-ch1 (localhost.localdomain [127.0.0.1])	by
	mail164-ch1-R.bigfish.com (Postfix) with ESMTP id 638BC14F01E4;
	Thu,  3 Nov 2011 10:14:44 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzz8275bhz32i668h839h944h)
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
X-FB-SS: 13,
Received: from mail164-ch1 (localhost.localdomain [127.0.0.1]) by mail164-ch1
	(MessageSwitch) id 1320315283828676_11652;
	Thu,  3 Nov 2011 10:14:43 +0000 (UTC)
Received: from CH1EHSMHS028.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.242])	by mail164-ch1.bigfish.com (Postfix) with ESMTP id
	C22C1E38051;	Thu,  3 Nov 2011 10:14:43 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	CH1EHSMHS028.bigfish.com (10.43.70.28) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 10:14:49 +0000
X-WSS-ID: 0LU2XSO-02-4K9-02
X-M-MSG: 
Received: from sausexedgep01.amd.com (sausexedgep01-ext.amd.com
	[163.181.249.72])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 22603C8012;	Thu,  3 Nov 2011 05:14:47 -0500 (CDT)
Received: from SAUSEXDAG01.amd.com (163.181.55.1) by sausexedgep01.amd.com
	(163.181.36.54) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Thu, 3 Nov 2011 05:15:26 -0500
Received: from storexhtp02.amd.com (172.24.4.4) by sausexdag01.amd.com
	(163.181.55.1) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Thu, 3 Nov 2011 05:14:48 -0500
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.83.0;
	Thu, 3 Nov 2011 06:13:29 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id CA47149C626; Thu,  3 Nov 2011
	10:13:28 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id B7528594884; Thu,  3 Nov 2011
	11:13:28 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: c839972486f86a0833595bebae0baa0cd2c0d15e
Message-ID: <c839972486f86a083359.1320315183@gran.amd.com>
In-Reply-To: <patchbomb.1320315180@gran.amd.com>
References: <patchbomb.1320315180@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Thu, 3 Nov 2011 11:13:03 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Cc: JBeulich@novell.com
Subject: [Xen-devel] [PATCH 3 of 5] ats: Add new ATS helper functions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Wei Wang <wei.wang2@amd.com>
# Date 1320314663 -3600
# Node ID c839972486f86a0833595bebae0baa0cd2c0d15e
# Parent  d0c38cb215cd96e01de27eadf5ec0a5e711de448
ats: Add new ATS helper functions

Signed-off-by Wei Wang <wei.wang2@amd.com>

diff -r d0c38cb215cd -r c839972486f8 xen/drivers/passthrough/ats.h
--- a/xen/drivers/passthrough/ats.h	Thu Nov 03 11:03:37 2011 +0100
+++ b/xen/drivers/passthrough/ats.h	Thu Nov 03 11:04:23 2011 +0100
@@ -21,6 +21,8 @@
 #define ATS_QUEUE_DEPTH_MASK     0xF
 #define ATS_ENABLE               (1<<15)
 
+#include <xen/pci_regs.h>
+
 struct pci_ats_dev {
     struct list_head list;
     u16 seg;
@@ -34,6 +36,27 @@ extern bool_t ats_enabled;
 
 int enable_ats_device(int seg, int bus, int devfn);
 void disable_ats_device(int seg, int bus, int devfn);
+struct pci_ats_dev *get_ats_device(int seg, int bus, int devfn);
 
+static inline int pci_ats_enabled(int seg, int bus, int devfn)
+{
+    u32 value;
+    int pos;
+
+    pos = pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
+    BUG_ON(!pos);
+
+    value = pci_conf_read16(seg, bus, PCI_SLOT(devfn),
+                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
+    return value & ATS_ENABLE;
+}
+
+static inline int pci_ats_device(int seg, int bus, int devfn)
+{
+    if ( !ats_enabled )
+        return 0;
+
+    return pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
+}
 #endif /* _ATS_H_ */
 
diff -r d0c38cb215cd -r c839972486f8 xen/drivers/passthrough/x86/ats.c
--- a/xen/drivers/passthrough/x86/ats.c	Thu Nov 03 11:03:37 2011 +0100
+++ b/xen/drivers/passthrough/x86/ats.c	Thu Nov 03 11:04:23 2011 +0100
@@ -137,3 +137,19 @@ void disable_ats_device(int seg, int bus
                 "%04x:%02x:%02x.%u: ATS is disabled\n",
                 seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
 }
+
+struct pci_ats_dev *get_ats_device(int seg, int bus, int devfn)
+{
+    struct pci_ats_dev *pdev;
+
+    if ( !pci_ats_device(seg, bus, devfn) )
+        return NULL;
+
+    list_for_each_entry ( pdev, &ats_devices, list )
+    {
+        if ( pdev->seg == seg && pdev->bus == bus && pdev->devfn == devfn )
+            return pdev;
+    }
+
+    return NULL;
+}


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 03:20:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 03:20:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLuPY-0005bF-S2; Thu, 03 Nov 2011 03:20:40 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLuK1-0003cO-7D
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 03:14:57 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1320315265!55792337!1
X-Originating-IP: [216.32.181.184]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20686 invoked from network); 3 Nov 2011 10:14:26 -0000
Received: from ch1ehsobe004.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.184)
	by server-6.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	3 Nov 2011 10:14:26 -0000
Received: from mail61-ch1-R.bigfish.com (10.43.68.241) by
	CH1EHSOBE008.bigfish.com (10.43.70.58) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 10:14:37 +0000
Received: from mail61-ch1 (localhost.localdomain [127.0.0.1])	by
	mail61-ch1-R.bigfish.com (Postfix) with ESMTP id 4044BB902A9;
	Thu,  3 Nov 2011 10:14:45 +0000 (UTC)
X-SpamScore: -3
X-BigFish: VPS-3(zz4015Lzz1202hzzz32i668h839h944h)
X-Forefront-Antispam-Report: CIP:163.181.249.108; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp01.amd.com; RD:none; EFVD:NLI
X-FB-SS: 0,13,
Received: from mail61-ch1 (localhost.localdomain [127.0.0.1]) by mail61-ch1
	(MessageSwitch) id 1320315285120823_17543;
	Thu,  3 Nov 2011 10:14:45 +0000 (UTC)
Received: from CH1EHSMHS015.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.253])	by mail61-ch1.bigfish.com (Postfix) with ESMTP id
	0FBFEE804F; Thu,  3 Nov 2011 10:14:45 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	CH1EHSMHS015.bigfish.com (10.43.70.15) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 10:14:53 +0000
X-WSS-ID: 0LU2XSO-01-IRS-02
X-M-MSG: 
Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com
	[163.181.249.73])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp01.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 221551028024;	Thu,  3 Nov 2011 05:14:48 -0500 (CDT)
Received: from SAUSEXDAG01.amd.com (163.181.55.1) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Thu, 3 Nov 2011 05:15:26 -0500
Received: from storexhtp02.amd.com (172.24.4.4) by sausexdag01.amd.com
	(163.181.55.1) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Thu, 3 Nov 2011 05:14:48 -0500
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.83.0;
	Thu, 3 Nov 2011 06:13:29 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id A23B949C108; Thu,  3 Nov 2011
	10:13:28 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 899145940FF; Thu,  3 Nov 2011
	11:13:28 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-ID: <patchbomb.1320315180@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Thu, 3 Nov 2011 11:13:00 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Cc: JBeulich@novell.com
Subject: [Xen-devel] [PATCH 0 of 5] amd iommu: Add ATS support (v3)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This patch set enables ats devices on amd systems with following changes:
1) Make vendor independent ATS codes more public.
2) Add additional helper functions for ats.
3) Add amd specific enablement.

Jan, this version should have fixed all issues from my 2nd try. Please check it.

Thanks,
Wei


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 03:41:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 03:41:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLuji-0006Hw-Ay; Thu, 03 Nov 2011 03:41:30 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLuiy-00065T-Ck
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 03:40:44 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1320316837!1797228!1
X-Originating-IP: [213.199.154.205]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15378 invoked from network); 3 Nov 2011 10:40:41 -0000
Received: from am1ehsobe002.messaging.microsoft.com (HELO
	AM1EHSOBE002.bigfish.com) (213.199.154.205)
	by server-10.tower-182.messagelabs.com with AES128-SHA encrypted SMTP;
	3 Nov 2011 10:40:41 -0000
Received: from mail116-am1-R.bigfish.com (10.3.201.254) by
	AM1EHSOBE002.bigfish.com (10.3.204.22) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 10:40:18 +0000
Received: from mail116-am1 (localhost.localdomain [127.0.0.1])	by
	mail116-am1-R.bigfish.com (Postfix) with ESMTP id 7E5CB12802B0;
	Thu,  3 Nov 2011 10:40:27 +0000 (UTC)
X-SpamScore: -14
X-BigFish: VPS-14(zzbb2dK936eK1432N98dKzz1202hzz8275dhz32i668h839h61h)
X-Spam-TCS-SCL: 0:0
X-Forefront-Antispam-Report: CIP:163.181.249.108; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp01.amd.com; RD:none; EFVD:NLI
X-FB-SS: 0,
Received: from mail116-am1 (localhost.localdomain [127.0.0.1]) by mail116-am1
	(MessageSwitch) id 1320316826599176_14452;
	Thu,  3 Nov 2011 10:40:26 +0000 (UTC)
Received: from AM1EHSMHS013.bigfish.com (unknown [10.3.201.252])	by
	mail116-am1.bigfish.com (Postfix) with ESMTP id 82A501950052;
	Thu,  3 Nov 2011 10:40:26 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	AM1EHSMHS013.bigfish.com (10.3.207.151) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 10:40:15 +0000
X-WSS-ID: 0LU2YZG-01-K14-02
X-M-MSG: 
Received: from sausexedgep01.amd.com (sausexedgep01-ext.amd.com
	[163.181.249.72])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp01.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 230CE1028025;	Thu,  3 Nov 2011 05:40:28 -0500 (CDT)
Received: from sausexhtp01.amd.com (163.181.3.165) by sausexedgep01.amd.com
	(163.181.36.54) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Thu, 3 Nov 2011 05:41:07 -0500
Received: from storexhtp01.amd.com (172.24.4.3) by sausexhtp01.amd.com
	(163.181.3.165) with Microsoft SMTP Server (TLS) id 8.3.83.0;
	Thu, 3 Nov 2011 05:40:28 -0500
Received: from rhodium.osrc.amd.com (165.204.15.173) by storexhtp01.amd.com
	(172.24.4.3) with Microsoft SMTP Server id 8.3.83.0;
	Thu, 3 Nov 2011 06:40:28 -0400
Message-ID: <4EB26F99.6050205@amd.com>
Date: Thu, 3 Nov 2011 11:40:25 +0100
From: Christoph Egger <Christoph.Egger@amd.com>
User-Agent: Mozilla/5.0 (X11; NetBSD amd64;
	rv:6.0.1) Gecko/20111102 Thunderbird/6.0.1
MIME-Version: 1.0
To: Anil Madhavapeddy <anil@recoil.org>
Subject: Re: [Xen-devel] [PATCH RFC v2 03/13] libxl: Provide a version of
	bsd's queue.h as _libxl_list.h
References: <1319827031-15395-1-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-2-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-3-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-4-git-send-email-ian.jackson@eu.citrix.com>
	<1320054210.23193.23.camel@zakaz.uk.xensource.com>
	<63525D85-B6C7-480F-853B-4980BC1B612F@recoil.org>
In-Reply-To: <63525D85-B6C7-480F-853B-4980BC1B612F@recoil.org>
Content-Type: text/plain; charset="ISO-8859-1"; format=flowed
Content-Transfer-Encoding: 7bit
X-OriginatorOrg: amd.com
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>,
	Ian Campbell <Ian.Campbell@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/02/11 18:28, Anil Madhavapeddy wrote:
> On 31 Oct 2011, at 09:43, Ian Campbell wrote:
>
>> On Fri, 2011-10-28 at 19:37 +0100, Ian Jackson wrote:
>>> @@ -18,6 +18,14 @@ GPLv2. See the FSF's definition of GPL compatibility:
>>> And how this applies to a range of open source licenses:
>>>   http://www.gnu.org/licenses/license-list.html
>>>
>>> +Additionally, the documentation file tools/libxl/external/bsd-queue.3
>>> +has the 4-clause BSD licence.  It is present in the Xen source tree
>>> +for reference purposes for people developing Xen.  It is not installed
>>> +by "make install" and is bundled in the source only for convenience of
>>> +distribution.  We do not intend that we or Xen users or distributors
>>> +should make any reference to "features or use" of that manpage.
>>
>> Anil pointed to the OpenBSD version of this page which has that clause
>> removed. It would simplify things to use their version (of the header
>> too for consistency)?  We are probably not comfortable with just
>> rescinding the clause ourselves?
>
> If you rescind it yourself, you'll need to go through the FreeBSD CVS history
 > to make sure that there were no other contributors other than 
Berkeley. OpenBSD
> already did that in 2002 (and subsequent patches take on the new license, so it doesn't matter).

According to cvs history both NetBSD and OpenBSD did that in 2003. Now
it's just about to compare whose content matches most with FreeBSD's
implementation. :)

Christoph

-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 05:26:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 05:26:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLwNP-0001NJ-VV; Thu, 03 Nov 2011 05:26:36 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLwMl-0001Ao-1B
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 05:25:55 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-7.tower-27.messagelabs.com!1320323116!55412494!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6673 invoked from network); 3 Nov 2011 12:25:16 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-7.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 12:25:16 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RLwMg-000I44-7r; Thu, 03 Nov 2011 12:25:50 +0000
Date: Thu, 3 Nov 2011 12:25:50 +0000
From: Tim Deegan <tim@xen.org>
To: Christoph Egger <Christoph.Egger@amd.com>
Subject: Re: [Xen-devel] [PATCH] xen: provide pse36 cpuid bit
Message-ID: <20111103122550.GA66800@ocelot.phlegethon.org>
References: <CACF3788.3340E%keir@xen.org> <4EAABA23.1000500@amd.com>
	<20111028145316.GC91085@ocelot.phlegethon.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <20111028145316.GC91085@ocelot.phlegethon.org>
User-Agent: Mutt/1.4.2.1i
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Keir Fraser <keir@xen.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 15:53 +0100 on 28 Oct (1319817196), Tim Deegan wrote:
> At 16:20 +0200 on 28 Oct (1319818819), Christoph Egger wrote:
> > On 10/27/11 17:30, Keir Fraser wrote:
> > >On 27/10/2011 16:15, "Tim Deegan"<tim@xen.org>  wrote:
> > >
> > >>If you mean this:
> > >>
> > >>  * PSE disabled / PSE36
> > >>  * We don't support any modes other than PSE enabled, PSE36 disabled.
> > >>  * Neither of those would be hard to change, but we'd need to be able to
> > >>  * deal with shadows made in one mode and used in another.
> > >>
> > >>the worry was that we'd need a whole nother shadow mode to handle the
> > >>case where one VCPU was in normal 32-bit and another was in PSE36 (since
> > >>they can't share shadows).
> > >>
> > >>As it happens the current code does detect PSE-disabled in shadow mode
> > >>but just DTRT for the current VCPU, so a mix of PSE-enabled and
> > >>PSE-disabled VCPUs will get unpredicatble results from shadow
> > >>pagetables. :(
> > >>
> > >>Which means that supporting PSE36 to the same degree (i.e. assuming all
> > >>VCPUs behave the same, or if they don't they don't share pagetables)
> > >>would be OK too. :)
> > >
> > >Ah, I see. Yes, I guessed it would be supported to just the same degree as
> > >'basic' PSE. The likelihood of pagetables being shared across different
> > >pagetable-related CR4 settings? Not great, we hope. :-)
> > 
> > Is the patch acceptable as it is ? 
> 
> I'll put together a patch with basic PSE36 support next week.  I don't
> think we're in a terrible hurry to check in the CPUID change before then.

Supporting PSE36 turned out to be trickier than I had thought - the
trick in the guest-pagetable walker of making up an l1e with the
equivalent semantics to the PSE l2e doesn't work for PSE36 because there
isn't space for the extra address bits in a 32bit l1e. :(  I didn't fancy
changing that interface right now because it would need a fair bit of
fixing up in the shadow code, but I might come back to it when I have
more time. 

In the meantime I've applied Christoph's patch.

Cheers,

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 05:45:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 05:45:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLwfo-00024O-5e; Thu, 03 Nov 2011 05:45:36 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLwet-0001rk-Oc
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 05:44:40 -0700
X-Env-Sender: imammedo@redhat.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1320324275!2808210!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23608 invoked from network); 3 Nov 2011 12:44:36 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-7.tower-21.messagelabs.com with SMTP;
	3 Nov 2011 12:44:36 -0000
Received: from int-mx01.intmail.prod.int.phx2.redhat.com
	(int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id pA3CiWHL006065
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 3 Nov 2011 08:44:32 -0400
Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199])
	by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id pA3CiVcM023819; Thu, 3 Nov 2011 08:44:31 -0400
Received: from nial.usersys.redhat.com (vpn-10-197.rdu.redhat.com
	[10.11.10.197])
	by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id pA3CiTIp009152;
	Thu, 3 Nov 2011 08:44:29 -0400
Message-ID: <4EB28CAD.2060401@redhat.com>
Date: Thu, 03 Nov 2011 13:44:29 +0100
From: Igor Mammedov <imammedo@redhat.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110927 Red Hat/3.1.15-1.el6_1 Lightning/1.0b2
	Thunderbird/3.1.15
MIME-Version: 1.0
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11
Cc: anthony.perard@citrix.com, jinsong.liu@intel.com, Ian.Campbell@citrix.com
Subject: [Xen-devel] xen-unstable fails to boot on a system with Ivy Bridge
 stepping C0 cpu
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi,

I need a help with tracking down following issue:

When trying to boot Xen on a system with Ivy Bridge stepping C0 CPU, it is stuck on CPU initialization.
I've added some tracing to apic writes/reads and traced it so far to sending INIT IPI.

(XEN) HVM: VMX enabled
(XEN) HVM: Hardware Assisted Paging detected.
(XEN) Setting warm reset code and vector.
(XEN) apic_wrmsr (0x280,0x0)
(XEN) apic_rdmsr(0x280) = 0x0
(XEN) Asserting INIT.
(XEN) apic_wrmsr (0x300,0x10000c500)

After this ^^^^ write BSP becomes VERY slow and it takes several minutes
till it gets to sending STARTUP IPI:

(XEN) Sending STARTUP #1.
(XEN) apic_wrmsr (0x280,0x0)
(XEN) apic_rdmsr(0x280) = 0x0
(XEN) After apic_write.
(XEN) apic_wrmsr (0x300,0x10000067c)
After this ^^^^^ BSP restores its normal speed until it sends the next INIT IPI
for the next core.

Eventually it hangs on initializing one of the next CPUs, at least this far it
progressed on overnight boot test. However a bare-metal kernel boots without this
issue, even with pretty ancient versions (I've tried up to 2.6.12).

So question is: what xen is missing in cpu initialization that kernel has?

I've run out of ideas what to check.
Any ideas how to track down and fix issue are welcome. I'm willing to try them out
while I can get access to system.

Full boot log is bellow.

PS:
I've seen a similar issue on HP Z820 ("sandy bridge" cpu) system, with the only
difference that each CPU initialization took 30-60 seconds and system
eventually booted.

-- 
Thanks,
  Igor

-----------
(XEN) Xen version 4.2-unstable () (gcc version 4.1.2 20080704 (Red Hat 4.1.2-51)) Wed Nov  2 10:39:29 CET 
2011******************************************************************
(XEN) Latest ChangeSet: Tue Nov 01 19:03:38 2011 +0000 24050:068d3d55ce6e
(XEN) Console output is synchronous.ed OS, 'e' to edit the
(XEN) Bootloader: GNU GRUB 0.97'a' to modify the kernel arguments
(XEN) Command line: loglvl=all guest_loglvl=all com1=115200,8n1 console=com1 sync_console apic_verbosity=debug
(XEN) Video information:
(XEN)  VGA is text mode 80x25, font 8x16
(XEN)  VBE/DDC methods: none; EDID transfer time: 0 seconds
(XEN)  EDID info not retrieved because no DDC retrieval method detected
(XEN) Disc information:
(XEN)  Found 1 MBR signatures
(XEN)  Found 1 EDD information structures
(XEN) Xen-e820 RAM map:
(XEN)  0000000000000000 - 000000000009ac00 (usable)
(XEN)  000000000009ac00 - 00000000000a0000 (reserved)
(XEN)  00000000000e0000 - 0000000000100000 (reserved)
(XEN)  0000000000100000 - 00000000ad7f2000 (usable)
(XEN)  00000000ad7f2000 - 00000000ad7f8000 (reserved)
(XEN)  00000000ad7f8000 - 00000000aefe9000 (usable)
(XEN)  00000000aefe9000 - 00000000af57a000 (reserved)
(XEN)  00000000af57a000 - 00000000af7fa000 (ACPI NVS)
(XEN)  00000000af7fa000 - 00000000af7ff000 (ACPI data)
(XEN)  00000000af7ff000 - 00000000af800000 (usable)
(XEN)  00000000af800000 - 00000000b0000000 (reserved)
(XEN)  00000000f8000000 - 00000000fc000000 (reserved)
(XEN)  00000000fec00000 - 00000000fec01000 (reserved)
(XEN)  00000000fed10000 - 00000000fed14000 (reserved)
(XEN)  00000000fed18000 - 00000000fed1a000 (reserved)
(XEN)  00000000fed1c000 - 00000000fed20000 (reserved)
(XEN)  00000000fee00000 - 00000000fee01000 (reserved)
(XEN)  00000000ff900000 - 00000000ffc00000 (reserved)
(XEN)  00000000ffd00000 - 0000000100000000 (reserved)
(XEN)  0000000100000000 - 000000014e000000 (usable)
(XEN) ACPI: RSDP 000F0410, 0024 (r2  INTEL)
(XEN) ACPI: XSDT AF7FDE18, 0074 (r1  INTEL  IVB-PPT  6222004 MSFT    10013)
(XEN) ACPI: FACP AF7E3D98, 00F4 (r4  INTEL  IVB-PPT  6222004 MSFT    10013)
(XEN) ACPI: DSDT AF7C3018, F800 (r2  INTEL  IVB-PPT        0 INTL 20110623)
(XEN) ACPI: FACS AF7F9E40, 0040
(XEN) ACPI: APIC AF7FCF18, 00CC (r2  INTEL  IVB-PPT  6222004 MSFT    10013)
(XEN) ACPI: HPET AF7F8F18, 0038 (r1 A M I   PCHHPET  6222004 AMI.        3)
(XEN) ACPI: SSDT AF7E5018, 10A8 (r1 TrmRef PtidDevc     1000 INTL 20110623)
(XEN) ACPI: SSDT AF7E4918, 0411 (r1    AMI PerfTune     1000 INTL 20110623)
(XEN) ACPI: MCFG AF7F8E98, 003C (r1 INTEL  SNDYBRDG  6222004 MSFT       97)
(XEN) ACPI: SSDT AF7F7018, 08CA (r1  PmRef  Cpu0Ist     3000 INTL 20110623)
(XEN) ACPI: SSDT AF7F6018, 0A2C (r1  PmRef    CpuPm     3000 INTL 20110623)
(XEN) ACPI: DMAR AF7F9B18, 00B0 (r1 INTEL      SNB         1 INTL        1)
(XEN) ACPI: SPCR AF7F8D18, 0050 (r1 A M I    APTIO  6222004 AMI.        3)
(XEN) System RAM: 4047MB (4144632kB)
(XEN) No NUMA configuration found
(XEN) Faking a node at 0000000000000000-000000014e000000
(XEN) Domain heap initialised
(XEN) found SMP MP-table at 000fca30
(XEN) DMI 2.6 present.
(XEN) APIC boot state is 'xapic'
(XEN) Using APIC driver default
(XEN) ACPI: PM-Timer IO Port: 0x408
(XEN) ACPI: ACPI SLEEP INFO: pm1x_cnt[404,0], pm1x_evt[400,0]
(XEN) ACPI: 32/64X FACS address mismatch in FADT - af7f9e40/0000000000000000, using 32
(XEN) ACPI:                  wakeup_vec[af7f9e4c], vec_size[20]
(XEN) ACPI: Local APIC address 0xfee00000
(XEN) apic_mem_read(0x20) = 0x0
(XEN) ACPI: LAPIC (acpi_id[0x01] lapic_id[0x00] enabled)
(XEN) apic_mem_read(0x30) = 0x1060015
(XEN) Processor #0 7:10 APIC version 21
(XEN) ACPI: LAPIC (acpi_id[0x02] lapic_id[0x01] enabled)
(XEN) apic_mem_read(0x30) = 0x1060015
(XEN) Processor #1 7:10 APIC version 21
(XEN) ACPI: LAPIC (acpi_id[0x03] lapic_id[0x02] enabled)
(XEN) apic_mem_read(0x30) = 0x1060015
(XEN) Processor #2 7:10 APIC version 21
(XEN) ACPI: LAPIC (acpi_id[0x04] lapic_id[0x03] enabled)
(XEN) apic_mem_read(0x30) = 0x1060015
(XEN) Processor #3 7:10 APIC version 21
(XEN) ACPI: LAPIC (acpi_id[0x05] lapic_id[0x04] enabled)
(XEN) apic_mem_read(0x30) = 0x1060015
(XEN) Processor #4 7:10 APIC version 21
(XEN) ACPI: LAPIC (acpi_id[0x06] lapic_id[0x05] enabled)
(XEN) apic_mem_read(0x30) = 0x1060015
(XEN) Processor #5 7:10 APIC version 21
(XEN) ACPI: LAPIC (acpi_id[0x07] lapic_id[0x06] enabled)
(XEN) apic_mem_read(0x30) = 0x1060015
(XEN) Processor #6 7:10 APIC version 21
(XEN) ACPI: LAPIC (acpi_id[0x08] lapic_id[0x07] enabled)
(XEN) apic_mem_read(0x30) = 0x1060015
(XEN) Processor #7 7:10 APIC version 21
(XEN) ACPI: LAPIC (acpi_id[0x09] lapic_id[0x08] disabled)
(XEN) apic_mem_read(0x30) = 0x1060015
(XEN) ACPI: LAPIC (acpi_id[0x0a] lapic_id[0x09] disabled)
(XEN) apic_mem_read(0x30) = 0x1060015
(XEN) ACPI: LAPIC (acpi_id[0x0b] lapic_id[0x0a] disabled)
(XEN) apic_mem_read(0x30) = 0x1060015
(XEN) ACPI: LAPIC (acpi_id[0x0c] lapic_id[0x0b] disabled)
(XEN) apic_mem_read(0x30) = 0x1060015
(XEN) ACPI: LAPIC (acpi_id[0x0d] lapic_id[0x0c] disabled)
(XEN) apic_mem_read(0x30) = 0x1060015
(XEN) ACPI: LAPIC (acpi_id[0x0e] lapic_id[0x0d] disabled)
(XEN) apic_mem_read(0x30) = 0x1060015
(XEN) ACPI: LAPIC (acpi_id[0x0f] lapic_id[0x0e] disabled)
(XEN) apic_mem_read(0x30) = 0x1060015
(XEN) ACPI: LAPIC (acpi_id[0x10] lapic_id[0x0f] disabled)
(XEN) apic_mem_read(0x30) = 0x1060015
(XEN) ACPI: IOAPIC (id[0x02] address[0xfec00000] gsi_base[0])
(XEN) IOAPIC[0]: apic_id 2, version 32, address 0xfec00000, GSI 0-23
(XEN) ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
(XEN) ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
(XEN) ACPI: IRQ0 used by override.
(XEN) ACPI: IRQ2 used by override.
(XEN) ACPI: IRQ9 used by override.
(XEN) Enabling APIC mode:  Flat.  Using 1 I/O APICs
(XEN) ACPI: HPET id: 0x8086a701 base: 0xfed00000
(XEN) Table is not found!
(XEN) Using ACPI (MADT) for SMP configuration information
(XEN) SMP: Allowing 16 CPUs (8 hotplug CPUs)
(XEN) mapped APIC to ffff82c3ffdfe000 (fee00000)
(XEN) apic_mem_read(0x20) = 0x0
(XEN) apic_mem_read(0xd0) = 0x0
(XEN) mapped IOAPIC to ffff82c3ffdfd000 (fec00000)
(XEN) IRQ limits: 24 GSI, 1528 MSI/MSI-X
(XEN) Switched to APIC driver x2apic_cluster.
(XEN) Using scheduler: SMP Credit Scheduler (credit)
(XEN) Detected 2294.841 MHz processor.
(XEN) Initing memory sharing.
(XEN) apic_rdmsr(0x20) = 0x0
(XEN) apic_rdmsr(0x20) = 0x0
(XEN) apic_rdmsr(0x20) = 0x0
(XEN) xstate_init: using cntxt_size: 0x340 and states: 0x7
(XEN) apic_rdmsr(0x330) = 0x10000
(XEN) mce_intel.c:1219: MCA Capability: BCAST 1 SER 0 CMCI 1 firstbank 0 extended MCE MSR 0
(XEN) apic_rdmsr(0x2f0) = 0x10000
(XEN) apic_wrmsr (0x2f0,0x100f7)
(XEN) apic_rdmsr(0x2f0) = 0x100f7
(XEN) apic_wrmsr (0x2f0,0xf7)
(XEN) apic_wrmsr (0x330,0x100fa)
(XEN) apic_wrmsr (0x330,0xfa)
(XEN) Intel machine check reporting enabled
(XEN) PCI: MCFG configuration 0: base f8000000 segment 0000 buses 00 - 3f
(XEN) PCI: MCFG area at f8000000 reserved in E820
(XEN) PCI: Using MCFG for segment 0000 bus 00-3f
(XEN) Intel VT-d Snoop Control enabled.
(XEN) Intel VT-d Dom0 DMA Passthrough not enabled.
(XEN) Intel VT-d Queued Invalidation enabled.
(XEN) Intel VT-d Interrupt Remapping enabled.
(XEN) Intel VT-d Shared EPT tables not enabled.
(XEN) I/O virtualisation enabled
(XEN)  - Dom0 mode: Relaxed
(XEN) apic_rdmsr(0x20) = 0x0
(XEN) apic_rdmsr(0x30) = 0x1060015
(XEN) Getting VERSION: 1060015
(XEN) apic_rdmsr(0x30) = 0x1060015
(XEN) Getting VERSION: 1060015
(XEN) apic_rdmsr(0x30) = 0x1060015
(XEN) Enabled directed EOI with ioapic_ack_old on!
(XEN) apic_rdmsr(0x20) = 0x0
(XEN) Getting ID: 0
(XEN) apic_rdmsr(0x350) = 0x700
(XEN) Getting LVT0: 700
(XEN) apic_rdmsr(0x360) = 0x400
(XEN) Getting LVT1: 400
(XEN) apic_rdmsr(0x30) = 0x1060015
(XEN) apic_rdmsr(0x20) = 0x0
(XEN) apic_rdmsr(0xd0) = 0x1
(XEN) apic_wrmsr (0x80,0x10)
(XEN) apic_rdmsr(0x170) = 0x0
(XEN) apic_rdmsr(0x160) = 0x0
(XEN) apic_rdmsr(0x150) = 0x0
(XEN) apic_rdmsr(0x140) = 0x0
(XEN) apic_rdmsr(0x130) = 0x0
(XEN) apic_rdmsr(0x120) = 0x0
(XEN) apic_rdmsr(0x110) = 0x0
(XEN) apic_rdmsr(0x100) = 0x0
(XEN) apic_rdmsr(0xf0) = 0x10f
(XEN) Suppress EOI broadcast on CPU#0
(XEN) apic_wrmsr (0xf0,0x11ff)
(XEN) apic_rdmsr(0x350) = 0x700
(XEN) enabled ExtINT on CPU#0
(XEN) apic_wrmsr (0x350,0x700)
(XEN) apic_wrmsr (0x360,0x400)
(XEN) apic_rdmsr(0x30) = 0x1060015
(XEN) apic_wrmsr (0x280,0x0)
(XEN) apic_rdmsr(0x280) = 0x0
(XEN) apic_wrmsr (0x370,0xfe)
(XEN) apic_wrmsr (0x280,0x0)
(XEN) apic_rdmsr(0x280) = 0x0
(XEN) apic_rdmsr(0xd0) = 0x1
(XEN) ENABLING IO-APIC IRQs
(XEN)  -> Using old ACK method
(XEN) apic_rdmsr(0x30) = 0x1060015
(XEN) init IO_APIC IRQs
(XEN)  IO-APIC (apicid-pin) 2-0, 2-16, 2-17, 2-18, 2-19, 2-20, 2-21, 2-22, 2-23 not connected.
(XEN) apic_wrmsr (0x350,0x10700)
(XEN) ..TIMER: vector=0xF0 apic1=0 pin1=2 apic2=-1 pin2=-1
(XEN) number of MP IRQ sources: 15.
(XEN) number of IO-APIC #2 registers: 24.
(XEN) testing the IO APIC.......................
(XEN) IO APIC #2......
(XEN) .... register #00: 02000000
(XEN) .......    : physical APIC id: 02
(XEN) .......    : Delivery Type: 0
(XEN) .......    : LTS          : 0
(XEN) apic_rdmsr(0x30) = 0x1060015
(XEN) .... register #01: 00170020
(XEN) .......     : max redirection entries: 0017
(XEN) .......     : PRQ implemented: 0
(XEN) .......     : IO APIC version: 0020
(XEN) .... IRQ redirection table:
(XEN)  NR Log Phy Mask Trig IRR Pol Stat Dest Deli Vect:
(XEN)  00 000 00  1    0    0   0   0    0    0    00
(XEN)  01 000 00  0    0    0   0   0    1    1    30
(XEN)  02 000 00  0    0    0   0   0    1    1    F0
(XEN)  03 000 00  0    0    0   0   0    1    1    38
(XEN)  04 000 00  0    0    0   0   0    1    1    F1
(XEN)  05 000 00  0    0    0   0   0    1    1    40
(XEN)  06 000 00  0    0    0   0   0    1    1    48
(XEN)  07 000 00  0    0    0   0   0    1    1    50
(XEN)  08 000 00  1    0    0   0   0    1    1    58
(XEN)  09 000 00  1    1    0   0   0    1    1    60
(XEN)  0a 000 00  0    0    0   0   0    1    1    68
(XEN)  0b 000 00  0    0    0   0   0    1    1    70
(XEN)  0c 000 00  0    0    0   0   0    1    1    78
(XEN)  0d 000 00  0    0    0   0   0    1    1    88
(XEN)  0e 000 00  0    0    0   0   0    1    1    90
(XEN)  0f 000 00  0    0    0   0   0    1    1    98
(XEN)  10 000 00  1    0    0   0   0    0    0    00
(XEN)  11 000 00  1    0    0   0   0    0    0    00
(XEN)  12 000 00  1    0    0   0   0    0    0    00
(XEN)  13 000 00  1    0    0   0   0    0    0    00
(XEN)  14 000 00  1    0    0   0   0    0    0    00
(XEN)  15 000 00  1    0    0   0   0    0    0    00
(XEN)  16 000 00  1    0    0   0   0    0    0    00
(XEN)  17 000 00  1    0    0   0   0    0    0    00
(XEN) Using vector-based indexing
(XEN) IRQ to pin mappings:
(XEN) IRQ240 -> 0:2
(XEN) IRQ48 -> 0:1
(XEN) IRQ56 -> 0:3
(XEN) IRQ241 -> 0:4
(XEN) IRQ64 -> 0:5
(XEN) IRQ72 -> 0:6
(XEN) IRQ80 -> 0:7
(XEN) IRQ88 -> 0:8
(XEN) IRQ96 -> 0:9
(XEN) IRQ104 -> 0:10
(XEN) IRQ112 -> 0:11
(XEN) IRQ120 -> 0:12
(XEN) IRQ136 -> 0:13
(XEN) IRQ144 -> 0:14
(XEN) IRQ152 -> 0:15
(XEN) .................................... done.
(XEN) Using local APIC timer interrupts.
(XEN) calibrating APIC timer ...
(XEN) apic_rdmsr(0x30) = 0x1060015
(XEN) apic_wrmsr (0x320,0xf9)
(XEN) apic_rdmsr(0x3e0) = 0x0
(XEN) apic_wrmsr (0x3e0,0xb)
(XEN) apic_wrmsr (0x380,0x3b9aca00)
(XEN) apic_rdmsr(0x390) = 0x3b8c6ca4
(XEN) apic_rdmsr(0x390) = 0x3af42d71
(XEN) ..... CPU clock speed is 2367.0331 MHz.
(XEN) ..... host bus clock speed is 99.7765 MHz.
(XEN) ..... bus_scale = 0x0000662C
(XEN) apic_rdmsr(0x30) = 0x1060015
(XEN) apic_wrmsr (0x320,0xf9)
(XEN) apic_rdmsr(0x3e0) = 0xb
(XEN) apic_wrmsr (0x3e0,0xb)
(XEN) apic_wrmsr (0x380,0x0)
(XEN) TSC deadline timer enabled
(XEN) apic_rdmsr(0x30) = 0x1060015
(XEN) apic_wrmsr (0x320,0x400f9)
(XEN) apic_rdmsr(0x3e0) = 0xb
(XEN) apic_wrmsr (0x3e0,0xb)
(XEN) apic_wrmsr (0x380,0x0)
(XEN) Platform timer is 14.318MHz HPET
(XEN) Allocated console ring of 64 KiB.
(XEN) VMX: Supported advanced features:
(XEN)  - APIC MMIO access virtualisation
(XEN)  - APIC TPR shadow
(XEN)  - Extended Page Tables (EPT)
(XEN)  - Virtual-Processor Identifiers (VPID)
(XEN)  - Virtual NMI
(XEN)  - MSR direct-access bitmap
(XEN)  - Unrestricted Guest
(XEN) EPT supports 2MB super page.
(XEN) HVM: ASIDs enabled.
(XEN) HVM: VMX enabled
(XEN) HVM: Hardware Assisted Paging detected.
(XEN) Setting warm reset code and vector.
(XEN) apic_wrmsr (0x280,0x0)
(XEN) apic_rdmsr(0x280) = 0x0
(XEN) Asserting INIT.
(XEN) apic_wrmsr (0x300,0x10000c500)
(XEN) #startup loops: 2.
(XEN) apic_rdmsr(0x30) = 0x1060015
(XEN) Sending STARTUP #1.
(XEN) apic_wrmsr (0x280,0x0)
(XEN) apic_rdmsr(0x280) = 0x0
(XEN) After apic_write.
(XEN) apic_wrmsr (0x300,0x10000067c)
(XEN) apic_wrmsr (0x280,0x0)
(XEN) apic_rdmsr(0x280) = 0x0
(XEN) Sending STARTUP #2.
(XEN) apic_wrmsr (0x280,0x0)
(XEN) apic_rdmsr(0x280) = 0x0
(XEN) After apic_write.
(XEN) apic_wrmsr (0x300,0x10000067c)
(XEN) apic_wrmsr (0x280,0x0)
(XEN) apic_rdmsr(0x280) = 0x0
(XEN) After Startup.
(XEN) After Callout 1.
(XEN) Waiting for CALLOUT.
(XEN) CALLIN, before setup_local_APIC().
(XEN) apic_rdmsr(0x30) = 0x1060015
(XEN) apic_rdmsr(0x20) = 0x1
(XEN) apic_rdmsr(0xd0) = 0x2
(XEN) apic_wrmsr (0x80,0x10)
(XEN) apic_rdmsr(0x170) = 0x0
(XEN) apic_rdmsr(0x160) = 0x0
(XEN) apic_rdmsr(0x150) = 0x0
(XEN) apic_rdmsr(0x140) = 0x0
(XEN) apic_rdmsr(0x130) = 0x0
(XEN) apic_rdmsr(0x120) = 0x0
(XEN) apic_rdmsr(0x110) = 0x0
(XEN) apic_rdmsr(0x100) = 0x0
(XEN) apic_rdmsr(0xf0) = 0xff
(XEN) Suppress EOI broadcast on CPU#1
(XEN) apic_wrmsr (0xf0,0x11ff)
(XEN) apic_rdmsr(0x350) = 0x10000
(XEN) masked ExtINT on CPU#1
(XEN) apic_wrmsr (0x350,0x10700)
(XEN) apic_wrmsr (0x360,0x10400)
(XEN) apic_rdmsr(0x30) = 0x1060015
(XEN) apic_wrmsr (0x280,0x0)
(XEN) apic_rdmsr(0x280) = 0x0
(XEN) apic_wrmsr (0x370,0xfe)
(XEN) apic_wrmsr (0x280,0x0)
(XEN) apic_rdmsr(0x280) = 0x0
(XEN) apic_rdmsr(0xd0) = 0x2
(XEN) apic_rdmsr(0x20) = 0x1
(XEN) apic_rdmsr(0x20) = 0x1
(XEN) apic_rdmsr(0x20) = 0x1
(XEN) apic_rdmsr(0x2f0) = 0x10000
(XEN) apic_wrmsr (0x2f0,0x100f7)
(XEN) apic_rdmsr(0x2f0) = 0x100f7
(XEN) apic_wrmsr (0x2f0,0xf7)
(XEN) apic_wrmsr (0x330,0x100fa)
(XEN) apic_wrmsr (0x330,0xfa)
(XEN) OK.
(XEN) CPU has booted.
(XEN) apic_rdmsr(0x30) = 0x1060015
(XEN) apic_wrmsr (0x320,0x400f9)
(XEN) apic_rdmsr(0x3e0) = 0x0
(XEN) apic_wrmsr (0x3e0,0xb)
(XEN) apic_wrmsr (0x380,0x0)
(XEN) apic_wrmsr (0x300,0x2000008fd)
(XEN) apic_wrmsr (0x300,0x2000008fd)
(XEN) Setting warm reset code and vector.
(XEN) apic_wrmsr (0x280,0x0)
(XEN) apic_rdmsr(0x280) = 0x0
(XEN) Asserting INIT.
(XEN) apic_wrmsr (0x300,0x20000c500)
(XEN) #startup loops: 2.
(XEN) apic_rdmsr(0x30) = 0x1060015
(XEN) Sending STARTUP #1.
(XEN) apic_wrmsr (0x280,0x0)


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 05:47:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 05:47:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLwhS-0002SY-07; Thu, 03 Nov 2011 05:47:18 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLwgj-0002Fo-PR
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 05:46:34 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1320324390!1828222!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6416 invoked from network); 3 Nov 2011 12:46:30 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-2.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 12:46:30 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 03 Nov 2011 12:46:30 +0000
Message-Id: <4EB29B32020000780005EB52@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 03 Nov 2011 12:46:26 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Wang" <wei.wang2@amd.com>
References: <patchbomb.1320315180@gran.amd.com>
	<d422e3cf7976c76c57fc.1320315181@gran.amd.com>
In-Reply-To: <d422e3cf7976c76c57fc.1320315181@gran.amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: [PATCH 1 of 5] ats: Move some ats functions to a new
	directory
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 03.11.11 at 11:13, Wei Wang <wei.wang2@amd.com> wrote:
> # HG changeset patch
> # User Wei Wang <wei.wang2@amd.com>
> # Date 1320314537 -3600
> # Node ID d422e3cf7976c76c57fc2d455b784d0fcc24d06b
> # Parent  119bccb1cc5eee1364bbbd3bd1a30f22e9db703a
> ats: Move some ats functions to a new directory.
> Remove VTD prefix from debug output.
> passhrough/x86 holds vendor neutral codes for x86 architecture.
>=20
> Signed-off-by: Wei Wang <wei.wang2@amd.com>
>=20
> diff -r 119bccb1cc5e -r d422e3cf7976 xen/drivers/passthrough/Makefile
> --- a/xen/drivers/passthrough/Makefile	Wed Nov 02 13:53:05 2011 =
+0100
> +++ b/xen/drivers/passthrough/Makefile	Thu Nov 03 11:02:17 2011 =
+0100
> @@ -1,6 +1,7 @@
>  subdir-$(x86) +=3D vtd
>  subdir-$(ia64) +=3D vtd
>  subdir-$(x86) +=3D amd
> +subdir-$(x86) +=3D x86
> =20
>  obj-y +=3D iommu.o
>  obj-y +=3D io.o
> diff -r 119bccb1cc5e -r d422e3cf7976 xen/drivers/passthrough/ats.h
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/xen/drivers/passthrough/ats.h	Thu Nov 03 11:02:17 2011 +0100
> @@ -0,0 +1,39 @@
> +/*
> + * This program is free software; you can redistribute it and/or modify =
it
> + * under the terms and conditions of the GNU General Public License,
> + * version 2, as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope it will be useful, but =
WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY =
or
> + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public =
License=20
> for
> + * more details.
> + *
> + * You should have received a copy of the GNU General Public License =
along=20
> with
> + * this program; if not, write to the Free Software Foundation, Inc., =
59=20
> Temple
> + * Place - Suite 330, Boston, MA 02111-1307 USA.
> + */
> +
> +#ifndef _ATS_H_
> +#define _ATS_H_
> +
> +#define ATS_REG_CAP    4
> +#define ATS_REG_CTL    6
> +#define ATS_QUEUE_DEPTH_MASK     0xF
> +#define ATS_ENABLE               (1<<15)
> +
> +struct pci_ats_dev {
> +    struct list_head list;
> +    u16 seg;
> +    u8 bus;
> +    u8 devfn;
> +    u16 ats_queue_depth;    /* ATS device invalidation queue depth */
> +};
> +
> +extern struct list_head ats_devices;
> +extern bool_t ats_enabled;
> +
> +int enable_ats_device(int seg, int bus, int devfn);
> +void disable_ats_device(int seg, int bus, int devfn);
> +
> +#endif /* _ATS_H_ */
> +
> diff -r 119bccb1cc5e -r d422e3cf7976 xen/drivers/passthrough/vtd/extern.h=

> --- a/xen/drivers/passthrough/vtd/extern.h	Wed Nov 02 13:53:05 2011 =
+0100
> +++ b/xen/drivers/passthrough/vtd/extern.h	Thu Nov 03 11:02:17 2011 =
+0100
> @@ -57,13 +57,9 @@ struct acpi_drhd_unit * iommu_to_drhd(st
>  struct acpi_rhsa_unit * drhd_to_rhsa(struct acpi_drhd_unit *drhd);
> =20
>  #ifdef CONFIG_X86_64

Did you overlook this conditional? It and the respective inline functions
and #define-s must be added/moved to the new header too.

> -extern bool_t ats_enabled;
> -
>  struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu);
> =20
>  int ats_device(const struct pci_dev *, const struct acpi_drhd_unit *);
> -int enable_ats_device(int seg, int bus, int devfn);
> -void disable_ats_device(int seg, int bus, int devfn);
> =20
>  int dev_invalidate_iotlb(struct iommu *iommu, u16 did,
>                           u64 addr, unsigned int size_order, u64 type);
> diff -r 119bccb1cc5e -r d422e3cf7976 xen/drivers/passthrough/vtd/iommu.c
> --- a/xen/drivers/passthrough/vtd/iommu.c	Wed Nov 02 13:53:05 2011 =
+0100
> +++ b/xen/drivers/passthrough/vtd/iommu.c	Thu Nov 03 11:02:17 2011 =
+0100
> @@ -40,6 +40,7 @@
>  #include "dmar.h"
>  #include "extern.h"
>  #include "vtd.h"
> +#include "../ats.h"
> =20
>  #ifdef __ia64__
>  #define nr_ioapics              iosapic_get_nr_iosapics()
> diff -r 119bccb1cc5e -r d422e3cf7976 xen/drivers/passthrough/vtd/x86/ats.=
c
> --- a/xen/drivers/passthrough/vtd/x86/ats.c	Wed Nov 02 13:53:05 2011 =
+0100
> +++ b/xen/drivers/passthrough/vtd/x86/ats.c	Thu Nov 03 11:02:17 2011 =
+0100
> @@ -27,51 +27,10 @@
>  #include "../dmar.h"
>  #include "../vtd.h"
>  #include "../extern.h"
> +#include "../../ats.h"
> =20
>  static LIST_HEAD(ats_dev_drhd_units);
> =20
> -#define ATS_REG_CAP    4
> -#define ATS_REG_CTL    6
> -#define ATS_QUEUE_DEPTH_MASK     0xF
> -#define ATS_ENABLE               (1<<15)
> -
> -struct pci_ats_dev {
> -    struct list_head list;
> -    u16 seg;
> -    u8 bus;
> -    u8 devfn;
> -    u16 ats_queue_depth;    /* ATS device invalidation queue depth */
> -};
> -static LIST_HEAD(ats_devices);
> -
> -static void parse_ats_param(char *s);
> -custom_param("ats", parse_ats_param);
> -
> -bool_t __read_mostly ats_enabled =3D 1;
> -
> -static void __init parse_ats_param(char *s)
> -{
> -    char *ss;
> -
> -    do {
> -        ss =3D strchr(s, ',');
> -        if ( ss )
> -            *ss =3D '\0';
> -
> -        switch ( parse_bool(s) )
> -        {
> -        case 0:
> -            ats_enabled =3D 0;
> -            break;
> -        case 1:
> -            ats_enabled =3D 1;
> -            break;
> -        }
> -
> -        s =3D ss + 1;
> -    } while ( ss );
> -}
> -
>  struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu)
>  {
>      struct acpi_drhd_unit *drhd;
> @@ -113,97 +72,6 @@ int ats_device(const struct pci_dev *pde
>      return pos;
>  }
> =20
> -int enable_ats_device(int seg, int bus, int devfn)
> -{
> -    struct pci_ats_dev *pdev =3D NULL;
> -    u32 value;
> -    int pos;
> -
> -    pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS)=
;
> -    BUG_ON(!pos);
> -
> -    if ( iommu_verbose )
> -        dprintk(XENLOG_INFO VTDPREFIX,
> -                "%04x:%02x:%02x.%u: ATS capability found\n",
> -                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
> -
> -    value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> -                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
> -    if ( value & ATS_ENABLE )
> -    {
> -        list_for_each_entry ( pdev, &ats_devices, list )
> -        {
> -            if ( pdev->seg =3D=3D seg && pdev->bus =3D=3D bus && =
pdev->devfn =3D=3D devfn )
> -            {
> -                pos =3D 0;
> -                break;
> -            }
> -        }
> -    }
> -    if ( pos )
> -        pdev =3D xmalloc(struct pci_ats_dev);
> -    if ( !pdev )
> -        return -ENOMEM;
> -
> -    if ( !(value & ATS_ENABLE) )
> -    {
> -        value |=3D ATS_ENABLE;
> -        pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> -                         pos + ATS_REG_CTL, value);
> -    }
> -
> -    if ( pos )
> -    {
> -        pdev->seg =3D seg;
> -        pdev->bus =3D bus;
> -        pdev->devfn =3D devfn;
> -        value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> -                                PCI_FUNC(devfn), pos + ATS_REG_CAP);
> -        pdev->ats_queue_depth =3D value & ATS_QUEUE_DEPTH_MASK;
> -        list_add(&pdev->list, &ats_devices);
> -    }
> -
> -    if ( iommu_verbose )
> -        dprintk(XENLOG_INFO VTDPREFIX,
> -                "%04x:%02x:%02x.%u: ATS %s enabled\n",
> -                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> -                pos ? "is" : "was");
> -
> -    return pos;
> -}
> -
> -void disable_ats_device(int seg, int bus, int devfn)
> -{
> -    struct pci_ats_dev *pdev;
> -    u32 value;
> -    int pos;
> -
> -    pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS)=
;
> -    BUG_ON(!pos);
> -
> -    value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> -                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
> -    value &=3D ~ATS_ENABLE;
> -    pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> -                     pos + ATS_REG_CTL, value);
> -
> -    list_for_each_entry ( pdev, &ats_devices, list )
> -    {
> -        if ( pdev->seg =3D=3D seg && pdev->bus =3D=3D bus && pdev->devfn=
 =3D=3D devfn )
> -        {
> -            list_del(&pdev->list);
> -            xfree(pdev);
> -            break;
> -        }
> -    }
> -
> -    if ( iommu_verbose )
> -        dprintk(XENLOG_INFO VTDPREFIX,
> -                "%04x:%02x:%02x.%u: ATS is disabled\n",
> -                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
> -}
> -
> -
>  static int device_in_domain(struct iommu *iommu, struct pci_ats_dev =
*pdev,=20
> u16 did)
>  {
>      struct root_entry *root_entry =3D NULL;
> diff -r 119bccb1cc5e -r d422e3cf7976 xen/drivers/passthrough/x86/Makefile=

> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/xen/drivers/passthrough/x86/Makefile	Thu Nov 03 11:02:17 2011 =
+0100
> @@ -0,0 +1,1 @@
> +obj-y +=3D ats.o

obj-$(CONFIG_X86_64) +=3D ats.o

The original file got built for 64-bit only, too.

> \ No newline at end of file

This is self-explanatory, isn't it?

> diff -r 119bccb1cc5e -r d422e3cf7976 xen/drivers/passthrough/x86/ats.c
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/xen/drivers/passthrough/x86/ats.c	Thu Nov 03 11:02:17 2011 =
+0100
> @@ -0,0 +1,139 @@
> +/*
> + * This program is free software; you can redistribute it and/or modify =
it
> + * under the terms and conditions of the GNU General Public License,
> + * version 2, as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope it will be useful, but =
WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY =
or
> + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public =
License=20
> for
> + * more details.
> + *
> + * You should have received a copy of the GNU General Public License =
along=20
> with
> + * this program; if not, write to the Free Software Foundation, Inc., =
59=20
> Temple
> + * Place - Suite 330, Boston, MA 02111-1307 USA.
> + */
> +
> +#include <xen/sched.h>
> +#include <xen/pci.h>
> +#include <xen/pci_regs.h>
> +#include "../ats.h"
> +
> +LIST_HEAD(ats_devices);
> +
> +static void parse_ats_param(char *s);
> +custom_param("ats", parse_ats_param);
> +
> +bool_t __read_mostly ats_enabled =3D 1;
> +
> +static void __init parse_ats_param(char *s)
> +{
> +    char *ss;
> +
> +    do {
> +        ss =3D strchr(s, ',');
> +        if ( ss )
> +            *ss =3D '\0';
> +
> +        switch ( parse_bool(s) )
> +        {
> +        case 0:
> +            ats_enabled =3D 0;
> +            break;
> +        case 1:
> +            ats_enabled =3D 1;
> +            break;
> +        }
> +
> +        s =3D ss + 1;
> +    } while ( ss );
> +}
> +
> +int enable_ats_device(int seg, int bus, int devfn)
> +{
> +    struct pci_ats_dev *pdev =3D NULL;
> +    u32 value;
> +    int pos;
> +
> +    pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS)=
;
> +    BUG_ON(!pos);
> +
> +    if ( iommu_verbose )
> +        dprintk(XENLOG_INFO,
> +                "%04x:%02x:%02x.%u: ATS capability found\n",

Here and below, the two lines can be folded (together they don't
exceed 80 chars per line) now that the VT-d prefix is gone.

Jan

> +                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
> +
> +    value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> +                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
> +    if ( value & ATS_ENABLE )
> +    {
> +        list_for_each_entry ( pdev, &ats_devices, list )
> +        {
> +            if ( pdev->seg =3D=3D seg && pdev->bus =3D=3D bus && =
pdev->devfn =3D=3D devfn )
> +            {
> +                pos =3D 0;
> +                break;
> +            }
> +        }
> +    }
> +    if ( pos )
> +        pdev =3D xmalloc(struct pci_ats_dev);
> +    if ( !pdev )
> +        return -ENOMEM;
> +
> +    if ( !(value & ATS_ENABLE) )
> +    {
> +        value |=3D ATS_ENABLE;
> +        pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> +                         pos + ATS_REG_CTL, value);
> +    }
> +
> +    if ( pos )
> +    {
> +        pdev->seg =3D seg;
> +        pdev->bus =3D bus;
> +        pdev->devfn =3D devfn;
> +        value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> +                                PCI_FUNC(devfn), pos + ATS_REG_CAP);
> +        pdev->ats_queue_depth =3D value & ATS_QUEUE_DEPTH_MASK;
> +        list_add(&pdev->list, &ats_devices);
> +    }
> +
> +    if ( iommu_verbose )
> +        dprintk(XENLOG_INFO,
> +                "%04x:%02x:%02x.%u: ATS %s enabled\n",
> +                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> +                pos ? "is" : "was");
> +
> +    return pos;
> +}
> +
> +void disable_ats_device(int seg, int bus, int devfn)
> +{
> +    struct pci_ats_dev *pdev;
> +    u32 value;
> +    int pos;
> +
> +    pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS)=
;
> +    BUG_ON(!pos);
> +
> +    value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> +                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
> +    value &=3D ~ATS_ENABLE;
> +    pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> +                     pos + ATS_REG_CTL, value);
> +
> +    list_for_each_entry ( pdev, &ats_devices, list )
> +    {
> +        if ( pdev->seg =3D=3D seg && pdev->bus =3D=3D bus && pdev->devfn=
 =3D=3D devfn )
> +        {
> +            list_del(&pdev->list);
> +            xfree(pdev);
> +            break;
> +        }
> +    }
> +
> +    if ( iommu_verbose )
> +        dprintk(XENLOG_INFO,
> +                "%04x:%02x:%02x.%u: ATS is disabled\n",
> +                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
> +}



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 05:50:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 05:50:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLwkh-0002yB-7W; Thu, 03 Nov 2011 05:50:39 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLwjp-0002lI-LA
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 05:49:46 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1320324581!1817332!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5138 invoked from network); 3 Nov 2011 12:49:42 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-12.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 12:49:42 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 03 Nov 2011 12:49:41 +0000
Message-Id: <4EB29BF3020000780005EB5B@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 03 Nov 2011 12:49:39 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Wang" <wei.wang2@amd.com>
References: <patchbomb.1320315180@gran.amd.com>
	<d0c38cb215cd96e01de2.1320315182@gran.amd.com>
In-Reply-To: <d0c38cb215cd96e01de2.1320315182@gran.amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: [PATCH 2 of 5] amd iommu: Fix iommu page size
	encoding when page order > 0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 03.11.11 at 11:13, Wei Wang <wei.wang2@amd.com> wrote:
> # HG changeset patch
> # User Wei Wang <wei.wang2@amd.com>
> # Date 1320314617 -3600
> # Node ID d0c38cb215cd96e01de27eadf5ec0a5e711de448
> # Parent  d422e3cf7976c76c57fc2d455b784d0fcc24d06b
> amd iommu: Fix iommu page size encoding when page order > 0
>=20
> Signed-off-by: Wei Wang <wei.wang2@amd.com>
>=20
> diff -r d422e3cf7976 -r d0c38cb215cd xen/drivers/passthrough/amd/iommu_ma=
p.c
> --- a/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 11:02:17 2011 =
+0100
> +++ b/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 11:03:37 2011 =
+0100
> @@ -77,23 +77,24 @@ static void invalidate_iommu_pages(struc
>  {
>      u64 addr_lo, addr_hi;
>      u32 cmd[4], entry;
> -    u64 mask =3D 0;
>      int sflag =3D 0, pde =3D 0;
> =20
> +    ASSERT ( order =3D=3D 0 || order =3D=3D 9 || order =3D=3D 18 );
> +
> +    /* All pages associated with the domainID are invalidated */
> +    if ( order || (io_addr =3D=3D INV_IOMMU_ALL_PAGES_ADDRESS ) )
> +    {
> +        sflag =3D 1;
> +        pde =3D 1;
> +    }
> +
>      /* If sflag =3D=3D 1, the size of the invalidate command is =
determined
>       by the first zero bit in the address starting from Address[12] */
> -    if ( order =3D=3D 9 || order =3D=3D 18 )
> +    if ( order )
>      {
> -        mask =3D ((1ULL << (order - 1)) - 1) << PAGE_SHIFT;
> -        io_addr |=3D mask;
> -        sflag =3D 1;
> -    }
> -
> -    /* All pages associated with the domainID are invalidated */
> -    else if ( io_addr =3D=3D 0x7FFFFFFFFFFFF000ULL )

Note the difference between this and your adjusted definition
of INV_IOMMU_ALL_PAGES_ADDRESS. I don't think this is
correct (or else your patch description should say why).

> -    {
> -        sflag =3D 1;
> -        pde =3D 1;
> +        u64 mask =3D 1ULL << (order - 1 + PAGE_SHIFT);
> +        io_addr &=3D ~mask;
> +        io_addr |=3D mask - 1;
>      }
> =20
>      addr_lo =3D io_addr & DMA_32BIT_MASK;
> @@ -917,7 +918,7 @@ static void _amd_iommu_flush_pages(struc
> =20
>  void amd_iommu_flush_all_pages(struct domain *d)
>  {
> -    _amd_iommu_flush_pages(d, 0x7FFFFFFFFFFFFULL, 0);
> +    _amd_iommu_flush_pages(d, INV_IOMMU_ALL_PAGES_ADDRESS, 0);

Same here, for a slightly different reason.

Jan

>  }
> =20
>  void amd_iommu_flush_pages(struct domain *d,
> diff -r d422e3cf7976 -r d0c38cb215cd xen/include/asm-x86/hvm/svm/amd-iomm=
u-defs.h
> --- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 =
11:02:17 2011 +0100
> +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 =
11:03:37 2011=20
> +0100
> @@ -407,4 +407,6 @@
>  #define INT_REMAP_ENTRY_VECTOR_MASK     0x00FF0000
>  #define INT_REMAP_ENTRY_VECTOR_SHIFT    16
> =20
> +#define INV_IOMMU_ALL_PAGES_ADDRESS      0x7FFFFFFFFFFFFFFFULL
> +
>  #endif /* _ASM_X86_64_AMD_IOMMU_DEFS_H */




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 05:53:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 05:53:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLwn9-0003NN-PE; Thu, 03 Nov 2011 05:53:11 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLwmO-0003AZ-F0
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 05:52:25 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1320324740!1829230!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27186 invoked from network); 3 Nov 2011 12:52:21 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-2.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 12:52:21 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 03 Nov 2011 12:52:20 +0000
Message-Id: <4EB29C92020000780005EB6A@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 03 Nov 2011 12:52:18 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Wang" <wei.wang2@amd.com>
Subject: [Xen-devel] Re: [PATCH 2 of 5] amd iommu: Fix iommu page size
	encoding when page order > 0
References: <patchbomb.1320315180@gran.amd.com>
	<d0c38cb215cd96e01de2.1320315182@gran.amd.com>
	<4EB29BF3020000780005EB5B@nat28.tlf.novell.com>
In-Reply-To: <4EB29BF3020000780005EB5B@nat28.tlf.novell.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 03.11.11 at 13:49, "Jan Beulich" <JBeulich@suse.com> wrote:
>>>> On 03.11.11 at 11:13, Wei Wang <wei.wang2@amd.com> wrote:
>> # HG changeset patch
>> # User Wei Wang <wei.wang2@amd.com>
>> # Date 1320314617 -3600
>> # Node ID d0c38cb215cd96e01de27eadf5ec0a5e711de448
>> # Parent  d422e3cf7976c76c57fc2d455b784d0fcc24d06b
>> amd iommu: Fix iommu page size encoding when page order > 0
>>=20
>> Signed-off-by: Wei Wang <wei.wang2@amd.com>
>>=20
>> diff -r d422e3cf7976 -r d0c38cb215cd xen/drivers/passthrough/amd/iommu_m=
ap.c
>> --- a/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 =
11:02:17 2011 +0100
>> +++ b/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 =
11:03:37 2011 +0100
>> @@ -77,23 +77,24 @@ static void invalidate_iommu_pages(struc
>>  {
>>      u64 addr_lo, addr_hi;
>>      u32 cmd[4], entry;
>> -    u64 mask =3D 0;
>>      int sflag =3D 0, pde =3D 0;
>> =20
>> +    ASSERT ( order =3D=3D 0 || order =3D=3D 9 || order =3D=3D 18 );
>> +
>> +    /* All pages associated with the domainID are invalidated */
>> +    if ( order || (io_addr =3D=3D INV_IOMMU_ALL_PAGES_ADDRESS ) )
>> +    {
>> +        sflag =3D 1;
>> +        pde =3D 1;
>> +    }
>> +
>>      /* If sflag =3D=3D 1, the size of the invalidate command is =
determined
>>       by the first zero bit in the address starting from Address[12] */
>> -    if ( order =3D=3D 9 || order =3D=3D 18 )
>> +    if ( order )
>>      {
>> -        mask =3D ((1ULL << (order - 1)) - 1) << PAGE_SHIFT;
>> -        io_addr |=3D mask;
>> -        sflag =3D 1;
>> -    }
>> -
>> -    /* All pages associated with the domainID are invalidated */
>> -    else if ( io_addr =3D=3D 0x7FFFFFFFFFFFF000ULL )
>=20
> Note the difference between this and your adjusted definition
> of INV_IOMMU_ALL_PAGES_ADDRESS. I don't think this is
> correct (or else your patch description should say why).
>=20
>> -    {
>> -        sflag =3D 1;
>> -        pde =3D 1;
>> +        u64 mask =3D 1ULL << (order - 1 + PAGE_SHIFT);
>> +        io_addr &=3D ~mask;
>> +        io_addr |=3D mask - 1;
>>      }
>> =20
>>      addr_lo =3D io_addr & DMA_32BIT_MASK;
>> @@ -917,7 +918,7 @@ static void _amd_iommu_flush_pages(struc
>> =20
>>  void amd_iommu_flush_all_pages(struct domain *d)
>>  {
>> -    _amd_iommu_flush_pages(d, 0x7FFFFFFFFFFFFULL, 0);
>> +    _amd_iommu_flush_pages(d, INV_IOMMU_ALL_PAGES_ADDRESS, 0);
>=20
> Same here, for a slightly different reason.
>=20
> Jan
>=20
>>  }
>> =20
>>  void amd_iommu_flush_pages(struct domain *d,
>> diff -r d422e3cf7976 -r d0c38cb215cd xen/include/asm-x86/hvm/svm/amd-iom=
mu-defs.h
>> --- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 =
11:02:17 2011 +0100
>> +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 =
11:03:37 2011=20
>> +0100
>> @@ -407,4 +407,6 @@
>>  #define INT_REMAP_ENTRY_VECTOR_MASK     0x00FF0000
>>  #define INT_REMAP_ENTRY_VECTOR_SHIFT    16
>> =20
>> +#define INV_IOMMU_ALL_PAGES_ADDRESS      0x7FFFFFFFFFFFFFFFULL
>> +

Oh, additionally, this still isn't being expressed by a shift expression,
which makes it still badly readable (one has to count F-s in order to
know what this actually represents).

Jan

>>  #endif /* _ASM_X86_64_AMD_IOMMU_DEFS_H */
>=20
>=20
>=20
>=20
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com=20
> http://lists.xensource.com/xen-devel=20




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 06:12:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 06:12:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLx5R-00041p-Bd; Thu, 03 Nov 2011 06:12:05 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLx4E-0003oF-Ij
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 06:10:51 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-11.tower-174.messagelabs.com!1320325846!165485!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11081 invoked from network); 3 Nov 2011 13:10:47 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-11.tower-174.messagelabs.com with AES256-SHA encrypted
	SMTP; 3 Nov 2011 13:10:47 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RLx47-000ID3-Ca; Thu, 03 Nov 2011 13:10:43 +0000
Date: Thu, 3 Nov 2011 13:10:43 +0000
From: Tim Deegan <tim@xen.org>
To: Igor Mammedov <imammedo@redhat.com>
Subject: Re: [Xen-devel] xen-unstable fails to boot on a system with Ivy
	Bridge stepping C0 cpu
Message-ID: <20111103131043.GB66800@ocelot.phlegethon.org>
References: <4EB28CAD.2060401@redhat.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4EB28CAD.2060401@redhat.com>
User-Agent: Mutt/1.4.2.1i
Cc: anthony.perard@citrix.com, jinsong.liu@intel.com,
	xen-devel@lists.xensource.com, Ian.Campbell@citrix.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 13:44 +0100 on 03 Nov (1320327869), Igor Mammedov wrote:
> Hi,
> 
> I need a help with tracking down following issue:
> 
> When trying to boot Xen on a system with Ivy Bridge stepping C0 CPU, it is 
> stuck on CPU initialization.
> I've added some tracing to apic writes/reads and traced it so far to 
> sending INIT IPI.
> 
> (XEN) HVM: VMX enabled
> (XEN) HVM: Hardware Assisted Paging detected.
> (XEN) Setting warm reset code and vector.
> (XEN) apic_wrmsr (0x280,0x0)
> (XEN) apic_rdmsr(0x280) = 0x0
> (XEN) Asserting INIT.
> (XEN) apic_wrmsr (0x300,0x10000c500)
> 
> After this ^^^^ write BSP becomes VERY slow and it takes several minutes
> till it gets to sending STARTUP IPI:

Does reverting 23724:b3434f24b082 help?  Looking at it again I'm not
sure that the new logic is entirely correct - in particular it no longer
deasserts the INIT on x2apic systems. 

Cheers,

Tim.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 06:24:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 06:24:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLxHg-0004Z9-Hn; Thu, 03 Nov 2011 06:24:44 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLxH6-0004NH-6o
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 06:24:08 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1320326643!1817584!1
X-Originating-IP: [216.32.181.184]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22113 invoked from network); 3 Nov 2011 13:24:04 -0000
Received: from ch1ehsobe004.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.184)
	by server-4.tower-182.messagelabs.com with AES128-SHA encrypted SMTP;
	3 Nov 2011 13:24:04 -0000
Received: from mail180-ch1-R.bigfish.com (10.43.68.247) by
	CH1EHSOBE012.bigfish.com (10.43.70.62) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 13:23:47 +0000
Received: from mail180-ch1 (localhost.localdomain [127.0.0.1])	by
	mail180-ch1-R.bigfish.com (Postfix) with ESMTP id 565D62D03F2;
	Thu,  3 Nov 2011 13:23:56 +0000 (UTC)
X-SpamScore: -8
X-BigFish: VPS-8(z3e13hz1432N98dKzz1202hzz8275bhz32i668h839h)
X-Forefront-Antispam-Report: CIP:163.181.249.108; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp01.amd.com; RD:none; EFVD:NLI
X-FB-SS: 13,
Received: from mail180-ch1 (localhost.localdomain [127.0.0.1]) by mail180-ch1
	(MessageSwitch) id 132032663662109_15272;
	Thu,  3 Nov 2011 13:23:56 +0000 (UTC)
Received: from CH1EHSMHS018.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.249])	by mail180-ch1.bigfish.com (Postfix) with ESMTP id
	06B67121804F;	Thu,  3 Nov 2011 13:23:56 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	CH1EHSMHS018.bigfish.com (10.43.70.18) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 13:24:01 +0000
X-WSS-ID: 0LU36JY-01-1E2-02
X-M-MSG: 
Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com
	[163.181.249.73])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp01.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 298A61028021;	Thu,  3 Nov 2011 08:23:58 -0500 (CDT)
Received: from SAUSEXDAG04.amd.com (163.181.55.4) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Thu, 3 Nov 2011 08:24:37 -0500
Received: from storexhtp02.amd.com (172.24.4.4) by sausexdag04.amd.com
	(163.181.55.4) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Thu, 3 Nov 2011 08:23:59 -0500
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.83.0;
	Thu, 3 Nov 2011 09:23:20 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 901F449C108; Thu,  3 Nov 2011
	13:23:18 +0000 (GMT)
Received: from gran.osrc.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 77B835940FF; Thu,  3 Nov 2011
	14:23:18 +0100 (CET)
From: Wei Wang2 <wei.wang2@amd.com>
To: Jan Beulich <JBeulich@suse.com>
Date: Thu, 3 Nov 2011 14:26:19 +0100
User-Agent: KMail/1.9.6 (enterprise 20070904.708012)
References: <patchbomb.1320315180@gran.amd.com>
	<d0c38cb215cd96e01de2.1320315182@gran.amd.com>
	<4EB29BF3020000780005EB5B@nat28.tlf.novell.com>
In-Reply-To: <4EB29BF3020000780005EB5B@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Message-ID: <201111031426.19301.wei.wang2@amd.com>
X-OriginatorOrg: amd.com
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH 2 of 5] amd iommu: Fix iommu page size
	encoding	 when page order > 0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thursday 03 November 2011 13:49:39 Jan Beulich wrote:
> >>> On 03.11.11 at 11:13, Wei Wang <wei.wang2@amd.com> wrote:
> >
> > # HG changeset patch
> > # User Wei Wang <wei.wang2@amd.com>
> > # Date 1320314617 -3600
> > # Node ID d0c38cb215cd96e01de27eadf5ec0a5e711de448
> > # Parent  d422e3cf7976c76c57fc2d455b784d0fcc24d06b
> > amd iommu: Fix iommu page size encoding when page order > 0
> >
> > Signed-off-by: Wei Wang <wei.wang2@amd.com>
> >
> > diff -r d422e3cf7976 -r d0c38cb215cd
> > xen/drivers/passthrough/amd/iommu_map.c ---
> > a/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 11:02:17 2011 +0100
> > +++ b/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 11:03:37 2011
> > +0100 @@ -77,23 +77,24 @@ static void invalidate_iommu_pages(struc
> >  {
> >      u64 addr_lo, addr_hi;
> >      u32 cmd[4], entry;
> > -    u64 mask = 0;
> >      int sflag = 0, pde = 0;
> >
> > +    ASSERT ( order == 0 || order == 9 || order == 18 );
> > +
> > +    /* All pages associated with the domainID are invalidated */
> > +    if ( order || (io_addr == INV_IOMMU_ALL_PAGES_ADDRESS ) )
> > +    {
> > +        sflag = 1;
> > +        pde = 1;
> > +    }
> > +
> >      /* If sflag == 1, the size of the invalidate command is determined
> >       by the first zero bit in the address starting from Address[12] */
> > -    if ( order == 9 || order == 18 )
> > +    if ( order )
> >      {
> > -        mask = ((1ULL << (order - 1)) - 1) << PAGE_SHIFT;
> > -        io_addr |= mask;
> > -        sflag = 1;
> > -    }
> > -
> > -    /* All pages associated with the domainID are invalidated */
> > -    else if ( io_addr == 0x7FFFFFFFFFFFF000ULL )
>
> Note the difference between this and your adjusted definition
> of INV_IOMMU_ALL_PAGES_ADDRESS. I don't think this is
> correct (or else your patch description should say why).
>
> > -    {
> > -        sflag = 1;
> > -        pde = 1;
> > +        u64 mask = 1ULL << (order - 1 + PAGE_SHIFT);
> > +        io_addr &= ~mask;
> > +        io_addr |= mask - 1;
> >      }
> >
> >      addr_lo = io_addr & DMA_32BIT_MASK;
> > @@ -917,7 +918,7 @@ static void _amd_iommu_flush_pages(struc
> >
> >  void amd_iommu_flush_all_pages(struct domain *d)
> >  {
> > -    _amd_iommu_flush_pages(d, 0x7FFFFFFFFFFFFULL, 0);
> > +    _amd_iommu_flush_pages(d, INV_IOMMU_ALL_PAGES_ADDRESS, 0);
>
> Same here, for a slightly different reason.

The old code is wrong, here should be 0x7FFFFFFFFFFFF000ULL (or 
0x7FFFFFFFFFFFFULL << PAGE_SHIFT)
iommu does not care about the last 12 bits. So in this patch  I just use
INV_IOMMU_ALL_PAGES_ADDRESS = 0x7FFFFFFFFFFFFFFFULL 

Wei 

> Jan
>
> >  }
> >
> >  void amd_iommu_flush_pages(struct domain *d,
> > diff -r d422e3cf7976 -r d0c38cb215cd
> > xen/include/asm-x86/hvm/svm/amd-iommu-defs.h ---
> > a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 11:02:17 2011
> > +0100 +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03
> > 11:03:37 2011 +0100
> > @@ -407,4 +407,6 @@
> >  #define INT_REMAP_ENTRY_VECTOR_MASK     0x00FF0000
> >  #define INT_REMAP_ENTRY_VECTOR_SHIFT    16
> >
> > +#define INV_IOMMU_ALL_PAGES_ADDRESS      0x7FFFFFFFFFFFFFFFULL
> > +
> >  #endif /* _ASM_X86_64_AMD_IOMMU_DEFS_H */




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 06:27:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 06:27:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLxK2-0004xu-Fj; Thu, 03 Nov 2011 06:27:10 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLxJb-0004la-KY
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 06:26:44 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1320326799!166105!1
X-Originating-IP: [216.32.181.185]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7579 invoked from network); 3 Nov 2011 13:26:40 -0000
Received: from ch1ehsobe005.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.185)
	by server-4.tower-174.messagelabs.com with AES128-SHA encrypted SMTP;
	3 Nov 2011 13:26:40 -0000
Received: from mail101-ch1-R.bigfish.com (10.43.68.245) by
	CH1EHSOBE005.bigfish.com (10.43.70.55) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 13:26:23 +0000
Received: from mail101-ch1 (localhost.localdomain [127.0.0.1])	by
	mail101-ch1-R.bigfish.com (Postfix) with ESMTP id 2BFAF182849F;
	Thu,  3 Nov 2011 13:26:31 +0000 (UTC)
X-SpamScore: -12
X-BigFish: VPS-12(zz1432N98dK4015Lzz1202hzz8275bhz32i668h839h)
X-Forefront-Antispam-Report: CIP:163.181.249.108; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp01.amd.com; RD:none; EFVD:NLI
Received: from mail101-ch1 (localhost.localdomain [127.0.0.1]) by mail101-ch1
	(MessageSwitch) id 1320326787837707_30803;
	Thu,  3 Nov 2011 13:26:27 +0000 (UTC)
Received: from CH1EHSMHS006.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.248])	by mail101-ch1.bigfish.com (Postfix) with ESMTP id
	C1546F4804C;	Thu,  3 Nov 2011 13:26:27 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	CH1EHSMHS006.bigfish.com (10.43.70.6) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 13:26:18 +0000
X-WSS-ID: 0LU36O7-01-03J-02
X-M-MSG: 
Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com
	[163.181.249.73])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp01.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 2E54A1028029;	Thu,  3 Nov 2011 08:26:31 -0500 (CDT)
Received: from SAUSEXDAG03.amd.com (163.181.55.3) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Thu, 3 Nov 2011 08:27:10 -0500
Received: from storexhtp02.amd.com (172.24.4.4) by sausexdag03.amd.com
	(163.181.55.3) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Thu, 3 Nov 2011 08:26:32 -0500
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.83.0;
	Thu, 3 Nov 2011 09:26:31 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 5C20F49C108; Thu,  3 Nov 2011
	13:26:30 +0000 (GMT)
Received: from gran.osrc.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 412885940FF; Thu,  3 Nov 2011
	14:26:30 +0100 (CET)
From: Wei Wang2 <wei.wang2@amd.com>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] Re: [PATCH 2 of 5] amd iommu: Fix iommu page size
	encoding when page order > 0
Date: Thu, 3 Nov 2011 14:29:30 +0100
User-Agent: KMail/1.9.6 (enterprise 20070904.708012)
References: <patchbomb.1320315180@gran.amd.com>
	<4EB29BF3020000780005EB5B@nat28.tlf.novell.com>
	<4EB29C92020000780005EB6A@nat28.tlf.novell.com>
In-Reply-To: <4EB29C92020000780005EB6A@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Message-ID: <201111031429.31143.wei.wang2@amd.com>
X-OriginatorOrg: amd.com
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thursday 03 November 2011 13:52:18 Jan Beulich wrote:
> >>> On 03.11.11 at 13:49, "Jan Beulich" <JBeulich@suse.com> wrote:
> >>>> On 03.11.11 at 11:13, Wei Wang <wei.wang2@amd.com> wrote:
> >>
> >> # HG changeset patch
> >> # User Wei Wang <wei.wang2@amd.com>
> >> # Date 1320314617 -3600
> >> # Node ID d0c38cb215cd96e01de27eadf5ec0a5e711de448
> >> # Parent  d422e3cf7976c76c57fc2d455b784d0fcc24d06b
> >> amd iommu: Fix iommu page size encoding when page order > 0
> >>
> >> Signed-off-by: Wei Wang <wei.wang2@amd.com>
> >>
> >> diff -r d422e3cf7976 -r d0c38cb215cd
> >> xen/drivers/passthrough/amd/iommu_map.c ---
> >> a/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 11:02:17 2011 +0100
> >> +++ b/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 11:03:37 2011
> >> +0100 @@ -77,23 +77,24 @@ static void invalidate_iommu_pages(struc
> >>  {
> >>      u64 addr_lo, addr_hi;
> >>      u32 cmd[4], entry;
> >> -    u64 mask = 0;
> >>      int sflag = 0, pde = 0;
> >>
> >> +    ASSERT ( order == 0 || order == 9 || order == 18 );
> >> +
> >> +    /* All pages associated with the domainID are invalidated */
> >> +    if ( order || (io_addr == INV_IOMMU_ALL_PAGES_ADDRESS ) )
> >> +    {
> >> +        sflag = 1;
> >> +        pde = 1;
> >> +    }
> >> +
> >>      /* If sflag == 1, the size of the invalidate command is determined
> >>       by the first zero bit in the address starting from Address[12] */
> >> -    if ( order == 9 || order == 18 )
> >> +    if ( order )
> >>      {
> >> -        mask = ((1ULL << (order - 1)) - 1) << PAGE_SHIFT;
> >> -        io_addr |= mask;
> >> -        sflag = 1;
> >> -    }
> >> -
> >> -    /* All pages associated with the domainID are invalidated */
> >> -    else if ( io_addr == 0x7FFFFFFFFFFFF000ULL )
> >
> > Note the difference between this and your adjusted definition
> > of INV_IOMMU_ALL_PAGES_ADDRESS. I don't think this is
> > correct (or else your patch description should say why).
> >
> >> -    {
> >> -        sflag = 1;
> >> -        pde = 1;
> >> +        u64 mask = 1ULL << (order - 1 + PAGE_SHIFT);
> >> +        io_addr &= ~mask;
> >> +        io_addr |= mask - 1;
> >>      }
> >>
> >>      addr_lo = io_addr & DMA_32BIT_MASK;
> >> @@ -917,7 +918,7 @@ static void _amd_iommu_flush_pages(struc
> >>
> >>  void amd_iommu_flush_all_pages(struct domain *d)
> >>  {
> >> -    _amd_iommu_flush_pages(d, 0x7FFFFFFFFFFFFULL, 0);
> >> +    _amd_iommu_flush_pages(d, INV_IOMMU_ALL_PAGES_ADDRESS, 0);
> >
> > Same here, for a slightly different reason.
> >
> > Jan
> >
> >>  }
> >>
> >>  void amd_iommu_flush_pages(struct domain *d,
> >> diff -r d422e3cf7976 -r d0c38cb215cd
> >> xen/include/asm-x86/hvm/svm/amd-iommu-defs.h ---
> >> a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 11:02:17 2011
> >> +0100 +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03
> >> 11:03:37 2011 +0100
> >> @@ -407,4 +407,6 @@
> >>  #define INT_REMAP_ENTRY_VECTOR_MASK     0x00FF0000
> >>  #define INT_REMAP_ENTRY_VECTOR_SHIFT    16
> >>
> >> +#define INV_IOMMU_ALL_PAGES_ADDRESS      0x7FFFFFFFFFFFFFFFULL
> >> +
>
> Oh, additionally, this still isn't being expressed by a shift expression,
> which makes it still badly readable (one has to count F-s in order to
> know what this actually represents).
Well, this is a copy from the spec.. How about using  (1<<63) -1?
Thanks,
Wei

> Jan
>
> >>  #endif /* _ASM_X86_64_AMD_IOMMU_DEFS_H */
> >
> > _______________________________________________
> > Xen-devel mailing list
> > Xen-devel@lists.xensource.com
> > http://lists.xensource.com/xen-devel




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 06:28:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 06:28:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLxLn-0005Lk-N1; Thu, 03 Nov 2011 06:28:59 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLxLJ-00059e-5k
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 06:28:29 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1320326905!166511!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 359 invoked from network); 3 Nov 2011 13:28:26 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-7.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	3 Nov 2011 13:28:26 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 03 Nov 2011 13:28:25 +0000
Message-Id: <4EB2A506020000780005EB99@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 03 Nov 2011 13:28:22 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Wang2" <wei.wang2@amd.com>
References: <patchbomb.1320315180@gran.amd.com>
	<d0c38cb215cd96e01de2.1320315182@gran.amd.com>
	<4EB29BF3020000780005EB5B@nat28.tlf.novell.com>
	<201111031426.19301.wei.wang2@amd.com>
In-Reply-To: <201111031426.19301.wei.wang2@amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH 2 of 5] amd iommu: Fix iommu page size
	encoding when page order> 0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 03.11.11 at 14:26, Wei Wang2 <wei.wang2@amd.com> wrote:
> On Thursday 03 November 2011 13:49:39 Jan Beulich wrote:
>> >>> On 03.11.11 at 11:13, Wei Wang <wei.wang2@amd.com> wrote:
>> >
>> > # HG changeset patch
>> > # User Wei Wang <wei.wang2@amd.com>
>> > # Date 1320314617 -3600
>> > # Node ID d0c38cb215cd96e01de27eadf5ec0a5e711de448
>> > # Parent  d422e3cf7976c76c57fc2d455b784d0fcc24d06b
>> > amd iommu: Fix iommu page size encoding when page order > 0
>> >
>> > Signed-off-by: Wei Wang <wei.wang2@amd.com>
>> >
>> > diff -r d422e3cf7976 -r d0c38cb215cd
>> > xen/drivers/passthrough/amd/iommu_map.c ---
>> > a/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 11:02:17 2011 =
+0100
>> > +++ b/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 =
11:03:37 2011
>> > +0100 @@ -77,23 +77,24 @@ static void invalidate_iommu_pages(struc
>> >  {
>> >      u64 addr_lo, addr_hi;
>> >      u32 cmd[4], entry;
>> > -    u64 mask =3D 0;
>> >      int sflag =3D 0, pde =3D 0;
>> >
>> > +    ASSERT ( order =3D=3D 0 || order =3D=3D 9 || order =3D=3D 18 );
>> > +
>> > +    /* All pages associated with the domainID are invalidated */
>> > +    if ( order || (io_addr =3D=3D INV_IOMMU_ALL_PAGES_ADDRESS ) )
>> > +    {
>> > +        sflag =3D 1;
>> > +        pde =3D 1;
>> > +    }
>> > +
>> >      /* If sflag =3D=3D 1, the size of the invalidate command is =
determined
>> >       by the first zero bit in the address starting from Address[12] =
*/
>> > -    if ( order =3D=3D 9 || order =3D=3D 18 )
>> > +    if ( order )
>> >      {
>> > -        mask =3D ((1ULL << (order - 1)) - 1) << PAGE_SHIFT;
>> > -        io_addr |=3D mask;
>> > -        sflag =3D 1;
>> > -    }
>> > -
>> > -    /* All pages associated with the domainID are invalidated */
>> > -    else if ( io_addr =3D=3D 0x7FFFFFFFFFFFF000ULL )
>>
>> Note the difference between this and your adjusted definition
>> of INV_IOMMU_ALL_PAGES_ADDRESS. I don't think this is
>> correct (or else your patch description should say why).
>>
>> > -    {
>> > -        sflag =3D 1;
>> > -        pde =3D 1;
>> > +        u64 mask =3D 1ULL << (order - 1 + PAGE_SHIFT);
>> > +        io_addr &=3D ~mask;
>> > +        io_addr |=3D mask - 1;
>> >      }
>> >
>> >      addr_lo =3D io_addr & DMA_32BIT_MASK;
>> > @@ -917,7 +918,7 @@ static void _amd_iommu_flush_pages(struc
>> >
>> >  void amd_iommu_flush_all_pages(struct domain *d)
>> >  {
>> > -    _amd_iommu_flush_pages(d, 0x7FFFFFFFFFFFFULL, 0);
>> > +    _amd_iommu_flush_pages(d, INV_IOMMU_ALL_PAGES_ADDRESS, 0);
>>
>> Same here, for a slightly different reason.
>=20
> The old code is wrong, here should be 0x7FFFFFFFFFFFF000ULL (or=20
> 0x7FFFFFFFFFFFFULL << PAGE_SHIFT)
> iommu does not care about the last 12 bits. So in this patch  I just use
> INV_IOMMU_ALL_PAGES_ADDRESS =3D 0x7FFFFFFFFFFFFFFFULL=20

Okay, in this case please state so in the patch description.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 06:36:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 06:36:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLxTL-0005x2-3B; Thu, 03 Nov 2011 06:36:47 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLxSd-0005kK-1T
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 06:36:03 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1320327336!50855992!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2667 invoked from network); 3 Nov 2011 13:35:36 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-8.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 13:35:36 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 03 Nov 2011 13:35:59 +0000
Message-Id: <4EB2A6CC020000780005EBA6@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 03 Nov 2011 13:35:56 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Wang2" <wei.wang2@amd.com>
Subject: Re: [Xen-devel] Re: [PATCH 2 of 5] amd iommu: Fix iommu page
	size encoding when page order > 0
References: <patchbomb.1320315180@gran.amd.com>
	<4EB29BF3020000780005EB5B@nat28.tlf.novell.com>
	<4EB29C92020000780005EB6A@nat28.tlf.novell.com>
	<201111031429.31143.wei.wang2@amd.com>
In-Reply-To: <201111031429.31143.wei.wang2@amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 03.11.11 at 14:29, Wei Wang2 <wei.wang2@amd.com> wrote:
> On Thursday 03 November 2011 13:52:18 Jan Beulich wrote:
>> >>> On 03.11.11 at 13:49, "Jan Beulich" <JBeulich@suse.com> wrote:
>> >>>> On 03.11.11 at 11:13, Wei Wang <wei.wang2@amd.com> wrote:
>> >> diff -r d422e3cf7976 -r d0c38cb215cd
>> >> xen/include/asm-x86/hvm/svm/amd-iommu-defs.h ---
>> >> a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 =
11:02:17 2011
>> >> +0100 +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03
>> >> 11:03:37 2011 +0100
>> >> @@ -407,4 +407,6 @@
>> >>  #define INT_REMAP_ENTRY_VECTOR_MASK     0x00FF0000
>> >>  #define INT_REMAP_ENTRY_VECTOR_SHIFT    16
>> >>
>> >> +#define INV_IOMMU_ALL_PAGES_ADDRESS      0x7FFFFFFFFFFFFFFFULL
>> >> +
>>
>> Oh, additionally, this still isn't being expressed by a shift expression=
,
>> which makes it still badly readable (one has to count F-s in order to
>> know what this actually represents).
> Well, this is a copy from the spec.. How about using  (1<<63) -1?

Yes, that's what I asked for. Ideally with 63 also given a meaningful
#define (matchable to the spec).

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-users-bounces@lists.xensource.com Thu Nov 03 06:50:35 2011
Return-path: <xen-users-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 06:50:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLxgg-0006h0-SS; Thu, 03 Nov 2011 06:50:34 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLxfF-0006Me-SP; Thu, 03 Nov 2011 06:49:06 -0700
X-Env-Sender: evammg@gmail.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1320328141!2161561!1
X-Originating-IP: [209.85.216.178]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14448 invoked from network); 3 Nov 2011 13:49:02 -0000
Received: from mail-qy0-f178.google.com (HELO mail-qy0-f178.google.com)
	(209.85.216.178)
	by server-6.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 13:49:02 -0000
Received: by qyg14 with SMTP id 14so405356qyg.9
	for <multiple recipients>; Thu, 03 Nov 2011 06:49:01 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:from:date:message-id:subject:to
	:cc:content-type;
	bh=fSbGdWLgg3jIFd3fCs3u2M7sDlO5R/P7PQIhg0CgBUc=;
	b=HNvkeWucGHYA3VNOOPFZgreWx+KgSUBUrh77GtD/Nr0pTeczCmPFzRw1W4bmEfeySu
	1DVIINJa2hbR2PrYBjf4jI+Pc8Fac63FTBWV8TcoBnrwpchx6glKoBYOv4xFKHVu2MY7
	hHWC3UsG/ZgdQEKOvCD7T2763ncoYujTTNoLg=
Received: by 10.50.181.225 with SMTP id dz1mr4336579igc.30.1320328141051; Thu,
	03 Nov 2011 06:49:01 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.50.161.133 with HTTP; Thu, 3 Nov 2011 06:48:40 -0700 (PDT)
In-Reply-To: <4EA96956.4070300@xen.org>
References: <4EA96956.4070300@xen.org>
From: eva <evammg@gmail.com>
Date: Thu, 3 Nov 2011 14:48:40 +0100
Message-ID: <CAN-hevnvCFT3bCX9+_tsmVCG0TD0JRbFC9kD4Ae4dFVZySgKCg@mail.gmail.com>
Subject: Re: [Xen-users] Xen Document Day : Thank You!
To: Lars Kurth <lars.kurth@xen.org>
Content-Type: text/plain; charset=ISO-8859-1
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>
X-BeenThere: xen-users@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen user discussion <xen-users.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-users>,
	<mailto:xen-users-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-users@lists.xensource.com>
List-Help: <mailto:xen-users-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-users>,
	<mailto:xen-users-request@lists.xensource.com?subject=subscribe>
Sender: xen-users-bounces@lists.xensource.com
Errors-To: xen-users-bounces@lists.xensource.com

On 27 October 2011 16:23, Lars Kurth <lars.kurth@xen.org> wrote:
>
> Hi everybody!
> I wanted to thank you for helping out with the document day. As far as I can see, we got quite a bit of stuff done:t, etc.
>
> [...]
>
> What did surprise me, is how little documentation for users there actually is on the Wiki. I thought we were in bad shape, but not that bad. Have to think about how to address this.
>
> We are also working on setting up a new wiki and then find a way to start migrating content over. It may make sense to have regular document days. Any views?
>
> Regards
> Lars
>

Hello,

My name is Eva and I am a newbie to Xen. The purpose is to make Xen
works in our data center, as part of a research in the Ministry of
Science in Spain, and hopefully move forward if things going as
expected.

So I am concerned about the documentation. I have created a twitter
account for this:

http://twitter.com/xenspain

to post all the documentation related with Xen in Spanish when
possible. Anyone that wants me to post articles in this twitter
account, please just email me.

Translating the documentation into Spanish is going to be a hard work,
so if there's anyone that wants to help, it'll be welcome.

So, at this point, I wonder where to post the translations. Maybe the
bet the best place is the Xen wiki site. But I dont know if you guys
agree or if you are ready now for this change.

I'd like to translate not just the documentation of the wiki, but also
any article I consider relevant on the web, like this one:

http://blogs.oracle.com/wim/entry/linux_mainline_contains_all_the

If no place is made for the spanish translation at the xen wiki, then
I'll create a site to place the translations. No problem, just let me
know what suits you the best.


Regards

_______________________________________________
Xen-users mailing list
Xen-users@lists.xensource.com
http://lists.xensource.com/xen-users

From xen-devel-bounces@lists.xensource.com Thu Nov 03 06:52:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 06:52:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLxiY-0007H3-1a; Thu, 03 Nov 2011 06:52:30 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLxg9-0006Z0-9M
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 06:50:07 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-13.tower-182.messagelabs.com!1320328197!1284835!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1634 invoked from network); 3 Nov 2011 13:49:57 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-13.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 13:49:57 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RLxg1-000IKg-Tq; Thu, 03 Nov 2011 13:49:53 +0000
Date: Thu, 3 Nov 2011 13:49:53 +0000
From: Tim Deegan <tim@xen.org>
To: andres@lagarcavilla.com
Subject: Re: [Xen-devel] [PATCH 3 of 9] Enforce ordering constraints for the
	page alloc lock in the PoD code
Message-ID: <20111103134953.GC66800@ocelot.phlegethon.org>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<332775f72a3055c47c2b.1319690028@xdev.gridcentric.ca>
	<20111027133622.GJ59656@ocelot.phlegethon.org>
	<fd271c556383c8b929e9095ead91f5e7.squirrel@webmail.lagarcavilla.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <fd271c556383c8b929e9095ead91f5e7.squirrel@webmail.lagarcavilla.org>
User-Agent: Mutt/1.4.2.1i
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, andres@gridcentric.ca,
	keir.xen@gmail.com, Andres Lagar-Cavilla <andres@lagarcavilla.org>,
	adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 06:59 -0700 on 02 Nov (1320217144), andres@lagarcavilla.com wrote:
> > - I think it would be better to generate generic spin-lock-with-level
> >   and unlock-with-level wrapper functions rather than generating the
> >   various checks and having to assemble them into lock_page_alloc() and
> >   unlock_page_alloc() by hand.
> 
> The final intent is to have these macros establish ordering constraints
> for the fine-grained p2m lock, which is not only "grab a spinlock".
> Granted, we do not know yet whether we'll need such a fine-grained
> approach, but I think it's worth keeping things separate.

OK.  We can keep it as it is for now and maybe there'sll be an
opportubnity to tidy up later on. 

> As a side-note, an earlier version of my patches did enforce ordering,
> except things got really hairy with mem_sharing_unshare_page (which would
> jump levels up to grab shr_lock) and pod sweeps. I (think I) have
> solutions for both, but I'm not ready to push those yet.

Great!

> > - p2m->pod.page_alloc_unlock_level is wrong, I think; I can see that you
> >   need somewhere to store the unlock-level but it shouldn't live in
> >   the p2m state - it's at most a per-domain variable, so it should
> >   live in the struct domain; might as well be beside the lock itself.
> 
> Ok, sure. Although I think I need to make clear that this ordering
> constraint only applies within the pod code, and that's why I wanted to
> keep the book-keeping within the pod struct.

I see.  That makes sense, but since there are now multiple p2m structs
per domain, I think it's better to put it beside the lock with a comment
saying that it's only used by pod. 

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 07:16:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 07:16:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLy5s-00082j-4V; Thu, 03 Nov 2011 07:16:36 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLy4l-0007pw-J7
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 07:15:30 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1320329722!174050!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2662 invoked from network); 3 Nov 2011 14:15:24 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-5.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	3 Nov 2011 14:15:24 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA3EFC2N023447
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 3 Nov 2011 14:15:12 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA3EF9xQ013503
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 3 Nov 2011 14:15:09 GMT
Received: from abhmt104.oracle.com (abhmt104.oracle.com [141.146.116.56])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA3EF2tK006430; Thu, 3 Nov 2011 09:15:03 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 03 Nov 2011 07:15:02 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 38F2D81496; Thu,  3 Nov 2011 10:15:01 -0400 (EDT)
Date: Thu, 3 Nov 2011 10:15:01 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Christian Borntraeger <borntraeger@de.ibm.com>
Message-ID: <20111103141501.GB26799@phenom.dumpdata.com>
References: <20111027173527.GA23839@phenom.dumpdata.com>
	<1319751802-27013-1-git-send-email-miche@google.com>
	<1319770558.2529.20.camel@Joe-Laptop>
	<4EAAF23C.8050102@codeaurora.org> <87k47itc7u.fsf@rustcorp.com.au>
	<4EB28B37.8030301@de.ibm.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EB28B37.8030301@de.ibm.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090201.4EB2A1F2.0026,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, Stephen Boyd <sboyd@codeaurora.org>,
	Greg Kroah-Hartman <gregkh@suse.de>, Miche Baker-Harvey <miche@google.com>,
	linux-kernel@vger.kernel.org, Rusty Russell <rusty@ozlabs.org>,
	virtualization@lists.linux-foundation.org,
	Amit Shah <amit.shah@redhat.com>,
	Hendrik Brueckner <brueckner@linux.vnet.ibm.com>,
	Anton Blanchard <anton@samba.org>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Joe Perches <joe@perches.com>
Subject: [Xen-devel] Re: [PATCH] VirtioConsole support.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Nov 03, 2011 at 01:38:15PM +0100, Christian Borntraeger wrote:
> On 02/11/11 23:02, Rusty Russell wrote:
> > Ben, Christian, can you figure out what's going on?  Is it time for a
> > complete rewrite?
> 
> You are talking about hvc console? Yes it has so many users that it is now
> something like a console/tty layer extension, but it was never designed to be
> one. 
> 
> I think the hardest part would be to get all users together (for testing and
> requirements) and then to find someone that is actually doing that rework. Dont

I am volunteering myself to test the Xen user of it. Perhaps even add some patches,
albeit my knowledge of the hvc console is that "it works" (well, with this minor
speed bump).

> know if the pain level is already that high?
> 
> Christian
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 07:26:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 07:26:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLyFh-00005n-O4; Thu, 03 Nov 2011 07:26:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLyFB-0008LR-4R
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 07:26:13 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1320330369!2813216!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27843 invoked from network); 3 Nov 2011 14:26:10 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-4.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 14:26:10 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 03 Nov 2011 14:26:09 +0000
Message-Id: <4EB2B28E020000780005EBD9@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 03 Nov 2011 14:26:06 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Subject: [Xen-devel] [PATCH 0/2] IRQ adjustments
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Once again a pair of patches that are functionally independent, but only
apply in the given order.

1: IRQ: allocate CPU masks dynamically
2: x86/IRQ: consolidate IRQ disabling when acquiring vector lock

Signed-off-by: Jan Beulich <jbeulich@suse.com>


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 07:27:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 07:27:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLyGc-0000T3-He; Thu, 03 Nov 2011 07:27:42 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLyFn-00007U-PW
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 07:26:53 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1320330408!2792297!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14611 invoked from network); 3 Nov 2011 14:26:48 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-11.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 14:26:48 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 03 Nov 2011 14:26:47 +0000
Message-Id: <4EB2B2B5020000780005EBDD@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 03 Nov 2011 14:26:45 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part85AA74B5.0__="
Subject: [Xen-devel] [PATCH 1/2] IRQ: allocate CPU masks dynamically
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part85AA74B5.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

IRQ: allocate CPU masks dynamically

This includes delaying the initialization of dynamically created IRQs
until their actual first use and some further elimination of uses of
struct irq_cfg.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/ia64/linux-xen/irq_ia64.c
+++ b/xen/arch/ia64/linux-xen/irq_ia64.c
@@ -303,6 +303,9 @@ int __init request_irq_vector(unsigned i
 void __init
 init_IRQ (void)
 {
+#ifdef XEN
+	BUG_ON(init_irq_data());
+#endif
 	register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL);
 #ifdef CONFIG_SMP
 	register_percpu_irq(IA64_IPI_VECTOR, &ipi_irqaction);
--- a/xen/arch/ia64/xen/irq.c
+++ b/xen/arch/ia64/xen/irq.c
@@ -74,17 +74,30 @@ unsigned int __ia64_local_vector_to_irq=20
 /*
  * Controller mappings for all interrupt sources:
  */
-irq_desc_t irq_desc[NR_IRQS] =3D {
-	[0 ... NR_IRQS-1] =3D {
-		.status =3D IRQ_DISABLED,
-		.handler =3D &no_irq_type,
-		.lock =3D SPIN_LOCK_UNLOCKED
-		.arch =3D {
-		        .vector =3D -1,
-		        .cpu_mask =3D CPU_MASK_ALL,
-		}
+irq_desc_t irq_desc[NR_IRQS];
+
+int __init arch_init_one_irq_desc(struct irq_desc *desc)
+{
+	if (!alloc_cpumask_var(&desc->arch.cpu_mask))
+		return -ENOMEM;
+
+	desc->arch.vector =3D -1;
+	cpumask_setall(desc->arch.cpu_mask);
+
+	return 0;
+}
+
+int __init init_irq_data(void)
+{
+	unsigned int irq;
+
+	for (irq =3D 0; irq < NR_IRQS; irq++) {
+		struct irq_desc *desc =3D irq_to_desc(irq);
+
+		desc->irq =3D irq;
+		init_one_irq_desc(desc);
 	}
-};
+}
=20
 void __do_IRQ_guest(int irq);
=20
--- a/xen/arch/x86/i8259.c
+++ b/xen/arch/x86/i8259.c
@@ -398,7 +398,7 @@ void __init init_IRQ(void)
        =20
         desc->handler =3D &i8259A_irq_type;
         per_cpu(vector_irq, cpu)[FIRST_LEGACY_VECTOR + irq] =3D irq;
-        cpumask_copy(&desc->arch.cpu_mask, cpumask_of(cpu));
+        cpumask_copy(desc->arch.cpu_mask, cpumask_of(cpu));
         desc->arch.vector =3D FIRST_LEGACY_VECTOR + irq;
     }
    =20
--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -648,20 +648,21 @@ static int pin_2_irq(int idx, int apic,=20
 void /*__init*/ setup_ioapic_dest(void)
 {
     int pin, ioapic, irq, irq_entry;
-    struct irq_cfg *cfg;
=20
     if (skip_ioapic_setup)
         return;
=20
     for (ioapic =3D 0; ioapic < nr_ioapics; ioapic++) {
         for (pin =3D 0; pin < nr_ioapic_entries[ioapic]; pin++) {
+            struct irq_desc *desc;
+
             irq_entry =3D find_irq_entry(ioapic, pin, mp_INT);
             if (irq_entry =3D=3D -1)
                 continue;
             irq =3D pin_2_irq(irq_entry, ioapic, pin);
-            cfg =3D irq_cfg(irq);
-            BUG_ON(cpus_empty(cfg->cpu_mask));
-            set_ioapic_affinity_irq(irq_to_desc(irq), &cfg->cpu_mask);
+            desc =3D irq_to_desc(irq);
+            BUG_ON(cpumask_empty(desc->arch.cpu_mask));
+            set_ioapic_affinity_irq(desc, desc->arch.cpu_mask);
         }
=20
     }
@@ -956,12 +957,12 @@ static void __init setup_IO_APIC_irqs(vo
     struct IO_APIC_route_entry entry;
     int apic, pin, idx, irq, first_notcon =3D 1, vector;
     unsigned long flags;
-    struct irq_cfg *cfg;
=20
     apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
=20
     for (apic =3D 0; apic < nr_ioapics; apic++) {
         for (pin =3D 0; pin < nr_ioapic_entries[apic]; pin++) {
+            struct irq_desc *desc;
=20
             /*
              * add it to the IO-APIC irq-routing table:
@@ -1016,9 +1017,9 @@ static void __init setup_IO_APIC_irqs(vo
                 if (!apic && platform_legacy_irq(irq))
                     disable_8259A_irq(irq_to_desc(irq));
             }
-            cfg =3D irq_cfg(irq);
+            desc =3D irq_to_desc(irq);
             SET_DEST(entry.dest.dest32, entry.dest.logical.logical_dest,
-                     cpu_mask_to_apicid(&cfg->cpu_mask));
+                     cpu_mask_to_apicid(desc->arch.cpu_mask));
             spin_lock_irqsave(&ioapic_lock, flags);
             __ioapic_write_entry(apic, pin, 0, entry);
             set_native_irq_info(irq, TARGET_CPUS);
@@ -2372,7 +2373,7 @@ int ioapic_guest_write(unsigned long phy
     rte.vector =3D cfg->vector;
=20
     SET_DEST(rte.dest.dest32, rte.dest.logical.logical_dest,
-             cpu_mask_to_apicid(&cfg->cpu_mask));
+             cpu_mask_to_apicid(desc->arch.cpu_mask));
=20
     io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&rte) + 0));
     io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&rte) + 1));
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -25,6 +25,7 @@
 #include <public/physdev.h>
=20
 static void parse_irq_vector_map_param(char *s);
+static int __assign_irq_vector(int irq, struct irq_desc *, const =
cpumask_t *);
=20
 /* opt_noirqbalance: If true, software IRQ balancing/affinity is =
disabled. */
 bool_t __read_mostly opt_noirqbalance =3D 0;
@@ -110,7 +111,7 @@ static int __init __bind_irq_vector(int=20
 {
     cpumask_t online_mask;
     int cpu;
-    struct irq_cfg *cfg =3D irq_cfg(irq);
+    struct irq_desc *desc =3D irq_to_desc(irq);
=20
     BUG_ON((unsigned)irq >=3D nr_irqs);
     BUG_ON((unsigned)vector >=3D NR_VECTORS);
@@ -118,21 +119,22 @@ static int __init __bind_irq_vector(int=20
     cpumask_and(&online_mask, cpu_mask, &cpu_online_map);
     if (cpumask_empty(&online_mask))
         return -EINVAL;
-    if ((cfg->vector =3D=3D vector) && cpumask_equal(&cfg->cpu_mask, =
&online_mask))
+    if ( (desc->arch.vector =3D=3D vector) &&
+         cpumask_equal(desc->arch.cpu_mask, &online_mask) )
         return 0;
-    if (cfg->vector !=3D IRQ_VECTOR_UNASSIGNED)=20
+    if ( desc->arch.vector !=3D IRQ_VECTOR_UNASSIGNED )
         return -EBUSY;
     trace_irq_mask(TRC_HW_IRQ_BIND_VECTOR, irq, vector, &online_mask);
     for_each_cpu_mask(cpu, online_mask)
         per_cpu(vector_irq, cpu)[vector] =3D irq;
-    cfg->vector =3D vector;
-    cpumask_copy(&cfg->cpu_mask, &online_mask);
-    if ( cfg->used_vectors )
+    desc->arch.vector =3D vector;
+    cpumask_copy(desc->arch.cpu_mask, &online_mask);
+    if ( desc->arch.used_vectors )
     {
-        ASSERT(!test_bit(vector, cfg->used_vectors));
-        set_bit(vector, cfg->used_vectors);
+        ASSERT(!test_bit(vector, desc->arch.used_vectors));
+        set_bit(vector, desc->arch.used_vectors);
     }
-    cfg->used =3D IRQ_USED;
+    desc->arch.used =3D IRQ_USED;
     if (IO_APIC_IRQ(irq))
         irq_vector[irq] =3D vector;
     return 0;
@@ -166,14 +168,17 @@ int create_irq(void)
 {
     unsigned long flags;
     int irq, ret;
-    irq =3D -ENOSPC;
+    struct irq_desc *desc;
=20
     spin_lock_irqsave(&vector_lock, flags);
=20
     irq =3D find_unassigned_irq();
     if (irq < 0)
          goto out;
-    ret =3D __assign_irq_vector(irq, irq_cfg(irq), TARGET_CPUS);
+    desc =3D irq_to_desc(irq);
+    ret =3D init_one_irq_desc(desc);
+    if (!ret)
+        ret =3D __assign_irq_vector(irq, desc, TARGET_CPUS);
     if (ret < 0)
         irq =3D ret;
 out:
@@ -197,7 +202,7 @@ static void dynamic_irq_cleanup(unsigned
     desc->msi_desc =3D NULL;
     desc->handler =3D &no_irq_type;
     desc->arch.used_vectors =3D NULL;
-    cpumask_setall(&desc->affinity);
+    cpumask_setall(desc->affinity);
     spin_unlock_irqrestore(&desc->lock, flags);
=20
     /* Wait to make sure it's not being used on another CPU */
@@ -211,38 +216,38 @@ static void __clear_irq_vector(int irq)
 {
     int cpu, vector, old_vector;
     cpumask_t tmp_mask;
-    struct irq_cfg *cfg =3D irq_cfg(irq);
+    struct irq_desc *desc =3D irq_to_desc(irq);
=20
-    BUG_ON(!cfg->vector);
+    BUG_ON(!desc->arch.vector);
=20
-    /* Always clear cfg->vector */
-    vector =3D cfg->vector;
-    cpumask_and(&tmp_mask, &cfg->cpu_mask, &cpu_online_map);
+    /* Always clear desc->arch.vector */
+    vector =3D desc->arch.vector;
+    cpumask_and(&tmp_mask, desc->arch.cpu_mask, &cpu_online_map);
=20
     for_each_cpu_mask(cpu, tmp_mask) {
         ASSERT( per_cpu(vector_irq, cpu)[vector] =3D=3D irq );
         per_cpu(vector_irq, cpu)[vector] =3D -1;
     }
=20
-    cfg->vector =3D IRQ_VECTOR_UNASSIGNED;
-    cpumask_clear(&cfg->cpu_mask);
+    desc->arch.vector =3D IRQ_VECTOR_UNASSIGNED;
+    cpumask_clear(desc->arch.cpu_mask);
=20
-    if ( cfg->used_vectors )
+    if ( desc->arch.used_vectors )
     {
-        ASSERT(test_bit(vector, cfg->used_vectors));
-        clear_bit(vector, cfg->used_vectors);
+        ASSERT(test_bit(vector, desc->arch.used_vectors));
+        clear_bit(vector, desc->arch.used_vectors);
     }
=20
-    cfg->used =3D IRQ_UNUSED;
+    desc->arch.used =3D IRQ_UNUSED;
=20
     trace_irq_mask(TRC_HW_IRQ_CLEAR_VECTOR, irq, vector, &tmp_mask);
=20
-    if (likely(!cfg->move_in_progress))
+    if ( likely(!desc->arch.move_in_progress) )
         return;
=20
-    /* If we were in motion, also clear cfg->old_vector */
-    old_vector =3D cfg->old_vector;
-    cpumask_and(&tmp_mask, &cfg->old_cpu_mask, &cpu_online_map);
+    /* If we were in motion, also clear desc->arch.old_vector */
+    old_vector =3D desc->arch.old_vector;
+    cpumask_and(&tmp_mask, desc->arch.old_cpu_mask, &cpu_online_map);
=20
     for_each_cpu_mask(cpu, tmp_mask) {
         ASSERT( per_cpu(vector_irq, cpu)[old_vector] =3D=3D irq );
@@ -250,16 +255,16 @@ static void __clear_irq_vector(int irq)
         per_cpu(vector_irq, cpu)[old_vector] =3D -1;
      }
=20
-    cfg->old_vector =3D IRQ_VECTOR_UNASSIGNED;
-    cpumask_clear(&cfg->old_cpu_mask);
+    desc->arch.old_vector =3D IRQ_VECTOR_UNASSIGNED;
+    cpumask_clear(desc->arch.old_cpu_mask);
=20
-    if ( cfg->used_vectors )
+    if ( desc->arch.used_vectors )
     {
-        ASSERT(test_bit(old_vector, cfg->used_vectors));
-        clear_bit(old_vector, cfg->used_vectors);
+        ASSERT(test_bit(old_vector, desc->arch.used_vectors));
+        clear_bit(old_vector, desc->arch.used_vectors);
     }
=20
-    cfg->move_in_progress =3D 0;
+    desc->arch.move_in_progress =3D 0;
 }
=20
 void clear_irq_vector(int irq)
@@ -296,25 +301,28 @@ int irq_to_vector(int irq)
     return vector;
 }
=20
-static void __init init_one_irq_desc(struct irq_desc *desc)
+int arch_init_one_irq_desc(struct irq_desc *desc)
 {
-    desc->status  =3D IRQ_DISABLED;
-    desc->handler =3D &no_irq_type;
-    desc->action  =3D NULL;
-    desc->msi_desc =3D NULL;
-    spin_lock_init(&desc->lock);
-    cpumask_setall(&desc->affinity);
-    INIT_LIST_HEAD(&desc->rl_link);
-}
+    if ( !zalloc_cpumask_var(&desc->arch.cpu_mask) )
+        return -ENOMEM;
+
+    if ( !alloc_cpumask_var(&desc->arch.old_cpu_mask) )
+    {
+        free_cpumask_var(desc->arch.cpu_mask);
+        return -ENOMEM;
+    }
=20
-static void __init init_one_irq_cfg(struct irq_cfg *cfg)
-{
-    cfg->vector =3D IRQ_VECTOR_UNASSIGNED;
-    cfg->old_vector =3D IRQ_VECTOR_UNASSIGNED;
-    cpumask_clear(&cfg->cpu_mask);
-    cpumask_clear(&cfg->old_cpu_mask);
-    cfg->used_vectors =3D NULL;
-    cfg->used =3D IRQ_UNUSED;
+    if ( !alloc_cpumask_var(&desc->arch.pending_mask) )
+    {
+        free_cpumask_var(desc->arch.old_cpu_mask);
+        free_cpumask_var(desc->arch.cpu_mask);
+        return -ENOMEM;
+    }
+
+    desc->arch.vector =3D IRQ_VECTOR_UNASSIGNED;
+    desc->arch.old_vector =3D IRQ_VECTOR_UNASSIGNED;
+
+    return 0;
 }
=20
 int __init init_irq_data(void)
@@ -331,12 +339,13 @@ int __init init_irq_data(void)
     if ( !irq_desc || !irq_vector )
         return -ENOMEM;
=20
-    for (irq =3D 0; irq < nr_irqs; irq++) {
+    for (irq =3D 0; irq < nr_irqs_gsi; irq++) {
         desc =3D irq_to_desc(irq);
         desc->irq =3D irq;
         init_one_irq_desc(desc);
-        init_one_irq_cfg(&desc->arch);
     }
+    for (; irq < nr_irqs; irq++)
+        irq_to_desc(irq)->irq =3D irq;
=20
     /* Never allocate the hypercall vector or Linux/BSD fast-trap vector. =
*/
     set_bit(LEGACY_SYSCALL_VECTOR, used_vectors);
@@ -403,7 +412,8 @@ static vmask_t *irq_get_used_vector_mask
     return ret;
 }
=20
-int __assign_irq_vector(int irq, struct irq_cfg *cfg, const cpumask_t =
*mask)
+static int __assign_irq_vector(
+    int irq, struct irq_desc *desc, const cpumask_t *mask)
 {
     /*
      * NOTE! The local APIC isn't very good at handling
@@ -426,13 +436,13 @@ int __assign_irq_vector(int irq, struct=20
     old_vector =3D irq_to_vector(irq);
     if (old_vector) {
         cpumask_and(&tmp_mask, mask, &cpu_online_map);
-        if (cpumask_intersects(&tmp_mask, &cfg->cpu_mask)) {
-            cfg->vector =3D old_vector;
+        if (cpumask_intersects(&tmp_mask, desc->arch.cpu_mask)) {
+            desc->arch.vector =3D old_vector;
             return 0;
         }
     }
=20
-    if ((cfg->move_in_progress) || cfg->move_cleanup_count)
+    if ( desc->arch.move_in_progress || desc->arch.move_cleanup_count )
         return -EAGAIN;
=20
     err =3D -ENOSPC;
@@ -440,9 +450,9 @@ int __assign_irq_vector(int irq, struct=20
     /* This is the only place normal IRQs are ever marked
      * as "in use".  If they're not in use yet, check to see
      * if we need to assign a global vector mask. */
-    if ( cfg->used =3D=3D IRQ_USED )
+    if ( desc->arch.used =3D=3D IRQ_USED )
     {
-        irq_used_vectors =3D cfg->used_vectors;
+        irq_used_vectors =3D desc->arch.used_vectors;
     }
     else
         irq_used_vectors =3D irq_get_used_vector_mask(irq);
@@ -485,29 +495,29 @@ next:
         current_offset =3D offset;
         local_irq_save(flags);
         if (old_vector) {
-            cfg->move_in_progress =3D 1;
-            cpumask_copy(&cfg->old_cpu_mask, &cfg->cpu_mask);
-            cfg->old_vector =3D cfg->vector;
+            desc->arch.move_in_progress =3D 1;
+            cpumask_copy(desc->arch.old_cpu_mask, desc->arch.cpu_mask);
+            desc->arch.old_vector =3D desc->arch.vector;
         }
         trace_irq_mask(TRC_HW_IRQ_ASSIGN_VECTOR, irq, vector, &tmp_mask);
         for_each_cpu_mask(new_cpu, tmp_mask)
             per_cpu(vector_irq, new_cpu)[vector] =3D irq;
-        cfg->vector =3D vector;
-        cpumask_copy(&cfg->cpu_mask, &tmp_mask);
+        desc->arch.vector =3D vector;
+        cpumask_copy(desc->arch.cpu_mask, &tmp_mask);
=20
-        cfg->used =3D IRQ_USED;
-        ASSERT((cfg->used_vectors =3D=3D NULL)
-               || (cfg->used_vectors =3D=3D irq_used_vectors));
-        cfg->used_vectors =3D irq_used_vectors;
+        desc->arch.used =3D IRQ_USED;
+        ASSERT((desc->arch.used_vectors =3D=3D NULL)
+               || (desc->arch.used_vectors =3D=3D irq_used_vectors));
+        desc->arch.used_vectors =3D irq_used_vectors;
=20
         if (IO_APIC_IRQ(irq))
             irq_vector[irq] =3D vector;
=20
-        if ( cfg->used_vectors )
+        if ( desc->arch.used_vectors )
         {
-            ASSERT(!test_bit(vector, cfg->used_vectors));
+            ASSERT(!test_bit(vector, desc->arch.used_vectors));
=20
-            set_bit(vector, cfg->used_vectors);
+            set_bit(vector, desc->arch.used_vectors);
         }
=20
         err =3D 0;
@@ -521,16 +531,15 @@ int assign_irq_vector(int irq)
 {
     int ret;
     unsigned long flags;
-    struct irq_cfg *cfg =3D irq_cfg(irq);
     struct irq_desc *desc =3D irq_to_desc(irq);
    =20
     BUG_ON(irq >=3D nr_irqs || irq <0);
=20
     spin_lock_irqsave(&vector_lock, flags);
-    ret =3D __assign_irq_vector(irq, cfg, TARGET_CPUS);
+    ret =3D __assign_irq_vector(irq, desc, TARGET_CPUS);
     if (!ret) {
-        ret =3D cfg->vector;
-        cpumask_copy(&desc->affinity, &cfg->cpu_mask);
+        ret =3D desc->arch.vector;
+        cpumask_copy(desc->affinity, desc->arch.cpu_mask);
     }
     spin_unlock_irqrestore(&vector_lock, flags);
     return ret;
@@ -543,15 +552,16 @@ int assign_irq_vector(int irq)
 void __setup_vector_irq(int cpu)
 {
     int irq, vector;
-    struct irq_cfg *cfg;
=20
     /* Clear vector_irq */
     for (vector =3D 0; vector < NR_VECTORS; ++vector)
         per_cpu(vector_irq, cpu)[vector] =3D -1;
     /* Mark the inuse vectors */
     for (irq =3D 0; irq < nr_irqs; ++irq) {
-        cfg =3D irq_cfg(irq);
-        if (!cpu_isset(cpu, cfg->cpu_mask))
+        struct irq_desc *desc =3D irq_to_desc(irq);
+
+        if (!irq_desc_initialized(desc) ||
+            !cpumask_test_cpu(cpu, desc->arch.cpu_mask))
             continue;
         vector =3D irq_to_vector(irq);
         per_cpu(vector_irq, cpu)[vector] =3D irq;
@@ -560,12 +570,14 @@ void __setup_vector_irq(int cpu)
=20
 void move_masked_irq(struct irq_desc *desc)
 {
+    cpumask_t *pending_mask =3D desc->arch.pending_mask;
+
     if (likely(!(desc->status & IRQ_MOVE_PENDING)))
         return;
    =20
     desc->status &=3D ~IRQ_MOVE_PENDING;
=20
-    if (unlikely(cpus_empty(desc->pending_mask)))
+    if (unlikely(cpumask_empty(pending_mask)))
         return;
=20
     if (!desc->handler->set_affinity)
@@ -580,10 +592,10 @@ void move_masked_irq(struct irq_desc *de
      *
      * For correct operation this depends on the caller masking the irqs.
      */
-    if (likely(cpus_intersects(desc->pending_mask, cpu_online_map)))
-        desc->handler->set_affinity(desc, &desc->pending_mask);
+    if ( likely(cpumask_intersects(pending_mask, &cpu_online_map)) )
+        desc->handler->set_affinity(desc, pending_mask);
=20
-    cpumask_clear(&desc->pending_mask);
+    cpumask_clear(pending_mask);
 }
=20
 void move_native_irq(struct irq_desc *desc)
@@ -626,7 +638,8 @@ fastcall void smp_irq_move_cleanup_inter
         if (!desc->arch.move_cleanup_count)
             goto unlock;
=20
-        if (vector =3D=3D desc->arch.vector && cpumask_test_cpu(me, =
&desc->arch.cpu_mask))
+        if ( vector =3D=3D desc->arch.vector &&
+             cpumask_test_cpu(me, desc->arch.cpu_mask) )
             goto unlock;
=20
         irr =3D apic_read(APIC_IRR + (vector / 32 * 0x10));
@@ -653,7 +666,7 @@ fastcall void smp_irq_move_cleanup_inter
         if ( desc->arch.move_cleanup_count =3D=3D 0 )
         {
             desc->arch.old_vector =3D IRQ_VECTOR_UNASSIGNED;
-            cpumask_clear(&desc->arch.old_cpu_mask);
+            cpumask_clear(desc->arch.old_cpu_mask);
=20
             if ( desc->arch.used_vectors )
             {
@@ -673,7 +686,7 @@ static void send_cleanup_vector(struct i
 {
     cpumask_t cleanup_mask;
=20
-    cpumask_and(&cleanup_mask, &desc->arch.old_cpu_mask, &cpu_online_map);=

+    cpumask_and(&cleanup_mask, desc->arch.old_cpu_mask, &cpu_online_map);
     desc->arch.move_cleanup_count =3D cpumask_weight(&cleanup_mask);
     genapic->send_IPI_mask(&cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR);
=20
@@ -690,7 +703,8 @@ void irq_complete_move(struct irq_desc *
     vector =3D get_irq_regs()->entry_vector;
     me =3D smp_processor_id();
=20
-    if (vector =3D=3D desc->arch.vector && cpumask_test_cpu(me, &desc->arc=
h.cpu_mask))
+    if ( vector =3D=3D desc->arch.vector &&
+         cpumask_test_cpu(me, desc->arch.cpu_mask) )
         send_cleanup_vector(desc);
 }
=20
@@ -708,15 +722,15 @@ unsigned int set_desc_affinity(struct ir
=20
     local_irq_save(flags);
     lock_vector_lock();
-    ret =3D __assign_irq_vector(irq, &desc->arch, mask);
+    ret =3D __assign_irq_vector(irq, desc, mask);
     unlock_vector_lock();
     local_irq_restore(flags);
=20
     if (ret < 0)
         return BAD_APICID;
=20
-    cpumask_copy(&desc->affinity, mask);
-    cpumask_and(&dest_mask, mask, &desc->arch.cpu_mask);
+    cpumask_copy(desc->affinity, mask);
+    cpumask_and(&dest_mask, mask, desc->arch.cpu_mask);
=20
     return cpu_mask_to_apicid(&dest_mask);
 }
@@ -730,7 +744,7 @@ void irq_set_affinity(struct irq_desc *d
     ASSERT(spin_is_locked(&desc->lock));
     desc->status &=3D ~IRQ_MOVE_PENDING;
     wmb();
-    cpumask_copy(&desc->pending_mask, mask);
+    cpumask_copy(desc->arch.pending_mask, mask);
     wmb();
     desc->status |=3D IRQ_MOVE_PENDING;
 }
@@ -1992,13 +2006,13 @@ static void dump_irqs(unsigned char key)
=20
         desc =3D irq_to_desc(irq);
=20
-        if ( !desc->handler || desc->handler =3D=3D &no_irq_type )
+        if ( !irq_desc_initialized(desc) || desc->handler =3D=3D =
&no_irq_type )
             continue;
=20
         spin_lock_irqsave(&desc->lock, flags);
=20
         cpumask_scnprintf(keyhandler_scratch, sizeof(keyhandler_scratch),
-                          &desc->affinity);
+                          desc->affinity);
         printk("   IRQ:%4d affinity:%s vec:%02x type=3D%-15s"
                " status=3D%08x ",
                irq, keyhandler_scratch, desc->arch.vector,
@@ -2073,10 +2087,12 @@ void fixup_irqs(void)
             continue;
=20
         desc =3D irq_to_desc(irq);
+        if ( !irq_desc_initialized(desc) )
+            continue;
=20
         spin_lock(&desc->lock);
=20
-        cpumask_copy(&affinity, &desc->affinity);
+        cpumask_copy(&affinity, desc->affinity);
         if ( !desc->action || cpumask_subset(&affinity, &cpu_online_map) =
)
         {
             spin_unlock(&desc->lock);
--- a/xen/arch/x86/msi.c
+++ b/xen/arch/x86/msi.c
@@ -125,13 +125,13 @@ void msi_compose_msg(struct irq_desc *de
     unsigned dest;
     int vector =3D desc->arch.vector;
=20
-    if ( cpumask_empty(&desc->arch.cpu_mask) ) {
+    if ( cpumask_empty(desc->arch.cpu_mask) ) {
         dprintk(XENLOG_ERR,"%s, compose msi message error!!\n", __func__);=

         return;
     }
=20
     if ( vector ) {
-        dest =3D cpu_mask_to_apicid(&desc->arch.cpu_mask);
+        dest =3D cpu_mask_to_apicid(desc->arch.cpu_mask);
=20
         msg->address_hi =3D MSI_ADDR_BASE_HI;
         msg->address_lo =3D
--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -1011,7 +1011,7 @@ void __init smp_intr_init(void)
         irq_vector[irq] =3D FIRST_HIPRIORITY_VECTOR + seridx + 1;
         per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_VECTOR + seridx + 1] =
=3D irq;
         irq_to_desc(irq)->arch.vector =3D FIRST_HIPRIORITY_VECTOR + =
seridx + 1;
-        cpumask_copy(&irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map);
+        cpumask_copy(irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map);
     }
=20
     /* IPI for cleanuping vectors after irq move */
--- a/xen/common/Makefile
+++ b/xen/common/Makefile
@@ -5,6 +5,7 @@ obj-y +=3D domctl.o
 obj-y +=3D domain.o
 obj-y +=3D event_channel.o
 obj-y +=3D grant_table.o
+obj-y +=3D irq.o
 obj-y +=3D kernel.o
 obj-y +=3D keyhandler.o
 obj-y +=3D kexec.o
--- /dev/null
+++ a/xen/common/irq.c
@@ -0,0 +1,28 @@
+#include <xen/config.h>
+#include <xen/irq.h>
+
+int init_one_irq_desc(struct irq_desc *desc)
+{
+    int err;
+
+    if (irq_desc_initialized(desc))
+        return 0;
+
+    if ( !alloc_cpumask_var(&desc->affinity) )
+        return -ENOMEM;
+
+    desc->status =3D IRQ_DISABLED;
+    desc->handler =3D &no_irq_type;
+    spin_lock_init(&desc->lock);
+    cpumask_setall(desc->affinity);
+    INIT_LIST_HEAD(&desc->rl_link);
+
+    err =3D arch_init_one_irq_desc(desc);
+    if ( err )
+    {
+        free_cpumask_var(desc->affinity);
+        desc->handler =3D NULL;
+    }
+
+    return err;
+}
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -1965,17 +1965,18 @@ static int init_vtd_hw(void)
     struct iommu_flush *flush =3D NULL;
     int ret;
     unsigned long flags;
-    struct irq_cfg *cfg;
=20
     /*
      * Basic VT-d HW init: set VT-d interrupt, clear VT-d faults. =20
      */
     for_each_drhd_unit ( drhd )
     {
+        struct irq_desc *desc;
+
         iommu =3D drhd->iommu;
=20
-        cfg =3D irq_cfg(iommu->irq);
-        dma_msi_set_affinity(irq_to_desc(iommu->irq), &cfg->cpu_mask);
+        desc =3D irq_to_desc(iommu->irq);
+        dma_msi_set_affinity(desc, desc->arch.cpu_mask);
=20
         clear_fault_bits(iommu);
=20
--- a/xen/include/asm-ia64/linux-xen/asm/irq.h
+++ b/xen/include/asm-ia64/linux-xen/asm/irq.h
@@ -18,8 +18,10 @@
 struct irq_cfg {
 #define arch_irq_desc irq_cfg
         int  vector;
-        cpumask_t cpu_mask;
+        cpumask_var_t cpu_mask;
 };
+
+int init_irq_data(void);
 #endif
=20
 static __inline__ int
--- a/xen/include/asm-x86/irq.h
+++ b/xen/include/asm-x86/irq.h
@@ -33,8 +33,9 @@ struct irq_cfg {
 #define arch_irq_desc irq_cfg
         s16 vector;                  /* vector itself is only 8 bits, */
         s16 old_vector;              /* but we use -1 for unassigned  */
-        cpumask_t cpu_mask;
-        cpumask_t old_cpu_mask;
+        cpumask_var_t cpu_mask;
+        cpumask_var_t old_cpu_mask;
+        cpumask_var_t pending_mask;
         unsigned move_cleanup_count;
         vmask_t *used_vectors;
         u8 move_in_progress : 1;
@@ -174,8 +175,6 @@ void __setup_vector_irq(int cpu);
 void move_native_irq(struct irq_desc *);
 void move_masked_irq(struct irq_desc *);
=20
-int __assign_irq_vector(int irq, struct irq_cfg *, const cpumask_t *);
-
 int bind_irq_vector(int irq, int vector, const cpumask_t *);
=20
 void irq_set_affinity(struct irq_desc *, const cpumask_t *mask);
--- a/xen/include/xen/irq.h
+++ b/xen/include/xen/irq.h
@@ -76,8 +76,7 @@ typedef struct irq_desc {
     int irq;
     spinlock_t lock;
     struct arch_irq_desc arch;
-    cpumask_t affinity;
-    cpumask_t pending_mask;  /* IRQ migration pending mask */
+    cpumask_var_t affinity;
=20
     /* irq ratelimit */
     s_time_t rl_quantum_start;
@@ -85,6 +84,11 @@ typedef struct irq_desc {
     struct list_head rl_link;
 } __cacheline_aligned irq_desc_t;
=20
+int init_one_irq_desc(struct irq_desc *);
+int arch_init_one_irq_desc(struct irq_desc *);
+
+#define irq_desc_initialized(desc) ((desc)->handler !=3D NULL)
+
 #if defined(__ia64__)
 extern irq_desc_t irq_desc[NR_VECTORS];
=20
@@ -153,7 +157,7 @@ extern irq_desc_t *pirq_spin_lock_irq_de
=20
 static inline void set_native_irq_info(unsigned int irq, const cpumask_t =
*mask)
 {
-    cpumask_copy(&irq_desc[irq].affinity, mask);
+    cpumask_copy(irq_to_desc(irq)->affinity, mask);
 }
=20
 unsigned int set_desc_affinity(struct irq_desc *, const cpumask_t *);



--=__Part85AA74B5.0__=
Content-Type: text/plain; name="irq-desc-cpumask-alloc.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="irq-desc-cpumask-alloc.patch"

IRQ: allocate CPU masks dynamically=0A=0AThis includes delaying the =
initialization of dynamically created IRQs=0Auntil their actual first use =
and some further elimination of uses of=0Astruct irq_cfg.=0A=0ASigned-off-b=
y: Jan Beulich <jbeulich@suse.com>=0A=0A--- a/xen/arch/ia64/linux-xen/irq_i=
a64.c=0A+++ b/xen/arch/ia64/linux-xen/irq_ia64.c=0A@@ -303,6 +303,9 @@ int =
__init request_irq_vector(unsigned i=0A void __init=0A init_IRQ (void)=0A =
{=0A+#ifdef XEN=0A+	BUG_ON(init_irq_data());=0A+#endif=0A 	register_pe=
rcpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL);=0A #ifdef CONFIG_SMP=0A 	=
register_percpu_irq(IA64_IPI_VECTOR, &ipi_irqaction);=0A--- a/xen/arch/ia64=
/xen/irq.c=0A+++ b/xen/arch/ia64/xen/irq.c=0A@@ -74,17 +74,30 @@ unsigned =
int __ia64_local_vector_to_irq =0A /*=0A  * Controller mappings for all =
interrupt sources:=0A  */=0A-irq_desc_t irq_desc[NR_IRQS] =3D {=0A-	[0 =
... NR_IRQS-1] =3D {=0A-		.status =3D IRQ_DISABLED,=0A-		=
.handler =3D &no_irq_type,=0A-		.lock =3D SPIN_LOCK_UNLOCKED=0A-	=
	.arch =3D {=0A-		        .vector =3D -1,=0A-		   =
     .cpu_mask =3D CPU_MASK_ALL,=0A-		}=0A+irq_desc_t irq_desc[NR=
_IRQS];=0A+=0A+int __init arch_init_one_irq_desc(struct irq_desc *desc)=0A+=
{=0A+	if (!alloc_cpumask_var(&desc->arch.cpu_mask))=0A+		=
return -ENOMEM;=0A+=0A+	desc->arch.vector =3D -1;=0A+	cpumask_setall(desc=
->arch.cpu_mask);=0A+=0A+	return 0;=0A+}=0A+=0A+int __init init_irq_d=
ata(void)=0A+{=0A+	unsigned int irq;=0A+=0A+	for (irq =3D 0; =
irq < NR_IRQS; irq++) {=0A+		struct irq_desc *desc =3D =
irq_to_desc(irq);=0A+=0A+		desc->irq =3D irq;=0A+		=
init_one_irq_desc(desc);=0A 	}=0A-};=0A+}=0A =0A void __do_IRQ_guest(int=
 irq);=0A =0A--- a/xen/arch/x86/i8259.c=0A+++ b/xen/arch/x86/i8259.c=0A@@ =
-398,7 +398,7 @@ void __init init_IRQ(void)=0A         =0A         =
desc->handler =3D &i8259A_irq_type;=0A         per_cpu(vector_irq, =
cpu)[FIRST_LEGACY_VECTOR + irq] =3D irq;=0A-        cpumask_copy(&desc->arc=
h.cpu_mask, cpumask_of(cpu));=0A+        cpumask_copy(desc->arch.cpu_mask, =
cpumask_of(cpu));=0A         desc->arch.vector =3D FIRST_LEGACY_VECTOR + =
irq;=0A     }=0A     =0A--- a/xen/arch/x86/io_apic.c=0A+++ b/xen/arch/x86/i=
o_apic.c=0A@@ -648,20 +648,21 @@ static int pin_2_irq(int idx, int apic, =
=0A void /*__init*/ setup_ioapic_dest(void)=0A {=0A     int pin, ioapic, =
irq, irq_entry;=0A-    struct irq_cfg *cfg;=0A =0A     if (skip_ioapic_setu=
p)=0A         return;=0A =0A     for (ioapic =3D 0; ioapic < nr_ioapics; =
ioapic++) {=0A         for (pin =3D 0; pin < nr_ioapic_entries[ioapic]; =
pin++) {=0A+            struct irq_desc *desc;=0A+=0A             =
irq_entry =3D find_irq_entry(ioapic, pin, mp_INT);=0A             if =
(irq_entry =3D=3D -1)=0A                 continue;=0A             irq =3D =
pin_2_irq(irq_entry, ioapic, pin);=0A-            cfg =3D irq_cfg(irq);=0A-=
            BUG_ON(cpus_empty(cfg->cpu_mask));=0A-            set_ioapic_af=
finity_irq(irq_to_desc(irq), &cfg->cpu_mask);=0A+            desc =3D =
irq_to_desc(irq);=0A+            BUG_ON(cpumask_empty(desc->arch.cpu_mask))=
;=0A+            set_ioapic_affinity_irq(desc, desc->arch.cpu_mask);=0A    =
     }=0A =0A     }=0A@@ -956,12 +957,12 @@ static void __init setup_IO_API=
C_irqs(vo=0A     struct IO_APIC_route_entry entry;=0A     int apic, pin, =
idx, irq, first_notcon =3D 1, vector;=0A     unsigned long flags;=0A-    =
struct irq_cfg *cfg;=0A =0A     apic_printk(APIC_VERBOSE, KERN_DEBUG "init =
IO_APIC IRQs\n");=0A =0A     for (apic =3D 0; apic < nr_ioapics; apic++) =
{=0A         for (pin =3D 0; pin < nr_ioapic_entries[apic]; pin++) {=0A+   =
         struct irq_desc *desc;=0A =0A             /*=0A              * =
add it to the IO-APIC irq-routing table:=0A@@ -1016,9 +1017,9 @@ static =
void __init setup_IO_APIC_irqs(vo=0A                 if (!apic && =
platform_legacy_irq(irq))=0A                     disable_8259A_irq(irq_to_d=
esc(irq));=0A             }=0A-            cfg =3D irq_cfg(irq);=0A+       =
     desc =3D irq_to_desc(irq);=0A             SET_DEST(entry.dest.dest32, =
entry.dest.logical.logical_dest,=0A-                     cpu_mask_to_apicid=
(&cfg->cpu_mask));=0A+                     cpu_mask_to_apicid(desc->arch.cp=
u_mask));=0A             spin_lock_irqsave(&ioapic_lock, flags);=0A        =
     __ioapic_write_entry(apic, pin, 0, entry);=0A             set_native_i=
rq_info(irq, TARGET_CPUS);=0A@@ -2372,7 +2373,7 @@ int ioapic_guest_write(u=
nsigned long phy=0A     rte.vector =3D cfg->vector;=0A =0A     SET_DEST(rte=
.dest.dest32, rte.dest.logical.logical_dest,=0A-             cpu_mask_to_ap=
icid(&cfg->cpu_mask));=0A+             cpu_mask_to_apicid(desc->arch.cpu_ma=
sk));=0A =0A     io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&rte) + =
0));=0A     io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&rte) + =
1));=0A--- a/xen/arch/x86/irq.c=0A+++ b/xen/arch/x86/irq.c=0A@@ -25,6 =
+25,7 @@=0A #include <public/physdev.h>=0A =0A static void parse_irq_vector=
_map_param(char *s);=0A+static int __assign_irq_vector(int irq, struct =
irq_desc *, const cpumask_t *);=0A =0A /* opt_noirqbalance: If true, =
software IRQ balancing/affinity is disabled. */=0A bool_t __read_mostly =
opt_noirqbalance =3D 0;=0A@@ -110,7 +111,7 @@ static int __init __bind_irq_=
vector(int =0A {=0A     cpumask_t online_mask;=0A     int cpu;=0A-    =
struct irq_cfg *cfg =3D irq_cfg(irq);=0A+    struct irq_desc *desc =3D =
irq_to_desc(irq);=0A =0A     BUG_ON((unsigned)irq >=3D nr_irqs);=0A     =
BUG_ON((unsigned)vector >=3D NR_VECTORS);=0A@@ -118,21 +119,22 @@ static =
int __init __bind_irq_vector(int =0A     cpumask_and(&online_mask, =
cpu_mask, &cpu_online_map);=0A     if (cpumask_empty(&online_mask))=0A     =
    return -EINVAL;=0A-    if ((cfg->vector =3D=3D vector) && cpumask_equal=
(&cfg->cpu_mask, &online_mask))=0A+    if ( (desc->arch.vector =3D=3D =
vector) &&=0A+         cpumask_equal(desc->arch.cpu_mask, &online_mask) =
)=0A         return 0;=0A-    if (cfg->vector !=3D IRQ_VECTOR_UNASSIGNED) =
=0A+    if ( desc->arch.vector !=3D IRQ_VECTOR_UNASSIGNED )=0A         =
return -EBUSY;=0A     trace_irq_mask(TRC_HW_IRQ_BIND_VECTOR, irq, vector, =
&online_mask);=0A     for_each_cpu_mask(cpu, online_mask)=0A         =
per_cpu(vector_irq, cpu)[vector] =3D irq;=0A-    cfg->vector =3D vector;=0A=
-    cpumask_copy(&cfg->cpu_mask, &online_mask);=0A-    if ( cfg->used_vect=
ors )=0A+    desc->arch.vector =3D vector;=0A+    cpumask_copy(desc->arch.c=
pu_mask, &online_mask);=0A+    if ( desc->arch.used_vectors )=0A     {=0A- =
       ASSERT(!test_bit(vector, cfg->used_vectors));=0A-        set_bit(vec=
tor, cfg->used_vectors);=0A+        ASSERT(!test_bit(vector, desc->arch.use=
d_vectors));=0A+        set_bit(vector, desc->arch.used_vectors);=0A     =
}=0A-    cfg->used =3D IRQ_USED;=0A+    desc->arch.used =3D IRQ_USED;=0A   =
  if (IO_APIC_IRQ(irq))=0A         irq_vector[irq] =3D vector;=0A     =
return 0;=0A@@ -166,14 +168,17 @@ int create_irq(void)=0A {=0A     =
unsigned long flags;=0A     int irq, ret;=0A-    irq =3D -ENOSPC;=0A+    =
struct irq_desc *desc;=0A =0A     spin_lock_irqsave(&vector_lock, =
flags);=0A =0A     irq =3D find_unassigned_irq();=0A     if (irq < 0)=0A   =
       goto out;=0A-    ret =3D __assign_irq_vector(irq, irq_cfg(irq), =
TARGET_CPUS);=0A+    desc =3D irq_to_desc(irq);=0A+    ret =3D init_one_irq=
_desc(desc);=0A+    if (!ret)=0A+        ret =3D __assign_irq_vector(irq, =
desc, TARGET_CPUS);=0A     if (ret < 0)=0A         irq =3D ret;=0A =
out:=0A@@ -197,7 +202,7 @@ static void dynamic_irq_cleanup(unsigned=0A     =
desc->msi_desc =3D NULL;=0A     desc->handler =3D &no_irq_type;=0A     =
desc->arch.used_vectors =3D NULL;=0A-    cpumask_setall(&desc->affinity);=
=0A+    cpumask_setall(desc->affinity);=0A     spin_unlock_irqrestore(&desc=
->lock, flags);=0A =0A     /* Wait to make sure it's not being used on =
another CPU */=0A@@ -211,38 +216,38 @@ static void __clear_irq_vector(int =
irq)=0A {=0A     int cpu, vector, old_vector;=0A     cpumask_t tmp_mask;=0A=
-    struct irq_cfg *cfg =3D irq_cfg(irq);=0A+    struct irq_desc *desc =
=3D irq_to_desc(irq);=0A =0A-    BUG_ON(!cfg->vector);=0A+    BUG_ON(!desc-=
>arch.vector);=0A =0A-    /* Always clear cfg->vector */=0A-    vector =3D =
cfg->vector;=0A-    cpumask_and(&tmp_mask, &cfg->cpu_mask, &cpu_online_map)=
;=0A+    /* Always clear desc->arch.vector */=0A+    vector =3D desc->arch.=
vector;=0A+    cpumask_and(&tmp_mask, desc->arch.cpu_mask, &cpu_online_map)=
;=0A =0A     for_each_cpu_mask(cpu, tmp_mask) {=0A         ASSERT( =
per_cpu(vector_irq, cpu)[vector] =3D=3D irq );=0A         per_cpu(vector_ir=
q, cpu)[vector] =3D -1;=0A     }=0A =0A-    cfg->vector =3D IRQ_VECTOR_UNAS=
SIGNED;=0A-    cpumask_clear(&cfg->cpu_mask);=0A+    desc->arch.vector =3D =
IRQ_VECTOR_UNASSIGNED;=0A+    cpumask_clear(desc->arch.cpu_mask);=0A =0A-  =
  if ( cfg->used_vectors )=0A+    if ( desc->arch.used_vectors )=0A     =
{=0A-        ASSERT(test_bit(vector, cfg->used_vectors));=0A-        =
clear_bit(vector, cfg->used_vectors);=0A+        ASSERT(test_bit(vector, =
desc->arch.used_vectors));=0A+        clear_bit(vector, desc->arch.used_vec=
tors);=0A     }=0A =0A-    cfg->used =3D IRQ_UNUSED;=0A+    desc->arch.used=
 =3D IRQ_UNUSED;=0A =0A     trace_irq_mask(TRC_HW_IRQ_CLEAR_VECTOR, irq, =
vector, &tmp_mask);=0A =0A-    if (likely(!cfg->move_in_progress))=0A+    =
if ( likely(!desc->arch.move_in_progress) )=0A         return;=0A =0A-    =
/* If we were in motion, also clear cfg->old_vector */=0A-    old_vector =
=3D cfg->old_vector;=0A-    cpumask_and(&tmp_mask, &cfg->old_cpu_mask, =
&cpu_online_map);=0A+    /* If we were in motion, also clear desc->arch.old=
_vector */=0A+    old_vector =3D desc->arch.old_vector;=0A+    cpumask_and(=
&tmp_mask, desc->arch.old_cpu_mask, &cpu_online_map);=0A =0A     for_each_c=
pu_mask(cpu, tmp_mask) {=0A         ASSERT( per_cpu(vector_irq, cpu)[old_ve=
ctor] =3D=3D irq );=0A@@ -250,16 +255,16 @@ static void __clear_irq_vector(=
int irq)=0A         per_cpu(vector_irq, cpu)[old_vector] =3D -1;=0A      =
}=0A =0A-    cfg->old_vector =3D IRQ_VECTOR_UNASSIGNED;=0A-    cpumask_clea=
r(&cfg->old_cpu_mask);=0A+    desc->arch.old_vector =3D IRQ_VECTOR_UNASSIGN=
ED;=0A+    cpumask_clear(desc->arch.old_cpu_mask);=0A =0A-    if ( =
cfg->used_vectors )=0A+    if ( desc->arch.used_vectors )=0A     {=0A-     =
   ASSERT(test_bit(old_vector, cfg->used_vectors));=0A-        clear_bit(ol=
d_vector, cfg->used_vectors);=0A+        ASSERT(test_bit(old_vector, =
desc->arch.used_vectors));=0A+        clear_bit(old_vector, desc->arch.used=
_vectors);=0A     }=0A =0A-    cfg->move_in_progress =3D 0;=0A+    =
desc->arch.move_in_progress =3D 0;=0A }=0A =0A void clear_irq_vector(int =
irq)=0A@@ -296,25 +301,28 @@ int irq_to_vector(int irq)=0A     return =
vector;=0A }=0A =0A-static void __init init_one_irq_desc(struct irq_desc =
*desc)=0A+int arch_init_one_irq_desc(struct irq_desc *desc)=0A {=0A-    =
desc->status  =3D IRQ_DISABLED;=0A-    desc->handler =3D &no_irq_type;=0A- =
   desc->action  =3D NULL;=0A-    desc->msi_desc =3D NULL;=0A-    =
spin_lock_init(&desc->lock);=0A-    cpumask_setall(&desc->affinity);=0A-   =
 INIT_LIST_HEAD(&desc->rl_link);=0A-}=0A+    if ( !zalloc_cpumask_var(&desc=
->arch.cpu_mask) )=0A+        return -ENOMEM;=0A+=0A+    if ( !alloc_cpumas=
k_var(&desc->arch.old_cpu_mask) )=0A+    {=0A+        free_cpumask_var(desc=
->arch.cpu_mask);=0A+        return -ENOMEM;=0A+    }=0A =0A-static void =
__init init_one_irq_cfg(struct irq_cfg *cfg)=0A-{=0A-    cfg->vector =3D =
IRQ_VECTOR_UNASSIGNED;=0A-    cfg->old_vector =3D IRQ_VECTOR_UNASSIGNED;=0A=
-    cpumask_clear(&cfg->cpu_mask);=0A-    cpumask_clear(&cfg->old_cpu_mask=
);=0A-    cfg->used_vectors =3D NULL;=0A-    cfg->used =3D IRQ_UNUSED;=0A+ =
   if ( !alloc_cpumask_var(&desc->arch.pending_mask) )=0A+    {=0A+        =
free_cpumask_var(desc->arch.old_cpu_mask);=0A+        free_cpumask_var(desc=
->arch.cpu_mask);=0A+        return -ENOMEM;=0A+    }=0A+=0A+    desc->arch=
.vector =3D IRQ_VECTOR_UNASSIGNED;=0A+    desc->arch.old_vector =3D =
IRQ_VECTOR_UNASSIGNED;=0A+=0A+    return 0;=0A }=0A =0A int __init =
init_irq_data(void)=0A@@ -331,12 +339,13 @@ int __init init_irq_data(void)=
=0A     if ( !irq_desc || !irq_vector )=0A         return -ENOMEM;=0A =0A- =
   for (irq =3D 0; irq < nr_irqs; irq++) {=0A+    for (irq =3D 0; irq < =
nr_irqs_gsi; irq++) {=0A         desc =3D irq_to_desc(irq);=0A         =
desc->irq =3D irq;=0A         init_one_irq_desc(desc);=0A-        =
init_one_irq_cfg(&desc->arch);=0A     }=0A+    for (; irq < nr_irqs; =
irq++)=0A+        irq_to_desc(irq)->irq =3D irq;=0A =0A     /* Never =
allocate the hypercall vector or Linux/BSD fast-trap vector. */=0A     =
set_bit(LEGACY_SYSCALL_VECTOR, used_vectors);=0A@@ -403,7 +412,8 @@ static =
vmask_t *irq_get_used_vector_mask=0A     return ret;=0A }=0A =0A-int =
__assign_irq_vector(int irq, struct irq_cfg *cfg, const cpumask_t =
*mask)=0A+static int __assign_irq_vector(=0A+    int irq, struct irq_desc =
*desc, const cpumask_t *mask)=0A {=0A     /*=0A      * NOTE! The local =
APIC isn't very good at handling=0A@@ -426,13 +436,13 @@ int __assign_irq_v=
ector(int irq, struct =0A     old_vector =3D irq_to_vector(irq);=0A     if =
(old_vector) {=0A         cpumask_and(&tmp_mask, mask, &cpu_online_map);=0A=
-        if (cpumask_intersects(&tmp_mask, &cfg->cpu_mask)) {=0A-          =
  cfg->vector =3D old_vector;=0A+        if (cpumask_intersects(&tmp_mask, =
desc->arch.cpu_mask)) {=0A+            desc->arch.vector =3D old_vector;=0A=
             return 0;=0A         }=0A     }=0A =0A-    if ((cfg->move_in_p=
rogress) || cfg->move_cleanup_count)=0A+    if ( desc->arch.move_in_progres=
s || desc->arch.move_cleanup_count )=0A         return -EAGAIN;=0A =0A     =
err =3D -ENOSPC;=0A@@ -440,9 +450,9 @@ int __assign_irq_vector(int irq, =
struct =0A     /* This is the only place normal IRQs are ever marked=0A    =
  * as "in use".  If they're not in use yet, check to see=0A      * if we =
need to assign a global vector mask. */=0A-    if ( cfg->used =3D=3D =
IRQ_USED )=0A+    if ( desc->arch.used =3D=3D IRQ_USED )=0A     {=0A-      =
  irq_used_vectors =3D cfg->used_vectors;=0A+        irq_used_vectors =3D =
desc->arch.used_vectors;=0A     }=0A     else=0A         irq_used_vectors =
=3D irq_get_used_vector_mask(irq);=0A@@ -485,29 +495,29 @@ next:=0A        =
 current_offset =3D offset;=0A         local_irq_save(flags);=0A         =
if (old_vector) {=0A-            cfg->move_in_progress =3D 1;=0A-          =
  cpumask_copy(&cfg->old_cpu_mask, &cfg->cpu_mask);=0A-            =
cfg->old_vector =3D cfg->vector;=0A+            desc->arch.move_in_progress=
 =3D 1;=0A+            cpumask_copy(desc->arch.old_cpu_mask, desc->arch.cpu=
_mask);=0A+            desc->arch.old_vector =3D desc->arch.vector;=0A     =
    }=0A         trace_irq_mask(TRC_HW_IRQ_ASSIGN_VECTOR, irq, vector, =
&tmp_mask);=0A         for_each_cpu_mask(new_cpu, tmp_mask)=0A             =
per_cpu(vector_irq, new_cpu)[vector] =3D irq;=0A-        cfg->vector =3D =
vector;=0A-        cpumask_copy(&cfg->cpu_mask, &tmp_mask);=0A+        =
desc->arch.vector =3D vector;=0A+        cpumask_copy(desc->arch.cpu_mask, =
&tmp_mask);=0A =0A-        cfg->used =3D IRQ_USED;=0A-        ASSERT((cfg->=
used_vectors =3D=3D NULL)=0A-               || (cfg->used_vectors =3D=3D =
irq_used_vectors));=0A-        cfg->used_vectors =3D irq_used_vectors;=0A+ =
       desc->arch.used =3D IRQ_USED;=0A+        ASSERT((desc->arch.used_vec=
tors =3D=3D NULL)=0A+               || (desc->arch.used_vectors =3D=3D =
irq_used_vectors));=0A+        desc->arch.used_vectors =3D irq_used_vectors=
;=0A =0A         if (IO_APIC_IRQ(irq))=0A             irq_vector[irq] =3D =
vector;=0A =0A-        if ( cfg->used_vectors )=0A+        if ( desc->arch.=
used_vectors )=0A         {=0A-            ASSERT(!test_bit(vector, =
cfg->used_vectors));=0A+            ASSERT(!test_bit(vector, desc->arch.use=
d_vectors));=0A =0A-            set_bit(vector, cfg->used_vectors);=0A+    =
        set_bit(vector, desc->arch.used_vectors);=0A         }=0A =0A      =
   err =3D 0;=0A@@ -521,16 +531,15 @@ int assign_irq_vector(int irq)=0A =
{=0A     int ret;=0A     unsigned long flags;=0A-    struct irq_cfg *cfg =
=3D irq_cfg(irq);=0A     struct irq_desc *desc =3D irq_to_desc(irq);=0A    =
 =0A     BUG_ON(irq >=3D nr_irqs || irq <0);=0A =0A     spin_lock_irqsave(&=
vector_lock, flags);=0A-    ret =3D __assign_irq_vector(irq, cfg, =
TARGET_CPUS);=0A+    ret =3D __assign_irq_vector(irq, desc, TARGET_CPUS);=
=0A     if (!ret) {=0A-        ret =3D cfg->vector;=0A-        cpumask_copy=
(&desc->affinity, &cfg->cpu_mask);=0A+        ret =3D desc->arch.vector;=0A=
+        cpumask_copy(desc->affinity, desc->arch.cpu_mask);=0A     }=0A    =
 spin_unlock_irqrestore(&vector_lock, flags);=0A     return ret;=0A@@ =
-543,15 +552,16 @@ int assign_irq_vector(int irq)=0A void __setup_vector_ir=
q(int cpu)=0A {=0A     int irq, vector;=0A-    struct irq_cfg *cfg;=0A =0A =
    /* Clear vector_irq */=0A     for (vector =3D 0; vector < NR_VECTORS; =
++vector)=0A         per_cpu(vector_irq, cpu)[vector] =3D -1;=0A     /* =
Mark the inuse vectors */=0A     for (irq =3D 0; irq < nr_irqs; ++irq) =
{=0A-        cfg =3D irq_cfg(irq);=0A-        if (!cpu_isset(cpu, =
cfg->cpu_mask))=0A+        struct irq_desc *desc =3D irq_to_desc(irq);=0A+=
=0A+        if (!irq_desc_initialized(desc) ||=0A+            !cpumask_test=
_cpu(cpu, desc->arch.cpu_mask))=0A             continue;=0A         vector =
=3D irq_to_vector(irq);=0A         per_cpu(vector_irq, cpu)[vector] =3D =
irq;=0A@@ -560,12 +570,14 @@ void __setup_vector_irq(int cpu)=0A =0A void =
move_masked_irq(struct irq_desc *desc)=0A {=0A+    cpumask_t *pending_mask =
=3D desc->arch.pending_mask;=0A+=0A     if (likely(!(desc->status & =
IRQ_MOVE_PENDING)))=0A         return;=0A     =0A     desc->status &=3D =
~IRQ_MOVE_PENDING;=0A =0A-    if (unlikely(cpus_empty(desc->pending_mask)))=
=0A+    if (unlikely(cpumask_empty(pending_mask)))=0A         return;=0A =
=0A     if (!desc->handler->set_affinity)=0A@@ -580,10 +592,10 @@ void =
move_masked_irq(struct irq_desc *de=0A      *=0A      * For correct =
operation this depends on the caller masking the irqs.=0A      */=0A-    =
if (likely(cpus_intersects(desc->pending_mask, cpu_online_map)))=0A-       =
 desc->handler->set_affinity(desc, &desc->pending_mask);=0A+    if ( =
likely(cpumask_intersects(pending_mask, &cpu_online_map)) )=0A+        =
desc->handler->set_affinity(desc, pending_mask);=0A =0A-    cpumask_clear(&=
desc->pending_mask);=0A+    cpumask_clear(pending_mask);=0A }=0A =0A void =
move_native_irq(struct irq_desc *desc)=0A@@ -626,7 +638,8 @@ fastcall void =
smp_irq_move_cleanup_inter=0A         if (!desc->arch.move_cleanup_count)=
=0A             goto unlock;=0A =0A-        if (vector =3D=3D desc->arch.ve=
ctor && cpumask_test_cpu(me, &desc->arch.cpu_mask))=0A+        if ( vector =
=3D=3D desc->arch.vector &&=0A+             cpumask_test_cpu(me, desc->arch=
.cpu_mask) )=0A             goto unlock;=0A =0A         irr =3D apic_read(A=
PIC_IRR + (vector / 32 * 0x10));=0A@@ -653,7 +666,7 @@ fastcall void =
smp_irq_move_cleanup_inter=0A         if ( desc->arch.move_cleanup_count =
=3D=3D 0 )=0A         {=0A             desc->arch.old_vector =3D IRQ_VECTOR=
_UNASSIGNED;=0A-            cpumask_clear(&desc->arch.old_cpu_mask);=0A+   =
         cpumask_clear(desc->arch.old_cpu_mask);=0A =0A             if ( =
desc->arch.used_vectors )=0A             {=0A@@ -673,7 +686,7 @@ static =
void send_cleanup_vector(struct i=0A {=0A     cpumask_t cleanup_mask;=0A =
=0A-    cpumask_and(&cleanup_mask, &desc->arch.old_cpu_mask, &cpu_online_ma=
p);=0A+    cpumask_and(&cleanup_mask, desc->arch.old_cpu_mask, &cpu_online_=
map);=0A     desc->arch.move_cleanup_count =3D cpumask_weight(&cleanup_mask=
);=0A     genapic->send_IPI_mask(&cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR);=
=0A =0A@@ -690,7 +703,8 @@ void irq_complete_move(struct irq_desc *=0A     =
vector =3D get_irq_regs()->entry_vector;=0A     me =3D smp_processor_id();=
=0A =0A-    if (vector =3D=3D desc->arch.vector && cpumask_test_cpu(me, =
&desc->arch.cpu_mask))=0A+    if ( vector =3D=3D desc->arch.vector &&=0A+  =
       cpumask_test_cpu(me, desc->arch.cpu_mask) )=0A         send_cleanup_=
vector(desc);=0A }=0A =0A@@ -708,15 +722,15 @@ unsigned int set_desc_affini=
ty(struct ir=0A =0A     local_irq_save(flags);=0A     lock_vector_lock();=
=0A-    ret =3D __assign_irq_vector(irq, &desc->arch, mask);=0A+    ret =
=3D __assign_irq_vector(irq, desc, mask);=0A     unlock_vector_lock();=0A  =
   local_irq_restore(flags);=0A =0A     if (ret < 0)=0A         return =
BAD_APICID;=0A =0A-    cpumask_copy(&desc->affinity, mask);=0A-    =
cpumask_and(&dest_mask, mask, &desc->arch.cpu_mask);=0A+    cpumask_copy(de=
sc->affinity, mask);=0A+    cpumask_and(&dest_mask, mask, desc->arch.cpu_ma=
sk);=0A =0A     return cpu_mask_to_apicid(&dest_mask);=0A }=0A@@ -730,7 =
+744,7 @@ void irq_set_affinity(struct irq_desc *d=0A     ASSERT(spin_is_lo=
cked(&desc->lock));=0A     desc->status &=3D ~IRQ_MOVE_PENDING;=0A     =
wmb();=0A-    cpumask_copy(&desc->pending_mask, mask);=0A+    cpumask_copy(=
desc->arch.pending_mask, mask);=0A     wmb();=0A     desc->status |=3D =
IRQ_MOVE_PENDING;=0A }=0A@@ -1992,13 +2006,13 @@ static void dump_irqs(unsi=
gned char key)=0A =0A         desc =3D irq_to_desc(irq);=0A =0A-        if =
( !desc->handler || desc->handler =3D=3D &no_irq_type )=0A+        if ( =
!irq_desc_initialized(desc) || desc->handler =3D=3D &no_irq_type )=0A      =
       continue;=0A =0A         spin_lock_irqsave(&desc->lock, flags);=0A =
=0A         cpumask_scnprintf(keyhandler_scratch, sizeof(keyhandler_scratch=
),=0A-                          &desc->affinity);=0A+                      =
    desc->affinity);=0A         printk("   IRQ:%4d affinity:%s vec:%02x =
type=3D%-15s"=0A                " status=3D%08x ",=0A                irq, =
keyhandler_scratch, desc->arch.vector,=0A@@ -2073,10 +2087,12 @@ void =
fixup_irqs(void)=0A             continue;=0A =0A         desc =3D =
irq_to_desc(irq);=0A+        if ( !irq_desc_initialized(desc) )=0A+        =
    continue;=0A =0A         spin_lock(&desc->lock);=0A =0A-        =
cpumask_copy(&affinity, &desc->affinity);=0A+        cpumask_copy(&affinity=
, desc->affinity);=0A         if ( !desc->action || cpumask_subset(&affinit=
y, &cpu_online_map) )=0A         {=0A             spin_unlock(&desc->lock);=
=0A--- a/xen/arch/x86/msi.c=0A+++ b/xen/arch/x86/msi.c=0A@@ -125,13 =
+125,13 @@ void msi_compose_msg(struct irq_desc *de=0A     unsigned =
dest;=0A     int vector =3D desc->arch.vector;=0A =0A-    if ( cpumask_empt=
y(&desc->arch.cpu_mask) ) {=0A+    if ( cpumask_empty(desc->arch.cpu_mask) =
) {=0A         dprintk(XENLOG_ERR,"%s, compose msi message error!!\n", =
__func__);=0A         return;=0A     }=0A =0A     if ( vector ) {=0A-      =
  dest =3D cpu_mask_to_apicid(&desc->arch.cpu_mask);=0A+        dest =3D =
cpu_mask_to_apicid(desc->arch.cpu_mask);=0A =0A         msg->address_hi =
=3D MSI_ADDR_BASE_HI;=0A         msg->address_lo =3D=0A--- a/xen/arch/x86/s=
mpboot.c=0A+++ b/xen/arch/x86/smpboot.c=0A@@ -1011,7 +1011,7 @@ void =
__init smp_intr_init(void)=0A         irq_vector[irq] =3D FIRST_HIPRIORITY_=
VECTOR + seridx + 1;=0A         per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_V=
ECTOR + seridx + 1] =3D irq;=0A         irq_to_desc(irq)->arch.vector =3D =
FIRST_HIPRIORITY_VECTOR + seridx + 1;=0A-        cpumask_copy(&irq_to_desc(=
irq)->arch.cpu_mask, &cpu_online_map);=0A+        cpumask_copy(irq_to_desc(=
irq)->arch.cpu_mask, &cpu_online_map);=0A     }=0A =0A     /* IPI for =
cleanuping vectors after irq move */=0A--- a/xen/common/Makefile=0A+++ =
b/xen/common/Makefile=0A@@ -5,6 +5,7 @@ obj-y +=3D domctl.o=0A obj-y +=3D =
domain.o=0A obj-y +=3D event_channel.o=0A obj-y +=3D grant_table.o=0A+obj-y=
 +=3D irq.o=0A obj-y +=3D kernel.o=0A obj-y +=3D keyhandler.o=0A obj-y =
+=3D kexec.o=0A--- /dev/null=0A+++ a/xen/common/irq.c=0A@@ -0,0 +1,28 =
@@=0A+#include <xen/config.h>=0A+#include <xen/irq.h>=0A+=0A+int init_one_i=
rq_desc(struct irq_desc *desc)=0A+{=0A+    int err;=0A+=0A+    if =
(irq_desc_initialized(desc))=0A+        return 0;=0A+=0A+    if ( =
!alloc_cpumask_var(&desc->affinity) )=0A+        return -ENOMEM;=0A+=0A+   =
 desc->status =3D IRQ_DISABLED;=0A+    desc->handler =3D &no_irq_type;=0A+ =
   spin_lock_init(&desc->lock);=0A+    cpumask_setall(desc->affinity);=0A+ =
   INIT_LIST_HEAD(&desc->rl_link);=0A+=0A+    err =3D arch_init_one_irq_des=
c(desc);=0A+    if ( err )=0A+    {=0A+        free_cpumask_var(desc->affin=
ity);=0A+        desc->handler =3D NULL;=0A+    }=0A+=0A+    return =
err;=0A+}=0A--- a/xen/drivers/passthrough/vtd/iommu.c=0A+++ b/xen/drivers/p=
assthrough/vtd/iommu.c=0A@@ -1965,17 +1965,18 @@ static int init_vtd_hw(voi=
d)=0A     struct iommu_flush *flush =3D NULL;=0A     int ret;=0A     =
unsigned long flags;=0A-    struct irq_cfg *cfg;=0A =0A     /*=0A      * =
Basic VT-d HW init: set VT-d interrupt, clear VT-d faults.  =0A      */=0A =
    for_each_drhd_unit ( drhd )=0A     {=0A+        struct irq_desc =
*desc;=0A+=0A         iommu =3D drhd->iommu;=0A =0A-        cfg =3D =
irq_cfg(iommu->irq);=0A-        dma_msi_set_affinity(irq_to_desc(iommu->irq=
), &cfg->cpu_mask);=0A+        desc =3D irq_to_desc(iommu->irq);=0A+       =
 dma_msi_set_affinity(desc, desc->arch.cpu_mask);=0A =0A         clear_faul=
t_bits(iommu);=0A =0A--- a/xen/include/asm-ia64/linux-xen/asm/irq.h=0A+++ =
b/xen/include/asm-ia64/linux-xen/asm/irq.h=0A@@ -18,8 +18,10 @@=0A struct =
irq_cfg {=0A #define arch_irq_desc irq_cfg=0A         int  vector;=0A-     =
   cpumask_t cpu_mask;=0A+        cpumask_var_t cpu_mask;=0A };=0A+=0A+int =
init_irq_data(void);=0A #endif=0A =0A static __inline__ int=0A--- =
a/xen/include/asm-x86/irq.h=0A+++ b/xen/include/asm-x86/irq.h=0A@@ -33,8 =
+33,9 @@ struct irq_cfg {=0A #define arch_irq_desc irq_cfg=0A         s16 =
vector;                  /* vector itself is only 8 bits, */=0A         =
s16 old_vector;              /* but we use -1 for unassigned  */=0A-       =
 cpumask_t cpu_mask;=0A-        cpumask_t old_cpu_mask;=0A+        =
cpumask_var_t cpu_mask;=0A+        cpumask_var_t old_cpu_mask;=0A+        =
cpumask_var_t pending_mask;=0A         unsigned move_cleanup_count;=0A     =
    vmask_t *used_vectors;=0A         u8 move_in_progress : 1;=0A@@ -174,8 =
+175,6 @@ void __setup_vector_irq(int cpu);=0A void move_native_irq(struct =
irq_desc *);=0A void move_masked_irq(struct irq_desc *);=0A =0A-int =
__assign_irq_vector(int irq, struct irq_cfg *, const cpumask_t *);=0A-=0A =
int bind_irq_vector(int irq, int vector, const cpumask_t *);=0A =0A void =
irq_set_affinity(struct irq_desc *, const cpumask_t *mask);=0A--- =
a/xen/include/xen/irq.h=0A+++ b/xen/include/xen/irq.h=0A@@ -76,8 +76,7 @@ =
typedef struct irq_desc {=0A     int irq;=0A     spinlock_t lock;=0A     =
struct arch_irq_desc arch;=0A-    cpumask_t affinity;=0A-    cpumask_t =
pending_mask;  /* IRQ migration pending mask */=0A+    cpumask_var_t =
affinity;=0A =0A     /* irq ratelimit */=0A     s_time_t rl_quantum_start;=
=0A@@ -85,6 +84,11 @@ typedef struct irq_desc {=0A     struct list_head =
rl_link;=0A } __cacheline_aligned irq_desc_t;=0A =0A+int init_one_irq_desc(=
struct irq_desc *);=0A+int arch_init_one_irq_desc(struct irq_desc =
*);=0A+=0A+#define irq_desc_initialized(desc) ((desc)->handler !=3D =
NULL)=0A+=0A #if defined(__ia64__)=0A extern irq_desc_t irq_desc[NR_VECTORS=
];=0A =0A@@ -153,7 +157,7 @@ extern irq_desc_t *pirq_spin_lock_irq_de=0A =
=0A static inline void set_native_irq_info(unsigned int irq, const =
cpumask_t *mask)=0A {=0A-    cpumask_copy(&irq_desc[irq].affinity, =
mask);=0A+    cpumask_copy(irq_to_desc(irq)->affinity, mask);=0A }=0A =0A =
unsigned int set_desc_affinity(struct irq_desc *, const cpumask_t *);=0A
--=__Part85AA74B5.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part85AA74B5.0__=--


From xen-devel-bounces@lists.xensource.com Thu Nov 03 07:29:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 07:29:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLyHw-0000wu-IE; Thu, 03 Nov 2011 07:29:05 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLyGS-0000Nt-W8
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 07:27:33 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1320330449!2790956!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24106 invoked from network); 3 Nov 2011 14:27:29 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 14:27:29 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 03 Nov 2011 14:27:29 +0000
Message-Id: <4EB2B2DF020000780005EBF0@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 03 Nov 2011 14:27:27 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__PartEFC01EDF.0__="
Subject: [Xen-devel] [PATCH 2/2] x86/IRQ: consolidate IRQ disabling when
	acquiring vector lock
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__PartEFC01EDF.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

x86/IRQ: consolidate IRQ disabling when acquiring vector lock

__assign_irq_vector() doesn't need to disable interrupts (its callers
are required to when acquiring the lock), and set_desc_affinity() can
use the normal spin lock primitives.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -429,7 +429,6 @@ static int __assign_irq_vector(
     static int current_vector =3D FIRST_DYNAMIC_VECTOR, current_offset =
=3D 0;
     unsigned int old_vector;
     int cpu, err;
-    unsigned long flags;
     cpumask_t tmp_mask;
     vmask_t *irq_used_vectors =3D NULL;
=20
@@ -493,7 +492,6 @@ next:
         /* Found one! */
         current_vector =3D vector;
         current_offset =3D offset;
-        local_irq_save(flags);
         if (old_vector) {
             desc->arch.move_in_progress =3D 1;
             cpumask_copy(desc->arch.old_cpu_mask, desc->arch.cpu_mask);
@@ -521,7 +519,6 @@ next:
         }
=20
         err =3D 0;
-        local_irq_restore(flags);
         break;
     }
     return err;
@@ -720,11 +717,9 @@ unsigned int set_desc_affinity(struct ir
=20
     irq =3D desc->irq;
=20
-    local_irq_save(flags);
-    lock_vector_lock();
+    spin_lock_irqsave(&vector_lock, flags);
     ret =3D __assign_irq_vector(irq, desc, mask);
-    unlock_vector_lock();
-    local_irq_restore(flags);
+    spin_unlock_irqrestore(&vector_lock, flags);
=20
     if (ret < 0)
         return BAD_APICID;




--=__PartEFC01EDF.0__=
Content-Type: text/plain; name="x86-vector-lock-flags.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="x86-vector-lock-flags.patch"

x86/IRQ: consolidate IRQ disabling when acquiring vector lock=0A=0A__assign=
_irq_vector() doesn't need to disable interrupts (its callers=0Aare =
required to when acquiring the lock), and set_desc_affinity() can=0Ause =
the normal spin lock primitives.=0A=0ASigned-off-by: Jan Beulich <jbeulich@=
suse.com>=0A=0A--- a/xen/arch/x86/irq.c=0A+++ b/xen/arch/x86/irq.c=0A@@ =
-429,7 +429,6 @@ static int __assign_irq_vector(=0A     static int =
current_vector =3D FIRST_DYNAMIC_VECTOR, current_offset =3D 0;=0A     =
unsigned int old_vector;=0A     int cpu, err;=0A-    unsigned long =
flags;=0A     cpumask_t tmp_mask;=0A     vmask_t *irq_used_vectors =3D =
NULL;=0A =0A@@ -493,7 +492,6 @@ next:=0A         /* Found one! */=0A       =
  current_vector =3D vector;=0A         current_offset =3D offset;=0A-     =
   local_irq_save(flags);=0A         if (old_vector) {=0A             =
desc->arch.move_in_progress =3D 1;=0A             cpumask_copy(desc->arch.o=
ld_cpu_mask, desc->arch.cpu_mask);=0A@@ -521,7 +519,6 @@ next:=0A         =
}=0A =0A         err =3D 0;=0A-        local_irq_restore(flags);=0A        =
 break;=0A     }=0A     return err;=0A@@ -720,11 +717,9 @@ unsigned int =
set_desc_affinity(struct ir=0A =0A     irq =3D desc->irq;=0A =0A-    =
local_irq_save(flags);=0A-    lock_vector_lock();=0A+    spin_lock_irqsave(=
&vector_lock, flags);=0A     ret =3D __assign_irq_vector(irq, desc, =
mask);=0A-    unlock_vector_lock();=0A-    local_irq_restore(flags);=0A+   =
 spin_unlock_irqrestore(&vector_lock, flags);=0A =0A     if (ret < 0)=0A   =
      return BAD_APICID;=0A
--=__PartEFC01EDF.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__PartEFC01EDF.0__=--


From xen-devel-bounces@lists.xensource.com Thu Nov 03 07:29:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 07:29:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLyIj-0001JV-GC; Thu, 03 Nov 2011 07:29:53 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLyI2-0000xX-89
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 07:29:10 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320330518!51718926!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 584 invoked from network); 3 Nov 2011 14:28:38 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-5.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 14:28:38 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RLyHx-000IQK-18; Thu, 03 Nov 2011 14:29:05 +0000
Date: Thu, 3 Nov 2011 14:29:04 +0000
From: Tim Deegan <tim@xen.org>
To: andres@lagarcavilla.com
Subject: Re: [Xen-devel] [PATCH 5 of 9] Fine-grained concurrency control
	structure for the p2m
Message-ID: <20111103142904.GD66800@ocelot.phlegethon.org>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<a23e1262b1240dcabfa0.1319690030@xdev.gridcentric.ca>
	<20111027144333.GM59656@ocelot.phlegethon.org>
	<69a325bb9604ffab3cd84c4951c34641.squirrel@webmail.lagarcavilla.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <69a325bb9604ffab3cd84c4951c34641.squirrel@webmail.lagarcavilla.org>
User-Agent: Mutt/1.4.2.1i
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, andres@gridcentric.ca,
	keir.xen@gmail.com, Andres Lagar-Cavilla <andres@lagarcavilla.org>,
	adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi, 

At 07:20 -0700 on 02 Nov (1320218409), andres@lagarcavilla.com wrote:
> > I suspect that if this is a contention point, allowing multiple readers
> > will become important, especially if there are particular pages that
> > often get emulated access.
> >
> > And also, I'd  like to get some sort of plan for handling long-lived
> > foreign mappings, if only to make sure that this phase-1 fix doesn't
> > conflict wih it.
> >
> 
> If foreign mappings will hold a lock/ref on a p2m subrange, then they'll
> disallow global operations, and you'll get a clash between log-dirty and,
> say, qemu. Ka-blam live migration.

Yep.  That's a tricky one.  Log-dirty could be special-cased but I guess
we'll have the same problem with paging, mem-event &c. :(

> Read-only foreign mappings are only problematic insofar paging happens.
> With proper p2m update/lookups serialization (global or fine-grained) that
> problem is gone.
> 
> Write-able foreign mappings are trickier because of sharing and w^x. Is
> there a reason left, today, to not type PGT_writable an hvm-domain's page
> when a foreign mapping happens?

Unfortunately, yes.  The shadow pagetable code uses the typecount to
detect whether the guest has any writeable mappings of the page; without
that it would have to brute-force search all the L1 shadows in order to
be sure that it had write-protected a page.

> That would solve sharing problems. w^x
> really can't be solved short of putting the vcpu on a waitqueue
> (preferable to me), or destroying the mapping and forcing the foreign OS
> to remap later. All a few steps ahead, I hope.

OK, so if I understand correctly your plan is to add this mutual
exclusion for all other users of the p2m (emulation &c) but leave
foreign mappings alone for now, with the general plan of fixing that up
using waitqueues.  That's OK by me.

> Who/what's using w^x by the way? If the refcount is zero, I think I know
> what I'll do ;)

I think the original authors are using it in their product.  I haven't
heard of any other users but there might be some. 

> What is a real problem is that pod sweeps can cause deadlocks. There is a
> simple step to mitigate this: start the sweep from the current gfn and
> never wrap around -- too bad if the gfn is too high. But this alters the
> sweeping algorithm. I'll deal with it when its it's turn.

OK.  If there's some chance that Olaf can make PoD a special case of
paging maybe we can get rid of the sweeps altogether (i.e., have the
domain pause when it runs out of PoD and let the pager fix it up).  But
I know George has spent a fair amount of time tuning the performance of
PoD so that may not be acceptable. 

Cheers,

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 07:33:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 07:33:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLyMh-0001ml-P0; Thu, 03 Nov 2011 07:33:59 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLyMA-0001aZ-4K
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 07:33:26 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-5.tower-182.messagelabs.com!1320330802!1840332!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12134 invoked from network); 3 Nov 2011 14:33:22 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-5.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 14:33:22 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RLyM6-000IRJ-1N; Thu, 03 Nov 2011 14:33:22 +0000
Date: Thu, 3 Nov 2011 14:33:21 +0000
From: Tim Deegan <tim@xen.org>
To: andres@lagarcavilla.com
Subject: Re: [Xen-devel] [PATCH 8 of 9] Modify all internal p2m functions to
	use the new fine-grained locking
Message-ID: <20111103143321.GE66800@ocelot.phlegethon.org>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<471d4f2754d6516d5926.1319690033@xdev.gridcentric.ca>
	<20111027145711.GN59656@ocelot.phlegethon.org>
	<6aba1d62ce4c04d03baacb87c5453273.squirrel@webmail.lagarcavilla.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <6aba1d62ce4c04d03baacb87c5453273.squirrel@webmail.lagarcavilla.org>
User-Agent: Mutt/1.4.2.1i
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, andres@gridcentric.ca,
	keir.xen@gmail.com, Andres Lagar-Cavilla <andres@lagarcavilla.org>,
	adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi, 

At 07:24 -0700 on 02 Nov (1320218674), andres@lagarcavilla.com wrote:
> >> +/* No matter what value you get out of a query, the p2m has been locked
> >> for
> >> + * that range. No matter what you do, you need to drop those locks.
> >> + * You need to pass back the mfn obtained when locking, not the new
> >> one,
> >> + * as the refcount of the original mfn was bumped. */
> >
> > Surely the caller doesn't need to remember the old MFN for this?  After
> > allm, the whole point of the lock was that nobody else could change the
> > p2m entry under our feet!
> >
> > In any case, I thing there needs to be a big block comment a bit futher
> > up that describes what all this locking and refcounting does, and why.
> 
> Comment will be added. I was being doubly-paranoid. I can undo the
> get_page/put_page of the old mfn. I'm not a 100% behind it.

I meant to suggest that the p2m code should me able to do the
get_page/put_page without the caller remembering the mfn, since by
definition it should be able to look it up in the unlock, knowing no-one
else can have changed it. 

> I don't think these names are the most terrible -- we've all seen far
> worse :) I mean, the naming encodes the arguments, and I don't see an
> intrinsic advantage to
> gfn_to_mfn(d, g, t, p2m_guest, p2m_unlocked)
> over
> gfn_to_mfn_guest_unlocked(d,g,t)

Yep, it's definitely not the worst. :)  It's really just a question of
verbosity in the headers.

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 07:38:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 07:38:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLyRJ-0002DN-UN; Thu, 03 Nov 2011 07:38:45 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLyQj-00021M-RB
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 07:38:10 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-4.tower-174.messagelabs.com!1320331086!178560!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15776 invoked from network); 3 Nov 2011 14:38:06 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-4.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	3 Nov 2011 14:38:06 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RLyQf-000ISa-I1; Thu, 03 Nov 2011 14:38:05 +0000
Date: Thu, 3 Nov 2011 14:38:05 +0000
From: Tim Deegan <tim@xen.org>
To: andres@lagarcavilla.com
Subject: Re: [Xen-devel] [PATCH 9 of 9] Modify all call sites of queries into
	the p2m to use the new fine-grained locking
Message-ID: <20111103143805.GF66800@ocelot.phlegethon.org>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<d13f91c2fe18d58ad27f.1319690034@xdev.gridcentric.ca>
	<20111027150207.GO59656@ocelot.phlegethon.org>
	<2edecee6fa102acb9973b1ef1e71a65d.squirrel@webmail.lagarcavilla.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <2edecee6fa102acb9973b1ef1e71a65d.squirrel@webmail.lagarcavilla.org>
User-Agent: Mutt/1.4.2.1i
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, andres@gridcentric.ca,
	keir.xen@gmail.com, Andres Lagar-Cavilla <andres@lagarcavilla.org>,
	adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 07:32 -0700 on 02 Nov (1320219175), andres@lagarcavilla.com wrote:
> I don't know that a massive sed on all these names is a good idea. I guess
> forcing everyone to compile-fail will also make them realize they need to
> add a call to drop the p2m locks they got...
> 
> Can you elaborate on the naming preferences here: would you prefer
> gfn_to_mfn/put_gfn? get_p2m_gfn/put_p2m_gfn? get_gfn/put_gfn

I think I'd prefer get_gfn/put_gfn.  And maybe set_gfn for writes too?
But I'm willing to be persuaded otherwise if anyone feels strongly about
it.

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 07:46:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 07:46:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLyZ4-000425-FH; Thu, 03 Nov 2011 07:46:46 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLyYg-0003qT-IW
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 07:46:22 -0700
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-11.tower-27.messagelabs.com!1320331566!44276769!1
X-Originating-IP: [208.97.132.5]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10120 invoked from network); 3 Nov 2011 14:46:06 -0000
Received: from mailbigip.dreamhost.com (HELO homiemail-a75.g.dreamhost.com)
	(208.97.132.5) by server-11.tower-27.messagelabs.com with SMTP;
	3 Nov 2011 14:46:06 -0000
Received: from homiemail-a75.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a75.g.dreamhost.com (Postfix) with ESMTP id D48B75EC081;
	Thu,  3 Nov 2011 07:46:17 -0700 (PDT)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:reply-to
	:mime-version:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.org; b=ERxD3rB0EHIfEea6F25bBUT/dheYiousvBIRowOG1MK3
	XhhwTJLYZON9K2CmyQCU3J8IbpiTuiDv5sSbjVhCpAoIQYMkn0hUSfI9l7Bs+Ox/
	1xDK9uMubJwF4Z5wHqO5K9oe3rKdjsMhwtTDWNuOFVVSVw1tkfup96CkTahtNe0=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:reply-to:mime-version:content-type:content-transfer-encoding;
	s=lagarcavilla.org; bh=DuthbaAbU1G/LvjLHzQmE856aFQ=; b=Z3vhLFpH
	7RzlEipqSehrhFGKQxDaPmIDhYpB6nmfMLasZ3kQkfXoLDT5hFpr2yEz5JH3YNvb
	OVosUdR1aO4csHmpML8EYoYeOqYUJ07s2P3yYyeALu1p1/iRlYZTmZ5izVpcddzl
	lfk7PtT0d4JSgYxj3CW5Tc7F+5vUROZRuNM=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a75.g.dreamhost.com (Postfix) with ESMTPA id 36F735EC07C; 
	Thu,  3 Nov 2011 07:46:17 -0700 (PDT)
Received: from 206.223.182.18 (proxying for 206.223.182.18)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP; Thu, 3 Nov 2011 07:46:17 -0700
Message-ID: <3250fc6f3c1fcfa9e9135a995bcd6e62.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <20111103142904.GD66800@ocelot.phlegethon.org>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<a23e1262b1240dcabfa0.1319690030@xdev.gridcentric.ca>
	<20111027144333.GM59656@ocelot.phlegethon.org>
	<69a325bb9604ffab3cd84c4951c34641.squirrel@webmail.lagarcavilla.org>
	<20111103142904.GD66800@ocelot.phlegethon.org>
Date: Thu, 3 Nov 2011 07:46:17 -0700
Subject: Re: [Xen-devel] [PATCH 5 of 9] Fine-grained concurrency control
	structure for the p2m
From: "Andres Lagar-Cavilla" <andres@lagarcavilla.org>
To: "Tim Deegan" <tim@xen.org>
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com,
	George Dunlap <dunlapg@umich.edu>, keir.xen@gmail.com,
	andres@gridcentric.ca, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: andres@lagarcavilla.org
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

I view PoD as a special case of paging, with sweeps implemented by the
user-space pager, etc.

But the question that lingers in my mind is what do you do in modes that
don't support ept+paging today (software shadow, amd npt).

Also, paging needs to get waitqueues before being a palatable replacement
for PoD, imho. We're aiming in that direction too.

Andres
> Hi,
>
> At 07:20 -0700 on 02 Nov (1320218409), andres@lagarcavilla.com wrote:
>> > I suspect that if this is a contention point, allowing multiple
>> readers
>> > will become important, especially if there are particular pages that
>> > often get emulated access.
>> >
>> > And also, I'd  like to get some sort of plan for handling long-lived
>> > foreign mappings, if only to make sure that this phase-1 fix doesn't
>> > conflict wih it.
>> >
>>
>> If foreign mappings will hold a lock/ref on a p2m subrange, then they'=
ll
>> disallow global operations, and you'll get a clash between log-dirty
>> and,
>> say, qemu. Ka-blam live migration.
>
> Yep.  That's a tricky one.  Log-dirty could be special-cased but I gues=
s
> we'll have the same problem with paging, mem-event &c. :(
>
>> Read-only foreign mappings are only problematic insofar paging happens=
.
>> With proper p2m update/lookups serialization (global or fine-grained)
>> that
>> problem is gone.
>>
>> Write-able foreign mappings are trickier because of sharing and w^x. I=
s
>> there a reason left, today, to not type PGT_writable an hvm-domain's
>> page
>> when a foreign mapping happens?
>
> Unfortunately, yes.  The shadow pagetable code uses the typecount to
> detect whether the guest has any writeable mappings of the page; withou=
t
> that it would have to brute-force search all the L1 shadows in order to
> be sure that it had write-protected a page.
>
>> That would solve sharing problems. w^x
>> really can't be solved short of putting the vcpu on a waitqueue
>> (preferable to me), or destroying the mapping and forcing the foreign =
OS
>> to remap later. All a few steps ahead, I hope.
>
> OK, so if I understand correctly your plan is to add this mutual
> exclusion for all other users of the p2m (emulation &c) but leave
> foreign mappings alone for now, with the general plan of fixing that up
> using waitqueues.  That's OK by me.
>
>> Who/what's using w^x by the way? If the refcount is zero, I think I kn=
ow
>> what I'll do ;)
>
> I think the original authors are using it in their product.  I haven't
> heard of any other users but there might be some.
>
>> What is a real problem is that pod sweeps can cause deadlocks. There i=
s
>> a
>> simple step to mitigate this: start the sweep from the current gfn and
>> never wrap around -- too bad if the gfn is too high. But this alters t=
he
>> sweeping algorithm. I'll deal with it when its it's turn.
>
> OK.  If there's some chance that Olaf can make PoD a special case of
> paging maybe we can get rid of the sweeps altogether (i.e., have the
> domain pause when it runs out of PoD and let the pager fix it up).  But
> I know George has spent a fair amount of time tuning the performance of
> PoD so that may not be acceptable.
>
> Cheers,
>
> Tim.
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 07:49:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 07:49:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLycB-0004R3-K2; Thu, 03 Nov 2011 07:49:59 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLybk-0004FV-9p
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 07:49:33 -0700
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320331739!51722917!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17776 invoked from network); 3 Nov 2011 14:49:00 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 14:49:00 -0000
X-IronPort-AV: E=Sophos;i="4.69,450,1315195200"; d="scan'208";a="18795588"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	03 Nov 2011 10:49:27 -0400
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX02.citrite.net
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Thu, 3 Nov 2011
	10:49:27 -0400
Message-ID: <4EB2A9F5.1060800@citrix.com>
Date: Thu, 3 Nov 2011 14:49:25 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 1/2] IRQ: allocate CPU masks dynamically
References: <4EB2B2B5020000780005EBDD@nat28.tlf.novell.com>
In-Reply-To: <4EB2B2B5020000780005EBDD@nat28.tlf.novell.com>
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 03/11/11 14:26, Jan Beulich wrote:
> IRQ: allocate CPU masks dynamically
>
> This includes delaying the initialization of dynamically created IRQs
> until their actual first use and some further elimination of uses of
> struct irq_cfg.
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>

One query which may or may not affect the patch.  Would we get better
caching characteristics if all cpumasks were allocated in consecutive
memory, rather than having 3 individual allocs in arch_init_one_irq_desc ?

~Andrew

> --- a/xen/arch/ia64/linux-xen/irq_ia64.c
> +++ b/xen/arch/ia64/linux-xen/irq_ia64.c
> @@ -303,6 +303,9 @@ int __init request_irq_vector(unsigned i
>  void __init
>  init_IRQ (void)
>  {
> +#ifdef XEN
> +       BUG_ON(init_irq_data());
> +#endif
>         register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL);
>  #ifdef CONFIG_SMP
>         register_percpu_irq(IA64_IPI_VECTOR, &ipi_irqaction);
> --- a/xen/arch/ia64/xen/irq.c
> +++ b/xen/arch/ia64/xen/irq.c
> @@ -74,17 +74,30 @@ unsigned int __ia64_local_vector_to_irq
>  /*
>   * Controller mappings for all interrupt sources:
>   */
> -irq_desc_t irq_desc[NR_IRQS] = {
> -       [0 ... NR_IRQS-1] = {
> -               .status = IRQ_DISABLED,
> -               .handler = &no_irq_type,
> -               .lock = SPIN_LOCK_UNLOCKED
> -               .arch = {
> -                       .vector = -1,
> -                       .cpu_mask = CPU_MASK_ALL,
> -               }
> +irq_desc_t irq_desc[NR_IRQS];
> +
> +int __init arch_init_one_irq_desc(struct irq_desc *desc)
> +{
> +       if (!alloc_cpumask_var(&desc->arch.cpu_mask))
> +               return -ENOMEM;
> +
> +       desc->arch.vector = -1;
> +       cpumask_setall(desc->arch.cpu_mask);
> +
> +       return 0;
> +}
> +
> +int __init init_irq_data(void)
> +{
> +       unsigned int irq;
> +
> +       for (irq = 0; irq < NR_IRQS; irq++) {
> +               struct irq_desc *desc = irq_to_desc(irq);
> +
> +               desc->irq = irq;
> +               init_one_irq_desc(desc);
>         }
> -};
> +}
>
>  void __do_IRQ_guest(int irq);
>
> --- a/xen/arch/x86/i8259.c
> +++ b/xen/arch/x86/i8259.c
> @@ -398,7 +398,7 @@ void __init init_IRQ(void)
>
>          desc->handler = &i8259A_irq_type;
>          per_cpu(vector_irq, cpu)[FIRST_LEGACY_VECTOR + irq] = irq;
> -        cpumask_copy(&desc->arch.cpu_mask, cpumask_of(cpu));
> +        cpumask_copy(desc->arch.cpu_mask, cpumask_of(cpu));
>          desc->arch.vector = FIRST_LEGACY_VECTOR + irq;
>      }
>
> --- a/xen/arch/x86/io_apic.c
> +++ b/xen/arch/x86/io_apic.c
> @@ -648,20 +648,21 @@ static int pin_2_irq(int idx, int apic,
>  void /*__init*/ setup_ioapic_dest(void)
>  {
>      int pin, ioapic, irq, irq_entry;
> -    struct irq_cfg *cfg;
>
>      if (skip_ioapic_setup)
>          return;
>
>      for (ioapic = 0; ioapic < nr_ioapics; ioapic++) {
>          for (pin = 0; pin < nr_ioapic_entries[ioapic]; pin++) {
> +            struct irq_desc *desc;
> +
>              irq_entry = find_irq_entry(ioapic, pin, mp_INT);
>              if (irq_entry == -1)
>                  continue;
>              irq = pin_2_irq(irq_entry, ioapic, pin);
> -            cfg = irq_cfg(irq);
> -            BUG_ON(cpus_empty(cfg->cpu_mask));
> -            set_ioapic_affinity_irq(irq_to_desc(irq), &cfg->cpu_mask);
> +            desc = irq_to_desc(irq);
> +            BUG_ON(cpumask_empty(desc->arch.cpu_mask));
> +            set_ioapic_affinity_irq(desc, desc->arch.cpu_mask);
>          }
>
>      }
> @@ -956,12 +957,12 @@ static void __init setup_IO_APIC_irqs(vo
>      struct IO_APIC_route_entry entry;
>      int apic, pin, idx, irq, first_notcon = 1, vector;
>      unsigned long flags;
> -    struct irq_cfg *cfg;
>
>      apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
>
>      for (apic = 0; apic < nr_ioapics; apic++) {
>          for (pin = 0; pin < nr_ioapic_entries[apic]; pin++) {
> +            struct irq_desc *desc;
>
>              /*
>               * add it to the IO-APIC irq-routing table:
> @@ -1016,9 +1017,9 @@ static void __init setup_IO_APIC_irqs(vo
>                  if (!apic && platform_legacy_irq(irq))
>                      disable_8259A_irq(irq_to_desc(irq));
>              }
> -            cfg = irq_cfg(irq);
> +            desc = irq_to_desc(irq);
>              SET_DEST(entry.dest.dest32, entry.dest.logical.logical_dest,
> -                     cpu_mask_to_apicid(&cfg->cpu_mask));
> +                     cpu_mask_to_apicid(desc->arch.cpu_mask));
>              spin_lock_irqsave(&ioapic_lock, flags);
>              __ioapic_write_entry(apic, pin, 0, entry);
>              set_native_irq_info(irq, TARGET_CPUS);
> @@ -2372,7 +2373,7 @@ int ioapic_guest_write(unsigned long phy
>      rte.vector = cfg->vector;
>
>      SET_DEST(rte.dest.dest32, rte.dest.logical.logical_dest,
> -             cpu_mask_to_apicid(&cfg->cpu_mask));
> +             cpu_mask_to_apicid(desc->arch.cpu_mask));
>
>      io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&rte) + 0));
>      io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&rte) + 1));
> --- a/xen/arch/x86/irq.c
> +++ b/xen/arch/x86/irq.c
> @@ -25,6 +25,7 @@
>  #include <public/physdev.h>
>
>  static void parse_irq_vector_map_param(char *s);
> +static int __assign_irq_vector(int irq, struct irq_desc *, const cpumask_t *);
>
>  /* opt_noirqbalance: If true, software IRQ balancing/affinity is disabled. */
>  bool_t __read_mostly opt_noirqbalance = 0;
> @@ -110,7 +111,7 @@ static int __init __bind_irq_vector(int
>  {
>      cpumask_t online_mask;
>      int cpu;
> -    struct irq_cfg *cfg = irq_cfg(irq);
> +    struct irq_desc *desc = irq_to_desc(irq);
>
>      BUG_ON((unsigned)irq >= nr_irqs);
>      BUG_ON((unsigned)vector >= NR_VECTORS);
> @@ -118,21 +119,22 @@ static int __init __bind_irq_vector(int
>      cpumask_and(&online_mask, cpu_mask, &cpu_online_map);
>      if (cpumask_empty(&online_mask))
>          return -EINVAL;
> -    if ((cfg->vector == vector) && cpumask_equal(&cfg->cpu_mask, &online_mask))
> +    if ( (desc->arch.vector == vector) &&
> +         cpumask_equal(desc->arch.cpu_mask, &online_mask) )
>          return 0;
> -    if (cfg->vector != IRQ_VECTOR_UNASSIGNED)
> +    if ( desc->arch.vector != IRQ_VECTOR_UNASSIGNED )
>          return -EBUSY;
>      trace_irq_mask(TRC_HW_IRQ_BIND_VECTOR, irq, vector, &online_mask);
>      for_each_cpu_mask(cpu, online_mask)
>          per_cpu(vector_irq, cpu)[vector] = irq;
> -    cfg->vector = vector;
> -    cpumask_copy(&cfg->cpu_mask, &online_mask);
> -    if ( cfg->used_vectors )
> +    desc->arch.vector = vector;
> +    cpumask_copy(desc->arch.cpu_mask, &online_mask);
> +    if ( desc->arch.used_vectors )
>      {
> -        ASSERT(!test_bit(vector, cfg->used_vectors));
> -        set_bit(vector, cfg->used_vectors);
> +        ASSERT(!test_bit(vector, desc->arch.used_vectors));
> +        set_bit(vector, desc->arch.used_vectors);
>      }
> -    cfg->used = IRQ_USED;
> +    desc->arch.used = IRQ_USED;
>      if (IO_APIC_IRQ(irq))
>          irq_vector[irq] = vector;
>      return 0;
> @@ -166,14 +168,17 @@ int create_irq(void)
>  {
>      unsigned long flags;
>      int irq, ret;
> -    irq = -ENOSPC;
> +    struct irq_desc *desc;
>
>      spin_lock_irqsave(&vector_lock, flags);
>
>      irq = find_unassigned_irq();
>      if (irq < 0)
>           goto out;
> -    ret = __assign_irq_vector(irq, irq_cfg(irq), TARGET_CPUS);
> +    desc = irq_to_desc(irq);
> +    ret = init_one_irq_desc(desc);
> +    if (!ret)
> +        ret = __assign_irq_vector(irq, desc, TARGET_CPUS);
>      if (ret < 0)
>          irq = ret;
>  out:
> @@ -197,7 +202,7 @@ static void dynamic_irq_cleanup(unsigned
>      desc->msi_desc = NULL;
>      desc->handler = &no_irq_type;
>      desc->arch.used_vectors = NULL;
> -    cpumask_setall(&desc->affinity);
> +    cpumask_setall(desc->affinity);
>      spin_unlock_irqrestore(&desc->lock, flags);
>
>      /* Wait to make sure it's not being used on another CPU */
> @@ -211,38 +216,38 @@ static void __clear_irq_vector(int irq)
>  {
>      int cpu, vector, old_vector;
>      cpumask_t tmp_mask;
> -    struct irq_cfg *cfg = irq_cfg(irq);
> +    struct irq_desc *desc = irq_to_desc(irq);
>
> -    BUG_ON(!cfg->vector);
> +    BUG_ON(!desc->arch.vector);
>
> -    /* Always clear cfg->vector */
> -    vector = cfg->vector;
> -    cpumask_and(&tmp_mask, &cfg->cpu_mask, &cpu_online_map);
> +    /* Always clear desc->arch.vector */
> +    vector = desc->arch.vector;
> +    cpumask_and(&tmp_mask, desc->arch.cpu_mask, &cpu_online_map);
>
>      for_each_cpu_mask(cpu, tmp_mask) {
>          ASSERT( per_cpu(vector_irq, cpu)[vector] == irq );
>          per_cpu(vector_irq, cpu)[vector] = -1;
>      }
>
> -    cfg->vector = IRQ_VECTOR_UNASSIGNED;
> -    cpumask_clear(&cfg->cpu_mask);
> +    desc->arch.vector = IRQ_VECTOR_UNASSIGNED;
> +    cpumask_clear(desc->arch.cpu_mask);
>
> -    if ( cfg->used_vectors )
> +    if ( desc->arch.used_vectors )
>      {
> -        ASSERT(test_bit(vector, cfg->used_vectors));
> -        clear_bit(vector, cfg->used_vectors);
> +        ASSERT(test_bit(vector, desc->arch.used_vectors));
> +        clear_bit(vector, desc->arch.used_vectors);
>      }
>
> -    cfg->used = IRQ_UNUSED;
> +    desc->arch.used = IRQ_UNUSED;
>
>      trace_irq_mask(TRC_HW_IRQ_CLEAR_VECTOR, irq, vector, &tmp_mask);
>
> -    if (likely(!cfg->move_in_progress))
> +    if ( likely(!desc->arch.move_in_progress) )
>          return;
>
> -    /* If we were in motion, also clear cfg->old_vector */
> -    old_vector = cfg->old_vector;
> -    cpumask_and(&tmp_mask, &cfg->old_cpu_mask, &cpu_online_map);
> +    /* If we were in motion, also clear desc->arch.old_vector */
> +    old_vector = desc->arch.old_vector;
> +    cpumask_and(&tmp_mask, desc->arch.old_cpu_mask, &cpu_online_map);
>
>      for_each_cpu_mask(cpu, tmp_mask) {
>          ASSERT( per_cpu(vector_irq, cpu)[old_vector] == irq );
> @@ -250,16 +255,16 @@ static void __clear_irq_vector(int irq)
>          per_cpu(vector_irq, cpu)[old_vector] = -1;
>       }
>
> -    cfg->old_vector = IRQ_VECTOR_UNASSIGNED;
> -    cpumask_clear(&cfg->old_cpu_mask);
> +    desc->arch.old_vector = IRQ_VECTOR_UNASSIGNED;
> +    cpumask_clear(desc->arch.old_cpu_mask);
>
> -    if ( cfg->used_vectors )
> +    if ( desc->arch.used_vectors )
>      {
> -        ASSERT(test_bit(old_vector, cfg->used_vectors));
> -        clear_bit(old_vector, cfg->used_vectors);
> +        ASSERT(test_bit(old_vector, desc->arch.used_vectors));
> +        clear_bit(old_vector, desc->arch.used_vectors);
>      }
>
> -    cfg->move_in_progress = 0;
> +    desc->arch.move_in_progress = 0;
>  }
>
>  void clear_irq_vector(int irq)
> @@ -296,25 +301,28 @@ int irq_to_vector(int irq)
>      return vector;
>  }
>
> -static void __init init_one_irq_desc(struct irq_desc *desc)
> +int arch_init_one_irq_desc(struct irq_desc *desc)
>  {
> -    desc->status  = IRQ_DISABLED;
> -    desc->handler = &no_irq_type;
> -    desc->action  = NULL;
> -    desc->msi_desc = NULL;
> -    spin_lock_init(&desc->lock);
> -    cpumask_setall(&desc->affinity);
> -    INIT_LIST_HEAD(&desc->rl_link);
> -}
> +    if ( !zalloc_cpumask_var(&desc->arch.cpu_mask) )
> +        return -ENOMEM;
> +
> +    if ( !alloc_cpumask_var(&desc->arch.old_cpu_mask) )
> +    {
> +        free_cpumask_var(desc->arch.cpu_mask);
> +        return -ENOMEM;
> +    }
>
> -static void __init init_one_irq_cfg(struct irq_cfg *cfg)
> -{
> -    cfg->vector = IRQ_VECTOR_UNASSIGNED;
> -    cfg->old_vector = IRQ_VECTOR_UNASSIGNED;
> -    cpumask_clear(&cfg->cpu_mask);
> -    cpumask_clear(&cfg->old_cpu_mask);
> -    cfg->used_vectors = NULL;
> -    cfg->used = IRQ_UNUSED;
> +    if ( !alloc_cpumask_var(&desc->arch.pending_mask) )
> +    {
> +        free_cpumask_var(desc->arch.old_cpu_mask);
> +        free_cpumask_var(desc->arch.cpu_mask);
> +        return -ENOMEM;
> +    }
> +
> +    desc->arch.vector = IRQ_VECTOR_UNASSIGNED;
> +    desc->arch.old_vector = IRQ_VECTOR_UNASSIGNED;
> +
> +    return 0;
>  }
>
>  int __init init_irq_data(void)
> @@ -331,12 +339,13 @@ int __init init_irq_data(void)
>      if ( !irq_desc || !irq_vector )
>          return -ENOMEM;
>
> -    for (irq = 0; irq < nr_irqs; irq++) {
> +    for (irq = 0; irq < nr_irqs_gsi; irq++) {
>          desc = irq_to_desc(irq);
>          desc->irq = irq;
>          init_one_irq_desc(desc);
> -        init_one_irq_cfg(&desc->arch);
>      }
> +    for (; irq < nr_irqs; irq++)
> +        irq_to_desc(irq)->irq = irq;
>
>      /* Never allocate the hypercall vector or Linux/BSD fast-trap vector. */
>      set_bit(LEGACY_SYSCALL_VECTOR, used_vectors);
> @@ -403,7 +412,8 @@ static vmask_t *irq_get_used_vector_mask
>      return ret;
>  }
>
> -int __assign_irq_vector(int irq, struct irq_cfg *cfg, const cpumask_t *mask)
> +static int __assign_irq_vector(
> +    int irq, struct irq_desc *desc, const cpumask_t *mask)
>  {
>      /*
>       * NOTE! The local APIC isn't very good at handling
> @@ -426,13 +436,13 @@ int __assign_irq_vector(int irq, struct
>      old_vector = irq_to_vector(irq);
>      if (old_vector) {
>          cpumask_and(&tmp_mask, mask, &cpu_online_map);
> -        if (cpumask_intersects(&tmp_mask, &cfg->cpu_mask)) {
> -            cfg->vector = old_vector;
> +        if (cpumask_intersects(&tmp_mask, desc->arch.cpu_mask)) {
> +            desc->arch.vector = old_vector;
>              return 0;
>          }
>      }
>
> -    if ((cfg->move_in_progress) || cfg->move_cleanup_count)
> +    if ( desc->arch.move_in_progress || desc->arch.move_cleanup_count )
>          return -EAGAIN;
>
>      err = -ENOSPC;
> @@ -440,9 +450,9 @@ int __assign_irq_vector(int irq, struct
>      /* This is the only place normal IRQs are ever marked
>       * as "in use".  If they're not in use yet, check to see
>       * if we need to assign a global vector mask. */
> -    if ( cfg->used == IRQ_USED )
> +    if ( desc->arch.used == IRQ_USED )
>      {
> -        irq_used_vectors = cfg->used_vectors;
> +        irq_used_vectors = desc->arch.used_vectors;
>      }
>      else
>          irq_used_vectors = irq_get_used_vector_mask(irq);
> @@ -485,29 +495,29 @@ next:
>          current_offset = offset;
>          local_irq_save(flags);
>          if (old_vector) {
> -            cfg->move_in_progress = 1;
> -            cpumask_copy(&cfg->old_cpu_mask, &cfg->cpu_mask);
> -            cfg->old_vector = cfg->vector;
> +            desc->arch.move_in_progress = 1;
> +            cpumask_copy(desc->arch.old_cpu_mask, desc->arch.cpu_mask);
> +            desc->arch.old_vector = desc->arch.vector;
>          }
>          trace_irq_mask(TRC_HW_IRQ_ASSIGN_VECTOR, irq, vector, &tmp_mask);
>          for_each_cpu_mask(new_cpu, tmp_mask)
>              per_cpu(vector_irq, new_cpu)[vector] = irq;
> -        cfg->vector = vector;
> -        cpumask_copy(&cfg->cpu_mask, &tmp_mask);
> +        desc->arch.vector = vector;
> +        cpumask_copy(desc->arch.cpu_mask, &tmp_mask);
>
> -        cfg->used = IRQ_USED;
> -        ASSERT((cfg->used_vectors == NULL)
> -               || (cfg->used_vectors == irq_used_vectors));
> -        cfg->used_vectors = irq_used_vectors;
> +        desc->arch.used = IRQ_USED;
> +        ASSERT((desc->arch.used_vectors == NULL)
> +               || (desc->arch.used_vectors == irq_used_vectors));
> +        desc->arch.used_vectors = irq_used_vectors;
>
>          if (IO_APIC_IRQ(irq))
>              irq_vector[irq] = vector;
>
> -        if ( cfg->used_vectors )
> +        if ( desc->arch.used_vectors )
>          {
> -            ASSERT(!test_bit(vector, cfg->used_vectors));
> +            ASSERT(!test_bit(vector, desc->arch.used_vectors));
>
> -            set_bit(vector, cfg->used_vectors);
> +            set_bit(vector, desc->arch.used_vectors);
>          }
>
>          err = 0;
> @@ -521,16 +531,15 @@ int assign_irq_vector(int irq)
>  {
>      int ret;
>      unsigned long flags;
> -    struct irq_cfg *cfg = irq_cfg(irq);
>      struct irq_desc *desc = irq_to_desc(irq);
>
>      BUG_ON(irq >= nr_irqs || irq <0);
>
>      spin_lock_irqsave(&vector_lock, flags);
> -    ret = __assign_irq_vector(irq, cfg, TARGET_CPUS);
> +    ret = __assign_irq_vector(irq, desc, TARGET_CPUS);
>      if (!ret) {
> -        ret = cfg->vector;
> -        cpumask_copy(&desc->affinity, &cfg->cpu_mask);
> +        ret = desc->arch.vector;
> +        cpumask_copy(desc->affinity, desc->arch.cpu_mask);
>      }
>      spin_unlock_irqrestore(&vector_lock, flags);
>      return ret;
> @@ -543,15 +552,16 @@ int assign_irq_vector(int irq)
>  void __setup_vector_irq(int cpu)
>  {
>      int irq, vector;
> -    struct irq_cfg *cfg;
>
>      /* Clear vector_irq */
>      for (vector = 0; vector < NR_VECTORS; ++vector)
>          per_cpu(vector_irq, cpu)[vector] = -1;
>      /* Mark the inuse vectors */
>      for (irq = 0; irq < nr_irqs; ++irq) {
> -        cfg = irq_cfg(irq);
> -        if (!cpu_isset(cpu, cfg->cpu_mask))
> +        struct irq_desc *desc = irq_to_desc(irq);
> +
> +        if (!irq_desc_initialized(desc) ||
> +            !cpumask_test_cpu(cpu, desc->arch.cpu_mask))
>              continue;
>          vector = irq_to_vector(irq);
>          per_cpu(vector_irq, cpu)[vector] = irq;
> @@ -560,12 +570,14 @@ void __setup_vector_irq(int cpu)
>
>  void move_masked_irq(struct irq_desc *desc)
>  {
> +    cpumask_t *pending_mask = desc->arch.pending_mask;
> +
>      if (likely(!(desc->status & IRQ_MOVE_PENDING)))
>          return;
>
>      desc->status &= ~IRQ_MOVE_PENDING;
>
> -    if (unlikely(cpus_empty(desc->pending_mask)))
> +    if (unlikely(cpumask_empty(pending_mask)))
>          return;
>
>      if (!desc->handler->set_affinity)
> @@ -580,10 +592,10 @@ void move_masked_irq(struct irq_desc *de
>       *
>       * For correct operation this depends on the caller masking the irqs.
>       */
> -    if (likely(cpus_intersects(desc->pending_mask, cpu_online_map)))
> -        desc->handler->set_affinity(desc, &desc->pending_mask);
> +    if ( likely(cpumask_intersects(pending_mask, &cpu_online_map)) )
> +        desc->handler->set_affinity(desc, pending_mask);
>
> -    cpumask_clear(&desc->pending_mask);
> +    cpumask_clear(pending_mask);
>  }
>
>  void move_native_irq(struct irq_desc *desc)
> @@ -626,7 +638,8 @@ fastcall void smp_irq_move_cleanup_inter
>          if (!desc->arch.move_cleanup_count)
>              goto unlock;
>
> -        if (vector == desc->arch.vector && cpumask_test_cpu(me, &desc->arch.cpu_mask))
> +        if ( vector == desc->arch.vector &&
> +             cpumask_test_cpu(me, desc->arch.cpu_mask) )
>              goto unlock;
>
>          irr = apic_read(APIC_IRR + (vector / 32 * 0x10));
> @@ -653,7 +666,7 @@ fastcall void smp_irq_move_cleanup_inter
>          if ( desc->arch.move_cleanup_count == 0 )
>          {
>              desc->arch.old_vector = IRQ_VECTOR_UNASSIGNED;
> -            cpumask_clear(&desc->arch.old_cpu_mask);
> +            cpumask_clear(desc->arch.old_cpu_mask);
>
>              if ( desc->arch.used_vectors )
>              {
> @@ -673,7 +686,7 @@ static void send_cleanup_vector(struct i
>  {
>      cpumask_t cleanup_mask;
>
> -    cpumask_and(&cleanup_mask, &desc->arch.old_cpu_mask, &cpu_online_map);
> +    cpumask_and(&cleanup_mask, desc->arch.old_cpu_mask, &cpu_online_map);
>      desc->arch.move_cleanup_count = cpumask_weight(&cleanup_mask);
>      genapic->send_IPI_mask(&cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR);
>
> @@ -690,7 +703,8 @@ void irq_complete_move(struct irq_desc *
>      vector = get_irq_regs()->entry_vector;
>      me = smp_processor_id();
>
> -    if (vector == desc->arch.vector && cpumask_test_cpu(me, &desc->arch.cpu_mask))
> +    if ( vector == desc->arch.vector &&
> +         cpumask_test_cpu(me, desc->arch.cpu_mask) )
>          send_cleanup_vector(desc);
>  }
>
> @@ -708,15 +722,15 @@ unsigned int set_desc_affinity(struct ir
>
>      local_irq_save(flags);
>      lock_vector_lock();
> -    ret = __assign_irq_vector(irq, &desc->arch, mask);
> +    ret = __assign_irq_vector(irq, desc, mask);
>      unlock_vector_lock();
>      local_irq_restore(flags);
>
>      if (ret < 0)
>          return BAD_APICID;
>
> -    cpumask_copy(&desc->affinity, mask);
> -    cpumask_and(&dest_mask, mask, &desc->arch.cpu_mask);
> +    cpumask_copy(desc->affinity, mask);
> +    cpumask_and(&dest_mask, mask, desc->arch.cpu_mask);
>
>      return cpu_mask_to_apicid(&dest_mask);
>  }
> @@ -730,7 +744,7 @@ void irq_set_affinity(struct irq_desc *d
>      ASSERT(spin_is_locked(&desc->lock));
>      desc->status &= ~IRQ_MOVE_PENDING;
>      wmb();
> -    cpumask_copy(&desc->pending_mask, mask);
> +    cpumask_copy(desc->arch.pending_mask, mask);
>      wmb();
>      desc->status |= IRQ_MOVE_PENDING;
>  }
> @@ -1992,13 +2006,13 @@ static void dump_irqs(unsigned char key)
>
>          desc = irq_to_desc(irq);
>
> -        if ( !desc->handler || desc->handler == &no_irq_type )
> +        if ( !irq_desc_initialized(desc) || desc->handler == &no_irq_type )
>              continue;
>
>          spin_lock_irqsave(&desc->lock, flags);
>
>          cpumask_scnprintf(keyhandler_scratch, sizeof(keyhandler_scratch),
> -                          &desc->affinity);
> +                          desc->affinity);
>          printk("   IRQ:%4d affinity:%s vec:%02x type=%-15s"
>                 " status=%08x ",
>                 irq, keyhandler_scratch, desc->arch.vector,
> @@ -2073,10 +2087,12 @@ void fixup_irqs(void)
>              continue;
>
>          desc = irq_to_desc(irq);
> +        if ( !irq_desc_initialized(desc) )
> +            continue;
>
>          spin_lock(&desc->lock);
>
> -        cpumask_copy(&affinity, &desc->affinity);
> +        cpumask_copy(&affinity, desc->affinity);
>          if ( !desc->action || cpumask_subset(&affinity, &cpu_online_map) )
>          {
>              spin_unlock(&desc->lock);
> --- a/xen/arch/x86/msi.c
> +++ b/xen/arch/x86/msi.c
> @@ -125,13 +125,13 @@ void msi_compose_msg(struct irq_desc *de
>      unsigned dest;
>      int vector = desc->arch.vector;
>
> -    if ( cpumask_empty(&desc->arch.cpu_mask) ) {
> +    if ( cpumask_empty(desc->arch.cpu_mask) ) {
>          dprintk(XENLOG_ERR,"%s, compose msi message error!!\n", __func__);
>          return;
>      }
>
>      if ( vector ) {
> -        dest = cpu_mask_to_apicid(&desc->arch.cpu_mask);
> +        dest = cpu_mask_to_apicid(desc->arch.cpu_mask);
>
>          msg->address_hi = MSI_ADDR_BASE_HI;
>          msg->address_lo =
> --- a/xen/arch/x86/smpboot.c
> +++ b/xen/arch/x86/smpboot.c
> @@ -1011,7 +1011,7 @@ void __init smp_intr_init(void)
>          irq_vector[irq] = FIRST_HIPRIORITY_VECTOR + seridx + 1;
>          per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_VECTOR + seridx + 1] = irq;
>          irq_to_desc(irq)->arch.vector = FIRST_HIPRIORITY_VECTOR + seridx + 1;
> -        cpumask_copy(&irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map);
> +        cpumask_copy(irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map);
>      }
>
>      /* IPI for cleanuping vectors after irq move */
> --- a/xen/common/Makefile
> +++ b/xen/common/Makefile
> @@ -5,6 +5,7 @@ obj-y += domctl.o
>  obj-y += domain.o
>  obj-y += event_channel.o
>  obj-y += grant_table.o
> +obj-y += irq.o
>  obj-y += kernel.o
>  obj-y += keyhandler.o
>  obj-y += kexec.o
> --- /dev/null
> +++ a/xen/common/irq.c
> @@ -0,0 +1,28 @@
> +#include <xen/config.h>
> +#include <xen/irq.h>
> +
> +int init_one_irq_desc(struct irq_desc *desc)
> +{
> +    int err;
> +
> +    if (irq_desc_initialized(desc))
> +        return 0;
> +
> +    if ( !alloc_cpumask_var(&desc->affinity) )
> +        return -ENOMEM;
> +
> +    desc->status = IRQ_DISABLED;
> +    desc->handler = &no_irq_type;
> +    spin_lock_init(&desc->lock);
> +    cpumask_setall(desc->affinity);
> +    INIT_LIST_HEAD(&desc->rl_link);
> +
> +    err = arch_init_one_irq_desc(desc);
> +    if ( err )
> +    {
> +        free_cpumask_var(desc->affinity);
> +        desc->handler = NULL;
> +    }
> +
> +    return err;
> +}
> --- a/xen/drivers/passthrough/vtd/iommu.c
> +++ b/xen/drivers/passthrough/vtd/iommu.c
> @@ -1965,17 +1965,18 @@ static int init_vtd_hw(void)
>      struct iommu_flush *flush = NULL;
>      int ret;
>      unsigned long flags;
> -    struct irq_cfg *cfg;
>
>      /*
>       * Basic VT-d HW init: set VT-d interrupt, clear VT-d faults.
>       */
>      for_each_drhd_unit ( drhd )
>      {
> +        struct irq_desc *desc;
> +
>          iommu = drhd->iommu;
>
> -        cfg = irq_cfg(iommu->irq);
> -        dma_msi_set_affinity(irq_to_desc(iommu->irq), &cfg->cpu_mask);
> +        desc = irq_to_desc(iommu->irq);
> +        dma_msi_set_affinity(desc, desc->arch.cpu_mask);
>
>          clear_fault_bits(iommu);
>
> --- a/xen/include/asm-ia64/linux-xen/asm/irq.h
> +++ b/xen/include/asm-ia64/linux-xen/asm/irq.h
> @@ -18,8 +18,10 @@
>  struct irq_cfg {
>  #define arch_irq_desc irq_cfg
>          int  vector;
> -        cpumask_t cpu_mask;
> +        cpumask_var_t cpu_mask;
>  };
> +
> +int init_irq_data(void);
>  #endif
>
>  static __inline__ int
> --- a/xen/include/asm-x86/irq.h
> +++ b/xen/include/asm-x86/irq.h
> @@ -33,8 +33,9 @@ struct irq_cfg {
>  #define arch_irq_desc irq_cfg
>          s16 vector;                  /* vector itself is only 8 bits, */
>          s16 old_vector;              /* but we use -1 for unassigned  */
> -        cpumask_t cpu_mask;
> -        cpumask_t old_cpu_mask;
> +        cpumask_var_t cpu_mask;
> +        cpumask_var_t old_cpu_mask;
> +        cpumask_var_t pending_mask;
>          unsigned move_cleanup_count;
>          vmask_t *used_vectors;
>          u8 move_in_progress : 1;
> @@ -174,8 +175,6 @@ void __setup_vector_irq(int cpu);
>  void move_native_irq(struct irq_desc *);
>  void move_masked_irq(struct irq_desc *);
>
> -int __assign_irq_vector(int irq, struct irq_cfg *, const cpumask_t *);
> -
>  int bind_irq_vector(int irq, int vector, const cpumask_t *);
>
>  void irq_set_affinity(struct irq_desc *, const cpumask_t *mask);
> --- a/xen/include/xen/irq.h
> +++ b/xen/include/xen/irq.h
> @@ -76,8 +76,7 @@ typedef struct irq_desc {
>      int irq;
>      spinlock_t lock;
>      struct arch_irq_desc arch;
> -    cpumask_t affinity;
> -    cpumask_t pending_mask;  /* IRQ migration pending mask */
> +    cpumask_var_t affinity;
>
>      /* irq ratelimit */
>      s_time_t rl_quantum_start;
> @@ -85,6 +84,11 @@ typedef struct irq_desc {
>      struct list_head rl_link;
>  } __cacheline_aligned irq_desc_t;
>
> +int init_one_irq_desc(struct irq_desc *);
> +int arch_init_one_irq_desc(struct irq_desc *);
> +
> +#define irq_desc_initialized(desc) ((desc)->handler != NULL)
> +
>  #if defined(__ia64__)
>  extern irq_desc_t irq_desc[NR_VECTORS];
>
> @@ -153,7 +157,7 @@ extern irq_desc_t *pirq_spin_lock_irq_de
>
>  static inline void set_native_irq_info(unsigned int irq, const cpumask_t *mask)
>  {
> -    cpumask_copy(&irq_desc[irq].affinity, mask);
> +    cpumask_copy(irq_to_desc(irq)->affinity, mask);
>  }
>
>  unsigned int set_desc_affinity(struct irq_desc *, const cpumask_t *);
>
>

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 07:51:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 07:51:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLydg-0004vG-ET; Thu, 03 Nov 2011 07:51:32 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLydE-0004jD-Im
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 07:51:04 -0700
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1320331859!182292!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29330 invoked from network); 3 Nov 2011 14:51:01 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-11.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 14:51:01 -0000
X-IronPort-AV: E=Sophos;i="4.69,450,1315195200"; d="scan'208";a="169276262"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	03 Nov 2011 10:50:59 -0400
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX02.citrite.net
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Thu, 3 Nov 2011
	10:50:59 -0400
Message-ID: <4EB2AA52.7020308@citrix.com>
Date: Thu, 3 Nov 2011 14:50:58 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: <xen-devel@lists.xensource.com>
Subject: Re: [Xen-devel] [PATCH 2/2] x86/IRQ: consolidate IRQ disabling when
	acquiring vector lock
References: <4EB2B2DF020000780005EBF0@nat28.tlf.novell.com>
In-Reply-To: <4EB2B2DF020000780005EBF0@nat28.tlf.novell.com>
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 03/11/11 14:27, Jan Beulich wrote:
> x86/IRQ: consolidate IRQ disabling when acquiring vector lock
>
> __assign_irq_vector() doesn't need to disable interrupts (its callers
> are required to when acquiring the lock), and set_desc_affinity() can
> use the normal spin lock primitives.
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>

> --- a/xen/arch/x86/irq.c
> +++ b/xen/arch/x86/irq.c
> @@ -429,7 +429,6 @@ static int __assign_irq_vector(
>      static int current_vector = FIRST_DYNAMIC_VECTOR, current_offset = 0;
>      unsigned int old_vector;
>      int cpu, err;
> -    unsigned long flags;
>      cpumask_t tmp_mask;
>      vmask_t *irq_used_vectors = NULL;
>  
> @@ -493,7 +492,6 @@ next:
>          /* Found one! */
>          current_vector = vector;
>          current_offset = offset;
> -        local_irq_save(flags);
>          if (old_vector) {
>              desc->arch.move_in_progress = 1;
>              cpumask_copy(desc->arch.old_cpu_mask, desc->arch.cpu_mask);
> @@ -521,7 +519,6 @@ next:
>          }
>  
>          err = 0;
> -        local_irq_restore(flags);
>          break;
>      }
>      return err;
> @@ -720,11 +717,9 @@ unsigned int set_desc_affinity(struct ir
>  
>      irq = desc->irq;
>  
> -    local_irq_save(flags);
> -    lock_vector_lock();
> +    spin_lock_irqsave(&vector_lock, flags);
>      ret = __assign_irq_vector(irq, desc, mask);
> -    unlock_vector_lock();
> -    local_irq_restore(flags);
> +    spin_unlock_irqrestore(&vector_lock, flags);
>  
>      if (ret < 0)
>          return BAD_APICID;
>
>
>

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 07:59:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 07:59:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLylJ-0005Q7-8i; Thu, 03 Nov 2011 07:59:25 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLyj9-0005CH-8o
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 07:57:12 -0700
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-9.tower-21.messagelabs.com!1320332227!2708038!1
X-Originating-IP: [208.97.132.119]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8977 invoked from network); 3 Nov 2011 14:57:07 -0000
Received: from caiajhbdcbbj.dreamhost.com (HELO homiemail-a75.g.dreamhost.com)
	(208.97.132.119) by server-9.tower-21.messagelabs.com with SMTP;
	3 Nov 2011 14:57:07 -0000
Received: from homiemail-a75.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a75.g.dreamhost.com (Postfix) with ESMTP id 7971F5EC07E;
	Thu,  3 Nov 2011 07:57:06 -0700 (PDT)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:reply-to
	:mime-version:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.org; b=g5v1jVuvt9VXqI8HeCDpiKo1kAsvrUCp4zwX6Q6qVMeR
	Euc3ocPGbqqqMsz8RsPRgWucYJ3tYKBarM2GW+hUGfcaAjwmSHvv98ikN1UAn551
	fh+Ghe0Bmn51OM0vA83EuN8LYjyXG/ka0YQdHfnN06EOdPR278oD85laGYhyV0c=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:reply-to:mime-version:content-type:content-transfer-encoding;
	s=lagarcavilla.org; bh=lPb5t7igv93b4YqbZ1iVJjem0rM=; b=ftgTNhJj
	wh/gA9Xv0cXVDQhlhSx/qbw+hnWp93Bbq+INcmpSfODYDWExIGl2eZXEg6vltEeJ
	CeE2xMCRFLG6+/MxXXFom8QzJ+hSYJgQMhqSmF6RVKXEgDv1yT25Vces9jhV8PY6
	mID2t21XUKLzqpRPmu9zDR6H91xxksO3Sdg=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a75.g.dreamhost.com (Postfix) with ESMTPA id B928F5EC07C; 
	Thu,  3 Nov 2011 07:57:05 -0700 (PDT)
Received: from 206.223.182.18 (proxying for 206.223.182.18)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP; Thu, 3 Nov 2011 07:57:06 -0700
Message-ID: <b882f5d0631d0f8c42d08aca9c35b220.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <CAFLBxZZ4h+3rvCVSmCwZ-197R1_Ox7hqwF4fDVD4JJaxop4cgQ@mail.gmail.com>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<981073d78f7f0c92a7f5.1319690029@xdev.gridcentric.ca>
	<CAFLBxZZ4h+3rvCVSmCwZ-197R1_Ox7hqwF4fDVD4JJaxop4cgQ@mail.gmail.com>
Date: Thu, 3 Nov 2011 07:57:06 -0700
Subject: Re: [Xen-devel] [PATCH 4 of 9] Rework locking in the PoD layer
From: "Andres Lagar-Cavilla" <andres@lagarcavilla.org>
To: "George Dunlap" <dunlapg@umich.edu>
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com,
	Andres Lagar-Cavilla <andres@lagarcavilla.org>, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: andres@lagarcavilla.org
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

I'll leave this alone for the moment, but I'll try to explain here the
end-goal:
1. we need to protect p2m entries on lookups, any lookups
2. If performance becomes prohibitive, then we need to break-up that lock
3. pod locking breaks, so pod will need its own lock
4. hence this patch
Agree with you it's ahead of the curve by removing p2m_lock's before
p2mm_lock's become fine-grained. So, I'll leave this on the side for now.

Andres
> On Thu, Oct 27, 2011 at 1:33 PM, Andres Lagar-Cavilla
> <andres@lagarcavilla.org> wrote:
>> =A0xen/arch/x86/mm/mm-locks.h | =A0 =A09 ++
>> =A0xen/arch/x86/mm/p2m-pod.c =A0| =A0145
>> +++++++++++++++++++++++++++------------------
>> =A0xen/arch/x86/mm/p2m-pt.c =A0 | =A0 =A03 +
>> =A0xen/arch/x86/mm/p2m.c =A0 =A0 =A0| =A0 =A07 +-
>> =A0xen/include/asm-x86/p2m.h =A0| =A0 25 ++-----
>> =A05 files changed, 113 insertions(+), 76 deletions(-)
>>
>>
>> The PoD layer has a fragile locking discipline. It relies on the
>> p2m being globally locked, and it also relies on the page alloc
>> lock to protect some of its data structures. Replace this all by an
>> explicit pod lock: per p2m, order enforced.
>>
>> Two consequences:
>> =A0 =A0- Critical sections in the pod code protected by the page alloc
>> =A0 =A0 =A0lock are now reduced to modifications of the domain page li=
st.
>> =A0 =A0- When the p2m lock becomes fine-grained, there are no
>> =A0 =A0 =A0assumptions broken in the PoD layer.
>>
>> Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
>>
>> diff -r 332775f72a30 -r 981073d78f7f xen/arch/x86/mm/mm-locks.h
>> --- a/xen/arch/x86/mm/mm-locks.h
>> +++ b/xen/arch/x86/mm/mm-locks.h
>> @@ -155,6 +155,15 @@ declare_mm_lock(p2m)
>> =A0#define p2m_unlock(p) =A0 =A0 =A0 =A0 mm_unlock(&(p)->lock)
>> =A0#define p2m_locked_by_me(p) =A0 mm_locked_by_me(&(p)->lock)
>>
>> +/* PoD lock (per-p2m-table)
>> + *
>> + * Protects private PoD data structs. */
>> +
>> +declare_mm_lock(pod)
>> +#define pod_lock(p) =A0 =A0 =A0 =A0 =A0 mm_lock(pod, &(p)->pod.lock)
>> +#define pod_unlock(p) =A0 =A0 =A0 =A0 mm_unlock(&(p)->pod.lock)
>> +#define pod_locked_by_me(p) =A0 mm_locked_by_me(&(p)->pod.lock)
>> +
>> =A0/* Page alloc lock (per-domain)
>> =A0*
>> =A0* This is an external lock, not represented by an mm_lock_t. Howeve=
r,
>> diff -r 332775f72a30 -r 981073d78f7f xen/arch/x86/mm/p2m-pod.c
>> --- a/xen/arch/x86/mm/p2m-pod.c
>> +++ b/xen/arch/x86/mm/p2m-pod.c
>> @@ -63,6 +63,7 @@ static inline void unlock_page_alloc(str
>> =A0* Populate-on-demand functionality
>> =A0*/
>>
>> +/* PoD lock held on entry */
>> =A0static int
>> =A0p2m_pod_cache_add(struct p2m_domain *p2m,
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct page_info *page,
>> @@ -114,43 +115,42 @@ p2m_pod_cache_add(struct p2m_domain *p2m
>> =A0 =A0 =A0 =A0 unmap_domain_page(b);
>> =A0 =A0 }
>>
>> + =A0 =A0/* First, take all pages off the domain list */
>> =A0 =A0 lock_page_alloc(p2m);
>> -
>> - =A0 =A0/* First, take all pages off the domain list */
>> =A0 =A0 for(i=3D0; i < 1 << order ; i++)
>> =A0 =A0 {
>> =A0 =A0 =A0 =A0 p =3D page + i;
>> =A0 =A0 =A0 =A0 page_list_del(p, &d->page_list);
>> =A0 =A0 }
>>
>> - =A0 =A0/* Then add the first one to the appropriate populate-on-dema=
nd
>> list */
>> - =A0 =A0switch(order)
>> - =A0 =A0{
>> - =A0 =A0case PAGE_ORDER_2M:
>> - =A0 =A0 =A0 =A0page_list_add_tail(page, &p2m->pod.super); /* lock: p=
age_alloc
>> */
>> - =A0 =A0 =A0 =A0p2m->pod.count +=3D 1 << order;
>> - =A0 =A0 =A0 =A0break;
>> - =A0 =A0case PAGE_ORDER_4K:
>> - =A0 =A0 =A0 =A0page_list_add_tail(page, &p2m->pod.single); /* lock: =
page_alloc
>> */
>> - =A0 =A0 =A0 =A0p2m->pod.count +=3D 1;
>> - =A0 =A0 =A0 =A0break;
>> - =A0 =A0default:
>> - =A0 =A0 =A0 =A0BUG();
>> - =A0 =A0}
>> -
>> =A0 =A0 /* Ensure that the PoD cache has never been emptied.
>> =A0 =A0 =A0* This may cause "zombie domains" since the page will never=
 be
>> freed. */
>> =A0 =A0 BUG_ON( d->arch.relmem !=3D RELMEM_not_started );
>>
>> =A0 =A0 unlock_page_alloc(p2m);
>>
>> + =A0 =A0/* Then add the first one to the appropriate populate-on-dema=
nd
>> list */
>> + =A0 =A0switch(order)
>> + =A0 =A0{
>> + =A0 =A0case PAGE_ORDER_2M:
>> + =A0 =A0 =A0 =A0page_list_add_tail(page, &p2m->pod.super);
>> + =A0 =A0 =A0 =A0p2m->pod.count +=3D 1 << order;
>> + =A0 =A0 =A0 =A0break;
>> + =A0 =A0case PAGE_ORDER_4K:
>> + =A0 =A0 =A0 =A0page_list_add_tail(page, &p2m->pod.single);
>> + =A0 =A0 =A0 =A0p2m->pod.count +=3D 1;
>> + =A0 =A0 =A0 =A0break;
>> + =A0 =A0default:
>> + =A0 =A0 =A0 =A0BUG();
>> + =A0 =A0}
>> +
>> =A0 =A0 return 0;
>> =A0}
>>
>> =A0/* Get a page of size order from the populate-on-demand cache. =A0W=
ill
>> break
>> =A0* down 2-meg pages into singleton pages automatically. =A0Returns n=
ull if
>> - * a superpage is requested and no superpages are available. =A0Must =
be
>> called
>> - * with the d->page_lock held. */
>> + * a superpage is requested and no superpages are available. */
>> +/* PoD lock held on entry */
>> =A0static struct page_info * p2m_pod_cache_get(struct p2m_domain *p2m,
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 =A0 =A0 unsigned long order)
>> =A0{
>> @@ -185,7 +185,7 @@ static struct page_info * p2m_pod_cache_
>> =A0 =A0 case PAGE_ORDER_2M:
>> =A0 =A0 =A0 =A0 BUG_ON( page_list_empty(&p2m->pod.super) );
>> =A0 =A0 =A0 =A0 p =3D page_list_remove_head(&p2m->pod.super);
>> - =A0 =A0 =A0 =A0p2m->pod.count -=3D 1 << order; /* Lock: page_alloc *=
/
>> + =A0 =A0 =A0 =A0p2m->pod.count -=3D 1 << order;
>> =A0 =A0 =A0 =A0 break;
>> =A0 =A0 case PAGE_ORDER_4K:
>> =A0 =A0 =A0 =A0 BUG_ON( page_list_empty(&p2m->pod.single) );
>> @@ -197,16 +197,19 @@ static struct page_info * p2m_pod_cache_
>> =A0 =A0 }
>>
>> =A0 =A0 /* Put the pages back on the domain page_list */
>> + =A0 =A0lock_page_alloc(p2m);
>> =A0 =A0 for ( i =3D 0 ; i < (1 << order); i++ )
>> =A0 =A0 {
>> =A0 =A0 =A0 =A0 BUG_ON(page_get_owner(p + i) !=3D p2m->domain);
>> =A0 =A0 =A0 =A0 page_list_add_tail(p + i, &p2m->domain->page_list);
>> =A0 =A0 }
>> + =A0 =A0unlock_page_alloc(p2m);
>>
>> =A0 =A0 return p;
>> =A0}
>>
>> =A0/* Set the size of the cache, allocating or freeing as necessary. *=
/
>> +/* PoD lock held on entry */
>> =A0static int
>> =A0p2m_pod_set_cache_target(struct p2m_domain *p2m, unsigned long
>> pod_target, int preemptible)
>> =A0{
>> @@ -259,8 +262,6 @@ p2m_pod_set_cache_target(struct p2m_doma
>>
>> =A0 =A0 =A0 =A0 /* Grab the lock before checking that pod.super is emp=
ty, or the
>> last
>> =A0 =A0 =A0 =A0 =A0* entries may disappear before we grab the lock. */
>> - =A0 =A0 =A0 =A0lock_page_alloc(p2m);
>> -
>> =A0 =A0 =A0 =A0 if ( (p2m->pod.count - pod_target) > SUPERPAGE_PAGES
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0&& !page_list_empty(&p2m->pod.super) )
>> =A0 =A0 =A0 =A0 =A0 =A0 order =3D PAGE_ORDER_2M;
>> @@ -271,8 +272,6 @@ p2m_pod_set_cache_target(struct p2m_doma
>>
>> =A0 =A0 =A0 =A0 ASSERT(page !=3D NULL);
>>
>> - =A0 =A0 =A0 =A0unlock_page_alloc(p2m);
>> -
>> =A0 =A0 =A0 =A0 /* Then free them */
>> =A0 =A0 =A0 =A0 for ( i =3D 0 ; i < (1 << order) ; i++ )
>> =A0 =A0 =A0 =A0 {
>> @@ -348,7 +347,7 @@ p2m_pod_set_mem_target(struct domain *d,
>> =A0 =A0 int ret =3D 0;
>> =A0 =A0 unsigned long populated;
>>
>> - =A0 =A0p2m_lock(p2m);
>> + =A0 =A0pod_lock(p2m);
>>
>> =A0 =A0 /* P =3D=3D B: Nothing to do. */
>> =A0 =A0 if ( p2m->pod.entry_count =3D=3D 0 )
>> @@ -377,7 +376,7 @@ p2m_pod_set_mem_target(struct domain *d,
>> =A0 =A0 ret =3D p2m_pod_set_cache_target(p2m, pod_target, 1/*preemptib=
le*/);
>>
>> =A0out:
>> - =A0 =A0p2m_unlock(p2m);
>> + =A0 =A0pod_unlock(p2m);
>>
>> =A0 =A0 return ret;
>> =A0}
>> @@ -390,7 +389,7 @@ p2m_pod_empty_cache(struct domain *d)
>>
>> =A0 =A0 /* After this barrier no new PoD activities can happen. */
>> =A0 =A0 BUG_ON(!d->is_dying);
>> - =A0 =A0spin_barrier(&p2m->lock.lock);
>> + =A0 =A0spin_barrier(&p2m->pod.lock.lock);
>>
>> =A0 =A0 lock_page_alloc(p2m);
>>
>> @@ -431,7 +430,8 @@ p2m_pod_offline_or_broken_hit(struct pag
>> =A0 =A0 if ( !(d =3D page_get_owner(p)) || !(p2m =3D p2m_get_hostp2m(d=
)) )
>> =A0 =A0 =A0 =A0 return 0;
>>
>> - =A0 =A0lock_page_alloc(p2m);
>> + =A0 =A0pod_lock(p2m);
>> +
>> =A0 =A0 bmfn =3D mfn_x(page_to_mfn(p));
>> =A0 =A0 page_list_for_each_safe(q, tmp, &p2m->pod.super)
>> =A0 =A0 {
>> @@ -462,12 +462,14 @@ p2m_pod_offline_or_broken_hit(struct pag
>> =A0 =A0 =A0 =A0 }
>> =A0 =A0 }
>>
>> - =A0 =A0unlock_page_alloc(p2m);
>> + =A0 =A0pod_unlock(p2m);
>> =A0 =A0 return 0;
>>
>> =A0pod_hit:
>> + =A0 =A0lock_page_alloc(p2m);
>> =A0 =A0 page_list_add_tail(p, &d->arch.relmem_list);
>> =A0 =A0 unlock_page_alloc(p2m);
>> + =A0 =A0pod_unlock(p2m);
>> =A0 =A0 return 1;
>> =A0}
>>
>> @@ -486,9 +488,9 @@ p2m_pod_offline_or_broken_replace(struct
>> =A0 =A0 if ( unlikely(!p) )
>> =A0 =A0 =A0 =A0 return;
>>
>> - =A0 =A0p2m_lock(p2m);
>> + =A0 =A0pod_lock(p2m);
>> =A0 =A0 p2m_pod_cache_add(p2m, p, PAGE_ORDER_4K);
>> - =A0 =A0p2m_unlock(p2m);
>> + =A0 =A0pod_unlock(p2m);
>> =A0 =A0 return;
>> =A0}
>>
>> @@ -512,6 +514,7 @@ p2m_pod_decrease_reservation(struct doma
>> =A0 =A0 int steal_for_cache =3D 0;
>> =A0 =A0 int pod =3D 0, nonpod =3D 0, ram =3D 0;
>>
>> + =A0 =A0pod_lock(p2m);
>>
>> =A0 =A0 /* If we don't have any outstanding PoD entries, let things ta=
ke
>> their
>> =A0 =A0 =A0* course */
>> @@ -521,11 +524,10 @@ p2m_pod_decrease_reservation(struct doma
>> =A0 =A0 /* Figure out if we need to steal some freed memory for our ca=
che */
>> =A0 =A0 steal_for_cache =3D =A0( p2m->pod.entry_count > p2m->pod.count=
 );
>>
>> - =A0 =A0p2m_lock(p2m);
>> =A0 =A0 audit_p2m(p2m, 1);
>>
>> =A0 =A0 if ( unlikely(d->is_dying) )
>> - =A0 =A0 =A0 =A0goto out_unlock;
>> + =A0 =A0 =A0 =A0goto out;
>>
>> =A0 =A0 /* See what's in here. */
>> =A0 =A0 /* FIXME: Add contiguous; query for PSE entries? */
>
> I don't think this can be quite right.
>
> The point of holding the p2m lock here is so that the p2m entries
> don't change between the gfn_to_mfn_query() here and the
> set_p2m_entries() below.  The balloon driver racing with other vcpus
> populating pages is exactly the kind of race we expect to experience.
> And in any case, this change will cause set_p2m_entry() to ASSERT()
> because we're not holding the p2m lock.
>
> Or am I missing something?
>
> I haven't yet looked at the rest of the patch series, but it would
> definitely be better for people in the future looking back and trying
> to figure out why the code is the way that it is if even transitory
> changesets don't introduce "temporary" violations of invariants. :-)
>
>> @@ -547,14 +549,14 @@ p2m_pod_decrease_reservation(struct doma
>>
>> =A0 =A0 /* No populate-on-demand? =A0Don't need to steal anything? =A0=
Then we're
>> done!*/
>> =A0 =A0 if(!pod && !steal_for_cache)
>> - =A0 =A0 =A0 =A0goto out_unlock;
>> + =A0 =A0 =A0 =A0goto out_audit;
>>
>> =A0 =A0 if ( !nonpod )
>> =A0 =A0 {
>> =A0 =A0 =A0 =A0 /* All PoD: Mark the whole region invalid and tell cal=
ler
>> =A0 =A0 =A0 =A0 =A0* we're done. */
>> =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gpfn, _mfn(INVALID_MFN), order, p2m=
_invalid,
>> p2m->default_access);
>> - =A0 =A0 =A0 =A0p2m->pod.entry_count-=3D(1<<order); /* Lock: p2m */
>> + =A0 =A0 =A0 =A0p2m->pod.entry_count-=3D(1<<order);
>> =A0 =A0 =A0 =A0 BUG_ON(p2m->pod.entry_count < 0);
>> =A0 =A0 =A0 =A0 ret =3D 1;
>> =A0 =A0 =A0 =A0 goto out_entry_check;
>> @@ -577,7 +579,7 @@ p2m_pod_decrease_reservation(struct doma
>> =A0 =A0 =A0 =A0 if ( t =3D=3D p2m_populate_on_demand )
>> =A0 =A0 =A0 =A0 {
>> =A0 =A0 =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gpfn + i, _mfn(INVALID_MFN)=
, 0,
>> p2m_invalid, p2m->default_access);
>> - =A0 =A0 =A0 =A0 =A0 =A0p2m->pod.entry_count--; /* Lock: p2m */
>> + =A0 =A0 =A0 =A0 =A0 =A0p2m->pod.entry_count--;
>> =A0 =A0 =A0 =A0 =A0 =A0 BUG_ON(p2m->pod.entry_count < 0);
>> =A0 =A0 =A0 =A0 =A0 =A0 pod--;
>> =A0 =A0 =A0 =A0 }
>> @@ -613,11 +615,11 @@ out_entry_check:
>> =A0 =A0 =A0 =A0 p2m_pod_set_cache_target(p2m, p2m->pod.entry_count, 0/=
*can't
>> preempt*/);
>> =A0 =A0 }
>>
>> -out_unlock:
>> +out_audit:
>> =A0 =A0 audit_p2m(p2m, 1);
>> - =A0 =A0p2m_unlock(p2m);
>>
>> =A0out:
>> + =A0 =A0pod_unlock(p2m);
>> =A0 =A0 return ret;
>> =A0}
>>
>> @@ -630,20 +632,24 @@ void p2m_pod_dump_data(struct domain *d)
>>
>>
>> =A0/* Search for all-zero superpages to be reclaimed as superpages for=
 the
>> - * PoD cache. Must be called w/ p2m lock held, page_alloc lock not
>> held. */
>> -static int
>> + * PoD cache. Must be called w/ pod lock held, page_alloc lock not
>> held. */
>> +static void
>
> For the same reason, this must be called with the p2m lock held: it
> calls gfn_to_mfn_query() and then calls set_p2m_entry().  As it
> happens, this always *is* called with the p2m lock held at the moment;
> but the comment still needs to reflect this.  Similarly in
> p2m_pod_zero_check().
>
>> =A0p2m_pod_zero_check_superpage(struct p2m_domain *p2m, unsigned long =
gfn)
>> =A0{
>> =A0 =A0 mfn_t mfn, mfn0 =3D _mfn(INVALID_MFN);
>> =A0 =A0 p2m_type_t type, type0 =3D 0;
>> =A0 =A0 unsigned long * map =3D NULL;
>> - =A0 =A0int ret=3D0, reset =3D 0;
>> + =A0 =A0int success =3D 0, reset =3D 0;
>> =A0 =A0 int i, j;
>> =A0 =A0 int max_ref =3D 1;
>> =A0 =A0 struct domain *d =3D p2m->domain;
>>
>> =A0 =A0 if ( !superpage_aligned(gfn) )
>> - =A0 =A0 =A0 =A0goto out;
>> + =A0 =A0 =A0 =A0return;
>> +
>> + =A0 =A0/* If we were enforcing ordering against p2m locks, this is a=
 place
>> + =A0 =A0 * to drop the PoD lock and re-acquire it once we're done muc=
king
>> with
>> + =A0 =A0 * the p2m. */
>>
>> =A0 =A0 /* Allow an extra refcount for one shadow pt mapping in shadow=
ed
>> domains */
>> =A0 =A0 if ( paging_mode_shadow(d) )
>> @@ -751,19 +757,24 @@ p2m_pod_zero_check_superpage(struct p2m_
>> =A0 =A0 =A0 =A0 __trace_var(TRC_MEM_POD_ZERO_RECLAIM, 0, sizeof(t), &t=
);
>> =A0 =A0 }
>>
>> - =A0 =A0/* Finally! =A0We've passed all the checks, and can add the m=
fn
>> superpage
>> - =A0 =A0 * back on the PoD cache, and account for the new p2m PoD ent=
ries
>> */
>> - =A0 =A0p2m_pod_cache_add(p2m, mfn_to_page(mfn0), PAGE_ORDER_2M);
>> - =A0 =A0p2m->pod.entry_count +=3D SUPERPAGE_PAGES;
>> + =A0 =A0success =3D 1;
>> +
>>
>> =A0out_reset:
>> =A0 =A0 if ( reset )
>> =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gfn, mfn0, 9, type0, p2m->default_a=
ccess);
>>
>> =A0out:
>> - =A0 =A0return ret;
>> + =A0 =A0if ( success )
>> + =A0 =A0{
>> + =A0 =A0 =A0 =A0/* Finally! =A0We've passed all the checks, and can a=
dd the mfn
>> superpage
>> + =A0 =A0 =A0 =A0 * back on the PoD cache, and account for the new p2m=
 PoD
>> entries */
>> + =A0 =A0 =A0 =A0p2m_pod_cache_add(p2m, mfn_to_page(mfn0), PAGE_ORDER_=
2M);
>> + =A0 =A0 =A0 =A0p2m->pod.entry_count +=3D SUPERPAGE_PAGES;
>> + =A0 =A0}
>> =A0}
>>
>> +/* On entry, PoD lock is held */
>> =A0static void
>> =A0p2m_pod_zero_check(struct p2m_domain *p2m, unsigned long *gfns, int
>> count)
>> =A0{
>> @@ -775,6 +786,8 @@ p2m_pod_zero_check(struct p2m_domain *p2
>> =A0 =A0 int i, j;
>> =A0 =A0 int max_ref =3D 1;
>>
>> + =A0 =A0/* Also the right time to drop pod_lock if enforcing ordering
>> against p2m_lock */
>> +
>> =A0 =A0 /* Allow an extra refcount for one shadow pt mapping in shadow=
ed
>> domains */
>> =A0 =A0 if ( paging_mode_shadow(d) )
>> =A0 =A0 =A0 =A0 max_ref++;
>> @@ -841,7 +854,6 @@ p2m_pod_zero_check(struct p2m_domain *p2
>> =A0 =A0 =A0 =A0 =A0 =A0 if( *(map[i]+j) !=3D 0 )
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
>>
>> - =A0 =A0 =A0 =A0unmap_domain_page(map[i]);
>>
>> =A0 =A0 =A0 =A0 /* See comment in p2m_pod_zero_check_superpage() re gn=
ttab
>> =A0 =A0 =A0 =A0 =A0* check timing. =A0*/
>> @@ -849,8 +861,15 @@ p2m_pod_zero_check(struct p2m_domain *p2
>> =A0 =A0 =A0 =A0 {
>> =A0 =A0 =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gfns[i], mfns[i], PAGE_ORDE=
R_4K,
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 types[i], p2m->default_access);
>> + =A0 =A0 =A0 =A0 =A0 =A0unmap_domain_page(map[i]);
>> + =A0 =A0 =A0 =A0 =A0 =A0map[i] =3D NULL;
>> =A0 =A0 =A0 =A0 }
>> - =A0 =A0 =A0 =A0else
>> + =A0 =A0}
>> +
>> + =A0 =A0/* Finally, add to cache */
>> + =A0 =A0for ( i=3D0; i < count; i++ )
>> + =A0 =A0{
>> + =A0 =A0 =A0 =A0if ( map[i] )
>> =A0 =A0 =A0 =A0 {
>> =A0 =A0 =A0 =A0 =A0 =A0 if ( tb_init_done )
>> =A0 =A0 =A0 =A0 =A0 =A0 {
>> @@ -867,6 +886,8 @@ p2m_pod_zero_check(struct p2m_domain *p2
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 __trace_var(TRC_MEM_POD_ZERO_RECLAIM, =
0, sizeof(t), &t);
>> =A0 =A0 =A0 =A0 =A0 =A0 }
>>
>> + =A0 =A0 =A0 =A0 =A0 =A0unmap_domain_page(map[i]);
>> +
>> =A0 =A0 =A0 =A0 =A0 =A0 /* Add to cache, and account for the new p2m P=
oD entry */
>> =A0 =A0 =A0 =A0 =A0 =A0 p2m_pod_cache_add(p2m, mfn_to_page(mfns[i]), P=
AGE_ORDER_4K);
>> =A0 =A0 =A0 =A0 =A0 =A0 p2m->pod.entry_count++;
>> @@ -876,6 +897,7 @@ p2m_pod_zero_check(struct p2m_domain *p2
>> =A0}
>>
>> =A0#define POD_SWEEP_LIMIT 1024
>> +/* Only one CPU at a time is guaranteed to enter a sweep */
>> =A0static void
>> =A0p2m_pod_emergency_sweep_super(struct p2m_domain *p2m)
>> =A0{
>> @@ -964,7 +986,8 @@ p2m_pod_demand_populate(struct p2m_domai
>>
>> =A0 =A0 ASSERT(p2m_locked_by_me(p2m));
>>
>> - =A0 =A0/* This check is done with the p2m lock held. =A0This will ma=
ke sure
>> that
>> + =A0 =A0pod_lock(p2m);
>> + =A0 =A0/* This check is done with the pod lock held. =A0This will ma=
ke sure
>> that
>> =A0 =A0 =A0* even if d->is_dying changes under our feet, p2m_pod_empty=
_cache()
>> =A0 =A0 =A0* won't start until we're done. */
>> =A0 =A0 if ( unlikely(d->is_dying) )
>> @@ -974,6 +997,7 @@ p2m_pod_demand_populate(struct p2m_domai
>> =A0 =A0 =A0* 1GB region to 2MB chunks for a retry. */
>> =A0 =A0 if ( order =3D=3D PAGE_ORDER_1G )
>> =A0 =A0 {
>> + =A0 =A0 =A0 =A0pod_unlock(p2m);
>> =A0 =A0 =A0 =A0 gfn_aligned =3D (gfn >> order) << order;
>> =A0 =A0 =A0 =A0 /* Note that we are supposed to call set_p2m_entry() 5=
12 times
>> to
>> =A0 =A0 =A0 =A0 =A0* split 1GB into 512 2MB pages here. But We only do=
 once here
>> because
>> @@ -983,6 +1007,7 @@ p2m_pod_demand_populate(struct p2m_domai
>> =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gfn_aligned, _mfn(0), PAGE_ORDER_2M=
,
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 p2m_populate_on_demand, p2=
m->default_access);
>> =A0 =A0 =A0 =A0 audit_p2m(p2m, 1);
>> + =A0 =A0 =A0 =A0/* This is because the ept/pt caller locks the p2m re=
cursively
>> */
>> =A0 =A0 =A0 =A0 p2m_unlock(p2m);
>> =A0 =A0 =A0 =A0 return 0;
>> =A0 =A0 }
>> @@ -996,11 +1021,15 @@ p2m_pod_demand_populate(struct p2m_domai
>>
>> =A0 =A0 =A0 =A0 /* If we're low, start a sweep */
>> =A0 =A0 =A0 =A0 if ( order =3D=3D PAGE_ORDER_2M && page_list_empty(&p2=
m->pod.super)
>> )
>> + =A0 =A0 =A0 =A0 =A0 =A0/* Note that sweeps scan other ranges in the =
p2m. In an
>> scenario
>> + =A0 =A0 =A0 =A0 =A0 =A0 * in which p2m locks are order-enforced wrt =
pod lock and
>> p2m
>> + =A0 =A0 =A0 =A0 =A0 =A0 * locks are fine grained, this will result i=
n deadlock */
>> =A0 =A0 =A0 =A0 =A0 =A0 p2m_pod_emergency_sweep_super(p2m);
>>
>> =A0 =A0 =A0 =A0 if ( page_list_empty(&p2m->pod.single) &&
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0( ( order =3D=3D PAGE_ORDER_4K )
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0|| (order =3D=3D PAGE_ORDER_2M &&
>> page_list_empty(&p2m->pod.super) ) ) )
>> + =A0 =A0 =A0 =A0 =A0 =A0/* Same comment regarding deadlock applies */
>> =A0 =A0 =A0 =A0 =A0 =A0 p2m_pod_emergency_sweep(p2m);
>> =A0 =A0 }
>>
>> @@ -1008,8 +1037,6 @@ p2m_pod_demand_populate(struct p2m_domai
>> =A0 =A0 if ( q =3D=3D p2m_guest && gfn > p2m->pod.max_guest )
>> =A0 =A0 =A0 =A0 p2m->pod.max_guest =3D gfn;
>>
>> - =A0 =A0lock_page_alloc(p2m);
>> -
>> =A0 =A0 if ( p2m->pod.count =3D=3D 0 )
>> =A0 =A0 =A0 =A0 goto out_of_memory;
>>
>> @@ -1022,8 +1049,6 @@ p2m_pod_demand_populate(struct p2m_domai
>>
>> =A0 =A0 BUG_ON((mfn_x(mfn) & ((1 << order)-1)) !=3D 0);
>>
>> - =A0 =A0unlock_page_alloc(p2m);
>> -
>> =A0 =A0 gfn_aligned =3D (gfn >> order) << order;
>>
>> =A0 =A0 set_p2m_entry(p2m, gfn_aligned, mfn, order, p2m_ram_rw,
>> p2m->default_access);
>> @@ -1034,8 +1059,9 @@ p2m_pod_demand_populate(struct p2m_domai
>> =A0 =A0 =A0 =A0 paging_mark_dirty(d, mfn_x(mfn) + i);
>> =A0 =A0 }
>>
>> - =A0 =A0p2m->pod.entry_count -=3D (1 << order); /* Lock: p2m */
>> + =A0 =A0p2m->pod.entry_count -=3D (1 << order);
>> =A0 =A0 BUG_ON(p2m->pod.entry_count < 0);
>> + =A0 =A0pod_unlock(p2m);
>>
>> =A0 =A0 if ( tb_init_done )
>> =A0 =A0 {
>> @@ -1054,16 +1080,17 @@ p2m_pod_demand_populate(struct p2m_domai
>>
>> =A0 =A0 return 0;
>> =A0out_of_memory:
>> - =A0 =A0unlock_page_alloc(p2m);
>> + =A0 =A0pod_unlock(p2m);
>>
>> =A0 =A0 printk("%s: Out of populate-on-demand memory! tot_pages %" PRI=
u32 "
>> pod_entries %" PRIi32 "\n",
>> =A0 =A0 =A0 =A0 =A0 =A0__func__, d->tot_pages, p2m->pod.entry_count);
>> =A0 =A0 domain_crash(d);
>> =A0out_fail:
>> + =A0 =A0pod_unlock(p2m);
>> =A0 =A0 return -1;
>> =A0remap_and_retry:
>> =A0 =A0 BUG_ON(order !=3D PAGE_ORDER_2M);
>> - =A0 =A0unlock_page_alloc(p2m);
>> + =A0 =A0pod_unlock(p2m);
>>
>> =A0 =A0 /* Remap this 2-meg region in singleton chunks */
>> =A0 =A0 gfn_aligned =3D (gfn>>order)<<order;
>> @@ -1133,9 +1160,11 @@ guest_physmap_mark_populate_on_demand(st
>> =A0 =A0 =A0 =A0 rc =3D -EINVAL;
>> =A0 =A0 else
>> =A0 =A0 {
>> - =A0 =A0 =A0 =A0p2m->pod.entry_count +=3D 1 << order; /* Lock: p2m */
>> + =A0 =A0 =A0 =A0pod_lock(p2m);
>> + =A0 =A0 =A0 =A0p2m->pod.entry_count +=3D 1 << order;
>> =A0 =A0 =A0 =A0 p2m->pod.entry_count -=3D pod_count;
>> =A0 =A0 =A0 =A0 BUG_ON(p2m->pod.entry_count < 0);
>> + =A0 =A0 =A0 =A0pod_unlock(p2m);
>> =A0 =A0 }
>>
>> =A0 =A0 audit_p2m(p2m, 1);
>> diff -r 332775f72a30 -r 981073d78f7f xen/arch/x86/mm/p2m-pt.c
>> --- a/xen/arch/x86/mm/p2m-pt.c
>> +++ b/xen/arch/x86/mm/p2m-pt.c
>> @@ -1001,6 +1001,7 @@ void audit_p2m(struct p2m_domain *p2m, i
>> =A0 =A0 if ( !paging_mode_translate(d) )
>> =A0 =A0 =A0 =A0 return;
>>
>> + =A0 =A0pod_lock(p2m);
>> =A0 =A0 //P2M_PRINTK("p2m audit starts\n");
>>
>> =A0 =A0 test_linear =3D ( (d =3D=3D current->domain)
>> @@ -1247,6 +1248,8 @@ void audit_p2m(struct p2m_domain *p2m, i
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0pmbad, mpbad);
>> =A0 =A0 =A0 =A0 WARN();
>> =A0 =A0 }
>> +
>> + =A0 =A0pod_unlock(p2m);
>> =A0}
>> =A0#endif /* P2M_AUDIT */
>>
>> diff -r 332775f72a30 -r 981073d78f7f xen/arch/x86/mm/p2m.c
>> --- a/xen/arch/x86/mm/p2m.c
>> +++ b/xen/arch/x86/mm/p2m.c
>> @@ -72,6 +72,7 @@ boolean_param("hap_2mb", opt_hap_2mb);
>> =A0static void p2m_initialise(struct domain *d, struct p2m_domain *p2m=
)
>> =A0{
>> =A0 =A0 mm_lock_init(&p2m->lock);
>> + =A0 =A0mm_lock_init(&p2m->pod.lock);
>> =A0 =A0 INIT_LIST_HEAD(&p2m->np2m_list);
>> =A0 =A0 INIT_PAGE_LIST_HEAD(&p2m->pages);
>> =A0 =A0 INIT_PAGE_LIST_HEAD(&p2m->pod.super);
>> @@ -506,8 +507,10 @@ guest_physmap_add_entry(struct domain *d
>> =A0 =A0 =A0 =A0 =A0 =A0 rc =3D -EINVAL;
>> =A0 =A0 =A0 =A0 else
>> =A0 =A0 =A0 =A0 {
>> - =A0 =A0 =A0 =A0 =A0 =A0p2m->pod.entry_count -=3D pod_count; /* Lock:=
 p2m */
>> + =A0 =A0 =A0 =A0 =A0 =A0pod_lock(p2m);
>> + =A0 =A0 =A0 =A0 =A0 =A0p2m->pod.entry_count -=3D pod_count;
>> =A0 =A0 =A0 =A0 =A0 =A0 BUG_ON(p2m->pod.entry_count < 0);
>> + =A0 =A0 =A0 =A0 =A0 =A0pod_unlock(p2m);
>> =A0 =A0 =A0 =A0 }
>> =A0 =A0 }
>>
>> @@ -1125,8 +1128,10 @@ p2m_flush_table(struct p2m_domain *p2m)
>> =A0 =A0 /* "Host" p2m tables can have shared entries &c that need a bi=
t more
>> =A0 =A0 =A0* care when discarding them */
>> =A0 =A0 ASSERT(p2m_is_nestedp2m(p2m));
>> + =A0 =A0pod_lock(p2m);
>> =A0 =A0 ASSERT(page_list_empty(&p2m->pod.super));
>> =A0 =A0 ASSERT(page_list_empty(&p2m->pod.single));
>> + =A0 =A0pod_unlock(p2m);
>>
>> =A0 =A0 /* This is no longer a valid nested p2m for any address space =
*/
>> =A0 =A0 p2m->cr3 =3D CR3_EADDR;
>> diff -r 332775f72a30 -r 981073d78f7f xen/include/asm-x86/p2m.h
>> --- a/xen/include/asm-x86/p2m.h
>> +++ b/xen/include/asm-x86/p2m.h
>> @@ -257,24 +257,13 @@ struct p2m_domain {
>> =A0 =A0 unsigned long max_mapped_pfn;
>>
>> =A0 =A0 /* Populate-on-demand variables
>> - =A0 =A0 * NB on locking. =A0{super,single,count} are
>> - =A0 =A0 * covered by d->page_alloc_lock, since they're almost always=
 used
>> in
>> - =A0 =A0 * conjunction with that functionality. =A0{entry_count} is c=
overed
>> by
>> - =A0 =A0 * the domain p2m lock, since it's almost always used in
>> conjunction
>> - =A0 =A0 * with changing the p2m tables.
>> =A0 =A0 =A0*
>> - =A0 =A0 * At this point, both locks are held in two places. =A0In bo=
th,
>> - =A0 =A0 * the order is [p2m,page_alloc]:
>> - =A0 =A0 * + p2m_pod_decrease_reservation() calls p2m_pod_cache_add()=
,
>> - =A0 =A0 * =A0 which grabs page_alloc
>> - =A0 =A0 * + p2m_pod_demand_populate() grabs both; the p2m lock to av=
oid
>> - =A0 =A0 * =A0 double-demand-populating of pages, the page_alloc lock=
 to
>> - =A0 =A0 * =A0 protect moving stuff from the PoD cache to the domain =
page
>> list.
>> - =A0 =A0 *
>> - =A0 =A0 * We enforce this lock ordering through a construct in mm-lo=
cks.h.
>> - =A0 =A0 * This demands, however, that we store the previous lock-ord=
ering
>> - =A0 =A0 * level in effect before grabbing the page_alloc lock.
>> - =A0 =A0 */
>> + =A0 =A0 * All variables are protected with the pod lock. We cannot r=
ely on
>> + =A0 =A0 * the p2m lock if it's turned into a fine-grained lock.
>> + =A0 =A0 * We only use the domain page_alloc lock for additions and
>> + =A0 =A0 * deletions to the domain's page list. Because we use it nes=
ted
>> + =A0 =A0 * within the PoD lock, we enforce it's ordering (by remember=
ing
>> + =A0 =A0 * the unlock level). */
>> =A0 =A0 struct {
>> =A0 =A0 =A0 =A0 struct page_list_head super, =A0 /* List of superpages=
 =A0 =A0 =A0 =A0 =A0 =A0
>> =A0 =A0*/
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0single; =A0 =A0 =A0=
 /* Non-super lists =A0 =A0 =A0 =A0 =A0 =A0 =A0
>> =A0 =A0 */
>> @@ -283,6 +272,8 @@ struct p2m_domain {
>> =A0 =A0 =A0 =A0 unsigned =A0 =A0 =A0 =A0 reclaim_super; /* Last gpfn o=
f a scan */
>> =A0 =A0 =A0 =A0 unsigned =A0 =A0 =A0 =A0 reclaim_single; /* Last gpfn =
of a scan */
>> =A0 =A0 =A0 =A0 unsigned =A0 =A0 =A0 =A0 max_guest; =A0 =A0/* gpfn of =
max guest
>> demand-populate */
>> + =A0 =A0 =A0 =A0mm_lock_t =A0 =A0 =A0 =A0lock; =A0 =A0 =A0 =A0 /* Loc=
king of private pod
>> structs, =A0 *
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0* not relying on the p2m lock.
>> =A0 =A0 =A0*/
>> =A0 =A0 =A0 =A0 int =A0 =A0 =A0 =A0 =A0 =A0 =A0page_alloc_unlock_level=
; /* To enforce lock
>> ordering */
>> =A0 =A0 } pod;
>> =A0};
>>
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com
>> http://lists.xensource.com/xen-devel
>>
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 08:13:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 08:13:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLyyn-00067D-63; Thu, 03 Nov 2011 08:13:21 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLyse-0005nV-N6
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 08:07:29 -0700
X-Env-Sender: ben.guthro@gmail.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1320332816!2184926!1
X-Originating-IP: [209.85.161.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25964 invoked from network); 3 Nov 2011 15:06:57 -0000
Received: from mail-fx0-f43.google.com (HELO mail-fx0-f43.google.com)
	(209.85.161.43)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 15:06:57 -0000
Received: by faat9 with SMTP id t9so2310909faa.30
	for <xen-devel@lists.xensource.com>;
	Thu, 03 Nov 2011 08:06:56 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:cc:content-type;
	bh=9GTkc+l/fsIJ3ETQeN7G9BJQbqFNL2JyuqTtXpt1LRo=;
	b=STrRicF0VaWqIoqdVYtsPNS65ORpI+QsOec0aeo06D8LQvf6RmZdwauqGxE18Onvqg
	V9YfwcAXQUvkDBa/AvP1RXKinA1U5jT3UzU/X4GpGH2atabPUsZtTFOEh4Z88XXfnAhL
	tpKjdbQKdAxR5JEDRhlYSmY6DepQ9/NVQAirQ=
MIME-Version: 1.0
Received: by 10.223.17.3 with SMTP id q3mr16929795faa.28.1320332816443; Thu,
	03 Nov 2011 08:06:56 -0700 (PDT)
Received: by 10.223.96.4 with HTTP; Thu, 3 Nov 2011 08:06:56 -0700 (PDT)
In-Reply-To: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
Date: Thu, 3 Nov 2011 11:06:56 -0400
X-Google-Sender-Auth: tw1Dvsla6k3hvH4flmVX2iSyEAE
Message-ID: <CAOvdn6VfZ524ku2DBMfmTV+dHGXrSV8Ls_iwHdm=ESXO9kUjcg@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 0/3] x86/microcode: support for microcode
	update in Xen dom0
From: Ben Guthro <ben@guthro.net>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	"H. Peter Anvin" <hpa@zytor.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0248694589=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0248694589==
Content-Type: multipart/alternative; boundary=00151743f846826cb504b0d5f00e

--00151743f846826cb504b0d5f00e
Content-Type: text/plain; charset=ISO-8859-1

After pulling in this change from your tree, I found the following bug,
when checking an enum value, which should be considered before inclusion:


diff --git a/arch/x86/kernel/microcode_xen.c
b/arch/x86/kernel/microcode_xen.c
index 9d2a06b..6a73957 100644
--- a/arch/x86/kernel/microcode_xen.c
+++ b/arch/x86/kernel/microcode_xen.c
@@ -157,7 +157,7 @@ static enum ucode_state xen_request_microcode_user(int
cpu,
  ret = UCODE_OK;

 out:
- if (ret == 0)
+ if (ret == UCODE_OK)
  uci->mc = uc;
  else
  vfree(uc);



On Mon, Sep 26, 2011 at 2:17 PM, Jeremy Fitzhardinge <jeremy@goop.org>wrote:

> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
>
> Hi all,
>
> I'm proposing this for the next merge window v3.2.
>
> I originally posted this early this year, and it prompted a debate
> about what the "proper" way that Linux should do microcode updates,
> with the general concensus being "earlier", ideally in the bootloader
> (or in the case of Xen, as the hypervisor boots before starting any
> domains).  However, as far as I know there has been no progress along
> those lines.
>
> I would like to therefore merge this so that a Linux kernel booting as
> dom0 under Xen can update the microcode in the same manner as a kernel
> booting natively.  When we work out how boot-time microcode updates
> can be done, then we'll look at modifying Xen accordingly.  In the
> meantime, we should have a functional parity.
>
> The only change to this code from the previous posting is some patch
> restructuring so that regardless of how the platform.h ABI header gets
> merged (since there are some other pending branches containing it), it
> will be identical and cause no merge headaches.
>
> >From original posting:
>
> This series adds a new "Xen" microcode update type, in addition to
> Intel and AMD.
>
> The Xen hypervisor is responsible for performing the actual microcode
> update (since only it knows what physical CPUs are in the system and
> has sufficient privilege to access them), but it requires the dom0
> kernel to provide the actual microcode update data.
>
> Xen update mechanism is uniform independent of the CPU type, but the
> driver must know where to find the data file, which depends on the CPU
> type.  And since the update hypercall updates all CPUs, we only need
> to execute it once on any CPU - but for simplicity it just runs it only
> on (V)CPU 0.
>
> Thanks,
>        J
>
> Jeremy Fitzhardinge (2):
>  xen: add dom0_op hypercall
>  xen: add CPU microcode update driver
>
> Yu Ke (1):
>  xen/acpi: Domain0 acpi parser related platform hypercall
>
>  arch/ia64/include/asm/xen/interface.h |    1 +
>  arch/x86/include/asm/microcode.h      |    9 +
>  arch/x86/include/asm/xen/hypercall.h  |    8 +
>  arch/x86/include/asm/xen/interface.h  |    1 +
>  arch/x86/kernel/Makefile              |    1 +
>  arch/x86/kernel/microcode_core.c      |    5 +-
>  arch/x86/kernel/microcode_xen.c       |  198 ++++++++++++++++++++
>  arch/x86/xen/Kconfig                  |    4 +
>  include/xen/interface/platform.h      |  320
> +++++++++++++++++++++++++++++++++
>  include/xen/interface/xen.h           |    1 +
>  10 files changed, 547 insertions(+), 1 deletions(-)
>  create mode 100644 arch/x86/kernel/microcode_xen.c
>  create mode 100644 include/xen/interface/platform.h
>
> --
> 1.7.6.2
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>

--00151743f846826cb504b0d5f00e
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

After pulling in this change from your tree, I found the following bug, whe=
n checking an enum value, which should be considered before inclusion:<div>=
<br></div><div><br></div><div><div>diff --git a/arch/x86/kernel/microcode_x=
en.c b/arch/x86/kernel/microcode_xen.c</div>
<div>index 9d2a06b..6a73957 100644</div><div>--- a/arch/x86/kernel/microcod=
e_xen.c</div><div>+++ b/arch/x86/kernel/microcode_xen.c</div><div>@@ -157,7=
 +157,7 @@ static enum ucode_state xen_request_microcode_user(int cpu,</div=
>
<div>=A0<span class=3D"Apple-tab-span" style=3D"white-space:pre">	</span>re=
t =3D UCODE_OK;</div><div>=A0</div><div>=A0out:</div><div>-<span class=3D"A=
pple-tab-span" style=3D"white-space:pre">	</span>if (ret =3D=3D 0)</div><di=
v>+<span class=3D"Apple-tab-span" style=3D"white-space:pre">	</span>if (ret=
 =3D=3D UCODE_OK)</div>
<div>=A0<span class=3D"Apple-tab-span" style=3D"white-space:pre">		</span>u=
ci-&gt;mc =3D uc;</div><div>=A0<span class=3D"Apple-tab-span" style=3D"whit=
e-space:pre">	</span>else</div><div>=A0<span class=3D"Apple-tab-span" style=
=3D"white-space:pre">		</span>vfree(uc);</div>
<div><br></div><div><br></div><br><div class=3D"gmail_quote">On Mon, Sep 26=
, 2011 at 2:17 PM, Jeremy Fitzhardinge <span dir=3D"ltr">&lt;<a href=3D"mai=
lto:jeremy@goop.org">jeremy@goop.org</a>&gt;</span> wrote:<br><blockquote c=
lass=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;=
padding-left:1ex;">
From: Jeremy Fitzhardinge &lt;<a href=3D"mailto:jeremy.fitzhardinge@citrix.=
com">jeremy.fitzhardinge@citrix.com</a>&gt;<br>
<br>
Hi all,<br>
<br>
I&#39;m proposing this for the next merge window v3.2.<br>
<br>
I originally posted this early this year, and it prompted a debate<br>
about what the &quot;proper&quot; way that Linux should do microcode update=
s,<br>
with the general concensus being &quot;earlier&quot;, ideally in the bootlo=
ader<br>
(or in the case of Xen, as the hypervisor boots before starting any<br>
domains). =A0However, as far as I know there has been no progress along<br>
those lines.<br>
<br>
I would like to therefore merge this so that a Linux kernel booting as<br>
dom0 under Xen can update the microcode in the same manner as a kernel<br>
booting natively. =A0When we work out how boot-time microcode updates<br>
can be done, then we&#39;ll look at modifying Xen accordingly. =A0In the<br=
>
meantime, we should have a functional parity.<br>
<br>
The only change to this code from the previous posting is some patch<br>
restructuring so that regardless of how the platform.h ABI header gets<br>
merged (since there are some other pending branches containing it), it<br>
will be identical and cause no merge headaches.<br>
<br>
&gt;From original posting:<br>
<br>
This series adds a new &quot;Xen&quot; microcode update type, in addition t=
o<br>
Intel and AMD.<br>
<br>
The Xen hypervisor is responsible for performing the actual microcode<br>
update (since only it knows what physical CPUs are in the system and<br>
has sufficient privilege to access them), but it requires the dom0<br>
kernel to provide the actual microcode update data.<br>
<br>
Xen update mechanism is uniform independent of the CPU type, but the<br>
driver must know where to find the data file, which depends on the CPU<br>
type. =A0And since the update hypercall updates all CPUs, we only need<br>
to execute it once on any CPU - but for simplicity it just runs it only<br>
on (V)CPU 0.<br>
<br>
Thanks,<br>
 =A0 =A0 =A0 =A0J<br>
<br>
Jeremy Fitzhardinge (2):<br>
 =A0xen: add dom0_op hypercall<br>
 =A0xen: add CPU microcode update driver<br>
<br>
Yu Ke (1):<br>
 =A0xen/acpi: Domain0 acpi parser related platform hypercall<br>
<br>
=A0arch/ia64/include/asm/xen/interface.h | =A0 =A01 +<br>
=A0arch/x86/include/asm/microcode.h =A0 =A0 =A0| =A0 =A09 +<br>
=A0arch/x86/include/asm/xen/hypercall.h =A0| =A0 =A08 +<br>
=A0arch/x86/include/asm/xen/interface.h =A0| =A0 =A01 +<br>
=A0arch/x86/kernel/Makefile =A0 =A0 =A0 =A0 =A0 =A0 =A0| =A0 =A01 +<br>
=A0arch/x86/kernel/microcode_core.c =A0 =A0 =A0| =A0 =A05 +-<br>
=A0arch/x86/kernel/microcode_xen.c =A0 =A0 =A0 | =A0198 +++++++++++++++++++=
+<br>
=A0arch/x86/xen/Kconfig =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0| =A0 =A04 +<br>
=A0include/xen/interface/platform.h =A0 =A0 =A0| =A0320 +++++++++++++++++++=
++++++++++++++<br>
=A0include/xen/interface/xen.h =A0 =A0 =A0 =A0 =A0 | =A0 =A01 +<br>
=A010 files changed, 547 insertions(+), 1 deletions(-)<br>
=A0create mode 100644 arch/x86/kernel/microcode_xen.c<br>
=A0create mode 100644 include/xen/interface/platform.h<br>
<span class=3D"HOEnZb"><font color=3D"#888888"><br>
--<br>
1.7.6.2<br>
<br>
<br>
_______________________________________________<br>
Xen-devel mailing list<br>
<a href=3D"mailto:Xen-devel@lists.xensource.com">Xen-devel@lists.xensource.=
com</a><br>
<a href=3D"http://lists.xensource.com/xen-devel" target=3D"_blank">http://l=
ists.xensource.com/xen-devel</a><br>
</font></span></blockquote></div><br></div>

--00151743f846826cb504b0d5f00e--


--===============0248694589==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0248694589==--


From xen-devel-bounces@lists.xensource.com Thu Nov 03 08:19:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 08:19:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLz4e-0006Zm-10; Thu, 03 Nov 2011 08:19:24 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLz2y-0006Lu-Bf
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 08:17:41 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1320333456!815037!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3528 invoked from network); 3 Nov 2011 15:17:37 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-13.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 15:17:37 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 03 Nov 2011 15:17:36 +0000
Message-Id: <4EB2BE9E020000780005EC7F@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 03 Nov 2011 15:17:34 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Andrew Cooper" <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] [PATCH 1/2] IRQ: allocate CPU masks
	 dynamically
References: <4EB2B2B5020000780005EBDD@nat28.tlf.novell.com>
	<4EB2A9F5.1060800@citrix.com>
In-Reply-To: <4EB2A9F5.1060800@citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Keir Fraser <keir@xen.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 03.11.11 at 15:49, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
> On 03/11/11 14:26, Jan Beulich wrote:
>> IRQ: allocate CPU masks dynamically
>>
>> This includes delaying the initialization of dynamically created IRQs
>> until their actual first use and some further elimination of uses of
>> struct irq_cfg.
>>
>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>=20
> Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
>=20
> One query which may or may not affect the patch.  Would we get better
> caching characteristics if all cpumasks were allocated in consecutive
> memory, rather than having 3 individual allocs in arch_init_one_irq_desc =
?

That was what the first version of the patch did, rejected by Keir
(and not liked too much by me either).

Jan

>> --- a/xen/arch/ia64/linux-xen/irq_ia64.c
>> +++ b/xen/arch/ia64/linux-xen/irq_ia64.c
>> @@ -303,6 +303,9 @@ int __init request_irq_vector(unsigned i
>>  void __init
>>  init_IRQ (void)
>>  {
>> +#ifdef XEN
>> +       BUG_ON(init_irq_data());
>> +#endif
>>         register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL);
>>  #ifdef CONFIG_SMP
>>         register_percpu_irq(IA64_IPI_VECTOR, &ipi_irqaction);
>> --- a/xen/arch/ia64/xen/irq.c
>> +++ b/xen/arch/ia64/xen/irq.c
>> @@ -74,17 +74,30 @@ unsigned int __ia64_local_vector_to_irq
>>  /*
>>   * Controller mappings for all interrupt sources:
>>   */
>> -irq_desc_t irq_desc[NR_IRQS] =3D {
>> -       [0 ... NR_IRQS-1] =3D {
>> -               .status =3D IRQ_DISABLED,
>> -               .handler =3D &no_irq_type,
>> -               .lock =3D SPIN_LOCK_UNLOCKED
>> -               .arch =3D {
>> -                       .vector =3D -1,
>> -                       .cpu_mask =3D CPU_MASK_ALL,
>> -               }
>> +irq_desc_t irq_desc[NR_IRQS];
>> +
>> +int __init arch_init_one_irq_desc(struct irq_desc *desc)
>> +{
>> +       if (!alloc_cpumask_var(&desc->arch.cpu_mask))
>> +               return -ENOMEM;
>> +
>> +       desc->arch.vector =3D -1;
>> +       cpumask_setall(desc->arch.cpu_mask);
>> +
>> +       return 0;
>> +}
>> +
>> +int __init init_irq_data(void)
>> +{
>> +       unsigned int irq;
>> +
>> +       for (irq =3D 0; irq < NR_IRQS; irq++) {
>> +               struct irq_desc *desc =3D irq_to_desc(irq);
>> +
>> +               desc->irq =3D irq;
>> +               init_one_irq_desc(desc);
>>         }
>> -};
>> +}
>>
>>  void __do_IRQ_guest(int irq);
>>
>> --- a/xen/arch/x86/i8259.c
>> +++ b/xen/arch/x86/i8259.c
>> @@ -398,7 +398,7 @@ void __init init_IRQ(void)
>>
>>          desc->handler =3D &i8259A_irq_type;
>>          per_cpu(vector_irq, cpu)[FIRST_LEGACY_VECTOR + irq] =3D irq;
>> -        cpumask_copy(&desc->arch.cpu_mask, cpumask_of(cpu));
>> +        cpumask_copy(desc->arch.cpu_mask, cpumask_of(cpu));
>>          desc->arch.vector =3D FIRST_LEGACY_VECTOR + irq;
>>      }
>>
>> --- a/xen/arch/x86/io_apic.c
>> +++ b/xen/arch/x86/io_apic.c
>> @@ -648,20 +648,21 @@ static int pin_2_irq(int idx, int apic,
>>  void /*__init*/ setup_ioapic_dest(void)
>>  {
>>      int pin, ioapic, irq, irq_entry;
>> -    struct irq_cfg *cfg;
>>
>>      if (skip_ioapic_setup)
>>          return;
>>
>>      for (ioapic =3D 0; ioapic < nr_ioapics; ioapic++) {
>>          for (pin =3D 0; pin < nr_ioapic_entries[ioapic]; pin++) {
>> +            struct irq_desc *desc;
>> +
>>              irq_entry =3D find_irq_entry(ioapic, pin, mp_INT);
>>              if (irq_entry =3D=3D -1)
>>                  continue;
>>              irq =3D pin_2_irq(irq_entry, ioapic, pin);
>> -            cfg =3D irq_cfg(irq);
>> -            BUG_ON(cpus_empty(cfg->cpu_mask));
>> -            set_ioapic_affinity_irq(irq_to_desc(irq), &cfg->cpu_mask);
>> +            desc =3D irq_to_desc(irq);
>> +            BUG_ON(cpumask_empty(desc->arch.cpu_mask));
>> +            set_ioapic_affinity_irq(desc, desc->arch.cpu_mask);
>>          }
>>
>>      }
>> @@ -956,12 +957,12 @@ static void __init setup_IO_APIC_irqs(vo
>>      struct IO_APIC_route_entry entry;
>>      int apic, pin, idx, irq, first_notcon =3D 1, vector;
>>      unsigned long flags;
>> -    struct irq_cfg *cfg;
>>
>>      apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
>>
>>      for (apic =3D 0; apic < nr_ioapics; apic++) {
>>          for (pin =3D 0; pin < nr_ioapic_entries[apic]; pin++) {
>> +            struct irq_desc *desc;
>>
>>              /*
>>               * add it to the IO-APIC irq-routing table:
>> @@ -1016,9 +1017,9 @@ static void __init setup_IO_APIC_irqs(vo
>>                  if (!apic && platform_legacy_irq(irq))
>>                      disable_8259A_irq(irq_to_desc(irq));
>>              }
>> -            cfg =3D irq_cfg(irq);
>> +            desc =3D irq_to_desc(irq);
>>              SET_DEST(entry.dest.dest32, entry.dest.logical.logical_dest=
,
>> -                     cpu_mask_to_apicid(&cfg->cpu_mask));
>> +                     cpu_mask_to_apicid(desc->arch.cpu_mask));
>>              spin_lock_irqsave(&ioapic_lock, flags);
>>              __ioapic_write_entry(apic, pin, 0, entry);
>>              set_native_irq_info(irq, TARGET_CPUS);
>> @@ -2372,7 +2373,7 @@ int ioapic_guest_write(unsigned long phy
>>      rte.vector =3D cfg->vector;
>>
>>      SET_DEST(rte.dest.dest32, rte.dest.logical.logical_dest,
>> -             cpu_mask_to_apicid(&cfg->cpu_mask));
>> +             cpu_mask_to_apicid(desc->arch.cpu_mask));
>>
>>      io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&rte) + 0));
>>      io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&rte) + 1));
>> --- a/xen/arch/x86/irq.c
>> +++ b/xen/arch/x86/irq.c
>> @@ -25,6 +25,7 @@
>>  #include <public/physdev.h>
>>
>>  static void parse_irq_vector_map_param(char *s);
>> +static int __assign_irq_vector(int irq, struct irq_desc *, const =
cpumask_t=20
> *);
>>
>>  /* opt_noirqbalance: If true, software IRQ balancing/affinity is =
disabled.=20
> */
>>  bool_t __read_mostly opt_noirqbalance =3D 0;
>> @@ -110,7 +111,7 @@ static int __init __bind_irq_vector(int
>>  {
>>      cpumask_t online_mask;
>>      int cpu;
>> -    struct irq_cfg *cfg =3D irq_cfg(irq);
>> +    struct irq_desc *desc =3D irq_to_desc(irq);
>>
>>      BUG_ON((unsigned)irq >=3D nr_irqs);
>>      BUG_ON((unsigned)vector >=3D NR_VECTORS);
>> @@ -118,21 +119,22 @@ static int __init __bind_irq_vector(int
>>      cpumask_and(&online_mask, cpu_mask, &cpu_online_map);
>>      if (cpumask_empty(&online_mask))
>>          return -EINVAL;
>> -    if ((cfg->vector =3D=3D vector) && cpumask_equal(&cfg->cpu_mask, =
&online_mask))
>> +    if ( (desc->arch.vector =3D=3D vector) &&
>> +         cpumask_equal(desc->arch.cpu_mask, &online_mask) )
>>          return 0;
>> -    if (cfg->vector !=3D IRQ_VECTOR_UNASSIGNED)
>> +    if ( desc->arch.vector !=3D IRQ_VECTOR_UNASSIGNED )
>>          return -EBUSY;
>>      trace_irq_mask(TRC_HW_IRQ_BIND_VECTOR, irq, vector, &online_mask);
>>      for_each_cpu_mask(cpu, online_mask)
>>          per_cpu(vector_irq, cpu)[vector] =3D irq;
>> -    cfg->vector =3D vector;
>> -    cpumask_copy(&cfg->cpu_mask, &online_mask);
>> -    if ( cfg->used_vectors )
>> +    desc->arch.vector =3D vector;
>> +    cpumask_copy(desc->arch.cpu_mask, &online_mask);
>> +    if ( desc->arch.used_vectors )
>>      {
>> -        ASSERT(!test_bit(vector, cfg->used_vectors));
>> -        set_bit(vector, cfg->used_vectors);
>> +        ASSERT(!test_bit(vector, desc->arch.used_vectors));
>> +        set_bit(vector, desc->arch.used_vectors);
>>      }
>> -    cfg->used =3D IRQ_USED;
>> +    desc->arch.used =3D IRQ_USED;
>>      if (IO_APIC_IRQ(irq))
>>          irq_vector[irq] =3D vector;
>>      return 0;
>> @@ -166,14 +168,17 @@ int create_irq(void)
>>  {
>>      unsigned long flags;
>>      int irq, ret;
>> -    irq =3D -ENOSPC;
>> +    struct irq_desc *desc;
>>
>>      spin_lock_irqsave(&vector_lock, flags);
>>
>>      irq =3D find_unassigned_irq();
>>      if (irq < 0)
>>           goto out;
>> -    ret =3D __assign_irq_vector(irq, irq_cfg(irq), TARGET_CPUS);
>> +    desc =3D irq_to_desc(irq);
>> +    ret =3D init_one_irq_desc(desc);
>> +    if (!ret)
>> +        ret =3D __assign_irq_vector(irq, desc, TARGET_CPUS);
>>      if (ret < 0)
>>          irq =3D ret;
>>  out:
>> @@ -197,7 +202,7 @@ static void dynamic_irq_cleanup(unsigned
>>      desc->msi_desc =3D NULL;
>>      desc->handler =3D &no_irq_type;
>>      desc->arch.used_vectors =3D NULL;
>> -    cpumask_setall(&desc->affinity);
>> +    cpumask_setall(desc->affinity);
>>      spin_unlock_irqrestore(&desc->lock, flags);
>>
>>      /* Wait to make sure it's not being used on another CPU */
>> @@ -211,38 +216,38 @@ static void __clear_irq_vector(int irq)
>>  {
>>      int cpu, vector, old_vector;
>>      cpumask_t tmp_mask;
>> -    struct irq_cfg *cfg =3D irq_cfg(irq);
>> +    struct irq_desc *desc =3D irq_to_desc(irq);
>>
>> -    BUG_ON(!cfg->vector);
>> +    BUG_ON(!desc->arch.vector);
>>
>> -    /* Always clear cfg->vector */
>> -    vector =3D cfg->vector;
>> -    cpumask_and(&tmp_mask, &cfg->cpu_mask, &cpu_online_map);
>> +    /* Always clear desc->arch.vector */
>> +    vector =3D desc->arch.vector;
>> +    cpumask_and(&tmp_mask, desc->arch.cpu_mask, &cpu_online_map);
>>
>>      for_each_cpu_mask(cpu, tmp_mask) {
>>          ASSERT( per_cpu(vector_irq, cpu)[vector] =3D=3D irq );
>>          per_cpu(vector_irq, cpu)[vector] =3D -1;
>>      }
>>
>> -    cfg->vector =3D IRQ_VECTOR_UNASSIGNED;
>> -    cpumask_clear(&cfg->cpu_mask);
>> +    desc->arch.vector =3D IRQ_VECTOR_UNASSIGNED;
>> +    cpumask_clear(desc->arch.cpu_mask);
>>
>> -    if ( cfg->used_vectors )
>> +    if ( desc->arch.used_vectors )
>>      {
>> -        ASSERT(test_bit(vector, cfg->used_vectors));
>> -        clear_bit(vector, cfg->used_vectors);
>> +        ASSERT(test_bit(vector, desc->arch.used_vectors));
>> +        clear_bit(vector, desc->arch.used_vectors);
>>      }
>>
>> -    cfg->used =3D IRQ_UNUSED;
>> +    desc->arch.used =3D IRQ_UNUSED;
>>
>>      trace_irq_mask(TRC_HW_IRQ_CLEAR_VECTOR, irq, vector, &tmp_mask);
>>
>> -    if (likely(!cfg->move_in_progress))
>> +    if ( likely(!desc->arch.move_in_progress) )
>>          return;
>>
>> -    /* If we were in motion, also clear cfg->old_vector */
>> -    old_vector =3D cfg->old_vector;
>> -    cpumask_and(&tmp_mask, &cfg->old_cpu_mask, &cpu_online_map);
>> +    /* If we were in motion, also clear desc->arch.old_vector */
>> +    old_vector =3D desc->arch.old_vector;
>> +    cpumask_and(&tmp_mask, desc->arch.old_cpu_mask, &cpu_online_map);
>>
>>      for_each_cpu_mask(cpu, tmp_mask) {
>>          ASSERT( per_cpu(vector_irq, cpu)[old_vector] =3D=3D irq );
>> @@ -250,16 +255,16 @@ static void __clear_irq_vector(int irq)
>>          per_cpu(vector_irq, cpu)[old_vector] =3D -1;
>>       }
>>
>> -    cfg->old_vector =3D IRQ_VECTOR_UNASSIGNED;
>> -    cpumask_clear(&cfg->old_cpu_mask);
>> +    desc->arch.old_vector =3D IRQ_VECTOR_UNASSIGNED;
>> +    cpumask_clear(desc->arch.old_cpu_mask);
>>
>> -    if ( cfg->used_vectors )
>> +    if ( desc->arch.used_vectors )
>>      {
>> -        ASSERT(test_bit(old_vector, cfg->used_vectors));
>> -        clear_bit(old_vector, cfg->used_vectors);
>> +        ASSERT(test_bit(old_vector, desc->arch.used_vectors));
>> +        clear_bit(old_vector, desc->arch.used_vectors);
>>      }
>>
>> -    cfg->move_in_progress =3D 0;
>> +    desc->arch.move_in_progress =3D 0;
>>  }
>>
>>  void clear_irq_vector(int irq)
>> @@ -296,25 +301,28 @@ int irq_to_vector(int irq)
>>      return vector;
>>  }
>>
>> -static void __init init_one_irq_desc(struct irq_desc *desc)
>> +int arch_init_one_irq_desc(struct irq_desc *desc)
>>  {
>> -    desc->status  =3D IRQ_DISABLED;
>> -    desc->handler =3D &no_irq_type;
>> -    desc->action  =3D NULL;
>> -    desc->msi_desc =3D NULL;
>> -    spin_lock_init(&desc->lock);
>> -    cpumask_setall(&desc->affinity);
>> -    INIT_LIST_HEAD(&desc->rl_link);
>> -}
>> +    if ( !zalloc_cpumask_var(&desc->arch.cpu_mask) )
>> +        return -ENOMEM;
>> +
>> +    if ( !alloc_cpumask_var(&desc->arch.old_cpu_mask) )
>> +    {
>> +        free_cpumask_var(desc->arch.cpu_mask);
>> +        return -ENOMEM;
>> +    }
>>
>> -static void __init init_one_irq_cfg(struct irq_cfg *cfg)
>> -{
>> -    cfg->vector =3D IRQ_VECTOR_UNASSIGNED;
>> -    cfg->old_vector =3D IRQ_VECTOR_UNASSIGNED;
>> -    cpumask_clear(&cfg->cpu_mask);
>> -    cpumask_clear(&cfg->old_cpu_mask);
>> -    cfg->used_vectors =3D NULL;
>> -    cfg->used =3D IRQ_UNUSED;
>> +    if ( !alloc_cpumask_var(&desc->arch.pending_mask) )
>> +    {
>> +        free_cpumask_var(desc->arch.old_cpu_mask);
>> +        free_cpumask_var(desc->arch.cpu_mask);
>> +        return -ENOMEM;
>> +    }
>> +
>> +    desc->arch.vector =3D IRQ_VECTOR_UNASSIGNED;
>> +    desc->arch.old_vector =3D IRQ_VECTOR_UNASSIGNED;
>> +
>> +    return 0;
>>  }
>>
>>  int __init init_irq_data(void)
>> @@ -331,12 +339,13 @@ int __init init_irq_data(void)
>>      if ( !irq_desc || !irq_vector )
>>          return -ENOMEM;
>>
>> -    for (irq =3D 0; irq < nr_irqs; irq++) {
>> +    for (irq =3D 0; irq < nr_irqs_gsi; irq++) {
>>          desc =3D irq_to_desc(irq);
>>          desc->irq =3D irq;
>>          init_one_irq_desc(desc);
>> -        init_one_irq_cfg(&desc->arch);
>>      }
>> +    for (; irq < nr_irqs; irq++)
>> +        irq_to_desc(irq)->irq =3D irq;
>>
>>      /* Never allocate the hypercall vector or Linux/BSD fast-trap =
vector. */
>>      set_bit(LEGACY_SYSCALL_VECTOR, used_vectors);
>> @@ -403,7 +412,8 @@ static vmask_t *irq_get_used_vector_mask
>>      return ret;
>>  }
>>
>> -int __assign_irq_vector(int irq, struct irq_cfg *cfg, const cpumask_t =
*mask)
>> +static int __assign_irq_vector(
>> +    int irq, struct irq_desc *desc, const cpumask_t *mask)
>>  {
>>      /*
>>       * NOTE! The local APIC isn't very good at handling
>> @@ -426,13 +436,13 @@ int __assign_irq_vector(int irq, struct
>>      old_vector =3D irq_to_vector(irq);
>>      if (old_vector) {
>>          cpumask_and(&tmp_mask, mask, &cpu_online_map);
>> -        if (cpumask_intersects(&tmp_mask, &cfg->cpu_mask)) {
>> -            cfg->vector =3D old_vector;
>> +        if (cpumask_intersects(&tmp_mask, desc->arch.cpu_mask)) {
>> +            desc->arch.vector =3D old_vector;
>>              return 0;
>>          }
>>      }
>>
>> -    if ((cfg->move_in_progress) || cfg->move_cleanup_count)
>> +    if ( desc->arch.move_in_progress || desc->arch.move_cleanup_count =
)
>>          return -EAGAIN;
>>
>>      err =3D -ENOSPC;
>> @@ -440,9 +450,9 @@ int __assign_irq_vector(int irq, struct
>>      /* This is the only place normal IRQs are ever marked
>>       * as "in use".  If they're not in use yet, check to see
>>       * if we need to assign a global vector mask. */
>> -    if ( cfg->used =3D=3D IRQ_USED )
>> +    if ( desc->arch.used =3D=3D IRQ_USED )
>>      {
>> -        irq_used_vectors =3D cfg->used_vectors;
>> +        irq_used_vectors =3D desc->arch.used_vectors;
>>      }
>>      else
>>          irq_used_vectors =3D irq_get_used_vector_mask(irq);
>> @@ -485,29 +495,29 @@ next:
>>          current_offset =3D offset;
>>          local_irq_save(flags);
>>          if (old_vector) {
>> -            cfg->move_in_progress =3D 1;
>> -            cpumask_copy(&cfg->old_cpu_mask, &cfg->cpu_mask);
>> -            cfg->old_vector =3D cfg->vector;
>> +            desc->arch.move_in_progress =3D 1;
>> +            cpumask_copy(desc->arch.old_cpu_mask, desc->arch.cpu_mask);=

>> +            desc->arch.old_vector =3D desc->arch.vector;
>>          }
>>          trace_irq_mask(TRC_HW_IRQ_ASSIGN_VECTOR, irq, vector, =
&tmp_mask);
>>          for_each_cpu_mask(new_cpu, tmp_mask)
>>              per_cpu(vector_irq, new_cpu)[vector] =3D irq;
>> -        cfg->vector =3D vector;
>> -        cpumask_copy(&cfg->cpu_mask, &tmp_mask);
>> +        desc->arch.vector =3D vector;
>> +        cpumask_copy(desc->arch.cpu_mask, &tmp_mask);
>>
>> -        cfg->used =3D IRQ_USED;
>> -        ASSERT((cfg->used_vectors =3D=3D NULL)
>> -               || (cfg->used_vectors =3D=3D irq_used_vectors));
>> -        cfg->used_vectors =3D irq_used_vectors;
>> +        desc->arch.used =3D IRQ_USED;
>> +        ASSERT((desc->arch.used_vectors =3D=3D NULL)
>> +               || (desc->arch.used_vectors =3D=3D irq_used_vectors));
>> +        desc->arch.used_vectors =3D irq_used_vectors;
>>
>>          if (IO_APIC_IRQ(irq))
>>              irq_vector[irq] =3D vector;
>>
>> -        if ( cfg->used_vectors )
>> +        if ( desc->arch.used_vectors )
>>          {
>> -            ASSERT(!test_bit(vector, cfg->used_vectors));
>> +            ASSERT(!test_bit(vector, desc->arch.used_vectors));
>>
>> -            set_bit(vector, cfg->used_vectors);
>> +            set_bit(vector, desc->arch.used_vectors);
>>          }
>>
>>          err =3D 0;
>> @@ -521,16 +531,15 @@ int assign_irq_vector(int irq)
>>  {
>>      int ret;
>>      unsigned long flags;
>> -    struct irq_cfg *cfg =3D irq_cfg(irq);
>>      struct irq_desc *desc =3D irq_to_desc(irq);
>>
>>      BUG_ON(irq >=3D nr_irqs || irq <0);
>>
>>      spin_lock_irqsave(&vector_lock, flags);
>> -    ret =3D __assign_irq_vector(irq, cfg, TARGET_CPUS);
>> +    ret =3D __assign_irq_vector(irq, desc, TARGET_CPUS);
>>      if (!ret) {
>> -        ret =3D cfg->vector;
>> -        cpumask_copy(&desc->affinity, &cfg->cpu_mask);
>> +        ret =3D desc->arch.vector;
>> +        cpumask_copy(desc->affinity, desc->arch.cpu_mask);
>>      }
>>      spin_unlock_irqrestore(&vector_lock, flags);
>>      return ret;
>> @@ -543,15 +552,16 @@ int assign_irq_vector(int irq)
>>  void __setup_vector_irq(int cpu)
>>  {
>>      int irq, vector;
>> -    struct irq_cfg *cfg;
>>
>>      /* Clear vector_irq */
>>      for (vector =3D 0; vector < NR_VECTORS; ++vector)
>>          per_cpu(vector_irq, cpu)[vector] =3D -1;
>>      /* Mark the inuse vectors */
>>      for (irq =3D 0; irq < nr_irqs; ++irq) {
>> -        cfg =3D irq_cfg(irq);
>> -        if (!cpu_isset(cpu, cfg->cpu_mask))
>> +        struct irq_desc *desc =3D irq_to_desc(irq);
>> +
>> +        if (!irq_desc_initialized(desc) ||
>> +            !cpumask_test_cpu(cpu, desc->arch.cpu_mask))
>>              continue;
>>          vector =3D irq_to_vector(irq);
>>          per_cpu(vector_irq, cpu)[vector] =3D irq;
>> @@ -560,12 +570,14 @@ void __setup_vector_irq(int cpu)
>>
>>  void move_masked_irq(struct irq_desc *desc)
>>  {
>> +    cpumask_t *pending_mask =3D desc->arch.pending_mask;
>> +
>>      if (likely(!(desc->status & IRQ_MOVE_PENDING)))
>>          return;
>>
>>      desc->status &=3D ~IRQ_MOVE_PENDING;
>>
>> -    if (unlikely(cpus_empty(desc->pending_mask)))
>> +    if (unlikely(cpumask_empty(pending_mask)))
>>          return;
>>
>>      if (!desc->handler->set_affinity)
>> @@ -580,10 +592,10 @@ void move_masked_irq(struct irq_desc *de
>>       *
>>       * For correct operation this depends on the caller masking the =
irqs.
>>       */
>> -    if (likely(cpus_intersects(desc->pending_mask, cpu_online_map)))
>> -        desc->handler->set_affinity(desc, &desc->pending_mask);
>> +    if ( likely(cpumask_intersects(pending_mask, &cpu_online_map)) )
>> +        desc->handler->set_affinity(desc, pending_mask);
>>
>> -    cpumask_clear(&desc->pending_mask);
>> +    cpumask_clear(pending_mask);
>>  }
>>
>>  void move_native_irq(struct irq_desc *desc)
>> @@ -626,7 +638,8 @@ fastcall void smp_irq_move_cleanup_inter
>>          if (!desc->arch.move_cleanup_count)
>>              goto unlock;
>>
>> -        if (vector =3D=3D desc->arch.vector && cpumask_test_cpu(me,=20
> &desc->arch.cpu_mask))
>> +        if ( vector =3D=3D desc->arch.vector &&
>> +             cpumask_test_cpu(me, desc->arch.cpu_mask) )
>>              goto unlock;
>>
>>          irr =3D apic_read(APIC_IRR + (vector / 32 * 0x10));
>> @@ -653,7 +666,7 @@ fastcall void smp_irq_move_cleanup_inter
>>          if ( desc->arch.move_cleanup_count =3D=3D 0 )
>>          {
>>              desc->arch.old_vector =3D IRQ_VECTOR_UNASSIGNED;
>> -            cpumask_clear(&desc->arch.old_cpu_mask);
>> +            cpumask_clear(desc->arch.old_cpu_mask);
>>
>>              if ( desc->arch.used_vectors )
>>              {
>> @@ -673,7 +686,7 @@ static void send_cleanup_vector(struct i
>>  {
>>      cpumask_t cleanup_mask;
>>
>> -    cpumask_and(&cleanup_mask, &desc->arch.old_cpu_mask, &cpu_online_ma=
p);
>> +    cpumask_and(&cleanup_mask, desc->arch.old_cpu_mask, &cpu_online_map=
);
>>      desc->arch.move_cleanup_count =3D cpumask_weight(&cleanup_mask);
>>      genapic->send_IPI_mask(&cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR);
>>
>> @@ -690,7 +703,8 @@ void irq_complete_move(struct irq_desc *
>>      vector =3D get_irq_regs()->entry_vector;
>>      me =3D smp_processor_id();
>>
>> -    if (vector =3D=3D desc->arch.vector && cpumask_test_cpu(me, =
&desc->arch.cpu_mask))
>> +    if ( vector =3D=3D desc->arch.vector &&
>> +         cpumask_test_cpu(me, desc->arch.cpu_mask) )
>>          send_cleanup_vector(desc);
>>  }
>>
>> @@ -708,15 +722,15 @@ unsigned int set_desc_affinity(struct ir
>>
>>      local_irq_save(flags);
>>      lock_vector_lock();
>> -    ret =3D __assign_irq_vector(irq, &desc->arch, mask);
>> +    ret =3D __assign_irq_vector(irq, desc, mask);
>>      unlock_vector_lock();
>>      local_irq_restore(flags);
>>
>>      if (ret < 0)
>>          return BAD_APICID;
>>
>> -    cpumask_copy(&desc->affinity, mask);
>> -    cpumask_and(&dest_mask, mask, &desc->arch.cpu_mask);
>> +    cpumask_copy(desc->affinity, mask);
>> +    cpumask_and(&dest_mask, mask, desc->arch.cpu_mask);
>>
>>      return cpu_mask_to_apicid(&dest_mask);
>>  }
>> @@ -730,7 +744,7 @@ void irq_set_affinity(struct irq_desc *d
>>      ASSERT(spin_is_locked(&desc->lock));
>>      desc->status &=3D ~IRQ_MOVE_PENDING;
>>      wmb();
>> -    cpumask_copy(&desc->pending_mask, mask);
>> +    cpumask_copy(desc->arch.pending_mask, mask);
>>      wmb();
>>      desc->status |=3D IRQ_MOVE_PENDING;
>>  }
>> @@ -1992,13 +2006,13 @@ static void dump_irqs(unsigned char key)
>>
>>          desc =3D irq_to_desc(irq);
>>
>> -        if ( !desc->handler || desc->handler =3D=3D &no_irq_type )
>> +        if ( !irq_desc_initialized(desc) || desc->handler =3D=3D =
&no_irq_type )
>>              continue;
>>
>>          spin_lock_irqsave(&desc->lock, flags);
>>
>>          cpumask_scnprintf(keyhandler_scratch, sizeof(keyhandler_scratch=
),
>> -                          &desc->affinity);
>> +                          desc->affinity);
>>          printk("   IRQ:%4d affinity:%s vec:%02x type=3D%-15s"
>>                 " status=3D%08x ",
>>                 irq, keyhandler_scratch, desc->arch.vector,
>> @@ -2073,10 +2087,12 @@ void fixup_irqs(void)
>>              continue;
>>
>>          desc =3D irq_to_desc(irq);
>> +        if ( !irq_desc_initialized(desc) )
>> +            continue;
>>
>>          spin_lock(&desc->lock);
>>
>> -        cpumask_copy(&affinity, &desc->affinity);
>> +        cpumask_copy(&affinity, desc->affinity);
>>          if ( !desc->action || cpumask_subset(&affinity, &cpu_online_map=
) )
>>          {
>>              spin_unlock(&desc->lock);
>> --- a/xen/arch/x86/msi.c
>> +++ b/xen/arch/x86/msi.c
>> @@ -125,13 +125,13 @@ void msi_compose_msg(struct irq_desc *de
>>      unsigned dest;
>>      int vector =3D desc->arch.vector;
>>
>> -    if ( cpumask_empty(&desc->arch.cpu_mask) ) {
>> +    if ( cpumask_empty(desc->arch.cpu_mask) ) {
>>          dprintk(XENLOG_ERR,"%s, compose msi message error!!\n", =
__func__);
>>          return;
>>      }
>>
>>      if ( vector ) {
>> -        dest =3D cpu_mask_to_apicid(&desc->arch.cpu_mask);
>> +        dest =3D cpu_mask_to_apicid(desc->arch.cpu_mask);
>>
>>          msg->address_hi =3D MSI_ADDR_BASE_HI;
>>          msg->address_lo =3D
>> --- a/xen/arch/x86/smpboot.c
>> +++ b/xen/arch/x86/smpboot.c
>> @@ -1011,7 +1011,7 @@ void __init smp_intr_init(void)
>>          irq_vector[irq] =3D FIRST_HIPRIORITY_VECTOR + seridx + 1;
>>          per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_VECTOR + seridx + 1] =
=3D=20
> irq;
>>          irq_to_desc(irq)->arch.vector =3D FIRST_HIPRIORITY_VECTOR + =
seridx + 1;
>> -        cpumask_copy(&irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map)=
;
>> +        cpumask_copy(irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map);=

>>      }
>>
>>      /* IPI for cleanuping vectors after irq move */
>> --- a/xen/common/Makefile
>> +++ b/xen/common/Makefile
>> @@ -5,6 +5,7 @@ obj-y +=3D domctl.o
>>  obj-y +=3D domain.o
>>  obj-y +=3D event_channel.o
>>  obj-y +=3D grant_table.o
>> +obj-y +=3D irq.o
>>  obj-y +=3D kernel.o
>>  obj-y +=3D keyhandler.o
>>  obj-y +=3D kexec.o
>> --- /dev/null
>> +++ a/xen/common/irq.c
>> @@ -0,0 +1,28 @@
>> +#include <xen/config.h>
>> +#include <xen/irq.h>
>> +
>> +int init_one_irq_desc(struct irq_desc *desc)
>> +{
>> +    int err;
>> +
>> +    if (irq_desc_initialized(desc))
>> +        return 0;
>> +
>> +    if ( !alloc_cpumask_var(&desc->affinity) )
>> +        return -ENOMEM;
>> +
>> +    desc->status =3D IRQ_DISABLED;
>> +    desc->handler =3D &no_irq_type;
>> +    spin_lock_init(&desc->lock);
>> +    cpumask_setall(desc->affinity);
>> +    INIT_LIST_HEAD(&desc->rl_link);
>> +
>> +    err =3D arch_init_one_irq_desc(desc);
>> +    if ( err )
>> +    {
>> +        free_cpumask_var(desc->affinity);
>> +        desc->handler =3D NULL;
>> +    }
>> +
>> +    return err;
>> +}
>> --- a/xen/drivers/passthrough/vtd/iommu.c
>> +++ b/xen/drivers/passthrough/vtd/iommu.c
>> @@ -1965,17 +1965,18 @@ static int init_vtd_hw(void)
>>      struct iommu_flush *flush =3D NULL;
>>      int ret;
>>      unsigned long flags;
>> -    struct irq_cfg *cfg;
>>
>>      /*
>>       * Basic VT-d HW init: set VT-d interrupt, clear VT-d faults.
>>       */
>>      for_each_drhd_unit ( drhd )
>>      {
>> +        struct irq_desc *desc;
>> +
>>          iommu =3D drhd->iommu;
>>
>> -        cfg =3D irq_cfg(iommu->irq);
>> -        dma_msi_set_affinity(irq_to_desc(iommu->irq), &cfg->cpu_mask);
>> +        desc =3D irq_to_desc(iommu->irq);
>> +        dma_msi_set_affinity(desc, desc->arch.cpu_mask);
>>
>>          clear_fault_bits(iommu);
>>
>> --- a/xen/include/asm-ia64/linux-xen/asm/irq.h
>> +++ b/xen/include/asm-ia64/linux-xen/asm/irq.h
>> @@ -18,8 +18,10 @@
>>  struct irq_cfg {
>>  #define arch_irq_desc irq_cfg
>>          int  vector;
>> -        cpumask_t cpu_mask;
>> +        cpumask_var_t cpu_mask;
>>  };
>> +
>> +int init_irq_data(void);
>>  #endif
>>
>>  static __inline__ int
>> --- a/xen/include/asm-x86/irq.h
>> +++ b/xen/include/asm-x86/irq.h
>> @@ -33,8 +33,9 @@ struct irq_cfg {
>>  #define arch_irq_desc irq_cfg
>>          s16 vector;                  /* vector itself is only 8 bits, =
*/
>>          s16 old_vector;              /* but we use -1 for unassigned  =
*/
>> -        cpumask_t cpu_mask;
>> -        cpumask_t old_cpu_mask;
>> +        cpumask_var_t cpu_mask;
>> +        cpumask_var_t old_cpu_mask;
>> +        cpumask_var_t pending_mask;
>>          unsigned move_cleanup_count;
>>          vmask_t *used_vectors;
>>          u8 move_in_progress : 1;
>> @@ -174,8 +175,6 @@ void __setup_vector_irq(int cpu);
>>  void move_native_irq(struct irq_desc *);
>>  void move_masked_irq(struct irq_desc *);
>>
>> -int __assign_irq_vector(int irq, struct irq_cfg *, const cpumask_t *);
>> -
>>  int bind_irq_vector(int irq, int vector, const cpumask_t *);
>>
>>  void irq_set_affinity(struct irq_desc *, const cpumask_t *mask);
>> --- a/xen/include/xen/irq.h
>> +++ b/xen/include/xen/irq.h
>> @@ -76,8 +76,7 @@ typedef struct irq_desc {
>>      int irq;
>>      spinlock_t lock;
>>      struct arch_irq_desc arch;
>> -    cpumask_t affinity;
>> -    cpumask_t pending_mask;  /* IRQ migration pending mask */
>> +    cpumask_var_t affinity;
>>
>>      /* irq ratelimit */
>>      s_time_t rl_quantum_start;
>> @@ -85,6 +84,11 @@ typedef struct irq_desc {
>>      struct list_head rl_link;
>>  } __cacheline_aligned irq_desc_t;
>>
>> +int init_one_irq_desc(struct irq_desc *);
>> +int arch_init_one_irq_desc(struct irq_desc *);
>> +
>> +#define irq_desc_initialized(desc) ((desc)->handler !=3D NULL)
>> +
>>  #if defined(__ia64__)
>>  extern irq_desc_t irq_desc[NR_VECTORS];
>>
>> @@ -153,7 +157,7 @@ extern irq_desc_t *pirq_spin_lock_irq_de
>>
>>  static inline void set_native_irq_info(unsigned int irq, const =
cpumask_t=20
> *mask)
>>  {
>> -    cpumask_copy(&irq_desc[irq].affinity, mask);
>> +    cpumask_copy(irq_to_desc(irq)->affinity, mask);
>>  }
>>
>>  unsigned int set_desc_affinity(struct irq_desc *, const cpumask_t *);
>>
>>




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 08:22:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 08:22:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLz86-00074r-Ho; Thu, 03 Nov 2011 08:22:58 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLz5L-0006e3-52
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 08:20:08 -0700
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-16.tower-21.messagelabs.com!1320333603!2798361!1
X-Originating-IP: [208.97.132.145]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7020 invoked from network); 3 Nov 2011 15:20:03 -0000
Received: from caiajhbdcbef.dreamhost.com (HELO homiemail-a12.g.dreamhost.com)
	(208.97.132.145) by server-16.tower-21.messagelabs.com with SMTP;
	3 Nov 2011 15:20:03 -0000
Received: from homiemail-a12.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a12.g.dreamhost.com (Postfix) with ESMTP id 6A58571408D;
	Thu,  3 Nov 2011 08:20:02 -0700 (PDT)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:reply-to
	:mime-version:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.org; b=p0mtYpJEU91Uwrj8dEuMAx2UiZ0THuXBoldsLIyeRAX1
	eGZPZJCupK/O0BhbMeueXmjT8DmSzfuWohKGX2NgbxQlBsHB/9qBgFax/WCu70zF
	4bpjWaIqWX6xuIO+TaIK/Ksmut2QrD8jPQ8qPoQLBQwO9q9ROVCfBvl88J1A/y8=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:reply-to:mime-version:content-type:content-transfer-encoding;
	s=lagarcavilla.org; bh=LzQ8RI8IaMMduoaFMPjXYAjtV6o=; b=D/rvMgid
	AmA8gpxweaOLm2ELUhzsfJjHKzBiIfrf2WRFfosZtdMwb4Y6B5St0SQ3zRp7ir4A
	OVlmB7v+OE5GdgEYhdzUgn9Ds4jSyplqVzBsAHUfcPwWzLmzNo37KZzCJx+Jl8KF
	8hJO/QEg9VrE9Mvn22qC/zfiZbKzalPZPz4=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a12.g.dreamhost.com (Postfix) with ESMTPA id 4A5F971408A; 
	Thu,  3 Nov 2011 08:20:01 -0700 (PDT)
Received: from 206.223.182.18 (proxying for 206.223.182.18)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP; Thu, 3 Nov 2011 08:20:02 -0700
Message-ID: <39c7343ac8a07aaedd853e842278c5de.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <20111103143805.GF66800@ocelot.phlegethon.org>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<d13f91c2fe18d58ad27f.1319690034@xdev.gridcentric.ca>
	<20111027150207.GO59656@ocelot.phlegethon.org>
	<2edecee6fa102acb9973b1ef1e71a65d.squirrel@webmail.lagarcavilla.org>
	<20111103143805.GF66800@ocelot.phlegethon.org>
Date: Thu, 3 Nov 2011 08:20:02 -0700
Subject: Re: [Xen-devel] [PATCH 9 of 9] Modify all call sites of queries into
	the p2m to use the new fine-grained locking
From: "Andres Lagar-Cavilla" <andres@lagarcavilla.org>
To: "Tim Deegan" <tim@xen.org>
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: andres@lagarcavilla.com, olaf@aepfle.de, xen-devel@lists.xensource.com,
	andres@gridcentric.ca, keir.xen@gmail.com,
	Andres Lagar-Cavilla <andres@lagarcavilla.org>, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: andres@lagarcavilla.org
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

get_gfn/put_gfn it is. I'll figure set_gfn/alternative on the way. Next
patch coming with that naming. It will make everyone cringe :)

Andres

> At 07:32 -0700 on 02 Nov (1320219175), andres@lagarcavilla.com wrote:
>> I don't know that a massive sed on all these names is a good idea. I
>> guess
>> forcing everyone to compile-fail will also make them realize they need
>> to
>> add a call to drop the p2m locks they got...
>>
>> Can you elaborate on the naming preferences here: would you prefer
>> gfn_to_mfn/put_gfn? get_p2m_gfn/put_p2m_gfn? get_gfn/put_gfn
>
> I think I'd prefer get_gfn/put_gfn.  And maybe set_gfn for writes too?
> But I'm willing to be persuaded otherwise if anyone feels strongly abou=
t
> it.
>
> Tim.
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 08:25:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 08:25:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLzAa-0007Tu-8Q; Thu, 03 Nov 2011 08:25:32 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLz9u-0007HI-SP
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 08:24:51 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1320333887!2126851!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27021 invoked from network); 3 Nov 2011 15:24:47 -0000
Received: from mail-bw0-f43.google.com (HELO mail-bw0-f43.google.com)
	(209.85.214.43)
	by server-11.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 15:24:47 -0000
Received: by bkbzt12 with SMTP id zt12so1827628bkb.30
	for <xen-devel@lists.xensource.com>;
	Thu, 03 Nov 2011 08:24:47 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=zUhnWW0uCv6dvsVavGbtwmm8GZY8iExLukGnznd6Mw8=;
	b=tf5i3tlRVPJh46yD4faK2V068PazXilOPHXSG/+Z5gtmNn+16YPah++UwCb/JD/E3I
	Hpr5miwoifzZIR4hjYdKN/eGR9tr30evtHcqHcHRHzLv+24fAdJ1HG/eZc3spn2iNdVr
	dlgyKhqq/F+IHn9mYi1Sx+doztj073UrQb5Pc=
Received: by 10.216.229.3 with SMTP id g3mr2977129weq.79.1320333887414;
	Thu, 03 Nov 2011 08:24:47 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-249-120.range86-129.btcentralplus.com.
	[86.129.249.120])
	by mx.google.com with ESMTPS id e40sm10790876wbp.3.2011.11.03.08.24.45
	(version=SSLv3 cipher=OTHER); Thu, 03 Nov 2011 08:24:46 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 03 Nov 2011 15:24:42 +0000
Subject: Re: [Xen-devel] [PATCH 0/2] IRQ adjustments
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CAD862BA.3391A%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH 0/2] IRQ adjustments
Thread-Index: AcyaPLV1TOJSq+h1Sku2GJT3F89RNA==
In-Reply-To: <4EB2B28E020000780005EBD9@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 03/11/2011 14:26, "Jan Beulich" <JBeulich@suse.com> wrote:

> Once again a pair of patches that are functionally independent, but only
> apply in the given order.
> 
> 1: IRQ: allocate CPU masks dynamically
> 2: x86/IRQ: consolidate IRQ disabling when acquiring vector lock
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 08:28:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 08:28:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLzDk-0007tj-I6; Thu, 03 Nov 2011 08:28:48 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLzCu-0007gJ-WA
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 08:27:57 -0700
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-13.tower-174.messagelabs.com!1320334073!184639!1
X-Originating-IP: [208.97.132.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12150 invoked from network); 3 Nov 2011 15:27:53 -0000
Received: from caiajhbdcbhh.dreamhost.com (HELO homiemail-a18.g.dreamhost.com)
	(208.97.132.177) by server-13.tower-174.messagelabs.com with SMTP;
	3 Nov 2011 15:27:53 -0000
Received: from homiemail-a18.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a18.g.dreamhost.com (Postfix) with ESMTP id 4AC45250080;
	Thu,  3 Nov 2011 07:49:22 -0700 (PDT)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:reply-to
	:mime-version:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.org; b=szIXXUIkAmsvtjUsaRP2GBswW/Yohx0OupUw309bjiZZ
	kcmx3QurtSuSTb7P9UytLAZATiadsvDDR6vBNJfrLHPuOEk1DYj0jKdXTbXOk8Yo
	hiM4yplDM1RV5ROBIEUytRlrFBAA4wZ5OK33GqGBU8vUVqJsxr37c/4oSxVM35o=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:reply-to:mime-version:content-type:content-transfer-encoding;
	s=lagarcavilla.org; bh=4cHwXlPQa7pdVMMGz/LjhJzHePc=; b=FmnYPYmd
	MIzhgnil983x1TO1yLL4pCtI8WoKkK3u/ojnDdY7k5FWEHs21+NtIlxBFRifXS0B
	q13YLky/m2gxkho4kwtLGPjCxhFInnwgzhEf09Z8DMkxNZqu2yVqETwz1/WZ6h+v
	7VDIjJpOK3gw9Cve5eIn1Sme6YaDCyIeIR4=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a18.g.dreamhost.com (Postfix) with ESMTPA id A1039250099; 
	Thu,  3 Nov 2011 07:47:05 -0700 (PDT)
Received: from 206.223.182.18 (proxying for 206.223.182.18)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP; Thu, 3 Nov 2011 08:14:31 -0700
Message-ID: <e621dcd7a58645193493db92f21e6dd7.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <CAFLBxZafobe6=-bRr=c2KrqnXjFuYREJXb38HC+Zf7x1N-tTRA@mail.gmail.com>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<471d4f2754d6516d5926.1319690033@xdev.gridcentric.ca>
	<CAFLBxZafobe6=-bRr=c2KrqnXjFuYREJXb38HC+Zf7x1N-tTRA@mail.gmail.com>
Date: Thu, 3 Nov 2011 08:14:31 -0700
Subject: Re: [Xen-devel] [PATCH 8 of 9] Modify all internal p2m functions to
	use the new fine-grained locking
From: "Andres Lagar-Cavilla" <andres@lagarcavilla.org>
To: "George Dunlap" <George.Dunlap@eu.citrix.com>
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com,
	Andres Lagar-Cavilla <andres@lagarcavilla.org>, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: andres@lagarcavilla.org
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

The unlocked's are a shorthand. I might consider removing them if they
cause to much confusion.

In the case you're worried about, below, note there is a regular
gfn_to_mfn_query (which therefore locks the p2m entry) before the
drop_p2m. The previous scan uses unlocked -- we can forego unlocked there=
,
and keep the p2m entry locked the whole way. But then we need to make sur=
e
we don't overflow recursive counters, since locks covers a 2MB range.

Andres

> On Thu, Oct 27, 2011 at 1:33 PM, Andres Lagar-Cavilla
> <andres@lagarcavilla.org> wrote:
>> =A0xen/arch/x86/mm/hap/hap.c =A0 =A0 =A0 =A0| =A0 =A02 +-
>> =A0xen/arch/x86/mm/hap/nested_hap.c | =A0 21 ++-
>> =A0xen/arch/x86/mm/p2m-ept.c =A0 =A0 =A0 =A0| =A0 26 +----
>> =A0xen/arch/x86/mm/p2m-pod.c =A0 =A0 =A0 =A0| =A0 42 +++++--
>> =A0xen/arch/x86/mm/p2m-pt.c =A0 =A0 =A0 =A0 | =A0 20 +---
>> =A0xen/arch/x86/mm/p2m.c =A0 =A0 =A0 =A0 =A0 =A0| =A0185
>> ++++++++++++++++++++++++--------------
>> =A0xen/include/asm-ia64/mm.h =A0 =A0 =A0 =A0| =A0 =A05 +
>> =A0xen/include/asm-x86/p2m.h =A0 =A0 =A0 =A0| =A0 45 +++++++++-
>> =A08 files changed, 217 insertions(+), 129 deletions(-)
>>
>>
>> This patch only modifies code internal to the p2m, adding convenience
>> macros, etc. It will yield a compiling code base but an incorrect
>> hypervisor (external callers of queries into the p2m will not unlock).
>> Next patch takes care of external callers, split done for the benefit
>> of conciseness.
>
> It's not obvious to me where in this patch to find a description of
> what the new locking regime is.  What does the _unlocked() mean?  When
> do I have to call that vs a different one, and when do I have to lock
> / unlock / whatever?
>
> I think that should ideally be both in the commit message (at least a
> summary), and also in a comment in a header somewhere.  Perhaps it is
> already in the patch somewhere, but a quick glance through didn't find
> it...
>
>>
>> Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
>>
>> diff -r 8a98179666de -r 471d4f2754d6 xen/arch/x86/mm/hap/hap.c
>> --- a/xen/arch/x86/mm/hap/hap.c
>> +++ b/xen/arch/x86/mm/hap/hap.c
>> @@ -861,7 +861,7 @@ hap_write_p2m_entry(struct vcpu *v, unsi
>> =A0 =A0 old_flags =3D l1e_get_flags(*p);
>>
>> =A0 =A0 if ( nestedhvm_enabled(d) && (old_flags & _PAGE_PRESENT)
>> - =A0 =A0 =A0 =A0 && !p2m_get_hostp2m(d)->defer_nested_flush ) {
>> + =A0 =A0 =A0 =A0 && !atomic_read(&(p2m_get_hostp2m(d)->defer_nested_f=
lush)) ) {
>> =A0 =A0 =A0 =A0 /* We are replacing a valid entry so we need to flush =
nested
>> p2ms,
>> =A0 =A0 =A0 =A0 =A0* unless the only chan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 08:29:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 08:29:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLzEZ-0008GW-Oz; Thu, 03 Nov 2011 08:29:39 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLzD0-0007go-Sp
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 08:28:04 -0700
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-9.tower-174.messagelabs.com!1320334079!186179!1
X-Originating-IP: [208.97.132.83]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22039 invoked from network); 3 Nov 2011 15:27:59 -0000
Received: from caiajhbdcaid.dreamhost.com (HELO homiemail-a18.g.dreamhost.com)
	(208.97.132.83) by server-9.tower-174.messagelabs.com with SMTP;
	3 Nov 2011 15:27:59 -0000
Received: from homiemail-a18.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a18.g.dreamhost.com (Postfix) with ESMTP id 189CF250091;
	Thu,  3 Nov 2011 07:49:28 -0700 (PDT)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:reply-to
	:mime-version:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.org; b=hrmDUvTMBZyR4QrYnOvxO03aViUPf69PjVdco0gsb7/n
	Mu4ZPxU2H/dcqjXZH9pIJWTVGgfVYulbv/eVz1rAT8zTsBjAPuDnyRX9CezsNS43
	SD+/Fn2qN1hLWLVyLqaJPa8GE0EfujLJlXaKoa71WEvvJRPUfHze3Oi9VAU6Fmo=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:reply-to:mime-version:content-type:content-transfer-encoding;
	s=lagarcavilla.org; bh=fTXSCA1GrpA6Ep9X4brlkK9b2UY=; b=lZK9EjZ5
	MmzedblodzV/r4Rr+Hf+nIPI4kV8sbltBfQSBOqt8vK5qPCs/n5kWzmP1UYHUqA6
	KGN36Okza0/Ok13seh581m7FVFe6kQg9nh/ExxdKgMGm5+nbeF+CUabRYIYqLDlC
	8AITbKqqOzYgIIt6OpGHocw+SFtTz8BjSco=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a18.g.dreamhost.com (Postfix) with ESMTPA id 2CC782500C0; 
	Thu,  3 Nov 2011 07:47:04 -0700 (PDT)
Received: from 206.223.182.18 (proxying for 206.223.182.18)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP; Thu, 3 Nov 2011 08:16:31 -0700
Message-ID: <ca9b85e1bccb99fbfd9ac895f6c6c66b.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <20111103143321.GE66800@ocelot.phlegethon.org>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<471d4f2754d6516d5926.1319690033@xdev.gridcentric.ca>
	<20111027145711.GN59656@ocelot.phlegethon.org>
	<6aba1d62ce4c04d03baacb87c5453273.squirrel@webmail.lagarcavilla.org>
	<20111103143321.GE66800@ocelot.phlegethon.org>
Date: Thu, 3 Nov 2011 08:16:31 -0700
Subject: Re: [Xen-devel] [PATCH 8 of 9] Modify all internal p2m functions to
	use the new fine-grained locking
From: "Andres Lagar-Cavilla" <andres@lagarcavilla.org>
To: "Tim Deegan" <tim@xen.org>
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: andres@lagarcavilla.com, olaf@aepfle.de, xen-devel@lists.xensource.com,
	andres@gridcentric.ca, keir.xen@gmail.com,
	Andres Lagar-Cavilla <andres@lagarcavilla.org>, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: andres@lagarcavilla.org
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hey,
> Hi,
>
> At 07:24 -0700 on 02 Nov (1320218674), andres@lagarcavilla.com wrote:
>> >> +/* No matter what value you get out of a query, the p2m has been
>> locked
>> >> for
>> >> + * that range. No matter what you do, you need to drop those locks=
.
>> >> + * You need to pass back the mfn obtained when locking, not the ne=
w
>> >> one,
>> >> + * as the refcount of the original mfn was bumped. */
>> >
>> > Surely the caller doesn't need to remember the old MFN for this?
>> After
>> > allm, the whole point of the lock was that nobody else could change
>> the
>> > p2m entry under our feet!
>> >
>> > In any case, I thing there needs to be a big block comment a bit
>> futher
>> > up that describes what all this locking and refcounting does, and wh=
y.
>>
>> Comment will be added. I was being doubly-paranoid. I can undo the
>> get_page/put_page of the old mfn. I'm not a 100% behind it.
>
> I meant to suggest that the p2m code should me able to do the
> get_page/put_page without the caller remembering the mfn, since by
> definition it should be able to look it up in the unlock, knowing no-on=
e
> else can have changed it.

Not necessarily. How about sharing? Or paging out? Tricky, tricky. I gues=
s
the easy fix is to tell drop_p2m to not put_page in those cases.

Andres

>
>> I don't think these names are the most terrible -- we've all seen far
>> worse :) I mean, the naming encodes the arguments, and I don't see an
>> intrinsic advantage to
>> gfn_to_mfn(d, g, t, p2m_guest, p2m_unlocked)
>> over
>> gfn_to_mfn_guest_unlocked(d,g,t)
>
> Yep, it's definitely not the worst. :)  It's really just a question of
> verbosity in the headers.
>
> Tim.
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 08:44:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 08:44:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLzSa-0000Re-9j; Thu, 03 Nov 2011 08:44:08 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLzRx-0000Et-9F
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 08:43:30 -0700
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1320334981!50878917!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30251 invoked from network); 3 Nov 2011 15:43:02 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 15:43:02 -0000
X-IronPort-AV: E=Sophos;i="4.69,450,1315195200"; d="scan'208";a="18797965"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	03 Nov 2011 11:43:24 -0400
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX01.citrite.net
	(10.13.107.65) with Microsoft SMTP Server id 8.3.137.0; Thu, 3 Nov 2011
	11:43:23 -0400
Message-ID: <4EB2B69A.5030007@citrix.com>
Date: Thu, 3 Nov 2011 15:43:22 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 1/2] IRQ: allocate CPU masks	 dynamically
References: <4EB2B2B5020000780005EBDD@nat28.tlf.novell.com>
	<4EB2A9F5.1060800@citrix.com>
	<4EB2BE9E020000780005EC7F@nat28.tlf.novell.com>
In-Reply-To: <4EB2BE9E020000780005EC7F@nat28.tlf.novell.com>
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, "Keir
	\(Xen.org\)" <keir@xen.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 03/11/11 15:17, Jan Beulich wrote:
>>>> On 03.11.11 at 15:49, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
>> On 03/11/11 14:26, Jan Beulich wrote:
>>> IRQ: allocate CPU masks dynamically
>>>
>>> This includes delaying the initialization of dynamically created IRQs
>>> until their actual first use and some further elimination of uses of
>>> struct irq_cfg.
>>>
>>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>> Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
>>
>> One query which may or may not affect the patch.  Would we get better
>> caching characteristics if all cpumasks were allocated in consecutive
>> memory, rather than having 3 individual allocs in arch_init_one_irq_desc ?
> That was what the first version of the patch did, rejected by Keir
> (and not liked too much by me either).
>
> Jan

My understanding of the objection was hiding the variables themselves as
an array in the code.

An alternative approach such as alloc'ing 3*sizeof(cpu mask) (cache
aligned) and assigning the relevant pointers to the current
cpumask_var_t's would be a suitable approach which causes the cpumasks
to be in contiguous memory, but not changing how they are referenced in
the code.

~Andrew

>>> --- a/xen/arch/ia64/linux-xen/irq_ia64.c
>>> +++ b/xen/arch/ia64/linux-xen/irq_ia64.c
>>> @@ -303,6 +303,9 @@ int __init request_irq_vector(unsigned i
>>>  void __init
>>>  init_IRQ (void)
>>>  {
>>> +#ifdef XEN
>>> +       BUG_ON(init_irq_data());
>>> +#endif
>>>         register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL);
>>>  #ifdef CONFIG_SMP
>>>         register_percpu_irq(IA64_IPI_VECTOR, &ipi_irqaction);
>>> --- a/xen/arch/ia64/xen/irq.c
>>> +++ b/xen/arch/ia64/xen/irq.c
>>> @@ -74,17 +74,30 @@ unsigned int __ia64_local_vector_to_irq
>>>  /*
>>>   * Controller mappings for all interrupt sources:
>>>   */
>>> -irq_desc_t irq_desc[NR_IRQS] = {
>>> -       [0 ... NR_IRQS-1] = {
>>> -               .status = IRQ_DISABLED,
>>> -               .handler = &no_irq_type,
>>> -               .lock = SPIN_LOCK_UNLOCKED
>>> -               .arch = {
>>> -                       .vector = -1,
>>> -                       .cpu_mask = CPU_MASK_ALL,
>>> -               }
>>> +irq_desc_t irq_desc[NR_IRQS];
>>> +
>>> +int __init arch_init_one_irq_desc(struct irq_desc *desc)
>>> +{
>>> +       if (!alloc_cpumask_var(&desc->arch.cpu_mask))
>>> +               return -ENOMEM;
>>> +
>>> +       desc->arch.vector = -1;
>>> +       cpumask_setall(desc->arch.cpu_mask);
>>> +
>>> +       return 0;
>>> +}
>>> +
>>> +int __init init_irq_data(void)
>>> +{
>>> +       unsigned int irq;
>>> +
>>> +       for (irq = 0; irq < NR_IRQS; irq++) {
>>> +               struct irq_desc *desc = irq_to_desc(irq);
>>> +
>>> +               desc->irq = irq;
>>> +               init_one_irq_desc(desc);
>>>         }
>>> -};
>>> +}
>>>
>>>  void __do_IRQ_guest(int irq);
>>>
>>> --- a/xen/arch/x86/i8259.c
>>> +++ b/xen/arch/x86/i8259.c
>>> @@ -398,7 +398,7 @@ void __init init_IRQ(void)
>>>
>>>          desc->handler = &i8259A_irq_type;
>>>          per_cpu(vector_irq, cpu)[FIRST_LEGACY_VECTOR + irq] = irq;
>>> -        cpumask_copy(&desc->arch.cpu_mask, cpumask_of(cpu));
>>> +        cpumask_copy(desc->arch.cpu_mask, cpumask_of(cpu));
>>>          desc->arch.vector = FIRST_LEGACY_VECTOR + irq;
>>>      }
>>>
>>> --- a/xen/arch/x86/io_apic.c
>>> +++ b/xen/arch/x86/io_apic.c
>>> @@ -648,20 +648,21 @@ static int pin_2_irq(int idx, int apic,
>>>  void /*__init*/ setup_ioapic_dest(void)
>>>  {
>>>      int pin, ioapic, irq, irq_entry;
>>> -    struct irq_cfg *cfg;
>>>
>>>      if (skip_ioapic_setup)
>>>          return;
>>>
>>>      for (ioapic = 0; ioapic < nr_ioapics; ioapic++) {
>>>          for (pin = 0; pin < nr_ioapic_entries[ioapic]; pin++) {
>>> +            struct irq_desc *desc;
>>> +
>>>              irq_entry = find_irq_entry(ioapic, pin, mp_INT);
>>>              if (irq_entry == -1)
>>>                  continue;
>>>              irq = pin_2_irq(irq_entry, ioapic, pin);
>>> -            cfg = irq_cfg(irq);
>>> -            BUG_ON(cpus_empty(cfg->cpu_mask));
>>> -            set_ioapic_affinity_irq(irq_to_desc(irq), &cfg->cpu_mask);
>>> +            desc = irq_to_desc(irq);
>>> +            BUG_ON(cpumask_empty(desc->arch.cpu_mask));
>>> +            set_ioapic_affinity_irq(desc, desc->arch.cpu_mask);
>>>          }
>>>
>>>      }
>>> @@ -956,12 +957,12 @@ static void __init setup_IO_APIC_irqs(vo
>>>      struct IO_APIC_route_entry entry;
>>>      int apic, pin, idx, irq, first_notcon = 1, vector;
>>>      unsigned long flags;
>>> -    struct irq_cfg *cfg;
>>>
>>>      apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
>>>
>>>      for (apic = 0; apic < nr_ioapics; apic++) {
>>>          for (pin = 0; pin < nr_ioapic_entries[apic]; pin++) {
>>> +            struct irq_desc *desc;
>>>
>>>              /*
>>>               * add it to the IO-APIC irq-routing table:
>>> @@ -1016,9 +1017,9 @@ static void __init setup_IO_APIC_irqs(vo
>>>                  if (!apic && platform_legacy_irq(irq))
>>>                      disable_8259A_irq(irq_to_desc(irq));
>>>              }
>>> -            cfg = irq_cfg(irq);
>>> +            desc = irq_to_desc(irq);
>>>              SET_DEST(entry.dest.dest32, entry.dest.logical.logical_dest,
>>> -                     cpu_mask_to_apicid(&cfg->cpu_mask));
>>> +                     cpu_mask_to_apicid(desc->arch.cpu_mask));
>>>              spin_lock_irqsave(&ioapic_lock, flags);
>>>              __ioapic_write_entry(apic, pin, 0, entry);
>>>              set_native_irq_info(irq, TARGET_CPUS);
>>> @@ -2372,7 +2373,7 @@ int ioapic_guest_write(unsigned long phy
>>>      rte.vector = cfg->vector;
>>>
>>>      SET_DEST(rte.dest.dest32, rte.dest.logical.logical_dest,
>>> -             cpu_mask_to_apicid(&cfg->cpu_mask));
>>> +             cpu_mask_to_apicid(desc->arch.cpu_mask));
>>>
>>>      io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&rte) + 0));
>>>      io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&rte) + 1));
>>> --- a/xen/arch/x86/irq.c
>>> +++ b/xen/arch/x86/irq.c
>>> @@ -25,6 +25,7 @@
>>>  #include <public/physdev.h>
>>>
>>>  static void parse_irq_vector_map_param(char *s);
>>> +static int __assign_irq_vector(int irq, struct irq_desc *, const cpumask_t
>> *);
>>>  /* opt_noirqbalance: If true, software IRQ balancing/affinity is disabled.
>> */
>>>  bool_t __read_mostly opt_noirqbalance = 0;
>>> @@ -110,7 +111,7 @@ static int __init __bind_irq_vector(int
>>>  {
>>>      cpumask_t online_mask;
>>>      int cpu;
>>> -    struct irq_cfg *cfg = irq_cfg(irq);
>>> +    struct irq_desc *desc = irq_to_desc(irq);
>>>
>>>      BUG_ON((unsigned)irq >= nr_irqs);
>>>      BUG_ON((unsigned)vector >= NR_VECTORS);
>>> @@ -118,21 +119,22 @@ static int __init __bind_irq_vector(int
>>>      cpumask_and(&online_mask, cpu_mask, &cpu_online_map);
>>>      if (cpumask_empty(&online_mask))
>>>          return -EINVAL;
>>> -    if ((cfg->vector == vector) && cpumask_equal(&cfg->cpu_mask, &online_mask))
>>> +    if ( (desc->arch.vector == vector) &&
>>> +         cpumask_equal(desc->arch.cpu_mask, &online_mask) )
>>>          return 0;
>>> -    if (cfg->vector != IRQ_VECTOR_UNASSIGNED)
>>> +    if ( desc->arch.vector != IRQ_VECTOR_UNASSIGNED )
>>>          return -EBUSY;
>>>      trace_irq_mask(TRC_HW_IRQ_BIND_VECTOR, irq, vector, &online_mask);
>>>      for_each_cpu_mask(cpu, online_mask)
>>>          per_cpu(vector_irq, cpu)[vector] = irq;
>>> -    cfg->vector = vector;
>>> -    cpumask_copy(&cfg->cpu_mask, &online_mask);
>>> -    if ( cfg->used_vectors )
>>> +    desc->arch.vector = vector;
>>> +    cpumask_copy(desc->arch.cpu_mask, &online_mask);
>>> +    if ( desc->arch.used_vectors )
>>>      {
>>> -        ASSERT(!test_bit(vector, cfg->used_vectors));
>>> -        set_bit(vector, cfg->used_vectors);
>>> +        ASSERT(!test_bit(vector, desc->arch.used_vectors));
>>> +        set_bit(vector, desc->arch.used_vectors);
>>>      }
>>> -    cfg->used = IRQ_USED;
>>> +    desc->arch.used = IRQ_USED;
>>>      if (IO_APIC_IRQ(irq))
>>>          irq_vector[irq] = vector;
>>>      return 0;
>>> @@ -166,14 +168,17 @@ int create_irq(void)
>>>  {
>>>      unsigned long flags;
>>>      int irq, ret;
>>> -    irq = -ENOSPC;
>>> +    struct irq_desc *desc;
>>>
>>>      spin_lock_irqsave(&vector_lock, flags);
>>>
>>>      irq = find_unassigned_irq();
>>>      if (irq < 0)
>>>           goto out;
>>> -    ret = __assign_irq_vector(irq, irq_cfg(irq), TARGET_CPUS);
>>> +    desc = irq_to_desc(irq);
>>> +    ret = init_one_irq_desc(desc);
>>> +    if (!ret)
>>> +        ret = __assign_irq_vector(irq, desc, TARGET_CPUS);
>>>      if (ret < 0)
>>>          irq = ret;
>>>  out:
>>> @@ -197,7 +202,7 @@ static void dynamic_irq_cleanup(unsigned
>>>      desc->msi_desc = NULL;
>>>      desc->handler = &no_irq_type;
>>>      desc->arch.used_vectors = NULL;
>>> -    cpumask_setall(&desc->affinity);
>>> +    cpumask_setall(desc->affinity);
>>>      spin_unlock_irqrestore(&desc->lock, flags);
>>>
>>>      /* Wait to make sure it's not being used on another CPU */
>>> @@ -211,38 +216,38 @@ static void __clear_irq_vector(int irq)
>>>  {
>>>      int cpu, vector, old_vector;
>>>      cpumask_t tmp_mask;
>>> -    struct irq_cfg *cfg = irq_cfg(irq);
>>> +    struct irq_desc *desc = irq_to_desc(irq);
>>>
>>> -    BUG_ON(!cfg->vector);
>>> +    BUG_ON(!desc->arch.vector);
>>>
>>> -    /* Always clear cfg->vector */
>>> -    vector = cfg->vector;
>>> -    cpumask_and(&tmp_mask, &cfg->cpu_mask, &cpu_online_map);
>>> +    /* Always clear desc->arch.vector */
>>> +    vector = desc->arch.vector;
>>> +    cpumask_and(&tmp_mask, desc->arch.cpu_mask, &cpu_online_map);
>>>
>>>      for_each_cpu_mask(cpu, tmp_mask) {
>>>          ASSERT( per_cpu(vector_irq, cpu)[vector] == irq );
>>>          per_cpu(vector_irq, cpu)[vector] = -1;
>>>      }
>>>
>>> -    cfg->vector = IRQ_VECTOR_UNASSIGNED;
>>> -    cpumask_clear(&cfg->cpu_mask);
>>> +    desc->arch.vector = IRQ_VECTOR_UNASSIGNED;
>>> +    cpumask_clear(desc->arch.cpu_mask);
>>>
>>> -    if ( cfg->used_vectors )
>>> +    if ( desc->arch.used_vectors )
>>>      {
>>> -        ASSERT(test_bit(vector, cfg->used_vectors));
>>> -        clear_bit(vector, cfg->used_vectors);
>>> +        ASSERT(test_bit(vector, desc->arch.used_vectors));
>>> +        clear_bit(vector, desc->arch.used_vectors);
>>>      }
>>>
>>> -    cfg->used = IRQ_UNUSED;
>>> +    desc->arch.used = IRQ_UNUSED;
>>>
>>>      trace_irq_mask(TRC_HW_IRQ_CLEAR_VECTOR, irq, vector, &tmp_mask);
>>>
>>> -    if (likely(!cfg->move_in_progress))
>>> +    if ( likely(!desc->arch.move_in_progress) )
>>>          return;
>>>
>>> -    /* If we were in motion, also clear cfg->old_vector */
>>> -    old_vector = cfg->old_vector;
>>> -    cpumask_and(&tmp_mask, &cfg->old_cpu_mask, &cpu_online_map);
>>> +    /* If we were in motion, also clear desc->arch.old_vector */
>>> +    old_vector = desc->arch.old_vector;
>>> +    cpumask_and(&tmp_mask, desc->arch.old_cpu_mask, &cpu_online_map);
>>>
>>>      for_each_cpu_mask(cpu, tmp_mask) {
>>>          ASSERT( per_cpu(vector_irq, cpu)[old_vector] == irq );
>>> @@ -250,16 +255,16 @@ static void __clear_irq_vector(int irq)
>>>          per_cpu(vector_irq, cpu)[old_vector] = -1;
>>>       }
>>>
>>> -    cfg->old_vector = IRQ_VECTOR_UNASSIGNED;
>>> -    cpumask_clear(&cfg->old_cpu_mask);
>>> +    desc->arch.old_vector = IRQ_VECTOR_UNASSIGNED;
>>> +    cpumask_clear(desc->arch.old_cpu_mask);
>>>
>>> -    if ( cfg->used_vectors )
>>> +    if ( desc->arch.used_vectors )
>>>      {
>>> -        ASSERT(test_bit(old_vector, cfg->used_vectors));
>>> -        clear_bit(old_vector, cfg->used_vectors);
>>> +        ASSERT(test_bit(old_vector, desc->arch.used_vectors));
>>> +        clear_bit(old_vector, desc->arch.used_vectors);
>>>      }
>>>
>>> -    cfg->move_in_progress = 0;
>>> +    desc->arch.move_in_progress = 0;
>>>  }
>>>
>>>  void clear_irq_vector(int irq)
>>> @@ -296,25 +301,28 @@ int irq_to_vector(int irq)
>>>      return vector;
>>>  }
>>>
>>> -static void __init init_one_irq_desc(struct irq_desc *desc)
>>> +int arch_init_one_irq_desc(struct irq_desc *desc)
>>>  {
>>> -    desc->status  = IRQ_DISABLED;
>>> -    desc->handler = &no_irq_type;
>>> -    desc->action  = NULL;
>>> -    desc->msi_desc = NULL;
>>> -    spin_lock_init(&desc->lock);
>>> -    cpumask_setall(&desc->affinity);
>>> -    INIT_LIST_HEAD(&desc->rl_link);
>>> -}
>>> +    if ( !zalloc_cpumask_var(&desc->arch.cpu_mask) )
>>> +        return -ENOMEM;
>>> +
>>> +    if ( !alloc_cpumask_var(&desc->arch.old_cpu_mask) )
>>> +    {
>>> +        free_cpumask_var(desc->arch.cpu_mask);
>>> +        return -ENOMEM;
>>> +    }
>>>
>>> -static void __init init_one_irq_cfg(struct irq_cfg *cfg)
>>> -{
>>> -    cfg->vector = IRQ_VECTOR_UNASSIGNED;
>>> -    cfg->old_vector = IRQ_VECTOR_UNASSIGNED;
>>> -    cpumask_clear(&cfg->cpu_mask);
>>> -    cpumask_clear(&cfg->old_cpu_mask);
>>> -    cfg->used_vectors = NULL;
>>> -    cfg->used = IRQ_UNUSED;
>>> +    if ( !alloc_cpumask_var(&desc->arch.pending_mask) )
>>> +    {
>>> +        free_cpumask_var(desc->arch.old_cpu_mask);
>>> +        free_cpumask_var(desc->arch.cpu_mask);
>>> +        return -ENOMEM;
>>> +    }
>>> +
>>> +    desc->arch.vector = IRQ_VECTOR_UNASSIGNED;
>>> +    desc->arch.old_vector = IRQ_VECTOR_UNASSIGNED;
>>> +
>>> +    return 0;
>>>  }
>>>
>>>  int __init init_irq_data(void)
>>> @@ -331,12 +339,13 @@ int __init init_irq_data(void)
>>>      if ( !irq_desc || !irq_vector )
>>>          return -ENOMEM;
>>>
>>> -    for (irq = 0; irq < nr_irqs; irq++) {
>>> +    for (irq = 0; irq < nr_irqs_gsi; irq++) {
>>>          desc = irq_to_desc(irq);
>>>          desc->irq = irq;
>>>          init_one_irq_desc(desc);
>>> -        init_one_irq_cfg(&desc->arch);
>>>      }
>>> +    for (; irq < nr_irqs; irq++)
>>> +        irq_to_desc(irq)->irq = irq;
>>>
>>>      /* Never allocate the hypercall vector or Linux/BSD fast-trap vector. */
>>>      set_bit(LEGACY_SYSCALL_VECTOR, used_vectors);
>>> @@ -403,7 +412,8 @@ static vmask_t *irq_get_used_vector_mask
>>>      return ret;
>>>  }
>>>
>>> -int __assign_irq_vector(int irq, struct irq_cfg *cfg, const cpumask_t *mask)
>>> +static int __assign_irq_vector(
>>> +    int irq, struct irq_desc *desc, const cpumask_t *mask)
>>>  {
>>>      /*
>>>       * NOTE! The local APIC isn't very good at handling
>>> @@ -426,13 +436,13 @@ int __assign_irq_vector(int irq, struct
>>>      old_vector = irq_to_vector(irq);
>>>      if (old_vector) {
>>>          cpumask_and(&tmp_mask, mask, &cpu_online_map);
>>> -        if (cpumask_intersects(&tmp_mask, &cfg->cpu_mask)) {
>>> -            cfg->vector = old_vector;
>>> +        if (cpumask_intersects(&tmp_mask, desc->arch.cpu_mask)) {
>>> +            desc->arch.vector = old_vector;
>>>              return 0;
>>>          }
>>>      }
>>>
>>> -    if ((cfg->move_in_progress) || cfg->move_cleanup_count)
>>> +    if ( desc->arch.move_in_progress || desc->arch.move_cleanup_count )
>>>          return -EAGAIN;
>>>
>>>      err = -ENOSPC;
>>> @@ -440,9 +450,9 @@ int __assign_irq_vector(int irq, struct
>>>      /* This is the only place normal IRQs are ever marked
>>>       * as "in use".  If they're not in use yet, check to see
>>>       * if we need to assign a global vector mask. */
>>> -    if ( cfg->used == IRQ_USED )
>>> +    if ( desc->arch.used == IRQ_USED )
>>>      {
>>> -        irq_used_vectors = cfg->used_vectors;
>>> +        irq_used_vectors = desc->arch.used_vectors;
>>>      }
>>>      else
>>>          irq_used_vectors = irq_get_used_vector_mask(irq);
>>> @@ -485,29 +495,29 @@ next:
>>>          current_offset = offset;
>>>          local_irq_save(flags);
>>>          if (old_vector) {
>>> -            cfg->move_in_progress = 1;
>>> -            cpumask_copy(&cfg->old_cpu_mask, &cfg->cpu_mask);
>>> -            cfg->old_vector = cfg->vector;
>>> +            desc->arch.move_in_progress = 1;
>>> +            cpumask_copy(desc->arch.old_cpu_mask, desc->arch.cpu_mask);
>>> +            desc->arch.old_vector = desc->arch.vector;
>>>          }
>>>          trace_irq_mask(TRC_HW_IRQ_ASSIGN_VECTOR, irq, vector, &tmp_mask);
>>>          for_each_cpu_mask(new_cpu, tmp_mask)
>>>              per_cpu(vector_irq, new_cpu)[vector] = irq;
>>> -        cfg->vector = vector;
>>> -        cpumask_copy(&cfg->cpu_mask, &tmp_mask);
>>> +        desc->arch.vector = vector;
>>> +        cpumask_copy(desc->arch.cpu_mask, &tmp_mask);
>>>
>>> -        cfg->used = IRQ_USED;
>>> -        ASSERT((cfg->used_vectors == NULL)
>>> -               || (cfg->used_vectors == irq_used_vectors));
>>> -        cfg->used_vectors = irq_used_vectors;
>>> +        desc->arch.used = IRQ_USED;
>>> +        ASSERT((desc->arch.used_vectors == NULL)
>>> +               || (desc->arch.used_vectors == irq_used_vectors));
>>> +        desc->arch.used_vectors = irq_used_vectors;
>>>
>>>          if (IO_APIC_IRQ(irq))
>>>              irq_vector[irq] = vector;
>>>
>>> -        if ( cfg->used_vectors )
>>> +        if ( desc->arch.used_vectors )
>>>          {
>>> -            ASSERT(!test_bit(vector, cfg->used_vectors));
>>> +            ASSERT(!test_bit(vector, desc->arch.used_vectors));
>>>
>>> -            set_bit(vector, cfg->used_vectors);
>>> +            set_bit(vector, desc->arch.used_vectors);
>>>          }
>>>
>>>          err = 0;
>>> @@ -521,16 +531,15 @@ int assign_irq_vector(int irq)
>>>  {
>>>      int ret;
>>>      unsigned long flags;
>>> -    struct irq_cfg *cfg = irq_cfg(irq);
>>>      struct irq_desc *desc = irq_to_desc(irq);
>>>
>>>      BUG_ON(irq >= nr_irqs || irq <0);
>>>
>>>      spin_lock_irqsave(&vector_lock, flags);
>>> -    ret = __assign_irq_vector(irq, cfg, TARGET_CPUS);
>>> +    ret = __assign_irq_vector(irq, desc, TARGET_CPUS);
>>>      if (!ret) {
>>> -        ret = cfg->vector;
>>> -        cpumask_copy(&desc->affinity, &cfg->cpu_mask);
>>> +        ret = desc->arch.vector;
>>> +        cpumask_copy(desc->affinity, desc->arch.cpu_mask);
>>>      }
>>>      spin_unlock_irqrestore(&vector_lock, flags);
>>>      return ret;
>>> @@ -543,15 +552,16 @@ int assign_irq_vector(int irq)
>>>  void __setup_vector_irq(int cpu)
>>>  {
>>>      int irq, vector;
>>> -    struct irq_cfg *cfg;
>>>
>>>      /* Clear vector_irq */
>>>      for (vector = 0; vector < NR_VECTORS; ++vector)
>>>          per_cpu(vector_irq, cpu)[vector] = -1;
>>>      /* Mark the inuse vectors */
>>>      for (irq = 0; irq < nr_irqs; ++irq) {
>>> -        cfg = irq_cfg(irq);
>>> -        if (!cpu_isset(cpu, cfg->cpu_mask))
>>> +        struct irq_desc *desc = irq_to_desc(irq);
>>> +
>>> +        if (!irq_desc_initialized(desc) ||
>>> +            !cpumask_test_cpu(cpu, desc->arch.cpu_mask))
>>>              continue;
>>>          vector = irq_to_vector(irq);
>>>          per_cpu(vector_irq, cpu)[vector] = irq;
>>> @@ -560,12 +570,14 @@ void __setup_vector_irq(int cpu)
>>>
>>>  void move_masked_irq(struct irq_desc *desc)
>>>  {
>>> +    cpumask_t *pending_mask = desc->arch.pending_mask;
>>> +
>>>      if (likely(!(desc->status & IRQ_MOVE_PENDING)))
>>>          return;
>>>
>>>      desc->status &= ~IRQ_MOVE_PENDING;
>>>
>>> -    if (unlikely(cpus_empty(desc->pending_mask)))
>>> +    if (unlikely(cpumask_empty(pending_mask)))
>>>          return;
>>>
>>>      if (!desc->handler->set_affinity)
>>> @@ -580,10 +592,10 @@ void move_masked_irq(struct irq_desc *de
>>>       *
>>>       * For correct operation this depends on the caller masking the irqs.
>>>       */
>>> -    if (likely(cpus_intersects(desc->pending_mask, cpu_online_map)))
>>> -        desc->handler->set_affinity(desc, &desc->pending_mask);
>>> +    if ( likely(cpumask_intersects(pending_mask, &cpu_online_map)) )
>>> +        desc->handler->set_affinity(desc, pending_mask);
>>>
>>> -    cpumask_clear(&desc->pending_mask);
>>> +    cpumask_clear(pending_mask);
>>>  }
>>>
>>>  void move_native_irq(struct irq_desc *desc)
>>> @@ -626,7 +638,8 @@ fastcall void smp_irq_move_cleanup_inter
>>>          if (!desc->arch.move_cleanup_count)
>>>              goto unlock;
>>>
>>> -        if (vector == desc->arch.vector && cpumask_test_cpu(me,
>> &desc->arch.cpu_mask))
>>> +        if ( vector == desc->arch.vector &&
>>> +             cpumask_test_cpu(me, desc->arch.cpu_mask) )
>>>              goto unlock;
>>>
>>>          irr = apic_read(APIC_IRR + (vector / 32 * 0x10));
>>> @@ -653,7 +666,7 @@ fastcall void smp_irq_move_cleanup_inter
>>>          if ( desc->arch.move_cleanup_count == 0 )
>>>          {
>>>              desc->arch.old_vector = IRQ_VECTOR_UNASSIGNED;
>>> -            cpumask_clear(&desc->arch.old_cpu_mask);
>>> +            cpumask_clear(desc->arch.old_cpu_mask);
>>>
>>>              if ( desc->arch.used_vectors )
>>>              {
>>> @@ -673,7 +686,7 @@ static void send_cleanup_vector(struct i
>>>  {
>>>      cpumask_t cleanup_mask;
>>>
>>> -    cpumask_and(&cleanup_mask, &desc->arch.old_cpu_mask, &cpu_online_map);
>>> +    cpumask_and(&cleanup_mask, desc->arch.old_cpu_mask, &cpu_online_map);
>>>      desc->arch.move_cleanup_count = cpumask_weight(&cleanup_mask);
>>>      genapic->send_IPI_mask(&cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR);
>>>
>>> @@ -690,7 +703,8 @@ void irq_complete_move(struct irq_desc *
>>>      vector = get_irq_regs()->entry_vector;
>>>      me = smp_processor_id();
>>>
>>> -    if (vector == desc->arch.vector && cpumask_test_cpu(me, &desc->arch.cpu_mask))
>>> +    if ( vector == desc->arch.vector &&
>>> +         cpumask_test_cpu(me, desc->arch.cpu_mask) )
>>>          send_cleanup_vector(desc);
>>>  }
>>>
>>> @@ -708,15 +722,15 @@ unsigned int set_desc_affinity(struct ir
>>>
>>>      local_irq_save(flags);
>>>      lock_vector_lock();
>>> -    ret = __assign_irq_vector(irq, &desc->arch, mask);
>>> +    ret = __assign_irq_vector(irq, desc, mask);
>>>      unlock_vector_lock();
>>>      local_irq_restore(flags);
>>>
>>>      if (ret < 0)
>>>          return BAD_APICID;
>>>
>>> -    cpumask_copy(&desc->affinity, mask);
>>> -    cpumask_and(&dest_mask, mask, &desc->arch.cpu_mask);
>>> +    cpumask_copy(desc->affinity, mask);
>>> +    cpumask_and(&dest_mask, mask, desc->arch.cpu_mask);
>>>
>>>      return cpu_mask_to_apicid(&dest_mask);
>>>  }
>>> @@ -730,7 +744,7 @@ void irq_set_affinity(struct irq_desc *d
>>>      ASSERT(spin_is_locked(&desc->lock));
>>>      desc->status &= ~IRQ_MOVE_PENDING;
>>>      wmb();
>>> -    cpumask_copy(&desc->pending_mask, mask);
>>> +    cpumask_copy(desc->arch.pending_mask, mask);
>>>      wmb();
>>>      desc->status |= IRQ_MOVE_PENDING;
>>>  }
>>> @@ -1992,13 +2006,13 @@ static void dump_irqs(unsigned char key)
>>>
>>>          desc = irq_to_desc(irq);
>>>
>>> -        if ( !desc->handler || desc->handler == &no_irq_type )
>>> +        if ( !irq_desc_initialized(desc) || desc->handler == &no_irq_type )
>>>              continue;
>>>
>>>          spin_lock_irqsave(&desc->lock, flags);
>>>
>>>          cpumask_scnprintf(keyhandler_scratch, sizeof(keyhandler_scratch),
>>> -                          &desc->affinity);
>>> +                          desc->affinity);
>>>          printk("   IRQ:%4d affinity:%s vec:%02x type=%-15s"
>>>                 " status=%08x ",
>>>                 irq, keyhandler_scratch, desc->arch.vector,
>>> @@ -2073,10 +2087,12 @@ void fixup_irqs(void)
>>>              continue;
>>>
>>>          desc = irq_to_desc(irq);
>>> +        if ( !irq_desc_initialized(desc) )
>>> +            continue;
>>>
>>>          spin_lock(&desc->lock);
>>>
>>> -        cpumask_copy(&affinity, &desc->affinity);
>>> +        cpumask_copy(&affinity, desc->affinity);
>>>          if ( !desc->action || cpumask_subset(&affinity, &cpu_online_map) )
>>>          {
>>>              spin_unlock(&desc->lock);
>>> --- a/xen/arch/x86/msi.c
>>> +++ b/xen/arch/x86/msi.c
>>> @@ -125,13 +125,13 @@ void msi_compose_msg(struct irq_desc *de
>>>      unsigned dest;
>>>      int vector = desc->arch.vector;
>>>
>>> -    if ( cpumask_empty(&desc->arch.cpu_mask) ) {
>>> +    if ( cpumask_empty(desc->arch.cpu_mask) ) {
>>>          dprintk(XENLOG_ERR,"%s, compose msi message error!!\n", __func__);
>>>          return;
>>>      }
>>>
>>>      if ( vector ) {
>>> -        dest = cpu_mask_to_apicid(&desc->arch.cpu_mask);
>>> +        dest = cpu_mask_to_apicid(desc->arch.cpu_mask);
>>>
>>>          msg->address_hi = MSI_ADDR_BASE_HI;
>>>          msg->address_lo =
>>> --- a/xen/arch/x86/smpboot.c
>>> +++ b/xen/arch/x86/smpboot.c
>>> @@ -1011,7 +1011,7 @@ void __init smp_intr_init(void)
>>>          irq_vector[irq] = FIRST_HIPRIORITY_VECTOR + seridx + 1;
>>>          per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_VECTOR + seridx + 1] =
>> irq;
>>>          irq_to_desc(irq)->arch.vector = FIRST_HIPRIORITY_VECTOR + seridx + 1;
>>> -        cpumask_copy(&irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map);
>>> +        cpumask_copy(irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map);
>>>      }
>>>
>>>      /* IPI for cleanuping vectors after irq move */
>>> --- a/xen/common/Makefile
>>> +++ b/xen/common/Makefile
>>> @@ -5,6 +5,7 @@ obj-y += domctl.o
>>>  obj-y += domain.o
>>>  obj-y += event_channel.o
>>>  obj-y += grant_table.o
>>> +obj-y += irq.o
>>>  obj-y += kernel.o
>>>  obj-y += keyhandler.o
>>>  obj-y += kexec.o
>>> --- /dev/null
>>> +++ a/xen/common/irq.c
>>> @@ -0,0 +1,28 @@
>>> +#include <xen/config.h>
>>> +#include <xen/irq.h>
>>> +
>>> +int init_one_irq_desc(struct irq_desc *desc)
>>> +{
>>> +    int err;
>>> +
>>> +    if (irq_desc_initialized(desc))
>>> +        return 0;
>>> +
>>> +    if ( !alloc_cpumask_var(&desc->affinity) )
>>> +        return -ENOMEM;
>>> +
>>> +    desc->status = IRQ_DISABLED;
>>> +    desc->handler = &no_irq_type;
>>> +    spin_lock_init(&desc->lock);
>>> +    cpumask_setall(desc->affinity);
>>> +    INIT_LIST_HEAD(&desc->rl_link);
>>> +
>>> +    err = arch_init_one_irq_desc(desc);
>>> +    if ( err )
>>> +    {
>>> +        free_cpumask_var(desc->affinity);
>>> +        desc->handler = NULL;
>>> +    }
>>> +
>>> +    return err;
>>> +}
>>> --- a/xen/drivers/passthrough/vtd/iommu.c
>>> +++ b/xen/drivers/passthrough/vtd/iommu.c
>>> @@ -1965,17 +1965,18 @@ static int init_vtd_hw(void)
>>>      struct iommu_flush *flush = NULL;
>>>      int ret;
>>>      unsigned long flags;
>>> -    struct irq_cfg *cfg;
>>>
>>>      /*
>>>       * Basic VT-d HW init: set VT-d interrupt, clear VT-d faults.
>>>       */
>>>      for_each_drhd_unit ( drhd )
>>>      {
>>> +        struct irq_desc *desc;
>>> +
>>>          iommu = drhd->iommu;
>>>
>>> -        cfg = irq_cfg(iommu->irq);
>>> -        dma_msi_set_affinity(irq_to_desc(iommu->irq), &cfg->cpu_mask);
>>> +        desc = irq_to_desc(iommu->irq);
>>> +        dma_msi_set_affinity(desc, desc->arch.cpu_mask);
>>>
>>>          clear_fault_bits(iommu);
>>>
>>> --- a/xen/include/asm-ia64/linux-xen/asm/irq.h
>>> +++ b/xen/include/asm-ia64/linux-xen/asm/irq.h
>>> @@ -18,8 +18,10 @@
>>>  struct irq_cfg {
>>>  #define arch_irq_desc irq_cfg
>>>          int  vector;
>>> -        cpumask_t cpu_mask;
>>> +        cpumask_var_t cpu_mask;
>>>  };
>>> +
>>> +int init_irq_data(void);
>>>  #endif
>>>
>>>  static __inline__ int
>>> --- a/xen/include/asm-x86/irq.h
>>> +++ b/xen/include/asm-x86/irq.h
>>> @@ -33,8 +33,9 @@ struct irq_cfg {
>>>  #define arch_irq_desc irq_cfg
>>>          s16 vector;                  /* vector itself is only 8 bits, */
>>>          s16 old_vector;              /* but we use -1 for unassigned  */
>>> -        cpumask_t cpu_mask;
>>> -        cpumask_t old_cpu_mask;
>>> +        cpumask_var_t cpu_mask;
>>> +        cpumask_var_t old_cpu_mask;
>>> +        cpumask_var_t pending_mask;
>>>          unsigned move_cleanup_count;
>>>          vmask_t *used_vectors;
>>>          u8 move_in_progress : 1;
>>> @@ -174,8 +175,6 @@ void __setup_vector_irq(int cpu);
>>>  void move_native_irq(struct irq_desc *);
>>>  void move_masked_irq(struct irq_desc *);
>>>
>>> -int __assign_irq_vector(int irq, struct irq_cfg *, const cpumask_t *);
>>> -
>>>  int bind_irq_vector(int irq, int vector, const cpumask_t *);
>>>
>>>  void irq_set_affinity(struct irq_desc *, const cpumask_t *mask);
>>> --- a/xen/include/xen/irq.h
>>> +++ b/xen/include/xen/irq.h
>>> @@ -76,8 +76,7 @@ typedef struct irq_desc {
>>>      int irq;
>>>      spinlock_t lock;
>>>      struct arch_irq_desc arch;
>>> -    cpumask_t affinity;
>>> -    cpumask_t pending_mask;  /* IRQ migration pending mask */
>>> +    cpumask_var_t affinity;
>>>
>>>      /* irq ratelimit */
>>>      s_time_t rl_quantum_start;
>>> @@ -85,6 +84,11 @@ typedef struct irq_desc {
>>>      struct list_head rl_link;
>>>  } __cacheline_aligned irq_desc_t;
>>>
>>> +int init_one_irq_desc(struct irq_desc *);
>>> +int arch_init_one_irq_desc(struct irq_desc *);
>>> +
>>> +#define irq_desc_initialized(desc) ((desc)->handler != NULL)
>>> +
>>>  #if defined(__ia64__)
>>>  extern irq_desc_t irq_desc[NR_VECTORS];
>>>
>>> @@ -153,7 +157,7 @@ extern irq_desc_t *pirq_spin_lock_irq_de
>>>
>>>  static inline void set_native_irq_info(unsigned int irq, const cpumask_t
>> *mask)
>>>  {
>>> -    cpumask_copy(&irq_desc[irq].affinity, mask);
>>> +    cpumask_copy(irq_to_desc(irq)->affinity, mask);
>>>  }
>>>
>>>  unsigned int set_desc_affinity(struct irq_desc *, const cpumask_t *);
>>>
>>>
>
>

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 08:50:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 08:50:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLzYO-0000zz-E6; Thu, 03 Nov 2011 08:50:08 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLzXe-0000nS-Dm
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 08:49:22 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1320335359!2838608!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19216 invoked from network); 3 Nov 2011 15:49:19 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-7.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 15:49:19 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 03 Nov 2011 15:49:18 +0000
Message-Id: <4EB2C60B020000780005ECCF@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 03 Nov 2011 15:49:15 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__PartC8E739EB.1__="
Cc: mark.langsdorf@amd.com
Subject: [Xen-devel] [PATCH v2] powernow: don't read never initialoized
	structure member
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__PartC8E739EB.1__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

c/s 20361:51b031b0737e removed the writing of struct
processor_performance's shared_cpu_map member, but the powernow driver
still has code to read it (though presumably that code path can't be
taken on actual hardware supported by the powernow driver except when
the number of CPUs to be coordinated is one). Remove the use of the
field along with the field itself.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/acpi/cpufreq/powernow.c
+++ b/xen/arch/x86/acpi/cpufreq/powernow.c
@@ -200,15 +200,17 @@ static int powernow_cpufreq_cpu_init(str
     perf =3D data->acpi_data;
     policy->shared_type =3D perf->shared_type;
=20
-    /*
-     * Will let policy->cpus know about dependency only when software
-     * coordination is required.
-     */
     if (policy->shared_type =3D=3D CPUFREQ_SHARED_TYPE_ALL ||
         policy->shared_type =3D=3D CPUFREQ_SHARED_TYPE_ANY) {
-        policy->cpus =3D perf->shared_cpu_map;
+        cpumask_set_cpu(cpu, &policy->cpus);
+        if (cpumask_weight(&policy->cpus) !=3D 1) {
+            printk(XENLOG_WARNING "Unsupported sharing type %d (%u =
CPUs)\n",
+                   policy->shared_type, cpumask_weight(&policy->cpus));
+            result =3D -ENODEV;
+            goto err_unreg;
+        }
     } else {
-        policy->cpus =3D cpumask_of_cpu(cpu);   =20
+        cpumask_copy(&policy->cpus, cpumask_of(cpu));
     }
=20
     /* capability check */
--- a/xen/include/acpi/cpufreq/processor_perf.h
+++ b/xen/include/acpi/cpufreq/processor_perf.h
@@ -29,7 +29,6 @@ struct processor_performance {
     uint32_t state_count;
     struct xen_processor_px *states;
     struct xen_psd_package domain_info;
-    cpumask_t shared_cpu_map;
     uint32_t shared_type;
=20
     uint32_t init;




--=__PartC8E739EB.1__=
Content-Type: text/plain; name="powernow-no-sharing.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="powernow-no-sharing.patch"

c/s 20361:51b031b0737e removed the writing of struct=0Aprocessor_performanc=
e's shared_cpu_map member, but the powernow driver=0Astill has code to =
read it (though presumably that code path can't be=0Ataken on actual =
hardware supported by the powernow driver except when=0Athe number of CPUs =
to be coordinated is one). Remove the use of the=0Afield along with the =
field itself.=0A=0ASigned-off-by: Jan Beulich <jbeulich@suse.com>=0A=0A--- =
a/xen/arch/x86/acpi/cpufreq/powernow.c=0A+++ b/xen/arch/x86/acpi/cpufreq/po=
wernow.c=0A@@ -200,15 +200,17 @@ static int powernow_cpufreq_cpu_init(str=
=0A     perf =3D data->acpi_data;=0A     policy->shared_type =3D perf->shar=
ed_type;=0A =0A-    /*=0A-     * Will let policy->cpus know about =
dependency only when software=0A-     * coordination is required.=0A-     =
*/=0A     if (policy->shared_type =3D=3D CPUFREQ_SHARED_TYPE_ALL ||=0A     =
    policy->shared_type =3D=3D CPUFREQ_SHARED_TYPE_ANY) {=0A-        =
policy->cpus =3D perf->shared_cpu_map;=0A+        cpumask_set_cpu(cpu, =
&policy->cpus);=0A+        if (cpumask_weight(&policy->cpus) !=3D 1) {=0A+ =
           printk(XENLOG_WARNING "Unsupported sharing type %d (%u =
CPUs)\n",=0A+                   policy->shared_type, cpumask_weight(&policy=
->cpus));=0A+            result =3D -ENODEV;=0A+            goto err_unreg;=
=0A+        }=0A     } else {=0A-        policy->cpus =3D cpumask_of_cpu(cp=
u);    =0A+        cpumask_copy(&policy->cpus, cpumask_of(cpu));=0A     =
}=0A =0A     /* capability check */=0A--- a/xen/include/acpi/cpufreq/proces=
sor_perf.h=0A+++ b/xen/include/acpi/cpufreq/processor_perf.h=0A@@ -29,7 =
+29,6 @@ struct processor_performance {=0A     uint32_t state_count;=0A    =
 struct xen_processor_px *states;=0A     struct xen_psd_package domain_info=
;=0A-    cpumask_t shared_cpu_map;=0A     uint32_t shared_type;=0A =0A     =
uint32_t init;=0A
--=__PartC8E739EB.1__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__PartC8E739EB.1__=--


From xen-devel-bounces@lists.xensource.com Thu Nov 03 08:51:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 08:51:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLza6-0001Mu-Ji; Thu, 03 Nov 2011 08:51:54 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLzZe-0001BL-5P
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 08:51:26 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1320335483!2837249!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10175 invoked from network); 3 Nov 2011 15:51:23 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-6.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 15:51:23 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 03 Nov 2011 15:51:22 +0000
Message-Id: <4EB2C688020000780005ECDF@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 03 Nov 2011 15:51:20 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Andrew Cooper" <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] [PATCH 1/2] IRQ: allocate CPU masks
	 dynamically
References: <4EB2B2B5020000780005EBDD@nat28.tlf.novell.com>
	<4EB2A9F5.1060800@citrix.com>
	<4EB2BE9E020000780005EC7F@nat28.tlf.novell.com>
	<4EB2B69A.5030007@citrix.com>
In-Reply-To: <4EB2B69A.5030007@citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Keir\(Xen.org\)" <keir@xen.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 03.11.11 at 16:43, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
> On 03/11/11 15:17, Jan Beulich wrote:
>>>>> On 03.11.11 at 15:49, Andrew Cooper <andrew.cooper3@citrix.com> =
wrote:
>>> On 03/11/11 14:26, Jan Beulich wrote:
>>>> IRQ: allocate CPU masks dynamically
>>>>
>>>> This includes delaying the initialization of dynamically created IRQs
>>>> until their actual first use and some further elimination of uses of
>>>> struct irq_cfg.
>>>>
>>>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>>> Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
>>>
>>> One query which may or may not affect the patch.  Would we get better
>>> caching characteristics if all cpumasks were allocated in consecutive
>>> memory, rather than having 3 individual allocs in arch_init_one_irq_des=
c ?
>> That was what the first version of the patch did, rejected by Keir
>> (and not liked too much by me either).
>>
>> Jan
>=20
> My understanding of the objection was hiding the variables themselves as
> an array in the code.
>=20
> An alternative approach such as alloc'ing 3*sizeof(cpu mask) (cache
> aligned) and assigning the relevant pointers to the current
> cpumask_var_t's would be a suitable approach which causes the cpumasks
> to be in contiguous memory, but not changing how they are referenced in
> the code.

That would mean just open-coding what the former patch did by
abstraction. In my opinion that is even worse - either we want a
generally usable mechanism to do this, or we don't do it at all.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 08:53:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 08:53:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLzbm-0001lx-Hh; Thu, 03 Nov 2011 08:53:38 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLzbE-0001ZR-MW
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 08:53:04 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1320335580!3531007!1
X-Originating-IP: [65.55.88.13]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12271 invoked from network); 3 Nov 2011 15:53:01 -0000
Received: from tx2ehsobe003.messaging.microsoft.com (HELO
	TX2EHSOBE006.bigfish.com) (65.55.88.13)
	by server-2.tower-216.messagelabs.com with AES128-SHA encrypted SMTP;
	3 Nov 2011 15:53:01 -0000
Received: from mail34-tx2-R.bigfish.com (10.9.14.246) by
	TX2EHSOBE006.bigfish.com (10.9.40.26) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 15:52:43 +0000
Received: from mail34-tx2 (localhost.localdomain [127.0.0.1])	by
	mail34-tx2-R.bigfish.com (Postfix) with ESMTP id 25A3915D82EA;
	Thu,  3 Nov 2011 15:52:52 +0000 (UTC)
X-SpamScore: -3
X-BigFish: VPS-3(zz4015Lzz1202hzzz32i668h839h944h61h)
X-Spam-TCS-SCL: 0:0
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
Received: from mail34-tx2 (localhost.localdomain [127.0.0.1]) by mail34-tx2
	(MessageSwitch) id 132033557238357_30332;
	Thu,  3 Nov 2011 15:52:52 +0000 (UTC)
Received: from TX2EHSMHS027.bigfish.com (unknown [10.9.14.245])	by
	mail34-tx2.bigfish.com (Postfix) with ESMTP id F375774805B;
	Thu,  3 Nov 2011 15:52:51 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	TX2EHSMHS027.bigfish.com (10.9.99.127) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 15:52:42 +0000
X-WSS-ID: 0LU3DG7-02-AIR-02
X-M-MSG: 
Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com
	[163.181.249.73])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 21513C8013;	Thu,  3 Nov 2011 10:52:55 -0500 (CDT)
Received: from sausexhtp02.amd.com (163.181.3.152) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Thu, 3 Nov 2011 10:53:35 -0500
Received: from storexhtp02.amd.com (172.24.4.4) by sausexhtp02.amd.com
	(163.181.3.152) with Microsoft SMTP Server (TLS) id 8.3.83.0;
	Thu, 3 Nov 2011 10:52:56 -0500
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.83.0;
	Thu, 3 Nov 2011 11:52:55 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 062EC49C108; Thu,  3 Nov 2011
	15:52:55 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id EA9405940FF; Thu,  3 Nov 2011
	16:52:54 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-ID: <patchbomb.1320335327@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Thu, 3 Nov 2011 16:48:47 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <JanJBeulich@suse.com>
X-OriginatorOrg: amd.com
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 0 of 5] amd iommu: Add ATS support (v4)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi Jan,
Please see the version 4. Fixed issues from last version. 
Build test passed on both 32 and 64 bit systems.

This patch set enables ats devices on amd systems with following changes:
1) Make vendor independent ATS codes more public.
2) Add additional helper functions for ats.
3) Add amd specific enablement.

Thanks,
Wei


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 08:54:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 08:54:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLzcd-00028x-U0; Thu, 03 Nov 2011 08:54:32 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLzbE-0001ZS-Si
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 08:53:05 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1320335567!53663760!1
X-Originating-IP: [65.55.88.11]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1952 invoked from network); 3 Nov 2011 15:52:49 -0000
Received: from tx2ehsobe001.messaging.microsoft.com (HELO
	TX2EHSOBE002.bigfish.com) (65.55.88.11)
	by server-15.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	3 Nov 2011 15:52:49 -0000
Received: from mail52-tx2-R.bigfish.com (10.9.14.252) by
	TX2EHSOBE002.bigfish.com (10.9.40.22) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 15:52:44 +0000
Received: from mail52-tx2 (localhost.localdomain [127.0.0.1])	by
	mail52-tx2-R.bigfish.com (Postfix) with ESMTP id 45AA61B18355;
	Thu,  3 Nov 2011 15:52:52 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzz8275bhz32i668h839h944h)
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
Received: from mail52-tx2 (localhost.localdomain [127.0.0.1]) by mail52-tx2
	(MessageSwitch) id 1320335571990190_7266;
	Thu,  3 Nov 2011 15:52:51 +0000 (UTC)
Received: from TX2EHSMHS027.bigfish.com (unknown [10.9.14.246])	by
	mail52-tx2.bigfish.com (Postfix) with ESMTP id D8ADE16C0059;
	Thu,  3 Nov 2011 15:52:51 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	TX2EHSMHS027.bigfish.com (10.9.99.127) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 15:52:42 +0000
X-WSS-ID: 0LU3DG7-02-AIQ-02
X-M-MSG: 
Received: from sausexedgep01.amd.com (sausexedgep01-ext.amd.com
	[163.181.249.72])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 269B4C8018;	Thu,  3 Nov 2011 10:52:55 -0500 (CDT)
Received: from SAUSEXDAG01.amd.com (163.181.55.1) by sausexedgep01.amd.com
	(163.181.36.54) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Thu, 3 Nov 2011 10:53:36 -0500
Received: from storexhtp01.amd.com (172.24.4.3) by sausexdag01.amd.com
	(163.181.55.1) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Thu, 3 Nov 2011 10:52:57 -0500
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp01.amd.com
	(172.24.4.3) with Microsoft SMTP Server id 8.3.83.0;
	Thu, 3 Nov 2011 11:52:56 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 4A9A649C627; Thu,  3 Nov 2011
	15:52:55 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 3956B594885; Thu,  3 Nov 2011
	16:52:55 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: acfe5b608724cb06c644a61b73599c748a81274a
Message-ID: <acfe5b608724cb06c644.1320335331@gran.amd.com>
In-Reply-To: <patchbomb.1320335327@gran.amd.com>
References: <patchbomb.1320335327@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Thu, 3 Nov 2011 16:48:51 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <JanJBeulich@suse.com>
X-OriginatorOrg: amd.com
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 4 of 5] amd iommu: add iotlb invalidation command
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Wei Wang <wei.wang2@amd.com>
# Date 1320334783 -3600
# Node ID acfe5b608724cb06c644a61b73599c748a81274a
# Parent  f1b4373838dd5e082755201745f87654e2eaa59f
amd iommu: add iotlb invalidation command

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r f1b4373838dd -r acfe5b608724 xen/drivers/passthrough/amd/iommu_map.c
--- a/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 16:39:20 2011 +0100
+++ b/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 16:39:43 2011 +0100
@@ -23,6 +23,8 @@
 #include <xen/hvm/iommu.h>
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
+#include "../ats.h"
+#include <xen/pci.h>
 
 static int queue_iommu_command(struct amd_iommu *iommu, u32 cmd[])
 {
@@ -128,6 +130,75 @@ static void invalidate_iommu_pages(struc
     send_iommu_command(iommu, cmd);
 }
 
+static void invalidate_iotlb_pages(struct amd_iommu *iommu,
+                                   u16 maxpend, u32 pasid, u16 queueid,
+                                   u64 io_addr, u16 dev_id, u16 order)
+{
+    u64 addr_lo, addr_hi;
+    u32 cmd[4], entry;
+    int sflag = 0;
+
+    ASSERT ( order == 0 || order == 9 || order == 18 );
+
+    if ( order || (io_addr == INV_IOMMU_ALL_PAGES_ADDRESS ) )
+        sflag = 1;
+
+    /* If sflag == 1, the size of the invalidate command is determined
+     by the first zero bit in the address starting from Address[12] */
+    if ( order )
+    {
+        u64 mask = 1ULL << (order - 1 + PAGE_SHIFT);
+        io_addr &= ~mask;
+        io_addr |= mask - 1;
+    }
+
+    addr_lo = io_addr & DMA_32BIT_MASK;
+    addr_hi = io_addr >> 32;
+
+    set_field_in_reg_u32(dev_id, 0,
+                         IOMMU_INV_IOTLB_PAGES_DEVICE_ID_MASK,
+                         IOMMU_INV_IOTLB_PAGES_DEVICE_ID_SHIFT, &entry);
+
+    set_field_in_reg_u32(maxpend, entry,
+                         IOMMU_INV_IOTLB_PAGES_MAXPEND_MASK,
+                         IOMMU_INV_IOTLB_PAGES_MAXPEND_SHIFT, &entry);
+
+    set_field_in_reg_u32(pasid & 0xff, entry,
+                         IOMMU_INV_IOTLB_PAGES_PASID1_MASK,
+                         IOMMU_INV_IOTLB_PAGES_PASID1_SHIFT, &entry);
+    cmd[0] = entry;
+
+    set_field_in_reg_u32(IOMMU_CMD_INVALIDATE_IOTLB_PAGES, 0,
+                         IOMMU_CMD_OPCODE_MASK, IOMMU_CMD_OPCODE_SHIFT,
+                         &entry);
+
+    set_field_in_reg_u32(pasid >> 8, entry,
+                         IOMMU_INV_IOTLB_PAGES_PASID2_MASK, 
+                         IOMMU_INV_IOTLB_PAGES_PASID2_SHIFT,
+                         &entry);
+
+    set_field_in_reg_u32(queueid, entry,
+                         IOMMU_INV_IOTLB_PAGES_QUEUEID_MASK, 
+                         IOMMU_INV_IOTLB_PAGES_QUEUEID_SHIFT,
+                         &entry);
+    cmd[1] = entry;
+
+    set_field_in_reg_u32(sflag, 0,
+                         IOMMU_INV_IOTLB_PAGES_S_FLAG_MASK,
+                         IOMMU_INV_IOTLB_PAGES_S_FLAG_MASK, &entry);
+
+    set_field_in_reg_u32((u32)addr_lo >> PAGE_SHIFT, entry,
+                         IOMMU_INV_IOTLB_PAGES_ADDR_LOW_MASK,
+                         IOMMU_INV_IOTLB_PAGES_ADDR_LOW_SHIFT, &entry);
+    cmd[2] = entry;
+
+    set_field_in_reg_u32((u32)addr_hi, 0,
+                         IOMMU_INV_IOTLB_PAGES_ADDR_HIGH_MASK,
+                         IOMMU_INV_IOTLB_PAGES_ADDR_HIGH_SHIFT, &entry);
+    cmd[3] = entry;
+
+    send_iommu_command(iommu, cmd);
+}
 void flush_command_buffer(struct amd_iommu *iommu)
 {
     u32 cmd[4], status;
@@ -896,6 +967,63 @@ int amd_iommu_reserve_domain_unity_map(s
     return 0;
 }
 
+void amd_iommu_flush_iotlb(struct pci_dev *pdev,
+                           uint64_t gaddr, unsigned int order)
+{
+    unsigned long flags;
+    struct amd_iommu *iommu;
+    unsigned int bdf, req_id, queueid, maxpend;
+    struct pci_ats_dev *ats_pdev;
+
+    if ( !ats_enabled )
+        return;
+
+    ats_pdev = get_ats_device(pdev->seg, pdev->bus, pdev->devfn);
+    if ( ats_pdev == NULL )
+        return;
+
+    if ( !pci_ats_enabled(ats_pdev->seg, 
+                          ats_pdev->bus, ats_pdev->devfn) )
+        return;
+
+    bdf = PCI_BDF2(ats_pdev->bus, ats_pdev->devfn);
+    iommu = find_iommu_for_device(ats_pdev->seg, bdf);
+
+    if ( !iommu )
+    {
+        AMD_IOMMU_DEBUG("%s: Fail to find iommu for device %04x:%02x:%02x.%u\n",
+                        __func__, ats_pdev->seg, ats_pdev->bus, 
+                        PCI_SLOT(ats_pdev->devfn),
+                        PCI_FUNC(ats_pdev->devfn));
+        return;
+    }
+
+    if ( !iommu->iotlb_support )
+        return;
+
+    req_id = get_dma_requestor_id(iommu->seg, bdf);
+    queueid = req_id;
+    maxpend = (ats_pdev->ats_queue_depth + 32) & 0xff;
+
+    /* send INVALIDATE_IOTLB_PAGES command */
+    spin_lock_irqsave(&iommu->lock, flags);
+    invalidate_iotlb_pages(iommu, maxpend, 0, queueid,
+                           gaddr, req_id, order);
+    flush_command_buffer(iommu);
+    spin_unlock_irqrestore(&iommu->lock, flags);
+}
+
+static void amd_iommu_flush_all_iotlbs(struct domain *d, 
+                                       uint64_t gaddr, unsigned int order)
+{
+    struct pci_dev *pdev;
+
+    if ( !ats_enabled )
+        return;
+
+    for_each_pdev( d, pdev )
+        amd_iommu_flush_iotlb(pdev, gaddr, order);
+}
 
 /* Flush iommu cache after p2m changes. */
 static void _amd_iommu_flush_pages(struct domain *d,
@@ -914,6 +1042,9 @@ static void _amd_iommu_flush_pages(struc
         flush_command_buffer(iommu);
         spin_unlock_irqrestore(&iommu->lock, flags);
     }
+
+    if ( ats_enabled )
+        amd_iommu_flush_all_iotlbs(d, gaddr, order);
 }
 
 void amd_iommu_flush_all_pages(struct domain *d)
diff -r f1b4373838dd -r acfe5b608724 xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 16:39:20 2011 +0100
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 16:39:43 2011 +0100
@@ -233,6 +233,24 @@
 #define IOMMU_INV_INT_TABLE_DEVICE_ID_MASK   0x0000FFFF
 #define IOMMU_INV_INT_TABLE_DEVICE_ID_SHIFT  0
 
+/* INVALIDATE_IOTLB_PAGES command */
+#define IOMMU_INV_IOTLB_PAGES_MAXPEND_MASK          0xff000000
+#define IOMMU_INV_IOTLB_PAGES_MAXPEND_SHIFT         24
+#define IOMMU_INV_IOTLB_PAGES_PASID1_MASK           0x00ff0000
+#define IOMMU_INV_IOTLB_PAGES_PASID1_SHIFT          16
+#define IOMMU_INV_IOTLB_PAGES_PASID2_MASK           0x0fff0000
+#define IOMMU_INV_IOTLB_PAGES_PASID2_SHIFT          16
+#define IOMMU_INV_IOTLB_PAGES_QUEUEID_MASK          0x0000ffff
+#define IOMMU_INV_IOTLB_PAGES_QUEUEID_SHIFT         0
+#define IOMMU_INV_IOTLB_PAGES_DEVICE_ID_MASK        0x0000FFFF
+#define IOMMU_INV_IOTLB_PAGES_DEVICE_ID_SHIFT       0
+#define IOMMU_INV_IOTLB_PAGES_ADDR_LOW_MASK         0xFFFFF000
+#define IOMMU_INV_IOTLB_PAGES_ADDR_LOW_SHIFT        12
+#define IOMMU_INV_IOTLB_PAGES_ADDR_HIGH_MASK        0xFFFFFFFF
+#define IOMMU_INV_IOTLB_PAGES_ADDR_HIGH_SHIFT       0
+#define IOMMU_INV_IOTLB_PAGES_S_FLAG_MASK           0x00000001
+#define IOMMU_INV_IOTLB_PAGES_S_FLAG_SHIFT          0
+
 /* Event Log */
 #define IOMMU_EVENT_LOG_BASE_LOW_OFFSET		0x10
 #define IOMMU_EVENT_LOG_BASE_HIGH_OFFSET	0x14
diff -r f1b4373838dd -r acfe5b608724 xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Thu Nov 03 16:39:20 2011 +0100
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Thu Nov 03 16:39:43 2011 +0100
@@ -55,6 +55,8 @@ int amd_iommu_unmap_page(struct domain *
 void amd_iommu_flush_pages(struct domain *d, unsigned long gfn,
                            unsigned int order);
 void amd_iommu_flush_all_pages(struct domain *d);
+void amd_iommu_flush_iotlb(struct pci_dev *pdev,
+                           uint64_t gaddr, unsigned int order);
 
 u64 amd_iommu_get_next_table_from_pte(u32 *entry);
 int amd_iommu_reserve_domain_unity_map(struct domain *domain,


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 08:55:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 08:55:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLzdR-0002WZ-0r; Thu, 03 Nov 2011 08:55:21 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLzbF-0001ZT-VO
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 08:53:06 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1320335569!53663764!1
X-Originating-IP: [65.55.88.12]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2019 invoked from network); 3 Nov 2011 15:52:50 -0000
Received: from tx2ehsobe002.messaging.microsoft.com (HELO
	TX2EHSOBE003.bigfish.com) (65.55.88.12)
	by server-15.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	3 Nov 2011 15:52:50 -0000
Received: from mail165-tx2-R.bigfish.com (10.9.14.250) by
	TX2EHSOBE003.bigfish.com (10.9.40.23) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 15:52:45 +0000
Received: from mail165-tx2 (localhost.localdomain [127.0.0.1])	by
	mail165-tx2-R.bigfish.com (Postfix) with ESMTP id DAE361220103;
	Thu,  3 Nov 2011 15:52:54 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzz8275bhz32i668h839h944h61h)
X-Spam-TCS-SCL: 0:0
X-Forefront-Antispam-Report: CIP:163.181.249.108; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp01.amd.com; RD:none; EFVD:NLI
Received: from mail165-tx2 (localhost.localdomain [127.0.0.1]) by mail165-tx2
	(MessageSwitch) id 1320335574627870_27721;
	Thu,  3 Nov 2011 15:52:54 +0000 (UTC)
Received: from TX2EHSMHS037.bigfish.com (unknown [10.9.14.244])	by
	mail165-tx2.bigfish.com (Postfix) with ESMTP id EFE661AD8055;
	Thu,  3 Nov 2011 15:52:53 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	TX2EHSMHS037.bigfish.com (10.9.99.137) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 15:52:42 +0000
X-WSS-ID: 0LU3DG8-01-D9R-02
X-M-MSG: 
Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com
	[163.181.249.73])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp01.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 20AFD1028025;	Thu,  3 Nov 2011 10:52:56 -0500 (CDT)
Received: from SAUSEXDAG01.amd.com (163.181.55.1) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Thu, 3 Nov 2011 10:53:36 -0500
Received: from storexhtp01.amd.com (172.24.4.3) by sausexdag01.amd.com
	(163.181.55.1) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Thu, 3 Nov 2011 10:52:57 -0500
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp01.amd.com
	(172.24.4.3) with Microsoft SMTP Server id 8.3.83.0;
	Thu, 3 Nov 2011 11:52:57 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 66E9C49C628; Thu,  3 Nov 2011
	15:52:55 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 4B088594886; Thu,  3 Nov 2011
	16:52:55 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 59b7d9f9b571d6de35e5c5dae81a3890752271fe
Message-ID: <59b7d9f9b571d6de35e5.1320335332@gran.amd.com>
In-Reply-To: <patchbomb.1320335327@gran.amd.com>
References: <patchbomb.1320335327@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Thu, 3 Nov 2011 16:48:52 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <JanJBeulich@suse.com>
X-OriginatorOrg: amd.com
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 5 of 5] amd iommu: enable ats devices
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Wei Wang <wei.wang2@amd.com>
# Date 1320334827 -3600
# Node ID 59b7d9f9b571d6de35e5c5dae81a3890752271fe
# Parent  acfe5b608724cb06c644a61b73599c748a81274a
amd iommu: enable ats devices

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r acfe5b608724 -r 59b7d9f9b571 xen/drivers/passthrough/amd/iommu_map.c
--- a/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 16:39:43 2011 +0100
+++ b/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 16:40:27 2011 +0100
@@ -370,6 +370,17 @@ void amd_iommu_set_root_page_table(
     dte[0] = entry;
 }
 
+void iommu_dte_set_iotlb(u32 *dte, u8 i)
+{
+    u32 entry;
+
+    entry = dte[3];
+    set_field_in_reg_u32(!!i, entry,
+                         IOMMU_DEV_TABLE_IOTLB_SUPPORT_MASK,
+                         IOMMU_DEV_TABLE_IOTLB_SUPPORT_SHIFT, &entry);
+    dte[3] = entry;
+}
+
 void __init amd_iommu_set_intremap_table(
     u32 *dte, u64 intremap_ptr, u8 int_valid)
 {
diff -r acfe5b608724 -r 59b7d9f9b571 xen/drivers/passthrough/amd/pci_amd_iommu.c
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c	Thu Nov 03 16:39:43 2011 +0100
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c	Thu Nov 03 16:40:27 2011 +0100
@@ -25,6 +25,7 @@
 #include <asm/hvm/iommu.h>
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
+#include "../ats.h"
 
 struct amd_iommu *find_iommu_for_device(int seg, int bdf)
 {
@@ -86,6 +87,9 @@ static void amd_iommu_setup_domain_devic
     void *dte;
     unsigned long flags;
     int req_id, valid = 1;
+    int dte_i = 0;
+    u8 bus = PCI_BUS(bdf);
+    u8 devfn = PCI_DEVFN2(bdf);
 
     struct hvm_iommu *hd = domain_hvm_iommu(domain);
 
@@ -94,6 +98,9 @@ static void amd_iommu_setup_domain_devic
     if ( iommu_passthrough && (domain->domain_id == 0) )
         valid = 0;
 
+    if ( ats_enabled )
+        dte_i = 1;
+
     /* get device-table entry */
     req_id = get_dma_requestor_id(iommu->seg, bdf);
     dte = iommu->dev_table.buffer + (req_id * IOMMU_DEV_TABLE_ENTRY_SIZE);
@@ -107,6 +114,10 @@ static void amd_iommu_setup_domain_devic
             (u32 *)dte, page_to_maddr(hd->root_table), hd->domain_id,
             hd->paging_mode, valid);
 
+        if ( pci_ats_device(iommu->seg, bus, devfn) &&
+             iommu->iotlb_support )
+            iommu_dte_set_iotlb((u32 *)dte, dte_i);
+
         invalidate_dev_table_entry(iommu, req_id);
         flush_command_buffer(iommu);
 
@@ -118,11 +129,27 @@ static void amd_iommu_setup_domain_devic
     }
 
     spin_unlock_irqrestore(&iommu->lock, flags);
+
+    ASSERT(spin_is_locked(&pcidevs_lock));
+
+    if ( pci_ats_device(iommu->seg, bus, devfn) &&
+         !pci_ats_enabled(iommu->seg, bus, devfn) )
+    {
+        struct pci_dev *pdev;
+
+        enable_ats_device(iommu->seg, bus, devfn);
+
+        ASSERT(spin_is_locked(&pcidevs_lock));
+        pdev = pci_get_pdev(iommu->seg, bus, devfn);
+
+        ASSERT( pdev != NULL );
+        amd_iommu_flush_iotlb(pdev, INV_IOMMU_ALL_PAGES_ADDRESS, 0);
+    }
 }
 
 static void __init amd_iommu_setup_dom0_device(struct pci_dev *pdev)
 {
-    int bdf = (pdev->bus << 8) | pdev->devfn;
+    int bdf = PCI_BDF2(pdev->bus, pdev->devfn);
     struct amd_iommu *iommu = find_iommu_for_device(pdev->seg, bdf);
 
     if ( likely(iommu != NULL) )
@@ -261,12 +288,14 @@ static void __init amd_iommu_dom0_init(s
     setup_dom0_pci_devices(d, amd_iommu_setup_dom0_device);
 }
 
-static void amd_iommu_disable_domain_device(
-    struct domain *domain, struct amd_iommu *iommu, int bdf)
+void amd_iommu_disable_domain_device(struct domain *domain, 
+                                     struct amd_iommu *iommu, int bdf)
 {
     void *dte;
     unsigned long flags;
     int req_id;
+    u8 bus = PCI_BUS(bdf);
+    u8 devfn = PCI_DEVFN2(bdf);
 
     BUG_ON ( iommu->dev_table.buffer == NULL );
     req_id = get_dma_requestor_id(iommu->seg, bdf);
@@ -276,6 +305,11 @@ static void amd_iommu_disable_domain_dev
     if ( is_translation_valid((u32 *)dte) )
     {
         disable_translation((u32 *)dte);
+
+        if ( pci_ats_device(iommu->seg, bus, devfn) &&
+             iommu->iotlb_support )
+            iommu_dte_set_iotlb((u32 *)dte, 0);
+
         invalidate_dev_table_entry(iommu, req_id);
         flush_command_buffer(iommu);
         AMD_IOMMU_DEBUG("Disable: device id = 0x%04x, "
@@ -284,6 +318,12 @@ static void amd_iommu_disable_domain_dev
                         domain_hvm_iommu(domain)->paging_mode);
     }
     spin_unlock_irqrestore(&iommu->lock, flags);
+
+    ASSERT(spin_is_locked(&pcidevs_lock));
+
+    if ( pci_ats_device(iommu->seg, bus, devfn) && 
+         pci_ats_enabled(iommu->seg, bus, devfn) )
+       disable_ats_device(iommu->seg, bus, devfn); 
 }
 
 static int reassign_device( struct domain *source, struct domain *target,
@@ -299,7 +339,7 @@ static int reassign_device( struct domai
     if ( !pdev )
         return -ENODEV;
 
-    bdf = (bus << 8) | devfn;
+    bdf = PCI_BDF2(bus, devfn);
     iommu = find_iommu_for_device(seg, bdf);
     if ( !iommu )
     {
@@ -421,7 +461,7 @@ static int amd_iommu_add_device(struct p
     if ( !pdev->domain )
         return -EINVAL;
 
-    bdf = (pdev->bus << 8) | pdev->devfn;
+    bdf = PCI_BDF2(pdev->bus, pdev->devfn);
     iommu = find_iommu_for_device(pdev->seg, bdf);
     if ( !iommu )
     {
@@ -443,7 +483,7 @@ static int amd_iommu_remove_device(struc
     if ( !pdev->domain )
         return -EINVAL;
 
-    bdf = (pdev->bus << 8) | pdev->devfn;
+    bdf = PCI_BDF2(pdev->bus, pdev->devfn);
     iommu = find_iommu_for_device(pdev->seg, bdf);
     if ( !iommu )
     {
diff -r acfe5b608724 -r 59b7d9f9b571 xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Thu Nov 03 16:39:43 2011 +0100
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Thu Nov 03 16:40:27 2011 +0100
@@ -75,6 +75,7 @@ void amd_iommu_set_intremap_table(
     u32 *dte, u64 intremap_ptr, u8 int_valid);
 void amd_iommu_set_root_page_table(
     u32 *dte, u64 root_ptr, u16 domain_id, u8 paging_mode, u8 valid);
+void iommu_dte_set_iotlb(u32 *dte, u8 i);
 void invalidate_dev_table_entry(struct amd_iommu *iommu, u16 devic_id);
 
 /* send cmd to iommu */


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 08:56:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 08:56:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLzeS-0002ta-Fg; Thu, 03 Nov 2011 08:56:24 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLzbG-0001ZV-8E
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 08:53:06 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1320335582!2191166!1
X-Originating-IP: [216.32.181.183]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5799 invoked from network); 3 Nov 2011 15:53:03 -0000
Received: from ch1ehsobe003.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.183)
	by server-5.tower-216.messagelabs.com with AES128-SHA encrypted SMTP;
	3 Nov 2011 15:53:03 -0000
Received: from mail82-ch1-R.bigfish.com (10.43.68.252) by
	CH1EHSOBE001.bigfish.com (10.43.70.51) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 15:52:45 +0000
Received: from mail82-ch1 (localhost.localdomain [127.0.0.1])	by
	mail82-ch1-R.bigfish.com (Postfix) with ESMTP id 55DEC131042E;
	Thu,  3 Nov 2011 15:52:54 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzz8275bhz32i668h839h944h)
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
X-FB-SS: 13,
Received: from mail82-ch1 (localhost.localdomain [127.0.0.1]) by mail82-ch1
	(MessageSwitch) id 1320335574157019_3287;
	Thu,  3 Nov 2011 15:52:54 +0000 (UTC)
Received: from CH1EHSMHS026.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.245])	by mail82-ch1.bigfish.com (Postfix) with ESMTP id
	0F0AA1678050;	Thu,  3 Nov 2011 15:52:54 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	CH1EHSMHS026.bigfish.com (10.43.70.26) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 15:52:59 +0000
X-WSS-ID: 0LU3DG7-02-AIT-02
X-M-MSG: 
Received: from sausexedgep01.amd.com (sausexedgep01-ext.amd.com
	[163.181.249.72])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 22F29C8017;	Thu,  3 Nov 2011 10:52:55 -0500 (CDT)
Received: from sausexhtp02.amd.com (163.181.3.152) by sausexedgep01.amd.com
	(163.181.36.54) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Thu, 3 Nov 2011 10:53:36 -0500
Received: from storexhtp02.amd.com (172.24.4.4) by sausexhtp02.amd.com
	(163.181.3.152) with Microsoft SMTP Server (TLS) id 8.3.83.0;
	Thu, 3 Nov 2011 10:52:57 -0500
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.83.0;
	Thu, 3 Nov 2011 11:52:56 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 38E1449C626; Thu,  3 Nov 2011
	15:52:55 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 25E1B594884; Thu,  3 Nov 2011
	16:52:55 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: f1b4373838dd5e082755201745f87654e2eaa59f
Message-ID: <f1b4373838dd5e082755.1320335330@gran.amd.com>
In-Reply-To: <patchbomb.1320335327@gran.amd.com>
References: <patchbomb.1320335327@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Thu, 3 Nov 2011 16:48:50 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <JanJBeulich@suse.com>
X-OriginatorOrg: amd.com
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 3 of 5] ats: Add new ATS helper functions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Wei Wang <wei.wang2@amd.com>
# Date 1320334760 -3600
# Node ID f1b4373838dd5e082755201745f87654e2eaa59f
# Parent  1bf06c8d2c70e9af610e12a7592c466a799b0de1
ats: Add new ATS helper functions

Signed-off-by Wei Wang <wei.wang2@amd.com>

diff -r 1bf06c8d2c70 -r f1b4373838dd xen/drivers/passthrough/ats.h
--- a/xen/drivers/passthrough/ats.h	Thu Nov 03 16:35:53 2011 +0100
+++ b/xen/drivers/passthrough/ats.h	Thu Nov 03 16:39:20 2011 +0100
@@ -16,6 +16,8 @@
 #ifndef _ATS_H_
 #define _ATS_H_
 
+#include <xen/pci_regs.h>
+
 struct pci_ats_dev {
     struct list_head list;
     u16 seg;
@@ -36,6 +38,28 @@ extern bool_t ats_enabled;
 
 int enable_ats_device(int seg, int bus, int devfn);
 void disable_ats_device(int seg, int bus, int devfn);
+struct pci_ats_dev *get_ats_device(int seg, int bus, int devfn);
+
+static inline int pci_ats_enabled(int seg, int bus, int devfn)
+{
+    u32 value;
+    int pos;
+
+    pos = pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
+    BUG_ON(!pos);
+
+    value = pci_conf_read16(seg, bus, PCI_SLOT(devfn),
+                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
+    return value & ATS_ENABLE;
+}
+
+static inline int pci_ats_device(int seg, int bus, int devfn)
+{
+    if ( !ats_enabled )
+        return 0;
+
+    return pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
+}
 
 #else
 
@@ -50,6 +74,22 @@ static inline void disable_ats_device(in
 {
     BUG();
 }
+
+static inline int pci_ats_enabled(int seg, int bus, int devfn)
+{
+    return 0;
+}
+
+static inline int pci_ats_device(int seg, int bus, int devfn)
+{
+    return 0;
+}
+
+static inline struct pci_ats_dev *get_ats_device(int seg, int bus, int devfn)
+{
+    return NULL;
+}
+
 #endif
 
 #endif /* _ATS_H_ */
diff -r 1bf06c8d2c70 -r f1b4373838dd xen/drivers/passthrough/x86/ats.c
--- a/xen/drivers/passthrough/x86/ats.c	Thu Nov 03 16:35:53 2011 +0100
+++ b/xen/drivers/passthrough/x86/ats.c	Thu Nov 03 16:39:20 2011 +0100
@@ -134,3 +134,19 @@ void disable_ats_device(int seg, int bus
         dprintk(XENLOG_INFO, "%04x:%02x:%02x.%u: ATS is disabled\n",
                 seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
 }
+
+struct pci_ats_dev *get_ats_device(int seg, int bus, int devfn)
+{
+    struct pci_ats_dev *pdev;
+
+    if ( !pci_ats_device(seg, bus, devfn) )
+        return NULL;
+
+    list_for_each_entry ( pdev, &ats_devices, list )
+    {
+        if ( pdev->seg == seg && pdev->bus == bus && pdev->devfn == devfn )
+            return pdev;
+    }
+
+    return NULL;
+}


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 08:58:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 08:58:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLzg0-0003Pw-3l; Thu, 03 Nov 2011 08:58:00 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLzbJ-0001Zi-4K
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 08:53:09 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1320335549!55449025!1
X-Originating-IP: [65.55.88.11]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28675 invoked from network); 3 Nov 2011 15:52:30 -0000
Received: from tx2ehsobe001.messaging.microsoft.com (HELO
	TX2EHSOBE001.bigfish.com) (65.55.88.11)
	by server-7.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	3 Nov 2011 15:52:30 -0000
Received: from mail167-tx2-R.bigfish.com (10.9.14.235) by
	TX2EHSOBE001.bigfish.com (10.9.40.21) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 15:52:48 +0000
Received: from mail167-tx2 (localhost.localdomain [127.0.0.1])	by
	mail167-tx2-R.bigfish.com (Postfix) with ESMTP id A895958842B;
	Thu,  3 Nov 2011 15:52:57 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzz8275bhz32i668h839h944h61h)
X-Spam-TCS-SCL: 0:0
X-Forefront-Antispam-Report: CIP:163.181.249.108; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp01.amd.com; RD:none; EFVD:NLI
Received: from mail167-tx2 (localhost.localdomain [127.0.0.1]) by mail167-tx2
	(MessageSwitch) id 1320335577441022_14852;
	Thu,  3 Nov 2011 15:52:57 +0000 (UTC)
Received: from TX2EHSMHS035.bigfish.com (unknown [10.9.14.244])	by
	mail167-tx2.bigfish.com (Postfix) with ESMTP id 49D3E2D0053;
	Thu,  3 Nov 2011 15:52:57 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	TX2EHSMHS035.bigfish.com (10.9.99.135) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 15:52:42 +0000
X-WSS-ID: 0LU3DG7-01-D9N-02
X-M-MSG: 
Received: from sausexedgep01.amd.com (sausexedgep01-ext.amd.com
	[163.181.249.72])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp01.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 2998310282A0;	Thu,  3 Nov 2011 10:52:55 -0500 (CDT)
Received: from sausexhtp02.amd.com (163.181.3.152) by sausexedgep01.amd.com
	(163.181.36.54) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Thu, 3 Nov 2011 10:53:36 -0500
Received: from storexhtp02.amd.com (172.24.4.4) by sausexhtp02.amd.com
	(163.181.3.152) with Microsoft SMTP Server (TLS) id 8.3.83.0;
	Thu, 3 Nov 2011 10:52:56 -0500
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.83.0;
	Thu, 3 Nov 2011 11:52:55 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 2572049C625; Thu,  3 Nov 2011
	15:52:55 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 14F1D594883; Thu,  3 Nov 2011
	16:52:55 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 1bf06c8d2c70e9af610e12a7592c466a799b0de1
Message-ID: <1bf06c8d2c70e9af610e.1320335329@gran.amd.com>
In-Reply-To: <patchbomb.1320335327@gran.amd.com>
References: <patchbomb.1320335327@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Thu, 3 Nov 2011 16:48:49 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <JanJBeulich@suse.com>
X-OriginatorOrg: amd.com
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 2 of 5] amd iommu: Fix iommu page size encoding
 when page order > 0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Wei Wang <wei.wang2@amd.com>
# Date 1320334553 -3600
# Node ID 1bf06c8d2c70e9af610e12a7592c466a799b0de1
# Parent  ef46c471a11f83d07e256ad2e0b868828f45ef63
amd iommu: Fix iommu page size encoding when page order > 0.
Fix io address in invalid all pages command.

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r ef46c471a11f -r 1bf06c8d2c70 xen/drivers/passthrough/amd/iommu_map.c
--- a/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 16:35:51 2011 +0100
+++ b/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 16:35:53 2011 +0100
@@ -77,23 +77,24 @@ static void invalidate_iommu_pages(struc
 {
     u64 addr_lo, addr_hi;
     u32 cmd[4], entry;
-    u64 mask = 0;
     int sflag = 0, pde = 0;
 
+    ASSERT ( order == 0 || order == 9 || order == 18 );
+
+    /* All pages associated with the domainID are invalidated */
+    if ( order || (io_addr == INV_IOMMU_ALL_PAGES_ADDRESS ) )
+    {
+        sflag = 1;
+        pde = 1;
+    }
+
     /* If sflag == 1, the size of the invalidate command is determined
      by the first zero bit in the address starting from Address[12] */
-    if ( order == 9 || order == 18 )
+    if ( order )
     {
-        mask = ((1ULL << (order - 1)) - 1) << PAGE_SHIFT;
-        io_addr |= mask;
-        sflag = 1;
-    }
-
-    /* All pages associated with the domainID are invalidated */
-    else if ( io_addr == 0x7FFFFFFFFFFFF000ULL )
-    {
-        sflag = 1;
-        pde = 1;
+        u64 mask = 1ULL << (order - 1 + PAGE_SHIFT);
+        io_addr &= ~mask;
+        io_addr |= mask - 1;
     }
 
     addr_lo = io_addr & DMA_32BIT_MASK;
@@ -917,7 +918,7 @@ static void _amd_iommu_flush_pages(struc
 
 void amd_iommu_flush_all_pages(struct domain *d)
 {
-    _amd_iommu_flush_pages(d, 0x7FFFFFFFFFFFFULL, 0);
+    _amd_iommu_flush_pages(d, INV_IOMMU_ALL_PAGES_ADDRESS, 0);
 }
 
 void amd_iommu_flush_pages(struct domain *d,
diff -r ef46c471a11f -r 1bf06c8d2c70 xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 16:35:51 2011 +0100
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 16:35:53 2011 +0100
@@ -407,4 +407,6 @@
 #define INT_REMAP_ENTRY_VECTOR_MASK     0x00FF0000
 #define INT_REMAP_ENTRY_VECTOR_SHIFT    16
 
+#define INV_IOMMU_ALL_PAGES_ADDRESS      (1ULL << 63) - 1
+
 #endif /* _ASM_X86_64_AMD_IOMMU_DEFS_H */


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 09:01:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 09:01:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLzj6-0003qC-Dj; Thu, 03 Nov 2011 09:01:12 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLzbI-0001Zh-8Y
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 08:53:09 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1320335583!1844661!1
X-Originating-IP: [216.32.181.182]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30173 invoked from network); 3 Nov 2011 15:53:05 -0000
Received: from ch1ehsobe002.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.182)
	by server-10.tower-182.messagelabs.com with AES128-SHA encrypted SMTP;
	3 Nov 2011 15:53:05 -0000
Received: from mail149-ch1-R.bigfish.com (10.43.68.252) by
	CH1EHSOBE005.bigfish.com (10.43.70.55) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 15:52:47 +0000
Received: from mail149-ch1 (localhost.localdomain [127.0.0.1])	by
	mail149-ch1-R.bigfish.com (Postfix) with ESMTP id D2BAEAE843D;
	Thu,  3 Nov 2011 15:52:55 +0000 (UTC)
X-SpamScore: 3
X-BigFish: VPS3(zz8d0Ic8kzz1202hzz8275bhz32i668h839h944h)
X-Forefront-Antispam-Report: CIP:163.181.249.108; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp01.amd.com; RD:none; EFVD:NLI
X-FB-SS: 13,
Received: from mail149-ch1 (localhost.localdomain [127.0.0.1]) by mail149-ch1
	(MessageSwitch) id 13203355757380_13198;
	Thu,  3 Nov 2011 15:52:55 +0000 (UTC)
Received: from CH1EHSMHS015.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.241])	by mail149-ch1.bigfish.com (Postfix) with ESMTP id
	B6F756E004F;	Thu,  3 Nov 2011 15:52:54 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	CH1EHSMHS015.bigfish.com (10.43.70.15) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 15:52:58 +0000
X-WSS-ID: 0LU3DG8-01-D9Q-02
X-M-MSG: 
Received: from sausexedgep01.amd.com (sausexedgep01-ext.amd.com
	[163.181.249.72])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp01.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 2A1581028023;	Thu,  3 Nov 2011 10:52:56 -0500 (CDT)
Received: from sausexhtp02.amd.com (163.181.3.152) by sausexedgep01.amd.com
	(163.181.36.54) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Thu, 3 Nov 2011 10:53:37 -0500
Received: from storexhtp02.amd.com (172.24.4.4) by sausexhtp02.amd.com
	(163.181.3.152) with Microsoft SMTP Server (TLS) id 8.3.83.0;
	Thu, 3 Nov 2011 10:52:57 -0500
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.83.0;
	Thu, 3 Nov 2011 11:52:56 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 14B5249C623; Thu,  3 Nov 2011
	15:52:55 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 0462F594882; Thu,  3 Nov 2011
	16:52:55 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: ef46c471a11f83d07e256ad2e0b868828f45ef63
Message-ID: <ef46c471a11f83d07e25.1320335328@gran.amd.com>
In-Reply-To: <patchbomb.1320335327@gran.amd.com>
References: <patchbomb.1320335327@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Thu, 3 Nov 2011 16:48:48 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <JanJBeulich@suse.com>
X-OriginatorOrg: amd.com
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 1 of 5] ats: Move some ats functions to a new
	directory
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Wei Wang <wei.wang2@amd.com>
# Date 1320334551 -3600
# Node ID ef46c471a11f83d07e256ad2e0b868828f45ef63
# Parent  119bccb1cc5eee1364bbbd3bd1a30f22e9db703a
ats: Move some ats functions to a new directory.
Remove VTD prefix from debug output.
passhrough/x86 holds vendor neutral codes for x86 architecture.

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/Makefile
--- a/xen/drivers/passthrough/Makefile	Wed Nov 02 13:53:05 2011 +0100
+++ b/xen/drivers/passthrough/Makefile	Thu Nov 03 16:35:51 2011 +0100
@@ -1,6 +1,7 @@
 subdir-$(x86) += vtd
 subdir-$(ia64) += vtd
 subdir-$(x86) += amd
+subdir-$(x86_64) += x86
 
 obj-y += iommu.o
 obj-y += io.o
diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/ats.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/drivers/passthrough/ats.h	Thu Nov 03 16:35:51 2011 +0100
@@ -0,0 +1,56 @@
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place - Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _ATS_H_
+#define _ATS_H_
+
+struct pci_ats_dev {
+    struct list_head list;
+    u16 seg;
+    u8 bus;
+    u8 devfn;
+    u16 ats_queue_depth;    /* ATS device invalidation queue depth */
+};
+
+#ifdef CONFIG_X86_64
+
+#define ATS_REG_CAP    4
+#define ATS_REG_CTL    6
+#define ATS_QUEUE_DEPTH_MASK     0xF
+#define ATS_ENABLE               (1<<15)
+
+extern struct list_head ats_devices;
+extern bool_t ats_enabled;
+
+int enable_ats_device(int seg, int bus, int devfn);
+void disable_ats_device(int seg, int bus, int devfn);
+
+#else
+
+#define ats_enabled 0
+static inline int enable_ats_device(int seg, int bus, int devfn)
+{
+    BUG();
+    return -ENOSYS;
+}
+
+static inline void disable_ats_device(int seg, int bus, int devfn)
+{
+    BUG();
+}
+#endif
+
+#endif /* _ATS_H_ */
+
diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/vtd/extern.h
--- a/xen/drivers/passthrough/vtd/extern.h	Wed Nov 02 13:53:05 2011 +0100
+++ b/xen/drivers/passthrough/vtd/extern.h	Thu Nov 03 16:35:51 2011 +0100
@@ -57,18 +57,13 @@ struct acpi_drhd_unit * iommu_to_drhd(st
 struct acpi_rhsa_unit * drhd_to_rhsa(struct acpi_drhd_unit *drhd);
 
 #ifdef CONFIG_X86_64
-extern bool_t ats_enabled;
-
 struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu);
 
 int ats_device(const struct pci_dev *, const struct acpi_drhd_unit *);
-int enable_ats_device(int seg, int bus, int devfn);
-void disable_ats_device(int seg, int bus, int devfn);
 
 int dev_invalidate_iotlb(struct iommu *iommu, u16 did,
                          u64 addr, unsigned int size_order, u64 type);
 #else
-#define ats_enabled 0
 
 static inline struct acpi_drhd_unit *find_ats_dev_drhd(struct iommu *iommu)
 {
@@ -80,15 +75,6 @@ static inline int ats_device(const struc
 {
     return 0;
 }
-static inline int enable_ats_device(int seg, int bus, int devfn)
-{
-    BUG();
-    return -ENOSYS;
-}
-static inline void disable_ats_device(int seg, int bus, int devfn)
-{
-    BUG();
-}
 
 static inline int dev_invalidate_iotlb(struct iommu *iommu, u16 did, u64 addr,
                                        unsigned int size_order, u64 type)
diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/vtd/iommu.c
--- a/xen/drivers/passthrough/vtd/iommu.c	Wed Nov 02 13:53:05 2011 +0100
+++ b/xen/drivers/passthrough/vtd/iommu.c	Thu Nov 03 16:35:51 2011 +0100
@@ -40,6 +40,7 @@
 #include "dmar.h"
 #include "extern.h"
 #include "vtd.h"
+#include "../ats.h"
 
 #ifdef __ia64__
 #define nr_ioapics              iosapic_get_nr_iosapics()
diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/vtd/x86/ats.c
--- a/xen/drivers/passthrough/vtd/x86/ats.c	Wed Nov 02 13:53:05 2011 +0100
+++ b/xen/drivers/passthrough/vtd/x86/ats.c	Thu Nov 03 16:35:51 2011 +0100
@@ -27,51 +27,10 @@
 #include "../dmar.h"
 #include "../vtd.h"
 #include "../extern.h"
+#include "../../ats.h"
 
 static LIST_HEAD(ats_dev_drhd_units);
 
-#define ATS_REG_CAP    4
-#define ATS_REG_CTL    6
-#define ATS_QUEUE_DEPTH_MASK     0xF
-#define ATS_ENABLE               (1<<15)
-
-struct pci_ats_dev {
-    struct list_head list;
-    u16 seg;
-    u8 bus;
-    u8 devfn;
-    u16 ats_queue_depth;    /* ATS device invalidation queue depth */
-};
-static LIST_HEAD(ats_devices);
-
-static void parse_ats_param(char *s);
-custom_param("ats", parse_ats_param);
-
-bool_t __read_mostly ats_enabled = 1;
-
-static void __init parse_ats_param(char *s)
-{
-    char *ss;
-
-    do {
-        ss = strchr(s, ',');
-        if ( ss )
-            *ss = '\0';
-
-        switch ( parse_bool(s) )
-        {
-        case 0:
-            ats_enabled = 0;
-            break;
-        case 1:
-            ats_enabled = 1;
-            break;
-        }
-
-        s = ss + 1;
-    } while ( ss );
-}
-
 struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu)
 {
     struct acpi_drhd_unit *drhd;
@@ -113,97 +72,6 @@ int ats_device(const struct pci_dev *pde
     return pos;
 }
 
-int enable_ats_device(int seg, int bus, int devfn)
-{
-    struct pci_ats_dev *pdev = NULL;
-    u32 value;
-    int pos;
-
-    pos = pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
-    BUG_ON(!pos);
-
-    if ( iommu_verbose )
-        dprintk(XENLOG_INFO VTDPREFIX,
-                "%04x:%02x:%02x.%u: ATS capability found\n",
-                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
-
-    value = pci_conf_read16(seg, bus, PCI_SLOT(devfn),
-                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
-    if ( value & ATS_ENABLE )
-    {
-        list_for_each_entry ( pdev, &ats_devices, list )
-        {
-            if ( pdev->seg == seg && pdev->bus == bus && pdev->devfn == devfn )
-            {
-                pos = 0;
-                break;
-            }
-        }
-    }
-    if ( pos )
-        pdev = xmalloc(struct pci_ats_dev);
-    if ( !pdev )
-        return -ENOMEM;
-
-    if ( !(value & ATS_ENABLE) )
-    {
-        value |= ATS_ENABLE;
-        pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
-                         pos + ATS_REG_CTL, value);
-    }
-
-    if ( pos )
-    {
-        pdev->seg = seg;
-        pdev->bus = bus;
-        pdev->devfn = devfn;
-        value = pci_conf_read16(seg, bus, PCI_SLOT(devfn),
-                                PCI_FUNC(devfn), pos + ATS_REG_CAP);
-        pdev->ats_queue_depth = value & ATS_QUEUE_DEPTH_MASK;
-        list_add(&pdev->list, &ats_devices);
-    }
-
-    if ( iommu_verbose )
-        dprintk(XENLOG_INFO VTDPREFIX,
-                "%04x:%02x:%02x.%u: ATS %s enabled\n",
-                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
-                pos ? "is" : "was");
-
-    return pos;
-}
-
-void disable_ats_device(int seg, int bus, int devfn)
-{
-    struct pci_ats_dev *pdev;
-    u32 value;
-    int pos;
-
-    pos = pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
-    BUG_ON(!pos);
-
-    value = pci_conf_read16(seg, bus, PCI_SLOT(devfn),
-                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
-    value &= ~ATS_ENABLE;
-    pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
-                     pos + ATS_REG_CTL, value);
-
-    list_for_each_entry ( pdev, &ats_devices, list )
-    {
-        if ( pdev->seg == seg && pdev->bus == bus && pdev->devfn == devfn )
-        {
-            list_del(&pdev->list);
-            xfree(pdev);
-            break;
-        }
-    }
-
-    if ( iommu_verbose )
-        dprintk(XENLOG_INFO VTDPREFIX,
-                "%04x:%02x:%02x.%u: ATS is disabled\n",
-                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
-}
-
-
 static int device_in_domain(struct iommu *iommu, struct pci_ats_dev *pdev, u16 did)
 {
     struct root_entry *root_entry = NULL;
diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/x86/Makefile
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/drivers/passthrough/x86/Makefile	Thu Nov 03 16:35:51 2011 +0100
@@ -0,0 +1,1 @@
+obj-$(CONFIG_X86_64) += ats.o
diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/x86/ats.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/drivers/passthrough/x86/ats.c	Thu Nov 03 16:35:51 2011 +0100
@@ -0,0 +1,136 @@
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place - Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include <xen/sched.h>
+#include <xen/pci.h>
+#include <xen/pci_regs.h>
+#include "../ats.h"
+
+LIST_HEAD(ats_devices);
+
+static void parse_ats_param(char *s);
+custom_param("ats", parse_ats_param);
+
+bool_t __read_mostly ats_enabled = 1;
+
+static void __init parse_ats_param(char *s)
+{
+    char *ss;
+
+    do {
+        ss = strchr(s, ',');
+        if ( ss )
+            *ss = '\0';
+
+        switch ( parse_bool(s) )
+        {
+        case 0:
+            ats_enabled = 0;
+            break;
+        case 1:
+            ats_enabled = 1;
+            break;
+        }
+
+        s = ss + 1;
+    } while ( ss );
+}
+
+int enable_ats_device(int seg, int bus, int devfn)
+{
+    struct pci_ats_dev *pdev = NULL;
+    u32 value;
+    int pos;
+
+    pos = pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
+    BUG_ON(!pos);
+
+    if ( iommu_verbose )
+        dprintk(XENLOG_INFO, "%04x:%02x:%02x.%u: ATS capability found\n",
+                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
+
+    value = pci_conf_read16(seg, bus, PCI_SLOT(devfn),
+                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
+    if ( value & ATS_ENABLE )
+    {
+        list_for_each_entry ( pdev, &ats_devices, list )
+        {
+            if ( pdev->seg == seg && pdev->bus == bus && pdev->devfn == devfn )
+            {
+                pos = 0;
+                break;
+            }
+        }
+    }
+    if ( pos )
+        pdev = xmalloc(struct pci_ats_dev);
+    if ( !pdev )
+        return -ENOMEM;
+
+    if ( !(value & ATS_ENABLE) )
+    {
+        value |= ATS_ENABLE;
+        pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
+                         pos + ATS_REG_CTL, value);
+    }
+
+    if ( pos )
+    {
+        pdev->seg = seg;
+        pdev->bus = bus;
+        pdev->devfn = devfn;
+        value = pci_conf_read16(seg, bus, PCI_SLOT(devfn),
+                                PCI_FUNC(devfn), pos + ATS_REG_CAP);
+        pdev->ats_queue_depth = value & ATS_QUEUE_DEPTH_MASK;
+        list_add(&pdev->list, &ats_devices);
+    }
+
+    if ( iommu_verbose )
+        dprintk(XENLOG_INFO, "%04x:%02x:%02x.%u: ATS %s enabled\n",
+                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
+                pos ? "is" : "was");
+
+    return pos;
+}
+
+void disable_ats_device(int seg, int bus, int devfn)
+{
+    struct pci_ats_dev *pdev;
+    u32 value;
+    int pos;
+
+    pos = pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
+    BUG_ON(!pos);
+
+    value = pci_conf_read16(seg, bus, PCI_SLOT(devfn),
+                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
+    value &= ~ATS_ENABLE;
+    pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
+                     pos + ATS_REG_CTL, value);
+
+    list_for_each_entry ( pdev, &ats_devices, list )
+    {
+        if ( pdev->seg == seg && pdev->bus == bus && pdev->devfn == devfn )
+        {
+            list_del(&pdev->list);
+            xfree(pdev);
+            break;
+        }
+    }
+
+    if ( iommu_verbose )
+        dprintk(XENLOG_INFO, "%04x:%02x:%02x.%u: ATS is disabled\n",
+                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
+}


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 09:09:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 09:09:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLzrL-00050J-Gl; Thu, 03 Nov 2011 09:09:43 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLzgo-0003XB-JO
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 08:58:56 -0700
X-Env-Sender: imammedo@redhat.com
X-Msg-Ref: server-16.tower-182.messagelabs.com!1320335926!1836691!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10120 invoked from network); 3 Nov 2011 15:58:47 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-16.tower-182.messagelabs.com with SMTP;
	3 Nov 2011 15:58:47 -0000
Received: from int-mx02.intmail.prod.int.phx2.redhat.com
	(int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id pA3Fwhxl012788
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 3 Nov 2011 11:58:43 -0400
Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199])
	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id pA3Fwhb2007879; Thu, 3 Nov 2011 11:58:43 -0400
Received: from nial.usersys.redhat.com (vpn-10-197.rdu.redhat.com
	[10.11.10.197])
	by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id pA3FweRk009137;
	Thu, 3 Nov 2011 11:58:41 -0400
Message-ID: <4EB2BA30.1020307@redhat.com>
Date: Thu, 03 Nov 2011 16:58:40 +0100
From: Igor Mammedov <imammedo@redhat.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110927 Red Hat/3.1.15-1.el6_1 Lightning/1.0b2
	Thunderbird/3.1.15
MIME-Version: 1.0
To: Tim Deegan <tim@xen.org>
Subject: Re: [Xen-devel] xen-unstable fails to boot on a system with Ivy Bridge
	stepping C0 cpu
References: <4EB28CAD.2060401@redhat.com>
	<20111103131043.GB66800@ocelot.phlegethon.org>
In-Reply-To: <20111103131043.GB66800@ocelot.phlegethon.org>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
Cc: anthony.perard@citrix.com, jinsong.liu@intel.com,
	xen-devel@lists.xensource.com, Ian.Campbell@citrix.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/03/2011 02:10 PM, Tim Deegan wrote:
> At 13:44 +0100 on 03 Nov (1320327869), Igor Mammedov wrote:
>> Hi,
>>
>> I need a help with tracking down following issue:
>>
>> When trying to boot Xen on a system with Ivy Bridge stepping C0 CPU, it is
>> stuck on CPU initialization.
>> I've added some tracing to apic writes/reads and traced it so far to
>> sending INIT IPI.
>>
>> (XEN) HVM: VMX enabled
>> (XEN) HVM: Hardware Assisted Paging detected.
>> (XEN) Setting warm reset code and vector.
>> (XEN) apic_wrmsr (0x280,0x0)
>> (XEN) apic_rdmsr(0x280) = 0x0
>> (XEN) Asserting INIT.
>> (XEN) apic_wrmsr (0x300,0x10000c500)
>>
>> After this ^^^^ write BSP becomes VERY slow and it takes several minutes
>> till it gets to sending STARTUP IPI:
>
> Does reverting 23724:b3434f24b082 help?  Looking at it again I'm not
                  ^^^^^
reverting this c/s won't help, because the same problem exists in older xen
versions 3.x.x that doesn't have this c/s.
Actually I've tried rhel5, suse 4.1 and xen-unstable so far, all of them are
affected.

If we put printk right after sending INIT|ASSERT IPI it will show that BSP
is slowed down by printing 1 character in a several seconds. So deassert
probably is not of an issue here, since this happens on the first INIT to
the first AP.


> sure that the new logic is entirely correct - in particular it no longer
> deasserts the INIT on x2apic systems.
>
> Cheers,
>
> Tim.
>

-- 
Thanks,
  Igor

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 09:12:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 09:12:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLzto-0005Zs-Lr; Thu, 03 Nov 2011 09:12:16 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLzk9-00041F-9b
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 09:02:19 -0700
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1320336110!43227785!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15615 invoked from network); 3 Nov 2011 16:01:52 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 16:01:52 -0000
X-IronPort-AV: E=Sophos;i="4.69,450,1315195200"; d="scan'208";a="169291953"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	03 Nov 2011 12:02:12 -0400
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX02.citrite.net
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Thu, 3 Nov 2011
	12:02:12 -0400
Message-ID: <4EB2BB02.5030107@citrix.com>
Date: Thu, 3 Nov 2011 16:02:10 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 1/2] IRQ: allocate CPU masks	 dynamically
References: <4EB2B2B5020000780005EBDD@nat28.tlf.novell.com>
	<4EB2A9F5.1060800@citrix.com>
	<4EB2BE9E020000780005EC7F@nat28.tlf.novell.com>
	<4EB2B69A.5030007@citrix.com>
	<4EB2C688020000780005ECDF@nat28.tlf.novell.com>
In-Reply-To: <4EB2C688020000780005ECDF@nat28.tlf.novell.com>
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, "Keir
	\(Xen.org\)" <keir@xen.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 03/11/11 15:51, Jan Beulich wrote:
>>>> On 03.11.11 at 16:43, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
>> On 03/11/11 15:17, Jan Beulich wrote:
>>>>>> On 03.11.11 at 15:49, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
>>>> On 03/11/11 14:26, Jan Beulich wrote:
>>>>> IRQ: allocate CPU masks dynamically
>>>>>
>>>>> This includes delaying the initialization of dynamically created IRQs
>>>>> until their actual first use and some further elimination of uses of
>>>>> struct irq_cfg.
>>>>>
>>>>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>>>> Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
>>>>
>>>> One query which may or may not affect the patch.  Would we get better
>>>> caching characteristics if all cpumasks were allocated in consecutive
>>>> memory, rather than having 3 individual allocs in arch_init_one_irq_desc ?
>>> That was what the first version of the patch did, rejected by Keir
>>> (and not liked too much by me either).
>>>
>>> Jan
>> My understanding of the objection was hiding the variables themselves as
>> an array in the code.
>>
>> An alternative approach such as alloc'ing 3*sizeof(cpu mask) (cache
>> aligned) and assigning the relevant pointers to the current
>> cpumask_var_t's would be a suitable approach which causes the cpumasks
>> to be in contiguous memory, but not changing how they are referenced in
>> the code.
> That would mean just open-coding what the former patch did by
> abstraction. In my opinion that is even worse - either we want a
> generally usable mechanism to do this, or we don't do it at all.
>
> Jan

That is an interesting point, but I dont think it is worse.

There are very few cases where we want to be doing this, so open coding
is not too bad.  With a comment explaining why, I would have thought it
would be fine.

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 09:21:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 09:21:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM02H-0006je-4b; Thu, 03 Nov 2011 09:21:01 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLznp-0004RQ-76
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 09:06:20 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1320336335!47113919!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27424 invoked from network); 3 Nov 2011 16:05:36 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-4.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Nov 2011 16:05:36 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA3G5c9i026384
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 3 Nov 2011 16:05:39 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA3G5bgj008708
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 3 Nov 2011 16:05:37 GMT
Received: from abhmt113.oracle.com (abhmt113.oracle.com [141.146.116.65])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA3G5VBn014117; Thu, 3 Nov 2011 11:05:31 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 03 Nov 2011 09:05:31 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id D9B9F81499; Thu,  3 Nov 2011 12:05:17 -0400 (EDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 76391f599433544ecf3f606e9d4997967d5d6cd4
Message-Id: <76391f599433544ecf3f.1320336263@phenom.dumpdata.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Thu, 03 Nov 2011 12:04:23 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, Ian.Jackson@eu.citrix.com,
	Ian.Campbell@citrix.com, m.a.young@durham.ac.uk
Status: RO
Lines: 61
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090208.4EB2BBD4.0018,ss=1,re=0.000,fgs=0
Cc: 
Subject: [Xen-devel] [PATCH] BZ 1680: Xend fails to start if
 /var/lib/xend/state/*.xml are empty
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
# Date 1320336164 14400
# Node ID 76391f599433544ecf3f606e9d4997967d5d6cd4
# Parent  54a5e994a241a506900ee0e197bb42e5f1d8e759
BZ 1680: Xend fails to start if /var/lib/xend/state/*.xml are empty

which I get often when replacing the Xen hypervisor with a newer version.

This can be easily be reproduced under Fedora Core 16 by installing
xen RPMs and then replacing the xen.gz with a newer version.

/var/log/xen/xend.log reports:

[2011-11-03 09:45:55 1368] ERROR (SrvDaemon:356) Exception starting xend (no element found: line 1, column 0)
Traceback (most recent call last):
  File "/usr/lib64/python2.7/site-packages/xen/xend/server/SrvDaemon.py", line 348, in run
    servers = SrvServer.create()
  File "/usr/lib64/python2.7/site-packages/xen/xend/server/SrvServer.py", line 258, in create
    root.putChild('xend', SrvRoot())
  File "/usr/lib64/python2.7/site-packages/xen/xend/server/SrvRoot.py", line 40, in __init__
    self.get(name)
  File "/usr/lib64/python2.7/site-packages/xen/web/SrvDir.py", line 84, in get
    val = val.getobj()
  File "/usr/lib64/python2.7/site-packages/xen/web/SrvDir.py", line 52, in getobj
    self.obj = klassobj()
  File "/usr/lib64/python2.7/site-packages/xen/xend/server/SrvNode.py", line 30, in __init__
    self.xn = XendNode.instance()
  File "/usr/lib64/python2.7/site-packages/xen/xend/XendNode.py", line 1181, in instance
    inst = XendNode()
  File "/usr/lib64/python2.7/site-packages/xen/xend/XendNode.py", line 71, in __init__
    saved_host = self.state_store.load_state('host')
  File "/usr/lib64/python2.7/site-packages/xen/xend/XendStateStore.py", line 104, in load_state
    dom = minidom.parse(xml_path)
  File "/usr/lib64/python2.7/site-packages/_xmlplus/dom/minidom.py", line 1915, in parse
    return expatbuilder.parse(file)
  File "/usr/lib64/python2.7/site-packages/_xmlplus/dom/expatbuilder.py", line 926, in parse
    result = builder.parseFile(fp)
  File "/usr/lib64/python2.7/site-packages/_xmlplus/dom/expatbuilder.py", line 211, in parseFile
    parser.Parse("", True)
ExpatError: no element found: line 1, column 0

And with this patch, the problem disappears

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: Anthony Low <shinji@pikopiko.org>

diff -r 54a5e994a241 -r 76391f599433 tools/python/xen/xend/XendStateStore.py
--- a/tools/python/xen/xend/XendStateStore.py	Wed Nov 02 17:09:09 2011 +0000
+++ b/tools/python/xen/xend/XendStateStore.py	Thu Nov 03 12:02:44 2011 -0400
@@ -101,6 +101,9 @@ class XendStateStore:
         if not os.path.exists(xml_path):
             return {}
 
+        if not os.path.getsize(xml_path) == 0:
+            return {}
+
         dom = minidom.parse(xml_path)
         root = dom.documentElement
         state = {}



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 09:26:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 09:26:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM07Z-0007C2-7F; Thu, 03 Nov 2011 09:26:29 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLzur-0005lE-H1
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 09:13:21 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1320336798!1843816!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30220 invoked from network); 3 Nov 2011 16:13:18 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-8.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 16:13:18 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 03 Nov 2011 16:13:18 +0000
Message-Id: <4EB2CBAC020000780005ED0E@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 03 Nov 2011 16:13:16 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Andrew Cooper" <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] [PATCH 1/2] IRQ: allocate CPU masks
	 dynamically
References: <4EB2B2B5020000780005EBDD@nat28.tlf.novell.com>
	<4EB2A9F5.1060800@citrix.com>
	<4EB2BE9E020000780005EC7F@nat28.tlf.novell.com>
	<4EB2B69A.5030007@citrix.com>
	<4EB2C688020000780005ECDF@nat28.tlf.novell.com>
	<4EB2BB02.5030107@citrix.com>
In-Reply-To: <4EB2BB02.5030107@citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Keir\(Xen.org\)" <keir@xen.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 03.11.11 at 17:02, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
> On 03/11/11 15:51, Jan Beulich wrote:
>>>>> On 03.11.11 at 16:43, Andrew Cooper <andrew.cooper3@citrix.com> =
wrote:
>>> On 03/11/11 15:17, Jan Beulich wrote:
>>>>>>> On 03.11.11 at 15:49, Andrew Cooper <andrew.cooper3@citrix.com> =
wrote:
>>>>> On 03/11/11 14:26, Jan Beulich wrote:
>>>>>> IRQ: allocate CPU masks dynamically
>>>>>>
>>>>>> This includes delaying the initialization of dynamically created =
IRQs
>>>>>> until their actual first use and some further elimination of uses =
of
>>>>>> struct irq_cfg.
>>>>>>
>>>>>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>>>>> Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
>>>>>
>>>>> One query which may or may not affect the patch.  Would we get =
better
>>>>> caching characteristics if all cpumasks were allocated in consecutive=

>>>>> memory, rather than having 3 individual allocs in arch_init_one_irq_d=
esc ?
>>>> That was what the first version of the patch did, rejected by Keir
>>>> (and not liked too much by me either).
>>>>
>>>> Jan
>>> My understanding of the objection was hiding the variables themselves =
as
>>> an array in the code.
>>>
>>> An alternative approach such as alloc'ing 3*sizeof(cpu mask) (cache
>>> aligned) and assigning the relevant pointers to the current
>>> cpumask_var_t's would be a suitable approach which causes the cpumasks
>>> to be in contiguous memory, but not changing how they are referenced =
in
>>> the code.
>> That would mean just open-coding what the former patch did by
>> abstraction. In my opinion that is even worse - either we want a
>> generally usable mechanism to do this, or we don't do it at all.
>>
>> Jan
>=20
> That is an interesting point, but I dont think it is worse.
>=20
> There are very few cases where we want to be doing this, so open coding
> is not too bad.  With a comment explaining why, I would have thought it
> would be fine.

This isn't how I think maintainable code should be written - whenever
we'd adjust the CPU mask allocation mechanism in some way, we'd
have to touch that code separately. Depending on the nature of the
change, it may even get overlooked (i.e. when no build failure results).

Just consider how ugly it would be if there were no
{,z}alloc_cpumask_var() wrappers (which already did change from their
original version in that we're now able to allocate just the portion that
we know will actually get used).

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 09:28:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 09:28:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM09g-0007bs-VI; Thu, 03 Nov 2011 09:28:41 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RM01B-0006bZ-9E
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 09:20:00 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1320337190!1852694!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6455 invoked from network); 3 Nov 2011 16:19:50 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-3.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 16:19:50 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 03 Nov 2011 16:19:50 +0000
Message-Id: <4EB2CD33020000780005ED24@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 03 Nov 2011 16:19:47 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Wang" <wei.wang2@amd.com>
Subject: Re: [Xen-devel] [PATCH 2 of 5] amd iommu: Fix iommu page size
	encoding when page order > 0
References: <patchbomb.1320335327@gran.amd.com>
	<1bf06c8d2c70e9af610e.1320335329@gran.amd.com>
In-Reply-To: <1bf06c8d2c70e9af610e.1320335329@gran.amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 03.11.11 at 16:48, Wei Wang <wei.wang2@amd.com> wrote:
> # HG changeset patch
> # User Wei Wang <wei.wang2@amd.com>
> # Date 1320334553 -3600
> # Node ID 1bf06c8d2c70e9af610e12a7592c466a799b0de1
> # Parent  ef46c471a11f83d07e256ad2e0b868828f45ef63
> amd iommu: Fix iommu page size encoding when page order > 0.
> Fix io address in invalid all pages command.
>=20
> Signed-off-by: Wei Wang <wei.wang2@amd.com>
>=20
> diff -r ef46c471a11f -r 1bf06c8d2c70 xen/drivers/passthrough/amd/iommu_ma=
p.c
> --- a/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 16:35:51 2011 =
+0100
> +++ b/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 16:35:53 2011 =
+0100
> @@ -77,23 +77,24 @@ static void invalidate_iommu_pages(struc
>  {
>      u64 addr_lo, addr_hi;
>      u32 cmd[4], entry;
> -    u64 mask =3D 0;
>      int sflag =3D 0, pde =3D 0;
> =20
> +    ASSERT ( order =3D=3D 0 || order =3D=3D 9 || order =3D=3D 18 );
> +
> +    /* All pages associated with the domainID are invalidated */
> +    if ( order || (io_addr =3D=3D INV_IOMMU_ALL_PAGES_ADDRESS ) )
> +    {
> +        sflag =3D 1;
> +        pde =3D 1;
> +    }
> +
>      /* If sflag =3D=3D 1, the size of the invalidate command is =
determined
>       by the first zero bit in the address starting from Address[12] */
> -    if ( order =3D=3D 9 || order =3D=3D 18 )
> +    if ( order )
>      {
> -        mask =3D ((1ULL << (order - 1)) - 1) << PAGE_SHIFT;
> -        io_addr |=3D mask;
> -        sflag =3D 1;
> -    }
> -
> -    /* All pages associated with the domainID are invalidated */
> -    else if ( io_addr =3D=3D 0x7FFFFFFFFFFFF000ULL )
> -    {
> -        sflag =3D 1;
> -        pde =3D 1;
> +        u64 mask =3D 1ULL << (order - 1 + PAGE_SHIFT);
> +        io_addr &=3D ~mask;
> +        io_addr |=3D mask - 1;
>      }
> =20
>      addr_lo =3D io_addr & DMA_32BIT_MASK;
> @@ -917,7 +918,7 @@ static void _amd_iommu_flush_pages(struc
> =20
>  void amd_iommu_flush_all_pages(struct domain *d)
>  {
> -    _amd_iommu_flush_pages(d, 0x7FFFFFFFFFFFFULL, 0);
> +    _amd_iommu_flush_pages(d, INV_IOMMU_ALL_PAGES_ADDRESS, 0);
>  }
> =20
>  void amd_iommu_flush_pages(struct domain *d,
> diff -r ef46c471a11f -r 1bf06c8d2c70 xen/include/asm-x86/hvm/svm/amd-iomm=
u-defs.h
> --- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 =
16:35:51 2011 +0100
> +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 =
16:35:53 2011=20
> +0100
> @@ -407,4 +407,6 @@
>  #define INT_REMAP_ENTRY_VECTOR_MASK     0x00FF0000
>  #define INT_REMAP_ENTRY_VECTOR_SHIFT    16
> =20
> +#define INV_IOMMU_ALL_PAGES_ADDRESS      (1ULL << 63) - 1

Please parenthesize this properly.

> +
>  #endif /* _ASM_X86_64_AMD_IOMMU_DEFS_H */
>=20
>=20
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com=20
> http://lists.xensource.com/xen-devel=20




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 09:30:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 09:30:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM0BV-00080C-D3; Thu, 03 Nov 2011 09:30:33 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RM02e-0006mZ-Bh
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 09:21:30 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1320337280!1841577!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10598 invoked from network); 3 Nov 2011 16:21:21 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-11.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 16:21:21 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 03 Nov 2011 16:21:20 +0000
Message-Id: <4EB2CD8E020000780005ED31@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 03 Nov 2011 16:21:18 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Wang" <wei.wang2@amd.com>
Subject: Re: [Xen-devel] [PATCH 1 of 5] ats: Move some ats functions to
	a new directory
References: <patchbomb.1320335327@gran.amd.com>
	<ef46c471a11f83d07e25.1320335328@gran.amd.com>
In-Reply-To: <ef46c471a11f83d07e25.1320335328@gran.amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 03.11.11 at 16:48, Wei Wang <wei.wang2@amd.com> wrote:
> # HG changeset patch
> # User Wei Wang <wei.wang2@amd.com>
> # Date 1320334551 -3600
> # Node ID ef46c471a11f83d07e256ad2e0b868828f45ef63
> # Parent  119bccb1cc5eee1364bbbd3bd1a30f22e9db703a
> ats: Move some ats functions to a new directory.
> Remove VTD prefix from debug output.
> passhrough/x86 holds vendor neutral codes for x86 architecture.
>=20
> Signed-off-by: Wei Wang <wei.wang2@amd.com>

Acked-by: Jan Beulich <jbeulich@suse.com>

>=20
> diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/Makefile
> --- a/xen/drivers/passthrough/Makefile	Wed Nov 02 13:53:05 2011 =
+0100
> +++ b/xen/drivers/passthrough/Makefile	Thu Nov 03 16:35:51 2011 =
+0100
> @@ -1,6 +1,7 @@
>  subdir-$(x86) +=3D vtd
>  subdir-$(ia64) +=3D vtd
>  subdir-$(x86) +=3D amd
> +subdir-$(x86_64) +=3D x86
> =20
>  obj-y +=3D iommu.o
>  obj-y +=3D io.o
> diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/ats.h
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/xen/drivers/passthrough/ats.h	Thu Nov 03 16:35:51 2011 +0100
> @@ -0,0 +1,56 @@
> +/*
> + * This program is free software; you can redistribute it and/or modify =
it
> + * under the terms and conditions of the GNU General Public License,
> + * version 2, as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope it will be useful, but =
WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY =
or
> + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public =
License=20
> for
> + * more details.
> + *
> + * You should have received a copy of the GNU General Public License =
along=20
> with
> + * this program; if not, write to the Free Software Foundation, Inc., =
59=20
> Temple
> + * Place - Suite 330, Boston, MA 02111-1307 USA.
> + */
> +
> +#ifndef _ATS_H_
> +#define _ATS_H_
> +
> +struct pci_ats_dev {
> +    struct list_head list;
> +    u16 seg;
> +    u8 bus;
> +    u8 devfn;
> +    u16 ats_queue_depth;    /* ATS device invalidation queue depth */
> +};
> +
> +#ifdef CONFIG_X86_64
> +
> +#define ATS_REG_CAP    4
> +#define ATS_REG_CTL    6
> +#define ATS_QUEUE_DEPTH_MASK     0xF
> +#define ATS_ENABLE               (1<<15)
> +
> +extern struct list_head ats_devices;
> +extern bool_t ats_enabled;
> +
> +int enable_ats_device(int seg, int bus, int devfn);
> +void disable_ats_device(int seg, int bus, int devfn);
> +
> +#else
> +
> +#define ats_enabled 0
> +static inline int enable_ats_device(int seg, int bus, int devfn)
> +{
> +    BUG();
> +    return -ENOSYS;
> +}
> +
> +static inline void disable_ats_device(int seg, int bus, int devfn)
> +{
> +    BUG();
> +}
> +#endif
> +
> +#endif /* _ATS_H_ */
> +
> diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/vtd/extern.h=

> --- a/xen/drivers/passthrough/vtd/extern.h	Wed Nov 02 13:53:05 2011 =
+0100
> +++ b/xen/drivers/passthrough/vtd/extern.h	Thu Nov 03 16:35:51 2011 =
+0100
> @@ -57,18 +57,13 @@ struct acpi_drhd_unit * iommu_to_drhd(st
>  struct acpi_rhsa_unit * drhd_to_rhsa(struct acpi_drhd_unit *drhd);
> =20
>  #ifdef CONFIG_X86_64
> -extern bool_t ats_enabled;
> -
>  struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu);
> =20
>  int ats_device(const struct pci_dev *, const struct acpi_drhd_unit *);
> -int enable_ats_device(int seg, int bus, int devfn);
> -void disable_ats_device(int seg, int bus, int devfn);
> =20
>  int dev_invalidate_iotlb(struct iommu *iommu, u16 did,
>                           u64 addr, unsigned int size_order, u64 type);
>  #else
> -#define ats_enabled 0
> =20
>  static inline struct acpi_drhd_unit *find_ats_dev_drhd(struct iommu =
*iommu)
>  {
> @@ -80,15 +75,6 @@ static inline int ats_device(const struc
>  {
>      return 0;
>  }
> -static inline int enable_ats_device(int seg, int bus, int devfn)
> -{
> -    BUG();
> -    return -ENOSYS;
> -}
> -static inline void disable_ats_device(int seg, int bus, int devfn)
> -{
> -    BUG();
> -}
> =20
>  static inline int dev_invalidate_iotlb(struct iommu *iommu, u16 did, =
u64=20
> addr,
>                                         unsigned int size_order, u64 =
type)
> diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/vtd/iommu.c
> --- a/xen/drivers/passthrough/vtd/iommu.c	Wed Nov 02 13:53:05 2011 =
+0100
> +++ b/xen/drivers/passthrough/vtd/iommu.c	Thu Nov 03 16:35:51 2011 =
+0100
> @@ -40,6 +40,7 @@
>  #include "dmar.h"
>  #include "extern.h"
>  #include "vtd.h"
> +#include "../ats.h"
> =20
>  #ifdef __ia64__
>  #define nr_ioapics              iosapic_get_nr_iosapics()
> diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/vtd/x86/ats.=
c
> --- a/xen/drivers/passthrough/vtd/x86/ats.c	Wed Nov 02 13:53:05 2011 =
+0100
> +++ b/xen/drivers/passthrough/vtd/x86/ats.c	Thu Nov 03 16:35:51 2011 =
+0100
> @@ -27,51 +27,10 @@
>  #include "../dmar.h"
>  #include "../vtd.h"
>  #include "../extern.h"
> +#include "../../ats.h"
> =20
>  static LIST_HEAD(ats_dev_drhd_units);
> =20
> -#define ATS_REG_CAP    4
> -#define ATS_REG_CTL    6
> -#define ATS_QUEUE_DEPTH_MASK     0xF
> -#define ATS_ENABLE               (1<<15)
> -
> -struct pci_ats_dev {
> -    struct list_head list;
> -    u16 seg;
> -    u8 bus;
> -    u8 devfn;
> -    u16 ats_queue_depth;    /* ATS device invalidation queue depth */
> -};
> -static LIST_HEAD(ats_devices);
> -
> -static void parse_ats_param(char *s);
> -custom_param("ats", parse_ats_param);
> -
> -bool_t __read_mostly ats_enabled =3D 1;
> -
> -static void __init parse_ats_param(char *s)
> -{
> -    char *ss;
> -
> -    do {
> -        ss =3D strchr(s, ',');
> -        if ( ss )
> -            *ss =3D '\0';
> -
> -        switch ( parse_bool(s) )
> -        {
> -        case 0:
> -            ats_enabled =3D 0;
> -            break;
> -        case 1:
> -            ats_enabled =3D 1;
> -            break;
> -        }
> -
> -        s =3D ss + 1;
> -    } while ( ss );
> -}
> -
>  struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu)
>  {
>      struct acpi_drhd_unit *drhd;
> @@ -113,97 +72,6 @@ int ats_device(const struct pci_dev *pde
>      return pos;
>  }
> =20
> -int enable_ats_device(int seg, int bus, int devfn)
> -{
> -    struct pci_ats_dev *pdev =3D NULL;
> -    u32 value;
> -    int pos;
> -
> -    pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS)=
;
> -    BUG_ON(!pos);
> -
> -    if ( iommu_verbose )
> -        dprintk(XENLOG_INFO VTDPREFIX,
> -                "%04x:%02x:%02x.%u: ATS capability found\n",
> -                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
> -
> -    value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> -                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
> -    if ( value & ATS_ENABLE )
> -    {
> -        list_for_each_entry ( pdev, &ats_devices, list )
> -        {
> -            if ( pdev->seg =3D=3D seg && pdev->bus =3D=3D bus && =
pdev->devfn =3D=3D devfn )
> -            {
> -                pos =3D 0;
> -                break;
> -            }
> -        }
> -    }
> -    if ( pos )
> -        pdev =3D xmalloc(struct pci_ats_dev);
> -    if ( !pdev )
> -        return -ENOMEM;
> -
> -    if ( !(value & ATS_ENABLE) )
> -    {
> -        value |=3D ATS_ENABLE;
> -        pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> -                         pos + ATS_REG_CTL, value);
> -    }
> -
> -    if ( pos )
> -    {
> -        pdev->seg =3D seg;
> -        pdev->bus =3D bus;
> -        pdev->devfn =3D devfn;
> -        value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> -                                PCI_FUNC(devfn), pos + ATS_REG_CAP);
> -        pdev->ats_queue_depth =3D value & ATS_QUEUE_DEPTH_MASK;
> -        list_add(&pdev->list, &ats_devices);
> -    }
> -
> -    if ( iommu_verbose )
> -        dprintk(XENLOG_INFO VTDPREFIX,
> -                "%04x:%02x:%02x.%u: ATS %s enabled\n",
> -                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> -                pos ? "is" : "was");
> -
> -    return pos;
> -}
> -
> -void disable_ats_device(int seg, int bus, int devfn)
> -{
> -    struct pci_ats_dev *pdev;
> -    u32 value;
> -    int pos;
> -
> -    pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS)=
;
> -    BUG_ON(!pos);
> -
> -    value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> -                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
> -    value &=3D ~ATS_ENABLE;
> -    pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> -                     pos + ATS_REG_CTL, value);
> -
> -    list_for_each_entry ( pdev, &ats_devices, list )
> -    {
> -        if ( pdev->seg =3D=3D seg && pdev->bus =3D=3D bus && pdev->devfn=
 =3D=3D devfn )
> -        {
> -            list_del(&pdev->list);
> -            xfree(pdev);
> -            break;
> -        }
> -    }
> -
> -    if ( iommu_verbose )
> -        dprintk(XENLOG_INFO VTDPREFIX,
> -                "%04x:%02x:%02x.%u: ATS is disabled\n",
> -                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
> -}
> -
> -
>  static int device_in_domain(struct iommu *iommu, struct pci_ats_dev =
*pdev,=20
> u16 did)
>  {
>      struct root_entry *root_entry =3D NULL;
> diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/x86/Makefile=

> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/xen/drivers/passthrough/x86/Makefile	Thu Nov 03 16:35:51 2011 =
+0100
> @@ -0,0 +1,1 @@
> +obj-$(CONFIG_X86_64) +=3D ats.o
> diff -r 119bccb1cc5e -r ef46c471a11f xen/drivers/passthrough/x86/ats.c
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/xen/drivers/passthrough/x86/ats.c	Thu Nov 03 16:35:51 2011 =
+0100
> @@ -0,0 +1,136 @@
> +/*
> + * This program is free software; you can redistribute it and/or modify =
it
> + * under the terms and conditions of the GNU General Public License,
> + * version 2, as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope it will be useful, but =
WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY =
or
> + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public =
License=20
> for
> + * more details.
> + *
> + * You should have received a copy of the GNU General Public License =
along=20
> with
> + * this program; if not, write to the Free Software Foundation, Inc., =
59=20
> Temple
> + * Place - Suite 330, Boston, MA 02111-1307 USA.
> + */
> +
> +#include <xen/sched.h>
> +#include <xen/pci.h>
> +#include <xen/pci_regs.h>
> +#include "../ats.h"
> +
> +LIST_HEAD(ats_devices);
> +
> +static void parse_ats_param(char *s);
> +custom_param("ats", parse_ats_param);
> +
> +bool_t __read_mostly ats_enabled =3D 1;
> +
> +static void __init parse_ats_param(char *s)
> +{
> +    char *ss;
> +
> +    do {
> +        ss =3D strchr(s, ',');
> +        if ( ss )
> +            *ss =3D '\0';
> +
> +        switch ( parse_bool(s) )
> +        {
> +        case 0:
> +            ats_enabled =3D 0;
> +            break;
> +        case 1:
> +            ats_enabled =3D 1;
> +            break;
> +        }
> +
> +        s =3D ss + 1;
> +    } while ( ss );
> +}
> +
> +int enable_ats_device(int seg, int bus, int devfn)
> +{
> +    struct pci_ats_dev *pdev =3D NULL;
> +    u32 value;
> +    int pos;
> +
> +    pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS)=
;
> +    BUG_ON(!pos);
> +
> +    if ( iommu_verbose )
> +        dprintk(XENLOG_INFO, "%04x:%02x:%02x.%u: ATS capability =
found\n",
> +                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
> +
> +    value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> +                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
> +    if ( value & ATS_ENABLE )
> +    {
> +        list_for_each_entry ( pdev, &ats_devices, list )
> +        {
> +            if ( pdev->seg =3D=3D seg && pdev->bus =3D=3D bus && =
pdev->devfn =3D=3D devfn )
> +            {
> +                pos =3D 0;
> +                break;
> +            }
> +        }
> +    }
> +    if ( pos )
> +        pdev =3D xmalloc(struct pci_ats_dev);
> +    if ( !pdev )
> +        return -ENOMEM;
> +
> +    if ( !(value & ATS_ENABLE) )
> +    {
> +        value |=3D ATS_ENABLE;
> +        pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> +                         pos + ATS_REG_CTL, value);
> +    }
> +
> +    if ( pos )
> +    {
> +        pdev->seg =3D seg;
> +        pdev->bus =3D bus;
> +        pdev->devfn =3D devfn;
> +        value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> +                                PCI_FUNC(devfn), pos + ATS_REG_CAP);
> +        pdev->ats_queue_depth =3D value & ATS_QUEUE_DEPTH_MASK;
> +        list_add(&pdev->list, &ats_devices);
> +    }
> +
> +    if ( iommu_verbose )
> +        dprintk(XENLOG_INFO, "%04x:%02x:%02x.%u: ATS %s enabled\n",
> +                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> +                pos ? "is" : "was");
> +
> +    return pos;
> +}
> +
> +void disable_ats_device(int seg, int bus, int devfn)
> +{
> +    struct pci_ats_dev *pdev;
> +    u32 value;
> +    int pos;
> +
> +    pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS)=
;
> +    BUG_ON(!pos);
> +
> +    value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> +                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
> +    value &=3D ~ATS_ENABLE;
> +    pci_conf_write16(seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> +                     pos + ATS_REG_CTL, value);
> +
> +    list_for_each_entry ( pdev, &ats_devices, list )
> +    {
> +        if ( pdev->seg =3D=3D seg && pdev->bus =3D=3D bus && pdev->devfn=
 =3D=3D devfn )
> +        {
> +            list_del(&pdev->list);
> +            xfree(pdev);
> +            break;
> +        }
> +    }
> +
> +    if ( iommu_verbose )
> +        dprintk(XENLOG_INFO, "%04x:%02x:%02x.%u: ATS is disabled\n",
> +                seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
> +}
>=20
>=20
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com=20
> http://lists.xensource.com/xen-devel=20



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 09:32:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 09:32:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM0DF-0008OQ-AJ; Thu, 03 Nov 2011 09:32:21 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RM03P-0006sL-Pg
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 09:22:18 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1320337328!1841681!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13174 invoked from network); 3 Nov 2011 16:22:08 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-11.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 16:22:08 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 03 Nov 2011 16:22:08 +0000
Message-Id: <4EB2CDBD020000780005ED34@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 03 Nov 2011 16:22:05 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Wang" <wei.wang2@amd.com>
Subject: Re: [Xen-devel] [PATCH 3 of 5] ats: Add new ATS helper
	 functions
References: <patchbomb.1320335327@gran.amd.com>
	<f1b4373838dd5e082755.1320335330@gran.amd.com>
In-Reply-To: <f1b4373838dd5e082755.1320335330@gran.amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 03.11.11 at 16:48, Wei Wang <wei.wang2@amd.com> wrote:
> # HG changeset patch
> # User Wei Wang <wei.wang2@amd.com>
> # Date 1320334760 -3600
> # Node ID f1b4373838dd5e082755201745f87654e2eaa59f
> # Parent  1bf06c8d2c70e9af610e12a7592c466a799b0de1
> ats: Add new ATS helper functions
>=20
> Signed-off-by Wei Wang <wei.wang2@amd.com>

Acked-by: Jan Beulich <jbeulich@suse.com>

>=20
> diff -r 1bf06c8d2c70 -r f1b4373838dd xen/drivers/passthrough/ats.h
> --- a/xen/drivers/passthrough/ats.h	Thu Nov 03 16:35:53 2011 +0100
> +++ b/xen/drivers/passthrough/ats.h	Thu Nov 03 16:39:20 2011 +0100
> @@ -16,6 +16,8 @@
>  #ifndef _ATS_H_
>  #define _ATS_H_
> =20
> +#include <xen/pci_regs.h>
> +
>  struct pci_ats_dev {
>      struct list_head list;
>      u16 seg;
> @@ -36,6 +38,28 @@ extern bool_t ats_enabled;
> =20
>  int enable_ats_device(int seg, int bus, int devfn);
>  void disable_ats_device(int seg, int bus, int devfn);
> +struct pci_ats_dev *get_ats_device(int seg, int bus, int devfn);
> +
> +static inline int pci_ats_enabled(int seg, int bus, int devfn)
> +{
> +    u32 value;
> +    int pos;
> +
> +    pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS)=
;
> +    BUG_ON(!pos);
> +
> +    value =3D pci_conf_read16(seg, bus, PCI_SLOT(devfn),
> +                            PCI_FUNC(devfn), pos + ATS_REG_CTL);
> +    return value & ATS_ENABLE;
> +}
> +
> +static inline int pci_ats_device(int seg, int bus, int devfn)
> +{
> +    if ( !ats_enabled )
> +        return 0;
> +
> +    return pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);=

> +}
> =20
>  #else
> =20
> @@ -50,6 +74,22 @@ static inline void disable_ats_device(in
>  {
>      BUG();
>  }
> +
> +static inline int pci_ats_enabled(int seg, int bus, int devfn)
> +{
> +    return 0;
> +}
> +
> +static inline int pci_ats_device(int seg, int bus, int devfn)
> +{
> +    return 0;
> +}
> +
> +static inline struct pci_ats_dev *get_ats_device(int seg, int bus, =
int=20
> devfn)
> +{
> +    return NULL;
> +}
> +
>  #endif
> =20
>  #endif /* _ATS_H_ */
> diff -r 1bf06c8d2c70 -r f1b4373838dd xen/drivers/passthrough/x86/ats.c
> --- a/xen/drivers/passthrough/x86/ats.c	Thu Nov 03 16:35:53 2011 =
+0100
> +++ b/xen/drivers/passthrough/x86/ats.c	Thu Nov 03 16:39:20 2011 =
+0100
> @@ -134,3 +134,19 @@ void disable_ats_device(int seg, int bus
>          dprintk(XENLOG_INFO, "%04x:%02x:%02x.%u: ATS is disabled\n",
>                  seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
>  }
> +
> +struct pci_ats_dev *get_ats_device(int seg, int bus, int devfn)
> +{
> +    struct pci_ats_dev *pdev;
> +
> +    if ( !pci_ats_device(seg, bus, devfn) )
> +        return NULL;
> +
> +    list_for_each_entry ( pdev, &ats_devices, list )
> +    {
> +        if ( pdev->seg =3D=3D seg && pdev->bus =3D=3D bus && pdev->devfn=
 =3D=3D devfn )
> +            return pdev;
> +    }
> +
> +    return NULL;
> +}
>=20
>=20
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com=20
> http://lists.xensource.com/xen-devel=20




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 09:48:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 09:48:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM0SU-0000j2-4o; Thu, 03 Nov 2011 09:48:06 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RM0Ri-0000V8-1m
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 09:47:18 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-16.tower-174.messagelabs.com!1320338833!196925!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22872 invoked from network); 3 Nov 2011 16:47:14 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-16.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	3 Nov 2011 16:47:14 -0000
Received: from saboo.goop.org (c-50-131-57-2.hsd1.ca.comcast.net [50.131.57.2])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 622F794DC;
	Thu,  3 Nov 2011 09:47:12 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id F133A2111B;
	Thu,  3 Nov 2011 09:47:13 -0700 (PDT)
Message-ID: <4EB2C591.6070202@goop.org>
Date: Thu, 03 Nov 2011 09:47:13 -0700
From: Jeremy Fitzhardinge <jeremy@goop.org>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: Ben Guthro <ben@guthro.net>
Subject: Re: [Xen-devel] [PATCH 0/3] x86/microcode: support for microcode
	update in Xen dom0
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<CAOvdn6VfZ524ku2DBMfmTV+dHGXrSV8Ls_iwHdm=ESXO9kUjcg@mail.gmail.com>
In-Reply-To: <CAOvdn6VfZ524ku2DBMfmTV+dHGXrSV8Ls_iwHdm=ESXO9kUjcg@mail.gmail.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	"H. Peter Anvin" <hpa@zytor.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/03/2011 08:06 AM, Ben Guthro wrote:
> After pulling in this change from your tree, I found the following
> bug, when checking an enum value, which should be considered before
> inclusion:
>
>
> diff --git a/arch/x86/kernel/microcode_xen.c
> b/arch/x86/kernel/microcode_xen.c
> index 9d2a06b..6a73957 100644
> --- a/arch/x86/kernel/microcode_xen.c
> +++ b/arch/x86/kernel/microcode_xen.c
> @@ -157,7 +157,7 @@ static enum ucode_state
> xen_request_microcode_user(int cpu,
>  ret = UCODE_OK;
>  
>  out:
> -if (ret == 0)
> +if (ret == UCODE_OK)
>  uci->mc = uc;
>  else
>  vfree(uc);

Thanks!

    J


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 09:51:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 09:51:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM0W6-00019V-9Y; Thu, 03 Nov 2011 09:51:50 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RM0VZ-0000xe-Iz
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 09:51:18 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1320339072!1263908!1
X-Originating-IP: [65.55.88.12]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26742 invoked from network); 3 Nov 2011 16:51:14 -0000
Received: from tx2ehsobe002.messaging.microsoft.com (HELO
	TX2EHSOBE003.bigfish.com) (65.55.88.12)
	by server-5.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	3 Nov 2011 16:51:14 -0000
Received: from mail124-tx2-R.bigfish.com (10.9.14.249) by
	TX2EHSOBE003.bigfish.com (10.9.40.23) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 16:50:56 +0000
Received: from mail124-tx2 (localhost.localdomain [127.0.0.1])	by
	mail124-tx2-R.bigfish.com (Postfix) with ESMTP id 90AA810C046A;
	Thu,  3 Nov 2011 16:51:05 +0000 (UTC)
X-SpamScore: -12
X-BigFish: VPS-12(zzc85dh1432N98dK4015Lzz1202hzz8275bhz32i668h839h34h61h)
X-Spam-TCS-SCL: 0:0
X-Forefront-Antispam-Report: CIP:163.181.249.108; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp01.amd.com; RD:none; EFVD:NLI
Received: from mail124-tx2 (localhost.localdomain [127.0.0.1]) by mail124-tx2
	(MessageSwitch) id 1320339064561157_26799;
	Thu,  3 Nov 2011 16:51:04 +0000 (UTC)
Received: from TX2EHSMHS014.bigfish.com (unknown [10.9.14.253])	by
	mail124-tx2.bigfish.com (Postfix) with ESMTP id 83D2EDC804B;
	Thu,  3 Nov 2011 16:51:04 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	TX2EHSMHS014.bigfish.com (10.9.99.114) with Microsoft SMTP Server id
	14.1.225.22; Thu, 3 Nov 2011 16:50:50 +0000
X-WSS-ID: 0LU3G52-01-IKF-02
X-M-MSG: 
Received: from sausexedgep01.amd.com (sausexedgep01-ext.amd.com
	[163.181.249.72])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp01.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 2C64B1028294;	Thu,  3 Nov 2011 11:51:02 -0500 (CDT)
Received: from sausexhtp01.amd.com (163.181.3.165) by sausexedgep01.amd.com
	(163.181.36.54) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Thu, 3 Nov 2011 11:51:43 -0500
Received: from storexhtp02.amd.com (172.24.4.4) by sausexhtp01.amd.com
	(163.181.3.165) with Microsoft SMTP Server (TLS) id 8.3.83.0;
	Thu, 3 Nov 2011 11:51:03 -0500
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.83.0;
	Thu, 3 Nov 2011 12:51:02 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 34FD249C108; Thu,  3 Nov 2011
	16:51:01 +0000 (GMT)
Received: from gran.osrc.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 13A1F5940FF; Thu,  3 Nov 2011
	17:51:01 +0100 (CET)
From: Wei Wang2 <wei.wang2@amd.com>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 2 of 5] amd iommu: Fix iommu page size
	encoding when page order > 0
Date: Thu, 3 Nov 2011 17:54:02 +0100
User-Agent: KMail/1.9.6 (enterprise 20070904.708012)
References: <patchbomb.1320335327@gran.amd.com>
	<1bf06c8d2c70e9af610e.1320335329@gran.amd.com>
	<4EB2CD33020000780005ED24@nat28.tlf.novell.com>
In-Reply-To: <4EB2CD33020000780005ED24@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="Boundary-00=_qcssO5S6WX3fLh3"
Message-ID: <201111031754.02201.wei.wang2@amd.com>
X-OriginatorOrg: amd.com
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--Boundary-00=_qcssO5S6WX3fLh3
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

On Thursday 03 November 2011 17:19:47 Jan Beulich wrote:
> >>> On 03.11.11 at 16:48, Wei Wang <wei.wang2@amd.com> wrote:
> >
> > # HG changeset patch
> > # User Wei Wang <wei.wang2@amd.com>
> > # Date 1320334553 -3600
> > # Node ID 1bf06c8d2c70e9af610e12a7592c466a799b0de1
> > # Parent  ef46c471a11f83d07e256ad2e0b868828f45ef63
> > amd iommu: Fix iommu page size encoding when page order > 0.
> > Fix io address in invalid all pages command.
> >
> > Signed-off-by: Wei Wang <wei.wang2@amd.com>
> >
> > diff -r ef46c471a11f -r 1bf06c8d2c70
> > xen/drivers/passthrough/amd/iommu_map.c ---
> > a/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 16:35:51 2011 +0100
> > +++ b/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 16:35:53 2011
> > +0100 @@ -77,23 +77,24 @@ static void invalidate_iommu_pages(struc
> >  {
> >      u64 addr_lo, addr_hi;
> >      u32 cmd[4], entry;
> > -    u64 mask = 0;
> >      int sflag = 0, pde = 0;
> >
> > +    ASSERT ( order == 0 || order == 9 || order == 18 );
> > +
> > +    /* All pages associated with the domainID are invalidated */
> > +    if ( order || (io_addr == INV_IOMMU_ALL_PAGES_ADDRESS ) )
> > +    {
> > +        sflag = 1;
> > +        pde = 1;
> > +    }
> > +
> >      /* If sflag == 1, the size of the invalidate command is determined
> >       by the first zero bit in the address starting from Address[12] */
> > -    if ( order == 9 || order == 18 )
> > +    if ( order )
> >      {
> > -        mask = ((1ULL << (order - 1)) - 1) << PAGE_SHIFT;
> > -        io_addr |= mask;
> > -        sflag = 1;
> > -    }
> > -
> > -    /* All pages associated with the domainID are invalidated */
> > -    else if ( io_addr == 0x7FFFFFFFFFFFF000ULL )
> > -    {
> > -        sflag = 1;
> > -        pde = 1;
> > +        u64 mask = 1ULL << (order - 1 + PAGE_SHIFT);
> > +        io_addr &= ~mask;
> > +        io_addr |= mask - 1;
> >      }
> >
> >      addr_lo = io_addr & DMA_32BIT_MASK;
> > @@ -917,7 +918,7 @@ static void _amd_iommu_flush_pages(struc
> >
> >  void amd_iommu_flush_all_pages(struct domain *d)
> >  {
> > -    _amd_iommu_flush_pages(d, 0x7FFFFFFFFFFFFULL, 0);
> > +    _amd_iommu_flush_pages(d, INV_IOMMU_ALL_PAGES_ADDRESS, 0);
> >  }
> >
> >  void amd_iommu_flush_pages(struct domain *d,
> > diff -r ef46c471a11f -r 1bf06c8d2c70
> > xen/include/asm-x86/hvm/svm/amd-iommu-defs.h ---
> > a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 16:35:51 2011
> > +0100 +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03
> > 16:35:53 2011 +0100
> > @@ -407,4 +407,6 @@
> >  #define INT_REMAP_ENTRY_VECTOR_MASK     0x00FF0000
> >  #define INT_REMAP_ENTRY_VECTOR_SHIFT    16
> >
> > +#define INV_IOMMU_ALL_PAGES_ADDRESS      (1ULL << 63) - 1
>
> Please parenthesize this properly.

Fixed, please see attachment.
Thanks,
Wei


> > +
> >  #endif /* _ASM_X86_64_AMD_IOMMU_DEFS_H */
> >
> >
> > _______________________________________________
> > Xen-devel mailing list
> > Xen-devel@lists.xensource.com
> > http://lists.xensource.com/xen-devel



--Boundary-00=_qcssO5S6WX3fLh3
Content-Type: text/x-diff; charset="iso-8859-1"; name="ats_02.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="ats_02.patch"
Content-Description: ats_02.patch

# HG changeset patch
# Parent ef46c471a11f83d07e256ad2e0b868828f45ef63
# User Wei Wang <wei.wang2@amd.com>
amd iommu: Fix iommu page size encoding when page order > 0.
Fix io address in invalid all pages command.

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r ef46c471a11f xen/drivers/passthrough/amd/iommu_map.c
--- a/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 16:35:51 2011 +0100
+++ b/xen/drivers/passthrough/amd/iommu_map.c	Thu Nov 03 17:51:16 2011 +0100
@@ -77,23 +77,24 @@ static void invalidate_iommu_pages(struc
 {
     u64 addr_lo, addr_hi;
     u32 cmd[4], entry;
-    u64 mask = 0;
     int sflag = 0, pde = 0;
 
+    ASSERT ( order == 0 || order == 9 || order == 18 );
+
+    /* All pages associated with the domainID are invalidated */
+    if ( order || (io_addr == INV_IOMMU_ALL_PAGES_ADDRESS ) )
+    {
+        sflag = 1;
+        pde = 1;
+    }
+
     /* If sflag == 1, the size of the invalidate command is determined
      by the first zero bit in the address starting from Address[12] */
-    if ( order == 9 || order == 18 )
+    if ( order )
     {
-        mask = ((1ULL << (order - 1)) - 1) << PAGE_SHIFT;
-        io_addr |= mask;
-        sflag = 1;
-    }
-
-    /* All pages associated with the domainID are invalidated */
-    else if ( io_addr == 0x7FFFFFFFFFFFF000ULL )
-    {
-        sflag = 1;
-        pde = 1;
+        u64 mask = 1ULL << (order - 1 + PAGE_SHIFT);
+        io_addr &= ~mask;
+        io_addr |= mask - 1;
     }
 
     addr_lo = io_addr & DMA_32BIT_MASK;
@@ -917,7 +918,7 @@ static void _amd_iommu_flush_pages(struc
 
 void amd_iommu_flush_all_pages(struct domain *d)
 {
-    _amd_iommu_flush_pages(d, 0x7FFFFFFFFFFFFULL, 0);
+    _amd_iommu_flush_pages(d, INV_IOMMU_ALL_PAGES_ADDRESS, 0);
 }
 
 void amd_iommu_flush_pages(struct domain *d,
diff -r ef46c471a11f xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 16:35:51 2011 +0100
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Nov 03 17:51:16 2011 +0100
@@ -407,4 +407,6 @@
 #define INT_REMAP_ENTRY_VECTOR_MASK     0x00FF0000
 #define INT_REMAP_ENTRY_VECTOR_SHIFT    16
 
+#define INV_IOMMU_ALL_PAGES_ADDRESS      ((1ULL << 63) - 1)
+
 #endif /* _ASM_X86_64_AMD_IOMMU_DEFS_H */

--Boundary-00=_qcssO5S6WX3fLh3
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--Boundary-00=_qcssO5S6WX3fLh3--


From xen-devel-bounces@lists.xensource.com Thu Nov 03 10:40:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 10:40:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM1Gw-0003sD-Kl; Thu, 03 Nov 2011 10:40:14 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM1Fl-0003ee-LO; Thu, 03 Nov 2011 10:39:02 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1320341936!2839688!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25660 invoked from network); 3 Nov 2011 17:38:57 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-4.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Nov 2011 17:38:57 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA3HckNk020446
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 3 Nov 2011 17:38:46 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA3HciNr001145
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 3 Nov 2011 17:38:45 GMT
Received: from abhmt119.oracle.com (abhmt119.oracle.com [141.146.116.71])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA3HcdIP023985; Thu, 3 Nov 2011 12:38:39 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 03 Nov 2011 10:38:38 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id A2D848149A; Thu,  3 Nov 2011 13:38:37 -0400 (EDT)
Date: Thu, 3 Nov 2011 13:38:37 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Ian Campbell <Ian.Campbell@eu.citrix.com>
Subject: Is: Xen 4.1.1, xend, HVM, 3.1 kernel; Was:Re: [Xen-devel] xen 4.2
	unstable; HVM; 2.6.39.3; HD/Network card error
Message-ID: <20111103173837.GA21554@phenom.dumpdata.com>
References: <!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAI32k8eIVQhMgLM5AGCb128BAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107181242270.12963@kaball-desktop>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAE0cphS4zTVFjzXOjWNB7uwBAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107201238440.12963@kaball-desktop>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAIMchHuG/6dIqtJ7GgPrsOEBAAAAAA==@gmail.com>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAAKIP0TTIelKl7OMHw7/aSQBAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107251142270.12963@kaball-desktop>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAICr5HMuz3FOpEbmgui+XxgBAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107251748160.12963@kaball-desktop>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="zhXaljGHf11kAtnf"
Content-Disposition: inline
In-Reply-To: <alpine.DEB.2.00.1107251748160.12963@kaball-desktop>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090206.4EB2D1A9.0216,ss=1,re=-15.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	Walter Robert Ditzler <ditwal001@gmail.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--zhXaljGHf11kAtnf
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

.. snip..
> I need the output of the guest kernel stuck during boot in order to
> understand the problem. It shouldn't be difficult to get if you enable
> logging over the serial in the guest kernel.

Hey Stefano,

Looks like I can reproduce this as well. This is using Fedora Core 16,
and with the Fedora Core 16 HVM install.

The interesting thing is that while 'xl' works, the 'xm' (which is what
virt-install and all of that uses), does not. And I think it is related
just to how we handle the hdc:cdrom,r case. Read below.

Just to make sure it is not SELinux related, I've called 'setenforce=0'.
The guest config is easy:

kernel = "/usr/lib/xen/boot/hvmloader"
builder='hvm'
memory=1024
#maxmem=1024
maxvcpus = 2
serial='pty'
vcpus = 2
disk = [ 'file:/mnt/iso/Fedora-16-x86_64-DVD.iso,hdc:cdrom,r', 'phy:/dev/vg_guest/f16_64,hda,w']
boot="dn"
vif = [ 'type=ioemu,model=e1000,mac=00:0F:4B:00:00:71, bridge=switch' ]
vfb = [ 'vnc=1, vnclisten=0.0.0.0 ,vncunused=1']
vnclisten="0.0.0.0"

Attached are the serial logs from good and bad, and as well the xenstore-ls from ..
you guessed it - good and bad. The interesting part is:

(this works)
   backend = ""
    qdisk = ""
     24 = ""
      5632 = ""
       frontend = "/local/domain/24/device/vbd/5632"
       params = "aio:/mnt/iso/Fedora-16-x86_64-DVD.iso"
       frontend-id = "24"
       online = "1"
       removable = "1"
       bootable = "1"
       state = "6"
       dev = "hdc"
       type = "tap"
       mode = "r"
       feature-barrier = "1"
       info = "4"
       sector-size = "512"
       sectors = "7337984"
       hotplug-status = "connected"

(this fails)
    vbd = ""
     10 = ""
      768 = ""
       domain = "test"
       frontend = "/local/domain/10/device/vbd/768"
       uuid = "ee7800e1-fae0-dfe2-9345-96fda7d7851f"
       bootable = "1"
       dev = "hda"
       state = "4"
       params = "/var/lib/xen/images/test.img"
       mode = "w"
       online = "1"
       frontend-id = "10"
       type = "file"
       node = "/dev/loop0"
       physical-device = "7:0"
       hotplug-status = "connected"
       feature-flush-cache = "1"
       sectors = "41943040"
       info = "0"
       sector-size = "512"

Which would imply that for the CD-ROM when we use 'xm' it is setup
as a PV disk (and we try to load the driver for it but fail)
while for the 'xl' it is as a QEMU qdisk (so emulated).

First I *thought* it was that blkback is failing to do its
stuff when using /dev/loop0, but after doing this:

disk = [ 'phy:/dev/loop0,hda,w']

I still got it to boot.

So it really seams that xen-blkback (or xen-blkfront) can't deal
with CD-ROMs very well. So I did it:

disk = [ 'phy:/dev/loop1,hdc:cdrom,r', 'phy:/dev/loop0,hda,w']
[root@phenom ~]# losetup -a
/dev/loop0: [0005]:1353 (/dev/mapper/vg_guest-f16_64)
/dev/loop1: [002a]:45613764 (/mnt/iso/Fedora-16-x86_64-DVD.iso)

Which is pretty much exactly what the 'file:/'.. would, and I got this
 vbd = ""
     34 = ""
      5632 = ""
       domain = "hvm.xm"
       frontend = "/local/domain/34/device/vbd/5632"
       uuid = "e30da140-7ef9-9c1f-8e45-1e5e63f798e0"
       bootable = "1"
       dev = "hdc"
       state = "6"
       params = "/dev/loop1"
       mode = "r"
       online = "1"
       frontend-id = "34"
       type = "phy"
       physical-device = "7:1"
       hotplug-status = "connected"

And after waiting for the timeout.. (can't load and then some more, the installer
came up and I could 'Test' the ISO image. The CD-ROM image was
emulated, which sounds right - the vbd/34/5632 just did not work out
and it timed out, but it still had the QEMU disk (/dev/sr0) and it used
that instead.

Any suggestions, thoughts, ideas? It sounds like the xen-blkfront
support for CD-ROMs is not working right.

Or maybe there are multiple issues and the error from xen-blkfront is
red heering. I seem to see other things too:

vif vif-0: 2 parsing device/vif/0/mac

[Ugh, looks like MAC is 00:00:00:0.. in the guest], but it probably got the right
MAC on the emulated device]


XENBUS: Timeout connecting to device: device/vkbd/0 (local state 3, remote state 1)
[which seems odds as the vkb from VNC looks to be working]


--zhXaljGHf11kAtnf
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="good.log"
Content-Transfer-Encoding: quoted-printable

[    0.000000] Initializing cgroup subsys cpuset=0D
[    0.000000] Initializing cgroup subsys cpu=0D
[    0.000000] Linux version 3.1.0-7.fc16.x86_64 (mockbuild@x86-07.phx2.fed=
oraproject.org) (gcc version 4.6.2 20111027 (Red Hat 4.6.2-1) (GCC) ) #1 SM=
P Tue Nov 1 21:10:48 UTC 2011=0D
[    0.000000] Command line: initrd=3Dinitrd.img xdriver=3Dvesa nomodeset c=
onsole=3DttyS0 debug loglevel=3D10 BOOT_IMAGE=3Dvmlinuz =0D
[    0.000000] BIOS-provided physical RAM map:=0D
[    0.000000]  BIOS-e820: 0000000000000000 - 000000000009e000 (usable)=0D
[    0.000000]  BIOS-e820: 000000000009e000 - 00000000000a0000 (reserved)=0D
[    0.000000]  BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)=0D
[    0.000000]  BIOS-e820: 0000000000100000 - 000000003f800000 (usable)=0D
[    0.000000]  BIOS-e820: 00000000fc000000 - 0000000100000000 (reserved)=0D
[    0.000000] NX (Execute Disable) protection: active=0D
[    0.000000] DMI 2.4 present.=0D
[    0.000000] DMI: Xen HVM domU, BIOS 4.1-111102 10/14/2011=0D
[    0.000000] Hypervisor detected: Xen HVM=0D
[    0.000000] Xen version 4.1.=0D
[    0.000000] Xen Platform PCI: I/O protocol version 1=0D
[    0.000000] Netfront and the Xen platform PCI driver have been compiled =
for this kernel: unplug emulated NICs.=0D
[    0.000000] Blkfront and the Xen platform PCI driver have been compiled =
for this kernel: unplug emulated disks.=0D
[    0.000000] You might have to change the root device=0D
[    0.000000] from /dev/hd[a-d] to /dev/xvd[a-d]=0D
[    0.000000] in your root=3D kernel command line option=0D
[    0.000000] HVMOP_pagetable_dying not supported=0D
[    0.000000] e820 update range: 0000000000000000 - 0000000000010000 (usab=
le) =3D=3D> (reserved)=0D
[    0.000000] e820 remove range: 00000000000a0000 - 0000000000100000 (usab=
le)=0D
[    0.000000] No AGP bridge found=0D
[    0.000000] last_pfn =3D 0x3f800 max_arch_pfn =3D 0x400000000=0D
[    0.000000] MTRR default type: write-back=0D
[    0.000000] MTRR fixed ranges enabled:=0D
[    0.000000]   00000-9FFFF write-back=0D
[    0.000000]   A0000-BFFFF write-combining=0D
[    0.000000]   C0000-FFFFF write-back=0D
[    0.000000] MTRR variable ranges enabled:=0D
[    0.000000]   0 base 0000F0000000 mask FFFFF8000000 uncachable=0D
[    0.000000]   1 base 0000F8000000 mask FFFFFC000000 uncachable=0D
[    0.000000]   2 disabled=0D
[    0.000000]   3 disabled=0D
[    0.000000]   4 disabled=0D
[    0.000000]   5 disabled=0D
[    0.000000]   6 disabled=0D
[    0.000000]   7 disabled=0D
[    0.000000] TOM2: 0000000230000000 aka 8960M=0D
[    0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x701060007=
0106=0D
[    0.000000] found SMP MP-table at [ffff8800000fbc90] fbc90=0D
[    0.000000] initial memory mapped : 0 - 20000000=0D
[    0.000000] Base memory trampoline at [ffff880000099000] 99000 size 2048=
0=0D
[    0.000000] init_memory_mapping: 0000000000000000-000000003f800000=0D
[    0.000000]  0000000000 - 003f800000 page 2M=0D
[    0.000000] kernel direct mapping tables up to 3f800000 @ 1fffe000-20000=
000=0D
[    0.000000] RAMDISK: 37677000 - 3f7df000=0D
[    0.000000] ACPI: RSDP 00000000000ea020 00024 (v02    Xen)=0D
[    0.000000] ACPI: XSDT 00000000fc0134f0 0003C (v01    Xen      HVM 00000=
000 HVML 00000000)=0D
[    0.000000] ACPI: FACP 00000000fc0132d0 000F4 (v04    Xen      HVM 00000=
000 HVML 00000000)=0D
[    0.000000] ACPI: DSDT 00000000fc003440 0FE05 (v02    Xen      HVM 00000=
000 INTL 20100528)=0D
[    0.000000] ACPI: FACS 00000000fc003400 00040=0D
[    0.000000] ACPI: APIC 00000000fc0133d0 000D8 (v02    Xen      HVM 00000=
000 HVML 00000000)=0D
[    0.000000] ACPI: HPET 00000000fc0134b0 00038 (v01    Xen      HVM 00000=
000 HVML 00000000)=0D
[    0.000000] ACPI: Local APIC address 0xfee00000=0D
[    0.000000] No NUMA configuration found=0D
[    0.000000] Faking a node at 0000000000000000-000000003f800000=0D
[    0.000000] Initmem setup node 0 0000000000000000-000000003f800000=0D
[    0.000000]   NODE_DATA [000000003f7ec000 - 000000003f7fffff]=0D
[    0.000000]  [ffffea0000000000-ffffea0000ffffff] PMD -> [ffff880035e0000=
0-ffff880036dfffff] on node 0=0D
[    0.000000] Zone PFN ranges:=0D
[    0.000000]   DMA      0x00000010 -> 0x00001000=0D
[    0.000000]   DMA32    0x00001000 -> 0x00100000=0D
[    0.000000]   Normal   empty=0D
[    0.000000] Movable zone start PFN for each node=0D
[    0.000000] early_node_map[2] active PFN ranges=0D
[    0.000000]     0: 0x00000010 -> 0x0000009e=0D
[    0.000000]     0: 0x00000100 -> 0x0003f800=0D
[    0.000000] On node 0 totalpages: 259982=0D
[    0.000000]   DMA zone: 64 pages used for memmap=0D
[    0.000000]   DMA zone: 5 pages reserved=0D
[    0.000000]   DMA zone: 3913 pages, LIFO batch:0=0D
[    0.000000]   DMA32 zone: 4000 pages used for memmap=0D
[    0.000000]   DMA32 zone: 252000 pages, LIFO batch:31=0D
[    0.000000] ACPI: PM-Timer IO Port: 0xb008=0D
[    0.000000] ACPI: Local APIC address 0xfee00000=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x02] enabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x02] lapic_id[0x04] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x03] lapic_id[0x06] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x04] lapic_id[0x08] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x05] lapic_id[0x0a] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x06] lapic_id[0x0c] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x07] lapic_id[0x0e] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x08] lapic_id[0x10] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x09] lapic_id[0x12] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x0a] lapic_id[0x14] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x0b] lapic_id[0x16] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x0c] lapic_id[0x18] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x0d] lapic_id[0x1a] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x0e] lapic_id[0x1c] disabled)=0D
[    0.000000] ACPI: IOAPIC (id[0x01] address[0xfec00000] gsi_base[0])=0D
[    0.000000] IOAPIC[0]: apic_id 1, version 17, address 0xfec00000, GSI 0-=
47=0D
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)=0D
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 5 global_irq 5 low level)=0D
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 10 global_irq 10 low level)=
=0D
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 11 global_irq 11 low level)=
=0D
[    0.000000] ACPI: IRQ0 used by override.=0D
[    0.000000] ACPI: IRQ2 used by override.=0D
[    0.000000] ACPI: IRQ5 used by override.=0D
[    0.000000] ACPI: IRQ9 used by override.=0D
[    0.000000] ACPI: IRQ10 used by override.=0D
[    0.000000] ACPI: IRQ11 used by override.=0D
[    0.000000] Using ACPI (MADT) for SMP configuration information=0D
[    0.000000] ACPI: HPET id: 0x8086a201 base: 0xfed00000=0D
[    0.000000] SMP: Allowing 15 CPUs, 13 hotplug CPUs=0D
[    0.000000] nr_irqs_gsi: 64=0D
[    0.000000] PM: Registered nosave memory: 000000000009e000 - 00000000000=
a0000=0D
[    0.000000] PM: Registered nosave memory: 00000000000a0000 - 00000000000=
e0000=0D
[    0.000000] PM: Registered nosave memory: 00000000000e0000 - 00000000001=
00000=0D
[    0.000000] Allocating PCI resources starting at 3f800000 (gap: 3f800000=
:bc800000)=0D
[    0.000000] Booting paravirtualized kernel on Xen HVM=0D
[    0.000000] setup_percpu: NR_CPUS:256 nr_cpumask_bits:256 nr_cpu_ids:15 =
nr_node_ids:1=0D
[    0.000000] PERCPU: Embedded 27 pages/cpu @ffff880037400000 s81024 r8192=
 d21376 u131072=0D
[    0.000000] pcpu-alloc: s81024 r8192 d21376 u131072 alloc=3D1*2097152=0D
[    0.000000] pcpu-alloc: [0] 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14=
 -- =0D
[    0.000000] Built 1 zonelists in Node order, mobility grouping on.  Tota=
l pages: 255913=0D
[    0.000000] Policy zone: DMA32=0D
[    0.000000] Kernel command line: initrd=3Dinitrd.img xdriver=3Dvesa nomo=
deset console=3DttyS0 debug loglevel=3D10 BOOT_IMAGE=3Dvmlinuz =0D
[    0.000000] PID hash table entries: 4096 (order: 3, 32768 bytes)=0D
[    0.000000] Checking aperture...=0D
[    0.000000] No AGP bridge found=0D
[    0.000000] Calgary: detecting Calgary via BIOS EBDA area=0D
[    0.000000] Calgary: Unable to locate Rio Grande table in EBDA - bailing=
!=0D
[    0.000000] Memory: 875036k/1040384k available (4868k kernel code, 456k =
absent, 164892k reserved, 6781k data, 940k init)=0D
[    0.000000] SLUB: Genslabs=3D15, HWalign=3D64, Order=3D0-3, MinObjects=
=3D0, CPUs=3D15, Nodes=3D1=0D
[    0.000000] Hierarchical RCU implementation.=0D
[    0.000000] 	RCU dyntick-idle grace-period acceleration is enabled.=0D
[    0.000000] NR_IRQS:16640 nr_irqs:1208 16=0D
[    0.000000] Xen HVM callback vector for event delivery is enabled=0D
[    0.000000] Console: colour VGA+ 80x25=0D
[    0.000000] console [ttyS0] enabled=0D
[    0.000000] allocated 8388608 bytes of page_cgroup=0D
[    0.000000] please try 'cgroup_disable=3Dmemory' option if you don't wan=
t memory cgroups=0D
[    0.000000] hpet clockevent registered=0D
[    0.000000] Detected 3000.224 MHz processor.=0D
[    0.000000] Marking TSC unstable due to TSCs unsynchronized=0D
[    0.009999] Calibrating delay loop (skipped), value calculated using tim=
er frequency.. 6000.44 BogoMIPS (lpj=3D3000224)=0D
[    0.017001] pid_max: default: 32768 minimum: 301=0D
[    0.020024] Security Framework initialized=0D
[    0.023005] SELinux:  Initializing.=0D
[    0.026006] SELinux:  Starting in permissive mode=0D
[    0.029128] Dentry cache hash table entries: 131072 (order: 8, 1048576 b=
ytes)=0D
[    0.035282] Inode-cache hash table entries: 65536 (order: 7, 524288 byte=
s)=0D
[    0.040108] Mount-cache hash table entries: 256=0D
[    0.043120] Initializing cgroup subsys cpuacct=0D
[    0.047002] Initializing cgroup subsys memory=0D
[    0.050009] Initializing cgroup subsys devices=0D
[    0.052998] Initializing cgroup subsys freezer=0D
[    0.055997] Initializing cgroup subsys net_cls=0D
[    0.058997] Initializing cgroup subsys blkio=0D
[    0.063000] Initializing cgroup subsys perf_event=0D
[    0.066090] tseg: 0000000000=0D
[    0.068022] CPU: Physical Processor ID: 0=0D
[    0.070995] CPU: Processor Core ID: 0=0D
[    0.073997] mce: CPU supports 6 MCE banks=0D
[    0.077016] using AMD E400 aware idle routine=0D
[    0.081065] ACPI: Core revision 20110623=0D
[    0.087996] ftrace: allocating 25204 entries in 99 pages=0D
[    0.107972] Not enabling x2apic, Intr-remapping init failed.=0D
[    0.111993] Switched APIC routing to physical flat.=0D
[    0.117210] ..TIMER: vector=3D0x30 apic1=3D0 pin1=3D2 apic2=3D0 pin2=3D0=
=0D
[    0.131510] CPU0: AMD Phenom(tm) II X6 1075T Processor stepping 00=0D
[    0.135995] Xen: using vcpuop timer interface=0D
[    0.138993] installing Xen timer for CPU 0=0D
[    0.142041] Performance Events: Broken PMU hardware detected, using soft=
ware events only.=0D
[    0.146103] NMI watchdog disabled (cpu0): hardware events not enabled=0D
[    0.147073] Booting Node   0, Processors  #1=0D
[    0.148989] smpboot cpu 1: start_ip =3D 99000=0D
[    0.284103] NMI watchdog disabled (cpu1): hardware events not enabled=0D
[    0.284099] installing Xen timer for CPU 1=0D
[    0.285002] Brought up 2 CPUs=0D
[    0.285977] Total of 2 processors activated (6912.24 BogoMIPS).=0D
[    0.291034] devtmpfs: initialized=0D
[    0.322105] atomic64 test passed for x86-64 platform with CX8 and with S=
SE=0D
[    0.322989] RTC time: 16:51:45, date: 11/03/11=0D
[    0.324005] NET: Registered protocol family 16=0D
[    0.343001] Extended Config Space enabled on 0 nodes=0D
[    0.344047] ACPI: bus type pci registered=0D
[    0.346967] PCI: Using configuration type 1 for base access=0D
[    0.347967] PCI: Using configuration type 1 for extended access=0D
[    0.353985] bio: create slab <bio-0> at 0=0D
[    0.372012] ACPI: Added _OSI(Module Device)=0D
[    0.372964] ACPI: Added _OSI(Processor Device)=0D
[    0.373963] ACPI: Added _OSI(3.0 _SCP Extensions)=0D
[    0.374963] ACPI: Added _OSI(Processor Aggregator Device)=0D
[    0.384100] ACPI: EC: Look up EC in DSDT=0D
[    0.406981] ACPI: Interpreter enabled=0D
[    0.407959] ACPI: (supports S0 S3 S4 S5)=0D
[    0.412959] ACPI: Using IOAPIC for interrupt routing=0D
[    0.649968] ACPI: No dock devices found.=0D
[    0.650921] HEST: Table not found.=0D
[    0.651922] PCI: Using host bridge windows from ACPI; if necessary, use =
"pci=3Dnocrs" and report a bug=0D
[    0.652966] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])=0D
[    0.654003] pci_root PNP0A03:00: host bridge window [io  0x0000-0x0cf7]=
=0D
[    0.654921] pci_root PNP0A03:00: host bridge window [io  0x0d00-0xffff]=
=0D
[    0.655921] pci_root PNP0A03:00: host bridge window [mem 0x000a0000-0x00=
0bffff]=0D
[    0.656920] pci_root PNP0A03:00: host bridge window [mem 0xf0000000-0xfb=
ffffff]=0D
[    0.658920] pci 0000:00:00.0: [8086:1237] type 0 class 0x000600=0D
[    0.669017] pci 0000:00:01.0: [8086:7000] type 0 class 0x000601=0D
[    0.682916] pci 0000:00:01.1: [8086:7010] type 0 class 0x000101=0D
[    0.691993] pci 0000:00:01.1: reg 20: [io  0xc140-0xc14f]=0D
[    0.698948] pci 0000:00:01.3: [8086:7113] type 0 class 0x000680=0D
[    0.699948] * Found PM-Timer Bug on the chipset. Due to workarounds for =
a bug,=0D
[    0.699949] * this clock source is slow. Consider trying other clock sou=
rces=0D
[    0.712050] pci 0000:00:01.3: quirk: [io  0xb000-0xb03f] claimed by PIIX=
4 ACPI=0D
[    0.716956] pci 0000:00:02.0: [1013:00b8] type 0 class 0x000300=0D
[    0.719958] pci 0000:00:02.0: reg 10: [mem 0xf0000000-0xf1ffffff pref]=0D
[    0.721988] pci 0000:00:02.0: reg 14: [mem 0xf3020000-0xf3020fff]=0D
[    0.732012] pci 0000:00:03.0: [5853:0001] type 0 class 0x00ff80=0D
[    0.734982] pci 0000:00:03.0: reg 10: [io  0xc000-0xc0ff]=0D
[    0.737017] pci 0000:00:03.0: reg 14: [mem 0xf2000000-0xf2ffffff pref]=0D
[    0.752973] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT]=0D
[    0.755931]  pci0000:00: Requesting ACPI _OSC control (0x1d)=0D
[    0.756907]  pci0000:00: ACPI _OSC request failed (AE_NOT_FOUND), return=
ed control mask: 0x1d=0D
[    0.757904] ACPI _OSC control for PCIe not granted, disabling ASPM=0D
[    1.307014] ACPI: PCI Interrupt Link [LNKA] (IRQs *5 10 11)=0D
[    1.311987] ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11)=0D
[    1.315987] ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11)=0D
[    1.319976] ACPI: PCI Interrupt Link [LNKD] (IRQs *5 10 11)=0D
[    1.324921] xen/balloon: Initialising balloon driver.=0D
[    1.325819] last_pfn =3D 0x3f800 max_arch_pfn =3D 0x400000000=0D
[    1.326828] xen-balloon: Initialising balloon driver.=0D
[    1.327876] vgaarb: device added: PCI:0000:00:02.0,decodes=3Dio+mem,owns=
=3Dio+mem,locks=3Dnone=0D
[    1.328818] vgaarb: loaded=0D
[    1.329817] vgaarb: bridge control possible 0000:00:02.0=0D
[    1.330873] SCSI subsystem initialized=0D
[    1.331847] libata version 3.00 loaded.=0D
[    1.342861] usbcore: registered new interface driver usbfs=0D
[    1.358825] usbcore: registered new interface driver hub=0D
[    1.373835] usbcore: registered new device driver usb=0D
[    1.374848] PCI: Using ACPI for IRQ routing=0D
[    1.386810] PCI: pci_cache_line_size set to 64 bytes=0D
[    1.401011] reserve RAM buffer: 000000000009e000 - 000000000009ffff =0D
[    1.418805] reserve RAM buffer: 000000003f800000 - 000000003fffffff =0D
[    1.436901] NetLabel: Initializing=0D
[    1.446800] NetLabel:  domain hash size =3D 128=0D
[    1.458798] NetLabel:  protocols =3D UNLABELED CIPSOv4=0D
[    1.471804] NetLabel:  unlabeled traffic allowed by default=0D
[    1.485807] HPET: 3 timers in total, 0 timers will be used for per-cpu t=
imer=0D
[    1.504803] hpet0: at MMIO 0xfed00000, IRQs 2, 8, 0=0D
[    1.517990] hpet0: 3 comparators, 64-bit 62.500000 MHz counter=0D
[    1.541864] Switching to clocksource xen=0D
[    1.543051] Switched to NOHz mode on CPU #0=0D
[    1.543656] Switched to NOHz mode on CPU #1=0D
[    1.554019] pnp: PnP ACPI init=0D
[    1.556372] ACPI: bus type pnp registered=0D
[    1.559349] pnp 00:00: [mem 0x00000000-0x0009ffff]=0D
[    1.562839] system 00:00: [mem 0x00000000-0x0009ffff] could not be reser=
ved=0D
[    1.567841] system 00:00: Plug and Play ACPI device, IDs PNP0c02 (active=
)=0D
[    1.572727] pnp 00:01: [bus 00-ff]=0D
[    1.575228] pnp 00:01: [io  0x0cf8-0x0cff]=0D
[    1.578185] pnp 00:01: [io  0x0000-0x0cf7 window]=0D
[    1.581569] pnp 00:01: [io  0x0d00-0xffff window]=0D
[    1.584968] pnp 00:01: [mem 0x000a0000-0x000bffff window]=0D
[    1.588890] pnp 00:01: [mem 0xf0000000-0xfbffffff window]=0D
[    1.592800] pnp 00:01: Plug and Play ACPI device, IDs PNP0a03 (active)=0D
[    1.597503] pnp 00:02: [io  0x10c0-0x1141]=0D
[    1.600467] pnp 00:02: [io  0xb044-0xb047]=0D
[    1.603461] system 00:02: [io  0x10c0-0x1141] has been reserved=0D
[    1.607757] system 00:02: [io  0xb044-0xb047] has been reserved=0D
[    1.612018] system 00:02: Plug and Play ACPI device, IDs PNP0c02 (active=
)=0D
[    1.616916] pnp 00:03: [mem 0xfed00000-0xfed003ff]=0D
[    1.620414] pnp 00:03: Plug and Play ACPI device, IDs PNP0103 (active)=0D
[    1.625142] pnp 00:04: [io  0x0010-0x001f]=0D
[    1.628114] pnp 00:04: [io  0x0022-0x002d]=0D
[    1.631075] pnp 00:04: [io  0x0030-0x003f]=0D
[    1.634044] pnp 00:04: [io  0x0044-0x005f]=0D
[    1.637012] pnp 00:04: [io  0x0062-0x0063]=0D
[    1.639970] pnp 00:04: [io  0x0065-0x006f]=0D
[    1.642943] pnp 00:04: [io  0x0072-0x007f]=0D
[    1.645914] pnp 00:04: [io  0x0080]=0D
[    1.648455] pnp 00:04: [io  0x0084-0x0086]=0D
[    1.651426] pnp 00:04: [io  0x0088]=0D
[    1.653968] pnp 00:04: [io  0x008c-0x008e]=0D
[    1.656959] pnp 00:04: [io  0x0090-0x009f]=0D
[    1.659915] pnp 00:04: [io  0x00a2-0x00bd]=0D
[    1.662881] pnp 00:04: [io  0x00e0-0x00ef]=0D
[    1.665854] pnp 00:04: [io  0x08a0-0x08a3]=0D
[    1.668824] pnp 00:04: [io  0x0cc0-0x0ccf]=0D
[    1.671790] pnp 00:04: [io  0x04d0-0x04d1]=0D
[    1.674850] system 00:04: [io  0x08a0-0x08a3] has been reserved=0D
[    1.679128] system 00:04: [io  0x0cc0-0x0ccf] has been reserved=0D
[    1.683370] system 00:04: [io  0x04d0-0x04d1] has been reserved=0D
[    1.687656] system 00:04: Plug and Play ACPI device, IDs PNP0c02 (active=
)=0D
[    1.692546] pnp 00:05: [dma 4]=0D
[    1.694825] pnp 00:05: [io  0x0000-0x000f]=0D
[    1.697869] pnp 00:05: [io  0x0081-0x0083]=0D
[    1.700873] pnp 00:05: [io  0x0087]=0D
[    1.703458] pnp 00:05: [io  0x0089-0x008b]=0D
[    1.706502] pnp 00:05: [io  0x008f]=0D
[    1.709083] pnp 00:05: [io  0x00c0-0x00df]=0D
[    1.712043] pnp 00:05: [io  0x0480-0x048f]=0D
[    1.715025] pnp 00:05: Plug and Play ACPI device, IDs PNP0200 (active)=0D
[    1.719731] pnp 00:06: [io  0x0070-0x0071]=0D
[    1.722717] xen: --> pirq=3D16 -> irq=3D8 (gsi=3D8)=0D
[    1.725916] pnp 00:06: [irq 8]=0D
[    1.728159] pnp 00:06: Plug and Play ACPI device, IDs PNP0b00 (active)=0D
[    1.732838] pnp 00:07: [io  0x0061]=0D
[    1.735436] pnp 00:07: Plug and Play ACPI device, IDs PNP0800 (active)=0D
[    1.740138] xen: --> pirq=3D17 -> irq=3D12 (gsi=3D12)=0D
[    1.743427] pnp 00:08: [irq 12]=0D
[    1.745738] pnp 00:08: Plug and Play ACPI device, IDs PNP0f13 (active)=0D
[    1.750453] pnp 00:09: [io  0x0060]=0D
[    1.753004] pnp 00:09: [io  0x0064]=0D
[    1.755559] xen: --> pirq=3D18 -> irq=3D1 (gsi=3D1)=0D
[    1.758725] pnp 00:09: [irq 1]=0D
[    1.760991] pnp 00:09: Plug and Play ACPI device, IDs PNP0303 PNP030b (a=
ctive)=0D
[    1.766206] pnp 00:0a: [io  0x03f0-0x03f5]=0D
[    1.769214] pnp 00:0a: [io  0x03f7]=0D
[    1.771744] xen: --> pirq=3D19 -> irq=3D6 (gsi=3D6)=0D
[    1.774923] pnp 00:0a: [irq 6]=0D
[    1.777160] pnp 00:0a: [dma 2]=0D
[    1.779391] pnp 00:0a: Plug and Play ACPI device, IDs PNP0700 (active)=0D
[    1.784100] pnp 00:0b: [io  0x03f8-0x03ff]=0D
[    1.787092] xen: --> pirq=3D20 -> irq=3D4 (gsi=3D4)=0D
[    1.790230] pnp 00:0b: [irq 4]=0D
[    1.792490] pnp 00:0b: Plug and Play ACPI device, IDs PNP0501 (active)=0D
[    1.797346] pnp 00:0c: [io  0x0378-0x037f]=0D
[    1.800323] xen: --> pirq=3D21 -> irq=3D7 (gsi=3D7)=0D
[    1.803478] pnp 00:0c: [irq 7]=0D
[    1.805767] pnp 00:0c: Plug and Play ACPI device, IDs PNP0400 (active)=0D
[    1.825230] pnp: PnP ACPI: found 13 devices=0D
[    1.828375] ACPI: ACPI bus type pnp unregistered=0D
[    1.838825] PCI: max bus depth: 0 pci_try_num: 1=0D
[    1.842328] pci_bus 0000:00: resource 4 [io  0x0000-0x0cf7]=0D
[    1.846387] pci_bus 0000:00: resource 5 [io  0x0d00-0xffff]=0D
[    1.850378] pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff]=0D
[    1.854877] pci_bus 0000:00: resource 7 [mem 0xf0000000-0xfbffffff]=0D
[    1.859471] NET: Registered protocol family 2=0D
[    1.862672] IP route cache hash table entries: 32768 (order: 6, 262144 b=
ytes)=0D
[    1.868039] TCP established hash table entries: 131072 (order: 9, 209715=
2 bytes)=0D
[    1.873916] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)=
=0D
[    1.879042] TCP: Hash tables configured (established 131072 bind 65536)=
=0D
[    1.883801] TCP reno registered=0D
[    1.886136] UDP hash table entries: 512 (order: 2, 16384 bytes)=0D
[    1.890387] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)=0D
[    1.895029] NET: Registered protocol family 1=0D
[    1.898198] pci 0000:00:00.0: Limiting direct PCI/PCI transfers=0D
[    1.902493] pci 0000:00:01.0: PIIX3: Enabling Passive Release=0D
[    1.906722] pci 0000:00:01.0: Activating ISA DMA hang workarounds=0D
[    1.911233] pci 0000:00:02.0: Boot video device=0D
[    1.914550] PCI: CLS 0 bytes, default 64=0D
[    1.917408] Unpacking initramfs...=0D
[    2.310499] Freeing initrd memory: 132512k freed=0D
[    2.345369] Intel AES-NI instructions are not detected.=0D
[    2.349673] audit: initializing netlink socket (disabled)=0D
[    2.353605] type=3D2000 audit(1320339109.313:1): initialized=0D
[    2.375203] HugeTLB registered 2 MB page size, pre-allocated 0 pages=0D
[    2.385811] VFS: Disk quotas dquot_6.5.2=0D
[    2.388941] Dquot-cache hash table entries: 512 (order 0, 4096 bytes)=0D
[    2.394173] msgmni has been set to 1967=0D
[    2.397046] SELinux:  Registering netfilter hooks=0D
[    2.400926] alg: No test for stdrng (krng)=0D
[    2.404034] NET: Registered protocol family 38=0D
[    2.407355] Block layer SCSI generic (bsg) driver version 0.4 loaded (ma=
jor 253)=0D
[    2.412825] io scheduler noop registered=0D
[    2.415721] io scheduler deadline registered=0D
[    2.418893] io scheduler cfq registered (default)=0D
[    2.422433] pci_hotplug: PCI Hot Plug PCI Core version: 0.5=0D
[    2.426530] pciehp: PCI Express Hot Plug Controller Driver version: 0.4=
=0D
[    2.431380] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5=0D
[    2.436194] acpiphp: Slot [0] registered=0D
[    2.439128] acpiphp: Slot [1] registered=0D
[    2.442044] acpiphp: Slot [2] registered=0D
[    2.444974] acpiphp: Slot [3] registered=0D
[    2.447888] acpiphp: Slot [4] registered=0D
[    2.450746] acpiphp: Slot [5] registered=0D
[    2.453682] acpiphp: Slot [6] registered=0D
[    2.456594] acpiphp: Slot [7] registered=0D
[    2.459540] acpiphp: Slot [8] registered=0D
[    2.462506] acpiphp: Slot [9] registered=0D
[    2.465413] acpiphp: Slot [10] registered=0D
[    2.468453] acpiphp: Slot [11] registered=0D
[    2.471466] acpiphp: Slot [12] registered=0D
[    2.474397] acpiphp: Slot [13] registered=0D
[    2.477427] acpiphp: Slot [14] registered=0D
[    2.480364] acpiphp: Slot [15] registered=0D
[    2.483329] acpiphp: Slot [16] registered=0D
[    2.486276] acpiphp: Slot [17] registered=0D
[    2.489229] acpiphp: Slot [18] registered=0D
[    2.492178] acpiphp: Slot [19] registered=0D
[    2.495127] acpiphp: Slot [20] registered=0D
[    2.498071] acpiphp: Slot [21] registered=0D
[    2.501021] acpiphp: Slot [22] registered=0D
[    2.503963] acpiphp: Slot [23] registered=0D
[    2.506950] acpiphp: Slot [24] registered=0D
[    2.509887] acpiphp: Slot [25] registered=0D
[    2.512834] acpiphp: Slot [26] registered=0D
[    2.515764] acpiphp: Slot [27] registered=0D
[    2.518760] acpiphp: Slot [28] registered=0D
[    2.521711] acpiphp: Slot [29] registered=0D
[    2.524701] acpiphp: Slot [30] registered=0D
[    2.527670] acpiphp: Slot [31] registered=0D
[    2.531079] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/inpu=
t/input0=0D
[    2.536387] ACPI: Power Button [PWRF]=0D
[    2.539087] input: Sleep Button as /devices/LNXSYSTM:00/LNXSLPBN:00/inpu=
t/input1=0D
[    2.544377] ACPI: Sleep Button [SLPF]=0D
[    2.547881] ACPI: acpi_idle registered with cpuidle=0D
[    2.568409] ERST: Table is not found!=0D
[    2.571141] GHES: HEST is not enabled!=0D
[    2.573947] xen: --> pirq=3D22 -> irq=3D28 (gsi=3D28)=0D
[    2.577230] xen-platform-pci 0000:00:03.0: PCI INT A -> GSI 28 (level, l=
ow) -> IRQ 28=0D
[    2.582851] Grant table initialized=0D
[    2.587475] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled=0D
[    2.604182] serial8250: ttyS0 at I/O 0x3f8 (irq =3D 4) is a 16550A=0D
[    2.622623] 00:0b: ttyS0 at I/O 0x3f8 (irq =3D 4) is a 16550A=0D
[    2.629409] Non-volatile memory driver v1.3=0D
[    2.632548] Linux agpgart interface v0.103=0D
[    2.636220] loop: module loaded=0D
[    2.638599] ata_piix 0000:00:01.1: version 2.13=0D
[    2.642093] ata_piix 0000:00:01.1: setting latency timer to 64=0D
[    2.646856] scsi0 : ata_piix=0D
[    2.649076] scsi1 : ata_piix=0D
[    2.651230] ata1: PATA max MWDMA2 cmd 0x1f0 ctl 0x3f6 bmdma 0xc140 irq 1=
4=0D
[    2.656105] ata2: PATA max MWDMA2 cmd 0x170 ctl 0x376 bmdma 0xc148 irq 1=
5=0D
[    2.661046] Fixed MDIO Bus: probed=0D
[    2.664400] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver=0D
[    2.669912] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver=0D
[    2.674363] uhci_hcd: USB Universal Host Controller Interface driver=0D
[    2.678974] usbcore: registered new interface driver usbserial=0D
[    2.683175] USB Serial support registered for generic=0D
[    2.686830] usbcore: registered new interface driver usbserial_generic=0D
[    2.691530] usbserial: USB Serial Driver core=0D
[    2.694760] i8042: PNP: PS/2 Controller [PNP0303:PS2K,PNP0f13:PS2M] at 0=
x60,0x64 irq 1,12=0D
[    2.702424] serio: i8042 KBD port at 0x60,0x64 irq 1=0D
[    2.706017] serio: i8042 AUX port at 0x60,0x64 irq 12=0D
[    2.709776] mousedev: PS/2 mouse device common for all mice=0D
[    2.714594] input: AT Translated Set 2 keyboard as /devices/platform/i80=
42/serio0/input/input2=0D
[    2.720921] rtc_cmos 00:06: rtc core: registered rtc_cmos as rtc0=0D
[    2.728213] rtc0: alarms up to one day, 114 bytes nvram, hpet irqs=0D
[    2.735685] device-mapper: uevent: version 1.0.3=0D
[    2.741355] device-mapper: ioctl: 4.21.0-ioctl (2011-07-06) initialised:=
 dm-devel@redhat.com=0D
[    2.748329] cpuidle: using governor ladder=0D
[    2.751294] cpuidle: using governor menu=0D
[    2.754197] EFI Variables Facility v0.08 2004-May-17=0D
[    2.757873] usbcore: registered new interface driver usbhid=0D
[    2.761884] usbhid: USB HID core driver=0D
[    2.764704] ip_tables: (C) 2000-2006 Netfilter Core Team=0D
[    2.768531] TCP cubic registered=0D
[    2.770887] Initializing XFRM netlink socket=0D
[    2.774068] NET: Registered protocol family 10=0D
[    2.777472] Mobile IPv6=0D
[    2.779292] NET: Registered protocol family 17=0D
[    2.782504] Registering the dns_resolver key type=0D
[    2.786059] PM: Hibernation image not present or could not be loaded.=0D
[    2.790698] registered taskstats version 1=0D
[    2.796106] IMA: No TPM chip found, activating TPM-bypass!=0D
[    2.800533] XENBUS: Device with no driver: device/vbd/5632=0D
[    2.804487] XENBUS: Device with no driver: device/vbd/768=0D
[    2.808367] XENBUS: Device with no driver: device/vif/0=0D
[    2.812216]   Magic number: 3:292:893=0D
[    2.815539] rtc_cmos 00:06: setting system clock to 2011-11-03 16:51:47 =
UTC (1320339107)=0D
[    2.818799] ata2.01: NODEV after polling detection=0D
[    2.824872] ata2.00: ATAPI: QEMU DVD-ROM, 0.10.2, max UDMA/100=0D
[    2.828098] ata2.00: configured for MWDMA2=0D
[    2.835284] scsi 1:0:0:0: CD-ROM            QEMU     QEMU DVD-ROM     0.=
10 PQ: 0 ANSI: 5=0D
[    2.841900] sr0: scsi3-mmc drive: 4x/4x xa/form2 tray=0D
[    2.841902] cdrom: Uniform CD-ROM driver Revision: 3.20=0D
[    2.841999] sr 1:0:0:0: Attached scsi CD-ROM sr0=0D
[    2.842048] sr 1:0:0:0: Attached scsi generic sg0 type 5=0D
[    2.870503] Initializing network drop monitor service=0D
[    2.877107] Freeing unused kernel memory: 940k freed=0D
[    2.885624] Write protecting the kernel read-only data: 10240k=0D
[    2.893850] Freeing unused kernel memory: 1260k freed=0D
[    2.902770] Freeing unused kernel memory: 1584k freed=0D
[    2.933842] dracut: dracut-013-18.fc16=0D
[    2.940910] dracut: root was live:/squashfs.img, liveroot is now live:/s=
quashfs.img=0D
[    2.953665] udevd[77]: starting version 173=0D
[    3.074311] squashfs: version 4.0 (2009/01/31) Phillip Lougher=0D
[    3.120018] EXT4-fs (dm-0): mounted filesystem with ordered data mode. O=
pts: (null)=0D
[    3.130137] dracut: Mounted root filesystem /dev/mapper/live-rw=0D
[    3.170796] dracut: Switching root=0D
[    3.177864] input: ImExPS/2 Generic Explorer Mouse as /devices/platform/=
i8042/serio1/input/input3=0D
[    3.415793] SELinux: 2048 avtab hash slots, 96028 rules.=0D
[    3.432529] SELinux: 2048 avtab hash slots, 96028 rules.=0D
[    3.441250] SELinux:  9 users, 13 roles, 3892 types, 204 bools, 1 sens, =
1024 cats=0D
[    3.446869] SELinux:  82 classes, 96028 rules=0D
[    3.453404] SELinux:  Completing initialization.=0D
[    3.456849] SELinux:  Setting up existing superblocks.=0D
[    3.460561] SELinux: initialized (dev sysfs, type sysfs), uses genfs_con=
texts=0D
[    3.465682] SELinux: initialized (dev rootfs, type rootfs), uses genfs_c=
ontexts=0D
[    3.471014] SELinux: initialized (dev bdev, type bdev), uses genfs_conte=
xts=0D
[    3.476030] SELinux: initialized (dev proc, type proc), uses genfs_conte=
xts=0D
[    3.481015] SELinux: initialized (dev tmpfs, type tmpfs), uses transitio=
n SIDs=0D
[    3.486197] SELinux: initialized (dev devtmpfs, type devtmpfs), uses tra=
nsition SIDs=0D
[    3.492136] SELinux: initialized (dev sockfs, type sockfs), uses task SI=
Ds=0D
[    3.497112] SELinux: initialized (dev debugfs, type debugfs), uses genfs=
_contexts=0D
[    3.503130] SELinux: initialized (dev pipefs, type pipefs), uses task SI=
Ds=0D
[    3.508127] SELinux: initialized (dev anon_inodefs, type anon_inodefs), =
uses genfs_contexts=0D
[    3.514088] SELinux: initialized (dev devpts, type devpts), uses transit=
ion SIDs=0D
[    3.519439] SELinux: initialized (dev hugetlbfs, type hugetlbfs), uses t=
ransition SIDs=0D
[    3.525148] SELinux: initialized (dev mqueue, type mqueue), uses transit=
ion SIDs=0D
[    3.530498] SELinux: initialized (dev selinuxfs, type selinuxfs), uses g=
enfs_contexts=0D
[    3.536129] SELinux: initialized (dev securityfs, type securityfs), uses=
 genfs_contexts=0D
[    3.541866] SELinux: initialized (dev sysfs, type sysfs), uses genfs_con=
texts=0D
[    3.547163] SELinux: initialized (dev tmpfs, type tmpfs), uses transitio=
n SIDs=0D
[    3.552351] SELinux: initialized (dev tmpfs, type tmpfs), uses transitio=
n SIDs=0D
[    3.557584] SELinux: initialized (dev loop0, type squashfs), not configu=
red for labeling=0D
[    3.563411] SELinux: initialized (dev dm-0, type ext4), uses xattr=0D
[    3.569406] type=3D1403 audit(1320339108.253:2): policy loaded auid=3D42=
94967295 ses=3D4294967295=0D
[    3.579919] systemd[1]: Successfully loaded SELinux policy in 227ms 104u=
s.=0D
[    3.605685] systemd[1]: Successfully loaded SELinux database in 20ms 467=
us, size on heap is 475K.=0D
[    3.615953] SELinux: initialized (dev tmpfs, type tmpfs), uses transitio=
n SIDs=0D
[    3.621781] SELinux: initialized (dev cgroup, type cgroup), uses genfs_c=
ontexts=0D
[    3.663383] systemd[1]: Relabelled /dev and /run in 36ms 134us.=0D
[    3.671053] SELinux: initialized (dev cgroup, type cgroup), uses genfs_c=
ontexts=0D
[    3.680231] SELinux: initialized (dev cgroup, type cgroup), uses genfs_c=
ontexts=0D
[    3.687169] SELinux: initialized (dev cgroup, type cgroup), uses genfs_c=
ontexts=0D
[    3.694132] SELinux: initialized (dev cgroup, type cgroup), uses genfs_c=
ontexts=0D
[    3.701283] SELinux: initialized (dev cgroup, type cgroup), uses genfs_c=
ontexts=0D
[    3.708245] SELinux: initialized (dev cgroup, type cgroup), uses genfs_c=
ontexts=0D
[    3.715161] SELinux: initialized (dev cgroup, type cgroup), uses genfs_c=
ontexts=0D
[    3.722144] SELinux: initialized (dev cgroup, type cgroup), uses genfs_c=
ontexts=0D
[    3.727664] systemd[1]: systemd 36 running in system mode. (+PAM +LIBWRA=
P +AUDIT +SELINUX +SYSVINIT +LIBCRYPTSETUP; fedora)=0D
=0D
Welcome to =1B[0;34mFedora release 16 (Verne)=1B[0m!=0D
=0D
[    3.742612] systemd[1]: No hostname configured.=0D
[    3.747987] systemd[1]: Initializing machine ID from random generator.=0D
[    3.797336] systemd[1]: Failed to fully start up daemon: No such file or=
 directory=0D
[    3.802905] systemd[1]: Cannot add dependency job for unit fedora-readon=
ly.service, ignoring: Unit fedora-readonly.service failed to load: No such =
file or directory. See system logs and 'systemctl status fedora-readonly.se=
rvice' for details.=0D
[    3.818227] systemd[1]: Cannot add dependency job for unit fedora-wait-s=
torage.service, ignoring: Unit fedora-wait-storage.service failed to load: =
No such file or directory. See system logs and 'systemctl status fedora-wai=
t-storage.service' for details.=0D
[    3.834163] systemd[1]: Cannot add dependency job for unit systemd-remou=
nt-api-vfs.service, ignoring: Unit systemd-remount-api-vfs.service failed t=
o load: No such file or directory. See system logs and 'systemctl status sy=
stemd-remount-api-vfs.service' for details.=0D
[    3.850870] systemd[1]: Cannot add dependency job for unit fedora-storag=
e-init.service, ignoring: Unit fedora-storage-init.service failed to load: =
No such file or directory. See system logs and 'systemctl status fedora-sto=
rage-init.service' for details.=0D
[    3.866800] systemd[1]: Cannot add dependency job for unit lvm2-monitor.=
service, ignoring: Unit dm-event.socket failed to load: No such file or dir=
ectory. See system logs and 'systemctl status dm-event.socket' for details.=
=0D
[    3.880880] systemd[1]: Cannot add dependency job for unit avahi-daemon.=
socket, ignoring: Unit avahi-daemon.socket failed to load: No such file or =
directory. See system logs and 'systemctl status avahi-daemon.socket' for d=
etails.=0D
[    3.895344] systemd[1]: Cannot add dependency job for unit rpcbind.socke=
t, ignoring: Unit rpcbind.socket failed to load: No such file or directory.=
 See system logs and 'systemctl status rpcbind.socket' for details.=0D
[    3.908905] systemd[1]: Cannot add dependency job for unit dm-event.sock=
et, ignoring: Unit dm-event.socket failed to load: No such file or director=
y. See system logs and 'systemctl status dm-event.socket' for details.=0D
[    3.922659] systemd[1]: Cannot add dependency job for unit ip6tables.ser=
vice, ignoring: Unit ip6tables.service failed to load: No such file or dire=
ctory. See system logs and 'systemctl status ip6tables.service' for details=
=2E=0D
[    3.936779] systemd[1]: Cannot add dependency job for unit iptables.serv=
ice, ignoring: Unit iptables.service failed to load: No such file or direct=
ory. See system logs and 'systemctl status iptables.service' for details.=0D
Starting Collect Read-Ahead Data...=0D
Started Replay Read-Ahead Data.=0D
[    3.968340] SELinux: initialized (dev autofs, type autofs), uses genfs_c=
ontexts=0D
[    3.968667] systemd-readahead-collect[250]: Disabling readahead collecto=
r due to execution in virtualized environment.=0D
Started Lock Directory.=0D
Starting Software RAID Monitor Takeover...=0D
Starting Initialize storage subsystems (RAID, LVM, etc.)...=0D
Starting Huge Pages File System...=0D
Starting Debug File System...=0D
Starting udev Kernel Device Manager...=0D
[    4.065434] SELinux: initialized (dev hugetlbfs, type hugetlbfs), uses t=
ransition SIDs=0D
Starting udev Coldplug all Devices...=0D
Starting Security File System...=0D
[    4.099951] udevd[258]: starting version 173=0D
Starting POSIX Message Queue File System...=0D
Starting Syslog Kernel Log Buffer Bridge...=0D
Started Syslog Kernel Log Buffer Bridge.=0D
Starting Runtime Directory...=0D
Started udev Kernel Device Manager.=0D
Started Collect Read-Ahead Data.=0D
Started Software RAID Monitor Takeover.=0D
[    4.197489] systemd[1]: fedora-storage-init-late.service: main process e=
xited, code=3Dexited, status=3D203=0D
Starting Initialize storage subsystems (RAID, LVM, etc.) =1B[1;31mfailed=1B=
[0m, see 'systemctl status fedora-storage-init-late.service' for details.=0D
[    4.218820] systemd[1]: Unit fedora-storage-init-late.service entered fa=
iled state.=0D
Started Huge Pages File System.=0D
Started Debug File System.=0D
Started Security File System.=0D
Started POSIX Message Queue File System.=0D
Started Runtime Directory.=0D
Starting Monitoring of LVM2 mirrors, snapshots etc. using dmeventd or progr=
ess polling...=0D
Started Load legacy module configuration.=0D
Starting File System Check on Root Device...=0D
Starting Setup Virtual Console...=0D
[    4.393227] vbd vbd-5632: 19 xenbus_dev_probe on device/vbd/5632=0D
[    4.399669] systemd-fsck[359]: Root directory is writable, skipping chec=
k.=0D
Starting Apply Kernel Variables...=0D
Started Load Kernel Modules.=0D
Started Configuration File System.=0D
Started FUSE Control File System.=0D
[    4.446423] systemd-vconsole-setup[361]: /bin/loadkeys failed with error=
 code 1.=0D
[    4.451793] systemd-vconsole-setup[361]: /bin/setfont failed with error =
code 1.=0D
[    4.458335] Initialising Xen virtual ethernet driver.=0D
Started Set Up Additional Binary Formats.=0D
Starting STDOUT Syslog Bridge...=0D
Started STDOUT Syslog Bridge.=0D
Started udev Coldplug all Devices.=0D
[    4.513179] lvm[291]: No volume groups found=0D
Started File System Check on Root Device.=0D
[    4.527208] vbd vbd-5632: failed to write error node for device/vbd/5632=
 (19 xenbus_dev_probe on device/vbd/5632)=0D
Started Monitoring of LVM2 mirrors, snapshots etc. using dmeventd or progre=
ss polling.=0D
Started Setup Virtual Console.=0D
[    4.569936] blkfront: xvda: flush diskcache: enabled=0D
[    4.585982]  xvda: xvda1 xvda2 xvda3=0D
Started Apply Kernel Variables.=0D
Starting Remount Root FS...=0D
Starting udev Wait for Complete Device Initialization...=0D
[    4.662937] mount[427]: warning: can't open /etc/fstab: No such file or =
directory=0D
[    4.685670] EXT4-fs (dm-0): re-mounted. Opts: user_xattr,acl,barrier=3D1=
,data=3Dordered=0D
Started Remount Root FS.=0D
Started Mark the need to relabel after reboot.=0D
Started Relabel all filesystems, if necessary.=0D
Started Reconfigure the system on administrator request.=0D
Starting Load Random Seed...=0D
Starting Recreate Volatile Files and Directories...=0D
Started Load Random Seed.=0D
[    4.792244] systemd-tmpfiles[453]: Successfully loaded SELinux database =
in 12ms 670us, size on heap is 476K.=0D
Started Recreate Volatile Files and Directories.=0D
Started udev Wait for Complete Device Initialization.=0D
Starting anaconda performance monitor...=0D
Started anaconda performance monitor.=0D
Starting System Logging Service...=0D
Starting Shell on tty2...=0D
Started Shell on tty2.=0D
Starting Anaconda version 16.25.=0D

--zhXaljGHf11kAtnf
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="good.xenstore.ls"

tool = ""
 xenstored = ""
local = ""
 pool = ""
  0 = ""
   other_config = ""
   description = "Pool-0"
   uuid = "3fce40dc-fbca-8ba6-544a-2cdb7a512b89"
   name = "Pool-0"
 domain = ""
  0 = ""
   vm = "/vm/00000000-0000-0000-0000-000000000000"
   device = ""
   control = ""
    platform-feature-multiprocessor-suspend = "1"
   memory = ""
    target = "6737814"
    static-max = "4294967292"
    freemem-slack = "1258182"
   guest = ""
   hvmpv = ""
   data = ""
   cpu = ""
    1 = ""
     availability = "online"
    3 = ""
     availability = "online"
    2 = ""
     availability = "online"
    0 = ""
     availability = "online"
    5 = ""
     availability = "online"
    4 = ""
     availability = "online"
   description = ""
   console = ""
    limit = "1048576"
    type = "xenconsoled"
   domid = "0"
   name = "Domain-0"
   device-model = ""
    24 = ""
     disable_pf = "0"
     state = "running"
   backend = ""
    qdisk = ""
     24 = ""
      5632 = ""
       frontend = "/local/domain/24/device/vbd/5632"
       params = "aio:/mnt/iso/Fedora-16-x86_64-DVD.iso"
       frontend-id = "24"
       online = "1"
       removable = "1"
       bootable = "1"
       state = "6"
       dev = "hdc"
       type = "tap"
       mode = "r"
       feature-barrier = "1"
       info = "4"
       sector-size = "512"
       sectors = "7337984"
       hotplug-status = "connected"
    vbd = ""
     24 = ""
      768 = ""
       frontend = "/local/domain/24/device/vbd/768"
       physical-device = "fd:2"
       params = "/dev/vg_guest/f16_64"
       frontend-id = "24"
       online = "1"
       removable = "0"
       bootable = "1"
       state = "4"
       dev = "hda"
       type = "phy"
       mode = "w"
       feature-flush-cache = "1"
       sectors = "41943040"
       info = "0"
       sector-size = "512"
    vif = ""
     24 = ""
      0 = ""
       frontend = "/local/domain/24/device/vif/0"
       frontend-id = "24"
       online = "1"
       state = "4"
       script = "/etc/xen/scripts/vif-bridge"
       mac = "00:0f:4b:00:00:71"
       bridge = "switch"
       handle = "0"
       feature-sg = "1"
       feature-gso-tcpv4 = "1"
       feature-rx-copy = "1"
       feature-rx-flip = "0"
       hotplug-status = "connected"
    console = ""
     24 = ""
      0 = ""
       frontend = "/local/domain/24/console"
       frontend-id = "24"
       online = "1"
       state = "1"
       domain = "test"
       protocol = "vt100"
  24 = ""
   vm = "/vm/56439f87-e4ea-4044-8f68-f13931a04cdd"
   name = "test"
   control = ""
    shutdown = ""
    platform-feature-multiprocessor-suspend = "1"
   device = ""
    suspend = ""
     event-channel = ""
    vbd = ""
     5632 = ""
      backend = "/local/domain/0/backend/qdisk/24/5632"
      backend-id = "0"
      state = "6"
      virtual-device = "5632"
      device-type = "cdrom"
     768 = ""
      backend = "/local/domain/0/backend/vbd/24/768"
      backend-id = "0"
      state = "4"
      virtual-device = "768"
      device-type = "disk"
      ring-ref = "770"
      event-channel = "19"
      protocol = "x86_64-abi"
    vif = ""
     0 = ""
      backend = "/local/domain/0/backend/vif/24/0"
      backend-id = "0"
      state = "4"
      handle = "0"
      mac = "00:0f:4b:00:00:71"
      tx-ring-ref = "768"
      rx-ring-ref = "769"
      event-channel = "18"
      request-rx-copy = "1"
      feature-rx-notify = "1"
      feature-sg = "1"
      feature-gso-tcpv4 = "1"
   data = ""
   cpu = ""
    0 = ""
     availability = "online"
    1 = ""
     availability = "online"
   memory = ""
    static-max = "1048576"
    target = "1040384"
    videoram = "8192"
   error = ""
   drivers = ""
   attr = ""
   messages = ""
   domid = "24"
   store = ""
    port = "3"
    ring-ref = "1044476"
   console = ""
    backend = "/local/domain/0/backend/console/24/0"
    backend-id = "0"
    limit = "1048576"
    type = "xenconsoled"
    output = "pty"
    port = "4"
    ring-ref = "1044479"
    tty = "/dev/pts/2"
    vnc-port = "5900"
    vnc-listen = "0.0.0.0"
   image = ""
    device-model-pid = "22863"
   serial = ""
    0 = ""
     tty = "/dev/pts/3"
vm = ""
 00000000-0000-0000-0000-000000000000 = ""
  on_xend_stop = "ignore"
  pool_name = "Pool-0"
  shadow_memory = "0"
  uuid = "00000000-0000-0000-0000-000000000000"
  on_reboot = "restart"
  image = "(linux (kernel '') (superpages 0) (nomigrate 0) (tsc_mode 0))"
   ostype = "linux"
   kernel = ""
   cmdline = ""
   ramdisk = ""
  on_poweroff = "destroy"
  bootloader_args = ""
  on_xend_start = "ignore"
  on_crash = "restart"
  xend = ""
   restart_count = "0"
  vcpus = "6"
  vcpu_avail = "63"
  bootloader = ""
  name = "Domain-0"
  memory = "6579"
 56439f87-e4ea-4044-8f68-f13931a04cdd = ""
  uuid = "56439f87-e4ea-4044-8f68-f13931a04cdd"
  name = "test"
  pool_name = "Pool-0"
  rtc = ""
   timeoffset = ""
  image = ""
   ostype = "linux"
   kernel = ""
   cmdline = ""
   ramdisk = ""
  start_time = "1320338742.08"

--zhXaljGHf11kAtnf
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="fail.xenstore.ls"

tool = ""
 xenstored = ""
local = ""
 pool = ""
  0 = ""
   other_config = ""
   description = "Pool-0"
   uuid = "3fce40dc-fbca-8ba6-544a-2cdb7a512b89"
   name = "Pool-0"
 domain = ""
  0 = ""
   vm = "/vm/00000000-0000-0000-0000-000000000000"
   device = ""
   control = ""
    platform-feature-multiprocessor-suspend = "1"
   error = ""
   memory = ""
    target = "6923264"
   guest = ""
   hvmpv = ""
   data = ""
   cpu = ""
    1 = ""
     availability = "online"
    3 = ""
     availability = "online"
    2 = ""
     availability = "online"
    0 = ""
     availability = "online"
    5 = ""
     availability = "online"
    4 = ""
     availability = "online"
   description = ""
   console = ""
    limit = "1048576"
    type = "xenconsoled"
   domid = "0"
   name = "Domain-0"
   device-model = ""
    10 = ""
     disable_pf = "0"
     state = "running"
   backend = ""
    vkbd = ""
     10 = ""
      0 = ""
       frontend-id = "10"
       domain = "test"
       frontend = "/local/domain/10/device/vkbd/0"
       state = "1"
       online = "1"
    vfb = ""
     10 = ""
      0 = ""
       vncunused = "1"
       domain = "test"
       vnc = "1"
       uuid = "c71b1930-aa4f-b623-e23e-a304470b3f6c"
       frontend = "/local/domain/10/device/vfb/0"
       state = "1"
       keymap = "en-us"
       online = "1"
       frontend-id = "10"
       location = "127.0.0.1:5900"
    vbd = ""
     10 = ""
      768 = ""
       domain = "test"
       frontend = "/local/domain/10/device/vbd/768"
       uuid = "ee7800e1-fae0-dfe2-9345-96fda7d7851f"
       bootable = "1"
       dev = "hda"
       state = "4"
       params = "/var/lib/xen/images/test.img"
       mode = "w"
       online = "1"
       frontend-id = "10"
       type = "file"
       node = "/dev/loop0"
       physical-device = "7:0"
       hotplug-status = "connected"
       feature-flush-cache = "1"
       sectors = "41943040"
       info = "0"
       sector-size = "512"
      5632 = ""
       domain = "test"
       frontend = "/local/domain/10/device/vbd/5632"
       uuid = "845f9e71-e199-cf1d-9e86-2cf611af2cf4"
       bootable = "0"
       dev = "hdc"
       state = "6"
       params = "/mnt/iso/Fedora-16-x86_64-DVD.iso"
       mode = "r"
       online = "1"
       frontend-id = "10"
       type = "file"
       node = "/dev/loop1"
       physical-device = "7:1"
       hotplug-status = "connected"
    vif = ""
     10 = ""
      0 = ""
       bridge = "switch"
       domain = "test"
       handle = "0"
       uuid = "80226026-6aa8-7c4a-d04c-5a9d4cf09475"
       script = "/etc/xen/scripts/vif-bridge"
       state = "4"
       frontend = "/local/domain/10/device/vif/0"
       mac = "00:16:3e:21:bf:4a"
       online = "1"
       frontend-id = "10"
       feature-sg = "1"
       feature-gso-tcpv4 = "1"
       feature-rx-copy = "1"
       feature-rx-flip = "0"
       hotplug-status = "connected"
    console = ""
     10 = ""
      0 = ""
       domain = "test"
       protocol = "vt100"
       uuid = "5adbae31-9c23-76be-53f2-0122ef6be46c"
       frontend = "/local/domain/10/device/console/0"
       state = "2"
       location = "3"
       online = "1"
       frontend-id = "10"
       hotplug-status = "connected"
  10 = ""
   vm = "/vm/0e2b184c-3be8-af91-69b7-4b7f5550d083"
   device = ""
    vkbd = ""
     0 = ""
      state = "3"
      backend-id = "0"
      backend = "/local/domain/0/backend/vkbd/10/0"
      page-ref = "233204"
      page-gref = "770"
      event-channel = "15"
    vfb = ""
     0 = ""
      state = "1"
      backend-id = "0"
      backend = "/local/domain/0/backend/vfb/10/0"
    vbd = ""
     768 = ""
      backend-id = "0"
      virtual-device = "768"
      device-type = "disk"
      state = "4"
      backend = "/local/domain/0/backend/vbd/10/768"
      ring-ref = "8"
      event-channel = "13"
      protocol = "x86_64-abi"
     5632 = ""
      backend-id = "0"
      virtual-device = "5632"
      device-type = "cdrom"
      state = "6"
      backend = "/local/domain/0/backend/vbd/10/5632"
    vif = ""
     0 = ""
      backend-id = "0"
      mac = "00:16:3e:21:bf:4a"
      handle = "0"
      state = "4"
      backend = "/local/domain/0/backend/vif/10/0"
      tx-ring-ref = "768"
      rx-ring-ref = "769"
      event-channel = "14"
      request-rx-copy = "1"
      feature-rx-notify = "1"
      feature-sg = "1"
      feature-gso-tcpv4 = "1"
    console = ""
     0 = ""
      state = "1"
      backend-id = "0"
      backend = "/local/domain/0/backend/console/10/0"
   control = ""
    platform-feature-multiprocessor-suspend = "1"
   error = ""
    device = ""
     vbd = ""
      5632 = ""
       error = "19 xenbus_dev_probe on device/vbd/5632"
   memory = ""
    target = "1048576"
   guest = ""
   hvmpv = ""
   data = ""
   device-misc = ""
    vif = ""
     nextDeviceID = "1"
    console = ""
     nextDeviceID = "1"
   image = ""
    device-model-fifo = "/var/run/xend/dm-10-1320337040.fifo"
    device-model-pid = "11724"
    suspend-cancel = "1"
   console = ""
    port = "3"
    limit = "1048576"
    type = "ioemu"
    vnc-port = "5900"
    vnc-listen = "127.0.0.1"
    tty = "/dev/pts/3"
   description = ""
   domid = "10"
   cpu = ""
    0 = ""
     availability = "online"
   store = ""
    ring-ref = "1044476"
    port = "2"
   name = "test"
   serial = ""
    0 = ""
     tty = "/dev/pts/2"
vm = ""
 00000000-0000-0000-0000-000000000000 = ""
  on_xend_stop = "ignore"
  pool_name = "Pool-0"
  shadow_memory = "0"
  uuid = "00000000-0000-0000-0000-000000000000"
  on_reboot = "restart"
  image = "(linux (kernel '') (superpages 0) (nomigrate 0) (tsc_mode 0))"
   ostype = "linux"
   kernel = ""
   cmdline = ""
   ramdisk = ""
  on_poweroff = "destroy"
  bootloader_args = ""
  on_xend_start = "ignore"
  on_crash = "restart"
  xend = ""
   restart_count = "0"
  vcpus = "6"
  vcpu_avail = "63"
  bootloader = ""
  name = "Domain-0"
  memory = "6761"
 0e2b184c-3be8-af91-69b7-4b7f5550d083 = ""
  image = "(hvm (kernel '') (superpages 0) (hpet 0) (loader /usr/lib/xen/boo\..."
   ostype = "hvm"
   kernel = ""
   cmdline = ""
   ramdisk = ""
   dmargs = "-domain-name test -videoram 4 -k en-us -vnc 127.0.0.1:0 -vncunu\..."
   device-model = "/usr/lib64/xen/bin/qemu-dm"
   display = ""
  rtc = ""
   timeoffset = "0"
  device = ""
   vkbd = ""
    0 = ""
     frontend = "/local/domain/10/device/vkbd/0"
     frontend-id = "10"
     backend-id = "0"
     backend = "/local/domain/0/backend/vkbd/10/0"
   vfb = ""
    0 = ""
     frontend = "/local/domain/10/device/vfb/0"
     frontend-id = "10"
     backend-id = "0"
     backend = "/local/domain/0/backend/vfb/10/0"
   vbd = ""
    768 = ""
     frontend = "/local/domain/10/device/vbd/768"
     frontend-id = "10"
     backend-id = "0"
     backend = "/local/domain/0/backend/vbd/10/768"
    5632 = ""
     frontend = "/local/domain/10/device/vbd/5632"
     frontend-id = "10"
     backend-id = "0"
     backend = "/local/domain/0/backend/vbd/10/5632"
   vif = ""
    0 = ""
     frontend = "/local/domain/10/device/vif/0"
     frontend-id = "10"
     backend-id = "0"
     backend = "/local/domain/0/backend/vif/10/0"
   console = ""
    0 = ""
     frontend = "/local/domain/10/device/console/0"
     frontend-id = "10"
     backend-id = "0"
     backend = "/local/domain/0/backend/console/10/0"
  on_xend_stop = "ignore"
  pool_name = "Pool-0"
  shadow_memory = "9"
  uuid = "0e2b184c-3be8-af91-69b7-4b7f5550d083"
  on_reboot = "destroy"
  start_time = "1320337040.91"
  on_poweroff = "destroy"
  bootloader_args = ""
  on_xend_start = "ignore"
  on_crash = "destroy"
  xend = ""
   restart_count = "0"
  vcpus = "1"
  vcpu_avail = "1"
  bootloader = ""
  name = "test"

--zhXaljGHf11kAtnf
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="fail.log"
Content-Transfer-Encoding: quoted-printable

[    0.000000] Initializing cgroup subsys cpuset=0D
[    0.000000] Initializing cgroup subsys cpu=0D
[    0.000000] Linux version 3.1.0-7.fc16.x86_64 (mockbuild@x86-07.phx2.fed=
oraproject.org) (gcc version 4.6.2 20111027 (Red Hat 4.6.2-1) (GCC) ) #1 SM=
P Tue Nov 1 21:10:48 UTC 2011=0D
[    0.000000] Command line: initrd=3Dinitrd.img xdriver=3Dvesa nomodeset l=
oglevel=3D10 debug console=3DttyS0 BOOT_IMAGE=3Dvmlinuz =0D
[    0.000000] BIOS-provided physical RAM map:=0D
[    0.000000]  BIOS-e820: 0000000000000000 - 000000000009e000 (usable)=0D
[    0.000000]  BIOS-e820: 000000000009e000 - 00000000000a0000 (reserved)=0D
[    0.000000]  BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)=0D
[    0.000000]  BIOS-e820: 0000000000100000 - 0000000040000000 (usable)=0D
[    0.000000]  BIOS-e820: 00000000fc000000 - 0000000100000000 (reserved)=0D
[    0.000000] NX (Execute Disable) protection: active=0D
[    0.000000] DMI 2.4 present.=0D
[    0.000000] DMI: Xen HVM domU, BIOS 4.1-111102 10/14/2011=0D
[    0.000000] Hypervisor detected: Xen HVM=0D
[    0.000000] Xen version 4.1.=0D
[    0.000000] Xen Platform PCI: I/O protocol version 1=0D
[    0.000000] Netfront and the Xen platform PCI driver have been compiled =
for this kernel: unplug emulated NICs.=0D
[    0.000000] Blkfront and the Xen platform PCI driver have been compiled =
for this kernel: unplug emulated disks.=0D
[    0.000000] You might have to change the root device=0D
[    0.000000] from /dev/hd[a-d] to /dev/xvd[a-d]=0D
[    0.000000] in your root=3D kernel command line option=0D
[    0.000000] HVMOP_pagetable_dying not supported=0D
[    0.000000] e820 update range: 0000000000000000 - 0000000000010000 (usab=
le) =3D=3D> (reserved)=0D
[    0.000000] e820 remove range: 00000000000a0000 - 0000000000100000 (usab=
le)=0D
[    0.000000] No AGP bridge found=0D
[    0.000000] last_pfn =3D 0x40000 max_arch_pfn =3D 0x400000000=0D
[    0.000000] MTRR default type: write-back=0D
[    0.000000] MTRR fixed ranges enabled:=0D
[    0.000000]   00000-9FFFF write-back=0D
[    0.000000]   A0000-BFFFF write-combining=0D
[    0.000000]   C0000-FFFFF write-back=0D
[    0.000000] MTRR variable ranges enabled:=0D
[    0.000000]   0 base 0000F0000000 mask FFFFF8000000 uncachable=0D
[    0.000000]   1 base 0000F8000000 mask FFFFFC000000 uncachable=0D
[    0.000000]   2 disabled=0D
[    0.000000]   3 disabled=0D
[    0.000000]   4 disabled=0D
[    0.000000]   5 disabled=0D
[    0.000000]   6 disabled=0D
[    0.000000]   7 disabled=0D
[    0.000000] TOM2: 0000000230000000 aka 8960M=0D
[    0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x701060007=
0106=0D
[    0.000000] found SMP MP-table at [ffff8800000fbc90] fbc90=0D
[    0.000000] initial memory mapped : 0 - 20000000=0D
[    0.000000] Base memory trampoline at [ffff880000099000] 99000 size 2048=
0=0D
[    0.000000] init_memory_mapping: 0000000000000000-0000000040000000=0D
[    0.000000]  0000000000 - 0040000000 page 2M=0D
[    0.000000] kernel direct mapping tables up to 40000000 @ 1fffe000-20000=
000=0D
[    0.000000] RAMDISK: 37e77000 - 3ffdf000=0D
[    0.000000] ACPI: RSDP 00000000000ea020 00024 (v02    Xen)=0D
[    0.000000] ACPI: XSDT 00000000fc0134b0 00034 (v01    Xen      HVM 00000=
000 HVML 00000000)=0D
[    0.000000] ACPI: FACP 00000000fc0132d0 000F4 (v04    Xen      HVM 00000=
000 HVML 00000000)=0D
[    0.000000] ACPI: DSDT 00000000fc003440 0FE05 (v02    Xen      HVM 00000=
000 INTL 20100528)=0D
[    0.000000] ACPI: FACS 00000000fc003400 00040=0D
[    0.000000] ACPI: APIC 00000000fc0133d0 000D8 (v02    Xen      HVM 00000=
000 HVML 00000000)=0D
[    0.000000] ACPI: Local APIC address 0xfee00000=0D
[    0.000000] No NUMA configuration found=0D
[    0.000000] Faking a node at 0000000000000000-0000000040000000=0D
[    0.000000] Initmem setup node 0 0000000000000000-0000000040000000=0D
[    0.000000]   NODE_DATA [000000003ffec000 - 000000003fffffff]=0D
[    0.000000]  [ffffea0000000000-ffffea0000ffffff] PMD -> [ffff88003660000=
0-ffff8800375fffff] on node 0=0D
[    0.000000] Zone PFN ranges:=0D
[    0.000000]   DMA      0x00000010 -> 0x00001000=0D
[    0.000000]   DMA32    0x00001000 -> 0x00100000=0D
[    0.000000]   Normal   empty=0D
[    0.000000] Movable zone start PFN for each node=0D
[    0.000000] early_node_map[2] active PFN ranges=0D
[    0.000000]     0: 0x00000010 -> 0x0000009e=0D
[    0.000000]     0: 0x00000100 -> 0x00040000=0D
[    0.000000] On node 0 totalpages: 262030=0D
[    0.000000]   DMA zone: 64 pages used for memmap=0D
[    0.000000]   DMA zone: 5 pages reserved=0D
[    0.000000]   DMA zone: 3913 pages, LIFO batch:0=0D
[    0.000000]   DMA32 zone: 4032 pages used for memmap=0D
[    0.000000]   DMA32 zone: 254016 pages, LIFO batch:31=0D
[    0.000000] ACPI: PM-Timer IO Port: 0xb008=0D
[    0.000000] ACPI: Local APIC address 0xfee00000=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x02] enabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x02] lapic_id[0x04] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x03] lapic_id[0x06] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x04] lapic_id[0x08] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x05] lapic_id[0x0a] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x06] lapic_id[0x0c] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x07] lapic_id[0x0e] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x08] lapic_id[0x10] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x09] lapic_id[0x12] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x0a] lapic_id[0x14] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x0b] lapic_id[0x16] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x0c] lapic_id[0x18] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x0d] lapic_id[0x1a] disabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x0e] lapic_id[0x1c] disabled)=0D
[    0.000000] ACPI: IOAPIC (id[0x01] address[0xfec00000] gsi_base[0])=0D
[    0.000000] IOAPIC[0]: apic_id 1, version 17, address 0xfec00000, GSI 0-=
47=0D
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)=0D
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 5 global_irq 5 low level)=0D
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 10 global_irq 10 low level)=
=0D
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 11 global_irq 11 low level)=
=0D
[    0.000000] ACPI: IRQ0 used by override.=0D
[    0.000000] ACPI: IRQ2 used by override.=0D
[    0.000000] ACPI: IRQ5 used by override.=0D
[    0.000000] ACPI: IRQ9 used by override.=0D
[    0.000000] ACPI: IRQ10 used by override.=0D
[    0.000000] ACPI: IRQ11 used by override.=0D
[    0.000000] Using ACPI (MADT) for SMP configuration information=0D
[    0.000000] SMP: Allowing 15 CPUs, 13 hotplug CPUs=0D
[    0.000000] nr_irqs_gsi: 64=0D
[    0.000000] PM: Registered nosave memory: 000000000009e000 - 00000000000=
a0000=0D
[    0.000000] PM: Registered nosave memory: 00000000000a0000 - 00000000000=
e0000=0D
[    0.000000] PM: Registered nosave memory: 00000000000e0000 - 00000000001=
00000=0D
[    0.000000] Allocating PCI resources starting at 40000000 (gap: 40000000=
:bc000000)=0D
[    0.000000] Booting paravirtualized kernel on Xen HVM=0D
[    0.000000] setup_percpu: NR_CPUS:256 nr_cpumask_bits:256 nr_cpu_ids:15 =
nr_node_ids:1=0D
[    0.000000] PERCPU: Embedded 27 pages/cpu @ffff880037c00000 s81024 r8192=
 d21376 u131072=0D
[    0.000000] pcpu-alloc: s81024 r8192 d21376 u131072 alloc=3D1*2097152=0D
[    0.000000] pcpu-alloc: [0] 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14=
 -- =0D
[    0.000000] Built 1 zonelists in Node order, mobility grouping on.  Tota=
l pages: 257929=0D
[    0.000000] Policy zone: DMA32=0D
[    0.000000] Kernel command line: initrd=3Dinitrd.img xdriver=3Dvesa nomo=
deset loglevel=3D10 debug console=3DttyS0 BOOT_IMAGE=3Dvmlinuz =0D
[    0.000000] PID hash table entries: 4096 (order: 3, 32768 bytes)=0D
[    0.000000] Checking aperture...=0D
[    0.000000] No AGP bridge found=0D
[    0.000000] Calgary: detecting Calgary via BIOS EBDA area=0D
[    0.000000] Calgary: Unable to locate Rio Grande table in EBDA - bailing=
!=0D
[    0.000000] Memory: 883228k/1048576k available (4868k kernel code, 456k =
absent, 164892k reserved, 6781k data, 940k init)=0D
[    0.000000] SLUB: Genslabs=3D15, HWalign=3D64, Order=3D0-3, MinObjects=
=3D0, CPUs=3D15, Nodes=3D1=0D
[    0.000000] Hierarchical RCU implementation.=0D
[    0.000000] 	RCU dyntick-idle grace-period acceleration is enabled.=0D
[    0.000000] NR_IRQS:16640 nr_irqs:1208 16=0D
[    0.000000] Xen HVM callback vector for event delivery is enabled=0D
[    0.000000] Console: colour VGA+ 80x25=0D
[    0.000000] console [ttyS0] enabled=0D
[    0.000000] allocated 8388608 bytes of page_cgroup=0D
[    0.000000] please try 'cgroup_disable=3Dmemory' option if you don't wan=
t memory cgroups=0D
[    0.000000] Detected 3000.224 MHz processor.=0D
[    0.000000] Marking TSC unstable due to TSCs unsynchronized=0D
[    0.007999] Calibrating delay loop (skipped), value calculated using tim=
er frequency.. 6000.44 BogoMIPS (lpj=3D3000224)=0D
[    0.021001] pid_max: default: 32768 minimum: 301=0D
[    0.028024] Security Framework initialized=0D
[    0.035005] SELinux:  Initializing.=0D
[    0.039014] SELinux:  Starting in permissive mode=0D
[    0.045139] Dentry cache hash table entries: 131072 (order: 8, 1048576 b=
ytes)=0D
[    0.054254] Inode-cache hash table entries: 65536 (order: 7, 524288 byte=
s)=0D
[    0.063097] Mount-cache hash table entries: 256=0D
[    0.066118] Initializing cgroup subsys cpuacct=0D
[    0.071999] Initializing cgroup subsys memory=0D
[    0.077007] Initializing cgroup subsys devices=0D
[    0.079995] Initializing cgroup subsys freezer=0D
[    0.082995] Initializing cgroup subsys net_cls=0D
[    0.085995] Initializing cgroup subsys blkio=0D
[    0.088999] Initializing cgroup subsys perf_event=0D
[    0.093091] tseg: 0000000000=0D
[    0.095021] CPU: Physical Processor ID: 0=0D
[    0.096993] CPU: Processor Core ID: 0=0D
[    0.100994] mce: CPU supports 6 MCE banks=0D
[    0.106013] using AMD E400 aware idle routine=0D
[    0.112705] ACPI: Core revision 20110623=0D
[    0.121929] ftrace: allocating 25204 entries in 99 pages=0D
[    0.144988] Not enabling x2apic, Intr-remapping init failed.=0D
[    0.153990] Switched APIC routing to physical flat.=0D
[    0.161262] ..TIMER: vector=3D0x30 apic1=3D0 pin1=3D2 apic2=3D0 pin2=3D0=
=0D
[    0.179713] CPU0: AMD Phenom(tm) II X6 1075T Processor stepping 00=0D
[    0.188988] Xen: using vcpuop timer interface=0D
[    0.194987] installing Xen timer for CPU 0=0D
[    0.200035] Performance Events: Broken PMU hardware detected, using soft=
ware events only.=0D
[    0.204119] NMI watchdog disabled (cpu0): hardware events not enabled=0D
[    0.205112] Booting Node   0, Processors  #1=0D
[    0.206981] smpboot cpu 1: start_ip =3D 99000=0D
[    0.342059] NMI watchdog disabled (cpu1): hardware events not enabled=0D
[    0.342052] installing Xen timer for CPU 1=0D
[    0.343000] Brought up 2 CPUs=0D
[    0.343969] Total of 2 processors activated (6914.12 BogoMIPS).=0D
[    0.349014] devtmpfs: initialized=0D
[    0.381973] atomic64 test passed for x86-64 platform with CX8 and with S=
SE=0D
[    0.382990] RTC time: 16:48:06, date: 11/03/11=0D
[    0.384009] NET: Registered protocol family 16=0D
[    0.403070] Extended Config Space enabled on 0 nodes=0D
[    0.404067] ACPI: bus type pci registered=0D
[    0.406996] PCI: Using configuration type 1 for base access=0D
[    0.407959] PCI: Using configuration type 1 for extended access=0D
[    0.414023] bio: create slab <bio-0> at 0=0D
[    0.470028] ACPI: Added _OSI(Module Device)=0D
[    0.470959] ACPI: Added _OSI(Processor Device)=0D
[    0.471950] ACPI: Added _OSI(3.0 _SCP Extensions)=0D
[    0.472949] ACPI: Added _OSI(Processor Aggregator Device)=0D
[    0.482957] ACPI: EC: Look up EC in DSDT=0D
[    0.506062] ACPI: Interpreter enabled=0D
[    0.506949] ACPI: (supports S0 S3 S4 S5)=0D
[    0.511945] ACPI: Using IOAPIC for interrupt routing=0D
[    0.776961] ACPI: No dock devices found.=0D
[    0.777907] HEST: Table not found.=0D
[    0.778904] PCI: Using host bridge windows from ACPI; if necessary, use =
"pci=3Dnocrs" and report a bug=0D
[    0.779972] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])=0D
[    0.780996] pci_root PNP0A03:00: host bridge window [io  0x0000-0x0cf7]=
=0D
[    0.781903] pci_root PNP0A03:00: host bridge window [io  0x0d00-0xffff]=
=0D
[    0.782902] pci_root PNP0A03:00: host bridge window [mem 0x000a0000-0x00=
0bffff]=0D
[    0.783902] pci_root PNP0A03:00: host bridge window [mem 0xf0000000-0xfb=
ffffff]=0D
[    0.785902] pci 0000:00:00.0: [8086:1237] type 0 class 0x000600=0D
[    0.795047] pci 0000:00:01.0: [8086:7000] type 0 class 0x000601=0D
[    0.809898] pci 0000:00:01.1: [8086:7010] type 0 class 0x000101=0D
[    0.818896] pci 0000:00:01.1: reg 20: [io  0xc140-0xc14f]=0D
[    0.825897] pci 0000:00:01.3: [8086:7113] type 0 class 0x000680=0D
[    0.826932] * Found PM-Timer Bug on the chipset. Due to workarounds for =
a bug,=0D
[    0.826933] * this clock source is slow. Consider trying other clock sou=
rces=0D
[    0.838041] pci 0000:00:01.3: quirk: [io  0xb000-0xb03f] claimed by PIIX=
4 ACPI=0D
[    0.842893] pci 0000:00:02.0: [1013:00b8] type 0 class 0x000300=0D
[    0.845947] pci 0000:00:02.0: reg 10: [mem 0xf0000000-0xf1ffffff pref]=0D
[    0.848016] pci 0000:00:02.0: reg 14: [mem 0xf3020000-0xf3020fff]=0D
[    0.858014] pci 0000:00:03.0: [5853:0001] type 0 class 0x00ff80=0D
[    0.860926] pci 0000:00:03.0: reg 10: [io  0xc000-0xc0ff]=0D
[    0.863003] pci 0000:00:03.0: reg 14: [mem 0xf2000000-0xf2ffffff pref]=0D
[    0.878930] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT]=0D
[    0.881945]  pci0000:00: Requesting ACPI _OSC control (0x1d)=0D
[    0.882906]  pci0000:00: ACPI _OSC request failed (AE_NOT_FOUND), return=
ed control mask: 0x1d=0D
[    0.883887] ACPI _OSC control for PCIe not granted, disabling ASPM=0D
[    1.403809] ACPI: PCI Interrupt Link [LNKA] (IRQs *5 10 11)=0D
[    1.409004] ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11)=0D
[    1.413973] ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11)=0D
[    1.418995] ACPI: PCI Interrupt Link [LNKD] (IRQs *5 10 11)=0D
[    1.423923] xen/balloon: Initialising balloon driver.=0D
[    1.424805] last_pfn =3D 0x40000 max_arch_pfn =3D 0x400000000=0D
[    1.425813] xen-balloon: Initialising balloon driver.=0D
[    1.426897] vgaarb: device added: PCI:0000:00:02.0,decodes=3Dio+mem,owns=
=3Dio+mem,locks=3Dnone=0D
[    1.427804] vgaarb: loaded=0D
[    1.428803] vgaarb: bridge control possible 0000:00:02.0=0D
[    1.429895] SCSI subsystem initialized=0D
[    1.430895] libata version 3.00 loaded.=0D
[    1.431841] usbcore: registered new interface driver usbfs=0D
[    1.432812] usbcore: registered new interface driver hub=0D
[    1.433876] usbcore: registered new device driver usb=0D
[    1.434875] PCI: Using ACPI for IRQ routing=0D
[    1.435803] PCI: pci_cache_line_size set to 64 bytes=0D
[    1.437933] reserve RAM buffer: 000000000009e000 - 000000000009ffff =0D
[    1.438872] NetLabel: Initializing=0D
[    1.439801] NetLabel:  domain hash size =3D 128=0D
[    1.440800] NetLabel:  protocols =3D UNLABELED CIPSOv4=0D
[    1.441807] NetLabel:  unlabeled traffic allowed by default=0D
[    1.442805] Switching to clocksource xen=0D
[    1.444007] Switched to NOHz mode on CPU #0=0D
[    1.446632] Switched to NOHz mode on CPU #1=0D
[    1.458561] pnp: PnP ACPI init=0D
[    1.462069] ACPI: bus type pnp registered=0D
[    1.466598] pnp 00:00: [mem 0x00000000-0x0009ffff]=0D
[    1.474068] system 00:00: [mem 0x00000000-0x0009ffff] could not be reser=
ved=0D
[    1.484561] system 00:00: Plug and Play ACPI device, IDs PNP0c02 (active=
)=0D
[    1.499714] pnp 00:01: [bus 00-ff]=0D
[    1.504904] pnp 00:01: [io  0x0cf8-0x0cff]=0D
[    1.511031] pnp 00:01: [io  0x0000-0x0cf7 window]=0D
[    1.517985] pnp 00:01: [io  0x0d00-0xffff window]=0D
[    1.523735] pnp 00:01: [mem 0x000a0000-0x000bffff window]=0D
[    1.532921] pnp 00:01: [mem 0xf0000000-0xfbffffff window]=0D
[    1.541628] pnp 00:01: Plug and Play ACPI device, IDs PNP0a03 (active)=0D
[    1.550813] pnp 00:02: [io  0x10c0-0x1141]=0D
[    1.559821] pnp 00:02: [io  0xb044-0xb047]=0D
[    1.562723] system 00:02: [io  0x10c0-0x1141] has been reserved=0D
[    1.567040] system 00:02: [io  0xb044-0xb047] has been reserved=0D
[    1.571407] system 00:02: Plug and Play ACPI device, IDs PNP0c02 (active=
)=0D
[    1.576413] pnp 00:03: [io  0x0010-0x001f]=0D
[    1.579428] pnp 00:03: [io  0x0022-0x002d]=0D
[    1.582388] pnp 00:03: [io  0x0030-0x003f]=0D
[    1.585356] pnp 00:03: [io  0x0044-0x005f]=0D
[    1.588380] pnp 00:03: [io  0x0062-0x0063]=0D
[    1.591382] pnp 00:03: [io  0x0065-0x006f]=0D
[    1.594371] pnp 00:03: [io  0x0072-0x007f]=0D
[    1.597370] pnp 00:03: [io  0x0080]=0D
[    1.599971] pnp 00:03: [io  0x0084-0x0086]=0D
[    1.602961] pnp 00:03: [io  0x0088]=0D
[    1.605514] pnp 00:03: [io  0x008c-0x008e]=0D
[    1.608510] pnp 00:03: [io  0x0090-0x009f]=0D
[    1.611454] pnp 00:03: [io  0x00a2-0x00bd]=0D
[    1.614445] pnp 00:03: [io  0x00e0-0x00ef]=0D
[    1.617483] pnp 00:03: [io  0x08a0-0x08a3]=0D
[    1.620514] pnp 00:03: [io  0x0cc0-0x0ccf]=0D
[    1.623535] pnp 00:03: [io  0x04d0-0x04d1]=0D
[    1.626596] system 00:03: [io  0x08a0-0x08a3] has been reserved=0D
[    1.630950] system 00:03: [io  0x0cc0-0x0ccf] has been reserved=0D
[    1.635261] system 00:03: [io  0x04d0-0x04d1] has been reserved=0D
[    1.639540] system 00:03: Plug and Play ACPI device, IDs PNP0c02 (active=
)=0D
[    1.644410] pnp 00:04: [dma 4]=0D
[    1.646675] pnp 00:04: [io  0x0000-0x000f]=0D
[    1.649694] pnp 00:04: [io  0x0081-0x0083]=0D
[    1.652696] pnp 00:04: [io  0x0087]=0D
[    1.655300] pnp 00:04: [io  0x0089-0x008b]=0D
[    1.658355] pnp 00:04: [io  0x008f]=0D
[    1.660946] pnp 00:04: [io  0x00c0-0x00df]=0D
[    1.663943] pnp 00:04: [io  0x0480-0x048f]=0D
[    1.666961] pnp 00:04: Plug and Play ACPI device, IDs PNP0200 (active)=0D
[    1.671635] pnp 00:05: [io  0x0070-0x0071]=0D
[    1.674663] xen: --> pirq=3D16 -> irq=3D8 (gsi=3D8)=0D
[    1.677924] pnp 00:05: [irq 8]=0D
[    1.680217] pnp 00:05: Plug and Play ACPI device, IDs PNP0b00 (active)=0D
[    1.684998] pnp 00:06: [io  0x0061]=0D
[    1.687584] pnp 00:06: Plug and Play ACPI device, IDs PNP0800 (active)=0D
[    1.692384] xen: --> pirq=3D17 -> irq=3D12 (gsi=3D12)=0D
[    1.695678] pnp 00:07: [irq 12]=0D
[    1.698017] pnp 00:07: Plug and Play ACPI device, IDs PNP0f13 (active)=0D
[    1.702813] pnp 00:08: [io  0x0060]=0D
[    1.705465] pnp 00:08: [io  0x0064]=0D
[    1.708090] xen: --> pirq=3D18 -> irq=3D1 (gsi=3D1)=0D
[    1.711297] pnp 00:08: [irq 1]=0D
[    1.713597] pnp 00:08: Plug and Play ACPI device, IDs PNP0303 PNP030b (a=
ctive)=0D
[    1.718925] pnp 00:09: [io  0x03f0-0x03f5]=0D
[    1.721998] pnp 00:09: [io  0x03f7]=0D
[    1.724574] xen: --> pirq=3D19 -> irq=3D6 (gsi=3D6)=0D
[    1.727752] pnp 00:09: [irq 6]=0D
[    1.730007] pnp 00:09: [dma 2]=0D
[    1.732249] pnp 00:09: Plug and Play ACPI device, IDs PNP0700 (active)=0D
[    1.737173] pnp 00:0a: [io  0x03f8-0x03ff]=0D
[    1.740291] xen: --> pirq=3D20 -> irq=3D4 (gsi=3D4)=0D
[    1.743508] pnp 00:0a: [irq 4]=0D
[    1.745802] pnp 00:0a: Plug and Play ACPI device, IDs PNP0501 (active)=0D
[    1.750652] pnp 00:0b: [io  0x0378-0x037f]=0D
[    1.753662] xen: --> pirq=3D21 -> irq=3D7 (gsi=3D7)=0D
[    1.756861] pnp 00:0b: [irq 7]=0D
[    1.759128] pnp 00:0b: Plug and Play ACPI device, IDs PNP0400 (active)=0D
[    1.779153] pnp: PnP ACPI: found 12 devices=0D
[    1.782267] ACPI: ACPI bus type pnp unregistered=0D
[    1.792482] PCI: max bus depth: 0 pci_try_num: 1=0D
[    1.795999] pci_bus 0000:00: resource 4 [io  0x0000-0x0cf7]=0D
[    1.800094] pci_bus 0000:00: resource 5 [io  0x0d00-0xffff]=0D
[    1.804142] pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff]=0D
[    1.808692] pci_bus 0000:00: resource 7 [mem 0xf0000000-0xfbffffff]=0D
[    1.813296] NET: Registered protocol family 2=0D
[    1.816546] IP route cache hash table entries: 32768 (order: 6, 262144 b=
ytes)=0D
[    1.821953] TCP established hash table entries: 131072 (order: 9, 209715=
2 bytes)=0D
[    1.827955] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)=
=0D
[    1.833218] TCP: Hash tables configured (established 131072 bind 65536)=
=0D
[    1.838240] TCP reno registered=0D
[    1.840547] UDP hash table entries: 512 (order: 2, 16384 bytes)=0D
[    1.844846] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)=0D
[    1.849540] NET: Registered protocol family 1=0D
[    1.852685] pci 0000:00:00.0: Limiting direct PCI/PCI transfers=0D
[    1.857071] pci 0000:00:01.0: PIIX3: Enabling Passive Release=0D
[    1.861403] pci 0000:00:01.0: Activating ISA DMA hang workarounds=0D
[    1.866019] pci 0000:00:02.0: Boot video device=0D
[    1.869442] PCI: CLS 0 bytes, default 64=0D
[    1.872426] Unpacking initramfs...=0D
[    2.265656] Freeing initrd memory: 132512k freed=0D
[    2.300866] Intel AES-NI instructions are not detected.=0D
[    2.308111] audit: initializing netlink socket (disabled)=0D
[    2.314764] type=3D2000 audit(1320338890.445:1): initialized=0D
[    2.339171] HugeTLB registered 2 MB page size, pre-allocated 0 pages=0D
[    2.350395] VFS: Disk quotas dquot_6.5.2=0D
[    2.353575] Dquot-cache hash table entries: 512 (order 0, 4096 bytes)=0D
[    2.358805] msgmni has been set to 1983=0D
[    2.361724] SELinux:  Registering netfilter hooks=0D
[    2.365624] alg: No test for stdrng (krng)=0D
[    2.368743] NET: Registered protocol family 38=0D
[    2.372122] Block layer SCSI generic (bsg) driver version 0.4 loaded (ma=
jor 253)=0D
[    2.377613] io scheduler noop registered=0D
[    2.380542] io scheduler deadline registered=0D
[    2.383755] io scheduler cfq registered (default)=0D
[    2.387298] pci_hotplug: PCI Hot Plug PCI Core version: 0.5=0D
[    2.391356] pciehp: PCI Express Hot Plug Controller Driver version: 0.4=
=0D
[    2.396146] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5=0D
[    2.400986] acpiphp: Slot [0] registered=0D
[    2.403906] acpiphp: Slot [1] registered=0D
[    2.406846] acpiphp: Slot [2] registered=0D
[    2.409754] acpiphp: Slot [3] registered=0D
[    2.412670] acpiphp: Slot [4] registered=0D
[    2.415594] acpiphp: Slot [5] registered=0D
[    2.418534] acpiphp: Slot [6] registered=0D
[    2.421408] acpiphp: Slot [7] registered=0D
[    2.424278] acpiphp: Slot [8] registered=0D
[    2.427181] acpiphp: Slot [9] registered=0D
[    2.430081] acpiphp: Slot [10] registered=0D
[    2.433085] acpiphp: Slot [11] registered=0D
[    2.436062] acpiphp: Slot [12] registered=0D
[    2.439066] acpiphp: Slot [13] registered=0D
[    2.442065] acpiphp: Slot [14] registered=0D
[    2.445062] acpiphp: Slot [15] registered=0D
[    2.448044] acpiphp: Slot [16] registered=0D
[    2.451009] acpiphp: Slot [17] registered=0D
[    2.453931] acpiphp: Slot [18] registered=0D
[    2.456893] acpiphp: Slot [19] registered=0D
[    2.459903] acpiphp: Slot [20] registered=0D
[    2.462969] acpiphp: Slot [21] registered=0D
[    2.465984] acpiphp: Slot [22] registered=0D
[    2.468928] acpiphp: Slot [23] registered=0D
[    2.471922] acpiphp: Slot [24] registered=0D
[    2.474903] acpiphp: Slot [25] registered=0D
[    2.477861] acpiphp: Slot [26] registered=0D
[    2.480789] acpiphp: Slot [27] registered=0D
[    2.483742] acpiphp: Slot [28] registered=0D
[    2.486689] acpiphp: Slot [29] registered=0D
[    2.489675] acpiphp: Slot [30] registered=0D
[    2.492644] acpiphp: Slot [31] registered=0D
[    2.496082] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/inpu=
t/input0=0D
[    2.501556] ACPI: Power Button [PWRF]=0D
[    2.504273] input: Sleep Button as /devices/LNXSYSTM:00/LNXSLPBN:00/inpu=
t/input1=0D
[    2.509572] ACPI: Sleep Button [SLPF]=0D
[    2.513087] ACPI: acpi_idle registered with cpuidle=0D
[    2.534100] ERST: Table is not found!=0D
[    2.536614] GHES: HEST is not enabled!=0D
[    2.539295] xen: --> pirq=3D22 -> irq=3D28 (gsi=3D28)=0D
[    2.542360] xen-platform-pci 0000:00:03.0: PCI INT A -> GSI 28 (level, l=
ow) -> IRQ 28=0D
[    2.547711] Grant table initialized=0D
[    2.552572] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled=0D
[    2.569167] serial8250: ttyS0 at I/O 0x3f8 (irq =3D 4) is a 16550A=0D
[    2.589036] 00:0a: ttyS0 at I/O 0x3f8 (irq =3D 4) is a 16550A=0D
[    2.599488] Non-volatile memory driver v1.3=0D
[    2.604753] Linux agpgart interface v0.103=0D
[    2.612340] loop: module loaded=0D
[    2.617595] ata_piix 0000:00:01.1: version 2.13=0D
[    2.625410] ata_piix 0000:00:01.1: setting latency timer to 64=0D
[    2.639483] scsi0 : ata_piix=0D
[    2.644082] scsi1 : ata_piix=0D
[    2.648450] ata1: PATA max MWDMA2 cmd 0x1f0 ctl 0x3f6 bmdma 0xc140 irq 1=
4=0D
[    2.658650] ata2: PATA max MWDMA2 cmd 0x170 ctl 0x376 bmdma 0xc148 irq 1=
5=0D
[    2.676495] Fixed MDIO Bus: probed=0D
[    2.682818] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver=0D
[    2.701433] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver=0D
[    2.710683] uhci_hcd: USB Universal Host Controller Interface driver=0D
[    2.727847] usbcore: registered new interface driver usbserial=0D
[    2.736645] USB Serial support registered for generic=0D
[    2.744277] usbcore: registered new interface driver usbserial_generic=0D
[    2.761622] usbserial: USB Serial Driver core=0D
[    2.768318] i8042: PNP: PS/2 Controller [PNP0303:PS2K,PNP0f13:PS2M] at 0=
x60,0x64 irq 1,12=0D
[    2.789704] serio: i8042 KBD port at 0x60,0x64 irq 1=0D
[    2.797243] serio: i8042 AUX port at 0x60,0x64 irq 12=0D
[    2.804896] mousedev: PS/2 mouse device common for all mice=0D
[    2.822781] input: AT Translated Set 2 keyboard as /devices/platform/i80=
42/serio0/input/input2=0D
[    2.836489] rtc_cmos 00:05: rtc core: registered rtc_cmos as rtc0=0D
[    2.851200] rtc0: alarms up to one day, 114 bytes nvram=0D
[    2.857017] device-mapper: uevent: version 1.0.3=0D
[    2.862772] device-mapper: ioctl: 4.21.0-ioctl (2011-07-06) initialised:=
 dm-devel@redhat.com=0D
[    2.871101] ata2.01: NODEV after polling detection=0D
[    2.876968] ata2.00: ATAPI: QEMU DVD-ROM, 0.10.2, max UDMA/100=0D
[    2.880285] ata2.00: configured for MWDMA2=0D
[    2.889390] cpuidle: using governor ladder=0D
[    2.892200] cpuidle: using governor menu=0D
[    2.899550] scsi 1:0:0:0: CD-ROM            QEMU     QEMU DVD-ROM     0.=
10 PQ: 0 ANSI: 5=0D
[    2.905794] EFI Variables Facility v0.08 2004-May-17=0D
[    2.907476] sr0: scsi3-mmc drive: 4x/4x xa/form2 tray=0D
[    2.907479] cdrom: Uniform CD-ROM driver Revision: 3.20=0D
[    2.917083] usbcore: registered new interface driver usbhid=0D
[    2.917105] sr 1:0:0:0: Attached scsi CD-ROM sr0=0D
[    2.917843] sr 1:0:0:0: Attached scsi generic sg0 type 5=0D
[    2.932846] usbhid: USB HID core driver=0D
[    2.935605] ip_tables: (C) 2000-2006 Netfilter Core Team=0D
[    2.939376] TCP cubic registered=0D
[    2.941623] Initializing XFRM netlink socket=0D
[    2.944593] NET: Registered protocol family 10=0D
[    2.947744] Mobile IPv6=0D
[    2.949473] NET: Registered protocol family 17=0D
[    2.952605] Registering the dns_resolver key type=0D
[    2.956178] PM: Hibernation image not present or could not be loaded.=0D
[    2.960858] registered taskstats version 1=0D
[    2.966416] IMA: No TPM chip found, activating TPM-bypass!=0D
[    2.970751] XENBUS: Device with no driver: device/vkbd/0=0D
[    2.974451] XENBUS: Device with no driver: device/vfb/0=0D
[    2.978005] XENBUS: Device with no driver: device/vbd/5632=0D
[    2.981926] XENBUS: Device with no driver: device/vbd/768=0D
[    2.985893] XENBUS: Device with no driver: device/vif/0=0D
[    2.989700] XENBUS: Device with no driver: device/console/0=0D
[    2.993736]   Magic number: 3:739:842=0D
[    2.996509] rtc_cmos 00:05: setting system clock to 2011-11-03 16:48:08 =
UTC (1320338888)=0D
[    3.002494] Initializing network drop monitor service=0D
[    3.008576] Freeing unused kernel memory: 940k freed=0D
[    3.012458] Write protecting the kernel read-only data: 10240k=0D
[    3.020671] Freeing unused kernel memory: 1260k freed=0D
[    3.029487] Freeing unused kernel memory: 1584k freed=0D
[    3.061554] dracut: dracut-013-18.fc16=0D
[    3.068993] dracut: root was live:/squashfs.img, liveroot is now live:/s=
quashfs.img=0D
[    3.081427] udevd[77]: starting version 173=0D
[    3.211457] squashfs: version 4.0 (2009/01/31) Phillip Lougher=0D
[    3.257549] EXT4-fs (dm-0): mounted filesystem with ordered data mode. O=
pts: (null)=0D
[    3.267598] dracut: Mounted root filesystem /dev/mapper/live-rw=0D
[    3.297025] input: ImExPS/2 Generic Explorer Mouse as /devices/platform/=
i8042/serio1/input/input3=0D
[    3.319026] dracut: Switching root=0D
[    3.560440] SELinux: 2048 avtab hash slots, 96028 rules.=0D
[    3.576707] SELinux: 2048 avtab hash slots, 96028 rules.=0D
[    3.585435] SELinux:  9 users, 13 roles, 3892 types, 204 bools, 1 sens, =
1024 cats=0D
[    3.591175] SELinux:  82 classes, 96028 rules=0D
[    3.597801] SELinux:  Completing initialization.=0D
[    3.601283] SELinux:  Setting up existing superblocks.=0D
[    3.605009] SELinux: initialized (dev sysfs, type sysfs), uses genfs_con=
texts=0D
[    3.610194] SELinux: initialized (dev rootfs, type rootfs), uses genfs_c=
ontexts=0D
[    3.615449] SELinux: initialized (dev bdev, type bdev), uses genfs_conte=
xts=0D
[    3.620479] SELinux: initialized (dev proc, type proc), uses genfs_conte=
xts=0D
[    3.625439] SELinux: initialized (dev tmpfs, type tmpfs), uses transitio=
n SIDs=0D
[    3.630627] SELinux: initialized (dev devtmpfs, type devtmpfs), uses tra=
nsition SIDs=0D
[    3.636567] SELinux: initialized (dev sockfs, type sockfs), uses task SI=
Ds=0D
[    3.641561] SELinux: initialized (dev debugfs, type debugfs), uses genfs=
_contexts=0D
[    3.647548] SELinux: initialized (dev pipefs, type pipefs), uses task SI=
Ds=0D
[    3.652536] SELinux: initialized (dev anon_inodefs, type anon_inodefs), =
uses genfs_contexts=0D
[    3.658486] SELinux: initialized (dev devpts, type devpts), uses transit=
ion SIDs=0D
[    3.663832] SELinux: initialized (dev hugetlbfs, type hugetlbfs), uses t=
ransition SIDs=0D
[    3.669580] SELinux: initialized (dev mqueue, type mqueue), uses transit=
ion SIDs=0D
[    3.674958] SELinux: initialized (dev selinuxfs, type selinuxfs), uses g=
enfs_contexts=0D
[    3.680623] SELinux: initialized (dev securityfs, type securityfs), uses=
 genfs_contexts=0D
[    3.686324] SELinux: initialized (dev sysfs, type sysfs), uses genfs_con=
texts=0D
[    3.691612] SELinux: initialized (dev tmpfs, type tmpfs), uses transitio=
n SIDs=0D
[    3.696813] SELinux: initialized (dev tmpfs, type tmpfs), uses transitio=
n SIDs=0D
[    3.702071] SELinux: initialized (dev loop0, type squashfs), not configu=
red for labeling=0D
[    3.707904] SELinux: initialized (dev dm-0, type ext4), uses xattr=0D
[    3.714396] type=3D1403 audit(1320338889.217:2): policy loaded auid=3D42=
94967295 ses=3D4294967295=0D
[    3.724928] systemd[1]: Successfully loaded SELinux policy in 226ms 941u=
s.=0D
[    3.750426] systemd[1]: Successfully loaded SELinux database in 20ms 355=
us, size on heap is 475K.=0D
[    3.760021] SELinux: initialized (dev tmpfs, type tmpfs), uses transitio=
n SIDs=0D
[    3.765258] SELinux: initialized (dev cgroup, type cgroup), uses genfs_c=
ontexts=0D
[    3.806680] systemd[1]: Relabelled /dev and /run in 36ms 433us.=0D
[    3.814185] SELinux: initialized (dev cgroup, type cgroup), uses genfs_c=
ontexts=0D
[    3.823162] SELinux: initialized (dev cgroup, type cgroup), uses genfs_c=
ontexts=0D
[    3.829189] SELinux: initialized (dev cgroup, type cgroup), uses genfs_c=
ontexts=0D
[    3.836097] SELinux: initialized (dev cgroup, type cgroup), uses genfs_c=
ontexts=0D
[    3.841852] SELinux: initialized (dev cgroup, type cgroup), uses genfs_c=
ontexts=0D
[    3.848132] SELinux: initialized (dev cgroup, type cgroup), uses genfs_c=
ontexts=0D
[    3.856256] SELinux: initialized (dev cgroup, type cgroup), uses genfs_c=
ontexts=0D
[    3.866123] SELinux: initialized (dev cgroup, type cgroup), uses genfs_c=
ontexts=0D
[    3.874182] systemd[1]: systemd 36 running in system mode. (+PAM +LIBWRA=
P +AUDIT +SELINUX +SYSVINIT +LIBCRYPTSETUP; fedora)=0D
=0D
Welcome to =1B[0;34mFedora release 16 (Verne)=1B[0m!=0D
=0D
[    3.889014] systemd[1]: No hostname configured.=0D
[    3.894198] systemd[1]: Initializing machine ID from random generator.=0D
[    3.944031] systemd[1]: Failed to fully start up daemon: No such file or=
 directory=0D
[    3.949296] systemd[1]: Cannot add dependency job for unit fedora-readon=
ly.service, ignoring: Unit fedora-readonly.service failed to load: No such =
file or directory. See system logs and 'systemctl status fedora-readonly.se=
rvice' for details.=0D
[    3.963366] systemd[1]: Cannot add dependency job for unit fedora-wait-s=
torage.service, ignoring: Unit fedora-wait-storage.service failed to load: =
No such file or directory. See system logs and 'systemctl status fedora-wai=
t-storage.service' for details.=0D
[    3.978687] systemd[1]: Cannot add dependency job for unit systemd-remou=
nt-api-vfs.service, ignoring: Unit systemd-remount-api-vfs.service failed t=
o load: No such file or directory. See system logs and 'systemctl status sy=
stemd-remount-api-vfs.service' for details.=0D
[    3.994954] systemd[1]: Cannot add dependency job for unit fedora-storag=
e-init.service, ignoring: Unit fedora-storage-init.service failed to load: =
No such file or directory. See system logs and 'systemctl status fedora-sto=
rage-init.service' for details.=0D
[    4.010153] systemd[1]: Cannot add dependency job for unit lvm2-monitor.=
service, ignoring: Unit dm-event.socket failed to load: No such file or dir=
ectory. See system logs and 'systemctl status dm-event.socket' for details.=
=0D
[    4.023769] systemd[1]: Cannot add dependency job for unit avahi-daemon.=
socket, ignoring: Unit avahi-daemon.socket failed to load: No such file or =
directory. See system logs and 'systemctl status avahi-daemon.socket' for d=
etails.=0D
[    4.037475] systemd[1]: Cannot add dependency job for unit rpcbind.socke=
t, ignoring: Unit rpcbind.socket failed to load: No such file or directory.=
 See system logs and 'systemctl status rpcbind.socket' for details.=0D
[    4.049692] systemd[1]: Cannot add dependency job for unit dm-event.sock=
et, ignoring: Unit dm-event.socket failed to load: No such file or director=
y. See system logs and 'systemctl status dm-event.socket' for details.=0D
[    4.062978] systemd[1]: Cannot add dependency job for unit ip6tables.ser=
vice, ignoring: Unit ip6tables.service failed to load: No such file or dire=
ctory. See system logs and 'systemctl status ip6tables.service' for details=
=2E=0D
[    4.077131] systemd[1]: Cannot add dependency job for unit iptables.serv=
ice, ignoring: Unit iptables.service failed to load: No such file or direct=
ory. See system logs and 'systemctl status iptables.service' for details.=0D
Starting Collect Read-Ahead Data...=0D
Started Replay Read-Ahead Data.=0D
[    4.109397] systemd-readahead-collect[242]: Disabling readahead collecto=
r due to execution in virtualized environment.=0D
[    4.118030] SELinux: initialized (dev autofs, type autofs), uses genfs_c=
ontexts=0D
Started Lock Directory.=0D
Starting Software RAID Monitor Takeover...=0D
Starting Initialize storage subsystems (RAID, LVM, etc.)...=0D
Starting Huge Pages File System...=0D
Starting Debug File System...=0D
Starting udev Kernel Device Manager...=0D
[    4.209814] SELinux: initialized (dev hugetlbfs, type hugetlbfs), uses t=
ransition SIDs=0D
Starting udev Coldplug all Devices...=0D
Starting Security File System...=0D
[    4.254393] udevd[250]: starting version 173=0D
Starting POSIX Message Queue File System...=0D
Starting Syslog Kernel Log Buffer Bridge...=0D
Started Syslog Kernel Log Buffer Bridge.=0D
Starting Runtime Directory...=0D
Started udev Kernel Device Manager.=0D
Started Collect Read-Ahead Data.=0D
Started Software RAID Monitor Takeover.=0D
[    4.366063] systemd[1]: fedora-storage-init-late.service: main process e=
xited, code=3Dexited, status=3D203=0D
Starting Initialize storage subsystems (RAID, LVM, etc.) =1B[1;31mfailed=1B=
[0m, see 'systemctl status fedora-storage-init-late.service' for details.=0D
[    4.394990] systemd[1]: Unit fedora-storage-init-late.service entered fa=
iled state.=0D
Started Huge Pages File System.=0D
Started Debug File System.=0D
Started Security File System.=0D
Started POSIX Message Queue File System.=0D
Started Runtime Directory.=0D
Started udev Coldplug all Devices.=0D
Starting udev Wait for Complete Device Initialization...=0D
Starting Monitoring of LVM2 mirrors, snapshots etc. using dmeventd or progr=
ess polling...=0D
Started Load legacy module configuration.[    4.542420] Initialising Xen vi=
rtual ethernet driver.=0D
=0D
Starting File System Check on Root Device...=0D
Starting Setup Virtual Console...=0D
[    4.603260] vif vif-0: 2 parsing device/vif/0/mac=0D
[    4.616585] vbd vbd-5632: 19 xenbus_dev_probe on device/vbd/5632=0D
Starting Apply Kernel Variables...=0D
[    4.649184] input: Xen Virtual Keyboard as /devices/virtual/input/input4=
=0D
[    4.657873] systemd-fsck[364]: Root directory is writable, skipping chec=
k.=0D
Started Load Kernel Modules.=0D
Started Configuration File System.=0D
[    4.676128] systemd-vconsole-setup[365]: /bin/loadkeys failed with error=
 code 1.=0D
Started FUSE Control File System.=0D
[    4.686974] systemd-vconsole-setup[365]: /bin/setfont failed with error =
code 1.=0D
Started Set Up Additional Binary Formats.=0D
Starting STDOUT Syslog Bridge...=0D
Started STDOUT Syslog Bridge.=0D
[    4.747305] lvm[395]: No volume groups found=0D
[    4.749712] input: Xen Virtual Pointer as /devices/virtual/input/input5=
=0D
Started Monitoring of LVM2 mirrors, snapshots etc. using dmeventd or progre=
ss polling.=0D
[    4.789710] blkfront: xvda: flush diskcache: enabled=0D
Started File System Check on Root Device.=0D
Started Setup Virtual Console.=0D
[    4.828176]  xvda: xvda1 xvda2 xvda3=0D
Started Apply Kernel Variables.=0D
Starting Remount Root FS...=0D
[    4.893295] mount[419]: warning: can't open /etc/fstab: No such file or =
directory=0D
[    4.910913] EXT4-fs (dm-0): re-mounted. Opts: user_xattr,acl,barrier=3D1=
,data=3Dordered=0D
Started Remount Root FS.=0D
Started Mark the need to relabel after reboot.=0D
Started Relabel all filesystems, if necessary.=0D
Started Reconfigure the system on administrator request.=0D
Starting Load Random Seed...=0D
Starting Recreate Volatile Files and Directories...=0D
Started Load Random Seed.=0D
[    5.024861] systemd-tmpfiles[432]: Successfully loaded SELinux database =
in 10ms 454us, size on heap is 476K.=0D
Started Recreate Volatile Files and Directories.=0D
[    9.809095] XENBUS: Waiting for devices to initialise: 295s...290s...285=
s...280s...275s...270s...265s...260s...255s...250s...245s...240s...=0D
[   65.629361] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   66.630250] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   67.631418] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   68.632620] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   69.633797] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   69.805056] 235s...=0D
[   70.634961] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   71.636134] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   72.637300] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   73.638485] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   74.639636] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   74.805056] 230s...=0D
[   75.640898] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   76.642056] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   77.643215] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   78.644379] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   79.645562] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   79.805055] 225s...=0D
[   80.646700] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   81.647872] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   82.649045] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   83.650215] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   84.651363] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   84.805055] 220s...=0D
[   85.652533] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   86.653689] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   87.654856] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   88.656027] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   89.657192] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   89.805062] 215s...=0D
[   90.658352] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   91.659517] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   92.660723] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   93.661927] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
Starting Shell on hvc1 =1B[1;31maborted=1B[0m because a dependency f[   94.=
096612] systemd[1]: Job dev-hvc1.device/start timed out.=0D
ailed.=0D
[   94.107009] systemd[1]: Job anaconda-shell@hvc1.service/start failed wit=
h result 'dependency'.=0D
[   94.119185] systemd[1]: Job dev-hvc1.device/start failed with result 'ti=
meout'.=0D
[   94.663138] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   94.805056] 210s...=0D
[   95.664306] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   96.665499] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   97.666695] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   98.667881] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   99.669106] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[   99.805056] 205s...=0D
[  100.670292] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  101.671496] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  102.672690] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  103.673841] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  104.675017] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  104.805055] 200s...=0D
[  105.676212] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  106.677406] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  107.678596] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  108.679739] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  109.680942] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  109.805063] 195s...=0D
[  110.682212] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  111.683392] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  112.684573] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  113.685755] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  114.686956] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  114.805055] 190s...=0D
[  115.688160] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  116.689350] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  117.690555] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  118.691746] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  119.692969] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  119.805055] 185s...=0D
[  120.694180] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  121.695379] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  122.696555] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  123.697764] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  124.699631] udevd[267]: timeout: killing '/sbin/modprobe -bv xen:vkbd' [=
366]=0D
[  124.727352] udevadm[345]: udevadm settle - timeout of 120 seconds reache=
d, the event queue contains:=0D
[  124.737639] udevadm[345]: /sys/devices/vkbd-0 (1265)=0D
[  124.746352] systemd[1]: udev-settle.service: main process exited, code=
=3Dexited, status=3D1=0D
Starting udev Wait for Complete Device Initialization =1B[1;31mfailed=1B[0m=
, see 'systemctl status udev-settle.service' for details.=0D
Starting anaconda performance mo[  124.777645] systemd[1]: Unit udev-settle=
=2Eservice entered failed state.=0D
nitor...=0D
Started anaconda performance monitor.=0D
[  124.805041] 180s...Starting System Logging Service...=0D
Starting Shell on tty2...=0D
Started Shell on tty2.=0D
Starting Anaconda version 16.25.=0D

--zhXaljGHf11kAtnf
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--zhXaljGHf11kAtnf--


From xen-devel-bounces@lists.xensource.com Thu Nov 03 10:49:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 10:49:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM1PW-0005yK-Nd; Thu, 03 Nov 2011 10:49:06 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RM1P2-0005lv-Mv
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 10:48:38 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1320342406!1318096!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10697 invoked from network); 3 Nov 2011 17:48:20 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 17:48:20 -0000
X-IronPort-AV: E=Sophos;i="4.69,451,1315180800"; 
   d="scan'208";a="8747804"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	03 Nov 2011 17:46:45 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 3 Nov 2011 17:46:46 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RM1NF-0005rc-GP;
	Thu, 03 Nov 2011 17:46:45 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RM1NF-0006WH-45;
	Thu, 03 Nov 2011 17:46:45 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9662-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 3 Nov 2011 17:46:45 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9662: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9662 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9662/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     12 guest-saverestore.2        fail REGR. vs. 9659

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  17ee4c213438
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  juergen.gross@ts.fujitsu.com
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24067:17ee4c213438
tag:         tip
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 11:11:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 11:11:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM1kw-0006ga-6I; Thu, 03 Nov 2011 11:11:15 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RM1hs-0006Rl-05
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 11:08:06 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320343645!61839779!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21449 invoked from network); 3 Nov 2011 18:07:25 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-2.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Nov 2011 18:07:25 -0000
X-Originating-Ip: [194.89.68.22]
Received: from ydin.reaktio.net (reaktio.net [194.89.68.22])
	by smtp.tele.fi (Postfix) with ESMTP id 709621772;
	Thu,  3 Nov 2011 20:07:59 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 56F97200AA; Thu,  3 Nov 2011 20:07:59 +0200 (EET)
Date: Thu, 3 Nov 2011 20:07:59 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Keir Fraser <keir@xen.org>
Subject: Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek nic problems
	(eth0 8139cp transmit queue timed out)
Message-ID: <20111103180759.GM12984@reaktio.net>
References: <20111031184907.GA12984@reaktio.net>
	<1320089054.54459.YahooMailClassic@web65902.mail.ac4.yahoo.com>
	<20111031192924.GC12984@reaktio.net>
	<20111101205606.GK12984@reaktio.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <20111101205606.GK12984@reaktio.net>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: xen@lists.fedoraproject.org, xen-devel@lists.xensource.com,
	Keir Fraser <keir.xen@gmail.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 01, 2011 at 10:56:06PM +0200, Pasi Kärkkäinen wrote:
> On Mon, Oct 31, 2011 at 09:29:24PM +0200, Pasi Kärkkäinen wrote:
> > On Mon, Oct 31, 2011 at 12:24:14PM -0700, Boris Derzhavets wrote:
> > >    Seems to related
> > > 
> > >    https://bugs.launchpad.net/ubuntu/+source/xen/+bug/854829
> > > 
> > 
> > Thanks, that seems to be the same bug.
> > 
> > Is the bugfix patch from xen-unstable going to backported to xen-4.1-testing.hg ? 
> > (4.1 backported patch available on ubuntu's launchpad above..)
> > 
> 
> So the Ubuntu backport from xen-unstable to Xen 4.1.1 is here:
> https://launchpadlibrarian.net/81948978/xen-pirq-resubmit-irq.patch
> 
> It seems to be shipping in Ubuntu 11.10 xen 4.1.1-2ubuntu4.1 packages.
> 
> Does that patch look suitable to be applied to xen-4.1-testing.hg ? 
> This bug should be fixed for Xen 4.1.3.
>  


Any comments? 

-- Pasi


> 
> > 
> > 
> > >    Boris.
> > > 
> > >    --- On Mon, 10/31/11, Pasi Kärkkäinen <pasik@iki.fi> wrote:
> > > 
> > >      From: Pasi Kärkkäinen <pasik@iki.fi>
> > >      Subject: [Xen-devel] Xen 4.1.2 HVM guest realtek nic problems (eth0
> > >      8139cp transmit queue timed out)
> > >      To: xen-devel@lists.xensource.com
> > >      Date: Monday, October 31, 2011, 2:49 PM
> > > 
> > >      Hello,
> > > 
> > >      While testing Xen 4.1.2 and HVM guests I noticed the following problem
> > >      with Fedora 16 HVM guests (using Linux 3.1.0 kernel in the VM):
> > > 
> > >      The errors (call trace) happens pretty much immediately when there's
> > >      some network traffic going on..
> > > 
> > >      Simple "yum update" in the VM triggers the problem..
> > > 
> > >      [    0.000000] Linux version 3.1.0-5.fc16.x86_64
> > >      ([1]mockbuild@x86-10.phx2.fedoraproject.org) (gcc version 4.6.1 20111003
> > >      (Red Hat 4.6.1-10) (GCC) ) #1 SMP Thu Oct 27 03:46:50 UTC 2011
> > >      [    0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.1.0-5.fc16.x86_64
> > >      root=/dev/mapper/vg_f16test64hvm-lv_root ro
> > >      rd.lvm.lv=vg_f16test64hvm/lv_root rd.dm=0 SYSFONT=latarcyrheb-sun16 rhgb
> > >      KEYTABLE=fi rd.md=0 rd.luks=0 rd.lvm.lv=vg_f16test64hvm/lv_swap
> > >      LANG=en_US.UTF-8 console=ttyS0,38400 console=tty0
> > >      <snip>
> > > 
> > >      [   28.998481] 8139cp 0000:00:03.0: eth0: link up, 100Mbps, full-duplex,
> > >      lpa 0x05E1
> > >      [  149.712071] ------------[ cut here ]------------
> > >      [  149.717216] WARNING: at net/sched/sch_generic.c:255
> > >      dev_watchdog+0xf0/0x150()
> > >      [  149.724709] Hardware name: HVM domU
> > >      [  149.728738] NETDEV WATCHDOG: eth0 (8139cp): transmit queue 0 timed
> > >      out
> > >      [  149.735537] Modules linked in: ip6t_REJECT nf_conntrack_ipv6
> > >      nf_defrag_ipv6 nf_conntrack_ipv4 nf_defrag_ipv4 ip6table_filter xt_state
> > >      ip6_tables nf_conntrack 81
> > >      39too 8139cp ppdev parport_pc mii parport i2c_piix4 i2c_core joydev
> > >      [last unloaded: scsi_wait_scan]
> > >      [  149.768028] Pid: 0, comm: swapper Not tainted 3.1.0-5.fc16.x86_64 #1
> > >      [  149.774639] Call Trace:
> > >      [  149.777765]  <IRQ>  [<ffffffff81057a56>]
> > >      warn_slowpath_common+0x83/0x9b
> > >      [  149.784024]  [<ffffffff81057b11>] warn_slowpath_fmt+0x46/0x48
> > >      [  149.790141]  [<ffffffff813ef49d>] ? netif_tx_lock+0x4a/0x7c
> > >      [  149.799007]  [<ffffffff813ef613>] dev_watchdog+0xf0/0x150
> > >      [  149.806361]  [<ffffffff81064b51>] run_timer_softirq+0x19b/0x280
> > >      [  149.814392]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd
> > >      [  149.821650]  [<ffffffff813ef523>] ? netif_tx_unlock+0x54/0x54
> > >      [  149.828926]  [<ffffffff8105d6b3>] __do_softirq+0xc9/0x1b5
> > >      [  149.836803]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd
> > >      [  149.843422]  [<ffffffff814be5ec>] call_softirq+0x1c/0x30
> > >      [  149.850067]  [<ffffffff81010b45>] do_softirq+0x46/0x81
> > >      [  149.856760]  [<ffffffff8105d97b>] irq_exit+0x57/0xb1
> > >      [  149.863035]  [<ffffffff812a39d3>] xen_evtchn_do_upcall+0x31/0x3e
> > >      [  149.871144]  [<ffffffff814be76e>] xen_hvm_callback_vector+0x6e/0x80
> > >      [  149.879494]  <EOI>  [<ffffffff8102f2f1>] ? native_safe_halt+0xb/0xd
> > >      [  149.888220]  [<ffffffff81015b7e>] default_idle+0x4e/0x86
> > >      [  149.894962]  [<ffffffff8100e2ed>] cpu_idle+0xae/0xe8
> > >      [  149.901461]  [<ffffffff814934ee>] rest_init+0x72/0x74
> > >      [  149.908949]  [<ffffffff81b76b7d>] start_kernel+0x3ab/0x3b6
> > >      [  149.916617]  [<ffffffff81b762c4>] x86_64_start_reservations+0xaf/0xb3
> > >      [  149.929148]  [<ffffffff81b76140>] ? early_idt_handlers+0x140/0x140
> > >      [  149.936797]  [<ffffffff81b763ca>] x86_64_start_kernel+0x102/0x111
> > >      [  149.944336] ---[ end trace d8786cb7d6a57f8a ]---
> > >      [  149.950406] 8139cp 0000:00:03.0: eth0: Transmit timeout, status
> > >      d   3b   15 80ff
> > >      [  149.961879] ------------[ cut here ]------------
> > >      [  149.962245] WARNING: at kernel/softirq.c:159
> > >      _local_bh_enable_ip+0x44/0x8e()
> > >      [  149.962245] Hardware name: HVM domU
> > >      [  149.962245] Modules linked in: ip6t_REJECT nf_conntrack_ipv6
> > >      nf_defrag_ipv6 nf_conntrack_ipv4 nf_defrag_ipv4 ip6table_filter xt_state
> > >      ip6_tables nf_conntrack 8139too 8139cp ppdev parport_pc mii parport
> > >      i2c_piix4 i2c_core joydev [last unloaded: scsi_wait_scan]
> > >      [  149.962245] Pid: 0, comm: swapper Tainted: G
> > >      W   3.1.0-5.fc16.x86_64 #1
> > >      [  149.962245] Call Trace:
> > >      [  149.962245]  <IRQ>  [<ffffffff81057a56>]
> > >      warn_slowpath_common+0x83/0x9b
> > >      [  149.962245]  [<ffffffff813ce599>] ? skb_release_data+0xca/0xcf
> > >      [  149.962245]  [<ffffffff81057a88>] warn_slowpath_null+0x1a/0x1c
> > >      [  149.962245]  [<ffffffff8105d462>] _local_bh_enable_ip+0x44/0x8e
> > >      [  149.962245]  [<ffffffff8105d4ba>] local_bh_enable_ip+0xe/0x10
> > >      [  149.962245]  [<ffffffff814b5db4>] _raw_spin_unlock_bh+0x15/0x17
> > >      [  149.962245]  [<ffffffffa0053969>] destroy_conntrack+0x9d/0xdc
> > >      [nf_conntrack]
> > >      [  149.962245]  [<ffffffff813fa343>] nf_conntrack_destroy+0x19/0x1b
> > >      [  149.962245]  [<ffffffff813ce7ad>] skb_release_head_state+0xa7/0xef
> > >      [  149.962245]  [<ffffffff813ce5b1>] __kfree_skb+0x13/0x83
> > >      [  149.962245]  [<ffffffff813ce677>] consume_skb+0x56/0x6b
> > >      [  149.962245]  [<ffffffffa003c1b9>] cp_clean_rings+0xb4/0x114 [8139cp]
> > >      [  149.962245]  [<ffffffffa003c371>] cp_tx_timeout+0x88/0x10e [8139cp]
> > >      [  149.962245]  [<ffffffff813ef627>] dev_watchdog+0x104/0x150
> > >      [  149.962245]  [<ffffffff81064b51>] run_timer_softirq+0x19b/0x280
> > >      [  149.962245]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd
> > >      [  149.962245]  [<ffffffff813ef523>] ? netif_tx_unlock+0x54/0x54
> > >      [  149.962245]  [<ffffffff8105d6b3>] __do_softirq+0xc9/0x1b5
> > >      [  149.962245]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd
> > >      [  149.962245]  [<ffffffff814be5ec>] call_softirq+0x1c/0x30
> > >      [  149.962245]  [<ffffffff81010b45>] do_softirq+0x46/0x81
> > >      [  149.962245]  [<ffffffff8105d97b>] irq_exit+0x57/0xb1
> > >      [  149.962245]  [<ffffffff812a39d3>] xen_evtchn_do_upcall+0x31/0x3e
> > >      [  149.962245]  [<ffffffff814be76e>] xen_hvm_callback_vector+0x6e/0x80
> > >      [  149.962245]  <EOI>  [<ffffffff8102f2f1>] ? native_safe_halt+0xb/0xd
> > >      [  149.962245]  [<ffffffff81015b7e>] default_idle+0x4e/0x86
> > >      [  149.962245]  [<ffffffff8100e2ed>] cpu_idle+0xae/0xe8
> > >      [  149.962245]  [<ffffffff814934ee>] rest_init+0x72/0x74
> > >      [  149.962245]  [<ffffffff81b76b7d>] start_kernel+0x3ab/0x3b6
> > >      [  149.962245]  [<ffffffff81b762c4>] x86_64_start_reservations+0xaf/0xb3
> > >      [  149.962245]  [<ffffffff81b76140>] ? early_idt_handlers+0x140/0x140
> > >      [  149.962245]  [<ffffffff81b763ca>] x86_64_start_kernel+0x102/0x111
> > >      [  149.962245] ---[ end trace d8786cb7d6a57f8b ]---
> > > 
> > >      Full guest kernel dmesg attached to this email.
> > >      The host is running F16 with Xen 4.1.2 and Linux 3.1.0 dom0 kernel.
> > > 
> > >      Xen cfgfile for the HVM domain:
> > > 
> > >      kernel = "hvmloader"
> > >      builder='hvm'
> > >      device_model = 'qemu-dm'
> > >      name = "f16test64hvm"
> > >      memory = 1024
> > >      vcpus=1
> > >      pae=1
> > >      acpi=1
> > >      apic=1
> > >      vif = [ 'type=ioemu, mac=00:16:3f:03:01:14, bridge=virbr0' ]
> > >      disk = [ 'phy:/dev/vg_f16/f16test64hvm,hda,w',
> > >      'file:/root/iso/Fedora-16-Final-RC2-x86_64-DVD.iso,hdc:cdrom,r' ]
> > >      boot='cd'
> > >      xen_platform_pci=0
> > >      on_poweroff = 'destroy'
> > >      on_reboot   = 'restart'
> > >      on_crash    = 'restart'
> > >      sdl=0
> > >      vnc=1
> > >      vncpasswd=''
> > >      stdvga=0
> > >      serial='pty'
> > >      tsc_mode=0
> > >      usb=1
> > >      usbdevice='tablet'
> > >      keymap='fi'
> > > 
> > >      Using "model=e1000" instead for the vif works OK.. no problems with the
> > >      emulated intel nic.
> > > 
> > >      Any ideas what the problem with the emulated realtek nic?
> > > 
> > >      Thanks,
> > > 
> > >      -- Pasi
> > > 
> > >      -----Inline Attachment Follows-----
> > > 
> > >      _______________________________________________
> > >      Xen-devel mailing list
> > >      [2]Xen-devel@lists.xensource.com
> > >      [3]http://lists.xensource.com/xen-devel
> > > 
> > > References
> > > 
> > >    Visible links
> > >    1. file:///mc/compose?to=mockbuild@x86-10.phx2.fedoraproject.org
> > >    2. file:///mc/compose?to=Xen-devel@lists.xensource.com
> > >    3. http://lists.xensource.com/xen-devel
> > 
> > _______________________________________________
> > Xen-devel mailing list
> > Xen-devel@lists.xensource.com
> > http://lists.xensource.com/xen-devel
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 11:25:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 11:25:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM1yh-0007Fd-P5; Thu, 03 Nov 2011 11:25:27 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RM1xV-00072g-JW
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 11:24:13 -0700
X-Env-Sender: jfehlig@suse.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1320344648!1858770!1
X-Originating-IP: [137.65.250.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11396 invoked from network); 3 Nov 2011 18:24:10 -0000
Received: from victor.provo.novell.com (HELO victor.provo.novell.com)
	(137.65.250.26)
	by server-9.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Nov 2011 18:24:10 -0000
Received: from [128.107.16.136] (prv-ext-foundry1int.gns.novell.com
	[137.65.251.240])
	by victor.provo.novell.com with ESMTP (TLS encrypted);
	Thu, 03 Nov 2011 12:24:01 -0600
Message-ID: <4EB2DD7F.1040001@suse.com>
Date: Thu, 03 Nov 2011 12:29:19 -0600
From: Jim Fehlig <jfehlig@suse.com>
User-Agent: Thunderbird 2.0.0.23 (X11/20090817)
MIME-Version: 1.0
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [Xen-devel] Prevent vif-bridge from adding
	user-created	tap	interfaces to a bridge
References: <4EA7396D.30103@suse.com>	<20137.29945.290531.658615@mariner.uk.xensource.com>	<1319729714.9436.146.camel@zakaz.uk.xensource.com>
	<4EAB1BE6.9030501@suse.com>
In-Reply-To: <4EAB1BE6.9030501@suse.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: xen-devel <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Jim Fehlig wrote:
> Ian Campbell wrote:
>   
>> On Thu, 2011-10-27 at 16:12 +0100, Ian Jackson wrote:
>>   
>>     
>>> Jim Fehlig writes ("[Xen-devel] Prevent vif-bridge from adding user-created tap interfaces to a bridge"):
>>>     
>>>       
>
> Ok, my original post comes through now on a new thread...
>
>   
>>>> I received a report that vif-bridge adds any tap interface to a bridge,
>>>> regardless if xen is running and who created the tap interface.  E.g.
>>>>
>>>> # tunctl -p -t tap42
>>>>
>>>> will cause vif-bridge to be executed as per the following rule in
>>>> xen-backend.rules
>>>>
>>>> SUBSYSTEM=="net", KERNEL=="tap*", ACTION=="add",
>>>> RUN+="/etc/xen/scripts/vif-setup $env{ACTION} type_if=tap"
>>>>       
>>>>         
>>> Urgh.  What a mess.
>>>
>>>     
>>>       
>>>> I'm not sure how to improve the rule to prevent execution of vif-setup
>>>> in this case.  But it seems better to handle it in vif-bridge anyhow, by
>>>> not connecting the interface to a bridge if there is no corresponding
>>>> info in xenstore.  Something along the lines of the attached quick
>>>> patch.  Comments?
>>>>       
>>>>         
>>> Aren't tap devices like this created by Xen's qemu ?  And as such we
>>> should be letting qemu run the script, and not have any hotplug
>>> script called by udev.
>>>     
>>>       
>> We explicitly changed away from that scheme not so long ago. The issue
>> is that each tap has a vif counterpart which is somewhat logically the
>> same device and should be setup the same way, hence via the same
>> mechanisms.
>>   
>>     
>
> And qemu isn't involved when using netback.
>
> So how to proceed?  Ian C. seemed to hesitantly ACK the patch in the
> other thread [1] :).  The suggestion to write the info to another path
> in xenstore can also be implemented, although IMO, that the path is not
> accessible to the frontend would be the only benefit.
>   

Ping.

I'd like to add this patch to our downstream package but would like
upstream blessing first.

Thanks,
Jim

> Thanks,
> Jim
>
> [1] http://lists.xensource.com/archives/html/xen-devel/2011-10/msg02016.html
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>   

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 11:35:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 11:35:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM28E-0007mo-DM; Thu, 03 Nov 2011 11:35:18 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RM27P-0007Zk-70
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 11:34:29 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1320345263!1864965!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13825 invoked from network); 3 Nov 2011 18:34:24 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 18:34:24 -0000
Received: by wyh11 with SMTP id 11so2018364wyh.30
	for <xen-devel@lists.xensource.com>;
	Thu, 03 Nov 2011 11:34:23 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=9/+Br21oMhyBcjJjD3qdUB0zHXUCoperqXMeGoBGIIY=;
	b=dg5w07yRBgRXdIu9Qs5DVgcY0JlHrcuRhdZGVUo9S4MlfqrwTAUVT0rFUZQB6ICtcv
	F6lMeMOWQwebQdZgv4WueJPeeKBybATuU8ZWtTj/mmCU8rpYvm2MvQ2jVvtqBL2PNG3+
	XXJ/SSLj2RPzUikmMSafvUG0wjFqQurlilpnQ=
Received: by 10.216.167.198 with SMTP id i48mr7720014wel.72.1320345263557;
	Thu, 03 Nov 2011 11:34:23 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-249-120.range86-129.btcentralplus.com. [86.129.249.120])
	by mx.google.com with ESMTPS id e7sm11686194wbh.12.2011.11.03.11.34.18
	(version=SSLv3 cipher=OTHER); Thu, 03 Nov 2011 11:34:22 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Thu, 03 Nov 2011 18:34:14 +0000
Subject: Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek nic problems
	(eth0 8139cp transmit queue timed out)
From: Keir Fraser <keir.xen@gmail.com>
To: Pasi =?ISO-8859-1?B?S+Rya2vkaW5lbg==?= <pasik@iki.fi>
Message-ID: <CAD88F26.24242%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek nic problems
	(eth0 8139cp transmit queue timed out)
Thread-Index: AcyaVy+zHDd9zS5XkkGdZZb/umX2tw==
In-Reply-To: <20111103180759.GM12984@reaktio.net>
Mime-version: 1.0
Content-type: text/plain;
	charset="ISO-8859-1"
Content-transfer-encoding: quoted-printable
Cc: xen@lists.fedoraproject.org, xen-devel@lists.xensource.com,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 03/11/2011 18:07, "Pasi K=E4rkk=E4inen" <pasik@iki.fi> wrote:

> On Tue, Nov 01, 2011 at 10:56:06PM +0200, Pasi K=E4rkk=E4inen wrote:
>> On Mon, Oct 31, 2011 at 09:29:24PM +0200, Pasi K=E4rkk=E4inen wrote:
>>> On Mon, Oct 31, 2011 at 12:24:14PM -0700, Boris Derzhavets wrote:
>>>>    Seems to related
>>>>=20
>>>>    https://bugs.launchpad.net/ubuntu/+source/xen/+bug/854829
>>>>=20
>>>=20
>>> Thanks, that seems to be the same bug.
>>>=20
>>> Is the bugfix patch from xen-unstable going to backported to
>>> xen-4.1-testing.hg ?
>>> (4.1 backported patch available on ubuntu's launchpad above..)
>>>=20
>>=20
>> So the Ubuntu backport from xen-unstable to Xen 4.1.1 is here:
>> https://launchpadlibrarian.net/81948978/xen-pirq-resubmit-irq.patch
>>=20
>> It seems to be shipping in Ubuntu 11.10 xen 4.1.1-2ubuntu4.1 packages.
>>=20
>> Does that patch look suitable to be applied to xen-4.1-testing.hg ?
>> This bug should be fixed for Xen 4.1.3.
>=20
> Any comments?=20

This looks like a backport of Stefano's xen-unstable c/s 24007. I would lik=
e
him to submit/ack the backport, as it is not a trivial backport of the
xen-unstable patch.

 -- Keir

> -- Pasi
>=20
>=20
>>=20
>>>=20
>>>=20
>>>>    Boris.
>>>>=20
>>>>    --- On Mon, 10/31/11, Pasi K=E4rkk=E4inen <pasik@iki.fi> wrote:
>>>>=20
>>>>      From: Pasi K=E4rkk=E4inen <pasik@iki.fi>
>>>>      Subject: [Xen-devel] Xen 4.1.2 HVM guest realtek nic problems (et=
h0
>>>>      8139cp transmit queue timed out)
>>>>      To: xen-devel@lists.xensource.com
>>>>      Date: Monday, October 31, 2011, 2:49 PM
>>>>=20
>>>>      Hello,
>>>>=20
>>>>      While testing Xen 4.1.2 and HVM guests I noticed the following pr=
oblem
>>>>      with Fedora 16 HVM guests (using Linux 3.1.0 kernel in the VM):
>>>>=20
>>>>      The errors (call trace) happens pretty much immediately when ther=
e's
>>>>      some network traffic going on..
>>>>=20
>>>>      Simple "yum update" in the VM triggers the problem..
>>>>=20
>>>>      [    0.000000] Linux version 3.1.0-5.fc16.x86_64
>>>>      ([1]mockbuild@x86-10.phx2.fedoraproject.org) (gcc version 4.6.1
>>>> 20111003
>>>>      (Red Hat 4.6.1-10) (GCC) ) #1 SMP Thu Oct 27 03:46:50 UTC 2011
>>>>      [    0.000000] Command line: BOOT_IMAGE=3D/vmlinuz-3.1.0-5.fc16.x86=
_64
>>>>      root=3D/dev/mapper/vg_f16test64hvm-lv_root ro
>>>>      rd.lvm.lv=3Dvg_f16test64hvm/lv_root rd.dm=3D0 SYSFONT=3Dlatarcyrheb-sun=
16
>>>> rhgb
>>>>      KEYTABLE=3Dfi rd.md=3D0 rd.luks=3D0 rd.lvm.lv=3Dvg_f16test64hvm/lv_swap
>>>>      LANG=3Den_US.UTF-8 console=3DttyS0,38400 console=3Dtty0
>>>>      <snip>
>>>>=20
>>>>      [   28.998481] 8139cp 0000:00:03.0: eth0: link up, 100Mbps,
>>>> full-duplex,
>>>>      lpa 0x05E1
>>>>      [  149.712071] ------------[ cut here ]------------
>>>>      [  149.717216] WARNING: at net/sched/sch_generic.c:255
>>>>      dev_watchdog+0xf0/0x150()
>>>>      [  149.724709] Hardware name: HVM domU
>>>>      [  149.728738] NETDEV WATCHDOG: eth0 (8139cp): transmit queue 0 t=
imed
>>>>      out
>>>>      [  149.735537] Modules linked in: ip6t_REJECT nf_conntrack_ipv6
>>>>      nf_defrag_ipv6 nf_conntrack_ipv4 nf_defrag_ipv4 ip6table_filter
>>>> xt_state
>>>>      ip6_tables nf_conntrack 81
>>>>      39too 8139cp ppdev parport_pc mii parport i2c_piix4 i2c_core joyd=
ev
>>>>      [last unloaded: scsi_wait_scan]
>>>>      [  149.768028] Pid: 0, comm: swapper Not tainted 3.1.0-5.fc16.x86=
_64
>>>> #1
>>>>      [  149.774639] Call Trace:
>>>>      [  149.777765]  <IRQ>  [<ffffffff81057a56>]
>>>>      warn_slowpath_common+0x83/0x9b
>>>>      [  149.784024]  [<ffffffff81057b11>] warn_slowpath_fmt+0x46/0x48
>>>>      [  149.790141]  [<ffffffff813ef49d>] ? netif_tx_lock+0x4a/0x7c
>>>>      [  149.799007]  [<ffffffff813ef613>] dev_watchdog+0xf0/0x150
>>>>      [  149.806361]  [<ffffffff81064b51>] run_timer_softirq+0x19b/0x28=
0
>>>>      [  149.814392]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd
>>>>      [  149.821650]  [<ffffffff813ef523>] ? netif_tx_unlock+0x54/0x54
>>>>      [  149.828926]  [<ffffffff8105d6b3>] __do_softirq+0xc9/0x1b5
>>>>      [  149.836803]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd
>>>>      [  149.843422]  [<ffffffff814be5ec>] call_softirq+0x1c/0x30
>>>>      [  149.850067]  [<ffffffff81010b45>] do_softirq+0x46/0x81
>>>>      [  149.856760]  [<ffffffff8105d97b>] irq_exit+0x57/0xb1
>>>>      [  149.863035]  [<ffffffff812a39d3>] xen_evtchn_do_upcall+0x31/0x=
3e
>>>>      [  149.871144]  [<ffffffff814be76e>] xen_hvm_callback_vector+0x6e=
/0x80
>>>>      [  149.879494]  <EOI>  [<ffffffff8102f2f1>] ? native_safe_halt+0x=
b/0xd
>>>>      [  149.888220]  [<ffffffff81015b7e>] default_idle+0x4e/0x86
>>>>      [  149.894962]  [<ffffffff8100e2ed>] cpu_idle+0xae/0xe8
>>>>      [  149.901461]  [<ffffffff814934ee>] rest_init+0x72/0x74
>>>>      [  149.908949]  [<ffffffff81b76b7d>] start_kernel+0x3ab/0x3b6
>>>>      [  149.916617]  [<ffffffff81b762c4>]
>>>> x86_64_start_reservations+0xaf/0xb3
>>>>      [  149.929148]  [<ffffffff81b76140>] ? early_idt_handlers+0x140/0=
x140
>>>>      [  149.936797]  [<ffffffff81b763ca>] x86_64_start_kernel+0x102/0x=
111
>>>>      [  149.944336] ---[ end trace d8786cb7d6a57f8a ]---
>>>>      [  149.950406] 8139cp 0000:00:03.0: eth0: Transmit timeout, statu=
s
>>>>      d   3b   15 80ff
>>>>      [  149.961879] ------------[ cut here ]------------
>>>>      [  149.962245] WARNING: at kernel/softirq.c:159
>>>>      _local_bh_enable_ip+0x44/0x8e()
>>>>      [  149.962245] Hardware name: HVM domU
>>>>      [  149.962245] Modules linked in: ip6t_REJECT nf_conntrack_ipv6
>>>>      nf_defrag_ipv6 nf_conntrack_ipv4 nf_defrag_ipv4 ip6table_filter
>>>> xt_state
>>>>      ip6_tables nf_conntrack 8139too 8139cp ppdev parport_pc mii parpo=
rt
>>>>      i2c_piix4 i2c_core joydev [last unloaded: scsi_wait_scan]
>>>>      [  149.962245] Pid: 0, comm: swapper Tainted: G
>>>>      W   3.1.0-5.fc16.x86_64 #1
>>>>      [  149.962245] Call Trace:
>>>>      [  149.962245]  <IRQ>  [<ffffffff81057a56>]
>>>>      warn_slowpath_common+0x83/0x9b
>>>>      [  149.962245]  [<ffffffff813ce599>] ? skb_release_data+0xca/0xcf
>>>>      [  149.962245]  [<ffffffff81057a88>] warn_slowpath_null+0x1a/0x1c
>>>>      [  149.962245]  [<ffffffff8105d462>] _local_bh_enable_ip+0x44/0x8=
e
>>>>      [  149.962245]  [<ffffffff8105d4ba>] local_bh_enable_ip+0xe/0x10
>>>>      [  149.962245]  [<ffffffff814b5db4>] _raw_spin_unlock_bh+0x15/0x1=
7
>>>>      [  149.962245]  [<ffffffffa0053969>] destroy_conntrack+0x9d/0xdc
>>>>      [nf_conntrack]
>>>>      [  149.962245]  [<ffffffff813fa343>] nf_conntrack_destroy+0x19/0x=
1b
>>>>      [  149.962245]  [<ffffffff813ce7ad>] skb_release_head_state+0xa7/=
0xef
>>>>      [  149.962245]  [<ffffffff813ce5b1>] __kfree_skb+0x13/0x83
>>>>      [  149.962245]  [<ffffffff813ce677>] consume_skb+0x56/0x6b
>>>>      [  149.962245]  [<ffffffffa003c1b9>] cp_clean_rings+0xb4/0x114
>>>> [8139cp]
>>>>      [  149.962245]  [<ffffffffa003c371>] cp_tx_timeout+0x88/0x10e [81=
39cp]
>>>>      [  149.962245]  [<ffffffff813ef627>] dev_watchdog+0x104/0x150
>>>>      [  149.962245]  [<ffffffff81064b51>] run_timer_softirq+0x19b/0x28=
0
>>>>      [  149.962245]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd
>>>>      [  149.962245]  [<ffffffff813ef523>] ? netif_tx_unlock+0x54/0x54
>>>>      [  149.962245]  [<ffffffff8105d6b3>] __do_softirq+0xc9/0x1b5
>>>>      [  149.962245]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd
>>>>      [  149.962245]  [<ffffffff814be5ec>] call_softirq+0x1c/0x30
>>>>      [  149.962245]  [<ffffffff81010b45>] do_softirq+0x46/0x81
>>>>      [  149.962245]  [<ffffffff8105d97b>] irq_exit+0x57/0xb1
>>>>      [  149.962245]  [<ffffffff812a39d3>] xen_evtchn_do_upcall+0x31/0x=
3e
>>>>      [  149.962245]  [<ffffffff814be76e>] xen_hvm_callback_vector+0x6e=
/0x80
>>>>      [  149.962245]  <EOI>  [<ffffffff8102f2f1>] ? native_safe_halt+0x=
b/0xd
>>>>      [  149.962245]  [<ffffffff81015b7e>] default_idle+0x4e/0x86
>>>>      [  149.962245]  [<ffffffff8100e2ed>] cpu_idle+0xae/0xe8
>>>>      [  149.962245]  [<ffffffff814934ee>] rest_init+0x72/0x74
>>>>      [  149.962245]  [<ffffffff81b76b7d>] start_kernel+0x3ab/0x3b6
>>>>      [  149.962245]  [<ffffffff81b762c4>]
>>>> x86_64_start_reservations+0xaf/0xb3
>>>>      [  149.962245]  [<ffffffff81b76140>] ? early_idt_handlers+0x140/0=
x140
>>>>      [  149.962245]  [<ffffffff81b763ca>] x86_64_start_kernel+0x102/0x=
111
>>>>      [  149.962245] ---[ end trace d8786cb7d6a57f8b ]---
>>>>=20
>>>>      Full guest kernel dmesg attached to this email.
>>>>      The host is running F16 with Xen 4.1.2 and Linux 3.1.0 dom0 kerne=
l.
>>>>=20
>>>>      Xen cfgfile for the HVM domain:
>>>>=20
>>>>      kernel =3D "hvmloader"
>>>>      builder=3D'hvm'
>>>>      device_model =3D 'qemu-dm'
>>>>      name =3D "f16test64hvm"
>>>>      memory =3D 1024
>>>>      vcpus=3D1
>>>>      pae=3D1
>>>>      acpi=3D1
>>>>      apic=3D1
>>>>      vif =3D [ 'type=3Dioemu, mac=3D00:16:3f:03:01:14, bridge=3Dvirbr0' ]
>>>>      disk =3D [ 'phy:/dev/vg_f16/f16test64hvm,hda,w',
>>>>      'file:/root/iso/Fedora-16-Final-RC2-x86_64-DVD.iso,hdc:cdrom,r' ]
>>>>      boot=3D'cd'
>>>>      xen_platform_pci=3D0
>>>>      on_poweroff =3D 'destroy'
>>>>      on_reboot   =3D 'restart'
>>>>      on_crash    =3D 'restart'
>>>>      sdl=3D0
>>>>      vnc=3D1
>>>>      vncpasswd=3D''
>>>>      stdvga=3D0
>>>>      serial=3D'pty'
>>>>      tsc_mode=3D0
>>>>      usb=3D1
>>>>      usbdevice=3D'tablet'
>>>>      keymap=3D'fi'
>>>>=20
>>>>      Using "model=3De1000" instead for the vif works OK.. no problems wi=
th
>>>> the
>>>>      emulated intel nic.
>>>>=20
>>>>      Any ideas what the problem with the emulated realtek nic?
>>>>=20
>>>>      Thanks,
>>>>=20
>>>>      -- Pasi
>>>>=20
>>>>      -----Inline Attachment Follows-----
>>>>=20
>>>>      _______________________________________________
>>>>      Xen-devel mailing list
>>>>      [2]Xen-devel@lists.xensource.com
>>>>      [3]http://lists.xensource.com/xen-devel
>>>>=20
>>>> References
>>>>=20
>>>>    Visible links
>>>>    1. file:///mc/compose?to=3Dmockbuild@x86-10.phx2.fedoraproject.org
>>>>    2. file:///mc/compose?to=3DXen-devel@lists.xensource.com
>>>>    3. http://lists.xensource.com/xen-devel
>>>=20
>>> _______________________________________________
>>> Xen-devel mailing list
>>> Xen-devel@lists.xensource.com
>>> http://lists.xensource.com/xen-devel
>>=20
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com
>> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 13:11:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 13:11:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM3dA-0001Xl-Bv; Thu, 03 Nov 2011 13:11:20 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RM3cH-0001Kz-5N
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 13:10:25 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1320350993!55880346!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6857 invoked from network); 3 Nov 2011 20:09:53 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 20:09:53 -0000
X-IronPort-AV: E=Sophos;i="4.69,452,1315180800"; 
   d="scan'208";a="8749685"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	03 Nov 2011 20:10:21 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 3 Nov 2011 20:10:21 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RM3cD-0006eu-9y;
	Thu, 03 Nov 2011 20:10:21 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RM3cD-0003ar-8b;
	Thu, 03 Nov 2011 20:10:21 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9663-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 3 Nov 2011 20:10:21 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9663: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9663 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9663/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-pcipt-intel  5 xen-boot                fail REGR. vs. 9661
 test-amd64-i386-rhel6hvm-intel  5 xen-boot                 fail REGR. vs. 9661
 test-i386-i386-pv             5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-pv            5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-pv           5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl            5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl-credit2    5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-xl           5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-rhel6hvm-amd  5 xen-boot                   fail REGR. vs. 9661
 test-i386-i386-xl             5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl-multivcpu  5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-pair          8 xen-boot/dst_host          fail REGR. vs. 9661
 test-amd64-i386-pair          7 xen-boot/src_host          fail REGR. vs. 9661
 test-amd64-amd64-pair         8 xen-boot/dst_host          fail REGR. vs. 9661
 test-amd64-amd64-pair         7 xen-boot/src_host          fail REGR. vs. 9661
 test-i386-i386-pair           7 xen-boot/src_host          fail REGR. vs. 9661
 test-i386-i386-pair           8 xen-boot/dst_host          fail REGR. vs. 9661
 test-amd64-i386-win-vcpus1    5 xen-boot                   fail REGR. vs. 9661
 test-i386-i386-xl-win         5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl-win-vcpus1  5 xen-boot                  fail REGR. vs. 9661
 test-i386-i386-win            5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-win          5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-xl-win       5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-win           5 xen-boot                   fail REGR. vs. 9661

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-sedf      5 xen-boot                     fail    like 9661

version targeted for testing:
 xen                  801ca6c0fbfa
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        fail    
 test-amd64-i386-pair                                         fail    
 test-i386-i386-pair                                          fail    
 test-amd64-amd64-pv                                          fail    
 test-amd64-i386-pv                                           fail    
 test-i386-i386-pv                                            fail    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24069:801ca6c0fbfa
tag:         tip
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:28:41 2011 +0100
    
    x86/IRQ: consolidate IRQ disabling when acquiring vector lock
    
    __assign_irq_vector() doesn't need to disable interrupts (its callers
    are required to when acquiring the lock), and set_desc_affinity() can
    use the normal spin lock primitives.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24068:6928172f7ded
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:27:38 2011 +0100
    
    IRQ: allocate CPU masks dynamically
    
    This includes delaying the initialization of dynamically created IRQs
    until their actual first use and some further elimination of uses of
    struct irq_cfg.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24067:17ee4c213438
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 13:17:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 13:17:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM3ii-00020m-Gc; Thu, 03 Nov 2011 13:17:04 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RM3hz-0001nq-9U
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 13:16:19 -0700
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-11.tower-216.messagelabs.com!1320351374!2156981!1
X-Originating-IP: [198.162.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17594 invoked from network); 3 Nov 2011 20:16:16 -0000
Received: from unknown (HELO athos.nss.cs.ubc.ca) (198.162.52.240)
	by server-11.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 20:16:16 -0000
Received: from athos.nss.cs.ubc.ca (localhost [127.0.0.1])
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Debian-9.1ubuntu1) with ESMTP id
	pA3KG9Dp025095; Thu, 3 Nov 2011 13:16:09 -0700
Received: (from root@localhost)
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Submit) id pA3KG8Qn025092;
	Thu, 3 Nov 2011 13:16:08 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: b6ed8e28ae3fb14aeb978fdf626b682ed24957ba
Message-Id: <b6ed8e28ae3fb14aeb97.1320350705@athos.nss.cs.ubc.ca>
In-Reply-To: <patchbomb.1320350703@athos.nss.cs.ubc.ca>
References: <patchbomb.1320350703@athos.nss.cs.ubc.ca>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Thu, 03 Nov 2011 13:05:05 -0700
From: rshriram@cs.ubc.ca
To: xen-devel@lists.xensource.com
Cc: brendan@cs.ubc.ca, ian.jackson@eu.citrix.com
Subject: [Xen-devel] [PATCH 2 of 2 V5] remus: command line switch to
	enable/disable checkpoint compression
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Shriram Rajagopalan <rshriram@cs.ubc.ca>
# Date 1320348758 25200
# Node ID b6ed8e28ae3fb14aeb978fdf626b682ed24957ba
# Parent  d27072263a483fbf66456722fbd84967fe606602
remus: command line switch to enable/disable checkpoint compression

Add a command line switch to remus script that allows the user to
enable or disable checkpoint compression in the libxc code.

Signed-off-by: Shriram Rajagopalan <rshriram@cs.ubc.ca>

diff -r d27072263a48 -r b6ed8e28ae3f tools/python/xen/lowlevel/checkpoint/checkpoint.c
--- a/tools/python/xen/lowlevel/checkpoint/checkpoint.c	Thu Nov 03 12:31:11 2011 -0700
+++ b/tools/python/xen/lowlevel/checkpoint/checkpoint.c	Thu Nov 03 12:32:38 2011 -0700
@@ -104,13 +104,14 @@
   PyObject* postcopy_cb = NULL;
   PyObject* checkpoint_cb = NULL;
   unsigned int interval = 0;
+  unsigned int flags = 0;
 
   int fd;
   struct save_callbacks callbacks;
   int rc;
 
-  if (!PyArg_ParseTuple(args, "O|OOOI", &iofile, &suspend_cb, &postcopy_cb,
-                       &checkpoint_cb, &interval))
+  if (!PyArg_ParseTuple(args, "O|OOOII", &iofile, &suspend_cb, &postcopy_cb,
+			&checkpoint_cb, &interval, &flags))
     return NULL;
 
   self->interval = interval;
@@ -160,7 +161,7 @@
   callbacks.data = self;
 
   self->threadstate = PyEval_SaveThread();
-  rc = checkpoint_start(&self->cps, fd, &callbacks);
+  rc = checkpoint_start(&self->cps, fd, &callbacks, flags);
   PyEval_RestoreThread(self->threadstate);
 
   if (rc < 0) {
diff -r d27072263a48 -r b6ed8e28ae3f tools/python/xen/lowlevel/checkpoint/checkpoint.h
--- a/tools/python/xen/lowlevel/checkpoint/checkpoint.h	Thu Nov 03 12:31:11 2011 -0700
+++ b/tools/python/xen/lowlevel/checkpoint/checkpoint.h	Thu Nov 03 12:32:38 2011 -0700
@@ -40,13 +40,15 @@
     timer_t timer;
 } checkpoint_state;
 
+#define CHECKPOINT_FLAGS_COMPRESSION 1
 char* checkpoint_error(checkpoint_state* s);
 
 void checkpoint_init(checkpoint_state* s);
 int checkpoint_open(checkpoint_state* s, unsigned int domid);
 void checkpoint_close(checkpoint_state* s);
 int checkpoint_start(checkpoint_state* s, int fd,
-                    struct save_callbacks* callbacks);
+		     struct save_callbacks* callbacks,
+		     unsigned int remus_flags);
 int checkpoint_suspend(checkpoint_state* s);
 int checkpoint_resume(checkpoint_state* s);
 int checkpoint_postflush(checkpoint_state* s);
diff -r d27072263a48 -r b6ed8e28ae3f tools/python/xen/lowlevel/checkpoint/libcheckpoint.c
--- a/tools/python/xen/lowlevel/checkpoint/libcheckpoint.c	Thu Nov 03 12:31:11 2011 -0700
+++ b/tools/python/xen/lowlevel/checkpoint/libcheckpoint.c	Thu Nov 03 12:32:38 2011 -0700
@@ -170,7 +170,8 @@
 }
 
 int checkpoint_start(checkpoint_state* s, int fd,
-                    struct save_callbacks* callbacks)
+		     struct save_callbacks* callbacks,
+		     unsigned int remus_flags)
 {
     int hvm, rc;
     int flags = XCFLAGS_LIVE;
@@ -188,6 +189,8 @@
        if (switch_qemu_logdirty(s, 1))
            return -1;
     }
+    if (remus_flags & CHECKPOINT_FLAGS_COMPRESSION)
+      flags |= XCFLAGS_CHECKPOINT_COMPRESS;
 
     callbacks->switch_qemu_logdirty = noop_switch_logdirty;
 
diff -r d27072263a48 -r b6ed8e28ae3f tools/python/xen/remus/save.py
--- a/tools/python/xen/remus/save.py	Thu Nov 03 12:31:11 2011 -0700
+++ b/tools/python/xen/remus/save.py	Thu Nov 03 12:32:38 2011 -0700
@@ -133,7 +133,7 @@
 
 class Saver(object):
     def __init__(self, domid, fd, suspendcb=None, resumecb=None,
-                 checkpointcb=None, interval=0):
+                 checkpointcb=None, interval=0, flags=0):
         """Create a Saver object for taking guest checkpoints.
         domid:        name, number or UUID of a running domain
         fd:           a stream to which checkpoint data will be written.
@@ -141,12 +141,14 @@
         resumecb:     callback invoked before guest resumes
         checkpointcb: callback invoked when a checkpoint is complete. Return
                       True to take another checkpoint, or False to stop.
+        flags:        Remus flags to be passed to xc_domain_save
         """
         self.fd = fd
         self.suspendcb = suspendcb
         self.resumecb = resumecb
         self.checkpointcb = checkpointcb
         self.interval = interval
+        self.flags = flags
 
         self.vm = vm.VM(domid)
 
@@ -164,7 +166,8 @@
             try:
                 self.checkpointer.open(self.vm.domid)
                 self.checkpointer.start(self.fd, self.suspendcb, self.resumecb,
-                                        self.checkpointcb, self.interval)
+                                        self.checkpointcb, self.interval,
+                                        self.flags)
             except xen.lowlevel.checkpoint.error, e:
                 raise CheckpointError(e)
         finally:
diff -r d27072263a48 -r b6ed8e28ae3f tools/remus/remus
--- a/tools/remus/remus	Thu Nov 03 12:31:11 2011 -0700
+++ b/tools/remus/remus	Thu Nov 03 12:32:38 2011 -0700
@@ -16,6 +16,9 @@
 class CfgException(Exception): pass
 
 class Cfg(object):
+
+    REMUS_FLAGS_COMPRESSION = 1
+
     def __init__(self):
         # must be set
         self.domid = 0
@@ -25,6 +28,7 @@
         self.port = XendOptions.instance().get_xend_relocation_port()
         self.interval = 200
         self.netbuffer = True
+        self.flags = self.REMUS_FLAGS_COMPRESSION
         self.timer = False
 
         parser = optparse.OptionParser()
@@ -38,6 +42,8 @@
                           help='replicate to /dev/null (no disk checkpoints, only memory & net buffering)')
         parser.add_option('', '--no-net', dest='nonet', action='store_true',
                           help='run without net buffering (benchmark option)')
+        parser.add_option('', '--no-compression', dest='nocompress', action='store_true',
+                          help='run without checkpoint compression')
         parser.add_option('', '--timer', dest='timer', action='store_true',
                           help='force pause at checkpoint interval (experimental)')
         self.parser = parser
@@ -56,6 +62,8 @@
             self.nullremus = True
         if opts.nonet:
             self.netbuffer = False
+        if opts.nocompress:
+            self.flags &= ~self.REMUS_FLAGS_COMPRESSION
         if opts.timer:
             self.timer = True
 
@@ -190,7 +198,7 @@
     rc = 0
 
     checkpointer = save.Saver(cfg.domid, fd, postsuspend, preresume, commit,
-                              interval)
+                              interval, cfg.flags)
 
     try:
         checkpointer.start()

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 13:18:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 13:18:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM3jh-0002Nn-FH; Thu, 03 Nov 2011 13:18:05 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RM3hz-0001ns-Mk
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 13:16:20 -0700
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-4.tower-21.messagelabs.com!1320351374!2851658!1
X-Originating-IP: [198.162.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17705 invoked from network); 3 Nov 2011 20:16:16 -0000
Received: from unknown (HELO athos.nss.cs.ubc.ca) (198.162.52.240)
	by server-4.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Nov 2011 20:16:16 -0000
Received: from athos.nss.cs.ubc.ca (localhost [127.0.0.1])
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Debian-9.1ubuntu1) with ESMTP id
	pA3KG8C9025081; Thu, 3 Nov 2011 13:16:08 -0700
Received: (from root@localhost)
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Submit) id pA3KG8Lm025078;
	Thu, 3 Nov 2011 13:16:08 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1320350703@athos.nss.cs.ubc.ca>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Thu, 03 Nov 2011 13:05:03 -0700
From: rshriram@cs.ubc.ca
To: xen-devel@lists.xensource.com
Cc: brendan@cs.ubc.ca, ian.jackson@eu.citrix.com
Subject: [Xen-devel] [PATCH 0 of 2 V5] libxc: checkpoint compression
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This patch series adds checkpoint compression functionality, while
running under Remus.

Tested under xen-4.2-unstable/pvops dom0 (x86_64) #ubuntu-10.04.

A simple benchmark: SpecJBB (Java Benchmark)
- 4 minute Remus run, with PV domU (2.6.32 xenolinux kernel), 1G memory and 2 VCPUs
- Data sent without compression: ~70GB.
- Data sent with compression: ~8GB.

Changes since last version:
1. use posix_memalign only on linux platforms and switch to normal malloc for
   the rest. stubdom compiles successfully.

Shriram

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 13:19:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 13:19:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM3kf-0002kt-Oe; Thu, 03 Nov 2011 13:19:05 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RM3hz-0001nr-NJ
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 13:16:23 -0700
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-6.tower-182.messagelabs.com!1320351374!1869301!1
X-Originating-IP: [198.162.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4657 invoked from network); 3 Nov 2011 20:16:15 -0000
Received: from unknown (HELO athos.nss.cs.ubc.ca) (198.162.52.240)
	by server-6.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Nov 2011 20:16:15 -0000
Received: from athos.nss.cs.ubc.ca (localhost [127.0.0.1])
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Debian-9.1ubuntu1) with ESMTP id
	pA3KG8NG025088; Thu, 3 Nov 2011 13:16:08 -0700
Received: (from root@localhost)
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Submit) id pA3KG8i4025085;
	Thu, 3 Nov 2011 13:16:08 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: d27072263a483fbf66456722fbd84967fe606602
Message-Id: <d27072263a483fbf6645.1320350704@athos.nss.cs.ubc.ca>
In-Reply-To: <patchbomb.1320350703@athos.nss.cs.ubc.ca>
References: <patchbomb.1320350703@athos.nss.cs.ubc.ca>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Thu, 03 Nov 2011 13:05:04 -0700
From: rshriram@cs.ubc.ca
To: xen-devel@lists.xensource.com
Cc: brendan@cs.ubc.ca, ian.jackson@eu.citrix.com
Subject: [Xen-devel] [PATCH 1 of 2 V5] tools/libxc: Remus Checkpoint
	Compression
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Shriram Rajagopalan <rshriram@cs.ubc.ca>
# Date 1320348671 25200
# Node ID d27072263a483fbf66456722fbd84967fe606602
# Parent  4b0907c6a08c348962bd976c2976257b412408be
tools/libxc: Remus Checkpoint Compression

Instead of sending dirty pages of guest memory as-is, use a simple compression
algorithm that sends a RLE-encoded XOR of the page against its last sent copy.
A small LRU cache is used to hold recently dirtied pages. Pagetable pages are
sent as-is, as they are canonicalized at sender side and uncanonicalized at
receiver.

Signed-off-by: Shriram Rajagopalan <rshriram@cs.ubc.ca>

diff -r 4b0907c6a08c -r d27072263a48 tools/libxc/Makefile
--- a/tools/libxc/Makefile	Tue Oct 11 12:02:58 2011 +0100
+++ b/tools/libxc/Makefile	Thu Nov 03 12:31:11 2011 -0700
@@ -42,7 +42,7 @@
 GUEST_SRCS-y :=
 GUEST_SRCS-y += xg_private.c xc_suspend.c
 GUEST_SRCS-$(CONFIG_MIGRATE) += xc_domain_restore.c xc_domain_save.c
-GUEST_SRCS-$(CONFIG_MIGRATE) += xc_offline_page.c
+GUEST_SRCS-$(CONFIG_MIGRATE) += xc_offline_page.c xc_compression.c
 GUEST_SRCS-$(CONFIG_HVM) += xc_hvm_build.c
 
 vpath %.c ../../xen/common/libelf
diff -r 4b0907c6a08c -r d27072263a48 tools/libxc/xc_compression.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxc/xc_compression.c	Thu Nov 03 12:31:11 2011 -0700
@@ -0,0 +1,567 @@
+/******************************************************************************
+ * xc_compression.c
+ *
+ * Checkpoint Compression using Page Delta Algorithm.
+ * - A LRU cache of recently dirtied guest pages is maintained.
+ * - For each dirty guest page in the checkpoint, if a previous version of the
+ * page exists in the cache, XOR both pages and send the non-zero sections
+ * to the receiver. The cache is then updated with the newer copy of guest page.
+ * - The receiver will XOR the non-zero sections against its copy of the guest
+ * page, thereby bringing the guest page up-to-date with the sender side.
+ *
+ * Copyright (c) 2011 Shriram Rajagopalan (rshriram@cs.ubc.ca).
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <inttypes.h>
+#include <errno.h>
+#include "xenctrl.h"
+#include "xg_save_restore.h"
+#include "xg_private.h"
+#include "xc_dom.h"
+
+/* Page Cache for Delta Compression*/
+#define DELTA_CACHE_SIZE (XC_PAGE_SIZE * 8192)
+
+/* Internal page buffer to hold dirty pages of a checkpoint,
+ * to be compressed after the domain is resumed for execution.
+ */
+#define PAGE_BUFFER_SIZE (XC_PAGE_SIZE * 8192)
+
+struct cache_page
+{
+    char *page;
+    xen_pfn_t pfn;
+    struct cache_page *next;
+    struct cache_page *prev;
+};
+
+struct compression_ctx
+{
+    /* compression buffer - holds compressed data */
+    char *compbuf;
+    unsigned long compbuf_size;
+    unsigned long compbuf_pos;
+
+    /* Page buffer to hold pages to be compressed */
+    char *inputbuf;
+    /* pfns of pages to be compressed */
+    xen_pfn_t *sendbuf_pfns;
+    unsigned int pfns_len;
+    unsigned int pfns_index;
+
+    /* Compression Cache (LRU) */
+    char *cache_base;
+    struct cache_page **pfn2cache;
+    struct cache_page *cache;
+    struct cache_page *page_list_head;
+    struct cache_page *page_list_tail;
+    unsigned long dom_pfnlist_size;
+};
+
+#define RUNFLAG 0
+#define SKIPFLAG ((char)128)
+#define FLAGMASK SKIPFLAG
+#define LENMASK ((char)127)
+
+/*
+ * see xg_save_restore.h for details on the compressed stream format.
+ * delta size = 4 bytes.
+ * run header = 1 byte (1 bit for runtype, 7bits for run length).
+ *  i.e maximum size of a run = 127 * 4 = 508 bytes.
+ * Worst case compression: Entire page has changed.
+ * In the worst case, the size of the compressed page is
+ *  8 runs of 508 bytes + 1 run of 32 bytes + 9 run headers 
+ *  = 4105 bytes.
+ * We could detect this worst case and send the entire page with a
+ * FULL_PAGE marker, reducing the total size to 4097 bytes. The cost
+ * of this size reduction is an additional memcpy, on top of two previous
+ * memcpy (to the compressed stream and the cache page in the for loop).
+ *
+ * We might as well sacrifice an extra 8 bytes instead of a memcpy.
+ */
+#define WORST_COMP_PAGE_SIZE (XC_PAGE_SIZE + 9)
+
+/*
+ * A zero length skip indicates full page.
+ */
+#define EMPTY_PAGE 0
+#define FULL_PAGE SKIPFLAG
+#define FULL_PAGE_SIZE (XC_PAGE_SIZE + 1)
+#define MAX_DELTAS (XC_PAGE_SIZE/sizeof(uint32_t))
+
+/*
+ * Add a pagetable page or a new page (uncached)
+ * if srcpage is a pagetable page, cache_page is null.
+ * if srcpage is a page that was not previously in the cache,
+ *  cache_page points to a free page slot in the cache where
+ *  this new page can be copied to.
+ */
+static int add_full_page(comp_ctx *ctx, char *srcpage, char *cache_page)
+{
+    char *dest = (ctx->compbuf + ctx->compbuf_pos);
+
+    if ( (ctx->compbuf_pos + FULL_PAGE_SIZE) > ctx->compbuf_size)
+        return -1;
+
+    if (cache_page)
+        memcpy(cache_page, srcpage, XC_PAGE_SIZE);
+    dest[0] = FULL_PAGE;
+    memcpy(&dest[1], srcpage, XC_PAGE_SIZE);
+    ctx->compbuf_pos += FULL_PAGE_SIZE;
+
+    return FULL_PAGE_SIZE;
+}
+
+static int compress_page(comp_ctx *ctx, char *srcpage, char *cache_page)
+{
+    char *dest = (ctx->compbuf + ctx->compbuf_pos);
+    uint32_t *new, *old;
+
+    int off, runptr = 0;
+    int wascopying = 0, copying = 0, bytes_skipped = 0;
+    int complen = 0, pageoff = 0, runbytes = 0;
+
+    char runlen = 0;
+
+    if ( (ctx->compbuf_pos + WORST_COMP_PAGE_SIZE) > ctx->compbuf_size)
+        return -1;
+
+    /*
+     * There are no alignment issues here since srcpage is
+     * domU's page passed from xc_domain_save and cache_page is
+     * a ptr to cache page (cache is page aligned).
+     */
+    new = (uint32_t*)srcpage;
+    old = (uint32_t*)cache_page;
+
+    for (off = 0; off <= MAX_DELTAS; off++)
+    {
+        /*
+         * At (off == MAX_DELTAS), we are processing the last run
+         * in the page. Since there is no XORing, make wascopying != copying
+         * to satisfy the if-block below.
+         */
+        copying = ((off < MAX_DELTAS) ? (old[off] != new[off]) : !wascopying);
+
+        if (runlen)
+        {
+            /* switching between run types or current run is full */
+            if ( (wascopying != copying) || (runlen == LENMASK) )
+            {
+                runbytes = runlen * sizeof(uint32_t);
+                runlen |= (wascopying ? RUNFLAG : SKIPFLAG);
+                dest[complen++] = runlen;
+
+                if (wascopying) /* RUNFLAG */
+                {
+                    pageoff = runptr * sizeof(uint32_t);
+                    memcpy(dest + complen, srcpage + pageoff, runbytes);
+                    memcpy(cache_page + pageoff, srcpage + pageoff, runbytes);
+                    complen += runbytes;
+                }
+                else /* SKIPFLAG */
+                {
+                    bytes_skipped += runbytes;
+                }
+
+                runlen = 0;
+                runptr = off;
+            }
+        }
+        runlen++;
+        wascopying = copying;
+    }
+
+    /*
+     * Check for empty page.
+     */
+    if (bytes_skipped == XC_PAGE_SIZE)
+    {
+        complen = 1;
+        dest[0] = EMPTY_PAGE;
+    }
+    ctx->compbuf_pos += complen;
+
+    return complen;
+}
+
+static
+char *get_cache_page(comp_ctx *ctx, xen_pfn_t pfn,
+                     int *israw)
+{
+    struct cache_page *item = NULL;
+
+    item = ctx->pfn2cache[pfn];
+
+    if (!item)
+    {
+        *israw = 1;
+
+        /* If the list is full, evict a page from the tail end. */
+        item = ctx->page_list_tail;
+        if (item->pfn != INVALID_P2M_ENTRY)
+            ctx->pfn2cache[item->pfn] = NULL;
+
+        item->pfn = pfn;
+        ctx->pfn2cache[pfn] = item;
+    }
+        
+    /* 	if requested item is in cache move to head of list */
+    if (item != ctx->page_list_head)
+    {
+        if (item == ctx->page_list_tail)
+        {
+            /* item at tail of list. */
+            ctx->page_list_tail = item->prev;
+            (ctx->page_list_tail)->next = NULL;
+        }
+        else
+        {
+            /* item in middle of list */
+            item->prev->next = item->next;
+            item->next->prev = item->prev;
+        }
+
+        item->prev = NULL;
+        item->next = ctx->page_list_head;
+        (ctx->page_list_head)->prev = item;
+        ctx->page_list_head = item;
+    }
+
+    return (ctx->page_list_head)->page;
+}
+
+/* Remove pagetable pages from cache and move to tail, as free pages */
+static
+void invalidate_cache_page(comp_ctx *ctx, xen_pfn_t pfn)
+{
+    struct cache_page *item = NULL;
+
+    item = ctx->pfn2cache[pfn];
+    if (item)
+    {
+        if (item != ctx->page_list_tail)
+        {
+            /* item at head of list */
+            if (item == ctx->page_list_head)
+            {
+                ctx->page_list_head = (ctx->page_list_head)->next;
+                (ctx->page_list_head)->prev = NULL;
+            }
+            else /* item in middle of list */
+            {            
+                item->prev->next = item->next;
+                item->next->prev = item->prev;
+            }
+
+            item->next = NULL;
+            item->prev = ctx->page_list_tail;
+            (ctx->page_list_tail)->next = item;
+            ctx->page_list_tail = item;
+        }
+        ctx->pfn2cache[pfn] = NULL;
+        (ctx->page_list_tail)->pfn = INVALID_P2M_ENTRY;
+    }
+}
+
+int xc_compression_add_page(xc_interface *xch, comp_ctx *ctx,
+                            char *page, xen_pfn_t pfn, int israw)
+{
+    if (pfn > ctx->dom_pfnlist_size)
+    {
+        ERROR("Invalid pfn passed into "
+              "xc_compression_add_page %" PRIpfn "\n", pfn);
+        return -2;
+    }
+
+    /* pagetable page */
+    if (israw)
+        invalidate_cache_page(ctx, pfn);
+    ctx->sendbuf_pfns[ctx->pfns_len] = israw ? INVALID_P2M_ENTRY : pfn;
+    memcpy(ctx->inputbuf + ctx->pfns_len * XC_PAGE_SIZE, page, XC_PAGE_SIZE);
+    ctx->pfns_len++;
+
+    /* check if we have run out of space. If so,
+     * we need to synchronously compress the pages and flush them out
+     */
+    if (ctx->pfns_len == NRPAGES(PAGE_BUFFER_SIZE))
+        return -1;
+    return 0;
+}
+
+int xc_compression_compress_pages(xc_interface *xch, comp_ctx *ctx,
+                                  char *compbuf, unsigned long compbuf_size,
+                                  unsigned long *compbuf_len)
+{
+    char *cache_copy = NULL, *current_page = NULL;
+    int israw, rc = 1;
+
+    if (!ctx->pfns_len || (ctx->pfns_index == ctx->pfns_len)) {
+        ctx->pfns_len = ctx->pfns_index = 0;
+        return 0;
+    }
+
+    ctx->compbuf_pos = 0;
+    ctx->compbuf = compbuf;
+    ctx->compbuf_size = compbuf_size;
+
+    for (; ctx->pfns_index < ctx->pfns_len; ctx->pfns_index++)
+    {
+        israw = 0;
+        cache_copy = NULL;
+        current_page = ctx->inputbuf + ctx->pfns_index * XC_PAGE_SIZE;
+
+        if (ctx->sendbuf_pfns[ctx->pfns_index] == INVALID_P2M_ENTRY)
+            israw = 1;
+        else
+            cache_copy = get_cache_page(ctx,
+                                        ctx->sendbuf_pfns[ctx->pfns_index],
+                                        &israw);
+
+        if (israw)
+            rc = (add_full_page(ctx, current_page, cache_copy) >= 0);
+        else
+            rc = (compress_page(ctx, current_page, cache_copy) >= 0);
+
+        if ( !rc )
+        {
+            /* Out of space in outbuf! flush and come back */
+            rc = -1;
+            break;
+        }
+    }
+    if (compbuf_len)
+        *compbuf_len = ctx->compbuf_pos;
+
+    return rc;
+}
+
+inline
+void xc_compression_reset_pagebuf(xc_interface *xch, comp_ctx *ctx)
+{
+    ctx->pfns_index = ctx->pfns_len = 0;
+}
+
+int xc_compression_uncompress_page(xc_interface *xch, char *compbuf,
+                                   unsigned long compbuf_size,
+                                   unsigned long *compbuf_pos, char *destpage)
+{
+    unsigned long pos;
+    unsigned int len = 0, pagepos = 0;
+    char flag;
+
+    pos = *compbuf_pos;
+    if (pos >= compbuf_size)
+    {
+        ERROR("Out of bounds exception in compression buffer (a):"
+              "read ptr:%lu, bufsize = %lu\n",
+              *compbuf_pos, compbuf_size);
+        return -1;
+    }
+
+    switch (compbuf[pos])
+    {
+    case EMPTY_PAGE:
+        pos++;
+        break;
+
+    case FULL_PAGE:
+        {
+            /* Check if the input buffer has 4KB of data */
+            if ((pos + FULL_PAGE_SIZE) > compbuf_size)
+            {
+                ERROR("Out of bounds exception in compression buffer (b):"
+                      "read ptr = %lu, bufsize = %lu\n",
+                      *compbuf_pos, compbuf_size);
+                return -1;
+            }
+            memcpy(destpage, &compbuf[pos + 1], XC_PAGE_SIZE);
+            pos += FULL_PAGE_SIZE;
+        }
+        break;
+
+    default: /* Normal page with one or more runs */
+        {
+            do
+            {
+                flag = compbuf[pos] & FLAGMASK;
+                len = (compbuf[pos] & LENMASK) * sizeof(uint32_t);
+                /* Sanity Check: Zero-length runs are allowed only for
+                 * FULL_PAGE and EMPTY_PAGE.
+                 */
+                if (!len)
+                {
+                    ERROR("Zero length run encountered for normal page: "
+                          "buffer (d):read ptr = %lu, flag = %u, "
+                          "bufsize = %lu, pagepos = %u\n",
+                          pos, (unsigned int)flag, compbuf_size, pagepos);
+                    return -1;
+                }
+
+                pos++;
+                if (flag == RUNFLAG)
+                {
+                    /* Check if the input buffer has len bytes of data
+                     * and whether it would fit in the destination page.
+                     */
+                    if (((pos + len) > compbuf_size)
+                        || ((pagepos + len) > XC_PAGE_SIZE))
+                    {
+                        ERROR("Out of bounds exception in compression "
+                              "buffer (c):read ptr = %lu, runlen = %u, "
+                              "bufsize = %lu, pagepos = %u\n",
+                              pos, len, compbuf_size, pagepos);
+                        return -1;
+                    }
+                    memcpy(&destpage[pagepos], &compbuf[pos], len);
+                    pos += len;
+                }
+                pagepos += len;
+            } while ((pagepos < XC_PAGE_SIZE) && (pos < compbuf_size));
+
+            /* Make sure we have copied/skipped 4KB worth of data */
+            if (pagepos != XC_PAGE_SIZE)
+            {
+                ERROR("Invalid data in compression buffer:"
+                      "read ptr = %lu, bufsize = %lu, pagepos = %u\n",
+                      pos, compbuf_size, pagepos);
+                return -1;
+            }
+        }
+    }
+    *compbuf_pos = pos;
+    return 0;
+}
+
+void xc_compression_free_context(xc_interface *xch, comp_ctx *ctx)
+{
+    if (!ctx) return;
+
+    if (ctx->inputbuf)
+        free(ctx->inputbuf);
+    if (ctx->sendbuf_pfns)
+        free(ctx->sendbuf_pfns);
+    if (ctx->cache_base)
+        free(ctx->cache_base);
+    if (ctx->pfn2cache)
+        free(ctx->pfn2cache);
+    if (ctx->cache)
+        free(ctx->cache);
+    free(ctx);
+}
+
+comp_ctx *xc_compression_create_context(xc_interface *xch,
+                                        unsigned long p2m_size)
+{
+    unsigned long i;
+    comp_ctx *ctx = NULL;
+    unsigned long num_cache_pages = DELTA_CACHE_SIZE/XC_PAGE_SIZE;
+
+    ctx = (comp_ctx *)malloc(sizeof(comp_ctx));
+    if (!ctx)
+    {
+        ERROR("Failed to allocate compression_ctx\n");
+        goto error;
+    }
+    memset(ctx, 0, sizeof(comp_ctx));
+
+#ifdef __linux__
+    if (posix_memalign((void **)&ctx->inputbuf,
+                       XC_PAGE_SIZE, PAGE_BUFFER_SIZE))
+    {
+        ERROR("Failed to allocate page buffer\n");
+        goto error;
+    }
+
+    if (posix_memalign((void **)&ctx->cache_base,
+                       XC_PAGE_SIZE, DELTA_CACHE_SIZE))
+    {
+        ERROR("Failed to allocate delta cache\n");
+        goto error;
+    }
+#else
+    ctx->inputbuf = malloc(PAGE_BUFFER_SIZE);
+    if (!ctx->inputbuf)
+    {
+        ERROR("Failed to allocate page buffer\n");
+        goto error;
+    }
+
+    ctx->cache_base = malloc(DELTA_CACHE_SIZE);
+    if (!ctx->cache_base)
+    {
+        ERROR("Failed to allocate delta cache\n");
+        goto error;
+    }
+#endif
+
+    ctx->sendbuf_pfns = malloc(NRPAGES(PAGE_BUFFER_SIZE) *
+                               sizeof(xen_pfn_t));
+    if (!ctx->sendbuf_pfns)
+    {
+        ERROR("Could not alloc sendbuf_pfns\n");
+        goto error;
+    }
+    memset(ctx->sendbuf_pfns, -1,
+           NRPAGES(PAGE_BUFFER_SIZE) * sizeof(xen_pfn_t));
+
+    ctx->pfn2cache = calloc(p2m_size, sizeof(struct cache_page *));
+    if (!ctx->pfn2cache)
+    {
+        ERROR("Could not alloc pfn2cache map\n");
+        goto error;
+    }
+
+    ctx->cache = malloc(num_cache_pages * sizeof(struct cache_page));
+    if (!ctx->cache)
+    {
+        ERROR("Could not alloc compression cache\n");
+        goto error;
+    }
+
+    for (i = 0; i < num_cache_pages; i++)
+    {
+        ctx->cache[i].pfn = INVALID_P2M_ENTRY;
+        ctx->cache[i].page = ctx->cache_base + i * XC_PAGE_SIZE;
+        ctx->cache[i].prev = (i == 0) ? NULL : &(ctx->cache[i - 1]);
+        ctx->cache[i].next = ((i+1) == num_cache_pages)? NULL :
+            &(ctx->cache[i + 1]);
+    }
+    ctx->page_list_head = &(ctx->cache[0]);
+    ctx->page_list_tail = &(ctx->cache[num_cache_pages -1]);
+    ctx->dom_pfnlist_size = p2m_size;
+
+    return ctx;
+error:
+    xc_compression_free_context(xch, ctx);
+    return NULL;
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r 4b0907c6a08c -r d27072263a48 tools/libxc/xc_domain_restore.c
--- a/tools/libxc/xc_domain_restore.c	Tue Oct 11 12:02:58 2011 +0100
+++ b/tools/libxc/xc_domain_restore.c	Thu Nov 03 12:31:11 2011 -0700
@@ -43,6 +43,7 @@
     xen_pfn_t *p2m_batch; /* A table of P2M mappings in the current region.  */
     int completed; /* Set when a consistent image is available */
     int last_checkpoint; /* Set when we should commit to the current checkpoint when it completes. */
+    int compressing; /* Set when sender signals that pages would be sent compressed (for Remus) */
     struct domain_info_context dinfo;
 };
 
@@ -663,6 +664,10 @@
     /* pages is of length nr_physpages, pfn_types is of length nr_pages */
     unsigned int nr_physpages, nr_pages;
 
+    /* checkpoint compression state */
+    int compressing;
+    unsigned long compbuf_pos, compbuf_size;
+
     /* Types of the pfns in the current region */
     unsigned long* pfn_types;
 
@@ -700,6 +705,7 @@
 {
     int count, countpages, oldcount, i;
     void* ptmp;
+    unsigned long compbuf_size;
 
     if ( RDEXACT(fd, &count, sizeof(count)) )
     {
@@ -809,6 +815,40 @@
         }
         return pagebuf_get_one(xch, ctx, buf, fd, dom);
 
+    case XC_SAVE_ID_ENABLE_COMPRESSION:
+        /* We cannot set compression flag directly in pagebuf structure,
+         * since this pagebuf still has uncompressed pages that are yet to
+         * be applied. We enable the compression field in pagebuf structure
+         * after receiving the first tailbuf.
+         */
+        ctx->compressing = 1;
+        // DPRINTF("compression flag received");
+        return pagebuf_get_one(xch, ctx, buf, fd, dom);
+
+    case XC_SAVE_ID_COMPRESSED_DATA:
+
+        /* read the length of compressed chunk coming in */
+        if ( RDEXACT(fd, &compbuf_size, sizeof(unsigned long)) )
+        {
+            PERROR("Error when reading compbuf_size");
+            return -1;
+        }
+        if (!compbuf_size) return 1;
+
+        buf->compbuf_size += compbuf_size;
+        if (!(ptmp = realloc(buf->pages, buf->compbuf_size))) {
+            ERROR("Could not (re)allocate compression buffer");
+            return -1;
+        }
+        buf->pages = ptmp;
+
+        if ( RDEXACT(fd, buf->pages + (buf->compbuf_size - compbuf_size),
+                     compbuf_size) ) {
+            PERROR("Error when reading compression buffer");
+            return -1;
+        }
+        return compbuf_size;
+
     default:
         if ( (count > MAX_BATCH_SIZE) || (count < 0) ) {
             ERROR("Max batch size exceeded (%d). Giving up.", count);
@@ -846,6 +886,13 @@
     if (!countpages)
         return count;
 
+    /* If Remus Checkpoint Compression is turned on, we will only be
+     * receiving the pfn lists now. The compressed pages will come in later,
+     * following a <XC_SAVE_ID_COMPRESSED_DATA, compressedChunkSize> tuple.
+     */
+    if (buf->compressing)
+        return pagebuf_get_one(xch, ctx, buf, fd, dom);
+
     oldcount = buf->nr_physpages;
     buf->nr_physpages += countpages;
     if (!buf->pages) {
@@ -874,6 +921,7 @@
     int rc;
 
     buf->nr_physpages = buf->nr_pages = 0;
+    buf->compbuf_pos = buf->compbuf_size = 0;
 
     do {
         rc = pagebuf_get_one(xch, ctx, buf, fd, dom);
@@ -1091,7 +1139,21 @@
         /* In verify mode, we use a copy; otherwise we work in place */
         page = pagebuf->verify ? (void *)buf : (region_base + i*PAGE_SIZE);
 
-        memcpy(page, pagebuf->pages + (curpage + curbatch) * PAGE_SIZE, PAGE_SIZE);
+        /* Remus - page decompression */
+        if (pagebuf->compressing)
+        {
+            if (xc_compression_uncompress_page(xch, pagebuf->pages,
+                                               pagebuf->compbuf_size,
+                                               &pagebuf->compbuf_pos,
+                                               (char *)page))
+            {
+                ERROR("Failed to uncompress page (pfn=%lx)\n", pfn);
+                goto err_mapped;
+            }
+        }
+        else
+            memcpy(page, pagebuf->pages + (curpage + curbatch) * PAGE_SIZE,
+                   PAGE_SIZE);
 
         pagetype &= XEN_DOMCTL_PFINFO_LTABTYPE_MASK;
 
@@ -1353,6 +1415,7 @@
 
         if ( !ctx->completed ) {
             pagebuf.nr_physpages = pagebuf.nr_pages = 0;
+            pagebuf.compbuf_pos = pagebuf.compbuf_size = 0;
             if ( pagebuf_get_one(xch, ctx, &pagebuf, io_fd, dom) < 0 ) {
                 PERROR("Error when reading batch");
                 goto out;
@@ -1395,6 +1458,7 @@
         }
 
         pagebuf.nr_physpages = pagebuf.nr_pages = 0;
+        pagebuf.compbuf_pos = pagebuf.compbuf_size = 0;
 
         n += j; /* crude stats */
 
@@ -1438,6 +1502,13 @@
          */
         if ( !ctx->last_checkpoint )
             fcntl(io_fd, F_SETFL, orig_io_fd_flags | O_NONBLOCK);
+
+        /*
+         * If sender had sent enable compression flag, switch to compressed
+         * checkpoints mode once the first checkpoint is received.
+         */
+        if (ctx->compressing)
+            pagebuf.compressing = 1;
     }
 
     if (pagebuf.acpi_ioport_location == 1) {
diff -r 4b0907c6a08c -r d27072263a48 tools/libxc/xc_domain_save.c
--- a/tools/libxc/xc_domain_save.c	Tue Oct 11 12:02:58 2011 +0100
+++ b/tools/libxc/xc_domain_save.c	Thu Nov 03 12:31:11 2011 -0700
@@ -218,6 +218,56 @@
         return noncached_write(xch, ob, fd, buf, len);
 }
 
+static int write_compressed(xc_interface *xch, comp_ctx *compress_ctx,
+                            int dobuf, struct outbuf* ob, int fd)
+{
+    int rc = 0;
+    int header = sizeof(int) + sizeof(unsigned long);
+    int marker = XC_SAVE_ID_COMPRESSED_DATA;
+    unsigned long compbuf_len = 0;
+
+    do
+    {
+        /* check for available space (atleast 8k) */
+        if ((ob->pos + header + XC_PAGE_SIZE * 2) > ob->size)
+        {
+            if (outbuf_flush(xch, ob, fd) < 0)
+            {
+                ERROR("Error when flushing outbuf intermediate");
+                return -1;
+            }
+        }
+
+        rc = xc_compression_compress_pages(xch, compress_ctx,
+                                           ob->buf + ob->pos + header,
+                                           ob->size - ob->pos - header,
+                                           &compbuf_len);
+        if (!rc)
+            return 0;
+
+        if (outbuf_hardwrite(xch, ob, fd, &marker, sizeof(marker)) < 0)
+        {
+            PERROR("Error when writing marker (errno %d)", errno);
+            return -1;
+        }
+
+        if (outbuf_hardwrite(xch, ob, fd, &compbuf_len, sizeof(compbuf_len)) < 0)
+        {
+            PERROR("Error when writing compbuf_len (errno %d)", errno);
+            return -1;
+        }
+
+        ob->pos += (size_t) compbuf_len;
+        if (!dobuf && outbuf_flush(xch, ob, fd) < 0)
+        {
+            ERROR("Error when writing compressed chunk");
+            return -1;
+        }
+    } while (rc != 0);
+
+    return 0;
+}
+
 struct time_stats {
     struct timeval wall;
     long long d0_cpu, d1_cpu;
@@ -815,11 +865,35 @@
 
     unsigned long mfn;
 
-    struct outbuf ob;
+    /* Without checkpoint compression, the dirty pages, pfn arrays
+     * and tailbuf (vcpu ctx, shared info page, etc.)  are written
+     * directly to outbuf. All of this is done while the domain is
+     * suspended.
+     *
+     * When checkpoint compression is enabled, the dirty pages are
+     * buffered, compressed "after" the domain is resumed and then
+     * written to outbuf. Since tailbuf data are collected while a
+     * domain is suspended, they cannot be directly written to the
+     * outbuf as there is no dirty page data preceeding tailbuf.
+     *
+     * So,two output buffers are maintained. Tailbuf data goes into
+     * ob_tailbuf. The dirty pages are compressed after resuming the
+     * domain and written to ob_pagebuf. ob_tailbuf is then appended
+     * to ob_pagebuf and finally flushed out.
+     */
+    struct outbuf ob_pagebuf, ob_tailbuf, *ob = NULL;
     struct save_ctx _ctx;
     struct save_ctx *ctx = &_ctx;
     struct domain_info_context *dinfo = &ctx->dinfo;
 
+    /* Compression context */
+    comp_ctx *compress_ctx= NULL;
+    /* Even if XCFLAGS_CHECKPOINT_COMPRESS is set, we enable compression only
+     * after sending XC_SAVE_ID_ENABLE_COMPRESSION and the tailbuf for
+     * first time.
+     */
+    int compressing = 0;
+
     int completed = 0;
 
     if ( hvm && !callbacks->switch_qemu_logdirty )
@@ -829,7 +903,7 @@
         return 1;
     }
 
-    outbuf_init(xch, &ob, OUTBUF_SIZE);
+    outbuf_init(xch, &ob_pagebuf, OUTBUF_SIZE);
 
     memset(ctx, 0, sizeof(*ctx));
 
@@ -917,6 +991,16 @@
         }
     }
 
+    if ( flags & XCFLAGS_CHECKPOINT_COMPRESS )
+    {
+        if (!(compress_ctx = xc_compression_create_context(xch, dinfo->p2m_size)))
+        {
+            ERROR("Failed to create compression context");
+            goto out;
+        }
+        outbuf_init(xch, &ob_tailbuf, OUTBUF_SIZE/4);
+    }
+
     last_iter = !live;
 
     /* pretend we sent all the pages last iteration */
@@ -1025,9 +1109,11 @@
     }
 
   copypages:
-#define wrexact(fd, buf, len) write_buffer(xch, last_iter, &ob, (fd), (buf), (len))
-#define wruncached(fd, live, buf, len) write_uncached(xch, last_iter, &ob, (fd), (buf), (len))
+#define wrexact(fd, buf, len) write_buffer(xch, last_iter, ob, (fd), (buf), (len))
+#define wruncached(fd, live, buf, len) write_uncached(xch, last_iter, ob, (fd), (buf), (len))
+#define wrcompressed(fd) write_compressed(xch, compress_ctx, last_iter, ob, (fd))
 
+    ob = &ob_pagebuf; /* Holds pfn_types, pages/compressed pages */
     /* Now write out each data page, canonicalising page tables as we go... */
     for ( ; ; )
     {
@@ -1270,7 +1356,7 @@
                 {
                     /* If the page is not a normal data page, write out any
                        run of pages we may have previously acumulated */
-                    if ( run )
+                    if ( !compressing && run )
                     {
                         if ( wruncached(io_fd, live,
                                        (char*)region_base+(PAGE_SIZE*(j-run)), 
@@ -1305,7 +1391,41 @@
                         goto out;
                     }
 
-                    if ( wruncached(io_fd, live, page, PAGE_SIZE) != PAGE_SIZE )
+                    if (compressing)
+                    {
+                        int c_err;
+                        /* Mark pagetable page to be sent uncompressed */
+                        c_err = xc_compression_add_page(xch, compress_ctx, page,
+                                                        pfn, 1 /* raw page */);
+                        if (c_err == -2) /* OOB PFN */
+                        {
+                            ERROR("Could not add pagetable page "
+                                  "(pfn:%" PRIpfn "to page buffer\n", pfn);
+                            goto out;
+                        }
+
+                        if (c_err == -1)
+                        {
+                            /*
+                             * We are out of buffer space to hold dirty
+                             * pages. Compress and flush the current buffer
+                             * to make space. This is a corner case, that
+                             * slows down checkpointing as the compression
+                             * happens while domain is suspended. Happens
+                             * seldom and if you find this occuring
+                             * frequently, increase the PAGE_BUFFER_SIZE
+                             * in xc_compression.c.
+                             */
+                            if (wrcompressed(io_fd) < 0)
+                            {
+                                ERROR("Error when writing compressed"
+                                      " data (4b)\n");
+                                goto out;
+                            }
+                        }
+                    }
+                    else if ( wruncached(io_fd, live, page,
+                                         PAGE_SIZE) != PAGE_SIZE )
                     {
                         PERROR("Error when writing to state file (4b)"
                               " (errno %d)", errno);
@@ -1315,7 +1435,34 @@
                 else
                 {
                     /* We have a normal page: accumulate it for writing. */
-                    run++;
+                    if (compressing)
+                    {
+                        int c_err;
+                        /* For checkpoint compression, accumulate the page in the
+                         * page buffer, to be compressed later.
+                         */
+                        c_err = xc_compression_add_page(xch, compress_ctx, spage,
+                                                        pfn, 0 /* not raw page */);
+
+                        if (c_err == -2) /* OOB PFN */
+                        {
+                            ERROR("Could not add page "
+                                  "(pfn:%" PRIpfn "to page buffer\n", pfn);
+                            goto out;
+                        }
+
+                        if (c_err == -1)
+                        {
+                            if (wrcompressed(io_fd) < 0)
+                            {
+                                ERROR("Error when writing compressed"
+                                      " data (4c)\n");
+                                goto out;
+                            }
+                        }
+                    }
+                    else
+                        run++;
                 }
             } /* end of the write out for this batch */
 
@@ -1423,6 +1570,15 @@
 
     DPRINTF("All memory is saved\n");
 
+    /* After last_iter, buffer the rest of pagebuf & tailbuf data into a
+     * separate output buffer and flush it after the compressed page chunks.
+     */
+    if (compressing)
+    {
+        ob = &ob_tailbuf;
+        ob->pos = 0;
+    }
+
     {
         struct {
             int id;
@@ -1522,6 +1678,25 @@
         }
     }
 
+    /* Enable compression logic on both sides by sending this
+     * one time marker.
+     * NOTE: We could have simplified this procedure by sending
+     * the enable/disable compression flag before the beginning of
+     * the main for loop. But this would break compatibility for
+     * live migration code, with older versions of xen. So we have
+     * to enable it after the last_iter, when the XC_SAVE_ID_*
+     * elements are sent.
+     */
+    if (!compressing && (flags & XCFLAGS_CHECKPOINT_COMPRESS))
+    {
+        i = XC_SAVE_ID_ENABLE_COMPRESSION;
+        if ( wrexact(io_fd, &i, sizeof(int)) )
+        {
+            PERROR("Error when writing enable_compression marker");
+            goto out;
+        }
+    }
+
     /* Zero terminate */
     i = 0;
     if ( wrexact(io_fd, &i, sizeof(int)) )
@@ -1766,14 +1941,38 @@
     if ( !rc && callbacks->postcopy )
         callbacks->postcopy(callbacks->data);
 
+    /* guest has been resumed. Now we can compress data
+     * at our own pace.
+     */
+    if (!rc && compressing)
+    {
+        ob = &ob_pagebuf;
+        if (wrcompressed(io_fd) < 0)
+        {
+            ERROR("Error when writing compressed data, after postcopy\n");
+            rc = 1;
+            goto out;
+        }
+        /* Append the tailbuf data to the main outbuf */
+        if ( wrexact(io_fd, ob_tailbuf.buf, ob_tailbuf.pos) )
+        {
+            rc = 1;
+            PERROR("Error when copying tailbuf into outbuf");
+            goto out;
+        }
+    }
+
     /* Flush last write and discard cache for file. */
-    if ( outbuf_flush(xch, &ob, io_fd) < 0 ) {
+    if ( outbuf_flush(xch, ob, io_fd) < 0 ) {
         PERROR("Error when flushing output buffer");
         rc = 1;
     }
 
     discard_file_cache(xch, io_fd, 1 /* flush */);
 
+    /* Enable compression now, finally */
+    compressing = (flags & XCFLAGS_CHECKPOINT_COMPRESS);
+
     /* checkpoint_cb can spend arbitrarily long in between rounds */
     if (!rc && callbacks->checkpoint &&
         callbacks->checkpoint(callbacks->data) > 0)
@@ -1815,6 +2014,9 @@
             DPRINTF("Warning - couldn't disable qemu log-dirty mode");
     }
 
+    if (compress_ctx)
+        xc_compression_free_context(xch, compress_ctx);
+
     if ( live_shinfo )
         munmap(live_shinfo, PAGE_SIZE);
 
diff -r 4b0907c6a08c -r d27072263a48 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h	Tue Oct 11 12:02:58 2011 +0100
+++ b/tools/libxc/xenctrl.h	Thu Nov 03 12:31:11 2011 -0700
@@ -1906,4 +1906,64 @@
                         int verbose);
 /* Useful for callers who also use libelf. */
 
+/**
+ * Checkpoint Compression
+ */
+typedef struct compression_ctx comp_ctx;
+comp_ctx *xc_compression_create_context(xc_interface *xch,
+					unsigned long p2m_size);
+void xc_compression_free_context(xc_interface *xch, comp_ctx *ctx);
+
+/**
+ * Add a page to compression page buffer, to be compressed later.
+ *
+ * returns 0 if the page was successfully added to the page buffer
+ *
+ * returns -1 if there is no space in buffer. In this case, the
+ *  application should call xc_compression_compress_pages to compress
+ *  the buffer (or atleast part of it), thereby freeing some space in
+ *  the page buffer.
+ *
+ * returns -2 if the pfn is out of bounds, where the bound is p2m_size
+ *  parameter passed during xc_compression_create_context.
+ */
+int xc_compression_add_page(xc_interface *xch, comp_ctx *ctx, char *page,
+			    unsigned long pfn, int israw);
+
+/**
+ * Delta compress pages in the compression buffer and inserts the
+ * compressed data into the supplied compression buffer compbuf, whose
+ * size is compbuf_size.
+ * After compression, the pages are copied to the internal LRU cache.
+ *
+ * This function compresses as many pages as possible into the
+ * supplied compression buffer. It maintains an internal iterator to
+ * keep track of pages in the input buffer that are yet to be compressed.
+ *
+ * returns -1 if the compression buffer has run out of space.  
+ * returns 1 on success.
+ * returns 0 if no more pages are left to be compressed.
+ *  When the return value is non-zero, compbuf_len indicates the actual
+ *  amount of data present in compbuf (<=compbuf_size).
+ */
+int xc_compression_compress_pages(xc_interface *xch, comp_ctx *ctx,
+				  char *compbuf, unsigned long compbuf_size,
+				  unsigned long *compbuf_len);
+
+/**
+ * Resets the internal page buffer that holds dirty pages before compression.
+ * Also resets the iterators.
+ */
+void xc_compression_reset_pagebuf(xc_interface *xch, comp_ctx *ctx);
+
+/**
+ * Caller must supply the compression buffer (compbuf),
+ * its size (compbuf_size) and a reference to index variable (compbuf_pos)
+ * that is used internally. Each call pulls out one page from the compressed
+ * chunk and copies it to dest.
+ */
+int xc_compression_uncompress_page(xc_interface *xch, char *compbuf,
+				   unsigned long compbuf_size,
+				   unsigned long *compbuf_pos, char *dest);
+
 #endif /* XENCTRL_H */
diff -r 4b0907c6a08c -r d27072263a48 tools/libxc/xenguest.h
--- a/tools/libxc/xenguest.h	Tue Oct 11 12:02:58 2011 +0100
+++ b/tools/libxc/xenguest.h	Thu Nov 03 12:31:11 2011 -0700
@@ -27,6 +27,7 @@
 #define XCFLAGS_DEBUG     2
 #define XCFLAGS_HVM       4
 #define XCFLAGS_STDVGA    8
+#define XCFLAGS_CHECKPOINT_COMPRESS    16
 #define X86_64_B_SIZE   64 
 #define X86_32_B_SIZE   32
 
diff -r 4b0907c6a08c -r d27072263a48 tools/libxc/xg_save_restore.h
--- a/tools/libxc/xg_save_restore.h	Tue Oct 11 12:02:58 2011 +0100
+++ b/tools/libxc/xg_save_restore.h	Thu Nov 03 12:31:11 2011 -0700
@@ -67,7 +67,7 @@
  *
  *   consists of p2m_size bytes comprising an array of xen_pfn_t sized entries.
  *
- * BODY PHASE
+ * BODY PHASE - Format A (for live migration or Remus without compression)
  * ----------
  *
  * A series of chunks with a common header:
@@ -87,6 +87,122 @@
  *
  * If chunk type is 0 then body phase is complete.
  *
+ *
+ * BODY PHASE - Format B (for Remus with compression)
+ * ----------
+ *
+ * A series of chunks with a common header:
+ *   int              : chunk type
+ *
+ * If the chunk type is +ve then chunk contains array of PFNs corresponding
+ * to guest memory and type contains the number of PFNs in the batch:
+ *
+ *     unsigned long[]  : PFN array, length == number of pages in batch
+ *                        Each entry consists of XEN_DOMCTL_PFINFO_*
+ *                        in bits 31-28 and the PFN number in bits 27-0.
+ *
+ * If the chunk type is -ve then chunk consists of one of a number of
+ * metadata types.  See definitions of XC_SAVE_ID_* below.
+ *
+ * If the chunk type is -ve and equals XC_SAVE_ID_COMPRESSED_DATA, then the
+ * chunk consists of compressed page data, in the following format:
+ *
+ *     unsigned long        : Size of the compressed chunk to follow
+ *     compressed data :      variable length data of size indicated above.
+ *                            This chunk consists of compressed page data.
+ *                            The number of pages in one chunk depends on
+ *                            the amount of space available in the sender's
+ *                            output buffer.
+ *
+ * Format of compressed data:
+ *   compressed_data = <deltas>*
+ *   delta           = <marker, run*>
+ *   marker          = (RUNFLAG|SKIPFLAG) bitwise-or RUNLEN [1 byte marker]
+ *   RUNFLAG         = 0
+ *   SKIPFLAG        = 1 << 7
+ *   RUNLEN          = 7-bit unsigned value indicating number of WORDS in the run
+ *   run             = string of bytes of length sizeof(WORD) * RUNLEN
+ *
+ *    If marker contains RUNFLAG, then RUNLEN * sizeof(WORD) bytes of data following
+ *   the marker is copied into the target page at the appropriate offset indicated by
+ *   the offset_ptr
+ *    If marker contains SKIPFLAG, then the offset_ptr is advanced
+ *   by RUNLEN * sizeof(WORD).
+ *
+ * If chunk type is 0 then body phase is complete.
+ *
+ * There can be one or more chunks with type XC_SAVE_ID_COMPRESSED_DATA,
+ * containing compressed pages. The compressed chunks are collated to form
+ * one single compressed chunk for the entire iteration. The number of pages
+ * present in this final compressed chunk will be equal to the total number
+ * of valid PFNs specified by the +ve chunks.
+ *
+ * At the sender side, compressed pages are inserted into the output stream
+ * in the same order as they would have been if compression logic was absent.
+ *
+ * Until last iteration, the BODY is sent in Format A, to maintain live
+ * migration compatibility with receivers of older Xen versions.
+ * At the last iteration, if Remus compression was enabled, the sender sends
+ * a trigger, XC_SAVE_ID_ENABLE_COMPRESSION to tell the receiver to parse the
+ * BODY in Format B from the next iteration onwards.
+ *
+ * An example sequence of chunks received in Format B:
+ *     +16                              +ve chunk
+ *     unsigned long[16]                PFN array
+ *     +100                             +ve chunk
+ *     unsigned long[100]               PFN array
+ *     +50                              +ve chunk
+ *     unsigned long[50]                PFN array
+ *
+ *     XC_SAVE_ID_COMPRESSED_DATA       TAG
+ *       N                              Length of compressed data
+ *       N bytes of DATA                Decompresses to 166 pages
+ *
+ *     XC_SAVE_ID_*                     other xc save chunks
+ *     0                                END BODY TAG
+ *
+ * Corner case with checkpoint compression:
+ *     At sender side, after pausing the domain, dirty pages are usually
+ *   copied out to a temporary buffer. After the domain is resumed,
+ *   compression is done and the compressed chunk(s) are sent, followed by
+ *   other XC_SAVE_ID_* chunks.
+ *     If the temporary buffer gets full while scanning for dirty pages,
+ *   the sender stops buffering of dirty pages, compresses the temporary
+ *   buffer and sends the compressed data with XC_SAVE_ID_COMPRESSED_DATA.
+ *   The sender then resumes the buffering of dirty pages and continues
+ *   scanning for the dirty pages.
+ *     For e.g., assume that the temporary buffer can hold 4096 pages and
+ *   there are 5000 dirty pages. The following is the sequence of chunks
+ *   that the receiver will see:
+ *
+ *     +1024                       +ve chunk
+ *     unsigned long[1024]         PFN array
+ *     +1024                       +ve chunk
+ *     unsigned long[1024]         PFN array
+ *     +1024                       +ve chunk
+ *     unsigned long[1024]         PFN array
+ *     +1024                       +ve chunk
+ *     unsigned long[1024]         PFN array
+ *
+ *     XC_SAVE_ID_COMPRESSED_DATA  TAG
+ *      N                          Length of compressed data
+ *      N bytes of DATA            Decompresses to 4096 pages
+ *
+ *     +4                          +ve chunk
+ *     unsigned long[4]            PFN array
+ *
+ *     XC_SAVE_ID_COMPRESSED_DATA  TAG
+ *      M                          Length of compressed data
+ *      M bytes of DATA            Decompresses to 4 pages
+ *
+ *     XC_SAVE_ID_*                other xc save chunks
+ *     0                           END BODY TAG
+ *
+ *     In other words, XC_SAVE_ID_COMPRESSED_DATA can be interleaved with
+ *   +ve chunks arbitrarily. But at the receiver end, the following condition
+ *   always holds true until the end of BODY PHASE:
+ *    num(PFN entries +ve chunks) >= num(pages received in compressed form)
+ *
  * TAIL PHASE
  * ----------
  *
@@ -134,6 +250,8 @@
 #define XC_SAVE_ID_HVM_CONSOLE_PFN    -8 /* (HVM-only) */
 #define XC_SAVE_ID_LAST_CHECKPOINT    -9 /* Commit to restoring after completion of current iteration. */
 #define XC_SAVE_ID_HVM_ACPI_IOPORTS_LOCATION -10
+#define XC_SAVE_ID_COMPRESSED_DATA    -11 /* Marker to indicate arrival of compressed data */
+#define XC_SAVE_ID_ENABLE_COMPRESSION -12 /* Marker to enable compression logic at receiver side */
 
 /*
 ** We process save/restore/migrate in batches of pages; the below

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 13:36:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 13:36:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM41l-0003Xd-VK; Thu, 03 Nov 2011 13:36:46 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RM411-0003Km-MN
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 13:36:00 -0700
X-Env-Sender: rickenrao@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320352437!51761611!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19674 invoked from network); 3 Nov 2011 20:33:58 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 20:33:58 -0000
Received: by ywp17 with SMTP id 17so2557420ywp.30
	for <xen-devel@lists.xensource.com>;
	Thu, 03 Nov 2011 13:34:25 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=nYnL6gD1DZhymGz6qzpdnml86obhItexhj9uTATfhpM=;
	b=pk0kzfahbd7rcY8qdLiBmOYGN8AHc/J6m8vqmzX2JJwuDH221797afs7Yz7Dsir4iv
	D/jOvo2ph8jr41rHrJupH8CcLvkBJqUqAPlQgomTiJDt4GkGj35f1tLLj1/kMq08x2lT
	uD2qd3lnJe14eYc++NlicRHscBufwOQHFq2/Q=
MIME-Version: 1.0
Received: by 10.146.230.42 with SMTP id c42mr2855371yah.12.1320352465394; Thu,
	03 Nov 2011 13:34:25 -0700 (PDT)
Received: by 10.146.237.11 with HTTP; Thu, 3 Nov 2011 13:34:23 -0700 (PDT)
Date: Thu, 3 Nov 2011 16:34:23 -0400
Message-ID: <CAA8E7hE9MLaaY0g+gJ5xnVUXBEM935kgFB+Y35_H13p901MLRg@mail.gmail.com>
From: Jia Rao <rickenrao@gmail.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] locate xen compile errors
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1280394700=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1280394700==
Content-Type: multipart/alternative; boundary=000e0cd48f9cad9d5104b0da834d

--000e0cd48f9cad9d5104b0da834d
Content-Type: text/plain; charset=ISO-8859-1

Hi all,

I modified the Xen source code and got compile errors.
But the compile errors only shows which file caused the error.
Is there a way to show the line numbers that cause the error in the file ?

I tried to modify the Rules.mk in the xen folder to enable debug and
verbose output, no success.

Thanks !

--000e0cd48f9cad9d5104b0da834d
Content-Type: text/html; charset=ISO-8859-1

Hi all,<div><br></div><div>I modified the Xen source code and got compile errors.</div><div>But the compile errors only shows which file caused the error.</div><div>Is there a way to show the line numbers that cause the error in the file ?</div>
<div><br></div><div>I tried to modify the Rules.mk in the xen folder to enable debug and verbose output, no success.</div><div><br></div><div>Thanks !</div>

--000e0cd48f9cad9d5104b0da834d--


--===============1280394700==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1280394700==--


From xen-devel-bounces@lists.xensource.com Thu Nov 03 15:26:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 15:26:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM5kQ-0006UP-9v; Thu, 03 Nov 2011 15:26:58 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RM5jc-0006IN-LZ
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 15:26:09 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1320359165!1867560!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13951 invoked from network); 3 Nov 2011 22:26:05 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 22:26:05 -0000
X-IronPort-AV: E=Sophos;i="4.69,452,1315180800"; 
   d="scan'208";a="8750539"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	03 Nov 2011 22:26:05 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 3 Nov 2011 22:26:05 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RM5jY-0007PW-Qr;
	Thu, 03 Nov 2011 22:26:04 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RM5jY-0005Fa-QG;
	Thu, 03 Nov 2011 22:26:04 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9667-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 3 Nov 2011 22:26:04 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9667: regressions - trouble:
	broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9667 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9667/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-pcipt-intel  5 xen-boot                fail REGR. vs. 9661
 test-amd64-i386-rhel6hvm-intel  5 xen-boot                 fail REGR. vs. 9661
 test-i386-i386-pv             3 host-install(3)              broken
 test-amd64-i386-pv            5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-pv           5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-xl           5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-rhel6hvm-amd  5 xen-boot                   fail REGR. vs. 9661
 test-i386-i386-xl             5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl            5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl-credit2    5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl-multivcpu  5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-pair         8 xen-boot/dst_host          fail REGR. vs. 9661
 test-amd64-amd64-pair         7 xen-boot/src_host          fail REGR. vs. 9661
 test-amd64-i386-pair          8 xen-boot/dst_host          fail REGR. vs. 9661
 test-amd64-i386-pair          7 xen-boot/src_host          fail REGR. vs. 9661
 test-i386-i386-pair           7 xen-boot/src_host          fail REGR. vs. 9661
 test-i386-i386-pair           8 xen-boot/dst_host          fail REGR. vs. 9661
 test-amd64-i386-win-vcpus1    3 host-install(3)              broken
 test-i386-i386-xl-win         5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl-win-vcpus1  5 xen-boot                  fail REGR. vs. 9661
 test-i386-i386-win            5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-win          5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-xl-win       5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-win           5 xen-boot                   fail REGR. vs. 9661

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-sedf      5 xen-boot                     fail    like 9661

version targeted for testing:
 xen                  801ca6c0fbfa
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        fail    
 test-amd64-i386-pair                                         fail    
 test-i386-i386-pair                                          fail    
 test-amd64-amd64-pv                                          fail    
 test-amd64-i386-pv                                           fail    
 test-i386-i386-pv                                            broken  
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   broken  
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24069:801ca6c0fbfa
tag:         tip
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:28:41 2011 +0100
    
    x86/IRQ: consolidate IRQ disabling when acquiring vector lock
    
    __assign_irq_vector() doesn't need to disable interrupts (its callers
    are required to when acquiring the lock), and set_desc_affinity() can
    use the normal spin lock primitives.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24068:6928172f7ded
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:27:38 2011 +0100
    
    IRQ: allocate CPU masks dynamically
    
    This includes delaying the initialization of dynamically created IRQs
    until their actual first use and some further elimination of uses of
    struct irq_cfg.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24067:17ee4c213438
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 16:35:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 16:35:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM6oF-0007wl-Mi; Thu, 03 Nov 2011 16:34:59 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM6mu-0007jl-Pb; Thu, 03 Nov 2011 16:33:38 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320363211!2839987!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21835 invoked from network); 3 Nov 2011 23:33:33 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 23:33:33 -0000
X-IronPort-AV: E=Sophos;i="4.69,453,1315195200"; d="scan'208";a="169357765"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	03 Nov 2011 19:33:31 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Thu, 3 Nov 2011
	19:33:31 -0400
Message-ID: <1320363206.28373.1.camel@cthulhu.hellion.org.uk>
Subject: Re: [Xen-users] Re: [Xen-devel] Problems with 'xl create winxp'
	(hvm) on xen 4.1.2 (also affects GPLPV)
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Flavio <fbcyborg@gmail.com>
Date: Fri, 4 Nov 2011 08:33:26 +0900
In-Reply-To: <CAP8Jb=paAsq754ermXsjytD3a3mgwELwtDdHNAoq7su8GLO_qg@mail.gmail.com>
References: <1758215.SCbitK4oVy@dell4550>
	<1320058232.23193.59.camel@zakaz.uk.xensource.com>
	<alpine.DEB.2.00.1111030645070.3519@kaball-desktop>
	<CAP8Jb=paAsq754ermXsjytD3a3mgwELwtDdHNAoq7su8GLO_qg@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Cc: jim burns <jim_burn@bellsouth.net>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-11-03 at 04:39 -0400, Flavio wrote:
> On 3 November 2011 07:46, Stefano Stabellini
> <stefano.stabellini@eu.citrix.com> wrote:
> > On Mon, 31 Oct 2011, Ian Campbell wrote:
> >> > 3) Specifying vncviewer=1/vncconsole=1 in your config (don't remember which
> >> > works - I use both) will automatically start a vnc viewer for you when you 'xm
> >> > create' an hvm domain. (Sadly, this never worked for a pv domain. You have to
> >> > use the xm/xl vncviewer domainname command.) This does not work with 'xl
> >> > create'.
> >>
> >> I think this is just a missing feature.
> >>
> >
> > Nope, it should work. IanJ implemented this feature a while back.
> I doesn't work to me using xl. I am obliged to do xl vncviewer <domain_id>
> once the domU has started.

You are correct, I think what Stefano is thinking of is when IanJ
implemented the xl vncviewer command. There is no support in xl (that I
can see) for setting "vncconsole=1" in the domain configuration file and
having that autospawn vncviewer on create. Patches for this feature
would be very welcome.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 16:52:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 16:52:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM74t-0000pS-Pw; Thu, 03 Nov 2011 16:52:11 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RM749-0000cr-4Q
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 16:51:25 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1320364280!3569054!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5003 invoked from network); 3 Nov 2011 23:51:21 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 23:51:21 -0000
X-IronPort-AV: E=Sophos;i="4.69,453,1315195200"; d="scan'208";a="18812254"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	03 Nov 2011 19:51:19 -0400
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Thu, 3 Nov 2011
	19:51:19 -0400
Message-ID: <1320364276.28373.7.camel@cthulhu.hellion.org.uk>
Subject: Re: [Xen-devel] locate xen compile errors
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jia Rao <rickenrao@gmail.com>
Date: Fri, 4 Nov 2011 08:51:16 +0900
In-Reply-To: <CAA8E7hE9MLaaY0g+gJ5xnVUXBEM935kgFB+Y35_H13p901MLRg@mail.gmail.com>
References: <CAA8E7hE9MLaaY0g+gJ5xnVUXBEM935kgFB+Y35_H13p901MLRg@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-11-03 at 16:34 -0400, Jia Rao wrote:
> I modified the Xen source code and got compile errors.
> But the compile errors only shows which file caused the error.
> Is there a way to show the line numbers that cause the error in the
> file ?

Compile errors almost always include the line number if it is relevant.
Please post your complete build log so we can take a look.

Ian.




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 18:25:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 18:25:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM8XL-0003H7-SB; Thu, 03 Nov 2011 18:25:39 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM8WZ-00034P-66; Thu, 03 Nov 2011 18:24:51 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1320369858!42610122!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5255 invoked from network); 4 Nov 2011 01:24:19 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 01:24:19 -0000
X-IronPort-AV: E=Sophos;i="4.69,453,1315180800"; 
   d="scan'208";a="8751297"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 01:24:32 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 01:24:32 +0000
Date: Fri, 4 Nov 2011 01:24:58 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-users] Re: [Xen-devel] Problems with 'xl create winxp'
	(hvm) on xen 4.1.2 (also affects GPLPV)
In-Reply-To: <1320363206.28373.1.camel@cthulhu.hellion.org.uk>
Message-ID: <alpine.DEB.2.00.1111040124420.3519@kaball-desktop>
References: <1758215.SCbitK4oVy@dell4550>
	<1320058232.23193.59.camel@zakaz.uk.xensource.com>
	<alpine.DEB.2.00.1111030645070.3519@kaball-desktop>
	<CAP8Jb=paAsq754ermXsjytD3a3mgwELwtDdHNAoq7su8GLO_qg@mail.gmail.com>
	<1320363206.28373.1.camel@cthulhu.hellion.org.uk>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: Flavio <fbcyborg@gmail.com>, jim burns <jim_burn@bellsouth.net>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 3 Nov 2011, Ian Campbell wrote:
> On Thu, 2011-11-03 at 04:39 -0400, Flavio wrote:
> > On 3 November 2011 07:46, Stefano Stabellini
> > <stefano.stabellini@eu.citrix.com> wrote:
> > > On Mon, 31 Oct 2011, Ian Campbell wrote:
> > >> > 3) Specifying vncviewer=1/vncconsole=1 in your config (don't remember which
> > >> > works - I use both) will automatically start a vnc viewer for you when you 'xm
> > >> > create' an hvm domain. (Sadly, this never worked for a pv domain. You have to
> > >> > use the xm/xl vncviewer domainname command.) This does not work with 'xl
> > >> > create'.
> > >>
> > >> I think this is just a missing feature.
> > >>
> > >
> > > Nope, it should work. IanJ implemented this feature a while back.
> > I doesn't work to me using xl. I am obliged to do xl vncviewer <domain_id>
> > once the domU has started.
> 
> You are correct, I think what Stefano is thinking of is when IanJ
> implemented the xl vncviewer command. There is no support in xl (that I
> can see) for setting "vncconsole=1" in the domain configuration file and
> having that autospawn vncviewer on create. Patches for this feature
> would be very welcome.
 
yes, my mistake.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 19:15:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 19:15:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RM9JP-00053m-MB; Thu, 03 Nov 2011 19:15:20 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RM9Hm-0004qJ-61
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 19:13:38 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320372786!51778086!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7096 invoked from network); 4 Nov 2011 02:13:06 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 02:13:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,453,1315180800"; 
   d="scan'208";a="8751446"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 02:13:34 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 02:13:34 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RM9Hi-0000EM-3x;
	Fri, 04 Nov 2011 02:13:34 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RM9Hi-0005BI-3L;
	Fri, 04 Nov 2011 02:13:34 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <E1RM9Hi-0005BI-3L@woking.xci-test.com>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 4 Nov 2011 02:13:34 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com, keir@xen.org, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [xen-unstable bisection] complete
	test-amd64-amd64-xl-pcipt-intel
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

branch xen-unstable
xen branch xen-unstable
job test-amd64-amd64-xl-pcipt-intel
test xen-boot

Tree: linux git://github.com/jsgf/linux-xen.git
Tree: qemu git://hg.uk.xensource.com/HG/qemu-xen-unstable.git
Tree: xen http://xenbits.xen.org/staging/xen-unstable.hg

*** Found and reproduced problem changeset ***

  Bug is in tree:  xen http://xenbits.xen.org/staging/xen-unstable.hg
  Bug introduced:  6928172f7ded
  Bug not present: 17ee4c213438


  changeset:   24068:6928172f7ded
  user:        Jan Beulich <jbeulich@suse.com>
  date:        Thu Nov 03 17:27:38 2011 +0100
      
      IRQ: allocate CPU masks dynamically
      
      This includes delaying the initialization of dynamically created IRQs
      until their actual first use and some further elimination of uses of
      struct irq_cfg.
      
      Signed-off-by: Jan Beulich <jbeulich@suse.com>
      Acked-by: Keir Fraser <keir@xen.org>
      Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
      
      


For bisection revision-tuple graph see:
   http://www.chiark.greenend.org.uk/~xensrcts/results/bisect.xen-unstable.test-amd64-amd64-xl-pcipt-intel.xen-boot.html
Revision IDs in each graph node refer, respectively, to the Trees above.

----------------------------------------
Searching for failure / basis pass:
 9663 fail [host=gall-mite] / 9662 [host=itch-mite] 9661 [host=itch-mite] 9659 ok.
Failure / basis pass flights: 9663 / 9659
Tree: linux git://github.com/jsgf/linux-xen.git
Tree: qemu git://hg.uk.xensource.com/HG/qemu-xen-unstable.git
Tree: xen http://xenbits.xen.org/staging/xen-unstable.hg
Latest 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 801ca6c0fbfa
Basis pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 54a5e994a241
Generating revisions with ./adhoc-revtuple-generator  git://github.com/jsgf/linux-xen.git#6bec8b4a4c14095d0b7ce424db9d583c3decae6c-6bec8b4a4c14095d0b7ce424db9d583c3decae6c git://hg.uk.xensource.com/HG/qemu-xen-unstable.git#52834188eedfbbca5636fd869d4c86b3b3044439-52834188eedfbbca5636fd869d4c86b3b3044439 http://xenbits.xen.org/staging/xen-unstable.hg#54a5e994a241-801ca6c0fbfa
pulling from ssh://xen@xenbits.xen.org/HG/staging/xen-unstable.hg
searching for changes
no changes found
pulling from ssh://xen@xenbits.xen.org/HG/staging/xen-unstable.hg
searching for changes
no changes found
Loaded 9 nodes in revision graph
Searching for test results:
 9661 [host=itch-mite]
 9670 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 17ee4c213438
 9662 [host=itch-mite]
 9671 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 6928172f7ded
 9672 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 17ee4c213438
 9663 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 801ca6c0fbfa
 9659 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 54a5e994a241
 9673 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 6928172f7ded
 9668 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 54a5e994a241
 9669 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 801ca6c0fbfa
 9674 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 17ee4c213438
 9675 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 6928172f7ded
Searching for interesting versions
 Result found: flight 9659 (pass), for basis pass
 Result found: flight 9663 (fail), for basis failure
 Repro found: flight 9668 (pass), for basis pass
 Repro found: flight 9669 (fail), for basis failure
 0 revisions at 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 17ee4c213438
No revisions left to test, checking graph state.
 Result found: flight 9670 (pass), for last pass
 Result found: flight 9671 (fail), for first failure
 Repro found: flight 9672 (pass), for last pass
 Repro found: flight 9673 (fail), for first failure
 Repro found: flight 9674 (pass), for last pass
 Repro found: flight 9675 (fail), for first failure

*** Found and reproduced problem changeset ***

  Bug is in tree:  xen http://xenbits.xen.org/staging/xen-unstable.hg
  Bug introduced:  6928172f7ded
  Bug not present: 17ee4c213438

pulling from ssh://xen@xenbits.xen.org/HG/staging/xen-unstable.hg
searching for changes
no changes found

  changeset:   24068:6928172f7ded
  user:        Jan Beulich <jbeulich@suse.com>
  date:        Thu Nov 03 17:27:38 2011 +0100
      
      IRQ: allocate CPU masks dynamically
      
      This includes delaying the initialization of dynamically created IRQs
      until their actual first use and some further elimination of uses of
      struct irq_cfg.
      
      Signed-off-by: Jan Beulich <jbeulich@suse.com>
      Acked-by: Keir Fraser <keir@xen.org>
      Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
      
      

Revision graph left in /home/xc_osstest/results/bisect.xen-unstable.test-amd64-amd64-xl-pcipt-intel.xen-boot.{dot,ps,png,html}.
----------------------------------------
9675: ALL FAIL

flight 9675 xen-unstable real-bisect [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9675/


jobs:
 test-amd64-amd64-xl-pcipt-intel                              fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 21:23:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 21:23:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMBJK-0007SY-Oo; Thu, 03 Nov 2011 21:23:22 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMBII-0007G3-Aj
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 21:22:18 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1320380534!1888390!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5205 invoked from network); 4 Nov 2011 04:22:15 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 04:22:15 -0000
X-IronPort-AV: E=Sophos;i="4.69,454,1315180800"; 
   d="scan'208";a="8752378"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 04:22:14 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 04:22:14 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RMBIE-0000xF-3q;
	Fri, 04 Nov 2011 04:22:14 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RMBIE-0007w6-2W;
	Fri, 04 Nov 2011 04:22:14 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9676-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 4 Nov 2011 04:22:14 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9676: regressions - trouble:
	broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9676 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9676/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-pcipt-intel  5 xen-boot                fail REGR. vs. 9661
 test-amd64-i386-rhel6hvm-intel  3 host-install(3)              broken
 test-amd64-i386-pv            5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-pv           3 host-install(3)              broken
 test-amd64-amd64-xl           3 host-install(3)              broken
 test-amd64-i386-rhel6hvm-amd  5 xen-boot                   fail REGR. vs. 9661
 test-i386-i386-pv             5 xen-boot                   fail REGR. vs. 9661
 test-i386-i386-xl             5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl            5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl-credit2    5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl-multivcpu  5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-pair         8 xen-boot/dst_host          fail REGR. vs. 9661
 test-amd64-amd64-pair         7 xen-boot/src_host          fail REGR. vs. 9661
 test-amd64-i386-pair          8 xen-boot/dst_host          fail REGR. vs. 9661
 test-amd64-i386-pair          7 xen-boot/src_host          fail REGR. vs. 9661
 test-i386-i386-pair           7 xen-boot/src_host          fail REGR. vs. 9661
 test-i386-i386-pair           8 xen-boot/dst_host          fail REGR. vs. 9661
 test-amd64-i386-win-vcpus1    5 xen-boot                   fail REGR. vs. 9661
 test-i386-i386-xl-win         5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl-win-vcpus1  5 xen-boot                  fail REGR. vs. 9661
 test-i386-i386-win            3 host-install(3)              broken
 test-amd64-amd64-win          5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-xl-win       5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-win           5 xen-boot                   fail REGR. vs. 9661

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-sedf      5 xen-boot                     fail    like 9661

version targeted for testing:
 xen                  801ca6c0fbfa
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          broken  
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               broken  
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        fail    
 test-amd64-i386-pair                                         fail    
 test-i386-i386-pair                                          fail    
 test-amd64-amd64-pv                                          broken  
 test-amd64-i386-pv                                           fail    
 test-i386-i386-pv                                            fail    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           broken  
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24069:801ca6c0fbfa
tag:         tip
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:28:41 2011 +0100
    
    x86/IRQ: consolidate IRQ disabling when acquiring vector lock
    
    __assign_irq_vector() doesn't need to disable interrupts (its callers
    are required to when acquiring the lock), and set_desc_affinity() can
    use the normal spin lock primitives.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24068:6928172f7ded
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:27:38 2011 +0100
    
    IRQ: allocate CPU masks dynamically
    
    This includes delaying the initialization of dynamically created IRQs
    until their actual first use and some further elimination of uses of
    struct irq_cfg.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24067:17ee4c213438
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 03 23:41:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 03 Nov 2011 23:41:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMDSd-0001JM-G1; Thu, 03 Nov 2011 23:41:07 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMDRm-00016k-RT
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 23:40:15 -0700
X-Env-Sender: kgrace.liu@gmail.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1320388793!46961524!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32243 invoked from network); 4 Nov 2011 06:39:54 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 06:39:54 -0000
Received: by vws13 with SMTP id 13so2492721vws.30
	for <xen-devel@lists.xensource.com>;
	Thu, 03 Nov 2011 23:40:10 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:cc:content-type;
	bh=6ZqUlpgn+KDmYHLSUs/m+IcvOGANW8Fp2plYczaYIC0=;
	b=RSvPld2rTCp7FvZWMZBwY0p4nluCwPKV9VIZju/CfqTgHV2k7yVuU+YqDdWeGROsqL
	NFY1pcBmHE/ak2wzTVmJBwsEqSA8GeU8lNJfSRId55r9AWoGO8W0P1oBxSiG9cz420Xi
	uVnn7pkNIN4wZSv3xi+ehgxptuduF6BfaXWwk=
MIME-Version: 1.0
Received: by 10.52.74.162 with SMTP id u2mr13346169vdv.69.1320388810190; Thu,
	03 Nov 2011 23:40:10 -0700 (PDT)
Received: by 10.52.33.40 with HTTP; Thu, 3 Nov 2011 23:40:10 -0700 (PDT)
In-Reply-To: <1320238770.3084.51.camel@cthulhu.hellion.org.uk>
References: <1319808450-9617-1-git-send-email-cyliu@suse.com>
	<4EB184DE020000660000603E@novprvlin0050.provo.novell.com>
	<1320238770.3084.51.camel@cthulhu.hellion.org.uk>
Date: Fri, 4 Nov 2011 14:40:10 +0800
X-Google-Sender-Auth: lWrovl4FhImraLD1YyoaC-lq_IY
Message-ID: <CAERYnoaMLUcY_mr=+S86kj4=0RBk5-smUNpxRzOrpGPHtoCh+A@mail.gmail.com>
Subject: Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images fail
From: Chunyan Liu <cyliu@suse.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0678394399=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0678394399==
Content-Type: multipart/alternative; boundary=bcaec5015da3ff312804b0e2f968

--bcaec5015da3ff312804b0e2f968
Content-Type: text/plain; charset=ISO-8859-1

2011/11/2 Ian Campbell <Ian.Campbell@citrix.com>

> On Wed, 2011-11-02 at 02:58 -0400, Chun Yan Liu wrote:
> > Stefano, could you review the revised patch and share your comments?
> > Thanks.
> >
> >
> > >>> Chunyan Liu <cyliu@suse.com> 10/28/2011 9:27 PM >>>
> > Start qemu-nbd to mount non-raw qdisk in dom0 so that xl can create PV
> > guest with qcow/qcow2 disk image and using pygrub.
> > v2: use fork and exec instead of system(3)
> >
> > Signed-off-by: Chunyan Liu <cyliu@suse.com>
> >
> > diff -r b4cf57bbc3fb tools/libxl/libxl.c
> > --- a/tools/libxl/libxl.cThu Oct 20 15:24:46 2011 +0800
> > +++ b/tools/libxl/libxl.cFri Oct 28 20:50:36 2011 +0800
> > @@ -1077,6 +1077,58 @@ out_free:
> >      libxl__free_all(&gc);
> >      return rc;
> > }
> > +static int fork_exec(char *arg0, char **args)
> > +{
> > +    pid_t pid;
> > +    int status;
> > +
> > +    pid = fork();
>
> This needs to be libxl_fork, I think. Perhaps even this whole thing
> should be libxl__spawn_spawn (not sure about that)?
>

I noticed that in libxl, some places use fork() and other places use
libxl_fork(), device-model uses libxl__spawn_spwan. As for this place, I am
not clear if fork() + execvp() might cause some problem? Or it is just
considered better to use libxl_fork or libxl__spawn_spwan?


>
> > +    if (pid < 0)
> > +        return -1;
> > +    else if (pid == 0){
> > +        execvp(arg0, args);
> > +        exit(127);
> > +    }
> > +    sleep(1);
>
> Why do you need this sleep?
>

I know it seems odd. But without sleep, after executing "qemu-nbd -c" here
and passing the mount device node /dev/nbd* to fork_exec_bootloader(),
pygrub fails to parse /dev/nbd*. I am not sure if /dev/nbd* is actually not
prepared yet. But adding sleep() here or anywhere else before
fork_exec_bootloader(), then there is no problem.


> > +    while (waitpid(pid, &status, 0) < 0) {
> > +        if (errno != EINTR) {
> > +            status = -1;
> > +            break;
> > +        }
> > +    }
> > +
> > +    return status;
> > +}
> > +
> > +static char * nbd_mount_disk(libxl__gc *gc, libxl_device_disk *disk)
> > +{
> > +    int i;
> > +    int nbds_max = 16;
> > +    char *nbd_dev = NULL;
> > +    char *args[] = {"qemu-nbd","-c",NULL,NULL,NULL};
>
> "-r" perhaps?


To mount the qcow/qcow2 disk image to /dev/nbd* so that pygrub can parse
kernel and initrd from it, "-c" is enough. Of course, we can add "-r".


> > +    char *ret = NULL;
> > +
> > +    for (i = 0; i < nbds_max; i++) {
> > +        nbd_dev = libxl__sprintf(gc, "/dev/nbd%d", i);
>
> We can't get qemu-nbd to find a free device on our behalf and tell us
> what it was?
>

Well, it meant to do a thing that when "qemu-nbd -c /dev/nbd0 disk.img"
fails, it can try next nbd device. I also noticed that qemu-nbd doesn't
check if /dev/nbd* is free, even if /dev/nbd0 is already used, you can
still issue "qemu-nbd -c /dev/nbd0 disk.img". Seems no better way to check
that except "ps aux | grep /dev/nbd*". To choose a free nbd device and
mount disk, maybe write a script to do that is more proper. And at this
place, call that script.


>
> +        args[2] = libxl__sprintf(gc, "%s", nbd_dev);
> > +        args[3] = libxl__sprintf(gc, "%s", disk->pdev_path);
> > +        if (fork_exec(args[0], args) == 0) {
> > +            ret = strdup(nbd_dev);
> > +            break;
> > +        }
> > +    }
> > +
> > +    return ret;
> > +}
> > +
> > +static int nbd_unmount_disk(libxl__gc *gc, char *diskpath) {
> > +    char *args[] = {"qemu-nbd","-d",NULL,NULL};
> > +    args[2] = libxl__sprintf(gc, "%s", diskpath);
> > +    if (fork_exec(args[0], args))
> > +        return 0;
> > +    else
> > +        return ERROR_FAIL;
> > +}
> >
> > char * libxl_device_disk_local_attach(libxl_ctx *ctx,
> > libxl_device_disk *disk)
> > {
> > @@ -1084,6 +1136,7 @@ char * libxl_device_disk_local_attach(li
> >      char *dev = NULL;
> >      char *ret = NULL;
> >      int rc;
> > +    char *mdev = NULL;
> >
> >      rc = libxl__device_disk_set_backend(&gc, disk);
> >      if (rc) goto out;
> > @@ -1118,8 +1171,12 @@ char * libxl_device_disk_local_attach(li
> >              break;
> >          case LIBXL_DISK_BACKEND_QDISK:
> >              if (disk->format != LIBXL_DISK_FORMAT_RAW) {
> > -                LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot locally"
> > -                           " attach a qdisk image if the format is
> > not raw");
> > +                LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "attaching a
> > non-raw qdisk image to domain 0\n");
> > +                mdev = nbd_mount_disk(&gc, disk);
> > +                if (mdev)
> > +                    dev = mdev;
> > +                else
> > +                    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "fail to mount
> > image with qemu-nbd");
> >                  break;
> >              }
> >              LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "locally attaching
> > qdisk %s\n",
> > @@ -1135,11 +1192,13 @@ char * libxl_device_disk_local_attach(li
> >   out:
> >      if (dev != NULL)
> >          ret = strdup(dev);
> > +    if (mdev)
> > +        free(mdev);
>
> free(NULL) is acceptable.
>
> >      libxl__free_all(&gc);
> >      return ret;
> > }
> >
> > -int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk
> > *disk)
> > +int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk
> > *disk, char *diskpath)
> > {
> >      /* Nothing to do for PHYSTYPE_PHY. */
> This should be moved into the switch which you have added e.g.
>        case LIBXL_DISKBACK_END_PHY:
>                /* nothing to do */
>                break;
>
> >
> > @@ -1147,7 +1206,22 @@ int libxl_device_disk_local_detach(libxl
> >       * For other device types assume that the blktap2 process is
> >       * needed by the soon to be started domain and do nothing.
>
> should be another explicit case statement.
>
> >       */
> > +    libxl__gc gc = LIBXL_INIT_GC(ctx);
> > +    int ret;
>
> Please declare these at the top of the function.
>
> >
> > +    switch (disk->backend) {
> > +        case LIBXL_DISK_BACKEND_QDISK:
> > +            if (disk->format != LIBXL_DISK_FORMAT_RAW) {
> > +                LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Locally detach a
> > non-raw "
> > +                    "qdisk image");
> > +                ret = nbd_unmount_disk(&gc, diskpath);
> > +                return ret;
> > +            }
> > +        default:
> > +            break;
> > +    }
> > +
> > +    libxl__free_all(&gc);
> >      return 0;
> > }
> >
> > diff -r b4cf57bbc3fb tools/libxl/libxl.h
> > --- a/tools/libxl/libxl.hThu Oct 20 15:24:46 2011 +0800
> > +++ b/tools/libxl/libxl.hFri Oct 28 20:50:36 2011 +0800
> > @@ -390,7 +390,7 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u
> >   * Make a disk available in this domain. Returns path to a device.
> >   */
> > char * libxl_device_disk_local_attach(libxl_ctx *ctx,
> > libxl_device_disk *disk);
> > -int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk
> > *disk);
> > +int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk
> > *disk, char *diskpath);
> >
> > int libxl_device_nic_init(libxl_device_nic *nic, int dev_num);
> > int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid,
> > libxl_device_nic *nic);
> > diff -r b4cf57bbc3fb tools/libxl/libxl_bootloader.c
> > --- a/tools/libxl/libxl_bootloader.cThu Oct 20 15:24:46 2011 +0800
> > +++ b/tools/libxl/libxl_bootloader.cFri Oct 28 20:50:36 2011 +0800
> > @@ -424,7 +424,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,
> >      rc = 0;
> > out_close:
> >      if (diskpath) {
> > -        libxl_device_disk_local_detach(ctx, disk);
> > +        libxl_device_disk_local_detach(ctx, disk, diskpath);
> >          free(diskpath);
> >      }
> >      if (fifo_fd > -1)
> >
> > _______________________________________________
> > Xen-devel mailing list
> > Xen-devel@lists.xensource.com
> > http://lists.xensource.com/xen-devel
> >
> >
>
>
>

--bcaec5015da3ff312804b0e2f968
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<br><br><div class=3D"gmail_quote">2011/11/2 Ian Campbell <span dir=3D"ltr"=
>&lt;<a href=3D"mailto:Ian.Campbell@citrix.com">Ian.Campbell@citrix.com</a>=
&gt;</span><br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex=
;border-left:1px #ccc solid;padding-left:1ex;">
<div class=3D"im">On Wed, 2011-11-02 at 02:58 -0400, Chun Yan Liu wrote:<br=
>
&gt; Stefano, could you review the revised patch and share your comments?<b=
r>
&gt; Thanks.<br>
&gt;<br>
&gt;<br>
&gt; &gt;&gt;&gt; Chunyan Liu &lt;<a href=3D"mailto:cyliu@suse.com">cyliu@s=
use.com</a>&gt; 10/28/2011 9:27 PM &gt;&gt;&gt;<br>
&gt; Start qemu-nbd to mount non-raw qdisk in dom0 so that xl can create PV=
<br>
&gt; guest with qcow/qcow2 disk image and using pygrub.<br>
&gt; v2: use fork and exec instead of system(3)<br>
&gt;<br>
&gt; Signed-off-by: Chunyan Liu &lt;<a href=3D"mailto:cyliu@suse.com">cyliu=
@suse.com</a>&gt;<br>
&gt;<br>
&gt; diff -r b4cf57bbc3fb tools/libxl/libxl.c<br>
&gt; --- a/tools/libxl/libxl.cThu Oct 20 15:24:46 2011 +0800<br>
&gt; +++ b/tools/libxl/libxl.cFri Oct 28 20:50:36 2011 +0800<br>
&gt; @@ -1077,6 +1077,58 @@ out_free:<br>
&gt; =A0 =A0 =A0libxl__free_all(&amp;gc);<br>
&gt; =A0 =A0 =A0return rc;<br>
&gt; }<br>
&gt; +static int fork_exec(char *arg0, char **args)<br>
&gt; +{<br>
&gt; + =A0 =A0pid_t pid;<br>
&gt; + =A0 =A0int status;<br>
&gt; +<br>
&gt; + =A0 =A0pid =3D fork();<br>
<br>
</div>This needs to be libxl_fork, I think. Perhaps even this whole thing<b=
r>
should be libxl__spawn_spawn (not sure about that)?<br></blockquote><div><b=
r>I noticed that in libxl, some places use fork() and other places use libx=
l_fork(), device-model uses libxl__spawn_spwan. As for this place, I am not=
 clear if fork() + execvp() might cause some problem? Or it is just conside=
red better to use libxl_fork or libxl__spawn_spwan?<br>
=A0</div><blockquote class=3D"gmail_quote" style=3D"margin: 0pt 0pt 0pt 0.8=
ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class=3D"im"><br>
&gt; + =A0 =A0if (pid &lt; 0)<br>
&gt; + =A0 =A0 =A0 =A0return -1;<br>
&gt; + =A0 =A0else if (pid =3D=3D 0){<br>
&gt; + =A0 =A0 =A0 =A0execvp(arg0, args);<br>
&gt; + =A0 =A0 =A0 =A0exit(127);<br>
&gt; + =A0 =A0}<br>
&gt; + =A0 =A0sleep(1);<br>
<br>
</div>Why do you need this sleep?<br></blockquote><div><br>I know it seems =
odd. But without sleep, after executing &quot;qemu-nbd -c&quot; here and pa=
ssing the mount device node /dev/nbd* to fork_exec_bootloader(), pygrub fai=
ls to parse /dev/nbd*. I am not sure if /dev/nbd* is actually not prepared =
yet. But adding sleep() here or anywhere else before fork_exec_bootloader()=
, then there is no problem.<br>
<br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0pt 0pt 0pt 0.=
8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class=3D"im"><br>
&gt; + =A0 =A0while (waitpid(pid, &amp;status, 0) &lt; 0) {<br>
&gt; + =A0 =A0 =A0 =A0if (errno !=3D EINTR) {<br>
&gt; + =A0 =A0 =A0 =A0 =A0 =A0status =3D -1;<br>
&gt; + =A0 =A0 =A0 =A0 =A0 =A0break;<br>
&gt; + =A0 =A0 =A0 =A0}<br>
&gt; + =A0 =A0}<br>
&gt; +<br>
&gt; + =A0 =A0return status;<br>
&gt; +}<br>
&gt; +<br>
&gt; +static char * nbd_mount_disk(libxl__gc *gc, libxl_device_disk *disk)<=
br>
&gt; +{<br>
&gt; + =A0 =A0int i;<br>
&gt; + =A0 =A0int nbds_max =3D 16;<br>
&gt; + =A0 =A0char *nbd_dev =3D NULL;<br>
&gt; + =A0 =A0char *args[] =3D {&quot;qemu-nbd&quot;,&quot;-c&quot;,NULL,NU=
LL,NULL};<br>
<br>
</div>&quot;-r&quot; perhaps?=A0</blockquote><div><br>To mount the qcow/qco=
w2 disk image to /dev/nbd* so that pygrub can parse kernel and initrd from =
it, &quot;-c&quot; is enough. Of course, we can add &quot;-r&quot;.<br>=A0<=
/div>
<blockquote class=3D"gmail_quote" style=3D"margin: 0pt 0pt 0pt 0.8ex; borde=
r-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div class=3D"im"=
>
&gt; + =A0 =A0char *ret =3D NULL;<br>
&gt; +<br>
&gt; + =A0 =A0for (i =3D 0; i &lt; nbds_max; i++) {<br>
&gt; + =A0 =A0 =A0 =A0nbd_dev =3D libxl__sprintf(gc, &quot;/dev/nbd%d&quot;=
, i);<br>
<br>
</div>We can&#39;t get qemu-nbd to find a free device on our behalf and tel=
l us<br>
what it was?<br>
<div><div></div></div></blockquote><div><br>Well, it meant to do a thing th=
at when &quot;qemu-nbd -c /dev/nbd0 disk.img&quot; fails, it can try next n=
bd device. I also noticed that qemu-nbd doesn&#39;t check if /dev/nbd* is f=
ree, even if /dev/nbd0 is already used, you can still issue &quot;qemu-nbd =
-c /dev/nbd0 disk.img&quot;. Seems no better way to check that except &quot=
;ps aux | grep /dev/nbd*&quot;. To choose a free nbd device and mount disk,=
 maybe write a script to do that is more proper. And at this place, call th=
at script.<br>
<br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0pt 0pt 0pt 0.=
8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div><d=
iv>=A0</div></div></blockquote><blockquote class=3D"gmail_quote" style=3D"m=
argin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); paddin=
g-left: 1ex;">
<div><div class=3D"h5">
&gt; + =A0 =A0 =A0 =A0args[2] =3D libxl__sprintf(gc, &quot;%s&quot;, nbd_de=
v);<br>
&gt; + =A0 =A0 =A0 =A0args[3] =3D libxl__sprintf(gc, &quot;%s&quot;, disk-&=
gt;pdev_path);<br>
&gt; + =A0 =A0 =A0 =A0if (fork_exec(args[0], args) =3D=3D 0) {<br>
&gt; + =A0 =A0 =A0 =A0 =A0 =A0ret =3D strdup(nbd_dev);<br>
&gt; + =A0 =A0 =A0 =A0 =A0 =A0break;<br>
&gt; + =A0 =A0 =A0 =A0}<br>
&gt; + =A0 =A0}<br>
&gt; +<br>
&gt; + =A0 =A0return ret;<br>
&gt; +}<br>
&gt; +<br>
&gt; +static int nbd_unmount_disk(libxl__gc *gc, char *diskpath) {<br>
&gt; + =A0 =A0char *args[] =3D {&quot;qemu-nbd&quot;,&quot;-d&quot;,NULL,NU=
LL};<br>
&gt; + =A0 =A0args[2] =3D libxl__sprintf(gc, &quot;%s&quot;, diskpath);<br>
&gt; + =A0 =A0if (fork_exec(args[0], args))<br>
&gt; + =A0 =A0 =A0 =A0return 0;<br>
&gt; + =A0 =A0else<br>
&gt; + =A0 =A0 =A0 =A0return ERROR_FAIL;<br>
&gt; +}<br>
&gt;<br>
&gt; char * libxl_device_disk_local_attach(libxl_ctx *ctx,<br>
&gt; libxl_device_disk *disk)<br>
&gt; {<br>
&gt; @@ -1084,6 +1136,7 @@ char * libxl_device_disk_local_attach(li<br>
&gt; =A0 =A0 =A0char *dev =3D NULL;<br>
&gt; =A0 =A0 =A0char *ret =3D NULL;<br>
&gt; =A0 =A0 =A0int rc;<br>
&gt; + =A0 =A0char *mdev =3D NULL;<br>
&gt;<br>
&gt; =A0 =A0 =A0rc =3D libxl__device_disk_set_backend(&amp;gc, disk);<br>
&gt; =A0 =A0 =A0if (rc) goto out;<br>
&gt; @@ -1118,8 +1171,12 @@ char * libxl_device_disk_local_attach(li<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0break;<br>
&gt; =A0 =A0 =A0 =A0 =A0case LIBXL_DISK_BACKEND_QDISK:<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0if (disk-&gt;format !=3D LIBXL_DISK_FORMAT_=
RAW) {<br>
&gt; - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0LIBXL__LOG(ctx, LIBXL__LOG_ERROR, &qu=
ot;cannot locally&quot;<br>
&gt; - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &quot; attach a =
qdisk image if the format is<br>
&gt; not raw&quot;);<br>
&gt; + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, &qu=
ot;attaching a<br>
&gt; non-raw qdisk image to domain 0\n&quot;);<br>
&gt; + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0mdev =3D nbd_mount_disk(&amp;gc, disk=
);<br>
&gt; + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (mdev)<br>
&gt; + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0dev =3D mdev;<br>
&gt; + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0else<br>
&gt; + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0LIBXL__LOG(ctx, LIBXL__LOG_ER=
ROR, &quot;fail to mount<br>
&gt; image with qemu-nbd&quot;);<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0break;<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0}<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, &quot;loc=
ally attaching<br>
&gt; qdisk %s\n&quot;,<br>
&gt; @@ -1135,11 +1192,13 @@ char * libxl_device_disk_local_attach(li<br>
&gt; =A0 out:<br>
&gt; =A0 =A0 =A0if (dev !=3D NULL)<br>
&gt; =A0 =A0 =A0 =A0 =A0ret =3D strdup(dev);<br>
&gt; + =A0 =A0if (mdev)<br>
&gt; + =A0 =A0 =A0 =A0free(mdev);<br>
<br>
</div></div>free(NULL) is acceptable.<br>
<div class=3D"im"><br>
&gt; =A0 =A0 =A0libxl__free_all(&amp;gc);<br>
&gt; =A0 =A0 =A0return ret;<br>
&gt; }<br>
&gt;<br>
&gt; -int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk<=
br>
&gt; *disk)<br>
&gt; +int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk<=
br>
&gt; *disk, char *diskpath)<br>
&gt; {<br>
&gt; =A0 =A0 =A0/* Nothing to do for PHYSTYPE_PHY. */<br>
</div>This should be moved into the switch which you have added e.g.<br>
 =A0 =A0 =A0 =A0case LIBXL_DISKBACK_END_PHY:<br>
 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* nothing to do */<br>
 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0break;<br>
<div class=3D"im"><br>
&gt;<br>
&gt; @@ -1147,7 +1206,22 @@ int libxl_device_disk_local_detach(libxl<br>
&gt; =A0 =A0 =A0 * For other device types assume that the blktap2 process i=
s<br>
&gt; =A0 =A0 =A0 * needed by the soon to be started domain and do nothing.<=
br>
<br>
</div>should be another explicit case statement.<br>
<div class=3D"im"><br>
&gt; =A0 =A0 =A0 */<br>
&gt; + =A0 =A0libxl__gc gc =3D LIBXL_INIT_GC(ctx);<br>
&gt; + =A0 =A0int ret;<br>
<br>
</div>Please declare these at the top of the function.<br>
<div class=3D"HOEnZb"><div class=3D"h5"><br>
&gt;<br>
&gt; + =A0 =A0switch (disk-&gt;backend) {<br>
&gt; + =A0 =A0 =A0 =A0case LIBXL_DISK_BACKEND_QDISK:<br>
&gt; + =A0 =A0 =A0 =A0 =A0 =A0if (disk-&gt;format !=3D LIBXL_DISK_FORMAT_RA=
W) {<br>
&gt; + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, &qu=
ot;Locally detach a<br>
&gt; non-raw &quot;<br>
&gt; + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&quot;qdisk image&quot;);<br>
&gt; + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ret =3D nbd_unmount_disk(&amp;gc, dis=
kpath);<br>
&gt; + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return ret;<br>
&gt; + =A0 =A0 =A0 =A0 =A0 =A0}<br>
&gt; + =A0 =A0 =A0 =A0default:<br>
&gt; + =A0 =A0 =A0 =A0 =A0 =A0break;<br>
&gt; + =A0 =A0}<br>
&gt; +<br>
&gt; + =A0 =A0libxl__free_all(&amp;gc);<br>
&gt; =A0 =A0 =A0return 0;<br>
&gt; }<br>
&gt;<br>
&gt; diff -r b4cf57bbc3fb tools/libxl/libxl.h<br>
&gt; --- a/tools/libxl/libxl.hThu Oct 20 15:24:46 2011 +0800<br>
&gt; +++ b/tools/libxl/libxl.hFri Oct 28 20:50:36 2011 +0800<br>
&gt; @@ -390,7 +390,7 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u<br>
&gt; =A0 * Make a disk available in this domain. Returns path to a device.<=
br>
&gt; =A0 */<br>
&gt; char * libxl_device_disk_local_attach(libxl_ctx *ctx,<br>
&gt; libxl_device_disk *disk);<br>
&gt; -int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk<=
br>
&gt; *disk);<br>
&gt; +int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk<=
br>
&gt; *disk, char *diskpath);<br>
&gt;<br>
&gt; int libxl_device_nic_init(libxl_device_nic *nic, int dev_num);<br>
&gt; int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid,<br>
&gt; libxl_device_nic *nic);<br>
&gt; diff -r b4cf57bbc3fb tools/libxl/libxl_bootloader.c<br>
&gt; --- a/tools/libxl/libxl_bootloader.cThu Oct 20 15:24:46 2011 +0800<br>
&gt; +++ b/tools/libxl/libxl_bootloader.cFri Oct 28 20:50:36 2011 +0800<br>
&gt; @@ -424,7 +424,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,<br>
&gt; =A0 =A0 =A0rc =3D 0;<br>
&gt; out_close:<br>
&gt; =A0 =A0 =A0if (diskpath) {<br>
&gt; - =A0 =A0 =A0 =A0libxl_device_disk_local_detach(ctx, disk);<br>
&gt; + =A0 =A0 =A0 =A0libxl_device_disk_local_detach(ctx, disk, diskpath);<=
br>
&gt; =A0 =A0 =A0 =A0 =A0free(diskpath);<br>
&gt; =A0 =A0 =A0}<br>
&gt; =A0 =A0 =A0if (fifo_fd &gt; -1)<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; Xen-devel mailing list<br>
&gt; <a href=3D"mailto:Xen-devel@lists.xensource.com">Xen-devel@lists.xenso=
urce.com</a><br>
&gt; <a href=3D"http://lists.xensource.com/xen-devel" target=3D"_blank">htt=
p://lists.xensource.com/xen-devel</a><br>
&gt;<br>
&gt;<br>
<br>
<br>
</div></div></blockquote></div><br>

--bcaec5015da3ff312804b0e2f968--


--===============0678394399==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0678394399==--


From xen-devel-bounces@lists.xensource.com Fri Nov 04 00:37:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 00:37:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMELD-0002fO-Rd; Fri, 04 Nov 2011 00:37:31 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RMEKM-0002Sf-LG
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 00:36:39 -0700
X-Env-Sender: yamahata@valinux.co.jp
X-Msg-Ref: server-13.tower-21.messagelabs.com!1320392194!886836!1
X-Originating-IP: [210.128.90.3]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10748 invoked from network); 4 Nov 2011 07:36:34 -0000
Received: from mail.valinux.co.jp (HELO mail.valinux.co.jp) (210.128.90.3)
	by server-13.tower-21.messagelabs.com with SMTP;
	4 Nov 2011 07:36:34 -0000
Received: from ps.local.valinux.co.jp (vagw.valinux.co.jp [210.128.90.14])
	by mail.valinux.co.jp (Postfix) with SMTP id 594A78758E;
	Fri,  4 Nov 2011 16:36:31 +0900 (JST)
Received: (nullmailer pid 30124 invoked by uid 1000);
	Fri, 04 Nov 2011 07:36:31 -0000
Date: Fri, 4 Nov 2011 16:36:31 +0900
From: Isaku Yamahata <yamahata@valinux.co.jp>
To: Anthony PERARD <anthony.perard@citrix.com>,
	Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>,
	"Michael S\. Tsirkin" <mst@redhat.com>
Message-ID: <20111104073631.GH499@valinux.co.jp>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-6-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319814456-8158-6-git-send-email-anthony.perard@citrix.com>
User-Agent: Mutt/1.5.19 (2009-01-05)
X-Virus-Scanned: clamav-milter 0.95.2 at va-mail.local.valinux.co.jp
X-Virus-Status: Clean
Cc: qemu-trivial@nongnu.org, Xen Devel <xen-devel@lists.xensource.com>,
	QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [Qemu-devel] [PATCH V3 05/10] pci_regs: Fix value of
	PCI_EXP_TYPE_RC_EC.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Good catch.
This patch (and the next one 6/10) can be picked up independently
through qemu-trivial or pci-tree.

On Fri, Oct 28, 2011 at 04:07:31PM +0100, Anthony PERARD wrote:
> Value check in PCI Express Base Specification rev 1.1
> 
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  hw/pci_regs.h |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/hw/pci_regs.h b/hw/pci_regs.h
> index e8357c3..6b42515 100644
> --- a/hw/pci_regs.h
> +++ b/hw/pci_regs.h
> @@ -393,7 +393,7 @@
>  #define  PCI_EXP_TYPE_DOWNSTREAM 0x6	/* Downstream Port */
>  #define  PCI_EXP_TYPE_PCI_BRIDGE 0x7	/* PCI/PCI-X Bridge */
>  #define  PCI_EXP_TYPE_RC_END	0x9	/* Root Complex Integrated Endpoint */
> -#define  PCI_EXP_TYPE_RC_EC	0x10	/* Root Complex Event Collector */
> +#define  PCI_EXP_TYPE_RC_EC     0xa     /* Root Complex Event Collector */
>  #define PCI_EXP_FLAGS_SLOT	0x0100	/* Slot implemented */
>  #define PCI_EXP_FLAGS_IRQ	0x3e00	/* Interrupt message number */
>  #define PCI_EXP_DEVCAP		4	/* Device capabilities */
> -- 
> Anthony PERARD
> 
> 

-- 
yamahata

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 02:15:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 02:15:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMFsO-0006VC-GH; Fri, 04 Nov 2011 02:15:52 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMFrP-0006IV-Os
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 02:14:52 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1320398087!3608221!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4271 invoked from network); 4 Nov 2011 09:14:48 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 09:14:48 -0000
Received: by iaen33 with SMTP id n33so3003923iae.30
	for <xen-devel@lists.xensource.com>;
	Fri, 04 Nov 2011 02:14:47 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:cc:content-type;
	bh=3kjFFiR0EcW2ZOLkPbHO+PFQ4SN2L2UDcLnbVVFzSBc=;
	b=strT0KU4NZUY09qXQWrjZD+REdaB2m46rqmIfQeGcBz4IWCkRm248vsK/TNC1N4Ihm
	SmW0Moe2ZbN02YTi1eJ7lnq1cltVgpL0hlZzkkwBL0ImRaWde5J8w5ttnUDnS5i7lnaZ
	tz7DxaFuSs2svZ4oLr2DxS70qNm7P06sMbx6E=
MIME-Version: 1.0
Received: by 10.42.117.193 with SMTP id u1mr14561729icq.24.1320398087102; Fri,
	04 Nov 2011 02:14:47 -0700 (PDT)
Received: by 10.142.13.5 with HTTP; Fri, 4 Nov 2011 02:14:47 -0700 (PDT)
In-Reply-To: <CAERYnoaMLUcY_mr=+S86kj4=0RBk5-smUNpxRzOrpGPHtoCh+A@mail.gmail.com>
References: <1319808450-9617-1-git-send-email-cyliu@suse.com>
	<4EB184DE020000660000603E@novprvlin0050.provo.novell.com>
	<1320238770.3084.51.camel@cthulhu.hellion.org.uk>
	<CAERYnoaMLUcY_mr=+S86kj4=0RBk5-smUNpxRzOrpGPHtoCh+A@mail.gmail.com>
Date: Fri, 4 Nov 2011 10:14:47 +0100
X-Google-Sender-Auth: oL_sZfxk0RZ3U6bMY1j7Xb-xNac
Message-ID: <CAPLaKK7Eh3_DzLTVmnk6f6Cw7bDVBxkm7_-=cFaxFVfKKcHuFQ@mail.gmail.com>
Subject: Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images fail
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Chunyan Liu <cyliu@suse.com>
Content-Type: text/plain; charset=UTF-8
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

2011/11/4 Chunyan Liu <cyliu@suse.com>:
>> This needs to be libxl_fork, I think. Perhaps even this whole thing
>> should be libxl__spawn_spawn (not sure about that)?
>
> I noticed that in libxl, some places use fork() and other places use
> libxl_fork(), device-model uses libxl__spawn_spwan. As for this place, I am
> not clear if fork() + execvp() might cause some problem? Or it is just
> considered better to use libxl_fork or libxl__spawn_spwan?

If you are going to use fork to execute a file it might be best to use
vfork + libxl__exec instead. I have proposed the addition of a new
function in a patch to just do this (call vfork and libxl__exec),
which is also interesting for the execution of hotplug scripts.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 03:25:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 03:25:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMGxJ-0007qx-24; Fri, 04 Nov 2011 03:25:01 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMGw5-0007eJ-U3
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 03:23:48 -0700
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-16.tower-174.messagelabs.com!1320402222!276923!1
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4761 invoked from network); 4 Nov 2011 10:23:42 -0000
Received: from dgate20.ts.fujitsu.com (HELO dgate20.ts.fujitsu.com)
	(80.70.172.51)
	by server-16.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 10:23:42 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Message-ID:Date:From:Organization:
	User-Agent:MIME-Version:To:Subject:Content-Type:
	Content-Transfer-Encoding;
	b=SDCueBBoAY0NT1H7ivSOBjEkDykcebixJ7EzBTcr/MkxVRPGsQ5mieuI
	O+Jj41rNtLIWL2BAIAWf+Dngvp7BxITukQerKrC0P3D1+IIsy4LaNudhS
	lcw84hJJlZLybxeaXpNE3dHswCJ6twekiHB14lxb9DqeZ8Km+5vvbFKHa
	3bX1r1Bg2ALE671+ireicgxNrnQcirAbHRBHtybEaOg4mc5IsNU5GVMyJ
	LVg0ajiheY8ub8eUbl8XwS7eUaffd;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1320402222; x=1351938222;
	h=message-id:date:from:mime-version:to:subject:
	content-transfer-encoding;
	bh=UOiT+ROHVR7PUel5+yP+fpkTP3oTETWUNWwYn2HfxEY=;
	b=SYhYhQGmSdcp9QDmsWi1kmTTrPS6eotUHyaz1dDCNGouwbbZutoM/670
	ZFW5N5lkLQ3glMbiP88z4ZiPjpSXHICaIA+MMSvL6jfT5XQBygGvAwPBS
	2KURkrrZjvSEaRWDLxHeko77SLVoolos+6OYxczh9f4vEVOz5kOjX5jOk
	loYw47MUDivbFE22s+B9DZ8Z+XgPLxbhOUxByHLpk8x9xb8evSL5cgmOD
	u7oArLYfZZ3vpgw9ACYu66NNdGPcM;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,455,1315173600"; d="scan'208";a="78245795"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate20u.abg.fsc.net with ESMTP; 04 Nov 2011 11:23:41 +0100
X-IronPort-AV: E=Sophos;i="4.69,455,1315173600"; d="scan'208";a="122404916"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 04 Nov 2011 11:23:41 +0100
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id 2CA84959B90;
	Fri,  4 Nov 2011 11:23:42 +0100 (CET)
Message-ID: <4EB3BD2E.5070705@ts.fujitsu.com>
Date: Fri, 04 Nov 2011 11:23:42 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
Organization: Fujitsu Technology Solutions
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20111010 Iceowl/1.0b2 Icedove/3.1.15
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, 
	Jan Beulich <JBeulich@suse.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: 
Subject: [Xen-devel] hypervisor panic on system boot in spinlock.c
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi,

with xen-unstable cs 24069 I get the following error when booting dom0:

(XEN) PCI add device 0000:00:01.0
(XEN) Xen BUG at spinlock.c:47
(XEN) ----[ Xen-4.2-unstable  x86_64  debug=y  Tainted:    C ]----
(XEN) CPU:    3
(XEN) RIP:    e008:[<ffff82c480124774>] check_lock+0x44/0x50
(XEN) RFLAGS: 0000000000010046   CONTEXT: hypervisor
(XEN) rax: 0000000000000000   rbx: ffff83033eb17868   rcx: 0000000000000001
(XEN) rdx: 0000000000000000   rsi: 0000000000000001   rdi: ffff83033eb1786c
(XEN) rbp: ffff83033ea8fd30   rsp: ffff83033ea8fd30   r8:  ffff83033ea8feb8
(XEN) r9:  00000000deadbeef   r10: ffff82c480225cb0   r11: 0000000000000246
(XEN) r12: ffff83033eb16000   r13: 0000000000000020   r14: ffff83033ea8feb8
(XEN) r15: ffff83033eb17868   cr0: 000000008005003b   cr4: 00000000000026f0
(XEN) cr3: 0000000335691000   cr2: 0000000000000000
(XEN) ds: 0000   es: 0000   fs: 0000   gs: 0000   ss: e010   cs: e008
(XEN) Xen stack trace from rsp=ffff83033ea8fd30:
(XEN)    ffff83033ea8fd48 ffff82c4801247b1 0000000000000020 ffff83033ea8fd88
(XEN)    ffff82c48012b4f5 00000102000000ed 0000000000000020 0000000000000010
(XEN)    0000000000000030 ffff83033ea8feb8 ffff83033ea8fe90 ffff83033ea8fdc8
(XEN)    ffff82c48012b9c7 000000000000f800 0000000000000000 ffff83033eac3180
(XEN)    0000000000000292 ffff83033ea8feb8 ffff83033ea8fe90 ffff83033ea8fde8
(XEN)    ffff82c48010f3ab 0000000000000031 ffff83033eac3180 ffff83033ea8fe18
(XEN)    ffff82c4801658dd ffff83033eb10010 0000000000007ff0 ffff83033ea92000
(XEN)    0000000000000000 ffff83033ea8fe78 ffff82c480177453 ffff83033ea8fe68
(XEN)    ffff83033ea8fe94 ffffffff3ea8fe68 ffff82c480265aa0 ffff83033ea92000
(XEN)    ffff8300bf2fb000 ffff8800bf90fb70 ffff8800bfaf1000 0000000000000000
(XEN)    0000000000007ff0 ffff83033ea8fef8 ffff82c480177d0a 0000000000007ff0
(XEN)    ffffffffffffffff 0000000800000000 ffffffff00000000 0000000000000000
(XEN)    0000000000000003 ffffffff08000000 0000000000000000 0000000000000000
(XEN)    00a0fb00bf2fb000 ffff8300bf2fb000 0000000000000000 ffff8800bfaf1000
(XEN)    0000000000000000 00007cfcc15700c7 ffff82c48021c928 ffffffff8000342a
(XEN)    0000000000000021 0000000000007ff0 0000000000000000 ffff8800bfaf1000
(XEN)    0000000000000000 ffff8800bfaf1000 0000000000000000 0000000000000246
(XEN)    0000000000000008 ffff8800bf90fba4 0000000000000002 0000000000000021
(XEN)    ffffffff8000342a 0000000000000000 ffff8800bf90fb70 000000000000000d
(XEN)    0000010000000000 ffffffff8000342a 000000000000e033 0000000000000246
(XEN) Xen call trace:
(XEN)    [<ffff82c480124774>] check_lock+0x44/0x50
(XEN)    [<ffff82c4801247b1>] _spin_lock+0x11/0x5d
(XEN)    [<ffff82c48012b4f5>] xmem_pool_alloc+0x138/0x4d2
(XEN)    [<ffff82c48012b9c7>] _xmalloc+0x138/0x230
(XEN)    [<ffff82c48010f3ab>] init_one_irq_desc+0x33/0xf8
(XEN)    [<ffff82c4801658dd>] create_irq+0x71/0xb4
(XEN)    [<ffff82c480177453>] physdev_map_pirq+0x2c8/0x548
(XEN)    [<ffff82c480177d0a>] do_physdev_op+0x637/0x10e5
(XEN)    [<ffff82c48021c928>] syscall_enter+0xc8/0x122
(XEN)
(XEN)
(XEN) ****************************************
(XEN) Panic on CPU 3:
(XEN) Xen BUG at spinlock.c:47
(XEN) ****************************************


Juergen

-- 
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: juergen.gross@ts.fujitsu.com
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 03:31:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 03:31:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMH3K-0008KP-A8; Fri, 04 Nov 2011 03:31:14 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMH2b-00087h-0V
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 03:30:29 -0700
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320402625!2893253!1
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3878 invoked from network); 4 Nov 2011 10:30:25 -0000
Received: from dgate20.ts.fujitsu.com (HELO dgate20.ts.fujitsu.com)
	(80.70.172.51)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 10:30:25 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Message-ID:Date:From:Organization:
	User-Agent:MIME-Version:To:CC:Subject:References:
	In-Reply-To:Content-Type:Content-Transfer-Encoding;
	b=eGw/hw3ZX/PASuyaWYPZ4aDGN03hFnvZPywyL/EoRpJN0U+xqXOZ88Gs
	8SOsj+razr/9UEAPT4BKjfYR8KYKCkdL0o4N21jDY0Y9AxN/4XaQJtDQ8
	T62fWjnVmbVEFyfkLmxX4KBhAVjYI8vuM35OD+bWRwb6KMowEF2hAYE7A
	Y1Kure0sWvuKKIlnkKZbIRTrKIdg0gG8ENKr/+5kt6gZIqVTM1q7nXW02
	DgTvs8/AGikCYU+PasA5lWGeKrJLN;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1320402625; x=1351938625;
	h=message-id:date:from:mime-version:to:cc:subject:
	references:in-reply-to:content-transfer-encoding;
	bh=x/HgMW/B9OB13N1hI4Ye5b2Y7Eq2s7P8BuTTsxr1jKg=;
	b=QRz6DGOmYYVnTa1Js1OD7PsKC4XrJVJRABAUXXcgt1FlIMuQHSwlh+GG
	djdWBXdzXeTsA7SMpvxPU1IhcrXb6wqKimhDX+AKqYBFpRZHpAYqsSy+K
	Kknkrb8VL+98fkWeaJHKkh7cppe0oCwqnoHBRkUQB/rl6oOT39j7WsDn9
	d3cGRjXTYV61p5WWh1UIBrc/H8uhbNanyW1aQNZGRZr8/GrAZlaJaFYiB
	GBR13zohl0jskCLq1Z+zUYcaTgcyp;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,455,1315173600"; d="scan'208";a="78246835"
Received: from abgdgate40u.abg.fsc.net ([172.25.138.90])
	by dgate20u.abg.fsc.net with ESMTP; 04 Nov 2011 11:30:24 +0100
X-IronPort-AV: E=Sophos;i="4.69,454,1315173600"; d="scan'208";a="122836029"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate40u.abg.fsc.net with ESMTP; 04 Nov 2011 11:30:24 +0100
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id F3A799599B9;
	Fri,  4 Nov 2011 11:30:24 +0100 (CET)
Message-ID: <4EB3BEC0.3010001@ts.fujitsu.com>
Date: Fri, 04 Nov 2011 11:30:24 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
Organization: Fujitsu Technology Solutions
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20111010 Iceowl/1.0b2 Icedove/3.1.15
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] Correct man page of xl regarding cpu-pools
References: <57044b74a69d68fee06f.1320243801@nehalem1>
	<1320261513.3084.53.camel@cthulhu.hellion.org.uk>
In-Reply-To: <1320261513.3084.53.camel@cthulhu.hellion.org.uk>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/02/2011 08:18 PM, Ian Campbell wrote:
> On Wed, 2011-11-02 at 10:23 -0400, Juergen Gross wrote:
>> @@ -791,7 +795,7 @@ List pass-through pci devices for a doma
>>
>>   =head1 SEE ALSO
>>
>> -B<xldomain.cfg>(5), B<xentop>(1)
>> +B<xldomain.cfg>(5), B<xlcpupool.cfg>(5), B<xentop>(1)
> Does xlcpupoo.cfg(5) exist? I couldn't find it (I know xldomain.cfg
> doesn't, I have a pending action item to change that link).

As I'm no expert in pod format, I wanted to wait until xldomain.cfg(5)
shows up and create xlcpupool.cfg(5) accordingly. :-)

If you have other plans for xldomain.cfg(5), I'll adapt to them. :-)


Juergen

-- 
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: juergen.gross@ts.fujitsu.com
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 03:36:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 03:36:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMH8E-0000Kw-Q3; Fri, 04 Nov 2011 03:36:18 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMH7p-00008L-1t
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 03:35:53 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1320402949!279540!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23429 invoked from network); 4 Nov 2011 10:35:49 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-10.tower-174.messagelabs.com with AES256-SHA encrypted
	SMTP; 4 Nov 2011 10:35:49 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 04 Nov 2011 10:35:49 +0000
Message-Id: <4EB3CE32020000780005EF99@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 04 Nov 2011 10:36:18 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Juergen Gross" <juergen.gross@ts.fujitsu.com>
References: <4EB3BD2E.5070705@ts.fujitsu.com>
In-Reply-To: <4EB3BD2E.5070705@ts.fujitsu.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: hypervisor panic on system boot in spinlock.c
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 04.11.11 at 11:23, Juergen Gross <juergen.gross@ts.fujitsu.com> =
wrote:
> with xen-unstable cs 24069 I get the following error when booting dom0:

I'm already looking into this.

Jan

> (XEN) PCI add device 0000:00:01.0
> (XEN) Xen BUG at spinlock.c:47
> (XEN) ----[ Xen-4.2-unstable  x86_64  debug=3Dy  Tainted:    C ]----
> (XEN) CPU:    3
> (XEN) RIP:    e008:[<ffff82c480124774>] check_lock+0x44/0x50
> (XEN) RFLAGS: 0000000000010046   CONTEXT: hypervisor
> (XEN) rax: 0000000000000000   rbx: ffff83033eb17868   rcx: 00000000000000=
01
> (XEN) rdx: 0000000000000000   rsi: 0000000000000001   rdi: ffff83033eb178=
6c
> (XEN) rbp: ffff83033ea8fd30   rsp: ffff83033ea8fd30   r8:  ffff83033ea8fe=
b8
> (XEN) r9:  00000000deadbeef   r10: ffff82c480225cb0   r11: 00000000000002=
46
> (XEN) r12: ffff83033eb16000   r13: 0000000000000020   r14: ffff83033ea8fe=
b8
> (XEN) r15: ffff83033eb17868   cr0: 000000008005003b   cr4: 00000000000026=
f0
> (XEN) cr3: 0000000335691000   cr2: 0000000000000000
> (XEN) ds: 0000   es: 0000   fs: 0000   gs: 0000   ss: e010   cs: e008
> (XEN) Xen stack trace from rsp=3Dffff83033ea8fd30:
> (XEN)    ffff83033ea8fd48 ffff82c4801247b1 0000000000000020 ffff83033ea8f=
d88
> (XEN)    ffff82c48012b4f5 00000102000000ed 0000000000000020 0000000000000=
010
> (XEN)    0000000000000030 ffff83033ea8feb8 ffff83033ea8fe90 ffff83033ea8f=
dc8
> (XEN)    ffff82c48012b9c7 000000000000f800 0000000000000000 ffff83033eac3=
180
> (XEN)    0000000000000292 ffff83033ea8feb8 ffff83033ea8fe90 ffff83033ea8f=
de8
> (XEN)    ffff82c48010f3ab 0000000000000031 ffff83033eac3180 ffff83033ea8f=
e18
> (XEN)    ffff82c4801658dd ffff83033eb10010 0000000000007ff0 ffff83033ea92=
000
> (XEN)    0000000000000000 ffff83033ea8fe78 ffff82c480177453 ffff83033ea8f=
e68
> (XEN)    ffff83033ea8fe94 ffffffff3ea8fe68 ffff82c480265aa0 ffff83033ea92=
000
> (XEN)    ffff8300bf2fb000 ffff8800bf90fb70 ffff8800bfaf1000 0000000000000=
000
> (XEN)    0000000000007ff0 ffff83033ea8fef8 ffff82c480177d0a 0000000000007=
ff0
> (XEN)    ffffffffffffffff 0000000800000000 ffffffff00000000 0000000000000=
000
> (XEN)    0000000000000003 ffffffff08000000 0000000000000000 0000000000000=
000
> (XEN)    00a0fb00bf2fb000 ffff8300bf2fb000 0000000000000000 ffff8800bfaf1=
000
> (XEN)    0000000000000000 00007cfcc15700c7 ffff82c48021c928 ffffffff80003=
42a
> (XEN)    0000000000000021 0000000000007ff0 0000000000000000 ffff8800bfaf1=
000
> (XEN)    0000000000000000 ffff8800bfaf1000 0000000000000000 0000000000000=
246
> (XEN)    0000000000000008 ffff8800bf90fba4 0000000000000002 0000000000000=
021
> (XEN)    ffffffff8000342a 0000000000000000 ffff8800bf90fb70 0000000000000=
00d
> (XEN)    0000010000000000 ffffffff8000342a 000000000000e033 0000000000000=
246
> (XEN) Xen call trace:
> (XEN)    [<ffff82c480124774>] check_lock+0x44/0x50
> (XEN)    [<ffff82c4801247b1>] _spin_lock+0x11/0x5d
> (XEN)    [<ffff82c48012b4f5>] xmem_pool_alloc+0x138/0x4d2
> (XEN)    [<ffff82c48012b9c7>] _xmalloc+0x138/0x230
> (XEN)    [<ffff82c48010f3ab>] init_one_irq_desc+0x33/0xf8
> (XEN)    [<ffff82c4801658dd>] create_irq+0x71/0xb4
> (XEN)    [<ffff82c480177453>] physdev_map_pirq+0x2c8/0x548
> (XEN)    [<ffff82c480177d0a>] do_physdev_op+0x637/0x10e5
> (XEN)    [<ffff82c48021c928>] syscall_enter+0xc8/0x122
> (XEN)
> (XEN)
> (XEN) ****************************************
> (XEN) Panic on CPU 3:
> (XEN) Xen BUG at spinlock.c:47
> (XEN) ****************************************
>=20
>=20
> Juergen





_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 03:39:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 03:39:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMHBN-0000lM-0e; Fri, 04 Nov 2011 03:39:33 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMHAb-0000YE-8d
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 03:38:45 -0700
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320403097!51470557!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12195 invoked from network); 4 Nov 2011 10:38:17 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 10:38:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,455,1315180800"; 
   d="scan'208";a="8758570"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 10:38:41 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 10:38:42 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RMHAX-00037T-F1;
	Fri, 04 Nov 2011 10:38:41 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RMHAQ-0002Hm-9u;
	Fri, 04 Nov 2011 10:38:34 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 4 Nov 2011 10:38:23 +0000
Message-ID: <1320403109-8739-1-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
MIME-Version: 1.0
Content-Type: text/plain
Cc: allen.m.kay@intel.com, tim@xen.org
Subject: [Xen-devel] [PATCH 0/6] IOMMU, vtd and iotlb flush rework 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

In one of my previous email I detailed a bug I was seeing when passing
through a Intel GPU on a guest that has more that 4G or RAM.

Allen suggested that I go for the Plan B but after a discussion with Tim
we agreed that Plan B was way to disruptive in term of code change.

This patch series implements Plan A.

http://xen.1045712.n5.nabble.com/VTD-Intel-iommu-IOTLB-flush-really-slow-td4952866.html

Jean Guyader (6):
      vtd: Refactor iotlb flush code
      iommu: Introduce iommu_flush and iommu_flush_all.
      add_to_physmap: Move the code for XENMEM_add_to_physmap.
      mm: Add new map space for add_to_physmap, XENMAPSPACE_gmfn_range.
      hvmloader: Change memory relocation loop when overlap with PCI hole.
      Introduce domain flag (dont_flush_iotlb) to avoid unnecessary iotlb flush.

 tools/firmware/hvmloader/pci.c      |   20 +++-
 xen/arch/x86/mm.c                   |  197 ++++++++++++++++++++---------------
 xen/drivers/passthrough/iommu.c     |   26 +++++
 xen/drivers/passthrough/vtd/iommu.c |  100 ++++++++++--------
 xen/include/public/memory.h         |    4 +
 xen/include/xen/iommu.h             |    5 +
 xen/include/xen/sched.h             |    1 +
 7 files changed, 222 insertions(+), 131 deletions(-)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 03:40:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 03:40:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMHCU-00018b-Tw; Fri, 04 Nov 2011 03:40:42 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMHAb-0000YG-JS
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 03:38:45 -0700
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320403097!51470557!3
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12219 invoked from network); 4 Nov 2011 10:38:17 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 10:38:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,455,1315180800"; 
   d="scan'208";a="8758573"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 10:38:42 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 10:38:42 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RMHAX-00037f-QI;
	Fri, 04 Nov 2011 10:38:41 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RMHAQ-0002Hr-HQ;
	Fri, 04 Nov 2011 10:38:34 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 4 Nov 2011 10:38:25 +0000
Message-ID: <1320403109-8739-3-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320403109-8739-2-git-send-email-jean.guyader@eu.citrix.com>
References: <1320403109-8739-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-2-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 2/6] iommu: Introduce iommu_flush and
	iommu_flush_all.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/drivers/passthrough/iommu.c     |   20 ++++++++++++++++++++
 xen/drivers/passthrough/vtd/iommu.c |   12 ++++++++++++
 xen/include/xen/iommu.h             |    5 +++++
 3 files changed, 37 insertions(+), 0 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0002-iommu-Introduce-iommu_flush-and-iommu_flush_all.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0002-iommu-Introduce-iommu_flush-and-iommu_flush_all.patch"

diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index cd6174d..9c62861 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -301,6 +301,26 @@ int iommu_unmap_page(struct domain *d, unsigned long gfn)
     return hd->platform_ops->unmap_page(d, gfn);
 }
 
+void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+    if ( !iommu_enabled || !hd->platform_ops || !hd->platform_ops->iotlb_flush )
+        return;
+
+    hd->platform_ops->iotlb_flush(d, gfn, page_count);
+}
+
+void iommu_iotlb_flush_all(struct domain *d)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+    if ( !iommu_enabled || !hd->platform_ops )
+        return;
+
+    hd->platform_ops->iotlb_flush_all(d);
+}
+
 /* caller should hold the pcidevs_lock */
 int deassign_device(struct domain *d, u16 seg, u8 bus, u8 devfn)
 {
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 5a5b6be..7ec9541 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -619,6 +619,16 @@ static void __intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn,
     }
 }
 
+static void intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count)
+{
+    __intel_iommu_iotlb_flush(d, gfn, 1, page_count);
+}
+
+static void intel_iommu_iotlb_flush_all(struct domain *d)
+{
+    __intel_iommu_iotlb_flush(d, 0, 0, 0);
+}
+
 /* clear one page's page table */
 static void dma_pte_clear_one(struct domain *domain, u64 addr)
 {
@@ -2329,6 +2339,8 @@ const struct iommu_ops intel_iommu_ops = {
     .resume = vtd_resume,
     .share_p2m = iommu_set_pgd,
     .crash_shutdown = vtd_crash_shutdown,
+    .iotlb_flush = intel_iommu_iotlb_flush,
+    .iotlb_flush_all = intel_iommu_iotlb_flush_all,
 };
 
 /*
diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
index 837e60d..a1034df 100644
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -139,6 +139,8 @@ struct iommu_ops {
     void (*resume)(void);
     void (*share_p2m)(struct domain *d);
     void (*crash_shutdown)(void);
+    void (*iotlb_flush)(struct domain *d, unsigned long gfn, unsigned int page_count);
+    void (*iotlb_flush_all)(struct domain *d);
 };
 
 void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value);
@@ -155,4 +157,7 @@ void iommu_share_p2m_table(struct domain *d);
 
 int iommu_do_domctl(struct xen_domctl *, XEN_GUEST_HANDLE(xen_domctl_t));
 
+void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count);
+void iommu_iotlb_flush_all(struct domain *d);
+
 #endif /* _IOMMU_H_ */

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Fri Nov 04 03:41:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 03:41:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMHDW-0001Va-VV; Fri, 04 Nov 2011 03:41:47 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMHAb-0000YF-I0
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 03:38:45 -0700
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320403097!51470557!2
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12203 invoked from network); 4 Nov 2011 10:38:17 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 10:38:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,455,1315180800"; 
   d="scan'208";a="8758572"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 10:38:41 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 10:38:42 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RMHAX-00037V-JB;
	Fri, 04 Nov 2011 10:38:41 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RMHAQ-0002Ho-DJ;
	Fri, 04 Nov 2011 10:38:34 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 4 Nov 2011 10:38:24 +0000
Message-ID: <1320403109-8739-2-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320403109-8739-1-git-send-email-jean.guyader@eu.citrix.com>
References: <1320403109-8739-1-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 1/6] vtd: Refactor iotlb flush code
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Factorize the iotlb flush code from map_page and unmap_page into
it's own function.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/drivers/passthrough/vtd/iommu.c |   86 +++++++++++++++++-----------------
 1 files changed, 43 insertions(+), 43 deletions(-)


--------------true
Content-Type: text/x-patch; name="0001-vtd-Refactor-iotlb-flush-code.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0001-vtd-Refactor-iotlb-flush-code.patch"

diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 7717ab4..5a5b6be 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -578,16 +578,53 @@ static void iommu_flush_all(void)
     }
 }
 
+static void __intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn,
+        int dma_old_pte_present, unsigned int page_count)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+    struct acpi_drhd_unit *drhd;
+    struct iommu *iommu;
+    int flush_dev_iotlb;
+    int iommu_domid;
+
+    /*
+     * No need pcideves_lock here because we have flush
+     * when assign/deassign device
+     */
+    for_each_drhd_unit ( drhd )
+    {
+        iommu = drhd->iommu;
+
+        if ( !test_bit(iommu->index, &hd->iommu_bitmap) )
+            continue;
+
+        flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
+        iommu_domid= domain_iommu_domid(d, iommu);
+        if ( iommu_domid == -1 )
+            continue;
+
+        if ( page_count > 1 || gfn == -1 )
+        {
+            if ( iommu_flush_iotlb_dsi(iommu, iommu_domid,
+                        0, flush_dev_iotlb) )
+                iommu_flush_write_buffer(iommu);
+        }
+        else
+        {
+            if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
+                        (paddr_t)gfn << PAGE_SHIFT_4K, 0,
+                        !dma_old_pte_present, flush_dev_iotlb) )
+                iommu_flush_write_buffer(iommu);
+        }
+    }
+}
+
 /* clear one page's page table */
 static void dma_pte_clear_one(struct domain *domain, u64 addr)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(domain);
-    struct acpi_drhd_unit *drhd;
-    struct iommu *iommu;
     struct dma_pte *page = NULL, *pte = NULL;
     u64 pg_maddr;
-    int flush_dev_iotlb;
-    int iommu_domid;
     struct mapped_rmrr *mrmrr;
 
     spin_lock(&hd->mapping_lock);
@@ -613,21 +650,7 @@ static void dma_pte_clear_one(struct domain *domain, u64 addr)
     spin_unlock(&hd->mapping_lock);
     iommu_flush_cache_entry(pte, sizeof(struct dma_pte));
 
-    /* No need pcidevs_lock here since do that on assign/deassign device*/
-    for_each_drhd_unit ( drhd )
-    {
-        iommu = drhd->iommu;
-        if ( test_bit(iommu->index, &hd->iommu_bitmap) )
-        {
-            flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
-            iommu_domid= domain_iommu_domid(domain, iommu);
-            if ( iommu_domid == -1 )
-                continue;
-            if ( iommu_flush_iotlb_psi(iommu, iommu_domid, addr,
-                                       0, 0, flush_dev_iotlb) )
-                iommu_flush_write_buffer(iommu);
-        }
-    }
+    __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
 
     unmap_vtd_domain_page(page);
 
@@ -1677,12 +1700,8 @@ static int intel_iommu_map_page(
     unsigned int flags)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(d);
-    struct acpi_drhd_unit *drhd;
-    struct iommu *iommu;
     struct dma_pte *page = NULL, *pte = NULL, old, new = { 0 };
     u64 pg_maddr;
-    int flush_dev_iotlb;
-    int iommu_domid;
 
     /* Do nothing if VT-d shares EPT page table */
     if ( iommu_use_hap_pt(d) )
@@ -1724,26 +1743,7 @@ static int intel_iommu_map_page(
     spin_unlock(&hd->mapping_lock);
     unmap_vtd_domain_page(page);
 
-    /*
-     * No need pcideves_lock here because we have flush
-     * when assign/deassign device
-     */
-    for_each_drhd_unit ( drhd )
-    {
-        iommu = drhd->iommu;
-
-        if ( !test_bit(iommu->index, &hd->iommu_bitmap) )
-            continue;
-
-        flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
-        iommu_domid= domain_iommu_domid(d, iommu);
-        if ( iommu_domid == -1 )
-            continue;
-        if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
-                                   (paddr_t)gfn << PAGE_SHIFT_4K, 0,
-                                   !dma_pte_present(old), flush_dev_iotlb) )
-            iommu_flush_write_buffer(iommu);
-    }
+    __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
 
     return 0;
 }

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Fri Nov 04 03:42:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 03:42:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMHEU-0001t5-K6; Fri, 04 Nov 2011 03:42:46 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMHAb-0000YI-Qi
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 03:38:46 -0700
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320403097!51470557!5
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12244 invoked from network); 4 Nov 2011 10:38:17 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 10:38:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,455,1315180800"; 
   d="scan'208";a="8758575"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 10:38:42 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 10:38:42 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RMHAY-00037o-4i;
	Fri, 04 Nov 2011 10:38:42 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RMHAQ-0002Hx-SL;
	Fri, 04 Nov 2011 10:38:34 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 4 Nov 2011 10:38:27 +0000
Message-ID: <1320403109-8739-5-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320403109-8739-4-git-send-email-jean.guyader@eu.citrix.com>
References: <1320403109-8739-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-4-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 4/6] mm: Add new map space for add_to_physmap,
	XENMAPSPACE_gmfn_range.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


XENMAPSPACE_gmfn_range is like XENMAPSPACE_gmfn but with a size which
is the number of pages on which xen will iterate.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c           |   15 ++++++++++++++-
 xen/include/public/memory.h |    4 ++++
 2 files changed, 18 insertions(+), 1 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0004-mm-Add-new-map-space-for-add_to_physmap-XENMAPSPACE_.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0004-mm-Add-new-map-space-for-add_to_physmap-XENMAPSPACE_.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index f75011e..77ae77f 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4629,6 +4629,7 @@ static int xenmem_add_to_physmap(struct domain *d, struct xen_add_to_physmap xat
 
         spin_unlock(&d->grant_table->lock);
         break;
+    case XENMAPSPACE_gmfn_range:
     case XENMAPSPACE_gmfn:
     {
         p2m_type_t p2mt;
@@ -4700,6 +4701,7 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
     {
         struct xen_add_to_physmap xatp;
         struct domain *d;
+        unsigned int size, i;
 
         if ( copy_from_guest(&xatp, arg, 1) )
             return -EFAULT;
@@ -4714,7 +4716,18 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
             return -EPERM;
         }
 
-        xenmem_add_to_physmap(d, xatp);
+        size = 1;
+        if ( xatp.space == XENMAPSPACE_gmfn_range )
+        {
+            size = xatp.size;
+        }
+
+        for ( i = 0; i < size; i++ )
+        {
+            xenmem_add_to_physmap(d, xatp);
+            xatp.idx++;
+            xatp.gpfn++;
+        }
 
         rcu_unlock_domain(d);
 
diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h
index 08355e3..860b8c0 100644
--- a/xen/include/public/memory.h
+++ b/xen/include/public/memory.h
@@ -212,6 +212,7 @@ struct xen_add_to_physmap {
 #define XENMAPSPACE_shared_info 0 /* shared info page */
 #define XENMAPSPACE_grant_table 1 /* grant table page */
 #define XENMAPSPACE_gmfn        2 /* GMFN */
+#define XENMAPSPACE_gmfn_range  3 /* GMFN range */
     unsigned int space;
 
 #define XENMAPIDX_grant_table_status 0x80000000
@@ -221,6 +222,9 @@ struct xen_add_to_physmap {
 
     /* GPFN where the source mapping page should appear. */
     xen_pfn_t     gpfn;
+
+    /* Number of page, used for GMFN range */
+    unsigned int size;
 };
 typedef struct xen_add_to_physmap xen_add_to_physmap_t;
 DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_t);

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Fri Nov 04 03:44:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 03:44:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMHFo-0002MX-TV; Fri, 04 Nov 2011 03:44:08 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMHAb-0000YJ-T1
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 03:38:46 -0700
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320403097!51470557!6
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12270 invoked from network); 4 Nov 2011 10:38:17 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 10:38:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,455,1315180800"; 
   d="scan'208";a="8758577"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 10:38:42 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 10:38:42 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RMHAY-00037r-B1;
	Fri, 04 Nov 2011 10:38:42 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RMHAR-0002I0-2x;
	Fri, 04 Nov 2011 10:38:35 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 4 Nov 2011 10:38:28 +0000
Message-ID: <1320403109-8739-6-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320403109-8739-5-git-send-email-jean.guyader@eu.citrix.com>
References: <1320403109-8739-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-5-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 5/6] hvmloader: Change memory relocation loop
	when overlap with PCI hole.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Change the way we relocate the memory page if they overlap with pci hole.
Use new map space (XENMAPSPACE_gmfn_range) to move the loop into xen.

This code usually get triggered when a device is pass through to a guest
and the PCI hole has to be extended to have enough room to map the device BARs.
The PCI hole will starts lower and it might overlap with some RAM that has been
alocated for the guest. That usually happen if the guest has more than 4G of RAM.
We have to relocate those pages in high mem otherwise they won't be accessible.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 tools/firmware/hvmloader/pci.c |   20 ++++++++++++++------
 1 files changed, 14 insertions(+), 6 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0005-hvmloader-Change-memory-relocation-loop-when-overlap.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0005-hvmloader-Change-memory-relocation-loop-when-overlap.patch"

diff --git a/tools/firmware/hvmloader/pci.c b/tools/firmware/hvmloader/pci.c
index 29ec011..fb451ef 100644
--- a/tools/firmware/hvmloader/pci.c
+++ b/tools/firmware/hvmloader/pci.c
@@ -185,17 +185,25 @@ void pci_setup(void)
             ((pci_mem_start << 1) != 0) )
         pci_mem_start <<= 1;
 
-    while ( (pci_mem_start >> PAGE_SHIFT) < hvm_info->low_mem_pgend )
+    if ((pci_mem_start >> PAGE_SHIFT) < hvm_info->low_mem_pgend)
     {
         struct xen_add_to_physmap xatp;
-        if ( hvm_info->high_mem_pgend == 0 )
-            hvm_info->high_mem_pgend = 1ull << (32 - PAGE_SHIFT);
+        unsigned int size = hvm_info->low_mem_pgend - (pci_mem_start >> PAGE_SHIFT);
         xatp.domid = DOMID_SELF;
-        xatp.space = XENMAPSPACE_gmfn;
-        xatp.idx   = --hvm_info->low_mem_pgend;
-        xatp.gpfn  = hvm_info->high_mem_pgend++;
+        xatp.space = XENMAPSPACE_gmfn_range;
+        xatp.size = size;
+        xatp.idx = (pci_mem_start >> PAGE_SHIFT);
+        xatp.gpfn = hvm_info->high_mem_pgend;
+
+        printf("Relocate page for pci hole:\n");
         if ( hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0 )
             BUG();
+        printf("  - low_mem_pgend: %x -> %lx\n"
+                "  - high_mem_pgend: %x -> %x\n",
+                hvm_info->low_mem_pgend, (pci_mem_start >> PAGE_SHIFT),
+                hvm_info->high_mem_pgend, hvm_info->high_mem_pgend + size);
+        hvm_info->low_mem_pgend = pci_mem_start >> PAGE_SHIFT;
+        hvm_info->high_mem_pgend += size;
     }
 
     mem_resource.base = pci_mem_start;

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Fri Nov 04 03:45:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 03:45:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMHGp-0002kL-1u; Fri, 04 Nov 2011 03:45:11 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMHAb-0000YH-Ll
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 03:38:46 -0700
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320403097!51470557!4
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12222 invoked from network); 4 Nov 2011 10:38:17 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 10:38:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,455,1315180800"; 
   d="scan'208";a="8758574"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 10:38:42 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 10:38:42 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RMHAX-00037j-U5;
	Fri, 04 Nov 2011 10:38:41 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RMHAQ-0002Hu-OV;
	Fri, 04 Nov 2011 10:38:34 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 4 Nov 2011 10:38:26 +0000
Message-ID: <1320403109-8739-4-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320403109-8739-3-git-send-email-jean.guyader@eu.citrix.com>
References: <1320403109-8739-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-3-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 3/6] add_to_physmap: Move the code for
	XENMEM_add_to_physmap.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Move the code for the XENMEM_add_to_physmap case into it's own
function (xenmem_add_to_physmap).

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c |  188 ++++++++++++++++++++++++++++-------------------------
 1 files changed, 99 insertions(+), 89 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0003-add_to_physmap-Move-the-code-for-XENMEM_add_to_physm.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0003-add_to_physmap-Move-the-code-for-XENMEM_add_to_physm.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index acc1f34..f75011e 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4592,119 +4592,129 @@ static int handle_iomem_range(unsigned long s, unsigned long e, void *p)
     return 0;
 }
 
-long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
+static int xenmem_add_to_physmap(struct domain *d, struct xen_add_to_physmap xatp)
 {
     struct page_info *page = NULL;
+    unsigned long prev_mfn, mfn = 0, gpfn;
     int rc;
 
-    switch ( op )
-    {
-    case XENMEM_add_to_physmap:
+    switch ( xatp.space )
     {
-        struct xen_add_to_physmap xatp;
-        unsigned long prev_mfn, mfn = 0, gpfn;
-        struct domain *d;
-
-        if ( copy_from_guest(&xatp, arg, 1) )
-            return -EFAULT;
+    case XENMAPSPACE_shared_info:
+        if ( xatp.idx == 0 )
+            mfn = virt_to_mfn(d->shared_info);
+        break;
+    case XENMAPSPACE_grant_table:
+        spin_lock(&d->grant_table->lock);
 
-        rc = rcu_lock_target_domain_by_id(xatp.domid, &d);
-        if ( rc != 0 )
-            return rc;
+        if ( d->grant_table->gt_version == 0 )
+            d->grant_table->gt_version = 1;
 
-        if ( xsm_add_to_physmap(current->domain, d) )
+        if ( d->grant_table->gt_version == 2 &&
+             (xatp.idx & XENMAPIDX_grant_table_status) )
         {
-            rcu_unlock_domain(d);
-            return -EPERM;
+            xatp.idx &= ~XENMAPIDX_grant_table_status;
+            if ( xatp.idx < nr_status_frames(d->grant_table) )
+                mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
+        }
+        else
+        {
+            if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
+                 (xatp.idx < max_nr_grant_frames) )
+                gnttab_grow_table(d, xatp.idx + 1);
+
+            if ( xatp.idx < nr_grant_frames(d->grant_table) )
+                mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
         }
 
-        switch ( xatp.space )
+        spin_unlock(&d->grant_table->lock);
+        break;
+    case XENMAPSPACE_gmfn:
+    {
+        p2m_type_t p2mt;
+
+        xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
+        /* If the page is still shared, exit early */
+        if ( p2m_is_shared(p2mt) )
         {
-        case XENMAPSPACE_shared_info:
-            if ( xatp.idx == 0 )
-                mfn = virt_to_mfn(d->shared_info);
+            rcu_unlock_domain(d);
+            return -ENOMEM;
+        }
+        if ( !get_page_from_pagenr(xatp.idx, d) )
             break;
-        case XENMAPSPACE_grant_table:
-            spin_lock(&d->grant_table->lock);
+        mfn = xatp.idx;
+        page = mfn_to_page(mfn);
+        break;
+    }
+    default:
+        break;
+    }
 
-            if ( d->grant_table->gt_version == 0 )
-                d->grant_table->gt_version = 1;
+    if ( !paging_mode_translate(d) || (mfn == 0) )
+    {
+        if ( page )
+            put_page(page);
+        rcu_unlock_domain(d);
+        return -EINVAL;
+    }
 
-            if ( d->grant_table->gt_version == 2 &&
-                 (xatp.idx & XENMAPIDX_grant_table_status) )
-            {
-                xatp.idx &= ~XENMAPIDX_grant_table_status;
-                if ( xatp.idx < nr_status_frames(d->grant_table) )
-                    mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
-            }
-            else
-            {
-                if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
-                     (xatp.idx < max_nr_grant_frames) )
-                    gnttab_grow_table(d, xatp.idx + 1);
+    domain_lock(d);
 
-                if ( xatp.idx < nr_grant_frames(d->grant_table) )
-                    mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
-            }
+    if ( page )
+        put_page(page);
 
-            spin_unlock(&d->grant_table->lock);
-            break;
-        case XENMAPSPACE_gmfn:
-        {
-            p2m_type_t p2mt;
+    /* Remove previously mapped page if it was present. */
+    prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
+    if ( mfn_valid(prev_mfn) )
+    {
+        if ( is_xen_heap_mfn(prev_mfn) )
+            /* Xen heap frames are simply unhooked from this phys slot. */
+            guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
+        else
+            /* Normal domain memory is freed, to avoid leaking memory. */
+            guest_remove_page(d, xatp.gpfn);
+    }
 
-            xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
-            /* If the page is still shared, exit early */
-            if ( p2m_is_shared(p2mt) )
-            {
-                rcu_unlock_domain(d);
-                return -ENOMEM;
-            }
-            if ( !get_page_from_pagenr(xatp.idx, d) )
-                break;
-            mfn = xatp.idx;
-            page = mfn_to_page(mfn);
-            break;
-        }
-        default:
-            break;
-        }
+    /* Unmap from old location, if any. */
+    gpfn = get_gpfn_from_mfn(mfn);
+    ASSERT( gpfn != SHARED_M2P_ENTRY );
+    if ( gpfn != INVALID_M2P_ENTRY )
+        guest_physmap_remove_page(d, gpfn, mfn, 0);
 
-        if ( !paging_mode_translate(d) || (mfn == 0) )
-        {
-            if ( page )
-                put_page(page);
-            rcu_unlock_domain(d);
-            return -EINVAL;
-        }
+    /* Map at new location. */
+    rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
 
-        domain_lock(d);
+    domain_unlock(d);
 
-        if ( page )
-            put_page(page);
+    return rc;
+}
 
-        /* Remove previously mapped page if it was present. */
-        prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
-        if ( mfn_valid(prev_mfn) )
-        {
-            if ( is_xen_heap_mfn(prev_mfn) )
-                /* Xen heap frames are simply unhooked from this phys slot. */
-                guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
-            else
-                /* Normal domain memory is freed, to avoid leaking memory. */
-                guest_remove_page(d, xatp.gpfn);
-        }
 
-        /* Unmap from old location, if any. */
-        gpfn = get_gpfn_from_mfn(mfn);
-        ASSERT( gpfn != SHARED_M2P_ENTRY );
-        if ( gpfn != INVALID_M2P_ENTRY )
-            guest_physmap_remove_page(d, gpfn, mfn, 0);
+long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
+{
+    int rc;
+
+    switch ( op )
+    {
+    case XENMEM_add_to_physmap:
+    {
+        struct xen_add_to_physmap xatp;
+        struct domain *d;
 
-        /* Map at new location. */
-        rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
+        if ( copy_from_guest(&xatp, arg, 1) )
+            return -EFAULT;
+
+        rc = rcu_lock_target_domain_by_id(xatp.domid, &d);
+        if ( rc != 0 )
+            return rc;
+
+        if ( xsm_add_to_physmap(current->domain, d) )
+        {
+            rcu_unlock_domain(d);
+            return -EPERM;
+        }
 
-        domain_unlock(d);
+        xenmem_add_to_physmap(d, xatp);
 
         rcu_unlock_domain(d);
 

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Fri Nov 04 03:46:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 03:46:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMHHq-00037o-8V; Fri, 04 Nov 2011 03:46:14 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMHAc-0000YK-3Q
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 03:38:46 -0700
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320403097!51470557!7
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12294 invoked from network); 4 Nov 2011 10:38:18 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 10:38:18 -0000
X-IronPort-AV: E=Sophos;i="4.69,455,1315180800"; 
   d="scan'208";a="8758578"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 10:38:42 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 10:38:43 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RMHAY-00037u-HF;
	Fri, 04 Nov 2011 10:38:42 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RMHAR-0002I3-9F;
	Fri, 04 Nov 2011 10:38:35 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 4 Nov 2011 10:38:29 +0000
Message-ID: <1320403109-8739-7-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320403109-8739-6-git-send-email-jean.guyader@eu.citrix.com>
References: <1320403109-8739-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-5-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-6-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 6/6] Introduce domain flag (dont_flush_iotlb) to
	avoid unnecessary iotlb flush.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Add a domain level flag that will be check by the iommu low level code
to skip iotlb flush. iommu_iotlb_flush has to be called explicitly.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c                   |   12 +++++++++++-
 xen/drivers/passthrough/iommu.c     |    6 ++++++
 xen/drivers/passthrough/vtd/iommu.c |    6 ++++--
 xen/include/xen/sched.h             |    1 +
 4 files changed, 22 insertions(+), 3 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0006-Introduce-domain-flag-dont_flush_iotlb-to-avoid-unne.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0006-Introduce-domain-flag-dont_flush_iotlb-to-avoid-unne.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 77ae77f..4e23875 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4699,7 +4699,7 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
     {
     case XENMEM_add_to_physmap:
     {
-        struct xen_add_to_physmap xatp;
+        struct xen_add_to_physmap xatp, start_xatp;
         struct domain *d;
         unsigned int size, i;
 
@@ -4720,8 +4720,11 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
         if ( xatp.space == XENMAPSPACE_gmfn_range )
         {
             size = xatp.size;
+            if ( need_iommu(d) )
+                d->dont_flush_iotlb = 1;
         }
 
+        start_xatp = xatp;
         for ( i = 0; i < size; i++ )
         {
             xenmem_add_to_physmap(d, xatp);
@@ -4729,6 +4732,13 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
             xatp.gpfn++;
         }
 
+        if ( xatp.space == XENMAPSPACE_gmfn_range && need_iommu(d) )
+        {
+            d->dont_flush_iotlb = 0;
+            iommu_iotlb_flush(d, start_xatp.idx, size);
+            iommu_iotlb_flush(d, start_xatp.gpfn, size);
+        }
+
         rcu_unlock_domain(d);
 
         return rc;
diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index 9c62861..7f87aed 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -113,10 +113,13 @@ void __init iommu_dom0_init(struct domain *d)
         return;
 
     d->need_iommu = !!iommu_dom0_strict;
+    d->dont_flush_iotlb = 0;
     if ( need_iommu(d) )
     {
         struct page_info *page;
         unsigned int i = 0;
+
+        d->dont_flush_iotlb = 1;
         page_list_for_each ( page, &d->page_list )
         {
             unsigned long mfn = page_to_mfn(page);
@@ -129,6 +132,8 @@ void __init iommu_dom0_init(struct domain *d)
             if ( !(i++ & 0xfffff) )
                 process_pending_softirqs();
         }
+        d->dont_flush_iotlb = 0;
+        iommu_iotlb_flush_all(d);
     }
 
     return hd->platform_ops->dom0_init(d);
@@ -210,6 +215,7 @@ static int assign_device(struct domain *d, u16 seg, u8 bus, u8 devfn)
     if ( has_arch_pdevs(d) && !need_iommu(d) )
     {
         d->need_iommu = 1;
+        d->dont_flush_iotlb = 0;
         if ( !iommu_use_hap_pt(d) )
             rc = iommu_populate_page_table(d);
         goto done;
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 7ec9541..336232e 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -660,7 +660,8 @@ static void dma_pte_clear_one(struct domain *domain, u64 addr)
     spin_unlock(&hd->mapping_lock);
     iommu_flush_cache_entry(pte, sizeof(struct dma_pte));
 
-    __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
+    if ( !domain->dont_flush_iotlb )
+        __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
 
     unmap_vtd_domain_page(page);
 
@@ -1753,7 +1754,8 @@ static int intel_iommu_map_page(
     spin_unlock(&hd->mapping_lock);
     unmap_vtd_domain_page(page);
 
-    __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
+    if ( !d->dont_flush_iotlb )
+        __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
 
     return 0;
 }
diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
index 3ba5495..922f068 100644
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -244,6 +244,7 @@ struct domain
     bool_t           is_hvm;
     /* Does this guest need iommu mappings? */
     bool_t           need_iommu;
+    bool_t           dont_flush_iotlb;
     /* Is this guest fully privileged (aka dom0)? */
     bool_t           is_privileged;
     /* Which guest this guest has privileges on */

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Fri Nov 04 04:41:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 04:41:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMI92-0005Px-Sr; Fri, 04 Nov 2011 04:41:12 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMI8M-0005DS-DI
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 04:40:30 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1320406824!1932827!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11148 invoked from network); 4 Nov 2011 11:40:27 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-8.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 4 Nov 2011 11:40:27 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 04 Nov 2011 11:40:21 +0000
Message-Id: <4EB3DD4F020000780005F013@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 04 Nov 2011 11:40:47 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: <xen-devel@lists.xensource.com>
Subject: Re: [Xen-devel] [xen-unstable bisection] complete
	test-amd64-amd64-xl-pcipt-intel
References: <E1RM9Hi-0005BI-3L@woking.xci-test.com>
In-Reply-To: <E1RM9Hi-0005BI-3L@woking.xci-test.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: keir@xen.org, ian.jackson@eu.citrix.com, stefano.stabellini@eu.citrix.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 04.11.11 at 03:13, xen.org <ian.jackson@eu.citrix.com> wrote:
> branch xen-unstable
> xen branch xen-unstable
> job test-amd64-amd64-xl-pcipt-intel
> test xen-boot
>=20
> Tree: linux git://github.com/jsgf/linux-xen.git
> Tree: qemu git://hg.uk.xensource.com/HG/qemu-xen-unstable.git
> Tree: xen http://xenbits.xen.org/staging/xen-unstable.hg=20
>=20
> *** Found and reproduced problem changeset ***
>=20
>   Bug is in tree:  xen http://xenbits.xen.org/staging/xen-unstable.hg=20
>   Bug introduced:  6928172f7ded
>   Bug not present: 17ee4c213438
>=20
>=20
>   changeset:   24068:6928172f7ded
>   user:        Jan Beulich <jbeulich@suse.com>
>   date:        Thu Nov 03 17:27:38 2011 +0100
>      =20
>       IRQ: allocate CPU masks dynamically
>      =20
>       This includes delaying the initialization of dynamically created =
IRQs
>       until their actual first use and some further elimination of uses =
of
>       struct irq_cfg.
>      =20
>       Signed-off-by: Jan Beulich <jbeulich@suse.com>
>       Acked-by: Keir Fraser <keir@xen.org>
>       Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>

As it turns out my many-CPU build was with debugging disabled, which
is why I didn't notice the problem. Will send a patch in a few minutes.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 04:46:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 04:46:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMIDx-0005ry-76; Fri, 04 Nov 2011 04:46:17 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMIDU-0005fo-0T
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 04:45:48 -0700
X-Env-Sender: d.vrabel.98@gmail.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1320407143!1940616!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20661 invoked from network); 4 Nov 2011 11:45:44 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 11:45:44 -0000
Received: by gyg8 with SMTP id 8so3497224gyg.30
	for <xen-devel@lists.xensource.com>;
	Fri, 04 Nov 2011 04:45:43 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:message-id:date:from:user-agent:mime-version:to:cc:subject
	:references:in-reply-to:content-type:content-transfer-encoding;
	bh=dBYL0ysyV9jKvMp3lVkEIfr/xEWss0wCRjm5a8flJro=;
	b=t9xhOzq3dgtfwSsT8a+8qOLZs7r1jmvMyv+bGxjGaTs7hz0ijJ0VexvQM2zKwMBPHW
	ujpPhkhD+ePaO9JmGyO9jiPpkdSfzY0tVK18AF5eLL8yxfBEa1BdJNAWFGnAEIgrsn2v
	B/Ie6AmuZp0nMBCtGGRHtT4OBubQWx+OEfBE8=
Received: by 10.146.88.6 with SMTP id l6mr548963yab.35.1320407143430;
	Fri, 04 Nov 2011 04:45:43 -0700 (PDT)
Received: from [10.80.2.76] (firewall.ctxuk.citrix.com. [62.200.22.2])
	by mx.google.com with ESMTPS id f32sm27008683ani.20.2011.11.04.04.45.40
	(version=SSLv3 cipher=OTHER); Fri, 04 Nov 2011 04:45:42 -0700 (PDT)
Message-ID: <4EB3D05B.3090503@cantab.net>
Date: Fri, 04 Nov 2011 11:45:31 +0000
From: David Vrabel <dvrabel@cantab.net>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.1.16) Gecko/20110818 Icedove/3.0.11
MIME-Version: 1.0
To: =?UTF-8?B?Um9nZXIgUGF1IE1vbm7DqQ==?= <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images fail
References: <1319808450-9617-1-git-send-email-cyliu@suse.com>	<4EB184DE020000660000603E@novprvlin0050.provo.novell.com>	<1320238770.3084.51.camel@cthulhu.hellion.org.uk>	<CAERYnoaMLUcY_mr=+S86kj4=0RBk5-smUNpxRzOrpGPHtoCh+A@mail.gmail.com>
	<CAPLaKK7Eh3_DzLTVmnk6f6Cw7bDVBxkm7_-=cFaxFVfKKcHuFQ@mail.gmail.com>
In-Reply-To: <CAPLaKK7Eh3_DzLTVmnk6f6Cw7bDVBxkm7_-=cFaxFVfKKcHuFQ@mail.gmail.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Chunyan Liu <cyliu@suse.com>, Ian Campbell <Ian.Campbell@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 04/11/11 09:14, Roger Pau MonnÃ© wrote:
> 2011/11/4 Chunyan Liu <cyliu@suse.com>:
>>> This needs to be libxl_fork, I think. Perhaps even this whole thing
>>> should be libxl__spawn_spawn (not sure about that)?
>>
>> I noticed that in libxl, some places use fork() and other places use
>> libxl_fork(), device-model uses libxl__spawn_spwan. As for this place, I am
>> not clear if fork() + execvp() might cause some problem? Or it is just
>> considered better to use libxl_fork or libxl__spawn_spwan?

vfork() no longer exists in the POSIX.1-2008 standard so you probably
should not use it.

David

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 04:51:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 04:51:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMIJM-0006Jw-K1; Fri, 04 Nov 2011 04:51:52 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMIIg-00067k-MA
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 04:51:11 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1320407467!2889253!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4431 invoked from network); 4 Nov 2011 11:51:07 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 11:51:07 -0000
X-IronPort-AV: E=Sophos;i="4.69,455,1315180800"; 
   d="scan'208";a="8760582"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 11:51:07 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 11:51:07 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RMIId-0003XV-0H; Fri, 04 Nov 2011 11:51:07 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RMIIc-0000v0-UV;
	Fri, 04 Nov 2011 11:51:06 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20147.53674.932892.820749@mariner.uk.xensource.com>
Date: Fri, 4 Nov 2011 11:51:06 +0000
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [xen-unstable bisection] complete
	test-amd64-amd64-xl-pcipt-intel
In-Reply-To: <4EB3DD4F020000780005F013@nat28.tlf.novell.com>
References: <E1RM9Hi-0005BI-3L@woking.xci-test.com>
	<4EB3DD4F020000780005F013@nat28.tlf.novell.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "Keir \(Xen.org\)" <keir@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stabellini <Stefano.Stabellini@eu.citrix.com>, Stefano
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Jan Beulich writes ("Re: [Xen-devel] [xen-unstable bisection] complete test-amd64-amd64-xl-pcipt-intel"):
> As it turns out my many-CPU build was with debugging disabled, which
> is why I didn't notice the problem. Will send a patch in a few minutes.

Ooops, thanks.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 04:53:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 04:53:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMIKd-0006i6-TM; Fri, 04 Nov 2011 04:53:13 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMIK3-0006VW-M6
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 04:52:36 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1320407551!1936768!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1086 invoked from network); 4 Nov 2011 11:52:32 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 4 Nov 2011 11:52:32 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 04 Nov 2011 11:52:31 +0000
Message-Id: <4EB3E02B020000780005F027@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 04 Nov 2011 11:52:59 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part4C63BC0B.0__="
Subject: [Xen-devel] [PATCH] x86/IRQ: fix create_irq() after c/s
	24068:6928172f7ded
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part4C63BC0B.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

init_one_irq_desc() must be called with interrupts enabled (as it may
call functions from the xmalloc() group). Rather than mis-using
vector_lock to also protect the finding of an unused IRQ, make this
lockless through using cmpxchg(), and obtain the lock only around the
actual assignment of the vector.

Also fold find_unassigned_irq() into its only caller.

It is, btw, questionable whether create_irq() calling
__assign_irq_vector() (rather than assign_irq_vector()) is actually
correct - desc->affinity appears to not get initialized properly in
this case.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -151,16 +151,6 @@ int __init bind_irq_vector(int irq, int=20
     return ret;
 }
=20
-static inline int find_unassigned_irq(void)
-{
-    int irq;
-
-    for (irq =3D nr_irqs_gsi; irq < nr_irqs; irq++)
-        if (irq_to_desc(irq)->arch.used =3D=3D IRQ_UNUSED)
-            return irq;
-    return -ENOSPC;
-}
-
 /*
  * Dynamic irq allocate and deallocation for MSI
  */
@@ -170,19 +160,28 @@ int create_irq(void)
     int irq, ret;
     struct irq_desc *desc;
=20
-    spin_lock_irqsave(&vector_lock, flags);
+    for (irq =3D nr_irqs_gsi; irq < nr_irqs; irq++)
+    {
+        desc =3D irq_to_desc(irq);
+        if (cmpxchg(&desc->arch.used, IRQ_UNUSED, IRQ_RESERVED) =3D=3D =
IRQ_UNUSED)
+           break;
+    }
+
+    if (irq >=3D nr_irqs)
+         return -ENOSPC;
=20
-    irq =3D find_unassigned_irq();
-    if (irq < 0)
-         goto out;
-    desc =3D irq_to_desc(irq);
     ret =3D init_one_irq_desc(desc);
     if (!ret)
+    {
+        spin_lock_irqsave(&vector_lock, flags);
         ret =3D __assign_irq_vector(irq, desc, TARGET_CPUS);
+        spin_unlock_irqrestore(&vector_lock, flags);
+    }
     if (ret < 0)
+    {
+        desc->arch.used =3D IRQ_UNUSED;
         irq =3D ret;
-out:
-     spin_unlock_irqrestore(&vector_lock, flags);
+    }
=20
     return irq;
 }
--- a/xen/include/asm-x86/irq.h
+++ b/xen/include/asm-x86/irq.h
@@ -39,12 +39,13 @@ struct irq_cfg {
         unsigned move_cleanup_count;
         vmask_t *used_vectors;
         u8 move_in_progress : 1;
-        u8 used: 1;
+        s8 used;
 };
=20
 /* For use with irq_cfg.used */
 #define IRQ_UNUSED      (0)
 #define IRQ_USED        (1)
+#define IRQ_RESERVED    (-1)
=20
 #define IRQ_VECTOR_UNASSIGNED (-1)
=20




--=__Part4C63BC0B.0__=
Content-Type: text/plain; name="x86-create-irq-locking.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="x86-create-irq-locking.patch"

x86/IRQ: fix create_irq() after c/s 24068:6928172f7ded=0A=0Ainit_one_irq_de=
sc() must be called with interrupts enabled (as it may=0Acall functions =
from the xmalloc() group). Rather than mis-using=0Avector_lock to also =
protect the finding of an unused IRQ, make this=0Alockless through using =
cmpxchg(), and obtain the lock only around the=0Aactual assignment of the =
vector.=0A=0AAlso fold find_unassigned_irq() into its only caller.=0A=0AIt =
is, btw, questionable whether create_irq() calling=0A__assign_irq_vector() =
(rather than assign_irq_vector()) is actually=0Acorrect - desc->affinity =
appears to not get initialized properly in=0Athis case.=0A=0ASigned-off-by:=
 Jan Beulich <jbeulich@suse.com>=0A=0A--- a/xen/arch/x86/irq.c=0A+++ =
b/xen/arch/x86/irq.c=0A@@ -151,16 +151,6 @@ int __init bind_irq_vector(int =
irq, int =0A     return ret;=0A }=0A =0A-static inline int find_unassigned_=
irq(void)=0A-{=0A-    int irq;=0A-=0A-    for (irq =3D nr_irqs_gsi; irq < =
nr_irqs; irq++)=0A-        if (irq_to_desc(irq)->arch.used =3D=3D =
IRQ_UNUSED)=0A-            return irq;=0A-    return -ENOSPC;=0A-}=0A-=0A =
/*=0A  * Dynamic irq allocate and deallocation for MSI=0A  */=0A@@ -170,19 =
+160,28 @@ int create_irq(void)=0A     int irq, ret;=0A     struct =
irq_desc *desc;=0A =0A-    spin_lock_irqsave(&vector_lock, flags);=0A+    =
for (irq =3D nr_irqs_gsi; irq < nr_irqs; irq++)=0A+    {=0A+        desc =
=3D irq_to_desc(irq);=0A+        if (cmpxchg(&desc->arch.used, IRQ_UNUSED, =
IRQ_RESERVED) =3D=3D IRQ_UNUSED)=0A+           break;=0A+    }=0A+=0A+    =
if (irq >=3D nr_irqs)=0A+         return -ENOSPC;=0A =0A-    irq =3D =
find_unassigned_irq();=0A-    if (irq < 0)=0A-         goto out;=0A-    =
desc =3D irq_to_desc(irq);=0A     ret =3D init_one_irq_desc(desc);=0A     =
if (!ret)=0A+    {=0A+        spin_lock_irqsave(&vector_lock, flags);=0A   =
      ret =3D __assign_irq_vector(irq, desc, TARGET_CPUS);=0A+        =
spin_unlock_irqrestore(&vector_lock, flags);=0A+    }=0A     if (ret < =
0)=0A+    {=0A+        desc->arch.used =3D IRQ_UNUSED;=0A         irq =3D =
ret;=0A-out:=0A-     spin_unlock_irqrestore(&vector_lock, flags);=0A+    =
}=0A =0A     return irq;=0A }=0A--- a/xen/include/asm-x86/irq.h=0A+++ =
b/xen/include/asm-x86/irq.h=0A@@ -39,12 +39,13 @@ struct irq_cfg {=0A      =
   unsigned move_cleanup_count;=0A         vmask_t *used_vectors;=0A       =
  u8 move_in_progress : 1;=0A-        u8 used: 1;=0A+        s8 used;=0A =
};=0A =0A /* For use with irq_cfg.used */=0A #define IRQ_UNUSED      =
(0)=0A #define IRQ_USED        (1)=0A+#define IRQ_RESERVED    (-1)=0A =0A =
#define IRQ_VECTOR_UNASSIGNED (-1)=0A =0A
--=__Part4C63BC0B.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part4C63BC0B.0__=--


From xen-devel-bounces@lists.xensource.com Fri Nov 04 05:14:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 05:14:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMIfi-0007Q5-87; Fri, 04 Nov 2011 05:14:58 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMIeq-0007Df-PN
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 05:14:05 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1320408841!296644!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30386 invoked from network); 4 Nov 2011 12:14:01 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 12:14:01 -0000
X-IronPort-AV: E=Sophos;i="4.69,455,1315180800"; 
   d="scan'208";a="8761138"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 12:14:00 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 12:14:00 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RMIem-0003fr-92; Fri, 04 Nov 2011 12:14:00 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RMIem-0000wq-87;
	Fri, 04 Nov 2011 12:14:00 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20147.55048.90214.665321@mariner.uk.xensource.com>
Date: Fri, 4 Nov 2011 12:14:00 +0000
To: "rshriram@cs.ubc.ca" <rshriram@cs.ubc.ca>
In-Reply-To: <patchbomb.1320350703@athos.nss.cs.ubc.ca>
References: <patchbomb.1320350703@athos.nss.cs.ubc.ca>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "brendan@cs.ubc.ca" <brendan@cs.ubc.ca>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH 0 of 2 V5] libxc: checkpoint compression
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

rshriram@cs.ubc.ca writes ("[PATCH 0 of 2 V5] libxc: checkpoint compression"):
> This patch series adds checkpoint compression functionality, while
> running under Remus.
...
> Changes since last version:
> 1. use posix_memalign only on linux platforms and switch to normal malloc for
>    the rest. stubdom compiles successfully.

Looking at this in more detail, I don't understand why you're using
posix_memalign rather than just malloc, anyway.  If it's necessary to
use posix_memalign on Linux, why is it OK to use malloc on other
platforms ?

Also this #ifdef is quite ugly.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 05:32:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 05:32:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMIwZ-00084m-8V; Fri, 04 Nov 2011 05:32:23 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMIvn-0007s4-Gc
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 05:31:35 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1320409891!296312!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29043 invoked from network); 4 Nov 2011 12:31:32 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-12.tower-174.messagelabs.com with AES256-SHA encrypted
	SMTP; 4 Nov 2011 12:31:32 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 04 Nov 2011 12:31:31 +0000
Message-Id: <4EB3E950020000780005F04A@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 04 Nov 2011 12:32:00 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jean Guyader" <jean.guyader@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 4/6] mm: Add new map space for
	add_to_physmap, XENMAPSPACE_gmfn_range.
References: <1320403109-8739-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-5-git-send-email-jean.guyader@eu.citrix.com>
In-Reply-To: <1320403109-8739-5-git-send-email-jean.guyader@eu.citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: tim@xen.org, xen-devel@lists.xensource.com, allen.m.kay@intel.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 04.11.11 at 11:38, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> XENMAPSPACE_gmfn_range is like XENMAPSPACE_gmfn but with a size which
> is the number of pages on which xen will iterate.
>=20
> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> ---
>  xen/arch/x86/mm.c           |   15 ++++++++++++++-
>  xen/include/public/memory.h |    4 ++++
>  2 files changed, 18 insertions(+), 1 deletions(-)

You can't add a member to a structure that's part of the public
interface. You'll need to create a new structure.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 05:41:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 05:41:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMJ5S-0000Bd-Lf; Fri, 04 Nov 2011 05:41:34 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMJ4h-0008Ql-4H
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 05:40:47 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1320410443!2917100!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19417 invoked from network); 4 Nov 2011 12:40:44 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 4 Nov 2011 12:40:44 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 04 Nov 2011 12:40:43 +0000
Message-Id: <4EB3EB76020000780005F062@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 04 Nov 2011 12:41:10 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jean Guyader" <jean.guyader@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 6/6] Introduce domain flag
	(dont_flush_iotlb) to avoid unnecessary iotlb flush.
References: <1320403109-8739-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-5-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-6-git-send-email-jean.guyader@eu.citrix.com>
	<1320403109-8739-7-git-send-email-jean.guyader@eu.citrix.com>
In-Reply-To: <1320403109-8739-7-git-send-email-jean.guyader@eu.citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: tim@xen.org, xen-devel@lists.xensource.com, allen.m.kay@intel.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 04.11.11 at 11:38, Jean Guyader <jean.guyader@eu.citrix.com> wrote:

> Add a domain level flag that will be check by the iommu low level code
> to skip iotlb flush. iommu_iotlb_flush has to be called explicitly.
>=20
> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> ---
>  xen/arch/x86/mm.c                   |   12 +++++++++++-
>  xen/drivers/passthrough/iommu.c     |    6 ++++++
>  xen/drivers/passthrough/vtd/iommu.c |    6 ++++--
>  xen/include/xen/sched.h             |    1 +
>  4 files changed, 22 insertions(+), 3 deletions(-)

Neither the patch nor its description make clear what lock is used
to protect this flag from having an effect on other but the current
vCPU of the guest in question - I doubt that all other relevant code
paths indeed use domain_lock().

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 05:45:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 05:45:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMJ9N-0000cb-07; Fri, 04 Nov 2011 05:45:37 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMJ8m-0000Ps-8S
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 05:45:00 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1320410696!1941447!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24251 invoked from network); 4 Nov 2011 12:44:57 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 12:44:57 -0000
X-IronPort-AV: E=Sophos;i="4.69,455,1315180800"; 
   d="scan'208";a="8761857"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 12:44:36 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 12:44:37 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RMJ8O-0003qO-DY; Fri, 04 Nov 2011 12:44:36 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RMJ8O-0006IP-4V;
	Fri, 04 Nov 2011 12:44:36 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20147.56884.48016.666901@mariner.uk.xensource.com>
Date: Fri, 4 Nov 2011 12:44:36 +0000
To: Anthony PERARD <anthony.perard@citrix.com>
Subject: Re: [Xen-devel] [PATCH V3 10/13] libxl: libxl_qmp: Introduce
	libxl__qmp_pci_add.
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1320163646-24291-11-git-send-email-anthony.perard@citrix.com>
References: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
	<1320163646-24291-11-git-send-email-anthony.perard@citrix.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Anthony PERARD writes ("[Xen-devel] [PATCH V3 10/13] libxl: libxl_qmp: Introduce libxl__qmp_pci_add."):
> This function insert a PCI passthrough device in qemu.

Thanks.  I have applied 1-9 from this series.  13/13 had a conflict,
and I wasn't 100% sure that it was right to apply it without 10,11,12,
although it seems to me that it ought to be OK.  Can you confirm, and
respin the last patch (or the others) as appropriate ?

Thanks,
Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 05:54:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 05:54:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMJHy-000177-Q6; Fri, 04 Nov 2011 05:54:31 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMJHR-0000uf-2H
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 05:53:57 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1320411232!303468!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21166 invoked from network); 4 Nov 2011 12:53:53 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 12:53:53 -0000
X-IronPort-AV: E=Sophos;i="4.69,455,1315180800"; 
   d="scan'208";a="8762090"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 12:53:51 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 12:53:52 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RMJHL-0003ta-FX;
	Fri, 04 Nov 2011 12:53:51 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RMJHL-00019c-F3;
	Fri, 04 Nov 2011 12:53:51 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <E1RMJHL-00019c-F3@woking.xci-test.com>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 4 Nov 2011 12:53:51 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com, keir@xen.org, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [xen-unstable bisection] complete test-amd64-i386-pv
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

branch xen-unstable
xen branch xen-unstable
job test-amd64-i386-pv
test xen-boot

Tree: linux git://github.com/jsgf/linux-xen.git
Tree: qemu git://hg.uk.xensource.com/HG/qemu-xen-unstable.git
Tree: xen http://xenbits.xen.org/staging/xen-unstable.hg

*** Found and reproduced problem changeset ***

  Bug is in tree:  xen http://xenbits.xen.org/staging/xen-unstable.hg
  Bug introduced:  6928172f7ded
  Bug not present: 17ee4c213438


  changeset:   24068:6928172f7ded
  user:        Jan Beulich <jbeulich@suse.com>
  date:        Thu Nov 03 17:27:38 2011 +0100
      
      IRQ: allocate CPU masks dynamically
      
      This includes delaying the initialization of dynamically created IRQs
      until their actual first use and some further elimination of uses of
      struct irq_cfg.
      
      Signed-off-by: Jan Beulich <jbeulich@suse.com>
      Acked-by: Keir Fraser <keir@xen.org>
      Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
      
      


For bisection revision-tuple graph see:
   http://www.chiark.greenend.org.uk/~xensrcts/results/bisect.xen-unstable.test-amd64-i386-pv.xen-boot.html
Revision IDs in each graph node refer, respectively, to the Trees above.

----------------------------------------
Searching for failure / basis pass:
 9663 fail [host=itch-mite] / 9662 [host=woodlouse] 9661 [host=lace-bug] 9659 [host=woodlouse] 9656 [host=field-cricket] 9655 [host=bush-cricket] 9652 [host=lace-bug] 9651 [host=woodlouse] 9650 [host=moss-bug] 9649 [host=woodlouse] 9648 [host=field-cricket] 9647 [host=potato-beetle] 9646 [host=leaf-beetle] 9645 [host=potato-beetle] 9644 [host=woodlouse] 9642 ok.
Failure / basis pass flights: 9663 / 9642
Tree: linux git://github.com/jsgf/linux-xen.git
Tree: qemu git://hg.uk.xensource.com/HG/qemu-xen-unstable.git
Tree: xen http://xenbits.xen.org/staging/xen-unstable.hg
Latest 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 801ca6c0fbfa
Basis pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 0526644ad2a6
Generating revisions with ./adhoc-revtuple-generator  git://github.com/jsgf/linux-xen.git#6bec8b4a4c14095d0b7ce424db9d583c3decae6c-6bec8b4a4c14095d0b7ce424db9d583c3decae6c git://hg.uk.xensource.com/HG/qemu-xen-unstable.git#25378e0a76b282127e9ab8933a4defbc91db3862-52834188eedfbbca5636fd869d4c86b3b3044439 http://xenbits.xen.org/staging/xen-unstable.hg#0526644ad2a6-801ca6c0fbfa
using cache /export/home/osstest/repos/git-cache...
using cache /export/home/osstest/repos/git-cache...
locked cache /export/home/osstest/repos/git-cache...
processing ./cacheing-git clone --bare git://hg.uk.xensource.com/HG/qemu-xen-unstable.git /export/home/osstest/repos/qemu-xen-unstable...
Initialized empty Git repository in /export/home/osstest/repos/qemu-xen-unstable/
updating cache /export/home/osstest/repos/git-cache qemu-xen-unstable...
pulling from ssh://xen@xenbits.xen.org/HG/staging/xen-unstable.hg
searching for changes
adding changesets
adding manifests
adding file changes
added 9 changesets with 14 changes to 7 files
7 files updated, 0 files merged, 0 files removed, 0 files unresolved
using cache /export/home/osstest/repos/git-cache...
using cache /export/home/osstest/repos/git-cache...
locked cache /export/home/osstest/repos/git-cache...
processing ./cacheing-git clone --bare git://hg.uk.xensource.com/HG/qemu-xen-unstable.git /export/home/osstest/repos/qemu-xen-unstable...
Initialized empty Git repository in /export/home/osstest/repos/qemu-xen-unstable/
updating cache /export/home/osstest/repos/git-cache qemu-xen-unstable...
pulling from ssh://xen@xenbits.xen.org/HG/staging/xen-unstable.hg
searching for changes
no changes found
Loaded 1007 nodes in revision graph
Searching for test results:
 9649 [host=woodlouse]
 9661 [host=lace-bug]
 9650 [host=moss-bug]
 9651 [host=woodlouse]
 9662 [host=woodlouse]
 9686 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 17ee4c213438
 9652 [host=lace-bug]
 9642 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 0526644ad2a6
 9644 [host=woodlouse]
 9655 [host=bush-cricket]
 9645 [host=potato-beetle]
 9646 [host=leaf-beetle]
 9656 [host=field-cricket]
 9647 [host=potato-beetle]
 9681 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 801ca6c0fbfa
 9648 [host=field-cricket]
 9663 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 801ca6c0fbfa
 9659 [host=woodlouse]
 9684 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 205b89ad2d66
 9682 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 e81e77745647
 9688 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 17ee4c213438
 9680 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 0526644ad2a6
 9685 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 ac47cafe6776
 9683 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 d577f5ae4986
 9687 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 6928172f7ded
 9689 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 6928172f7ded
 9692 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 6928172f7ded
 9690 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 17ee4c213438
Searching for interesting versions
 Result found: flight 9642 (pass), for basis pass
 Result found: flight 9663 (fail), for basis failure
 Repro found: flight 9680 (pass), for basis pass
 Repro found: flight 9681 (fail), for basis failure
 0 revisions at 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 52834188eedfbbca5636fd869d4c86b3b3044439 17ee4c213438
No revisions left to test, checking graph state.
 Result found: flight 9686 (pass), for last pass
 Result found: flight 9687 (fail), for first failure
 Repro found: flight 9688 (pass), for last pass
 Repro found: flight 9689 (fail), for first failure
 Repro found: flight 9690 (pass), for last pass
 Repro found: flight 9692 (fail), for first failure

*** Found and reproduced problem changeset ***

  Bug is in tree:  xen http://xenbits.xen.org/staging/xen-unstable.hg
  Bug introduced:  6928172f7ded
  Bug not present: 17ee4c213438

pulling from ssh://xen@xenbits.xen.org/HG/staging/xen-unstable.hg
searching for changes
no changes found

  changeset:   24068:6928172f7ded
  user:        Jan Beulich <jbeulich@suse.com>
  date:        Thu Nov 03 17:27:38 2011 +0100
      
      IRQ: allocate CPU masks dynamically
      
      This includes delaying the initialization of dynamically created IRQs
      until their actual first use and some further elimination of uses of
      struct irq_cfg.
      
      Signed-off-by: Jan Beulich <jbeulich@suse.com>
      Acked-by: Keir Fraser <keir@xen.org>
      Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
      
      

Revision graph left in /home/xc_osstest/results/bisect.xen-unstable.test-amd64-i386-pv.xen-boot.{dot,ps,png,html}.
----------------------------------------
9692: ALL FAIL

flight 9692 xen-unstable real-bisect [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9692/


jobs:
 test-amd64-i386-pv                                           fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 05:59:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 05:59:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMJMV-0001ht-Hc; Fri, 04 Nov 2011 05:59:12 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMJKh-0001Tu-LI
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 05:57:20 -0700
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1320411436!302177!1
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14926 invoked from network); 4 Nov 2011 12:57:16 -0000
Received: from dgate20.ts.fujitsu.com (HELO dgate20.ts.fujitsu.com)
	(80.70.172.51)
	by server-14.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 12:57:16 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Content-Type:MIME-Version:Subject:
	X-Mercurial-Node:Message-Id:Date:From:To:Cc;
	b=HTZMNRmLH+erYPlCI8und90qN/y6kMqu850K9NHDUdUa1cRw2Vnv899V
	anFwaKk8M2uuGXu3hAtR3vkdUMvxs+6FH+wPQhDqc1YWnE4dQGmImBv94
	AsmatQFsH9DcBsPAs2ouvQok03PRwxs23lhC31XuwL2ARnz58UlTE0U7k
	AReDUD0SdRrC4nLLtXpGd7z63FQOyYeVy9bCKqIYTvXXLD7c2dVrkK5S2
	GXYOUja0rpBC9NmwKN7j5GFdnnwDT;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1320411436; x=1351947436;
	h=mime-version:subject:message-id:date:from:to:cc;
	bh=p4XZ3hWgdR4zt3KVs0ytQzkGXmdDamF09qkCjlBlbFo=;
	b=DPjJ5n+Uj+2yu87wLVYjibNHZfSbONPHe3RDLQHh2gz+BbgVslrU0E8p
	1Khzbqt1OWMz4VmlfszOsbvjJEQSSB8o2FWdi7b8/JEAW+18G/7YKkgUX
	UgxQbbeRArdq1VYEDCoGLYOhxERHke6zA0DLMlxyWbMzPqjiO3chef3eK
	8qV+LRqnrMVFY/4Fd3PPWcZoO/EAHDzJzuRfP1fW3mO1U0n0IPnfoINmU
	8nMzmLbTfDkXA/ksXi158o9DIZd/c;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,455,1315173600"; d="scan'208";a="78265986"
Received: from abgdgate40u.abg.fsc.net ([172.25.138.90])
	by dgate20u.abg.fsc.net with ESMTP; 04 Nov 2011 13:57:16 +0100
X-IronPort-AV: E=Sophos;i="4.69,455,1315173600"; d="scan'208";a="122850691"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate40u.abg.fsc.net with ESMTP; 04 Nov 2011 13:57:16 +0100
Received: from [172.17.21.25] (nehalem1.osd.mch.fsc.net [172.17.21.25])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id 12B4BA1C30;
	Fri,  4 Nov 2011 13:57:16 +0100 (CET)
Content-Type: multipart/mixed; boundary="===============1744399279287723024=="
MIME-Version: 1.0
X-Mercurial-Node: df918a251d01d3ac6267bee9d4a7351d41167688
Message-Id: <df918a251d01d3ac6267.1320411162@nehalem1>
Date: Fri, 04 Nov 2011 13:52:42 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
To: xen-devel@lists.xensource.com
Cc: xudong.hao@intel.com
Subject: [Xen-devel] [PATCH] Make lock profiling usable again
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1744399279287723024==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

Using lock profiling (option lock_profile in xen/Rules.mk) resulted in build
errors.
Changes:
- Include public/sysctl.h in spinlock.h when using lock profiling.
- Allocate profile data in an own structure to avoid struct domain becoming
  larger then one page

Signed-off-by: juergen.gross@ts.fujitsu.com


2 files changed, 44 insertions(+), 24 deletions(-)
xen/common/spinlock.c      |   34 +++++++++++++++++++++-------------
xen/include/xen/spinlock.h |   34 +++++++++++++++++++++++-----------



--===============1744399279287723024==
Content-Type: text/x-patch; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=xen-staging.hg.patch

# HG changeset patch
# User Juergen Gross <juergen.gross@ts.fujitsu.com>
# Date 1320411131 -3600
# Node ID df918a251d01d3ac6267bee9d4a7351d41167688
# Parent  801ca6c0fbfa07e12c10c3079fc60cfb47dd0e3b
Make lock profiling usable again

Using lock profiling (option lock_profile in xen/Rules.mk) resulted in build
errors.
Changes:
- Include public/sysctl.h in spinlock.h when using lock profiling.
- Allocate profile data in an own structure to avoid struct domain becoming
  larger then one page

Signed-off-by: juergen.gross@ts.fujitsu.com

diff -r 801ca6c0fbfa -r df918a251d01 xen/common/spinlock.c
--- a/xen/common/spinlock.c	Thu Nov 03 17:28:41 2011 +0100
+++ b/xen/common/spinlock.c	Fri Nov 04 13:52:11 2011 +0100
@@ -86,17 +86,23 @@ void spin_debug_disable(void)
 
 #ifdef LOCK_PROFILE
 
-#define LOCK_PROFILE_REL                                               \
-    lock->profile.time_hold += NOW() - lock->profile.time_locked;      \
-    lock->profile.lock_cnt++;
+#define LOCK_PROFILE_REL                                                     \
+    if (lock->profile)                                                       \
+    {                                                                        \
+        lock->profile->time_hold += NOW() - lock->profile->time_locked;      \
+        lock->profile->lock_cnt++;                                           \
+    }
 #define LOCK_PROFILE_VAR    s_time_t block = 0
 #define LOCK_PROFILE_BLOCK  block = block ? : NOW();
-#define LOCK_PROFILE_GOT                                               \
-    lock->profile.time_locked = NOW();                                 \
-    if (block)                                                         \
-    {                                                                  \
-        lock->profile.time_block += lock->profile.time_locked - block; \
-        lock->profile.block_cnt++;                                     \
+#define LOCK_PROFILE_GOT                                                     \
+    if (lock->profile)                                                       \
+    {                                                                        \
+        lock->profile->time_locked = NOW();                                  \
+        if (block)                                                           \
+        {                                                                    \
+            lock->profile->time_block += lock->profile->time_locked - block; \
+            lock->profile->block_cnt++;                                      \
+        }                                                                    \
     }
 
 #else
@@ -197,7 +203,8 @@ int _spin_trylock(spinlock_t *lock)
     if ( !_raw_spin_trylock(&lock->raw) )
         return 0;
 #ifdef LOCK_PROFILE
-    lock->profile.time_locked = NOW();
+    if (lock->profile)
+        lock->profile->time_locked = NOW();
 #endif
     preempt_disable();
     return 1;
@@ -211,10 +218,10 @@ void _spin_barrier(spinlock_t *lock)
 
     check_barrier(&lock->debug);
     do { mb(); loop++;} while ( _raw_spin_is_locked(&lock->raw) );
-    if (loop > 1)
+    if ((loop > 1) && lock->profile)
     {
-        lock->profile.time_block += NOW() - block;
-        lock->profile.block_cnt++;
+        lock->profile->time_block += NOW() - block;
+        lock->profile->block_cnt++;
     }
 #else
     check_barrier(&lock->debug);
@@ -586,6 +593,7 @@ static int __init lock_prof_init(void)
     {
         (*q)->next = lock_profile_glb_q.elem_q;
         lock_profile_glb_q.elem_q = *q;
+        (*q)->lock->profile = *q;
     }
 
     _lock_profile_register_struct(
diff -r 801ca6c0fbfa -r df918a251d01 xen/include/xen/spinlock.h
--- a/xen/include/xen/spinlock.h	Thu Nov 03 17:28:41 2011 +0100
+++ b/xen/include/xen/spinlock.h	Fri Nov 04 13:52:11 2011 +0100
@@ -20,6 +20,9 @@ struct lock_debug { };
 #endif
 
 #ifdef LOCK_PROFILE
+
+#include <public/sysctl.h>
+
 /*
     lock profiling on:
 
@@ -54,9 +57,12 @@ struct lock_debug { };
       lock_profile_deregister_struct(type, ptr);
 */
 
+struct spinlock;
+
 struct lock_profile {
     struct lock_profile *next;       /* forward link */
     char                *name;       /* lock name */
+    struct spinlock     *lock;       /* the lock itself */
     u64                 lock_cnt;    /* # of complete locking ops */
     u64                 block_cnt;   /* # of complete wait for lock */
     s64                 time_hold;   /* cumulated lock time */
@@ -70,23 +76,29 @@ struct lock_profile_qhead {
     int32_t                   idx;     /* index for printout */
 };
 
-#define _LOCK_PROFILE(name) { 0, name, 0, 0, 0, 0, 0 }
-#define _LOCK_NO_PROFILE _LOCK_PROFILE(NULL)
+#define _LOCK_PROFILE(name) { 0, #name, &name, 0, 0, 0, 0, 0 }
 #define _LOCK_PROFILE_PTR(name)                                               \
     static struct lock_profile *__lock_profile_##name __attribute_used__      \
-    __attribute__ ((__section__(".lockprofile.data"))) = &name.profile
+    __attribute__ ((__section__(".lockprofile.data"))) =                      \
+    &__lock_profile_data_##name
 #define _SPIN_LOCK_UNLOCKED(x) { _RAW_SPIN_LOCK_UNLOCKED, 0xfffu, 0,          \
                                  _LOCK_DEBUG, x }
-#define SPIN_LOCK_UNLOCKED _SPIN_LOCK_UNLOCKED(_LOCK_NO_PROFILE)
+#define SPIN_LOCK_UNLOCKED _SPIN_LOCK_UNLOCKED(NULL)
 #define DEFINE_SPINLOCK(l)                                                    \
-    spinlock_t l = _SPIN_LOCK_UNLOCKED(_LOCK_PROFILE(#l));                    \
+    spinlock_t l = _SPIN_LOCK_UNLOCKED(NULL);                                 \
+    static struct lock_profile __lock_profile_data_##l = _LOCK_PROFILE(l);    \
     _LOCK_PROFILE_PTR(l)
 
 #define spin_lock_init_prof(s, l)                                             \
     do {                                                                      \
-        (s)->l = (spinlock_t)_SPIN_LOCK_UNLOCKED(_LOCK_PROFILE(#l));          \
-        (s)->l.profile.next = (s)->profile_head.elem_q;                       \
-        (s)->profile_head.elem_q = &((s)->l.profile);                         \
+        struct lock_profile *prof;                                            \
+        prof = xzalloc(struct lock_profile);                                  \
+        if (!prof) break;                                                     \
+        prof->name = #l;                                                      \
+        prof->lock = &(s)->l;                                                 \
+        (s)->l = (spinlock_t)_SPIN_LOCK_UNLOCKED(prof);                       \
+        prof->next = (s)->profile_head.elem_q;                                \
+        (s)->profile_head.elem_q = prof;                                      \
     } while(0)
 
 void _lock_profile_register_struct(
@@ -108,7 +120,7 @@ struct lock_profile_qhead { };
 struct lock_profile_qhead { };
 
 #define SPIN_LOCK_UNLOCKED                                                    \
-    { _RAW_SPIN_LOCK_UNLOCKED, 0xfffu, 0, _LOCK_DEBUG, { } }
+    { _RAW_SPIN_LOCK_UNLOCKED, 0xfffu, 0, _LOCK_DEBUG, NULL }
 #define DEFINE_SPINLOCK(l) spinlock_t l = SPIN_LOCK_UNLOCKED
 
 #define spin_lock_init_prof(s, l) spin_lock_init(&((s)->l))
@@ -117,12 +129,12 @@ struct lock_profile_qhead { };
 
 #endif
 
-typedef struct {
+typedef struct spinlock {
     raw_spinlock_t raw;
     u16 recurse_cpu:12;
     u16 recurse_cnt:4;
     struct lock_debug debug;
-    struct lock_profile profile;
+    struct lock_profile *profile;
 } spinlock_t;
 
 

--===============1744399279287723024==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1744399279287723024==--


From xen-devel-bounces@lists.xensource.com Fri Nov 04 06:07:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 06:07:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMJUb-0002Br-6S; Fri, 04 Nov 2011 06:07:33 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMJPG-0001uU-Uf
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 06:02:41 -0700
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1320411714!1950138!1
X-Originating-IP: [80.70.172.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29124 invoked from network); 4 Nov 2011 13:01:55 -0000
Received: from dgate10.ts.fujitsu.com (HELO dgate10.ts.fujitsu.com)
	(80.70.172.49)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 13:01:55 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Message-ID:Date:From:Organization:
	User-Agent:MIME-Version:To:CC:Subject:References:
	In-Reply-To:Content-Type:Content-Transfer-Encoding;
	b=kZrJAElWTZ1HpFZCFiCfzRjBuu4JdloUfOQEK+azcLsizFfowaDZ0YR6
	qK9Nwjae4S72nSv2rRzCG0HBnZ/CJuK7y0CaSzTcxQPdOUakmMs5Yc3pk
	o6tMheFbRyUOxS7A32cmVHU7MwOSlhg+P0zGELOImTEdDoKclubieeltf
	EoxshT8sOIWE8RuSi3ep+5YnXCglXUKwJB4HGLpxKI+AI/NCHLwaoYHQH
	YS9RgG+mwwb3ZsvIgI0/5jx2UQlIN;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1320411716; x=1351947716;
	h=message-id:date:from:mime-version:to:cc:subject:
	references:in-reply-to:content-transfer-encoding;
	bh=W+Xlrs4pSVp51RO3hF3uNi64LDjYGb29209tbJZwGr4=;
	b=EGlHBXak9ekwSaFT2u/6YyEXiO6AvB+8FBU/0uoUfHPaaD7qVFQ43MCl
	gmhZ1JuJd6B1dTqLop3FytrA1ySWOql1Fvu4fNa3N2vnzlkIsHew9NkON
	sm5+xm9iNBIpRPpEToXQ9CXU+hygDY7PgOKM0adeR4NyMiKe4Bp2zvW1k
	GrCcfDvXwEmjhsxT1/HTMRYzF9o2E2CkesbXTO2KGnYYqngpmTMgpL9Ty
	APUhaHqxfPBRER+CQvqRSXUMJVDII;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,455,1315173600"; d="scan'208";a="92159590"
Received: from abgdgate40u.abg.fsc.net ([172.25.138.90])
	by dgate10u.abg.fsc.net with ESMTP; 04 Nov 2011 14:01:45 +0100
X-IronPort-AV: E=Sophos;i="4.69,455,1315173600"; d="scan'208";a="122851322"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate40u.abg.fsc.net with ESMTP; 04 Nov 2011 14:01:44 +0100
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id 9273EA1C30;
	Fri,  4 Nov 2011 14:01:44 +0100 (CET)
Message-ID: <4EB3E238.7030205@ts.fujitsu.com>
Date: Fri, 04 Nov 2011 14:01:44 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
Organization: Fujitsu Technology Solutions
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20111010 Iceowl/1.0b2 Icedove/3.1.15
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: fix create_irq() after
	c/s	24068:6928172f7ded
References: <4EB3E02B020000780005F027@nat28.tlf.novell.com>
In-Reply-To: <4EB3E02B020000780005F027@nat28.tlf.novell.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/04/2011 12:52 PM, Jan Beulich wrote:
> init_one_irq_desc() must be called with interrupts enabled (as it may
> call functions from the xmalloc() group). Rather than mis-using
> vector_lock to also protect the finding of an unused IRQ, make this
> lockless through using cmpxchg(), and obtain the lock only around the
> actual assignment of the vector.

Works for me (machine coming up again).

Juergen

-- 
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: juergen.gross@ts.fujitsu.com
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 07:03:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 07:03:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMKMo-0004CT-Ts; Fri, 04 Nov 2011 07:03:34 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMKHc-0003TW-Jw
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 06:58:13 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1320415089!1959881!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3002 invoked from network); 4 Nov 2011 13:58:09 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 13:58:09 -0000
X-IronPort-AV: E=Sophos;i="4.69,455,1315180800"; 
   d="scan'208";a="8763510"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 13:58:09 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 13:58:09 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RMKHY-0004FL-Mv;
	Fri, 04 Nov 2011 13:58:08 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RMKHY-00031q-HW;
	Fri, 04 Nov 2011 13:58:08 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9691-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 4 Nov 2011 13:58:08 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9691: regressions - trouble:
	broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9691 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9691/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-pcipt-intel  5 xen-boot                fail REGR. vs. 9661
 test-amd64-i386-rhel6hvm-intel  3 host-install(3)              broken
 test-amd64-i386-pv            3 host-install(3)              broken
 test-amd64-amd64-pv           5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-rhel6hvm-amd  5 xen-boot                   fail REGR. vs. 9661
 test-i386-i386-pv             5 xen-boot                   fail REGR. vs. 9661
 test-i386-i386-xl             5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl            5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl-credit2    5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-xl           5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl-multivcpu  5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-pair         8 xen-boot/dst_host          fail REGR. vs. 9661
 test-amd64-amd64-pair         7 xen-boot/src_host          fail REGR. vs. 9661
 test-amd64-i386-pair          8 xen-boot/dst_host          fail REGR. vs. 9661
 test-amd64-i386-pair          7 xen-boot/src_host          fail REGR. vs. 9661
 test-i386-i386-pair           7 xen-boot/src_host          fail REGR. vs. 9661
 test-i386-i386-pair           8 xen-boot/dst_host          fail REGR. vs. 9661
 test-amd64-i386-win-vcpus1    5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl-win-vcpus1  5 xen-boot                  fail REGR. vs. 9661
 test-i386-i386-xl-win         5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-win           5 xen-boot                   fail REGR. vs. 9661
 test-i386-i386-win            3 host-install(3)              broken
 test-amd64-amd64-win          5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-xl-win       5 xen-boot                   fail REGR. vs. 9661

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-sedf      5 xen-boot                     fail    like 9661

version targeted for testing:
 xen                  801ca6c0fbfa
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               broken  
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        fail    
 test-amd64-i386-pair                                         fail    
 test-i386-i386-pair                                          fail    
 test-amd64-amd64-pv                                          fail    
 test-amd64-i386-pv                                           broken  
 test-i386-i386-pv                                            fail    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           broken  
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24069:801ca6c0fbfa
tag:         tip
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:28:41 2011 +0100
    
    x86/IRQ: consolidate IRQ disabling when acquiring vector lock
    
    __assign_irq_vector() doesn't need to disable interrupts (its callers
    are required to when acquiring the lock), and set_desc_affinity() can
    use the normal spin lock primitives.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24068:6928172f7ded
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:27:38 2011 +0100
    
    IRQ: allocate CPU masks dynamically
    
    This includes delaying the initialization of dynamically created IRQs
    until their actual first use and some further elimination of uses of
    struct irq_cfg.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24067:17ee4c213438
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 07:11:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 07:11:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMKUT-0004gw-Ol; Fri, 04 Nov 2011 07:11:29 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RMKRO-0004Re-IJ
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 07:08:22 -0700
X-Env-Sender: hui.lv@intel.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1320415694!1969911!1
X-Originating-IP: [143.182.124.37]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7120 invoked from network); 4 Nov 2011 14:08:15 -0000
Received: from mga14.intel.com (HELO mga14.intel.com) (143.182.124.37)
	by server-2.tower-182.messagelabs.com with SMTP;
	4 Nov 2011 14:08:15 -0000
Received: from azsmga001.ch.intel.com ([10.2.17.19])
	by azsmga102.ch.intel.com with ESMTP; 04 Nov 2011 07:08:14 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.69,455,1315206000"; d="scan'208";a="70577453"
Received: from pgsmsx602.gar.corp.intel.com ([10.221.43.81])
	by azsmga001.ch.intel.com with ESMTP; 04 Nov 2011 07:08:12 -0700
Received: from pgsmsx151.gar.corp.intel.com (172.30.236.41) by
	pgsmsx602.gar.corp.intel.com (10.221.43.81) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Fri, 4 Nov 2011 22:08:11 +0800
Received: from shsmsx602.ccr.corp.intel.com (10.239.4.104) by
	PGSMSX151.gar.corp.intel.com (172.30.236.41) with Microsoft SMTP Server
	(TLS) id 14.1.323.3; Fri, 4 Nov 2011 22:08:11 +0800
Received: from shsmsx502.ccr.corp.intel.com ([10.239.4.96]) by
	SHSMSX602.ccr.corp.intel.com ([10.239.4.104]) with mapi; Fri, 4 Nov 2011
	22:08:10 +0800
From: "Lv, Hui" <hui.lv@intel.com>
To: George Dunlap <George.Dunlap@eu.citrix.com>
Date: Fri, 4 Nov 2011 22:08:08 +0800
Subject: RE: [Xen-devel] [PATCH] scheduler rate controller
Thread-Topic: [Xen-devel] [PATCH] scheduler rate controller
Thread-Index: AcyZ4Rf7B2HWuje3SsSqNqOisGKDgwBFob7w
Message-ID: <C10D3FB0CD45994C8A51FEC1227CE22F34D480385E@shsmsx502.ccr.corp.intel.com>
References: <C10D3FB0CD45994C8A51FEC1227CE22F340768D793@shsmsx502.ccr.corp.intel.com>
	<CAFLBxZZ9nqeb7CVqTZCsEtJRjgGMTHF2Ak929kvauj2KUFSOyg@mail.gmail.com>
	<C10D3FB0CD45994C8A51FEC1227CE22F3428CB5EF9@shsmsx502.ccr.corp.intel.com>
	<1319789425.19320.12.camel@Abyss>
	<C10D3FB0CD45994C8A51FEC1227CE22F3428CB61F2@shsmsx502.ccr.corp.intel.com>
	<1319796584.19320.31.camel@Abyss>	<1319818714.21033.414.camel@elijah>
	<C10D3FB0CD45994C8A51FEC1227CE22F34B3905D03@shsmsx502.ccr.corp.intel.com>
	<CAFLBxZa5v_YgnC1LTa4a5wis4h6eQPijCAfUDLDsR4ucMuBXWg@mail.gmail.com>
In-Reply-To: <CAFLBxZa5v_YgnC1LTa4a5wis4h6eQPijCAfUDLDsR4ucMuBXWg@mail.gmail.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
MIME-Version: 1.0
Cc: "Tian, Kevin" <kevin.tian@intel.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, "Keir
	\(Xen.org\)" <keir@xen.org>, "Dong, Eddie" <eddie.dong@intel.com>,
	George Dunlap <george.dunlap@citrix.com>, "Duan, 
	Jiangang" <jiangang.duan@intel.com>, Dario Faggioli <raistlin@linux.it>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1402646291=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1402646291==
Content-Language: en-US
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

PiANCj4gSGV5IEh1aSwgIFNvcnJ5IGZvciB0aGUgZGVsYXkgaW4gcmVzcG9uc2UgLS0gRllJIEkn
bSBhdCB0aGUgWGVuU3VtbWl0IEtvcmVhDQo+IG5vdywgYW5kIEknbGwgYmUgb24gaG9saWRheSBu
ZXh0IHdlZWsuDQo+IA0KDQpIYXZlIGEgZ29vZCB0cmlwIGluIEtvcmVhIGFuZCB0aGUgZm9sbG93
aW5nIGhvbGlkYXkhIEFuZCBTYXkgSGkgdG8gZXZlcnlvbmUgdGhlcmXjgIIg77ya77yJDQoNCj4g
SSdtIGF0dGFjaGluZyBhIHByb3RvdHlwZSBtaW5pbXVtIHRpbWVzbGljZSBwYXRjaCB0aGF0IEkg
dGhyZXcgdG9nZXRoZXIgbGFzdA0KPiB3ZWVrLiAgSXQgY3VycmVudGx5IGhhbmdzIGR1cmluZyBi
b290LCBidXQgaXQgd2lsbCBnaXZlIHlvdSB0aGUgaWRlYSBvZiB3aGF0IEkNCj4gd2FzIHRoaW5r
aW5nIG9mLg0KPiANCj4gSHVpLCBjYW4geW91IGxldCBtZSBrbm93IHdoYXQgeW91IHRoaW5rIG9m
IHRoZSBpZGVhLCBhbmQgaWYgeW91IGZpbmQgaXQNCj4gaW50ZXJlc3RpbmcsIGNvdWxkIHlvdSB0
cnkgdG8gZml4IGl0IHVwLCBhbmQgdGVzdCBpdD8gIFRlc3RpbmcgaXQgd2l0aCBiaWdnZXIgdmFs
dWVzDQo+IGxpa2UgNW1zIHdvdWxkIGJlIHJlYWxseSBpbnRlcmVzdGluZy4NCg0KSSBhZ3JlZSB0
aGF0IHRoaXMgaWRlYSBzZWVtcyBtb3JlIG5hdHVyYWwgYW5kIHByb3BlciwgaWYgaXQgY2FuIHNv
bHZlIHRoZSB0d28gcHJvYmxlbXMgdGhhdCBJIGFkZHJlc3NlZCBhYm92ZS4gV2UgbmVlZCBkYXRh
IHRvIHByb3ZlL2Rpc3Byb3ZlIGl0Lg0KQXMgeW91IG1lbnRpb25lZCB0aGF0LCB0aGlzIG1ldGhv
ZCBpcyBzdXBwb3NlZCB0byBoYXZlIHRoZSBzaW1pbGFyIHJlc3VsdCBhcyB0aGUgcGF0Y2ggSSBz
ZW50LCB3aGVuIHNldHRpbmcgMTBtcyBhcyB0aGUgZGVsYXkgdmFsdWUgaW4gdGhlIGV4Y2Vzc2l2
ZSBjb25kaXRpb24uDQpTbyB0aGF0LCBhbiBpZGVhIGNhbWUgdG8gbWUgdGhhdCBtYXkgZW5mb3Jj
ZSB5b3VyIHByb3Bvc2FsLA0KMS4gd2Ugc3RpbGwgY291bnQgdGhlIHNjaGVkdWxpbmcgbnVtYmVy
IGR1cmluZyBlYWNoIHBlcmlvZCAoZm9yIGV4YW1wbGUgMTBtcykNCjIuIFRoaXMgc2NoZWR1bGlu
ZyBudW1iZXIgaXMgdXNlZCB0byBhZGFwdGl2ZWx5IGRlY2lkZSB0aGUgZGVsYXkgdmFsdWUuDQpG
b3IgZXhhbXBsZSwgaWYgc2NoZWR1bGluZyBudW1iZXIgaXMgdmVyeSBleGNlc3NpdmUsIHdlIGNh
biBzZXQgbG9uZ2VyIGRlbGF5IHRpbWUsIHN1Y2ggYXMgNW1zIG9yIDEwbXMuIE9yIGlmIHRoZSBz
Y2hlZHVsaW5nIG51bWJlciBpcyBzbWFsbCwgd2UgY2FuIHNldCBzbWFsbCBkZWxheSB0aW1lLCBz
dWNoIGFzIDFtcywgNTAwdXMgb3IgZXZlbiB6ZXJvLiBJbiB0aGlzIHdheSwgdGhlIGRlbGF5IHZh
bHVlIGlzIGRlY2lkZWQgYWRhcHRpdmVseS4NCkkgdGhpbmsgSXQgY2FuIHNvbHZlIHRoZSBwb3Nz
aWJsZSBwcm9ibGVtcyB0aGF0IEkgYWRkcmVzc2VkIGFib3ZlLg0KR2VvcmdlLCBob3cgZG8geW91
IHRoaW5rIHRoaXM/DQpJJ2QgbGlrZSB0byB0cnkgdGhpcyBhbmQgc2VlIHRoZSByZXN1bHQuIE1h
eSBhbHNvIHRvIGNvbXBhcmUgdGhlIHJlc3VsdHMgYmV0d2VlbiBkaWZmZXJlbnQgc29sdXRpb25z
LiBBcyB5b3Uga25vdywgU1BFQ3ZpcnQgd29ya2xvYWRzIGlzIHRvbyBjb21wbGV4IHRoYXQgSSBu
ZWVkIHNvbWUgdGltZSB0byBwcm9kdWNlIHRoaXMgOikuDQpBbHNvIHdlIGhhdmUgYSBzZXQgb2Yg
c21hbGwgd29ya2xvYWRzIHRvIG1ha2UgcXVpY2sgdGVzdGluZy4NCg0KDQoNCg==


--===============1402646291==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1402646291==--

From xen-devel-bounces@lists.xensource.com Fri Nov 04 07:41:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 07:41:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMKxv-0006MO-UL; Fri, 04 Nov 2011 07:41:56 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMKxI-0006AP-Vb
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 07:41:17 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1320417660!44414460!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28902 invoked from network); 4 Nov 2011 14:41:01 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 14:41:01 -0000
Received: by wwf4 with SMTP id 4so2999923wwf.24
	for <xen-devel@lists.xensource.com>;
	Fri, 04 Nov 2011 07:41:13 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=VMEZ4gqTCgPtaJ8U/hD9AY6DDK4gaF5Ul9/uUnVx3m4=;
	b=WMGYrsdCdHDbnwRXCbVxazpbSDocHam5jmuVdqAwB6YyQ4FO/F7uk+p5zXbTPO+Xe+
	c8Ea0AvONe2oBJtGoW2xNp2MHvJ3iErnB+OIC5Myss7j2Yk+Y2GtA98BkYFrCMTgUpVF
	7WSnjs3xFeCTgUbhOG8Y1f9Qhk7dAzG+Yu5hw=
Received: by 10.227.206.143 with SMTP id fu15mr18267642wbb.16.1320417673610;
	Fri, 04 Nov 2011 07:41:13 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-249-120.range86-129.btcentralplus.com.
	[86.129.249.120])
	by mx.google.com with ESMTPS id q30sm16325480wbn.17.2011.11.04.07.41.10
	(version=SSLv3 cipher=OTHER); Fri, 04 Nov 2011 07:41:11 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 04 Nov 2011 14:41:02 +0000
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: fix create_irq() after c/s
	24068:6928172f7ded
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CAD9A9FE.3397E%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] x86/IRQ: fix create_irq() after c/s
	24068:6928172f7ded
Thread-Index: Acya/8Y7VSfSmuwm10KMQQ5Hsv8Vgg==
In-Reply-To: <4EB3E02B020000780005F027@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 04/11/2011 11:52, "Jan Beulich" <JBeulich@suse.com> wrote:

> init_one_irq_desc() must be called with interrupts enabled (as it may
> call functions from the xmalloc() group). Rather than mis-using
> vector_lock to also protect the finding of an unused IRQ, make this
> lockless through using cmpxchg(), and obtain the lock only around the
> actual assignment of the vector.

Looks fine to me.

Acked-by: Keir Fraser <keir@xen.org>

> Also fold find_unassigned_irq() into its only caller.
> 
> It is, btw, questionable whether create_irq() calling
> __assign_irq_vector() (rather than assign_irq_vector()) is actually
> correct - desc->affinity appears to not get initialized properly in
> this case.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> 
> --- a/xen/arch/x86/irq.c
> +++ b/xen/arch/x86/irq.c
> @@ -151,16 +151,6 @@ int __init bind_irq_vector(int irq, int
>      return ret;
>  }
>  
> -static inline int find_unassigned_irq(void)
> -{
> -    int irq;
> -
> -    for (irq = nr_irqs_gsi; irq < nr_irqs; irq++)
> -        if (irq_to_desc(irq)->arch.used == IRQ_UNUSED)
> -            return irq;
> -    return -ENOSPC;
> -}
> -
>  /*
>   * Dynamic irq allocate and deallocation for MSI
>   */
> @@ -170,19 +160,28 @@ int create_irq(void)
>      int irq, ret;
>      struct irq_desc *desc;
>  
> -    spin_lock_irqsave(&vector_lock, flags);
> +    for (irq = nr_irqs_gsi; irq < nr_irqs; irq++)
> +    {
> +        desc = irq_to_desc(irq);
> +        if (cmpxchg(&desc->arch.used, IRQ_UNUSED, IRQ_RESERVED) ==
> IRQ_UNUSED)
> +           break;
> +    }
> +
> +    if (irq >= nr_irqs)
> +         return -ENOSPC;
>  
> -    irq = find_unassigned_irq();
> -    if (irq < 0)
> -         goto out;
> -    desc = irq_to_desc(irq);
>      ret = init_one_irq_desc(desc);
>      if (!ret)
> +    {
> +        spin_lock_irqsave(&vector_lock, flags);
>          ret = __assign_irq_vector(irq, desc, TARGET_CPUS);
> +        spin_unlock_irqrestore(&vector_lock, flags);
> +    }
>      if (ret < 0)
> +    {
> +        desc->arch.used = IRQ_UNUSED;
>          irq = ret;
> -out:
> -     spin_unlock_irqrestore(&vector_lock, flags);
> +    }
>  
>      return irq;
>  }
> --- a/xen/include/asm-x86/irq.h
> +++ b/xen/include/asm-x86/irq.h
> @@ -39,12 +39,13 @@ struct irq_cfg {
>          unsigned move_cleanup_count;
>          vmask_t *used_vectors;
>          u8 move_in_progress : 1;
> -        u8 used: 1;
> +        s8 used;
>  };
>  
>  /* For use with irq_cfg.used */
>  #define IRQ_UNUSED      (0)
>  #define IRQ_USED        (1)
> +#define IRQ_RESERVED    (-1)
>  
>  #define IRQ_VECTOR_UNASSIGNED (-1)
>  
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 07:48:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 07:48:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RML4g-0006p4-Q8; Fri, 04 Nov 2011 07:48:54 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RML3r-0006cR-Qv
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 07:48:04 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1320418080!1385954!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4687 invoked from network); 4 Nov 2011 14:48:00 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-5.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 14:48:00 -0000
Received: by wyh11 with SMTP id 11so3086991wyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 04 Nov 2011 07:48:00 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=Lnhb3nBDJXx/+b2cKFtkvioHyxcY8LbDpK474Bxdk2c=;
	b=NiHWxcfFA2yItMnyj5zldXVtGkySvD+M0SYXFJFl4oXX8cef6sEi9nY5l0q3Otvg0u
	gMBdddXqQNob998VsQFSEgRAPU/EwwnyjIIg5PPLSt2iY+g4c9LKAj3LIjD1BQtrdxDq
	HnRr6v1xj6mRQ3IFySslKCUVX471F6SHPs+nk=
Received: by 10.216.81.208 with SMTP id m58mr512999wee.87.1320418080458;
	Fri, 04 Nov 2011 07:48:00 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-249-120.range86-129.btcentralplus.com.
	[86.129.249.120]) by mx.google.com with ESMTPS id
	en13sm16342967wbb.22.2011.11.04.07.47.56
	(version=SSLv3 cipher=OTHER); Fri, 04 Nov 2011 07:47:58 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 04 Nov 2011 14:47:53 +0000
Subject: Re: [Xen-devel] [PATCH 4/6] mm: Add new map space for add_to_physmap, 
	XENMAPSPACE_gmfn_range.
From: Keir Fraser <keir@xen.org>
To: Jean Guyader <jean.guyader@eu.citrix.com>, <xen-devel@lists.xensource.com>
Message-ID: <CAD9AB99.33980%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH 4/6] mm: Add new map space for
	add_to_physmap, XENMAPSPACE_gmfn_range.
Thread-Index: AcybALs0NNTtoqZAkkee/dFJkryk/A==
In-Reply-To: <1320403109-8739-5-git-send-email-jean.guyader@eu.citrix.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: tim@xen.org, allen.m.kay@intel.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 04/11/2011 10:38, "Jean Guyader" <jean.guyader@eu.citrix.com> wrote:

> 
> XENMAPSPACE_gmfn_range is like XENMAPSPACE_gmfn but with a size which
> is the number of pages on which xen will iterate.

You can't really extend the size of an existing ABI structure, and always
copy that extended size. Older guests won't know to guarantee that the
extended space is accessible. I suggest you make your new field a uint16_t,
placed directly after the domid field. Then you are making use of existing
pad space. 64k pages = 256MB at a time should be plenty of amortisation.

And, even with the reduced field width, I could imagine 64k remappings
taking a good while. The remapping loop should regularly (even every
iteration) check hypercall_preempt_check(), then
hypercall_create_continuation() and exit if the hypercall is being requested
to voluntarily yield.

 -- Keir

> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> ---
>  xen/arch/x86/mm.c           |   15 ++++++++++++++-
>  xen/include/public/memory.h |    4 ++++
>  2 files changed, 18 insertions(+), 1 deletions(-)
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 07:52:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 07:52:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RML7p-0007FC-OD; Fri, 04 Nov 2011 07:52:09 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RML7F-00072k-Pf
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 07:51:34 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1320418290!1970877!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25334 invoked from network); 4 Nov 2011 14:51:30 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 14:51:30 -0000
X-IronPort-AV: E=Sophos;i="4.69,455,1315180800"; 
   d="scan'208";a="8765223"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 14:51:30 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 14:51:29 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RML7B-0004Xm-Jt; Fri, 04 Nov 2011 14:51:29 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RML7B-0000Tp-IR;
	Fri, 04 Nov 2011 14:51:29 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20147.64497.541621.940528@mariner.uk.xensource.com>
Date: Fri, 4 Nov 2011 14:51:29 +0000
To: Anthony PERARD <anthony.perard@citrix.com>
Subject: Re: [Xen-devel] [PATCH V3 11/13] libxl: Use QMP to insert a
	passthrough device when using upstream QEMU
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1320163646-24291-12-git-send-email-anthony.perard@citrix.com>
References: <1320163646-24291-1-git-send-email-anthony.perard@citrix.com>
	<1320163646-24291-12-git-send-email-anthony.perard@citrix.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Anthony PERARD writes ("[Xen-devel] [PATCH V3 11/13] libxl: Use QMP to insert a passthrough device when using upstream QEMU"):
> Also move the xenstore specific code to a new function and add a
> message if sscanf fails.

Thanks, following discussion I've applied 10,11 and will wait with 12
for the rebase of 13.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 07:53:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 07:53:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RML8h-0007bt-7A; Fri, 04 Nov 2011 07:53:03 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RML7z-0007HE-S0
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 07:52:20 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1320418336!1961383!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28064 invoked from network); 4 Nov 2011 14:52:16 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 14:52:16 -0000
Received: by wwf4 with SMTP id 4so3015167wwf.24
	for <xen-devel@lists.xensource.com>;
	Fri, 04 Nov 2011 07:52:13 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=NR/7Jd5AePzBrwHQuCZfIAUMXoLWtYmvfK4flzKOoaU=;
	b=OL3pvyR0mWVsqbr7nW+v16sqiMZK1WrZmNgCGHrWk6aHXSyZW0Bnq89GQ+8DcZZXAS
	bD7T5TUWUervkOmjrQ4RP/fMs2ZUJa11/Xrjqg0YMYkLTZ/k8ktT89HCkOBAhUN6KuM9
	zWOONJGFnaUe8qnwKkxTpGaYA11DGGVqscnCU=
Received: by 10.216.9.135 with SMTP id 7mr4297122wet.100.1320418333477;
	Fri, 04 Nov 2011 07:52:13 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-249-120.range86-129.btcentralplus.com.
	[86.129.249.120])
	by mx.google.com with ESMTPS id y38sm16435537wbm.2.2011.11.04.07.52.06
	(version=SSLv3 cipher=OTHER); Fri, 04 Nov 2011 07:52:10 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 04 Nov 2011 14:52:03 +0000
Subject: Re: [Xen-devel] [PATCH 5/6] hvmloader: Change memory relocation loop
	when overlap with PCI hole.
From: Keir Fraser <keir@xen.org>
To: Jean Guyader <jean.guyader@eu.citrix.com>, <xen-devel@lists.xensource.com>
Message-ID: <CAD9AC93.33982%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH 5/6] hvmloader: Change memory relocation loop
	when overlap with PCI hole.
Thread-Index: AcybAVA3vof20DN6EkWp0KTZ2ihH4w==
In-Reply-To: <1320403109-8739-6-git-send-email-jean.guyader@eu.citrix.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: tim@xen.org, allen.m.kay@intel.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 04/11/2011 10:38, "Jean Guyader" <jean.guyader@eu.citrix.com> wrote:

> 
> Change the way we relocate the memory page if they overlap with pci hole.
> Use new map space (XENMAPSPACE_gmfn_range) to move the loop into xen.
> 
> This code usually get triggered when a device is pass through to a guest
> and the PCI hole has to be extended to have enough room to map the device
> BARs.
> The PCI hole will starts lower and it might overlap with some RAM that has
> been
> alocated for the guest. That usually happen if the guest has more than 4G of
> RAM.
> We have to relocate those pages in high mem otherwise they won't be
> accessible.

If the size field in the add_to_physmap structure is reduced to 16 bits, the
new if() stmt will probably have to become a while() again.

The new printf's are just excess verbiage. We dump the memory map as we exit
hvmloader anyway.

 -- Keir

> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> ---
>  tools/firmware/hvmloader/pci.c |   20 ++++++++++++++------
>  1 files changed, 14 insertions(+), 6 deletions(-)
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 08:02:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 08:02:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMLHb-00089Z-72; Fri, 04 Nov 2011 08:02:16 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMLDj-0007t3-Rn
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 07:58:21 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1320418678!318888!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22800 invoked from network); 4 Nov 2011 14:58:00 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-14.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 14:58:00 -0000
X-IronPort-AV: E=Sophos;i="4.69,455,1315195200"; d="scan'208";a="169431145"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 10:57:54 -0400
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 10:57:54 -0400
Received: from perard.uk.xensource.com (dhcp-3-28.uk.xensource.com
	[10.80.3.28] (may be forged))	by smtp01.ad.xensource.com
	(8.13.1/8.13.1) with
	ESMTP id pA4EvqQv027358;	Fri, 4 Nov 2011 07:57:53 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Fri, 4 Nov 2011 14:57:46 +0000
Message-ID: <1320418667-16259-1-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH V3 REBASE 1/2] libxl_qmp: Introduce
	libxl__qmp_pci_del
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

To remove a pci passthough device from QEMU (upstream).

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/libxl/libxl_internal.h |    2 ++
 tools/libxl/libxl_qmp.c      |   35 +++++++++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 0 deletions(-)

diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 1dff211..84da6b1 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -526,6 +526,8 @@ _hidden libxl__qmp_handler *libxl__qmp_initialize(libxl_ctx *ctx,
 /* ask to QEMU the serial port information and store it in xenstore. */
 _hidden int libxl__qmp_query_serial(libxl__qmp_handler *qmp);
 _hidden int libxl__qmp_pci_add(libxl__gc *gc, int d, libxl_device_pci *pcidev);
+_hidden int libxl__qmp_pci_del(libxl__gc *gc, int domid,
+                               libxl_device_pci *pcidev);
 /* close and free the QMP handler */
 _hidden void libxl__qmp_close(libxl__qmp_handler *qmp);
 /* remove the socket file, if the file has already been removed,
diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
index eb5b6c2..2c63786 100644
--- a/tools/libxl/libxl_qmp.c
+++ b/tools/libxl/libxl_qmp.c
@@ -713,6 +713,41 @@ int libxl__qmp_pci_add(libxl__gc *gc, int domid, libxl_device_pci *pcidev)
     return rc;
 }
 
+static int qmp_device_del(libxl__gc *gc, int domid, char *id)
+{
+    libxl__qmp_handler *qmp = NULL;
+    flexarray_t *parameters = NULL;
+    libxl_key_value_list args = NULL;
+    int rc = 0;
+
+    qmp = libxl__qmp_initialize(libxl__gc_owner(gc), domid);
+    if (!qmp)
+        return ERROR_FAIL;
+
+    parameters = flexarray_make(2, 1);
+    flexarray_append_pair(parameters, "id", id);
+    args = libxl__xs_kvs_of_flexarray(gc, parameters, parameters->count);
+    if (!args)
+        return ERROR_NOMEM;
+
+    rc = qmp_synchronous_send(qmp, "device_del", &args,
+                              NULL, NULL, qmp->timeout);
+
+    flexarray_free(parameters);
+    libxl__qmp_close(qmp);
+    return rc;
+}
+
+int libxl__qmp_pci_del(libxl__gc *gc, int domid, libxl_device_pci *pcidev)
+{
+    char *id = NULL;
+
+    id = libxl__sprintf(gc, PCI_PT_QDEV_ID,
+                        pcidev->bus, pcidev->dev, pcidev->func);
+
+    return qmp_device_del(gc, domid, id);
+}
+
 int libxl__qmp_initializations(libxl_ctx *ctx, uint32_t domid)
 {
     libxl__qmp_handler *qmp = NULL;
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 08:06:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 08:06:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMLLM-00007u-HH; Fri, 04 Nov 2011 08:06:08 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMLDj-0007t6-Ro
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 07:58:21 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1320418678!318888!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22876 invoked from network); 4 Nov 2011 14:58:00 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-14.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 14:58:00 -0000
X-IronPort-AV: E=Sophos;i="4.69,455,1315195200"; d="scan'208";a="169431171"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 10:57:59 -0400
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 10:57:59 -0400
Received: from perard.uk.xensource.com (dhcp-3-28.uk.xensource.com
	[10.80.3.28] (may be forged))	by smtp01.ad.xensource.com
	(8.13.1/8.13.1) with
	ESMTP id pA4EvqQw027358;	Fri, 4 Nov 2011 07:57:58 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Fri, 4 Nov 2011 14:57:47 +0000
Message-ID: <1320418667-16259-2-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1320418667-16259-1-git-send-email-anthony.perard@citrix.com>
References: <1320418667-16259-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH V3 REBASE 2/2] libxl: Remove a passthrough
	device through QMP.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/libxl/libxl_pci.c |   72 +++++++++++++++++++++++++++++++---------------
 1 files changed, 48 insertions(+), 24 deletions(-)

diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
index 2262510..4186cf8 100644
--- a/tools/libxl/libxl_pci.c
+++ b/tools/libxl/libxl_pci.c
@@ -863,13 +863,45 @@ out:
     return rc;
 }
 
+static int qemu_pci_remove_xenstore(libxl__gc *gc, uint32_t domid,
+                                    libxl_device_pci *pcidev, int force)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    char *state;
+    char *path;
+
+    path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
+    state = libxl__xs_read(gc, XBT_NULL, path);
+    path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/parameter", domid);
+    libxl__xs_write(gc, XBT_NULL, path, PCI_BDF, pcidev->domain,
+                    pcidev->bus, pcidev->dev, pcidev->func);
+    path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/command", domid);
+
+    /* Remove all functions at once atomically by only signalling
+     * device-model for function 0 */
+    if ( !force && (pcidev->vdevfn & 0x7) == 0 ) {
+        xs_write(ctx->xsh, XBT_NULL, path, "pci-rem", strlen("pci-rem"));
+        if (libxl__wait_for_device_model(gc, domid, "pci-removed",
+                                         NULL, NULL, NULL) < 0) {
+            LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Device Model didn't respond in time");
+            /* This depends on guest operating system acknowledging the
+             * SCI, if it doesn't respond in time then we may wish to
+             * force the removal.
+             */
+            return ERROR_FAIL;
+        }
+    }
+    path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
+    xs_write(ctx->xsh, XBT_NULL, path, state, strlen(state));
+
+    return 0;
+}
+
 static int do_pci_remove(libxl__gc *gc, uint32_t domid,
                          libxl_device_pci *pcidev, int force)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     libxl_device_pci *assigned;
-    char *path;
-    char *state;
     int hvm = 0, rc, num;
     int stubdomid = 0;
 
@@ -892,29 +924,21 @@ static int do_pci_remove(libxl__gc *gc, uint32_t domid,
                                          NULL, NULL, NULL) < 0)
             goto out_fail;
 
-        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
-        state = libxl__xs_read(gc, XBT_NULL, path);
-        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/parameter", domid);
-        libxl__xs_write(gc, XBT_NULL, path, PCI_BDF, pcidev->domain,
-                       pcidev->bus, pcidev->dev, pcidev->func);
-        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/command", domid);
-
-        /* Remove all functions at once atomically by only signalling
-         * device-model for function 0 */
-        if ( !force && (pcidev->vdevfn & 0x7) == 0 ) {
-            xs_write(ctx->xsh, XBT_NULL, path, "pci-rem", strlen("pci-rem"));
-            if (libxl__wait_for_device_model(gc, domid, "pci-removed",
-                                             NULL, NULL, NULL) < 0) {
-                LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Device Model didn't respond in time");
-                /* This depends on guest operating system acknowledging the
-                 * SCI, if it doesn't respond in time then we may wish to
-                 * force the removal.
-                 */
-                goto out_fail;
-            }
+        switch (libxl__device_model_version_running(gc, domid)) {
+        case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL:
+            rc = qemu_pci_remove_xenstore(gc, domid, pcidev, force);
+            break;
+        case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN:
+            rc = libxl__qmp_pci_del(gc, domid, pcidev);
+            break;
+        default:
+            rc = ERROR_INVAL;
+            goto out_fail;
+        }
+        if (rc) {
+            rc = ERROR_FAIL;
+            goto out_fail;
         }
-        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
-        xs_write(ctx->xsh, XBT_NULL, path, state, strlen(state));
         break;
     case LIBXL_DOMAIN_TYPE_PV:
     {
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 08:19:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 08:19:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMLYP-00022b-RS; Fri, 04 Nov 2011 08:19:37 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMLK7-0008N2-Td
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 08:04:53 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1320418972!43109485!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12954 invoked from network); 4 Nov 2011 15:02:52 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-14.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 4 Nov 2011 15:02:52 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 04 Nov 2011 15:04:48 +0000
Message-Id: <4EB40D3C020000780005F192@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 04 Nov 2011 15:05:16 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Keir Fraser" <keir@xen.org>
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: fix create_irq() after c/s
	24068:6928172f7ded
References: <4EB3E02B020000780005F027@nat28.tlf.novell.com>
	<CAD9A9FE.3397E%keir@xen.org>
In-Reply-To: <CAD9A9FE.3397E%keir@xen.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: andrew.cooper3@citrix.com,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Haitao Shan <haitao.shan@intel.com>, xiantao.zhang@intel.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 04.11.11 at 15:41, Keir Fraser <keir@xen.org> wrote:
> On 04/11/2011 11:52, "Jan Beulich" <JBeulich@suse.com> wrote:
>=20
>> init_one_irq_desc() must be called with interrupts enabled (as it may
>> call functions from the xmalloc() group). Rather than mis-using
>> vector_lock to also protect the finding of an unused IRQ, make this
>> lockless through using cmpxchg(), and obtain the lock only around the
>> actual assignment of the vector.
>=20
> Looks fine to me.
>=20
> Acked-by: Keir Fraser <keir@xen.org>
>=20
>> Also fold find_unassigned_irq() into its only caller.
>>=20
>> It is, btw, questionable whether create_irq() calling
>> __assign_irq_vector() (rather than assign_irq_vector()) is actually
>> correct - desc->affinity appears to not get initialized properly in
>> this case.

Any thought on this one? Adjusting this would have the nice side
effect of the function no longer explicitly acquiring vector_lock.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 08:37:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 08:37:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMLpQ-0002pE-Qi; Fri, 04 Nov 2011 08:37:12 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMLnn-0002bM-CD
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 08:35:32 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1320420928!323497!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9030 invoked from network); 4 Nov 2011 15:35:28 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 15:35:28 -0000
X-IronPort-AV: E=Sophos;i="4.69,456,1315180800"; 
   d="scan'208";a="8766504"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 15:35:27 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 15:35:27 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RMLnj-0004n2-AV; Fri, 04 Nov 2011 15:35:27 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RMLnj-0000eb-9M;
	Fri, 04 Nov 2011 15:35:27 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20148.1599.278038.366167@mariner.uk.xensource.com>
Date: Fri, 4 Nov 2011 15:35:27 +0000
To: Anthony PERARD <anthony.perard@citrix.com>
In-Reply-To: <1320418667-16259-2-git-send-email-anthony.perard@citrix.com>
References: <1320418667-16259-1-git-send-email-anthony.perard@citrix.com>
	<1320418667-16259-2-git-send-email-anthony.perard@citrix.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH V3 REBASE 2/2] libxl: Remove a passthrough
 device through QMP.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Anthony PERARD writes ("[PATCH V3 REBASE 2/2] libxl: Remove a passthrough device through QMP."):
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>

Applied these last two now too, thanks.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 09:23:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 09:23:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMMYh-0005MY-Cr; Fri, 04 Nov 2011 09:23:59 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMMXy-0005AV-RF
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 09:23:15 -0700
X-Env-Sender: lucianobarreto@gmail.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1320423788!2948309!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21550 invoked from network); 4 Nov 2011 16:23:08 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-15.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 16:23:08 -0000
Received: by wyh11 with SMTP id 11so3207837wyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 04 Nov 2011 09:23:07 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=IcWaTqknWRtExTrvyM9P8+QVXtbnRoOUT76PWTGHGMU=;
	b=hi75M3iFRuckI1Q0ic8ICqRREG5X72oZE45OW6z8zIxQ4e41X9vlpBZBbN2Co4LWOt
	4S+Uvyydps5H9FYhkGYhmN/EEBNPwpFmkrrZ1iutZzy8NMrRnAau06MasE5FdSW6G0dk
	B1Ux1oExMHYTOjyQEQAQY7/Pc1hFc3ZxrQIDM=
MIME-Version: 1.0
Received: by 10.227.203.132 with SMTP id fi4mr19569765wbb.6.1320423787684;
	Fri, 04 Nov 2011 09:23:07 -0700 (PDT)
Received: by 10.227.165.65 with HTTP; Fri, 4 Nov 2011 09:23:07 -0700 (PDT)
Date: Fri, 4 Nov 2011 14:23:07 -0200
Message-ID: <CAPiSOA59agvmTHccaXvmcgcDobNeesoR_kJE2qnerS6jyOL__w@mail.gmail.com>
From: Luciano Barreto <lucianobarreto@gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1
Subject: [Xen-devel] XenStore Devel Help
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi guys, I'm trying to develop a library to access XenStore via Java
Application (Academic purposes) but I have not a lot experiencie in C
or how to do that. Anyone here have an example of how to access
XenStore using the library "xs.h". I found an example over the
internet but I'm havig any compilation problems.Thanks

-- 
Luciano Barreto

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 09:35:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 09:35:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMMjt-0005y0-ET; Fri, 04 Nov 2011 09:35:33 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMMih-0005jx-1o
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 09:34:19 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320424423!44691968!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6571 invoked from network); 4 Nov 2011 16:33:43 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 16:33:43 -0000
Received: by wyh11 with SMTP id 11so3221551wyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 04 Nov 2011 09:34:15 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=NRf+j6UbEd/cSQztbdd5zP5mQzcaJzrFp32cOq94gG0=;
	b=cIo+8C5BV8v/H0O0eQnfmGWdvmSAzvRlmz9valGAwRRcX3QThPQpkYCOt/+VDS8Epu
	13nSGZr6REaRLv5qITQ8Gc+3WCPpeZKKd20DOnM3d0ZUCrV3TSno8ra8w2dJQhESh0Qq
	9zMWaRD9ITZIk3wZlUN03mw8/EYsGt/hIQBlk=
Received: by 10.216.133.217 with SMTP id q67mr3347507wei.97.1320424455715;
	Fri, 04 Nov 2011 09:34:15 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-249-120.range86-129.btcentralplus.com.
	[86.129.249.120]) by mx.google.com with ESMTPS id
	fy13sm16851867wbb.18.2011.11.04.09.34.13
	(version=SSLv3 cipher=OTHER); Fri, 04 Nov 2011 09:34:14 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 04 Nov 2011 16:34:10 +0000
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: fix create_irq() after c/s
	24068:6928172f7ded
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <CAD9C482.339F3%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] x86/IRQ: fix create_irq() after c/s
	24068:6928172f7ded
Thread-Index: AcybD5QxEWGXzPIiakiTff9ddZOxyw==
In-Reply-To: <4EB40D3C020000780005F192@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: andrew.cooper3@citrix.com,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Haitao Shan <haitao.shan@intel.com>, xiantao.zhang@intel.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 04/11/2011 15:05, "Jan Beulich" <JBeulich@suse.com> wrote:

>>>> On 04.11.11 at 15:41, Keir Fraser <keir@xen.org> wrote:
>> On 04/11/2011 11:52, "Jan Beulich" <JBeulich@suse.com> wrote:
>> 
>>> init_one_irq_desc() must be called with interrupts enabled (as it may
>>> call functions from the xmalloc() group). Rather than mis-using
>>> vector_lock to also protect the finding of an unused IRQ, make this
>>> lockless through using cmpxchg(), and obtain the lock only around the
>>> actual assignment of the vector.
>> 
>> Looks fine to me.
>> 
>> Acked-by: Keir Fraser <keir@xen.org>
>> 
>>> Also fold find_unassigned_irq() into its only caller.
>>> 
>>> It is, btw, questionable whether create_irq() calling
>>> __assign_irq_vector() (rather than assign_irq_vector()) is actually
>>> correct - desc->affinity appears to not get initialized properly in
>>> this case.
> 
> Any thought on this one? Adjusting this would have the nice side
> effect of the function no longer explicitly acquiring vector_lock.

I would agree it should call assign_irq_vector(). It was probably only
taking the lock itself, and thus using __assign_irq_vector(), to avoid the
irq it found in find_unassigned_irq() being stolen. That can't happen now
you reserve it via cmpxchg.

 -- Keir

> Jan
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 10:26:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 10:26:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMNXI-00021K-QL; Fri, 04 Nov 2011 10:26:37 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMNUx-0001nU-2V
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 10:24:13 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1320427447!1977446!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30306 invoked from network); 4 Nov 2011 17:24:07 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 17:24:07 -0000
X-IronPort-AV: E=Sophos;i="4.69,456,1315180800"; 
   d="scan'208";a="8768651"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 17:24:07 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 17:24:06 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RMNFp-0005Jg-PB;
	Fri, 04 Nov 2011 17:08:33 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RMNFp-0007q5-OB;
	Fri, 04 Nov 2011 17:08:33 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9695-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 4 Nov 2011 17:08:33 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9695: regressions - trouble:
	broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9695 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9695/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-pcipt-intel  5 xen-boot                fail REGR. vs. 9661
 test-amd64-i386-rhel6hvm-intel  3 host-install(3)              broken
 test-amd64-amd64-pv           5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-rhel6hvm-amd  5 xen-boot                   fail REGR. vs. 9661
 test-i386-i386-pv             5 xen-boot                   fail REGR. vs. 9661
 test-i386-i386-xl             5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl            5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl-credit2    5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-xl           5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-pv            5 xen-boot                   fail REGR. vs. 9661
 test-amd64-i386-xl-multivcpu  5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-pair         8 xen-boot/dst_host          fail REGR. vs. 9661
 test-amd64-amd64-pair         7 xen-boot/src_host          fail REGR. vs. 9661
 test-i386-i386-pair           7 xen-boot/src_host          fail REGR. vs. 9661
 test-i386-i386-pair           8 xen-boot/dst_host          fail REGR. vs. 9661
 test-amd64-i386-pair          8 xen-boot/dst_host          fail REGR. vs. 9661
 test-amd64-i386-pair          7 xen-boot/src_host          fail REGR. vs. 9661
 test-amd64-i386-win-vcpus1    3 host-install(3)              broken
 test-amd64-i386-xl-win-vcpus1  5 xen-boot                  fail REGR. vs. 9661
 test-i386-i386-xl-win         3 host-install(3)              broken
 test-amd64-i386-win           5 xen-boot                   fail REGR. vs. 9661
 test-i386-i386-win            5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-win          5 xen-boot                   fail REGR. vs. 9661
 test-amd64-amd64-xl-win       5 xen-boot                   fail REGR. vs. 9661

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-sedf      5 xen-boot                     fail    like 9661

version targeted for testing:
 xen                  974b00c7c2d0
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               broken  
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        fail    
 test-amd64-i386-pair                                         fail    
 test-i386-i386-pair                                          fail    
 test-amd64-amd64-pv                                          fail    
 test-amd64-i386-pv                                           fail    
 test-i386-i386-pv                                            fail    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   broken  
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        broken  


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24080:974b00c7c2d0
tag:         tip
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: Use QMP to insert a passthrough device when using upstream QEMU
    
    Also move the xenstore specific code to a new function and add a
    message if sscanf fails.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24079:a67944b1adfb
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_add.
    
    This function insert a PCI passthrough device in qemu.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24078:c5fe74068253
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_json: Handle number above LONG_MAX.
    
    The integers are now "long long" in the json_object.
    
    If a number (decimal or integer) is too big (or too low), it is stored as it in
    a string. So for that, we introduce a new type JSON_NUMBER.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24077:8d06378f1487
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_qmp: Introduce qmp_request_context.
    
    This structure helps to track the return code of a callback. It's only used
    between qmp_synchronous_send and qmp_send.
    
    Now, qmp_synchronous_send will return the rc of the callback if there is no
    error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24076:0406f6783c65
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Always insert a command id in the callback_list.
    
    Because the function qmp_synchronous_send rely on the presence of the id
    in the callback_list.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24075:918a2091c181
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Introduce list of arguments to qmp_send
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24074:9641b7594ed6
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl_qmp: Introduce an opaque argument to the callbacks.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24073:7b22d2f98302
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl: Introduce dm-version xenstore key.
    
    The all key is /libxl/$domid/dm-version.
    
    The /libxl/$domid dir is created with the domain and should be only accessible
    by the toolstack domain. The function libxl__xs_libxl_path() give this path.
    
    This come with libxl__device_model_version_running() helper function.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24072:cf8924724b61
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Better error message after a parse error.
    
    By setting the next string to parse after having printed any error messages.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24071:bdbd100b28ae
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_json: Check the parser status before to call parse_complete
    
    Also, use goto to handle an error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24070:e0b6b0e68e90
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Fix return check of fcntl
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24069:801ca6c0fbfa
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:28:41 2011 +0100
    
    x86/IRQ: consolidate IRQ disabling when acquiring vector lock
    
    __assign_irq_vector() doesn't need to disable interrupts (its callers
    are required to when acquiring the lock), and set_desc_affinity() can
    use the normal spin lock primitives.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24068:6928172f7ded
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:27:38 2011 +0100
    
    IRQ: allocate CPU masks dynamically
    
    This includes delaying the initialization of dynamically created IRQs
    until their actual first use and some further elimination of uses of
    struct irq_cfg.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24067:17ee4c213438
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 10:50:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 10:50:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMNuf-0002oP-7z; Fri, 04 Nov 2011 10:50:45 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMNth-0002bg-5L
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 10:49:45 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1320428980!1985353!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2067 invoked from network); 4 Nov 2011 17:49:41 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-7.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Nov 2011 17:49:41 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA4HnWfQ012209
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 4 Nov 2011 17:49:35 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA4HnVjV021363
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 4 Nov 2011 17:49:32 GMT
Received: from abhmt118.oracle.com (abhmt118.oracle.com [141.146.116.70])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA4HnQjJ024951; Fri, 4 Nov 2011 12:49:26 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 04 Nov 2011 10:49:25 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id B5523824DC; Fri,  4 Nov 2011 13:49:24 -0400 (EDT)
Date: Fri, 4 Nov 2011 13:49:24 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Subject: Re: [Xen-devel] [PATCH V3 02/10] Introduce HostPCIDevice to access a
	pci device on the host.
Message-ID: <20111104174924.GA21390@phenom.dumpdata.com>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-3-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319814456-8158-3-git-send-email-anthony.perard@citrix.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090206.4EB425AF.0127,ss=1,re=-2.300,fgs=0
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> +static unsigned long get_value(HostPCIDevice *d, const char *name)
> +{
> +    char path[PATH_MAX];
> +    FILE *f;
> +    unsigned long value;
> +
> +    path_to(d, name, path, sizeof (path));
> +    f = fopen(path, "r");
> +    if (!f) {
> +        fprintf(stderr, "Error: Can't open %s: %s\n", path, strerror(errno));
> +        return -1;

So the decleration is 'unsigned long' but you return -1 here.

Should the decleration be 'signed long' ?

Or perhaps return the value as parameter and return zero for success
and <= 0 for failure?

> +    }
> +    if (fscanf(f, "%lx\n", &value) != 1) {
> +        fprintf(stderr, "Error: Syntax error in %s\n", path);
> +        value = -1;
> +    }
> +    fclose(f);
> +    return value;
> +}
> +
> +static int pci_dev_is_virtfn(HostPCIDevice *d)
> +{
> +    int rc;
> +    char path[PATH_MAX];
> +    struct stat buf;
> +
> +    path_to(d, "physfn", path, sizeof (path));
> +    rc = !stat(path, &buf);

> +
> +    return rc;

Seems like this could be a 'bool'?

> +}
> +
> +static int host_pci_config_fd(HostPCIDevice *d)
> +{
> +    char path[PATH_MAX];
> +
> +    if (d->config_fd < 0) {
> +        path_to(d, "config", path, sizeof (path));
> +        d->config_fd = open(path, O_RDWR);
> +        if (d->config_fd < 0) {
> +            fprintf(stderr, "HostPCIDevice: Can not open '%s': %s\n",
> +                    path, strerror(errno));
> +        }
> +    }
> +    return d->config_fd;
> +}
> +static int host_pci_config_read(HostPCIDevice *d, int pos, void *buf, int len)
> +{
> +    int fd = host_pci_config_fd(d);
> +    int res = 0;
> +
> +    res = pread(fd, buf, len, pos);
> +    if (res < 0) {
> +        fprintf(stderr, "host_pci_config: read failed: %s (fd: %i)\n",
> +                strerror(errno), fd);
> +        return -1;
> +    }
> +    return res;
> +}
> +static int host_pci_config_write(HostPCIDevice *d,
> +                                 int pos, const void *buf, int len)
> +{
> +    int fd = host_pci_config_fd(d);
> +    int res = 0;
> +
> +    res = pwrite(fd, buf, len, pos);
> +    if (res < 0) {
> +        fprintf(stderr, "host_pci_config: write failed: %s\n",
> +                strerror(errno));
> +        return -1;
> +    }
> +    return res;
> +}
> +
> +uint8_t host_pci_get_byte(HostPCIDevice *d, int pos)
> +{
> +  uint8_t buf;
> +  host_pci_config_read(d, pos, &buf, 1);

Not checking the return value?
> +  return buf;
> +}
> +uint16_t host_pci_get_word(HostPCIDevice *d, int pos)
> +{
> +  uint16_t buf;
> +  host_pci_config_read(d, pos, &buf, 2);

Here as well?
> +  return le16_to_cpu(buf);

So if we can't read those buffers, won't that mean we end up with
garbage in buf? As we haven't actually written anything to it?

Perhaps we should do:

 if (host_pci..() < 0)
	return 0;
 ... normal case?

> +}
> +uint32_t host_pci_get_long(HostPCIDevice *d, int pos)
> +{
> +  uint32_t buf;
> +  host_pci_config_read(d, pos, &buf, 4);
> +  return le32_to_cpu(buf);
> +}
> +int host_pci_get_block(HostPCIDevice *d, int pos, uint8_t *buf, int len)
> +{
> +  return host_pci_config_read(d, pos, buf, len);

Oh, so that is called.. Hm, not much chance of returning an error there is.

Can we propage the errors in case there is some fundamental failure
when reading/writting the data stream? Say the PCI device gets
unplugged by the user.. won't pread return -EXIO?

> +}
> +
> +int host_pci_set_byte(HostPCIDevice *d, int pos, uint8_t data)
> +{
> +  return host_pci_config_write(d, pos, &data, 1);
> +}
> +int host_pci_set_word(HostPCIDevice *d, int pos, uint16_t data)
> +{
> +  data = cpu_to_le16(data);
> +  return host_pci_config_write(d, pos, &data, 2);
> +}
> +int host_pci_set_long(HostPCIDevice *d, int pos, uint32_t data)
> +{
> +  data = cpu_to_le32(data);
> +  return host_pci_config_write(d, pos, &data, 4);
> +}
> +int host_pci_set_block(HostPCIDevice *d, int pos, uint8_t *buf, int len)
> +{
> +  return host_pci_config_write(d, pos, buf, len);
> +}
> +
> +uint32_t host_pci_find_ext_cap_offset(HostPCIDevice *d, uint32_t cap)
> +{
> +    uint32_t header = 0;
> +    int max_cap = PCI_MAX_EXT_CAP;
> +    int pos = PCI_CONFIG_SPACE_SIZE;
> +
> +    do {
> +        header = host_pci_get_long(d, pos);
> +        /*
> +         * If we have no capabilities, this is indicated by cap ID,
> +         * cap version and next pointer all being 0.
> +         */
> +        if (header == 0) {
> +            break;
> +        }
> +
> +        if (PCI_EXT_CAP_ID(header) == cap) {
> +            return pos;
> +        }
> +
> +        pos = PCI_EXT_CAP_NEXT(header);
> +        if (pos < PCI_CONFIG_SPACE_SIZE) {
> +            break;
> +        }
> +
> +        max_cap--;
> +    } while (max_cap > 0);
> +
> +    return 0;
> +}
> +
> +HostPCIDevice *host_pci_device_get(uint8_t bus, uint8_t dev, uint8_t func)
> +{
> +    HostPCIDevice *d = NULL;
> +
> +    d = g_new0(HostPCIDevice, 1);
> +
> +    d->config_fd = -1;
> +    d->domain = 0;
> +    d->bus = bus;
> +    d->dev = dev;
> +    d->func = func;
> +
> +    if (host_pci_config_fd(d) == -1) {
> +        goto error;
> +    }
> +    if (get_resource(d) != 0) {
> +        goto error;
> +    }
> +
> +    d->vendor_id = get_value(d, "vendor");
> +    d->device_id = get_value(d, "device");
> +    d->is_virtfn = pci_dev_is_virtfn(d);
> +
> +    return d;
> +error:
> +    if (d->config_fd >= 0) {
> +        close(d->config_fd);
> +    }
> +    g_free(d);
> +    return NULL;
> +}
> +
> +void host_pci_device_put(HostPCIDevice *d)
> +{
> +    if (d->config_fd >= 0) {
> +        close(d->config_fd);
> +    }
> +    g_free(d);
> +}
> diff --git a/hw/host-pci-device.h b/hw/host-pci-device.h
> new file mode 100644
> index 0000000..d79ba48
> --- /dev/null
> +++ b/hw/host-pci-device.h
> @@ -0,0 +1,75 @@
> +#ifndef HW_HOST_PCI_DEVICE
> +#  define HW_HOST_PCI_DEVICE
> +
> +#include "pci.h"
> +
> +/*
> + * from linux/ioport.h
> + * IO resources have these defined flags.
> + */
> +#define IORESOURCE_BITS         0x000000ff      /* Bus-specific bits */
> +
> +#define IORESOURCE_TYPE_BITS    0x00000f00      /* Resource type */
> +#define IORESOURCE_IO           0x00000100
> +#define IORESOURCE_MEM          0x00000200
> +#define IORESOURCE_IRQ          0x00000400
> +#define IORESOURCE_DMA          0x00000800
> +
> +#define IORESOURCE_PREFETCH     0x00001000      /* No side effects */
> +#define IORESOURCE_READONLY     0x00002000
> +#define IORESOURCE_CACHEABLE    0x00004000
> +#define IORESOURCE_RANGELENGTH  0x00008000
> +#define IORESOURCE_SHADOWABLE   0x00010000
> +
> +#define IORESOURCE_SIZEALIGN    0x00020000      /* size indicates alignment */
> +#define IORESOURCE_STARTALIGN   0x00040000      /* start field is alignment */
> +
> +#define IORESOURCE_MEM_64       0x00100000
> +
> +    /* Userland may not map this resource */
> +#define IORESOURCE_EXCLUSIVE    0x08000000
> +#define IORESOURCE_DISABLED     0x10000000
> +#define IORESOURCE_UNSET        0x20000000
> +#define IORESOURCE_AUTO         0x40000000
> +    /* Driver has marked this resource busy */
> +#define IORESOURCE_BUSY         0x80000000
> +
> +
> +typedef struct HostPCIIORegion {
> +    unsigned long flags;
> +    pcibus_t base_addr;
> +    pcibus_t size;
> +} HostPCIIORegion;
> +
> +typedef struct HostPCIDevice {
> +    uint16_t domain;
> +    uint8_t bus;
> +    uint8_t dev;
> +    uint8_t func;
> +
> +    uint16_t vendor_id;
> +    uint16_t device_id;
> +
> +    HostPCIIORegion io_regions[PCI_NUM_REGIONS - 1];
> +    HostPCIIORegion rom;
> +
> +    bool is_virtfn;
> +
> +    int config_fd;
> +} HostPCIDevice;
> +
> +HostPCIDevice *host_pci_device_get(uint8_t bus, uint8_t dev, uint8_t func);
> +void host_pci_device_put(HostPCIDevice *pci_dev);
> +
> +uint8_t host_pci_get_byte(HostPCIDevice *d, int pos);
> +uint16_t host_pci_get_word(HostPCIDevice *d, int pos);
> +uint32_t host_pci_get_long(HostPCIDevice *d, int pos);
> +int host_pci_get_block(HostPCIDevice *d, int pos, uint8_t *buf, int len);
> +int host_pci_set_byte(HostPCIDevice *d, int pos, uint8_t data);
> +int host_pci_set_word(HostPCIDevice *d, int pos, uint16_t data);
> +int host_pci_set_long(HostPCIDevice *d, int pos, uint32_t data);
> +int host_pci_set_block(HostPCIDevice *d, int pos, uint8_t *buf, int len);
> +
> +uint32_t host_pci_find_ext_cap_offset(HostPCIDevice *s, uint32_t cap);
> +
> +#endif /* !HW_HOST_PCI_DEVICE */
> -- 
> Anthony PERARD
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 11:37:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 11:37:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMOdb-00042o-UH; Fri, 04 Nov 2011 11:37:11 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMOcd-0003q5-1T
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 11:36:12 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1320431766!342877!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22418 invoked from network); 4 Nov 2011 18:36:07 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-14.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	4 Nov 2011 18:36:07 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA4Ia2S1029508
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 4 Nov 2011 18:36:03 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA4Ia1lc013492
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 4 Nov 2011 18:36:02 GMT
Received: from abhmt108.oracle.com (abhmt108.oracle.com [141.146.116.60])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA4IZtiG019654; Fri, 4 Nov 2011 13:35:55 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 04 Nov 2011 11:35:55 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 6A56C8062F; Fri,  4 Nov 2011 14:35:54 -0400 (EDT)
Date: Fri, 4 Nov 2011 14:35:54 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Dan Carpenter <dan.carpenter@oracle.com>
Message-ID: <20111104183554.GA1616@phenom.dumpdata.com>
References: <20111104182408.GD5796@elgon.mountain>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111104182408.GD5796@elgon.mountain>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090205.4EB43093.01A7,ss=1,re=0.000,fgs=0
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	kernel-janitors@vger.kernel.org, xen-devel@lists.xensource.com,
	virtualization@lists.linux-foundation.org
Subject: [Xen-devel] Re: [patch 1/2] xen-gntalloc: integer overflow in
 gntalloc_ioctl_alloc()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, Nov 04, 2011 at 09:24:08PM +0300, Dan Carpenter wrote:
> On 32 bit systems a high value of op.count could lead to an integer
> overflow in the kzalloc() and gref_ids would be smaller than
> expected.  If the you triggered another integer overflow in
> "if (gref_size + op.count > limit)" then you'd probably get memory
> corruption inside add_grefs().
> 
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>

Great! Keep them coming!  Will push for stable and 3.2.

> 
> diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
> index f6832f4..23c60cf 100644
> --- a/drivers/xen/gntalloc.c
> +++ b/drivers/xen/gntalloc.c
> @@ -280,7 +280,7 @@ static long gntalloc_ioctl_alloc(struct gntalloc_file_private_data *priv,
>  		goto out;
>  	}
>  
> -	gref_ids = kzalloc(sizeof(gref_ids[0]) * op.count, GFP_TEMPORARY);
> +	gref_ids = kcalloc(op.count, sizeof(gref_ids[0]), GFP_TEMPORARY);
>  	if (!gref_ids) {
>  		rc = -ENOMEM;
>  		goto out;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 11:45:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 11:45:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMOm4-0004Zu-Fc; Fri, 04 Nov 2011 11:45:56 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMOlJ-0004Nv-Na
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 11:45:10 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320432276!51886793!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8997 invoked from network); 4 Nov 2011 18:44:38 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-5.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Nov 2011 18:44:38 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA4Ij2gk007725
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 4 Nov 2011 18:45:03 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA4Ij0m7021333
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 4 Nov 2011 18:45:01 GMT
Received: from abhmt102.oracle.com (abhmt102.oracle.com [141.146.116.54])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA4Iismp025870; Fri, 4 Nov 2011 13:44:54 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 04 Nov 2011 11:44:54 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 48C828062F; Fri,  4 Nov 2011 14:44:53 -0400 (EDT)
Date: Fri, 4 Nov 2011 14:44:53 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Jerome Glisse <j.glisse@gmail.com>
Message-ID: <20111104184453.GB1616@phenom.dumpdata.com>
References: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
	<20111104183110.GC2015@homer.localdomain>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111104183110.GC2015@homer.localdomain>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090209.4EB432AF.016A,ss=1,re=0.000,fgs=0
Cc: thellstrom@vmware.com, xen-devel@lists.xensource.com, thomas@shipmail.org,
	linux-kernel@vger.kernel.org, jglisse@redhat.com,
	bskeggs@redhat.com, airlied@redhat.com
Subject: [Xen-devel] Re: [PATCH] TTM DMA pool v2.2 or [GIT PULL]
 (stable/ttm.dma_pool.v2.3) for 3.3
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> > git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git stable/ttm.dma_pool.v2.3
> > 
> 
> On what hw did you tested ? With and without xen ? Here radeon

On AMD and Intel. And with both Nvidia and Radeon cards.
64-bit cards (I have a patch where I forced the 64-bit card to use
the TTM DMA pool code to test) and 32-bit cards (ATI ES1000)

On baremetal and Xen. Um, Fedora Core 16 as distro.

Oh, and I also tried PPC (Power Mac 4) but could not get it to boot
the 3.1 kernel. Something with the LILO grub loader did not work.

> that doesn't need dma32 doesn't work when forcing swiotlb which
> kind of expected i guess. Should we expose if swiotlb is enabled

You did 'swiotlb=force' ?
> forced so we use dma pool in such case ?

Hm, it shoudl have enabled itself. The swiotlb_nr_tlb would return some
contents and we would.. Oh, you mean you did a 64-bit card _and_
did swiotlb=force. And since the rdev->dma32 was set to zero it
did _not_ use the TTM DMA pool.

Right. I did not do it initially just so that I could limit the scope
in case I messed up something in the code. But the code has the
'no_dma' parameter, so it can easily turn off the DMA TTM code.

So, to answer your question - sure, we can ignore the rdev_dma32 and
just use the the swiotlb_nr_tlb to check.

BTW, thank you for taking a spin with these patches and rebasing them
on top of yours. I am going to start testing them and reviewing the
latest batch you sent on Monday.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 12:23:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 12:23:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMPMJ-0005nz-U9; Fri, 04 Nov 2011 12:23:24 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMPLU-0005bd-4F
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 12:22:33 -0700
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-6.tower-216.messagelabs.com!1320434547!2334123!1
X-Originating-IP: [142.103.6.52]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10604 invoked from network); 4 Nov 2011 19:22:28 -0000
Received: from smtp.cs.ubc.ca (HELO smtp.cs.ubc.ca) (142.103.6.52)
	by server-6.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Nov 2011 19:22:28 -0000
Received: from mail-bw0-f43.google.com (mail-bw0-f43.google.com
	[209.85.214.43]) (authenticated bits=0)
	by smtp.cs.ubc.ca (8.14.3/8.13.6) with ESMTP id pA4JMOgg031927
	(version=TLSv1/SSLv3 cipher=RC4-MD5 bits=128 verify=FAIL)
	for <xen-devel@lists.xensource.com>; Fri, 4 Nov 2011 12:22:25 -0700
Received: by bkbzt12 with SMTP id zt12so3380557bkb.30
	for <xen-devel@lists.xensource.com>;
	Fri, 04 Nov 2011 12:22:23 -0700 (PDT)
Received: by 10.204.137.73 with SMTP id v9mr13016754bkt.81.1320434543133; Fri,
	04 Nov 2011 12:22:23 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.204.180.130 with HTTP; Fri, 4 Nov 2011 12:21:42 -0700 (PDT)
In-Reply-To: <20147.55048.90214.665321@mariner.uk.xensource.com>
References: <patchbomb.1320350703@athos.nss.cs.ubc.ca>
	<20147.55048.90214.665321@mariner.uk.xensource.com>
From: Shriram Rajagopalan <rshriram@cs.ubc.ca>
Date: Fri, 4 Nov 2011 12:21:42 -0700
Message-ID: <CAP8mzPM1Fxj6M5R+H79nKToSCxHxsMaq1CKN=csjRMMocG0LRA@mail.gmail.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Cc: "brendan@cs.ubc.ca" <brendan@cs.ubc.ca>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH 0 of 2 V5] libxc: checkpoint compression
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: rshriram@cs.ubc.ca
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0139108342=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0139108342==
Content-Type: multipart/alternative; boundary=0015173ff35ce4844404b0ed9f73

--0015173ff35ce4844404b0ed9f73
Content-Type: text/plain; charset=ISO-8859-1

Why posix_memalign?

The compression code involves a lot of memcpys at 4K granularity (dirty
pages
copied from domU's memory to internal cache/page buffers etc). I would like
to
keep these memcpys page aligned for purposes of speed. The source pages
(from domU) are already aligned. The destination pages allocated by the
compression code need to be page aligned.

correct me if I am wrong:
 mallocing a huge buffer for this purpose is not optimal. malloc aligns
allocations
 on 16byte (or 8byte) granularity but if a 4K region straddles across two
physical
memory frames, then the memcpy is going to be suboptimal. OTOH, memalign
ensures that we are dealing with just 2 memory frames as opposed
to 3 (possible) frames in malloc.

A simple 8Mb memcpy test shows an average of 500us overhead for malloc
based allocation compared to posix_memalign based allocation. While this
might seem low, the checkpoints are being taken at high frequency
(every 20ms for instance).

It is not okay to use malloc on other platforms. I simply dont have access
to other
platforms to test their equivalent versions.  Short of using something
like qemu_memalign function.

I am open to suggestions :)

shriram
On Fri, Nov 4, 2011 at 5:14 AM, Ian Jackson <Ian.Jackson@eu.citrix.com>wrote:

> rshriram@cs.ubc.ca writes ("[PATCH 0 of 2 V5] libxc: checkpoint
> compression"):
> > This patch series adds checkpoint compression functionality, while
> > running under Remus.
> ...
> > Changes since last version:
> > 1. use posix_memalign only on linux platforms and switch to normal
> malloc for
> >    the rest. stubdom compiles successfully.
>
> Looking at this in more detail, I don't understand why you're using
> posix_memalign rather than just malloc, anyway.  If it's necessary to
> use posix_memalign on Linux, why is it OK to use malloc on other
> platforms ?
>
> Also this #ifdef is quite ugly.
>
> Ian.
>
>

--0015173ff35ce4844404b0ed9f73
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Why posix_memalign?<br><br>The compression code involves a lot of memcpys a=
t 4K granularity (dirty pages<br>copied from domU&#39;s memory to internal =
cache/page buffers etc). I would like to<br>keep these memcpys page aligned=
 for purposes of speed. The source pages <br>

(from domU) are already aligned. The destination pages allocated by the <br=
>compression code need to be page aligned.<br><br>correct me if I am wrong:=
<br>=A0mallocing a huge buffer for this purpose is not optimal. malloc alig=
ns allocations<br>

=A0on 16byte (or 8byte) granularity but if a 4K region straddles across two=
 physical<br>memory frames, then the memcpy is going to be suboptimal. OTOH=
, memalign <br>ensures that we are dealing with just 2 memory frames as opp=
osed <br>

to 3 (possible) frames in malloc.<br><br>A simple 8Mb memcpy test shows an =
average of 500us overhead for malloc <br>based allocation compared to posix=
_memalign based allocation. While this <br>might seem low, the checkpoints =
are being taken at high frequency <br>

(every 20ms for instance). <br><br>It is not okay to use malloc on other pl=
atforms. I simply dont have access to other<br>platforms to test their equi=
valent versions.=A0 Short of using something <br>like qemu_memalign functio=
n.<br>

<br>I am open to suggestions :)<br><br>shriram<br><div class=3D"gmail_quote=
">On Fri, Nov 4, 2011 at 5:14 AM, Ian Jackson <span dir=3D"ltr">&lt;<a href=
=3D"mailto:Ian.Jackson@eu.citrix.com">Ian.Jackson@eu.citrix.com</a>&gt;</sp=
an> wrote:<br>

<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex;"><a href=3D"mailto:rshriram@cs.ubc.ca">rshri=
ram@cs.ubc.ca</a> writes (&quot;[PATCH 0 of 2 V5] libxc: checkpoint compres=
sion&quot;):<br>


<div class=3D"im">&gt; This patch series adds checkpoint compression functi=
onality, while<br>
&gt; running under Remus.<br>
</div>...<br>
<div class=3D"im">&gt; Changes since last version:<br>
&gt; 1. use posix_memalign only on linux platforms and switch to normal mal=
loc for<br>
&gt; =A0 =A0the rest. stubdom compiles successfully.<br>
<br>
</div>Looking at this in more detail, I don&#39;t understand why you&#39;re=
 using<br>
posix_memalign rather than just malloc, anyway. =A0If it&#39;s necessary to=
<br>
use posix_memalign on Linux, why is it OK to use malloc on other<br>
platforms ?<br>
<br>
Also this #ifdef is quite ugly.<br>
<span class=3D"HOEnZb"><font color=3D"#888888"><br>
Ian.<br>
<br>
</font></span></blockquote></div><br>

--0015173ff35ce4844404b0ed9f73--


--===============0139108342==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0139108342==--


From xen-devel-bounces@lists.xensource.com Fri Nov 04 13:21:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 13:21:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMQG4-0007oX-Gz; Fri, 04 Nov 2011 13:21:01 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RMQEK-0007bT-Mb
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 13:19:16 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-9.tower-182.messagelabs.com!1320437949!1988644!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3451 invoked from network); 4 Nov 2011 20:19:09 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-9.tower-182.messagelabs.com with SMTP;
	4 Nov 2011 20:19:09 -0000
Received: from tarius.tycho.ncsc.mil (localhost [127.0.0.1])
	by msux-gh1-uea02.nsa.gov (8.12.10/8.12.10) with ESMTP id
	pA4KJ81Y013905; Fri, 4 Nov 2011 20:19:08 GMT
Received: from moss-nexus.epoch.ncsc.mil (moss-nexus [144.51.25.48])
	by tarius.tycho.ncsc.mil (8.13.1/8.13.1) with ESMTP id pA4KJ7Ri009495; 
	Fri, 4 Nov 2011 16:19:07 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: Keir Fraser <keir@xen.org>
Date: Fri,  4 Nov 2011 16:19:25 -0400
Message-Id: <1320437965-25176-1-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>, xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] xen: show unmapped but valid grants in debug
	dump
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is useful to help determine if a grant table entry has been
properly set up even when the grant is not currently mapped, or to view
grant table entries that are used for operations other than mapping.

This also cleans up the output a bit by moving the header next to the
entries and fixing the display of 4-digit grant references.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 xen/common/grant_table.c |   19 ++++++++++---------
 1 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
index 07f58f3..23c553a 100644
--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
@@ -2613,9 +2613,6 @@ void gnttab_usage_print(struct domain *rd)
     grant_ref_t ref;
     struct grant_table *gt = rd->grant_table;
 
-    printk("      -------- active --------       -------- shared --------\n");
-    printk("[ref] localdom mfn      pin          localdom gmfn     flags\n");
-
     spin_lock(&gt->lock);
 
     if ( gt->gt_version == 0 )
@@ -2631,8 +2628,6 @@ void gnttab_usage_print(struct domain *rd)
         uint64_t frame;
 
         act = &active_entry(gt, ref);
-        if ( !act->pin )
-            continue;
 
         sha = shared_entry_header(gt, ref);
 
@@ -2651,15 +2646,21 @@ void gnttab_usage_print(struct domain *rd)
             status = status_entry(gt, ref);
         }
 
+        if ( !act->pin && !status )
+            continue;
+
         if ( first )
         {
             printk("grant-table for remote domain:%5d (v%d)\n",
                    rd->domain_id, gt->gt_version);
+            printk("      -------- active --------       -------- shared --------\n");
+            printk("[ref] localdom mfn      pin          localdom gmfn     flags\n");
+
             first = 0;
         }
 
-        /*      [ddd]    ddddd 0xXXXXXX 0xXXXXXXXX      ddddd 0xXXXXXX 0xXX */
-        printk("[%3d]    %5d 0x%06lx 0x%08x      %5d 0x%06"PRIx64" 0x%02x\n",
+        /*      [dddd]   ddddd 0xXXXXXX 0xXXXXXXXX      ddddd 0xXXXXXX 0xXX */
+        printk("[%4d]   %5d 0x%06lx 0x%08x      %5d 0x%06"PRIx64" 0x%02x\n",
                ref, act->domid, act->frame, act->pin,
                sha->domid, frame, status);
     }
@@ -2668,8 +2669,8 @@ void gnttab_usage_print(struct domain *rd)
     spin_unlock(&gt->lock);
 
     if ( first )
-        printk("grant-table for remote domain:%5d ... "
-               "no active grant table entries\n", rd->domain_id);
+        printk("grant-table for remote domain:%5d (v%d) ... "
+               "no active grant table entries\n", rd->domain_id, gt->gt_version);
 }
 
 static void gnttab_usage_print_all(unsigned char key)
-- 
1.7.6.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 13:27:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 13:27:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMQLu-0008Gv-FP; Fri, 04 Nov 2011 13:27:02 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMQKN-00083W-De
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 13:25:30 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1320438324!2967772!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17031 invoked from network); 4 Nov 2011 20:25:24 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 20:25:24 -0000
X-IronPort-AV: E=Sophos;i="4.69,457,1315180800"; 
   d="scan'208";a="8770188"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 20:25:23 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 20:25:23 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RMQKJ-0006QU-6K;
	Fri, 04 Nov 2011 20:25:23 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RMQKJ-0001EH-58;
	Fri, 04 Nov 2011 20:25:23 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9699-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 4 Nov 2011 20:25:23 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9699: regressions - trouble:
	broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9699 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9699/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-i386-rhel6hvm-intel  3 host-install(3)              broken
 test-amd64-i386-xl           18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-credit2   18 leak-check/check           fail REGR. vs. 9661
 test-amd64-amd64-xl          18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-multivcpu 18 leak-check/check           fail REGR. vs. 9661
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-win-vcpus1    3 host-install(3)              broken
 test-i386-i386-xl-win         3 host-install(3)              broken

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10       fail    like 9659
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  604a90b803d3
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               broken  
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   broken  
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        broken  


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24083:604a90b803d3
tag:         tip
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: Remove a passthrough device through QMP.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_pci.c |   72 +++++++++++++++++++++++++++++++---------------
     1 files changed, 48 insertions(+), 24 deletions(-)
    
    
changeset:   24082:e22e108e1c57
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_del
    
    To remove a pci passthough device from QEMU (upstream).
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_internal.h |    2 ++
     tools/libxl/libxl_qmp.c      |   35 +++++++++++++++++++++++++++++++++++
     2 files changed, 37 insertions(+), 0 deletions(-)
    
    
changeset:   24081:659c800d7edf
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Nov 04 15:55:50 2011 +0100
    
    x86/IRQ: fix create_irq() after c/s 24068:6928172f7ded
    
    init_one_irq_desc() must be called with interrupts enabled (as it may
    call functions from the xmalloc() group). Rather than mis-using
    vector_lock to also protect the finding of an unused IRQ, make this
    lockless through using cmpxchg(), and obtain the lock only around the
    actual assignment of the vector.
    
    Also fold find_unassigned_irq() into its only caller.
    
    It is, btw, questionable whether create_irq() calling
    __assign_irq_vector() (rather than assign_irq_vector()) is actually
    correct - desc->affinity appears to not get initialized properly in
    this case.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24080:974b00c7c2d0
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: Use QMP to insert a passthrough device when using upstream QEMU
    
    Also move the xenstore specific code to a new function and add a
    message if sscanf fails.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24079:a67944b1adfb
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_add.
    
    This function insert a PCI passthrough device in qemu.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24078:c5fe74068253
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_json: Handle number above LONG_MAX.
    
    The integers are now "long long" in the json_object.
    
    If a number (decimal or integer) is too big (or too low), it is stored as it in
    a string. So for that, we introduce a new type JSON_NUMBER.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24077:8d06378f1487
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_qmp: Introduce qmp_request_context.
    
    This structure helps to track the return code of a callback. It's only used
    between qmp_synchronous_send and qmp_send.
    
    Now, qmp_synchronous_send will return the rc of the callback if there is no
    error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24076:0406f6783c65
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Always insert a command id in the callback_list.
    
    Because the function qmp_synchronous_send rely on the presence of the id
    in the callback_list.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24075:918a2091c181
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Introduce list of arguments to qmp_send
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24074:9641b7594ed6
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl_qmp: Introduce an opaque argument to the callbacks.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24073:7b22d2f98302
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl: Introduce dm-version xenstore key.
    
    The all key is /libxl/$domid/dm-version.
    
    The /libxl/$domid dir is created with the domain and should be only accessible
    by the toolstack domain. The function libxl__xs_libxl_path() give this path.
    
    This come with libxl__device_model_version_running() helper function.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24072:cf8924724b61
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Better error message after a parse error.
    
    By setting the next string to parse after having printed any error messages.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24071:bdbd100b28ae
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_json: Check the parser status before to call parse_complete
    
    Also, use goto to handle an error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24070:e0b6b0e68e90
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Fix return check of fcntl
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24069:801ca6c0fbfa
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:28:41 2011 +0100
    
    x86/IRQ: consolidate IRQ disabling when acquiring vector lock
    
    __assign_irq_vector() doesn't need to disable interrupts (its callers
    are required to when acquiring the lock), and set_desc_affinity() can
    use the normal spin lock primitives.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24068:6928172f7ded
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:27:38 2011 +0100
    
    IRQ: allocate CPU masks dynamically
    
    This includes delaying the initialization of dynamically created IRQs
    until their actual first use and some further elimination of uses of
    struct irq_cfg.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24067:17ee4c213438
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 13:29:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 13:29:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMQOi-0000E4-FF; Fri, 04 Nov 2011 13:29:56 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMQN7-0008S3-MW
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 13:28:19 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1320438493!2353480!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24706 invoked from network); 4 Nov 2011 20:28:14 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-15.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 4 Nov 2011 20:28:14 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA4KS9Gi031424
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 4 Nov 2011 20:28:11 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA4KS88U016221
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 4 Nov 2011 20:28:09 GMT
Received: from abhmt113.oracle.com (abhmt113.oracle.com [141.146.116.65])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA4KS32d002085; Fri, 4 Nov 2011 15:28:03 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 04 Nov 2011 13:28:03 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 2351980F09; Fri,  4 Nov 2011 15:41:03 -0400 (EDT)
Date: Fri, 4 Nov 2011 15:41:03 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Jerome Glisse <j.glisse@gmail.com>
Message-ID: <20111104194102.GA15923@phenom.dumpdata.com>
References: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
	<20111104183110.GC2015@homer.localdomain>
	<20111104184453.GB1616@phenom.dumpdata.com>
	<20111104192451.GE2015@homer.localdomain>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111104192451.GE2015@homer.localdomain>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090206.4EB44ADC.006F,ss=1,re=0.000,fgs=0
Cc: thellstrom@vmware.com, xen-devel@lists.xensource.com, thomas@shipmail.org,
	linux-kernel@vger.kernel.org, jglisse@redhat.com,
	bskeggs@redhat.com, airlied@redhat.com
Subject: [Xen-devel] Re: [PATCH] TTM DMA pool v2.2 or [GIT PULL]
 (stable/ttm.dma_pool.v2.3) for 3.3
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, Nov 04, 2011 at 03:24:51PM -0400, Jerome Glisse wrote:
> On Fri, Nov 04, 2011 at 02:44:53PM -0400, Konrad Rzeszutek Wilk wrote:
> > > > git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git stable/ttm.dma_pool.v2.3
> > > > 
> > > 
> > > On what hw did you tested ? With and without xen ? Here radeon
> > 
> > On AMD and Intel. And with both Nvidia and Radeon cards.
> > 64-bit cards (I have a patch where I forced the 64-bit card to use
> > the TTM DMA pool code to test) and 32-bit cards (ATI ES1000)
> > 
> > On baremetal and Xen. Um, Fedora Core 16 as distro.
> > 
> > Oh, and I also tried PPC (Power Mac 4) but could not get it to boot
> > the 3.1 kernel. Something with the LILO grub loader did not work.
> > 
> > > that doesn't need dma32 doesn't work when forcing swiotlb which
> > > kind of expected i guess. Should we expose if swiotlb is enabled
> > 
> > You did 'swiotlb=force' ?
> > > forced so we use dma pool in such case ?
> 
> Issue is that when booted without force swiotlb_nr_tlb still return
> positive thus we endup using the dma pool path.

Did " Using software bounce buffering for IO (SWIOTLB)" or "software IO TLB at"
show up in the dmesg output? You might have to run it with 'debug loglevel=8'?
Presumarily yes, since the code "swiotlb: Expose.." sets
  io_tlb_nslabs = 0

if there is no need for it. And since io_tlb_nslabs is set, then the code
did start.

Some AMD boxes with the AMD-Vi chipset enable the SWIOTLB b/c not all of
the PCI devices are on the IOMMU chipset path. The Intel VT-d does the same
thing.

Hmm, I think the reason for those devices to turn SWIOTLB on is that they
are not comfortable handling 32-bit devices, and the TTM DMA pool code would
only turn itself on when the radeon|nouveau was 32-bit _and_ SWIOTLB was enabled.

.. Testing the patches you posted on my AMD box.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 14:12:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 14:12:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMR3p-0001UN-3i; Fri, 04 Nov 2011 14:12:25 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMR0i-0001DE-Hx
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 14:09:14 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1320440947!349365!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32405 invoked from network); 4 Nov 2011 21:09:09 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-12.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	4 Nov 2011 21:09:09 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA4L8rjd008845
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 4 Nov 2011 21:08:54 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA4L8qXM000481
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 4 Nov 2011 21:08:52 GMT
Received: from abhmt114.oracle.com (abhmt114.oracle.com [141.146.116.66])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA4L8kuF026821; Fri, 4 Nov 2011 16:08:46 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 04 Nov 2011 14:08:46 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 948A180F09; Fri,  4 Nov 2011 17:08:45 -0400 (EDT)
Date: Fri, 4 Nov 2011 17:08:45 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Jerome Glisse <jglisse@redhat.com>
Message-ID: <20111104210845.GA4566@phenom.dumpdata.com>
References: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
	<20111104183110.GC2015@homer.localdomain>
	<20111104184453.GB1616@phenom.dumpdata.com>
	<20111104192451.GE2015@homer.localdomain>
	<20111104194102.GA15923@phenom.dumpdata.com>
	<20111104205417.GF2015@homer.localdomain>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111104205417.GF2015@homer.localdomain>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090209.4EB45470.0080,ss=1,re=0.000,fgs=0
Cc: thellstrom@vmware.com, xen-devel@lists.xensource.com, thomas@shipmail.org,
	linux-kernel@vger.kernel.org, bskeggs@redhat.com,
	Jerome Glisse <j.glisse@gmail.com>, airlied@redhat.com
Subject: [Xen-devel] Re: [PATCH] TTM DMA pool v2.2 or [GIT PULL]
 (stable/ttm.dma_pool.v2.3) for 3.3
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

. snip..
> > Some AMD boxes with the AMD-Vi chipset enable the SWIOTLB b/c not all of
> > the PCI devices are on the IOMMU chipset path. The Intel VT-d does the same
> > thing.
> > 
> > Hmm, I think the reason for those devices to turn SWIOTLB on is that they
> > are not comfortable handling 32-bit devices, and the TTM DMA pool code would
> > only turn itself on when the radeon|nouveau was 32-bit _and_ SWIOTLB was enabled.
> > 
> > .. Testing the patches you posted on my AMD box.
> 
> Yes, swiotlb was enabled (bounce buffer message) thing is when force is
> not set usual ttm memory page allocation works properly ie on pci map
> no bounce buffer is use, but when force is set it does use a bounce
> This is due to :
> if (dma_capable(dev, dev_addr, size) && !swiotlb_force)
> in swiotlb_map_page, i am not sure how much the force argument is
> usefull.
> 
> Anyway i did few benchmark and it seems that the dma allocator isn't
> slower than the other page allocator. But this is limited testing
> (openarena, nexuiz running on composited desktop with firefox).

Hehe. I also run it with perf record to see it before and after.
Albeit with 'swiotlb=force' _everything_ is going throught the bounce buffer
- including your network packets/USB mouse/etc.

This little patch makes it easier to switch between the TTM DMA and
the default one without using the big hammer approach of 'swiotlb=force':

>From d60930d9b515036268cdf9d9a3d4181bb458ac5c Mon Sep 17 00:00:00 2001
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Fri, 4 Nov 2011 16:53:34 -0400
Subject: [PATCH] ttm:dma: Add 'ttm_dma' module to radeon and nouveau to force
 enable the TTM DMA

. irregardless of whether the device is restricted to DMA32. This
patch is for testing purposes.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 drivers/gpu/drm/radeon/radeon.h     |    1 +
 drivers/gpu/drm/radeon/radeon_drv.c |    4 ++++
 drivers/gpu/drm/radeon/radeon_ttm.c |    6 +++---
 3 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 63257ba..9cae9e2 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -94,6 +94,7 @@ extern int radeon_disp_priority;
 extern int radeon_hw_i2c;
 extern int radeon_pcie_gen2;
 
+extern int radeon_ttm_dma;
 /*
  * Copy from radeon_drv.h so we don't have to include both and have conflicting
  * symbol;
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
index e71d2ed..ff81748 100644
--- a/drivers/gpu/drm/radeon/radeon_drv.c
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
@@ -118,6 +118,10 @@ int radeon_audio = 0;
 int radeon_disp_priority = 0;
 int radeon_hw_i2c = 0;
 int radeon_pcie_gen2 = 0;
+int radeon_ttm_dma = 0;
+
+MODULE_PARM_DESC(ttm_dma, "Enable TTM DMA page pool always irregardless of DMA32 flag");
+module_param_named(ttm_dma, radeon_ttm_dma, int, 0444);
 
 MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers");
 module_param_named(no_wb, radeon_no_wb, int, 0444);
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index 82119a5..0dc0048 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -593,7 +593,7 @@ static int radeon_ttm_tt_populate(struct ttm_tt *ttm)
 	rdev = radeon_get_rdev(ttm->bdev);
 
 #ifdef CONFIG_SWIOTLB
-	if (rdev->need_dma32 && swiotlb_nr_tbl()) {
+	if ((rdev->need_dma32 && swiotlb_nr_tbl()) || radeon_ttm_dma) {
 		return ttm_dma_populate(ttm, rdev->dev);
 	}
 #endif
@@ -628,7 +628,7 @@ static void radeon_ttm_tt_unpopulate(struct ttm_tt *ttm)
 	rdev = radeon_get_rdev(ttm->bdev);
 
 #ifdef CONFIG_SWIOTLB
-	if (rdev->need_dma32 && swiotlb_nr_tbl()) {
+	if ((rdev->need_dma32 && swiotlb_nr_tbl()) || radeon_ttm_dma) {
 		ttm_dma_unpopulate(ttm, rdev->dev);
 		return;
 	}
@@ -858,7 +858,7 @@ static int radeon_ttm_debugfs_init(struct radeon_device *rdev)
 	radeon_mem_types_list[i].driver_features = 0;
 	radeon_mem_types_list[i++].data = NULL;
 #ifdef CONFIG_SWIOTLB
-	if (rdev->need_dma32 && swiotlb_nr_tbl()) {
+	if ((rdev->need_dma32 && swiotlb_nr_tbl()) || radeon_ttm_dma) {
 		sprintf(radeon_mem_types_names[i], "ttm_dma_page_pool");
 		radeon_mem_types_list[i].name = radeon_mem_types_names[i];
 		radeon_mem_types_list[i].show = &ttm_dma_page_alloc_debugfs;
-- 
1.7.7.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 16:59:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 16:59:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMTfa-0004ZT-4y; Fri, 04 Nov 2011 16:59:34 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMTeJ-0004MZ-Jb
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 16:58:18 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1320451067!47283057!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4727 invoked from network); 4 Nov 2011 23:57:47 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 23:57:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,458,1315180800"; 
   d="scan'208";a="8772041"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Nov 2011 23:58:12 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 4 Nov 2011 23:58:11 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RMTeF-0007bS-Kp;
	Fri, 04 Nov 2011 23:58:11 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RMTeF-00073P-Cv;
	Fri, 04 Nov 2011 23:58:11 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9704-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 4 Nov 2011 23:58:11 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9704: regressions - trouble:
	broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9704 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9704/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-i386-rhel6hvm-intel  3 host-install(3)              broken
 test-amd64-i386-xl-credit2   18 leak-check/check           fail REGR. vs. 9661
 test-amd64-amd64-xl          18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-multivcpu  3 host-install(3)              broken
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl           18 leak-check/check           fail REGR. vs. 9661
 test-i386-i386-win            3 host-install(3)              broken

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-amd64-xl-sedf     18 leak-check/check          fail blocked in 9661
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  604a90b803d3
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               broken  
 test-amd64-i386-xl-multivcpu                                 broken  
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           broken  
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24083:604a90b803d3
tag:         tip
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: Remove a passthrough device through QMP.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_pci.c |   72 +++++++++++++++++++++++++++++++---------------
     1 files changed, 48 insertions(+), 24 deletions(-)
    
    
changeset:   24082:e22e108e1c57
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_del
    
    To remove a pci passthough device from QEMU (upstream).
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_internal.h |    2 ++
     tools/libxl/libxl_qmp.c      |   35 +++++++++++++++++++++++++++++++++++
     2 files changed, 37 insertions(+), 0 deletions(-)
    
    
changeset:   24081:659c800d7edf
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Nov 04 15:55:50 2011 +0100
    
    x86/IRQ: fix create_irq() after c/s 24068:6928172f7ded
    
    init_one_irq_desc() must be called with interrupts enabled (as it may
    call functions from the xmalloc() group). Rather than mis-using
    vector_lock to also protect the finding of an unused IRQ, make this
    lockless through using cmpxchg(), and obtain the lock only around the
    actual assignment of the vector.
    
    Also fold find_unassigned_irq() into its only caller.
    
    It is, btw, questionable whether create_irq() calling
    __assign_irq_vector() (rather than assign_irq_vector()) is actually
    correct - desc->affinity appears to not get initialized properly in
    this case.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24080:974b00c7c2d0
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: Use QMP to insert a passthrough device when using upstream QEMU
    
    Also move the xenstore specific code to a new function and add a
    message if sscanf fails.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24079:a67944b1adfb
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_add.
    
    This function insert a PCI passthrough device in qemu.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24078:c5fe74068253
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_json: Handle number above LONG_MAX.
    
    The integers are now "long long" in the json_object.
    
    If a number (decimal or integer) is too big (or too low), it is stored as it in
    a string. So for that, we introduce a new type JSON_NUMBER.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24077:8d06378f1487
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_qmp: Introduce qmp_request_context.
    
    This structure helps to track the return code of a callback. It's only used
    between qmp_synchronous_send and qmp_send.
    
    Now, qmp_synchronous_send will return the rc of the callback if there is no
    error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24076:0406f6783c65
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Always insert a command id in the callback_list.
    
    Because the function qmp_synchronous_send rely on the presence of the id
    in the callback_list.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24075:918a2091c181
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Introduce list of arguments to qmp_send
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24074:9641b7594ed6
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl_qmp: Introduce an opaque argument to the callbacks.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24073:7b22d2f98302
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl: Introduce dm-version xenstore key.
    
    The all key is /libxl/$domid/dm-version.
    
    The /libxl/$domid dir is created with the domain and should be only accessible
    by the toolstack domain. The function libxl__xs_libxl_path() give this path.
    
    This come with libxl__device_model_version_running() helper function.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24072:cf8924724b61
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Better error message after a parse error.
    
    By setting the next string to parse after having printed any error messages.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24071:bdbd100b28ae
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_json: Check the parser status before to call parse_complete
    
    Also, use goto to handle an error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24070:e0b6b0e68e90
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Fix return check of fcntl
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24069:801ca6c0fbfa
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:28:41 2011 +0100
    
    x86/IRQ: consolidate IRQ disabling when acquiring vector lock
    
    __assign_irq_vector() doesn't need to disable interrupts (its callers
    are required to when acquiring the lock), and set_desc_affinity() can
    use the normal spin lock primitives.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24068:6928172f7ded
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:27:38 2011 +0100
    
    IRQ: allocate CPU masks dynamically
    
    This includes delaying the initialization of dynamically created IRQs
    until their actual first use and some further elimination of uses of
    struct irq_cfg.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24067:17ee4c213438
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 21:17:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 21:17:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMXgs-0000SO-TL; Fri, 04 Nov 2011 21:17:10 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RMXfv-0000FJ-H5
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 21:16:11 -0700
X-Env-Sender: xudong.hao@intel.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1320466567!3024428!1
X-Originating-IP: [143.182.124.21]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24564 invoked from network); 5 Nov 2011 04:16:08 -0000
Received: from mga03.intel.com (HELO mga03.intel.com) (143.182.124.21)
	by server-7.tower-21.messagelabs.com with SMTP;
	5 Nov 2011 04:16:08 -0000
Received: from azsmga002.ch.intel.com ([10.2.17.35])
	by azsmga101.ch.intel.com with ESMTP; 04 Nov 2011 21:11:06 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.69,459,1315206000"; d="scan'208";a="33533530"
Received: from pgsmsx602.gar.corp.intel.com ([10.221.43.81])
	by AZSMGA002.ch.intel.com with ESMTP; 04 Nov 2011 21:11:05 -0700
Received: from pgsmsx102.gar.corp.intel.com (10.221.44.80) by
	pgsmsx602.gar.corp.intel.com (10.221.43.81) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Sat, 5 Nov 2011 12:10:51 +0800
Received: from shsmsx601.ccr.corp.intel.com (10.239.4.112) by
	PGSMSX102.gar.corp.intel.com (10.221.44.80) with Microsoft SMTP Server
	(TLS) id 14.1.323.3; Sat, 5 Nov 2011 12:10:51 +0800
Received: from shsmsx502.ccr.corp.intel.com ([10.239.4.96]) by
	shsmsx601.ccr.corp.intel.com ([10.239.4.112]) with mapi; Sat, 5 Nov 2011
	12:10:50 +0800
From: "Hao, Xudong" <xudong.hao@intel.com>
To: Juergen Gross <juergen.gross@ts.fujitsu.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Sat, 5 Nov 2011 12:10:49 +0800
Thread-Topic: [PATCH] Make lock profiling usable again
Thread-Index: Acya8UpR71hKGcpnT56+fP08UusELgAfctSA
Message-ID: <BC00F5384FCFC9499AF06F92E8B78A9E281497FD88@shsmsx502.ccr.corp.intel.com>
References: <df918a251d01d3ac6267.1320411162@nehalem1>
In-Reply-To: <df918a251d01d3ac6267.1320411162@nehalem1>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Cc: 
Subject: [Xen-devel] RE: [PATCH] Make lock profiling usable again
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Initialize profile to NULL when lock profiling is not enabled.

diff -r 068d3d55ce6e xen/include/xen/spinlock.h
--- a/xen/include/xen/spinlock.h        Tue Nov 01 19:03:38 2011 +0000
+++ b/xen/include/xen/spinlock.h        Sat Nov 05 11:57:38 2011 +0800
@@ -108,7 +108,7 @@ struct lock_profile_qhead { };
 struct lock_profile_qhead { };

 #define SPIN_LOCK_UNLOCKED                                                =
    \
-    { _RAW_SPIN_LOCK_UNLOCKED, 0xfffu, 0, _LOCK_DEBUG, { } }
+    { _RAW_SPIN_LOCK_UNLOCKED, 0xfffu, 0, _LOCK_DEBUG, NULL }
 #define DEFINE_SPINLOCK(l) spinlock_t l =3D SPIN_LOCK_UNLOCKED

 #define spin_lock_init_prof(s, l) spin_lock_init(&((s)->l))


Thanks,
-Xudong


> -----Original Message-----
> From: Juergen Gross [mailto:juergen.gross@ts.fujitsu.com]
> Sent: Friday, November 04, 2011 8:53 PM
> To: xen-devel@lists.xensource.com
> Cc: Hao, Xudong
> Subject: [PATCH] Make lock profiling usable again
>=20
> Using lock profiling (option lock_profile in xen/Rules.mk) resulted in bu=
ild errors.
> Changes:
> - Include public/sysctl.h in spinlock.h when using lock profiling.
> - Allocate profile data in an own structure to avoid struct domain becomi=
ng
>   larger then one page
>=20
> Signed-off-by: juergen.gross@ts.fujitsu.com
>=20
>=20
> 2 files changed, 44 insertions(+), 24 deletions(-)
> xen/common/spinlock.c      |   34 +++++++++++++++++++++-------------
> xen/include/xen/spinlock.h |   34 +++++++++++++++++++++++-----------
>=20


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 04 21:47:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 04 Nov 2011 21:47:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMYAL-0001HY-8I; Fri, 04 Nov 2011 21:47:37 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMY9b-00014k-5x
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 21:46:51 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320468372!62004161!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5049 invoked from network); 5 Nov 2011 04:46:12 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Nov 2011 04:46:12 -0000
X-IronPort-AV: E=Sophos;i="4.69,459,1315180800"; 
   d="scan'208";a="8773709"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Nov 2011 04:46:47 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sat, 5 Nov 2011 04:46:47 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RMY9X-0000mQ-2z;
	Sat, 05 Nov 2011 04:46:47 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RMY9W-00072L-UY;
	Sat, 05 Nov 2011 04:46:46 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9710-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sat, 5 Nov 2011 04:46:46 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9710: regressions - trouble:
	broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9710 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9710/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-i386-xl-credit2    3 host-install(3)              broken
 test-amd64-i386-pv            3 host-install(3)              broken
 test-amd64-amd64-xl          18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-multivcpu 18 leak-check/check           fail REGR. vs. 9661
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl           18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-win-vcpus1  3 host-install(3)              broken
 test-i386-i386-win            3 host-install(3)              broken

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-amd64-xl-sedf      5 xen-boot                     fail    like 9661
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  604a90b803d3
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   broken  
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           broken  
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                broken  
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           broken  
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24083:604a90b803d3
tag:         tip
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: Remove a passthrough device through QMP.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_pci.c |   72 +++++++++++++++++++++++++++++++---------------
     1 files changed, 48 insertions(+), 24 deletions(-)
    
    
changeset:   24082:e22e108e1c57
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_del
    
    To remove a pci passthough device from QEMU (upstream).
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_internal.h |    2 ++
     tools/libxl/libxl_qmp.c      |   35 +++++++++++++++++++++++++++++++++++
     2 files changed, 37 insertions(+), 0 deletions(-)
    
    
changeset:   24081:659c800d7edf
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Nov 04 15:55:50 2011 +0100
    
    x86/IRQ: fix create_irq() after c/s 24068:6928172f7ded
    
    init_one_irq_desc() must be called with interrupts enabled (as it may
    call functions from the xmalloc() group). Rather than mis-using
    vector_lock to also protect the finding of an unused IRQ, make this
    lockless through using cmpxchg(), and obtain the lock only around the
    actual assignment of the vector.
    
    Also fold find_unassigned_irq() into its only caller.
    
    It is, btw, questionable whether create_irq() calling
    __assign_irq_vector() (rather than assign_irq_vector()) is actually
    correct - desc->affinity appears to not get initialized properly in
    this case.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24080:974b00c7c2d0
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: Use QMP to insert a passthrough device when using upstream QEMU
    
    Also move the xenstore specific code to a new function and add a
    message if sscanf fails.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24079:a67944b1adfb
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_add.
    
    This function insert a PCI passthrough device in qemu.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24078:c5fe74068253
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_json: Handle number above LONG_MAX.
    
    The integers are now "long long" in the json_object.
    
    If a number (decimal or integer) is too big (or too low), it is stored as it in
    a string. So for that, we introduce a new type JSON_NUMBER.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24077:8d06378f1487
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_qmp: Introduce qmp_request_context.
    
    This structure helps to track the return code of a callback. It's only used
    between qmp_synchronous_send and qmp_send.
    
    Now, qmp_synchronous_send will return the rc of the callback if there is no
    error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24076:0406f6783c65
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Always insert a command id in the callback_list.
    
    Because the function qmp_synchronous_send rely on the presence of the id
    in the callback_list.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24075:918a2091c181
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Introduce list of arguments to qmp_send
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24074:9641b7594ed6
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl_qmp: Introduce an opaque argument to the callbacks.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24073:7b22d2f98302
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl: Introduce dm-version xenstore key.
    
    The all key is /libxl/$domid/dm-version.
    
    The /libxl/$domid dir is created with the domain and should be only accessible
    by the toolstack domain. The function libxl__xs_libxl_path() give this path.
    
    This come with libxl__device_model_version_running() helper function.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24072:cf8924724b61
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Better error message after a parse error.
    
    By setting the next string to parse after having printed any error messages.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24071:bdbd100b28ae
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_json: Check the parser status before to call parse_complete
    
    Also, use goto to handle an error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24070:e0b6b0e68e90
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Fix return check of fcntl
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24069:801ca6c0fbfa
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:28:41 2011 +0100
    
    x86/IRQ: consolidate IRQ disabling when acquiring vector lock
    
    __assign_irq_vector() doesn't need to disable interrupts (its callers
    are required to when acquiring the lock), and set_desc_affinity() can
    use the normal spin lock primitives.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24068:6928172f7ded
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:27:38 2011 +0100
    
    IRQ: allocate CPU masks dynamically
    
    This includes delaying the initialization of dynamically created IRQs
    until their actual first use and some further elimination of uses of
    struct irq_cfg.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24067:17ee4c213438
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Nov 05 06:39:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 05 Nov 2011 06:39:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMgTV-0003yF-O3; Sat, 05 Nov 2011 06:39:57 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMgSq-0003mP-Qc
	for xen-devel@lists.xensource.com; Sat, 05 Nov 2011 06:39:17 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1320500352!2411562!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13303 invoked from network); 5 Nov 2011 13:39:13 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-9.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 5 Nov 2011 13:39:13 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA5DcxeE030723
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Sat, 5 Nov 2011 13:39:02 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA5DcvGH029228
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Sat, 5 Nov 2011 13:38:57 GMT
Received: from abhmt108.oracle.com (abhmt108.oracle.com [141.146.116.60])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA5DcniR015579; Sat, 5 Nov 2011 08:38:49 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Sat, 05 Nov 2011 06:38:48 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 5011E80F09; Sat,  5 Nov 2011 09:38:46 -0400 (EDT)
Date: Sat, 5 Nov 2011 09:38:46 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [Xen-devel] Re: [Revert] Re: [PATCH] mm: sync vmalloc address
	space page tables in alloc_vm_area()
Message-ID: <20111105133846.GA4415@phenom.dumpdata.com>
References: <1314877863-21977-1-git-send-email-david.vrabel@citrix.com>
	<20110901161134.GA8979@dumpdata.com> <4E5FED1A.1000300@goop.org>
	<20110901141754.76cef93b.akpm@linux-foundation.org>
	<4E60C067.4010600@citrix.com>
	<20110902153204.59a928c1.akpm@linux-foundation.org>
	<20110906163553.GA28971@dumpdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20110906163553.GA28971@dumpdata.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090208.4EB53C77.00BD,ss=1,re=0.000,fgs=0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"namhyung@gmail.com" <namhyung@gmail.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>,
	David Vrabel <david.vrabel@citrix.com>,
	"rientjes@google.com" <rientjes@google.com>,
	"paulmck@linux.vnet.ibm.com" <paulmck@linux.vnet.ibm.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Sep 06, 2011 at 12:35:53PM -0400, Konrad Rzeszutek Wilk wrote:
> On Fri, Sep 02, 2011 at 03:32:04PM -0700, Andrew Morton wrote:
> > On Fri, 2 Sep 2011 12:39:19 +0100
> > David Vrabel <david.vrabel@citrix.com> wrote:
> > 
> > > Xen backend drivers (e.g., blkback and netback) would sometimes fail
> > > to map grant pages into the vmalloc address space allocated with
> > > alloc_vm_area().  The GNTTABOP_map_grant_ref would fail because Xen
> > > could not find the page (in the L2 table) containing the PTEs it
> > > needed to update.
> > > 
> > > (XEN) mm.c:3846:d0 Could not find L1 PTE for address fbb42000
> > > 
> > > netback and blkback were making the hypercall from a kernel thread
> > > where task->active_mm != &init_mm and alloc_vm_area() was only
> > > updating the page tables for init_mm.  The usual method of deferring
> > > the update to the page tables of other processes (i.e., after taking a
> > > fault) doesn't work as a fault cannot occur during the hypercall.
> > > 
> > > This would work on some systems depending on what else was using
> > > vmalloc.
> > > 
> > > Fix this by reverting ef691947d8a3d479e67652312783aedcf629320a
> > > (vmalloc: remove vmalloc_sync_all() from alloc_vm_area()) and add a
> > > comment to explain why it's needed.
> > 
> > oookay, I queued this for 3.1 and tagged it for a 3.0.x backport.  I
> > *think* that's the outcome of this discussion, for the short-term?
> 
> <nods> Yup. Thanks!

Hey Andrew,

The long term outcome is the patchset that David worked on. I've sent
a GIT PULL to Linus to pick up the Xen related patches that switch over
the users of the right API:

 (xen) stable/vmalloc-3.2 for Linux 3.2-rc0

(https://lkml.org/lkml/2011/10/29/82)

And then on top of that use this patch:
[Note, I am still waiting for Linus to pull that patchset above.. so not
sure on the outcome. perhaps a better way would be for you to pull
all patches in your tree?]

Also, not sure what you thought of this patch below?

>From b9acd3abc12972be0d938d7bc2466d899023e757 Mon Sep 17 00:00:00 2001
From: David Vrabel <david.vrabel@citrix.com>
Date: Thu, 29 Sep 2011 16:53:32 +0100
Subject: [PATCH] xen: map foreign pages for shared rings by updating the PTEs
 directly

When mapping a foreign page with xenbus_map_ring_valloc() with the
GNTTABOP_map_grant_ref hypercall, set the GNTMAP_contains_pte flag and
pass a pointer to the PTE (in init_mm).

After the page is mapped, the usual fault mechanism can be used to
update additional MMs.  This allows the vmalloc_sync_all() to be
removed from alloc_vm_area().

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 arch/x86/xen/grant-table.c         |    2 +-
 drivers/xen/xenbus/xenbus_client.c |   11 ++++++++---
 include/linux/vmalloc.h            |    2 +-
 mm/vmalloc.c                       |   27 +++++++++++++--------------
 4 files changed, 23 insertions(+), 19 deletions(-)

diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c
index 6bbfd7a..5a40d24 100644
--- a/arch/x86/xen/grant-table.c
+++ b/arch/x86/xen/grant-table.c
@@ -71,7 +71,7 @@ int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
 
 	if (shared == NULL) {
 		struct vm_struct *area =
-			alloc_vm_area(PAGE_SIZE * max_nr_gframes);
+			alloc_vm_area(PAGE_SIZE * max_nr_gframes, NULL);
 		BUG_ON(area == NULL);
 		shared = area->addr;
 		*__shared = shared;
diff --git a/drivers/xen/xenbus/xenbus_client.c b/drivers/xen/xenbus/xenbus_client.c
index 229d3ad..52bc57f 100644
--- a/drivers/xen/xenbus/xenbus_client.c
+++ b/drivers/xen/xenbus/xenbus_client.c
@@ -34,6 +34,7 @@
 #include <linux/types.h>
 #include <linux/vmalloc.h>
 #include <asm/xen/hypervisor.h>
+#include <asm/xen/page.h>
 #include <xen/interface/xen.h>
 #include <xen/interface/event_channel.h>
 #include <xen/events.h>
@@ -435,19 +436,20 @@ EXPORT_SYMBOL_GPL(xenbus_free_evtchn);
 int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
 {
 	struct gnttab_map_grant_ref op = {
-		.flags = GNTMAP_host_map,
+		.flags = GNTMAP_host_map | GNTMAP_contains_pte,
 		.ref   = gnt_ref,
 		.dom   = dev->otherend_id,
 	};
 	struct vm_struct *area;
+	pte_t *pte;
 
 	*vaddr = NULL;
 
-	area = alloc_vm_area(PAGE_SIZE);
+	area = alloc_vm_area(PAGE_SIZE, &pte);
 	if (!area)
 		return -ENOMEM;
 
-	op.host_addr = (unsigned long)area->addr;
+	op.host_addr = arbitrary_virt_to_machine(pte).maddr;
 
 	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
 		BUG();
@@ -526,6 +528,7 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
 	struct gnttab_unmap_grant_ref op = {
 		.host_addr = (unsigned long)vaddr,
 	};
+	unsigned int level;
 
 	/* It'd be nice if linux/vmalloc.h provided a find_vm_area(void *addr)
 	 * method so that we don't have to muck with vmalloc internals here.
@@ -547,6 +550,8 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
 	}
 
 	op.handle = (grant_handle_t)area->phys_addr;
+	op.host_addr = arbitrary_virt_to_machine(
+		lookup_address((unsigned long)vaddr, &level)).maddr;
 
 	if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
 		BUG();
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h
index 9332e52..1a77252 100644
--- a/include/linux/vmalloc.h
+++ b/include/linux/vmalloc.h
@@ -118,7 +118,7 @@ unmap_kernel_range(unsigned long addr, unsigned long size)
 #endif
 
 /* Allocate/destroy a 'vmalloc' VM area. */
-extern struct vm_struct *alloc_vm_area(size_t size);
+extern struct vm_struct *alloc_vm_area(size_t size, pte_t **ptes);
 extern void free_vm_area(struct vm_struct *area);
 
 /* for /dev/kmem */
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index 5016f19..b5deec6 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -2105,23 +2105,30 @@ void  __attribute__((weak)) vmalloc_sync_all(void)
 
 static int f(pte_t *pte, pgtable_t table, unsigned long addr, void *data)
 {
-	/* apply_to_page_range() does all the hard work. */
+	pte_t ***p = data;
+
+	if (p) {
+		*(*p) = pte;
+		(*p)++;
+	}
 	return 0;
 }
 
 /**
  *	alloc_vm_area - allocate a range of kernel address space
  *	@size:		size of the area
+ *	@ptes:		returns the PTEs for the address space
  *
  *	Returns:	NULL on failure, vm_struct on success
  *
  *	This function reserves a range of kernel address space, and
  *	allocates pagetables to map that range.  No actual mappings
- *	are created.  If the kernel address space is not shared
- *	between processes, it syncs the pagetable across all
- *	processes.
+ *	are created.
+ *
+ *	If @ptes is non-NULL, pointers to the PTEs (in init_mm)
+ *	allocated for the VM area are returned.
  */
-struct vm_struct *alloc_vm_area(size_t size)
+struct vm_struct *alloc_vm_area(size_t size, pte_t **ptes)
 {
 	struct vm_struct *area;
 
@@ -2135,19 +2142,11 @@ struct vm_struct *alloc_vm_area(size_t size)
 	 * of kernel virtual address space and mapped into init_mm.
 	 */
 	if (apply_to_page_range(&init_mm, (unsigned long)area->addr,
-				area->size, f, NULL)) {
+				size, f, ptes ? &ptes : NULL)) {
 		free_vm_area(area);
 		return NULL;
 	}
 
-	/*
-	 * If the allocated address space is passed to a hypercall
-	 * before being used then we cannot rely on a page fault to
-	 * trigger an update of the page tables.  So sync all the page
-	 * tables here.
-	 */
-	vmalloc_sync_all();
-
 	return area;
 }
 EXPORT_SYMBOL_GPL(alloc_vm_area);
-- 
1.7.7.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Nov 05 06:52:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 05 Nov 2011 06:52:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMgfi-0004VQ-O2; Sat, 05 Nov 2011 06:52:34 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMgeo-0004Ij-Di
	for xen-devel@lists.xensource.com; Sat, 05 Nov 2011 06:51:39 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1320501095!2403578!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3192 invoked from network); 5 Nov 2011 13:51:35 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Nov 2011 13:51:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,460,1315180800"; 
   d="scan'208";a="8775544"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Nov 2011 13:51:34 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sat, 5 Nov 2011 13:51:34 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RMgek-0003hw-7d;
	Sat, 05 Nov 2011 13:51:34 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RMgek-0000lu-6Z;
	Sat, 05 Nov 2011 13:51:34 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9711-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sat, 5 Nov 2011 13:51:34 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9711: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9711 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9711/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-pv             3 host-install(3)              broken
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 build-amd64-pvops             2 host-install(2)              broken
 test-amd64-i386-xl-credit2    3 host-install(3)              broken   in 9710
 test-amd64-i386-pv            3 host-install(3)              broken   in 9710
 test-amd64-amd64-xl          18 leak-check/check   fail in 9710 REGR. vs. 9661
 test-amd64-i386-xl-multivcpu 18 leak-check/check   fail in 9710 REGR. vs. 9661
 test-amd64-i386-xl           18 leak-check/check   fail in 9710 REGR. vs. 9661
 test-amd64-i386-xl-win-vcpus1  3 host-install(3)              broken   in 9710
 test-i386-i386-win            3 host-install(3)              broken   in 9710

Tests which are failing intermittently (not blocking):
 build-amd64                   4 xen-build                    fail pass in 9710

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pv            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pair          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked  n/a
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-win           1 xen-build-check(1)           blocked  n/a
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-pcipt-intel  9 guest-start         fail in 9710 never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2        fail in 9710 never pass
 test-amd64-amd64-xl-sedf      5 xen-boot                fail in 9710 like 9661
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2          fail in 9710 never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check       fail in 9710 never pass
 test-amd64-i386-win          16 leak-check/check       fail in 9710 never pass
 test-amd64-amd64-win         16 leak-check/check       fail in 9710 never pass
 test-amd64-amd64-xl-win      13 guest-stop             fail in 9710 never pass

version targeted for testing:
 xen                  604a90b803d3
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  fail    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           blocked 
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 blocked 
 test-amd64-i386-xl-credit2                                   blocked 
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               blocked 
 test-amd64-i386-xl-multivcpu                                 blocked 
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         blocked 
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           blocked 
 test-i386-i386-pv                                            broken  
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   blocked 
 test-amd64-i386-xl-win-vcpus1                                blocked 
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          blocked 
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24083:604a90b803d3
tag:         tip
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: Remove a passthrough device through QMP.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_pci.c |   72 +++++++++++++++++++++++++++++++---------------
     1 files changed, 48 insertions(+), 24 deletions(-)
    
    
changeset:   24082:e22e108e1c57
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_del
    
    To remove a pci passthough device from QEMU (upstream).
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_internal.h |    2 ++
     tools/libxl/libxl_qmp.c      |   35 +++++++++++++++++++++++++++++++++++
     2 files changed, 37 insertions(+), 0 deletions(-)
    
    
changeset:   24081:659c800d7edf
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Nov 04 15:55:50 2011 +0100
    
    x86/IRQ: fix create_irq() after c/s 24068:6928172f7ded
    
    init_one_irq_desc() must be called with interrupts enabled (as it may
    call functions from the xmalloc() group). Rather than mis-using
    vector_lock to also protect the finding of an unused IRQ, make this
    lockless through using cmpxchg(), and obtain the lock only around the
    actual assignment of the vector.
    
    Also fold find_unassigned_irq() into its only caller.
    
    It is, btw, questionable whether create_irq() calling
    __assign_irq_vector() (rather than assign_irq_vector()) is actually
    correct - desc->affinity appears to not get initialized properly in
    this case.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24080:974b00c7c2d0
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: Use QMP to insert a passthrough device when using upstream QEMU
    
    Also move the xenstore specific code to a new function and add a
    message if sscanf fails.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24079:a67944b1adfb
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_add.
    
    This function insert a PCI passthrough device in qemu.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24078:c5fe74068253
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_json: Handle number above LONG_MAX.
    
    The integers are now "long long" in the json_object.
    
    If a number (decimal or integer) is too big (or too low), it is stored as it in
    a string. So for that, we introduce a new type JSON_NUMBER.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24077:8d06378f1487
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_qmp: Introduce qmp_request_context.
    
    This structure helps to track the return code of a callback. It's only used
    between qmp_synchronous_send and qmp_send.
    
    Now, qmp_synchronous_send will return the rc of the callback if there is no
    error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24076:0406f6783c65
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Always insert a command id in the callback_list.
    
    Because the function qmp_synchronous_send rely on the presence of the id
    in the callback_list.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24075:918a2091c181
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Introduce list of arguments to qmp_send
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24074:9641b7594ed6
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl_qmp: Introduce an opaque argument to the callbacks.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24073:7b22d2f98302
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl: Introduce dm-version xenstore key.
    
    The all key is /libxl/$domid/dm-version.
    
    The /libxl/$domid dir is created with the domain and should be only accessible
    by the toolstack domain. The function libxl__xs_libxl_path() give this path.
    
    This come with libxl__device_model_version_running() helper function.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24072:cf8924724b61
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Better error message after a parse error.
    
    By setting the next string to parse after having printed any error messages.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24071:bdbd100b28ae
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_json: Check the parser status before to call parse_complete
    
    Also, use goto to handle an error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24070:e0b6b0e68e90
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Fix return check of fcntl
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24069:801ca6c0fbfa
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:28:41 2011 +0100
    
    x86/IRQ: consolidate IRQ disabling when acquiring vector lock
    
    __assign_irq_vector() doesn't need to disable interrupts (its callers
    are required to when acquiring the lock), and set_desc_affinity() can
    use the normal spin lock primitives.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24068:6928172f7ded
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:27:38 2011 +0100
    
    IRQ: allocate CPU masks dynamically
    
    This includes delaying the initialization of dynamically created IRQs
    until their actual first use and some further elimination of uses of
    struct irq_cfg.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24067:17ee4c213438
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Nov 05 10:18:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 05 Nov 2011 10:18:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMjsY-00016E-JD; Sat, 05 Nov 2011 10:18:02 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMjrr-0000uC-P4
	for xen-devel@lists.xensource.com; Sat, 05 Nov 2011 10:17:20 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1320513436!2414653!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12909 invoked from network); 5 Nov 2011 17:17:16 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Nov 2011 17:17:16 -0000
X-IronPort-AV: E=Sophos;i="4.69,461,1315180800"; 
   d="scan'208";a="8776199"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Nov 2011 17:17:16 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sat, 5 Nov 2011 17:17:16 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RMjrn-0004px-Kp;
	Sat, 05 Nov 2011 17:17:15 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RMjrn-0006zc-Jy;
	Sat, 05 Nov 2011 17:17:15 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9712-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sat, 5 Nov 2011 17:17:15 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9712: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9712 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9712/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-i386-rhel6hvm-intel  3 host-install(3)              broken
 test-amd64-i386-xl-credit2   18 leak-check/check           fail REGR. vs. 9661
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl           18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-multivcpu 18 leak-check/check           fail REGR. vs. 9661
 build-amd64-pvops             2 host-install(2)              broken
 test-amd64-i386-xl-win-vcpus1  3 host-install(3)              broken

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a

version targeted for testing:
 xen                  604a90b803d3
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               broken  
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                broken  
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24083:604a90b803d3
tag:         tip
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: Remove a passthrough device through QMP.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_pci.c |   72 +++++++++++++++++++++++++++++++---------------
     1 files changed, 48 insertions(+), 24 deletions(-)
    
    
changeset:   24082:e22e108e1c57
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_del
    
    To remove a pci passthough device from QEMU (upstream).
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_internal.h |    2 ++
     tools/libxl/libxl_qmp.c      |   35 +++++++++++++++++++++++++++++++++++
     2 files changed, 37 insertions(+), 0 deletions(-)
    
    
changeset:   24081:659c800d7edf
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Nov 04 15:55:50 2011 +0100
    
    x86/IRQ: fix create_irq() after c/s 24068:6928172f7ded
    
    init_one_irq_desc() must be called with interrupts enabled (as it may
    call functions from the xmalloc() group). Rather than mis-using
    vector_lock to also protect the finding of an unused IRQ, make this
    lockless through using cmpxchg(), and obtain the lock only around the
    actual assignment of the vector.
    
    Also fold find_unassigned_irq() into its only caller.
    
    It is, btw, questionable whether create_irq() calling
    __assign_irq_vector() (rather than assign_irq_vector()) is actually
    correct - desc->affinity appears to not get initialized properly in
    this case.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24080:974b00c7c2d0
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: Use QMP to insert a passthrough device when using upstream QEMU
    
    Also move the xenstore specific code to a new function and add a
    message if sscanf fails.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24079:a67944b1adfb
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_add.
    
    This function insert a PCI passthrough device in qemu.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24078:c5fe74068253
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_json: Handle number above LONG_MAX.
    
    The integers are now "long long" in the json_object.
    
    If a number (decimal or integer) is too big (or too low), it is stored as it in
    a string. So for that, we introduce a new type JSON_NUMBER.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24077:8d06378f1487
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_qmp: Introduce qmp_request_context.
    
    This structure helps to track the return code of a callback. It's only used
    between qmp_synchronous_send and qmp_send.
    
    Now, qmp_synchronous_send will return the rc of the callback if there is no
    error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24076:0406f6783c65
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Always insert a command id in the callback_list.
    
    Because the function qmp_synchronous_send rely on the presence of the id
    in the callback_list.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24075:918a2091c181
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Introduce list of arguments to qmp_send
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24074:9641b7594ed6
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl_qmp: Introduce an opaque argument to the callbacks.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24073:7b22d2f98302
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl: Introduce dm-version xenstore key.
    
    The all key is /libxl/$domid/dm-version.
    
    The /libxl/$domid dir is created with the domain and should be only accessible
    by the toolstack domain. The function libxl__xs_libxl_path() give this path.
    
    This come with libxl__device_model_version_running() helper function.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24072:cf8924724b61
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Better error message after a parse error.
    
    By setting the next string to parse after having printed any error messages.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24071:bdbd100b28ae
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_json: Check the parser status before to call parse_complete
    
    Also, use goto to handle an error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24070:e0b6b0e68e90
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Fix return check of fcntl
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24069:801ca6c0fbfa
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:28:41 2011 +0100
    
    x86/IRQ: consolidate IRQ disabling when acquiring vector lock
    
    __assign_irq_vector() doesn't need to disable interrupts (its callers
    are required to when acquiring the lock), and set_desc_affinity() can
    use the normal spin lock primitives.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24068:6928172f7ded
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:27:38 2011 +0100
    
    IRQ: allocate CPU masks dynamically
    
    This includes delaying the initialization of dynamically created IRQs
    until their actual first use and some further elimination of uses of
    struct irq_cfg.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24067:17ee4c213438
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Nov 05 13:31:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 05 Nov 2011 13:31:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMmuC-0007gs-Nw; Sat, 05 Nov 2011 13:31:56 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMmtQ-0007Un-Og
	for xen-devel@lists.xensource.com; Sat, 05 Nov 2011 13:31:09 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320525040!51604525!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1598 invoked from network); 5 Nov 2011 20:30:40 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Nov 2011 20:30:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,461,1315180800"; 
   d="scan'208";a="8776517"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Nov 2011 20:31:04 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sat, 5 Nov 2011 20:31:04 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RMmtM-0005tx-HD;
	Sat, 05 Nov 2011 20:31:04 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RMmtM-0005k3-6H;
	Sat, 05 Nov 2011 20:31:04 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9713-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sat, 5 Nov 2011 20:31:04 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9713: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9713 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9713/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-i386-rhel6hvm-intel  3 host-install(3)              broken
 test-i386-i386-pv             3 host-install(3)              broken
 test-amd64-i386-xl-credit2   18 leak-check/check           fail REGR. vs. 9661
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl           18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-multivcpu 18 leak-check/check           fail REGR. vs. 9661
 build-amd64-pvops             2 host-install(2)              broken
 test-i386-i386-xl-win         3 host-install(3)              broken

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a

version targeted for testing:
 xen                  604a90b803d3
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               broken  
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            broken  
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        broken  


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24083:604a90b803d3
tag:         tip
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: Remove a passthrough device through QMP.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_pci.c |   72 +++++++++++++++++++++++++++++++---------------
     1 files changed, 48 insertions(+), 24 deletions(-)
    
    
changeset:   24082:e22e108e1c57
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_del
    
    To remove a pci passthough device from QEMU (upstream).
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_internal.h |    2 ++
     tools/libxl/libxl_qmp.c      |   35 +++++++++++++++++++++++++++++++++++
     2 files changed, 37 insertions(+), 0 deletions(-)
    
    
changeset:   24081:659c800d7edf
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Nov 04 15:55:50 2011 +0100
    
    x86/IRQ: fix create_irq() after c/s 24068:6928172f7ded
    
    init_one_irq_desc() must be called with interrupts enabled (as it may
    call functions from the xmalloc() group). Rather than mis-using
    vector_lock to also protect the finding of an unused IRQ, make this
    lockless through using cmpxchg(), and obtain the lock only around the
    actual assignment of the vector.
    
    Also fold find_unassigned_irq() into its only caller.
    
    It is, btw, questionable whether create_irq() calling
    __assign_irq_vector() (rather than assign_irq_vector()) is actually
    correct - desc->affinity appears to not get initialized properly in
    this case.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24080:974b00c7c2d0
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: Use QMP to insert a passthrough device when using upstream QEMU
    
    Also move the xenstore specific code to a new function and add a
    message if sscanf fails.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24079:a67944b1adfb
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_add.
    
    This function insert a PCI passthrough device in qemu.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24078:c5fe74068253
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_json: Handle number above LONG_MAX.
    
    The integers are now "long long" in the json_object.
    
    If a number (decimal or integer) is too big (or too low), it is stored as it in
    a string. So for that, we introduce a new type JSON_NUMBER.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24077:8d06378f1487
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_qmp: Introduce qmp_request_context.
    
    This structure helps to track the return code of a callback. It's only used
    between qmp_synchronous_send and qmp_send.
    
    Now, qmp_synchronous_send will return the rc of the callback if there is no
    error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24076:0406f6783c65
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Always insert a command id in the callback_list.
    
    Because the function qmp_synchronous_send rely on the presence of the id
    in the callback_list.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24075:918a2091c181
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Introduce list of arguments to qmp_send
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24074:9641b7594ed6
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl_qmp: Introduce an opaque argument to the callbacks.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24073:7b22d2f98302
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl: Introduce dm-version xenstore key.
    
    The all key is /libxl/$domid/dm-version.
    
    The /libxl/$domid dir is created with the domain and should be only accessible
    by the toolstack domain. The function libxl__xs_libxl_path() give this path.
    
    This come with libxl__device_model_version_running() helper function.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24072:cf8924724b61
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Better error message after a parse error.
    
    By setting the next string to parse after having printed any error messages.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24071:bdbd100b28ae
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_json: Check the parser status before to call parse_complete
    
    Also, use goto to handle an error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24070:e0b6b0e68e90
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Fix return check of fcntl
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24069:801ca6c0fbfa
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:28:41 2011 +0100
    
    x86/IRQ: consolidate IRQ disabling when acquiring vector lock
    
    __assign_irq_vector() doesn't need to disable interrupts (its callers
    are required to when acquiring the lock), and set_desc_affinity() can
    use the normal spin lock primitives.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24068:6928172f7ded
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:27:38 2011 +0100
    
    IRQ: allocate CPU masks dynamically
    
    This includes delaying the initialization of dynamically created IRQs
    until their actual first use and some further elimination of uses of
    struct irq_cfg.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24067:17ee4c213438
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Nov 05 21:08:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 05 Nov 2011 21:08:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RMu1d-00017L-Rc; Sat, 05 Nov 2011 21:08:05 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMu0k-0000um-J7
	for xen-devel@lists.xensource.com; Sat, 05 Nov 2011 21:07:19 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1320552427!2442699!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14724 invoked from network); 6 Nov 2011 04:07:07 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Nov 2011 04:07:07 -0000
X-IronPort-AV: E=Sophos;i="4.69,464,1315180800"; 
   d="scan'208";a="8777581"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Nov 2011 04:07:06 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 6 Nov 2011 04:07:06 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RMu0g-0008PP-CK;
	Sun, 06 Nov 2011 04:07:06 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RMu0g-0000OO-7c;
	Sun, 06 Nov 2011 04:07:06 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9715-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sun, 6 Nov 2011 04:07:06 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9715: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9715 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9715/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl            3 host-install(3)              broken
 test-amd64-i386-xl-credit2   18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-multivcpu 18 leak-check/check           fail REGR. vs. 9661
 build-amd64-pvops             2 host-install(2)              broken
 test-amd64-i386-xl-win-vcpus1  3 host-install(3)              broken
 test-i386-i386-win            3 host-install(3)              broken

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a

version targeted for testing:
 xen                  604a90b803d3
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           broken  
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                broken  
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           broken  
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24083:604a90b803d3
tag:         tip
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: Remove a passthrough device through QMP.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_pci.c |   72 +++++++++++++++++++++++++++++++---------------
     1 files changed, 48 insertions(+), 24 deletions(-)
    
    
changeset:   24082:e22e108e1c57
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_del
    
    To remove a pci passthough device from QEMU (upstream).
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_internal.h |    2 ++
     tools/libxl/libxl_qmp.c      |   35 +++++++++++++++++++++++++++++++++++
     2 files changed, 37 insertions(+), 0 deletions(-)
    
    
changeset:   24081:659c800d7edf
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Nov 04 15:55:50 2011 +0100
    
    x86/IRQ: fix create_irq() after c/s 24068:6928172f7ded
    
    init_one_irq_desc() must be called with interrupts enabled (as it may
    call functions from the xmalloc() group). Rather than mis-using
    vector_lock to also protect the finding of an unused IRQ, make this
    lockless through using cmpxchg(), and obtain the lock only around the
    actual assignment of the vector.
    
    Also fold find_unassigned_irq() into its only caller.
    
    It is, btw, questionable whether create_irq() calling
    __assign_irq_vector() (rather than assign_irq_vector()) is actually
    correct - desc->affinity appears to not get initialized properly in
    this case.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24080:974b00c7c2d0
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: Use QMP to insert a passthrough device when using upstream QEMU
    
    Also move the xenstore specific code to a new function and add a
    message if sscanf fails.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24079:a67944b1adfb
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_add.
    
    This function insert a PCI passthrough device in qemu.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24078:c5fe74068253
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_json: Handle number above LONG_MAX.
    
    The integers are now "long long" in the json_object.
    
    If a number (decimal or integer) is too big (or too low), it is stored as it in
    a string. So for that, we introduce a new type JSON_NUMBER.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24077:8d06378f1487
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_qmp: Introduce qmp_request_context.
    
    This structure helps to track the return code of a callback. It's only used
    between qmp_synchronous_send and qmp_send.
    
    Now, qmp_synchronous_send will return the rc of the callback if there is no
    error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24076:0406f6783c65
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Always insert a command id in the callback_list.
    
    Because the function qmp_synchronous_send rely on the presence of the id
    in the callback_list.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24075:918a2091c181
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Introduce list of arguments to qmp_send
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24074:9641b7594ed6
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl_qmp: Introduce an opaque argument to the callbacks.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24073:7b22d2f98302
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl: Introduce dm-version xenstore key.
    
    The all key is /libxl/$domid/dm-version.
    
    The /libxl/$domid dir is created with the domain and should be only accessible
    by the toolstack domain. The function libxl__xs_libxl_path() give this path.
    
    This come with libxl__device_model_version_running() helper function.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24072:cf8924724b61
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Better error message after a parse error.
    
    By setting the next string to parse after having printed any error messages.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24071:bdbd100b28ae
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_json: Check the parser status before to call parse_complete
    
    Also, use goto to handle an error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24070:e0b6b0e68e90
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Fix return check of fcntl
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24069:801ca6c0fbfa
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:28:41 2011 +0100
    
    x86/IRQ: consolidate IRQ disabling when acquiring vector lock
    
    __assign_irq_vector() doesn't need to disable interrupts (its callers
    are required to when acquiring the lock), and set_desc_affinity() can
    use the normal spin lock primitives.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24068:6928172f7ded
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:27:38 2011 +0100
    
    IRQ: allocate CPU masks dynamically
    
    This includes delaying the initialization of dynamically created IRQs
    until their actual first use and some further elimination of uses of
    struct irq_cfg.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24067:17ee4c213438
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 06 06:13:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 06 Nov 2011 06:13:40 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RN3Tg-0000q3-At; Sun, 06 Nov 2011 06:13:40 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RN3Sx-0000dP-LF
	for xen-devel@lists.xensource.com; Sun, 06 Nov 2011 06:12:55 -0800
X-Env-Sender: universalbillow@gmail.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1320588771!468775!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6558 invoked from network); 6 Nov 2011 14:12:52 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-11.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Nov 2011 14:12:52 -0000
Received: by gyg8 with SMTP id 8so6497120gyg.30
	for <xen-devel@lists.xensource.com>;
	Sun, 06 Nov 2011 06:12:51 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=nBimI+U0n01kitu1Wivj3sV68iWaVNRzuKRUjiDW3z4=;
	b=gmQPe2hKvgb9MME1ErZFmMCfNa43+25cZrtAFbTNs6k7/sX5hm65vP3P73nSgzRjHG
	xqRj347YHBlzoEw1J9x+bgWG2gFeCJ2LX7H9HXsGnVTTOblmXnwKOeMS8rhLZ/Ftxvjc
	RQW3vD99rFvSIqcY3aEC/JwtcLAXGV7R91p0I=
MIME-Version: 1.0
Received: by 10.236.173.39 with SMTP id u27mr28905331yhl.75.1320588770936;
	Sun, 06 Nov 2011 06:12:50 -0800 (PST)
Received: by 10.236.36.2 with HTTP; Sun, 6 Nov 2011 06:12:50 -0800 (PST)
Date: Sun, 6 Nov 2011 22:12:50 +0800
Message-ID: <CADWh-PGMZXWnnSqB5zmSTnLSR66EtX9WnXcn=ZZLNQ=P5mGV7g@mail.gmail.com>
Subject: [Xen-devel] Question about HVM network
From: cc Luit <universalbillow@gmail.com>
To: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0043556936=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0043556936==
Content-Type: multipart/alternative; boundary=20cf305e26239608ad04b111882d

--20cf305e26239608ad04b111882d
Content-Type: text/plain; charset=ISO-8859-1

Hi, all,

I've a question about how network of HVM works,
when hvm startup, I found the qemu register the io port 0xc100-0xc1ff to
the function rtl8139_ioport_write, is this means qemu emulate the rtl8139
NIC to handle network io event?

but when I scp a file to the remote machine, I cannot find any write to
these ports, so I'm curious how hvm's network works?

first I'm not using the passthrough, so I think that it will use DMA: after
it write the content to the memory, it will use PIO to write to one of the
port to tell the qemu it need to start DMA, but there is no write to the
port, then how does the rtc8139 emulated by qemu know when to start the DMA
and where is the memory address?

hope someone can help me~ thanks in advance.

-- 
- Luit @ Parallel Processing Institute, Fudan University

--20cf305e26239608ad04b111882d
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hi, all,<div><br></div><div>I&#39;ve a question about how network of HVM wo=
rks,=A0</div><div>when hvm startup, I found the qemu register the io port 0=
xc100-0xc1ff to the function rtl8139_ioport_write, is this means qemu emula=
te the rtl8139 NIC to handle network io event?</div>
<div><br></div><div>but when I scp a file to the remote machine, I cannot f=
ind any write to these ports, so I&#39;m curious how hvm&#39;s network work=
s?</div><div><br></div><div>first I&#39;m not using the passthrough, so I t=
hink that it will use DMA: after it write the content to the memory, it wil=
l use PIO to write to one of the port to tell the qemu it need to start DMA=
, but there is no write to the port, then how does the rtc8139 emulated by =
qemu know when to start the DMA and where is the memory address?</div>
<div><br></div><div>hope someone can help me~ thanks in advance.<br clear=
=3D"all"><div><br></div>-- <br>- Luit @ Parallel Processing Institute, Fuda=
n University=A0<br>
</div>

--20cf305e26239608ad04b111882d--


--===============0043556936==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0043556936==--


From xen-devel-bounces@lists.xensource.com Sun Nov 06 06:19:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 06 Nov 2011 06:19:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RN3Z0-0001Hc-7l; Sun, 06 Nov 2011 06:19:10 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RN3YN-00015J-MF
	for xen-devel@lists.xensource.com; Sun, 06 Nov 2011 06:18:32 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1320589108!465670!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14410 invoked from network); 6 Nov 2011 14:18:28 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Nov 2011 14:18:28 -0000
X-IronPort-AV: E=Sophos;i="4.69,464,1315180800"; 
   d="scan'208";a="8779344"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Nov 2011 14:18:28 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 6 Nov 2011 14:18:27 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RN3YJ-0003ME-Ha;
	Sun, 06 Nov 2011 14:18:27 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RN3YJ-0006kk-Bg;
	Sun, 06 Nov 2011 14:18:27 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9716-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sun, 6 Nov 2011 14:18:27 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9716: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9716 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9716/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-i386-rhel6hvm-intel  3 host-install(3)              broken
 test-i386-i386-pv             3 host-install(3)              broken
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl           18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-credit2   18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-multivcpu 18 leak-check/check           fail REGR. vs. 9661
 build-amd64-pvops             2 host-install(2)              broken
 test-amd64-i386-xl-win-vcpus1  3 host-install(3)              broken

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a

version targeted for testing:
 xen                  604a90b803d3
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               broken  
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            broken  
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                broken  
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24083:604a90b803d3
tag:         tip
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: Remove a passthrough device through QMP.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_pci.c |   72 +++++++++++++++++++++++++++++++---------------
     1 files changed, 48 insertions(+), 24 deletions(-)
    
    
changeset:   24082:e22e108e1c57
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_del
    
    To remove a pci passthough device from QEMU (upstream).
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_internal.h |    2 ++
     tools/libxl/libxl_qmp.c      |   35 +++++++++++++++++++++++++++++++++++
     2 files changed, 37 insertions(+), 0 deletions(-)
    
    
changeset:   24081:659c800d7edf
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Nov 04 15:55:50 2011 +0100
    
    x86/IRQ: fix create_irq() after c/s 24068:6928172f7ded
    
    init_one_irq_desc() must be called with interrupts enabled (as it may
    call functions from the xmalloc() group). Rather than mis-using
    vector_lock to also protect the finding of an unused IRQ, make this
    lockless through using cmpxchg(), and obtain the lock only around the
    actual assignment of the vector.
    
    Also fold find_unassigned_irq() into its only caller.
    
    It is, btw, questionable whether create_irq() calling
    __assign_irq_vector() (rather than assign_irq_vector()) is actually
    correct - desc->affinity appears to not get initialized properly in
    this case.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24080:974b00c7c2d0
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: Use QMP to insert a passthrough device when using upstream QEMU
    
    Also move the xenstore specific code to a new function and add a
    message if sscanf fails.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24079:a67944b1adfb
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_add.
    
    This function insert a PCI passthrough device in qemu.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24078:c5fe74068253
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_json: Handle number above LONG_MAX.
    
    The integers are now "long long" in the json_object.
    
    If a number (decimal or integer) is too big (or too low), it is stored as it in
    a string. So for that, we introduce a new type JSON_NUMBER.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24077:8d06378f1487
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_qmp: Introduce qmp_request_context.
    
    This structure helps to track the return code of a callback. It's only used
    between qmp_synchronous_send and qmp_send.
    
    Now, qmp_synchronous_send will return the rc of the callback if there is no
    error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24076:0406f6783c65
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Always insert a command id in the callback_list.
    
    Because the function qmp_synchronous_send rely on the presence of the id
    in the callback_list.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24075:918a2091c181
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Introduce list of arguments to qmp_send
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24074:9641b7594ed6
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl_qmp: Introduce an opaque argument to the callbacks.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24073:7b22d2f98302
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl: Introduce dm-version xenstore key.
    
    The all key is /libxl/$domid/dm-version.
    
    The /libxl/$domid dir is created with the domain and should be only accessible
    by the toolstack domain. The function libxl__xs_libxl_path() give this path.
    
    This come with libxl__device_model_version_running() helper function.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24072:cf8924724b61
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Better error message after a parse error.
    
    By setting the next string to parse after having printed any error messages.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24071:bdbd100b28ae
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_json: Check the parser status before to call parse_complete
    
    Also, use goto to handle an error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24070:e0b6b0e68e90
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Fix return check of fcntl
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24069:801ca6c0fbfa
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:28:41 2011 +0100
    
    x86/IRQ: consolidate IRQ disabling when acquiring vector lock
    
    __assign_irq_vector() doesn't need to disable interrupts (its callers
    are required to when acquiring the lock), and set_desc_affinity() can
    use the normal spin lock primitives.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24068:6928172f7ded
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:27:38 2011 +0100
    
    IRQ: allocate CPU masks dynamically
    
    This includes delaying the initialization of dynamically created IRQs
    until their actual first use and some further elimination of uses of
    struct irq_cfg.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24067:17ee4c213438
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 06 09:35:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 06 Nov 2011 09:35:01 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RN6cX-0004pH-0K; Sun, 06 Nov 2011 09:35:01 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RN6bh-0004d8-Nl
	for xen-devel@lists.xensource.com; Sun, 06 Nov 2011 09:34:10 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1320600846!481401!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14089 invoked from network); 6 Nov 2011 17:34:06 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Nov 2011 17:34:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,464,1315180800"; 
   d="scan'208";a="8779991"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Nov 2011 17:34:04 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 6 Nov 2011 17:34:04 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RN6bc-0004QV-6A;
	Sun, 06 Nov 2011 17:34:04 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RN6bb-00085P-UB;
	Sun, 06 Nov 2011 17:34:04 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9717-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sun, 6 Nov 2011 17:34:03 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9717: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9717 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9717/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-i386-rhel6hvm-intel  3 host-install(3)              broken
 test-i386-i386-pv             3 host-install(3)              broken
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl           18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-credit2   18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-multivcpu 18 leak-check/check           fail REGR. vs. 9661
 build-amd64-pvops             2 host-install(2)              broken
 test-i386-i386-xl-win         3 host-install(3)              broken

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a

version targeted for testing:
 xen                  604a90b803d3
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               broken  
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            broken  
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        broken  


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24083:604a90b803d3
tag:         tip
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: Remove a passthrough device through QMP.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_pci.c |   72 +++++++++++++++++++++++++++++++---------------
     1 files changed, 48 insertions(+), 24 deletions(-)
    
    
changeset:   24082:e22e108e1c57
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_del
    
    To remove a pci passthough device from QEMU (upstream).
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_internal.h |    2 ++
     tools/libxl/libxl_qmp.c      |   35 +++++++++++++++++++++++++++++++++++
     2 files changed, 37 insertions(+), 0 deletions(-)
    
    
changeset:   24081:659c800d7edf
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Nov 04 15:55:50 2011 +0100
    
    x86/IRQ: fix create_irq() after c/s 24068:6928172f7ded
    
    init_one_irq_desc() must be called with interrupts enabled (as it may
    call functions from the xmalloc() group). Rather than mis-using
    vector_lock to also protect the finding of an unused IRQ, make this
    lockless through using cmpxchg(), and obtain the lock only around the
    actual assignment of the vector.
    
    Also fold find_unassigned_irq() into its only caller.
    
    It is, btw, questionable whether create_irq() calling
    __assign_irq_vector() (rather than assign_irq_vector()) is actually
    correct - desc->affinity appears to not get initialized properly in
    this case.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24080:974b00c7c2d0
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: Use QMP to insert a passthrough device when using upstream QEMU
    
    Also move the xenstore specific code to a new function and add a
    message if sscanf fails.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24079:a67944b1adfb
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_add.
    
    This function insert a PCI passthrough device in qemu.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24078:c5fe74068253
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_json: Handle number above LONG_MAX.
    
    The integers are now "long long" in the json_object.
    
    If a number (decimal or integer) is too big (or too low), it is stored as it in
    a string. So for that, we introduce a new type JSON_NUMBER.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24077:8d06378f1487
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_qmp: Introduce qmp_request_context.
    
    This structure helps to track the return code of a callback. It's only used
    between qmp_synchronous_send and qmp_send.
    
    Now, qmp_synchronous_send will return the rc of the callback if there is no
    error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24076:0406f6783c65
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Always insert a command id in the callback_list.
    
    Because the function qmp_synchronous_send rely on the presence of the id
    in the callback_list.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24075:918a2091c181
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Introduce list of arguments to qmp_send
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24074:9641b7594ed6
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl_qmp: Introduce an opaque argument to the callbacks.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24073:7b22d2f98302
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl: Introduce dm-version xenstore key.
    
    The all key is /libxl/$domid/dm-version.
    
    The /libxl/$domid dir is created with the domain and should be only accessible
    by the toolstack domain. The function libxl__xs_libxl_path() give this path.
    
    This come with libxl__device_model_version_running() helper function.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24072:cf8924724b61
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Better error message after a parse error.
    
    By setting the next string to parse after having printed any error messages.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24071:bdbd100b28ae
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_json: Check the parser status before to call parse_complete
    
    Also, use goto to handle an error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24070:e0b6b0e68e90
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Fix return check of fcntl
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24069:801ca6c0fbfa
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:28:41 2011 +0100
    
    x86/IRQ: consolidate IRQ disabling when acquiring vector lock
    
    __assign_irq_vector() doesn't need to disable interrupts (its callers
    are required to when acquiring the lock), and set_desc_affinity() can
    use the normal spin lock primitives.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24068:6928172f7ded
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:27:38 2011 +0100
    
    IRQ: allocate CPU masks dynamically
    
    This includes delaying the initialization of dynamically created IRQs
    until their actual first use and some further elimination of uses of
    struct irq_cfg.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24067:17ee4c213438
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 06 11:51:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 06 Nov 2011 11:51:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RN8kL-0007MK-G1; Sun, 06 Nov 2011 11:51:13 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RN8jW-0007A1-Fo
	for xen-devel@lists.xensource.com; Sun, 06 Nov 2011 11:50:23 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1320609019!3823358!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9312 invoked from network); 6 Nov 2011 19:50:19 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Nov 2011 19:50:19 -0000
X-IronPort-AV: E=Sophos;i="4.69,465,1315180800"; 
   d="scan'208";a="8781007"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Nov 2011 19:50:18 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 6 Nov 2011 19:50:18 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RN8jR-0005As-P4;
	Sun, 06 Nov 2011 19:50:17 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RN8jR-0005UC-Og;
	Sun, 06 Nov 2011 19:50:17 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9718-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sun, 6 Nov 2011 19:50:17 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9718: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9718 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9718/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-pv             3 host-install(3)              broken
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 build-amd64-pvops             2 host-install(2)              broken
 test-i386-i386-win            3 host-install(3)              broken
 test-amd64-i386-rhel6hvm-intel  3 host-install(3)              broken  in 9717
 test-amd64-i386-xl           18 leak-check/check   fail in 9717 REGR. vs. 9661
 test-amd64-i386-xl-credit2   18 leak-check/check   fail in 9717 REGR. vs. 9661
 test-amd64-i386-xl-multivcpu 18 leak-check/check   fail in 9717 REGR. vs. 9661
 test-i386-i386-xl-win         3 host-install(3)              broken   in 9717

Tests which are failing intermittently (not blocking):
 build-amd64-oldkern           4 xen-build                    fail pass in 9717
 build-amd64                   4 xen-build                    fail pass in 9717

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pv            1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pair          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked  n/a
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-win           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2          fail in 9717 never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check       fail in 9717 never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop            fail in 9717 never pass
 test-amd64-i386-win          16 leak-check/check       fail in 9717 never pass
 test-i386-i386-win           16 leak-check/check       fail in 9717 never pass

version targeted for testing:
 xen                  604a90b803d3
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  fail    
 build-i386                                                   pass    
 build-amd64-oldkern                                          fail    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           blocked 
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 blocked 
 test-amd64-i386-xl-credit2                                   blocked 
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               blocked 
 test-amd64-i386-xl-multivcpu                                 blocked 
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         blocked 
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           blocked 
 test-i386-i386-pv                                            broken  
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   blocked 
 test-amd64-i386-xl-win-vcpus1                                blocked 
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          blocked 
 test-i386-i386-win                                           broken  
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24083:604a90b803d3
tag:         tip
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: Remove a passthrough device through QMP.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_pci.c |   72 +++++++++++++++++++++++++++++++---------------
     1 files changed, 48 insertions(+), 24 deletions(-)
    
    
changeset:   24082:e22e108e1c57
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_del
    
    To remove a pci passthough device from QEMU (upstream).
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_internal.h |    2 ++
     tools/libxl/libxl_qmp.c      |   35 +++++++++++++++++++++++++++++++++++
     2 files changed, 37 insertions(+), 0 deletions(-)
    
    
changeset:   24081:659c800d7edf
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Nov 04 15:55:50 2011 +0100
    
    x86/IRQ: fix create_irq() after c/s 24068:6928172f7ded
    
    init_one_irq_desc() must be called with interrupts enabled (as it may
    call functions from the xmalloc() group). Rather than mis-using
    vector_lock to also protect the finding of an unused IRQ, make this
    lockless through using cmpxchg(), and obtain the lock only around the
    actual assignment of the vector.
    
    Also fold find_unassigned_irq() into its only caller.
    
    It is, btw, questionable whether create_irq() calling
    __assign_irq_vector() (rather than assign_irq_vector()) is actually
    correct - desc->affinity appears to not get initialized properly in
    this case.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24080:974b00c7c2d0
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: Use QMP to insert a passthrough device when using upstream QEMU
    
    Also move the xenstore specific code to a new function and add a
    message if sscanf fails.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24079:a67944b1adfb
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_add.
    
    This function insert a PCI passthrough device in qemu.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24078:c5fe74068253
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_json: Handle number above LONG_MAX.
    
    The integers are now "long long" in the json_object.
    
    If a number (decimal or integer) is too big (or too low), it is stored as it in
    a string. So for that, we introduce a new type JSON_NUMBER.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24077:8d06378f1487
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_qmp: Introduce qmp_request_context.
    
    This structure helps to track the return code of a callback. It's only used
    between qmp_synchronous_send and qmp_send.
    
    Now, qmp_synchronous_send will return the rc of the callback if there is no
    error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24076:0406f6783c65
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Always insert a command id in the callback_list.
    
    Because the function qmp_synchronous_send rely on the presence of the id
    in the callback_list.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24075:918a2091c181
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Introduce list of arguments to qmp_send
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24074:9641b7594ed6
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl_qmp: Introduce an opaque argument to the callbacks.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24073:7b22d2f98302
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl: Introduce dm-version xenstore key.
    
    The all key is /libxl/$domid/dm-version.
    
    The /libxl/$domid dir is created with the domain and should be only accessible
    by the toolstack domain. The function libxl__xs_libxl_path() give this path.
    
    This come with libxl__device_model_version_running() helper function.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24072:cf8924724b61
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Better error message after a parse error.
    
    By setting the next string to parse after having printed any error messages.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24071:bdbd100b28ae
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_json: Check the parser status before to call parse_complete
    
    Also, use goto to handle an error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24070:e0b6b0e68e90
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Fix return check of fcntl
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24069:801ca6c0fbfa
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:28:41 2011 +0100
    
    x86/IRQ: consolidate IRQ disabling when acquiring vector lock
    
    __assign_irq_vector() doesn't need to disable interrupts (its callers
    are required to when acquiring the lock), and set_desc_affinity() can
    use the normal spin lock primitives.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24068:6928172f7ded
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:27:38 2011 +0100
    
    IRQ: allocate CPU masks dynamically
    
    This includes delaying the initialization of dynamically created IRQs
    until their actual first use and some further elimination of uses of
    struct irq_cfg.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24067:17ee4c213438
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 06 14:16:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 06 Nov 2011 14:16:26 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNB0r-00038x-T2; Sun, 06 Nov 2011 14:16:25 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNAzy-0002wB-Jc
	for xen-devel@lists.xensource.com; Sun, 06 Nov 2011 14:15:31 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1320617725!488740!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20916 invoked from network); 6 Nov 2011 22:15:26 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-12.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Nov 2011 22:15:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,465,1315180800"; 
   d="scan'208";a="8781388"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Nov 2011 22:15:25 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 6 Nov 2011 22:15:25 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RNAzs-0005yR-Qq;
	Sun, 06 Nov 2011 22:15:24 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RNAzs-0003qF-JV;
	Sun, 06 Nov 2011 22:15:24 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9719-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sun, 6 Nov 2011 22:15:24 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9719: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9719 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9719/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl           18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-credit2    3 host-install(3)              broken
 test-amd64-i386-xl-multivcpu 18 leak-check/check           fail REGR. vs. 9661
 build-amd64-pvops             2 host-install(2)              broken
 test-i386-i386-win            3 host-install(3)              broken

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a

version targeted for testing:
 xen                  604a90b803d3
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   broken  
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           broken  
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24083:604a90b803d3
tag:         tip
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: Remove a passthrough device through QMP.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_pci.c |   72 +++++++++++++++++++++++++++++++---------------
     1 files changed, 48 insertions(+), 24 deletions(-)
    
    
changeset:   24082:e22e108e1c57
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_del
    
    To remove a pci passthough device from QEMU (upstream).
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_internal.h |    2 ++
     tools/libxl/libxl_qmp.c      |   35 +++++++++++++++++++++++++++++++++++
     2 files changed, 37 insertions(+), 0 deletions(-)
    
    
changeset:   24081:659c800d7edf
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Nov 04 15:55:50 2011 +0100
    
    x86/IRQ: fix create_irq() after c/s 24068:6928172f7ded
    
    init_one_irq_desc() must be called with interrupts enabled (as it may
    call functions from the xmalloc() group). Rather than mis-using
    vector_lock to also protect the finding of an unused IRQ, make this
    lockless through using cmpxchg(), and obtain the lock only around the
    actual assignment of the vector.
    
    Also fold find_unassigned_irq() into its only caller.
    
    It is, btw, questionable whether create_irq() calling
    __assign_irq_vector() (rather than assign_irq_vector()) is actually
    correct - desc->affinity appears to not get initialized properly in
    this case.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24080:974b00c7c2d0
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: Use QMP to insert a passthrough device when using upstream QEMU
    
    Also move the xenstore specific code to a new function and add a
    message if sscanf fails.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24079:a67944b1adfb
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_add.
    
    This function insert a PCI passthrough device in qemu.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24078:c5fe74068253
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_json: Handle number above LONG_MAX.
    
    The integers are now "long long" in the json_object.
    
    If a number (decimal or integer) is too big (or too low), it is stored as it in
    a string. So for that, we introduce a new type JSON_NUMBER.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24077:8d06378f1487
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_qmp: Introduce qmp_request_context.
    
    This structure helps to track the return code of a callback. It's only used
    between qmp_synchronous_send and qmp_send.
    
    Now, qmp_synchronous_send will return the rc of the callback if there is no
    error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24076:0406f6783c65
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Always insert a command id in the callback_list.
    
    Because the function qmp_synchronous_send rely on the presence of the id
    in the callback_list.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24075:918a2091c181
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Introduce list of arguments to qmp_send
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24074:9641b7594ed6
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl_qmp: Introduce an opaque argument to the callbacks.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24073:7b22d2f98302
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl: Introduce dm-version xenstore key.
    
    The all key is /libxl/$domid/dm-version.
    
    The /libxl/$domid dir is created with the domain and should be only accessible
    by the toolstack domain. The function libxl__xs_libxl_path() give this path.
    
    This come with libxl__device_model_version_running() helper function.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24072:cf8924724b61
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Better error message after a parse error.
    
    By setting the next string to parse after having printed any error messages.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24071:bdbd100b28ae
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_json: Check the parser status before to call parse_complete
    
    Also, use goto to handle an error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24070:e0b6b0e68e90
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Fix return check of fcntl
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24069:801ca6c0fbfa
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:28:41 2011 +0100
    
    x86/IRQ: consolidate IRQ disabling when acquiring vector lock
    
    __assign_irq_vector() doesn't need to disable interrupts (its callers
    are required to when acquiring the lock), and set_desc_affinity() can
    use the normal spin lock primitives.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24068:6928172f7ded
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:27:38 2011 +0100
    
    IRQ: allocate CPU masks dynamically
    
    This includes delaying the initialization of dynamically created IRQs
    until their actual first use and some further elimination of uses of
    struct irq_cfg.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24067:17ee4c213438
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 06 20:15:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 06 Nov 2011 20:15:12 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNGc4-0000rn-8w; Sun, 06 Nov 2011 20:15:12 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNGb2-0000f8-DB
	for xen-devel@lists.xensource.com; Sun, 06 Nov 2011 20:14:09 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1320639245!2505283!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27867 invoked from network); 7 Nov 2011 04:14:05 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 04:14:05 -0000
X-IronPort-AV: E=Sophos;i="4.69,467,1315180800"; 
   d="scan'208";a="8782681"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 04:14:04 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 04:14:04 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RNGay-0007wD-B4;
	Mon, 07 Nov 2011 04:14:04 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RNGay-00035R-9z;
	Mon, 07 Nov 2011 04:14:04 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9720-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 7 Nov 2011 04:14:04 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9720: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9720 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9720/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 build-amd64-pvops             2 host-install(2)              broken
 test-i386-i386-win            3 host-install(3)              broken
 test-amd64-i386-xl           18 leak-check/check   fail in 9719 REGR. vs. 9661
 test-amd64-i386-xl-credit2    3 host-install(3)              broken   in 9719
 test-amd64-i386-xl-multivcpu 18 leak-check/check   fail in 9719 REGR. vs. 9661

Tests which are failing intermittently (not blocking):
 build-amd64                   4 xen-build                    fail pass in 9719

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pv            1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pair          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked  n/a
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-win           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2        fail in 9719 never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2          fail in 9719 never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check       fail in 9719 never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop            fail in 9719 never pass
 test-amd64-i386-win          16 leak-check/check       fail in 9719 never pass

version targeted for testing:
 xen                  604a90b803d3
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  fail    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           blocked 
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 blocked 
 test-amd64-i386-xl-credit2                                   blocked 
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               blocked 
 test-amd64-i386-xl-multivcpu                                 blocked 
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         blocked 
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           blocked 
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   blocked 
 test-amd64-i386-xl-win-vcpus1                                blocked 
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          blocked 
 test-i386-i386-win                                           broken  
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24083:604a90b803d3
tag:         tip
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: Remove a passthrough device through QMP.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_pci.c |   72 +++++++++++++++++++++++++++++++---------------
     1 files changed, 48 insertions(+), 24 deletions(-)
    
    
changeset:   24082:e22e108e1c57
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_del
    
    To remove a pci passthough device from QEMU (upstream).
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_internal.h |    2 ++
     tools/libxl/libxl_qmp.c      |   35 +++++++++++++++++++++++++++++++++++
     2 files changed, 37 insertions(+), 0 deletions(-)
    
    
changeset:   24081:659c800d7edf
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Nov 04 15:55:50 2011 +0100
    
    x86/IRQ: fix create_irq() after c/s 24068:6928172f7ded
    
    init_one_irq_desc() must be called with interrupts enabled (as it may
    call functions from the xmalloc() group). Rather than mis-using
    vector_lock to also protect the finding of an unused IRQ, make this
    lockless through using cmpxchg(), and obtain the lock only around the
    actual assignment of the vector.
    
    Also fold find_unassigned_irq() into its only caller.
    
    It is, btw, questionable whether create_irq() calling
    __assign_irq_vector() (rather than assign_irq_vector()) is actually
    correct - desc->affinity appears to not get initialized properly in
    this case.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24080:974b00c7c2d0
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: Use QMP to insert a passthrough device when using upstream QEMU
    
    Also move the xenstore specific code to a new function and add a
    message if sscanf fails.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24079:a67944b1adfb
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_add.
    
    This function insert a PCI passthrough device in qemu.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24078:c5fe74068253
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_json: Handle number above LONG_MAX.
    
    The integers are now "long long" in the json_object.
    
    If a number (decimal or integer) is too big (or too low), it is stored as it in
    a string. So for that, we introduce a new type JSON_NUMBER.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24077:8d06378f1487
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_qmp: Introduce qmp_request_context.
    
    This structure helps to track the return code of a callback. It's only used
    between qmp_synchronous_send and qmp_send.
    
    Now, qmp_synchronous_send will return the rc of the callback if there is no
    error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24076:0406f6783c65
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Always insert a command id in the callback_list.
    
    Because the function qmp_synchronous_send rely on the presence of the id
    in the callback_list.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24075:918a2091c181
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Introduce list of arguments to qmp_send
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24074:9641b7594ed6
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl_qmp: Introduce an opaque argument to the callbacks.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24073:7b22d2f98302
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl: Introduce dm-version xenstore key.
    
    The all key is /libxl/$domid/dm-version.
    
    The /libxl/$domid dir is created with the domain and should be only accessible
    by the toolstack domain. The function libxl__xs_libxl_path() give this path.
    
    This come with libxl__device_model_version_running() helper function.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24072:cf8924724b61
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Better error message after a parse error.
    
    By setting the next string to parse after having printed any error messages.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24071:bdbd100b28ae
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_json: Check the parser status before to call parse_complete
    
    Also, use goto to handle an error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24070:e0b6b0e68e90
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Fix return check of fcntl
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24069:801ca6c0fbfa
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:28:41 2011 +0100
    
    x86/IRQ: consolidate IRQ disabling when acquiring vector lock
    
    __assign_irq_vector() doesn't need to disable interrupts (its callers
    are required to when acquiring the lock), and set_desc_affinity() can
    use the normal spin lock primitives.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24068:6928172f7ded
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:27:38 2011 +0100
    
    IRQ: allocate CPU masks dynamically
    
    This includes delaying the initialization of dynamically created IRQs
    until their actual first use and some further elimination of uses of
    struct irq_cfg.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24067:17ee4c213438
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 06 21:53:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 06 Nov 2011 21:53:00 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNI8i-00033M-LX; Sun, 06 Nov 2011 21:53:00 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNI7u-0002r9-6C
	for xen-devel@lists.xensource.com; Sun, 06 Nov 2011 21:52:10 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1320645114!53957583!1
X-Originating-IP: [80.70.172.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2304 invoked from network); 7 Nov 2011 05:51:54 -0000
Received: from dgate10.ts.fujitsu.com (HELO dgate10.ts.fujitsu.com)
	(80.70.172.49)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 05:51:54 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Message-ID:Date:From:Organization:
	User-Agent:MIME-Version:To:CC:Subject:References:
	In-Reply-To:Content-Type:Content-Transfer-Encoding;
	b=tLMIw4Qn3wNH9IIOh08h+AiYB6sQniT3NbZrlJbd0ED1OHIq/cgTtzju
	qkkhnbFqIuU+aRJf78mcTg8UU0A8X8TK/179y9N63LxjOTqCdKiE7W9Rf
	4QkG8g4RppIqGVPbdFzSmYg4XnpJtG9je2pCaFS/IJ/L/fhRdF68mOu4o
	vfLAdPs3A0X1J9eI1G1EbbqUiHdP0ALcm6R6ryhGaN1Iu1qqh/NwOjiuv
	1agwaPBmkholitEcGb1bNlVYFJ+jj;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1320645127; x=1352181127;
	h=message-id:date:from:mime-version:to:cc:subject:
	references:in-reply-to:content-transfer-encoding;
	bh=SSLsC1b9j78sEFbStmpj/uM9rK0MrJSx4T2aeSJ7LaY=;
	b=ZOuU3fcBWxafsNUcH2nB7R7AXZuoduQ4THB3r+6ZpcvAZa/H9bCP0EIA
	mbVQoo/W+mf9h9XIZDFT7CrNJ1a9OoBiLlBbM2YT2jNY72RvEiv1/xsYl
	90V7jyURDqm5mincG+bAyd6n537OtMipnnH/heO6jOYt1lGG3F4IKyszX
	VBdZj7yapKES46FuB8SwFHCmeKfyJL/eCD3YhMcsL+2o3tcKl8DONECQM
	D+q4bahXRR+7sf/QtuGFA1EepVFaf;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,467,1315173600"; d="scan'208";a="92262125"
Received: from abgdgate40u.abg.fsc.net ([172.25.138.90])
	by dgate10u.abg.fsc.net with ESMTP; 07 Nov 2011 06:52:06 +0100
X-IronPort-AV: E=Sophos;i="4.69,468,1315173600"; d="scan'208";a="122931506"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate40u.abg.fsc.net with ESMTP; 07 Nov 2011 06:52:06 +0100
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id 65CF89F6BD;
	Mon,  7 Nov 2011 06:52:06 +0100 (CET)
Message-ID: <4EB77206.3050706@ts.fujitsu.com>
Date: Mon, 07 Nov 2011 06:52:06 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
Organization: Fujitsu Technology Solutions
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20111010 Iceowl/1.0b2 Icedove/3.1.15
MIME-Version: 1.0
To: "Hao, Xudong" <xudong.hao@intel.com>
Subject: Re: [Xen-devel] RE: [PATCH] Make lock profiling usable again
References: <df918a251d01d3ac6267.1320411162@nehalem1>
	<BC00F5384FCFC9499AF06F92E8B78A9E281497FD88@shsmsx502.ccr.corp.intel.com>
In-Reply-To: <BC00F5384FCFC9499AF06F92E8B78A9E281497FD88@shsmsx502.ccr.corp.intel.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Xudong,

I found that bug after sending you the patch and included the correction
already in the version sent to xen-devel.


Juergen

On 11/05/2011 05:10 AM, Hao, Xudong wrote:
> Initialize profile to NULL when lock profiling is not enabled.
>
> diff -r 068d3d55ce6e xen/include/xen/spinlock.h
> --- a/xen/include/xen/spinlock.h        Tue Nov 01 19:03:38 2011 +0000
> +++ b/xen/include/xen/spinlock.h        Sat Nov 05 11:57:38 2011 +0800
> @@ -108,7 +108,7 @@ struct lock_profile_qhead { };
>   struct lock_profile_qhead { };
>
>   #define SPIN_LOCK_UNLOCKED                                                    \
> -    { _RAW_SPIN_LOCK_UNLOCKED, 0xfffu, 0, _LOCK_DEBUG, { } }
> +    { _RAW_SPIN_LOCK_UNLOCKED, 0xfffu, 0, _LOCK_DEBUG, NULL }
>   #define DEFINE_SPINLOCK(l) spinlock_t l = SPIN_LOCK_UNLOCKED
>
>   #define spin_lock_init_prof(s, l) spin_lock_init(&((s)->l))
>
>
> Thanks,
> -Xudong
>
>
>> -----Original Message-----
>> From: Juergen Gross [mailto:juergen.gross@ts.fujitsu.com]
>> Sent: Friday, November 04, 2011 8:53 PM
>> To: xen-devel@lists.xensource.com
>> Cc: Hao, Xudong
>> Subject: [PATCH] Make lock profiling usable again
>>
>> Using lock profiling (option lock_profile in xen/Rules.mk) resulted in build errors.
>> Changes:
>> - Include public/sysctl.h in spinlock.h when using lock profiling.
>> - Allocate profile data in an own structure to avoid struct domain becoming
>>    larger then one page
>>
>> Signed-off-by: juergen.gross@ts.fujitsu.com
>>
>>
>> 2 files changed, 44 insertions(+), 24 deletions(-)
>> xen/common/spinlock.c      |   34 +++++++++++++++++++++-------------
>> xen/include/xen/spinlock.h |   34 +++++++++++++++++++++++-----------
>>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>
>


-- 
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: juergen.gross@ts.fujitsu.com
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 06 22:03:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 06 Nov 2011 22:03:59 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNIJK-0003b9-HT; Sun, 06 Nov 2011 22:03:58 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNIGV-0003Mf-HF
	for xen-devel@lists.xensource.com; Sun, 06 Nov 2011 22:01:10 -0800
X-Env-Sender: xudong.hao@intel.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1320645659!2492886!1
X-Originating-IP: [134.134.136.24]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11725 invoked from network); 7 Nov 2011 06:00:59 -0000
Received: from mga09.intel.com (HELO mga09.intel.com) (134.134.136.24)
	by server-4.tower-216.messagelabs.com with SMTP;
	7 Nov 2011 06:00:59 -0000
Received: from orsmga001.jf.intel.com ([10.7.209.18])
	by orsmga102.jf.intel.com with ESMTP; 06 Nov 2011 22:00:58 -0800
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.67,352,1309762800"; d="scan'208";a="71798538"
Received: from pgsmsx602.gar.corp.intel.com ([10.221.43.81])
	by orsmga001.jf.intel.com with ESMTP; 06 Nov 2011 22:00:57 -0800
Received: from pgsmsx102.gar.corp.intel.com (10.221.44.80) by
	pgsmsx602.gar.corp.intel.com (10.221.43.81) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Mon, 7 Nov 2011 14:00:20 +0800
Received: from shsmsx602.ccr.corp.intel.com (10.239.4.104) by
	PGSMSX102.gar.corp.intel.com (10.221.44.80) with Microsoft SMTP Server
	(TLS) id 14.1.323.3; Mon, 7 Nov 2011 14:00:20 +0800
Received: from shsmsx502.ccr.corp.intel.com ([10.239.4.96]) by
	SHSMSX602.ccr.corp.intel.com ([10.239.4.104]) with mapi; Mon, 7 Nov 2011
	14:00:19 +0800
From: "Hao, Xudong" <xudong.hao@intel.com>
To: Juergen Gross <juergen.gross@ts.fujitsu.com>
Date: Mon, 7 Nov 2011 14:00:19 +0800
Subject: RE: [Xen-devel] RE: [PATCH] Make lock profiling usable again
Thread-Topic: [Xen-devel] RE: [PATCH] Make lock profiling usable again
Thread-Index: AcydEWltxAf6z6QWQ+a+q13EaE5frwAALLdw
Message-ID: <BC00F5384FCFC9499AF06F92E8B78A9E281498020A@shsmsx502.ccr.corp.intel.com>
References: <df918a251d01d3ac6267.1320411162@nehalem1>
	<BC00F5384FCFC9499AF06F92E8B78A9E281497FD88@shsmsx502.ccr.corp.intel.com>
	<4EB77206.3050706@ts.fujitsu.com>
In-Reply-To: <4EB77206.3050706@ts.fujitsu.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> -----Original Message-----
> From: Juergen Gross [mailto:juergen.gross@ts.fujitsu.com]
> Sent: Monday, November 07, 2011 1:52 PM
> To: Hao, Xudong
> Cc: xen-devel@lists.xensource.com
> Subject: Re: [Xen-devel] RE: [PATCH] Make lock profiling usable again
>=20
> Xudong,
>=20
> I found that bug after sending you the patch and included the correction
> already in the version sent to xen-devel.
>=20

OK, thanks.

>=20
> Juergen
>=20
> On 11/05/2011 05:10 AM, Hao, Xudong wrote:
> > Initialize profile to NULL when lock profiling is not enabled.
> >
> > diff -r 068d3d55ce6e xen/include/xen/spinlock.h
> > --- a/xen/include/xen/spinlock.h        Tue Nov 01 19:03:38 2011 +0000
> > +++ b/xen/include/xen/spinlock.h        Sat Nov 05 11:57:38 2011 +0800
> > @@ -108,7 +108,7 @@ struct lock_profile_qhead { };
> >   struct lock_profile_qhead { };
> >
> >   #define SPIN_LOCK_UNLOCKED
> \
> > -    { _RAW_SPIN_LOCK_UNLOCKED, 0xfffu, 0, _LOCK_DEBUG, { } }
> > +    { _RAW_SPIN_LOCK_UNLOCKED, 0xfffu, 0, _LOCK_DEBUG, NULL }
> >   #define DEFINE_SPINLOCK(l) spinlock_t l =3D SPIN_LOCK_UNLOCKED
> >
> >   #define spin_lock_init_prof(s, l) spin_lock_init(&((s)->l))
> >
> >
> > Thanks,
> > -Xudong
> >
> >
> >> -----Original Message-----
> >> From: Juergen Gross [mailto:juergen.gross@ts.fujitsu.com]
> >> Sent: Friday, November 04, 2011 8:53 PM
> >> To: xen-devel@lists.xensource.com
> >> Cc: Hao, Xudong
> >> Subject: [PATCH] Make lock profiling usable again
> >>
> >> Using lock profiling (option lock_profile in xen/Rules.mk) resulted in=
 build
> errors.
> >> Changes:
> >> - Include public/sysctl.h in spinlock.h when using lock profiling.
> >> - Allocate profile data in an own structure to avoid struct domain bec=
oming
> >>    larger then one page
> >>
> >> Signed-off-by: juergen.gross@ts.fujitsu.com
> >>
> >>
> >> 2 files changed, 44 insertions(+), 24 deletions(-)
> >> xen/common/spinlock.c      |   34 +++++++++++++++++++++-------------
> >> xen/include/xen/spinlock.h |   34 +++++++++++++++++++++++-----------
> >>
> >
> > _______________________________________________
> > Xen-devel mailing list
> > Xen-devel@lists.xensource.com
> > http://lists.xensource.com/xen-devel
> >
> >
>=20
>=20
> --
> Juergen Gross                 Principal Developer Operating Systems
> PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222
> 2967
> Fujitsu Technology Solutions              e-mail:
> juergen.gross@ts.fujitsu.com
> Domagkstr. 28                           Internet: ts.fujitsu.com
> D-80807 Muenchen                 Company details:
> ts.fujitsu.com/imprint.html


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 06 22:20:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 06 Nov 2011 22:20:34 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNIZN-0004sm-7O; Sun, 06 Nov 2011 22:20:33 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNIYq-0004g8-1P
	for xen-devel@lists.xensource.com; Sun, 06 Nov 2011 22:20:00 -0800
X-Env-Sender: sfr@canb.auug.org.au
X-Msg-Ref: server-12.tower-21.messagelabs.com!1320646794!3123728!1
X-Originating-IP: [203.10.76.15]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8929 invoked from network); 7 Nov 2011 06:19:55 -0000
Received: from calzone.tip.net.au (HELO calzone.tip.net.au) (203.10.76.15)
	by server-12.tower-21.messagelabs.com with SMTP;
	7 Nov 2011 06:19:55 -0000
Received: from canb.auug.org.au (ibmaus65.lnk.telstra.net [165.228.126.9])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	by calzone.tip.net.au (Postfix) with ESMTPSA id 8B258128440;
	Mon,  7 Nov 2011 17:19:47 +1100 (EST)
Date: Mon, 7 Nov 2011 17:19:42 +1100
From: Stephen Rothwell <sfr@canb.auug.org.au>
To: Linus <torvalds@linux-foundation.org>
Message-Id: <20111107171942.fe21429583491475f245aa08@canb.auug.org.au>
In-Reply-To: <20111103013012.GB3449@suse.de>
References: <20111027053007.GA32765@phenom.dumpdata.com>
	<20111027054806.GA1377@suse.de>
	<20111102121309.4dbb0d2ac90d2879130820dd@canb.auug.org.au>
	<20111103013012.GB3449@suse.de>
X-Mailer: Sylpheed 3.2.0beta3 (GTK+ 2.24.7; i486-pc-linux-gnu)
Mime-Version: 1.0
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, Anton,
	Rusty Russell <rusty@rustcorp.com.au>, miche@google.com,
	linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org,
	Blanchard <anton@samba.org>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Amit Shah <amit.shah@redhat.com>, ppc-dev <linuxppc-dev@lists.ozlabs.org>,
	Greg KH <gregkh@suse.de>
Subject: [Xen-devel] Re: Regression: patch
 " hvc_console: display printk messages on console." causing infinite loop
 with 3.2-rc0 + Xen.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1765290418=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1765290418==
Content-Type: multipart/signed; protocol="application/pgp-signature";
	micalg="PGP-SHA256";
	boundary="Signature=_Mon__7_Nov_2011_17_19_42_+1100_pjK4iajXXyXmXJ=X"

--Signature=_Mon__7_Nov_2011_17_19_42_+1100_pjK4iajXXyXmXJ=X
Content-Type: text/plain; charset=US-ASCII
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

Hi Greg,

On Wed, 2 Nov 2011 18:30:12 -0700 Greg KH <gregkh@suse.de> wrote:
>
> On Wed, Nov 02, 2011 at 12:13:09PM +1100, Stephen Rothwell wrote:
> >=20
> > On Thu, 27 Oct 2011 07:48:06 +0200 Greg KH <gregkh@suse.de> wrote:
> > >
> > > On Thu, Oct 27, 2011 at 01:30:08AM -0400, Konrad Rzeszutek Wilk wrote:
> > > > Hey Miche.
> > > >=20
> > > > The git commit 361162459f62dc0826b82c9690a741a940f457f0:
> > > >=20
> > > >     hvc_console: display printk messages on console.
> > > >=20
> > > > is causing an infinite loop when booting Linux under Xen, as so:
> > >=20
> > > Ick, not good, thanks for letting us know.
> >=20
> > Indeed. I am wondering why it was put in a tree and sent to Linus witho=
ut
> > any Acks or even being replied to by anyone.  It appeared in the tty tr=
ee
> > between Oct 14 and Oct 25 (while I was unfortunately on vacation).  If
> > anyone had tried to boot this on any PowerPC server, it would have been
> > immediately obvious (as it was when I booted Linus' tree last night).
> >=20
> > And the original author expressed doubts as to his understanding of how
> > it should all work anyway.
> >=20
> > Just a little more care, please.
> >=20
> > I would vote for reverting the original and having it resubmitted with
> > corrections at some later date.
>=20
> You are right, I will go do that, sorry for the problems.

Ping ...

Linus can you please just revert 361162459f62dc0826b82c9690a741a940f457f0
"hvc_console: display printk messages on console" as it breaks consoles
for all PowerPC server machines.

--=20
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

--Signature=_Mon__7_Nov_2011_17_19_42_+1100_pjK4iajXXyXmXJ=X
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iQIcBAEBCAAGBQJOt3h+AAoJEECxmPOUX5FENFMP/jZOS+gsCITHFxhkyVSMsq4r
b244rYfPYLAz1QBHNGnVkPYOTWGFeNMbmW03AtlJgAyhCBq0WedYTKNhkMFQBEe1
1PwCh19zGx2IURoYeQfV4xj9129sP8YbT6rDuHQKo6hKc7TEYQ4VSKklARgJxzA3
vTjJNzWoV1VFsvE3WCpckH/XwUe9M7LHqDv4HfJmaCxIv8sCqfkLxNiqw245kHou
nnT4dnK2Knwt/384z5dCWoI27hs+nwCAgFtkbioeW3DAmkPk9JHUnGLx1DPa0iru
RIbokSABq2EapKTZb8ig3SGhf8MP1Goby9nit2e/227keF0/cS9UssbH8E6KUB6q
IfMtiq7fn0d79Ukjkkoy17T2swuGQZQyqM4JF3/dt2A9b0mwjRT53vE5r3lUTmCN
oS8g8P3YINTh4uY2+JlhYGoHEUHoYH8vbco/Q3XSbMJnYgT4hInb2z8sJJa5+Rkf
L4nPGFdbxvZoc2tbXRGz7/xdxNMzylqBDTt4VjnXroK/AUSFKTd9I+ReAdJp3/SV
KGbMQ58BfCWXGrCpvpdirIPYglC6nPZa/jk3o5vSr+g9O9TLGMVa7VYcaLWKW5uC
iv2Rs1RjIaimhTTw4Vk237AM3cUWcwB1WDccwCaaNZpNgDzUZtP2ZLnKiKqNFAUu
vMXhZjFqiJK9DZqjkc8h
=HH7g
-----END PGP SIGNATURE-----

--Signature=_Mon__7_Nov_2011_17_19_42_+1100_pjK4iajXXyXmXJ=X--


--===============1765290418==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1765290418==--


From xen-devel-bounces@lists.xensource.com Sun Nov 06 23:13:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 06 Nov 2011 23:13:36 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNJOh-0006Ae-3W; Sun, 06 Nov 2011 23:13:35 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNJN6-0005wu-62
	for xen-devel@lists.xensource.com; Sun, 06 Nov 2011 23:12:01 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1320649886!47416710!1
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21533 invoked from network); 7 Nov 2011 07:11:26 -0000
Received: from dgate20.ts.fujitsu.com (HELO dgate20.ts.fujitsu.com)
	(80.70.172.51)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 07:11:26 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Content-Type:MIME-Version:Subject:
	X-Mercurial-Node:Message-Id:Date:From:To;
	b=SajC+hL8eWkndG6sssUdnLkELQNJsaoJVYQnOEb85vJouamRfe8FuRI1
	DbRYeenLOZkDLxdnJWM/h2jMfmi5W6VeT9m4CIhR51EIRweNkJyzH1W3w
	aTXuQiT+dhQAai42yWQGq+3jgmjnxHckNAP1Ewsa8tHwSaOhG7urjSxBG
	0JNsGG6G0adMf0wyutXsw3exvUU+0C0/GVWbi2j54JIFxtCn+upBJESZX
	yPgRZoEchA60+ZAihLjS8BTVmkM6f;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1320649912; x=1352185912;
	h=mime-version:subject:message-id:date:from:to;
	bh=1JhYl4lgsuYwsiajT1swrGR/eqU1fZA7to54v9rdtNI=;
	b=u/kB82cvp8NaueYEwrfDt0TFgJD6UitMkYM89Y+y5iWuQhtZ5xa/sQgM
	qSkdXLEV2bSbSNMLVIefl2VoeDPCg3Twqt+9vFjGgKEVsCAghumjw3rqA
	PzjkEpqnuieFSdSsPJSoqsa42izD8FtdPSgT/52A4ID6AQy4UxQN28u3b
	Jfxc0OkbU6COqum2qr9ee0Suu86pSiiusbMm4zqwjx+QhJr03iF7xNU+0
	Bs2Bl3RAPUCpsuQxxtczJ9SBjWo9t;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,468,1315173600"; d="scan'208";a="78358836"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate20u.abg.fsc.net with ESMTP; 07 Nov 2011 08:11:51 +0100
X-IronPort-AV: E=Sophos;i="4.69,467,1315173600"; d="scan'208";a="122523039"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 07 Nov 2011 08:11:51 +0100
Received: from [172.17.21.25] (nehalem1.osd.mch.fsc.net [172.17.21.25])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id D77C795A0C1;
	Mon,  7 Nov 2011 08:11:51 +0100 (CET)
Content-Type: multipart/mixed; boundary="===============1852013344514491635=="
MIME-Version: 1.0
X-Mercurial-Node: 8738081c2e4f9a264987641464c544cbc789a94b
Message-Id: <8738081c2e4f9a264987.1320649663@nehalem1>
Date: Mon, 07 Nov 2011 08:07:43 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] avoid hypervisor panic when printing lock
	profiling information
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1852013344514491635==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

When printing lock profiling information via keyhandler in the hypervisor
the system will panic. This patch corrects the problem.

Signed-off-by: juergen.gross@ts.fujitsu.com


1 file changed, 2 insertions(+), 2 deletions(-)
xen/common/spinlock.c |    4 ++--



--===============1852013344514491635==
Content-Type: text/x-patch; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=xen-staging.hg.patch

# HG changeset patch
# User Juergen Gross <juergen.gross@ts.fujitsu.com>
# Date 1320649651 -3600
# Node ID 8738081c2e4f9a264987641464c544cbc789a94b
# Parent  df918a251d01d3ac6267bee9d4a7351d41167688
avoid hypervisor panic when printing lock profiling information

When printing lock profiling information via keyhandler in the hypervisor
the system will panic. This patch corrects the problem.

Signed-off-by: juergen.gross@ts.fujitsu.com

diff -r df918a251d01 -r 8738081c2e4f xen/common/spinlock.c
--- a/xen/common/spinlock.c	Fri Nov 04 13:52:11 2011 +0100
+++ b/xen/common/spinlock.c	Mon Nov 07 08:07:31 2011 +0100
@@ -458,9 +458,9 @@ static void spinlock_profile_print_elem(
     int32_t type, int32_t idx, void *par)
 {
     if ( type == LOCKPROF_TYPE_GLOBAL )
-        printk("%s %s:\n", lock_profile_ancs[idx].name, data->name);
+        printk("%s %s:\n", lock_profile_ancs[type].name, data->name);
     else
-        printk("%s %d %s:\n", lock_profile_ancs[idx].name, idx, data->name);
+        printk("%s %d %s:\n", lock_profile_ancs[type].name, idx, data->name);
     printk("  lock:%12"PRId64"(%08X:%08X), block:%12"PRId64"(%08X:%08X)\n",
            data->lock_cnt, (u32)(data->time_hold >> 32), (u32)data->time_hold,
            data->block_cnt, (u32)(data->time_block >> 32),

--===============1852013344514491635==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1852013344514491635==--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 00:36:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 00:36:36 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNKh1-0007s3-6b; Mon, 07 Nov 2011 00:36:35 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNKfW-0007dy-KO
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 00:35:10 -0800
X-Env-Sender: lidongyang@novell.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1320654897!526109!1
X-Originating-IP: [137.65.250.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28702 invoked from network); 7 Nov 2011 08:34:59 -0000
Received: from victor.provo.novell.com (HELO victor.provo.novell.com)
	(137.65.250.26)
	by server-5.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Nov 2011 08:34:59 -0000
Received: from localhost.localdomain (prv-ext-foundry1int.gns.novell.com
	[137.65.251.240])
	by victor.provo.novell.com with ESMTP (TLS encrypted);
	Mon, 07 Nov 2011 01:34:42 -0700
From: Li Dongyang <lidongyang@novell.com>
To: xen-devel@lists.xensource.com
Date: Mon,  7 Nov 2011 16:34:26 +0800
Message-Id: <1320654866-12457-1-git-send-email-lidongyang@novell.com>
X-Mailer: git-send-email 1.7.7
Cc: lczerner@redhat.com, konrad.wilk@oracle.com
Subject: [Xen-devel] [PATCH] xen-blkback: convert hole punching to discard
	request on loop devices
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

As of dfaa2ef68e80c378e610e3c8c536f1c239e8d3ef, loop devices support
discard request now. We could just issue a discard request, and
the loop driver will punch the hole for us, so we don't need to touch
the internals of loop device and punch the hole ourselves, Thanks.

Signed-off-by: Li Dongyang <lidongyang@novell.com>
---
 drivers/block/xen-blkback/blkback.c |   21 +++------------------
 1 files changed, 3 insertions(+), 18 deletions(-)

diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
index 15ec4db..ad365a7 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -39,9 +39,6 @@
 #include <linux/list.h>
 #include <linux/delay.h>
 #include <linux/freezer.h>
-#include <linux/loop.h>
-#include <linux/falloc.h>
-#include <linux/fs.h>
 
 #include <xen/events.h>
 #include <xen/page.h>
@@ -422,25 +419,13 @@ static void xen_blk_discard(struct xen_blkif *blkif, struct blkif_request *req)
 	int status = BLKIF_RSP_OKAY;
 	struct block_device *bdev = blkif->vbd.bdev;
 
-	if (blkif->blk_backend_type == BLKIF_BACKEND_PHY)
-		/* just forward the discard request */
+	if (blkif->blk_backend_type == BLKIF_BACKEND_PHY ||
+	    blkif->blk_backend_type == BLKIF_BACKEND_FILE)
 		err = blkdev_issue_discard(bdev,
 				req->u.discard.sector_number,
 				req->u.discard.nr_sectors,
 				GFP_KERNEL, 0);
-	else if (blkif->blk_backend_type == BLKIF_BACKEND_FILE) {
-		/* punch a hole in the backing file */
-		struct loop_device *lo = bdev->bd_disk->private_data;
-		struct file *file = lo->lo_backing_file;
-
-		if (file->f_op->fallocate)
-			err = file->f_op->fallocate(file,
-				FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE,
-				req->u.discard.sector_number << 9,
-				req->u.discard.nr_sectors << 9);
-		else
-			err = -EOPNOTSUPP;
-	} else
+	else
 		err = -EOPNOTSUPP;
 
 	if (err == -EOPNOTSUPP) {
-- 
1.7.7


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 00:56:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 00:56:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNL01-00005i-2L; Mon, 07 Nov 2011 00:56:13 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNKzC-0008L0-BG
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 00:55:22 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1320656119!3155664!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28065 invoked from network); 7 Nov 2011 08:55:19 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-15.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Nov 2011 08:55:19 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 07 Nov 2011 08:55:18 +0000
Message-Id: <4EB7AB03020000780005F484@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 07 Nov 2011 08:55:15 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: <ian.jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [xen-unstable test] 9720: regressions -
	trouble: blocked/broken/fail/pass
References: <osstest-9720-mainreport@xen.org>
In-Reply-To: <osstest-9720-mainreport@xen.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 07.11.11 at 05:14, xen.org <ian.jackson@eu.citrix.com> wrote:
> flight 9720 xen-unstable real [real]
> http://www.chiark.greenend.org.uk/~xensrcts/logs/9720/=20
>=20
> Regressions :-(
>=20
> Tests which did not succeed and are blocking:
>  test-i386-i386-xl            18 leak-check/check           fail REGR. =
vs. 9661
>  build-amd64-pvops             2 host-install(2)              broken
>  test-i386-i386-win            3 host-install(3)              broken

Ian,

the log file here (for example) says=20

Nov  7 02:50:26.914494 (XEN) Latest ChangeSet: Thu Nov 03 17:28:41 2011 =
+0100 24069:801ca6c0fbfa

which is inconsistent with ...

>  test-amd64-i386-xl           18 leak-check/check   fail in 9719 REGR. =
vs. 9661
>  test-amd64-i386-xl-credit2    3 host-install(3)              broken   =
in 9719
>  test-amd64-i386-xl-multivcpu 18 leak-check/check   fail in 9719 REGR. =
vs. 9661
>=20
> Tests which are failing intermittently (not blocking):
>  build-amd64                   4 xen-build                    fail pass =
in=20
> 9719
>=20
> Tests which did not succeed, but are not blocking,
> including regressions (tests previously passed) regarded as allowable:
>  test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked =
 n/a
>  test-amd64-amd64-pv           1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-amd64-xl           1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-pv            1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-xl            1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-amd64-pair         1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-amd64-win          1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-pair          1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked  =
n/a
>  test-i386-i386-xl-win        13 guest-stop                   fail   =
never pass
>  test-amd64-i386-win           1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-rhel6hvm-intel  9 guest-start.2        fail in 9719 =
never pass
>  test-amd64-i386-rhel6hvm-amd  9 guest-start.2          fail in 9719 =
never pass
>  test-amd64-i386-win-vcpus1   16 leak-check/check       fail in 9719 =
never pass
>  test-amd64-i386-xl-win-vcpus1 13 guest-stop            fail in 9719 =
never pass
>  test-amd64-i386-win          16 leak-check/check       fail in 9719 =
never pass
>=20
> version targeted for testing:
>  xen                  604a90b803d3

... the information here. What's the deal? Why isn't the tester picking
up the latest bits? (I didn't go through all the other logs, as it seems
likely that this is happening on other test cases too.)

Thanks, Jan

> baseline version:
>  xen                  54a5e994a241



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 01:56:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 01:56:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNLwk-0004rg-KN; Mon, 07 Nov 2011 01:56:54 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNLvo-0004en-3o
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 01:55:56 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1320659752!539237!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14380 invoked from network); 7 Nov 2011 09:55:52 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-15.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Nov 2011 09:55:52 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 07 Nov 2011 09:55:52 +0000
Message-Id: <4EB7B934020000780005F4A0@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 07 Nov 2011 09:55:48 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Subject: [Xen-devel] [PATCH 0/6] final conversion to new CPU mask accessors
	and away from irq_cfg
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This patch set completes the conversion to the new CPU mask interfaces
and, as the final step eliminates the remaining few uses of struct =
irq_cfg.

1: eliminate cpus_xyz()
2: eliminate cpu_test_xyz()
3: eliminate cpu_set()
4: eliminate cpu_clear()
5: eliminate first_cpu() etc
6: eliminate remaining uses of struct irq_cfg

Signed-off-by: Jan Beulich <jbeulich@suse.com>


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 02:00:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 02:00:30 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNM0B-0005Jz-Km; Mon, 07 Nov 2011 02:00:29 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNLwR-0004me-1J
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 01:56:36 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1320659791!541217!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10606 invoked from network); 7 Nov 2011 09:56:31 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-6.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Nov 2011 09:56:31 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 07 Nov 2011 09:56:30 +0000
Message-Id: <4EB7B95A020000780005F4A4@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 07 Nov 2011 09:56:26 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part604F945A.0__="
Subject: [Xen-devel] [PATCH 1/6] eliminate cpus_xyz()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part604F945A.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/ia64/linux-xen/iosapic.c
+++ b/xen/arch/ia64/linux-xen/iosapic.c
@@ -709,7 +709,7 @@ get_target_cpu (unsigned int gsi, int ve
 				cpu_clear(numa_cpu, cpu_mask);
 		}
=20
-		num_cpus =3D cpus_weight(cpu_mask);
+		num_cpus =3D cpumask_weight(&cpu_mask);
=20
 		if (!num_cpus)
 			goto skip_numa_setup;
--- a/xen/arch/ia64/linux-xen/smp.c
+++ b/xen/arch/ia64/linux-xen/smp.c
@@ -62,7 +62,7 @@ void smp_send_event_check_mask(const cpu
     int cpu;
=20
     /*  Not for me.  */
-    if (cpus_subset(*mask, *cpumask_of(smp_processor_id())))
+    if (cpumask_subset(mask, cpumask_of(smp_processor_id())))
         return;
=20
     //printf("smp_send_event_check_mask called\n");
@@ -444,7 +444,7 @@ on_selected_cpus(const cpumask_t *select
                  void *info, int wait)
 {
 	struct call_data_struct data;
-	unsigned int cpu, nr_cpus =3D cpus_weight(*selected);
+	unsigned int cpu, nr_cpus =3D cpumask_weight(selected);
=20
 	ASSERT(local_irq_is_enabled());
=20
--- a/xen/arch/ia64/xen/mm.c
+++ b/xen/arch/ia64/xen/mm.c
@@ -3196,7 +3196,7 @@ int get_page_type(struct page_info *page
                 cpumask_copy(&mask, page_get_owner(page)->domain_dirty_cpu=
mask);
                 tlbflush_filter(mask, page->tlbflush_timestamp);
=20
-                if ( unlikely(!cpus_empty(mask)) )
+                if ( unlikely(!cpumask_empty(&mask)) )
                 {
                     perfc_incr(need_flush_tlb_flush);
                     flush_tlb_mask(&mask);
--- a/xen/arch/ia64/xen/vhpt.c
+++ b/xen/arch/ia64/xen/vhpt.c
@@ -556,7 +556,7 @@ void flush_tlb_mask(const cpumask_t *mas
     if (cpu_isset(cpu, *mask))
         flush_tlb_vhpt_all (NULL);
=20
-    if (cpus_subset(*mask, *cpumask_of(cpu)))
+    if (cpumask_subset(mask, cpumask_of(cpu)))
         return;
=20
     for_each_cpu_mask (cpu, *mask)
--- a/xen/arch/x86/cpu/mcheck/mce_intel.c
+++ b/xen/arch/x86/cpu/mcheck/mce_intel.c
@@ -863,7 +863,7 @@ static void intel_machine_check(struct c
          */
         if (atomic_read(&found_error) =3D=3D 0)
             mc_panic("MCE: No CPU found valid MCE, need reset\n");
-        if (!cpus_empty(mce_fatal_cpus))
+        if (!cpumask_empty(&mce_fatal_cpus))
         {
             char *ebufp, ebuf[96] =3D "MCE: Fatal error happened on CPUs =
";
             ebufp =3D ebuf + strlen(ebuf);
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -1611,8 +1611,9 @@ void context_switch(struct vcpu *prev, s
=20
     cpumask_copy(&dirty_mask, next->vcpu_dirty_cpumask);
     /* Allow at most one CPU at a time to be dirty. */
-    ASSERT(cpus_weight(dirty_mask) <=3D 1);
-    if ( unlikely(!cpu_isset(cpu, dirty_mask) && !cpus_empty(dirty_mask)) =
)
+    ASSERT(cpumask_weight(&dirty_mask) <=3D 1);
+    if ( unlikely(!cpumask_test_cpu(cpu, &dirty_mask) &&
+                  !cpumask_empty(&dirty_mask)) )
     {
         /* Other cpus call __sync_local_execstate from flush ipi handler. =
*/
         flush_tlb_mask(&dirty_mask);
--- a/xen/arch/x86/genapic/delivery.c
+++ b/xen/arch/x86/genapic/delivery.c
@@ -38,7 +38,7 @@ const cpumask_t *vector_allocation_cpuma
=20
 unsigned int cpu_mask_to_apicid_flat(const cpumask_t *cpumask)
 {
-	return cpus_addr(*cpumask)[0]&0xFF;
+	return cpumask_bits(cpumask)[0]&0xFF;
 }
=20
 /*
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -711,7 +711,7 @@ unsigned int set_desc_affinity(struct ir
     unsigned long flags;
     cpumask_t dest_mask;
=20
-    if (!cpus_intersects(*mask, cpu_online_map))
+    if (!cpumask_intersects(mask, &cpu_online_map))
         return BAD_APICID;
=20
     irq =3D desc->irq;
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -2436,7 +2436,7 @@ static int __get_page_type(struct page_i
                 /* Don't flush if the timestamp is old enough */
                 tlbflush_filter(mask, page->tlbflush_timestamp);
=20
-                if ( unlikely(!cpus_empty(mask)) &&
+                if ( unlikely(!cpumask_empty(&mask)) &&
                      /* Shadow mode: track only writable pages. */
                      (!shadow_mode_enabled(page_get_owner(page)) ||
                       ((nx & PGT_type_mask) =3D=3D PGT_writable_page)) )
--- a/xen/arch/x86/mm/shadow/common.c
+++ b/xen/arch/x86/mm/shadow/common.c
@@ -1524,7 +1524,7 @@ mfn_t shadow_alloc(struct domain *d, =20
          * we need to be sure that no TLB holds a pointer to it. */
         cpumask_copy(&mask, d->domain_dirty_cpumask);
         tlbflush_filter(mask, sp->tlbflush_timestamp);
-        if ( unlikely(!cpus_empty(mask)) )
+        if ( unlikely(!cpumask_empty(&mask)) )
         {
             perfc_incr(shadow_alloc_tlbflush);
             flush_tlb_mask(&mask);
--- a/xen/arch/x86/smp.c
+++ b/xen/arch/x86/smp.c
@@ -140,11 +140,11 @@ void send_IPI_self_x2apic(int vector)
=20
 void send_IPI_mask_flat(const cpumask_t *cpumask, int vector)
 {
-    unsigned long mask =3D cpus_addr(*cpumask)[0];
+    unsigned long mask =3D cpumask_bits(cpumask)[0];
     unsigned long cfg;
     unsigned long flags;
=20
-    mask &=3D cpus_addr(cpu_online_map)[0];
+    mask &=3D cpumask_bits(&cpu_online_map)[0];
     mask &=3D ~(1UL << smp_processor_id());
     if ( mask =3D=3D 0 )
         return;
@@ -237,7 +237,7 @@ void flush_area_mask(const cpumask_t *ma
     if ( cpu_isset(smp_processor_id(), *mask) )
         flush_area_local(va, flags);
=20
-    if ( !cpus_subset(*mask, *cpumask_of(smp_processor_id())) )
+    if ( !cpumask_subset(mask, cpumask_of(smp_processor_id())) )
     {
         spin_lock(&flush_lock);
         cpumask_and(&flush_cpumask, mask, &cpu_online_map);
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -371,7 +371,7 @@ void domain_update_node_affinity(struct=20
         cpumask_or(&cpumask, &cpumask, v->cpu_affinity);
=20
     for_each_online_node ( node )
-        if ( cpus_intersects(node_to_cpumask(node), cpumask) )
+        if ( cpumask_intersects(&node_to_cpumask(node), &cpumask) )
             node_set(node, nodemask);
=20
     d->node_affinity =3D nodemask;
--- a/xen/common/perfc.c
+++ b/xen/common/perfc.c
@@ -163,11 +163,11 @@ static int perfc_copy_info(XEN_GUEST_HAN
     unsigned int i, j, v;
=20
     /* We only copy the name and array-size information once. */
-    if ( !cpus_equal(cpu_online_map, perfc_cpumap) )
+    if ( !cpumask_equal(&cpu_online_map, &perfc_cpumap) )
     {
         unsigned int nr_cpus;
         perfc_cpumap =3D cpu_online_map;
-        nr_cpus =3D cpus_weight(perfc_cpumap);
+        nr_cpus =3D cpumask_weight(&perfc_cpumap);
=20
         perfc_nbr_vals =3D 0;
=20
--- a/xen/common/rcupdate.c
+++ b/xen/common/rcupdate.c
@@ -121,7 +121,7 @@ static int rcu_barrier_action(void *_cpu
      */
     call_rcu(&data.head, rcu_barrier_callback);
=20
-    while ( atomic_read(data.cpu_count) !=3D cpus_weight(cpu_online_map) =
)
+    while ( atomic_read(data.cpu_count) !=3D num_online_cpus() )
     {
         process_pending_softirqs();
         cpu_relax();
--- a/xen/common/sched_credit.c
+++ b/xen/common/sched_credit.c
@@ -1246,7 +1246,7 @@ csched_load_balance(struct csched_privat
     cpumask_clear_cpu(cpu, &workers);
     peer_cpu =3D cpu;
=20
-    while ( !cpus_empty(workers) )
+    while ( !cpumask_empty(&workers) )
     {
         peer_cpu =3D cpumask_cycle(peer_cpu, &workers);
         cpumask_clear_cpu(peer_cpu, &workers);
--- a/xen/common/sched_credit2.c
+++ b/xen/common/sched_credit2.c
@@ -1009,7 +1009,7 @@ choose_cpu(const struct scheduler *ops,=20
     struct csched_vcpu *svc =3D CSCHED_VCPU(vc);
     s_time_t min_avgload;
=20
-    BUG_ON(cpus_empty(prv->active_queues));
+    BUG_ON(cpumask_empty(&prv->active_queues));
=20
     /* Locking:
      * - vc->processor is already locked
@@ -1098,7 +1098,7 @@ choose_cpu(const struct scheduler *ops,=20
         new_cpu =3D vc->processor;
     else
     {
-        BUG_ON(cpus_empty(prv->rqd[min_rqi].active));
+        BUG_ON(cpumask_empty(&prv->rqd[min_rqi].active));
         new_cpu =3D first_cpu(prv->rqd[min_rqi].active);
     }
=20
@@ -1258,9 +1258,9 @@ retry:
         if ( st.orqd->b_avgload > load_max )
             load_max =3D st.orqd->b_avgload;
=20
-        cpus_max=3Dcpus_weight(st.lrqd->active);
-        if ( cpus_weight(st.orqd->active) > cpus_max )
-            cpus_max =3D cpus_weight(st.orqd->active);
+        cpus_max =3D cpumask_weight(&st.lrqd->active);
+        if ( cpumask_weight(&st.orqd->active) > cpus_max )
+            cpus_max =3D cpumask_weight(&st.orqd->active);
=20
         /* If we're under 100% capacaty, only shift if load difference
          * is > 1.  otherwise, shift if under 12.5% */
@@ -1801,7 +1801,7 @@ csched_dump(const struct scheduler *ops)
=20
     printk("Active queues: %d\n"
            "\tdefault-weight     =3D %d\n",
-           cpus_weight(prv->active_queues),
+           cpumask_weight(&prv->active_queues),
            CSCHED_DEFAULT_WEIGHT);
     for_each_cpu_mask(i, prv->active_queues)
     {
@@ -1815,7 +1815,7 @@ csched_dump(const struct scheduler *ops)
                "\tinstload           =3D %d\n"
                "\taveload            =3D %3"PRI_stime"\n",
                i,
-               cpus_weight(prv->rqd[i].active),
+               cpumask_weight(&prv->rqd[i].active),
                prv->rqd[i].max_weight,
                prv->rqd[i].load,
                fraction);
@@ -1852,7 +1852,7 @@ static void activate_runqueue(struct csc
=20
     rqd =3D prv->rqd + rqi;
=20
-    BUG_ON(!cpus_empty(rqd->active));
+    BUG_ON(!cpumask_empty(&rqd->active));
=20
     rqd->max_weight =3D 1;
     rqd->id =3D rqi;
@@ -1869,7 +1869,7 @@ static void deactivate_runqueue(struct c
=20
     rqd =3D prv->rqd + rqi;
=20
-    BUG_ON(!cpus_empty(rqd->active));
+    BUG_ON(!cpumask_empty(&rqd->active));
    =20
     rqd->id =3D -1;
=20
@@ -1980,7 +1980,7 @@ csched_free_pdata(const struct scheduler
     cpu_clear(cpu, rqd->idle);
     cpu_clear(cpu, rqd->active);
=20
-    if ( cpus_empty(rqd->active) )
+    if ( cpumask_empty(&rqd->active) )
     {
         printk(" No cpus left on runqueue, disabling\n");
         deactivate_runqueue(prv, rqi);
--- a/xen/common/schedule.c
+++ b/xen/common/schedule.c
@@ -550,7 +550,7 @@ int cpu_disable_scheduler(unsigned int c
             vcpu_schedule_lock_irq(v);
=20
             cpumask_and(&online_affinity, v->cpu_affinity, c->cpu_valid);
-            if ( cpus_empty(online_affinity) &&
+            if ( cpumask_empty(&online_affinity) &&
                  cpumask_test_cpu(cpu, v->cpu_affinity) )
             {
                 printk("Breaking vcpu affinity for domain %d vcpu %d\n",
--- a/xen/include/asm-ia64/linux-xen/asm/acpi.h
+++ b/xen/include/asm-ia64/linux-xen/asm/acpi.h
@@ -147,7 +147,7 @@ static inline void per_cpu_scan_finalize
 	int cpu;
 	int next_nid =3D 0;
=20
-	low_cpu =3D cpus_weight(early_cpu_possible_map);
+	low_cpu =3D cpumask_weight(&early_cpu_possible_map);
=20
 	high_cpu =3D max(low_cpu, min_cpus);
 	high_cpu =3D min(high_cpu + reserve_cpus, NR_CPUS);
--- a/xen/include/asm-ia64/linux/topology.h
+++ b/xen/include/asm-ia64/linux/topology.h
@@ -42,7 +42,7 @@
 	({									=
\
 		cpumask_t __tmp__;						=
\
 		__tmp__ =3D node_to_cpumask(node);				=
\
-		cpus_weight(__tmp__);						=
\
+		cpumask_weight(&__tmp__);					=
\
 	})
 #endif
=20
--- a/xen/include/xen/cpumask.h
+++ b/xen/include/xen/cpumask.h
@@ -26,12 +26,12 @@
  * void cpumask_andnot(dst, src1, src2)	dst =3D src1 & ~src2
  * void cpumask_complement(dst, src)	dst =3D ~src
  *
- * int cpus_equal(mask1, mask2)		Does mask1 =3D=3D mask2?
- * int cpus_intersects(mask1, mask2)	Do mask1 and mask2 intersect?
- * int cpus_subset(mask1, mask2)	Is mask1 a subset of mask2?
- * int cpus_empty(mask)			Is mask empty (no bits =
sets)?
- * int cpus_full(mask)			Is mask full (all bits sets)?
- * int cpus_weight(mask)		Hamming weigh - number of set bits
+ * int cpumask_equal(mask1, mask2)	Does mask1 =3D=3D mask2?
+ * int cpumask_intersects(mask1, mask2)	Do mask1 and mask2 =
intersect?
+ * int cpumask_subset(mask1, mask2)	Is mask1 a subset of mask2?
+ * int cpumask_empty(mask)		Is mask empty (no bits sets)?
+ * int cpumask_full(mask)		Is mask full (all bits sets)?
+ * int cpumask_weight(mask)		Hamming weigh - number of set bits
  *
  * void cpumask_shift_right(dst, src, n) Shift right
  * void cpumask_shift_left(dst, src, n)	Shift left
@@ -42,9 +42,7 @@
  * int cycle_cpu(cpu, mask)		Next cpu cycling from 'cpu', or =
NR_CPUS
  *
  * cpumask_t cpumask_of_cpu(cpu)	Return cpumask with bit 'cpu' set
- * CPU_MASK_ALL				Initializer - all bits set
- * CPU_MASK_NONE			Initializer - no bits set
- * unsigned long *cpus_addr(mask)	Array of unsigned long's in mask
+ * unsigned long *cpumask_bits(mask)	Array of unsigned long's in mask
  *
  * int cpumask_scnprintf(buf, len, mask) Format cpumask for printing
  * int cpulist_scnprintf(buf, len, mask) Format cpumask as list for =
printing
@@ -168,51 +166,37 @@ static inline void cpumask_complement(cp
 	bitmap_complement(dstp->bits, srcp->bits, nr_cpumask_bits);
 }
=20
-#define cpumask_equal(src1, src2) __cpus_equal(src1, src2, nr_cpu_ids)
-#define cpus_equal(src1, src2) __cpus_equal(&(src1), &(src2), nr_cpu_ids)
-static inline int __cpus_equal(const cpumask_t *src1p,
-					const cpumask_t *src2p, int nbits)
+static inline int cpumask_equal(const cpumask_t *src1p,
+				const cpumask_t *src2p)
 {
-	return bitmap_equal(src1p->bits, src2p->bits, nbits);
+	return bitmap_equal(src1p->bits, src2p->bits, nr_cpu_ids);
 }
=20
-#define cpumask_intersects(src1, src2) \
-	__cpus_intersects(src1, src2, nr_cpu_ids)
-#define cpus_intersects(src1, src2) \
-	__cpus_intersects(&(src1), &(src2), nr_cpu_ids)
-static inline int __cpus_intersects(const cpumask_t *src1p,
-					const cpumask_t *src2p, int nbits)
+static inline int cpumask_intersects(const cpumask_t *src1p,
+				     const cpumask_t *src2p)
 {
-	return bitmap_intersects(src1p->bits, src2p->bits, nbits);
+	return bitmap_intersects(src1p->bits, src2p->bits, nr_cpu_ids);
 }
=20
-#define cpumask_subset(src1, src2) __cpus_subset(src1, src2, nr_cpu_ids)
-#define cpus_subset(src1, src2) __cpus_subset(&(src1), &(src2), nr_cpu_ids=
)
-static inline int __cpus_subset(const cpumask_t *src1p,
-					const cpumask_t *src2p, int nbits)
+static inline int cpumask_subset(const cpumask_t *src1p,
+				 const cpumask_t *src2p)
 {
-	return bitmap_subset(src1p->bits, src2p->bits, nbits);
+	return bitmap_subset(src1p->bits, src2p->bits, nr_cpu_ids);
 }
=20
-#define cpumask_empty(src) __cpus_empty(src, nr_cpu_ids)
-#define cpus_empty(src) __cpus_empty(&(src), nr_cpu_ids)
-static inline int __cpus_empty(const cpumask_t *srcp, int nbits)
+static inline int cpumask_empty(const cpumask_t *srcp)
 {
-	return bitmap_empty(srcp->bits, nbits);
+	return bitmap_empty(srcp->bits, nr_cpu_ids);
 }
=20
-#define cpumask_full(cpumask) __cpus_full(cpumask, nr_cpu_ids)
-#define cpus_full(cpumask) __cpus_full(&(cpumask), nr_cpu_ids)
-static inline int __cpus_full(const cpumask_t *srcp, int nbits)
+static inline int cpumask_full(const cpumask_t *srcp)
 {
-	return bitmap_full(srcp->bits, nbits);
+	return bitmap_full(srcp->bits, nr_cpu_ids);
 }
=20
-#define cpumask_weight(cpumask) __cpus_weight(cpumask, nr_cpu_ids)
-#define cpus_weight(cpumask) __cpus_weight(&(cpumask), nr_cpu_ids)
-static inline int __cpus_weight(const cpumask_t *srcp, int nbits)
+static inline int cpumask_weight(const cpumask_t *srcp)
 {
-	return bitmap_weight(srcp->bits, nbits);
+	return bitmap_weight(srcp->bits, nr_cpu_ids);
 }
=20
 static inline void cpumask_copy(cpumask_t *dstp, const cpumask_t *srcp)
@@ -317,7 +301,6 @@ static inline const cpumask_t *cpumask_o
 } }
 #endif /* __ia64__ */
=20
-#define cpus_addr(src) ((src).bits)
 #define cpumask_bits(maskp) ((maskp)->bits)
=20
 static inline int cpumask_scnprintf(char *buf, int len,
@@ -458,9 +441,9 @@ extern cpumask_t cpu_online_map;
 extern cpumask_t cpu_present_map;
=20
 #if NR_CPUS > 1
-#define num_online_cpus()	cpus_weight(cpu_online_map)
-#define num_possible_cpus()	cpus_weight(cpu_possible_map)
-#define num_present_cpus()	cpus_weight(cpu_present_map)
+#define num_online_cpus()	cpumask_weight(&cpu_online_map)
+#define num_possible_cpus()	cpumask_weight(&cpu_possible_map)
+#define num_present_cpus()	cpumask_weight(&cpu_present_map)
 #define cpu_online(cpu)		cpu_isset((cpu), cpu_online_map)
 #define cpu_possible(cpu)	cpu_isset((cpu), cpu_possible_map)
 #define cpu_present(cpu)	cpu_isset((cpu), cpu_present_map)



--=__Part604F945A.0__=
Content-Type: text/plain; name="eliminate-cpus_xyz.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="eliminate-cpus_xyz.patch"

eliminate cpus_xyz()=0A=0ASigned-off-by: Jan Beulich <jbeulich@suse.com>=0A=
=0A--- a/xen/arch/ia64/linux-xen/iosapic.c=0A+++ b/xen/arch/ia64/linux-xen/=
iosapic.c=0A@@ -709,7 +709,7 @@ get_target_cpu (unsigned int gsi, int =
ve=0A 				cpu_clear(numa_cpu, cpu_mask);=0A 		=
}=0A =0A-		num_cpus =3D cpus_weight(cpu_mask);=0A+		=
num_cpus =3D cpumask_weight(&cpu_mask);=0A =0A 		if (!num_cpus)=0A 	=
		goto skip_numa_setup;=0A--- a/xen/arch/ia64/linux-xen/smp.c=
=0A+++ b/xen/arch/ia64/linux-xen/smp.c=0A@@ -62,7 +62,7 @@ void smp_send_ev=
ent_check_mask(const cpu=0A     int cpu;=0A =0A     /*  Not for me.  =
*/=0A-    if (cpus_subset(*mask, *cpumask_of(smp_processor_id())))=0A+    =
if (cpumask_subset(mask, cpumask_of(smp_processor_id())))=0A         =
return;=0A =0A     //printf("smp_send_event_check_mask called\n");=0A@@ =
-444,7 +444,7 @@ on_selected_cpus(const cpumask_t *select=0A               =
   void *info, int wait)=0A {=0A 	struct call_data_struct data;=0A-	=
unsigned int cpu, nr_cpus =3D cpus_weight(*selected);=0A+	unsigned =
int cpu, nr_cpus =3D cpumask_weight(selected);=0A =0A 	ASSERT(local_irq_is=
_enabled());=0A =0A--- a/xen/arch/ia64/xen/mm.c=0A+++ b/xen/arch/ia64/xen/m=
m.c=0A@@ -3196,7 +3196,7 @@ int get_page_type(struct page_info *page=0A    =
             cpumask_copy(&mask, page_get_owner(page)->domain_dirty_cpumask=
);=0A                 tlbflush_filter(mask, page->tlbflush_timestamp);=0A =
=0A-                if ( unlikely(!cpus_empty(mask)) )=0A+                =
if ( unlikely(!cpumask_empty(&mask)) )=0A                 {=0A             =
        perfc_incr(need_flush_tlb_flush);=0A                     flush_tlb_=
mask(&mask);=0A--- a/xen/arch/ia64/xen/vhpt.c=0A+++ b/xen/arch/ia64/xen/vhp=
t.c=0A@@ -556,7 +556,7 @@ void flush_tlb_mask(const cpumask_t *mas=0A     =
if (cpu_isset(cpu, *mask))=0A         flush_tlb_vhpt_all (NULL);=0A =0A-   =
 if (cpus_subset(*mask, *cpumask_of(cpu)))=0A+    if (cpumask_subset(mask, =
cpumask_of(cpu)))=0A         return;=0A =0A     for_each_cpu_mask (cpu, =
*mask)=0A--- a/xen/arch/x86/cpu/mcheck/mce_intel.c=0A+++ b/xen/arch/x86/cpu=
/mcheck/mce_intel.c=0A@@ -863,7 +863,7 @@ static void intel_machine_check(s=
truct c=0A          */=0A         if (atomic_read(&found_error) =3D=3D =
0)=0A             mc_panic("MCE: No CPU found valid MCE, need reset\n");=0A=
-        if (!cpus_empty(mce_fatal_cpus))=0A+        if (!cpumask_empty(&mc=
e_fatal_cpus))=0A         {=0A             char *ebufp, ebuf[96] =3D "MCE: =
Fatal error happened on CPUs ";=0A             ebufp =3D ebuf + strlen(ebuf=
);=0A--- a/xen/arch/x86/domain.c=0A+++ b/xen/arch/x86/domain.c=0A@@ =
-1611,8 +1611,9 @@ void context_switch(struct vcpu *prev, s=0A =0A     =
cpumask_copy(&dirty_mask, next->vcpu_dirty_cpumask);=0A     /* Allow at =
most one CPU at a time to be dirty. */=0A-    ASSERT(cpus_weight(dirty_mask=
) <=3D 1);=0A-    if ( unlikely(!cpu_isset(cpu, dirty_mask) && !cpus_empty(=
dirty_mask)) )=0A+    ASSERT(cpumask_weight(&dirty_mask) <=3D 1);=0A+    =
if ( unlikely(!cpumask_test_cpu(cpu, &dirty_mask) &&=0A+                  =
!cpumask_empty(&dirty_mask)) )=0A     {=0A         /* Other cpus call =
__sync_local_execstate from flush ipi handler. */=0A         flush_tlb_mask=
(&dirty_mask);=0A--- a/xen/arch/x86/genapic/delivery.c=0A+++ b/xen/arch/x86=
/genapic/delivery.c=0A@@ -38,7 +38,7 @@ const cpumask_t *vector_allocation_=
cpuma=0A =0A unsigned int cpu_mask_to_apicid_flat(const cpumask_t =
*cpumask)=0A {=0A-	return cpus_addr(*cpumask)[0]&0xFF;=0A+	return =
cpumask_bits(cpumask)[0]&0xFF;=0A }=0A =0A /*=0A--- a/xen/arch/x86/irq.c=0A=
+++ b/xen/arch/x86/irq.c=0A@@ -711,7 +711,7 @@ unsigned int set_desc_affini=
ty(struct ir=0A     unsigned long flags;=0A     cpumask_t dest_mask;=0A =
=0A-    if (!cpus_intersects(*mask, cpu_online_map))=0A+    if (!cpumask_in=
tersects(mask, &cpu_online_map))=0A         return BAD_APICID;=0A =0A     =
irq =3D desc->irq;=0A--- a/xen/arch/x86/mm.c=0A+++ b/xen/arch/x86/mm.c=0A@@=
 -2436,7 +2436,7 @@ static int __get_page_type(struct page_i=0A            =
     /* Don't flush if the timestamp is old enough */=0A                 =
tlbflush_filter(mask, page->tlbflush_timestamp);=0A =0A-                if =
( unlikely(!cpus_empty(mask)) &&=0A+                if ( unlikely(!cpumask_=
empty(&mask)) &&=0A                      /* Shadow mode: track only =
writable pages. */=0A                      (!shadow_mode_enabled(page_get_o=
wner(page)) ||=0A                       ((nx & PGT_type_mask) =3D=3D =
PGT_writable_page)) )=0A--- a/xen/arch/x86/mm/shadow/common.c=0A+++ =
b/xen/arch/x86/mm/shadow/common.c=0A@@ -1524,7 +1524,7 @@ mfn_t shadow_allo=
c(struct domain *d,  =0A          * we need to be sure that no TLB holds a =
pointer to it. */=0A         cpumask_copy(&mask, d->domain_dirty_cpumask);=
=0A         tlbflush_filter(mask, sp->tlbflush_timestamp);=0A-        if ( =
unlikely(!cpus_empty(mask)) )=0A+        if ( unlikely(!cpumask_empty(&mask=
)) )=0A         {=0A             perfc_incr(shadow_alloc_tlbflush);=0A     =
        flush_tlb_mask(&mask);=0A--- a/xen/arch/x86/smp.c=0A+++ b/xen/arch/=
x86/smp.c=0A@@ -140,11 +140,11 @@ void send_IPI_self_x2apic(int vector)=0A =
=0A void send_IPI_mask_flat(const cpumask_t *cpumask, int vector)=0A {=0A- =
   unsigned long mask =3D cpus_addr(*cpumask)[0];=0A+    unsigned long =
mask =3D cpumask_bits(cpumask)[0];=0A     unsigned long cfg;=0A     =
unsigned long flags;=0A =0A-    mask &=3D cpus_addr(cpu_online_map)[0];=0A+=
    mask &=3D cpumask_bits(&cpu_online_map)[0];=0A     mask &=3D ~(1UL << =
smp_processor_id());=0A     if ( mask =3D=3D 0 )=0A         return;=0A@@ =
-237,7 +237,7 @@ void flush_area_mask(const cpumask_t *ma=0A     if ( =
cpu_isset(smp_processor_id(), *mask) )=0A         flush_area_local(va, =
flags);=0A =0A-    if ( !cpus_subset(*mask, *cpumask_of(smp_processor_id())=
) )=0A+    if ( !cpumask_subset(mask, cpumask_of(smp_processor_id())) )=0A =
    {=0A         spin_lock(&flush_lock);=0A         cpumask_and(&flush_cpum=
ask, mask, &cpu_online_map);=0A--- a/xen/common/domain.c=0A+++ b/xen/common=
/domain.c=0A@@ -371,7 +371,7 @@ void domain_update_node_affinity(struct =
=0A         cpumask_or(&cpumask, &cpumask, v->cpu_affinity);=0A =0A     =
for_each_online_node ( node )=0A-        if ( cpus_intersects(node_to_cpuma=
sk(node), cpumask) )=0A+        if ( cpumask_intersects(&node_to_cpumask(no=
de), &cpumask) )=0A             node_set(node, nodemask);=0A =0A     =
d->node_affinity =3D nodemask;=0A--- a/xen/common/perfc.c=0A+++ b/xen/commo=
n/perfc.c=0A@@ -163,11 +163,11 @@ static int perfc_copy_info(XEN_GUEST_HAN=
=0A     unsigned int i, j, v;=0A =0A     /* We only copy the name and =
array-size information once. */=0A-    if ( !cpus_equal(cpu_online_map, =
perfc_cpumap) )=0A+    if ( !cpumask_equal(&cpu_online_map, &perfc_cpumap) =
)=0A     {=0A         unsigned int nr_cpus;=0A         perfc_cpumap =3D =
cpu_online_map;=0A-        nr_cpus =3D cpus_weight(perfc_cpumap);=0A+      =
  nr_cpus =3D cpumask_weight(&perfc_cpumap);=0A =0A         perfc_nbr_vals =
=3D 0;=0A =0A--- a/xen/common/rcupdate.c=0A+++ b/xen/common/rcupdate.c=0A@@=
 -121,7 +121,7 @@ static int rcu_barrier_action(void *_cpu=0A      */=0A   =
  call_rcu(&data.head, rcu_barrier_callback);=0A =0A-    while ( atomic_rea=
d(data.cpu_count) !=3D cpus_weight(cpu_online_map) )=0A+    while ( =
atomic_read(data.cpu_count) !=3D num_online_cpus() )=0A     {=0A         =
process_pending_softirqs();=0A         cpu_relax();=0A--- a/xen/common/sche=
d_credit.c=0A+++ b/xen/common/sched_credit.c=0A@@ -1246,7 +1246,7 @@ =
csched_load_balance(struct csched_privat=0A     cpumask_clear_cpu(cpu, =
&workers);=0A     peer_cpu =3D cpu;=0A =0A-    while ( !cpus_empty(workers)=
 )=0A+    while ( !cpumask_empty(&workers) )=0A     {=0A         peer_cpu =
=3D cpumask_cycle(peer_cpu, &workers);=0A         cpumask_clear_cpu(peer_cp=
u, &workers);=0A--- a/xen/common/sched_credit2.c=0A+++ b/xen/common/sched_c=
redit2.c=0A@@ -1009,7 +1009,7 @@ choose_cpu(const struct scheduler *ops, =
=0A     struct csched_vcpu *svc =3D CSCHED_VCPU(vc);=0A     s_time_t =
min_avgload;=0A =0A-    BUG_ON(cpus_empty(prv->active_queues));=0A+    =
BUG_ON(cpumask_empty(&prv->active_queues));=0A =0A     /* Locking:=0A      =
* - vc->processor is already locked=0A@@ -1098,7 +1098,7 @@ choose_cpu(cons=
t struct scheduler *ops, =0A         new_cpu =3D vc->processor;=0A     =
else=0A     {=0A-        BUG_ON(cpus_empty(prv->rqd[min_rqi].active));=0A+ =
       BUG_ON(cpumask_empty(&prv->rqd[min_rqi].active));=0A         =
new_cpu =3D first_cpu(prv->rqd[min_rqi].active);=0A     }=0A =0A@@ -1258,9 =
+1258,9 @@ retry:=0A         if ( st.orqd->b_avgload > load_max )=0A       =
      load_max =3D st.orqd->b_avgload;=0A =0A-        cpus_max=3Dcpus_weigh=
t(st.lrqd->active);=0A-        if ( cpus_weight(st.orqd->active) > =
cpus_max )=0A-            cpus_max =3D cpus_weight(st.orqd->active);=0A+   =
     cpus_max =3D cpumask_weight(&st.lrqd->active);=0A+        if ( =
cpumask_weight(&st.orqd->active) > cpus_max )=0A+            cpus_max =3D =
cpumask_weight(&st.orqd->active);=0A =0A         /* If we're under 100% =
capacaty, only shift if load difference=0A          * is > 1.  otherwise, =
shift if under 12.5% */=0A@@ -1801,7 +1801,7 @@ csched_dump(const struct =
scheduler *ops)=0A =0A     printk("Active queues: %d\n"=0A            =
"\tdefault-weight     =3D %d\n",=0A-           cpus_weight(prv->active_queu=
es),=0A+           cpumask_weight(&prv->active_queues),=0A            =
CSCHED_DEFAULT_WEIGHT);=0A     for_each_cpu_mask(i, prv->active_queues)=0A =
    {=0A@@ -1815,7 +1815,7 @@ csched_dump(const struct scheduler *ops)=0A  =
              "\tinstload           =3D %d\n"=0A                "\taveload =
           =3D %3"PRI_stime"\n",=0A                i,=0A-               =
cpus_weight(prv->rqd[i].active),=0A+               cpumask_weight(&prv->rqd=
[i].active),=0A                prv->rqd[i].max_weight,=0A                =
prv->rqd[i].load,=0A                fraction);=0A@@ -1852,7 +1852,7 @@ =
static void activate_runqueue(struct csc=0A =0A     rqd =3D prv->rqd + =
rqi;=0A =0A-    BUG_ON(!cpus_empty(rqd->active));=0A+    BUG_ON(!cpumask_em=
pty(&rqd->active));=0A =0A     rqd->max_weight =3D 1;=0A     rqd->id =3D =
rqi;=0A@@ -1869,7 +1869,7 @@ static void deactivate_runqueue(struct c=0A =
=0A     rqd =3D prv->rqd + rqi;=0A =0A-    BUG_ON(!cpus_empty(rqd->active))=
;=0A+    BUG_ON(!cpumask_empty(&rqd->active));=0A     =0A     rqd->id =3D =
-1;=0A =0A@@ -1980,7 +1980,7 @@ csched_free_pdata(const struct scheduler=0A=
     cpu_clear(cpu, rqd->idle);=0A     cpu_clear(cpu, rqd->active);=0A =
=0A-    if ( cpus_empty(rqd->active) )=0A+    if ( cpumask_empty(&rqd->acti=
ve) )=0A     {=0A         printk(" No cpus left on runqueue, disabling\n");=
=0A         deactivate_runqueue(prv, rqi);=0A--- a/xen/common/schedule.c=0A=
+++ b/xen/common/schedule.c=0A@@ -550,7 +550,7 @@ int cpu_disable_scheduler=
(unsigned int c=0A             vcpu_schedule_lock_irq(v);=0A =0A           =
  cpumask_and(&online_affinity, v->cpu_affinity, c->cpu_valid);=0A-        =
    if ( cpus_empty(online_affinity) &&=0A+            if ( cpumask_empty(&=
online_affinity) &&=0A                  cpumask_test_cpu(cpu, v->cpu_affini=
ty) )=0A             {=0A                 printk("Breaking vcpu affinity =
for domain %d vcpu %d\n",=0A--- a/xen/include/asm-ia64/linux-xen/asm/acpi.h=
=0A+++ b/xen/include/asm-ia64/linux-xen/asm/acpi.h=0A@@ -147,7 +147,7 @@ =
static inline void per_cpu_scan_finalize=0A 	int cpu;=0A 	int =
next_nid =3D 0;=0A =0A-	low_cpu =3D cpus_weight(early_cpu_possible_map);=0A=
+	low_cpu =3D cpumask_weight(&early_cpu_possible_map);=0A =0A 	=
high_cpu =3D max(low_cpu, min_cpus);=0A 	high_cpu =3D min(high_cpu =
+ reserve_cpus, NR_CPUS);=0A--- a/xen/include/asm-ia64/linux/topology.h=0A+=
++ b/xen/include/asm-ia64/linux/topology.h=0A@@ -42,7 +42,7 @@=0A 	({	=
								\=0A 		=
cpumask_t __tmp__;						\=0A 		=
__tmp__ =3D node_to_cpumask(node);				\=0A-		=
cpus_weight(__tmp__);						\=0A+		=
cpumask_weight(&__tmp__);					\=0A 	=
})=0A #endif=0A =0A--- a/xen/include/xen/cpumask.h=0A+++ b/xen/include/xen/=
cpumask.h=0A@@ -26,12 +26,12 @@=0A  * void cpumask_andnot(dst, src1, src2)	=
dst =3D src1 & ~src2=0A  * void cpumask_complement(dst, src)	dst =3D =
~src=0A  *=0A- * int cpus_equal(mask1, mask2)		Does mask1 =3D=3D =
mask2?=0A- * int cpus_intersects(mask1, mask2)	Do mask1 and mask2 =
intersect?=0A- * int cpus_subset(mask1, mask2)	Is mask1 a subset of =
mask2?=0A- * int cpus_empty(mask)			Is mask empty (no =
bits sets)?=0A- * int cpus_full(mask)			Is mask full (all =
bits sets)?=0A- * int cpus_weight(mask)		Hamming weigh - number of =
set bits=0A+ * int cpumask_equal(mask1, mask2)	Does mask1 =3D=3D =
mask2?=0A+ * int cpumask_intersects(mask1, mask2)	Do mask1 and mask2 =
intersect?=0A+ * int cpumask_subset(mask1, mask2)	Is mask1 a subset =
of mask2?=0A+ * int cpumask_empty(mask)		Is mask empty (no bits =
sets)?=0A+ * int cpumask_full(mask)		Is mask full (all bits =
sets)?=0A+ * int cpumask_weight(mask)		Hamming weigh - number of =
set bits=0A  *=0A  * void cpumask_shift_right(dst, src, n) Shift right=0A  =
* void cpumask_shift_left(dst, src, n)	Shift left=0A@@ -42,9 +42,7 @@=0A  =
* int cycle_cpu(cpu, mask)		Next cpu cycling from 'cpu', or =
NR_CPUS=0A  *=0A  * cpumask_t cpumask_of_cpu(cpu)	Return cpumask =
with bit 'cpu' set=0A- * CPU_MASK_ALL				Initializer=
 - all bits set=0A- * CPU_MASK_NONE			Initializer - no =
bits set=0A- * unsigned long *cpus_addr(mask)	Array of unsigned long's =
in mask=0A+ * unsigned long *cpumask_bits(mask)	Array of unsigned long's =
in mask=0A  *=0A  * int cpumask_scnprintf(buf, len, mask) Format cpumask =
for printing=0A  * int cpulist_scnprintf(buf, len, mask) Format cpumask as =
list for printing=0A@@ -168,51 +166,37 @@ static inline void cpumask_comple=
ment(cp=0A 	bitmap_complement(dstp->bits, srcp->bits, nr_cpumask_bits);=
=0A }=0A =0A-#define cpumask_equal(src1, src2) __cpus_equal(src1, src2, =
nr_cpu_ids)=0A-#define cpus_equal(src1, src2) __cpus_equal(&(src1), =
&(src2), nr_cpu_ids)=0A-static inline int __cpus_equal(const cpumask_t =
*src1p,=0A-					const cpumask_t *src2p, =
int nbits)=0A+static inline int cpumask_equal(const cpumask_t *src1p,=0A+	=
			const cpumask_t *src2p)=0A {=0A-	return =
bitmap_equal(src1p->bits, src2p->bits, nbits);=0A+	return bitmap_equal=
(src1p->bits, src2p->bits, nr_cpu_ids);=0A }=0A =0A-#define cpumask_interse=
cts(src1, src2) \=0A-	__cpus_intersects(src1, src2, nr_cpu_ids)=0A-#defin=
e cpus_intersects(src1, src2) \=0A-	__cpus_intersects(&(src1), =
&(src2), nr_cpu_ids)=0A-static inline int __cpus_intersects(const =
cpumask_t *src1p,=0A-					const cpumask_t =
*src2p, int nbits)=0A+static inline int cpumask_intersects(const cpumask_t =
*src1p,=0A+				     const cpumask_t *src2p)=0A =
{=0A-	return bitmap_intersects(src1p->bits, src2p->bits, nbits);=0A+	=
return bitmap_intersects(src1p->bits, src2p->bits, nr_cpu_ids);=0A }=0A =
=0A-#define cpumask_subset(src1, src2) __cpus_subset(src1, src2, nr_cpu_ids=
)=0A-#define cpus_subset(src1, src2) __cpus_subset(&(src1), &(src2), =
nr_cpu_ids)=0A-static inline int __cpus_subset(const cpumask_t *src1p,=0A-	=
				const cpumask_t *src2p, int nbits)=0A+stati=
c inline int cpumask_subset(const cpumask_t *src1p,=0A+				=
 const cpumask_t *src2p)=0A {=0A-	return bitmap_subset(src1p->bits, =
src2p->bits, nbits);=0A+	return bitmap_subset(src1p->bits, =
src2p->bits, nr_cpu_ids);=0A }=0A =0A-#define cpumask_empty(src) __cpus_emp=
ty(src, nr_cpu_ids)=0A-#define cpus_empty(src) __cpus_empty(&(src), =
nr_cpu_ids)=0A-static inline int __cpus_empty(const cpumask_t *srcp, int =
nbits)=0A+static inline int cpumask_empty(const cpumask_t *srcp)=0A {=0A-	=
return bitmap_empty(srcp->bits, nbits);=0A+	return bitmap_empty(srcp->b=
its, nr_cpu_ids);=0A }=0A =0A-#define cpumask_full(cpumask) __cpus_full(cpu=
mask, nr_cpu_ids)=0A-#define cpus_full(cpumask) __cpus_full(&(cpumask), =
nr_cpu_ids)=0A-static inline int __cpus_full(const cpumask_t *srcp, int =
nbits)=0A+static inline int cpumask_full(const cpumask_t *srcp)=0A {=0A-	=
return bitmap_full(srcp->bits, nbits);=0A+	return bitmap_full(srcp->bi=
ts, nr_cpu_ids);=0A }=0A =0A-#define cpumask_weight(cpumask) __cpus_weight(=
cpumask, nr_cpu_ids)=0A-#define cpus_weight(cpumask) __cpus_weight(&(cpumas=
k), nr_cpu_ids)=0A-static inline int __cpus_weight(const cpumask_t *srcp, =
int nbits)=0A+static inline int cpumask_weight(const cpumask_t *srcp)=0A =
{=0A-	return bitmap_weight(srcp->bits, nbits);=0A+	return bitmap_weigh=
t(srcp->bits, nr_cpu_ids);=0A }=0A =0A static inline void cpumask_copy(cpum=
ask_t *dstp, const cpumask_t *srcp)=0A@@ -317,7 +301,6 @@ static inline =
const cpumask_t *cpumask_o=0A } }=0A #endif /* __ia64__ */=0A =0A-#define =
cpus_addr(src) ((src).bits)=0A #define cpumask_bits(maskp) ((maskp)->bits)=
=0A =0A static inline int cpumask_scnprintf(char *buf, int len,=0A@@ =
-458,9 +441,9 @@ extern cpumask_t cpu_online_map;=0A extern cpumask_t =
cpu_present_map;=0A =0A #if NR_CPUS > 1=0A-#define num_online_cpus()	=
cpus_weight(cpu_online_map)=0A-#define num_possible_cpus()	cpus_weight=
(cpu_possible_map)=0A-#define num_present_cpus()	cpus_weight(cpu_pre=
sent_map)=0A+#define num_online_cpus()	cpumask_weight(&cpu_online_map)=0A+=
#define num_possible_cpus()	cpumask_weight(&cpu_possible_map)=0A+#defin=
e num_present_cpus()	cpumask_weight(&cpu_present_map)=0A #define =
cpu_online(cpu)		cpu_isset((cpu), cpu_online_map)=0A #define =
cpu_possible(cpu)	cpu_isset((cpu), cpu_possible_map)=0A #define =
cpu_present(cpu)	cpu_isset((cpu), cpu_present_map)=0A
--=__Part604F945A.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part604F945A.0__=--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 02:04:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 02:04:34 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNM4A-0005qH-7a; Mon, 07 Nov 2011 02:04:34 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNLwu-0004uD-Px
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 01:57:05 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1320659820!539652!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12258 invoked from network); 7 Nov 2011 09:57:01 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-3.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Nov 2011 09:57:01 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 07 Nov 2011 09:57:00 +0000
Message-Id: <4EB7B979020000780005F4A8@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 07 Nov 2011 09:56:57 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part436CB779.0__="
Subject: [Xen-devel] [PATCH 2/6] eliminate cpu_test_xyz()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part436CB779.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/ia64/linux-xen/smp.c
+++ b/xen/arch/ia64/linux-xen/smp.c
@@ -68,7 +68,7 @@ void smp_send_event_check_mask(const cpu
     //printf("smp_send_event_check_mask called\n");
=20
     for (cpu =3D 0; cpu < NR_CPUS; ++cpu)
-        if (cpu_isset(cpu, *mask) && cpu !=3D smp_processor_id())
+        if (cpumask_test_cpu(cpu, mask) && cpu !=3D smp_processor_id())
 	    platform_send_ipi(cpu, IA64_IPI_RESCHEDULE, IA64_IPI_DM_INT, =
0);
 }
 #endif
--- a/xen/arch/ia64/linux-xen/smpboot.c
+++ b/xen/arch/ia64/linux-xen/smpboot.c
@@ -548,13 +548,13 @@ do_rest:
 	 */
 	Dprintk("Waiting on callin_map ...");
 	for (timeout =3D 0; timeout < 100000; timeout++) {
-		if (cpu_isset(cpu, cpu_callin_map))
+		if (cpumask_test_cpu(cpu, &cpu_callin_map))
 			break;  /* It has booted */
 		udelay(100);
 	}
 	Dprintk("\n");
=20
-	if (!cpu_isset(cpu, cpu_callin_map)) {
+	if (!cpumask_test_cpu(cpu, &cpu_callin_map)) {
 		printk(KERN_ERR "Processor 0x%x/0x%x is stuck.\n", cpu, =
sapicid);
 		ia64_cpu_to_sapicid[cpu] =3D -1;
 		cpu_clear(cpu, cpu_online_map);  /* was set in smp_callin()=
 */
@@ -818,7 +818,7 @@ __cpu_up (unsigned int cpu)
 	 * Already booted cpu? not valid anymore since we dont
 	 * do idle loop tightspin anymore.
 	 */
-	if (cpu_isset(cpu, cpu_callin_map))
+	if (cpumask_test_cpu(cpu, &cpu_callin_map))
 		return -EINVAL;
=20
 	if (!per_cpu(cpu_sibling_mask, cpu) &&
--- a/xen/arch/ia64/xen/domain.c
+++ b/xen/arch/ia64/xen/domain.c
@@ -140,7 +140,7 @@ static void flush_cache_for_context_swit
=20
 	if (is_idle_vcpu(next) ||
 	    __test_and_clear_bit(cpu, &next->arch.cache_coherent_map)) {
-		if (cpu_test_and_clear(cpu, cpu_cache_coherent_map)) {
+		if (cpumask_test_and_clear_cpu(cpu, &cpu_cache_coherent_map=
)) {
 			unsigned long flags;
 			u64 progress =3D 0;
 			s64 status;
--- a/xen/arch/ia64/xen/regionreg.c
+++ b/xen/arch/ia64/xen/regionreg.c
@@ -320,8 +320,8 @@ int set_one_rr_efi(unsigned long rr, uns
 	else {
 		if (current && VMX_DOMAIN(current))
 			vpd =3D __get_cpu_var(inserted_vpd);
-		ia64_new_rr7_efi(val, cpu_isset(smp_processor_id(),
-				 percpu_set), vpd);
+		ia64_new_rr7_efi(val, cpumask_test_cpu(smp_processor_id(),
+						       &percpu_set), vpd);
 	}
=20
 	return 1;
@@ -342,8 +342,8 @@ set_one_rr_efi_restore(unsigned long rr,
 		   and strcut domain are initialized. */
 		if (unlikely(current =3D=3D NULL || current->domain =3D=3D =
NULL ||
 			     is_idle_vcpu(current)))
-			ia64_new_rr7_efi(val, cpu_isset(smp_processor_id(),=

-							percpu_set),
+			ia64_new_rr7_efi(val, cpumask_test_cpu(smp_processo=
r_id(),
+							       &percpu_set)=
,
 					 0UL);
 		else if (VMX_DOMAIN(current))
 			__vmx_switch_rr7_vcpu(current, val);
--- a/xen/arch/ia64/xen/vhpt.c
+++ b/xen/arch/ia64/xen/vhpt.c
@@ -553,7 +553,7 @@ void flush_tlb_mask(const cpumask_t *mas
     int cpu;
=20
     cpu =3D smp_processor_id();
-    if (cpu_isset(cpu, *mask))
+    if (cpumask_test_cpu(cpu, mask))
         flush_tlb_vhpt_all (NULL);
=20
     if (cpumask_subset(mask, cpumask_of(cpu)))
--- a/xen/arch/x86/cpu/common.c
+++ b/xen/arch/x86/cpu/common.c
@@ -624,7 +624,7 @@ void __cpuinit cpu_init(void)
 		.limit =3D LAST_RESERVED_GDT_BYTE
 	};
=20
-	if (cpu_test_and_set(cpu, cpu_initialized)) {
+	if (cpumask_test_and_set_cpu(cpu, &cpu_initialized)) {
 		printk(KERN_WARNING "CPU#%d already initialized!\n", cpu);
 		for (;;) local_irq_enable();
 	}
--- a/xen/arch/x86/smp.c
+++ b/xen/arch/x86/smp.c
@@ -234,7 +234,7 @@ void flush_area_mask(const cpumask_t *ma
 {
     ASSERT(local_irq_is_enabled());
=20
-    if ( cpu_isset(smp_processor_id(), *mask) )
+    if ( cpumask_test_cpu(smp_processor_id(), mask) )
         flush_area_local(va, flags);
=20
     if ( !cpumask_subset(mask, cpumask_of(smp_processor_id())) )
--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -138,7 +138,7 @@ static void synchronize_tsc_master(unsig
         return;
=20
     if ( boot_cpu_has(X86_FEATURE_TSC_RELIABLE) &&
-         !cpu_isset(slave, tsc_sync_cpu_mask) )
+         !cpumask_test_cpu(slave, &tsc_sync_cpu_mask) )
         return;
=20
     for ( i =3D 1; i <=3D 5; i++ )
@@ -162,7 +162,7 @@ static void synchronize_tsc_slave(unsign
         return;
=20
     if ( boot_cpu_has(X86_FEATURE_TSC_RELIABLE) &&
-         !cpu_isset(slave, tsc_sync_cpu_mask) )
+         !cpumask_test_cpu(slave, &tsc_sync_cpu_mask) )
         return;
=20
     for ( i =3D 1; i <=3D 5; i++ )
@@ -956,7 +956,7 @@ int __cpu_up(unsigned int cpu)
         return ret;
=20
     set_cpu_state(CPU_STATE_ONLINE);
-    while ( !cpu_isset(cpu, cpu_online_map) )
+    while ( !cpu_online(cpu) )
     {
         cpu_relax();
         process_pending_softirqs();
--- a/xen/arch/x86/time.c
+++ b/xen/arch/x86/time.c
@@ -1580,7 +1580,7 @@ void pit_broadcast_exit(void)
 {
     int cpu =3D smp_processor_id();
=20
-    if ( cpu_test_and_clear(cpu, pit_broadcast_mask) )
+    if ( cpumask_test_and_clear_cpu(cpu, &pit_broadcast_mask) )
         reprogram_timer(this_cpu(timer_deadline));
 }
=20
--- a/xen/common/cpupool.c
+++ b/xen/common/cpupool.c
@@ -299,7 +299,7 @@ int cpupool_unassign_cpu(struct cpupool=20
     ret =3D -EBUSY;
     if ( (cpupool_moving_cpu !=3D -1) && (cpu !=3D cpupool_moving_cpu) )
         goto out;
-    if ( cpu_isset(cpu, cpupool_locked_cpus) )
+    if ( cpumask_test_cpu(cpu, &cpupool_locked_cpus) )
         goto out;
=20
     ret =3D 0;
@@ -499,7 +499,7 @@ int cpupool_do_sysctl(struct xen_sysctl_
         if ( cpu >=3D nr_cpu_ids )
             goto addcpu_out;
         ret =3D -EBUSY;
-        if ( !cpu_isset(cpu, cpupool_free_cpus) )
+        if ( !cpumask_test_cpu(cpu, &cpupool_free_cpus) )
             goto addcpu_out;
         c =3D cpupool_find_by_id(op->cpupool_id);
         ret =3D -ENOENT;
--- a/xen/common/kexec.c
+++ b/xen/common/kexec.c
@@ -169,7 +169,7 @@ void kexec_crash_save_cpu(void)
     ELF_Prstatus *prstatus;
     crash_xen_core_t *xencore;
=20
-    if ( cpu_test_and_set(cpu, crash_saved_cpus) )
+    if ( cpumask_test_and_set_cpu(cpu, &crash_saved_cpus) )
         return;
=20
     prstatus =3D (ELF_Prstatus *)ELFNOTE_DESC(note);
@@ -187,7 +187,7 @@ crash_xen_info_t *kexec_crash_save_info(
     crash_xen_info_t info;
     crash_xen_info_t *out =3D (crash_xen_info_t *)ELFNOTE_DESC(xen_crash_n=
ote);
=20
-    BUG_ON(!cpu_test_and_set(cpu, crash_saved_cpus));
+    BUG_ON(!cpumask_test_and_set_cpu(cpu, &crash_saved_cpus));
=20
     memset(&info, 0, sizeof(info));
     info.xen_major_version =3D xen_major_version();
--- a/xen/common/sched_credit2.c
+++ b/xen/common/sched_credit2.c
@@ -1366,7 +1366,7 @@ csched_vcpu_migrate(
     struct csched_runqueue_data *trqd;
=20
     /* Check if new_cpu is valid */
-    BUG_ON(!cpu_isset(new_cpu, CSCHED_PRIV(ops)->initialized));
+    BUG_ON(!cpumask_test_cpu(new_cpu, &CSCHED_PRIV(ops)->initialized));
=20
     trqd =3D RQD(ops, new_cpu);
=20
@@ -1602,10 +1602,10 @@ csched_schedule(
              scurr->vcpu->vcpu_id,
              now);
=20
-    BUG_ON(!cpu_isset(cpu, CSCHED_PRIV(ops)->initialized));
+    BUG_ON(!cpumask_test_cpu(cpu, &CSCHED_PRIV(ops)->initialized));
=20
     rqd =3D RQD(ops, cpu);
-    BUG_ON(!cpu_isset(cpu, rqd->active));
+    BUG_ON(!cpumask_test_cpu(cpu, &rqd->active));
=20
     /* Protected by runqueue lock */       =20
=20
@@ -1637,7 +1637,7 @@ csched_schedule(
     BUG_ON(!is_idle_vcpu(scurr->vcpu) && scurr->rqd !=3D rqd);
=20
     /* Clear "tickled" bit now that we've been scheduled */
-    if ( cpu_isset(cpu, rqd->tickled) )
+    if ( cpumask_test_cpu(cpu, &rqd->tickled) )
         cpu_clear(cpu, rqd->tickled);
=20
     /* Update credits */
@@ -1708,7 +1708,7 @@ csched_schedule(
         }
=20
         /* Clear the idle mask if necessary */
-        if ( cpu_isset(cpu, rqd->idle) )
+        if ( cpumask_test_cpu(cpu, &rqd->idle) )
             cpu_clear(cpu, rqd->idle);
=20
         snext->start_time =3D now;
@@ -1724,7 +1724,7 @@ csched_schedule(
     else
     {
         /* Update the idle mask if necessary */
-        if ( !cpu_isset(cpu, rqd->idle) )
+        if ( !cpumask_test_cpu(cpu, &rqd->idle) )
             cpu_set(cpu, rqd->idle);
         /* Make sure avgload gets updated periodically even
          * if there's no activity */
@@ -1885,7 +1885,7 @@ static void init_pcpu(const struct sched
=20
     spin_lock_irqsave(&prv->lock, flags);
=20
-    if ( cpu_isset(cpu, prv->initialized) )
+    if ( cpumask_test_cpu(cpu, &prv->initialized) )
     {
         printk("%s: Strange, cpu %d already initialized!\n", __func__, =
cpu);
         spin_unlock_irqrestore(&prv->lock, flags);
@@ -1912,7 +1912,7 @@ static void init_pcpu(const struct sched
     rqd=3Dprv->rqd + rqi;
=20
     printk("Adding cpu %d to runqueue %d\n", cpu, rqi);
-    if ( ! cpu_isset(rqi, prv->active_queues) )
+    if ( ! cpumask_test_cpu(rqi, &prv->active_queues) )
     {
         printk(" First cpu on runqueue, activating\n");
         activate_runqueue(prv, rqi);
@@ -1963,7 +1963,7 @@ csched_free_pdata(const struct scheduler
=20
     spin_lock_irqsave(&prv->lock, flags);
=20
-    BUG_ON( !cpu_isset(cpu, prv->initialized));
+    BUG_ON(!cpumask_test_cpu(cpu, &prv->initialized));
    =20
     /* Find the old runqueue and remove this cpu from it */
     rqi =3D prv->runq_map[cpu];
@@ -1973,7 +1973,7 @@ csched_free_pdata(const struct scheduler
     /* No need to save IRQs here, they're already disabled */
     spin_lock(&rqd->lock);
=20
-    BUG_ON(!cpu_isset(cpu, rqd->idle));
+    BUG_ON(!cpumask_test_cpu(cpu, &rqd->idle));
=20
     printk("Removing cpu %d from runqueue %d\n", cpu, rqi);
=20
--- a/xen/common/sched_sedf.c
+++ b/xen/common/sched_sedf.c
@@ -820,7 +820,7 @@ static struct task_slice sedf_do_schedul
     /* Tasklet work (which runs in idle VCPU context) overrides all else. =
*/
     if ( tasklet_work_scheduled ||
          (list_empty(runq) && list_empty(waitq)) ||
-         unlikely(!cpu_isset(cpu, *SEDF_CPUONLINE(per_cpu(cpupool, =
cpu)))) )
+         unlikely(!cpumask_test_cpu(cpu, SEDF_CPUONLINE(per_cpu(cpupool, =
cpu)))) )
     {
         ret.task =3D IDLETASK(cpu);
         ret.time =3D SECONDS(1);
--- a/xen/common/trace.c
+++ b/xen/common/trace.c
@@ -323,7 +323,7 @@ int trace_will_trace_event(u32 event)
                 & ((event >> TRC_SUBCLS_SHIFT) & 0xf )) =3D=3D 0 )
         return 0;
=20
-    if ( !cpu_isset(smp_processor_id(), tb_cpu_mask) )
+    if ( !cpumask_test_cpu(smp_processor_id(), &tb_cpu_mask) )
         return 0;
=20
     return 1;
@@ -711,7 +711,7 @@ void __trace_var(u32 event, bool_t cycle
                 & ((event >> TRC_SUBCLS_SHIFT) & 0xf )) =3D=3D 0 )
         return;
=20
-    if ( !cpu_isset(smp_processor_id(), tb_cpu_mask) )
+    if ( !cpumask_test_cpu(smp_processor_id(), &tb_cpu_mask) )
         return;
=20
     /* Read tb_init_done /before/ t_bufs. */
--- a/xen/include/xen/cpumask.h
+++ b/xen/include/xen/cpumask.h
@@ -19,6 +19,7 @@
  * void cpumask_clear(mask)		clear all bits
  * int cpumask_test_cpu(cpu, mask)	true iff bit 'cpu' set in mask
  * int cpumask_test_and_set_cpu(cpu, mask) test and set bit 'cpu' in mask
+ * int cpumask_test_and_clear_cpu(cpu, mask) test and clear bit 'cpu' in =
mask
  *
  * void cpumask_and(dst, src1, src2)	dst =3D src1 & src2  [intersection]=

  * void cpumask_or(dst, src1, src2)	dst =3D src1 | src2  [union]
@@ -64,12 +65,12 @@
  * for_each_present_cpu(cpu)		for-loop cpu over cpu_present_map
  *
  * Subtlety:
- * 1) The 'type-checked' form of cpu_isset() causes gcc (3.3.2, anyway)
+ * 1) The 'type-checked' form of cpumask_test_cpu() causes gcc (3.3.2, =
anyway)
  *    to generate slightly worse code.  Note for example the additional
  *    40 lines of assembly code compiling the "for each possible cpu"
  *    loops buried in the disk_stat_read() macros calls when compiling
  *    drivers/block/genhd.c (arch i386, CONFIG_SMP=3Dy).  So use a simple
- *    one-line #define for cpu_isset(), instead of wrapping an inline
+ *    one-line #define for cpumask_test_cpu(), instead of wrapping an =
inline
  *    inside a macro, the way we do the other calls.
  */
=20
@@ -121,17 +122,12 @@ static inline void cpumask_clear(cpumask
 /* No static inline type checking - see Subtlety (1) above. */
 #define cpumask_test_cpu(cpu, cpumask) \
 	test_bit(cpumask_check(cpu), (cpumask)->bits)
-#define cpu_isset(cpu, cpumask) test_bit((cpu), (cpumask).bits)
=20
-#define cpu_test_and_set(cpu, cpumask) \
-	cpumask_test_and_set_cpu(cpu, &(cpumask))
 static inline int cpumask_test_and_set_cpu(int cpu, cpumask_t *addr)
 {
 	return test_and_set_bit(cpumask_check(cpu), addr->bits);
 }
=20
-#define cpu_test_and_clear(cpu, cpumask) \
-	cpumask_test_and_clear_cpu(cpu, &(cpumask))
 static inline int cpumask_test_and_clear_cpu(int cpu, cpumask_t *addr)
 {
 	return test_and_clear_bit(cpumask_check(cpu), addr->bits);
@@ -444,9 +440,9 @@ extern cpumask_t cpu_present_map;
 #define num_online_cpus()	cpumask_weight(&cpu_online_map)
 #define num_possible_cpus()	cpumask_weight(&cpu_possible_map)
 #define num_present_cpus()	cpumask_weight(&cpu_present_map)
-#define cpu_online(cpu)		cpu_isset((cpu), cpu_online_map)
-#define cpu_possible(cpu)	cpu_isset((cpu), cpu_possible_map)
-#define cpu_present(cpu)	cpu_isset((cpu), cpu_present_map)
+#define cpu_online(cpu)		cpumask_test_cpu(cpu, &cpu_online_m=
ap)
+#define cpu_possible(cpu)	cpumask_test_cpu(cpu, &cpu_possible_map)
+#define cpu_present(cpu)	cpumask_test_cpu(cpu, &cpu_present_map)
 #else
 #define num_online_cpus()	1
 #define num_possible_cpus()	1



--=__Part436CB779.0__=
Content-Type: text/plain; name="eliminate-cpu_test_xyz.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="eliminate-cpu_test_xyz.patch"

eliminate cpu_test_xyz()=0A=0ASigned-off-by: Jan Beulich <jbeulich@suse.com=
>=0A=0A--- a/xen/arch/ia64/linux-xen/smp.c=0A+++ b/xen/arch/ia64/linux-xen/=
smp.c=0A@@ -68,7 +68,7 @@ void smp_send_event_check_mask(const cpu=0A     =
//printf("smp_send_event_check_mask called\n");=0A =0A     for (cpu =3D 0; =
cpu < NR_CPUS; ++cpu)=0A-        if (cpu_isset(cpu, *mask) && cpu !=3D =
smp_processor_id())=0A+        if (cpumask_test_cpu(cpu, mask) && cpu !=3D =
smp_processor_id())=0A 	    platform_send_ipi(cpu, IA64_IPI_RESCHEDULE, =
IA64_IPI_DM_INT, 0);=0A }=0A #endif=0A--- a/xen/arch/ia64/linux-xen/smpboot=
.c=0A+++ b/xen/arch/ia64/linux-xen/smpboot.c=0A@@ -548,13 +548,13 @@ =
do_rest:=0A 	 */=0A 	Dprintk("Waiting on callin_map ...");=0A 	=
for (timeout =3D 0; timeout < 100000; timeout++) {=0A-		if =
(cpu_isset(cpu, cpu_callin_map))=0A+		if (cpumask_test_cpu(cpu, =
&cpu_callin_map))=0A 			break;  /* It has booted */=0A 		=
udelay(100);=0A 	}=0A 	Dprintk("\n");=0A =0A-	if (!cpu_isset(cpu,=
 cpu_callin_map)) {=0A+	if (!cpumask_test_cpu(cpu, &cpu_callin_map)) {=0A 	=
	printk(KERN_ERR "Processor 0x%x/0x%x is stuck.\n", cpu, =
sapicid);=0A 		ia64_cpu_to_sapicid[cpu] =3D -1;=0A 		=
cpu_clear(cpu, cpu_online_map);  /* was set in smp_callin() */=0A@@ -818,7 =
+818,7 @@ __cpu_up (unsigned int cpu)=0A 	 * Already booted cpu? not =
valid anymore since we dont=0A 	 * do idle loop tightspin anymore.=0A 	 =
*/=0A-	if (cpu_isset(cpu, cpu_callin_map))=0A+	if (cpumask_test_cpu(cpu, =
&cpu_callin_map))=0A 		return -EINVAL;=0A =0A 	if (!per_cpu(cpu_si=
bling_mask, cpu) &&=0A--- a/xen/arch/ia64/xen/domain.c=0A+++ b/xen/arch/ia6=
4/xen/domain.c=0A@@ -140,7 +140,7 @@ static void flush_cache_for_context_sw=
it=0A =0A 	if (is_idle_vcpu(next) ||=0A 	    __test_and_clear_bit(cp=
u, &next->arch.cache_coherent_map)) {=0A-		if (cpu_test_and_cl=
ear(cpu, cpu_cache_coherent_map)) {=0A+		if (cpumask_test_and_clear_=
cpu(cpu, &cpu_cache_coherent_map)) {=0A 			unsigned =
long flags;=0A 			u64 progress =3D 0;=0A 			=
s64 status;=0A--- a/xen/arch/ia64/xen/regionreg.c=0A+++ b/xen/arch/ia64/xen=
/regionreg.c=0A@@ -320,8 +320,8 @@ int set_one_rr_efi(unsigned long rr, =
uns=0A 	else {=0A 		if (current && VMX_DOMAIN(current))=0A 		=
	vpd =3D __get_cpu_var(inserted_vpd);=0A-		ia64_new_rr=
7_efi(val, cpu_isset(smp_processor_id(),=0A-				 =
percpu_set), vpd);=0A+		ia64_new_rr7_efi(val, cpumask_test_cpu(smp_=
processor_id(),=0A+						       =
&percpu_set), vpd);=0A 	}=0A =0A 	return 1;=0A@@ -342,8 +342,8 @@ =
set_one_rr_efi_restore(unsigned long rr,=0A 		   and strcut =
domain are initialized. */=0A 		if (unlikely(current =3D=3D NULL =
|| current->domain =3D=3D NULL ||=0A 			     is_idle_vcpu(c=
urrent)))=0A-			ia64_new_rr7_efi(val, cpu_isset(smp_process=
or_id(),=0A-							percpu_set)=
,=0A+			ia64_new_rr7_efi(val, cpumask_test_cpu(smp_processo=
r_id(),=0A+							       =
&percpu_set),=0A 					 0UL);=0A 		=
else if (VMX_DOMAIN(current))=0A 			__vmx_switch_rr7_vc=
pu(current, val);=0A--- a/xen/arch/ia64/xen/vhpt.c=0A+++ b/xen/arch/ia64/xe=
n/vhpt.c=0A@@ -553,7 +553,7 @@ void flush_tlb_mask(const cpumask_t *mas=0A =
    int cpu;=0A =0A     cpu =3D smp_processor_id();=0A-    if (cpu_isset(cp=
u, *mask))=0A+    if (cpumask_test_cpu(cpu, mask))=0A         flush_tlb_vhp=
t_all (NULL);=0A =0A     if (cpumask_subset(mask, cpumask_of(cpu)))=0A--- =
a/xen/arch/x86/cpu/common.c=0A+++ b/xen/arch/x86/cpu/common.c=0A@@ -624,7 =
+624,7 @@ void __cpuinit cpu_init(void)=0A 		.limit =3D =
LAST_RESERVED_GDT_BYTE=0A 	};=0A =0A-	if (cpu_test_and_set(cpu, =
cpu_initialized)) {=0A+	if (cpumask_test_and_set_cpu(cpu, &cpu_initialized)=
) {=0A 		printk(KERN_WARNING "CPU#%d already initialized!\n", =
cpu);=0A 		for (;;) local_irq_enable();=0A 	}=0A--- =
a/xen/arch/x86/smp.c=0A+++ b/xen/arch/x86/smp.c=0A@@ -234,7 +234,7 @@ void =
flush_area_mask(const cpumask_t *ma=0A {=0A     ASSERT(local_irq_is_enabled=
());=0A =0A-    if ( cpu_isset(smp_processor_id(), *mask) )=0A+    if ( =
cpumask_test_cpu(smp_processor_id(), mask) )=0A         flush_area_local(va=
, flags);=0A =0A     if ( !cpumask_subset(mask, cpumask_of(smp_processor_id=
())) )=0A--- a/xen/arch/x86/smpboot.c=0A+++ b/xen/arch/x86/smpboot.c=0A@@ =
-138,7 +138,7 @@ static void synchronize_tsc_master(unsig=0A         =
return;=0A =0A     if ( boot_cpu_has(X86_FEATURE_TSC_RELIABLE) &&=0A-      =
   !cpu_isset(slave, tsc_sync_cpu_mask) )=0A+         !cpumask_test_cpu(sla=
ve, &tsc_sync_cpu_mask) )=0A         return;=0A =0A     for ( i =3D 1; i =
<=3D 5; i++ )=0A@@ -162,7 +162,7 @@ static void synchronize_tsc_slave(unsig=
n=0A         return;=0A =0A     if ( boot_cpu_has(X86_FEATURE_TSC_RELIABLE)=
 &&=0A-         !cpu_isset(slave, tsc_sync_cpu_mask) )=0A+         =
!cpumask_test_cpu(slave, &tsc_sync_cpu_mask) )=0A         return;=0A =0A   =
  for ( i =3D 1; i <=3D 5; i++ )=0A@@ -956,7 +956,7 @@ int __cpu_up(unsigne=
d int cpu)=0A         return ret;=0A =0A     set_cpu_state(CPU_STATE_ONLINE=
);=0A-    while ( !cpu_isset(cpu, cpu_online_map) )=0A+    while ( =
!cpu_online(cpu) )=0A     {=0A         cpu_relax();=0A         process_pend=
ing_softirqs();=0A--- a/xen/arch/x86/time.c=0A+++ b/xen/arch/x86/time.c=0A@=
@ -1580,7 +1580,7 @@ void pit_broadcast_exit(void)=0A {=0A     int cpu =3D =
smp_processor_id();=0A =0A-    if ( cpu_test_and_clear(cpu, pit_broadcast_m=
ask) )=0A+    if ( cpumask_test_and_clear_cpu(cpu, &pit_broadcast_mask) =
)=0A         reprogram_timer(this_cpu(timer_deadline));=0A }=0A =0A--- =
a/xen/common/cpupool.c=0A+++ b/xen/common/cpupool.c=0A@@ -299,7 +299,7 @@ =
int cpupool_unassign_cpu(struct cpupool =0A     ret =3D -EBUSY;=0A     if =
( (cpupool_moving_cpu !=3D -1) && (cpu !=3D cpupool_moving_cpu) )=0A       =
  goto out;=0A-    if ( cpu_isset(cpu, cpupool_locked_cpus) )=0A+    if ( =
cpumask_test_cpu(cpu, &cpupool_locked_cpus) )=0A         goto out;=0A =0A  =
   ret =3D 0;=0A@@ -499,7 +499,7 @@ int cpupool_do_sysctl(struct xen_sysctl=
_=0A         if ( cpu >=3D nr_cpu_ids )=0A             goto addcpu_out;=0A =
        ret =3D -EBUSY;=0A-        if ( !cpu_isset(cpu, cpupool_free_cpus) =
)=0A+        if ( !cpumask_test_cpu(cpu, &cpupool_free_cpus) )=0A          =
   goto addcpu_out;=0A         c =3D cpupool_find_by_id(op->cpupool_id);=0A=
         ret =3D -ENOENT;=0A--- a/xen/common/kexec.c=0A+++ b/xen/common/kex=
ec.c=0A@@ -169,7 +169,7 @@ void kexec_crash_save_cpu(void)=0A     =
ELF_Prstatus *prstatus;=0A     crash_xen_core_t *xencore;=0A =0A-    if ( =
cpu_test_and_set(cpu, crash_saved_cpus) )=0A+    if ( cpumask_test_and_set_=
cpu(cpu, &crash_saved_cpus) )=0A         return;=0A =0A     prstatus =3D =
(ELF_Prstatus *)ELFNOTE_DESC(note);=0A@@ -187,7 +187,7 @@ crash_xen_info_t =
*kexec_crash_save_info(=0A     crash_xen_info_t info;=0A     crash_xen_info=
_t *out =3D (crash_xen_info_t *)ELFNOTE_DESC(xen_crash_note);=0A =0A-    =
BUG_ON(!cpu_test_and_set(cpu, crash_saved_cpus));=0A+    BUG_ON(!cpumask_te=
st_and_set_cpu(cpu, &crash_saved_cpus));=0A =0A     memset(&info, 0, =
sizeof(info));=0A     info.xen_major_version =3D xen_major_version();=0A---=
 a/xen/common/sched_credit2.c=0A+++ b/xen/common/sched_credit2.c=0A@@ =
-1366,7 +1366,7 @@ csched_vcpu_migrate(=0A     struct csched_runqueue_data =
*trqd;=0A =0A     /* Check if new_cpu is valid */=0A-    BUG_ON(!cpu_isset(=
new_cpu, CSCHED_PRIV(ops)->initialized));=0A+    BUG_ON(!cpumask_test_cpu(n=
ew_cpu, &CSCHED_PRIV(ops)->initialized));=0A =0A     trqd =3D RQD(ops, =
new_cpu);=0A =0A@@ -1602,10 +1602,10 @@ csched_schedule(=0A              =
scurr->vcpu->vcpu_id,=0A              now);=0A =0A-    BUG_ON(!cpu_isset(cp=
u, CSCHED_PRIV(ops)->initialized));=0A+    BUG_ON(!cpumask_test_cpu(cpu, =
&CSCHED_PRIV(ops)->initialized));=0A =0A     rqd =3D RQD(ops, cpu);=0A-    =
BUG_ON(!cpu_isset(cpu, rqd->active));=0A+    BUG_ON(!cpumask_test_cpu(cpu, =
&rqd->active));=0A =0A     /* Protected by runqueue lock */        =0A =
=0A@@ -1637,7 +1637,7 @@ csched_schedule(=0A     BUG_ON(!is_idle_vcpu(scurr=
->vcpu) && scurr->rqd !=3D rqd);=0A =0A     /* Clear "tickled" bit now =
that we've been scheduled */=0A-    if ( cpu_isset(cpu, rqd->tickled) =
)=0A+    if ( cpumask_test_cpu(cpu, &rqd->tickled) )=0A         cpu_clear(c=
pu, rqd->tickled);=0A =0A     /* Update credits */=0A@@ -1708,7 +1708,7 @@ =
csched_schedule(=0A         }=0A =0A         /* Clear the idle mask if =
necessary */=0A-        if ( cpu_isset(cpu, rqd->idle) )=0A+        if ( =
cpumask_test_cpu(cpu, &rqd->idle) )=0A             cpu_clear(cpu, =
rqd->idle);=0A =0A         snext->start_time =3D now;=0A@@ -1724,7 +1724,7 =
@@ csched_schedule(=0A     else=0A     {=0A         /* Update the idle =
mask if necessary */=0A-        if ( !cpu_isset(cpu, rqd->idle) )=0A+      =
  if ( !cpumask_test_cpu(cpu, &rqd->idle) )=0A             cpu_set(cpu, =
rqd->idle);=0A         /* Make sure avgload gets updated periodically =
even=0A          * if there's no activity */=0A@@ -1885,7 +1885,7 @@ =
static void init_pcpu(const struct sched=0A =0A     spin_lock_irqsave(&prv-=
>lock, flags);=0A =0A-    if ( cpu_isset(cpu, prv->initialized) )=0A+    =
if ( cpumask_test_cpu(cpu, &prv->initialized) )=0A     {=0A         =
printk("%s: Strange, cpu %d already initialized!\n", __func__, cpu);=0A    =
     spin_unlock_irqrestore(&prv->lock, flags);=0A@@ -1912,7 +1912,7 @@ =
static void init_pcpu(const struct sched=0A     rqd=3Dprv->rqd + rqi;=0A =
=0A     printk("Adding cpu %d to runqueue %d\n", cpu, rqi);=0A-    if ( ! =
cpu_isset(rqi, prv->active_queues) )=0A+    if ( ! cpumask_test_cpu(rqi, =
&prv->active_queues) )=0A     {=0A         printk(" First cpu on runqueue, =
activating\n");=0A         activate_runqueue(prv, rqi);=0A@@ -1963,7 =
+1963,7 @@ csched_free_pdata(const struct scheduler=0A =0A     spin_lock_ir=
qsave(&prv->lock, flags);=0A =0A-    BUG_ON( !cpu_isset(cpu, prv->initializ=
ed));=0A+    BUG_ON(!cpumask_test_cpu(cpu, &prv->initialized));=0A     =0A =
    /* Find the old runqueue and remove this cpu from it */=0A     rqi =3D =
prv->runq_map[cpu];=0A@@ -1973,7 +1973,7 @@ csched_free_pdata(const struct =
scheduler=0A     /* No need to save IRQs here, they're already disabled =
*/=0A     spin_lock(&rqd->lock);=0A =0A-    BUG_ON(!cpu_isset(cpu, =
rqd->idle));=0A+    BUG_ON(!cpumask_test_cpu(cpu, &rqd->idle));=0A =0A     =
printk("Removing cpu %d from runqueue %d\n", cpu, rqi);=0A =0A--- =
a/xen/common/sched_sedf.c=0A+++ b/xen/common/sched_sedf.c=0A@@ -820,7 =
+820,7 @@ static struct task_slice sedf_do_schedul=0A     /* Tasklet work =
(which runs in idle VCPU context) overrides all else. */=0A     if ( =
tasklet_work_scheduled ||=0A          (list_empty(runq) && list_empty(waitq=
)) ||=0A-         unlikely(!cpu_isset(cpu, *SEDF_CPUONLINE(per_cpu(cpupool,=
 cpu)))) )=0A+         unlikely(!cpumask_test_cpu(cpu, SEDF_CPUONLINE(per_c=
pu(cpupool, cpu)))) )=0A     {=0A         ret.task =3D IDLETASK(cpu);=0A   =
      ret.time =3D SECONDS(1);=0A--- a/xen/common/trace.c=0A+++ b/xen/commo=
n/trace.c=0A@@ -323,7 +323,7 @@ int trace_will_trace_event(u32 event)=0A   =
              & ((event >> TRC_SUBCLS_SHIFT) & 0xf )) =3D=3D 0 )=0A        =
 return 0;=0A =0A-    if ( !cpu_isset(smp_processor_id(), tb_cpu_mask) =
)=0A+    if ( !cpumask_test_cpu(smp_processor_id(), &tb_cpu_mask) )=0A     =
    return 0;=0A =0A     return 1;=0A@@ -711,7 +711,7 @@ void __trace_var(u=
32 event, bool_t cycle=0A                 & ((event >> TRC_SUBCLS_SHIFT) & =
0xf )) =3D=3D 0 )=0A         return;=0A =0A-    if ( !cpu_isset(smp_process=
or_id(), tb_cpu_mask) )=0A+    if ( !cpumask_test_cpu(smp_processor_id(), =
&tb_cpu_mask) )=0A         return;=0A =0A     /* Read tb_init_done =
/before/ t_bufs. */=0A--- a/xen/include/xen/cpumask.h=0A+++ b/xen/include/x=
en/cpumask.h=0A@@ -19,6 +19,7 @@=0A  * void cpumask_clear(mask)		=
clear all bits=0A  * int cpumask_test_cpu(cpu, mask)	true iff bit 'cpu' =
set in mask=0A  * int cpumask_test_and_set_cpu(cpu, mask) test and set bit =
'cpu' in mask=0A+ * int cpumask_test_and_clear_cpu(cpu, mask) test and =
clear bit 'cpu' in mask=0A  *=0A  * void cpumask_and(dst, src1, src2)	=
dst =3D src1 & src2  [intersection]=0A  * void cpumask_or(dst, src1, src2)	=
dst =3D src1 | src2  [union]=0A@@ -64,12 +65,12 @@=0A  * for_each_present_c=
pu(cpu)		for-loop cpu over cpu_present_map=0A  *=0A  * Subtlety:=0A-=
 * 1) The 'type-checked' form of cpu_isset() causes gcc (3.3.2, anyway)=0A+=
 * 1) The 'type-checked' form of cpumask_test_cpu() causes gcc (3.3.2, =
anyway)=0A  *    to generate slightly worse code.  Note for example the =
additional=0A  *    40 lines of assembly code compiling the "for each =
possible cpu"=0A  *    loops buried in the disk_stat_read() macros calls =
when compiling=0A  *    drivers/block/genhd.c (arch i386, CONFIG_SMP=3Dy). =
 So use a simple=0A- *    one-line #define for cpu_isset(), instead of =
wrapping an inline=0A+ *    one-line #define for cpumask_test_cpu(), =
instead of wrapping an inline=0A  *    inside a macro, the way we do the =
other calls.=0A  */=0A =0A@@ -121,17 +122,12 @@ static inline void =
cpumask_clear(cpumask=0A /* No static inline type checking - see Subtlety =
(1) above. */=0A #define cpumask_test_cpu(cpu, cpumask) \=0A 	test_bit(cp=
umask_check(cpu), (cpumask)->bits)=0A-#define cpu_isset(cpu, cpumask) =
test_bit((cpu), (cpumask).bits)=0A =0A-#define cpu_test_and_set(cpu, =
cpumask) \=0A-	cpumask_test_and_set_cpu(cpu, &(cpumask))=0A static inline =
int cpumask_test_and_set_cpu(int cpu, cpumask_t *addr)=0A {=0A 	return =
test_and_set_bit(cpumask_check(cpu), addr->bits);=0A }=0A =0A-#define =
cpu_test_and_clear(cpu, cpumask) \=0A-	cpumask_test_and_clear_cpu(cpu, =
&(cpumask))=0A static inline int cpumask_test_and_clear_cpu(int cpu, =
cpumask_t *addr)=0A {=0A 	return test_and_clear_bit(cpumask_check(cpu=
), addr->bits);=0A@@ -444,9 +440,9 @@ extern cpumask_t cpu_present_map;=0A =
#define num_online_cpus()	cpumask_weight(&cpu_online_map)=0A #define =
num_possible_cpus()	cpumask_weight(&cpu_possible_map)=0A #define =
num_present_cpus()	cpumask_weight(&cpu_present_map)=0A-#define =
cpu_online(cpu)		cpu_isset((cpu), cpu_online_map)=0A-#define =
cpu_possible(cpu)	cpu_isset((cpu), cpu_possible_map)=0A-#define =
cpu_present(cpu)	cpu_isset((cpu), cpu_present_map)=0A+#define =
cpu_online(cpu)		cpumask_test_cpu(cpu, &cpu_online_map)=0A+#define =
cpu_possible(cpu)	cpumask_test_cpu(cpu, &cpu_possible_map)=0A+#define=
 cpu_present(cpu)	cpumask_test_cpu(cpu, &cpu_present_map)=0A =
#else=0A #define num_online_cpus()	1=0A #define num_possible_cpus()	=
1=0A
--=__Part436CB779.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part436CB779.0__=--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 02:06:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 02:06:45 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNM6H-0006EM-0h; Mon, 07 Nov 2011 02:06:45 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNLxP-000524-Qb
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 01:57:39 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1320659735!43310340!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27155 invoked from network); 7 Nov 2011 09:55:35 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-14.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Nov 2011 09:55:35 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 07 Nov 2011 09:57:32 +0000
Message-Id: <4EB7B997020000780005F4AC@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 07 Nov 2011 09:57:27 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__PartAD825997.0__="
Subject: [Xen-devel] [PATCH 3/6] eliminate cpu_set()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__PartAD825997.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/ia64/linux-xen/acpi.c
+++ b/xen/arch/ia64/linux-xen/acpi.c
@@ -557,7 +557,7 @@ acpi_numa_processor_affinity_init(struct
 	    (pa->apic_id << 8) | (pa->local_sapic_eid);
 	/* nid should be overridden as logical node id later */
 	node_cpuid[srat_num_cpus].nid =3D pxm;
-	cpu_set(srat_num_cpus, early_cpu_possible_map);
+	cpumask_set_cpu(srat_num_cpus, &early_cpu_possible_map);
 	srat_num_cpus++;
 }
=20
@@ -917,7 +917,7 @@ __init void prefill_possible_map(void)
 		possible, max((possible - available_cpus), 0));
=20
 	for (i =3D 0; i < possible; i++)
-		cpu_set(i, cpu_possible_map);
+		cpumask_set_cpu(i, &cpu_possible_map);
 }
=20
 #ifndef XEN
--- a/xen/arch/ia64/linux-xen/setup.c
+++ b/xen/arch/ia64/linux-xen/setup.c
@@ -463,7 +463,7 @@ mark_bsp_online (void)
 {
 #ifdef CONFIG_SMP
 	/* If we register an early console, allow CPU 0 to printk */
-	cpu_set(smp_processor_id(), cpu_online_map);
+	set_cpu_online(smp_processor_id(), 1);
 #endif
 }
=20
--- a/xen/arch/ia64/linux-xen/smpboot.c
+++ b/xen/arch/ia64/linux-xen/smpboot.c
@@ -392,7 +392,7 @@ smp_callin (void)
 #else
 	lock_ipi_calllock();
 #endif
-	cpu_set(cpuid, cpu_online_map);
+	set_cpu_online(cpuid, 1);
 #ifdef XEN
 	unlock_ipi_calllock(flags);
 #else
@@ -437,7 +437,7 @@ smp_callin (void)
 	/*
 	 * Allow the master to continue.
 	 */
-	cpu_set(cpuid, cpu_callin_map);
+	cpumask_set_cpu(cpuid, &cpu_callin_map);
 	Dprintk("Stack on CPU %d at about %p\n",cpuid, &cpuid);
 }
=20
@@ -625,8 +625,8 @@ smp_prepare_cpus (unsigned int max_cpus)
 	/*
 	 * We have the boot CPU online for sure.
 	 */
-	cpu_set(0, cpu_online_map);
-	cpu_set(0, cpu_callin_map);
+	set_cpu_online(0, 1);
+	cpumask_set_cpu(0, &cpu_callin_map);
=20
 	local_cpu_data->loops_per_jiffy =3D loops_per_jiffy;
 	ia64_cpu_to_sapicid[0] =3D boot_cpu_id;
@@ -652,8 +652,8 @@ smp_prepare_cpus (unsigned int max_cpus)
=20
 void __devinit smp_prepare_boot_cpu(void)
 {
-	cpu_set(smp_processor_id(), cpu_online_map);
-	cpu_set(smp_processor_id(), cpu_callin_map);
+	set_cpu_online(smp_processor_id(), 1);
+	cpumask_set_cpu(smp_processor_id(), &cpu_callin_map);
 	per_cpu(cpu_state, smp_processor_id()) =3D CPU_ONLINE;
 }
=20
--- a/xen/arch/ia64/linux-xen/sn/kernel/sn2_smp.c
+++ b/xen/arch/ia64/linux-xen/sn/kernel/sn2_smp.c
@@ -214,7 +214,7 @@ sn2_global_tlb_purge(unsigned long start
 	for_each_possible_cpu(cpu) {
 		cnode =3D cpu_to_node(cpu);
 		if (!node_isset(cnode, nodes_flushed)) {
-			cpu_set(cpu, selected_cpus);
+			cpumask_set_cpu(cpu, &selected_cpus);
 			i++;
 		}
 		node_set(cnode, nodes_flushed);
--- a/xen/arch/ia64/xen/mm_init.c
+++ b/xen/arch/ia64/xen/mm_init.c
@@ -38,7 +38,7 @@ ia64_mmu_init (void *my_cpu_data)
 	ia64_set_psr(psr);
 	ia64_srlz_i();
 #ifdef XEN
-	cpu_set(cpu, percpu_set);
+	cpumask_set_cpu(cpu, &percpu_set);
 #endif
=20
 	/*
--- a/xen/arch/ia64/xen/tlb_track.c
+++ b/xen/arch/ia64/xen/tlb_track.c
@@ -389,7 +389,7 @@ tlb_track_insert_or_dirty(struct tlb_tra
=20
  found:
     BUG_ON(v->processor >=3D NR_CPUS);
-    cpu_set(v->processor, entry->pcpu_dirty_mask);
+    cpumask_set_cpu(v->processor, &entry->pcpu_dirty_mask);
     BUG_ON(v->vcpu_id >=3D NR_CPUS);
     vcpu_set(v->vcpu_id, entry->vcpu_dirty_mask);
     perfc_incr(tlb_track_iod_dirtied);
--- a/xen/arch/x86/acpi/cpu_idle.c
+++ b/xen/arch/x86/acpi/cpu_idle.c
@@ -271,9 +271,9 @@ static void mwait_idle_with_hints(unsign
      */
     if ( expires > NOW() || expires =3D=3D 0 )
     {
-        cpu_set(cpu, cpuidle_mwait_flags);
+        cpumask_set_cpu(cpu, &cpuidle_mwait_flags);
         __mwait(eax, ecx);
-        cpu_clear(cpu, cpuidle_mwait_flags);
+        cpumask_clear_cpu(cpu, &cpuidle_mwait_flags);
     }
=20
     if ( expires <=3D NOW() && expires > 0 )
--- a/xen/arch/x86/cpu/mcheck/mce_intel.c
+++ b/xen/arch/x86/cpu/mcheck/mce_intel.c
@@ -828,7 +828,7 @@ static void intel_machine_check(struct c
              * (the MSRs are sticky)
              */
             if (bs.pcc || !bs.recoverable)
-                cpu_set(smp_processor_id(), mce_fatal_cpus);
+                cpumask_set_cpu(smp_processor_id(), &mce_fatal_cpus);
         } else {
             if (mctc !=3D NULL)
                 mctelem_commit(mctc);
@@ -849,7 +849,7 @@ static void intel_machine_check(struct c
=20
     mce_barrier_enter(&mce_trap_bar);
     if ( mctc !=3D NULL && mce_urgent_action(regs, mctc))
-        cpu_set(smp_processor_id(), mce_fatal_cpus);
+        cpumask_set_cpu(smp_processor_id(), &mce_fatal_cpus);
     mce_barrier_exit(&mce_trap_bar);
     /*
      * Wait until everybody has processed the trap.
--- a/xen/arch/x86/mpparse.c
+++ b/xen/arch/x86/mpparse.c
@@ -161,7 +161,7 @@ static int __devinit MP_processor_info_x
 			return cpu;
 		}
 		x86_cpu_to_apicid[cpu] =3D apicid;
-		cpu_set(cpu, cpu_present_map);
+		set_cpu_present(cpu, 1);
 	}
=20
 	if (++num_processors > 8) {
--- a/xen/arch/x86/numa.c
+++ b/xen/arch/x86/numa.c
@@ -288,7 +288,7 @@ void __init numa_initmem_init(unsigned l
=20
 __cpuinit void numa_add_cpu(int cpu)
 {
-	cpu_set(cpu, node_to_cpumask[cpu_to_node(cpu)]);
+	cpumask_set_cpu(cpu, &node_to_cpumask[cpu_to_node(cpu)]);
 }=20
=20
 void __cpuinit numa_set_node(int cpu, int node)
--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -244,7 +244,7 @@ static void set_cpu_sibling_map(int cpu)
     int i;
     struct cpuinfo_x86 *c =3D cpu_data;
=20
-    cpu_set(cpu, cpu_sibling_setup_map);
+    cpumask_set_cpu(cpu, &cpu_sibling_setup_map);
=20
     if ( c[cpu].x86_num_siblings > 1 )
     {
@@ -380,7 +380,7 @@ void start_secondary(void *unused)
      */
     lock_vector_lock();
     __setup_vector_irq(cpu);
-    cpu_set(cpu, cpu_online_map);
+    set_cpu_online(cpu, 1);
     unlock_vector_lock();
=20
     init_percpu_time();
@@ -804,8 +804,8 @@ void __init smp_prepare_cpus(unsigned in
=20
 void __init smp_prepare_boot_cpu(void)
 {
-    cpu_set(smp_processor_id(), cpu_online_map);
-    cpu_set(smp_processor_id(), cpu_present_map);
+    set_cpu_online(smp_processor_id(), 1);
+    set_cpu_present(smp_processor_id(), 1);
 }
=20
 static void
@@ -933,7 +933,7 @@ int cpu_add(uint32_t apic_id, uint32_t a
                    "break assumed cross-CPU TSC coherency.\n"
                    " ** Consider using boot parameter \"tsc=3Dskewed\" "
                    "which forces TSC emulation where appropriate.\n", =
cpu);
-        cpu_set(cpu, tsc_sync_cpu_mask);
+        cpumask_set_cpu(cpu, &tsc_sync_cpu_mask);
     }
=20
     srat_detect_node(cpu);
--- a/xen/arch/x86/time.c
+++ b/xen/arch/x86/time.c
@@ -1573,7 +1573,7 @@ __initcall(disable_pit_irq);
=20
 void pit_broadcast_enter(void)
 {
-    cpu_set(smp_processor_id(), pit_broadcast_mask);
+    cpumask_set_cpu(smp_processor_id(), &pit_broadcast_mask);
 }
=20
 void pit_broadcast_exit(void)
--- a/xen/common/cpupool.c
+++ b/xen/common/cpupool.c
@@ -253,7 +253,7 @@ static long cpupool_unassign_cpu_helper(
=20
     spin_lock(&cpupool_lock);
     ret =3D cpu_disable_scheduler(cpu);
-    cpu_set(cpu, cpupool_free_cpus);
+    cpumask_set_cpu(cpu, &cpupool_free_cpus);
     if ( !ret )
     {
         ret =3D schedule_cpu_switch(cpu, NULL);
@@ -409,8 +409,8 @@ void cpupool_rm_domain(struct domain *d)
 static void cpupool_cpu_add(unsigned int cpu)
 {
     spin_lock(&cpupool_lock);
-    cpu_clear(cpu, cpupool_locked_cpus);
-    cpu_set(cpu, cpupool_free_cpus);
+    cpumask_clear_cpu(cpu, &cpupool_locked_cpus);
+    cpumask_set_cpu(cpu, &cpupool_free_cpus);
     cpupool_assign_cpu_locked(cpupool0, cpu);
     spin_unlock(&cpupool_lock);
 }
@@ -428,7 +428,7 @@ static int cpupool_cpu_remove(unsigned i
     if ( !cpumask_test_cpu(cpu, cpupool0->cpu_valid))
         ret =3D -EBUSY;
     else
-        cpu_set(cpu, cpupool_locked_cpus);
+        cpumask_set_cpu(cpu, &cpupool_locked_cpus);
     spin_unlock(&cpupool_lock);
=20
     return ret;
--- a/xen/common/sched_credit2.c
+++ b/xen/common/sched_credit2.c
@@ -1725,7 +1725,7 @@ csched_schedule(
     {
         /* Update the idle mask if necessary */
         if ( !cpumask_test_cpu(cpu, &rqd->idle) )
-            cpu_set(cpu, rqd->idle);
+            cpumask_set_cpu(cpu, &rqd->idle);
         /* Make sure avgload gets updated periodically even
          * if there's no activity */
         update_load(ops, rqd, NULL, 0, now);
@@ -1860,7 +1860,7 @@ static void activate_runqueue(struct csc
     INIT_LIST_HEAD(&rqd->runq);
     spin_lock_init(&rqd->lock);
=20
-    cpu_set(rqi, prv->active_queues);
+    cpumask_set_cpu(rqi, &prv->active_queues);
 }
=20
 static void deactivate_runqueue(struct csched_private *prv, int rqi)
@@ -1927,12 +1927,12 @@ static void init_pcpu(const struct sched
     /* Set the runqueue map */
     prv->runq_map[cpu]=3Drqi;
    =20
-    cpu_set(cpu, rqd->idle);
-    cpu_set(cpu, rqd->active);
+    cpumask_set_cpu(cpu, &rqd->idle);
+    cpumask_set_cpu(cpu, &rqd->active);
=20
     spin_unlock(old_lock);
=20
-    cpu_set(cpu, prv->initialized);
+    cpumask_set_cpu(cpu, &prv->initialized);
=20
     spin_unlock_irqrestore(&prv->lock, flags);
=20
--- a/xen/include/asm-ia64/linux-xen/asm/acpi.h
+++ b/xen/include/asm-ia64/linux-xen/asm/acpi.h
@@ -153,7 +153,7 @@ static inline void per_cpu_scan_finalize
 	high_cpu =3D min(high_cpu + reserve_cpus, NR_CPUS);
=20
 	for (cpu =3D low_cpu; cpu < high_cpu; cpu++) {
-		cpu_set(cpu, early_cpu_possible_map);
+		cpumask_set_cpu(cpu, &early_cpu_possible_map);
 		if (node_cpuid[cpu].nid =3D=3D NUMA_NO_NODE) {
 			node_cpuid[cpu].nid =3D next_nid;
 			next_nid++;
--- a/xen/include/xen/cpumask.h
+++ b/xen/include/xen/cpumask.h
@@ -97,7 +97,6 @@ static inline unsigned int cpumask_check
 	return cpu;
 }
=20
-#define cpu_set(cpu, dst) cpumask_set_cpu(cpu, &(dst))
 static inline void cpumask_set_cpu(int cpu, volatile cpumask_t *dstp)
 {
 	set_bit(cpumask_check(cpu), dstp->bits);
@@ -452,6 +451,14 @@ extern cpumask_t cpu_present_map;
 #define cpu_present(cpu)	((cpu) =3D=3D 0)
 #endif
=20
+#define set_cpu_online(cpu, online) \
+    ((online) ? cpumask_set_cpu(cpu, &cpu_online_map) \
+              : cpumask_clear_cpu(cpu, &cpu_online_map))
+
+#define set_cpu_present(cpu, present) \
+    ((present) ? cpumask_set_cpu(cpu, &cpu_present_map) \
+               : cpumask_clear_cpu(cpu, &cpu_present_map))
+
 #define any_online_cpu(mask)			\
 ({						\
 	int cpu;				\



--=__PartAD825997.0__=
Content-Type: text/plain; name="eliminate-cpu_set.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="eliminate-cpu_set.patch"

eliminate cpu_set()=0A=0ASigned-off-by: Jan Beulich <jbeulich@suse.com>=0A=
=0A--- a/xen/arch/ia64/linux-xen/acpi.c=0A+++ b/xen/arch/ia64/linux-xen/acp=
i.c=0A@@ -557,7 +557,7 @@ acpi_numa_processor_affinity_init(struct=0A 	   =
 (pa->apic_id << 8) | (pa->local_sapic_eid);=0A 	/* nid should be =
overridden as logical node id later */=0A 	node_cpuid[srat_num_cpus].n=
id =3D pxm;=0A-	cpu_set(srat_num_cpus, early_cpu_possible_map);=0A+	=
cpumask_set_cpu(srat_num_cpus, &early_cpu_possible_map);=0A 	srat_num_cp=
us++;=0A }=0A =0A@@ -917,7 +917,7 @@ __init void prefill_possible_map(void)=
=0A 		possible, max((possible - available_cpus), 0));=0A =0A 	=
for (i =3D 0; i < possible; i++)=0A-		cpu_set(i, cpu_possible_map=
);=0A+		cpumask_set_cpu(i, &cpu_possible_map);=0A }=0A =0A #ifndef =
XEN=0A--- a/xen/arch/ia64/linux-xen/setup.c=0A+++ b/xen/arch/ia64/linux-xen=
/setup.c=0A@@ -463,7 +463,7 @@ mark_bsp_online (void)=0A {=0A #ifdef =
CONFIG_SMP=0A 	/* If we register an early console, allow CPU 0 to printk =
*/=0A-	cpu_set(smp_processor_id(), cpu_online_map);=0A+	set_cpu_onl=
ine(smp_processor_id(), 1);=0A #endif=0A }=0A =0A--- a/xen/arch/ia64/linux-=
xen/smpboot.c=0A+++ b/xen/arch/ia64/linux-xen/smpboot.c=0A@@ -392,7 +392,7 =
@@ smp_callin (void)=0A #else=0A 	lock_ipi_calllock();=0A #endif=0A-	=
cpu_set(cpuid, cpu_online_map);=0A+	set_cpu_online(cpuid, 1);=0A =
#ifdef XEN=0A 	unlock_ipi_calllock(flags);=0A #else=0A@@ -437,7 +437,7 @@ =
smp_callin (void)=0A 	/*=0A 	 * Allow the master to continue.=0A 	 =
*/=0A-	cpu_set(cpuid, cpu_callin_map);=0A+	cpumask_set_cpu(cpuid, =
&cpu_callin_map);=0A 	Dprintk("Stack on CPU %d at about %p\n",cpuid, =
&cpuid);=0A }=0A =0A@@ -625,8 +625,8 @@ smp_prepare_cpus (unsigned int =
max_cpus)=0A 	/*=0A 	 * We have the boot CPU online for sure.=0A 	 =
*/=0A-	cpu_set(0, cpu_online_map);=0A-	cpu_set(0, cpu_callin_map);=0A+	=
set_cpu_online(0, 1);=0A+	cpumask_set_cpu(0, &cpu_callin_map);=0A =
=0A 	local_cpu_data->loops_per_jiffy =3D loops_per_jiffy;=0A 	=
ia64_cpu_to_sapicid[0] =3D boot_cpu_id;=0A@@ -652,8 +652,8 @@ smp_prepare_c=
pus (unsigned int max_cpus)=0A =0A void __devinit smp_prepare_boot_cpu(void=
)=0A {=0A-	cpu_set(smp_processor_id(), cpu_online_map);=0A-	=
cpu_set(smp_processor_id(), cpu_callin_map);=0A+	set_cpu_online(smp_=
processor_id(), 1);=0A+	cpumask_set_cpu(smp_processor_id(), &cpu_callin_map=
);=0A 	per_cpu(cpu_state, smp_processor_id()) =3D CPU_ONLINE;=0A }=0A =
=0A--- a/xen/arch/ia64/linux-xen/sn/kernel/sn2_smp.c=0A+++ b/xen/arch/ia64/=
linux-xen/sn/kernel/sn2_smp.c=0A@@ -214,7 +214,7 @@ sn2_global_tlb_purge(un=
signed long start=0A 	for_each_possible_cpu(cpu) {=0A 		=
cnode =3D cpu_to_node(cpu);=0A 		if (!node_isset(cnode, nodes_flushe=
d)) {=0A-			cpu_set(cpu, selected_cpus);=0A+		=
	cpumask_set_cpu(cpu, &selected_cpus);=0A 			=
i++;=0A 		}=0A 		node_set(cnode, nodes_flushed);=0A-=
-- a/xen/arch/ia64/xen/mm_init.c=0A+++ b/xen/arch/ia64/xen/mm_init.c=0A@@ =
-38,7 +38,7 @@ ia64_mmu_init (void *my_cpu_data)=0A 	ia64_set_psr(psr);=
=0A 	ia64_srlz_i();=0A #ifdef XEN=0A-	cpu_set(cpu, percpu_set);=
=0A+	cpumask_set_cpu(cpu, &percpu_set);=0A #endif=0A =0A 	/*=0A--- =
a/xen/arch/ia64/xen/tlb_track.c=0A+++ b/xen/arch/ia64/xen/tlb_track.c=0A@@ =
-389,7 +389,7 @@ tlb_track_insert_or_dirty(struct tlb_tra=0A =0A  =
found:=0A     BUG_ON(v->processor >=3D NR_CPUS);=0A-    cpu_set(v->processo=
r, entry->pcpu_dirty_mask);=0A+    cpumask_set_cpu(v->processor, &entry->pc=
pu_dirty_mask);=0A     BUG_ON(v->vcpu_id >=3D NR_CPUS);=0A     vcpu_set(v->=
vcpu_id, entry->vcpu_dirty_mask);=0A     perfc_incr(tlb_track_iod_dirtied);=
=0A--- a/xen/arch/x86/acpi/cpu_idle.c=0A+++ b/xen/arch/x86/acpi/cpu_idle.c=
=0A@@ -271,9 +271,9 @@ static void mwait_idle_with_hints(unsign=0A      =
*/=0A     if ( expires > NOW() || expires =3D=3D 0 )=0A     {=0A-        =
cpu_set(cpu, cpuidle_mwait_flags);=0A+        cpumask_set_cpu(cpu, =
&cpuidle_mwait_flags);=0A         __mwait(eax, ecx);=0A-        cpu_clear(c=
pu, cpuidle_mwait_flags);=0A+        cpumask_clear_cpu(cpu, &cpuidle_mwait_=
flags);=0A     }=0A =0A     if ( expires <=3D NOW() && expires > 0 )=0A--- =
a/xen/arch/x86/cpu/mcheck/mce_intel.c=0A+++ b/xen/arch/x86/cpu/mcheck/mce_i=
ntel.c=0A@@ -828,7 +828,7 @@ static void intel_machine_check(struct c=0A   =
           * (the MSRs are sticky)=0A              */=0A             if =
(bs.pcc || !bs.recoverable)=0A-                cpu_set(smp_processor_id(), =
mce_fatal_cpus);=0A+                cpumask_set_cpu(smp_processor_id(), =
&mce_fatal_cpus);=0A         } else {=0A             if (mctc !=3D =
NULL)=0A                 mctelem_commit(mctc);=0A@@ -849,7 +849,7 @@ =
static void intel_machine_check(struct c=0A =0A     mce_barrier_enter(&mce_=
trap_bar);=0A     if ( mctc !=3D NULL && mce_urgent_action(regs, mctc))=0A-=
        cpu_set(smp_processor_id(), mce_fatal_cpus);=0A+        cpumask_set=
_cpu(smp_processor_id(), &mce_fatal_cpus);=0A     mce_barrier_exit(&mce_tra=
p_bar);=0A     /*=0A      * Wait until everybody has processed the =
trap.=0A--- a/xen/arch/x86/mpparse.c=0A+++ b/xen/arch/x86/mpparse.c=0A@@ =
-161,7 +161,7 @@ static int __devinit MP_processor_info_x=0A 			=
return cpu;=0A 		}=0A 		x86_cpu_to_apicid[cpu] =3D =
apicid;=0A-		cpu_set(cpu, cpu_present_map);=0A+		=
set_cpu_present(cpu, 1);=0A 	}=0A =0A 	if (++num_processors > 8) =
{=0A--- a/xen/arch/x86/numa.c=0A+++ b/xen/arch/x86/numa.c=0A@@ -288,7 =
+288,7 @@ void __init numa_initmem_init(unsigned l=0A =0A __cpuinit void =
numa_add_cpu(int cpu)=0A {=0A-	cpu_set(cpu, node_to_cpumask[cpu_to_node(cp=
u)]);=0A+	cpumask_set_cpu(cpu, &node_to_cpumask[cpu_to_node(cpu)]);=
=0A } =0A =0A void __cpuinit numa_set_node(int cpu, int node)=0A--- =
a/xen/arch/x86/smpboot.c=0A+++ b/xen/arch/x86/smpboot.c=0A@@ -244,7 +244,7 =
@@ static void set_cpu_sibling_map(int cpu)=0A     int i;=0A     struct =
cpuinfo_x86 *c =3D cpu_data;=0A =0A-    cpu_set(cpu, cpu_sibling_setup_map)=
;=0A+    cpumask_set_cpu(cpu, &cpu_sibling_setup_map);=0A =0A     if ( =
c[cpu].x86_num_siblings > 1 )=0A     {=0A@@ -380,7 +380,7 @@ void =
start_secondary(void *unused)=0A      */=0A     lock_vector_lock();=0A     =
__setup_vector_irq(cpu);=0A-    cpu_set(cpu, cpu_online_map);=0A+    =
set_cpu_online(cpu, 1);=0A     unlock_vector_lock();=0A =0A     init_percpu=
_time();=0A@@ -804,8 +804,8 @@ void __init smp_prepare_cpus(unsigned in=0A =
=0A void __init smp_prepare_boot_cpu(void)=0A {=0A-    cpu_set(smp_processo=
r_id(), cpu_online_map);=0A-    cpu_set(smp_processor_id(), cpu_present_map=
);=0A+    set_cpu_online(smp_processor_id(), 1);=0A+    set_cpu_present(smp=
_processor_id(), 1);=0A }=0A =0A static void=0A@@ -933,7 +933,7 @@ int =
cpu_add(uint32_t apic_id, uint32_t a=0A                    "break assumed =
cross-CPU TSC coherency.\n"=0A                    " ** Consider using boot =
parameter \"tsc=3Dskewed\" "=0A                    "which forces TSC =
emulation where appropriate.\n", cpu);=0A-        cpu_set(cpu, tsc_sync_cpu=
_mask);=0A+        cpumask_set_cpu(cpu, &tsc_sync_cpu_mask);=0A     }=0A =
=0A     srat_detect_node(cpu);=0A--- a/xen/arch/x86/time.c=0A+++ b/xen/arch=
/x86/time.c=0A@@ -1573,7 +1573,7 @@ __initcall(disable_pit_irq);=0A =0A =
void pit_broadcast_enter(void)=0A {=0A-    cpu_set(smp_processor_id(), =
pit_broadcast_mask);=0A+    cpumask_set_cpu(smp_processor_id(), &pit_broadc=
ast_mask);=0A }=0A =0A void pit_broadcast_exit(void)=0A--- a/xen/common/cpu=
pool.c=0A+++ b/xen/common/cpupool.c=0A@@ -253,7 +253,7 @@ static long =
cpupool_unassign_cpu_helper(=0A =0A     spin_lock(&cpupool_lock);=0A     =
ret =3D cpu_disable_scheduler(cpu);=0A-    cpu_set(cpu, cpupool_free_cpus);=
=0A+    cpumask_set_cpu(cpu, &cpupool_free_cpus);=0A     if ( !ret )=0A    =
 {=0A         ret =3D schedule_cpu_switch(cpu, NULL);=0A@@ -409,8 +409,8 =
@@ void cpupool_rm_domain(struct domain *d)=0A static void cpupool_cpu_add(=
unsigned int cpu)=0A {=0A     spin_lock(&cpupool_lock);=0A-    cpu_clear(cp=
u, cpupool_locked_cpus);=0A-    cpu_set(cpu, cpupool_free_cpus);=0A+    =
cpumask_clear_cpu(cpu, &cpupool_locked_cpus);=0A+    cpumask_set_cpu(cpu, =
&cpupool_free_cpus);=0A     cpupool_assign_cpu_locked(cpupool0, cpu);=0A   =
  spin_unlock(&cpupool_lock);=0A }=0A@@ -428,7 +428,7 @@ static int =
cpupool_cpu_remove(unsigned i=0A     if ( !cpumask_test_cpu(cpu, cpupool0->=
cpu_valid))=0A         ret =3D -EBUSY;=0A     else=0A-        cpu_set(cpu, =
cpupool_locked_cpus);=0A+        cpumask_set_cpu(cpu, &cpupool_locked_cpus)=
;=0A     spin_unlock(&cpupool_lock);=0A =0A     return ret;=0A--- =
a/xen/common/sched_credit2.c=0A+++ b/xen/common/sched_credit2.c=0A@@ =
-1725,7 +1725,7 @@ csched_schedule(=0A     {=0A         /* Update the idle =
mask if necessary */=0A         if ( !cpumask_test_cpu(cpu, &rqd->idle) =
)=0A-            cpu_set(cpu, rqd->idle);=0A+            cpumask_set_cpu(cp=
u, &rqd->idle);=0A         /* Make sure avgload gets updated periodically =
even=0A          * if there's no activity */=0A         update_load(ops, =
rqd, NULL, 0, now);=0A@@ -1860,7 +1860,7 @@ static void activate_runqueue(s=
truct csc=0A     INIT_LIST_HEAD(&rqd->runq);=0A     spin_lock_init(&rqd->lo=
ck);=0A =0A-    cpu_set(rqi, prv->active_queues);=0A+    cpumask_set_cpu(rq=
i, &prv->active_queues);=0A }=0A =0A static void deactivate_runqueue(struct=
 csched_private *prv, int rqi)=0A@@ -1927,12 +1927,12 @@ static void =
init_pcpu(const struct sched=0A     /* Set the runqueue map */=0A     =
prv->runq_map[cpu]=3Drqi;=0A     =0A-    cpu_set(cpu, rqd->idle);=0A-    =
cpu_set(cpu, rqd->active);=0A+    cpumask_set_cpu(cpu, &rqd->idle);=0A+    =
cpumask_set_cpu(cpu, &rqd->active);=0A =0A     spin_unlock(old_lock);=0A =
=0A-    cpu_set(cpu, prv->initialized);=0A+    cpumask_set_cpu(cpu, =
&prv->initialized);=0A =0A     spin_unlock_irqrestore(&prv->lock, =
flags);=0A =0A--- a/xen/include/asm-ia64/linux-xen/asm/acpi.h=0A+++ =
b/xen/include/asm-ia64/linux-xen/asm/acpi.h=0A@@ -153,7 +153,7 @@ static =
inline void per_cpu_scan_finalize=0A 	high_cpu =3D min(high_cpu + =
reserve_cpus, NR_CPUS);=0A =0A 	for (cpu =3D low_cpu; cpu < high_cpu; =
cpu++) {=0A-		cpu_set(cpu, early_cpu_possible_map);=0A+		=
cpumask_set_cpu(cpu, &early_cpu_possible_map);=0A 		if =
(node_cpuid[cpu].nid =3D=3D NUMA_NO_NODE) {=0A 			node_cpuid[=
cpu].nid =3D next_nid;=0A 			next_nid++;=0A--- =
a/xen/include/xen/cpumask.h=0A+++ b/xen/include/xen/cpumask.h=0A@@ -97,7 =
+97,6 @@ static inline unsigned int cpumask_check=0A 	return cpu;=0A =
}=0A =0A-#define cpu_set(cpu, dst) cpumask_set_cpu(cpu, &(dst))=0A static =
inline void cpumask_set_cpu(int cpu, volatile cpumask_t *dstp)=0A {=0A 	=
set_bit(cpumask_check(cpu), dstp->bits);=0A@@ -452,6 +451,14 @@ extern =
cpumask_t cpu_present_map;=0A #define cpu_present(cpu)	((cpu) =3D=3D =
0)=0A #endif=0A =0A+#define set_cpu_online(cpu, online) \=0A+    ((online) =
? cpumask_set_cpu(cpu, &cpu_online_map) \=0A+              : cpumask_clear_=
cpu(cpu, &cpu_online_map))=0A+=0A+#define set_cpu_present(cpu, present) =
\=0A+    ((present) ? cpumask_set_cpu(cpu, &cpu_present_map) \=0A+         =
      : cpumask_clear_cpu(cpu, &cpu_present_map))=0A+=0A #define any_online=
_cpu(mask)			\=0A ({						=
\=0A 	int cpu;				\=0A
--=__PartAD825997.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__PartAD825997.0__=--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 02:09:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 02:09:16 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNM8h-0006jn-Pa; Mon, 07 Nov 2011 02:09:15 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNLxY-000538-9g
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 01:57:44 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1320659860!2151557!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5643 invoked from network); 7 Nov 2011 09:57:40 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 09:57:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,469,1315180800"; 
   d="scan'208";a="8789962"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 09:57:40 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Mon, 7 Nov 2011
	09:57:40 +0000
Subject: Re: [Xen-devel] Question about HVM network
From: Ian Campbell <Ian.Campbell@citrix.com>
To: cc Luit <universalbillow@gmail.com>
Date: Mon, 7 Nov 2011 09:57:39 +0000
In-Reply-To: <CADWh-PGMZXWnnSqB5zmSTnLSR66EtX9WnXcn=ZZLNQ=P5mGV7g@mail.gmail.com>
References: <CADWh-PGMZXWnnSqB5zmSTnLSR66EtX9WnXcn=ZZLNQ=P5mGV7g@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320659859.955.4.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Sun, 2011-11-06 at 14:12 +0000, cc Luit wrote:
> Hi, all,
> 
> 
> I've a question about how network of HVM works, 
> when hvm startup, I found the qemu register the io port 0xc100-0xc1ff
> to the function rtl8139_ioport_write, is this means qemu emulate the
> rtl8139 NIC to handle network io event?

I think this is the default. You can select a different emulated NIC
using e.g. "model=e1000" in your VIF stanza in the guest configuration
file.

> but when I scp a file to the remote machine, I cannot find any write
> to these ports, so I'm curious how hvm's network works?

Perhaps you have ended up with PVHVM network driver? This will take
precedence to the emulated NIC if present.

Ian.

> 
> 
> first I'm not using the passthrough, so I think that it will use DMA:
> after it write the content to the memory, it will use PIO to write to
> one of the port to tell the qemu it need to start DMA, but there is no
> write to the port, then how does the rtc8139 emulated by qemu know
> when to start the DMA and where is the memory address?
> 
> 
> hope someone can help me~ thanks in advance.
> 
> 
> -- 
> - Luit @ Parallel Processing Institute, Fudan University 
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 02:11:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 02:11:34 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNMAw-00077s-BG; Mon, 07 Nov 2011 02:11:34 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNLyV-0005CW-Cw
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 01:58:45 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1320659906!44617780!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20188 invoked from network); 7 Nov 2011 09:58:27 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-11.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Nov 2011 09:58:27 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 07 Nov 2011 09:58:39 +0000
Message-Id: <4EB7B9DA020000780005F4C1@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 07 Nov 2011 09:58:33 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__PartE3CC17D9.0__="
Subject: [Xen-devel] [PATCH 4/6] eliminate cpu_clear()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__PartE3CC17D9.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/ia64/linux-xen/acpi.c
+++ b/xen/arch/ia64/linux-xen/acpi.c
@@ -976,7 +976,7 @@ EXPORT_SYMBOL(acpi_map_lsapic);
 int acpi_unmap_lsapic(int cpu)
 {
 	ia64_cpu_to_sapicid[cpu] =3D -1;
-	cpu_clear(cpu, cpu_present_map);
+	set_cpu_present(cpu, 0);
=20
 #ifdef CONFIG_ACPI_NUMA
 	/* NUMA specific cleanup's */
--- a/xen/arch/ia64/linux-xen/iosapic.c
+++ b/xen/arch/ia64/linux-xen/iosapic.c
@@ -706,7 +706,7 @@ get_target_cpu (unsigned int gsi, int ve
=20
 		for_each_cpu_mask(numa_cpu, cpu_mask) {
 			if (!cpu_online(numa_cpu))
-				cpu_clear(numa_cpu, cpu_mask);
+				cpumask_clear_cpu(numa_cpu, &cpu_mask);
 		}
=20
 		num_cpus =3D cpumask_weight(&cpu_mask);
--- a/xen/arch/ia64/linux-xen/smp.c
+++ b/xen/arch/ia64/linux-xen/smp.c
@@ -134,7 +134,7 @@ stop_this_cpu (void)
 	/*
 	 * Remove this CPU:
 	 */
-	cpu_clear(smp_processor_id(), cpu_online_map);
+	set_cpu_online(smp_processor_id(), 0);
 	max_xtp();
 	local_irq_disable();
 	cpu_halt();
--- a/xen/arch/ia64/linux-xen/smpboot.c
+++ b/xen/arch/ia64/linux-xen/smpboot.c
@@ -557,7 +557,7 @@ do_rest:
 	if (!cpumask_test_cpu(cpu, &cpu_callin_map)) {
 		printk(KERN_ERR "Processor 0x%x/0x%x is stuck.\n", cpu, =
sapicid);
 		ia64_cpu_to_sapicid[cpu] =3D -1;
-		cpu_clear(cpu, cpu_online_map);  /* was set in smp_callin()=
 */
+		set_cpu_online(cpu, 0);  /* was set in smp_callin() */
 		return -EINVAL;
 	}
 	return 0;
@@ -727,12 +727,12 @@ void __cpu_disable(void)
 	int cpu =3D smp_processor_id();
=20
 	remove_siblinginfo(cpu);
-	cpu_clear(cpu, cpu_online_map);
+	set_cpu_online(cpu, 0);
 #ifndef XEN
 	fixup_irqs();
 #endif
 	local_flush_tlb_all();
-	cpu_clear(cpu, cpu_callin_map);
+	cpumask_clear_cpu(cpu, &cpu_callin_map);
 }
 #else /* !CONFIG_HOTPLUG_CPU */
 void __cpu_disable(void)
--- a/xen/arch/x86/cpu/common.c
+++ b/xen/arch/x86/cpu/common.c
@@ -668,5 +668,5 @@ void __cpuinit cpu_init(void)
=20
 void cpu_uninit(unsigned int cpu)
 {
-	cpu_clear(cpu, cpu_initialized);
+	cpumask_clear_cpu(cpu, &cpu_initialized);
 }
--- a/xen/arch/x86/mpparse.c
+++ b/xen/arch/x86/mpparse.c
@@ -802,7 +802,7 @@ void mp_unregister_lapic(uint32_t apic_i
 	physid_clear(apic_id, phys_cpu_present_map);
=20
 	x86_cpu_to_apicid[cpu] =3D BAD_APICID;
-	cpu_clear(cpu, cpu_present_map);
+	set_cpu_present(cpu, 0);
 }
=20
 #ifdef	CONFIG_X86_IO_APIC
--- a/xen/arch/x86/smp.c
+++ b/xen/arch/x86/smp.c
@@ -226,7 +226,7 @@ fastcall void smp_invalidate_interrupt(v
     if ( !__sync_local_execstate() ||
          (flush_flags & (FLUSH_TLB_GLOBAL | FLUSH_CACHE)) )
         flush_area_local(flush_va, flush_flags);
-    cpu_clear(smp_processor_id(), flush_cpumask);
+    cpumask_clear_cpu(smp_processor_id(), &flush_cpumask);
     irq_exit();
 }
=20
@@ -353,7 +353,7 @@ void __stop_this_cpu(void)
 static void stop_this_cpu(void *dummy)
 {
     __stop_this_cpu();
-    cpu_clear(smp_processor_id(), cpu_online_map);
+    set_cpu_online(smp_processor_id(), 0);
     for ( ; ; )
         halt();
 }
--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -151,7 +151,7 @@ static void synchronize_tsc_master(unsig
     }
=20
     atomic_set(&tsc_count, 0);
-    cpu_clear(slave, tsc_sync_cpu_mask);
+    cpumask_clear_cpu(slave, &tsc_sync_cpu_mask);
 }
=20
 static void synchronize_tsc_slave(unsigned int slave)
--- a/xen/common/cpupool.c
+++ b/xen/common/cpupool.c
@@ -232,7 +232,7 @@ static int cpupool_assign_cpu_locked(str
         return ret;
     }
=20
-    cpu_clear(cpu, cpupool_free_cpus);
+    cpumask_clear_cpu(cpu, &cpupool_free_cpus);
     if (cpupool_moving_cpu =3D=3D cpu)
     {
         cpupool_moving_cpu =3D -1;
@@ -259,7 +259,7 @@ static long cpupool_unassign_cpu_helper(
         ret =3D schedule_cpu_switch(cpu, NULL);
         if ( ret )
         {
-            cpu_clear(cpu, cpupool_free_cpus);
+            cpumask_clear_cpu(cpu, &cpupool_free_cpus);
             goto out;
         }
         per_cpu(cpupool, cpu) =3D NULL;
--- a/xen/common/sched_credit2.c
+++ b/xen/common/sched_credit2.c
@@ -1638,7 +1638,7 @@ csched_schedule(
=20
     /* Clear "tickled" bit now that we've been scheduled */
     if ( cpumask_test_cpu(cpu, &rqd->tickled) )
-        cpu_clear(cpu, rqd->tickled);
+        cpumask_clear_cpu(cpu, &rqd->tickled);
=20
     /* Update credits */
     burn_credits(rqd, scurr, now);
@@ -1709,7 +1709,7 @@ csched_schedule(
=20
         /* Clear the idle mask if necessary */
         if ( cpumask_test_cpu(cpu, &rqd->idle) )
-            cpu_clear(cpu, rqd->idle);
+            cpumask_clear_cpu(cpu, &rqd->idle);
=20
         snext->start_time =3D now;
=20
@@ -1873,7 +1873,7 @@ static void deactivate_runqueue(struct c
    =20
     rqd->id =3D -1;
=20
-    cpu_clear(rqi, prv->active_queues);
+    cpumask_clear_cpu(rqi, &prv->active_queues);
 }
=20
 static void init_pcpu(const struct scheduler *ops, int cpu)
@@ -1977,8 +1977,8 @@ csched_free_pdata(const struct scheduler
=20
     printk("Removing cpu %d from runqueue %d\n", cpu, rqi);
=20
-    cpu_clear(cpu, rqd->idle);
-    cpu_clear(cpu, rqd->active);
+    cpumask_clear_cpu(cpu, &rqd->idle);
+    cpumask_clear_cpu(cpu, &rqd->active);
=20
     if ( cpumask_empty(&rqd->active) )
     {
@@ -1988,7 +1988,7 @@ csched_free_pdata(const struct scheduler
=20
     spin_unlock(&rqd->lock);
=20
-    cpu_clear(cpu, prv->initialized);
+    cpumask_clear_cpu(cpu, &prv->initialized);
=20
     spin_unlock_irqrestore(&prv->lock, flags);
=20
--- a/xen/include/asm-x86/flushtlb.h
+++ b/xen/include/asm-x86/flushtlb.h
@@ -54,7 +54,7 @@ do {                                   =20
     unsigned int cpu;                                                   \
     for_each_cpu_mask ( cpu, mask )                                     \
         if ( !NEED_FLUSH(per_cpu(tlbflush_time, cpu), page_timestamp) ) \
-            cpu_clear(cpu, mask);                                       \
+            cpumask_clear_cpu(cpu, &(mask));                            \
 } while ( 0 )
=20
 void new_tlbflush_clock_period(void);
--- a/xen/include/asm-x86/numa.h
+++ b/xen/include/asm-x86/numa.h
@@ -43,7 +43,7 @@ extern void init_cpu_to_node(void);
=20
 static inline void clear_node_cpumask(int cpu)
 {
-	cpu_clear(cpu, node_to_cpumask[cpu_to_node(cpu)]);
+	cpumask_clear_cpu(cpu, &node_to_cpumask[cpu_to_node(cpu)]);
 }
=20
 /* Simple perfect hash to map pdx to node numbers */
--- a/xen/include/xen/cpumask.h
+++ b/xen/include/xen/cpumask.h
@@ -102,7 +102,6 @@ static inline void cpumask_set_cpu(int c
 	set_bit(cpumask_check(cpu), dstp->bits);
 }
=20
-#define cpu_clear(cpu, dst) cpumask_clear_cpu(cpu, &(dst))
 static inline void cpumask_clear_cpu(int cpu, volatile cpumask_t *dstp)
 {
 	clear_bit(cpumask_check(cpu), dstp->bits);



--=__PartE3CC17D9.0__=
Content-Type: text/plain; name="eliminate-cpu_clear.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="eliminate-cpu_clear.patch"

eliminate cpu_clear()=0A=0ASigned-off-by: Jan Beulich <jbeulich@suse.com>=
=0A=0A--- a/xen/arch/ia64/linux-xen/acpi.c=0A+++ b/xen/arch/ia64/linux-xen/=
acpi.c=0A@@ -976,7 +976,7 @@ EXPORT_SYMBOL(acpi_map_lsapic);=0A int =
acpi_unmap_lsapic(int cpu)=0A {=0A 	ia64_cpu_to_sapicid[cpu] =3D =
-1;=0A-	cpu_clear(cpu, cpu_present_map);=0A+	set_cpu_present(cpu, =
0);=0A =0A #ifdef CONFIG_ACPI_NUMA=0A 	/* NUMA specific cleanup's =
*/=0A--- a/xen/arch/ia64/linux-xen/iosapic.c=0A+++ b/xen/arch/ia64/linux-xe=
n/iosapic.c=0A@@ -706,7 +706,7 @@ get_target_cpu (unsigned int gsi, int =
ve=0A =0A 		for_each_cpu_mask(numa_cpu, cpu_mask) {=0A 		=
	if (!cpu_online(numa_cpu))=0A-				cpu_clear(n=
uma_cpu, cpu_mask);=0A+				cpumask_clear_cpu(numa_cpu,=
 &cpu_mask);=0A 		}=0A =0A 		num_cpus =3D =
cpumask_weight(&cpu_mask);=0A--- a/xen/arch/ia64/linux-xen/smp.c=0A+++ =
b/xen/arch/ia64/linux-xen/smp.c=0A@@ -134,7 +134,7 @@ stop_this_cpu =
(void)=0A 	/*=0A 	 * Remove this CPU:=0A 	 */=0A-	cpu_clear(smp_proce=
ssor_id(), cpu_online_map);=0A+	set_cpu_online(smp_processor_id(), 0);=0A 	=
max_xtp();=0A 	local_irq_disable();=0A 	cpu_halt();=0A--- =
a/xen/arch/ia64/linux-xen/smpboot.c=0A+++ b/xen/arch/ia64/linux-xen/smpboot=
.c=0A@@ -557,7 +557,7 @@ do_rest:=0A 	if (!cpumask_test_cpu(cpu, =
&cpu_callin_map)) {=0A 		printk(KERN_ERR "Processor 0x%x/0x%x is =
stuck.\n", cpu, sapicid);=0A 		ia64_cpu_to_sapicid[cpu] =3D =
-1;=0A-		cpu_clear(cpu, cpu_online_map);  /* was set in smp_callin()=
 */=0A+		set_cpu_online(cpu, 0);  /* was set in smp_callin() */=0A 	=
	return -EINVAL;=0A 	}=0A 	return 0;=0A@@ -727,12 +727,12 @@ =
void __cpu_disable(void)=0A 	int cpu =3D smp_processor_id();=0A =0A 	=
remove_siblinginfo(cpu);=0A-	cpu_clear(cpu, cpu_online_map);=0A+	=
set_cpu_online(cpu, 0);=0A #ifndef XEN=0A 	fixup_irqs();=0A #endif=0A =
	local_flush_tlb_all();=0A-	cpu_clear(cpu, cpu_callin_map);=0A+=
	cpumask_clear_cpu(cpu, &cpu_callin_map);=0A }=0A #else /* =
!CONFIG_HOTPLUG_CPU */=0A void __cpu_disable(void)=0A--- a/xen/arch/x86/cpu=
/common.c=0A+++ b/xen/arch/x86/cpu/common.c=0A@@ -668,5 +668,5 @@ void =
__cpuinit cpu_init(void)=0A =0A void cpu_uninit(unsigned int cpu)=0A {=0A-	=
cpu_clear(cpu, cpu_initialized);=0A+	cpumask_clear_cpu(cpu, &cpu_initial=
ized);=0A }=0A--- a/xen/arch/x86/mpparse.c=0A+++ b/xen/arch/x86/mpparse.c=
=0A@@ -802,7 +802,7 @@ void mp_unregister_lapic(uint32_t apic_i=0A 	=
physid_clear(apic_id, phys_cpu_present_map);=0A =0A 	x86_cpu_to_apicid[c=
pu] =3D BAD_APICID;=0A-	cpu_clear(cpu, cpu_present_map);=0A+	set_cpu_pre=
sent(cpu, 0);=0A }=0A =0A #ifdef	CONFIG_X86_IO_APIC=0A--- a/xen/arch=
/x86/smp.c=0A+++ b/xen/arch/x86/smp.c=0A@@ -226,7 +226,7 @@ fastcall void =
smp_invalidate_interrupt(v=0A     if ( !__sync_local_execstate() ||=0A     =
     (flush_flags & (FLUSH_TLB_GLOBAL | FLUSH_CACHE)) )=0A         =
flush_area_local(flush_va, flush_flags);=0A-    cpu_clear(smp_processor_id(=
), flush_cpumask);=0A+    cpumask_clear_cpu(smp_processor_id(), &flush_cpum=
ask);=0A     irq_exit();=0A }=0A =0A@@ -353,7 +353,7 @@ void __stop_this_cp=
u(void)=0A static void stop_this_cpu(void *dummy)=0A {=0A     __stop_this_c=
pu();=0A-    cpu_clear(smp_processor_id(), cpu_online_map);=0A+    =
set_cpu_online(smp_processor_id(), 0);=0A     for ( ; ; )=0A         =
halt();=0A }=0A--- a/xen/arch/x86/smpboot.c=0A+++ b/xen/arch/x86/smpboot.c=
=0A@@ -151,7 +151,7 @@ static void synchronize_tsc_master(unsig=0A     =
}=0A =0A     atomic_set(&tsc_count, 0);=0A-    cpu_clear(slave, tsc_sync_cp=
u_mask);=0A+    cpumask_clear_cpu(slave, &tsc_sync_cpu_mask);=0A }=0A =0A =
static void synchronize_tsc_slave(unsigned int slave)=0A--- a/xen/common/cp=
upool.c=0A+++ b/xen/common/cpupool.c=0A@@ -232,7 +232,7 @@ static int =
cpupool_assign_cpu_locked(str=0A         return ret;=0A     }=0A =0A-    =
cpu_clear(cpu, cpupool_free_cpus);=0A+    cpumask_clear_cpu(cpu, &cpupool_f=
ree_cpus);=0A     if (cpupool_moving_cpu =3D=3D cpu)=0A     {=0A         =
cpupool_moving_cpu =3D -1;=0A@@ -259,7 +259,7 @@ static long cpupool_unassi=
gn_cpu_helper(=0A         ret =3D schedule_cpu_switch(cpu, NULL);=0A       =
  if ( ret )=0A         {=0A-            cpu_clear(cpu, cpupool_free_cpus);=
=0A+            cpumask_clear_cpu(cpu, &cpupool_free_cpus);=0A             =
goto out;=0A         }=0A         per_cpu(cpupool, cpu) =3D NULL;=0A--- =
a/xen/common/sched_credit2.c=0A+++ b/xen/common/sched_credit2.c=0A@@ =
-1638,7 +1638,7 @@ csched_schedule(=0A =0A     /* Clear "tickled" bit now =
that we've been scheduled */=0A     if ( cpumask_test_cpu(cpu, &rqd->tickle=
d) )=0A-        cpu_clear(cpu, rqd->tickled);=0A+        cpumask_clear_cpu(=
cpu, &rqd->tickled);=0A =0A     /* Update credits */=0A     burn_credits(rq=
d, scurr, now);=0A@@ -1709,7 +1709,7 @@ csched_schedule(=0A =0A         /* =
Clear the idle mask if necessary */=0A         if ( cpumask_test_cpu(cpu, =
&rqd->idle) )=0A-            cpu_clear(cpu, rqd->idle);=0A+            =
cpumask_clear_cpu(cpu, &rqd->idle);=0A =0A         snext->start_time =3D =
now;=0A =0A@@ -1873,7 +1873,7 @@ static void deactivate_runqueue(struct =
c=0A     =0A     rqd->id =3D -1;=0A =0A-    cpu_clear(rqi, prv->active_queu=
es);=0A+    cpumask_clear_cpu(rqi, &prv->active_queues);=0A }=0A =0A =
static void init_pcpu(const struct scheduler *ops, int cpu)=0A@@ -1977,8 =
+1977,8 @@ csched_free_pdata(const struct scheduler=0A =0A     printk("Remo=
ving cpu %d from runqueue %d\n", cpu, rqi);=0A =0A-    cpu_clear(cpu, =
rqd->idle);=0A-    cpu_clear(cpu, rqd->active);=0A+    cpumask_clear_cpu(cp=
u, &rqd->idle);=0A+    cpumask_clear_cpu(cpu, &rqd->active);=0A =0A     if =
( cpumask_empty(&rqd->active) )=0A     {=0A@@ -1988,7 +1988,7 @@ csched_fre=
e_pdata(const struct scheduler=0A =0A     spin_unlock(&rqd->lock);=0A =0A- =
   cpu_clear(cpu, prv->initialized);=0A+    cpumask_clear_cpu(cpu, =
&prv->initialized);=0A =0A     spin_unlock_irqrestore(&prv->lock, =
flags);=0A =0A--- a/xen/include/asm-x86/flushtlb.h=0A+++ b/xen/include/asm-=
x86/flushtlb.h=0A@@ -54,7 +54,7 @@ do {                                    =
=0A     unsigned int cpu;                                                  =
 \=0A     for_each_cpu_mask ( cpu, mask )                                  =
   \=0A         if ( !NEED_FLUSH(per_cpu(tlbflush_time, cpu), page_timestam=
p) ) \=0A-            cpu_clear(cpu, mask);                                =
       \=0A+            cpumask_clear_cpu(cpu, &(mask));                   =
         \=0A } while ( 0 )=0A =0A void new_tlbflush_clock_period(void);=0A=
--- a/xen/include/asm-x86/numa.h=0A+++ b/xen/include/asm-x86/numa.h=0A@@ =
-43,7 +43,7 @@ extern void init_cpu_to_node(void);=0A =0A static inline =
void clear_node_cpumask(int cpu)=0A {=0A-	cpu_clear(cpu, node_to_cpum=
ask[cpu_to_node(cpu)]);=0A+	cpumask_clear_cpu(cpu, &node_to_cpumask[cpu=
_to_node(cpu)]);=0A }=0A =0A /* Simple perfect hash to map pdx to node =
numbers */=0A--- a/xen/include/xen/cpumask.h=0A+++ b/xen/include/xen/cpumas=
k.h=0A@@ -102,7 +102,6 @@ static inline void cpumask_set_cpu(int c=0A 	=
set_bit(cpumask_check(cpu), dstp->bits);=0A }=0A =0A-#define cpu_clear(cpu,=
 dst) cpumask_clear_cpu(cpu, &(dst))=0A static inline void cpumask_clear_cp=
u(int cpu, volatile cpumask_t *dstp)=0A {=0A 	clear_bit(cpumask_check(cpu=
), dstp->bits);=0A
--=__PartE3CC17D9.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__PartE3CC17D9.0__=--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 02:13:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 02:13:46 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNMD2-0007Vg-Cs; Mon, 07 Nov 2011 02:13:44 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNLz3-0005Fc-Dt
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 01:59:33 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320659928!51709696!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21602 invoked from network); 7 Nov 2011 09:58:48 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Nov 2011 09:58:48 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 07 Nov 2011 09:59:13 +0000
Message-Id: <4EB7B9FF020000780005F4C5@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 07 Nov 2011 09:59:11 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__PartC5EA31FF.0__="
Subject: [Xen-devel] [PATCH 5/6] eliminate first_cpu() etc
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__PartC5EA31FF.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

This includes the conversion from for_each_cpu_mask() to for_each-cpu().

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/ia64/linux-xen/iosapic.c
+++ b/xen/arch/ia64/linux-xen/iosapic.c
@@ -704,7 +704,7 @@ get_target_cpu (unsigned int gsi, int ve
=20
 		cpu_mask =3D node_to_cpumask(iosapic_lists[iosapic_index].n=
ode);
=20
-		for_each_cpu_mask(numa_cpu, cpu_mask) {
+		for_each_cpu(numa_cpu, &cpu_mask) {
 			if (!cpu_online(numa_cpu))
 				cpumask_clear_cpu(numa_cpu, &cpu_mask);
 		}
@@ -717,8 +717,8 @@ get_target_cpu (unsigned int gsi, int ve
 		/* Use vector assigment to distribute across cpus in node =
*/
 		cpu_index =3D vector % num_cpus;
=20
-		for (numa_cpu =3D first_cpu(cpu_mask) ; i < cpu_index ; =
i++)
-			numa_cpu =3D next_cpu(numa_cpu, cpu_mask);
+		for (numa_cpu =3D cpumask_first(&cpu_mask) ; i < cpu_index =
; i++)
+			numa_cpu =3D cpumask_next(numa_cpu, &cpu_mask);
=20
 		if (numa_cpu !=3D NR_CPUS)
 			return cpu_physical_id(numa_cpu);
--- a/xen/arch/ia64/linux-xen/mca.c
+++ b/xen/arch/ia64/linux-xen/mca.c
@@ -1415,7 +1415,7 @@ ia64_mca_cmc_poll (void *dummy)
 #endif
 {
 	/* Trigger a CMC interrupt cascade  */
-	platform_send_ipi(first_cpu(cpu_online_map), IA64_CMCP_VECTOR, =
IA64_IPI_DM_INT, 0);
+	platform_send_ipi(cpumask_first(&cpu_online_map), IA64_CMCP_VECTOR,=
 IA64_IPI_DM_INT, 0);
 }
=20
 /*
@@ -1505,7 +1505,7 @@ ia64_mca_cpe_poll (void *dummy)
 #endif
 {
 	/* Trigger a CPE interrupt cascade  */
-	platform_send_ipi(first_cpu(cpu_online_map), IA64_CPEP_VECTOR, =
IA64_IPI_DM_INT, 0);
+	platform_send_ipi(cpumask_first(&cpu_online_map), IA64_CPEP_VECTOR,=
 IA64_IPI_DM_INT, 0);
 }
=20
 #endif /* CONFIG_ACPI */
--- a/xen/arch/ia64/linux-xen/smp.c
+++ b/xen/arch/ia64/linux-xen/smp.c
@@ -462,7 +462,7 @@ on_selected_cpus(const cpumask_t *select
 	call_data =3D &data;
 	wmb();
=20
-	for_each_cpu_mask(cpu, *selected)
+	for_each_cpu(cpu, selected)
 		send_IPI_single(cpu, IPI_CALL_FUNC);
=20
 	while (atomic_read(wait ? &data.finished : &data.started) !=3D =
nr_cpus)
--- a/xen/arch/ia64/linux-xen/smpboot.c
+++ b/xen/arch/ia64/linux-xen/smpboot.c
@@ -687,9 +687,9 @@ clear_cpu_sibling_map(int cpu)
 {
 	int i;
=20
-	for_each_cpu_mask(i, *per_cpu(cpu_sibling_mask, cpu))
+	for_each_cpu(i, per_cpu(cpu_sibling_mask, cpu))
 		cpumask_clear_cpu(cpu, per_cpu(cpu_sibling_mask, i));
-	for_each_cpu_mask(i, *per_cpu(cpu_core_mask, cpu))
+	for_each_cpu(i, per_cpu(cpu_core_mask, cpu))
 		cpumask_clear_cpu(cpu, per_cpu(cpu_core_mask, i));
=20
 	cpumask_clear(per_cpu(cpu_sibling_mask, cpu));
--- a/xen/arch/ia64/vmx/vacpi.c
+++ b/xen/arch/ia64/vmx/vacpi.c
@@ -191,7 +191,7 @@ void vacpi_init(struct domain *d)
 	s->last_gtime =3D NOW();
=20
 	/* Set up callback to fire SCIs when the MSB of TMR_VAL changes */
-	init_timer(&s->timer, pmt_timer_callback, d, first_cpu(cpu_online_m=
ap));
+	init_timer(&s->timer, pmt_timer_callback, d, cpumask_first(&cpu_onl=
ine_map));
 	pmt_timer_callback(d);
 }
=20
--- a/xen/arch/ia64/xen/dom0_ops.c
+++ b/xen/arch/ia64/xen/dom0_ops.c
@@ -618,7 +618,7 @@ long arch_do_sysctl(xen_sysctl_t *op, XE
         XEN_GUEST_HANDLE_64(uint32) arr;
         uint32_t i, val, max_array_ent =3D ti->max_cpu_index;
=20
-        ti->max_cpu_index =3D last_cpu(cpu_online_map);
+        ti->max_cpu_index =3D cpumask_last(&cpu_online_map);
         max_array_ent =3D min(max_array_ent, ti->max_cpu_index);
=20
         arr =3D ti->cpu_to_core;
--- a/xen/arch/ia64/xen/domain.c
+++ b/xen/arch/ia64/xen/domain.c
@@ -501,7 +501,7 @@ int vcpu_initialise(struct vcpu *v)
=20
 	if (!VMX_DOMAIN(v))
 		init_timer(&v->arch.hlt_timer, hlt_timer_fn, v,
-		           first_cpu(cpu_online_map));
+		           cpumask_any(&cpu_online_map));
=20
 	return 0;
 }
--- a/xen/arch/ia64/xen/vhpt.c
+++ b/xen/arch/ia64/xen/vhpt.c
@@ -463,7 +463,7 @@ __domain_flush_vtlb_track_entry(struct d
 				local_purge =3D 0;
 		}
 	} else {
-		for_each_cpu_mask(cpu, entry->pcpu_dirty_mask) {
+		for_each_cpu(cpu, &entry->pcpu_dirty_mask) {
 			/* Invalidate VHPT entries.  */
 			cpu_flush_vhpt_range(cpu, vaddr, 1L << ps);
=20
@@ -559,7 +559,7 @@ void flush_tlb_mask(const cpumask_t *mas
     if (cpumask_subset(mask, cpumask_of(cpu)))
         return;
=20
-    for_each_cpu_mask (cpu, *mask)
+    for_each_cpu (cpu, mask)
         if (cpu !=3D smp_processor_id())
             smp_call_function_single
                 (cpu, (void (*)(void *))flush_tlb_vhpt_all, NULL, 1);
--- a/xen/arch/x86/acpi/cpu_idle.c
+++ b/xen/arch/x86/acpi/cpu_idle.c
@@ -251,7 +251,7 @@ void cpuidle_wakeup_mwait(cpumask_t *mas
     cpumask_and(&target, mask, &cpuidle_mwait_flags);
=20
     /* CPU is MWAITing on the cpuidle_mwait_wakeup flag. */
-    for_each_cpu_mask(cpu, target)
+    for_each_cpu(cpu, &target)
         mwait_wakeup(cpu) =3D 0;
=20
     cpumask_andnot(mask, mask, &target);
--- a/xen/arch/x86/acpi/cpufreq/cpufreq.c
+++ b/xen/arch/x86/acpi/cpufreq/cpufreq.c
@@ -487,7 +487,7 @@ static int acpi_cpufreq_target(struct cp
         return -EAGAIN;
     }
=20
-    for_each_cpu_mask(j, online_policy_cpus)
+    for_each_cpu(j, &online_policy_cpus)
         cpufreq_statistic_update(j, perf->state, next_perf_state);
=20
     perf->state =3D next_perf_state;
--- a/xen/arch/x86/acpi/cpufreq/powernow.c
+++ b/xen/arch/x86/acpi/cpufreq/powernow.c
@@ -130,7 +130,7 @@ static int powernow_cpufreq_target(struc
=20
     on_selected_cpus(cmd.mask, transition_pstate, &cmd, 1);
=20
-    for_each_cpu_mask(j, online_policy_cpus)
+    for_each_cpu(j, &online_policy_cpus)
         cpufreq_statistic_update(j, perf->state, next_perf_state);
=20
     perf->state =3D next_perf_state;
--- a/xen/arch/x86/genapic/x2apic.c
+++ b/xen/arch/x86/genapic/x2apic.c
@@ -72,7 +72,7 @@ static void __send_IPI_mask_x2apic(
=20
     local_irq_save(flags);
=20
-    for_each_cpu_mask ( cpu, *cpumask )
+    for_each_cpu ( cpu, cpumask )
     {
         if ( !cpu_online(cpu) || (cpu =3D=3D smp_processor_id()) )
             continue;
--- a/xen/arch/x86/hpet.c
+++ b/xen/arch/x86/hpet.c
@@ -182,7 +182,7 @@ again:
     now =3D NOW();
=20
     /* find all expired events */
-    for_each_cpu_mask(cpu, *ch->cpumask)
+    for_each_cpu(cpu, ch->cpumask)
     {
         s_time_t deadline;
=20
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -125,7 +125,7 @@ static int __init __bind_irq_vector(int=20
     if ( desc->arch.vector !=3D IRQ_VECTOR_UNASSIGNED )
         return -EBUSY;
     trace_irq_mask(TRC_HW_IRQ_BIND_VECTOR, irq, vector, &online_mask);
-    for_each_cpu_mask(cpu, online_mask)
+    for_each_cpu(cpu, &online_mask)
         per_cpu(vector_irq, cpu)[vector] =3D irq;
     desc->arch.vector =3D vector;
     cpumask_copy(desc->arch.cpu_mask, &online_mask);
@@ -223,7 +223,7 @@ static void __clear_irq_vector(int irq)
     vector =3D desc->arch.vector;
     cpumask_and(&tmp_mask, desc->arch.cpu_mask, &cpu_online_map);
=20
-    for_each_cpu_mask(cpu, tmp_mask) {
+    for_each_cpu(cpu, &tmp_mask) {
         ASSERT( per_cpu(vector_irq, cpu)[vector] =3D=3D irq );
         per_cpu(vector_irq, cpu)[vector] =3D -1;
     }
@@ -248,7 +248,7 @@ static void __clear_irq_vector(int irq)
     old_vector =3D desc->arch.old_vector;
     cpumask_and(&tmp_mask, desc->arch.old_cpu_mask, &cpu_online_map);
=20
-    for_each_cpu_mask(cpu, tmp_mask) {
+    for_each_cpu(cpu, &tmp_mask) {
         ASSERT( per_cpu(vector_irq, cpu)[old_vector] =3D=3D irq );
         TRACE_3D(TRC_HW_IRQ_MOVE_FINISH, irq, old_vector, cpu);
         per_cpu(vector_irq, cpu)[old_vector] =3D -1;
@@ -455,7 +455,7 @@ static int __assign_irq_vector(
     else
         irq_used_vectors =3D irq_get_used_vector_mask(irq);
=20
-    for_each_cpu_mask(cpu, *mask) {
+    for_each_cpu(cpu, mask) {
         int new_cpu;
         int vector, offset;
=20
@@ -485,7 +485,7 @@ next:
             && test_bit(vector, irq_used_vectors) )
             goto next;
=20
-        for_each_cpu_mask(new_cpu, tmp_mask)
+        for_each_cpu(new_cpu, &tmp_mask)
             if (per_cpu(vector_irq, new_cpu)[vector] !=3D -1)
                 goto next;
         /* Found one! */
@@ -497,7 +497,7 @@ next:
             desc->arch.old_vector =3D desc->arch.vector;
         }
         trace_irq_mask(TRC_HW_IRQ_ASSIGN_VECTOR, irq, vector, &tmp_mask);
-        for_each_cpu_mask(new_cpu, tmp_mask)
+        for_each_cpu(new_cpu, &tmp_mask)
             per_cpu(vector_irq, new_cpu)[vector] =3D irq;
         desc->arch.vector =3D vector;
         cpumask_copy(desc->arch.cpu_mask, &tmp_mask);
--- a/xen/arch/x86/microcode.c
+++ b/xen/arch/x86/microcode.c
@@ -125,7 +125,7 @@ static long do_microcode_update(void *_i
     if ( error )
         info->error =3D error;
=20
-    info->cpu =3D next_cpu(info->cpu, cpu_online_map);
+    info->cpu =3D cpumask_next(info->cpu, &cpu_online_map);
     if ( info->cpu < nr_cpu_ids )
         return continue_hypercall_on_cpu(info->cpu, do_microcode_update, =
info);
=20
@@ -158,7 +158,7 @@ int microcode_update(XEN_GUEST_HANDLE(co
=20
     info->buffer_size =3D len;
     info->error =3D 0;
-    info->cpu =3D first_cpu(cpu_online_map);
+    info->cpu =3D cpumask_first(&cpu_online_map);
=20
     return continue_hypercall_on_cpu(info->cpu, do_microcode_update, =
info);
 }
--- a/xen/arch/x86/platform_hypercall.c
+++ b/xen/arch/x86/platform_hypercall.c
@@ -366,7 +366,7 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xe
             goto out;
         guest_from_compat_handle(idletimes, op->u.getidletime.idletime);
=20
-        for_each_cpu_mask ( cpu, *cpumap )
+        for_each_cpu ( cpu, cpumap )
         {
             if ( idle_vcpu[cpu] =3D=3D NULL )
                 cpumask_clear_cpu(cpu, cpumap);
@@ -460,7 +460,7 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xe
                 g_info->flags |=3D XEN_PCPU_FLAGS_ONLINE;
         }
=20
-        g_info->max_present =3D last_cpu(cpu_present_map);
+        g_info->max_present =3D cpumask_last(&cpu_present_map);
=20
         put_cpu_maps();
=20
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -229,9 +229,9 @@ static void __init normalise_cpu_order(v
          * Find remaining CPU with longest-prefix match on APIC ID.
          * Among identical longest-prefix matches, pick the smallest APIC =
ID.
          */
-        for ( j =3D next_cpu(i, cpu_present_map);
+        for ( j =3D cpumask_next(i, &cpu_present_map);
               j < nr_cpu_ids;
-              j =3D next_cpu(j, cpu_present_map) )
+              j =3D cpumask_next(j, &cpu_present_map) )
         {
             diff =3D x86_cpu_to_apicid[j] ^ apicid;
             while ( diff & (diff-1) )
@@ -248,12 +248,12 @@ static void __init normalise_cpu_order(v
         /* If no match then there must be no CPUs remaining to consider. =
*/
         if ( min_cpu >=3D nr_cpu_ids )
         {
-            BUG_ON(next_cpu(i, cpu_present_map) < nr_cpu_ids);
+            BUG_ON(cpumask_next(i, &cpu_present_map) < nr_cpu_ids);
             break;
         }
=20
         /* Switch the best-matching CPU with the next CPU in logical =
order. */
-        j =3D next_cpu(i, cpu_present_map);
+        j =3D cpumask_next(i, &cpu_present_map);
         apicid =3D x86_cpu_to_apicid[min_cpu];
         x86_cpu_to_apicid[min_cpu] =3D x86_cpu_to_apicid[j];
         x86_cpu_to_apicid[j] =3D apicid;
--- a/xen/arch/x86/smp.c
+++ b/xen/arch/x86/smp.c
@@ -182,7 +182,7 @@ void send_IPI_mask_phys(const cpumask_t=20
=20
     local_irq_save(flags);
=20
-    for_each_cpu_mask ( query_cpu, *mask )
+    for_each_cpu ( query_cpu, mask )
     {
         if ( !cpu_online(query_cpu) || (query_cpu =3D=3D smp_processor_id(=
)) )
             continue;
--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -248,7 +248,7 @@ static void set_cpu_sibling_map(int cpu)
=20
     if ( c[cpu].x86_num_siblings > 1 )
     {
-        for_each_cpu_mask ( i, cpu_sibling_setup_map )
+        for_each_cpu ( i, &cpu_sibling_setup_map )
         {
             if ( cpu_has(c, X86_FEATURE_TOPOEXT) ) {
                 if ( (c[cpu].phys_proc_id =3D=3D c[i].phys_proc_id) &&
@@ -273,7 +273,7 @@ static void set_cpu_sibling_map(int cpu)
         return;
     }
=20
-    for_each_cpu_mask ( i, cpu_sibling_setup_map )
+    for_each_cpu ( i, &cpu_sibling_setup_map )
     {
         if ( c[cpu].phys_proc_id =3D=3D c[i].phys_proc_id )
         {
@@ -814,7 +814,7 @@ remove_siblinginfo(int cpu)
     int sibling;
     struct cpuinfo_x86 *c =3D cpu_data;
=20
-    for_each_cpu_mask ( sibling, *per_cpu(cpu_core_mask, cpu) )
+    for_each_cpu ( sibling, per_cpu(cpu_core_mask, cpu) )
     {
         cpumask_clear_cpu(cpu, per_cpu(cpu_core_mask, sibling));
         /* Last thread sibling in this cpu core going down. */
@@ -822,7 +822,7 @@ remove_siblinginfo(int cpu)
             c[sibling].booted_cores--;
     }
   =20
-    for_each_cpu_mask(sibling, *per_cpu(cpu_sibling_mask, cpu))
+    for_each_cpu(sibling, per_cpu(cpu_sibling_mask, cpu))
         cpumask_clear_cpu(cpu, per_cpu(cpu_sibling_mask, sibling));
     cpumask_clear(per_cpu(cpu_sibling_mask, cpu));
     cpumask_clear(per_cpu(cpu_core_mask, cpu));
--- a/xen/arch/x86/sysctl.c
+++ b/xen/arch/x86/sysctl.c
@@ -103,7 +103,7 @@ long arch_do_sysctl(
         uint32_t i, max_cpu_index, last_online_cpu;
         xen_sysctl_topologyinfo_t *ti =3D &sysctl->u.topologyinfo;
=20
-        last_online_cpu =3D last_cpu(cpu_online_map);
+        last_online_cpu =3D cpumask_last(&cpu_online_map);
         max_cpu_index =3D min_t(uint32_t, ti->max_cpu_index, last_online_c=
pu);
         ti->max_cpu_index =3D last_online_cpu;
=20
--- a/xen/common/cpu.c
+++ b/xen/common/cpu.c
@@ -205,7 +205,7 @@ void enable_nonboot_cpus(void)
=20
     printk("Enabling non-boot CPUs  ...\n");
=20
-    for_each_cpu_mask ( cpu, frozen_cpus )
+    for_each_cpu ( cpu, &frozen_cpus )
     {
         if ( (error =3D cpu_up(cpu)) )
         {
--- a/xen/common/cpupool.c
+++ b/xen/common/cpupool.c
@@ -494,7 +494,7 @@ int cpupool_do_sysctl(struct xen_sysctl_
                         op->cpupool_id, cpu);
         spin_lock(&cpupool_lock);
         if ( cpu =3D=3D XEN_SYSCTL_CPUPOOL_PAR_ANY )
-            cpu =3D first_cpu(cpupool_free_cpus);
+            cpu =3D cpumask_first(&cpupool_free_cpus);
         ret =3D -EINVAL;
         if ( cpu >=3D nr_cpu_ids )
             goto addcpu_out;
--- a/xen/common/domctl.c
+++ b/xen/common/domctl.c
@@ -190,7 +190,7 @@ static unsigned int default_vcpu0_locati
     cpu =3D cpumask_first(&cpu_exclude_map);
     if ( cpumask_weight(&cpu_exclude_map) > 1 )
         cpu =3D cpumask_next(cpu, &cpu_exclude_map);
-    for_each_cpu_mask(i, *online)
+    for_each_cpu(i, online)
     {
         if ( cpumask_test_cpu(i, &cpu_exclude_map) )
             continue;
@@ -541,7 +541,7 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc
=20
             cpu =3D (i =3D=3D 0) ?
                 default_vcpu0_location(online) :
-                cycle_cpu(d->vcpu[i-1]->processor, *online);
+                cpumask_cycle(d->vcpu[i-1]->processor, online);
=20
             if ( alloc_vcpu(d, i, cpu) =3D=3D NULL )
                 goto maxvcpu_out;
--- a/xen/common/keyhandler.c
+++ b/xen/common/keyhandler.c
@@ -128,7 +128,7 @@ static void dump_registers(unsigned char
         return;
=20
     /* Normal handling: synchronously dump the remaining CPUs' states. */
-    for_each_cpu_mask ( cpu, dump_execstate_mask )
+    for_each_cpu ( cpu, &dump_execstate_mask )
     {
         smp_send_state_dump(cpu);
         while ( cpumask_test_cpu(cpu, &dump_execstate_mask) )
--- a/xen/common/perfc.c
+++ b/xen/common/perfc.c
@@ -211,14 +211,14 @@ static int perfc_copy_info(XEN_GUEST_HAN
         {
         case TYPE_SINGLE:
         case TYPE_S_SINGLE:
-            for_each_cpu_mask ( cpu, perfc_cpumap )
+            for_each_cpu ( cpu, &perfc_cpumap )
                 perfc_vals[v++] =3D per_cpu(perfcounters, cpu)[j];
             ++j;
             break;
         case TYPE_ARRAY:
         case TYPE_S_ARRAY:
             memset(perfc_vals + v, 0, perfc_d[i].nr_vals * sizeof(*perfc_v=
als));
-            for_each_cpu_mask ( cpu, perfc_cpumap )
+            for_each_cpu ( cpu, &perfc_cpumap )
             {
                 perfc_t *counters =3D per_cpu(perfcounters, cpu) + j;
                 unsigned int k;
--- a/xen/common/sched_credit2.c
+++ b/xen/common/sched_credit2.c
@@ -521,7 +521,7 @@ runq_tickle(const struct scheduler *ops,
     cpumask_andnot(&mask, &rqd->active, &rqd->idle);
     cpumask_andnot(&mask, &mask, &rqd->tickled);
=20
-    for_each_cpu_mask(i, mask)
+    for_each_cpu(i, &mask)
     {
         struct csched_vcpu * cur;
=20
@@ -1051,7 +1051,7 @@ choose_cpu(const struct scheduler *ops,=20
         else
         {
             d2printk("d%dv%d +\n", svc->vcpu->domain->domain_id, =
svc->vcpu->vcpu_id);
-            new_cpu =3D first_cpu(svc->migrate_rqd->active);
+            new_cpu =3D cpumask_first(&svc->migrate_rqd->active);
             goto out_up;
         }
     }
@@ -1061,7 +1061,7 @@ choose_cpu(const struct scheduler *ops,=20
     min_avgload =3D MAX_LOAD;
=20
     /* Find the runqueue with the lowest instantaneous load */
-    for_each_cpu_mask(i, prv->active_queues)
+    for_each_cpu(i, &prv->active_queues)
     {
         struct csched_runqueue_data *rqd;
         s_time_t rqd_avgload;
@@ -1099,7 +1099,7 @@ choose_cpu(const struct scheduler *ops,=20
     else
     {
         BUG_ON(cpumask_empty(&prv->rqd[min_rqi].active));
-        new_cpu =3D first_cpu(prv->rqd[min_rqi].active);
+        new_cpu =3D cpumask_first(&prv->rqd[min_rqi].active);
     }
=20
 out_up:
@@ -1179,7 +1179,7 @@ void migrate(const struct scheduler *ops
             on_runq=3D1;
         }
         __runq_deassign(svc);
-        svc->vcpu->processor =3D first_cpu(trqd->active);
+        svc->vcpu->processor =3D cpumask_first(&trqd->active);
         __runq_assign(svc, trqd);
         if ( on_runq )
         {
@@ -1219,7 +1219,7 @@ retry:
=20
     st.load_delta =3D 0;
=20
-    for_each_cpu_mask(i, prv->active_queues)
+    for_each_cpu(i, &prv->active_queues)
     {
         s_time_t delta;
        =20
@@ -1618,7 +1618,7 @@ csched_schedule(
         {
             int rq;
             other_rqi =3D -2;
-            for_each_cpu_mask ( rq, CSCHED_PRIV(ops)->active_queues )
+            for_each_cpu ( rq, &CSCHED_PRIV(ops)->active_queues )
             {
                 if ( scurr->rqd =3D=3D &CSCHED_PRIV(ops)->rqd[rq] )
                 {
@@ -1803,7 +1803,7 @@ csched_dump(const struct scheduler *ops)
            "\tdefault-weight     =3D %d\n",
            cpumask_weight(&prv->active_queues),
            CSCHED_DEFAULT_WEIGHT);
-    for_each_cpu_mask(i, prv->active_queues)
+    for_each_cpu(i, &prv->active_queues)
     {
         s_time_t fraction;
        =20
--- a/xen/common/sched_sedf.c
+++ b/xen/common/sched_sedf.c
@@ -442,7 +442,7 @@ static int sedf_pick_cpu(const struct sc
=20
     online =3D SEDF_CPUONLINE(v->domain->cpupool);
     cpumask_and(&online_affinity, v->cpu_affinity, online);
-    return first_cpu(online_affinity);
+    return cpumask_first(&online_affinity);
 }
=20
 /*
@@ -1322,7 +1322,7 @@ static int sedf_adjust_weights(struct cp
 {
     struct vcpu *p;
     struct domain      *d;
-    unsigned int        cpu, nr_cpus =3D last_cpu(cpu_online_map) + 1;
+    unsigned int        cpu, nr_cpus =3D cpumask_last(&cpu_online_map) + =
1;
     int                *sumw =3D xzalloc_array(int, nr_cpus);
     s_time_t           *sumt =3D xzalloc_array(s_time_t, nr_cpus);
=20
--- a/xen/common/schedule.c
+++ b/xen/common/schedule.c
@@ -1450,7 +1450,7 @@ void schedule_dump(struct cpupool *c)
     printk("Scheduler: %s (%s)\n", sched->name, sched->opt_name);
     SCHED_OP(sched, dump_settings);
=20
-    for_each_cpu_mask (i, *cpus)
+    for_each_cpu (i, cpus)
     {
         pcpu_schedule_lock(i);
         printk("CPU[%02d] ", i);
--- a/xen/common/softirq.c
+++ b/xen/common/softirq.c
@@ -74,7 +74,7 @@ void cpumask_raise_softirq(const cpumask
     cpumask_t send_mask;
=20
     cpumask_clear(&send_mask);
-    for_each_cpu_mask(cpu, *mask)
+    for_each_cpu(cpu, mask)
         if ( !test_and_set_bit(nr, &softirq_pending(cpu)) )
             cpumask_set_cpu(cpu, &send_mask);
=20
--- a/xen/common/stop_machine.c
+++ b/xen/common/stop_machine.c
@@ -101,7 +101,7 @@ int stop_machine_run(int (*fn)(void *),=20
=20
     smp_wmb();
=20
-    for_each_cpu_mask ( i, allbutself )
+    for_each_cpu ( i, &allbutself )
         tasklet_schedule_on_cpu(&per_cpu(stopmachine_tasklet, i), i);
=20
     stopmachine_set_state(STOPMACHINE_PREPARE);
--- a/xen/common/timer.c
+++ b/xen/common/timer.c
@@ -548,7 +548,7 @@ static struct keyhandler dump_timerq_key
=20
 static void migrate_timers_from_cpu(unsigned int old_cpu)
 {
-    unsigned int new_cpu =3D first_cpu(cpu_online_map);
+    unsigned int new_cpu =3D cpumask_any(&cpu_online_map);
     struct timers *old_ts, *new_ts;
     struct timer *t;
     bool_t notify =3D 0;
--- a/xen/drivers/acpi/pmstat.c
+++ b/xen/drivers/acpi/pmstat.c
@@ -223,7 +223,7 @@ static int get_cpufreq_para(struct xen_s
=20
     if ( !(affected_cpus =3D xzalloc_array(uint32_t, op->u.get_para.cpu_nu=
m)) )
         return -ENOMEM;
-    for_each_cpu_mask(cpu, *policy->cpus)
+    for_each_cpu(cpu, policy->cpus)
         affected_cpus[j++] =3D cpu;
     ret =3D copy_to_guest(op->u.get_para.affected_cpus,
                        affected_cpus, op->u.get_para.cpu_num);
--- a/xen/drivers/cpufreq/cpufreq_ondemand.c
+++ b/xen/drivers/cpufreq/cpufreq_ondemand.c
@@ -122,7 +122,7 @@ static void dbs_check_cpu(struct cpu_dbs
         return;
=20
     /* Get Idle Time */
-    for_each_cpu_mask(j, *policy->cpus) {
+    for_each_cpu(j, policy->cpus) {
         uint64_t idle_ns, total_idle_ns;
         uint64_t load, load_freq, freq_avg;
         struct cpu_dbs_info_s *j_dbs_info;
@@ -233,7 +233,7 @@ int cpufreq_governor_dbs(struct cpufreq_
=20
         dbs_enable++;
=20
-        for_each_cpu_mask(j, *policy->cpus) {
+        for_each_cpu(j, policy->cpus) {
             struct cpu_dbs_info_s *j_dbs_info;
             j_dbs_info =3D &per_cpu(cpu_dbs_info, j);
             j_dbs_info->cur_policy =3D policy;
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -1033,7 +1033,7 @@ static void dma_msi_set_affinity(struct=20
     msg.address_lo =3D (MSI_ADDRESS_HEADER << (MSI_ADDRESS_HEADER_SHIFT + =
8));
     msg.address_lo |=3D MSI_PHYSICAL_MODE << 2;
     msg.address_lo |=3D MSI_REDIRECTION_HINT_MODE << 3;
-    dest =3D cpu_physical_id(first_cpu(mask));
+    dest =3D cpu_physical_id(cpumask_first(mask));
     msg.address_lo |=3D dest << MSI_TARGET_CPU_SHIFT;
 #endif
=20
--- a/xen/include/asm-ia64/linux-xen/asm/acpi.h
+++ b/xen/include/asm-ia64/linux-xen/asm/acpi.h
@@ -139,7 +139,7 @@ extern int __initdata nid_to_pxm_map[MAX
 #ifdef CONFIG_ACPI_NUMA
 extern cpumask_t early_cpu_possible_map;
 #define for_each_possible_early_cpu(cpu)  \
-	for_each_cpu_mask((cpu), early_cpu_possible_map)
+	for_each_cpu(cpu, &early_cpu_possible_map)
=20
 static inline void per_cpu_scan_finalize(int min_cpus, int reserve_cpus)
 {
--- a/xen/include/asm-x86/flushtlb.h
+++ b/xen/include/asm-x86/flushtlb.h
@@ -52,7 +52,7 @@ static inline int NEED_FLUSH(u32 cpu_sta
 #define tlbflush_filter(mask, page_timestamp)                           \
 do {                                                                    \
     unsigned int cpu;                                                   \
-    for_each_cpu_mask ( cpu, mask )                                     \
+    for_each_cpu ( cpu, &(mask) )                                       \
         if ( !NEED_FLUSH(per_cpu(tlbflush_time, cpu), page_timestamp) ) \
             cpumask_clear_cpu(cpu, &(mask));                            \
 } while ( 0 )
--- a/xen/include/xen/cpumask.h
+++ b/xen/include/xen/cpumask.h
@@ -37,18 +37,19 @@
  * void cpumask_shift_right(dst, src, n) Shift right
  * void cpumask_shift_left(dst, src, n)	Shift left
  *
- * int first_cpu(mask)			Number lowest set bit, or NR_CPUS
- * int next_cpu(cpu, mask)		Next cpu past 'cpu', or NR_CPUS
- * int last_cpu(mask)			Number highest set bit, or NR_CPUS
- * int cycle_cpu(cpu, mask)		Next cpu cycling from 'cpu', or =
NR_CPUS
+ * int cpumask_first(mask)		Number lowest set bit, or NR_CPUS
+ * int cpumask_next(cpu, mask)		Next cpu past 'cpu', or NR_CPUS
+ * int cpumask_last(mask)		Number highest set bit, or NR_CPUS
+ * int cpumask_any(mask)		Any cpu in mask, or NR_CPUS
+ * int cpumask_cycle(cpu, mask)		Next cpu cycling from =
'cpu', or NR_CPUS
  *
- * cpumask_t cpumask_of_cpu(cpu)	Return cpumask with bit 'cpu' set
+ * const cpumask_t *cpumask_of(cpu)	Return cpumask with bit 'cpu' set
  * unsigned long *cpumask_bits(mask)	Array of unsigned long's in mask
  *
  * int cpumask_scnprintf(buf, len, mask) Format cpumask for printing
  * int cpulist_scnprintf(buf, len, mask) Format cpumask as list for =
printing
  *
- * for_each_cpu_mask(cpu, mask)		for-loop cpu over mask
+ * for_each_cpu(cpu, mask)		for-loop cpu over mask
  *
  * int num_online_cpus()		Number of online CPUs
  * int num_possible_cpus()		Number of all possible CPUs
@@ -210,42 +211,43 @@ static inline void cpumask_shift_left(cp
 	bitmap_shift_left(dstp->bits, srcp->bits, n, nr_cpumask_bits);
 }
=20
-#define cpumask_first(src) __first_cpu(src, nr_cpu_ids)
-#define first_cpu(src) __first_cpu(&(src), nr_cpu_ids)
-static inline int __first_cpu(const cpumask_t *srcp, int nbits)
+static inline int cpumask_first(const cpumask_t *srcp)
 {
-	return min_t(int, nbits, find_first_bit(srcp->bits, nbits));
+	return min_t(int, nr_cpu_ids, find_first_bit(srcp->bits, nr_cpu_ids=
));
 }
=20
-#define cpumask_next(n, src) __next_cpu(n, src, nr_cpu_ids)
-#define next_cpu(n, src) __next_cpu((n), &(src), nr_cpu_ids)
-static inline int __next_cpu(int n, const cpumask_t *srcp, int nbits)
+static inline int cpumask_next(int n, const cpumask_t *srcp)
 {
-	return min_t(int, nbits, find_next_bit(srcp->bits, nbits, n+1));
+	/* -1 is a legal arg here. */
+	if (n !=3D -1)
+		cpumask_check(n);
+
+	return min_t(int, nr_cpu_ids,
+                     find_next_bit(srcp->bits, nr_cpu_ids, n + 1));
 }
=20
-#define cpumask_last(src) __last_cpu(src, nr_cpu_ids)
-#define last_cpu(src) __last_cpu(&(src), nr_cpu_ids)
-static inline int __last_cpu(const cpumask_t *srcp, int nbits)
+static inline int cpumask_last(const cpumask_t *srcp)
 {
-	int cpu, pcpu =3D nbits;
-	for (cpu =3D __first_cpu(srcp, nbits);
-	     cpu < nbits;
-	     cpu =3D __next_cpu(cpu, srcp, nbits))
+	int cpu, pcpu =3D nr_cpu_ids;
+
+	for (cpu =3D cpumask_first(srcp);
+	     cpu < nr_cpu_ids;
+	     cpu =3D cpumask_next(cpu, srcp))
 		pcpu =3D cpu;
 	return pcpu;
 }
=20
-#define cpumask_cycle(n, src) __cycle_cpu(n, src, nr_cpu_ids)
-#define cycle_cpu(n, src) __cycle_cpu((n), &(src), nr_cpu_ids)
-static inline int __cycle_cpu(int n, const cpumask_t *srcp, int nbits)
-{
-    int nxt =3D __next_cpu(n, srcp, nbits);
-    if (nxt =3D=3D nbits)
-        nxt =3D __first_cpu(srcp, nbits);
+static inline int cpumask_cycle(int n, const cpumask_t *srcp)
+{
+    int nxt =3D cpumask_next(n, srcp);
+
+    if (nxt =3D=3D nr_cpu_ids)
+        nxt =3D cpumask_first(srcp);
     return nxt;
 }
=20
+#define cpumask_any(srcp) cpumask_first(srcp)
+
 /*
  * Special-case data structure for "single bit set only" constant CPU =
masks.
  *
@@ -262,8 +264,6 @@ static inline const cpumask_t *cpumask_o
 	return (const cpumask_t *)(p - cpu / BITS_PER_LONG);
 }
=20
-#define cpumask_of_cpu(cpu) (*cpumask_of(cpu))
-
 #if defined(__ia64__) /* XXX needs cleanup */
 #define CPU_MASK_LAST_WORD BITMAP_LAST_WORD_MASK(NR_CPUS)
=20
@@ -366,12 +366,13 @@ static inline void free_cpumask_var(cpum
 #endif
=20
 #if NR_CPUS > 1
-#define for_each_cpu_mask(cpu, mask)		\
-	for ((cpu) =3D first_cpu(mask);		\
-		(cpu) < nr_cpu_ids;		\
-		(cpu) =3D next_cpu((cpu), (mask)))
+#define for_each_cpu(cpu, mask)			\
+	for ((cpu) =3D cpumask_first(mask);	\
+	     (cpu) < nr_cpu_ids;		\
+	     (cpu) =3D cpumask_next(cpu, mask))
 #else /* NR_CPUS =3D=3D 1 */
-#define for_each_cpu_mask(cpu, mask) for ((cpu) =3D 0; (cpu) < 1; =
(cpu)++)
+#define for_each_cpu(cpu, mask)			\
+	for ((cpu) =3D 0; (cpu) < 1; (cpu)++, (void)(mask))
 #endif /* NR_CPUS */
=20
 /*
@@ -458,18 +459,9 @@ extern cpumask_t cpu_present_map;
     ((present) ? cpumask_set_cpu(cpu, &cpu_present_map) \
                : cpumask_clear_cpu(cpu, &cpu_present_map))
=20
-#define any_online_cpu(mask)			\
-({						\
-	int cpu;				\
-	for_each_cpu_mask(cpu, (mask))		\
-		if (cpu_online(cpu))		\
-			break;			\
-	cpu;					\
-})
-
-#define for_each_possible_cpu(cpu) for_each_cpu_mask((cpu), cpu_possible_m=
ap)
-#define for_each_online_cpu(cpu)   for_each_cpu_mask((cpu), cpu_online_map=
)
-#define for_each_present_cpu(cpu)  for_each_cpu_mask((cpu), cpu_present_ma=
p)
+#define for_each_possible_cpu(cpu) for_each_cpu(cpu, &cpu_possible_map)
+#define for_each_online_cpu(cpu)   for_each_cpu(cpu, &cpu_online_map)
+#define for_each_present_cpu(cpu)  for_each_cpu(cpu, &cpu_present_map)
=20
 /* Copy to/from cpumap provided by control tools. */
 struct xenctl_cpumap;



--=__PartC5EA31FF.0__=
Content-Type: text/plain; name="eliminate-first_cpu-etc.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="eliminate-first_cpu-etc.patch"

eliminate first_cpu() etc=0A=0AThis includes the conversion from for_each_c=
pu_mask() to for_each-cpu().=0A=0ASigned-off-by: Jan Beulich <jbeulich@suse=
.com>=0A=0A--- a/xen/arch/ia64/linux-xen/iosapic.c=0A+++ b/xen/arch/ia64/li=
nux-xen/iosapic.c=0A@@ -704,7 +704,7 @@ get_target_cpu (unsigned int gsi, =
int ve=0A =0A 		cpu_mask =3D node_to_cpumask(iosapic_lists[iosapic_=
index].node);=0A =0A-		for_each_cpu_mask(numa_cpu, cpu_mask) =
{=0A+		for_each_cpu(numa_cpu, &cpu_mask) {=0A 			if =
(!cpu_online(numa_cpu))=0A 				cpumask_clear_cpu(n=
uma_cpu, &cpu_mask);=0A 		}=0A@@ -717,8 +717,8 @@ get_target_=
cpu (unsigned int gsi, int ve=0A 		/* Use vector assigment to =
distribute across cpus in node */=0A 		cpu_index =3D vector % =
num_cpus;=0A =0A-		for (numa_cpu =3D first_cpu(cpu_mask) ; i =
< cpu_index ; i++)=0A-			numa_cpu =3D next_cpu(numa_cpu, =
cpu_mask);=0A+		for (numa_cpu =3D cpumask_first(&cpu_mask) ; i < =
cpu_index ; i++)=0A+			numa_cpu =3D cpumask_next(numa_cpu,=
 &cpu_mask);=0A =0A 		if (numa_cpu !=3D NR_CPUS)=0A 			=
return cpu_physical_id(numa_cpu);=0A--- a/xen/arch/ia64/linux-xen/mca.c=0A+=
++ b/xen/arch/ia64/linux-xen/mca.c=0A@@ -1415,7 +1415,7 @@ ia64_mca_cmc_pol=
l (void *dummy)=0A #endif=0A {=0A 	/* Trigger a CMC interrupt cascade =
 */=0A-	platform_send_ipi(first_cpu(cpu_online_map), IA64_CMCP_VECTOR, =
IA64_IPI_DM_INT, 0);=0A+	platform_send_ipi(cpumask_first(&cpu_online=
_map), IA64_CMCP_VECTOR, IA64_IPI_DM_INT, 0);=0A }=0A =0A /*=0A@@ -1505,7 =
+1505,7 @@ ia64_mca_cpe_poll (void *dummy)=0A #endif=0A {=0A 	/* Trigger =
a CPE interrupt cascade  */=0A-	platform_send_ipi(first_cpu(cpu_online_map)=
, IA64_CPEP_VECTOR, IA64_IPI_DM_INT, 0);=0A+	platform_send_ipi(cpumask_f=
irst(&cpu_online_map), IA64_CPEP_VECTOR, IA64_IPI_DM_INT, 0);=0A }=0A =0A =
#endif /* CONFIG_ACPI */=0A--- a/xen/arch/ia64/linux-xen/smp.c=0A+++ =
b/xen/arch/ia64/linux-xen/smp.c=0A@@ -462,7 +462,7 @@ on_selected_cpus(cons=
t cpumask_t *select=0A 	call_data =3D &data;=0A 	wmb();=0A =0A-	=
for_each_cpu_mask(cpu, *selected)=0A+	for_each_cpu(cpu, selected)=0A 		=
send_IPI_single(cpu, IPI_CALL_FUNC);=0A =0A 	while (atomic_read(wait ? =
&data.finished : &data.started) !=3D nr_cpus)=0A--- a/xen/arch/ia64/linux-x=
en/smpboot.c=0A+++ b/xen/arch/ia64/linux-xen/smpboot.c=0A@@ -687,9 +687,9 =
@@ clear_cpu_sibling_map(int cpu)=0A {=0A 	int i;=0A =0A-	for_each_cp=
u_mask(i, *per_cpu(cpu_sibling_mask, cpu))=0A+	for_each_cpu(i, per_cpu(cpu=
_sibling_mask, cpu))=0A 		cpumask_clear_cpu(cpu, per_cpu(cpu_=
sibling_mask, i));=0A-	for_each_cpu_mask(i, *per_cpu(cpu_core_mask, =
cpu))=0A+	for_each_cpu(i, per_cpu(cpu_core_mask, cpu))=0A 		=
cpumask_clear_cpu(cpu, per_cpu(cpu_core_mask, i));=0A =0A 	cpumask_cle=
ar(per_cpu(cpu_sibling_mask, cpu));=0A--- a/xen/arch/ia64/vmx/vacpi.c=0A+++=
 b/xen/arch/ia64/vmx/vacpi.c=0A@@ -191,7 +191,7 @@ void vacpi_init(struct =
domain *d)=0A 	s->last_gtime =3D NOW();=0A =0A 	/* Set up callback =
to fire SCIs when the MSB of TMR_VAL changes */=0A-	init_timer(&s->time=
r, pmt_timer_callback, d, first_cpu(cpu_online_map));=0A+	init_timer(=
&s->timer, pmt_timer_callback, d, cpumask_first(&cpu_online_map));=0A 	=
pmt_timer_callback(d);=0A }=0A =0A--- a/xen/arch/ia64/xen/dom0_ops.c=0A+++ =
b/xen/arch/ia64/xen/dom0_ops.c=0A@@ -618,7 +618,7 @@ long arch_do_sysctl(xe=
n_sysctl_t *op, XE=0A         XEN_GUEST_HANDLE_64(uint32) arr;=0A         =
uint32_t i, val, max_array_ent =3D ti->max_cpu_index;=0A =0A-        =
ti->max_cpu_index =3D last_cpu(cpu_online_map);=0A+        ti->max_cpu_inde=
x =3D cpumask_last(&cpu_online_map);=0A         max_array_ent =3D =
min(max_array_ent, ti->max_cpu_index);=0A =0A         arr =3D ti->cpu_to_co=
re;=0A--- a/xen/arch/ia64/xen/domain.c=0A+++ b/xen/arch/ia64/xen/domain.c=
=0A@@ -501,7 +501,7 @@ int vcpu_initialise(struct vcpu *v)=0A =0A 	if =
(!VMX_DOMAIN(v))=0A 		init_timer(&v->arch.hlt_timer, hlt_timer_fn=
, v,=0A-		           first_cpu(cpu_online_map));=0A+		=
           cpumask_any(&cpu_online_map));=0A =0A 	return 0;=0A =
}=0A--- a/xen/arch/ia64/xen/vhpt.c=0A+++ b/xen/arch/ia64/xen/vhpt.c=0A@@ =
-463,7 +463,7 @@ __domain_flush_vtlb_track_entry(struct d=0A 			=
	local_purge =3D 0;=0A 		}=0A 	} else {=0A-		=
for_each_cpu_mask(cpu, entry->pcpu_dirty_mask) {=0A+		for_each_cp=
u(cpu, &entry->pcpu_dirty_mask) {=0A 			/* Invalidate VHPT =
entries.  */=0A 			cpu_flush_vhpt_range(cpu, vaddr, =
1L << ps);=0A =0A@@ -559,7 +559,7 @@ void flush_tlb_mask(const cpumask_t =
*mas=0A     if (cpumask_subset(mask, cpumask_of(cpu)))=0A         =
return;=0A =0A-    for_each_cpu_mask (cpu, *mask)=0A+    for_each_cpu =
(cpu, mask)=0A         if (cpu !=3D smp_processor_id())=0A             =
smp_call_function_single=0A                 (cpu, (void (*)(void *))flush_t=
lb_vhpt_all, NULL, 1);=0A--- a/xen/arch/x86/acpi/cpu_idle.c=0A+++ =
b/xen/arch/x86/acpi/cpu_idle.c=0A@@ -251,7 +251,7 @@ void cpuidle_wakeup_mw=
ait(cpumask_t *mas=0A     cpumask_and(&target, mask, &cpuidle_mwait_flags);=
=0A =0A     /* CPU is MWAITing on the cpuidle_mwait_wakeup flag. */=0A-    =
for_each_cpu_mask(cpu, target)=0A+    for_each_cpu(cpu, &target)=0A        =
 mwait_wakeup(cpu) =3D 0;=0A =0A     cpumask_andnot(mask, mask, =
&target);=0A--- a/xen/arch/x86/acpi/cpufreq/cpufreq.c=0A+++ b/xen/arch/x86/=
acpi/cpufreq/cpufreq.c=0A@@ -487,7 +487,7 @@ static int acpi_cpufreq_target=
(struct cp=0A         return -EAGAIN;=0A     }=0A =0A-    for_each_cpu_mask=
(j, online_policy_cpus)=0A+    for_each_cpu(j, &online_policy_cpus)=0A     =
    cpufreq_statistic_update(j, perf->state, next_perf_state);=0A =0A     =
perf->state =3D next_perf_state;=0A--- a/xen/arch/x86/acpi/cpufreq/powernow=
.c=0A+++ b/xen/arch/x86/acpi/cpufreq/powernow.c=0A@@ -130,7 +130,7 @@ =
static int powernow_cpufreq_target(struc=0A =0A     on_selected_cpus(cmd.ma=
sk, transition_pstate, &cmd, 1);=0A =0A-    for_each_cpu_mask(j, online_pol=
icy_cpus)=0A+    for_each_cpu(j, &online_policy_cpus)=0A         cpufreq_st=
atistic_update(j, perf->state, next_perf_state);=0A =0A     perf->state =
=3D next_perf_state;=0A--- a/xen/arch/x86/genapic/x2apic.c=0A+++ b/xen/arch=
/x86/genapic/x2apic.c=0A@@ -72,7 +72,7 @@ static void __send_IPI_mask_x2api=
c(=0A =0A     local_irq_save(flags);=0A =0A-    for_each_cpu_mask ( cpu, =
*cpumask )=0A+    for_each_cpu ( cpu, cpumask )=0A     {=0A         if ( =
!cpu_online(cpu) || (cpu =3D=3D smp_processor_id()) )=0A             =
continue;=0A--- a/xen/arch/x86/hpet.c=0A+++ b/xen/arch/x86/hpet.c=0A@@ =
-182,7 +182,7 @@ again:=0A     now =3D NOW();=0A =0A     /* find all =
expired events */=0A-    for_each_cpu_mask(cpu, *ch->cpumask)=0A+    =
for_each_cpu(cpu, ch->cpumask)=0A     {=0A         s_time_t deadline;=0A =
=0A--- a/xen/arch/x86/irq.c=0A+++ b/xen/arch/x86/irq.c=0A@@ -125,7 +125,7 =
@@ static int __init __bind_irq_vector(int =0A     if ( desc->arch.vector =
!=3D IRQ_VECTOR_UNASSIGNED )=0A         return -EBUSY;=0A     trace_irq_mas=
k(TRC_HW_IRQ_BIND_VECTOR, irq, vector, &online_mask);=0A-    for_each_cpu_m=
ask(cpu, online_mask)=0A+    for_each_cpu(cpu, &online_mask)=0A         =
per_cpu(vector_irq, cpu)[vector] =3D irq;=0A     desc->arch.vector =3D =
vector;=0A     cpumask_copy(desc->arch.cpu_mask, &online_mask);=0A@@ =
-223,7 +223,7 @@ static void __clear_irq_vector(int irq)=0A     vector =3D =
desc->arch.vector;=0A     cpumask_and(&tmp_mask, desc->arch.cpu_mask, =
&cpu_online_map);=0A =0A-    for_each_cpu_mask(cpu, tmp_mask) {=0A+    =
for_each_cpu(cpu, &tmp_mask) {=0A         ASSERT( per_cpu(vector_irq, =
cpu)[vector] =3D=3D irq );=0A         per_cpu(vector_irq, cpu)[vector] =3D =
-1;=0A     }=0A@@ -248,7 +248,7 @@ static void __clear_irq_vector(int =
irq)=0A     old_vector =3D desc->arch.old_vector;=0A     cpumask_and(&tmp_m=
ask, desc->arch.old_cpu_mask, &cpu_online_map);=0A =0A-    for_each_cpu_mas=
k(cpu, tmp_mask) {=0A+    for_each_cpu(cpu, &tmp_mask) {=0A         =
ASSERT( per_cpu(vector_irq, cpu)[old_vector] =3D=3D irq );=0A         =
TRACE_3D(TRC_HW_IRQ_MOVE_FINISH, irq, old_vector, cpu);=0A         =
per_cpu(vector_irq, cpu)[old_vector] =3D -1;=0A@@ -455,7 +455,7 @@ static =
int __assign_irq_vector(=0A     else=0A         irq_used_vectors =3D =
irq_get_used_vector_mask(irq);=0A =0A-    for_each_cpu_mask(cpu, *mask) =
{=0A+    for_each_cpu(cpu, mask) {=0A         int new_cpu;=0A         int =
vector, offset;=0A =0A@@ -485,7 +485,7 @@ next:=0A             && =
test_bit(vector, irq_used_vectors) )=0A             goto next;=0A =0A-     =
   for_each_cpu_mask(new_cpu, tmp_mask)=0A+        for_each_cpu(new_cpu, =
&tmp_mask)=0A             if (per_cpu(vector_irq, new_cpu)[vector] !=3D =
-1)=0A                 goto next;=0A         /* Found one! */=0A@@ -497,7 =
+497,7 @@ next:=0A             desc->arch.old_vector =3D desc->arch.vector;=
=0A         }=0A         trace_irq_mask(TRC_HW_IRQ_ASSIGN_VECTOR, irq, =
vector, &tmp_mask);=0A-        for_each_cpu_mask(new_cpu, tmp_mask)=0A+    =
    for_each_cpu(new_cpu, &tmp_mask)=0A             per_cpu(vector_irq, =
new_cpu)[vector] =3D irq;=0A         desc->arch.vector =3D vector;=0A      =
   cpumask_copy(desc->arch.cpu_mask, &tmp_mask);=0A--- a/xen/arch/x86/micro=
code.c=0A+++ b/xen/arch/x86/microcode.c=0A@@ -125,7 +125,7 @@ static long =
do_microcode_update(void *_i=0A     if ( error )=0A         info->error =
=3D error;=0A =0A-    info->cpu =3D next_cpu(info->cpu, cpu_online_map);=0A=
+    info->cpu =3D cpumask_next(info->cpu, &cpu_online_map);=0A     if ( =
info->cpu < nr_cpu_ids )=0A         return continue_hypercall_on_cpu(info->=
cpu, do_microcode_update, info);=0A =0A@@ -158,7 +158,7 @@ int microcode_up=
date(XEN_GUEST_HANDLE(co=0A =0A     info->buffer_size =3D len;=0A     =
info->error =3D 0;=0A-    info->cpu =3D first_cpu(cpu_online_map);=0A+    =
info->cpu =3D cpumask_first(&cpu_online_map);=0A =0A     return continue_hy=
percall_on_cpu(info->cpu, do_microcode_update, info);=0A }=0A--- a/xen/arch=
/x86/platform_hypercall.c=0A+++ b/xen/arch/x86/platform_hypercall.c=0A@@ =
-366,7 +366,7 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xe=0A             =
goto out;=0A         guest_from_compat_handle(idletimes, op->u.getidletime.=
idletime);=0A =0A-        for_each_cpu_mask ( cpu, *cpumap )=0A+        =
for_each_cpu ( cpu, cpumap )=0A         {=0A             if ( idle_vcpu[cpu=
] =3D=3D NULL )=0A                 cpumask_clear_cpu(cpu, cpumap);=0A@@ =
-460,7 +460,7 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xe=0A               =
  g_info->flags |=3D XEN_PCPU_FLAGS_ONLINE;=0A         }=0A =0A-        =
g_info->max_present =3D last_cpu(cpu_present_map);=0A+        g_info->max_p=
resent =3D cpumask_last(&cpu_present_map);=0A =0A         put_cpu_maps();=
=0A =0A--- a/xen/arch/x86/setup.c=0A+++ b/xen/arch/x86/setup.c=0A@@ -229,9 =
+229,9 @@ static void __init normalise_cpu_order(v=0A          * Find =
remaining CPU with longest-prefix match on APIC ID.=0A          * Among =
identical longest-prefix matches, pick the smallest APIC ID.=0A          =
*/=0A-        for ( j =3D next_cpu(i, cpu_present_map);=0A+        for ( j =
=3D cpumask_next(i, &cpu_present_map);=0A               j < nr_cpu_ids;=0A-=
              j =3D next_cpu(j, cpu_present_map) )=0A+              j =3D =
cpumask_next(j, &cpu_present_map) )=0A         {=0A             diff =3D =
x86_cpu_to_apicid[j] ^ apicid;=0A             while ( diff & (diff-1) =
)=0A@@ -248,12 +248,12 @@ static void __init normalise_cpu_order(v=0A      =
   /* If no match then there must be no CPUs remaining to consider. */=0A  =
       if ( min_cpu >=3D nr_cpu_ids )=0A         {=0A-            =
BUG_ON(next_cpu(i, cpu_present_map) < nr_cpu_ids);=0A+            =
BUG_ON(cpumask_next(i, &cpu_present_map) < nr_cpu_ids);=0A             =
break;=0A         }=0A =0A         /* Switch the best-matching CPU with =
the next CPU in logical order. */=0A-        j =3D next_cpu(i, cpu_present_=
map);=0A+        j =3D cpumask_next(i, &cpu_present_map);=0A         =
apicid =3D x86_cpu_to_apicid[min_cpu];=0A         x86_cpu_to_apicid[min_cpu=
] =3D x86_cpu_to_apicid[j];=0A         x86_cpu_to_apicid[j] =3D apicid;=0A-=
-- a/xen/arch/x86/smp.c=0A+++ b/xen/arch/x86/smp.c=0A@@ -182,7 +182,7 @@ =
void send_IPI_mask_phys(const cpumask_t =0A =0A     local_irq_save(flags);=
=0A =0A-    for_each_cpu_mask ( query_cpu, *mask )=0A+    for_each_cpu ( =
query_cpu, mask )=0A     {=0A         if ( !cpu_online(query_cpu) || =
(query_cpu =3D=3D smp_processor_id()) )=0A             continue;=0A--- =
a/xen/arch/x86/smpboot.c=0A+++ b/xen/arch/x86/smpboot.c=0A@@ -248,7 +248,7 =
@@ static void set_cpu_sibling_map(int cpu)=0A =0A     if ( c[cpu].x86_num_=
siblings > 1 )=0A     {=0A-        for_each_cpu_mask ( i, cpu_sibling_setup=
_map )=0A+        for_each_cpu ( i, &cpu_sibling_setup_map )=0A         =
{=0A             if ( cpu_has(c, X86_FEATURE_TOPOEXT) ) {=0A               =
  if ( (c[cpu].phys_proc_id =3D=3D c[i].phys_proc_id) &&=0A@@ -273,7 =
+273,7 @@ static void set_cpu_sibling_map(int cpu)=0A         return;=0A   =
  }=0A =0A-    for_each_cpu_mask ( i, cpu_sibling_setup_map )=0A+    =
for_each_cpu ( i, &cpu_sibling_setup_map )=0A     {=0A         if ( =
c[cpu].phys_proc_id =3D=3D c[i].phys_proc_id )=0A         {=0A@@ -814,7 =
+814,7 @@ remove_siblinginfo(int cpu)=0A     int sibling;=0A     struct =
cpuinfo_x86 *c =3D cpu_data;=0A =0A-    for_each_cpu_mask ( sibling, =
*per_cpu(cpu_core_mask, cpu) )=0A+    for_each_cpu ( sibling, per_cpu(cpu_c=
ore_mask, cpu) )=0A     {=0A         cpumask_clear_cpu(cpu, per_cpu(cpu_cor=
e_mask, sibling));=0A         /* Last thread sibling in this cpu core =
going down. */=0A@@ -822,7 +822,7 @@ remove_siblinginfo(int cpu)=0A        =
     c[sibling].booted_cores--;=0A     }=0A    =0A-    for_each_cpu_mask(si=
bling, *per_cpu(cpu_sibling_mask, cpu))=0A+    for_each_cpu(sibling, =
per_cpu(cpu_sibling_mask, cpu))=0A         cpumask_clear_cpu(cpu, =
per_cpu(cpu_sibling_mask, sibling));=0A     cpumask_clear(per_cpu(cpu_sibli=
ng_mask, cpu));=0A     cpumask_clear(per_cpu(cpu_core_mask, cpu));=0A--- =
a/xen/arch/x86/sysctl.c=0A+++ b/xen/arch/x86/sysctl.c=0A@@ -103,7 +103,7 =
@@ long arch_do_sysctl(=0A         uint32_t i, max_cpu_index, last_online_c=
pu;=0A         xen_sysctl_topologyinfo_t *ti =3D &sysctl->u.topologyinfo;=
=0A =0A-        last_online_cpu =3D last_cpu(cpu_online_map);=0A+        =
last_online_cpu =3D cpumask_last(&cpu_online_map);=0A         max_cpu_index=
 =3D min_t(uint32_t, ti->max_cpu_index, last_online_cpu);=0A         =
ti->max_cpu_index =3D last_online_cpu;=0A =0A--- a/xen/common/cpu.c=0A+++ =
b/xen/common/cpu.c=0A@@ -205,7 +205,7 @@ void enable_nonboot_cpus(void)=0A =
=0A     printk("Enabling non-boot CPUs  ...\n");=0A =0A-    for_each_cpu_ma=
sk ( cpu, frozen_cpus )=0A+    for_each_cpu ( cpu, &frozen_cpus )=0A     =
{=0A         if ( (error =3D cpu_up(cpu)) )=0A         {=0A--- a/xen/common=
/cpupool.c=0A+++ b/xen/common/cpupool.c=0A@@ -494,7 +494,7 @@ int =
cpupool_do_sysctl(struct xen_sysctl_=0A                         op->cpupool=
_id, cpu);=0A         spin_lock(&cpupool_lock);=0A         if ( cpu =3D=3D =
XEN_SYSCTL_CPUPOOL_PAR_ANY )=0A-            cpu =3D first_cpu(cpupool_free_=
cpus);=0A+            cpu =3D cpumask_first(&cpupool_free_cpus);=0A        =
 ret =3D -EINVAL;=0A         if ( cpu >=3D nr_cpu_ids )=0A             =
goto addcpu_out;=0A--- a/xen/common/domctl.c=0A+++ b/xen/common/domctl.c=0A=
@@ -190,7 +190,7 @@ static unsigned int default_vcpu0_locati=0A     cpu =
=3D cpumask_first(&cpu_exclude_map);=0A     if ( cpumask_weight(&cpu_exclud=
e_map) > 1 )=0A         cpu =3D cpumask_next(cpu, &cpu_exclude_map);=0A-   =
 for_each_cpu_mask(i, *online)=0A+    for_each_cpu(i, online)=0A     {=0A  =
       if ( cpumask_test_cpu(i, &cpu_exclude_map) )=0A             =
continue;=0A@@ -541,7 +541,7 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc=0A=
 =0A             cpu =3D (i =3D=3D 0) ?=0A                 default_vcpu0_lo=
cation(online) :=0A-                cycle_cpu(d->vcpu[i-1]->processor, =
*online);=0A+                cpumask_cycle(d->vcpu[i-1]->processor, =
online);=0A =0A             if ( alloc_vcpu(d, i, cpu) =3D=3D NULL )=0A    =
             goto maxvcpu_out;=0A--- a/xen/common/keyhandler.c=0A+++ =
b/xen/common/keyhandler.c=0A@@ -128,7 +128,7 @@ static void dump_registers(=
unsigned char=0A         return;=0A =0A     /* Normal handling: synchronous=
ly dump the remaining CPUs' states. */=0A-    for_each_cpu_mask ( cpu, =
dump_execstate_mask )=0A+    for_each_cpu ( cpu, &dump_execstate_mask )=0A =
    {=0A         smp_send_state_dump(cpu);=0A         while ( cpumask_test_=
cpu(cpu, &dump_execstate_mask) )=0A--- a/xen/common/perfc.c=0A+++ =
b/xen/common/perfc.c=0A@@ -211,14 +211,14 @@ static int perfc_copy_info(XEN=
_GUEST_HAN=0A         {=0A         case TYPE_SINGLE:=0A         case =
TYPE_S_SINGLE:=0A-            for_each_cpu_mask ( cpu, perfc_cpumap )=0A+  =
          for_each_cpu ( cpu, &perfc_cpumap )=0A                 perfc_vals=
[v++] =3D per_cpu(perfcounters, cpu)[j];=0A             ++j;=0A            =
 break;=0A         case TYPE_ARRAY:=0A         case TYPE_S_ARRAY:=0A       =
      memset(perfc_vals + v, 0, perfc_d[i].nr_vals * sizeof(*perfc_vals));=
=0A-            for_each_cpu_mask ( cpu, perfc_cpumap )=0A+            =
for_each_cpu ( cpu, &perfc_cpumap )=0A             {=0A                 =
perfc_t *counters =3D per_cpu(perfcounters, cpu) + j;=0A                 =
unsigned int k;=0A--- a/xen/common/sched_credit2.c=0A+++ b/xen/common/sched=
_credit2.c=0A@@ -521,7 +521,7 @@ runq_tickle(const struct scheduler =
*ops,=0A     cpumask_andnot(&mask, &rqd->active, &rqd->idle);=0A     =
cpumask_andnot(&mask, &mask, &rqd->tickled);=0A =0A-    for_each_cpu_mask(i=
, mask)=0A+    for_each_cpu(i, &mask)=0A     {=0A         struct csched_vcp=
u * cur;=0A =0A@@ -1051,7 +1051,7 @@ choose_cpu(const struct scheduler =
*ops, =0A         else=0A         {=0A             d2printk("d%dv%d +\n", =
svc->vcpu->domain->domain_id, svc->vcpu->vcpu_id);=0A-            new_cpu =
=3D first_cpu(svc->migrate_rqd->active);=0A+            new_cpu =3D =
cpumask_first(&svc->migrate_rqd->active);=0A             goto out_up;=0A   =
      }=0A     }=0A@@ -1061,7 +1061,7 @@ choose_cpu(const struct scheduler =
*ops, =0A     min_avgload =3D MAX_LOAD;=0A =0A     /* Find the runqueue =
with the lowest instantaneous load */=0A-    for_each_cpu_mask(i, =
prv->active_queues)=0A+    for_each_cpu(i, &prv->active_queues)=0A     =
{=0A         struct csched_runqueue_data *rqd;=0A         s_time_t =
rqd_avgload;=0A@@ -1099,7 +1099,7 @@ choose_cpu(const struct scheduler =
*ops, =0A     else=0A     {=0A         BUG_ON(cpumask_empty(&prv->rqd[min_r=
qi].active));=0A-        new_cpu =3D first_cpu(prv->rqd[min_rqi].active);=
=0A+        new_cpu =3D cpumask_first(&prv->rqd[min_rqi].active);=0A     =
}=0A =0A out_up:=0A@@ -1179,7 +1179,7 @@ void migrate(const struct =
scheduler *ops=0A             on_runq=3D1;=0A         }=0A         =
__runq_deassign(svc);=0A-        svc->vcpu->processor =3D first_cpu(trqd->a=
ctive);=0A+        svc->vcpu->processor =3D cpumask_first(&trqd->active);=
=0A         __runq_assign(svc, trqd);=0A         if ( on_runq )=0A         =
{=0A@@ -1219,7 +1219,7 @@ retry:=0A =0A     st.load_delta =3D 0;=0A =0A-   =
 for_each_cpu_mask(i, prv->active_queues)=0A+    for_each_cpu(i, &prv->acti=
ve_queues)=0A     {=0A         s_time_t delta;=0A         =0A@@ -1618,7 =
+1618,7 @@ csched_schedule(=0A         {=0A             int rq;=0A         =
    other_rqi =3D -2;=0A-            for_each_cpu_mask ( rq, CSCHED_PRIV(op=
s)->active_queues )=0A+            for_each_cpu ( rq, &CSCHED_PRIV(ops)->ac=
tive_queues )=0A             {=0A                 if ( scurr->rqd =3D=3D =
&CSCHED_PRIV(ops)->rqd[rq] )=0A                 {=0A@@ -1803,7 +1803,7 @@ =
csched_dump(const struct scheduler *ops)=0A            "\tdefault-weight   =
  =3D %d\n",=0A            cpumask_weight(&prv->active_queues),=0A         =
   CSCHED_DEFAULT_WEIGHT);=0A-    for_each_cpu_mask(i, prv->active_queues)=
=0A+    for_each_cpu(i, &prv->active_queues)=0A     {=0A         s_time_t =
fraction;=0A         =0A--- a/xen/common/sched_sedf.c=0A+++ b/xen/common/sc=
hed_sedf.c=0A@@ -442,7 +442,7 @@ static int sedf_pick_cpu(const struct =
sc=0A =0A     online =3D SEDF_CPUONLINE(v->domain->cpupool);=0A     =
cpumask_and(&online_affinity, v->cpu_affinity, online);=0A-    return =
first_cpu(online_affinity);=0A+    return cpumask_first(&online_affinity);=
=0A }=0A =0A /*=0A@@ -1322,7 +1322,7 @@ static int sedf_adjust_weights(stru=
ct cp=0A {=0A     struct vcpu *p;=0A     struct domain      *d;=0A-    =
unsigned int        cpu, nr_cpus =3D last_cpu(cpu_online_map) + 1;=0A+    =
unsigned int        cpu, nr_cpus =3D cpumask_last(&cpu_online_map) + 1;=0A =
    int                *sumw =3D xzalloc_array(int, nr_cpus);=0A     =
s_time_t           *sumt =3D xzalloc_array(s_time_t, nr_cpus);=0A =0A--- =
a/xen/common/schedule.c=0A+++ b/xen/common/schedule.c=0A@@ -1450,7 +1450,7 =
@@ void schedule_dump(struct cpupool *c)=0A     printk("Scheduler: %s =
(%s)\n", sched->name, sched->opt_name);=0A     SCHED_OP(sched, dump_setting=
s);=0A =0A-    for_each_cpu_mask (i, *cpus)=0A+    for_each_cpu (i, =
cpus)=0A     {=0A         pcpu_schedule_lock(i);=0A         printk("CPU[%02=
d] ", i);=0A--- a/xen/common/softirq.c=0A+++ b/xen/common/softirq.c=0A@@ =
-74,7 +74,7 @@ void cpumask_raise_softirq(const cpumask=0A     cpumask_t =
send_mask;=0A =0A     cpumask_clear(&send_mask);=0A-    for_each_cpu_mask(c=
pu, *mask)=0A+    for_each_cpu(cpu, mask)=0A         if ( !test_and_set_bit=
(nr, &softirq_pending(cpu)) )=0A             cpumask_set_cpu(cpu, =
&send_mask);=0A =0A--- a/xen/common/stop_machine.c=0A+++ b/xen/common/stop_=
machine.c=0A@@ -101,7 +101,7 @@ int stop_machine_run(int (*fn)(void *), =
=0A =0A     smp_wmb();=0A =0A-    for_each_cpu_mask ( i, allbutself )=0A+  =
  for_each_cpu ( i, &allbutself )=0A         tasklet_schedule_on_cpu(&per_c=
pu(stopmachine_tasklet, i), i);=0A =0A     stopmachine_set_state(STOPMACHIN=
E_PREPARE);=0A--- a/xen/common/timer.c=0A+++ b/xen/common/timer.c=0A@@ =
-548,7 +548,7 @@ static struct keyhandler dump_timerq_key=0A =0A static =
void migrate_timers_from_cpu(unsigned int old_cpu)=0A {=0A-    unsigned =
int new_cpu =3D first_cpu(cpu_online_map);=0A+    unsigned int new_cpu =3D =
cpumask_any(&cpu_online_map);=0A     struct timers *old_ts, *new_ts;=0A    =
 struct timer *t;=0A     bool_t notify =3D 0;=0A--- a/xen/drivers/acpi/pmst=
at.c=0A+++ b/xen/drivers/acpi/pmstat.c=0A@@ -223,7 +223,7 @@ static int =
get_cpufreq_para(struct xen_s=0A =0A     if ( !(affected_cpus =3D =
xzalloc_array(uint32_t, op->u.get_para.cpu_num)) )=0A         return =
-ENOMEM;=0A-    for_each_cpu_mask(cpu, *policy->cpus)=0A+    for_each_cpu(c=
pu, policy->cpus)=0A         affected_cpus[j++] =3D cpu;=0A     ret =3D =
copy_to_guest(op->u.get_para.affected_cpus,=0A                        =
affected_cpus, op->u.get_para.cpu_num);=0A--- a/xen/drivers/cpufreq/cpufreq=
_ondemand.c=0A+++ b/xen/drivers/cpufreq/cpufreq_ondemand.c=0A@@ -122,7 =
+122,7 @@ static void dbs_check_cpu(struct cpu_dbs=0A         return;=0A =
=0A     /* Get Idle Time */=0A-    for_each_cpu_mask(j, *policy->cpus) =
{=0A+    for_each_cpu(j, policy->cpus) {=0A         uint64_t idle_ns, =
total_idle_ns;=0A         uint64_t load, load_freq, freq_avg;=0A         =
struct cpu_dbs_info_s *j_dbs_info;=0A@@ -233,7 +233,7 @@ int cpufreq_govern=
or_dbs(struct cpufreq_=0A =0A         dbs_enable++;=0A =0A-        =
for_each_cpu_mask(j, *policy->cpus) {=0A+        for_each_cpu(j, policy->cp=
us) {=0A             struct cpu_dbs_info_s *j_dbs_info;=0A             =
j_dbs_info =3D &per_cpu(cpu_dbs_info, j);=0A             j_dbs_info->cur_po=
licy =3D policy;=0A--- a/xen/drivers/passthrough/vtd/iommu.c=0A+++ =
b/xen/drivers/passthrough/vtd/iommu.c=0A@@ -1033,7 +1033,7 @@ static void =
dma_msi_set_affinity(struct =0A     msg.address_lo =3D (MSI_ADDRESS_HEADER =
<< (MSI_ADDRESS_HEADER_SHIFT + 8));=0A     msg.address_lo |=3D MSI_PHYSICAL=
_MODE << 2;=0A     msg.address_lo |=3D MSI_REDIRECTION_HINT_MODE << 3;=0A- =
   dest =3D cpu_physical_id(first_cpu(mask));=0A+    dest =3D cpu_physical_=
id(cpumask_first(mask));=0A     msg.address_lo |=3D dest << MSI_TARGET_CPU_=
SHIFT;=0A #endif=0A =0A--- a/xen/include/asm-ia64/linux-xen/asm/acpi.h=0A++=
+ b/xen/include/asm-ia64/linux-xen/asm/acpi.h=0A@@ -139,7 +139,7 @@ extern =
int __initdata nid_to_pxm_map[MAX=0A #ifdef CONFIG_ACPI_NUMA=0A extern =
cpumask_t early_cpu_possible_map;=0A #define for_each_possible_early_cpu(cp=
u)  \=0A-	for_each_cpu_mask((cpu), early_cpu_possible_map)=0A+	=
for_each_cpu(cpu, &early_cpu_possible_map)=0A =0A static inline void =
per_cpu_scan_finalize(int min_cpus, int reserve_cpus)=0A {=0A--- a/xen/incl=
ude/asm-x86/flushtlb.h=0A+++ b/xen/include/asm-x86/flushtlb.h=0A@@ -52,7 =
+52,7 @@ static inline int NEED_FLUSH(u32 cpu_sta=0A #define tlbflush_filte=
r(mask, page_timestamp)                           \=0A do {                =
                                                    \=0A     unsigned int =
cpu;                                                   \=0A-    for_each_cp=
u_mask ( cpu, mask )                                     \=0A+    =
for_each_cpu ( cpu, &(mask) )                                       \=0A   =
      if ( !NEED_FLUSH(per_cpu(tlbflush_time, cpu), page_timestamp) ) \=0A =
            cpumask_clear_cpu(cpu, &(mask));                            =
\=0A } while ( 0 )=0A--- a/xen/include/xen/cpumask.h=0A+++ b/xen/include/xe=
n/cpumask.h=0A@@ -37,18 +37,19 @@=0A  * void cpumask_shift_right(dst, src, =
n) Shift right=0A  * void cpumask_shift_left(dst, src, n)	Shift =
left=0A  *=0A- * int first_cpu(mask)			Number lowest set =
bit, or NR_CPUS=0A- * int next_cpu(cpu, mask)		Next cpu past =
'cpu', or NR_CPUS=0A- * int last_cpu(mask)			Number =
highest set bit, or NR_CPUS=0A- * int cycle_cpu(cpu, mask)		=
Next cpu cycling from 'cpu', or NR_CPUS=0A+ * int cpumask_first(mask)		=
Number lowest set bit, or NR_CPUS=0A+ * int cpumask_next(cpu, mask)		=
Next cpu past 'cpu', or NR_CPUS=0A+ * int cpumask_last(mask)		=
Number highest set bit, or NR_CPUS=0A+ * int cpumask_any(mask)		=
Any cpu in mask, or NR_CPUS=0A+ * int cpumask_cycle(cpu, mask)		=
Next cpu cycling from 'cpu', or NR_CPUS=0A  *=0A- * cpumask_t cpumask_of_cp=
u(cpu)	Return cpumask with bit 'cpu' set=0A+ * const cpumask_t *cpumask_of=
(cpu)	Return cpumask with bit 'cpu' set=0A  * unsigned long *cpumask_bits=
(mask)	Array of unsigned long's in mask=0A  *=0A  * int cpumask_scnprintf(=
buf, len, mask) Format cpumask for printing=0A  * int cpulist_scnprintf(buf=
, len, mask) Format cpumask as list for printing=0A  *=0A- * for_each_cpu_m=
ask(cpu, mask)		for-loop cpu over mask=0A+ * for_each_cpu(cpu, =
mask)		for-loop cpu over mask=0A  *=0A  * int num_online_cpus()	=
	Number of online CPUs=0A  * int num_possible_cpus()		=
Number of all possible CPUs=0A@@ -210,42 +211,43 @@ static inline void =
cpumask_shift_left(cp=0A 	bitmap_shift_left(dstp->bits, srcp->bits, =
n, nr_cpumask_bits);=0A }=0A =0A-#define cpumask_first(src) __first_cpu(src=
, nr_cpu_ids)=0A-#define first_cpu(src) __first_cpu(&(src), nr_cpu_ids)=0A-=
static inline int __first_cpu(const cpumask_t *srcp, int nbits)=0A+static =
inline int cpumask_first(const cpumask_t *srcp)=0A {=0A-	return =
min_t(int, nbits, find_first_bit(srcp->bits, nbits));=0A+	return =
min_t(int, nr_cpu_ids, find_first_bit(srcp->bits, nr_cpu_ids));=0A }=0A =
=0A-#define cpumask_next(n, src) __next_cpu(n, src, nr_cpu_ids)=0A-#define =
next_cpu(n, src) __next_cpu((n), &(src), nr_cpu_ids)=0A-static inline int =
__next_cpu(int n, const cpumask_t *srcp, int nbits)=0A+static inline int =
cpumask_next(int n, const cpumask_t *srcp)=0A {=0A-	return min_t(int, =
nbits, find_next_bit(srcp->bits, nbits, n+1));=0A+	/* -1 is a legal =
arg here. */=0A+	if (n !=3D -1)=0A+		cpumask_check(n);=
=0A+=0A+	return min_t(int, nr_cpu_ids,=0A+                     =
find_next_bit(srcp->bits, nr_cpu_ids, n + 1));=0A }=0A =0A-#define =
cpumask_last(src) __last_cpu(src, nr_cpu_ids)=0A-#define last_cpu(src) =
__last_cpu(&(src), nr_cpu_ids)=0A-static inline int __last_cpu(const =
cpumask_t *srcp, int nbits)=0A+static inline int cpumask_last(const =
cpumask_t *srcp)=0A {=0A-	int cpu, pcpu =3D nbits;=0A-	for (cpu =
=3D __first_cpu(srcp, nbits);=0A-	     cpu < nbits;=0A-	     cpu =
=3D __next_cpu(cpu, srcp, nbits))=0A+	int cpu, pcpu =3D nr_cpu_ids;=0A+=
=0A+	for (cpu =3D cpumask_first(srcp);=0A+	     cpu < nr_cpu_ids;=0A+	=
     cpu =3D cpumask_next(cpu, srcp))=0A 		pcpu =3D cpu;=0A 	=
return pcpu;=0A }=0A =0A-#define cpumask_cycle(n, src) __cycle_cpu(n, src, =
nr_cpu_ids)=0A-#define cycle_cpu(n, src) __cycle_cpu((n), &(src), =
nr_cpu_ids)=0A-static inline int __cycle_cpu(int n, const cpumask_t *srcp, =
int nbits)=0A-{=0A-    int nxt =3D __next_cpu(n, srcp, nbits);=0A-    if =
(nxt =3D=3D nbits)=0A-        nxt =3D __first_cpu(srcp, nbits);=0A+static =
inline int cpumask_cycle(int n, const cpumask_t *srcp)=0A+{=0A+    int nxt =
=3D cpumask_next(n, srcp);=0A+=0A+    if (nxt =3D=3D nr_cpu_ids)=0A+       =
 nxt =3D cpumask_first(srcp);=0A     return nxt;=0A }=0A =0A+#define =
cpumask_any(srcp) cpumask_first(srcp)=0A+=0A /*=0A  * Special-case data =
structure for "single bit set only" constant CPU masks.=0A  *=0A@@ -262,8 =
+264,6 @@ static inline const cpumask_t *cpumask_o=0A 	return (const =
cpumask_t *)(p - cpu / BITS_PER_LONG);=0A }=0A =0A-#define cpumask_of_cpu(c=
pu) (*cpumask_of(cpu))=0A-=0A #if defined(__ia64__) /* XXX needs cleanup =
*/=0A #define CPU_MASK_LAST_WORD BITMAP_LAST_WORD_MASK(NR_CPUS)=0A =0A@@ =
-366,12 +366,13 @@ static inline void free_cpumask_var(cpum=0A #endif=0A =
=0A #if NR_CPUS > 1=0A-#define for_each_cpu_mask(cpu, mask)		=
\=0A-	for ((cpu) =3D first_cpu(mask);		\=0A-		(cpu) < =
nr_cpu_ids;		\=0A-		(cpu) =3D next_cpu((cpu), =
(mask)))=0A+#define for_each_cpu(cpu, mask)			\=0A+	=
for ((cpu) =3D cpumask_first(mask);	\=0A+	     (cpu) < nr_cpu_ids;	=
	\=0A+	     (cpu) =3D cpumask_next(cpu, mask))=0A #else /* =
NR_CPUS =3D=3D 1 */=0A-#define for_each_cpu_mask(cpu, mask) for ((cpu) =3D =
0; (cpu) < 1; (cpu)++)=0A+#define for_each_cpu(cpu, mask)			=
\=0A+	for ((cpu) =3D 0; (cpu) < 1; (cpu)++, (void)(mask))=0A #endif /* =
NR_CPUS */=0A =0A /*=0A@@ -458,18 +459,9 @@ extern cpumask_t cpu_present_ma=
p;=0A     ((present) ? cpumask_set_cpu(cpu, &cpu_present_map) \=0A         =
       : cpumask_clear_cpu(cpu, &cpu_present_map))=0A =0A-#define =
any_online_cpu(mask)			\=0A-({					=
	\=0A-	int cpu;				\=0A-	for_each_cp=
u_mask(cpu, (mask))		\=0A-		if (cpu_online(cpu))		=
\=0A-			break;			\=0A-	cpu;			=
		\=0A-})=0A-=0A-#define for_each_possible_cpu(cpu) =
for_each_cpu_mask((cpu), cpu_possible_map)=0A-#define for_each_online_cpu(c=
pu)   for_each_cpu_mask((cpu), cpu_online_map)=0A-#define for_each_present_=
cpu(cpu)  for_each_cpu_mask((cpu), cpu_present_map)=0A+#define for_each_pos=
sible_cpu(cpu) for_each_cpu(cpu, &cpu_possible_map)=0A+#define for_each_onl=
ine_cpu(cpu)   for_each_cpu(cpu, &cpu_online_map)=0A+#define for_each_prese=
nt_cpu(cpu)  for_each_cpu(cpu, &cpu_present_map)=0A =0A /* Copy to/from =
cpumap provided by control tools. */=0A struct xenctl_cpumap;=0A
--=__PartC5EA31FF.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__PartC5EA31FF.0__=--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 02:15:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 02:15:41 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNMEu-0007ub-Ju; Mon, 07 Nov 2011 02:15:41 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNLzY-0005Ho-39
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 01:59:51 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320659959!51709801!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23408 invoked from network); 7 Nov 2011 09:59:19 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Nov 2011 09:59:19 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 07 Nov 2011 09:59:44 +0000
Message-Id: <4EB7BA1C020000780005F4C9@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 07 Nov 2011 09:59:40 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part210ED51C.0__="
Subject: [Xen-devel] [PATCH 6/6] eliminate remaining uses of struct irq_cfg
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part210ED51C.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -2279,7 +2279,6 @@ int ioapic_guest_write(unsigned long phy
     int apic, pin, irq, ret, vector, pirq;
     struct IO_APIC_route_entry rte =3D { 0 };
     unsigned long flags;
-    struct irq_cfg *cfg;
     struct irq_desc *desc;
=20
     if ( (apic =3D ioapic_physbase_to_id(physbase)) < 0 )
@@ -2321,7 +2320,6 @@ int ioapic_guest_write(unsigned long phy
         return irq;
=20
     desc =3D irq_to_desc(irq);
-    cfg =3D &desc->arch;
=20
     /*
      * Since PHYSDEVOP_alloc_irq_vector is dummy, rte.vector is the pirq
@@ -2338,7 +2336,7 @@ int ioapic_guest_write(unsigned long phy
         spin_lock_irqsave(&ioapic_lock, flags);
         ret =3D io_apic_read(apic, 0x10 + 2 * pin);
         spin_unlock_irqrestore(&ioapic_lock, flags);
-        rte.vector =3D cfg->vector;
+        rte.vector =3D desc->arch.vector;
         if ( *(u32*)&rte !=3D ret )
             WARN_BOGUS_WRITE("old_entry=3D%08x pirq=3D%d\n%s: "
                              "Attempt to modify IO-APIC pin for in-use =
IRQ!\n",
@@ -2346,7 +2344,7 @@ int ioapic_guest_write(unsigned long phy
         return 0;
     }
=20
-    if ( cfg->vector <=3D 0 || cfg->vector > LAST_DYNAMIC_VECTOR ) {
+    if ( desc->arch.vector <=3D 0 || desc->arch.vector > LAST_DYNAMIC_VECT=
OR ) {
         vector =3D assign_irq_vector(irq);
         if ( vector < 0 )
             return vector;
@@ -2370,7 +2368,7 @@ int ioapic_guest_write(unsigned long phy
     /* Mask iff level triggered. */
     rte.mask =3D rte.trigger;
     /* Set the vector field to the real vector! */
-    rte.vector =3D cfg->vector;
+    rte.vector =3D desc->arch.vector;
=20
     SET_DEST(rte.dest.dest32, rte.dest.logical.logical_dest,
              cpu_mask_to_apicid(desc->arch.cpu_mask));
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -285,16 +285,14 @@ void destroy_irq(unsigned int irq)
 int irq_to_vector(int irq)
 {
     int vector =3D -1;
-    struct irq_cfg *cfg;
=20
     BUG_ON(irq >=3D nr_irqs || irq < 0);
=20
     if (IO_APIC_IRQ(irq))
         vector =3D irq_vector[irq];
-    else if(MSI_IRQ(irq)) {
-        cfg =3D irq_cfg(irq);
-        vector =3D cfg->vector;
-    } else
+    else if (MSI_IRQ(irq))
+        vector =3D irq_to_desc(irq)->arch.vector;
+    else
         vector =3D LEGACY_VECTOR(irq);
=20
     return vector;
--- a/xen/include/asm-ia64/linux-xen/asm/irq.h
+++ b/xen/include/asm-ia64/linux-xen/asm/irq.h
@@ -15,8 +15,7 @@
 #define NR_IRQS		256
=20
 #ifdef XEN
-struct irq_cfg {
-#define arch_irq_desc irq_cfg
+struct arch_irq_desc {
         int  vector;
         cpumask_var_t cpu_mask;
 };
@@ -63,9 +62,6 @@ extern int request_irq_vector(unsigned i
 #define create_irq(x) assign_irq_vector(AUTO_ASSIGN_IRQ)
 #define destroy_irq(x) free_irq_vector(x)
=20
-#define irq_cfg(x)        (&irq_desc[x].arch)
-#define irq_to_desc(x)    (&irq_desc[x]
-
 #define irq_complete_move(x) do {} \
     while(!x)
=20
--- a/xen/include/asm-x86/irq.h
+++ b/xen/include/asm-x86/irq.h
@@ -20,17 +20,13 @@
=20
 #define LEGACY_VECTOR(irq)          ((irq) + FIRST_LEGACY_VECTOR)
=20
-#define irq_to_desc(irq)    (&irq_desc[irq])
-#define irq_cfg(irq)        (&irq_desc[irq].arch)
-
 typedef struct {
     DECLARE_BITMAP(_bits,NR_VECTORS);
 } vmask_t;
=20
 struct irq_desc;
=20
-struct irq_cfg {
-#define arch_irq_desc irq_cfg
+struct arch_irq_desc {
         s16 vector;                  /* vector itself is only 8 bits, */
         s16 old_vector;              /* but we use -1 for unassigned  */
         cpumask_var_t cpu_mask;
@@ -42,7 +38,7 @@ struct irq_cfg {
         s8 used;
 };
=20
-/* For use with irq_cfg.used */
+/* For use with irq_desc.arch.used */
 #define IRQ_UNUSED      (0)
 #define IRQ_USED        (1)
 #define IRQ_RESERVED    (-1)
--- a/xen/include/xen/irq.h
+++ b/xen/include/xen/irq.h
@@ -84,6 +84,8 @@ typedef struct irq_desc {
     struct list_head rl_link;
 } __cacheline_aligned irq_desc_t;
=20
+#define irq_to_desc(irq)    (&irq_desc[irq])
+
 int init_one_irq_desc(struct irq_desc *);
 int arch_init_one_irq_desc(struct irq_desc *);
=20



--=__Part210ED51C.0__=
Content-Type: text/plain; name="eliminate-irq_cfg.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="eliminate-irq_cfg.patch"

eliminate remaining uses of struct irq_cfg=0A=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- a/xen/arch/x86/io_apic.c=0A+++ b/xen/arch/x86/=
io_apic.c=0A@@ -2279,7 +2279,6 @@ int ioapic_guest_write(unsigned long =
phy=0A     int apic, pin, irq, ret, vector, pirq;=0A     struct IO_APIC_rou=
te_entry rte =3D { 0 };=0A     unsigned long flags;=0A-    struct irq_cfg =
*cfg;=0A     struct irq_desc *desc;=0A =0A     if ( (apic =3D ioapic_physba=
se_to_id(physbase)) < 0 )=0A@@ -2321,7 +2320,6 @@ int ioapic_guest_write(un=
signed long phy=0A         return irq;=0A =0A     desc =3D irq_to_desc(irq)=
;=0A-    cfg =3D &desc->arch;=0A =0A     /*=0A      * Since PHYSDEVOP_alloc=
_irq_vector is dummy, rte.vector is the pirq=0A@@ -2338,7 +2336,7 @@ int =
ioapic_guest_write(unsigned long phy=0A         spin_lock_irqsave(&ioapic_l=
ock, flags);=0A         ret =3D io_apic_read(apic, 0x10 + 2 * pin);=0A     =
    spin_unlock_irqrestore(&ioapic_lock, flags);=0A-        rte.vector =3D =
cfg->vector;=0A+        rte.vector =3D desc->arch.vector;=0A         if ( =
*(u32*)&rte !=3D ret )=0A             WARN_BOGUS_WRITE("old_entry=3D%08x =
pirq=3D%d\n%s: "=0A                              "Attempt to modify =
IO-APIC pin for in-use IRQ!\n",=0A@@ -2346,7 +2344,7 @@ int ioapic_guest_wr=
ite(unsigned long phy=0A         return 0;=0A     }=0A =0A-    if ( =
cfg->vector <=3D 0 || cfg->vector > LAST_DYNAMIC_VECTOR ) {=0A+    if ( =
desc->arch.vector <=3D 0 || desc->arch.vector > LAST_DYNAMIC_VECTOR ) {=0A =
        vector =3D assign_irq_vector(irq);=0A         if ( vector < 0 )=0A =
            return vector;=0A@@ -2370,7 +2368,7 @@ int ioapic_guest_write(u=
nsigned long phy=0A     /* Mask iff level triggered. */=0A     rte.mask =
=3D rte.trigger;=0A     /* Set the vector field to the real vector! */=0A- =
   rte.vector =3D cfg->vector;=0A+    rte.vector =3D desc->arch.vector;=0A =
=0A     SET_DEST(rte.dest.dest32, rte.dest.logical.logical_dest,=0A        =
      cpu_mask_to_apicid(desc->arch.cpu_mask));=0A--- a/xen/arch/x86/irq.c=
=0A+++ b/xen/arch/x86/irq.c=0A@@ -285,16 +285,14 @@ void destroy_irq(unsign=
ed int irq)=0A int irq_to_vector(int irq)=0A {=0A     int vector =3D =
-1;=0A-    struct irq_cfg *cfg;=0A =0A     BUG_ON(irq >=3D nr_irqs || irq =
< 0);=0A =0A     if (IO_APIC_IRQ(irq))=0A         vector =3D irq_vector[irq=
];=0A-    else if(MSI_IRQ(irq)) {=0A-        cfg =3D irq_cfg(irq);=0A-     =
   vector =3D cfg->vector;=0A-    } else=0A+    else if (MSI_IRQ(irq))=0A+ =
       vector =3D irq_to_desc(irq)->arch.vector;=0A+    else=0A         =
vector =3D LEGACY_VECTOR(irq);=0A =0A     return vector;=0A--- a/xen/includ=
e/asm-ia64/linux-xen/asm/irq.h=0A+++ b/xen/include/asm-ia64/linux-xen/asm/i=
rq.h=0A@@ -15,8 +15,7 @@=0A #define NR_IRQS		256=0A =0A #ifdef =
XEN=0A-struct irq_cfg {=0A-#define arch_irq_desc irq_cfg=0A+struct =
arch_irq_desc {=0A         int  vector;=0A         cpumask_var_t =
cpu_mask;=0A };=0A@@ -63,9 +62,6 @@ extern int request_irq_vector(unsigned =
i=0A #define create_irq(x) assign_irq_vector(AUTO_ASSIGN_IRQ)=0A #define =
destroy_irq(x) free_irq_vector(x)=0A =0A-#define irq_cfg(x)        =
(&irq_desc[x].arch)=0A-#define irq_to_desc(x)    (&irq_desc[x]=0A-=0A =
#define irq_complete_move(x) do {} \=0A     while(!x)=0A =0A--- a/xen/inclu=
de/asm-x86/irq.h=0A+++ b/xen/include/asm-x86/irq.h=0A@@ -20,17 +20,13 =
@@=0A =0A #define LEGACY_VECTOR(irq)          ((irq) + FIRST_LEGACY_VECTOR)=
=0A =0A-#define irq_to_desc(irq)    (&irq_desc[irq])=0A-#define irq_cfg(irq=
)        (&irq_desc[irq].arch)=0A-=0A typedef struct {=0A     DECLARE_BITMA=
P(_bits,NR_VECTORS);=0A } vmask_t;=0A =0A struct irq_desc;=0A =0A-struct =
irq_cfg {=0A-#define arch_irq_desc irq_cfg=0A+struct arch_irq_desc {=0A    =
     s16 vector;                  /* vector itself is only 8 bits, */=0A   =
      s16 old_vector;              /* but we use -1 for unassigned  */=0A  =
       cpumask_var_t cpu_mask;=0A@@ -42,7 +38,7 @@ struct irq_cfg {=0A     =
    s8 used;=0A };=0A =0A-/* For use with irq_cfg.used */=0A+/* For use =
with irq_desc.arch.used */=0A #define IRQ_UNUSED      (0)=0A #define =
IRQ_USED        (1)=0A #define IRQ_RESERVED    (-1)=0A--- a/xen/include/xen=
/irq.h=0A+++ b/xen/include/xen/irq.h=0A@@ -84,6 +84,8 @@ typedef struct =
irq_desc {=0A     struct list_head rl_link;=0A } __cacheline_aligned =
irq_desc_t;=0A =0A+#define irq_to_desc(irq)    (&irq_desc[irq])=0A+=0A int =
init_one_irq_desc(struct irq_desc *);=0A int arch_init_one_irq_desc(struct =
irq_desc *);=0A =0A
--=__Part210ED51C.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part210ED51C.0__=--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 02:17:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 02:17:58 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNMH7-0008OX-Ku; Mon, 07 Nov 2011 02:17:57 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNM1Z-0005RY-V8
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 02:01:54 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320660077!44879025!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22814 invoked from network); 7 Nov 2011 10:01:17 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Nov 2011 10:01:17 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 07 Nov 2011 10:01:50 +0000
Message-Id: <4EB7BA9B020000780005F4CD@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 07 Nov 2011 10:01:47 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__PartA689529B.0__="
Subject: [Xen-devel] [PATCH] IRQ: move a few more bits into common code
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__PartA689529B.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

... as they're not really arch-specific.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/ia64/xen/irq.c
+++ b/xen/arch/ia64/xen/irq.c
@@ -105,15 +105,6 @@ void __do_IRQ_guest(int irq);
  * Special irq handlers.
  */
=20
-void no_action(int cpl, void *dev_id, struct pt_regs *regs) { }
-
-/*
- * Generic no controller code
- */
-
-static void enable_none(unsigned int irq) { }
-static unsigned int startup_none(unsigned int irq) { return 0; }
-static void disable_none(unsigned int irq) { }
 static void ack_none(unsigned int irq)
 {
 /*
@@ -124,18 +115,14 @@ static void ack_none(unsigned int irq)
 	printk(KERN_ERR "Unexpected irq vector 0x%x on CPU %u!\n", irq, =
smp_processor_id());
 }
=20
-/* startup is the same as "enable", shutdown is same as "disable" */
-#define shutdown_none	disable_none
-#define end_none	enable_none
-
 hw_irq_controller no_irq_type =3D {
-	"none",
-	startup_none,
-	shutdown_none,
-	enable_none,
-	disable_none,
-	ack_none,
-	end_none
+	.typename =3D "none",
+	.startup =3D irq_startup_none,
+	.shutdown =3D irq_shutdown_none,
+	.enable =3D irq_enable_none,
+	.disable =3D irq_disable_none,
+	.ack =3D ack_none,
+	.end =3D irq_actor_none
 };
=20
 /*
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -356,10 +356,6 @@ int __init init_irq_data(void)
=20
 static void __do_IRQ_guest(int vector);
=20
-void no_action(int cpl, void *dev_id, struct cpu_user_regs *regs) { }
-
-void irq_actor_none(struct irq_desc *desc) { }
-unsigned int irq_startup_none(struct irq_desc *desc) { return 0; }
 static void ack_none(struct irq_desc *desc)
 {
     ack_bad_irq(desc->irq);
--- a/xen/common/irq.c
+++ b/xen/common/irq.c
@@ -26,3 +26,16 @@ int init_one_irq_desc(struct irq_desc *d
=20
     return err;
 }
+
+void no_action(int cpl, void *dev_id, struct cpu_user_regs *regs)
+{
+}
+
+void irq_actor_none(struct irq_desc *desc)
+{
+}
+
+unsigned int irq_startup_none(struct irq_desc *desc)
+{
+    return 0;
+}




--=__PartA689529B.0__=
Content-Type: text/plain; name="irq-none-common.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="irq-none-common.patch"

IRQ: move a few more bits into common code=0A=0A... as they're not really =
arch-specific.=0A=0ASigned-off-by: Jan Beulich <jbeulich@suse.com>=0A=0A---=
 a/xen/arch/ia64/xen/irq.c=0A+++ b/xen/arch/ia64/xen/irq.c=0A@@ -105,15 =
+105,6 @@ void __do_IRQ_guest(int irq);=0A  * Special irq handlers.=0A  =
*/=0A =0A-void no_action(int cpl, void *dev_id, struct pt_regs *regs) { =
}=0A-=0A-/*=0A- * Generic no controller code=0A- */=0A-=0A-static void =
enable_none(unsigned int irq) { }=0A-static unsigned int startup_none(unsig=
ned int irq) { return 0; }=0A-static void disable_none(unsigned int irq) { =
}=0A static void ack_none(unsigned int irq)=0A {=0A /*=0A@@ -124,18 =
+115,14 @@ static void ack_none(unsigned int irq)=0A 	printk(KERN_ERR =
"Unexpected irq vector 0x%x on CPU %u!\n", irq, smp_processor_id());=0A =
}=0A =0A-/* startup is the same as "enable", shutdown is same as "disable" =
*/=0A-#define shutdown_none	disable_none=0A-#define end_none	=
enable_none=0A-=0A hw_irq_controller no_irq_type =3D {=0A-	"none",=0A-=
	startup_none,=0A-	shutdown_none,=0A-	enable_none,=0A-	=
disable_none,=0A-	ack_none,=0A-	end_none=0A+	.typename =3D =
"none",=0A+	.startup =3D irq_startup_none,=0A+	.shutdown =3D =
irq_shutdown_none,=0A+	.enable =3D irq_enable_none,=0A+	.disable =
=3D irq_disable_none,=0A+	.ack =3D ack_none,=0A+	.end =3D irq_actor_=
none=0A };=0A =0A /*=0A--- a/xen/arch/x86/irq.c=0A+++ b/xen/arch/x86/irq.c=
=0A@@ -356,10 +356,6 @@ int __init init_irq_data(void)=0A =0A static void =
__do_IRQ_guest(int vector);=0A =0A-void no_action(int cpl, void *dev_id, =
struct cpu_user_regs *regs) { }=0A-=0A-void irq_actor_none(struct irq_desc =
*desc) { }=0A-unsigned int irq_startup_none(struct irq_desc *desc) { =
return 0; }=0A static void ack_none(struct irq_desc *desc)=0A {=0A     =
ack_bad_irq(desc->irq);=0A--- a/xen/common/irq.c=0A+++ b/xen/common/irq.c=
=0A@@ -26,3 +26,16 @@ int init_one_irq_desc(struct irq_desc *d=0A =0A     =
return err;=0A }=0A+=0A+void no_action(int cpl, void *dev_id, struct =
cpu_user_regs *regs)=0A+{=0A+}=0A+=0A+void irq_actor_none(struct irq_desc =
*desc)=0A+{=0A+}=0A+=0A+unsigned int irq_startup_none(struct irq_desc =
*desc)=0A+{=0A+    return 0;=0A+}=0A
--=__PartA689529B.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__PartA689529B.0__=--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 02:21:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 02:21:18 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNMKL-0000OP-PK; Mon, 07 Nov 2011 02:21:17 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNM8L-0006fB-L3
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 02:08:54 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1320660507!51211671!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21544 invoked from network); 7 Nov 2011 10:08:27 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-8.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Nov 2011 10:08:27 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 07 Nov 2011 10:08:49 +0000
Message-Id: <4EB7BC3F020000780005F504@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 07 Nov 2011 10:08:47 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jeremy Fitzhardinge" <jeremy@goop.org>
Subject: Re: [Xen-devel] Re: MSI error when reloading iwlagn module
References: <4E822AA6.4010605@goop.org>
	<4E82F7F10200007800058259@nat28.tlf.novell.com>
	<CAFLBxZbOF=Lh=AUrSDcpJr2+YosKs0h9_N40RAkhS6Y5AFRtZg@mail.gmail.com>
In-Reply-To: <CAFLBxZbOF=Lh=AUrSDcpJr2+YosKs0h9_N40RAkhS6Y5AFRtZg@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: George Dunlap <George.Dunlap@eu.citrix.com>, andrew.cooper3@citrix.com,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Jeremy,

are you still having this problem? If so, did you have time to look into =
it
at least to some degree? Or alternatively, did you find other ways to
reproduce this (so others - e.g. me - could try to look into it)?

Thanks, Jan

>>> On 28.09.11 at 12:17, George Dunlap <George.Dunlap@eu.citrix.com> =
wrote:
> Jeremy, can you try the attached patch (which reverts some of the
> changes from c/s 23786:3a05da2dc7c0)?
>  -George
>=20
> On Wed, Sep 28, 2011 at 9:33 AM, Jan Beulich <JBeulich@suse.com> wrote:
>>>>> On 27.09.11 at 21:57, Jeremy Fitzhardinge <jeremy@goop.org> wrote:
>>> Hi,
>>>
>>> With a fairly current kernel + xen, I'm seeing this if I rmmod iwlagn
>>> and try to reload it:
>>>
>>> [51230.646678] Intel(R) Wireless WiFi Link AGN driver for Linux, =
in-tree:
>>> [51230.646685] Copyright(c) 2003-2011 Intel Corporation
>>> [51230.646760] xen: registering gsi 17 triggering 0 polarity 1
>>> [51230.646773] xen_map_pirq_gsi: returning irq 17 for gsi 17
>>> [51230.646777] xen: --> pirq=3D17 -> irq=3D17 (gsi=3D17)
>>> [51230.646781] Already setup the GSI :17
>>> [51230.646789] iwlagn 0000:03:00.0: PCI INT A -> GSI 17 (level, low) =
-> IRQ 17
>>> [51230.646814] iwlagn 0000:03:00.0: setting latency timer to 64
>>> [51230.646935] iwlagn 0000:03:00.0: pci_resource_len =3D 0x00002000
>>> [51230.646941] iwlagn 0000:03:00.0: pci_resource_base =3D ffffc9000671c=
000
>>> [51230.646945] iwlagn 0000:03:00.0: HW Revision ID =3D 0x35
>>> [51230.647075] iwlagn 0000:03:00.0: xen map irq failed -22 for 32752 =
domain
>>> [51230.647081] iwlagn 0000:03:00.0: pci_enable_msi failed
>>> [51230.647113] iwlagn 0000:03:00.0: PCI INT A disabled
>>> [51230.647126] iwlagn: probe of 0000:03:00.0 failed with error -22
>>>
>>> with this on the Xen console
>>>
>>> (XEN) physdev.c:139: dom0: can't create irq for msi!
>>>
>>>
>>> I'm running Xen as of a422e2a4451e, which your MSI changes in them,
>>> which I suspect of having caused a regression (since I don't remember
>>> having problems reloading msi-using drivers before).
>>
>> Are you certain (i.e. did you try reverting the top 1 to 3 commits from
>> there)? Alternatively, do you know what c/s last worked for you? Is
>> this one the first removal, or after several of them?
>>
>> The message solely indicates a failure of create_irq(), with either
>> find_unassigned_irq() or __assign_irq_vector() failing being the cause,
>> none of which I touched recently. Instead I wonder whether
>> 23812:32814ad7458d wouldn't be a more likely candidate (with
>> 23815:9fa77d26a813 and 23816:7f357e1ef60a being less likely ones).
>>
>> I'll nevertheless see whether this reproduces with one of the MSI
>> drivers that my machines have in use and allow easy removal/reload.
>>
>> Jan
>>
>>
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com=20
>> http://lists.xensource.com/xen-devel=20
>>




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 02:25:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 02:25:04 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNMNz-0000oA-JZ; Mon, 07 Nov 2011 02:25:03 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNMH9-0008Oj-Jl
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 02:18:00 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1320661076!3169620!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31718 invoked from network); 7 Nov 2011 10:17:56 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 10:17:56 -0000
X-IronPort-AV: E=Sophos;i="4.69,469,1315180800"; 
   d="scan'208";a="8790581"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 10:17:56 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Mon, 7 Nov 2011
	10:17:56 +0000
Subject: Re: [Xen-devel] XenStore Devel Help
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Luciano Barreto <lucianobarreto@gmail.com>
Date: Mon, 7 Nov 2011 10:17:56 +0000
In-Reply-To: <CAPiSOA59agvmTHccaXvmcgcDobNeesoR_kJE2qnerS6jyOL__w@mail.gmail.com>
References: <CAPiSOA59agvmTHccaXvmcgcDobNeesoR_kJE2qnerS6jyOL__w@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320661076.955.19.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, 2011-11-04 at 16:23 +0000, Luciano Barreto wrote:
> Hi guys, I'm trying to develop a library to access XenStore via Java
> Application (Academic purposes) but I have not a lot experiencie in C
> or how to do that. Anyone here have an example of how to access
> XenStore using the library "xs.h". I found an example over the
> internet 

There is a basic command line client in
tools/xenstore/xenstore_client.c. You could also look at tools/libxl
which uses xenstore reasonably extensively.

tools/python/xen/lowlevel/xs/xs.c is the python bindings which I suppose
might be of interest.

> but I'm havig any compilation problems.Thanks

You'll have to be more specific if you want help with this.

However if you are struggling with the C aspect then I suggest you seek
out someone within your university department who can help, this list is
not best suited to teaching people new languages.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 02:43:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 02:43:15 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNMfb-0002B3-Pe; Mon, 07 Nov 2011 02:43:15 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNMeh-0001xY-Ea
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 02:42:19 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1320662535!548904!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4066 invoked from network); 7 Nov 2011 10:42:16 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 10:42:16 -0000
X-IronPort-AV: E=Sophos;i="4.69,469,1315180800"; 
   d="scan'208";a="8791248"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 10:42:12 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 10:42:12 +0000
Date: Mon, 7 Nov 2011 10:42:53 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH RFC v2 12/13] libxl: New API for providing
	OS events to libxl
In-Reply-To: <1319827031-15395-13-git-send-email-ian.jackson@eu.citrix.com>
Message-ID: <alpine.DEB.2.00.1111071027390.3519@kaball-desktop>
References: <1319827031-15395-1-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-2-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-3-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-4-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-5-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-6-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-7-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-8-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-9-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-10-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-11-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-12-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-13-git-send-email-ian.jackson@eu.citrix.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, 28 Oct 2011, Ian Jackson wrote:
> + * There are two approaches available.  The first is appropriate for
> + * simple programs handling reasonably small numbers of domains:
> + *
> + *   for (;;) {
> + *      libxl_osevent_beforepoll(...)
> + *      poll();
> + *      libxl_osevent_afterpoll(...);
> + *      for (;;) {
> + *        r=libxl_event_check(...);
> + *        if (r==LIBXL_NOT_READY) break;
> + *        if (r) handle failure;
> + *        do something with the event;
> + *      }
> + *   }

It is good that you included an example here but it doesn't follow the
CODING_STYLE

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 02:44:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 02:44:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNMgm-0002ZO-4x; Mon, 07 Nov 2011 02:44:28 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNMes-0001z3-L7
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 02:42:31 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1320662547!549233!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9411 invoked from network); 7 Nov 2011 10:42:27 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 10:42:27 -0000
X-IronPort-AV: E=Sophos;i="4.69,469,1315180800"; 
   d="scan'208";a="8791254"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 10:42:26 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 10:42:26 +0000
Date: Mon, 7 Nov 2011 10:43:07 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH RFC v2 06/13] libxl: permit declaration after
	statement
In-Reply-To: <1320263024.3084.61.camel@cthulhu.hellion.org.uk>
Message-ID: <alpine.DEB.2.00.1111071033560.3519@kaball-desktop>
References: <1319827031-15395-1-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-2-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-3-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-4-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-5-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-6-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-7-git-send-email-ian.jackson@eu.citrix.com>
	<1320054652.23193.28.camel@zakaz.uk.xensource.com>
	<20145.29085.278257.629473@mariner.uk.xensource.com>
	<1320263024.3084.61.camel@cthulhu.hellion.org.uk>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2 Nov 2011, Ian Campbell wrote:
> On Wed, 2011-11-02 at 12:36 -0400, Ian Jackson wrote:
> > Ian Campbell writes ("Re: [Xen-devel] [PATCH RFC v2 06/13] libxl: permit declaration after statement"):
> > > I suspect there isn't much scope for abuse of this capability but would
> > > a few words of guidance in CODING_STYLE make sense?
> > 
> > I don't think there's anything I feel needs saying.  If you think
> > people are likely to abuse it in a particular way then do say :-).
> > 
> > Otherwise we can wait and see what results and add stuff to
> > CODING_STYLE as necessary ?
> 
> Yes, lets do that.
> 

I think it would make sense to add to the CODING_STYLE that variable
declarations shouldn't be mixed with code, unless part of a macro or an
alloca-like construct.
Basically the coding style should stay the same that is now.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 03:06:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 03:06:46 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNN2K-00047B-Eb; Mon, 07 Nov 2011 03:06:44 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNMxW-0003qG-ET
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 03:02:10 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1320663698!2552628!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28451 invoked from network); 7 Nov 2011 11:01:38 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 11:01:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,469,1315180800"; 
   d="scan'208";a="8791696"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 11:01:38 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 11:01:38 +0000
Date: Mon, 7 Nov 2011 11:02:08 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH 4 of 4] xenpaging: initial libxl support
In-Reply-To: <ab5406a5b1d01e3828f0.1320245140@probook.site>
Message-ID: <alpine.DEB.2.00.1111071053160.3519@kaball-desktop>
References: <patchbomb.1320245136@probook.site>
	<ab5406a5b1d01e3828f0.1320245140@probook.site>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: Dunlap <George.Dunlap@eu.citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	George, Ian Campbell <Ian.Campbell@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2 Nov 2011, Olaf Hering wrote:
> diff -r a51d4fab351d -r ab5406a5b1d0 tools/libxl/libxl_create.c
> --- a/tools/libxl/libxl_create.c
> +++ b/tools/libxl/libxl_create.c
> @@ -429,6 +429,122 @@ retry_transaction:
>      return rc;
>  }
> 
> +static int create_xenpaging(libxl__gc *gc, char *dom_name, uint32_t domid,
> +                            libxl_domain_build_info *b_info)
> +{
> +    libxl__spawner_starting *buf_starting;
> +    libxl_string_list xpe = b_info->u.hvm.xenpaging_extra;
> +    int i, rc;
> +    char *logfile;
> +    int logfile_w, null;
> +    char *path, *dom_path, *value;
> +    char **args;
> +    char *xp;
> +    flexarray_t *xp_args;
> +    libxl_ctx *ctx = libxl__gc_owner(gc);
> +
> +    /* Nothing to do */
> +    if (!b_info->tot_memkb)
> +        return 0;

I think that using tot_memkb to store the actual memory target and then
checking whether is 0 to detect if paging is active/inactive is
confusing.
If tot_memkb is the pod target of the domain, we should be coherent and
set it equal to target_memkb when paging is inactive.


> @@ -34,6 +34,17 @@
>      libxl_domain_setmaxmem -> xen maximum
>      libxl_set_memory_target -> actual target
> 
> +    build maximum = RAM as seen inside the virtual machine
> +                    Guest OS has to configure itself for this amount of memory
> +                    Increase/Decrease via memory hotplug of virtual hardware.
> +                   xl mem-max
> +    build start   = RAM usable by the guest OS
> +                    Guest OS sees balloon driver as memory hog
> +                    Increase/Decrease via commands to the balloon driver
> +                   xl mem-set
> +    actual target = RAM allocated for the guest
> +                    Increase/Decrease via commands to paging daemon
> +                   xl mem-paging_target (?)

maybe xl mem-paging is specific enough


>   === Domain memory breakdown: PV guests ==================================
> 
> diff -r a51d4fab351d -r ab5406a5b1d0 tools/libxl/libxl_types.idl
> --- a/tools/libxl/libxl_types.idl
> +++ b/tools/libxl/libxl_types.idl
> @@ -157,6 +157,7 @@ libxl_domain_build_info = Struct("domain
>      ("tsc_mode",        integer),
>      ("max_memkb",       uint32),
>      ("target_memkb",    uint32),
> +    ("tot_memkb",       uint32),
>      ("video_memkb",     uint32),
>      ("shadow_memkb",    uint32),
>      ("disable_migrate", bool),

I would like a comment somewhere of what tot_memkb is supposed to
represent.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 03:56:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 03:56:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNNoR-0005uO-BH; Mon, 07 Nov 2011 03:56:27 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNNnk-0005hw-Fq
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 03:55:44 -0800
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1320666939!561912!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2816 invoked from network); 7 Nov 2011 11:55:41 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 11:55:41 -0000
Received: by iaqq3 with SMTP id q3so1367232iaq.30
	for <xen-devel@lists.xensource.com>;
	Mon, 07 Nov 2011 03:55:39 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:cc:content-type;
	bh=mdWsuDibs0jj27L7rbWXbU/NITnsrvHuWF/3S5S0QPM=;
	b=m9W9IZ3dTegblZdAz/4hFbP1T+QPYHF44SLEnVzFaQ62kvf9kS9B/s+wsFROa+0wGQ
	qTk61RrD9VC32E1sRMWHbCYsE5rOilFgi8cZ/yplrAC74je2P+21447U62mAagQBoiHf
	TNtTjL76Q/rT5uoYh9INnDzMUrUsozXS6DEp0=
MIME-Version: 1.0
Received: by 10.42.155.133 with SMTP id u5mr47346698icw.8.1320666607672; Mon,
	07 Nov 2011 03:50:07 -0800 (PST)
Received: by 10.142.49.10 with HTTP; Mon, 7 Nov 2011 03:50:07 -0800 (PST)
In-Reply-To: <1320055865.23193.45.camel@zakaz.uk.xensource.com>
References: <1319827031-15395-1-git-send-email-ian.jackson@eu.citrix.com>
	<1320055865.23193.45.camel@zakaz.uk.xensource.com>
Date: Mon, 7 Nov 2011 12:50:07 +0100
X-Google-Sender-Auth: t0PnX5V_HQAO11EJqicjRqdJSJA
Message-ID: <CAPLaKK511W3q3YA+wFv=AJxqFQAFyaChRXuBCd_Sh=kMz6yQ8Q@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH RFC v2 00/13] New event API
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=UTF-8
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

I'm sorry to ask such a noobish question... I'm trying to import this
patches into my source tree, but mimport seems to be unable to
correctly sort them (maybe because they seem to be in git format).
What's the best way to import them directly from my mailbox?

Thanks, Roger.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 04:06:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 04:06:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNNya-0006T6-9t; Mon, 07 Nov 2011 04:06:56 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNNtQ-0006AF-U8
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 04:01:39 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320667293!3188746!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30689 invoked from network); 7 Nov 2011 12:01:33 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 12:01:33 -0000
X-IronPort-AV: E=Sophos;i="4.69,469,1315180800"; 
   d="scan'208";a="8793508"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 12:01:33 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 12:01:33 +0000
Date: Mon, 7 Nov 2011 12:02:03 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Keir Fraser <keir.xen@gmail.com>
Subject: Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek nic problems
	(eth0 8139cp transmit queue timed out)
In-Reply-To: <CAD88F26.24242%keir.xen@gmail.com>
Message-ID: <alpine.DEB.2.00.1111071153230.3519@kaball-desktop>
References: <CAD88F26.24242%keir.xen@gmail.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="8323329-1721688556-1320667338=:3519"
Cc: "xen@lists.fedoraproject.org" <xen@lists.fedoraproject.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stabellini <Stefano.Stabellini@eu.citrix.com>, Stefano
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--8323329-1721688556-1320667338=:3519
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8BIT

On Thu, 3 Nov 2011, Keir Fraser wrote:
> On 03/11/2011 18:07, "Pasi KÃ¤rkkÃ¤inen" <pasik@iki.fi> wrote:
> 
> > On Tue, Nov 01, 2011 at 10:56:06PM +0200, Pasi KÃ¤rkkÃ¤inen wrote:
> >> On Mon, Oct 31, 2011 at 09:29:24PM +0200, Pasi KÃ¤rkkÃ¤inen wrote:
> >>> On Mon, Oct 31, 2011 at 12:24:14PM -0700, Boris Derzhavets wrote:
> >>>>    Seems to related
> >>>> 
> >>>>    https://bugs.launchpad.net/ubuntu/+source/xen/+bug/854829
> >>>> 
> >>> 
> >>> Thanks, that seems to be the same bug.
> >>> 
> >>> Is the bugfix patch from xen-unstable going to backported to
> >>> xen-4.1-testing.hg ?
> >>> (4.1 backported patch available on ubuntu's launchpad above..)
> >>> 
> >> 
> >> So the Ubuntu backport from xen-unstable to Xen 4.1.1 is here:
> >> https://launchpadlibrarian.net/81948978/xen-pirq-resubmit-irq.patch
> >> 
> >> It seems to be shipping in Ubuntu 11.10 xen 4.1.1-2ubuntu4.1 packages.
> >> 
> >> Does that patch look suitable to be applied to xen-4.1-testing.hg ?
> >> This bug should be fixed for Xen 4.1.3.
> > 
> > Any comments? 
> 
> This looks like a backport of Stefano's xen-unstable c/s 24007. I would like
> him to submit/ack the backport, as it is not a trivial backport of the
> xen-unstable patch.

I would rather use the following backport. Compared to the other one it
returns EINVAL in PHYSDEVOP_irq_status_query when the arguments are not
correct.

---

diff -r 8c2d76193eaf xen/arch/x86/physdev.c
--- a/xen/arch/x86/physdev.c	Wed Nov 02 15:02:18 2011 +0000
+++ b/xen/arch/x86/physdev.c	Mon Nov 07 11:58:28 2011 +0000
@@ -261,6 +261,7 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
         ret = -EINVAL;
         if ( eoi.irq >= v->domain->nr_pirqs )
             break;
+        spin_lock(&v->domain->event_lock);
         if ( v->domain->arch.pirq_eoi_map )
             evtchn_unmask(v->domain->pirq_to_evtchn[eoi.irq]);
         if ( !is_hvm_domain(v->domain) ||
@@ -268,6 +269,19 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
             ret = pirq_guest_eoi(v->domain, eoi.irq);
         else
             ret = 0;
+        if ( is_hvm_domain(v->domain) &&
+                domain_pirq_to_emuirq(v->domain, eoi.irq) > 0 )
+        {
+            struct hvm_irq *hvm_irq = &v->domain->arch.hvm_domain.irq;
+            int gsi = domain_pirq_to_emuirq(v->domain, eoi.irq);
+
+            /* if this is a level irq and count > 0, send another
+             * notification */ 
+            if ( gsi >= NR_ISAIRQS /* ISA irqs are edge triggered */
+                    && hvm_irq->gsi_assert_count[gsi] )
+                send_guest_pirq(v->domain, eoi.irq);
+        }
+        spin_unlock(&v->domain->event_lock);
         break;
     }
 
@@ -323,9 +337,10 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
             break;
         irq_status_query.flags = 0;
         if ( is_hvm_domain(v->domain) &&
-             domain_pirq_to_irq(v->domain, irq) <= 0 )
+                domain_pirq_to_irq(v->domain, irq) <= 0 &&
+                domain_pirq_to_emuirq(v->domain, irq) == IRQ_UNBOUND )
         {
-            ret = copy_to_guest(arg, &irq_status_query, 1) ? -EFAULT : 0;
+            ret = -EINVAL;
             break;
         }
 
--8323329-1721688556-1320667338=:3519
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--8323329-1721688556-1320667338=:3519--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 04:56:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 04:56:53 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNOku-0008SZ-N4; Mon, 07 Nov 2011 04:56:52 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNOk3-0008G9-8A
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 04:55:59 -0800
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-10.tower-174.messagelabs.com!1320670555!575381!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17044 invoked from network); 7 Nov 2011 12:55:55 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-10.tower-174.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 7 Nov 2011 12:55:55 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320670554; l=1328;
	s=domk; d=aepfle.de;
	h=In-Reply-To:Content-Type:MIME-Version:References:Subject:Cc:To:From:
	Date:X-RZG-CLASS-ID:X-RZG-AUTH;
	bh=PqfbRs2qxe8PWkgszjHypXObgbE=;
	b=Cgylg1XYshj9+upX8yOf/nag1RDtHALbtkJLXEfp3cxQTO1kiFukEuUykLwoMmvVLyi
	0FbjcMgUXXDb3bqhwdhVwAtmkJ0otL65xrnAWExVx4JQq4c9OIU44tC6KrukWloC4c1x4
	lId1PWfyCVDZda7OMiS2rsBilGFgGLI4ZqY=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV7HU=
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-6.vodafone-net.de [80.226.24.6])
	by post.strato.de (mrclete mo10) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id 900f94nA7CMf6Q ;
	Mon, 7 Nov 2011 13:55:37 +0100 (MET)
Received: by probook.site (Postfix, from userid 1000)
	id 6B11C18638; Mon,  7 Nov 2011 13:55:35 +0100 (CET)
Date: Mon, 7 Nov 2011 13:55:35 +0100
From: Olaf Hering <olaf@aepfle.de>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 4 of 4] xenpaging: initial libxl support
Message-ID: <20111107125535.GA16522@aepfle.de>
References: <patchbomb.1320245136@probook.site>
	<ab5406a5b1d01e3828f0.1320245140@probook.site>
	<alpine.DEB.2.00.1111071053160.3519@kaball-desktop>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <alpine.DEB.2.00.1111071053160.3519@kaball-desktop>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
Cc: George Dunlap <George.Dunlap@eu.citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 07, Stefano Stabellini wrote:

> I think that using tot_memkb to store the actual memory target and then
> checking whether is 0 to detect if paging is active/inactive is
> confusing.

tot_memkb is only set when it was specified in the config file, and
perhaps later when a suitable xl mem-FOO command and a related watch on
the targer-tot_pages node is added.

> If tot_memkb is the pod target of the domain, we should be coherent and
> set it equal to target_memkb when paging is inactive.

So far PoD and paging are unrelated and mean different things.
I think the difference between max_memkb and tot_memkb could be the
trigger to start paging.

> >   === Domain memory breakdown: PV guests ==================================
> > 
> > diff -r a51d4fab351d -r ab5406a5b1d0 tools/libxl/libxl_types.idl
> > --- a/tools/libxl/libxl_types.idl
> > +++ b/tools/libxl/libxl_types.idl
> > @@ -157,6 +157,7 @@ libxl_domain_build_info = Struct("domain
> >      ("tsc_mode",        integer),
> >      ("max_memkb",       uint32),
> >      ("target_memkb",    uint32),
> > +    ("tot_memkb",       uint32),
> >      ("video_memkb",     uint32),
> >      ("shadow_memkb",    uint32),
> >      ("disable_migrate", bool),
> 
> I would like a comment somewhere of what tot_memkb is supposed to
> represent.

Yes, sorry, docu is lacking in that change.

Olaf

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 05:29:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 05:29:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNPGQ-0000s5-Kz; Mon, 07 Nov 2011 05:29:27 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNPFM-0000eu-9H
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 05:28:20 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1320672495!2181141!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22981 invoked from network); 7 Nov 2011 13:28:17 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 13:28:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315195200"; d="scan'208";a="169621787"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 08:28:15 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX02.citrite.net
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Mon, 7 Nov 2011
	08:28:15 -0500
Message-ID: <4EB7DCEE.2020903@citrix.com>
Date: Mon, 7 Nov 2011 13:28:14 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 0/6] final conversion to new CPU mask accessors
	and away from irq_cfg
References: <4EB7B934020000780005F4A0@nat28.tlf.novell.com>
In-Reply-To: <4EB7B934020000780005F4A0@nat28.tlf.novell.com>
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 07/11/11 09:55, Jan Beulich wrote:
> This patch set completes the conversion to the new CPU mask interfaces
> and, as the final step eliminates the remaining few uses of struct irq_cfg.
>
> 1: eliminate cpus_xyz()
> 2: eliminate cpu_test_xyz()
> 3: eliminate cpu_set()
> 4: eliminate cpu_clear()
> 5: eliminate first_cpu() etc
> 6: eliminate remaining uses of struct irq_cfg
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

All look fine to me.  Glad to see irq_cfg disappear.

Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 05:30:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 05:30:35 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNPHX-0001F1-39; Mon, 07 Nov 2011 05:30:35 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNPFP-0000f0-UP
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 05:28:24 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1320672487!44653597!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26659 invoked from network); 7 Nov 2011 13:28:07 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 13:28:07 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315180800"; 
   d="scan'208";a="8795561"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 13:28:20 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 13:28:20 +0000
Date: Mon, 7 Nov 2011 13:28:51 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH 4 of 4] xenpaging: initial libxl support
In-Reply-To: <20111107125535.GA16522@aepfle.de>
Message-ID: <alpine.DEB.2.00.1111071328130.3519@kaball-desktop>
References: <patchbomb.1320245136@probook.site>
	<ab5406a5b1d01e3828f0.1320245140@probook.site>
	<alpine.DEB.2.00.1111071053160.3519@kaball-desktop>
	<20111107125535.GA16522@aepfle.de>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: Dunlap <George.Dunlap@eu.citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	George, Ian Campbell <Ian.Campbell@citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, 7 Nov 2011, Olaf Hering wrote:
> > If tot_memkb is the pod target of the domain, we should be coherent and
> > set it equal to target_memkb when paging is inactive.
> 
> So far PoD and paging are unrelated and mean different things.
> I think the difference between max_memkb and tot_memkb could be the
> trigger to start paging.

Yes, I think it would be better.
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 05:42:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 05:42:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNPT0-0002Tn-Gq; Mon, 07 Nov 2011 05:42:26 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNPST-0002HH-R0
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 05:41:54 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1320673310!579405!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14791 invoked from network); 7 Nov 2011 13:41:50 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 13:41:50 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315180800"; 
   d="scan'208";a="8795877"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 13:41:46 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 13:41:47 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RNPSM-0002dk-H0;
	Mon, 07 Nov 2011 13:41:46 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RNPSM-0005OS-A4;
	Mon, 07 Nov 2011 13:41:46 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9721-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 7 Nov 2011 13:41:46 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9721: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9721 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9721/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-i386-rhel6hvm-intel  3 host-install(3)              broken
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl           18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-credit2   18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-multivcpu 18 leak-check/check           fail REGR. vs. 9661
 build-amd64-pvops             2 host-install(2)              broken
 test-amd64-i386-xl-win-vcpus1  3 host-install(3)              broken
 test-i386-i386-xl-win         3 host-install(3)              broken

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a

version targeted for testing:
 xen                  c0702424afc5
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               broken  
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                broken  
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        broken  


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24085:c0702424afc5
tag:         tip
user:        Jan Beulich <jbeulich@suse.com>
date:        Mon Nov 07 10:29:14 2011 +0100
    
    cpufreq: allocate CPU masks dynamically
    
    struct cpufreq_policy, including a cpumask_t member, gets copied in
    cpufreq_limit_change(), cpufreq_add_cpu(), set_cpufreq_gov(), and
    set_cpufreq_para(). Make the member a cpumask_var_t, thus reducing the
    amount of data needing copying (particularly with large NR_CPUS).
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24084:721a87728b6b
user:        Jan Beulich <jbeulich@suse.com>
date:        Mon Nov 07 10:26:23 2011 +0100
    
    powernow: don't read never initialized structure member
    
    c/s 20361:51b031b0737e removed the writing of struct
    processor_performance's shared_cpu_map member, but the powernow driver
    still has code to read it (though presumably that code path can't be
    taken on actual hardware supported by the powernow driver). Remove the
    use of the field along with the field itself.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    
    
changeset:   24083:604a90b803d3
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: Remove a passthrough device through QMP.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_pci.c |   72 +++++++++++++++++++++++++++++++---------------
     1 files changed, 48 insertions(+), 24 deletions(-)
    
    
changeset:   24082:e22e108e1c57
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 15:34:50 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_del
    
    To remove a pci passthough device from QEMU (upstream).
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    ---
     tools/libxl/libxl_internal.h |    2 ++
     tools/libxl/libxl_qmp.c      |   35 +++++++++++++++++++++++++++++++++++
     2 files changed, 37 insertions(+), 0 deletions(-)
    
    
changeset:   24081:659c800d7edf
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Nov 04 15:55:50 2011 +0100
    
    x86/IRQ: fix create_irq() after c/s 24068:6928172f7ded
    
    init_one_irq_desc() must be called with interrupts enabled (as it may
    call functions from the xmalloc() group). Rather than mis-using
    vector_lock to also protect the finding of an unused IRQ, make this
    lockless through using cmpxchg(), and obtain the lock only around the
    actual assignment of the vector.
    
    Also fold find_unassigned_irq() into its only caller.
    
    It is, btw, questionable whether create_irq() calling
    __assign_irq_vector() (rather than assign_irq_vector()) is actually
    correct - desc->affinity appears to not get initialized properly in
    this case.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24080:974b00c7c2d0
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: Use QMP to insert a passthrough device when using upstream QEMU
    
    Also move the xenstore specific code to a new function and add a
    message if sscanf fails.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24079:a67944b1adfb
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 14:24:07 2011 +0000
    
    libxl: libxl_qmp: Introduce libxl__qmp_pci_add.
    
    This function insert a PCI passthrough device in qemu.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24078:c5fe74068253
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_json: Handle number above LONG_MAX.
    
    The integers are now "long long" in the json_object.
    
    If a number (decimal or integer) is too big (or too low), it is stored as it in
    a string. So for that, we introduce a new type JSON_NUMBER.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24077:8d06378f1487
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:25 2011 +0000
    
    libxl: libxl_qmp: Introduce qmp_request_context.
    
    This structure helps to track the return code of a callback. It's only used
    between qmp_synchronous_send and qmp_send.
    
    Now, qmp_synchronous_send will return the rc of the callback if there is no
    error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24076:0406f6783c65
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Always insert a command id in the callback_list.
    
    Because the function qmp_synchronous_send rely on the presence of the id
    in the callback_list.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24075:918a2091c181
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:24 2011 +0000
    
    libxl: libxl_qmp: Introduce list of arguments to qmp_send
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24074:9641b7594ed6
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl_qmp: Introduce an opaque argument to the callbacks.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24073:7b22d2f98302
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:23 2011 +0000
    
    libxl: libxl: Introduce dm-version xenstore key.
    
    The all key is /libxl/$domid/dm-version.
    
    The /libxl/$domid dir is created with the domain and should be only accessible
    by the toolstack domain. The function libxl__xs_libxl_path() give this path.
    
    This come with libxl__device_model_version_running() helper function.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24072:cf8924724b61
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Better error message after a parse error.
    
    By setting the next string to parse after having printed any error messages.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24071:bdbd100b28ae
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_json: Check the parser status before to call parse_complete
    
    Also, use goto to handle an error.
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24070:e0b6b0e68e90
user:        Anthony PERARD <anthony.perard@citrix.com>
date:        Fri Nov 04 12:38:22 2011 +0000
    
    libxl: libxl_qmp: Fix return check of fcntl
    
    Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   24069:801ca6c0fbfa
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:28:41 2011 +0100
    
    x86/IRQ: consolidate IRQ disabling when acquiring vector lock
    
    __assign_irq_vector() doesn't need to disable interrupts (its callers
    are required to when acquiring the lock), and set_desc_affinity() can
    use the normal spin lock primitives.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24068:6928172f7ded
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Nov 03 17:27:38 2011 +0100
    
    IRQ: allocate CPU masks dynamically
    
    This includes delaying the initialization of dynamically created IRQs
    until their actual first use and some further elimination of uses of
    struct irq_cfg.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
    
    
changeset:   24067:17ee4c213438
user:        Tim Deegan <tim@xen.org>
date:        Thu Nov 03 12:19:23 2011 +0000
    
    xen: provide pse36 cpuid bit
    
    Provide pse36 cpuid bit if guest runs in 32bit PAE
    or in long mode. Hyper-V refuses to start as
    the "cpu does not provide required hw features"
    if it does not find the pse36 cpuid bits.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   24066:54a5e994a241
user:        Juergen Gross <juergen.gross@ts.fujitsu.com>
date:        Wed Nov 02 17:09:09 2011 +0000
    
    docs: Correct man page of xl regarding cpu-pools
    
    Signed-off-by: juergen.gross@ts.fujitsu.com
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 06:16:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 06:16:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNPzq-00046v-Ti; Mon, 07 Nov 2011 06:16:22 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNPzM-0003uf-4A
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 06:15:52 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1320675348!585893!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20393 invoked from network); 7 Nov 2011 14:15:49 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 14:15:49 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315180800"; 
   d="scan'208";a="8796814"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 14:15:33 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 14:15:33 +0000
Date: Mon, 7 Nov 2011 14:16:03 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Chun Yan Liu <cyliu@suse.com>
Subject: Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images fail
In-Reply-To: <4EB184DE020000660000603E@novprvlin0050.provo.novell.com>
Message-ID: <alpine.DEB.2.00.1111071354570.3519@kaball-desktop>
References: <1319808450-9617-1-git-send-email-cyliu@suse.com>
	<4EB184DE020000660000603E@novprvlin0050.provo.novell.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="8323329-2005694002-1320674815=:3519"
Content-ID: <alpine.DEB.2.00.1111071407060.3519@kaball-desktop>
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--8323329-2005694002-1320674815=:3519
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8BIT
Content-ID: <alpine.DEB.2.00.1111071407061.3519@kaball-desktop>

On Wed, 2 Nov 2011, Chun Yan Liu wrote:
> Stefano, could you review the revised patch and share your comments? Thanks.

Sure.
 
> >>> Chunyan Liu <cyliu@suse.com> 10/28/2011 9:27 PM >>>
> Start qemu-nbd to mount non-raw qdisk in dom0 so that xl can create PV guest with qcow/qcow2 disk image and using pygrub.
> v2: use fork and exec instead of system(3)
> 
> Signed-off-by: Chunyan Liu <cyliu@suse.com>
> 
> diff -r b4cf57bbc3fb tools/libxl/libxl.c
> --- a/tools/libxl/libxl.cThu Oct 20 15:24:46 2011 +0800
> +++ b/tools/libxl/libxl.cFri Oct 28 20:50:36 2011 +0800
> @@ -1077,6 +1077,58 @@ out_free:
> Â Â Â Â  libxl__free_all(&gc);
> Â Â Â Â  return rc;
> }
> +static int fork_exec(char *arg0, char **args)
> +{
> +Â Â Â  pid_t pid;
> +Â Â Â  int status;
> +
> +Â Â Â  pid = fork();
> +Â Â Â  if (pid < 0)
> +Â Â Â Â Â Â Â  return -1;
> +Â Â Â  else if (pid == 0){
> +Â Â Â Â Â Â Â  execvp(arg0, args);
> +Â Â Â Â Â Â Â  exit(127);
> +Â Â Â  }
> +Â Â Â  sleep(1);

In a following email you wrote that without the sleep the device is
"not prepared yet".
What do you mean by that?
The device is present but reading/writing to it returns an error?
If so, rather than a sleep we need an explicit wait for the device
to be ready. Even trying to read from the device in a loop until it
succeeds would be better than a sleep. At least we would know exactly
what we are doing and why we are doing it.


> +Â Â Â  while (waitpid(pid, &status, 0) < 0) {
> +Â Â Â Â Â Â Â  if (errno != EINTR) {
> +Â Â Â Â Â Â Â Â Â Â Â  status = -1;
> +Â Â Â Â Â Â Â Â Â Â Â  break;
> +Â Â Â Â Â Â Â  }
> +Â Â Â  }
> +Â Â Â  return status;
> +}

Here you are waiting for the death of qemu-nbd; I thought that qemu-nbd
needs to be kept running?


> +static char * nbd_mount_disk(libxl__gc *gc, libxl_device_disk *disk)
> +{
> +Â Â Â  int i;
> +Â Â Â  int nbds_max = 16;
> +Â Â Â  char *nbd_dev = NULL;
> +Â Â Â  char *args[] = {"qemu-nbd","-c",NULL,NULL,NULL};
> +Â Â Â  char *ret = NULL;
> +
> +Â Â Â  for (i = 0; i < nbds_max; i++) {
> +Â Â Â Â Â Â Â  nbd_dev = libxl__sprintf(gc, "/dev/nbd%d", i);
> +Â Â Â Â Â Â Â  args[2] = libxl__sprintf(gc, "%s", nbd_dev);
> +Â Â Â Â Â Â Â  args[3] = libxl__sprintf(gc, "%s", disk->pdev_path);
> +Â Â Â Â Â Â Â  if (fork_exec(args[0], args) == 0) {
> +Â Â Â Â Â Â Â Â Â Â Â  ret = strdup(nbd_dev);
> +Â Â Â Â Â Â Â Â Â Â Â  break;
> +Â Â Â Â Â Â Â  }
> +Â Â Â  }
> +
> +Â Â Â  return ret;
> +}

This is not great. I would read /proc/partitions instead.
Also keep in mind that xl works on BSD now so at the very least you need
to ifdef all the linux specific code.
--8323329-2005694002-1320674815=:3519
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--8323329-2005694002-1320674815=:3519--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 06:30:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 06:30:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNQDF-0005LZ-T0; Mon, 07 Nov 2011 06:30:13 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNQCL-00058o-Kl
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 06:29:18 -0800
X-Env-Sender: universalbillow@gmail.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1320676153!2187792!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32728 invoked from network); 7 Nov 2011 14:29:14 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-11.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 14:29:14 -0000
Received: by ggnr5 with SMTP id r5so1468168ggn.30
	for <xen-devel@lists.xensource.com>;
	Mon, 07 Nov 2011 06:29:13 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type;
	bh=B6lz0dsrxmCS2wftwGu/3z1HgnWUo2WNAFru4Iddg6c=;
	b=xrEK3ao3156stplEtBSFHu8t2IMfaEFgUb31+KSQQY+w0zpPebm3iA9f3NKphhpfhO
	z7BfpqS4cCk1K2F/oyb+T/a61Qprjf4sAiCohbdME5ccH1B1nEy7htUuJYNZNz0ww0SZ
	W1priPLmEhFd8jLtGg0ekj+0VhAz6NXwYnyj4=
MIME-Version: 1.0
Received: by 10.236.78.225 with SMTP id g61mr15727644yhe.7.1320676152968; Mon,
	07 Nov 2011 06:29:12 -0800 (PST)
Received: by 10.236.36.2 with HTTP; Mon, 7 Nov 2011 06:29:12 -0800 (PST)
In-Reply-To: <1320659859.955.4.camel@zakaz.uk.xensource.com>
References: <CADWh-PGMZXWnnSqB5zmSTnLSR66EtX9WnXcn=ZZLNQ=P5mGV7g@mail.gmail.com>
	<1320659859.955.4.camel@zakaz.uk.xensource.com>
Date: Mon, 7 Nov 2011 22:29:12 +0800
Message-ID: <CADWh-PE+eGSrkP3N9j3maR-hcH7ptVHMGWd-D361YM4dmjegOg@mail.gmail.com>
Subject: Re: [Xen-devel] Question about HVM network
From: cc Luit <universalbillow@gmail.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1790468016=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1790468016==
Content-Type: multipart/alternative; boundary=20cf300fb2fff6091104b125e0a2

--20cf300fb2fff6091104b125e0a2
Content-Type: text/plain; charset=ISO-8859-1

On Mon, Nov 7, 2011 at 5:57 PM, Ian Campbell <Ian.Campbell@citrix.com>wrote:

> On Sun, 2011-11-06 at 14:12 +0000, cc Luit wrote:
> > Hi, all,
> >
> >
> > I've a question about how network of HVM works,
> > when hvm startup, I found the qemu register the io port 0xc100-0xc1ff
> > to the function rtl8139_ioport_write, is this means qemu emulate the
> > rtl8139 NIC to handle network io event?
>
> > I think this is the default. You can select a different emulated NIC
> > using e.g. "model=e1000" in your VIF stanza in the guest configuration
> > file.
>
> > but when I scp a file to the remote machine, I cannot find any write
> > to these ports, so I'm curious how hvm's network works?
>
> > Perhaps you have ended up with PVHVM network driver? This will take
> > precedence to the emulated NIC if present.
>

Thanks, then can you tell me how PVHVM works, and how can I know if I use
it?
and I digged into the rtl8139's driver codes and emulated one in
qemu-tools, I found that the hvm use the mmio rather than pio to inform the
NIC to poll the descriptor, I think that's why there is no write to the
port io, but I'm still curious why qemu need to register the ports to those
functions?

>
> Ian.
>
> >
> >
> > first I'm not using the passthrough, so I think that it will use DMA:
> > after it write the content to the memory, it will use PIO to write to
> > one of the port to tell the qemu it need to start DMA, but there is no
> > write to the port, then how does the rtc8139 emulated by qemu know
> > when to start the DMA and where is the memory address?
> >
> >
> > hope someone can help me~ thanks in advance.
> >
> >
> > --
> > - Luit @ Parallel Processing Institute, Fudan University
> >
>
>
>


-- 
- Luit @ Parallel Processing Institute, Fudan University

--20cf300fb2fff6091104b125e0a2
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<br><br><div class=3D"gmail_quote">On Mon, Nov 7, 2011 at 5:57 PM, Ian Camp=
bell <span dir=3D"ltr">&lt;<a href=3D"mailto:Ian.Campbell@citrix.com">Ian.C=
ampbell@citrix.com</a>&gt;</span> wrote:<br><blockquote class=3D"gmail_quot=
e" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"=
>
<div class=3D"im">On Sun, 2011-11-06 at 14:12 +0000, cc Luit wrote:<br>
&gt; Hi, all,<br>
&gt;<br>
&gt;<br>
&gt; I&#39;ve a question about how network of HVM works,<br>
&gt; when hvm startup, I found the qemu register the io port 0xc100-0xc1ff<=
br>
&gt; to the function rtl8139_ioport_write, is this means qemu emulate the<b=
r>
&gt; rtl8139 NIC to handle network io event?<br>
<br>
</div>&gt; I think this is the default. You can select a different emulated=
 NIC<br>&gt; using e.g. &quot;model=3De1000&quot; in your VIF stanza in the=
 guest configuration<br>&gt; file.<br>
<div class=3D"im"><br>
&gt; but when I scp a file to the remote machine, I cannot find any write<b=
r>
&gt; to these ports, so I&#39;m curious how hvm&#39;s network works?<br>
<br>
</div>&gt; Perhaps you have ended up with PVHVM network driver? This will t=
ake<br>&gt; precedence to the emulated NIC if present.<br></blockquote><div=
><br></div><div>Thanks, then can you tell me how PVHVM works, and how can I=
 know if I use it?</div>
<div>and I digged into the rtl8139&#39;s driver codes and emulated one in q=
emu-tools, I found that the hvm use the mmio rather than pio to inform the =
NIC to poll the descriptor, I think that&#39;s why there is no write to the=
 port io, but I&#39;m still curious why qemu need to register the ports to =
those functions?</div>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex;">
<font color=3D"#888888"><br>
Ian.<br>
</font><div><div></div><div class=3D"h5"><br>
&gt;<br>
&gt;<br>
&gt; first I&#39;m not using the passthrough, so I think that it will use D=
MA:<br>
&gt; after it write the content to the memory, it will use PIO to write to<=
br>
&gt; one of the port to tell the qemu it need to start DMA, but there is no=
<br>
&gt; write to the port, then how does the rtc8139 emulated by qemu know<br>
&gt; when to start the DMA and where is the memory address?<br>
&gt;<br>
&gt;<br>
&gt; hope someone can help me~ thanks in advance.<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; - Luit @ Parallel Processing Institute, Fudan University<br>
&gt;<br>
<br>
<br>
</div></div></blockquote></div><br><br clear=3D"all"><div><br></div>-- <br>=
- Luit @ Parallel Processing Institute, Fudan University=A0<br>

--20cf300fb2fff6091104b125e0a2--


--===============1790468016==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1790468016==--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 06:34:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 06:34:39 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNQHX-0005o5-Nf; Mon, 07 Nov 2011 06:34:39 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNQGr-0005ak-Hy
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 06:33:57 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1320676434!3215797!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2232 invoked from network); 7 Nov 2011 14:33:54 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-10.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 14:33:54 -0000
Received: by wyh11 with SMTP id 11so6031193wyh.30
	for <xen-devel@lists.xensource.com>;
	Mon, 07 Nov 2011 06:33:53 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=c/eTnHorGRE8T5e9a3f4pFBhyr8MqY78j0oj9ssFIHg=;
	b=L+KR/z8GLIElPtipRCnVWnuwKduWVpWBwv6SFRgLFRcnMYasklb+X/hp9zDnhp+N0r
	ph57yfJkZDGI5WUlt9251Hc6hKceg/ByyCc3ENOqScfaWTxHORPm85KqGnkECcSY5mac
	KzUnUXMeV3Ox3FHlLKoVnr8n/fZUFokXvFYN8=
Received: by 10.181.11.170 with SMTP id ej10mr3260592wid.28.1320676433312;
	Mon, 07 Nov 2011 06:33:53 -0800 (PST)
Received: from [192.168.1.3] (host86-129-249-120.range86-129.btcentralplus.com.
	[86.129.249.120])
	by mx.google.com with ESMTPS id dn5sm5244952wib.4.2011.11.07.06.33.49
	(version=SSLv3 cipher=OTHER); Mon, 07 Nov 2011 06:33:52 -0800 (PST)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Mon, 07 Nov 2011 14:33:41 +0000
Subject: Re: [Xen-devel] [PATCH] IRQ: move a few more bits into common code
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CADD9CC5.33ACE%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] IRQ: move a few more bits into common code
Thread-Index: AcydWj6dYWodmaBeLEC239IMPs03jw==
In-Reply-To: <4EB7BA9B020000780005F4CD@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 07/11/2011 10:01, "Jan Beulich" <JBeulich@suse.com> wrote:

> ... as they're not really arch-specific.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> --- a/xen/arch/ia64/xen/irq.c
> +++ b/xen/arch/ia64/xen/irq.c
> @@ -105,15 +105,6 @@ void __do_IRQ_guest(int irq);
>   * Special irq handlers.
>   */
>  
> -void no_action(int cpl, void *dev_id, struct pt_regs *regs) { }
> -
> -/*
> - * Generic no controller code
> - */
> -
> -static void enable_none(unsigned int irq) { }
> -static unsigned int startup_none(unsigned int irq) { return 0; }
> -static void disable_none(unsigned int irq) { }
>  static void ack_none(unsigned int irq)
>  {
>  /*
> @@ -124,18 +115,14 @@ static void ack_none(unsigned int irq)
> printk(KERN_ERR "Unexpected irq vector 0x%x on CPU %u!\n", irq,
> smp_processor_id());
>  }
>  
> -/* startup is the same as "enable", shutdown is same as "disable" */
> -#define shutdown_none disable_none
> -#define end_none enable_none
> -
>  hw_irq_controller no_irq_type = {
> - "none",
> - startup_none,
> - shutdown_none,
> - enable_none,
> - disable_none,
> - ack_none,
> - end_none
> + .typename = "none",
> + .startup = irq_startup_none,
> + .shutdown = irq_shutdown_none,
> + .enable = irq_enable_none,
> + .disable = irq_disable_none,
> + .ack = ack_none,
> + .end = irq_actor_none
>  };
>  
>  /*
> --- a/xen/arch/x86/irq.c
> +++ b/xen/arch/x86/irq.c
> @@ -356,10 +356,6 @@ int __init init_irq_data(void)
>  
>  static void __do_IRQ_guest(int vector);
>  
> -void no_action(int cpl, void *dev_id, struct cpu_user_regs *regs) { }
> -
> -void irq_actor_none(struct irq_desc *desc) { }
> -unsigned int irq_startup_none(struct irq_desc *desc) { return 0; }
>  static void ack_none(struct irq_desc *desc)
>  {
>      ack_bad_irq(desc->irq);
> --- a/xen/common/irq.c
> +++ b/xen/common/irq.c
> @@ -26,3 +26,16 @@ int init_one_irq_desc(struct irq_desc *d
>  
>      return err;
>  }
> +
> +void no_action(int cpl, void *dev_id, struct cpu_user_regs *regs)
> +{
> +}
> +
> +void irq_actor_none(struct irq_desc *desc)
> +{
> +}
> +
> +unsigned int irq_startup_none(struct irq_desc *desc)
> +{
> +    return 0;
> +}
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 06:40:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 06:40:30 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNQNB-0006JM-UR; Mon, 07 Nov 2011 06:40:29 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNQMR-00066E-Ou
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 06:39:44 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1320676779!584958!1
X-Originating-IP: [137.65.248.74]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11077 invoked from network); 7 Nov 2011 14:39:40 -0000
Received: from novprvoes0310.provo.novell.com (HELO
	novprvoes0310.provo.novell.com) (137.65.248.74)
	by server-13.tower-174.messagelabs.com with SMTP;
	7 Nov 2011 14:39:40 -0000
Received: from INET-PRV-MTA by novprvoes0310.provo.novell.com
	with Novell_GroupWise; Mon, 07 Nov 2011 07:39:38 -0700
Message-Id: <4EB7FBB7020000780005F5E9@novprvoes0310.provo.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 Beta 
Date: Mon, 07 Nov 2011 07:39:35 -0700
From: "Jan Beulich" <JBeulich@suse.com>
To: "Keir Fraser" <keir@xen.org>
Subject: Re: [Xen-devel] [PATCH 3/6] eliminate cpu_set()
References: <4EB7B997020000780005F4AC@nat28.tlf.novell.com>
	<CADD9C5F.33ACB%keir@xen.org>
In-Reply-To: <CADD9C5F.33ACB%keir@xen.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 07.11.11 at 15:31, Keir Fraser <keir@xen.org> wrote:
> On 07/11/2011 09:57, "Jan Beulich" <JBeulich@suse.com> wrote:
>=20
>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>=20
> I don't like set_cpu_{present,online} taking a boolean clear/set flag. =
There
> is no caller that can both set and clear a flag, so it is always =
hardcoded
> as 0 or 1. And then the reader has to make a (probably not hard) guess =
what
> that means.
>=20
> If you must add an abstraction interface here, better to define four of
> them: {set,clear}_cpu_{present,online}.

Hmm, I don't like this interface design too much either, but again wanted
to follow Linux rather than cooking our own. Do you really want us to
diverge in this respect?

Jan

> Apart from this, all patches are:
> Acked-by: Keir Fraser <keir@xen.org>
>=20
>  -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 06:49:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 06:49:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNQVa-0006qE-D3; Mon, 07 Nov 2011 06:49:10 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNQUs-0006dd-9Y
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 06:48:26 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1320677303!2593645!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23718 invoked from network); 7 Nov 2011 14:48:23 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-3.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 14:48:23 -0000
Received: by wyh11 with SMTP id 11so6050300wyh.30
	for <xen-devel@lists.xensource.com>;
	Mon, 07 Nov 2011 06:48:23 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=VqS91bY2ChKd2xsFt+aUJzbcOX67AgHSwc0nvZW+2J8=;
	b=f7vV3ScVTcFUtftKhhMVLfeuR1xGABhr4wcELwG3XpNTaGOsjXK78sae+LOyZtDLqn
	5A1KJ5xLseYyEFpzWhXXwwSB/015pOJ4cMQ7QBbvIb3MMLgOk2LouqyGZ4AQN1ZVlzPz
	0gBFsr5G0gllfW4zmNOqyVr+uIWuZ7IaP8klM=
Received: by 10.180.107.229 with SMTP id hf5mr8098171wib.35.1320677303180;
	Mon, 07 Nov 2011 06:48:23 -0800 (PST)
Received: from [192.168.1.3] (host86-129-249-120.range86-129.btcentralplus.com.
	[86.129.249.120])
	by mx.google.com with ESMTPS id i8sm5267877wie.11.2011.11.07.06.48.21
	(version=SSLv3 cipher=OTHER); Mon, 07 Nov 2011 06:48:22 -0800 (PST)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Mon, 07 Nov 2011 14:48:15 +0000
Subject: Re: [Xen-devel] [PATCH 3/6] eliminate cpu_set()
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <CADDA02F.33AD3%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH 3/6] eliminate cpu_set()
Thread-Index: AcydXEeOwIYL+qRjyUm0FtGj++bABg==
In-Reply-To: <4EB7FBB7020000780005F5E9@novprvoes0310.provo.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 07/11/2011 14:39, "Jan Beulich" <JBeulich@suse.com> wrote:

>> I don't like set_cpu_{present,online} taking a boolean clear/set flag. There
>> is no caller that can both set and clear a flag, so it is always hardcoded
>> as 0 or 1. And then the reader has to make a (probably not hard) guess what
>> that means.
>> 
>> If you must add an abstraction interface here, better to define four of
>> them: {set,clear}_cpu_{present,online}.
> 
> Hmm, I don't like this interface design too much either, but again wanted
> to follow Linux rather than cooking our own. Do you really want us to
> diverge in this respect?

Yes. Apart from maybe the code that tickles the remote APIC, our smpboot
code is already well diverged from Linux.

 -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 06:51:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 06:51:41 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNQY1-0007FG-Q1; Mon, 07 Nov 2011 06:51:41 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNQXT-000732-Gt
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 06:51:07 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1320677464!2492599!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15471 invoked from network); 7 Nov 2011 14:51:04 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 14:51:04 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315180800"; 
   d="scan'208";a="8797722"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 14:51:04 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Mon, 7 Nov 2011
	14:51:04 +0000
Subject: Re: [Xen-devel] Question about HVM network
From: Ian Campbell <Ian.Campbell@citrix.com>
To: cc Luit <universalbillow@gmail.com>
Date: Mon, 7 Nov 2011 14:51:04 +0000
In-Reply-To: <CADWh-PE+eGSrkP3N9j3maR-hcH7ptVHMGWd-D361YM4dmjegOg@mail.gmail.com>
References: <CADWh-PGMZXWnnSqB5zmSTnLSR66EtX9WnXcn=ZZLNQ=P5mGV7g@mail.gmail.com>
	<1320659859.955.4.camel@zakaz.uk.xensource.com>
	<CADWh-PE+eGSrkP3N9j3maR-hcH7ptVHMGWd-D361YM4dmjegOg@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320677464.955.39.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, 2011-11-07 at 14:29 +0000, cc Luit wrote:
> 
> 
> On Mon, Nov 7, 2011 at 5:57 PM, Ian Campbell <Ian.Campbell@citrix.com>
> wrote:
>         On Sun, 2011-11-06 at 14:12 +0000, cc Luit wrote:
>         > Hi, all,
>         >
>         >
>         > I've a question about how network of HVM works,
>         > when hvm startup, I found the qemu register the io port
>         0xc100-0xc1ff
>         > to the function rtl8139_ioport_write, is this means qemu
>         emulate the
>         > rtl8139 NIC to handle network io event?
>         
>         
>         > I think this is the default. You can select a different
>         emulated NIC
>         > using e.g. "model=e1000" in your VIF stanza in the guest
>         configuration
>         > file.
>         
>         > but when I scp a file to the remote machine, I cannot find
>         any write
>         > to these ports, so I'm curious how hvm's network works?
>         
>         
>         > Perhaps you have ended up with PVHVM network driver? This
>         will take
>         > precedence to the emulated NIC if present.
> 
> 
> Thanks, then can you tell me how PVHVM works, and how can I know if I
> use it?

"ethtool -i <device>" should tell you which driver is in use. How to
configure PVHVM is more of a xen-users@ question. You might find
http://wiki.xen.org/xenwiki/XenLinuxPVonHVMdrivers useful though.

> and I digged into the rtl8139's driver codes and emulated one in
> qemu-tools, I found that the hvm use the mmio rather than pio to
> inform the NIC to poll the descriptor, I think that's why there is no
> write to the port io, but I'm still curious why qemu need to register
> the ports to those functions?

Presumably a real rtl8139 has functionality there, so qemu has to
emulate said functionality. The fact that the particular driver in Linux
doesn't use it isn't really relevant. Many cards have multiple ways you
can drive them, often both PIO and MMIO, whole many drivers only use on
or the other.

Ian.

>         
>         Ian.
>         
>         
>         >
>         >
>         > first I'm not using the passthrough, so I think that it will
>         use DMA:
>         > after it write the content to the memory, it will use PIO to
>         write to
>         > one of the port to tell the qemu it need to start DMA, but
>         there is no
>         > write to the port, then how does the rtc8139 emulated by
>         qemu know
>         > when to start the DMA and where is the memory address?
>         >
>         >
>         > hope someone can help me~ thanks in advance.
>         >
>         >
>         > --
>         > - Luit @ Parallel Processing Institute, Fudan University
>         >
>         
>         
>         
> 
> 
> 
> 
> -- 
> - Luit @ Parallel Processing Institute, Fudan University 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 06:53:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 06:53:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNQZW-0007dN-GX; Mon, 07 Nov 2011 06:53:14 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNQYx-0007Qg-KC
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 06:52:39 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1320677555!2197392!1
X-Originating-IP: [137.65.248.74]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8228 invoked from network); 7 Nov 2011 14:52:36 -0000
Received: from novprvoes0310.provo.novell.com (HELO
	novprvoes0310.provo.novell.com) (137.65.248.74)
	by server-10.tower-182.messagelabs.com with SMTP;
	7 Nov 2011 14:52:36 -0000
Received: from INET-PRV-MTA by novprvoes0310.provo.novell.com
	with Novell_GroupWise; Mon, 07 Nov 2011 07:52:35 -0700
Message-Id: <4EB7FEBE020000780005F601@novprvoes0310.provo.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 Beta 
Date: Mon, 07 Nov 2011 07:52:30 -0700
From: "Jan Beulich" <JBeulich@suse.com>
To: "Keir Fraser" <keir@xen.org>
Subject: Re: [Xen-devel] [PATCH 3/6] eliminate cpu_set()
References: <4EB7FBB7020000780005F5E9@novprvoes0310.provo.novell.com>
	<CADDA02F.33AD3%keir@xen.org>
In-Reply-To: <CADDA02F.33AD3%keir@xen.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 07.11.11 at 15:48, Keir Fraser <keir@xen.org> wrote:
> On 07/11/2011 14:39, "Jan Beulich" <JBeulich@suse.com> wrote:
>=20
>>> I don't like set_cpu_{present,online} taking a boolean clear/set flag. =
There
>>> is no caller that can both set and clear a flag, so it is always =
hardcoded
>>> as 0 or 1. And then the reader has to make a (probably not hard) guess =
what
>>> that means.
>>>=20
>>> If you must add an abstraction interface here, better to define four =
of
>>> them: {set,clear}_cpu_{present,online}.
>>=20
>> Hmm, I don't like this interface design too much either, but again =
wanted
>> to follow Linux rather than cooking our own. Do you really want us to
>> diverge in this respect?
>=20
> Yes. Apart from maybe the code that tickles the remote APIC, our smpboot
> code is already well diverged from Linux.

In that case I'd prefer not having a separate abstraction here at all - is
that fine by you?

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 06:55:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 06:55:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNQc5-00088A-Vg; Mon, 07 Nov 2011 06:55:54 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNQZl-0007hu-TW
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 06:53:30 -0800
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1320677605!1666579!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23803 invoked from network); 7 Nov 2011 14:53:26 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-5.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 14:53:26 -0000
Received: by ywp17 with SMTP id 17so8182200ywp.30
	for <xen-devel@lists.xensource.com>;
	Mon, 07 Nov 2011 06:53:25 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:cc:content-type
	:content-transfer-encoding;
	bh=4ijLdRViyRgp+oMVtT6S3bbXmBD3eR3SIEe0ovekFgU=;
	b=KWIumedfKO+1YBW0xrzTCAbetG16LmMQfZjpxGKhVglfM8jtHqAhBN5Q9zuBTVb6a9
	mKtZYx8Q6qTuon4qfYwAm9yT1rNhzy8heJaOtHKbpnrhNZoaRsW+aAvOOPr4HWjFQpP1
	R7VvyMvy15RzGFFvJK8eRO73zKH+4yoacfwxw=
MIME-Version: 1.0
Received: by 10.42.161.132 with SMTP id t4mr20463548icx.16.1320677604914; Mon,
	07 Nov 2011 06:53:24 -0800 (PST)
Received: by 10.142.49.10 with HTTP; Mon, 7 Nov 2011 06:53:24 -0800 (PST)
In-Reply-To: <alpine.DEB.2.00.1111071354570.3519@kaball-desktop>
References: <1319808450-9617-1-git-send-email-cyliu@suse.com>
	<4EB184DE020000660000603E@novprvlin0050.provo.novell.com>
	<alpine.DEB.2.00.1111071354570.3519@kaball-desktop>
Date: Mon, 7 Nov 2011 15:53:24 +0100
X-Google-Sender-Auth: f24vmGoEYTZVldnEc-LUhLltvlM
Message-ID: <CAPLaKK7J-JgrVUedu1NsWVZk929zTqQ4BHzdYoET0iGaKG75rQ@mail.gmail.com>
Subject: Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images fail
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Chun Yan Liu <cyliu@suse.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

2011/11/7 Stefano Stabellini <stefano.stabellini@eu.citrix.com>:
>> +static int fork_exec(char *arg0, char **args)
>> +{
>> +=C2=A0=C2=A0=C2=A0 pid_t pid;
>> +=C2=A0=C2=A0=C2=A0 int status;
>> +
>> +=C2=A0=C2=A0=C2=A0 pid =3D fork();
>> +=C2=A0=C2=A0=C2=A0 if (pid < 0)
>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return -1;
>> +=C2=A0=C2=A0=C2=A0 else if (pid =3D=3D 0){
>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 execvp(arg0, args);
>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 exit(127);
>> +=C2=A0=C2=A0=C2=A0 }
>> +=C2=A0=C2=A0=C2=A0 sleep(1);
>
> In a following email you wrote that without the sleep the device is
> "not prepared yet".
> What do you mean by that?
> The device is present but reading/writing to it returns an error?
> If so, rather than a sleep we need an explicit wait for the device
> to be ready. Even trying to read from the device in a loop until it
> succeeds would be better than a sleep. At least we would know exactly
> what we are doing and why we are doing it.

I really don't understand why a sleep is needed before executing
waitpid, I would understand that you wait before accessing the device
(although, as Stefano noticed, it's not the preferred way), but this
wait should not be done here, in fact I think the fork_exec function
should be added to libxl_exec.c and made public. I have a patch with a
libxl__forkexec function prepared for submission, which might come in
handy here.

>> +=C2=A0=C2=A0=C2=A0 while (waitpid(pid, &status, 0) < 0) {
>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (errno !=3D EINTR) {
>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 stat=
us =3D -1;
>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 brea=
k;
>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
>> +=C2=A0=C2=A0=C2=A0 }
>> +=C2=A0=C2=A0=C2=A0 return status;
>> +}
>> +static char * nbd_mount_disk(libxl__gc *gc, libxl_device_disk *disk)
>> +{
>> +=C2=A0=C2=A0=C2=A0 int i;
>> +=C2=A0=C2=A0=C2=A0 int nbds_max =3D 16;
>> +=C2=A0=C2=A0=C2=A0 char *nbd_dev =3D NULL;
>> +=C2=A0=C2=A0=C2=A0 char *args[] =3D {"qemu-nbd","-c",NULL,NULL,NULL};
>> +=C2=A0=C2=A0=C2=A0 char *ret =3D NULL;
>> +
>> +=C2=A0=C2=A0=C2=A0 for (i =3D 0; i < nbds_max; i++) {
>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 nbd_dev =3D libxl__sprintf(g=
c, "/dev/nbd%d", i);
>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 args[2] =3D libxl__sprintf(g=
c, "%s", nbd_dev);
>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 args[3] =3D libxl__sprintf(g=
c, "%s", disk->pdev_path);
>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (fork_exec(args[0], args)=
 =3D=3D 0) {
>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ret =
=3D strdup(nbd_dev);
>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 brea=
k;
>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
>> +=C2=A0=C2=A0=C2=A0 }
>> +
>> +=C2=A0=C2=A0=C2=A0 return ret;
>> +}
>
> This is not great. I would read /proc/partitions instead.
> Also keep in mind that xl works on BSD now so at the very least you need
> to ifdef all the linux specific code.

I would rather say that xl is closer to working on BSD now, but nbd is
not supported on BSD (neither is qdisk), so anything related to nbd
should be keept as Linux specific code.

Regards, Roger.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 07:02:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 07:02:29 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNQiS-0000BP-Lx; Mon, 07 Nov 2011 07:02:28 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNQfB-0008Nl-62
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 06:59:17 -0800
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1320677941!3239115!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6997 invoked from network); 7 Nov 2011 14:59:01 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-4.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 14:59:01 -0000
Received: by wwf4 with SMTP id 4so5576759wwf.24
	for <xen-devel@lists.xensource.com>;
	Mon, 07 Nov 2011 06:59:01 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:content-type:mime-version:content-transfer-encoding:subject
	:x-mercurial-node:message-id:user-agent:date:from:to:cc;
	bh=46K/nqu3J72VT2++I3JC4c5pjnHmtH8UdzJhEGpJjVA=;
	b=lyh/mkSGeMIBZdE6Hxt6Z99lX8G6Ud00+cON8SRjkneFIEfkcBR4ImbpoQMPcyb7HJ
	+W605ATxo2WG7hymYj9t01pfXznM7lwmQvjAk8RZgBmuGcRqj34wIo/P1VP5qBUKJln0
	xsNfAozUbjsIY8ixg+nT25fGN2BNwretx8oqg=
Received: by 10.216.132.215 with SMTP id o65mr7264287wei.17.1320677941660;
	Mon, 07 Nov 2011 06:59:01 -0800 (PST)
Received: from loki.upc.es (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id u2sm4029920wbm.21.2011.11.07.06.58.59
	(version=TLSv1/SSLv3 cipher=OTHER);
	Mon, 07 Nov 2011 06:59:00 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: df25a1143fcb3f8da24df033ac11d6e431992eb8
Message-Id: <df25a1143fcb3f8da24d.1320677936@loki.upc.es>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Mon, 07 Nov 2011 15:58:56 +0100
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Cc: cyliu@suse.com
Subject: [Xen-devel] [PATCH] libxl: add libxl__forkexec function to
	libxl_exec
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Roger Pau Monne <roger.pau@entel.upc.edu>
# Date 1320677864 -3600
# Node ID df25a1143fcb3f8da24df033ac11d6e431992eb8
# Parent  26b36adc549cbb0856e15f59d3e69dd8255b3c3b
libxl: add libxl__forkexec function to libxl_exec

Add a new function to libxl_exec that performs a fork and executes the passed arguments using libxl__exec.

I was going to submit this as a part of the hotplug script calling from libxl series, but since it seems to be interesting for qcow/qcow2 support I decided to submit it separately.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 26b36adc549c -r df25a1143fcb tools/libxl/libxl_exec.c
--- a/tools/libxl/libxl_exec.c	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/libxl/libxl_exec.c	Mon Nov 07 15:57:44 2011 +0100
@@ -450,6 +450,40 @@ int libxl__spawn_check(libxl__gc *gc, li
     return ERROR_FAIL;
 }
 
+int libxl__forkexec(libxl__gc *gc, int stdinfd, int stdoutfd,
+                    int stderrfd, char **args)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    int status;
+    int rc = 0;
+    pid_t pid = fork();
+
+    switch (pid) {
+    case -1:
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "fork failed\n");
+        rc = -1;
+        break;
+    case 0:
+        libxl__exec(stdinfd, stdoutfd, stderrfd, args[0], args);
+        /* libxl__exec never returns */
+    default:
+        while (waitpid(pid, &status, 0) < 0) {
+            if (errno != EINTR) {
+                LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "waitpid failed\n");
+                rc = -1;
+                break;
+            }
+        }
+        if (WIFEXITED(status)) {
+            rc = WEXITSTATUS(status);
+        } else {
+            rc = -1;
+        }
+        break;
+    }
+    return rc;
+}
+
 /*
  * Local variables:
  * mode: C
diff -r 26b36adc549c -r df25a1143fcb tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/libxl/libxl_internal.h	Mon Nov 07 15:57:44 2011 +0100
@@ -389,6 +389,20 @@ _hidden int libxl__spawn_check(libxl__gc
 _hidden void libxl__exec(int stdinfd, int stdoutfd, int stderrfd,
                const char *arg0, char **args); // logs errors, never returns
 
+/*
+ * libxl__forkexec - Executes a file synchronously
+ * gc: allocation pool
+ * stdinfd, stdoutfd, stderrfd: fds to pass to libxl__exec
+ * args: file to execute and arguments to pass in the following format
+ *      args[0]: file to execute
+ *      args[1]: first argument to pass to the called program
+ *      args[n]: nth argument to pass to the called program
+ *
+ * Returns 0 on success, and < 0 on error.
+ */
+_hidden int libxl__forkexec(libxl__gc *gc, int stdinfd, int stdoutfd,
+                            int stderrfd, char **args);
+
 /* from xl_create */
 _hidden int libxl__domain_make(libxl__gc *gc, libxl_domain_create_info *info, uint32_t *domid);
 _hidden int libxl__domain_build(libxl__gc *gc,

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 07:09:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 07:09:22 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNQp7-0000el-8U; Mon, 07 Nov 2011 07:09:21 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNQly-0000Ps-L2
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 07:06:21 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320678330!44932316!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11095 invoked from network); 7 Nov 2011 15:05:30 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 15:05:30 -0000
Received: by wwf4 with SMTP id 4so5586673wwf.24
	for <xen-devel@lists.xensource.com>;
	Mon, 07 Nov 2011 07:06:03 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=TinwZl57GOXn2FRiA3PoRz8i/hLKOBVAGcspep3uJ54=;
	b=cIYry6fWBhSYRItcoDzBrKYBriI3PTYm8Fu6/Escp+w64vbYJt+PFjljsVVPbWtrhW
	lPL1xzLjQnnOeAOk25kW874ZlAr3ibZQBa9xpwqkWxpImmAwpAXLPiZ1RYJbQQ5ySzyb
	6XiPH6zTGqiIG2EdzbzARI8y1OFCtSIoSIxyI=
Received: by 10.227.208.71 with SMTP id gb7mr29203221wbb.7.1320678363336;
	Mon, 07 Nov 2011 07:06:03 -0800 (PST)
Received: from [192.168.1.3] (host86-129-249-120.range86-129.btcentralplus.com.
	[86.129.249.120])
	by mx.google.com with ESMTPS id l20sm28075173wbo.6.2011.11.07.07.05.55
	(version=SSLv3 cipher=OTHER); Mon, 07 Nov 2011 07:06:02 -0800 (PST)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Mon, 07 Nov 2011 15:05:52 +0000
Subject: Re: [Xen-devel] [PATCH 3/6] eliminate cpu_set()
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <CADDA450.33ADD%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH 3/6] eliminate cpu_set()
Thread-Index: AcydXr2ULLkdbw+7fk6cBIleiRhJJA==
In-Reply-To: <4EB7FEBE020000780005F601@novprvoes0310.provo.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 07/11/2011 14:52, "Jan Beulich" <JBeulich@suse.com> wrote:

>>> Hmm, I don't like this interface design too much either, but again wanted
>>> to follow Linux rather than cooking our own. Do you really want us to
>>> diverge in this respect?
>> 
>> Yes. Apart from maybe the code that tickles the remote APIC, our smpboot
>> code is already well diverged from Linux.
> 
> In that case I'd prefer not having a separate abstraction here at all - is
> that fine by you?

Yes! I also would prefer no abstraction, although I'm not that fussed either
way since there are other abstractions over cpu_{online,present}_map.

 -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 07:14:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 07:14:09 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNQtk-00015b-Ul; Mon, 07 Nov 2011 07:14:08 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNQsu-0000t2-8D
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 07:13:16 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320678791!3219475!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25226 invoked from network); 7 Nov 2011 15:13:13 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 15:13:13 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315195200"; d="scan'208";a="169636506"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 10:13:11 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 10:13:11 -0500
Received: from cosworth.uk.xensource.com (cosworth.uk.xensource.com
	[10.80.16.52])	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	pA7FDAer012129;	Mon, 7 Nov 2011 07:13:10 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-ID: <patchbomb.1320678789@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Mon, 7 Nov 2011 15:13:09 +0000
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 0 of 7] xl domain config file documentation &
	other bits
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

The following contains a document describing the xl configuration file
format and the keys therein.

There is also a few incidental bits and bobs relating to documentation.

IanJ, the branch you sent me with the basis for this doc had various
other cleanups in it. I have pulled out the one which makes the "name"
parameter mandatory but have left the rest.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 07:15:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 07:15:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNQv1-0001TA-0W; Mon, 07 Nov 2011 07:15:27 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNQsu-0000t3-U5
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 07:13:17 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320678791!3219475!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25251 invoked from network); 7 Nov 2011 15:13:13 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 15:13:13 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315195200"; d="scan'208";a="169636508"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 10:13:13 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 10:13:13 -0500
Received: from cosworth.uk.xensource.com (cosworth.uk.xensource.com
	[10.80.16.52])	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	pA7FDAet012129;	Mon, 7 Nov 2011 07:13:12 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 705b2e659ff885379fb8b1c4aefbecfb3b8cc1eb
Message-ID: <705b2e659ff885379fb8.1320678791@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1320678789@cosworth.uk.xensource.com>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Mon, 7 Nov 2011 15:13:11 +0000
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 2 of 7] README: add markdown to dependency list
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1320678728 0
# Node ID 705b2e659ff885379fb8b1c4aefbecfb3b8cc1eb
# Parent  7a126dbf62d76d45a10ea55be9c354b1bd4f4bf1
README: add markdown to dependency list

although this tool is strictly speaking optional we are providing various user
docs in this format so increase the changes that they will install it.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 7a126dbf62d7 -r 705b2e659ff8 README
--- a/README	Mon Nov 07 15:12:07 2011 +0000
+++ b/README	Mon Nov 07 15:12:08 2011 +0000
@@ -55,6 +55,7 @@ provided by your OS distributor:
     * GNU gettext
     * 16-bit x86 assembler, loader and compiler (dev86 rpm or bin86 & bcc debs)
     * ACPI ASL compiler (iasl)
+    * markdown
 
 Second, you need to acquire a suitable kernel for use in domain 0. If
 possible you should use a kernel provided by your OS distributor. If

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 07:16:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 07:16:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNQvv-0001qX-6m; Mon, 07 Nov 2011 07:16:23 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNQsw-0000t4-Nw
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 07:13:19 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320678791!3219475!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25303 invoked from network); 7 Nov 2011 15:13:15 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 15:13:15 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315195200"; d="scan'208";a="169636512"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 10:13:15 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 10:13:15 -0500
Received: from cosworth.uk.xensource.com (cosworth.uk.xensource.com
	[10.80.16.52])	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	pA7FDAev012129;	Mon, 7 Nov 2011 07:13:14 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 25c3e859855f71cf25a0d607736821d4858d880a
Message-ID: <25c3e859855f71cf25a0.1320678793@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1320678789@cosworth.uk.xensource.com>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Mon, 7 Nov 2011 15:13:13 +0000
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 4 of 7] docs: fix references from xl man page to
 xldomain.cfg manpage
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1320678761 0
# Node ID 25c3e859855f71cf25a0d607736821d4858d880a
# Parent  291f6cb0d03e56e4edbe53c640c96dff85d9bf08
docs: fix references from xl man page to xldomain.cfg manpage.

They should reference the xl-domain-config document. pod2html (which I
will call shortly) doesn't like these and reports: "cannot resolve
L<xldomain.cfg> in paragraph" and similar.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 291f6cb0d03e -r 25c3e859855f docs/man/xl.pod.1
--- a/docs/man/xl.pod.1	Mon Nov 07 15:12:38 2011 +0000
+++ b/docs/man/xl.pod.1	Mon Nov 07 15:12:41 2011 +0000
@@ -54,8 +54,9 @@ previously, most commands take I<domain-
 
 =item B<create> [I<OPTIONS>] I<configfile>
 
-The create subcommand requires a config file: see L<xldomain.cfg> for
-full details of that file format and possible options.
+The create subcommand requires a config file: see
+F<xl-domain-config> for full details of that file format and
+possible options.
 
 I<configfile> can either be an absolute path to a file, or a relative
 path to a file located in /etc/xen.
@@ -232,7 +233,7 @@ FIXME: Why would you ever see this state
 
 The domain has crashed, which is always a violent ending.  Usually
 this state can only occur if the domain has been configured not to
-restart on crash.  See L<xldomain.cfg> for more info.
+restart on crash.  See F<xl-domain-config> for more info.
 
 =item B<d - dying>
 
@@ -319,8 +320,8 @@ executed the reboot action, which may be
 domain actually reboots.
 
 The behavior of what happens to a domain when it reboots is set by the
-B<on_reboot> parameter of the xldomain.cfg file when the domain was
-created.
+B<on_reboot> parameter of the domain configuration file when the
+domain was created.
 
 =item B<restore> [I<OPTIONS>] [I<ConfigFile>] I<CheckpointFile>
 
@@ -372,8 +373,8 @@ services must be shutdown in the domain.
 immediately after signally the domain unless that B<-w> flag is used.
 
 The behavior of what happens to a domain when it reboots is set by the
-B<on_shutdown> parameter of the xldomain.cfg file when the domain was
-created.
+B<on_shutdown> parameter of the domain configuration file when the
+domain was created.
 
 B<OPTIONS>
 
@@ -699,7 +700,7 @@ The domain id of the guest domain that t
 =item I<disc-spec-component>
 
 A disc specification in the same format used for the B<disk> variable in
-the domain config file. See L<xldomain.cfg>.
+the domain config file. See F<xl-disk-configuration>.
 
 =back
 
@@ -733,9 +734,9 @@ How the device should be presented to th
 
 =item I<be-dev>
 
-the device in the backend domain (usually domain 0) to be exported; it can be a
-path to a file (file://path/to/file.iso). See B<disk> in L<xldomain.cfg> for the
-details.
+the device in the backend domain (usually domain 0) to be exported; it
+can be a path to a file (file://path/to/file.iso). See B<disk> in
+F<xl-domain-config> for the details.
 
 =back
 
@@ -754,7 +755,7 @@ I<VirtualDevice> is the cdrom device in 
 
 Creates a new network device in the domain specified by I<domain-id>.
 I<network-device> describes the device to attach, using the same format as the
-B<vif> string in the domain config file. See L<xldomain.cfg> for the
+B<vif> string in the domain config file. See F<xl-domain-config> for the
 description.
 
 =item B<network-detach> I<domain-id> I<devid|mac>
@@ -795,7 +796,7 @@ List pass-through pci devices for a doma
 
 =head1 SEE ALSO
 
-B<xldomain.cfg>(5), B<xlcpupool.cfg>(5), B<xentop>(1)
+F<xl-domain-config>, B<xlcpupool.cfg>(5), B<xentop>(1)
 
 =head1 AUTHOR
 
diff -r 291f6cb0d03e -r 25c3e859855f docs/man/xm.pod.1
--- a/docs/man/xm.pod.1	Mon Nov 07 15:12:38 2011 +0000
+++ b/docs/man/xm.pod.1	Mon Nov 07 15:12:41 2011 +0000
@@ -71,7 +71,7 @@ Use the key combination Ctrl+] to detach
 
 The create subcommand requires a config file and can optionally take a
 series of I<vars> that add to or override variables defined
-in the config file.  See L<xmdomain.cfg> for full details of that file
+in the config file.  See F<xmdomain.cfg> for full details of that file
 format, and possible options used in either the configfile or for I<vars>.
 
 I<configfile> can either be an absolute path to a file, or a relative
@@ -301,7 +301,7 @@ FIXME: Why would you ever see this state
 
 The domain has crashed, which is always a violent ending.  Usually
 this state can only occur if the domain has been configured not to
-restart on crash.  See L<xmdomain.cfg> for more info.
+restart on crash.  See F<xmdomain.cfg> for more info.
 
 =item B<d - dying>
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 07:17:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 07:17:17 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNQwn-0002Da-75; Mon, 07 Nov 2011 07:17:17 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNQsz-0000tI-6w
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 07:13:22 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320678791!3219475!5
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25402 invoked from network); 7 Nov 2011 15:13:18 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 15:13:18 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315195200"; d="scan'208";a="169636517"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 10:13:17 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 10:13:17 -0500
Received: from cosworth.uk.xensource.com (cosworth.uk.xensource.com
	[10.80.16.52])	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	pA7FDAf0012129;	Mon, 7 Nov 2011 07:13:16 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: e97a5f1943e0a3641f9415e15bdeb991cf1c3bdd
Message-ID: <e97a5f1943e0a3641f94.1320678796@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1320678789@cosworth.uk.xensource.com>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Mon, 7 Nov 2011 15:13:16 +0000
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 7 of 7] docs: generate docs direct into final
	filename
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1320678761 0
# Node ID e97a5f1943e0a3641f9415e15bdeb991cf1c3bdd
# Parent  83c6d49df549f663291dbf032de70d6bab149feb
docs: generate docs direct into final filename

Nothing depends on the final document so there is not much point in generating
to a tempfile and move-if-changed.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 83c6d49df549 -r e97a5f1943e0 docs/Makefile
--- a/docs/Makefile	Mon Nov 07 15:12:41 2011 +0000
+++ b/docs/Makefile	Mon Nov 07 15:12:41 2011 +0000
@@ -132,37 +132,30 @@ html/%.html: %.markdown
 	@$(INSTALL_DIR) $(@D)
 	@set -e ; if which $(MARKDOWN) 1>/dev/null 2>/dev/null; then \
 	echo "Running markdown to generate $*.html ... "; \
-	$(MARKDOWN) $< > $@.tmp ; \
-	$(call move-if-changed,$@.tmp,$@) ; else \
+	$(MARKDOWN) $< > $@ ; else \
 	echo "markdown not installed; skipping $*.html."; fi
 
 html/man/%.1.html: man/%.pod.1 Makefile
 	$(INSTALL_DIR) $(@D)
-	$(POD2HTML) --infile=$< --outfile=$@.tmp
-	$(call move-if-changed,$@.tmp,$@)
+	$(POD2HTML) --infile=$< --outfile=$@
 
 html/man/%.5.html: man/%.pod.5 Makefile
 	$(INSTALL_DIR) $(@D)
-	$(POD2HTML) --infile=$< --outfile=$@.tmp
-	$(call move-if-changed,$@.tmp,$@)
+	$(POD2HTML) --infile=$< --outfile=$@
 
 txt/%.txt: %.txt
 	$(INSTALL_DIR) $(@D)
-	cp $< $@.tmp
-	$(call move-if-changed,$@.tmp,$@)
+	cp $< $@
 
 txt/%.txt: %.markdown
 	$(INSTALL_DIR) $(@D)
-	cp $< $@.tmp
-	$(call move-if-changed,$@.tmp,$@)
+	cp $< $@
 
 txt/man/%.1.txt: man/%.pod.1 Makefile
 	$(INSTALL_DIR) $(@D)
-	$(POD2TEXT) $< $@.tmp
-	$(call move-if-changed,$@.tmp,$@)
+	$(POD2TEXT) $< $@
 
 txt/man/%.5.txt: man/%.pod.5 Makefile
 	$(INSTALL_DIR) $(@D)
-	$(POD2TEXT) $< $@.tmp
-	$(call move-if-changed,$@.tmp,$@)
+	$(POD2TEXT) $< $@
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 07:18:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 07:18:08 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNQxc-0002ag-Ia; Mon, 07 Nov 2011 07:18:08 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNQsy-0000tF-AS
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 07:13:21 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320678791!3219475!4
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25359 invoked from network); 7 Nov 2011 15:13:17 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 15:13:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315195200"; d="scan'208";a="169636515"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 10:13:16 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 10:13:17 -0500
Received: from cosworth.uk.xensource.com (cosworth.uk.xensource.com
	[10.80.16.52])	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	pA7FDAex012129;	Mon, 7 Nov 2011 07:13:15 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 83c6d49df549f663291dbf032de70d6bab149feb
Message-ID: <83c6d49df549f663291d.1320678795@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1320678789@cosworth.uk.xensource.com>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Mon, 7 Nov 2011 15:13:15 +0000
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 6 of 7] xl: the name field in a guest config
	file is mandatory
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1320678761 0
# Node ID 83c6d49df549f663291dbf032de70d6bab149feb
# Parent  2f1fbfd8880858dba3fe18c811e3926293b6030b
xl: the name field in a guest config file is mandatory

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 2f1fbfd88808 -r 83c6d49df549 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Mon Nov 07 15:12:41 2011 +0000
+++ b/tools/libxl/xl_cmdimpl.c	Mon Nov 07 15:12:41 2011 +0000
@@ -575,8 +575,10 @@ static void parse_config_data(const char
     if (!xlu_cfg_get_long (config, "hap", &l))
         c_info->hap = l;
 
-    if (xlu_cfg_replace_string (config, "name", &c_info->name))
-        c_info->name = strdup("test");
+    if (xlu_cfg_replace_string (config, "name", &c_info->name)) {
+        fprintf(stderr, "Domain name must be specified.");
+        exit(1);
+    }
 
     if (!xlu_cfg_get_string (config, "uuid", &buf) ) {
         if ( libxl_uuid_from_string(&c_info->uuid, buf) ) {

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:10:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:10:03 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNRlp-0003yl-NE; Mon, 07 Nov 2011 08:10:01 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNRii-0003j7-NE
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:06:52 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1320682004!3230059!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2376 invoked from network); 7 Nov 2011 16:06:45 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-10.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 16:06:45 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315195200"; d="scan'208";a="169645959"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 11:06:43 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 11:06:43 -0500
Received: from cosworth.uk.xensource.com (cosworth.uk.xensource.com
	[10.80.16.52])	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	pA7G6fKw012259;	Mon, 7 Nov 2011 08:06:42 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: e4a5b7b7f9ac739bb350080524279580086e0ad9
Message-ID: <e4a5b7b7f9ac739bb350.1320682001@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1320678789@cosworth.uk.xensource.com>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Mon, 7 Nov 2011 16:06:41 +0000
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH] docs: xlexample.hvm is missing "builder = 'hvm'"
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1320681787 0
# Node ID e4a5b7b7f9ac739bb350080524279580086e0ad9
# Parent  e97a5f1943e0a3641f9415e15bdeb991cf1c3bdd
docs: xlexample.hvm is missing "builder = 'hvm'"

This is rather critical...

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r e97a5f1943e0 -r e4a5b7b7f9ac tools/examples/xlexample.hvm
--- a/tools/examples/xlexample.hvm	Mon Nov 07 15:12:41 2011 +0000
+++ b/tools/examples/xlexample.hvm	Mon Nov 07 16:03:07 2011 +0000
@@ -5,6 +5,9 @@
 # This is a fairly minimal example of what is required for an
 # HVM guest. For a more complete guide see <XXX Document TBD>
 
+# This configures an HVM rather than PV guest
+builder = "hvm"
+
 # Guest name
 name = "example.hvm"
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:11:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:11:49 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNRnZ-0004MB-DO; Mon, 07 Nov 2011 08:11:49 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNRiv-0003jH-28
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:07:03 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1320682015!2597684!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24142 invoked from network); 7 Nov 2011 16:06:57 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 16:06:57 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315195200"; d="scan'208";a="18887266"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 11:06:55 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 11:06:55 -0500
Received: from cosworth.uk.xensource.com (cosworth.uk.xensource.com
	[10.80.16.52])	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	pA7G6sG3012262;	Mon, 7 Nov 2011 08:06:54 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 30c6d81d3509a35365ac4bd68bdfdc035f768ff3
Message-ID: <30c6d81d3509a35365ac.1320682013@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1320678789@cosworth.uk.xensource.com>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Mon, 7 Nov 2011 16:06:53 +0000
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH] docs: xlexample.*: reference xl-domain-config
	document
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1320681846 0
# Node ID 30c6d81d3509a35365ac4bd68bdfdc035f768ff3
# Parent  e4a5b7b7f9ac739bb350080524279580086e0ad9
docs: xlexample.*: reference xl-domain-config document

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r e4a5b7b7f9ac -r 30c6d81d3509 tools/examples/xlexample.hvm
--- a/tools/examples/xlexample.hvm	Mon Nov 07 16:03:07 2011 +0000
+++ b/tools/examples/xlexample.hvm	Mon Nov 07 16:04:06 2011 +0000
@@ -3,7 +3,7 @@
 # =====================================================================
 #
 # This is a fairly minimal example of what is required for an
-# HVM guest. For a more complete guide see <XXX Document TBD>
+# HVM guest. For a more complete guide see <xl-domain-config>
 
 # This configures an HVM rather than PV guest
 builder = "hvm"
diff -r e4a5b7b7f9ac -r 30c6d81d3509 tools/examples/xlexample.pvlinux
--- a/tools/examples/xlexample.pvlinux	Mon Nov 07 16:03:07 2011 +0000
+++ b/tools/examples/xlexample.pvlinux	Mon Nov 07 16:04:06 2011 +0000
@@ -3,7 +3,7 @@
 # =====================================================================
 #
 # This is a fairly minimal example of what is required for a
-# Paravirtualised Linux guest. For a more complete guide see <XXX Document TBD>
+# Paravirtualised Linux guest. For a more complete guide see <xl-domain-config>
 
 # Guest name
 name = "example.pvlinux"

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:12:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:12:55 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNRod-0004ig-M4; Mon, 07 Nov 2011 08:12:55 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNRjv-0003kl-Lz
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:08:05 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320682080!3228514!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29320 invoked from network); 7 Nov 2011 16:08:00 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 16:08:00 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315180800"; 
   d="scan'208";a="8800025"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 16:08:00 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Mon, 7 Nov 2011
	16:08:00 +0000
Subject: Re: [Xen-devel] [PATCH 0 of 7] xl domain config file documentation
	& other bits
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Mon, 7 Nov 2011 16:07:59 +0000
In-Reply-To: <patchbomb.1320678789@cosworth.uk.xensource.com>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320682080.955.40.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Ian Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, 2011-11-07 at 15:13 +0000, Ian Campbell wrote:
> The following contains a document describing the xl configuration file
> format and the keys therein.

I just sent 2 additional patches:

[PATCH 8 of 7]  docs: xlexample.hvm is missing "builder = 'hvm'"
[PATCH 9 of 7]  docs: xlexample.*: reference xl-domain-config document

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:13:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:13:55 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNRpb-00055i-Iq; Mon, 07 Nov 2011 08:13:55 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNRm0-00040S-3y
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:10:13 -0800
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1320678581!47496377!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11668 invoked from network); 7 Nov 2011 15:09:42 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 15:09:42 -0000
Received: by pzd13 with SMTP id 13so7546067pzd.8
	for <xen-devel@lists.xensource.com>;
	Mon, 07 Nov 2011 07:10:06 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:from:date
	:x-google-sender-auth:message-id:subject:to:cc:content-type
	:content-transfer-encoding;
	bh=cIROJTTM2gHDgpa9InOocqbMwWTzwI8Bncd8eXs497g=;
	b=TWRlJDyk0k6mgyy7pIHkG8Fv61eesZgNIV55KuOA4BW+gmahCmK+afKSvmPgoupoj3
	/bkubl5kHfKGUoQN+gR34ZEmmrJ9A0Yd61z6IDz5qIY8poqhqlgxOdfUM8DpUK2z4gg2
	v/A0QvB5rTDGN2oS0Z5uIdBLDlSI6GYeC4w8c=
Received: by 10.182.36.36 with SMTP id n4mr8934609obj.16.1320678606151; Mon,
	07 Nov 2011 07:10:06 -0800 (PST)
MIME-Version: 1.0
Received: by 10.182.37.225 with HTTP; Mon, 7 Nov 2011 07:09:35 -0800 (PST)
In-Reply-To: <20111104174924.GA21390@phenom.dumpdata.com>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-3-git-send-email-anthony.perard@citrix.com>
	<20111104174924.GA21390@phenom.dumpdata.com>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Mon, 7 Nov 2011 15:09:35 +0000
X-Google-Sender-Auth: ZUxJ3eW9F71oVbw-qiI3AVvHTN4
Message-ID: <CAJJyHj+pwz3PvfafTTppjza7g1ZNoTKgy7cb=NOyEjW2Gp3JEA@mail.gmail.com>
Subject: Re: [Qemu-devel] [Xen-devel] [PATCH V3 02/10] Introduce HostPCIDevice
	to access a pci device on the host.
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, Nov 4, 2011 at 17:49, Konrad Rzeszutek Wilk
<konrad.wilk@oracle.com> wrote:
>> +static unsigned long get_value(HostPCIDevice *d, const char *name)
>> +{
>> + =C2=A0 =C2=A0char path[PATH_MAX];
>> + =C2=A0 =C2=A0FILE *f;
>> + =C2=A0 =C2=A0unsigned long value;
>> +
>> + =C2=A0 =C2=A0path_to(d, name, path, sizeof (path));
>> + =C2=A0 =C2=A0f =3D fopen(path, "r");
>> + =C2=A0 =C2=A0if (!f) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr, "Error: Can't open %s: %s\n=
", path, strerror(errno));
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return -1;
>
> So the decleration is 'unsigned long' but you return -1 here.
>
> Should the decleration be 'signed long' ?
>
> Or perhaps return the value as parameter and return zero for success
> and <=3D 0 for failure?

I will use an extra parameter for the value, and return the
success/failure. And check for error.

>> + =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0if (fscanf(f, "%lx\n", &value) !=3D 1) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr, "Error: Syntax error in %s\=
n", path);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0value =3D -1;
>> + =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0fclose(f);
>> + =C2=A0 =C2=A0return value;
>> +}
>> +
>> +static int pci_dev_is_virtfn(HostPCIDevice *d)
>> +{
>> + =C2=A0 =C2=A0int rc;
>> + =C2=A0 =C2=A0char path[PATH_MAX];
>> + =C2=A0 =C2=A0struct stat buf;
>> +
>> + =C2=A0 =C2=A0path_to(d, "physfn", path, sizeof (path));
>> + =C2=A0 =C2=A0rc =3D !stat(path, &buf);
>> +
>> + =C2=A0 =C2=A0return rc;
>
> Seems like this could be a 'bool'?

Yes, and the result is store in a bool :-(, so I will just change the
return type of this function.

>> +}
>> +
>> +static int host_pci_config_fd(HostPCIDevice *d)
>> +{
>> + =C2=A0 =C2=A0char path[PATH_MAX];
>> +
>> + =C2=A0 =C2=A0if (d->config_fd < 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0path_to(d, "config", path, sizeof (path));
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0d->config_fd =3D open(path, O_RDWR);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (d->config_fd < 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr, "HostPCIDevic=
e: Can not open '%s': %s\n",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0p=
ath, strerror(errno));
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0return d->config_fd;
>> +}
>> +static int host_pci_config_read(HostPCIDevice *d, int pos, void *buf, i=
nt len)
>> +{
>> + =C2=A0 =C2=A0int fd =3D host_pci_config_fd(d);
>> + =C2=A0 =C2=A0int res =3D 0;
>> +
>> + =C2=A0 =C2=A0res =3D pread(fd, buf, len, pos);
>> + =C2=A0 =C2=A0if (res < 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr, "host_pci_config: read fail=
ed: %s (fd: %i)\n",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0strerror(errno)=
, fd);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return -1;
>> + =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0return res;
>> +}
>> +static int host_pci_config_write(HostPCIDevice *d,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 int pos, const void *buf, int len=
)
>> +{
>> + =C2=A0 =C2=A0int fd =3D host_pci_config_fd(d);
>> + =C2=A0 =C2=A0int res =3D 0;
>> +
>> + =C2=A0 =C2=A0res =3D pwrite(fd, buf, len, pos);
>> + =C2=A0 =C2=A0if (res < 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr, "host_pci_config: write fai=
led: %s\n",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0strerror(errno)=
);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return -1;
>> + =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0return res;
>> +}
>> +
>> +uint8_t host_pci_get_byte(HostPCIDevice *d, int pos)
>> +{
>> + =C2=A0uint8_t buf;
>> + =C2=A0host_pci_config_read(d, pos, &buf, 1);
>
> Not checking the return value?
>> + =C2=A0return buf;
>> +}
>> +uint16_t host_pci_get_word(HostPCIDevice *d, int pos)
>> +{
>> + =C2=A0uint16_t buf;
>> + =C2=A0host_pci_config_read(d, pos, &buf, 2);
>
> Here as well?
>> + =C2=A0return le16_to_cpu(buf);
>
> So if we can't read those buffers, won't that mean we end up with
> garbage in buf? As we haven't actually written anything to it?
>
> Perhaps we should do:
>
> =C2=A0if (host_pci..() < 0)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0return 0;
> =C2=A0... normal case?

Yes, I should probably check for error. and check if pread has
actually read the size we expect.

>> +}
>> +uint32_t host_pci_get_long(HostPCIDevice *d, int pos)
>> +{
>> + =C2=A0uint32_t buf;
>> + =C2=A0host_pci_config_read(d, pos, &buf, 4);
>> + =C2=A0return le32_to_cpu(buf);
>> +}
>> +int host_pci_get_block(HostPCIDevice *d, int pos, uint8_t *buf, int len=
)
>> +{
>> + =C2=A0return host_pci_config_read(d, pos, buf, len);
>
> Oh, so that is called.. Hm, not much chance of returning an error there i=
s.

Well, errors are already check by _config_read, so this function is
just an alias.

> Can we propage the errors in case there is some fundamental failure
> when reading/writting the data stream? Say the PCI device gets
> unplugged by the user.. won't pread return -EXIO?

I could introduce another parameter, a pointer to a buffer were to
right the value, and return only success/faillure. It's should also be
a faillure if pread read less bytes then the ask size, I will fix that
as well.

And with this extra parameter, it's should be better than return 0 as
a read value.


Thanks,

--=20
Anthony PERARD

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:15:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:15:22 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNRqz-0005Te-7F; Mon, 07 Nov 2011 08:15:22 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNRoz-0004rQ-HM
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:13:18 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320678764!52120345!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21404 invoked from network); 7 Nov 2011 15:12:45 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 15:12:45 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315195200"; d="scan'208";a="18885197"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 10:13:12 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 10:13:12 -0500
Received: from cosworth.uk.xensource.com (cosworth.uk.xensource.com
	[10.80.16.52])	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	pA7FDAes012129;	Mon, 7 Nov 2011 07:13:11 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 7a126dbf62d76d45a10ea55be9c354b1bd4f4bf1
Message-ID: <7a126dbf62d76d45a10e.1320678790@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1320678789@cosworth.uk.xensource.com>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Mon, 7 Nov 2011 15:13:10 +0000
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 1 of 7] docs: report when we don't build docs
 due to a missing tool
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1320678727 0
# Node ID 7a126dbf62d76d45a10ea55be9c354b1bd4f4bf1
# Parent  c0702424afc5f7b972c26c6110f6489305844635
docs: report when we don't build docs due to a missing tool

It's useful if you are wondering why there are no docs..

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r c0702424afc5 -r 7a126dbf62d7 docs/Makefile
--- a/docs/Makefile	Mon Nov 07 10:29:14 2011 +0100
+++ b/docs/Makefile	Mon Nov 07 15:12:07 2011 +0000
@@ -58,7 +58,8 @@ python-dev-docs:
 .PHONY: man-pages
 man-pages:
 	@if which $(POD2MAN) 1>/dev/null 2>/dev/null; then \
-	$(MAKE) $(DOC_MAN1) $(DOC_MAN5); fi
+	$(MAKE) $(DOC_MAN1) $(DOC_MAN5); else              \
+	echo "pod2man not installed; skipping man-pages."; fi
 
 man1/%.1: man/%.pod.1 Makefile
 	$(INSTALL_DIR) $(@D)
@@ -120,14 +121,16 @@ html/%/index.html: src/%.tex
         echo "Running latex2html to generate $*/index.html ... "; \
 	$(LATEX2HTML) -split 0 -show_section_numbers -toc_depth 3 -nonavigation \
 	-numbered_footnotes -local_icons -noinfo -math -dir $(@D) \
-	$< 1>/dev/null 2>/dev/null ;fi
+	$< 1>/dev/null 2>/dev/null ; else \
+	echo "latex2html not installed; skipping $*."; fi
 
 html/%.html: %.markdown
 	@$(INSTALL_DIR) $(@D)
 	@set -e ; if which $(MARKDOWN) 1>/dev/null 2>/dev/null; then \
 	echo "Running markdown to generate $*.html ... "; \
 	$(MARKDOWN) $< > $@.tmp ; \
-	$(call move-if-changed,$@.tmp,$@) ; fi
+	$(call move-if-changed,$@.tmp,$@) ; else \
+	echo "markdown not installed; skipping $*.html."; fi
 
 txt/%.txt: %.txt
 	$(INSTALL_DIR) $(@D)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:16:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:16:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNRrm-0005qA-56; Mon, 07 Nov 2011 08:16:10 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNRp0-0004ri-OY
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:13:19 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320678764!52120345!3
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21501 invoked from network); 7 Nov 2011 15:12:47 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 15:12:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315195200"; d="scan'208";a="18885199"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 10:13:16 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 10:13:16 -0500
Received: from cosworth.uk.xensource.com (cosworth.uk.xensource.com
	[10.80.16.52])	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	pA7FDAew012129;	Mon, 7 Nov 2011 07:13:14 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 2f1fbfd8880858dba3fe18c811e3926293b6030b
Message-ID: <2f1fbfd8880858dba3fe.1320678794@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1320678789@cosworth.uk.xensource.com>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Mon, 7 Nov 2011 15:13:14 +0000
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 5 of 7] docs: install html and txt versions of
	manpages
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1320678761 0
# Node ID 2f1fbfd8880858dba3fe18c811e3926293b6030b
# Parent  25c3e859855f71cf25a0d607736821d4858d880a
docs: install html and txt versions of manpages

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 25c3e859855f -r 2f1fbfd88808 docs/Docs.mk
--- a/docs/Docs.mk	Mon Nov 07 15:12:41 2011 +0000
+++ b/docs/Docs.mk	Mon Nov 07 15:12:41 2011 +0000
@@ -5,6 +5,8 @@ FIG2DEV		:= fig2dev
 LATEX2HTML	:= latex2html
 DOXYGEN		:= doxygen
 POD2MAN		:= pod2man
+POD2HTML	:= pod2html
+POD2TEXT	:= pod2text
 DOT		:= dot
 NEATO		:= neato
 MARKDOWN	:= markdown
diff -r 25c3e859855f -r 2f1fbfd88808 docs/Makefile
--- a/docs/Makefile	Mon Nov 07 15:12:41 2011 +0000
+++ b/docs/Makefile	Mon Nov 07 15:12:41 2011 +0000
@@ -15,9 +15,13 @@ DOC_MARKDOWN	:= $(wildcard misc/*.markdo
 DOC_PS		:= $(patsubst src/%.tex,ps/%.ps,$(DOC_TEX))
 DOC_PDF		:= $(patsubst src/%.tex,pdf/%.pdf,$(DOC_TEX))
 DOC_HTML	:= $(patsubst src/%.tex,html/%/index.html,$(DOC_TEX)) \
-		   $(patsubst %.markdown,html/%.html,$(DOC_MARKDOWN))
+		   $(patsubst %.markdown,html/%.html,$(DOC_MARKDOWN)) \
+		   $(patsubst man/%.pod.1,html/man/%.1.html,$(DOC_MAN1SRC)) \
+		   $(patsubst man/%.pod.5,html/man/%.5.html,$(DOC_MAN5SRC))
 DOC_TXT         := $(patsubst %.txt,txt/%.txt,$(wildcard misc/*.txt)) \
-		   $(patsubst %.markdown,txt/%.txt,$(DOC_MARKDOWN))
+		   $(patsubst %.markdown,txt/%.txt,$(DOC_MARKDOWN)) \
+		   $(patsubst man/%.pod.1,txt/man/%.1.txt,$(DOC_MAN1SRC)) \
+		   $(patsubst man/%.pod.5,txt/man/%.5.txt,$(DOC_MAN5SRC))
 
 GFX = $(patsubst %.fig, %.eps, $(wildcard figs/*.fig))
 
@@ -76,7 +80,7 @@ clean:
 	$(MAKE) -C xen-api clean
 	rm -rf .word_count *.aux *.dvi *.bbl *.blg *.glo *.idx *~ 
 	rm -rf *.ilg *.log *.ind *.toc *.bak core
-	rm -rf $(GFX) ps pdf html
+	rm -rf $(GFX) ps pdf html txt
 	rm -rf api
 	rm -rf man5
 	rm -rf man1
@@ -132,6 +136,16 @@ html/%.html: %.markdown
 	$(call move-if-changed,$@.tmp,$@) ; else \
 	echo "markdown not installed; skipping $*.html."; fi
 
+html/man/%.1.html: man/%.pod.1 Makefile
+	$(INSTALL_DIR) $(@D)
+	$(POD2HTML) --infile=$< --outfile=$@.tmp
+	$(call move-if-changed,$@.tmp,$@)
+
+html/man/%.5.html: man/%.pod.5 Makefile
+	$(INSTALL_DIR) $(@D)
+	$(POD2HTML) --infile=$< --outfile=$@.tmp
+	$(call move-if-changed,$@.tmp,$@)
+
 txt/%.txt: %.txt
 	$(INSTALL_DIR) $(@D)
 	cp $< $@.tmp
@@ -141,3 +155,14 @@ txt/%.txt: %.markdown
 	$(INSTALL_DIR) $(@D)
 	cp $< $@.tmp
 	$(call move-if-changed,$@.tmp,$@)
+
+txt/man/%.1.txt: man/%.pod.1 Makefile
+	$(INSTALL_DIR) $(@D)
+	$(POD2TEXT) $< $@.tmp
+	$(call move-if-changed,$@.tmp,$@)
+
+txt/man/%.5.txt: man/%.pod.5 Makefile
+	$(INSTALL_DIR) $(@D)
+	$(POD2TEXT) $< $@.tmp
+	$(call move-if-changed,$@.tmp,$@)
+

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:17:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:17:11 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNRsl-0006Dv-0A; Mon, 07 Nov 2011 08:17:11 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNRp0-0004rh-5P
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:13:21 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320678764!52120345!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21439 invoked from network); 7 Nov 2011 15:12:45 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 15:12:45 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315195200"; d="scan'208";a="18885198"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 10:13:14 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 10:13:14 -0500
Received: from cosworth.uk.xensource.com (cosworth.uk.xensource.com
	[10.80.16.52])	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	pA7FDAeu012129;	Mon, 7 Nov 2011 07:13:13 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 291f6cb0d03e56e4edbe53c640c96dff85d9bf08
Message-ID: <291f6cb0d03e56e4edbe.1320678792@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1320678789@cosworth.uk.xensource.com>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Mon, 7 Nov 2011 15:13:12 +0000
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 3 of 7] docs: add a document describing the xl
	cfg file syntax
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1320678758 0
# Node ID 291f6cb0d03e56e4edbe53c640c96dff85d9bf08
# Parent  705b2e659ff885379fb8b1c4aefbecfb3b8cc1eb
docs: add a document describing the xl cfg file syntax

Based on an initial version by Ian Jackson.

I believe that all keys are now present in the document although there are are
various omissions in the actual documentation of them. Hopefully however this
covers the majority of the most interesting keys.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 705b2e659ff8 -r 291f6cb0d03e docs/Makefile
--- a/docs/Makefile	Mon Nov 07 15:12:08 2011 +0000
+++ b/docs/Makefile	Mon Nov 07 15:12:38 2011 +0000
@@ -11,7 +11,7 @@ DOC_MAN1SRC	:= $(wildcard man/*.pod.1)
 DOC_MAN1	:= $(patsubst man/%.pod.1,man1/%.1,$(DOC_MAN1SRC))
 DOC_MAN5	:= $(patsubst man/%.pod.5,man5/%.5,$(DOC_MAN5SRC))
 DOC_TEX		:= src/user.tex src/interface.tex
-DOC_MARKDOWN	:= $(wildcard misc/*.markdown)
+DOC_MARKDOWN	:= $(wildcard misc/*.markdown) $(wildcard user/*.markdown)
 DOC_PS		:= $(patsubst src/%.tex,ps/%.ps,$(DOC_TEX))
 DOC_PDF		:= $(patsubst src/%.tex,pdf/%.pdf,$(DOC_TEX))
 DOC_HTML	:= $(patsubst src/%.tex,html/%/index.html,$(DOC_TEX)) \
diff -r 705b2e659ff8 -r 291f6cb0d03e docs/user/xl-domain-config.markdown
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/user/xl-domain-config.markdown	Mon Nov 07 15:12:38 2011 +0000
@@ -0,0 +1,554 @@
+ # xl Domain Configuration
+
+To create a VM (a domain in Xen terminology, sometimes called a guest)
+with xl requires the provision of a domain config file.  Typically
+these live in `/etc/xen/DOMAIN.cfg` where DOMAIN is the name of the
+domain.
+
+## Work In Progress
+
+This document is a work in progress and contains items which require
+further documentation and which are generally incomplete (marked with
+XXX).  However all options are included here whether or not they are
+fully documented.
+
+Patches to improve incomplete items (or any other item) would be
+greatfully received on the [xen-devel][] mailing list. Please see
+[SubmittingXenPatches][] wiki page for information on how to submit a
+patch to Xen.
+
+[xen-devel]: mailto:xen-devel@lists.xensource.com
+[SubmittingXenPatches]: http://wiki.xen.org/xenwiki/SubmittingXenPatches
+
+----------------------------------------
+
+## Syntax
+
+A domain config file consists of a series of `KEY=VALUE` pairs.
+
+Some `KEY`s are mandatory, others are global options which apply to
+any guest type while others relate only to specific guest types
+(e.g. PV or HVM guests).
+
+A value `VALUE` is one of:
+
+ * `"STRING"`: A string, surrounded by either single or double quotes.
+ * `NUMBER`: A number, in either decimal, octal (using a `0 prefix`)
+   or hexadecimal (using an `0x` prefix`).
+ * `BOOLEAN`: A `NUMBER` interpreted as `False` (`0`) or `True` (any
+   other value).
+ * `[ VALUE, VALUE, ... ]`: A list of `VALUES` of the above
+   types. Lists are homogeneous and are not nested.
+
+The semantics of each `KEY` defines which form of `VALUE` is required.
+
+----------------------------------------
+
+## Mandatory Configuration Items
+
+The following key is mandatory for any guest type:
+
+ * `name="NAME"`: Specifies the name of the domain.  Names of domains
+   existing on a single host must be unique.
+
+## Selecting Guest Type
+
+ * `builder=hvm`: Specifies that this is to be an HVM domain.  That
+   is, a fully virtualised computer with emulated BIOS, disk and
+   network peripherals, etc.  The default is a PV domain, suitable for
+   hosting Xen-aware guest operating systems.
+
+## Global Options
+
+The following options apply to guests of any type.
+
+ * `uuid="UUID"`: Specifies the UUID of the domain.  If not specified,
+   a fresh unique UUID will be generated.
+
+ * `pool="CPUPOOLNAME"`: Put the guest's vcpus into the named cpu
+   pool.
+
+ * `vcpus=N`: Start the guest with N vcpus initially online.
+
+ * `maxvcpus=M`: Allow the guest to bring up a maximum of M vcpus. At
+   start of day if `vcpus=N` is less than `maxvcpus=M` then the first
+   `N` vcpus will be created online and the remainder will be offline.
+
+ * `memory=MBYTES`: Start the guest with MBYTES megabytes of RAM.
+
+ * `on_poweroff=ACTION`: Specifies what should be done with the domain
+   if it shuts itself down.  The options are:
+
+     * `destroy`: destroy the domain;
+     
+     * `restart`: destroy the domain and immediately create a new
+        domain with the same configuration;
+        
+     * `rename-restart`: rename the domain which terminated, and then
+       immediately create a new domain with the same configuration as
+       the original;
+
+     * `preserve`: keep the domain.  It can be examined, and later
+       destroyed with `xl destroy`.
+
+     * `coredump-destroy`: write a "coredump" of the domain to
+       `/var/xen/dump/NAME` and then destroy the domain.
+
+     * `coredump-restart`: write a "coredump" of the domain to
+       `/var/xen/dump/NAME` and then restart the domain.
+
+   The default for `on_poweroff` is `destroy`.
+
+ * `on_reboot=ACTION`: Action to take if the domain shuts down with a
+   reason code requesting a reboot.  Default is `restart`.
+
+ * `on_watchdog=ACTION`: Action to take if the domain shuts down due
+   to a Xen watchdog timeout.  Default is `destroy`.
+
+ * `on_crash=ACTION`: Action to take if the domain crashes.  Default
+   is `destroy`.
+ 
+ * `seclabel=LABEL`: Assign an XSM security label to this domain.
+
+## Devices
+
+The following options define the paravirtual, emulated and physical
+devices which the guest will contain.
+
+ * `disk=[ "DISK_SPEC_STRING", "DISK_SPEC_STRING", ...]`: Specifies
+   the disks (both emulated disks and Xen virtual block devices) which
+   are to be provided to the guest, and what objects on the they
+   should map to.  See `docs/misc/xl-disk-configuration.txt`.
+
+ * `vif=[ "NET_SPEC_STRING", "NET_SPEC_STRING", ...]`: Specifies the
+   networking provision (both emulated network adapters, and Xen
+   virtual interfaces) to provided to the guest.  See 
+   `docs/misc/xl-network-configuration.markdown`.
+
+ * `vfb=[ "VFB_SPEC_STRING", "VFB_SPEC_STRING", ...]`: Specifies the
+   paravirtual framebuffer devices which should be supplied to the domain.  
+
+   This options does not control the emulated graphics card presented
+   to an HVM guest. See "Emulated VGA Graphics Device" below for how
+   to configure the emulated device.
+
+   Each `VFB_SPEC_STRING` is a comma-separated list of `KEY=VALUE`
+   settings, from the following list:
+   
+     * `vnc=BOOLEAN`: Allow access to the display via the VNC
+       protocol.  This enables the other VNC-related settings.
+       The default is to enable this.
+
+     * `vnclisten="ADDRESS[:DISPLAYNUM]"`: Specifies the IP address,
+       and optionally VNC display number, to use.
+
+     * `vncdisplay=DISPLAYNUM`: Specifies the VNC display number to
+       use.  The actual TCP port number will be DISPLAYNUM+5900.
+
+     * `vncunused=BOOLEAN`: Requests that the VNC display setup search
+       for a free TCP port to use.  The actual display used can be
+       accessed with `xl vncviewer`.
+
+     * `vncpasswd="PASSWORD"`: Specifies the password for the VNC
+       server.
+
+     * `sdl=BOOLEAN`: Specifies that the display should be presented
+       via an X window (using Simple DirectMedia Layer). The default
+       is to not enable this mode
+
+     * `opengl=BOOLEAN`: Enable OpenGL acceleration of the SDL
+       display. Only effects machines using
+       `device_model_version="qemu-xen-traditonal"` and only if the
+       device-model was compiled with OpenGL support. Disabled by default.
+
+     * `keymap="LANG"`: Configure the keymap to use for the keyboard
+       associated with this display. If the input method does not
+       easily support raw keycodes (e.g. this is often the case when
+       using VNC) then this allows us to correctly map the input keys
+       into keycodes seen by the guest. The specific values which are
+       accepted are defined by the version of the device-model which
+       you are using. See "Keymaps" below of consult the `qemu(1)`
+       manpage. The default is `en-us`.
+
+     * `display=XXX`: XXX written to xenstore backend for vfb but does not
+       appear to be used anywhere?
+
+     * `authority=XXX`: XXX written to xenstore backend for vfb but does not
+       appear to be used anywhere?
+
+ * `pci=[ "PCI_SPEC_STRING", "PCI_SPEC_STRING", ... ]`: Specifies the
+   host PCI devices to passthrough to this guest. Each `PCI_SPEC_STRING`
+   has the form `[DDDD:]BB:DD.F[@VSLOT],KEY=VALUE,KEY=VALUE,...` where:
+
+   `DDDD:BB:DD.F` identifies the PCI device from the host perspective
+   in domain (`DDDD`), Bus (`BB`), Device (`DD`) and Function (`F`)
+   syntax. This is the same scheme as used in the output of `lspci`
+   for the device in question. Note: By default `lspci` will omit the
+   domain (`DDDD`) if it is zero and it is optional here also. You may
+   specify the function ('F') as '*' to indicate all functions.
+
+   `@VSLOT` specifies the virtual device where the guest will see this
+   device. This is equivalent to the `DD` which the guest sees. In a
+   guest `DDDD` and `BB` are 0000:00. XXX how does this really work?
+
+   Possible `KEY`s are:
+
+      * `msitranslate=BOOLEAN`: XXX
+      * `power_mgmt=BOOLEAN`: XXX
+
+## Paravirtualised (PV) Guest Specific Options
+
+The following options apply only to Paravirtual guests.
+
+ * `kernel="PATHNAME"`: Load the specified file as the kernel image (for
+   PV guests only).  Either `kernel` or `bootloader` must be specified
+   for PV guests.
+
+ * `ramdisk="PATHNAME"`: Load the specified file as the ramdisk (for PV
+   guests only).
+
+ * `bootloader="PROGRAM"`: Run PROGRAM to find the kernel image and
+   ramdisk to use (for PV guests only).  Normally PROGRAM would be
+   `pygrub`, which is an emulation of grub/grub2/syslinux.
+
+ * `bootloader_args=STRING`: Append STRING (split into words at
+   whitespace) to the arguments to the `bootloader` program.  XXX this
+   should be a list of strings.
+
+ * `root="STRING"`: Append `root="STRING"` to the kernel command line
+   (Note: it is guest specific what meaning this has).
+
+ * `extra="STRING"`: Append "STRING" to the kernel command line.
+    (Note: it is guest specific what meaning this has).
+
+ * `e820_host=BOOLEAN`: Selects whether to expose the host e820
+   (memory map) to the guest via the virtual e820. When this option is
+   false the guest psuedo-physical address space consists of a single
+   contiguous RAM region. When this option is specified the virtual
+   e820 instead reflects the host e820 and contains the same PCI
+   holes. The total amount of RAM represented by the memory map is
+   always the same, this option configures only how it is layed out.
+
+   Exposing the host e820 to the guest gives the guest kernel the
+   opportunity to set aside the required part of its pseudo-physical
+   address space in order to provide address space to map
+   passedthrough PCI devices. It is guest Operaring System dependant
+   whether this option is required, specifically it is required when
+   using a mainline Linux ("pvops") kernel. This option defaults to
+   true if any PCI passthrough devices are configued and false
+   otherwise. If you do not configure any passthrough devices at
+   domain creation time but expect to hotplug devices later then you
+   should set this option. Conversely if your particular guest kernel
+   does not require this behaviour then it is safe to allow this to be
+   enabled but you may wish to disable it anyway.
+
+## Fully-virtualised (HVM) Guest Specific Options
+
+The following options apply only to HVM guests.
+
+### Boot Device
+
+ * `boot=[c|d|n]`: Selects the emulated virtual device to boot
+   from. Options are hard disk (`c`), cd-rom (`d`) or network/PXE
+   (`n`). Multiple options can be given and will be attempted in the
+   order they are given. e.g. to boot from cd-rom but fallback to the
+   hard disk you can give `dc`. The default is `cd`.
+
+### Paging
+
+The following options control the mechanisms used to virtualise guest
+memory.  The defaults are selected to give the best results for the
+common case and so you should normally leave these options
+unspecified.
+
+ * `hap=BOOLEAN`: Turns "hardware assisted paging" (the use of the
+   hardware' nested page table feature) on or off.  Affects HVM guests
+   only.  If turned off, Xen will run the guest in "shadow page table"
+   mode where the guest's page table updates and/or TLB flushes
+   etc. will be emulated.  Use of HAP is the default when available.
+
+ * `oos=BOOLEAN`: Turns "out of sync pagetables" on or off.  When
+   running in shadow page table mode, the guest's page table updates
+   may be deferred as specified in the Intel/AMD architecture manuals.
+   However this may expose unexpected bugs in the guest, or find bugs
+   in Xen, so it is possible to disable this feature.  Use of out of
+   sync page tables, when Xen thinks it appropriate, is the default.
+
+ * `shadow_memory=MBYTES`: Number of megabytes to set aside for
+   shadowing guest pagetable pages (effectively acting as a cache of
+   translated pages) or to use for HAP state. By default this is 1MB
+   per guest vcpu plus 8KB per MB of guest RAM. You should not
+   normally need to adjust this value. However if you are not using
+   hardware assisted paging (i.e. you are using shadow mode) and your
+   guest workload consists of a large number of processes which do not
+   share address space then increasing this value may improve
+   performance.
+
+### Processor and Platform Features
+
+The following options allow various processor and platform level
+features to be hidden or exposed from the guest's point of view. This
+can be useful when running older guest Operating Systems which may
+misbehave when faced with more modern features. In general you should
+accept the defaults for these options wherever possible.
+
+ * `pae=BOOLEAN`: Hide or expose the IA32 Physical Address
+   Extensions. These extensions make it possible for a 32 bit guest
+   Operating System to access more than 4GB of RAM. Enabling PAE also
+   enabled other features such as NX. PAE is required if you wish to
+   run a 64-bit guest Operating System. In general you should leave
+   this enabled and allow the guest Operating System to choose whether
+   or not to use PAE. (X86 only)
+
+ * `acpi=BOOLEAN`: Expose ACPI (Advanced Configuration and Power
+   Interface) tables from the virtual firmware to the guest Operating
+   System. ACPI is required by most modern guest Operating
+   Systems. This option is enabled by default and usually you should
+   omit it. However it may be necessary to disable ACPI for
+   compatibility with some guest Operating Systems.
+
+ * `apic=BOOLEAN`: Include information regarding APIC (Advanced
+   Programmable Interrupt Controller) in the firmware/BIOS tables on a
+   single processor guest. This causes the MP (multiprocessor) and PIR
+   (PCI Interrupt Routing) tables to be exported by the virtual
+   firmware. This option has no effect on a guest with multiple
+   virtual CPUS as they must always include these tables. This option
+   is enabled by default and you should usually omit it but it may be
+   necessary to disable these firmware tables when using certain older
+   guest Operating Systems. These tables have been superceded by newer
+   constructs within the ACPI tables. (X86 only)
+
+ * `nx=BOOLEAN`: Hides or exposes the No-eXecute capability. This allows
+   a guest Operating system to map pages such that they cannot be
+   executed which can enhance security. This options requires that PAE
+   also be enabled. (X86 only)
+
+ * `hpet=BOOLEAN`: Enables or disables HPET (High Precision Event
+   Timer). This option is enabled by default and you should usually
+   omit it. It may be necessary to disable the HPET in order to
+   improve compatibility with guest Operating Systems (X86 only)
+
+ * `nestedhvm=BOOLEAN`: Enable or disables guest access to hardware
+   virtualisation features, e.g. it allows a guest Operating System to
+   also function as a hypervisor. This option is disabled by
+   default. You may want this option if you want to run another
+   hypervisor (including another copy of Xen) within a Xen guest or to
+   support a guest Operating System which uses hardware virtualisation
+   extensions (e.g. Windows XP compatibility mode on more modern
+   Windows OS).
+
+### Support for Paravirtualisation of HVM Guests
+
+The following options allow Paravirtualised features (such as devices)
+to be exposed to the guest Operating System in an HVM guest.
+Utilising these features requires specific guest support but when
+available they will result in improved performance.
+
+ * `xen_platform_pci=BOOLEAN`: Enable or disable the Xen platform PCI
+   device.  The presence of this virtual device enables a guest
+   Operating System (subject to the availability of suitable drivers)
+   to make use of paravirtualisation features such as disk and network
+   devices etc. Enabling these drivers improves performance and is
+   strongly recommended when available. PV drivers are available for
+   various Operating Systems including [HVM
+   Linux][XenLinuxPVonHVMdrivers] and [Microsoft
+   Windows][XenWindowsGplPv].
+
+   [XenLinuxPVonHVMdrivers]: http://wiki.xen.org/xenwiki/XenLinuxPVonHVMdrivers
+   [XenWindowsGplPv]: http://wiki.xen.org/xenwiki/XenWindowsGplPv
+
+ * `viridian=BOOLEAN`: Turns on or off the exposure of MicroSoft
+   Hyper-V (AKA viridian) compatible enlightenments to the guest.
+   These can improve performance of Microsoft Windows guests (XXX
+   which versions of Windows benefit?)
+
+### Device-Model Options
+
+The following options control the selection of the device-model.  This
+is the component which provides emulation of the virtual devices to an
+HVM guest.  For a PV guest a device-model is sometimes used to provide
+backends for certain PV devices (most usually a virtual framebuffer
+device).
+
+ * `device_model_version="DEVICE-MODEL"`: Selects which variant of the
+   device-model should be used for this guest. Valid values are:
+
+     * `qemu-xen-traditional`: Use the device-model based upon the
+       historical Xen fork of Qemu.  This device-model is currently
+       the default.
+
+     * `qemu-xen`: use the device-model merged into the upstream Qemu
+       project.  This device-model will become the default in a future
+       version of Xen.
+
+   It is recommended to accept the default value for new guests.  If
+   you have existing guests then, dpeending on the nature of the guest
+   Operating System, you may wish to force them to use the device
+   model which they were installed with.
+
+ * `device_model_override="PATH"`: Override the path to the binary to
+   be used as the device-model. The binary provided here MUST be
+   consistent with the `device_model_version` which you have
+   specified. You should not normally need to specify this option.
+
+ * `device_model_stubdomain_override=BOOLEAN`: Override the use of
+   stubdomain based device-model.  Normally this will be automatically
+   selected based upon the other features and options you have
+   selected.
+
+ * `device_model_args=[ "ARG", "ARG", ...]`: Pass additional arbitrary
+   options on the devide-model command line. Each element in the list
+   is passed as an option to the device-model.
+
+ * `device_model_args_pv=[ "ARG", "ARG", ...]`: Pass additional
+   arbitrary options on the devide-model command line for a PV device
+   model only. Each element in the list is passed as an option to the
+   device-model.
+
+ * `device_model_args_hvm=[ "ARG", "ARG", ...]`: Pass additional
+   arbitrary options on the devide-model command line for an HVM
+   device model only. Each element in the list is passed as an option
+   to the device-model.
+
+### Emulated VGA Graphics Device
+
+The following options control the features of the emulated graphics
+device.  Many of these options behave similarly to the equivalent key
+in the `VFB_SPEC_STRING` for configuring virtual frame buffer devices
+(see above).
+
+ * `videoram=MBYTES`: Sets the amount of RAM which the emulated video
+   card will contain, which in turn limits the resolutions and bit
+   depths which will be available. This option is only available when
+   using the `stdvga` option (see below). The default is 8MB which is
+   sufficient for e.g. 1600x1200 at 32bpp. When not using the `stdvga`
+   option the amount of video ram is fixed at 4MB which is sufficient
+   for 1024x768 at 32 bpp.
+
+ * `stdvga=BOOLEAN`: Select a standard VGA card with VBE (VESA BIOS
+   Extensions) as the emulated graphics device. The default is false
+   which means to emulate a Cirrus Logic GD5446 VGA card. If your
+   guest supports VBE 2.0 or later (e.g. Windows XP onwards) then you
+   should enable this.
+
+ * `vnc=BOOLEAN`: Allow access to the display via the VNC protocol.
+    This enables the other VNC-related settings.  The default is to
+    enable this.
+
+ * `vnclisten="ADDRESS[:DISPLAYNUM]": Specifies the IP address, and
+   optionally VNC display number, to use.
+
+ * `vncdisplay=DISPLAYNUM`: Specifies the VNC display number to use.
+   The actual TCP port number will be DISPLAYNUM+5900.
+
+ * `vncunused=BOOLEAN`: Requests that the VNC display setup search for
+   a free TCP port to use.  The actual display used can be accessed
+   with `xl vncviewer`.
+
+ * `vncpasswd="PASSWORD"`: Specifies the password for the VNC server.
+
+ * `keymap="LANG"`: Configure the keymap to use for the keyboard
+   associated with this display. If the input method does not easily
+   support raw keycodes (e.g. this is often the case when using VNC)
+   then this allows us to correctly map the input keys into keycodes
+   seen by the guest. The specific values which are accepted are
+   defined by the version of the device-model which you are using. See
+   "Keymaps" below of consult the `qemu(1)` manpage. The default is
+   `en-us`.
+
+ * `sdl=BOOLEAN`: Specifies that the display should be presented via
+   an X window (using Simple DirectMedia Layer). The default is not to
+   enable this mode.
+
+ * `opengl=BOOLEAN`: Enable OpenGL acceleration of the SDL
+   display. Only effects machines using
+   `device_model_version="qemu-xen-traditonal"` and only if the
+   device-model was compiled with OpenGL support. Disabled by default.
+
+ * `nographic=BOOLEAN`: Enable or disable the virtual graphics device.
+   The default is to provide a VGA graphics device but this option can
+   be used to disable it.
+
+### Spice Graphics Support
+
+ * `spice=BOOLEAN`: XXX
+
+ * `spiceport=XXX`: XXX
+
+ * `spicetls_port=XXX`: XXX
+
+ * `spicehost=XXX`: XXX
+
+ * `spicedisable_ticketing=XXX`: XXX
+
+ * `spiceagent_mouse=XXX`: XXX
+
+### Miscellaneous Emulated Hardware
+
+ * `serial=DEVICE`: Redirect the virtual serial port to
+   `DEVICE`. Please see the `-serial` option in the `qemu(1)` manpage
+   for details of the valid `DEVICE` options. Default is `vc` when in
+   graphical mode and `stdio` if `nographics=1` is used.
+
+ * `soundhw=DEVICE`: Select the virtual sound card to expose to the
+   guest. The valid devices are defined by the device model
+   configuration, please see the `qemu(1)` manpage for details. The
+   default is not to export any sound device.
+
+ * `usb=BOOLEAN`: Enables or disables a USB bus in the guest.
+
+ * `usbdevice=DEVICE`: Adds `DEVICE` to the USB bus. The USB bus must
+   also be enabled using `usb=1`. The most common use for this option
+   is `usbdevice=table` which adds pointer device using absolute
+   coordinates. Such devices function better than relative coordinate
+   devices (such as a standard mouse) since many methods of exporting
+   guest graphics (such as VNC) work better in this mode. Note that
+   this is independent of the actual pointer device you are using on
+   the host/client side. XXX should/could be a list of devices.
+
+### Unclassified HVM Specific Options
+
+These HVM specific options have not yet been documented or
+classified. They almost certainly belong in a more appropriate
+section.
+
+ * `vpt_align=BOOLEAN`: Align the Virtual Platform Timer ??? XXX
+   Reduces interrupts?
+
+ * `timer_mode=NUMBER`: Set mode for Virtual Timers XXX ??? should be
+   an enum of particular values. See HVM_PARAM_TIMER_MODE in
+   xen/include/public/hvm/params.h
+
+## Unclassified General Options
+
+These have not yet been fully documented or classified. They almost
+certainly belong in a more appropriate section.
+
+ * `gfx_passthrough=BOOLEAN`: Enable graphics device PCI passthrough.
+   XXX which device is passed through ?
+
+ * `nomigrate=BOOLEAN`: Disable migration of this domain.  This
+   enables certain other features which are incompatible with
+   migration (currently certain TSC modes XXX ?).
+
+ * `tsc_mode=VALUE`: Specifies how the TSC (Time Stamp Counter) should
+   be provided to the guest.  XXX ???
+
+ * `pci_msitranslate=BOOLEAN`: XXX
+
+ * `pci_power_mgmt=BOOLEAN`: XXX
+
+ * `cpuid=XXX`: XXX
+
+# Keymaps
+
+The keymaps available are defined by the device-model which you are
+using. Commonly this includes:
+
+        ar  de-ch  es  fo     fr-ca  hu  ja  mk     no  pt-br  sv
+        da  en-gb  et  fr     fr-ch  is  lt  nl     pl  ru     th
+        de  en-us  fi  fr-be  hr     it  lv  nl-be  pt  sl     tr
+
+The default is "en-us".
+
+See `qemu(1)` for more information.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:18:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:18:46 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNRuI-0006hv-1H; Mon, 07 Nov 2011 08:18:46 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNRsc-00069h-Om
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:17:03 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1320679006!54044692!6
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16005 invoked from network); 7 Nov 2011 15:16:47 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 15:16:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315180800"; 
   d="scan'208";a="8798511"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 15:17:00 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 15:17:00 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNQwW-0003By-6G;
	Mon, 07 Nov 2011 15:17:00 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNQwN-0006Wl-TD;
	Mon, 07 Nov 2011 15:16:52 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Mon, 7 Nov 2011 15:16:38 +0000
Message-ID: <1320678999-24995-6-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320678999-24995-5-git-send-email-jean.guyader@eu.citrix.com>
References: <1320678999-24995-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-5-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 5/6] hvmloader: Change memory relocation loop
	when overlap with PCI hole.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Change the way we relocate the memory page if they overlap with pci hole.
Use new map space (XENMAPSPACE_gmfn_range) to move the loop into xen.

This code usually get triggered when a device is pass through to a guest
and the PCI hole has to be extended to have enough room to map the device BARs.
The PCI hole will starts lower and it might overlap with some RAM that has been
alocated for the guest. That usually happen if the guest has more than 4G of RAM.
We have to relocate those pages in high mem otherwise they won't be accessible.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 tools/firmware/hvmloader/pci.c |   20 ++++++++++++++------
 1 files changed, 14 insertions(+), 6 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0005-hvmloader-Change-memory-relocation-loop-when-overlap.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0005-hvmloader-Change-memory-relocation-loop-when-overlap.patch"

diff --git a/tools/firmware/hvmloader/pci.c b/tools/firmware/hvmloader/pci.c
index 29ec011..3bd6ac5 100644
--- a/tools/firmware/hvmloader/pci.c
+++ b/tools/firmware/hvmloader/pci.c
@@ -50,6 +50,7 @@ void pci_setup(void)
         uint32_t devfn, bar_reg, bar_sz;
     } *bars = (struct bars *)scratch_start;
     unsigned int i, nr_bars = 0;
+    unsigned long pci_mem_start_pg;
 
     /* Program PCI-ISA bridge with appropriate link routes. */
     isa_irq = 0;
@@ -185,17 +186,24 @@ void pci_setup(void)
             ((pci_mem_start << 1) != 0) )
         pci_mem_start <<= 1;
 
-    while ( (pci_mem_start >> PAGE_SHIFT) < hvm_info->low_mem_pgend )
+    /* Relocate RAM that overlaps (in 64K chunks) */
+    pci_mem_start_pg = (pci_mem_start >> PAGE_SHIFT);
+    while (pci_mem_start_pg < hvm_info->low_mem_pgend)
     {
         struct xen_add_to_physmap xatp;
-        if ( hvm_info->high_mem_pgend == 0 )
-            hvm_info->high_mem_pgend = 1ull << (32 - PAGE_SHIFT);
+        unsigned int size = hvm_info->low_mem_pgend - pci_mem_start_pg;
         xatp.domid = DOMID_SELF;
-        xatp.space = XENMAPSPACE_gmfn;
-        xatp.idx   = --hvm_info->low_mem_pgend;
-        xatp.gpfn  = hvm_info->high_mem_pgend++;
+        xatp.space = XENMAPSPACE_gmfn_range;
+        xatp.idx = pci_mem_start_pg;
+        xatp.gpfn = hvm_info->high_mem_pgend;
+        size = size > ((1 << 16) - 1) ? ((1 << 16) - 1) : size;
+        xatp.size = size;
+
         if ( hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0 )
             BUG();
+        pci_mem_start_pg += size;
+        hvm_info->high_mem_pgend += size;
+        hvm_info->low_mem_pgend = pci_mem_start_pg;
     }
 
     mem_resource.base = pci_mem_start;

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:20:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:20:22 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNRvq-00075g-Jq; Mon, 07 Nov 2011 08:20:22 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNRsc-00069l-QC
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:17:03 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1320679006!54044692!3
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15955 invoked from network); 7 Nov 2011 15:16:47 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 15:16:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315180800"; 
   d="scan'208";a="8798508"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 15:16:59 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 15:16:59 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNQwV-0003Bp-KS;
	Mon, 07 Nov 2011 15:16:59 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNQwN-0006Wc-B8;
	Mon, 07 Nov 2011 15:16:51 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Mon, 7 Nov 2011 15:16:35 +0000
Message-ID: <1320678999-24995-3-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320678999-24995-2-git-send-email-jean.guyader@eu.citrix.com>
References: <1320678999-24995-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-2-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 2/6] iommu: Introduce iommu_flush and
	iommu_flush_all.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/drivers/passthrough/iommu.c     |   20 ++++++++++++++++++++
 xen/drivers/passthrough/vtd/iommu.c |   12 ++++++++++++
 xen/include/xen/iommu.h             |    5 +++++
 3 files changed, 37 insertions(+), 0 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0002-iommu-Introduce-iommu_flush-and-iommu_flush_all.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0002-iommu-Introduce-iommu_flush-and-iommu_flush_all.patch"

diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index cd6174d..9c62861 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -301,6 +301,26 @@ int iommu_unmap_page(struct domain *d, unsigned long gfn)
     return hd->platform_ops->unmap_page(d, gfn);
 }
 
+void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+    if ( !iommu_enabled || !hd->platform_ops || !hd->platform_ops->iotlb_flush )
+        return;
+
+    hd->platform_ops->iotlb_flush(d, gfn, page_count);
+}
+
+void iommu_iotlb_flush_all(struct domain *d)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+    if ( !iommu_enabled || !hd->platform_ops )
+        return;
+
+    hd->platform_ops->iotlb_flush_all(d);
+}
+
 /* caller should hold the pcidevs_lock */
 int deassign_device(struct domain *d, u16 seg, u8 bus, u8 devfn)
 {
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 5a5b6be..7ec9541 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -619,6 +619,16 @@ static void __intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn,
     }
 }
 
+static void intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count)
+{
+    __intel_iommu_iotlb_flush(d, gfn, 1, page_count);
+}
+
+static void intel_iommu_iotlb_flush_all(struct domain *d)
+{
+    __intel_iommu_iotlb_flush(d, 0, 0, 0);
+}
+
 /* clear one page's page table */
 static void dma_pte_clear_one(struct domain *domain, u64 addr)
 {
@@ -2329,6 +2339,8 @@ const struct iommu_ops intel_iommu_ops = {
     .resume = vtd_resume,
     .share_p2m = iommu_set_pgd,
     .crash_shutdown = vtd_crash_shutdown,
+    .iotlb_flush = intel_iommu_iotlb_flush,
+    .iotlb_flush_all = intel_iommu_iotlb_flush_all,
 };
 
 /*
diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
index 837e60d..a1034df 100644
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -139,6 +139,8 @@ struct iommu_ops {
     void (*resume)(void);
     void (*share_p2m)(struct domain *d);
     void (*crash_shutdown)(void);
+    void (*iotlb_flush)(struct domain *d, unsigned long gfn, unsigned int page_count);
+    void (*iotlb_flush_all)(struct domain *d);
 };
 
 void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value);
@@ -155,4 +157,7 @@ void iommu_share_p2m_table(struct domain *d);
 
 int iommu_do_domctl(struct xen_domctl *, XEN_GUEST_HANDLE(xen_domctl_t));
 
+void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count);
+void iommu_iotlb_flush_all(struct domain *d);
+
 #endif /* _IOMMU_H_ */

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:21:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:21:30 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNRww-0007Si-Ns; Mon, 07 Nov 2011 08:21:30 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNRsc-00069g-OM
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:17:03 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1320679006!54044692!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15941 invoked from network); 7 Nov 2011 15:16:47 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 15:16:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315180800"; 
   d="scan'208";a="8798506"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 15:16:59 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 15:16:59 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNQwV-0003Bj-CF;
	Mon, 07 Nov 2011 15:16:59 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNQwM-0006WX-V5;
	Mon, 07 Nov 2011 15:16:51 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Mon, 7 Nov 2011 15:16:33 +0000
Message-ID: <1320678999-24995-1-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
MIME-Version: 1.0
Content-Type: text/plain
Cc: tim@xen.org, allen.m.kay@intel.com
Subject: [Xen-devel] IOMMU, vtd and iotlb flush rework (v2)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

In one of my previous email I detailed a bug I was seeing when passing
through a Intel GPU on a guest that has more that 4G or RAM.

Allen suggested that I go for the Plan B but after a discussion with Tim
we agreed that Plan B was way to disruptive in term of code change.

This patch series implements Plan A.

http://xen.1045712.n5.nabble.com/VTD-Intel-iommu-IOTLB-flush-really-slow-td4952866.html

Changes between v1 and v2:
        - Move size in struct xen_add_to_physmap in padding between .domid and .space.
        - Store iommu_dont_flush per cpu
        - Change the code in hvmloader to relocate by batch of 64K, .size is now 16 bits.

Jean Guyader (6):
      vtd: Refactor iotlb flush code
      iommu: Introduce iommu_flush and iommu_flush_all.
      add_to_physmap: Move the code for XENMEM_add_to_physmap.
      mm: New XENMEM, XENMEM_add_to_physmap_gmfn_range
      hvmloader: Change memory relocation loop when overlap with PCI hole.
      Introduce per cpu flag (iommu_dont_flush_iotlb) to avoid unnecessary iotlb flush
 
 tools/firmware/hvmloader/pci.c      |   20 +++-
 xen/arch/x86/mm.c                   |  203 +++++++++++++++++++++--------------
 xen/drivers/passthrough/iommu.c     |   25 +++++
 xen/drivers/passthrough/vtd/iommu.c |  100 ++++++++++--------
 xen/include/public/memory.h         |    5 +-
 xen/include/xen/iommu.h             |    7 ++
 6 files changed, 230 insertions(+), 130 deletions(-)

Jean

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:22:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:22:37 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNRy1-0007pg-DR; Mon, 07 Nov 2011 08:22:37 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNRsc-00069m-RC
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:17:03 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1320679006!54044692!5
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15997 invoked from network); 7 Nov 2011 15:16:47 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 15:16:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315180800"; 
   d="scan'208";a="8798510"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 15:17:00 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 15:17:00 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNQwW-0003Bv-0E;
	Mon, 07 Nov 2011 15:17:00 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNQwN-0006Wi-Nc;
	Mon, 07 Nov 2011 15:16:51 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Mon, 7 Nov 2011 15:16:37 +0000
Message-ID: <1320678999-24995-5-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320678999-24995-4-git-send-email-jean.guyader@eu.citrix.com>
References: <1320678999-24995-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-4-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 4/6] mm: New XENMEM,
	XENMEM_add_to_physmap_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


XENMEM_add_to_physmap_gmfn_range is like XENMEM_add_to_physmap on
the gmfn space but the number of pages on which xen will iterate.

Use the 16 bits padding between .domid and .space in struct xen_add_to_physmap
to keep compatibility with older versions.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c           |   22 +++++++++++++++++++++-
 xen/include/public/memory.h |    5 ++++-
 2 files changed, 25 insertions(+), 2 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0004-mm-New-XENMEM-XENMEM_add_to_physmap_gmfn_range.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0004-mm-New-XENMEM-XENMEM_add_to_physmap_gmfn_range.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index f75011e..cca64b8 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4714,9 +4714,29 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
             return -EPERM;
         }
 
-        xenmem_add_to_physmap(d, xatp);
+        if ( xatp.space != XENMAPSPACE_gmfn_range )
+            xatp.size = 1;
+
+        for ( ; xatp.size > 0; xatp.size-- )
+        {
+            if ( hypercall_preempt_check() )
+            {
+                rc = -EAGAIN;
+                break;
+            }
+            xenmem_add_to_physmap(d, xatp);
+            xatp.idx++;
+            xatp.gpfn++;
+        }
 
         rcu_unlock_domain(d);
+        if ( rc == -EAGAIN )
+        {
+            if ( copy_to_guest(arg, &xatp, 1) )
+                return -EFAULT;
+            rc = hypercall_create_continuation(
+                    __HYPERVISOR_memory_op, "ih", op, arg);
+        }
 
         return rc;
     }
diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h
index 08355e3..886d4c3 100644
--- a/xen/include/public/memory.h
+++ b/xen/include/public/memory.h
@@ -208,10 +208,14 @@ struct xen_add_to_physmap {
     /* Which domain to change the mapping for. */
     domid_t domid;
 
+    /* Number of pages to go through for gmfn_range */
+    uint16_t    size;
+
     /* Source mapping space. */
 #define XENMAPSPACE_shared_info 0 /* shared info page */
 #define XENMAPSPACE_grant_table 1 /* grant table page */
 #define XENMAPSPACE_gmfn        2 /* GMFN */
+#define XENMAPSPACE_gmfn_range  3 /* GMFN_range */
     unsigned int space;
 
 #define XENMAPIDX_grant_table_status 0x80000000
@@ -290,7 +294,6 @@ typedef struct xen_pod_target xen_pod_target_t;
  * The call never fails. 
  */
 #define XENMEM_get_sharing_freed_pages    18
-
 #endif /* __XEN_PUBLIC_MEMORY_H__ */
 
 /*

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:23:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:23:30 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNRys-0008CQ-Iq; Mon, 07 Nov 2011 08:23:30 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNRsc-00069o-Su
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:17:03 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1320679006!54044692!4
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15971 invoked from network); 7 Nov 2011 15:16:47 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 15:16:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315180800"; 
   d="scan'208";a="8798509"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 15:17:00 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 15:16:59 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNQwV-0003Bs-Qk;
	Mon, 07 Nov 2011 15:16:59 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNQwN-0006Wf-HA;
	Mon, 07 Nov 2011 15:16:51 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Mon, 7 Nov 2011 15:16:36 +0000
Message-ID: <1320678999-24995-4-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320678999-24995-3-git-send-email-jean.guyader@eu.citrix.com>
References: <1320678999-24995-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-3-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 3/6] add_to_physmap: Move the code for
	XENMEM_add_to_physmap.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Move the code for the XENMEM_add_to_physmap case into it's own
function (xenmem_add_to_physmap).

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c |  188 ++++++++++++++++++++++++++++-------------------------
 1 files changed, 99 insertions(+), 89 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0003-add_to_physmap-Move-the-code-for-XENMEM_add_to_physm.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0003-add_to_physmap-Move-the-code-for-XENMEM_add_to_physm.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index acc1f34..f75011e 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4592,119 +4592,129 @@ static int handle_iomem_range(unsigned long s, unsigned long e, void *p)
     return 0;
 }
 
-long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
+static int xenmem_add_to_physmap(struct domain *d, struct xen_add_to_physmap xatp)
 {
     struct page_info *page = NULL;
+    unsigned long prev_mfn, mfn = 0, gpfn;
     int rc;
 
-    switch ( op )
-    {
-    case XENMEM_add_to_physmap:
+    switch ( xatp.space )
     {
-        struct xen_add_to_physmap xatp;
-        unsigned long prev_mfn, mfn = 0, gpfn;
-        struct domain *d;
-
-        if ( copy_from_guest(&xatp, arg, 1) )
-            return -EFAULT;
+    case XENMAPSPACE_shared_info:
+        if ( xatp.idx == 0 )
+            mfn = virt_to_mfn(d->shared_info);
+        break;
+    case XENMAPSPACE_grant_table:
+        spin_lock(&d->grant_table->lock);
 
-        rc = rcu_lock_target_domain_by_id(xatp.domid, &d);
-        if ( rc != 0 )
-            return rc;
+        if ( d->grant_table->gt_version == 0 )
+            d->grant_table->gt_version = 1;
 
-        if ( xsm_add_to_physmap(current->domain, d) )
+        if ( d->grant_table->gt_version == 2 &&
+             (xatp.idx & XENMAPIDX_grant_table_status) )
         {
-            rcu_unlock_domain(d);
-            return -EPERM;
+            xatp.idx &= ~XENMAPIDX_grant_table_status;
+            if ( xatp.idx < nr_status_frames(d->grant_table) )
+                mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
+        }
+        else
+        {
+            if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
+                 (xatp.idx < max_nr_grant_frames) )
+                gnttab_grow_table(d, xatp.idx + 1);
+
+            if ( xatp.idx < nr_grant_frames(d->grant_table) )
+                mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
         }
 
-        switch ( xatp.space )
+        spin_unlock(&d->grant_table->lock);
+        break;
+    case XENMAPSPACE_gmfn:
+    {
+        p2m_type_t p2mt;
+
+        xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
+        /* If the page is still shared, exit early */
+        if ( p2m_is_shared(p2mt) )
         {
-        case XENMAPSPACE_shared_info:
-            if ( xatp.idx == 0 )
-                mfn = virt_to_mfn(d->shared_info);
+            rcu_unlock_domain(d);
+            return -ENOMEM;
+        }
+        if ( !get_page_from_pagenr(xatp.idx, d) )
             break;
-        case XENMAPSPACE_grant_table:
-            spin_lock(&d->grant_table->lock);
+        mfn = xatp.idx;
+        page = mfn_to_page(mfn);
+        break;
+    }
+    default:
+        break;
+    }
 
-            if ( d->grant_table->gt_version == 0 )
-                d->grant_table->gt_version = 1;
+    if ( !paging_mode_translate(d) || (mfn == 0) )
+    {
+        if ( page )
+            put_page(page);
+        rcu_unlock_domain(d);
+        return -EINVAL;
+    }
 
-            if ( d->grant_table->gt_version == 2 &&
-                 (xatp.idx & XENMAPIDX_grant_table_status) )
-            {
-                xatp.idx &= ~XENMAPIDX_grant_table_status;
-                if ( xatp.idx < nr_status_frames(d->grant_table) )
-                    mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
-            }
-            else
-            {
-                if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
-                     (xatp.idx < max_nr_grant_frames) )
-                    gnttab_grow_table(d, xatp.idx + 1);
+    domain_lock(d);
 
-                if ( xatp.idx < nr_grant_frames(d->grant_table) )
-                    mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
-            }
+    if ( page )
+        put_page(page);
 
-            spin_unlock(&d->grant_table->lock);
-            break;
-        case XENMAPSPACE_gmfn:
-        {
-            p2m_type_t p2mt;
+    /* Remove previously mapped page if it was present. */
+    prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
+    if ( mfn_valid(prev_mfn) )
+    {
+        if ( is_xen_heap_mfn(prev_mfn) )
+            /* Xen heap frames are simply unhooked from this phys slot. */
+            guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
+        else
+            /* Normal domain memory is freed, to avoid leaking memory. */
+            guest_remove_page(d, xatp.gpfn);
+    }
 
-            xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
-            /* If the page is still shared, exit early */
-            if ( p2m_is_shared(p2mt) )
-            {
-                rcu_unlock_domain(d);
-                return -ENOMEM;
-            }
-            if ( !get_page_from_pagenr(xatp.idx, d) )
-                break;
-            mfn = xatp.idx;
-            page = mfn_to_page(mfn);
-            break;
-        }
-        default:
-            break;
-        }
+    /* Unmap from old location, if any. */
+    gpfn = get_gpfn_from_mfn(mfn);
+    ASSERT( gpfn != SHARED_M2P_ENTRY );
+    if ( gpfn != INVALID_M2P_ENTRY )
+        guest_physmap_remove_page(d, gpfn, mfn, 0);
 
-        if ( !paging_mode_translate(d) || (mfn == 0) )
-        {
-            if ( page )
-                put_page(page);
-            rcu_unlock_domain(d);
-            return -EINVAL;
-        }
+    /* Map at new location. */
+    rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
 
-        domain_lock(d);
+    domain_unlock(d);
 
-        if ( page )
-            put_page(page);
+    return rc;
+}
 
-        /* Remove previously mapped page if it was present. */
-        prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
-        if ( mfn_valid(prev_mfn) )
-        {
-            if ( is_xen_heap_mfn(prev_mfn) )
-                /* Xen heap frames are simply unhooked from this phys slot. */
-                guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
-            else
-                /* Normal domain memory is freed, to avoid leaking memory. */
-                guest_remove_page(d, xatp.gpfn);
-        }
 
-        /* Unmap from old location, if any. */
-        gpfn = get_gpfn_from_mfn(mfn);
-        ASSERT( gpfn != SHARED_M2P_ENTRY );
-        if ( gpfn != INVALID_M2P_ENTRY )
-            guest_physmap_remove_page(d, gpfn, mfn, 0);
+long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
+{
+    int rc;
+
+    switch ( op )
+    {
+    case XENMEM_add_to_physmap:
+    {
+        struct xen_add_to_physmap xatp;
+        struct domain *d;
 
-        /* Map at new location. */
-        rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
+        if ( copy_from_guest(&xatp, arg, 1) )
+            return -EFAULT;
+
+        rc = rcu_lock_target_domain_by_id(xatp.domid, &d);
+        if ( rc != 0 )
+            return rc;
+
+        if ( xsm_add_to_physmap(current->domain, d) )
+        {
+            rcu_unlock_domain(d);
+            return -EPERM;
+        }
 
-        domain_unlock(d);
+        xenmem_add_to_physmap(d, xatp);
 
         rcu_unlock_domain(d);
 

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:24:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:24:24 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNRzj-00007c-KQ; Mon, 07 Nov 2011 08:24:23 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNRsc-00069k-Q6
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:17:03 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1320679006!54044692!2
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15943 invoked from network); 7 Nov 2011 15:16:47 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 15:16:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315180800"; 
   d="scan'208";a="8798507"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 15:16:59 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 15:16:59 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNQwV-0003Bm-Ei;
	Mon, 07 Nov 2011 15:16:59 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNQwN-0006WZ-4q;
	Mon, 07 Nov 2011 15:16:51 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Mon, 7 Nov 2011 15:16:34 +0000
Message-ID: <1320678999-24995-2-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320678999-24995-1-git-send-email-jean.guyader@eu.citrix.com>
References: <1320678999-24995-1-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 1/6] vtd: Refactor iotlb flush code
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Factorize the iotlb flush code from map_page and unmap_page into
it's own function.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/drivers/passthrough/vtd/iommu.c |   86 +++++++++++++++++-----------------
 1 files changed, 43 insertions(+), 43 deletions(-)


--------------true
Content-Type: text/x-patch; name="0001-vtd-Refactor-iotlb-flush-code.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0001-vtd-Refactor-iotlb-flush-code.patch"

diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 7717ab4..5a5b6be 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -578,16 +578,53 @@ static void iommu_flush_all(void)
     }
 }
 
+static void __intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn,
+        int dma_old_pte_present, unsigned int page_count)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+    struct acpi_drhd_unit *drhd;
+    struct iommu *iommu;
+    int flush_dev_iotlb;
+    int iommu_domid;
+
+    /*
+     * No need pcideves_lock here because we have flush
+     * when assign/deassign device
+     */
+    for_each_drhd_unit ( drhd )
+    {
+        iommu = drhd->iommu;
+
+        if ( !test_bit(iommu->index, &hd->iommu_bitmap) )
+            continue;
+
+        flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
+        iommu_domid= domain_iommu_domid(d, iommu);
+        if ( iommu_domid == -1 )
+            continue;
+
+        if ( page_count > 1 || gfn == -1 )
+        {
+            if ( iommu_flush_iotlb_dsi(iommu, iommu_domid,
+                        0, flush_dev_iotlb) )
+                iommu_flush_write_buffer(iommu);
+        }
+        else
+        {
+            if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
+                        (paddr_t)gfn << PAGE_SHIFT_4K, 0,
+                        !dma_old_pte_present, flush_dev_iotlb) )
+                iommu_flush_write_buffer(iommu);
+        }
+    }
+}
+
 /* clear one page's page table */
 static void dma_pte_clear_one(struct domain *domain, u64 addr)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(domain);
-    struct acpi_drhd_unit *drhd;
-    struct iommu *iommu;
     struct dma_pte *page = NULL, *pte = NULL;
     u64 pg_maddr;
-    int flush_dev_iotlb;
-    int iommu_domid;
     struct mapped_rmrr *mrmrr;
 
     spin_lock(&hd->mapping_lock);
@@ -613,21 +650,7 @@ static void dma_pte_clear_one(struct domain *domain, u64 addr)
     spin_unlock(&hd->mapping_lock);
     iommu_flush_cache_entry(pte, sizeof(struct dma_pte));
 
-    /* No need pcidevs_lock here since do that on assign/deassign device*/
-    for_each_drhd_unit ( drhd )
-    {
-        iommu = drhd->iommu;
-        if ( test_bit(iommu->index, &hd->iommu_bitmap) )
-        {
-            flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
-            iommu_domid= domain_iommu_domid(domain, iommu);
-            if ( iommu_domid == -1 )
-                continue;
-            if ( iommu_flush_iotlb_psi(iommu, iommu_domid, addr,
-                                       0, 0, flush_dev_iotlb) )
-                iommu_flush_write_buffer(iommu);
-        }
-    }
+    __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
 
     unmap_vtd_domain_page(page);
 
@@ -1677,12 +1700,8 @@ static int intel_iommu_map_page(
     unsigned int flags)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(d);
-    struct acpi_drhd_unit *drhd;
-    struct iommu *iommu;
     struct dma_pte *page = NULL, *pte = NULL, old, new = { 0 };
     u64 pg_maddr;
-    int flush_dev_iotlb;
-    int iommu_domid;
 
     /* Do nothing if VT-d shares EPT page table */
     if ( iommu_use_hap_pt(d) )
@@ -1724,26 +1743,7 @@ static int intel_iommu_map_page(
     spin_unlock(&hd->mapping_lock);
     unmap_vtd_domain_page(page);
 
-    /*
-     * No need pcideves_lock here because we have flush
-     * when assign/deassign device
-     */
-    for_each_drhd_unit ( drhd )
-    {
-        iommu = drhd->iommu;
-
-        if ( !test_bit(iommu->index, &hd->iommu_bitmap) )
-            continue;
-
-        flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
-        iommu_domid= domain_iommu_domid(d, iommu);
-        if ( iommu_domid == -1 )
-            continue;
-        if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
-                                   (paddr_t)gfn << PAGE_SHIFT_4K, 0,
-                                   !dma_pte_present(old), flush_dev_iotlb) )
-            iommu_flush_write_buffer(iommu);
-    }
+    __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
 
     return 0;
 }

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:25:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:25:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNS0Y-0000V3-44; Mon, 07 Nov 2011 08:25:14 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNRsd-0006AH-Rb
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:17:04 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1320679006!54044692!7
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16032 invoked from network); 7 Nov 2011 15:16:47 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 15:16:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315180800"; 
   d="scan'208";a="8798512"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 15:17:00 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 15:17:00 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNQwW-0003C1-BN;
	Mon, 07 Nov 2011 15:17:00 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNQwO-0006Wo-2y;
	Mon, 07 Nov 2011 15:16:52 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Mon, 7 Nov 2011 15:16:39 +0000
Message-ID: <1320678999-24995-7-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320678999-24995-6-git-send-email-jean.guyader@eu.citrix.com>
References: <1320678999-24995-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-5-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-6-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 6/6] Introduce per cpu flag
	(iommu_dont_flush_iotlb) to avoid unnecessary iotlb flush
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Add cpu flag that will be checked by the iommu low level code
to skip iotlb flushes. iommu_iotlb_flush shall be called explicitly.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c                   |   15 ++++++++++++++-
 xen/drivers/passthrough/iommu.c     |    5 +++++
 xen/drivers/passthrough/vtd/iommu.c |    6 ++++--
 xen/include/xen/iommu.h             |    2 ++
 4 files changed, 25 insertions(+), 3 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0006-Introduce-per-cpu-flag-iommu_dont_flush_iotlb-to-avo.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0006-Introduce-per-cpu-flag-iommu_dont_flush_iotlb-to-avo.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index cca64b8..7aece56 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4698,7 +4698,7 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
     {
     case XENMEM_add_to_physmap:
     {
-        struct xen_add_to_physmap xatp;
+        struct xen_add_to_physmap xatp, start_xatp;
         struct domain *d;
 
         if ( copy_from_guest(&xatp, arg, 1) )
@@ -4716,7 +4716,13 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
 
         if ( xatp.space != XENMAPSPACE_gmfn_range )
             xatp.size = 1;
+        else
+        {
+            if ( need_iommu(d) )
+                this_cpu(iommu_dont_flush_iotlb) = 1;
+        }
 
+        start_xatp = xatp;
         for ( ; xatp.size > 0; xatp.size-- )
         {
             if ( hypercall_preempt_check() )
@@ -4729,6 +4735,13 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
             xatp.gpfn++;
         }
 
+        if ( xatp.space == XENMAPSPACE_gmfn_range && need_iommu(d) )
+        {
+            this_cpu(iommu_dont_flush_iotlb) = 0;
+            iommu_iotlb_flush(d, start_xatp.idx, start_xatp.size - xatp.size);
+            iommu_iotlb_flush(d, start_xatp.gpfn, start_xatp.size - xatp.size);
+        }
+
         rcu_unlock_domain(d);
         if ( rc == -EAGAIN )
         {
diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index 9c62861..a06c94a 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -52,6 +52,8 @@ bool_t __read_mostly iommu_hap_pt_share = 1;
 bool_t __read_mostly iommu_debug;
 bool_t __read_mostly amd_iommu_perdev_intremap;
 
+DEFINE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
+
 static void __init parse_iommu_param(char *s)
 {
     char *ss;
@@ -227,6 +229,7 @@ static int iommu_populate_page_table(struct domain *d)
 
     spin_lock(&d->page_alloc_lock);
 
+    this_cpu(iommu_dont_flush_iotlb) = 1;
     page_list_for_each ( page, &d->page_list )
     {
         if ( is_hvm_domain(d) ||
@@ -244,6 +247,8 @@ static int iommu_populate_page_table(struct domain *d)
             }
         }
     }
+    this_cpu(iommu_dont_flush_iotlb) = 0;
+    iommu_iotlb_flush_all(d);
     spin_unlock(&d->page_alloc_lock);
     return 0;
 }
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 7ec9541..a3dd018 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -660,7 +660,8 @@ static void dma_pte_clear_one(struct domain *domain, u64 addr)
     spin_unlock(&hd->mapping_lock);
     iommu_flush_cache_entry(pte, sizeof(struct dma_pte));
 
-    __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
+    if ( !this_cpu(iommu_dont_flush_iotlb) )
+        __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
 
     unmap_vtd_domain_page(page);
 
@@ -1753,7 +1754,8 @@ static int intel_iommu_map_page(
     spin_unlock(&hd->mapping_lock);
     unmap_vtd_domain_page(page);
 
-    __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
+    if ( !this_cpu(iommu_dont_flush_iotlb) )
+        __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
 
     return 0;
 }
diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
index a1034df..c757a78 100644
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -160,4 +160,6 @@ int iommu_do_domctl(struct xen_domctl *, XEN_GUEST_HANDLE(xen_domctl_t));
 void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count);
 void iommu_iotlb_flush_all(struct domain *d);
 
+DECLARE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
+
 #endif /* _IOMMU_H_ */

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:27:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:27:04 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNS2K-00010l-Am; Mon, 07 Nov 2011 08:27:04 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNRuJ-0006hb-Tj
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:18:49 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1320676308!47288387!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22077 invoked from network); 7 Nov 2011 14:31:48 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 14:31:48 -0000
Received: by wwf4 with SMTP id 4so5542327wwf.24
	for <xen-devel@lists.xensource.com>;
	Mon, 07 Nov 2011 06:32:05 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=nsDc0qUBG3UerErcg1UE04YY2LueCAgu+CtrkHzW6Bw=;
	b=ZJWUVGeg3K62Q968D2iiHxivFjCfTF+r+4K+B0Aw7uoVXoIbMybyaAIl3PG5n8crd3
	XgUKnFFCI29/HzcllrKJCPJY19v4mZ8XYLB8D5AKMA8DLLxQtf7fUI8DBiP2XQFgIHqa
	XO7GiTDAnKeCYp5e4FD3VZXzttGYdzxjDAkq8=
Received: by 10.216.52.16 with SMTP id d16mr7047958wec.88.1320676325371;
	Mon, 07 Nov 2011 06:32:05 -0800 (PST)
Received: from [192.168.1.3] (host86-129-249-120.range86-129.btcentralplus.com.
	[86.129.249.120])
	by mx.google.com with ESMTPS id gg13sm27964018wbb.8.2011.11.07.06.32.03
	(version=SSLv3 cipher=OTHER); Mon, 07 Nov 2011 06:32:04 -0800 (PST)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Mon, 07 Nov 2011 14:31:59 +0000
Subject: Re: [Xen-devel] [PATCH 3/6] eliminate cpu_set()
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CADD9C5F.33ACB%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH 3/6] eliminate cpu_set()
Thread-Index: AcydWgHRB0a3JnfCQkaCBIeeKDQsIA==
In-Reply-To: <4EB7B997020000780005F4AC@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 07/11/2011 09:57, "Jan Beulich" <JBeulich@suse.com> wrote:

> Signed-off-by: Jan Beulich <jbeulich@suse.com>

I don't like set_cpu_{present,online} taking a boolean clear/set flag. There
is no caller that can both set and clear a flag, so it is always hardcoded
as 0 or 1. And then the reader has to make a (probably not hard) guess what
that means.

If you must add an abstraction interface here, better to define four of
them: {set,clear}_cpu_{present,online}.

Apart from this, all patches are:
Acked-by: Keir Fraser <keir@xen.org>

 -- Keir

> --- a/xen/arch/ia64/linux-xen/acpi.c
> +++ b/xen/arch/ia64/linux-xen/acpi.c
> @@ -557,7 +557,7 @@ acpi_numa_processor_affinity_init(struct
>    (pa->apic_id << 8) | (pa->local_sapic_eid);
> /* nid should be overridden as logical node id later */
> node_cpuid[srat_num_cpus].nid = pxm;
> - cpu_set(srat_num_cpus, early_cpu_possible_map);
> + cpumask_set_cpu(srat_num_cpus, &early_cpu_possible_map);
> srat_num_cpus++;
>  }
>  
> @@ -917,7 +917,7 @@ __init void prefill_possible_map(void)
> possible, max((possible - available_cpus), 0));
>  
> for (i = 0; i < possible; i++)
> -  cpu_set(i, cpu_possible_map);
> +  cpumask_set_cpu(i, &cpu_possible_map);
>  }
>  
>  #ifndef XEN
> --- a/xen/arch/ia64/linux-xen/setup.c
> +++ b/xen/arch/ia64/linux-xen/setup.c
> @@ -463,7 +463,7 @@ mark_bsp_online (void)
>  {
>  #ifdef CONFIG_SMP
> /* If we register an early console, allow CPU 0 to printk */
> - cpu_set(smp_processor_id(), cpu_online_map);
> + set_cpu_online(smp_processor_id(), 1);
>  #endif
>  }
>  
> --- a/xen/arch/ia64/linux-xen/smpboot.c
> +++ b/xen/arch/ia64/linux-xen/smpboot.c
> @@ -392,7 +392,7 @@ smp_callin (void)
>  #else
> lock_ipi_calllock();
>  #endif
> - cpu_set(cpuid, cpu_online_map);
> + set_cpu_online(cpuid, 1);
>  #ifdef XEN
> unlock_ipi_calllock(flags);
>  #else
> @@ -437,7 +437,7 @@ smp_callin (void)
> /*
> * Allow the master to continue.
> */
> - cpu_set(cpuid, cpu_callin_map);
> + cpumask_set_cpu(cpuid, &cpu_callin_map);
> Dprintk("Stack on CPU %d at about %p\n",cpuid, &cpuid);
>  }
>  
> @@ -625,8 +625,8 @@ smp_prepare_cpus (unsigned int max_cpus)
> /*
> * We have the boot CPU online for sure.
> */
> - cpu_set(0, cpu_online_map);
> - cpu_set(0, cpu_callin_map);
> + set_cpu_online(0, 1);
> + cpumask_set_cpu(0, &cpu_callin_map);
>  
> local_cpu_data->loops_per_jiffy = loops_per_jiffy;
> ia64_cpu_to_sapicid[0] = boot_cpu_id;
> @@ -652,8 +652,8 @@ smp_prepare_cpus (unsigned int max_cpus)
>  
>  void __devinit smp_prepare_boot_cpu(void)
>  {
> - cpu_set(smp_processor_id(), cpu_online_map);
> - cpu_set(smp_processor_id(), cpu_callin_map);
> + set_cpu_online(smp_processor_id(), 1);
> + cpumask_set_cpu(smp_processor_id(), &cpu_callin_map);
> per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
>  }
>  
> --- a/xen/arch/ia64/linux-xen/sn/kernel/sn2_smp.c
> +++ b/xen/arch/ia64/linux-xen/sn/kernel/sn2_smp.c
> @@ -214,7 +214,7 @@ sn2_global_tlb_purge(unsigned long start
> for_each_possible_cpu(cpu) {
> cnode = cpu_to_node(cpu);
> if (!node_isset(cnode, nodes_flushed)) {
> -   cpu_set(cpu, selected_cpus);
> +   cpumask_set_cpu(cpu, &selected_cpus);
> i++;
> }
> node_set(cnode, nodes_flushed);
> --- a/xen/arch/ia64/xen/mm_init.c
> +++ b/xen/arch/ia64/xen/mm_init.c
> @@ -38,7 +38,7 @@ ia64_mmu_init (void *my_cpu_data)
> ia64_set_psr(psr);
> ia64_srlz_i();
>  #ifdef XEN
> - cpu_set(cpu, percpu_set);
> + cpumask_set_cpu(cpu, &percpu_set);
>  #endif
>  
> /*
> --- a/xen/arch/ia64/xen/tlb_track.c
> +++ b/xen/arch/ia64/xen/tlb_track.c
> @@ -389,7 +389,7 @@ tlb_track_insert_or_dirty(struct tlb_tra
>  
>   found:
>      BUG_ON(v->processor >= NR_CPUS);
> -    cpu_set(v->processor, entry->pcpu_dirty_mask);
> +    cpumask_set_cpu(v->processor, &entry->pcpu_dirty_mask);
>      BUG_ON(v->vcpu_id >= NR_CPUS);
>      vcpu_set(v->vcpu_id, entry->vcpu_dirty_mask);
>      perfc_incr(tlb_track_iod_dirtied);
> --- a/xen/arch/x86/acpi/cpu_idle.c
> +++ b/xen/arch/x86/acpi/cpu_idle.c
> @@ -271,9 +271,9 @@ static void mwait_idle_with_hints(unsign
>       */
>      if ( expires > NOW() || expires == 0 )
>      {
> -        cpu_set(cpu, cpuidle_mwait_flags);
> +        cpumask_set_cpu(cpu, &cpuidle_mwait_flags);
>          __mwait(eax, ecx);
> -        cpu_clear(cpu, cpuidle_mwait_flags);
> +        cpumask_clear_cpu(cpu, &cpuidle_mwait_flags);
>      }
>  
>      if ( expires <= NOW() && expires > 0 )
> --- a/xen/arch/x86/cpu/mcheck/mce_intel.c
> +++ b/xen/arch/x86/cpu/mcheck/mce_intel.c
> @@ -828,7 +828,7 @@ static void intel_machine_check(struct c
>               * (the MSRs are sticky)
>               */
>              if (bs.pcc || !bs.recoverable)
> -                cpu_set(smp_processor_id(), mce_fatal_cpus);
> +                cpumask_set_cpu(smp_processor_id(), &mce_fatal_cpus);
>          } else {
>              if (mctc != NULL)
>                  mctelem_commit(mctc);
> @@ -849,7 +849,7 @@ static void intel_machine_check(struct c
>  
>      mce_barrier_enter(&mce_trap_bar);
>      if ( mctc != NULL && mce_urgent_action(regs, mctc))
> -        cpu_set(smp_processor_id(), mce_fatal_cpus);
> +        cpumask_set_cpu(smp_processor_id(), &mce_fatal_cpus);
>      mce_barrier_exit(&mce_trap_bar);
>      /*
>       * Wait until everybody has processed the trap.
> --- a/xen/arch/x86/mpparse.c
> +++ b/xen/arch/x86/mpparse.c
> @@ -161,7 +161,7 @@ static int __devinit MP_processor_info_x
> return cpu;
> }
> x86_cpu_to_apicid[cpu] = apicid;
> -  cpu_set(cpu, cpu_present_map);
> +  set_cpu_present(cpu, 1);
> }
>  
> if (++num_processors > 8) {
> --- a/xen/arch/x86/numa.c
> +++ b/xen/arch/x86/numa.c
> @@ -288,7 +288,7 @@ void __init numa_initmem_init(unsigned l
>  
>  __cpuinit void numa_add_cpu(int cpu)
>  {
> - cpu_set(cpu, node_to_cpumask[cpu_to_node(cpu)]);
> + cpumask_set_cpu(cpu, &node_to_cpumask[cpu_to_node(cpu)]);
>  } 
>  
>  void __cpuinit numa_set_node(int cpu, int node)
> --- a/xen/arch/x86/smpboot.c
> +++ b/xen/arch/x86/smpboot.c
> @@ -244,7 +244,7 @@ static void set_cpu_sibling_map(int cpu)
>      int i;
>      struct cpuinfo_x86 *c = cpu_data;
>  
> -    cpu_set(cpu, cpu_sibling_setup_map);
> +    cpumask_set_cpu(cpu, &cpu_sibling_setup_map);
>  
>      if ( c[cpu].x86_num_siblings > 1 )
>      {
> @@ -380,7 +380,7 @@ void start_secondary(void *unused)
>       */
>      lock_vector_lock();
>      __setup_vector_irq(cpu);
> -    cpu_set(cpu, cpu_online_map);
> +    set_cpu_online(cpu, 1);
>      unlock_vector_lock();
>  
>      init_percpu_time();
> @@ -804,8 +804,8 @@ void __init smp_prepare_cpus(unsigned in
>  
>  void __init smp_prepare_boot_cpu(void)
>  {
> -    cpu_set(smp_processor_id(), cpu_online_map);
> -    cpu_set(smp_processor_id(), cpu_present_map);
> +    set_cpu_online(smp_processor_id(), 1);
> +    set_cpu_present(smp_processor_id(), 1);
>  }
>  
>  static void
> @@ -933,7 +933,7 @@ int cpu_add(uint32_t apic_id, uint32_t a
>                     "break assumed cross-CPU TSC coherency.\n"
>                     " ** Consider using boot parameter \"tsc=skewed\" "
>                     "which forces TSC emulation where appropriate.\n", cpu);
> -        cpu_set(cpu, tsc_sync_cpu_mask);
> +        cpumask_set_cpu(cpu, &tsc_sync_cpu_mask);
>      }
>  
>      srat_detect_node(cpu);
> --- a/xen/arch/x86/time.c
> +++ b/xen/arch/x86/time.c
> @@ -1573,7 +1573,7 @@ __initcall(disable_pit_irq);
>  
>  void pit_broadcast_enter(void)
>  {
> -    cpu_set(smp_processor_id(), pit_broadcast_mask);
> +    cpumask_set_cpu(smp_processor_id(), &pit_broadcast_mask);
>  }
>  
>  void pit_broadcast_exit(void)
> --- a/xen/common/cpupool.c
> +++ b/xen/common/cpupool.c
> @@ -253,7 +253,7 @@ static long cpupool_unassign_cpu_helper(
>  
>      spin_lock(&cpupool_lock);
>      ret = cpu_disable_scheduler(cpu);
> -    cpu_set(cpu, cpupool_free_cpus);
> +    cpumask_set_cpu(cpu, &cpupool_free_cpus);
>      if ( !ret )
>      {
>          ret = schedule_cpu_switch(cpu, NULL);
> @@ -409,8 +409,8 @@ void cpupool_rm_domain(struct domain *d)
>  static void cpupool_cpu_add(unsigned int cpu)
>  {
>      spin_lock(&cpupool_lock);
> -    cpu_clear(cpu, cpupool_locked_cpus);
> -    cpu_set(cpu, cpupool_free_cpus);
> +    cpumask_clear_cpu(cpu, &cpupool_locked_cpus);
> +    cpumask_set_cpu(cpu, &cpupool_free_cpus);
>      cpupool_assign_cpu_locked(cpupool0, cpu);
>      spin_unlock(&cpupool_lock);
>  }
> @@ -428,7 +428,7 @@ static int cpupool_cpu_remove(unsigned i
>      if ( !cpumask_test_cpu(cpu, cpupool0->cpu_valid))
>          ret = -EBUSY;
>      else
> -        cpu_set(cpu, cpupool_locked_cpus);
> +        cpumask_set_cpu(cpu, &cpupool_locked_cpus);
>      spin_unlock(&cpupool_lock);
>  
>      return ret;
> --- a/xen/common/sched_credit2.c
> +++ b/xen/common/sched_credit2.c
> @@ -1725,7 +1725,7 @@ csched_schedule(
>      {
>          /* Update the idle mask if necessary */
>          if ( !cpumask_test_cpu(cpu, &rqd->idle) )
> -            cpu_set(cpu, rqd->idle);
> +            cpumask_set_cpu(cpu, &rqd->idle);
>          /* Make sure avgload gets updated periodically even
>           * if there's no activity */
>          update_load(ops, rqd, NULL, 0, now);
> @@ -1860,7 +1860,7 @@ static void activate_runqueue(struct csc
>      INIT_LIST_HEAD(&rqd->runq);
>      spin_lock_init(&rqd->lock);
>  
> -    cpu_set(rqi, prv->active_queues);
> +    cpumask_set_cpu(rqi, &prv->active_queues);
>  }
>  
>  static void deactivate_runqueue(struct csched_private *prv, int rqi)
> @@ -1927,12 +1927,12 @@ static void init_pcpu(const struct sched
>      /* Set the runqueue map */
>      prv->runq_map[cpu]=rqi;
>      
> -    cpu_set(cpu, rqd->idle);
> -    cpu_set(cpu, rqd->active);
> +    cpumask_set_cpu(cpu, &rqd->idle);
> +    cpumask_set_cpu(cpu, &rqd->active);
>  
>      spin_unlock(old_lock);
>  
> -    cpu_set(cpu, prv->initialized);
> +    cpumask_set_cpu(cpu, &prv->initialized);
>  
>      spin_unlock_irqrestore(&prv->lock, flags);
>  
> --- a/xen/include/asm-ia64/linux-xen/asm/acpi.h
> +++ b/xen/include/asm-ia64/linux-xen/asm/acpi.h
> @@ -153,7 +153,7 @@ static inline void per_cpu_scan_finalize
> high_cpu = min(high_cpu + reserve_cpus, NR_CPUS);
>  
> for (cpu = low_cpu; cpu < high_cpu; cpu++) {
> -  cpu_set(cpu, early_cpu_possible_map);
> +  cpumask_set_cpu(cpu, &early_cpu_possible_map);
> if (node_cpuid[cpu].nid == NUMA_NO_NODE) {
> node_cpuid[cpu].nid = next_nid;
> next_nid++;
> --- a/xen/include/xen/cpumask.h
> +++ b/xen/include/xen/cpumask.h
> @@ -97,7 +97,6 @@ static inline unsigned int cpumask_check
> return cpu;
>  }
>  
> -#define cpu_set(cpu, dst) cpumask_set_cpu(cpu, &(dst))
>  static inline void cpumask_set_cpu(int cpu, volatile cpumask_t *dstp)
>  {
> set_bit(cpumask_check(cpu), dstp->bits);
> @@ -452,6 +451,14 @@ extern cpumask_t cpu_present_map;
>  #define cpu_present(cpu) ((cpu) == 0)
>  #endif
>  
> +#define set_cpu_online(cpu, online) \
> +    ((online) ? cpumask_set_cpu(cpu, &cpu_online_map) \
> +              : cpumask_clear_cpu(cpu, &cpu_online_map))
> +
> +#define set_cpu_present(cpu, present) \
> +    ((present) ? cpumask_set_cpu(cpu, &cpu_present_map) \
> +               : cpumask_clear_cpu(cpu, &cpu_present_map))
> +
>  #define any_online_cpu(mask)   \
>  ({      \
> int cpu;    \
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:31:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:31:47 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNS6t-0001Yj-EN; Mon, 07 Nov 2011 08:31:47 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNS6M-0001Ml-B0
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:31:14 -0800
X-Env-Sender: lucianobarreto@gmail.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1320683471!3253510!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32516 invoked from network); 7 Nov 2011 16:31:11 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-4.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 16:31:11 -0000
Received: by wyh11 with SMTP id 11so6183726wyh.30
	for <xen-devel@lists.xensource.com>;
	Mon, 07 Nov 2011 08:31:10 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type;
	bh=8+OwmJIJ7af9qUx409H1ps4sUH84ArFfInsEZVPRd4M=;
	b=LLIAkzWZSHCwuvEz2YfrxEqGWrryiJHUL/OfM6FeW04kmbqhOEpMOTkmtSw3RKmMqa
	l92tb9IUkCq0iJiG5QqtY2/rrB5O3bdCRmkVRuZ5wRhb6m0pKLclWj7Ny+NUHxtFqxHx
	0zeheHNE0RBx31H5NWa2cNuxxEuOWjxn4BsTg=
MIME-Version: 1.0
Received: by 10.227.203.132 with SMTP id fi4mr30811486wbb.6.1320683470699;
	Mon, 07 Nov 2011 08:31:10 -0800 (PST)
Received: by 10.227.165.65 with HTTP; Mon, 7 Nov 2011 08:31:10 -0800 (PST)
In-Reply-To: <1320661076.955.19.camel@zakaz.uk.xensource.com>
References: <CAPiSOA59agvmTHccaXvmcgcDobNeesoR_kJE2qnerS6jyOL__w@mail.gmail.com>
	<1320661076.955.19.camel@zakaz.uk.xensource.com>
Date: Mon, 7 Nov 2011 14:31:10 -0200
Message-ID: <CAPiSOA5af1zARWVTj9KDdAkjX7QjQq+5VtvxdB=R+3ngW_6EPA@mail.gmail.com>
Subject: Re: [Xen-devel] XenStore Devel Help
From: Luciano Barreto <lucianobarreto@gmail.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=ISO-8859-1
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Thanks Ian, I'll look at this source file.
One question, when I do a compilation of all Xen source(make world),
this tools are created too?
Thanks

2011/11/7 Ian Campbell <Ian.Campbell@citrix.com>:
> On Fri, 2011-11-04 at 16:23 +0000, Luciano Barreto wrote:
>> Hi guys, I'm trying to develop a library to access XenStore via Java
>> Application (Academic purposes) but I have not a lot experiencie in C
>> or how to do that. Anyone here have an example of how to access
>> XenStore using the library "xs.h". I found an example over the
>> internet
>
> There is a basic command line client in
> tools/xenstore/xenstore_client.c. You could also look at tools/libxl
> which uses xenstore reasonably extensively.
>
> tools/python/xen/lowlevel/xs/xs.c is the python bindings which I suppose
> might be of interest.
>
>> but I'm havig any compilation problems.Thanks
>
> You'll have to be more specific if you want help with this.
>
> However if you are struggling with the C aspect then I suggest you seek
> out someone within your university department who can help, this list is
> not best suited to teaching people new languages.
>
> Ian.
>
>



-- 
Luciano Barreto

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:36:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:36:32 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNSBU-0002AP-6d; Mon, 07 Nov 2011 08:36:32 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNSB4-0001yL-12
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:36:06 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320683762!3232830!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28056 invoked from network); 7 Nov 2011 16:36:02 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 16:36:02 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315180800"; 
   d="scan'208";a="8800775"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 16:36:02 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Mon, 7 Nov 2011
	16:36:02 +0000
Subject: Re: [Xen-devel] XenStore Devel Help
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Luciano Barreto <lucianobarreto@gmail.com>
Date: Mon, 7 Nov 2011 16:36:02 +0000
In-Reply-To: <CAPiSOA5af1zARWVTj9KDdAkjX7QjQq+5VtvxdB=R+3ngW_6EPA@mail.gmail.com>
References: <CAPiSOA59agvmTHccaXvmcgcDobNeesoR_kJE2qnerS6jyOL__w@mail.gmail.com>
	<1320661076.955.19.camel@zakaz.uk.xensource.com>
	<CAPiSOA5af1zARWVTj9KDdAkjX7QjQq+5VtvxdB=R+3ngW_6EPA@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320683762.955.42.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Please don't top post (see
http://wiki.xen.org/xenwiki/AskingXenDevelQuestions )

On Mon, 2011-11-07 at 16:31 +0000, Luciano Barreto wrote:
> Thanks Ian, I'll look at this source file.
> One question, when I do a compilation of all Xen source(make world),
> this tools are created too?

Yes.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:43:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:43:29 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNSID-0002gv-QC; Mon, 07 Nov 2011 08:43:29 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNSHU-0002U7-6B
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:42:44 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1320684160!3267677!1
X-Originating-IP: [137.65.248.74]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2617 invoked from network); 7 Nov 2011 16:42:40 -0000
Received: from novprvoes0310.provo.novell.com (HELO
	novprvoes0310.provo.novell.com) (137.65.248.74)
	by server-7.tower-21.messagelabs.com with SMTP;
	7 Nov 2011 16:42:40 -0000
Received: from INET-PRV-MTA by novprvoes0310.provo.novell.com
	with Novell_GroupWise; Mon, 07 Nov 2011 09:42:39 -0700
Message-Id: <4EB8188B020000780005F6E4@novprvoes0310.provo.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 Beta 
Date: Mon, 07 Nov 2011 09:42:35 -0700
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jean Guyader" <jean.guyader@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 2/6] iommu: Introduce iommu_flush and
	iommu_flush_all.
References: <1320678999-24995-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-3-git-send-email-jean.guyader@eu.citrix.com>
In-Reply-To: <1320678999-24995-3-git-send-email-jean.guyader@eu.citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: tim@xen.org, xen-devel@lists.xensource.com, allen.m.kay@intel.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 07.11.11 at 16:16, Jean Guyader <jean.guyader@eu.citrix.com> wrote:

> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> ---
>  xen/drivers/passthrough/iommu.c     |   20 ++++++++++++++++++++
>  xen/drivers/passthrough/vtd/iommu.c |   12 ++++++++++++
>  xen/include/xen/iommu.h             |    5 +++++
>  3 files changed, 37 insertions(+), 0 deletions(-)

In iommu_iotlb_flush() you check whether the to-be-called function
pointer is NULL, whereas in iommu_iotlb_flush_all() you don't. I
actually think the second behavior is the correct one, but that
implies that you need to also implement respective AMD IOMMU
functions.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 08:46:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 08:46:48 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNSLP-00037L-V7; Mon, 07 Nov 2011 08:46:47 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNSKj-0002uo-79
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:46:05 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1320684361!2616367!1
X-Originating-IP: [137.65.248.74]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 616 invoked from network); 7 Nov 2011 16:46:02 -0000
Received: from novprvoes0310.provo.novell.com (HELO
	novprvoes0310.provo.novell.com) (137.65.248.74)
	by server-9.tower-216.messagelabs.com with SMTP;
	7 Nov 2011 16:46:02 -0000
Received: from INET-PRV-MTA by novprvoes0310.provo.novell.com
	with Novell_GroupWise; Mon, 07 Nov 2011 09:46:00 -0700
Message-Id: <4EB81956020000780005F6E7@novprvoes0310.provo.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 Beta 
Date: Mon, 07 Nov 2011 09:45:58 -0700
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jean Guyader" <jean.guyader@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 4/6] mm: New XENMEM,
	XENMEM_add_to_physmap_gmfn_range
References: <1320678999-24995-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-5-git-send-email-jean.guyader@eu.citrix.com>
In-Reply-To: <1320678999-24995-5-git-send-email-jean.guyader@eu.citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: tim@xen.org, xen-devel@lists.xensource.com, allen.m.kay@intel.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 07.11.11 at 16:16, Jean Guyader <jean.guyader@eu.citrix.com> wrote:

> XENMEM_add_to_physmap_gmfn_range is like XENMEM_add_to_physmap on
> the gmfn space but the number of pages on which xen will iterate.
>=20
> Use the 16 bits padding between .domid and .space in struct=20
> xen_add_to_physmap
> to keep compatibility with older versions.
>=20
> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> ---
>  xen/arch/x86/mm.c           |   22 +++++++++++++++++++++-
>  xen/include/public/memory.h |    5 ++++-
>  2 files changed, 25 insertions(+), 2 deletions(-)

Please remove the stray last hunk of the patch (the newline there
should stay).

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 09:02:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 09:02:19 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNSaR-0003ou-1U; Mon, 07 Nov 2011 09:02:19 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNSXE-0003ZU-SQ
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 08:59:49 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1320685135!2543960!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17510 invoked from network); 7 Nov 2011 16:58:55 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 16:58:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315180800"; 
   d="scan'208";a="8801390"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 16:58:55 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 16:58:55 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNSX8-0003ld-QE;
	Mon, 07 Nov 2011 16:58:54 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNSX0-0006uM-ID;
	Mon, 07 Nov 2011 16:58:46 +0000
Date: Mon, 7 Nov 2011 16:58:46 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 4/6] mm: New XENMEM,
	XENMEM_add_to_physmap_gmfn_range
Message-ID: <20111107165846.GA26428@spongy.cam.xci-test.com>
References: <1320678999-24995-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-5-git-send-email-jean.guyader@eu.citrix.com>
	<4EB81956020000780005F6E7@novprvoes0310.provo.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
In-Reply-To: <4EB81956020000780005F6E7@novprvoes0310.provo.novell.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: "Tim \(Xen.org\)" <tim@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"allen.m.kay@intel.com" <allen.m.kay@intel.com>,
	Jean Guyader <Jean.Guyader@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 07/11 04:45, Jan Beulich wrote:
> >>> On 07.11.11 at 16:16, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> 
> > XENMEM_add_to_physmap_gmfn_range is like XENMEM_add_to_physmap on
> > the gmfn space but the number of pages on which xen will iterate.
> > 
> > Use the 16 bits padding between .domid and .space in struct 
> > xen_add_to_physmap
> > to keep compatibility with older versions.
> > 
> > Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> > ---
> >  xen/arch/x86/mm.c           |   22 +++++++++++++++++++++-
> >  xen/include/public/memory.h |    5 ++++-
> >  2 files changed, 25 insertions(+), 2 deletions(-)
> 
> Please remove the stray last hunk of the patch (the newline there
> should stay).
> 

Yes, it shouldn't be there. I've updated the patch.

Thanks,
Jean

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 09:09:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 09:09:07 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNSh0-0004JC-Te; Mon, 07 Nov 2011 09:09:06 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNSeE-000446-07
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 09:06:16 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1320685570!614203!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3379 invoked from network); 7 Nov 2011 17:06:10 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 17:06:10 -0000
X-IronPort-AV: E=Sophos;i="4.69,470,1315180800"; 
   d="scan'208";a="8801539"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 17:06:09 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 17:06:09 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNSe9-0003oC-FQ;
	Mon, 07 Nov 2011 17:06:09 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNSe1-0006v8-7R;
	Mon, 07 Nov 2011 17:06:01 +0000
Date: Mon, 7 Nov 2011 17:06:01 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 2/6] iommu: Introduce iommu_flush and
	iommu_flush_all.
Message-ID: <20111107170601.GB26428@spongy.cam.xci-test.com>
References: <1320678999-24995-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-3-git-send-email-jean.guyader@eu.citrix.com>
	<4EB8188B020000780005F6E4@novprvoes0310.provo.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
In-Reply-To: <4EB8188B020000780005F6E4@novprvoes0310.provo.novell.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: "Tim \(Xen.org\)" <tim@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"allen.m.kay@intel.com" <allen.m.kay@intel.com>,
	Jean Guyader <Jean.Guyader@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 07/11 04:42, Jan Beulich wrote:
> >>> On 07.11.11 at 16:16, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> 
> > Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> > ---
> >  xen/drivers/passthrough/iommu.c     |   20 ++++++++++++++++++++
> >  xen/drivers/passthrough/vtd/iommu.c |   12 ++++++++++++
> >  xen/include/xen/iommu.h             |    5 +++++
> >  3 files changed, 37 insertions(+), 0 deletions(-)
> 
> In iommu_iotlb_flush() you check whether the to-be-called function
> pointer is NULL, whereas in iommu_iotlb_flush_all() you don't. I
> actually think the second behavior is the correct one, but that
> implies that you need to also implement respective AMD IOMMU
> functions.
> 

Yes, It's an error on my part. I've updated the patch to check
for the present of iotlb_flush_all before I call it now.

Thanks,
Jean

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 09:15:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 09:15:40 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNSnL-0004m6-5n; Mon, 07 Nov 2011 09:15:39 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNSjy-0004WX-Ca
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 09:12:10 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1320685926!3152205!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31188 invoked from network); 7 Nov 2011 17:12:07 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 17:12:07 -0000
X-IronPort-AV: E=Sophos;i="4.69,471,1315180800"; 
   d="scan'208";a="8801813"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 17:12:06 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 17:12:06 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNSju-0003qN-CE;
	Mon, 07 Nov 2011 17:12:06 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNSjm-0006ve-4h;
	Mon, 07 Nov 2011 17:11:58 +0000
Date: Mon, 7 Nov 2011 17:11:58 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH] ioemu: Clone ioemu with --depth=1
Message-ID: <20111107171158.GC26428@spongy.cam.xci-test.com>
References: <20111101173312.GH20553@spongy.cam.xci-test.com>
	<4EB0655F.5080107@tycho.nsa.gov>
	<1320184340.3084.23.camel@cthulhu.hellion.org.uk>
	<CAEBdQ90x9FTW6L5njV3GDbTqmKDtuOGfe1nL23ZgfgoT2Tk_cA@mail.gmail.com>
	<20145.26937.295743.89169@mariner.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
In-Reply-To: <20145.26937.295743.89169@mariner.uk.xensource.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Jean Guyader <Jean.Guyader@citrix.com>,
	Daniel De Graaf <dgdegra@tycho.nsa.gov>,
	Jean Guyader <jean.guyader@gmail.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 02/11 04:00, Ian Jackson wrote:
> Jean Guyader writes ("Re: [Xen-devel] [PATCH] ioemu: Clone ioemu with --depth=1"):
> > I don't think it's fair to measure things in seconds here since it's
> > very much depend on the Internet connection people are using. When
> > building tip of xen-unstable we are actually downloading 3 times as
> > much data that we actually need (9.9M instead of 29.11M).
> 
> I don't have an objection in principle to this patch, but it needs to
> be made to work properly and that's difficult.
> 
> We haven't in the past made tags for every revision that is mentioned
> in QEMU_TAG in xen-{*-testing,unstable}.hg.  In principle I guess we
> could retrospectively make such tags.  (I think it is necessary that
> "hg clone; hg up <revision>; make" should always work even if
> <revision> is very old.)
> 
> Also I'm worried that some old versions of git may not have --depth.
> 

If QEMU_TAG is or should be set most of the time there is not point
to have this feature.

Jean

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 09:17:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 09:17:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNSpF-0005AB-Lj; Mon, 07 Nov 2011 09:17:37 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNSmE-0004fm-ET
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 09:14:31 -0800
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-9.tower-174.messagelabs.com!1320686066!617439!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30936 invoked from network); 7 Nov 2011 17:14:27 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-9.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Nov 2011 17:14:27 -0000
X-Originating-Ip: [194.89.68.22]
Received: from ydin.reaktio.net (reaktio.net [194.89.68.22])
	by smtp.tele.fi (Postfix) with ESMTP id DD7812A9A;
	Mon,  7 Nov 2011 19:14:25 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id B043920083; Mon,  7 Nov 2011 19:14:25 +0200 (EET)
Date: Mon, 7 Nov 2011 19:14:25 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: William Dauchy <wdauchy@gmail.com>
Subject: Re: [Xen-devel] hvm guest direct kernel boot
Message-ID: <20111107171425.GQ12984@reaktio.net>
References: <CAJ75kXZLGWXY8Jkk3QqoMBxAfCAx1JiTBmneKh6F3T1yggGOsA@mail.gmail.com>
	<alpine.DEB.2.00.1108231802130.12963@kaball-desktop>
	<CAJ75kXZc3HOJtN_0F0JR3fX-PnDci7+bFySF8O1WCBbNGj54dg@mail.gmail.com>
	<alpine.DEB.2.00.1108232321410.12963@kaball-desktop>
	<CAJ75kXb-egWx4j+_==6YxqRr799x1-PTwFMfzJNUtms7bk5XgA@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAJ75kXb-egWx4j+_==6YxqRr799x1-PTwFMfzJNUtms7bk5XgA@mail.gmail.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Aug 24, 2011 at 02:08:44PM +0200, William Dauchy wrote:
> Hi Stefano,
> 
> On Wed, Aug 24, 2011 at 1:07 PM, Stefano Stabellini
> <stefano.stabellini@eu.citrix.com> wrote:
> > It is still present for PV guests (remove builder=hvm), you can use
> > kernel and ramdisk.
> 
> Yes I know that.
> 
> > Unfortuntely it is not just a matter of editing qemu, you need to start
> > from libxc and libxenlight: the linux kernel image should probably be
> > passed by libxenlight to xc_hvm_build_target_mem, that should be able to
> > read it and map it in the guest.
> 
> Thanks for the details. I will dig into it if I find time to.
>

Hello,

Some user on ##xen was asking for this feature.. did you have time to try it? 

-- Pasi


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 09:19:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 09:19:48 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNSrL-0005YM-41; Mon, 07 Nov 2011 09:19:47 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNSmU-0004hF-KD; Mon, 07 Nov 2011 09:14:50 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320686047!62230061!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3705 invoked from network); 7 Nov 2011 17:14:07 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 17:14:07 -0000
X-IronPort-AV: E=Sophos;i="4.69,471,1315180800"; 
   d="scan'208";a="8801874"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 17:14:37 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 17:14:37 +0000
Date: Mon, 7 Nov 2011 17:15:08 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: Is: Xen 4.1.1, xend, HVM, 3.1 kernel; Was:Re: [Xen-devel] xen
	4.2 unstable; HVM; 2.6.39.3; HD/Network card error
In-Reply-To: <20111103173837.GA21554@phenom.dumpdata.com>
Message-ID: <alpine.DEB.2.00.1111071646210.3519@kaball-desktop>
References: <!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAI32k8eIVQhMgLM5AGCb128BAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107181242270.12963@kaball-desktop>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAE0cphS4zTVFjzXOjWNB7uwBAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107201238440.12963@kaball-desktop>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAIMchHuG/6dIqtJ7GgPrsOEBAAAAAA==@gmail.com>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAAKIP0TTIelKl7OMHw7/aSQBAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107251142270.12963@kaball-desktop>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAICr5HMuz3FOpEbmgui+XxgBAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107251748160.12963@kaball-desktop>
	<20111103173837.GA21554@phenom.dumpdata.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Walter Robert Ditzler <ditwal001@gmail.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 3 Nov 2011, Konrad Rzeszutek Wilk wrote:
> .. snip..
> > I need the output of the guest kernel stuck during boot in order to
> > understand the problem. It shouldn't be difficult to get if you enable
> > logging over the serial in the guest kernel.
> 
> Hey Stefano,
> 
> Looks like I can reproduce this as well. This is using Fedora Core 16,
> and with the Fedora Core 16 HVM install.
> 
> The interesting thing is that while 'xl' works, the 'xm' (which is what
> virt-install and all of that uses), does not. And I think it is related
> just to how we handle the hdc:cdrom,r case. Read below.
> 
> Just to make sure it is not SELinux related, I've called 'setenforce=0'.
> The guest config is easy:
> 
> kernel = "/usr/lib/xen/boot/hvmloader"
> builder='hvm'
> memory=1024
> #maxmem=1024
> maxvcpus = 2
> serial='pty'
> vcpus = 2
> disk = [ 'file:/mnt/iso/Fedora-16-x86_64-DVD.iso,hdc:cdrom,r', 'phy:/dev/vg_guest/f16_64,hda,w']
> boot="dn"
> vif = [ 'type=ioemu,model=e1000,mac=00:0F:4B:00:00:71, bridge=switch' ]
> vfb = [ 'vnc=1, vnclisten=0.0.0.0 ,vncunused=1']
> vnclisten="0.0.0.0"

BTW the vfb setting is wrong for an hvm domain.
The correct way of configuring vnc is the following:

vnc=1
vnclisten="0.0.0.0"
vncunused=1

it just happened to work with xm but it was never supposed to.


> Attached are the serial logs from good and bad, and as well the xenstore-ls from ..
> you guessed it - good and bad. The interesting part is:
> 
> (this works)
>    backend = ""
>     qdisk = ""
>      24 = ""
>       5632 = ""
>        frontend = "/local/domain/24/device/vbd/5632"
>        params = "aio:/mnt/iso/Fedora-16-x86_64-DVD.iso"
>        frontend-id = "24"
>        online = "1"
>        removable = "1"
>        bootable = "1"
>        state = "6"
>        dev = "hdc"
>        type = "tap"
>        mode = "r"
>        feature-barrier = "1"
>        info = "4"
>        sector-size = "512"
>        sectors = "7337984"
>        hotplug-status = "connected"
> 
> (this fails)
>     vbd = ""
>      10 = ""
>       768 = ""
>        domain = "test"
>        frontend = "/local/domain/10/device/vbd/768"
>        uuid = "ee7800e1-fae0-dfe2-9345-96fda7d7851f"
>        bootable = "1"
>        dev = "hda"
>        state = "4"
>        params = "/var/lib/xen/images/test.img"
>        mode = "w"
>        online = "1"
>        frontend-id = "10"
>        type = "file"
>        node = "/dev/loop0"
>        physical-device = "7:0"
>        hotplug-status = "connected"
>        feature-flush-cache = "1"
>        sectors = "41943040"
>        info = "0"
>        sector-size = "512"
> 
> Which would imply that for the CD-ROM when we use 'xm' it is setup
> as a PV disk (and we try to load the driver for it but fail)
> while for the 'xl' it is as a QEMU qdisk (so emulated).

There is always a PV disk associated with CD-ROMs even though the guest
is not going to use it. Linux blkfront would explicitly avoid to setup
a PV interface for CD-ROMs.


> First I *thought* it was that blkback is failing to do its
> stuff when using /dev/loop0, but after doing this:
> 
> disk = [ 'phy:/dev/loop0,hda,w']
> 
> I still got it to boot.

Let me get this straight:

disk = [ 'phy:/dev/loop0,hda,w'] works
disk = [ 'file:/mnt/iso/Fedora-16-x86_64-DVD.iso,hdc:cdrom,r' ] does NOT work

that is very strange considering that if I recall correctly xm/xend
would setup a loop device when the disk config is 'file:', so the two
should be equivalent.


> So it really seams that xen-blkback (or xen-blkfront) can't deal
> with CD-ROMs very well. So I did it:
> 
> disk = [ 'phy:/dev/loop1,hdc:cdrom,r', 'phy:/dev/loop0,hda,w']
> [root@phenom ~]# losetup -a
> /dev/loop0: [0005]:1353 (/dev/mapper/vg_guest-f16_64)
> /dev/loop1: [002a]:45613764 (/mnt/iso/Fedora-16-x86_64-DVD.iso)
> 
> Which is pretty much exactly what the 'file:/'.. would, and I got this
>  vbd = ""
>      34 = ""
>       5632 = ""
>        domain = "hvm.xm"
>        frontend = "/local/domain/34/device/vbd/5632"
>        uuid = "e30da140-7ef9-9c1f-8e45-1e5e63f798e0"
>        bootable = "1"
>        dev = "hdc"
>        state = "6"
>        params = "/dev/loop1"
>        mode = "r"
>        online = "1"
>        frontend-id = "34"
>        type = "phy"
>        physical-device = "7:1"
>        hotplug-status = "connected"
> 
> And after waiting for the timeout.. (can't load and then some more, the installer
> came up and I could 'Test' the ISO image. The CD-ROM image was
> emulated, which sounds right - the vbd/34/5632 just did not work out
> and it timed out, but it still had the QEMU disk (/dev/sr0) and it used
> that instead.

What is the guest kernel? As I said before blkfront should avoid loading
a PV disk for CD-ROMs, see:

commit b98a409b80ac510c95b4f1bafdef28edaeabd3e7
Author: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date:   Thu Jul 29 14:53:16 2010 +0100

    blkfront: do not create a PV cdrom device if xen_hvm_guest
    
    It is not possible to unplug emulated cdrom devices, and PV cdroms don't
    handle media insert, eject and stream, so we are better off disabling PV
    cdroms when running as a Xen HVM guest.
    
    Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>


> Any suggestions, thoughts, ideas? It sounds like the xen-blkfront
> support for CD-ROMs is not working right.

it shouldn't work at all :)


> Or maybe there are multiple issues and the error from xen-blkfront is
> red heering. I seem to see other things too:
> 
> vif vif-0: 2 parsing device/vif/0/mac
> 
> [Ugh, looks like MAC is 00:00:00:0.. in the guest], but it probably got the right
> MAC on the emulated device]
> 
> 
> XENBUS: Timeout connecting to device: device/vkbd/0 (local state 3, remote state 1)
> [which seems odds as the vkb from VNC looks to be working]

Thanks for pointing this out: I enabled vkbd in upstream qemu but I
forgot to do the same in qemu-xen so as a result you would get failures
of this kind.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 09:24:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 09:24:56 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNSwJ-0006mD-TM; Mon, 07 Nov 2011 09:24:55 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNSrx-0005fO-Qc
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 09:20:28 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1320686422!3153100!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19869 invoked from network); 7 Nov 2011 17:20:22 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 17:20:22 -0000
X-IronPort-AV: E=Sophos;i="4.69,471,1315180800"; 
   d="scan'208";a="8802009"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 17:19:58 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 17:19:58 +0000
Date: Mon, 7 Nov 2011 17:20:39 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: xen-devel@lists.xensource.com
Message-ID: <alpine.DEB.2.00.1111071715450.3519@kaball-desktop>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Subject: [Xen-devel] qemu-xen: add vkbd support for PV on HVM guests
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Register the vkbd backend even when running as device emulator for HVM
guests: it is useful because it doesn't need a frequent timer like usb.

Check whether the XenInput DisplayState has been set in the initialise
state, rather than the input state.
In case the DisplayState hasn't been set and there is no vfb for this
domain, then set the XenInput DisplayState to the default one.

An equivalent patch has already been committed in upstream qemu.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---

diff --git a/hw/xen_machine_fv.c b/hw/xen_machine_fv.c
index 603a508..fdad42a 100644
--- a/hw/xen_machine_fv.c
+++ b/hw/xen_machine_fv.c
@@ -368,6 +368,7 @@ static void xen_init_fv(ram_addr_t ram_size, int vga_ram_size,
         exit(1);
     }
     xen_be_register("console", &xen_console_ops);
+    xen_be_register("vkbd", &xen_kbdmouse_ops);
 #ifndef CONFIG_STUBDOM
     xen_be_register("qdisk", &xen_blkdev_ops);
 #endif
diff --git a/hw/xenfb.c b/hw/xenfb.c
index 05c51cc..96c2a6f 100644
--- a/hw/xenfb.c
+++ b/hw/xenfb.c
@@ -350,13 +350,6 @@ static void xenfb_mouse_event(void *opaque,
 
 static int input_init(struct XenDevice *xendev)
 {
-    struct XenInput *in = container_of(xendev, struct XenInput, c.xendev);
-
-    if (!in->c.ds) {
-        xen_be_printf(xendev, 1, "ds not set (yet)\n");
-	return -1;
-    }
-
     xenstore_write_be_int(xendev, "feature-abs-pointer", 1);
     return 0;
 }
@@ -366,6 +359,18 @@ static int input_initialise(struct XenDevice *xendev)
     struct XenInput *in = container_of(xendev, struct XenInput, c.xendev);
     int rc;
 
+    if (!in->c.ds) {
+        char *vfb = xenstore_read_str(NULL, "device/vfb");
+        if (vfb == NULL) {
+            /* there is no vfb, run vkbd on its own */
+            in->c.ds = get_displaystate();
+        } else {
+            free(vfb);
+            xen_be_printf(xendev, 1, "ds not set (yet)\n");
+            return -1;
+        }
+    }
+
     rc = common_bind(&in->c);
     if (rc != 0)
 	return rc;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 09:45:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 09:45:48 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNTGU-0007Z4-Bd; Mon, 07 Nov 2011 09:45:47 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNTFV-0007M7-KL
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 09:44:46 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1320687869!54067148!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15231 invoked from network); 7 Nov 2011 17:44:29 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 17:44:29 -0000
X-IronPort-AV: E=Sophos;i="4.69,471,1315180800"; 
   d="scan'208";a="8802629"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 17:44:41 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 17:44:41 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNTFR-000426-9c;
	Mon, 07 Nov 2011 17:44:41 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNTFJ-00073H-0s;
	Mon, 07 Nov 2011 17:44:33 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Mon, 7 Nov 2011 17:44:26 +0000
Message-ID: <1320687866-27076-1-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH] vtd: Flush IOMMU global context when setting up
	guest context.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/drivers/passthrough/vtd/iommu.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0001-vtd-Flush-IOMMU-global-context-when-setting-up-guest.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0001-vtd-Flush-IOMMU-global-context-when-setting-up-guest.patch"

diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 7717ab4..58b73ac 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -1373,6 +1373,8 @@ int domain_context_mapping_one(
 
     set_bit(iommu->index, &hd->iommu_bitmap);
 
+    iommu_flush_context_global(iommu, 0);
+
     unmap_vtd_domain_page(context_entries);
 
     if ( !seg )

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 09:55:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 09:55:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNTPZ-00084Y-SB; Mon, 07 Nov 2011 09:55:09 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNTOj-0007s4-De
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 09:54:17 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1320688425!56264738!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6253 invoked from network); 7 Nov 2011 17:53:45 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 17:53:45 -0000
Received: by wwf4 with SMTP id 4so5811554wwf.24
	for <xen-devel@lists.xensource.com>;
	Mon, 07 Nov 2011 09:54:14 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=D8XsBfF1pPOetTNI5xW40yrDpyN2/CpWvstHJBDxQ5M=;
	b=DGGy4z06Tf8dLM5JO9eTB0m2w/p2ebz2FMF5hSevvUX0EwdQE3uNxBk6e3ugnWpmLJ
	yUn5LCVS/xiqLjsJQFQnMY3mqJvvV4vIGDqZP+eLAjDlW6wE5nDpSs+Xp19eMfzCpiCi
	C07z5qfOjtZxHVfhM3ic/CT8osvWcMDtK+leM=
Received: by 10.227.208.71 with SMTP id gb7mr29856787wbb.7.1320688454231;
	Mon, 07 Nov 2011 09:54:14 -0800 (PST)
Received: from [192.168.1.3] (host86-129-249-120.range86-129.btcentralplus.com.
	[86.129.249.120])
	by mx.google.com with ESMTPS id es5sm28565883wbb.11.2011.11.07.09.54.11
	(version=SSLv3 cipher=OTHER); Mon, 07 Nov 2011 09:54:13 -0800 (PST)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Mon, 07 Nov 2011 17:54:03 +0000
Subject: Re: [Xen-devel] [PATCH] vtd: Flush IOMMU global context when setting
	up guest context.
From: Keir Fraser <keir@xen.org>
To: Jean Guyader <jean.guyader@eu.citrix.com>, <xen-devel@lists.xensource.com>
Message-ID: <CADDCBBB.33B2D%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] vtd: Flush IOMMU global context when setting
	up guest context.
Thread-Index: AcyddjxIfZk46/Dz+0+Em4QE+W0tsA==
In-Reply-To: <1320687866-27076-1-git-send-email-jean.guyader@eu.citrix.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: allen.m.kay@intel.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Because....?

On 07/11/2011 17:44, "Jean Guyader" <jean.guyader@eu.citrix.com> wrote:

> 
> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> ---
>  xen/drivers/passthrough/vtd/iommu.c |    2 ++
>  1 files changed, 2 insertions(+), 0 deletions(-)
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 10:26:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 10:26:49 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNTuD-0000VM-Bo; Mon, 07 Nov 2011 10:26:49 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNTt7-0000Hg-3R
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 10:25:41 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-16.tower-174.messagelabs.com!1320690337!622785!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13055 invoked from network); 7 Nov 2011 18:25:37 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 18:25:37 -0000
X-IronPort-AV: E=Sophos;i="4.69,471,1315180800"; 
   d="scan'208";a="8803203"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 18:25:37 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 18:25:37 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNTt2-0004H3-Tf;
	Mon, 07 Nov 2011 18:25:36 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNTsu-0003JH-Kb;
	Mon, 07 Nov 2011 18:25:28 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Mon, 7 Nov 2011 18:25:21 +0000
Message-ID: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
MIME-Version: 1.0
Content-Type: text/plain
Cc: allen.m.kay@intel.com, tim@xen.org
Subject: [Xen-devel] IOMMU, vtd and iotlb flush rework (v3)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

In one of my previous email I detailed a bug I was seeing when passing
through a Intel GPU on a guest that has more that 4G or RAM.

Allen suggested that I go for the Plan B but after a discussion with Tim
we agreed that Plan B was way to disruptive in term of code change.

This patch series implements Plan A.

http://xen.1045712.n5.nabble.com/VTD-Intel-iommu-IOTLB-flush-really-slow-td4952866.html

Changes between v2 and v3:
        - Check for the presence iotlb_flush_all callback before calling it.

Changes between v1 and v2:
       - Move size in struct xen_add_to_physmap in padding between .domid and .space.
       - Store iommu_dont_flush per cpu
       - Change the code in hvmloader to relocate by batch of 64K, .size is now 16 bits.

Jean Guyader (6):
      vtd: Refactor iotlb flush code
      iommu: Introduce iommu_flush and iommu_flush_all.
      add_to_physmap: Move the code for XENMEM_add_to_physmap.
      mm: New XENMEM, XENMEM_add_to_physmap_gmfn_range
      hvmloader: Change memory relocation loop when overlap with PCI hole.
      Introduce per cpu flag (iommu_dont_flush_iotlb) to avoid unnecessary iotlb flush

 tools/firmware/hvmloader/pci.c      |   20 +++-
 xen/arch/x86/mm.c                   |  203 +++++++++++++++++++++--------------
 xen/drivers/passthrough/iommu.c     |   25 +++++
 xen/drivers/passthrough/vtd/iommu.c |  100 ++++++++++--------
 xen/include/public/memory.h         |    4 +
 xen/include/xen/iommu.h             |    7 ++
 6 files changed, 230 insertions(+), 129 deletions(-)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 10:28:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 10:28:16 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNTvc-0000tK-4N; Mon, 07 Nov 2011 10:28:16 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNTt7-0000Hj-SX
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 10:25:42 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-16.tower-174.messagelabs.com!1320690337!622785!4
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13119 invoked from network); 7 Nov 2011 18:25:38 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 18:25:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,471,1315180800"; 
   d="scan'208";a="8803206"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 18:25:37 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 18:25:37 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNTt3-0004HA-8c;
	Mon, 07 Nov 2011 18:25:37 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNTsu-0003JM-VF;
	Mon, 07 Nov 2011 18:25:29 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Mon, 7 Nov 2011 18:25:23 +0000
Message-ID: <1320690327-12649-3-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
References: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 2/6] iommu: Introduce iommu_flush and
	iommu_flush_all.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/drivers/passthrough/iommu.c     |   20 ++++++++++++++++++++
 xen/drivers/passthrough/vtd/iommu.c |   12 ++++++++++++
 xen/include/xen/iommu.h             |    5 +++++
 3 files changed, 37 insertions(+), 0 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0002-iommu-Introduce-iommu_flush-and-iommu_flush_all.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0002-iommu-Introduce-iommu_flush-and-iommu_flush_all.patch"

diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index cd6174d..ca7b37b 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -301,6 +301,26 @@ int iommu_unmap_page(struct domain *d, unsigned long gfn)
     return hd->platform_ops->unmap_page(d, gfn);
 }
 
+void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+    if ( !iommu_enabled || !hd->platform_ops || !hd->platform_ops->iotlb_flush )
+        return;
+
+    hd->platform_ops->iotlb_flush(d, gfn, page_count);
+}
+
+void iommu_iotlb_flush_all(struct domain *d)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+    if ( !iommu_enabled || !hd->platform_ops || !hd->platform_ops->iotlb_flush_all )
+        return;
+
+    hd->platform_ops->iotlb_flush_all(d);
+}
+
 /* caller should hold the pcidevs_lock */
 int deassign_device(struct domain *d, u16 seg, u8 bus, u8 devfn)
 {
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 5a5b6be..7ec9541 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -619,6 +619,16 @@ static void __intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn,
     }
 }
 
+static void intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count)
+{
+    __intel_iommu_iotlb_flush(d, gfn, 1, page_count);
+}
+
+static void intel_iommu_iotlb_flush_all(struct domain *d)
+{
+    __intel_iommu_iotlb_flush(d, 0, 0, 0);
+}
+
 /* clear one page's page table */
 static void dma_pte_clear_one(struct domain *domain, u64 addr)
 {
@@ -2329,6 +2339,8 @@ const struct iommu_ops intel_iommu_ops = {
     .resume = vtd_resume,
     .share_p2m = iommu_set_pgd,
     .crash_shutdown = vtd_crash_shutdown,
+    .iotlb_flush = intel_iommu_iotlb_flush,
+    .iotlb_flush_all = intel_iommu_iotlb_flush_all,
 };
 
 /*
diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
index 837e60d..a1034df 100644
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -139,6 +139,8 @@ struct iommu_ops {
     void (*resume)(void);
     void (*share_p2m)(struct domain *d);
     void (*crash_shutdown)(void);
+    void (*iotlb_flush)(struct domain *d, unsigned long gfn, unsigned int page_count);
+    void (*iotlb_flush_all)(struct domain *d);
 };
 
 void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value);
@@ -155,4 +157,7 @@ void iommu_share_p2m_table(struct domain *d);
 
 int iommu_do_domctl(struct xen_domctl *, XEN_GUEST_HANDLE(xen_domctl_t));
 
+void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count);
+void iommu_iotlb_flush_all(struct domain *d);
+
 #endif /* _IOMMU_H_ */

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 10:29:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 10:29:37 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNTwv-0001Gt-7y; Mon, 07 Nov 2011 10:29:37 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNTt7-0000Hh-Ht
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 10:25:42 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-16.tower-174.messagelabs.com!1320690337!622785!2
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13077 invoked from network); 7 Nov 2011 18:25:38 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 18:25:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,471,1315180800"; 
   d="scan'208";a="8803204"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 18:25:37 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 18:25:37 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNTt3-0004H7-3j;
	Mon, 07 Nov 2011 18:25:37 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNTsu-0003JJ-Ow;
	Mon, 07 Nov 2011 18:25:28 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Mon, 7 Nov 2011 18:25:22 +0000
Message-ID: <1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
References: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 1/6] vtd: Refactor iotlb flush code
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Factorize the iotlb flush code from map_page and unmap_page into
it's own function.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/drivers/passthrough/vtd/iommu.c |   86 +++++++++++++++++-----------------
 1 files changed, 43 insertions(+), 43 deletions(-)


--------------true
Content-Type: text/x-patch; name="0001-vtd-Refactor-iotlb-flush-code.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0001-vtd-Refactor-iotlb-flush-code.patch"

diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 7717ab4..5a5b6be 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -578,16 +578,53 @@ static void iommu_flush_all(void)
     }
 }
 
+static void __intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn,
+        int dma_old_pte_present, unsigned int page_count)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+    struct acpi_drhd_unit *drhd;
+    struct iommu *iommu;
+    int flush_dev_iotlb;
+    int iommu_domid;
+
+    /*
+     * No need pcideves_lock here because we have flush
+     * when assign/deassign device
+     */
+    for_each_drhd_unit ( drhd )
+    {
+        iommu = drhd->iommu;
+
+        if ( !test_bit(iommu->index, &hd->iommu_bitmap) )
+            continue;
+
+        flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
+        iommu_domid= domain_iommu_domid(d, iommu);
+        if ( iommu_domid == -1 )
+            continue;
+
+        if ( page_count > 1 || gfn == -1 )
+        {
+            if ( iommu_flush_iotlb_dsi(iommu, iommu_domid,
+                        0, flush_dev_iotlb) )
+                iommu_flush_write_buffer(iommu);
+        }
+        else
+        {
+            if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
+                        (paddr_t)gfn << PAGE_SHIFT_4K, 0,
+                        !dma_old_pte_present, flush_dev_iotlb) )
+                iommu_flush_write_buffer(iommu);
+        }
+    }
+}
+
 /* clear one page's page table */
 static void dma_pte_clear_one(struct domain *domain, u64 addr)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(domain);
-    struct acpi_drhd_unit *drhd;
-    struct iommu *iommu;
     struct dma_pte *page = NULL, *pte = NULL;
     u64 pg_maddr;
-    int flush_dev_iotlb;
-    int iommu_domid;
     struct mapped_rmrr *mrmrr;
 
     spin_lock(&hd->mapping_lock);
@@ -613,21 +650,7 @@ static void dma_pte_clear_one(struct domain *domain, u64 addr)
     spin_unlock(&hd->mapping_lock);
     iommu_flush_cache_entry(pte, sizeof(struct dma_pte));
 
-    /* No need pcidevs_lock here since do that on assign/deassign device*/
-    for_each_drhd_unit ( drhd )
-    {
-        iommu = drhd->iommu;
-        if ( test_bit(iommu->index, &hd->iommu_bitmap) )
-        {
-            flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
-            iommu_domid= domain_iommu_domid(domain, iommu);
-            if ( iommu_domid == -1 )
-                continue;
-            if ( iommu_flush_iotlb_psi(iommu, iommu_domid, addr,
-                                       0, 0, flush_dev_iotlb) )
-                iommu_flush_write_buffer(iommu);
-        }
-    }
+    __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
 
     unmap_vtd_domain_page(page);
 
@@ -1677,12 +1700,8 @@ static int intel_iommu_map_page(
     unsigned int flags)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(d);
-    struct acpi_drhd_unit *drhd;
-    struct iommu *iommu;
     struct dma_pte *page = NULL, *pte = NULL, old, new = { 0 };
     u64 pg_maddr;
-    int flush_dev_iotlb;
-    int iommu_domid;
 
     /* Do nothing if VT-d shares EPT page table */
     if ( iommu_use_hap_pt(d) )
@@ -1724,26 +1743,7 @@ static int intel_iommu_map_page(
     spin_unlock(&hd->mapping_lock);
     unmap_vtd_domain_page(page);
 
-    /*
-     * No need pcideves_lock here because we have flush
-     * when assign/deassign device
-     */
-    for_each_drhd_unit ( drhd )
-    {
-        iommu = drhd->iommu;
-
-        if ( !test_bit(iommu->index, &hd->iommu_bitmap) )
-            continue;
-
-        flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
-        iommu_domid= domain_iommu_domid(d, iommu);
-        if ( iommu_domid == -1 )
-            continue;
-        if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
-                                   (paddr_t)gfn << PAGE_SHIFT_4K, 0,
-                                   !dma_pte_present(old), flush_dev_iotlb) )
-            iommu_flush_write_buffer(iommu);
-    }
+    __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
 
     return 0;
 }

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 10:30:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 10:30:43 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNTxz-0001dh-9E; Mon, 07 Nov 2011 10:30:43 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNTt8-0000Hl-41
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 10:25:43 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-16.tower-174.messagelabs.com!1320690337!622785!6
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13155 invoked from network); 7 Nov 2011 18:25:38 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 18:25:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,471,1315180800"; 
   d="scan'208";a="8803208"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 18:25:38 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 18:25:38 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNTt3-0004HJ-OE;
	Mon, 07 Nov 2011 18:25:37 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNTsv-0003JV-EZ;
	Mon, 07 Nov 2011 18:25:29 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Mon, 7 Nov 2011 18:25:26 +0000
Message-ID: <1320690327-12649-6-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320690327-12649-5-git-send-email-jean.guyader@eu.citrix.com>
References: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-5-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 5/6] hvmloader: Change memory relocation loop
	when overlap with PCI hole.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Change the way we relocate the memory page if they overlap with pci hole.
Use new map space (XENMAPSPACE_gmfn_range) to move the loop into xen.

This code usually get triggered when a device is pass through to a guest
and the PCI hole has to be extended to have enough room to map the device BARs.
The PCI hole will starts lower and it might overlap with some RAM that has been
alocated for the guest. That usually happen if the guest has more than 4G of RAM.
We have to relocate those pages in high mem otherwise they won't be accessible.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 tools/firmware/hvmloader/pci.c |   20 ++++++++++++++------
 1 files changed, 14 insertions(+), 6 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0005-hvmloader-Change-memory-relocation-loop-when-overlap.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0005-hvmloader-Change-memory-relocation-loop-when-overlap.patch"

diff --git a/tools/firmware/hvmloader/pci.c b/tools/firmware/hvmloader/pci.c
index 29ec011..3bd6ac5 100644
--- a/tools/firmware/hvmloader/pci.c
+++ b/tools/firmware/hvmloader/pci.c
@@ -50,6 +50,7 @@ void pci_setup(void)
         uint32_t devfn, bar_reg, bar_sz;
     } *bars = (struct bars *)scratch_start;
     unsigned int i, nr_bars = 0;
+    unsigned long pci_mem_start_pg;
 
     /* Program PCI-ISA bridge with appropriate link routes. */
     isa_irq = 0;
@@ -185,17 +186,24 @@ void pci_setup(void)
             ((pci_mem_start << 1) != 0) )
         pci_mem_start <<= 1;
 
-    while ( (pci_mem_start >> PAGE_SHIFT) < hvm_info->low_mem_pgend )
+    /* Relocate RAM that overlaps (in 64K chunks) */
+    pci_mem_start_pg = (pci_mem_start >> PAGE_SHIFT);
+    while (pci_mem_start_pg < hvm_info->low_mem_pgend)
     {
         struct xen_add_to_physmap xatp;
-        if ( hvm_info->high_mem_pgend == 0 )
-            hvm_info->high_mem_pgend = 1ull << (32 - PAGE_SHIFT);
+        unsigned int size = hvm_info->low_mem_pgend - pci_mem_start_pg;
         xatp.domid = DOMID_SELF;
-        xatp.space = XENMAPSPACE_gmfn;
-        xatp.idx   = --hvm_info->low_mem_pgend;
-        xatp.gpfn  = hvm_info->high_mem_pgend++;
+        xatp.space = XENMAPSPACE_gmfn_range;
+        xatp.idx = pci_mem_start_pg;
+        xatp.gpfn = hvm_info->high_mem_pgend;
+        size = size > ((1 << 16) - 1) ? ((1 << 16) - 1) : size;
+        xatp.size = size;
+
         if ( hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0 )
             BUG();
+        pci_mem_start_pg += size;
+        hvm_info->high_mem_pgend += size;
+        hvm_info->low_mem_pgend = pci_mem_start_pg;
     }
 
     mem_resource.base = pci_mem_start;

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 10:31:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 10:31:44 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNTyy-00020t-KD; Mon, 07 Nov 2011 10:31:44 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNTt8-0000Hm-Bl
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 10:25:43 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-16.tower-174.messagelabs.com!1320690337!622785!7
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13174 invoked from network); 7 Nov 2011 18:25:38 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 18:25:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,471,1315180800"; 
   d="scan'208";a="8803209"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 18:25:38 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 18:25:38 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNTt3-0004HM-Tg;
	Mon, 07 Nov 2011 18:25:37 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNTsv-0003JY-JV;
	Mon, 07 Nov 2011 18:25:29 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Mon, 7 Nov 2011 18:25:27 +0000
Message-ID: <1320690327-12649-7-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320690327-12649-6-git-send-email-jean.guyader@eu.citrix.com>
References: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-5-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-6-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 6/6] Introduce per cpu flag
	(iommu_dont_flush_iotlb) to avoid unnecessary iotlb flush
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Add cpu flag that will be checked by the iommu low level code
to skip iotlb flushes. iommu_iotlb_flush shall be called explicitly.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c                   |   15 ++++++++++++++-
 xen/drivers/passthrough/iommu.c     |    5 +++++
 xen/drivers/passthrough/vtd/iommu.c |    6 ++++--
 xen/include/xen/iommu.h             |    2 ++
 4 files changed, 25 insertions(+), 3 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0006-Introduce-per-cpu-flag-iommu_dont_flush_iotlb-to-avo.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0006-Introduce-per-cpu-flag-iommu_dont_flush_iotlb-to-avo.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index cca64b8..7aece56 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4698,7 +4698,7 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
     {
     case XENMEM_add_to_physmap:
     {
-        struct xen_add_to_physmap xatp;
+        struct xen_add_to_physmap xatp, start_xatp;
         struct domain *d;
 
         if ( copy_from_guest(&xatp, arg, 1) )
@@ -4716,7 +4716,13 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
 
         if ( xatp.space != XENMAPSPACE_gmfn_range )
             xatp.size = 1;
+        else
+        {
+            if ( need_iommu(d) )
+                this_cpu(iommu_dont_flush_iotlb) = 1;
+        }
 
+        start_xatp = xatp;
         for ( ; xatp.size > 0; xatp.size-- )
         {
             if ( hypercall_preempt_check() )
@@ -4729,6 +4735,13 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
             xatp.gpfn++;
         }
 
+        if ( xatp.space == XENMAPSPACE_gmfn_range && need_iommu(d) )
+        {
+            this_cpu(iommu_dont_flush_iotlb) = 0;
+            iommu_iotlb_flush(d, start_xatp.idx, start_xatp.size - xatp.size);
+            iommu_iotlb_flush(d, start_xatp.gpfn, start_xatp.size - xatp.size);
+        }
+
         rcu_unlock_domain(d);
         if ( rc == -EAGAIN )
         {
diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index ca7b37b..bacca11 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -52,6 +52,8 @@ bool_t __read_mostly iommu_hap_pt_share = 1;
 bool_t __read_mostly iommu_debug;
 bool_t __read_mostly amd_iommu_perdev_intremap;
 
+DEFINE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
+
 static void __init parse_iommu_param(char *s)
 {
     char *ss;
@@ -227,6 +229,7 @@ static int iommu_populate_page_table(struct domain *d)
 
     spin_lock(&d->page_alloc_lock);
 
+    this_cpu(iommu_dont_flush_iotlb) = 1;
     page_list_for_each ( page, &d->page_list )
     {
         if ( is_hvm_domain(d) ||
@@ -244,6 +247,8 @@ static int iommu_populate_page_table(struct domain *d)
             }
         }
     }
+    this_cpu(iommu_dont_flush_iotlb) = 0;
+    iommu_iotlb_flush_all(d);
     spin_unlock(&d->page_alloc_lock);
     return 0;
 }
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 7ec9541..a3dd018 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -660,7 +660,8 @@ static void dma_pte_clear_one(struct domain *domain, u64 addr)
     spin_unlock(&hd->mapping_lock);
     iommu_flush_cache_entry(pte, sizeof(struct dma_pte));
 
-    __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
+    if ( !this_cpu(iommu_dont_flush_iotlb) )
+        __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
 
     unmap_vtd_domain_page(page);
 
@@ -1753,7 +1754,8 @@ static int intel_iommu_map_page(
     spin_unlock(&hd->mapping_lock);
     unmap_vtd_domain_page(page);
 
-    __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
+    if ( !this_cpu(iommu_dont_flush_iotlb) )
+        __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
 
     return 0;
 }
diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
index a1034df..c757a78 100644
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -160,4 +160,6 @@ int iommu_do_domctl(struct xen_domctl *, XEN_GUEST_HANDLE(xen_domctl_t));
 void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count);
 void iommu_iotlb_flush_all(struct domain *d);
 
+DECLARE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
+
 #endif /* _IOMMU_H_ */

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 10:32:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 10:32:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNTzq-0002OF-Bu; Mon, 07 Nov 2011 10:32:38 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNTt8-0000Hk-07
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 10:25:43 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-16.tower-174.messagelabs.com!1320690337!622785!5
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13134 invoked from network); 7 Nov 2011 18:25:38 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 18:25:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,471,1315180800"; 
   d="scan'208";a="8803207"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 18:25:37 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 18:25:37 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNTt3-0004HG-JJ;
	Mon, 07 Nov 2011 18:25:37 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNTsv-0003JS-8o;
	Mon, 07 Nov 2011 18:25:29 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Mon, 7 Nov 2011 18:25:25 +0000
Message-ID: <1320690327-12649-5-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320690327-12649-4-git-send-email-jean.guyader@eu.citrix.com>
References: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-4-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 4/6] mm: New XENMEM,
	XENMEM_add_to_physmap_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


XENMEM_add_to_physmap_gmfn_range is like XENMEM_add_to_physmap on
the gmfn space but the number of pages on which xen will iterate.

Use the 16 bits padding between .domid and .space in struct xen_add_to_physmap
to keep compatibility with older versions.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c           |   22 +++++++++++++++++++++-
 xen/include/public/memory.h |    4 ++++
 2 files changed, 25 insertions(+), 1 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0004-mm-New-XENMEM-XENMEM_add_to_physmap_gmfn_range.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0004-mm-New-XENMEM-XENMEM_add_to_physmap_gmfn_range.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index f75011e..cca64b8 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4714,9 +4714,29 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
             return -EPERM;
         }
 
-        xenmem_add_to_physmap(d, xatp);
+        if ( xatp.space != XENMAPSPACE_gmfn_range )
+            xatp.size = 1;
+
+        for ( ; xatp.size > 0; xatp.size-- )
+        {
+            if ( hypercall_preempt_check() )
+            {
+                rc = -EAGAIN;
+                break;
+            }
+            xenmem_add_to_physmap(d, xatp);
+            xatp.idx++;
+            xatp.gpfn++;
+        }
 
         rcu_unlock_domain(d);
+        if ( rc == -EAGAIN )
+        {
+            if ( copy_to_guest(arg, &xatp, 1) )
+                return -EFAULT;
+            rc = hypercall_create_continuation(
+                    __HYPERVISOR_memory_op, "ih", op, arg);
+        }
 
         return rc;
     }
diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h
index 08355e3..8bc8272 100644
--- a/xen/include/public/memory.h
+++ b/xen/include/public/memory.h
@@ -208,10 +208,14 @@ struct xen_add_to_physmap {
     /* Which domain to change the mapping for. */
     domid_t domid;
 
+    /* Number of pages to go through for gmfn_range */
+    uint16_t    size;
+
     /* Source mapping space. */
 #define XENMAPSPACE_shared_info 0 /* shared info page */
 #define XENMAPSPACE_grant_table 1 /* grant table page */
 #define XENMAPSPACE_gmfn        2 /* GMFN */
+#define XENMAPSPACE_gmfn_range  3 /* GMFN_range */
     unsigned int space;
 
 #define XENMAPIDX_grant_table_status 0x80000000

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 10:33:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 10:33:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNU0c-0002lD-C6; Mon, 07 Nov 2011 10:33:26 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNTt7-0000Hi-Pb
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 10:25:43 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-16.tower-174.messagelabs.com!1320690337!622785!3
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13092 invoked from network); 7 Nov 2011 18:25:38 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 18:25:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,471,1315180800"; 
   d="scan'208";a="8803205"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 18:25:37 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 18:25:37 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNTt3-0004HD-DZ;
	Mon, 07 Nov 2011 18:25:37 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNTsv-0003JP-3t;
	Mon, 07 Nov 2011 18:25:29 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Mon, 7 Nov 2011 18:25:24 +0000
Message-ID: <1320690327-12649-4-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320690327-12649-3-git-send-email-jean.guyader@eu.citrix.com>
References: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-3-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 3/6] add_to_physmap: Move the code for
	XENMEM_add_to_physmap.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Move the code for the XENMEM_add_to_physmap case into it's own
function (xenmem_add_to_physmap).

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c |  188 ++++++++++++++++++++++++++++-------------------------
 1 files changed, 99 insertions(+), 89 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0003-add_to_physmap-Move-the-code-for-XENMEM_add_to_physm.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0003-add_to_physmap-Move-the-code-for-XENMEM_add_to_physm.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index acc1f34..f75011e 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4592,119 +4592,129 @@ static int handle_iomem_range(unsigned long s, unsigned long e, void *p)
     return 0;
 }
 
-long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
+static int xenmem_add_to_physmap(struct domain *d, struct xen_add_to_physmap xatp)
 {
     struct page_info *page = NULL;
+    unsigned long prev_mfn, mfn = 0, gpfn;
     int rc;
 
-    switch ( op )
-    {
-    case XENMEM_add_to_physmap:
+    switch ( xatp.space )
     {
-        struct xen_add_to_physmap xatp;
-        unsigned long prev_mfn, mfn = 0, gpfn;
-        struct domain *d;
-
-        if ( copy_from_guest(&xatp, arg, 1) )
-            return -EFAULT;
+    case XENMAPSPACE_shared_info:
+        if ( xatp.idx == 0 )
+            mfn = virt_to_mfn(d->shared_info);
+        break;
+    case XENMAPSPACE_grant_table:
+        spin_lock(&d->grant_table->lock);
 
-        rc = rcu_lock_target_domain_by_id(xatp.domid, &d);
-        if ( rc != 0 )
-            return rc;
+        if ( d->grant_table->gt_version == 0 )
+            d->grant_table->gt_version = 1;
 
-        if ( xsm_add_to_physmap(current->domain, d) )
+        if ( d->grant_table->gt_version == 2 &&
+             (xatp.idx & XENMAPIDX_grant_table_status) )
         {
-            rcu_unlock_domain(d);
-            return -EPERM;
+            xatp.idx &= ~XENMAPIDX_grant_table_status;
+            if ( xatp.idx < nr_status_frames(d->grant_table) )
+                mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
+        }
+        else
+        {
+            if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
+                 (xatp.idx < max_nr_grant_frames) )
+                gnttab_grow_table(d, xatp.idx + 1);
+
+            if ( xatp.idx < nr_grant_frames(d->grant_table) )
+                mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
         }
 
-        switch ( xatp.space )
+        spin_unlock(&d->grant_table->lock);
+        break;
+    case XENMAPSPACE_gmfn:
+    {
+        p2m_type_t p2mt;
+
+        xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
+        /* If the page is still shared, exit early */
+        if ( p2m_is_shared(p2mt) )
         {
-        case XENMAPSPACE_shared_info:
-            if ( xatp.idx == 0 )
-                mfn = virt_to_mfn(d->shared_info);
+            rcu_unlock_domain(d);
+            return -ENOMEM;
+        }
+        if ( !get_page_from_pagenr(xatp.idx, d) )
             break;
-        case XENMAPSPACE_grant_table:
-            spin_lock(&d->grant_table->lock);
+        mfn = xatp.idx;
+        page = mfn_to_page(mfn);
+        break;
+    }
+    default:
+        break;
+    }
 
-            if ( d->grant_table->gt_version == 0 )
-                d->grant_table->gt_version = 1;
+    if ( !paging_mode_translate(d) || (mfn == 0) )
+    {
+        if ( page )
+            put_page(page);
+        rcu_unlock_domain(d);
+        return -EINVAL;
+    }
 
-            if ( d->grant_table->gt_version == 2 &&
-                 (xatp.idx & XENMAPIDX_grant_table_status) )
-            {
-                xatp.idx &= ~XENMAPIDX_grant_table_status;
-                if ( xatp.idx < nr_status_frames(d->grant_table) )
-                    mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
-            }
-            else
-            {
-                if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
-                     (xatp.idx < max_nr_grant_frames) )
-                    gnttab_grow_table(d, xatp.idx + 1);
+    domain_lock(d);
 
-                if ( xatp.idx < nr_grant_frames(d->grant_table) )
-                    mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
-            }
+    if ( page )
+        put_page(page);
 
-            spin_unlock(&d->grant_table->lock);
-            break;
-        case XENMAPSPACE_gmfn:
-        {
-            p2m_type_t p2mt;
+    /* Remove previously mapped page if it was present. */
+    prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
+    if ( mfn_valid(prev_mfn) )
+    {
+        if ( is_xen_heap_mfn(prev_mfn) )
+            /* Xen heap frames are simply unhooked from this phys slot. */
+            guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
+        else
+            /* Normal domain memory is freed, to avoid leaking memory. */
+            guest_remove_page(d, xatp.gpfn);
+    }
 
-            xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
-            /* If the page is still shared, exit early */
-            if ( p2m_is_shared(p2mt) )
-            {
-                rcu_unlock_domain(d);
-                return -ENOMEM;
-            }
-            if ( !get_page_from_pagenr(xatp.idx, d) )
-                break;
-            mfn = xatp.idx;
-            page = mfn_to_page(mfn);
-            break;
-        }
-        default:
-            break;
-        }
+    /* Unmap from old location, if any. */
+    gpfn = get_gpfn_from_mfn(mfn);
+    ASSERT( gpfn != SHARED_M2P_ENTRY );
+    if ( gpfn != INVALID_M2P_ENTRY )
+        guest_physmap_remove_page(d, gpfn, mfn, 0);
 
-        if ( !paging_mode_translate(d) || (mfn == 0) )
-        {
-            if ( page )
-                put_page(page);
-            rcu_unlock_domain(d);
-            return -EINVAL;
-        }
+    /* Map at new location. */
+    rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
 
-        domain_lock(d);
+    domain_unlock(d);
 
-        if ( page )
-            put_page(page);
+    return rc;
+}
 
-        /* Remove previously mapped page if it was present. */
-        prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
-        if ( mfn_valid(prev_mfn) )
-        {
-            if ( is_xen_heap_mfn(prev_mfn) )
-                /* Xen heap frames are simply unhooked from this phys slot. */
-                guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
-            else
-                /* Normal domain memory is freed, to avoid leaking memory. */
-                guest_remove_page(d, xatp.gpfn);
-        }
 
-        /* Unmap from old location, if any. */
-        gpfn = get_gpfn_from_mfn(mfn);
-        ASSERT( gpfn != SHARED_M2P_ENTRY );
-        if ( gpfn != INVALID_M2P_ENTRY )
-            guest_physmap_remove_page(d, gpfn, mfn, 0);
+long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
+{
+    int rc;
+
+    switch ( op )
+    {
+    case XENMEM_add_to_physmap:
+    {
+        struct xen_add_to_physmap xatp;
+        struct domain *d;
 
-        /* Map at new location. */
-        rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
+        if ( copy_from_guest(&xatp, arg, 1) )
+            return -EFAULT;
+
+        rc = rcu_lock_target_domain_by_id(xatp.domid, &d);
+        if ( rc != 0 )
+            return rc;
+
+        if ( xsm_add_to_physmap(current->domain, d) )
+        {
+            rcu_unlock_domain(d);
+            return -EPERM;
+        }
 
-        domain_unlock(d);
+        xenmem_add_to_physmap(d, xatp);
 
         rcu_unlock_domain(d);
 

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-api-bounces@lists.xensource.com Mon Nov 07 10:43:11 2011
Return-path: <xen-api-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 10:43:11 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNUA3-0003Fd-0l; Mon, 07 Nov 2011 10:43:11 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNU9t-0003Ca-KO; Mon, 07 Nov 2011 10:43:01 -0800
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1320691377!1684967!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29558 invoked from network); 7 Nov 2011 18:42:57 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-13.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 18:42:57 -0000
Received: by wyh11 with SMTP id 11so6347789wyh.30
	for <multiple recipients>; Mon, 07 Nov 2011 10:42:57 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:message-id:date:from:user-agent:mime-version:to:subject
	:content-type:content-transfer-encoding;
	bh=Y3nKtit0WrEPWov8mUEGoMUEVl1+amW0+1JzS3xG+HI=;
	b=azLkBqmFVsYfBnS2kwIem4d2XcrSJxjA5TO+wRU51JFzkL8zG9qxz/bY2KpLVQWSGN
	ziaHFI/C3cPDtB01hISS4aPgMHIGxaiGM2lkqrjhapY70Uw2+Nk2BMZpU44RUiRJ6r1I
	Ixh/X5nwpNgwBSb2ini4fZVjn2JKpw33W69bE=
Received: by 10.216.80.18 with SMTP id j18mr8337770wee.18.1320691377446;
	Mon, 07 Nov 2011 10:42:57 -0800 (PST)
Received: from [172.16.25.10] (5e0575b0.bb.sky.com. [94.5.117.176])
	by mx.google.com with ESMTPS id q30sm28694820wbn.17.2011.11.07.10.42.53
	(version=SSLv3 cipher=OTHER); Mon, 07 Nov 2011 10:42:55 -0800 (PST)
Message-ID: <4EB826A2.80402@xen.org>
Date: Mon, 07 Nov 2011 18:42:42 +0000
From: Lars Kurth <lars.kurth@xen.org>
User-Agent: Mozilla/5.0 (Windows NT 6.1;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, 
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	"xen-api@lists.xensource.com" <xen-api@lists.xensource.com>, 
	xen-arm@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: 
Subject: [Xen-API] Xen.org services migrating to Rackspace Hosting : some
	downtime expected
X-BeenThere: xen-api@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Discussion of API issues surrounding Xen <xen-api.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>,
	<mailto:xen-api-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-api@lists.xensource.com>
List-Help: <mailto:xen-api-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>,
	<mailto:xen-api-request@lists.xensource.com?subject=subscribe>
Sender: xen-api-bounces@lists.xensource.com
Errors-To: xen-api-bounces@lists.xensource.com

Hi everybody,

Rackspace Hosting has offered the Xen.org community to host xen.org 
services and we have started migration last week. The expectation is 
that all services will be migrated by Nov the 21st. There will be a 
number of services where there may be short downtimes. These will be 
announced in due course.

Xen.org has already been migrated.

We have a new MediaWiki (in testing) and we will be retiring the old 
MoinMoin Wiki. For now, you can check out the new Wiki on 
http://new-wiki.xen.org. Note that only a few pages have been migrated 
so far and I played with the categories.

The expectation is that
- Pages marked as "Keep" in http://tinyurl.com/78fry5y will be migrated 
first
- The old Wiki will become read-only and we also will publish converted 
markup for the old Wiki. Test snapshots of these can be found at 
http://new-wiki.xen.org/old-wiki/ & 
http://new-wiki.xen.org/old-wiki-converted/ - most pages appear to 
translate fairly nicely, except those with images and macros
- Some pages, such as 
http://wiki.xen.org/xenwiki/VirtualPrivateServerProviders may be 
migrated to the static xen.org site (TBD)

We intentionally do not want to wholesale migrate all content as so much 
is out-of-date. The move to the new Wiki
The detailed timing (i.e. exactly when we will switch off the old 
instance off is still to be determined). But it will have to be before 
Nov 21st. Note that you can already sign up as users: we will not 
migrate MoinMoin users.

We will leave the look and feel as a basic Media Wiki for now, but will 
make improvements and install additional plug-ins, etc. in due course.

I will let you know more on the timing on the other services on Wednesday

Regards
Lars


_______________________________________________
xen-api mailing list
xen-api@lists.xensource.com
http://lists.xensource.com/mailman/listinfo/xen-api

From xen-devel-bounces@lists.xensource.com Mon Nov 07 11:26:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 11:26:43 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNUqA-0005FM-Ru; Mon, 07 Nov 2011 11:26:42 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNUox-00052k-GC
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 11:25:28 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1320693900!51297131!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9315 invoked from network); 7 Nov 2011 19:25:00 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 19:25:00 -0000
X-IronPort-AV: E=Sophos;i="4.69,471,1315180800"; 
   d="scan'208";a="8803770"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 19:25:23 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 19:25:23 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNUot-0004bu-CN;
	Mon, 07 Nov 2011 19:25:23 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNUok-0000FR-Uu;
	Mon, 07 Nov 2011 19:25:15 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Mon, 7 Nov 2011 19:25:09 +0000
Message-ID: <1320693909-914-1-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH] mm: Cleanup,
	use PAGE_ORDER_4K as page_order instead of "0".
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c     |   10 +++++-----
 xen/arch/x86/mm/p2m.c |   24 ++++++++++++------------
 xen/common/memory.c   |    8 ++++----
 3 files changed, 21 insertions(+), 21 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0001-mm-Cleanup-use-PAGE_ORDER_4K-as-page_order-instead-o.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0001-mm-Cleanup-use-PAGE_ORDER_4K-as-page_order-instead-o.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index acc1f34..03703be 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4005,7 +4005,7 @@ static int create_grant_p2m_mapping(uint64_t addr, unsigned long frame,
     else
         p2mt = p2m_grant_map_rw;
     rc = guest_physmap_add_entry(current->domain,
-                                 addr >> PAGE_SHIFT, frame, 0, p2mt);
+                                 addr >> PAGE_SHIFT, frame, PAGE_ORDER_4K, p2mt);
     if ( rc )
         return GNTST_general_error;
     else
@@ -4062,7 +4062,7 @@ static int replace_grant_p2m_mapping(
                  type, mfn_x(old_mfn), frame);
         return GNTST_general_error;
     }
-    guest_physmap_remove_page(d, gfn, frame, 0);
+    guest_physmap_remove_page(d, gfn, frame, PAGE_ORDER_4K);
 
     return GNTST_okay;
 }
@@ -4689,7 +4689,7 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
         {
             if ( is_xen_heap_mfn(prev_mfn) )
                 /* Xen heap frames are simply unhooked from this phys slot. */
-                guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
+                guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, PAGE_ORDER_4K);
             else
                 /* Normal domain memory is freed, to avoid leaking memory. */
                 guest_remove_page(d, xatp.gpfn);
@@ -4699,10 +4699,10 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
         gpfn = get_gpfn_from_mfn(mfn);
         ASSERT( gpfn != SHARED_M2P_ENTRY );
         if ( gpfn != INVALID_M2P_ENTRY )
-            guest_physmap_remove_page(d, gpfn, mfn, 0);
+            guest_physmap_remove_page(d, gpfn, mfn, PAGE_ORDER_4K);
 
         /* Map at new location. */
-        rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
+        rc = guest_physmap_add_page(d, xatp.gpfn, mfn, PAGE_ORDER_4K);
 
         domain_unlock(d);
 
diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
index 7053736..7d1a8a9 100644
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -254,7 +254,7 @@ int p2m_alloc_table(struct p2m_domain *p2m)
 
     /* Initialise physmap tables for slot zero. Other code assumes this. */
     p2m->defer_nested_flush = 1;
-    if ( !set_p2m_entry(p2m, 0, _mfn(INVALID_MFN), 0,
+    if ( !set_p2m_entry(p2m, 0, _mfn(INVALID_MFN), PAGE_ORDER_4K,
                         p2m_invalid, p2m->default_access) )
         goto error;
 
@@ -276,7 +276,7 @@ int p2m_alloc_table(struct p2m_domain *p2m)
                 (gfn != 0x55555555L)
 #endif
                 && gfn != INVALID_M2P_ENTRY
-                && !set_p2m_entry(p2m, gfn, mfn, 0, p2m_ram_rw, p2m->default_access) )
+                && !set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_rw, p2m->default_access) )
                 goto error_unlock;
         }
         spin_unlock(&p2m->domain->page_alloc_lock);
@@ -549,7 +549,7 @@ p2m_type_t p2m_change_type(struct domain *d, unsigned long gfn,
 
     mfn = gfn_to_mfn_query(d, gfn, &pt);
     if ( pt == ot )
-        set_p2m_entry(p2m, gfn, mfn, 0, nt, p2m->default_access);
+        set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, nt, p2m->default_access);
 
     p2m_unlock(p2m);
 
@@ -576,7 +576,7 @@ void p2m_change_type_range(struct domain *d,
     {
         mfn = gfn_to_mfn_query(d, gfn, &pt);
         if ( pt == ot )
-            set_p2m_entry(p2m, gfn, mfn, 0, nt, p2m->default_access);
+            set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, nt, p2m->default_access);
     }
 
     p2m->defer_nested_flush = 0;
@@ -613,7 +613,7 @@ set_mmio_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn)
     }
 
     P2M_DEBUG("set mmio %lx %lx\n", gfn, mfn_x(mfn));
-    rc = set_p2m_entry(p2m, gfn, mfn, 0, p2m_mmio_direct, p2m->default_access);
+    rc = set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_mmio_direct, p2m->default_access);
     audit_p2m(p2m, 1);
     p2m_unlock(p2m);
     if ( 0 == rc )
@@ -644,7 +644,7 @@ clear_mmio_p2m_entry(struct domain *d, unsigned long gfn)
             "clear_mmio_p2m_entry: gfn_to_mfn failed! gfn=%08lx\n", gfn);
         goto out;
     }
-    rc = set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), 0, p2m_invalid, p2m->default_access);
+    rc = set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), PAGE_ORDER_4K, p2m_invalid, p2m->default_access);
     audit_p2m(p2m, 1);
 
 out:
@@ -674,7 +674,7 @@ set_shared_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn)
     set_gpfn_from_mfn(mfn_x(omfn), INVALID_M2P_ENTRY);
 
     P2M_DEBUG("set shared %lx %lx\n", gfn, mfn_x(mfn));
-    rc = set_p2m_entry(p2m, gfn, mfn, 0, p2m_ram_shared, p2m->default_access);
+    rc = set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_shared, p2m->default_access);
     p2m_unlock(p2m);
     if ( 0 == rc )
         gdprintk(XENLOG_ERR,
@@ -739,7 +739,7 @@ int p2m_mem_paging_nominate(struct domain *d, unsigned long gfn)
         goto out;
 
     /* Fix p2m entry */
-    set_p2m_entry(p2m, gfn, mfn, 0, p2m_ram_paging_out, a);
+    set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_paging_out, a);
     audit_p2m(p2m, 1);
     ret = 0;
 
@@ -806,7 +806,7 @@ int p2m_mem_paging_evict(struct domain *d, unsigned long gfn)
         put_page(page);
 
     /* Remove mapping from p2m table */
-    set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), 0, p2m_ram_paged, a);
+    set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), PAGE_ORDER_4K, p2m_ram_paged, a);
     audit_p2m(p2m, 1);
 
     /* Clear content before returning the page to Xen */
@@ -900,7 +900,7 @@ void p2m_mem_paging_populate(struct domain *d, unsigned long gfn)
         if ( p2mt == p2m_ram_paging_out )
             req.flags |= MEM_EVENT_FLAG_EVICT_FAIL;
 
-        set_p2m_entry(p2m, gfn, mfn, 0, p2m_ram_paging_in_start, a);
+        set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_paging_in_start, a);
         audit_p2m(p2m, 1);
     }
     p2m_unlock(p2m);
@@ -968,7 +968,7 @@ int p2m_mem_paging_prep(struct domain *d, unsigned long gfn)
     }
 
     /* Fix p2m mapping */
-    set_p2m_entry(p2m, gfn, mfn, 0, p2m_ram_paging_in, a);
+    set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_paging_in, a);
     audit_p2m(p2m, 1);
 
     atomic_dec(&d->paged_pages);
@@ -1016,7 +1016,7 @@ void p2m_mem_paging_resume(struct domain *d)
         if ( mfn_valid(mfn) && 
              (p2mt == p2m_ram_paging_in || p2mt == p2m_ram_paging_in_start) )
         {
-            set_p2m_entry(p2m, rsp.gfn, mfn, 0, p2m_ram_rw, a);
+            set_p2m_entry(p2m, rsp.gfn, mfn, PAGE_ORDER_4K, p2m_ram_rw, a);
             set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
             audit_p2m(p2m, 1);
         }
diff --git a/xen/common/memory.c b/xen/common/memory.c
index b3dfa07..83c5a1f 100644
--- a/xen/common/memory.c
+++ b/xen/common/memory.c
@@ -165,7 +165,7 @@ int guest_remove_page(struct domain *d, unsigned long gmfn)
     mfn = mfn_x(gfn_to_mfn(d, gmfn, &p2mt)); 
     if ( unlikely(p2m_is_paging(p2mt)) )
     {
-        guest_physmap_remove_page(d, gmfn, mfn, 0);
+        guest_physmap_remove_page(d, gmfn, mfn, PAGE_ORDER_4K);
         p2m_mem_paging_drop_page(d, gmfn);
         return 1;
     }
@@ -186,7 +186,7 @@ int guest_remove_page(struct domain *d, unsigned long gmfn)
     if(p2m_is_shared(p2mt))
     {
         put_page_and_type(page);
-        guest_physmap_remove_page(d, gmfn, mfn, 0);
+        guest_physmap_remove_page(d, gmfn, mfn, PAGE_ORDER_4K);
         return 1;
     }
 
@@ -203,7 +203,7 @@ int guest_remove_page(struct domain *d, unsigned long gmfn)
     if ( test_and_clear_bit(_PGC_allocated, &page->count_info) )
         put_page(page);
 
-    guest_physmap_remove_page(d, gmfn, mfn, 0);
+    guest_physmap_remove_page(d, gmfn, mfn, PAGE_ORDER_4K);
 
     put_page(page);
 
@@ -418,7 +418,7 @@ static long memory_exchange(XEN_GUEST_HANDLE(xen_memory_exchange_t) arg)
             gfn = mfn_to_gmfn(d, mfn);
             /* Pages were unshared above */
             BUG_ON(SHARED_M2P(gfn));
-            guest_physmap_remove_page(d, gfn, mfn, 0);
+            guest_physmap_remove_page(d, gfn, mfn, PAGE_ORDER_4K);
             put_page(page);
         }
 

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 11:54:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 11:54:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNVHP-0006Df-5y; Mon, 07 Nov 2011 11:54:51 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNVGj-00061k-Jc
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 11:54:09 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1320695646!2229310!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10783 invoked from network); 7 Nov 2011 19:54:06 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 19:54:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,471,1315180800"; 
   d="scan'208";a="8803986"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 19:54:06 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 19:54:06 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNVGf-0004lS-Qh;
	Mon, 07 Nov 2011 19:54:05 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNVGX-00016R-GO;
	Mon, 07 Nov 2011 19:53:57 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Mon, 7 Nov 2011 19:53:55 +0000
Message-ID: <1320695635-4208-1-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: jwcart2@tycho.nsa.gov, Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH] xsm: Add support for HVMOP_track_dirty_vram.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Xen try to inforce the xsm policy when a HVMOP_track_dirty_vram
is received (xen/arch/x86/hvm/hvm.c:3637). It was failing because
in flask_hvmcontext, xsm didn't have any case for this operation.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 tools/flask/policy/policy/flask/access_vectors |    1 +
 tools/flask/policy/policy/modules/xen/xen.if   |    2 +-
 xen/xsm/flask/hooks.c                          |    3 +++
 xen/xsm/flask/include/av_perm_to_string.h      |    1 +
 xen/xsm/flask/include/av_permissions.h         |    1 +
 5 files changed, 7 insertions(+), 1 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0001-xsm-Add-support-for-HVMOP_track_dirty_vram.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0001-xsm-Add-support-for-HVMOP_track_dirty_vram.patch"

diff --git a/tools/flask/policy/policy/flask/access_vectors b/tools/flask/policy/policy/flask/access_vectors
index 27fb9d7..9d09c5b 100644
--- a/tools/flask/policy/policy/flask/access_vectors
+++ b/tools/flask/policy/policy/flask/access_vectors
@@ -90,6 +90,7 @@ class hvm
     pciroute
 	bind_irq
 	cacheattr
+    trackdirtyvram
 }
 
 class event
diff --git a/tools/flask/policy/policy/modules/xen/xen.if b/tools/flask/policy/policy/modules/xen/xen.if
index 99afad6..bf3b794 100644
--- a/tools/flask/policy/policy/modules/xen/xen.if
+++ b/tools/flask/policy/policy/modules/xen/xen.if
@@ -22,7 +22,7 @@ define(`create_domain', `
 ################################################################################
 define(`create_hvm_dom', `
 	create_domain($1, $2, $3)
-	allow $1 $2:hvm { setparam getparam cacheattr pciroute irqlevel	pcilevel };
+	allow $1 $2:hvm { setparam getparam cacheattr pciroute irqlevel	pcilevel trackdirtyvram };
 	allow $2 $2:hvm setparam;
 ')	
 
diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c
index 30c91e5..e70feda 100644
--- a/xen/xsm/flask/hooks.c
+++ b/xen/xsm/flask/hooks.c
@@ -816,6 +816,9 @@ static int flask_hvmcontext(struct domain *d, uint32_t cmd)
     case XEN_DOMCTL_gethvmcontext_partial:
         perm = HVM__GETHVMC;
         break;
+    case HVMOP_track_dirty_vram:
+        perm = HVM__TRACKDIRTYVRAM;
+        break;
     default:
         return -EPERM;
     }
diff --git a/xen/xsm/flask/include/av_perm_to_string.h b/xen/xsm/flask/include/av_perm_to_string.h
index b10a252..c32488e 100644
--- a/xen/xsm/flask/include/av_perm_to_string.h
+++ b/xen/xsm/flask/include/av_perm_to_string.h
@@ -56,6 +56,7 @@
    S_(SECCLASS_HVM, HVM__GETHVMC, "gethvmc")
    S_(SECCLASS_HVM, HVM__SETPARAM, "setparam")
    S_(SECCLASS_HVM, HVM__GETPARAM, "getparam")
+   S_(SECCLASS_HVM, HVM__TRACKDIRTYVRAM, "trackdirtyvram")
    S_(SECCLASS_HVM, HVM__PCILEVEL, "pcilevel")
    S_(SECCLASS_HVM, HVM__IRQLEVEL, "irqlevel")
    S_(SECCLASS_HVM, HVM__PCIROUTE, "pciroute")
diff --git a/xen/xsm/flask/include/av_permissions.h b/xen/xsm/flask/include/av_permissions.h
index 14bd053..f5dcc6f 100644
--- a/xen/xsm/flask/include/av_permissions.h
+++ b/xen/xsm/flask/include/av_permissions.h
@@ -63,6 +63,7 @@
 #define HVM__PCIROUTE                             0x00000040UL
 #define HVM__BIND_IRQ                             0x00000080UL
 #define HVM__CACHEATTR                            0x00000100UL
+#define HVM__TRACKDIRTYVRAM                       0x00000200UL
 
 #define EVENT__BIND                               0x00000001UL
 #define EVENT__SEND                               0x00000002UL

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 12:26:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 12:26:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNVlu-0007Pf-9H; Mon, 07 Nov 2011 12:26:22 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNVkr-0007Cq-KG
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 12:25:18 -0800
X-Env-Sender: gregkh@suse.de
X-Msg-Ref: server-11.tower-182.messagelabs.com!1320697514!2227353!1
X-Originating-IP: [195.135.220.15]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13225 invoked from network); 7 Nov 2011 20:25:14 -0000
Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15)
	by server-11.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Nov 2011 20:25:14 -0000
Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	by mx2.suse.de (Postfix) with ESMTP id 5BF628A95F;
	Mon,  7 Nov 2011 21:25:11 +0100 (CET)
Date: Mon, 7 Nov 2011 12:24:51 -0800
From: Greg KH <gregkh@suse.de>
To: Stephen Rothwell <sfr@canb.auug.org.au>
Message-ID: <20111107202451.GA14482@suse.de>
References: <20111027053007.GA32765@phenom.dumpdata.com>
	<20111027054806.GA1377@suse.de>
	<20111102121309.4dbb0d2ac90d2879130820dd@canb.auug.org.au>
	<20111103013012.GB3449@suse.de>
	<20111107171942.fe21429583491475f245aa08@canb.auug.org.au>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111107171942.fe21429583491475f245aa08@canb.auug.org.au>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: Rusty Russell <rusty@rustcorp.com.au>, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	ppc-dev <linuxppc-dev@lists.ozlabs.org>, miche@google.com,
	linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org,
	Anton Blanchard <anton@samba.org>, Amit Shah <amit.shah@redhat.com>,
	Linus <torvalds@linux-foundation.org>
Subject: [Xen-devel] Re: Regression: patch " hvc_console: display printk
 messages on console." causing infinite loop with 3.2-rc0 + Xen.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 07, 2011 at 05:19:42PM +1100, Stephen Rothwell wrote:
> Hi Greg,
> 
> On Wed, 2 Nov 2011 18:30:12 -0700 Greg KH <gregkh@suse.de> wrote:
> >
> > On Wed, Nov 02, 2011 at 12:13:09PM +1100, Stephen Rothwell wrote:
> > > 
> > > On Thu, 27 Oct 2011 07:48:06 +0200 Greg KH <gregkh@suse.de> wrote:
> > > >
> > > > On Thu, Oct 27, 2011 at 01:30:08AM -0400, Konrad Rzeszutek Wilk wrote:
> > > > > Hey Miche.
> > > > > 
> > > > > The git commit 361162459f62dc0826b82c9690a741a940f457f0:
> > > > > 
> > > > >     hvc_console: display printk messages on console.
> > > > > 
> > > > > is causing an infinite loop when booting Linux under Xen, as so:
> > > > 
> > > > Ick, not good, thanks for letting us know.
> > > 
> > > Indeed. I am wondering why it was put in a tree and sent to Linus without
> > > any Acks or even being replied to by anyone.  It appeared in the tty tree
> > > between Oct 14 and Oct 25 (while I was unfortunately on vacation).  If
> > > anyone had tried to boot this on any PowerPC server, it would have been
> > > immediately obvious (as it was when I booted Linus' tree last night).
> > > 
> > > And the original author expressed doubts as to his understanding of how
> > > it should all work anyway.
> > > 
> > > Just a little more care, please.
> > > 
> > > I would vote for reverting the original and having it resubmitted with
> > > corrections at some later date.
> > 
> > You are right, I will go do that, sorry for the problems.
> 
> Ping ...
> 
> Linus can you please just revert 361162459f62dc0826b82c9690a741a940f457f0
> "hvc_console: display printk messages on console" as it breaks consoles
> for all PowerPC server machines.

Thanks for doing this, I was going to include it in my next pull request
after 3.2-rc1 was out, but you are right, it should have gone in sooner.

greg k-h

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 12:37:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 12:37:46 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNVww-0007yj-PK; Mon, 07 Nov 2011 12:37:46 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNVwA-0007mD-Jt
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 12:36:59 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320698213!3255209!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20054 invoked from network); 7 Nov 2011 20:36:54 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-14.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Nov 2011 20:36:54 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA7KaR7l017441
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 7 Nov 2011 20:36:28 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA7KaMxH011754
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 7 Nov 2011 20:36:22 GMT
Received: from abhmt112.oracle.com (abhmt112.oracle.com [141.146.116.64])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA7KaFIP018162; Mon, 7 Nov 2011 14:36:15 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 07 Nov 2011 12:36:15 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id B529681204; Mon,  7 Nov 2011 15:36:13 -0500 (EST)
Date: Mon, 7 Nov 2011 15:36:13 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [Xen-devel] Re: [Revert] Re: [PATCH] mm: sync vmalloc address
	space page tables in alloc_vm_area()
Message-ID: <20111107203613.GA6546@phenom.dumpdata.com>
References: <1314877863-21977-1-git-send-email-david.vrabel@citrix.com>
	<20110901161134.GA8979@dumpdata.com> <4E5FED1A.1000300@goop.org>
	<20110901141754.76cef93b.akpm@linux-foundation.org>
	<4E60C067.4010600@citrix.com>
	<20110902153204.59a928c1.akpm@linux-foundation.org>
	<20110906163553.GA28971@dumpdata.com>
	<20111105133846.GA4415@phenom.dumpdata.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="45Z9DzgjV8m4Oswq"
Content-Disposition: inline
In-Reply-To: <20111105133846.GA4415@phenom.dumpdata.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090208.4EB8414C.00A8,ss=1,re=-2.300,fgs=0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"namhyung@gmail.com" <namhyung@gmail.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>,
	David Vrabel <david.vrabel@citrix.com>,
	"rientjes@google.com" <rientjes@google.com>,
	"paulmck@linux.vnet.ibm.com" <paulmck@linux.vnet.ibm.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--45Z9DzgjV8m4Oswq
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

> > > 
> > > oookay, I queued this for 3.1 and tagged it for a 3.0.x backport.  I
> > > *think* that's the outcome of this discussion, for the short-term?
> > 
> > <nods> Yup. Thanks!
> 
> Hey Andrew,
> 
> The long term outcome is the patchset that David worked on. I've sent
> a GIT PULL to Linus to pick up the Xen related patches that switch over
> the users of the right API:
> 
>  (xen) stable/vmalloc-3.2 for Linux 3.2-rc0
> 
> (https://lkml.org/lkml/2011/10/29/82)

And Linus picked it up.
.. snip..
> 
> Also, not sure what you thought of this patch below?

Patch included as attachment for easier review..
> 
> From b9acd3abc12972be0d938d7bc2466d899023e757 Mon Sep 17 00:00:00 2001
> From: David Vrabel <david.vrabel@citrix.com>
> Date: Thu, 29 Sep 2011 16:53:32 +0100
> Subject: [PATCH] xen: map foreign pages for shared rings by updating the PTEs
>  directly
> 
> When mapping a foreign page with xenbus_map_ring_valloc() with the
> GNTTABOP_map_grant_ref hypercall, set the GNTMAP_contains_pte flag and
> pass a pointer to the PTE (in init_mm).
> 
> After the page is mapped, the usual fault mechanism can be used to
> update additional MMs.  This allows the vmalloc_sync_all() to be
> removed from alloc_vm_area().
> 
> Signed-off-by: David Vrabel <david.vrabel@citrix.com>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Jeremy Fitzhardinge <jeremy@goop.org>
> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> ---
>  arch/x86/xen/grant-table.c         |    2 +-
>  drivers/xen/xenbus/xenbus_client.c |   11 ++++++++---
>  include/linux/vmalloc.h            |    2 +-
>  mm/vmalloc.c                       |   27 +++++++++++++--------------
>  4 files changed, 23 insertions(+), 19 deletions(-)
> 
> diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c
> index 6bbfd7a..5a40d24 100644
> --- a/arch/x86/xen/grant-table.c
> +++ b/arch/x86/xen/grant-table.c
> @@ -71,7 +71,7 @@ int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
>  
>  	if (shared == NULL) {
>  		struct vm_struct *area =
> -			alloc_vm_area(PAGE_SIZE * max_nr_gframes);
> +			alloc_vm_area(PAGE_SIZE * max_nr_gframes, NULL);
>  		BUG_ON(area == NULL);
>  		shared = area->addr;
>  		*__shared = shared;
> diff --git a/drivers/xen/xenbus/xenbus_client.c b/drivers/xen/xenbus/xenbus_client.c
> index 229d3ad..52bc57f 100644
> --- a/drivers/xen/xenbus/xenbus_client.c
> +++ b/drivers/xen/xenbus/xenbus_client.c
> @@ -34,6 +34,7 @@
>  #include <linux/types.h>
>  #include <linux/vmalloc.h>
>  #include <asm/xen/hypervisor.h>
> +#include <asm/xen/page.h>
>  #include <xen/interface/xen.h>
>  #include <xen/interface/event_channel.h>
>  #include <xen/events.h>
> @@ -435,19 +436,20 @@ EXPORT_SYMBOL_GPL(xenbus_free_evtchn);
>  int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
>  {
>  	struct gnttab_map_grant_ref op = {
> -		.flags = GNTMAP_host_map,
> +		.flags = GNTMAP_host_map | GNTMAP_contains_pte,
>  		.ref   = gnt_ref,
>  		.dom   = dev->otherend_id,
>  	};
>  	struct vm_struct *area;
> +	pte_t *pte;
>  
>  	*vaddr = NULL;
>  
> -	area = alloc_vm_area(PAGE_SIZE);
> +	area = alloc_vm_area(PAGE_SIZE, &pte);
>  	if (!area)
>  		return -ENOMEM;
>  
> -	op.host_addr = (unsigned long)area->addr;
> +	op.host_addr = arbitrary_virt_to_machine(pte).maddr;
>  
>  	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
>  		BUG();
> @@ -526,6 +528,7 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
>  	struct gnttab_unmap_grant_ref op = {
>  		.host_addr = (unsigned long)vaddr,
>  	};
> +	unsigned int level;
>  
>  	/* It'd be nice if linux/vmalloc.h provided a find_vm_area(void *addr)
>  	 * method so that we don't have to muck with vmalloc internals here.
> @@ -547,6 +550,8 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
>  	}
>  
>  	op.handle = (grant_handle_t)area->phys_addr;
> +	op.host_addr = arbitrary_virt_to_machine(
> +		lookup_address((unsigned long)vaddr, &level)).maddr;
>  
>  	if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
>  		BUG();
> diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h
> index 9332e52..1a77252 100644
> --- a/include/linux/vmalloc.h
> +++ b/include/linux/vmalloc.h
> @@ -118,7 +118,7 @@ unmap_kernel_range(unsigned long addr, unsigned long size)
>  #endif
>  
>  /* Allocate/destroy a 'vmalloc' VM area. */
> -extern struct vm_struct *alloc_vm_area(size_t size);
> +extern struct vm_struct *alloc_vm_area(size_t size, pte_t **ptes);
>  extern void free_vm_area(struct vm_struct *area);
>  
>  /* for /dev/kmem */
> diff --git a/mm/vmalloc.c b/mm/vmalloc.c
> index 5016f19..b5deec6 100644
> --- a/mm/vmalloc.c
> +++ b/mm/vmalloc.c
> @@ -2105,23 +2105,30 @@ void  __attribute__((weak)) vmalloc_sync_all(void)
>  
>  static int f(pte_t *pte, pgtable_t table, unsigned long addr, void *data)
>  {
> -	/* apply_to_page_range() does all the hard work. */
> +	pte_t ***p = data;
> +
> +	if (p) {
> +		*(*p) = pte;
> +		(*p)++;
> +	}
>  	return 0;
>  }
>  
>  /**
>   *	alloc_vm_area - allocate a range of kernel address space
>   *	@size:		size of the area
> + *	@ptes:		returns the PTEs for the address space
>   *
>   *	Returns:	NULL on failure, vm_struct on success
>   *
>   *	This function reserves a range of kernel address space, and
>   *	allocates pagetables to map that range.  No actual mappings
> - *	are created.  If the kernel address space is not shared
> - *	between processes, it syncs the pagetable across all
> - *	processes.
> + *	are created.
> + *
> + *	If @ptes is non-NULL, pointers to the PTEs (in init_mm)
> + *	allocated for the VM area are returned.
>   */
> -struct vm_struct *alloc_vm_area(size_t size)
> +struct vm_struct *alloc_vm_area(size_t size, pte_t **ptes)
>  {
>  	struct vm_struct *area;
>  
> @@ -2135,19 +2142,11 @@ struct vm_struct *alloc_vm_area(size_t size)
>  	 * of kernel virtual address space and mapped into init_mm.
>  	 */
>  	if (apply_to_page_range(&init_mm, (unsigned long)area->addr,
> -				area->size, f, NULL)) {
> +				size, f, ptes ? &ptes : NULL)) {
>  		free_vm_area(area);
>  		return NULL;
>  	}
>  
> -	/*
> -	 * If the allocated address space is passed to a hypercall
> -	 * before being used then we cannot rely on a page fault to
> -	 * trigger an update of the page tables.  So sync all the page
> -	 * tables here.
> -	 */
> -	vmalloc_sync_all();
> -
>  	return area;
>  }
>  EXPORT_SYMBOL_GPL(alloc_vm_area);
> -- 
> 1.7.7.1
> 

--45Z9DzgjV8m4Oswq
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
	filename="0001-xen-map-foreign-pages-for-shared-rings-by-updating-t.patch"

>From 21396dbbb3f976c8b4deb9f696994458dbe00db0 Mon Sep 17 00:00:00 2001
From: David Vrabel <david.vrabel@citrix.com>
Date: Thu, 29 Sep 2011 16:53:32 +0100
Subject: [PATCH] xen: map foreign pages for shared rings by updating the PTEs
 directly

When mapping a foreign page with xenbus_map_ring_valloc() with the
GNTTABOP_map_grant_ref hypercall, set the GNTMAP_contains_pte flag and
pass a pointer to the PTE (in init_mm).

After the page is mapped, the usual fault mechanism can be used to
update additional MMs.  This allows the vmalloc_sync_all() to be
removed from alloc_vm_area().

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 arch/x86/xen/grant-table.c         |    2 +-
 drivers/xen/xenbus/xenbus_client.c |   11 ++++++++---
 include/linux/vmalloc.h            |    2 +-
 mm/vmalloc.c                       |   27 +++++++++++++--------------
 4 files changed, 23 insertions(+), 19 deletions(-)

diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c
index 6bbfd7a..5a40d24 100644
--- a/arch/x86/xen/grant-table.c
+++ b/arch/x86/xen/grant-table.c
@@ -71,7 +71,7 @@ int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
 
 	if (shared == NULL) {
 		struct vm_struct *area =
-			alloc_vm_area(PAGE_SIZE * max_nr_gframes);
+			alloc_vm_area(PAGE_SIZE * max_nr_gframes, NULL);
 		BUG_ON(area == NULL);
 		shared = area->addr;
 		*__shared = shared;
diff --git a/drivers/xen/xenbus/xenbus_client.c b/drivers/xen/xenbus/xenbus_client.c
index 81c3ce6..1906125 100644
--- a/drivers/xen/xenbus/xenbus_client.c
+++ b/drivers/xen/xenbus/xenbus_client.c
@@ -35,6 +35,7 @@
 #include <linux/vmalloc.h>
 #include <linux/export.h>
 #include <asm/xen/hypervisor.h>
+#include <asm/xen/page.h>
 #include <xen/interface/xen.h>
 #include <xen/interface/event_channel.h>
 #include <xen/events.h>
@@ -436,19 +437,20 @@ EXPORT_SYMBOL_GPL(xenbus_free_evtchn);
 int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
 {
 	struct gnttab_map_grant_ref op = {
-		.flags = GNTMAP_host_map,
+		.flags = GNTMAP_host_map | GNTMAP_contains_pte,
 		.ref   = gnt_ref,
 		.dom   = dev->otherend_id,
 	};
 	struct vm_struct *area;
+	pte_t *pte;
 
 	*vaddr = NULL;
 
-	area = alloc_vm_area(PAGE_SIZE);
+	area = alloc_vm_area(PAGE_SIZE, &pte);
 	if (!area)
 		return -ENOMEM;
 
-	op.host_addr = (unsigned long)area->addr;
+	op.host_addr = arbitrary_virt_to_machine(pte).maddr;
 
 	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
 		BUG();
@@ -527,6 +529,7 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
 	struct gnttab_unmap_grant_ref op = {
 		.host_addr = (unsigned long)vaddr,
 	};
+	unsigned int level;
 
 	/* It'd be nice if linux/vmalloc.h provided a find_vm_area(void *addr)
 	 * method so that we don't have to muck with vmalloc internals here.
@@ -548,6 +551,8 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
 	}
 
 	op.handle = (grant_handle_t)area->phys_addr;
+	op.host_addr = arbitrary_virt_to_machine(
+		lookup_address((unsigned long)vaddr, &level)).maddr;
 
 	if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
 		BUG();
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h
index 687fb11..4bde182 100644
--- a/include/linux/vmalloc.h
+++ b/include/linux/vmalloc.h
@@ -119,7 +119,7 @@ unmap_kernel_range(unsigned long addr, unsigned long size)
 #endif
 
 /* Allocate/destroy a 'vmalloc' VM area. */
-extern struct vm_struct *alloc_vm_area(size_t size);
+extern struct vm_struct *alloc_vm_area(size_t size, pte_t **ptes);
 extern void free_vm_area(struct vm_struct *area);
 
 /* for /dev/kmem */
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index b669aa6..3231bf3 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -2141,23 +2141,30 @@ void  __attribute__((weak)) vmalloc_sync_all(void)
 
 static int f(pte_t *pte, pgtable_t table, unsigned long addr, void *data)
 {
-	/* apply_to_page_range() does all the hard work. */
+	pte_t ***p = data;
+
+	if (p) {
+		*(*p) = pte;
+		(*p)++;
+	}
 	return 0;
 }
 
 /**
  *	alloc_vm_area - allocate a range of kernel address space
  *	@size:		size of the area
+ *	@ptes:		returns the PTEs for the address space
  *
  *	Returns:	NULL on failure, vm_struct on success
  *
  *	This function reserves a range of kernel address space, and
  *	allocates pagetables to map that range.  No actual mappings
- *	are created.  If the kernel address space is not shared
- *	between processes, it syncs the pagetable across all
- *	processes.
+ *	are created.
+ *
+ *	If @ptes is non-NULL, pointers to the PTEs (in init_mm)
+ *	allocated for the VM area are returned.
  */
-struct vm_struct *alloc_vm_area(size_t size)
+struct vm_struct *alloc_vm_area(size_t size, pte_t **ptes)
 {
 	struct vm_struct *area;
 
@@ -2171,19 +2178,11 @@ struct vm_struct *alloc_vm_area(size_t size)
 	 * of kernel virtual address space and mapped into init_mm.
 	 */
 	if (apply_to_page_range(&init_mm, (unsigned long)area->addr,
-				area->size, f, NULL)) {
+				size, f, ptes ? &ptes : NULL)) {
 		free_vm_area(area);
 		return NULL;
 	}
 
-	/*
-	 * If the allocated address space is passed to a hypercall
-	 * before being used then we cannot rely on a page fault to
-	 * trigger an update of the page tables.  So sync all the page
-	 * tables here.
-	 */
-	vmalloc_sync_all();
-
 	return area;
 }
 EXPORT_SYMBOL_GPL(alloc_vm_area);
-- 
1.7.7.1


--45Z9DzgjV8m4Oswq
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--45Z9DzgjV8m4Oswq--


From xen-devel-bounces@lists.xensource.com Mon Nov 07 12:39:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 12:39:32 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNVye-0008Mp-Ru; Mon, 07 Nov 2011 12:39:32 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNVxu-0008AF-Sf
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 12:38:47 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1320698323!2606050!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32017 invoked from network); 7 Nov 2011 20:38:43 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 20:38:43 -0000
X-IronPort-AV: E=Sophos;i="4.69,471,1315180800"; 
   d="scan'208";a="8804364"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 20:38:43 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 20:38:43 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RNVxq-00050e-Rv;
	Mon, 07 Nov 2011 20:38:42 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RNVxq-0003MT-Rd;
	Mon, 07 Nov 2011 20:38:42 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9722-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 7 Nov 2011 20:38:42 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9722: regressions - trouble:
	broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9722 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9722/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-i386-rhel6hvm-intel  3 host-install(3)              broken
 test-amd64-amd64-xl           3 host-install(3)              broken
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl           18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-credit2   18 leak-check/check           fail REGR. vs. 9661
 test-amd64-amd64-xl-sedf     11 guest-localmigrate         fail REGR. vs. 9659
 test-amd64-i386-xl-multivcpu 18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-win-vcpus1  3 host-install(3)              broken

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  4e13729a0adf
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Juergen Gross <juergen.gross@ts.fujitsu.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          broken  
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               broken  
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                broken  
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

(No revision log; it would be 336 lines long.)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 13:27:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 13:27:44 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNWjH-00015D-Ux; Mon, 07 Nov 2011 13:27:44 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNWiE-0000sV-Th; Mon, 07 Nov 2011 13:26:39 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1320701194!1707506!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31959 invoked from network); 7 Nov 2011 21:26:35 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-5.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Nov 2011 21:26:35 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA7LQRJY010891
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 7 Nov 2011 21:26:28 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA7LQQNH024930
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 7 Nov 2011 21:26:26 GMT
Received: from abhmt105.oracle.com (abhmt105.oracle.com [141.146.116.57])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA7LQLSG013983; Mon, 7 Nov 2011 15:26:21 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 07 Nov 2011 13:26:20 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id AF60081204; Mon,  7 Nov 2011 16:26:19 -0500 (EST)
Date: Mon, 7 Nov 2011 16:26:19 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: Is: Xen 4.1.1, xend, HVM, 3.1 kernel; Was:Re: [Xen-devel] xen
	4.2 unstable; HVM; 2.6.39.3; HD/Network card error
Message-ID: <20111107212619.GA24889@phenom.dumpdata.com>
References: <alpine.DEB.2.00.1107181242270.12963@kaball-desktop>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAE0cphS4zTVFjzXOjWNB7uwBAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107201238440.12963@kaball-desktop>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAIMchHuG/6dIqtJ7GgPrsOEBAAAAAA==@gmail.com>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAAKIP0TTIelKl7OMHw7/aSQBAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107251142270.12963@kaball-desktop>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAICr5HMuz3FOpEbmgui+XxgBAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107251748160.12963@kaball-desktop>
	<20111103173837.GA21554@phenom.dumpdata.com>
	<alpine.DEB.2.00.1111071646210.3519@kaball-desktop>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <alpine.DEB.2.00.1111071646210.3519@kaball-desktop>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090206.4EB84D04.0109,ss=1,re=0.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	Walter Robert Ditzler <ditwal001@gmail.com>,
	Ian Campbell <Ian.Campbell@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 07, 2011 at 05:15:08PM +0000, Stefano Stabellini wrote:
> On Thu, 3 Nov 2011, Konrad Rzeszutek Wilk wrote:
> > .. snip..
> > > I need the output of the guest kernel stuck during boot in order to
> > > understand the problem. It shouldn't be difficult to get if you enable
> > > logging over the serial in the guest kernel.
> > 
> > Hey Stefano,
> > 
> > Looks like I can reproduce this as well. This is using Fedora Core 16,
> > and with the Fedora Core 16 HVM install.
> > 
> > The interesting thing is that while 'xl' works, the 'xm' (which is what
> > virt-install and all of that uses), does not. And I think it is related
> > just to how we handle the hdc:cdrom,r case. Read below.
> > 
> > Just to make sure it is not SELinux related, I've called 'setenforce=0'.
> > The guest config is easy:
> > 
> > kernel = "/usr/lib/xen/boot/hvmloader"
> > builder='hvm'
> > memory=1024
> > #maxmem=1024
> > maxvcpus = 2
> > serial='pty'
> > vcpus = 2
> > disk = [ 'file:/mnt/iso/Fedora-16-x86_64-DVD.iso,hdc:cdrom,r', 'phy:/dev/vg_guest/f16_64,hda,w']
> > boot="dn"
> > vif = [ 'type=ioemu,model=e1000,mac=00:0F:4B:00:00:71, bridge=switch' ]
> > vfb = [ 'vnc=1, vnclisten=0.0.0.0 ,vncunused=1']
> > vnclisten="0.0.0.0"
> 
> BTW the vfb setting is wrong for an hvm domain.
> The correct way of configuring vnc is the following:
> 
> vnc=1
> vnclisten="0.0.0.0"
> vncunused=1
> 
> it just happened to work with xm but it was never supposed to.
> 
> 
> > Attached are the serial logs from good and bad, and as well the xenstore-ls from ..
> > you guessed it - good and bad. The interesting part is:
> > 
> > (this works)
> >    backend = ""
> >     qdisk = ""
> >      24 = ""
> >       5632 = ""
> >        frontend = "/local/domain/24/device/vbd/5632"
> >        params = "aio:/mnt/iso/Fedora-16-x86_64-DVD.iso"
> >        frontend-id = "24"
> >        online = "1"
> >        removable = "1"
> >        bootable = "1"
> >        state = "6"
> >        dev = "hdc"
> >        type = "tap"
> >        mode = "r"
> >        feature-barrier = "1"
> >        info = "4"
> >        sector-size = "512"
> >        sectors = "7337984"
> >        hotplug-status = "connected"
> > 
> > (this fails)
> >     vbd = ""
> >      10 = ""
> >       768 = ""
> >        domain = "test"
> >        frontend = "/local/domain/10/device/vbd/768"
> >        uuid = "ee7800e1-fae0-dfe2-9345-96fda7d7851f"
> >        bootable = "1"
> >        dev = "hda"
> >        state = "4"
> >        params = "/var/lib/xen/images/test.img"
> >        mode = "w"
> >        online = "1"
> >        frontend-id = "10"
> >        type = "file"
> >        node = "/dev/loop0"
> >        physical-device = "7:0"
> >        hotplug-status = "connected"
> >        feature-flush-cache = "1"
> >        sectors = "41943040"
> >        info = "0"
> >        sector-size = "512"
> > 
> > Which would imply that for the CD-ROM when we use 'xm' it is setup
> > as a PV disk (and we try to load the driver for it but fail)
> > while for the 'xl' it is as a QEMU qdisk (so emulated).
> 
> There is always a PV disk associated with CD-ROMs even though the guest
> is not going to use it. Linux blkfront would explicitly avoid to setup
> a PV interface for CD-ROMs.
> 
> 
> > First I *thought* it was that blkback is failing to do its
> > stuff when using /dev/loop0, but after doing this:
> > 
> > disk = [ 'phy:/dev/loop0,hda,w']
> > 
> > I still got it to boot.
> 
> Let me get this straight:
> 
> disk = [ 'phy:/dev/loop0,hda,w'] works
> disk = [ 'file:/mnt/iso/Fedora-16-x86_64-DVD.iso,hdc:cdrom,r' ] does NOT work
> 
> that is very strange considering that if I recall correctly xm/xend
> would setup a loop device when the disk config is 'file:', so the two
> should be equivalent.

<nods> It might have been me getting tired by this point. The timeout seems
to be .. well, I think that the 'file' works as well - it is just that the
timeout takes forever, and then there might be another timeout before the
anaconda windows pops up. So it could be that in the normal case it works - it
just that you have to be patient.

> 
> 
> > So it really seams that xen-blkback (or xen-blkfront) can't deal
> > with CD-ROMs very well. So I did it:
> > 
> > disk = [ 'phy:/dev/loop1,hdc:cdrom,r', 'phy:/dev/loop0,hda,w']
> > [root@phenom ~]# losetup -a
> > /dev/loop0: [0005]:1353 (/dev/mapper/vg_guest-f16_64)
> > /dev/loop1: [002a]:45613764 (/mnt/iso/Fedora-16-x86_64-DVD.iso)
> > 
> > Which is pretty much exactly what the 'file:/'.. would, and I got this
> >  vbd = ""
> >      34 = ""
> >       5632 = ""
> >        domain = "hvm.xm"
> >        frontend = "/local/domain/34/device/vbd/5632"
> >        uuid = "e30da140-7ef9-9c1f-8e45-1e5e63f798e0"
> >        bootable = "1"
> >        dev = "hdc"
> >        state = "6"
> >        params = "/dev/loop1"
> >        mode = "r"
> >        online = "1"
> >        frontend-id = "34"
> >        type = "phy"
> >        physical-device = "7:1"
> >        hotplug-status = "connected"
> > 
> > And after waiting for the timeout.. (can't load and then some more, the installer
> > came up and I could 'Test' the ISO image. The CD-ROM image was
> > emulated, which sounds right - the vbd/34/5632 just did not work out
> > and it timed out, but it still had the QEMU disk (/dev/sr0) and it used
> > that instead.
> 
> What is the guest kernel? As I said before blkfront should avoid loading
> a PV disk for CD-ROMs, see:

F16 DomU. So 3.1

> 
> commit b98a409b80ac510c95b4f1bafdef28edaeabd3e7
> Author: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> Date:   Thu Jul 29 14:53:16 2010 +0100
> 
>     blkfront: do not create a PV cdrom device if xen_hvm_guest
>     
>     It is not possible to unplug emulated cdrom devices, and PV cdroms don't
>     handle media insert, eject and stream, so we are better off disabling PV
>     cdroms when running as a Xen HVM guest.
>     
>     Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> 
> 
> > Any suggestions, thoughts, ideas? It sounds like the xen-blkfront
> > support for CD-ROMs is not working right.
> 
> it shouldn't work at all :)

HA!
> 
> 
> > Or maybe there are multiple issues and the error from xen-blkfront is
> > red heering. I seem to see other things too:
> > 
> > vif vif-0: 2 parsing device/vif/0/mac
> > 
> > [Ugh, looks like MAC is 00:00:00:0.. in the guest], but it probably got the right
> > MAC on the emulated device]
> > 
> > 
> > XENBUS: Timeout connecting to device: device/vkbd/0 (local state 3, remote state 1)
> > [which seems odds as the vkb from VNC looks to be working]
> 
> Thanks for pointing this out: I enabled vkbd in upstream qemu but I
> forgot to do the same in qemu-xen so as a result you would get failures
> of this kind.

Oh boy. Seems that there are a couple of issues here. It might be that the
timeout I had experienced was _only_ related to this and the other were red-herrings.

You might want to make sure M A Young and Stefan Bader are CC-ed on your Xen 4.1.1
patch so they can pull it in.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 14:05:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 14:05:34 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNXJu-0002xY-15; Mon, 07 Nov 2011 14:05:34 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNXEi-0002gG-Aw
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 14:00:42 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1320703195!638981!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7513 invoked from network); 7 Nov 2011 21:59:55 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-9.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 21:59:55 -0000
Received: by wwf4 with SMTP id 4so6071000wwf.24
	for <xen-devel@lists.xensource.com>;
	Mon, 07 Nov 2011 13:59:55 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=ncP+0pcAYqb77iBsOUk+zLym758A1PJo6iHGmnqcrp0=;
	b=xyGylIou7cZC14NAejjJ3mrf3d4IVqnqwWdxg7kgZU0RArjNM0iGsKjvgthmMx3Tzg
	UP86oaoRQaqneJJCCbaRywdf/jRk7l7L7PLhyA/vYNpCux+i47hUA15hw/dsI9/Tq9Iq
	v1fxqYF+x2xQg6Smf2ItEfkvW+QqrQnhjgHw0=
Received: by 10.216.164.74 with SMTP id b52mr3834228wel.94.1320703194999;
	Mon, 07 Nov 2011 13:59:54 -0800 (PST)
Received: from [192.168.1.71]
	(host86-129-249-120.range86-129.btcentralplus.com. [86.129.249.120])
	by mx.google.com with ESMTPS id fi11sm29316928wbb.9.2011.11.07.13.59.52
	(version=SSLv3 cipher=OTHER); Mon, 07 Nov 2011 13:59:53 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Mon, 07 Nov 2011 21:59:50 +0000
Subject: Re: [Xen-devel] [PATCH] mm: Cleanup, use PAGE_ORDER_4K as page_order
	instead of "0".
From: Keir Fraser <keir.xen@gmail.com>
To: Jean Guyader <jean.guyader@eu.citrix.com>, <xen-devel@lists.xensource.com>
Message-ID: <CADE0556.24543%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH] mm: Cleanup, use PAGE_ORDER_4K as page_order
	instead of "0".
Thread-Index: AcydmJIuAbmSNjwCgUiEaFofrZRocw==
In-Reply-To: <1320693909-914-1-git-send-email-jean.guyader@eu.citrix.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: tim@xen.org
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Personally I prefer it as zero. Tim can have final decision though.

 -- Keir

On 07/11/2011 19:25, "Jean Guyader" <jean.guyader@eu.citrix.com> wrote:

> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> ---
>  xen/arch/x86/mm.c     |   10 +++++-----
>  xen/arch/x86/mm/p2m.c |   24 ++++++++++++------------
>  xen/common/memory.c   |    8 ++++----
>  3 files changed, 21 insertions(+), 21 deletions(-)
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 15:02:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 15:02:30 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNYCz-0004Hi-LF; Mon, 07 Nov 2011 15:02:29 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNY99-00042X-AD
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 14:58:43 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1320706707!3250521!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30428 invoked from network); 7 Nov 2011 22:58:28 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-12.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Nov 2011 22:58:28 -0000
X-IronPort-AV: E=Sophos;i="4.69,472,1315180800"; 
   d="scan'208";a="8805703"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Nov 2011 22:58:27 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 7 Nov 2011 22:58:27 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RNY95-0005m4-Cr;
	Mon, 07 Nov 2011 22:58:27 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RNY95-0003oA-BN;
	Mon, 07 Nov 2011 22:58:27 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9723-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 7 Nov 2011 22:58:27 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9723: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9723 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9723/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 build-amd64-oldkern           2 host-install(2)              broken
 build-amd64-pvops             2 host-install(2)              broken
 build-amd64                   2 host-install(2)              broken
 test-amd64-i386-rhel6hvm-intel  3 host-install(3)              broken  in 9722
 test-amd64-amd64-xl           3 host-install(3)              broken   in 9722
 test-amd64-i386-xl           18 leak-check/check   fail in 9722 REGR. vs. 9661
 test-amd64-i386-xl-credit2   18 leak-check/check   fail in 9722 REGR. vs. 9661
 test-amd64-amd64-xl-sedf     11 guest-localmigrate fail in 9722 REGR. vs. 9659
 test-amd64-i386-xl-multivcpu 18 leak-check/check   fail in 9722 REGR. vs. 9661
 test-amd64-i386-xl-win-vcpus1  3 host-install(3)              broken   in 9722

Tests which are failing intermittently (not blocking):
 test-i386-i386-win           14 guest-start.2                fail pass in 9722

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pv            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pair          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-amd64-xl-pcipt-intel  9 guest-start         fail in 9722 never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2          fail in 9722 never pass
 test-amd64-amd64-win         16 leak-check/check       fail in 9722 never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check       fail in 9722 never pass
 test-amd64-i386-win          16 leak-check/check       fail in 9722 never pass
 test-i386-i386-win           16 leak-check/check       fail in 9722 never pass
 test-amd64-amd64-xl-win      13 guest-stop             fail in 9722 never pass

version targeted for testing:
 xen                  4e13729a0adf
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Juergen Gross <juergen.gross@ts.fujitsu.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  broken  
 build-i386                                                   pass    
 build-amd64-oldkern                                          broken  
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           blocked 
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 blocked 
 test-amd64-i386-xl-credit2                                   blocked 
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               blocked 
 test-amd64-i386-xl-multivcpu                                 blocked 
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         blocked 
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           blocked 
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   blocked 
 test-amd64-i386-xl-win-vcpus1                                blocked 
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          blocked 
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

(No revision log; it would be 336 lines long.)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 19:11:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 19:11:03 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNc5X-0002is-3y; Mon, 07 Nov 2011 19:11:03 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNc4k-0002WL-VA
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 19:10:15 -0800
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1320721810!3278676!1
X-Originating-IP: [192.55.52.88]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22510 invoked from network); 8 Nov 2011 03:10:11 -0000
Received: from mga01.intel.com (HELO mga01.intel.com) (192.55.52.88)
	by server-16.tower-21.messagelabs.com with SMTP;
	8 Nov 2011 03:10:11 -0000
Received: from fmsmga001.fm.intel.com ([10.253.24.23])
	by fmsmga101.fm.intel.com with ESMTP; 07 Nov 2011 19:10:09 -0800
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.69,473,1315206000"; d="scan'208";a="82229913"
Received: from orsmsx603.amr.corp.intel.com ([10.22.226.49])
	by fmsmga001.fm.intel.com with ESMTP; 07 Nov 2011 19:10:06 -0800
Received: from orsmsx601.amr.corp.intel.com (10.22.226.213) by
	orsmsx603.amr.corp.intel.com (10.22.226.49) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Mon, 7 Nov 2011 19:10:06 -0800
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx601.amr.corp.intel.com ([10.22.226.213]) with mapi;
	Mon, 7 Nov 2011 19:10:06 -0800
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: Jean Guyader <jean.guyader@eu.citrix.com>, "xen-devel@lists.xensource.com"
	<xen-devel@lists.xensource.com>
Date: Mon, 7 Nov 2011 19:10:04 -0800
Thread-Topic: [PATCH 1/6] vtd: Refactor iotlb flush code
Thread-Index: AcyderFEU9hqUw51Q+qajadXxWtcSAASNsSA
Message-ID: <987664A83D2D224EAE907B061CE93D530206CE00D0@orsmsx505.amr.corp.intel.com>
References: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
In-Reply-To: <1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
MIME-Version: 1.0
Cc: "tim@xen.org" <tim@xen.org>
Subject: [Xen-devel] RE: [PATCH 1/6] vtd: Refactor iotlb flush code
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1255836135=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1255836135==
Content-Language: en-US
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

SmVhbiwNCg0KVGhlIG9yaWdpbmFsIGNvZGUgZG9lcyBub3QgY2FsbCBpb21tdV9mbHVzaF9pb3Rs
Yl9kc2koKS4gIFdoYXQgaXMgdGhlIHJlYXNvbiB0aGUgcmVmcmFjdG9yZWQgY29kZSBuZWVkIHRv
IHVzZSBkb21haW4gc2VsZWN0aXZlIGludmFsaWRhdGlvbj8NCg0KQWxsZW4NCi0tLS0tDQoNCisg
ICAgICAgIGlmICggcGFnZV9jb3VudCA+IDEgfHwgZ2ZuID09IC0xICkNCisgICAgICAgIHsNCisg
ICAgICAgICAgICBpZiAoIGlvbW11X2ZsdXNoX2lvdGxiX2RzaShpb21tdSwgaW9tbXVfZG9taWQs
DQorICAgICAgICAgICAgICAgICAgICAgICAgMCwgZmx1c2hfZGV2X2lvdGxiKSApDQorICAgICAg
ICAgICAgICAgIGlvbW11X2ZsdXNoX3dyaXRlX2J1ZmZlcihpb21tdSk7DQorICAgICAgICB9DQor
ICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKCBpb21tdV9mbHVzaF9p
b3RsYl9wc2koaW9tbXUsIGlvbW11X2RvbWlkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChw
YWRkcl90KWdmbiA8PCBQQUdFX1NISUZUXzRLLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAg
ICFkbWFfb2xkX3B0ZV9wcmVzZW50LCBmbHVzaF9kZXZfaW90bGIpICkNCisgICAgICAgICAgICAg
ICAgaW9tbXVfZmx1c2hfd3JpdGVfYnVmZmVyKGlvbW11KTsNCg0KLS0tLS1PcmlnaW5hbCBNZXNz
YWdlLS0tLS0NCkZyb206IEplYW4gR3V5YWRlciBbbWFpbHRvOmplYW4uZ3V5YWRlckBldS5jaXRy
aXguY29tXSANClNlbnQ6IE1vbmRheSwgTm92ZW1iZXIgMDcsIDIwMTEgMTA6MjUgQU0NClRvOiB4
ZW4tZGV2ZWxAbGlzdHMueGVuc291cmNlLmNvbQ0KQ2M6IHRpbUB4ZW4ub3JnOyBLYXksIEFsbGVu
IE07IEplYW4gR3V5YWRlcg0KU3ViamVjdDogW1BBVENIIDEvNl0gdnRkOiBSZWZhY3RvciBpb3Rs
YiBmbHVzaCBjb2RlDQoNCg0KRmFjdG9yaXplIHRoZSBpb3RsYiBmbHVzaCBjb2RlIGZyb20gbWFw
X3BhZ2UgYW5kIHVubWFwX3BhZ2UgaW50byBpdCdzIG93biBmdW5jdGlvbi4NCg0KU2lnbmVkLW9m
Zi1ieTogSmVhbiBHdXlhZGVyIDxqZWFuLmd1eWFkZXJAZXUuY2l0cml4LmNvbT4NCi0tLQ0KIHhl
bi9kcml2ZXJzL3Bhc3N0aHJvdWdoL3Z0ZC9pb21tdS5jIHwgICA4NiArKysrKysrKysrKysrKysr
Ky0tLS0tLS0tLS0tLS0tLS0tDQogMSBmaWxlcyBjaGFuZ2VkLCA0MyBpbnNlcnRpb25zKCspLCA0
MyBkZWxldGlvbnMoLSkNCg0K


--===============1255836135==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1255836135==--

From xen-devel-bounces@lists.xensource.com Mon Nov 07 19:29:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 19:29:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNcNj-0004i4-BD; Mon, 07 Nov 2011 19:29:51 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNcN1-0004Vp-V7
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 19:29:08 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-2.tower-182.messagelabs.com!1320722944!2265724!1
X-Originating-IP: [208.97.132.119]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4170 invoked from network); 8 Nov 2011 03:29:04 -0000
Received: from caiajhbdcbbj.dreamhost.com (HELO homiemail-a15.g.dreamhost.com)
	(208.97.132.119) by server-2.tower-182.messagelabs.com with SMTP;
	8 Nov 2011 03:29:04 -0000
Received: from homiemail-a15.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a15.g.dreamhost.com (Postfix) with ESMTP id C84C576C06F;
	Mon,  7 Nov 2011 19:29:03 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=pIemFSeW+0Kuwsz7C75XIAm2+iZ0F8IseBzaBmmgxTTN
	wlc0qunOtIQpmlO6bR72pNZrFEjHClALsbrO9YuA3LgwFi6SoePNEXnJ/w4tn/C/
	l7Y6kJN3CuWt9m2yj3c7ThFhM7TgweJ5vniv3t87y8QyAxzmGdDe/8Ul0fC58g8=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=X7wkSdcjViLFwhr/w3mW85QwbKg=; b=HD3ArF/JSDb
	NF5vlnXwKGq4XFrd2V/MxomhEskrs3iinbpr5FiohDRka9m0KtVYs/Xg9FuDRXXc
	sd0+8t2vAGcX58+bTpTjjc4F5683SUkzSkuyF3eN7txMz1CeI/7x/J36YPcpFclA
	PxS9dkXgovxNuaOiMYtikh+8yULidv78=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a15.g.dreamhost.com (Postfix) with ESMTPSA id 2284B76C065; 
	Mon,  7 Nov 2011 19:29:03 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 81eedccb3a8509959c621ec434492d8f72fa56f4
Message-Id: <81eedccb3a8509959c62.1320722910@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1320722908@xdev.gridcentric.ca>
References: <patchbomb.1320722908@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 07 Nov 2011 22:28:30 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: olaf@aepfle.de, George.Dunlap@eu.citrix.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 2 of 5] Declare an order-enforcing construct for
 external locks used in the mm layer
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 xen/arch/x86/mm/mm-locks.h |  46 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 46 insertions(+), 0 deletions(-)


Declare an order-enforcing construct for a lock used in the mm layer
that is not of type mm_lock_t. This is useful whenever the mm layer
takes locks from other subsystems, or locks not implemented as
mm_lock_t.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r 75f1e156386d -r 81eedccb3a85 xen/arch/x86/mm/mm-locks.h
--- a/xen/arch/x86/mm/mm-locks.h
+++ b/xen/arch/x86/mm/mm-locks.h
@@ -70,6 +70,27 @@ static inline void _mm_lock(mm_lock_t *l
         panic("mm lock already held by %s\n", l->locker_function);
     __set_lock_level(level);
 }
+
+static inline void _mm_enforce_order_lock_pre(int level)
+{
+    __check_lock_level(level);
+}
+
+static inline void _mm_enforce_order_lock_post(int level, int *unlock_level,
+                                                unsigned short *recurse_count)
+{
+    if ( recurse_count )
+    {
+        if ( *recurse_count++ == 0 )
+        {
+            *unlock_level = __get_lock_level();
+        }
+    } else {
+        *unlock_level = __get_lock_level();
+    }
+    __set_lock_level(level);
+}
+
 /* This wrapper uses the line number to express the locking order below */
 #define declare_mm_lock(name)                                                 \
     static inline void mm_lock_##name(mm_lock_t *l, const char *func, int rec)\
@@ -78,6 +99,16 @@ static inline void _mm_lock(mm_lock_t *l
 #define mm_lock(name, l) mm_lock_##name(l, __func__, 0)
 #define mm_lock_recursive(name, l) mm_lock_##name(l, __func__, 1)
 
+/* This wrapper is intended for "external" locks which do not use
+ * the mm_lock_t types. Such locks inside the mm code are also subject
+ * to ordering constraints. */
+#define declare_mm_order_constraint(name)                                   \
+    static inline void mm_enforce_order_lock_pre_##name(void)               \
+    { _mm_enforce_order_lock_pre(__LINE__); }                               \
+    static inline void mm_enforce_order_lock_post_##name(                   \
+                        int *unlock_level, unsigned short *recurse_count)   \
+    { _mm_enforce_order_lock_post(__LINE__, unlock_level, recurse_count); } \
+
 static inline void mm_unlock(mm_lock_t *l)
 {
     if ( l->lock.recurse_cnt == 1 )
@@ -88,6 +119,21 @@ static inline void mm_unlock(mm_lock_t *
     spin_unlock_recursive(&l->lock);
 }
 
+static inline void mm_enforce_order_unlock(int unlock_level, 
+                                            unsigned short *recurse_count)
+{
+    if ( recurse_count )
+    {
+        BUG_ON(*recurse_count == 0);
+        if ( *recurse_count-- == 1 )
+        {
+            __set_lock_level(unlock_level);
+        }
+    } else {
+        __set_lock_level(unlock_level);
+    }
+}
+
 /************************************************************************
  *                                                                      *
  * To avoid deadlocks, these locks _MUST_ be taken in the order they're *

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 19:31:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 19:31:16 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNcP5-000566-Lt; Mon, 07 Nov 2011 19:31:16 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNcN2-0004Vs-IN
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 19:29:08 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-8.tower-21.messagelabs.com!1320722944!3314756!1
X-Originating-IP: [208.97.132.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21501 invoked from network); 8 Nov 2011 03:29:04 -0000
Received: from caiajhbdcbhh.dreamhost.com (HELO homiemail-a15.g.dreamhost.com)
	(208.97.132.177) by server-8.tower-21.messagelabs.com with SMTP;
	8 Nov 2011 03:29:04 -0000
Received: from homiemail-a15.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a15.g.dreamhost.com (Postfix) with ESMTP id E3D5676C06E;
	Mon,  7 Nov 2011 19:29:02 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=KV1XpCbjNlJoChHt9VFqeeZC8kGBQjRVbI2vjhCvcKIS
	jzz4e0gyjbqSS27GYTS+vsL6ao3L14gOfJWjcqtRNheAY3oglSVVfnUQOp5wW7X5
	IMm17AxrVJE/XJCQm2LovJDRmx5rih5hoTRTZ+GZLgGzT71E3PV6/tgbAIEVy1o=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=bfclbA9WznusvMMvViU4a3Fgv3E=; b=Bk7m/B12kL0
	5kP0sWR3J+Crr16Cq0vUEY8SijUQ3riQWjZM85/e131C7MycobpnmNzjSMLYVl8H
	7Qv1KWzYOjkbYVFQzsJDy9D5MDqt91Vcj5eT0lXFWiP52kvDGwO1um4AFcoNWrWJ
	pDDmZqvU37TZmLC5/QhjSZWuOhcLdCI0=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a15.g.dreamhost.com (Postfix) with ESMTPSA id 312E976C065; 
	Mon,  7 Nov 2011 19:29:02 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 75f1e156386dca6bc56839687a10ef23230e84e0
Message-Id: <75f1e156386dca6bc568.1320722909@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1320722908@xdev.gridcentric.ca>
References: <patchbomb.1320722908@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 07 Nov 2011 22:28:29 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: olaf@aepfle.de, George.Dunlap@eu.citrix.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 1 of 5] Refactor mm-lock ordering constructs
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 xen/arch/x86/mm/mm-locks.h |  27 +++++++++++++++++++--------
 1 files changed, 19 insertions(+), 8 deletions(-)


The mm layer has a construct to enforce locks are taken in a pre-
defined order, and thus avert deadlock. Refactor pieces of this
code for later use, no functional changes.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r 54a5e994a241 -r 75f1e156386d xen/arch/x86/mm/mm-locks.h
--- a/xen/arch/x86/mm/mm-locks.h
+++ b/xen/arch/x86/mm/mm-locks.h
@@ -28,6 +28,7 @@
 
 /* Per-CPU variable for enforcing the lock ordering */
 DECLARE_PER_CPU(int, mm_lock_level);
+#define __get_lock_level()  (this_cpu(mm_lock_level))
 
 static inline void mm_lock_init(mm_lock_t *l)
 {
@@ -42,22 +43,32 @@ static inline int mm_locked_by_me(mm_loc
     return (l->lock.recurse_cpu == current->processor);
 }
 
+/* If you see this crash, the numbers printed are lines in this file 
+ * where the offending locks are declared. */
+#define __check_lock_level(l)                           \
+do {                                                    \
+    if ( unlikely(__get_lock_level()) > (l) )           \
+        panic("mm locking order violation: %i > %i\n",  \
+              __get_lock_level(), (l));                 \
+} while(0)
+
+#define __set_lock_level(l)         \
+do {                                \
+    __get_lock_level() = (l);       \
+} while(0)
+
 static inline void _mm_lock(mm_lock_t *l, const char *func, int level, int rec)
 {
-    /* If you see this crash, the numbers printed are lines in this file 
-     * where the offending locks are declared. */
-    if ( unlikely(this_cpu(mm_lock_level) > level) )
-        panic("mm locking order violation: %i > %i\n", 
-              this_cpu(mm_lock_level), level);
+    __check_lock_level(level);
     spin_lock_recursive(&l->lock);
     if ( l->lock.recurse_cnt == 1 )
     {
         l->locker_function = func;
-        l->unlock_level = this_cpu(mm_lock_level);
+        l->unlock_level = __get_lock_level();
     }
     else if ( (unlikely(!rec)) )
         panic("mm lock already held by %s\n", l->locker_function);
-    this_cpu(mm_lock_level) = level;
+    __set_lock_level(level);
 }
 /* This wrapper uses the line number to express the locking order below */
 #define declare_mm_lock(name)                                                 \
@@ -72,7 +83,7 @@ static inline void mm_unlock(mm_lock_t *
     if ( l->lock.recurse_cnt == 1 )
     {
         l->locker_function = "nobody";
-        this_cpu(mm_lock_level) = l->unlock_level;
+        __set_lock_level(l->unlock_level);
     }
     spin_unlock_recursive(&l->lock);
 }

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 19:32:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 19:32:15 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNcQ3-0005TB-1N; Mon, 07 Nov 2011 19:32:15 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNcN2-0004Vr-IG
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 19:29:08 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-9.tower-21.messagelabs.com!1320722943!3192799!1
X-Originating-IP: [208.97.132.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29509 invoked from network); 8 Nov 2011 03:29:04 -0000
Received: from caiajhbdcbhh.dreamhost.com (HELO homiemail-a15.g.dreamhost.com)
	(208.97.132.177) by server-9.tower-21.messagelabs.com with SMTP;
	8 Nov 2011 03:29:04 -0000
Received: from homiemail-a15.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a15.g.dreamhost.com (Postfix) with ESMTP id 0295D76C069;
	Mon,  7 Nov 2011 19:29:02 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id:date
	:from:to:cc; q=dns; s=lagarcavilla.org; b=hL27K0dxijoaMaWAY7ks1G
	dTkiwkFEXL4WxX9DcoConphPua8cMTRRcM8vCql6cgomYvTzqdOx4sx2+dXzDbMW
	AYyrzjv+Zsl3tOIg9Rn3su97La+xmTSzUI3JqEIPzjO+hHnLMkFQb4PccJJFGu1N
	JxbjRFxSaT/yvCkXJkAD4=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:date:from:to:cc; s=lagarcavilla.org; bh=bA2/1HOOIrV8
	MvrvkofaOzOuOcM=; b=mmfgibgrIZQLl3MxLupDD7jNvMw6ov7tfotqS78qxZTl
	cqxnQBPn19mTEvDXuiibz0Ovjj+zao4cFTrfdUS+reofF2+XThoC8HNMsvkokTTt
	VqIOH40zs02vKihLN3higC9keg6DFAsmBXOloUITiJh+e3TKdvK8oKbnCzSBYbg=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a15.g.dreamhost.com (Postfix) with ESMTPSA id 3B66076C065; 
	Mon,  7 Nov 2011 19:29:01 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1320722908@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 07 Nov 2011 22:28:28 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: olaf@aepfle.de, George.Dunlap@eu.citrix.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 0 of 5] p2m synchronization groundwork
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This patch series lays the groundwork for improving the synchronization
of primitives accessing the p2m.

This is a partial repost of the patches emailed previously as a RFC. 
These patches are now intended for committing to the tree.

We change the API for accessing the p2m to a family of functions
get_gfn/put_gfn. The name intends to reflect the fact that even lookups
are meant to obtain exclusive access to a p2m entry, and that said access
should be relinquished (put_gfn) when done.

The patches, however, alter little functionality. The API name change 
does not involve yet additional locking or ref-counting. They will, however,
throw a "barrier" that will force any new commits to conform to the new API.

Patches are based off 24066:54a5e994a241. Should the new XENMEM calls be 
accepted before this, the series needs to be updated to also change the API
there.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

 xen/arch/x86/mm/mm-locks.h         |   27 ++++-
 xen/arch/x86/mm/mm-locks.h         |   46 +++++++++++
 xen/arch/x86/mm/mm-locks.h         |   12 ++
 xen/arch/x86/mm/p2m-pod.c          |   40 ++++++---
 xen/include/asm-x86/domain.h       |    3 +
 xen/include/asm-x86/p2m.h          |    5 +
 xen/arch/x86/mm/p2m.c              |   38 +++++++++
 xen/include/asm-x86/p2m.h          |   40 +---------
 xen/arch/x86/cpu/mcheck/vmce.c     |    9 +-
 xen/arch/x86/debug.c               |   17 ++-
 xen/arch/x86/domain.c              |   27 +++++-
 xen/arch/x86/domctl.c              |   15 ++-
 xen/arch/x86/hvm/emulate.c         |   29 ++++++-
 xen/arch/x86/hvm/hvm.c             |  133 +++++++++++++++++++++++++------
 xen/arch/x86/hvm/mtrr.c            |    2 +-
 xen/arch/x86/hvm/nestedhvm.c       |    2 +-
 xen/arch/x86/hvm/stdvga.c          |    4 +-
 xen/arch/x86/hvm/svm/nestedsvm.c   |   12 +-
 xen/arch/x86/hvm/svm/svm.c         |   11 +-
 xen/arch/x86/hvm/viridian.c        |    8 +-
 xen/arch/x86/hvm/vmx/vmx.c         |   15 ++-
 xen/arch/x86/hvm/vmx/vvmx.c        |   13 ++-
 xen/arch/x86/mm.c                  |  153 +++++++++++++++++++++++++++++-------
 xen/arch/x86/mm/guest_walk.c       |   30 +++++-
 xen/arch/x86/mm/hap/guest_walk.c   |   16 ++-
 xen/arch/x86/mm/hap/nested_hap.c   |   15 ++-
 xen/arch/x86/mm/mem_event.c        |   23 ++++-
 xen/arch/x86/mm/mem_sharing.c      |   27 +++++-
 xen/arch/x86/mm/p2m-pod.c          |   19 ++-
 xen/arch/x86/mm/p2m-pt.c           |    6 +-
 xen/arch/x86/mm/p2m.c              |   34 ++++---
 xen/arch/x86/mm/shadow/common.c    |    6 +-
 xen/arch/x86/mm/shadow/multi.c     |   85 ++++++++++++++-----
 xen/arch/x86/mm/shadow/types.h     |   10 +-
 xen/arch/x86/physdev.c             |    8 +-
 xen/arch/x86/traps.c               |   19 +++-
 xen/common/grant_table.c           |   30 +++++-
 xen/common/memory.c                |   13 ++-
 xen/common/tmem_xen.c              |   21 +++-
 xen/include/asm-ia64/mm.h          |    2 +
 xen/include/asm-x86/guest_pt.h     |    6 +-
 xen/include/asm-x86/hvm/hvm.h      |    5 +-
 xen/include/asm-x86/hvm/vmx/vvmx.h |    1 +
 xen/include/asm-x86/p2m.h          |   38 ++++++--
 44 files changed, 799 insertions(+), 276 deletions(-)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 19:33:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 19:33:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNcR7-0005sD-2v; Mon, 07 Nov 2011 19:33:21 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNcN2-0004Vt-N1
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 19:29:09 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-11.tower-182.messagelabs.com!1320722945!2248806!1
X-Originating-IP: [208.97.132.119]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13928 invoked from network); 8 Nov 2011 03:29:05 -0000
Received: from caiajhbdcbbj.dreamhost.com (HELO homiemail-a15.g.dreamhost.com)
	(208.97.132.119) by server-11.tower-182.messagelabs.com with SMTP;
	8 Nov 2011 03:29:05 -0000
Received: from homiemail-a15.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a15.g.dreamhost.com (Postfix) with ESMTP id C1E2176C073;
	Mon,  7 Nov 2011 19:29:04 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=edwDQf8jht1eoIpgb2PktsVfxBEE3/qtds7aJz5mprJp
	+BOxQBp0ELnRep2W50zjdHJPpzO4gVD0qH0uBLhpcOIRwgFiqGh35pA6gDazwiXo
	jyUP6vVuex8WZ+LoS8dnjdqwGelzue3zJ5Rzt/5Wca4mS2XRz2BMumi96/31LCA=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=FBqnvMrz1kamtL6IYwJa0LbzRs4=; b=HAvXTYac/yr
	fI9e0xjx04eebx10nEngwnpEZPbIHOhb/sE0pOnApPiLUF0WhnwVlJAmf1ejPKeF
	+AQcOlmsLlYY1JBb9aWTxwsXUGzoEafEGfYijGcDNBinsWPlN4XpUJc1ILQ61qNZ
	rgXXZ3orebtv+a9KZy3/mIe8ZvowdrEE=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a15.g.dreamhost.com (Postfix) with ESMTPSA id 0863576C065; 
	Mon,  7 Nov 2011 19:29:03 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 0e8fb21ab4ff46d045375859de0caf6907169183
Message-Id: <0e8fb21ab4ff46d04537.1320722911@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1320722908@xdev.gridcentric.ca>
References: <patchbomb.1320722908@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 07 Nov 2011 22:28:31 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: olaf@aepfle.de, George.Dunlap@eu.citrix.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 3 of 5] Enforce ordering constraints for the
 page alloc lock in the PoD code
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 xen/arch/x86/mm/mm-locks.h   |  12 ++++++++++++
 xen/arch/x86/mm/p2m-pod.c    |  40 +++++++++++++++++++++++++++-------------
 xen/include/asm-x86/domain.h |   3 +++
 xen/include/asm-x86/p2m.h    |   5 +++++
 4 files changed, 47 insertions(+), 13 deletions(-)


The page alloc lock is sometimes used in the PoD code, with an
explicit expectation of ordering. Use our ordering constructs in the
mm layer to enforce this.

The additional book-keeping variables are kept in the arch_domain
sub-struct, as they are x86-specific to the whole domain.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r 81eedccb3a85 -r 0e8fb21ab4ff xen/arch/x86/mm/mm-locks.h
--- a/xen/arch/x86/mm/mm-locks.h
+++ b/xen/arch/x86/mm/mm-locks.h
@@ -174,6 +174,18 @@ declare_mm_lock(p2m)
 #define p2m_unlock(p)         mm_unlock(&(p)->lock)
 #define p2m_locked_by_me(p)   mm_locked_by_me(&(p)->lock)
 
+/* Page alloc lock (per-domain)
+ *
+ * This is an external lock, not represented by an mm_lock_t. However, 
+ * pod code uses it in conjunction with the p2m lock, and expecting
+ * the ordering which we enforce here.
+ * The lock is not recursive. */
+
+declare_mm_order_constraint(page_alloc)
+#define page_alloc_mm_pre_lock()   mm_enforce_order_lock_pre_page_alloc()
+#define page_alloc_mm_post_lock(l) mm_enforce_order_lock_post_page_alloc(&(l), NULL)
+#define page_alloc_mm_unlock(l)    mm_enforce_order_unlock((l), NULL)
+
 /* Paging lock (per-domain)
  *
  * For shadow pagetables, this lock protects
diff -r 81eedccb3a85 -r 0e8fb21ab4ff xen/arch/x86/mm/p2m-pod.c
--- a/xen/arch/x86/mm/p2m-pod.c
+++ b/xen/arch/x86/mm/p2m-pod.c
@@ -45,6 +45,20 @@
 
 #define superpage_aligned(_x)  (((_x)&(SUPERPAGE_PAGES-1))==0)
 
+/* Enforce lock ordering when grabbing the "external" page_alloc lock */
+static inline void lock_page_alloc(struct p2m_domain *p2m)
+{
+    page_alloc_mm_pre_lock();
+    spin_lock(&(p2m->domain->page_alloc_lock));
+    page_alloc_mm_post_lock(p2m->domain->arch.page_alloc_unlock_level);
+}
+
+static inline void unlock_page_alloc(struct p2m_domain *p2m)
+{
+    page_alloc_mm_unlock(p2m->domain->arch.page_alloc_unlock_level);
+    spin_unlock(&(p2m->domain->page_alloc_lock));
+}
+
 /*
  * Populate-on-demand functionality
  */
@@ -100,7 +114,7 @@ p2m_pod_cache_add(struct p2m_domain *p2m
         unmap_domain_page(b);
     }
 
-    spin_lock(&d->page_alloc_lock);
+    lock_page_alloc(p2m);
 
     /* First, take all pages off the domain list */
     for(i=0; i < 1 << order ; i++)
@@ -128,7 +142,7 @@ p2m_pod_cache_add(struct p2m_domain *p2m
      * This may cause "zombie domains" since the page will never be freed. */
     BUG_ON( d->arch.relmem != RELMEM_not_started );
 
-    spin_unlock(&d->page_alloc_lock);
+    unlock_page_alloc(p2m);
 
     return 0;
 }
@@ -245,7 +259,7 @@ p2m_pod_set_cache_target(struct p2m_doma
 
         /* Grab the lock before checking that pod.super is empty, or the last
          * entries may disappear before we grab the lock. */
-        spin_lock(&d->page_alloc_lock);
+        lock_page_alloc(p2m);
 
         if ( (p2m->pod.count - pod_target) > SUPERPAGE_PAGES
              && !page_list_empty(&p2m->pod.super) )
@@ -257,7 +271,7 @@ p2m_pod_set_cache_target(struct p2m_doma
 
         ASSERT(page != NULL);
 
-        spin_unlock(&d->page_alloc_lock);
+        unlock_page_alloc(p2m);
 
         /* Then free them */
         for ( i = 0 ; i < (1 << order) ; i++ )
@@ -378,7 +392,7 @@ p2m_pod_empty_cache(struct domain *d)
     BUG_ON(!d->is_dying);
     spin_barrier(&p2m->lock.lock);
 
-    spin_lock(&d->page_alloc_lock);
+    lock_page_alloc(p2m);
 
     while ( (page = page_list_remove_head(&p2m->pod.super)) )
     {
@@ -403,7 +417,7 @@ p2m_pod_empty_cache(struct domain *d)
 
     BUG_ON(p2m->pod.count != 0);
 
-    spin_unlock(&d->page_alloc_lock);
+    unlock_page_alloc(p2m);
 }
 
 int
@@ -417,7 +431,7 @@ p2m_pod_offline_or_broken_hit(struct pag
     if ( !(d = page_get_owner(p)) || !(p2m = p2m_get_hostp2m(d)) )
         return 0;
 
-    spin_lock(&d->page_alloc_lock);
+    lock_page_alloc(p2m);
     bmfn = mfn_x(page_to_mfn(p));
     page_list_for_each_safe(q, tmp, &p2m->pod.super)
     {
@@ -448,12 +462,12 @@ p2m_pod_offline_or_broken_hit(struct pag
         }
     }
 
-    spin_unlock(&d->page_alloc_lock);
+    unlock_page_alloc(p2m);
     return 0;
 
 pod_hit:
     page_list_add_tail(p, &d->arch.relmem_list);
-    spin_unlock(&d->page_alloc_lock);
+    unlock_page_alloc(p2m);
     return 1;
 }
 
@@ -994,7 +1008,7 @@ p2m_pod_demand_populate(struct p2m_domai
     if ( q == p2m_guest && gfn > p2m->pod.max_guest )
         p2m->pod.max_guest = gfn;
 
-    spin_lock(&d->page_alloc_lock);
+    lock_page_alloc(p2m);
 
     if ( p2m->pod.count == 0 )
         goto out_of_memory;
@@ -1008,7 +1022,7 @@ p2m_pod_demand_populate(struct p2m_domai
 
     BUG_ON((mfn_x(mfn) & ((1 << order)-1)) != 0);
 
-    spin_unlock(&d->page_alloc_lock);
+    unlock_page_alloc(p2m);
 
     gfn_aligned = (gfn >> order) << order;
 
@@ -1040,7 +1054,7 @@ p2m_pod_demand_populate(struct p2m_domai
 
     return 0;
 out_of_memory:
-    spin_unlock(&d->page_alloc_lock);
+    unlock_page_alloc(p2m);
 
     printk("%s: Out of populate-on-demand memory! tot_pages %" PRIu32 " pod_entries %" PRIi32 "\n",
            __func__, d->tot_pages, p2m->pod.entry_count);
@@ -1049,7 +1063,7 @@ out_fail:
     return -1;
 remap_and_retry:
     BUG_ON(order != PAGE_ORDER_2M);
-    spin_unlock(&d->page_alloc_lock);
+    unlock_page_alloc(p2m);
 
     /* Remap this 2-meg region in singleton chunks */
     gfn_aligned = (gfn>>order)<<order;
diff -r 81eedccb3a85 -r 0e8fb21ab4ff xen/include/asm-x86/domain.h
--- a/xen/include/asm-x86/domain.h
+++ b/xen/include/asm-x86/domain.h
@@ -269,6 +269,9 @@ struct arch_domain
 
     struct paging_domain paging;
     struct p2m_domain *p2m;
+    /* To enforce lock ordering in the pod code wrt the 
+     * page_alloc lock */
+    int page_alloc_unlock_level;
 
     /* nestedhvm: translate l2 guest physical to host physical */
     struct p2m_domain *nested_p2m[MAX_NESTEDP2M];
diff -r 81eedccb3a85 -r 0e8fb21ab4ff xen/include/asm-x86/p2m.h
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -270,6 +270,11 @@ struct p2m_domain {
      * + p2m_pod_demand_populate() grabs both; the p2m lock to avoid
      *   double-demand-populating of pages, the page_alloc lock to
      *   protect moving stuff from the PoD cache to the domain page list.
+     *
+     * We enforce this lock ordering through a construct in mm-locks.h.
+     * This demands, however, that we store the previous lock-ordering
+     * level in effect before grabbing the page_alloc lock. The unlock
+     * level is stored in the arch section of the domain struct.
      */
     struct {
         struct page_list_head super,   /* List of superpages                */

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 19:34:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 19:34:17 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNcS1-0006Fa-8J; Mon, 07 Nov 2011 19:34:17 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNcN3-0004Vu-Rg
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 19:29:10 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-4.tower-27.messagelabs.com!1320722920!47551763!1
X-Originating-IP: [208.97.132.202]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15562 invoked from network); 8 Nov 2011 03:28:40 -0000
Received: from caiajhbdccac.dreamhost.com (HELO homiemail-a15.g.dreamhost.com)
	(208.97.132.202) by server-4.tower-27.messagelabs.com with SMTP;
	8 Nov 2011 03:28:40 -0000
Received: from homiemail-a15.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a15.g.dreamhost.com (Postfix) with ESMTP id AB0A176C069;
	Mon,  7 Nov 2011 19:29:05 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=a9wnlDQdi+p/R/37+Spps2xGBi/qywrKlDmunjgreD1s
	Gm/SH6KJVX4QPTJnlyLNomajbL26D3qJ0zHJMJO1+ygr5D3eB8e1YxF3F8EAoUPE
	FuOvfUZ8GZmG9yh+h+hN5oteg0VCtB5zRy3ZLv2jLnmEcBmafYHAdZ+fY0VMRFM=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=aPIJRyZF6f/hj+EmRhQpJZ76FNQ=; b=CONPEY7RsOG
	SFVPob8M0pZxyzjGESFTZoJop4KvKC+gh+S+qxSyGgaIiXgm4HKMD4jm2WzF7dH7
	fg8KFWNggfadlr4NNq3CUrTGKK7iaBH/ClT7lgzbiW3sQNZtvcifGyyBBrKgMgU+
	Ire07BOODKoCBdiwJ5bfgDiran49J918=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a15.g.dreamhost.com (Postfix) with ESMTPSA id F07DF76C065; 
	Mon,  7 Nov 2011 19:29:04 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: f07d4ebe5248a79faf44e8ae4fb1defa64d720b0
Message-Id: <f07d4ebe5248a79faf44.1320722912@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1320722908@xdev.gridcentric.ca>
References: <patchbomb.1320722908@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 07 Nov 2011 22:28:32 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: olaf@aepfle.de, George.Dunlap@eu.citrix.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 4 of 5] Refactor p2m get_entry accessor
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 xen/arch/x86/mm/p2m.c     |  38 ++++++++++++++++++++++++++++++++++++++
 xen/include/asm-x86/p2m.h |  40 ++--------------------------------------
 2 files changed, 40 insertions(+), 38 deletions(-)


Move the main query accessor to the p2m outside of an inline and into the
p2m code itself. This will allow for p2m internal locking to be added
to the accessor later.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r 0e8fb21ab4ff -r f07d4ebe5248 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -144,6 +144,44 @@ void p2m_change_entry_type_global(struct
     p2m_unlock(p2m);
 }
 
+mfn_t gfn_to_mfn_type_p2m(struct p2m_domain *p2m, unsigned long gfn,
+                    p2m_type_t *t, p2m_access_t *a, p2m_query_t q,
+                    unsigned int *page_order)
+{
+    mfn_t mfn;
+
+    if ( !p2m || !paging_mode_translate(p2m->domain) )
+    {
+        /* Not necessarily true, but for non-translated guests, we claim
+         * it's the most generic kind of memory */
+        *t = p2m_ram_rw;
+        return _mfn(gfn);
+    }
+
+    mfn = p2m->get_entry(p2m, gfn, t, a, q, page_order);
+
+#ifdef __x86_64__
+    if ( q == p2m_unshare && p2m_is_shared(*t) )
+    {
+        ASSERT(!p2m_is_nestedp2m(p2m));
+        mem_sharing_unshare_page(p2m->domain, gfn, 0);
+        mfn = p2m->get_entry(p2m, gfn, t, a, q, page_order);
+    }
+#endif
+
+#ifdef __x86_64__
+    if (unlikely((p2m_is_broken(*t))))
+    {
+        /* Return invalid_mfn to avoid caller's access */
+        mfn = _mfn(INVALID_MFN);
+        if (q == p2m_guest)
+            domain_crash(p2m->domain);
+    }
+#endif
+
+    return mfn;
+}
+
 int set_p2m_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn, 
                   unsigned int page_order, p2m_type_t p2mt, p2m_access_t p2ma)
 {
diff -r 0e8fb21ab4ff -r f07d4ebe5248 xen/include/asm-x86/p2m.h
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -313,45 +313,9 @@ struct p2m_domain *p2m_get_p2m(struct vc
  * If the lookup succeeds, the return value is != INVALID_MFN and 
  * *page_order is filled in with the order of the superpage (if any) that
  * the entry was found in.  */
-static inline mfn_t
-gfn_to_mfn_type_p2m(struct p2m_domain *p2m, unsigned long gfn,
+mfn_t gfn_to_mfn_type_p2m(struct p2m_domain *p2m, unsigned long gfn,
                     p2m_type_t *t, p2m_access_t *a, p2m_query_t q,
-                    unsigned int *page_order)
-{
-    mfn_t mfn;
-
-    if ( !p2m || !paging_mode_translate(p2m->domain) )
-    {
-        /* Not necessarily true, but for non-translated guests, we claim
-         * it's the most generic kind of memory */
-        *t = p2m_ram_rw;
-        return _mfn(gfn);
-    }
-
-    mfn = p2m->get_entry(p2m, gfn, t, a, q, page_order);
-
-#ifdef __x86_64__
-    if ( q == p2m_unshare && p2m_is_shared(*t) )
-    {
-        ASSERT(!p2m_is_nestedp2m(p2m));
-        mem_sharing_unshare_page(p2m->domain, gfn, 0);
-        mfn = p2m->get_entry(p2m, gfn, t, a, q, page_order);
-    }
-#endif
-
-#ifdef __x86_64__
-    if (unlikely((p2m_is_broken(*t))))
-    {
-        /* Return invalid_mfn to avoid caller's access */
-        mfn = _mfn(INVALID_MFN);
-        if (q == p2m_guest)
-            domain_crash(p2m->domain);
-    }
-#endif
-
-    return mfn;
-}
-
+                    unsigned int *page_order);
 
 /* General conversion function from gfn to mfn */
 static inline mfn_t gfn_to_mfn_type(struct domain *d,

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 19:35:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 19:35:53 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNcTY-0006is-Vs; Mon, 07 Nov 2011 19:35:53 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNcN6-0004WF-6c
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 19:29:15 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-15.tower-216.messagelabs.com!1320722947!2650851!1
X-Originating-IP: [208.97.132.145]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21017 invoked from network); 8 Nov 2011 03:29:08 -0000
Received: from caiajhbdcbef.dreamhost.com (HELO homiemail-a15.g.dreamhost.com)
	(208.97.132.145) by server-15.tower-216.messagelabs.com with SMTP;
	8 Nov 2011 03:29:08 -0000
Received: from homiemail-a15.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a15.g.dreamhost.com (Postfix) with ESMTP id 1A27A76C06E;
	Mon,  7 Nov 2011 19:29:07 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=Y7Pqoycl6pZeaYKf1FFd8GYbsSDKXdUeqbkgLfcH0nOQ
	Fu407sik4pp9fwoKoHyhY8giOsFBBSXOmFp46x2lIdpyA1XgnQ1kYinDpAQYuhP4
	Qx5rSqisG3chWXSTDpnT8XR9AAaN+4FDQWTxCFLkERfXGRqL4UkmbE6uAhKW/Ec=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=6Fx5mSCocz4Q3SCnH4l7LnrrvRA=; b=SFhVOzTEYLB
	pooozf0vw3uR92mYssz3d2tTbj0JLqsYac43whSrUgU7cmt8wXOgNgoX/ctjOwtm
	PpZk1S6ITbdso2qqI81pPpWAyq2jeeJUEq2gDt2riPLCfWmqBcazUUrGiSTa9z9C
	QYMbIP2nysMCurrtrDCxmwbS2ZKun8w8=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a15.g.dreamhost.com (Postfix) with ESMTPSA id DAA1B76C065; 
	Mon,  7 Nov 2011 19:29:05 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: e9fd07479f684f558a921238abb099d28b25c867
Message-Id: <e9fd07479f684f558a92.1320722913@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1320722908@xdev.gridcentric.ca>
References: <patchbomb.1320722908@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 07 Nov 2011 22:28:33 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: olaf@aepfle.de, George.Dunlap@eu.citrix.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 5 of 5] Modify naming of queries into the p2m
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 xen/arch/x86/cpu/mcheck/vmce.c     |    9 +-
 xen/arch/x86/debug.c               |   17 ++-
 xen/arch/x86/domain.c              |   27 +++++-
 xen/arch/x86/domctl.c              |   15 ++-
 xen/arch/x86/hvm/emulate.c         |   29 ++++++-
 xen/arch/x86/hvm/hvm.c             |  133 +++++++++++++++++++++++++------
 xen/arch/x86/hvm/mtrr.c            |    2 +-
 xen/arch/x86/hvm/nestedhvm.c       |    2 +-
 xen/arch/x86/hvm/stdvga.c          |    4 +-
 xen/arch/x86/hvm/svm/nestedsvm.c   |   12 +-
 xen/arch/x86/hvm/svm/svm.c         |   11 +-
 xen/arch/x86/hvm/viridian.c        |    8 +-
 xen/arch/x86/hvm/vmx/vmx.c         |   15 ++-
 xen/arch/x86/hvm/vmx/vvmx.c        |   13 ++-
 xen/arch/x86/mm.c                  |  153 +++++++++++++++++++++++++++++-------
 xen/arch/x86/mm/guest_walk.c       |   30 +++++-
 xen/arch/x86/mm/hap/guest_walk.c   |   16 ++-
 xen/arch/x86/mm/hap/nested_hap.c   |   15 ++-
 xen/arch/x86/mm/mem_event.c        |   23 ++++-
 xen/arch/x86/mm/mem_sharing.c      |   27 +++++-
 xen/arch/x86/mm/p2m-pod.c          |   19 ++-
 xen/arch/x86/mm/p2m-pt.c           |    6 +-
 xen/arch/x86/mm/p2m.c              |   34 ++++---
 xen/arch/x86/mm/shadow/common.c    |    6 +-
 xen/arch/x86/mm/shadow/multi.c     |   85 ++++++++++++++-----
 xen/arch/x86/mm/shadow/types.h     |   10 +-
 xen/arch/x86/physdev.c             |    8 +-
 xen/arch/x86/traps.c               |   19 +++-
 xen/common/grant_table.c           |   30 +++++-
 xen/common/memory.c                |   13 ++-
 xen/common/tmem_xen.c              |   21 +++-
 xen/include/asm-ia64/mm.h          |    2 +
 xen/include/asm-x86/guest_pt.h     |    6 +-
 xen/include/asm-x86/hvm/hvm.h      |    5 +-
 xen/include/asm-x86/hvm/vmx/vvmx.h |    1 +
 xen/include/asm-x86/p2m.h          |   38 ++++++--
 36 files changed, 647 insertions(+), 217 deletions(-)


Callers of lookups into the p2m code are now variants of get_gfn. All
callers need to call put_gfn. The code behind it is a no-op at the
moment, but will change to proper locking in a later patch.

This patch does not change functionality. Only naming, and adds
put_gfn's.

set_p2m_entry retains its name because it is always called with
p2m_lock held.

This patch is humongous, unfortunately, given the dozens of call sites
involved.

After this patch, anyone using old style gfn_to_mfn will not succeed
in compiling their code. This is on purpose: adapt to the new API.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/cpu/mcheck/vmce.c
--- a/xen/arch/x86/cpu/mcheck/vmce.c
+++ b/xen/arch/x86/cpu/mcheck/vmce.c
@@ -574,6 +574,7 @@ int unmmap_broken_page(struct domain *d,
 {
     mfn_t r_mfn;
     p2m_type_t pt;
+    int rc;
 
     /* Always trust dom0's MCE handler will prevent future access */
     if ( d == dom0 )
@@ -585,14 +586,16 @@ int unmmap_broken_page(struct domain *d,
     if ( !is_hvm_domain(d) || !paging_mode_hap(d) )
         return -ENOSYS;
 
-    r_mfn = gfn_to_mfn_query(d, gfn, &pt);
+    rc = -1;
+    r_mfn = get_gfn_query(d, gfn, &pt);
     if ( p2m_to_mask(pt) & P2M_UNMAP_TYPES)
     {
         ASSERT(mfn_x(r_mfn) == mfn_x(mfn));
         p2m_change_type(d, gfn, pt, p2m_ram_broken);
-        return 0;
+        rc = 0;
     }
+    put_gfn(d, gfn);
 
-    return -1;
+    return rc;
 }
 
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/debug.c
--- a/xen/arch/x86/debug.c
+++ b/xen/arch/x86/debug.c
@@ -43,22 +43,23 @@
 
 /* Returns: mfn for the given (hvm guest) vaddr */
 static unsigned long 
-dbg_hvm_va2mfn(dbgva_t vaddr, struct domain *dp, int toaddr)
+dbg_hvm_va2mfn(dbgva_t vaddr, struct domain *dp, int toaddr,
+                unsigned long *gfn)
 {
-    unsigned long mfn, gfn;
+    unsigned long mfn;
     uint32_t pfec = PFEC_page_present;
     p2m_type_t gfntype;
 
     DBGP2("vaddr:%lx domid:%d\n", vaddr, dp->domain_id);
 
-    gfn = paging_gva_to_gfn(dp->vcpu[0], vaddr, &pfec);
-    if ( gfn == INVALID_GFN )
+    *gfn = paging_gva_to_gfn(dp->vcpu[0], vaddr, &pfec);
+    if ( *gfn == INVALID_GFN )
     {
         DBGP2("kdb:bad gfn from gva_to_gfn\n");
         return INVALID_MFN;
     }
 
-    mfn = mfn_x(gfn_to_mfn(dp, gfn, &gfntype)); 
+    mfn = mfn_x(get_gfn(dp, *gfn, &gfntype)); 
     if ( p2m_is_readonly(gfntype) && toaddr )
     {
         DBGP2("kdb:p2m_is_readonly: gfntype:%x\n", gfntype);
@@ -193,12 +194,12 @@ dbg_rw_guest_mem(dbgva_t addr, dbgbyte_t
     while ( len > 0 )
     {
         char *va;
-        unsigned long mfn, pagecnt;
+        unsigned long mfn, gfn = INVALID_GFN, pagecnt;
 
         pagecnt = min_t(long, PAGE_SIZE - (addr & ~PAGE_MASK), len);
 
         mfn = (dp->is_hvm
-               ? dbg_hvm_va2mfn(addr, dp, toaddr)
+               ? dbg_hvm_va2mfn(addr, dp, toaddr, &gfn)
                : dbg_pv_va2mfn(addr, dp, pgd3));
         if ( mfn == INVALID_MFN ) 
             break;
@@ -217,6 +218,8 @@ dbg_rw_guest_mem(dbgva_t addr, dbgbyte_t
         }
 
         unmap_domain_page(va);
+        if ( gfn != INVALID_GFN )
+            put_gfn(dp, gfn);
 
         addr += pagecnt;
         buf += pagecnt;
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -720,6 +720,7 @@ int arch_set_info_guest(
     struct vcpu *v, vcpu_guest_context_u c)
 {
     struct domain *d = v->domain;
+    unsigned long cr3_gfn;
     unsigned long cr3_pfn = INVALID_MFN;
     unsigned long flags, cr4;
     unsigned int i;
@@ -931,7 +932,8 @@ int arch_set_info_guest(
 
     if ( !compat )
     {
-        cr3_pfn = gmfn_to_mfn(d, xen_cr3_to_pfn(c.nat->ctrlreg[3]));
+        cr3_gfn = xen_cr3_to_pfn(c.nat->ctrlreg[3]);
+        cr3_pfn = get_gfn_untyped(d, cr3_gfn);
 
         if ( !mfn_valid(cr3_pfn) ||
              (paging_mode_refcounts(d)
@@ -939,16 +941,18 @@ int arch_set_info_guest(
               : !get_page_and_type(mfn_to_page(cr3_pfn), d,
                                    PGT_base_page_table)) )
         {
+            put_gfn(d, cr3_gfn);
             destroy_gdt(v);
             return -EINVAL;
         }
 
         v->arch.guest_table = pagetable_from_pfn(cr3_pfn);
-
+        put_gfn(d, cr3_gfn);
 #ifdef __x86_64__
         if ( c.nat->ctrlreg[1] )
         {
-            cr3_pfn = gmfn_to_mfn(d, xen_cr3_to_pfn(c.nat->ctrlreg[1]));
+            cr3_gfn = xen_cr3_to_pfn(c.nat->ctrlreg[1]);
+            cr3_pfn = get_gfn_untyped(d, cr3_gfn);
 
             if ( !mfn_valid(cr3_pfn) ||
                  (paging_mode_refcounts(d)
@@ -962,11 +966,13 @@ int arch_set_info_guest(
                     put_page(mfn_to_page(cr3_pfn));
                 else
                     put_page_and_type(mfn_to_page(cr3_pfn));
+                put_gfn(d, cr3_gfn); 
                 destroy_gdt(v);
                 return -EINVAL;
             }
 
             v->arch.guest_table_user = pagetable_from_pfn(cr3_pfn);
+            put_gfn(d, cr3_gfn); 
         }
         else if ( !(flags & VGCF_in_kernel) )
         {
@@ -978,7 +984,8 @@ int arch_set_info_guest(
     {
         l4_pgentry_t *l4tab;
 
-        cr3_pfn = gmfn_to_mfn(d, compat_cr3_to_pfn(c.cmp->ctrlreg[3]));
+        cr3_gfn = compat_cr3_to_pfn(c.cmp->ctrlreg[3]);
+        cr3_pfn = get_gfn_untyped(d, cr3_gfn);
 
         if ( !mfn_valid(cr3_pfn) ||
              (paging_mode_refcounts(d)
@@ -986,6 +993,7 @@ int arch_set_info_guest(
               : !get_page_and_type(mfn_to_page(cr3_pfn), d,
                                    PGT_l3_page_table)) )
         {
+            put_gfn(d, cr3_gfn); 
             destroy_gdt(v);
             return -EINVAL;
         }
@@ -993,6 +1001,7 @@ int arch_set_info_guest(
         l4tab = __va(pagetable_get_paddr(v->arch.guest_table));
         *l4tab = l4e_from_pfn(
             cr3_pfn, _PAGE_PRESENT|_PAGE_RW|_PAGE_USER|_PAGE_ACCESSED);
+        put_gfn(d, cr3_gfn); 
 #endif
     }
 
@@ -1058,11 +1067,12 @@ unmap_vcpu_info(struct vcpu *v)
  * event doesn't get missed.
  */
 static int
-map_vcpu_info(struct vcpu *v, unsigned long mfn, unsigned offset)
+map_vcpu_info(struct vcpu *v, unsigned long gfn, unsigned offset)
 {
     struct domain *d = v->domain;
     void *mapping;
     vcpu_info_t *new_info;
+    unsigned long mfn;
     int i;
 
     if ( offset > (PAGE_SIZE - sizeof(vcpu_info_t)) )
@@ -1075,15 +1085,19 @@ map_vcpu_info(struct vcpu *v, unsigned l
     if ( (v != current) && !test_bit(_VPF_down, &v->pause_flags) )
         return -EINVAL;
 
-    mfn = gmfn_to_mfn(d, mfn);
+    mfn = get_gfn_untyped(d, gfn);
     if ( !mfn_valid(mfn) ||
          !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
+    {
+        put_gfn(d, gfn); 
         return -EINVAL;
+    }
 
     mapping = map_domain_page_global(mfn);
     if ( mapping == NULL )
     {
         put_page_and_type(mfn_to_page(mfn));
+        put_gfn(d, gfn); 
         return -ENOMEM;
     }
 
@@ -1113,6 +1127,7 @@ map_vcpu_info(struct vcpu *v, unsigned l
     for ( i = 0; i < BITS_PER_EVTCHN_WORD(d); i++ )
         set_bit(i, &vcpu_info(v, evtchn_pending_sel));
 
+    put_gfn(d, gfn); 
     return 0;
 }
 
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/domctl.c
--- a/xen/arch/x86/domctl.c
+++ b/xen/arch/x86/domctl.c
@@ -199,7 +199,7 @@ long arch_do_domctl(
 
                 for ( j = 0; j < k; j++ )
                 {
-                    unsigned long type = 0, mfn = gmfn_to_mfn(d, arr[j]);
+                    unsigned long type = 0, mfn = get_gfn_untyped(d, arr[j]);
 
                     page = mfn_to_page(mfn);
 
@@ -235,6 +235,7 @@ long arch_do_domctl(
                         type = XEN_DOMCTL_PFINFO_XTAB;
 
                     arr[j] = type;
+                    put_gfn(d, arr[j]);
                 }
 
                 if ( copy_to_guest_offset(domctl->u.getpageframeinfo3.array,
@@ -299,7 +300,8 @@ long arch_do_domctl(
             for ( j = 0; j < k; j++ )
             {      
                 struct page_info *page;
-                unsigned long mfn = gmfn_to_mfn(d, arr32[j]);
+                unsigned long gfn = arr32[j];
+                unsigned long mfn = get_gfn_untyped(d, gfn);
 
                 page = mfn_to_page(mfn);
 
@@ -310,8 +312,10 @@ long arch_do_domctl(
                      unlikely(is_xen_heap_mfn(mfn)) )
                     arr32[j] |= XEN_DOMCTL_PFINFO_XTAB;
                 else if ( xsm_getpageframeinfo(page) != 0 )
+                {
+                    put_gfn(d, gfn); 
                     continue;
-                else if ( likely(get_page(page, d)) )
+                } else if ( likely(get_page(page, d)) )
                 {
                     unsigned long type = 0;
 
@@ -339,6 +343,7 @@ long arch_do_domctl(
                 else
                     arr32[j] |= XEN_DOMCTL_PFINFO_XTAB;
 
+                put_gfn(d, gfn); 
             }
 
             if ( copy_to_guest_offset(domctl->u.getpageframeinfo2.array,
@@ -425,12 +430,13 @@ long arch_do_domctl(
             break;
         }
 
-        mfn = gmfn_to_mfn(d, gmfn);
+        mfn = get_gfn_untyped(d, gmfn);
 
         ret = -EACCES;
         if ( !mfn_valid(mfn) ||
              !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
         {
+            put_gfn(d, gmfn); 
             rcu_unlock_domain(d);
             break;
         }
@@ -443,6 +449,7 @@ long arch_do_domctl(
 
         put_page_and_type(mfn_to_page(mfn));
 
+        put_gfn(d, gmfn); 
         rcu_unlock_domain(d);
     }
     break;
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/hvm/emulate.c
--- a/xen/arch/x86/hvm/emulate.c
+++ b/xen/arch/x86/hvm/emulate.c
@@ -63,14 +63,18 @@ static int hvmemul_do_io(
     int rc;
 
     /* Check for paged out page */
-    ram_mfn = gfn_to_mfn_unshare(curr->domain, ram_gfn, &p2mt);
+    ram_mfn = get_gfn_unshare(curr->domain, ram_gfn, &p2mt);
     if ( p2m_is_paging(p2mt) )
     {
         p2m_mem_paging_populate(curr->domain, ram_gfn);
+        put_gfn(curr->domain, ram_gfn); 
         return X86EMUL_RETRY;
     }
     if ( p2m_is_shared(p2mt) )
+    {
+        put_gfn(curr->domain, ram_gfn); 
         return X86EMUL_RETRY;
+    }
 
     /*
      * Weird-sized accesses have undefined behaviour: we discard writes
@@ -82,6 +86,7 @@ static int hvmemul_do_io(
         ASSERT(p_data != NULL); /* cannot happen with a REP prefix */
         if ( dir == IOREQ_READ )
             memset(p_data, ~0, size);
+        put_gfn(curr->domain, ram_gfn); 
         return X86EMUL_UNHANDLEABLE;
     }
 
@@ -101,7 +106,10 @@ static int hvmemul_do_io(
             paddr_t pa = vio->mmio_large_write_pa;
             unsigned int bytes = vio->mmio_large_write_bytes;
             if ( (addr >= pa) && ((addr + size) <= (pa + bytes)) )
+            {
+                put_gfn(curr->domain, ram_gfn); 
                 return X86EMUL_OKAY;
+            }
         }
         else
         {
@@ -111,6 +119,7 @@ static int hvmemul_do_io(
             {
                 memcpy(p_data, &vio->mmio_large_read[addr - pa],
                        size);
+                put_gfn(curr->domain, ram_gfn); 
                 return X86EMUL_OKAY;
             }
         }
@@ -123,15 +132,22 @@ static int hvmemul_do_io(
     case HVMIO_completed:
         vio->io_state = HVMIO_none;
         if ( p_data == NULL )
+        {
+            put_gfn(curr->domain, ram_gfn);
             return X86EMUL_UNHANDLEABLE;
+        }
         goto finish_access;
     case HVMIO_dispatched:
         /* May have to wait for previous cycle of a multi-write to complete. */
         if ( is_mmio && !value_is_ptr && (dir == IOREQ_WRITE) &&
              (addr == (vio->mmio_large_write_pa +
                        vio->mmio_large_write_bytes)) )
+        {
+            put_gfn(curr->domain, ram_gfn);
             return X86EMUL_RETRY;
+        }
     default:
+        put_gfn(curr->domain, ram_gfn);
         return X86EMUL_UNHANDLEABLE;
     }
 
@@ -139,6 +155,7 @@ static int hvmemul_do_io(
     {
         gdprintk(XENLOG_WARNING, "WARNING: io already pending (%d)?\n",
                  p->state);
+        put_gfn(curr->domain, ram_gfn); 
         return X86EMUL_UNHANDLEABLE;
     }
 
@@ -189,7 +206,10 @@ static int hvmemul_do_io(
     }
 
     if ( rc != X86EMUL_OKAY )
+    {
+        put_gfn(curr->domain, ram_gfn); 
         return rc;
+    }
 
  finish_access:
     if ( p_data != NULL )
@@ -223,6 +243,7 @@ static int hvmemul_do_io(
         }
     }
 
+    put_gfn(curr->domain, ram_gfn); 
     return X86EMUL_OKAY;
 }
 
@@ -671,12 +692,14 @@ static int hvmemul_rep_movs(
     if ( rc != X86EMUL_OKAY )
         return rc;
 
-    (void)gfn_to_mfn(current->domain, sgpa >> PAGE_SHIFT, &p2mt);
+    /* Unlocked works here because we get_gfn for real in whatever
+     * we call later. */
+    (void)get_gfn_unlocked(current->domain, sgpa >> PAGE_SHIFT, &p2mt);
     if ( !p2m_is_ram(p2mt) && !p2m_is_grant(p2mt) )
         return hvmemul_do_mmio(
             sgpa, reps, bytes_per_rep, dgpa, IOREQ_READ, df, NULL);
 
-    (void)gfn_to_mfn(current->domain, dgpa >> PAGE_SHIFT, &p2mt);
+    (void)get_gfn_unlocked(current->domain, dgpa >> PAGE_SHIFT, &p2mt);
     if ( !p2m_is_ram(p2mt) && !p2m_is_grant(p2mt) )
         return hvmemul_do_mmio(
             dgpa, reps, bytes_per_rep, sgpa, IOREQ_WRITE, df, NULL);
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -355,26 +355,37 @@ static int hvm_set_ioreq_page(
     unsigned long mfn;
     void *va;
 
-    mfn = mfn_x(gfn_to_mfn_unshare(d, gmfn, &p2mt));
+    mfn = mfn_x(get_gfn_unshare(d, gmfn, &p2mt));
     if ( !p2m_is_ram(p2mt) )
+    {
+        put_gfn(d, gmfn);
         return -EINVAL;
+    }
     if ( p2m_is_paging(p2mt) )
     {
         p2m_mem_paging_populate(d, gmfn);
+        put_gfn(d, gmfn);
         return -ENOENT;
     }
     if ( p2m_is_shared(p2mt) )
+    {
+        put_gfn(d, gmfn);
         return -ENOENT;
+    }
     ASSERT(mfn_valid(mfn));
 
     page = mfn_to_page(mfn);
     if ( !get_page_and_type(page, d, PGT_writable_page) )
+    {
+        put_gfn(d, gmfn);
         return -EINVAL;
+    }
 
     va = map_domain_page_global(mfn);
     if ( va == NULL )
     {
         put_page_and_type(page);
+        put_gfn(d, gmfn);
         return -ENOMEM;
     }
 
@@ -385,6 +396,7 @@ static int hvm_set_ioreq_page(
         spin_unlock(&iorp->lock);
         unmap_domain_page_global(va);
         put_page_and_type(mfn_to_page(mfn));
+        put_gfn(d, gmfn);
         return -EINVAL;
     }
 
@@ -392,6 +404,7 @@ static int hvm_set_ioreq_page(
     iorp->page = page;
 
     spin_unlock(&iorp->lock);
+    put_gfn(d, gmfn);
 
     domain_unpause(d);
 
@@ -1182,6 +1195,7 @@ int hvm_hap_nested_page_fault(unsigned l
     mfn_t mfn;
     struct vcpu *v = current;
     struct p2m_domain *p2m;
+    int rc;
 
     /* On Nested Virtualization, walk the guest page table.
      * If this succeeds, all is fine.
@@ -1255,8 +1269,8 @@ int hvm_hap_nested_page_fault(unsigned l
         if ( violation )
         {
             p2m_mem_access_check(gpa, gla_valid, gla, access_r, access_w, access_x);
-
-            return 1;
+            rc = 1;
+            goto out_put_gfn;
         }
     }
 
@@ -1268,7 +1282,8 @@ int hvm_hap_nested_page_fault(unsigned l
     {
         if ( !handle_mmio() )
             hvm_inject_exception(TRAP_gp_fault, 0, 0);
-        return 1;
+        rc = 1;
+        goto out_put_gfn;
     }
 
 #ifdef __x86_64__
@@ -1281,7 +1296,8 @@ int hvm_hap_nested_page_fault(unsigned l
     {
         ASSERT(!p2m_is_nestedp2m(p2m));
         mem_sharing_unshare_page(p2m->domain, gfn, 0);
-        return 1;
+        rc = 1;
+        goto out_put_gfn;
     }
 #endif
  
@@ -1295,7 +1311,8 @@ int hvm_hap_nested_page_fault(unsigned l
          */
         paging_mark_dirty(v->domain, mfn_x(mfn));
         p2m_change_type(v->domain, gfn, p2m_ram_logdirty, p2m_ram_rw);
-        return 1;
+        rc = 1;
+        goto out_put_gfn;
     }
 
     /* Shouldn't happen: Maybe the guest was writing to a r/o grant mapping? */
@@ -1304,10 +1321,14 @@ int hvm_hap_nested_page_fault(unsigned l
         gdprintk(XENLOG_WARNING,
                  "trying to write to read-only grant mapping\n");
         hvm_inject_exception(TRAP_gp_fault, 0, 0);
-        return 1;
+        rc = 1;
+        goto out_put_gfn;
     }
 
-    return 0;
+    rc = 0;
+out_put_gfn:
+    put_gfn(p2m->domain, gfn);
+    return rc;
 }
 
 int hvm_handle_xsetbv(u64 new_bv)
@@ -1530,10 +1551,11 @@ int hvm_set_cr0(unsigned long value)
         {
             /* The guest CR3 must be pointing to the guest physical. */
             gfn = v->arch.hvm_vcpu.guest_cr[3]>>PAGE_SHIFT;
-            mfn = mfn_x(gfn_to_mfn(v->domain, gfn, &p2mt));
+            mfn = mfn_x(get_gfn(v->domain, gfn, &p2mt));
             if ( !p2m_is_ram(p2mt) || !mfn_valid(mfn) ||
                  !get_page(mfn_to_page(mfn), v->domain))
             {
+                put_gfn(v->domain, gfn);
                 gdprintk(XENLOG_ERR, "Invalid CR3 value = %lx (mfn=%lx)\n",
                          v->arch.hvm_vcpu.guest_cr[3], mfn);
                 domain_crash(v->domain);
@@ -1545,6 +1567,7 @@ int hvm_set_cr0(unsigned long value)
 
             HVM_DBG_LOG(DBG_LEVEL_VMMU, "Update CR3 value = %lx, mfn = %lx",
                         v->arch.hvm_vcpu.guest_cr[3], mfn);
+            put_gfn(v->domain, gfn);
         }
     }
     else if ( !(value & X86_CR0_PG) && (old_value & X86_CR0_PG) )
@@ -1621,13 +1644,17 @@ int hvm_set_cr3(unsigned long value)
     {
         /* Shadow-mode CR3 change. Check PDBR and update refcounts. */
         HVM_DBG_LOG(DBG_LEVEL_VMMU, "CR3 value = %lx", value);
-        mfn = mfn_x(gfn_to_mfn(v->domain, value >> PAGE_SHIFT, &p2mt));
+        mfn = mfn_x(get_gfn(v->domain, value >> PAGE_SHIFT, &p2mt));
         if ( !p2m_is_ram(p2mt) || !mfn_valid(mfn) ||
              !get_page(mfn_to_page(mfn), v->domain) )
+        {
+              put_gfn(v->domain, value >> PAGE_SHIFT);
               goto bad_cr3;
+        }
 
         put_page(pagetable_get_page(v->arch.guest_table));
         v->arch.guest_table = pagetable_from_pfn(mfn);
+        put_gfn(v->domain, value >> PAGE_SHIFT);
 
         HVM_DBG_LOG(DBG_LEVEL_VMMU, "Update CR3 value = %lx", value);
     }
@@ -1764,6 +1791,8 @@ int hvm_virtual_to_linear_addr(
     return 0;
 }
 
+/* We leave this function holding a lock on the p2m entry and a ref
+ * on the mapped mfn */
 static void *__hvm_map_guest_frame(unsigned long gfn, bool_t writable)
 {
     unsigned long mfn;
@@ -1771,13 +1800,17 @@ static void *__hvm_map_guest_frame(unsig
     struct domain *d = current->domain;
 
     mfn = mfn_x(writable
-                ? gfn_to_mfn_unshare(d, gfn, &p2mt)
-                : gfn_to_mfn(d, gfn, &p2mt));
+                ? get_gfn_unshare(d, gfn, &p2mt)
+                : get_gfn(d, gfn, &p2mt));
     if ( (p2m_is_shared(p2mt) && writable) || !p2m_is_ram(p2mt) )
+    {
+        put_gfn(d, gfn);
         return NULL;
+    }
     if ( p2m_is_paging(p2mt) )
     {
         p2m_mem_paging_populate(d, gfn);
+        put_gfn(d, gfn);
         return NULL;
     }
 
@@ -1799,10 +1832,33 @@ void *hvm_map_guest_frame_ro(unsigned lo
     return __hvm_map_guest_frame(gfn, 0);
 }
 
-void hvm_unmap_guest_frame(void *p)
+void hvm_unmap_guest_frame(void *p, unsigned long addr, int is_va)
 {
+    /* We enter this function with a map obtained in __hvm_map_guest_frame.
+     * This map performed a p2m query that locked the gfn entry and got
+     * a ref on the mfn. Must undo */
     if ( p )
+    {
+        unsigned long gfn = INVALID_GFN;
+
+        if ( is_va )
+        {
+            if ( addr )
+            {
+                uint32_t pfec = PFEC_page_present;
+                gfn = paging_gva_to_gfn(current, addr, &pfec);
+            } else {
+                gfn = INVALID_GFN;
+            }
+        } else {
+            gfn = addr;
+        }
+
+        if ( gfn != INVALID_GFN )
+            put_gfn(current->domain, gfn);
+
         unmap_domain_page(p);
+    }
 }
 
 static void *hvm_map_entry(unsigned long va)
@@ -1839,9 +1895,9 @@ static void *hvm_map_entry(unsigned long
     return NULL;
 }
 
-static void hvm_unmap_entry(void *p)
+static void hvm_unmap_entry(void *p, unsigned long va)
 {
-    hvm_unmap_guest_frame(p);
+    hvm_unmap_guest_frame(p, va, 1);
 }
 
 static int hvm_load_segment_selector(
@@ -1853,6 +1909,7 @@ static int hvm_load_segment_selector(
     int fault_type = TRAP_invalid_tss;
     struct cpu_user_regs *regs = guest_cpu_user_regs();
     struct vcpu *v = current;
+    unsigned long va_desc;
 
     if ( regs->eflags & X86_EFLAGS_VM )
     {
@@ -1886,7 +1943,8 @@ static int hvm_load_segment_selector(
     if ( ((sel & 0xfff8) + 7) > desctab.limit )
         goto fail;
 
-    pdesc = hvm_map_entry(desctab.base + (sel & 0xfff8));
+    va_desc = desctab.base + (sel & 0xfff8);
+    pdesc = hvm_map_entry(va_desc);
     if ( pdesc == NULL )
         goto hvm_map_fail;
 
@@ -1946,7 +2004,7 @@ static int hvm_load_segment_selector(
     desc.b |= 0x100;
 
  skip_accessed_flag:
-    hvm_unmap_entry(pdesc);
+    hvm_unmap_entry(pdesc, va_desc);
 
     segr.base = (((desc.b <<  0) & 0xff000000u) |
                  ((desc.b << 16) & 0x00ff0000u) |
@@ -1962,7 +2020,7 @@ static int hvm_load_segment_selector(
     return 0;
 
  unmap_and_fail:
-    hvm_unmap_entry(pdesc);
+    hvm_unmap_entry(pdesc, va_desc);
  fail:
     hvm_inject_exception(fault_type, sel & 0xfffc, 0);
  hvm_map_fail:
@@ -1977,7 +2035,7 @@ void hvm_task_switch(
     struct cpu_user_regs *regs = guest_cpu_user_regs();
     struct segment_register gdt, tr, prev_tr, segr;
     struct desc_struct *optss_desc = NULL, *nptss_desc = NULL, tss_desc;
-    unsigned long eflags;
+    unsigned long eflags, va_optss = 0, va_nptss = 0;
     int exn_raised, rc;
     struct {
         u16 back_link,__blh;
@@ -2003,11 +2061,13 @@ void hvm_task_switch(
         goto out;
     }
 
-    optss_desc = hvm_map_entry(gdt.base + (prev_tr.sel & 0xfff8));
+    va_optss = gdt.base + (prev_tr.sel & 0xfff8);
+    optss_desc = hvm_map_entry(va_optss);
     if ( optss_desc == NULL )
         goto out;
 
-    nptss_desc = hvm_map_entry(gdt.base + (tss_sel & 0xfff8));
+    va_nptss = gdt.base + (tss_sel & 0xfff8);
+    nptss_desc = hvm_map_entry(va_nptss);
     if ( nptss_desc == NULL )
         goto out;
 
@@ -2172,8 +2232,8 @@ void hvm_task_switch(
     }
 
  out:
-    hvm_unmap_entry(optss_desc);
-    hvm_unmap_entry(nptss_desc);
+    hvm_unmap_entry(optss_desc, va_optss);
+    hvm_unmap_entry(nptss_desc, va_nptss);
 }
 
 #define HVMCOPY_from_guest (0u<<0)
@@ -2230,19 +2290,29 @@ static enum hvm_copy_result __hvm_copy(
             gfn = addr >> PAGE_SHIFT;
         }
 
-        mfn = mfn_x(gfn_to_mfn_unshare(curr->domain, gfn, &p2mt));
+        mfn = mfn_x(get_gfn_unshare(curr->domain, gfn, &p2mt));
 
         if ( p2m_is_paging(p2mt) )
         {
             p2m_mem_paging_populate(curr->domain, gfn);
+            put_gfn(curr->domain, gfn);
             return HVMCOPY_gfn_paged_out;
         }
         if ( p2m_is_shared(p2mt) )
+        {
+            put_gfn(curr->domain, gfn);
             return HVMCOPY_gfn_shared;
+        }
         if ( p2m_is_grant(p2mt) )
+        {
+            put_gfn(curr->domain, gfn);
             return HVMCOPY_unhandleable;
+        }
         if ( !p2m_is_ram(p2mt) )
+        {
+            put_gfn(curr->domain, gfn);
             return HVMCOPY_bad_gfn_to_mfn;
+        }
         ASSERT(mfn_valid(mfn));
 
         p = (char *)map_domain_page(mfn) + (addr & ~PAGE_MASK);
@@ -2273,6 +2343,7 @@ static enum hvm_copy_result __hvm_copy(
         addr += count;
         buf  += count;
         todo -= count;
+        put_gfn(curr->domain, gfn);
     }
 
     return HVMCOPY_okay;
@@ -3690,11 +3761,11 @@ long do_hvm_op(unsigned long op, XEN_GUE
         for ( pfn = a.first_pfn; pfn < a.first_pfn + a.nr; pfn++ )
         {
             p2m_type_t t;
-            mfn_t mfn = gfn_to_mfn(d, pfn, &t);
+            mfn_t mfn = get_gfn(d, pfn, &t);
             if ( p2m_is_paging(t) )
             {
                 p2m_mem_paging_populate(d, pfn);
-
+                put_gfn(d, pfn);
                 rc = -EINVAL;
                 goto param_fail3;
             }
@@ -3709,6 +3780,7 @@ long do_hvm_op(unsigned long op, XEN_GUE
                 /* don't take a long time and don't die either */
                 sh_remove_shadows(d->vcpu[0], mfn, 1, 0);
             }
+            put_gfn(d, pfn);
         }
 
     param_fail3:
@@ -3732,7 +3804,7 @@ long do_hvm_op(unsigned long op, XEN_GUE
         rc = -EINVAL;
         if ( is_hvm_domain(d) )
         {
-            gfn_to_mfn_unshare(d, a.pfn, &t);
+            get_gfn_unshare_unlocked(d, a.pfn, &t);
             if ( p2m_is_mmio(t) )
                 a.mem_type =  HVMMEM_mmio_dm;
             else if ( p2m_is_readonly(t) )
@@ -3785,20 +3857,23 @@ long do_hvm_op(unsigned long op, XEN_GUE
             p2m_type_t t;
             p2m_type_t nt;
             mfn_t mfn;
-            mfn = gfn_to_mfn_unshare(d, pfn, &t);
+            mfn = get_gfn_unshare(d, pfn, &t);
             if ( p2m_is_paging(t) )
             {
                 p2m_mem_paging_populate(d, pfn);
+                put_gfn(d, pfn);
                 rc = -EINVAL;
                 goto param_fail4;
             }
             if ( p2m_is_shared(t) )
             {
+                put_gfn(d, pfn);
                 rc = -EINVAL;
                 goto param_fail4;
             } 
             if ( p2m_is_grant(t) )
             {
+                put_gfn(d, pfn);
                 gdprintk(XENLOG_WARNING,
                          "type for pfn 0x%lx changed to grant while "
                          "we were working?\n", pfn);
@@ -3809,6 +3884,7 @@ long do_hvm_op(unsigned long op, XEN_GUE
                 nt = p2m_change_type(d, pfn, t, memtype[a.hvmmem_type]);
                 if ( nt != t )
                 {
+                    put_gfn(d, pfn);
                     gdprintk(XENLOG_WARNING,
                              "type of pfn 0x%lx changed from %d to %d while "
                              "we were trying to change it to %d\n",
@@ -3816,6 +3892,7 @@ long do_hvm_op(unsigned long op, XEN_GUE
                     goto param_fail4;
                 }
             }
+            put_gfn(d, pfn);
         }
 
         rc = 0;
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/hvm/mtrr.c
--- a/xen/arch/x86/hvm/mtrr.c
+++ b/xen/arch/x86/hvm/mtrr.c
@@ -389,7 +389,7 @@ uint32_t get_pat_flags(struct vcpu *v,
     {
         struct domain *d = v->domain;
         p2m_type_t p2mt;
-        gfn_to_mfn_query(d, paddr_to_pfn(gpaddr), &p2mt);
+        get_gfn_query_unlocked(d, paddr_to_pfn(gpaddr), &p2mt);
         if (p2m_is_ram(p2mt))
             gdprintk(XENLOG_WARNING,
                     "Conflict occurs for a given guest l1e flags:%x "
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/hvm/nestedhvm.c
--- a/xen/arch/x86/hvm/nestedhvm.c
+++ b/xen/arch/x86/hvm/nestedhvm.c
@@ -56,7 +56,7 @@ nestedhvm_vcpu_reset(struct vcpu *v)
     nv->nv_ioportED = 0;
 
     if (nv->nv_vvmcx)
-        hvm_unmap_guest_frame(nv->nv_vvmcx);
+        hvm_unmap_guest_frame(nv->nv_vvmcx, nv->nv_vvmcxaddr >> PAGE_SHIFT, 0);
     nv->nv_vvmcx = NULL;
     nv->nv_vvmcxaddr = VMCX_EADDR;
     nv->nv_flushp2m = 0;
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/hvm/stdvga.c
--- a/xen/arch/x86/hvm/stdvga.c
+++ b/xen/arch/x86/hvm/stdvga.c
@@ -482,7 +482,7 @@ static int mmio_move(struct hvm_hw_stdvg
                 if ( hvm_copy_to_guest_phys(data, &tmp, p->size) !=
                      HVMCOPY_okay )
                 {
-                    (void)gfn_to_mfn(d, data >> PAGE_SHIFT, &p2mt);
+                    (void)get_gfn_unlocked(d, data >> PAGE_SHIFT, &p2mt);
                     /*
                      * The only case we handle is vga_mem <-> vga_mem.
                      * Anything else disables caching and leaves it to qemu-dm.
@@ -504,7 +504,7 @@ static int mmio_move(struct hvm_hw_stdvg
                 if ( hvm_copy_from_guest_phys(&tmp, data, p->size) !=
                      HVMCOPY_okay )
                 {
-                    (void)gfn_to_mfn(d, data >> PAGE_SHIFT, &p2mt);
+                    (void)get_gfn_unlocked(d, data >> PAGE_SHIFT, &p2mt);
                     if ( (p2mt != p2m_mmio_dm) || (data < VGA_MEM_BASE) ||
                          ((data + p->size) > (VGA_MEM_BASE + VGA_MEM_SIZE)) )
                         return 0;
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/hvm/svm/nestedsvm.c
--- a/xen/arch/x86/hvm/svm/nestedsvm.c
+++ b/xen/arch/x86/hvm/svm/nestedsvm.c
@@ -71,7 +71,7 @@ int nestedsvm_vmcb_map(struct vcpu *v, u
     if (nv->nv_vvmcx != NULL && nv->nv_vvmcxaddr != vmcbaddr) {
         ASSERT(nv->nv_vvmcx != NULL);
         ASSERT(nv->nv_vvmcxaddr != VMCX_EADDR);
-        hvm_unmap_guest_frame(nv->nv_vvmcx);
+        hvm_unmap_guest_frame(nv->nv_vvmcx, nv->nv_vvmcxaddr >> PAGE_SHIFT, 0);
         nv->nv_vvmcx = NULL;
         nv->nv_vvmcxaddr = VMCX_EADDR;
     }
@@ -353,7 +353,7 @@ static int nsvm_vmrun_permissionmap(stru
     ASSERT(ns_viomap != NULL);
     ioport_80 = test_bit(0x80, ns_viomap);
     ioport_ed = test_bit(0xed, ns_viomap);
-    hvm_unmap_guest_frame(ns_viomap);
+    hvm_unmap_guest_frame(ns_viomap, svm->ns_iomap_pa >> PAGE_SHIFT, 0);
 
     svm->ns_iomap = nestedhvm_vcpu_iomap_get(ioport_80, ioport_ed);
 
@@ -857,23 +857,25 @@ nsvm_vmcb_guest_intercepts_ioio(paddr_t 
     ioio_info_t ioinfo;
     uint16_t port;
     bool_t enabled;
+    unsigned long gfn = 0; /* gcc ... */
 
     ioinfo.bytes = exitinfo1;
     port = ioinfo.fields.port;
 
     switch (port) {
     case 0 ... 32767: /* first 4KB page */
-        io_bitmap = hvm_map_guest_frame_ro(iopm_gfn);
+        gfn = iopm_gfn;
         break;
     case 32768 ... 65535: /* second 4KB page */
         port -= 32768;
-        io_bitmap = hvm_map_guest_frame_ro(iopm_gfn+1);
+        gfn = iopm_gfn + 1;
         break;
     default:
         BUG();
         break;
     }
 
+    io_bitmap = hvm_map_guest_frame_ro(gfn);
     if (io_bitmap == NULL) {
         gdprintk(XENLOG_ERR,
             "IOIO intercept: mapping of permission map failed\n");
@@ -881,7 +883,7 @@ nsvm_vmcb_guest_intercepts_ioio(paddr_t 
     }
 
     enabled = test_bit(port, io_bitmap);
-    hvm_unmap_guest_frame(io_bitmap);
+    hvm_unmap_guest_frame(io_bitmap, gfn, 0);
     if (!enabled)
         return NESTEDHVM_VMEXIT_HOST;
 
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -244,9 +244,10 @@ static int svm_vmcb_restore(struct vcpu 
     {
         if ( c->cr0 & X86_CR0_PG )
         {
-            mfn = mfn_x(gfn_to_mfn(v->domain, c->cr3 >> PAGE_SHIFT, &p2mt));
+            mfn = mfn_x(get_gfn(v->domain, c->cr3 >> PAGE_SHIFT, &p2mt));
             if ( !p2m_is_ram(p2mt) || !get_page(mfn_to_page(mfn), v->domain) )
             {
+                put_gfn(v->domain, c->cr3 >> PAGE_SHIFT);
                 gdprintk(XENLOG_ERR, "Invalid CR3 value=0x%"PRIx64"\n",
                          c->cr3);
                 return -EINVAL;
@@ -257,6 +258,8 @@ static int svm_vmcb_restore(struct vcpu 
             put_page(pagetable_get_page(v->arch.guest_table));
 
         v->arch.guest_table = pagetable_from_pfn(mfn);
+        if ( c->cr0 & X86_CR0_PG )
+            put_gfn(v->domain, c->cr3 >> PAGE_SHIFT);
     }
 
     v->arch.hvm_vcpu.guest_cr[0] = c->cr0 | X86_CR0_ET;
@@ -1144,7 +1147,6 @@ static void svm_do_nested_pgfault(struct
     unsigned long gfn = gpa >> PAGE_SHIFT;
     mfn_t mfn;
     p2m_type_t p2mt;
-    p2m_access_t p2ma;
     struct p2m_domain *p2m = NULL;
 
     ret = hvm_hap_nested_page_fault(gpa, 0, ~0ul, 0, 0, 0, 0);
@@ -1161,7 +1163,8 @@ static void svm_do_nested_pgfault(struct
         p2m = p2m_get_p2m(v);
         _d.gpa = gpa;
         _d.qualification = 0;
-        _d.mfn = mfn_x(gfn_to_mfn_type_p2m(p2m, gfn, &_d.p2mt, &p2ma, p2m_query, NULL));
+        mfn = get_gfn_query_unlocked(p2m->domain, gfn, &_d.p2mt);
+        _d.mfn = mfn_x(mfn);
         
         __trace_var(TRC_HVM_NPF, 0, sizeof(_d), &_d);
     }
@@ -1181,7 +1184,7 @@ static void svm_do_nested_pgfault(struct
     if ( p2m == NULL )
         p2m = p2m_get_p2m(v);
     /* Everything else is an error. */
-    mfn = gfn_to_mfn_type_p2m(p2m, gfn, &p2mt, &p2ma, p2m_guest, NULL);
+    mfn = get_gfn_guest_unlocked(p2m->domain, gfn, &p2mt);
     gdprintk(XENLOG_ERR,
          "SVM violation gpa %#"PRIpaddr", mfn %#lx, type %i\n",
          gpa, mfn_x(mfn), p2mt);
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/hvm/viridian.c
--- a/xen/arch/x86/hvm/viridian.c
+++ b/xen/arch/x86/hvm/viridian.c
@@ -134,12 +134,13 @@ void dump_apic_assist(struct vcpu *v)
 static void enable_hypercall_page(struct domain *d)
 {
     unsigned long gmfn = d->arch.hvm_domain.viridian.hypercall_gpa.fields.pfn;
-    unsigned long mfn = gmfn_to_mfn(d, gmfn);
+    unsigned long mfn = get_gfn_untyped(d, gmfn);
     uint8_t *p;
 
     if ( !mfn_valid(mfn) ||
          !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
     {
+        put_gfn(d, gmfn); 
         gdprintk(XENLOG_WARNING, "Bad GMFN %lx (MFN %lx)\n", gmfn, mfn);
         return;
     }
@@ -162,13 +163,14 @@ static void enable_hypercall_page(struct
     unmap_domain_page(p);
 
     put_page_and_type(mfn_to_page(mfn));
+    put_gfn(d, gmfn); 
 }
 
 void initialize_apic_assist(struct vcpu *v)
 {
     struct domain *d = v->domain;
     unsigned long gmfn = v->arch.hvm_vcpu.viridian.apic_assist.fields.pfn;
-    unsigned long mfn = gmfn_to_mfn(d, gmfn);
+    unsigned long mfn = get_gfn_untyped(d, gmfn);
     uint8_t *p;
 
     /*
@@ -184,6 +186,7 @@ void initialize_apic_assist(struct vcpu 
     if ( !mfn_valid(mfn) ||
          !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
     {
+        put_gfn(d, gmfn); 
         gdprintk(XENLOG_WARNING, "Bad GMFN %lx (MFN %lx)\n", gmfn, mfn);
         return;
     }
@@ -195,6 +198,7 @@ void initialize_apic_assist(struct vcpu 
     unmap_domain_page(p);
 
     put_page_and_type(mfn_to_page(mfn));
+    put_gfn(d, gmfn); 
 }
 
 int wrmsr_viridian_regs(uint32_t idx, uint64_t val)
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -487,9 +487,10 @@ static int vmx_restore_cr0_cr3(
     {
         if ( cr0 & X86_CR0_PG )
         {
-            mfn = mfn_x(gfn_to_mfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt));
+            mfn = mfn_x(get_gfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt));
             if ( !p2m_is_ram(p2mt) || !get_page(mfn_to_page(mfn), v->domain) )
             {
+                put_gfn(v->domain, cr3 >> PAGE_SHIFT);
                 gdprintk(XENLOG_ERR, "Invalid CR3 value=0x%lx\n", cr3);
                 return -EINVAL;
             }
@@ -499,6 +500,8 @@ static int vmx_restore_cr0_cr3(
             put_page(pagetable_get_page(v->arch.guest_table));
 
         v->arch.guest_table = pagetable_from_pfn(mfn);
+        if ( cr0 & X86_CR0_PG )
+            put_gfn(v->domain, cr3 >> PAGE_SHIFT);
     }
 
     v->arch.hvm_vcpu.guest_cr[0] = cr0 | X86_CR0_ET;
@@ -1007,9 +1010,12 @@ static void vmx_load_pdptrs(struct vcpu 
     if ( cr3 & 0x1fUL )
         goto crash;
 
-    mfn = mfn_x(gfn_to_mfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt));
+    mfn = mfn_x(get_gfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt));
     if ( !p2m_is_ram(p2mt) )
+    {
+        put_gfn(v->domain, cr3 >> PAGE_SHIFT);
         goto crash;
+    }
 
     p = map_domain_page(mfn);
 
@@ -1037,6 +1043,7 @@ static void vmx_load_pdptrs(struct vcpu 
     vmx_vmcs_exit(v);
 
     unmap_domain_page(p);
+    put_gfn(v->domain, cr3 >> PAGE_SHIFT);
     return;
 
  crash:
@@ -2088,7 +2095,7 @@ static void ept_handle_violation(unsigne
 
         _d.gpa = gpa;
         _d.qualification = qualification;
-        _d.mfn = mfn_x(gfn_to_mfn_query(d, gfn, &_d.p2mt));
+        _d.mfn = mfn_x(get_gfn_query_unlocked(d, gfn, &_d.p2mt));
         
         __trace_var(TRC_HVM_NPF, 0, sizeof(_d), &_d);
     }
@@ -2104,7 +2111,7 @@ static void ept_handle_violation(unsigne
         return;
 
     /* Everything else is an error. */
-    mfn = gfn_to_mfn_guest(d, gfn, &p2mt);
+    mfn = get_gfn_guest_unlocked(d, gfn, &p2mt);
     gdprintk(XENLOG_ERR, "EPT violation %#lx (%c%c%c/%c%c%c), "
              "gpa %#"PRIpaddr", mfn %#lx, type %i.\n", 
              qualification, 
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/hvm/vmx/vvmx.c
--- a/xen/arch/x86/hvm/vmx/vvmx.c
+++ b/xen/arch/x86/hvm/vmx/vvmx.c
@@ -558,8 +558,10 @@ static void __map_io_bitmap(struct vcpu 
 
     index = vmcs_reg == IO_BITMAP_A ? 0 : 1;
     if (nvmx->iobitmap[index])
-        hvm_unmap_guest_frame (nvmx->iobitmap[index]);
+        hvm_unmap_guest_frame (nvmx->iobitmap[index], 
+                               nvmx->iobitmap_gfn[index], 0);
     gpa = __get_vvmcs(vcpu_nestedhvm(v).nv_vvmcx, vmcs_reg);
+    nvmx->iobitmap_gfn[index] = gpa >> PAGE_SHIFT;
     nvmx->iobitmap[index] = hvm_map_guest_frame_ro (gpa >> PAGE_SHIFT);
 }
 
@@ -577,13 +579,16 @@ static void nvmx_purge_vvmcs(struct vcpu
 
     __clear_current_vvmcs(v);
     if ( nvcpu->nv_vvmcxaddr != VMCX_EADDR )
-        hvm_unmap_guest_frame (nvcpu->nv_vvmcx);
+        hvm_unmap_guest_frame(nvcpu->nv_vvmcx, 
+                                nvcpu->nv_vvmcxaddr >> PAGE_SHIFT, 0);
     nvcpu->nv_vvmcx == NULL;
     nvcpu->nv_vvmcxaddr = VMCX_EADDR;
     for (i=0; i<2; i++) {
         if ( nvmx->iobitmap[i] ) {
-            hvm_unmap_guest_frame (nvmx->iobitmap[i]);
+            hvm_unmap_guest_frame(nvmx->iobitmap[i], 
+                                    nvmx->iobitmap_gfn[i], 0);
             nvmx->iobitmap[i] = NULL;
+            nvmx->iobitmap_gfn[i] = 0;
         }
     }
 }
@@ -1198,7 +1203,7 @@ int nvmx_handle_vmclear(struct cpu_user_
         vvmcs = hvm_map_guest_frame_rw(gpa >> PAGE_SHIFT);
         if ( vvmcs ) 
             __set_vvmcs(vvmcs, NVMX_LAUNCH_STATE, 0);
-        hvm_unmap_guest_frame(vvmcs);
+        hvm_unmap_guest_frame(vvmcs, gpa >> PAGE_SHIFT, 0);
     }
 
     vmreturn(regs, VMSUCCEED);
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -663,13 +663,19 @@ int map_ldt_shadow_page(unsigned int off
         return 0;
 
     gmfn = l1e_get_pfn(l1e);
-    mfn = gmfn_to_mfn(d, gmfn);
+    mfn = get_gfn_untyped(d, gmfn);
     if ( unlikely(!mfn_valid(mfn)) )
+    {
+        put_gfn(d, gmfn); 
         return 0;
+    }
 
     okay = get_page_and_type(mfn_to_page(mfn), d, PGT_seg_desc_page);
     if ( unlikely(!okay) )
+    {
+        put_gfn(d, gmfn); 
         return 0;
+    }
 
     nl1e = l1e_from_pfn(mfn, l1e_get_flags(l1e) | _PAGE_RW);
 
@@ -678,6 +684,7 @@ int map_ldt_shadow_page(unsigned int off
     v->arch.pv_vcpu.shadow_ldt_mapcnt++;
     spin_unlock(&v->arch.pv_vcpu.shadow_ldt_lock);
 
+    put_gfn(d, gmfn); 
     return 1;
 }
 
@@ -1798,7 +1805,6 @@ static int mod_l1_entry(l1_pgentry_t *pl
 {
     l1_pgentry_t ol1e;
     struct domain *pt_dom = pt_vcpu->domain;
-    unsigned long mfn;
     p2m_type_t p2mt;
     int rc = 0;
 
@@ -1815,9 +1821,14 @@ static int mod_l1_entry(l1_pgentry_t *pl
     if ( l1e_get_flags(nl1e) & _PAGE_PRESENT )
     {
         /* Translate foreign guest addresses. */
-        mfn = mfn_x(gfn_to_mfn(pg_dom, l1e_get_pfn(nl1e), &p2mt));
+        unsigned long mfn, gfn;
+        gfn = l1e_get_pfn(nl1e);
+        mfn = mfn_x(get_gfn(pg_dom, gfn, &p2mt));
         if ( !p2m_is_ram(p2mt) || unlikely(mfn == INVALID_MFN) )
+        {
+            put_gfn(pg_dom, gfn);
             return -EINVAL;
+        }
         ASSERT((mfn & ~(PADDR_MASK >> PAGE_SHIFT)) == 0);
         nl1e = l1e_from_pfn(mfn, l1e_get_flags(nl1e));
 
@@ -1825,6 +1836,7 @@ static int mod_l1_entry(l1_pgentry_t *pl
         {
             MEM_LOG("Bad L1 flags %x",
                     l1e_get_flags(nl1e) & l1_disallow_mask(pt_dom));
+            put_gfn(pg_dom, gfn);
             return -EINVAL;
         }
 
@@ -1835,12 +1847,14 @@ static int mod_l1_entry(l1_pgentry_t *pl
             if ( UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, pt_vcpu,
                               preserve_ad) )
                 return 0;
+            put_gfn(pg_dom, gfn);
             return -EBUSY;
         }
 
         switch ( rc = get_page_from_l1e(nl1e, pt_dom, pg_dom) )
         {
         default:
+            put_gfn(pg_dom, gfn);
             return rc;
         case 0:
             break;
@@ -1856,6 +1870,7 @@ static int mod_l1_entry(l1_pgentry_t *pl
             ol1e = nl1e;
             rc = -EBUSY;
         }
+        put_gfn(pg_dom, gfn);
     }
     else if ( unlikely(!UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, pt_vcpu,
                                      preserve_ad)) )
@@ -3023,7 +3038,7 @@ int do_mmuext_op(
             if ( paging_mode_refcounts(pg_owner) )
                 break;
 
-            mfn = gmfn_to_mfn(pg_owner, op.arg1.mfn);
+            mfn = get_gfn_untyped(pg_owner, op.arg1.mfn);
             rc = get_page_and_type_from_pagenr(mfn, type, pg_owner, 0, 1);
             okay = !rc;
             if ( unlikely(!okay) )
@@ -3032,6 +3047,7 @@ int do_mmuext_op(
                     rc = -EAGAIN;
                 else if ( rc != -EAGAIN )
                     MEM_LOG("Error while pinning mfn %lx", mfn);
+                put_gfn(pg_owner, op.arg1.mfn);
                 break;
             }
 
@@ -3040,6 +3056,7 @@ int do_mmuext_op(
             if ( (rc = xsm_memory_pin_page(d, page)) != 0 )
             {
                 put_page_and_type(page);
+                put_gfn(pg_owner, op.arg1.mfn);
                 okay = 0;
                 break;
             }
@@ -3049,6 +3066,7 @@ int do_mmuext_op(
             {
                 MEM_LOG("Mfn %lx already pinned", mfn);
                 put_page_and_type(page);
+                put_gfn(pg_owner, op.arg1.mfn);
                 okay = 0;
                 break;
             }
@@ -3067,6 +3085,7 @@ int do_mmuext_op(
                 spin_unlock(&pg_owner->page_alloc_lock);
                 if ( drop_ref )
                     put_page_and_type(page);
+                put_gfn(pg_owner, op.arg1.mfn);
             }
 
             break;
@@ -3079,9 +3098,10 @@ int do_mmuext_op(
             if ( paging_mode_refcounts(pg_owner) )
                 break;
 
-            mfn = gmfn_to_mfn(pg_owner, op.arg1.mfn);
+            mfn = get_gfn_untyped(pg_owner, op.arg1.mfn);
             if ( unlikely(!(okay = get_page_from_pagenr(mfn, pg_owner))) )
             {
+                put_gfn(pg_owner, op.arg1.mfn);
                 MEM_LOG("Mfn %lx bad domain", mfn);
                 break;
             }
@@ -3092,6 +3112,7 @@ int do_mmuext_op(
             {
                 okay = 0;
                 put_page(page);
+                put_gfn(pg_owner, op.arg1.mfn);
                 MEM_LOG("Mfn %lx not pinned", mfn);
                 break;
             }
@@ -3102,18 +3123,20 @@ int do_mmuext_op(
             /* A page is dirtied when its pin status is cleared. */
             paging_mark_dirty(pg_owner, mfn);
 
+            put_gfn(pg_owner, op.arg1.mfn);
             break;
         }
 
         case MMUEXT_NEW_BASEPTR:
-            okay = new_guest_cr3(gmfn_to_mfn(d, op.arg1.mfn));
+            okay = new_guest_cr3(get_gfn_untyped(d, op.arg1.mfn));
+            put_gfn(d, op.arg1.mfn);
             break;
         
 #ifdef __x86_64__
         case MMUEXT_NEW_USER_BASEPTR: {
             unsigned long old_mfn, mfn;
 
-            mfn = gmfn_to_mfn(d, op.arg1.mfn);
+            mfn = get_gfn_untyped(d, op.arg1.mfn);
             if ( mfn != 0 )
             {
                 if ( paging_mode_refcounts(d) )
@@ -3123,6 +3146,7 @@ int do_mmuext_op(
                         mfn, PGT_root_page_table, d, 0, 0);
                 if ( unlikely(!okay) )
                 {
+                    put_gfn(d, op.arg1.mfn);
                     MEM_LOG("Error while installing new mfn %lx", mfn);
                     break;
                 }
@@ -3130,6 +3154,7 @@ int do_mmuext_op(
 
             old_mfn = pagetable_get_pfn(curr->arch.guest_table_user);
             curr->arch.guest_table_user = pagetable_from_pfn(mfn);
+            put_gfn(d, op.arg1.mfn);
 
             if ( old_mfn != 0 )
             {
@@ -3247,11 +3272,12 @@ int do_mmuext_op(
             unsigned long mfn;
             unsigned char *ptr;
 
-            mfn = gmfn_to_mfn(d, op.arg1.mfn);
+            mfn = get_gfn_untyped(d, op.arg1.mfn);
             okay = !get_page_and_type_from_pagenr(
                 mfn, PGT_writable_page, d, 0, 0);
             if ( unlikely(!okay) )
             {
+                put_gfn(d, op.arg1.mfn);
                 MEM_LOG("Error while clearing mfn %lx", mfn);
                 break;
             }
@@ -3264,6 +3290,7 @@ int do_mmuext_op(
             fixunmap_domain_page(ptr);
 
             put_page_and_type(mfn_to_page(mfn));
+            put_gfn(d, op.arg1.mfn);
             break;
         }
 
@@ -3273,20 +3300,23 @@ int do_mmuext_op(
             unsigned char *dst;
             unsigned long src_mfn, mfn;
 
-            src_mfn = gmfn_to_mfn(d, op.arg2.src_mfn);
+            src_mfn = get_gfn_untyped(d, op.arg2.src_mfn);
             okay = get_page_from_pagenr(src_mfn, d);
             if ( unlikely(!okay) )
             {
+                put_gfn(d, op.arg2.src_mfn);
                 MEM_LOG("Error while copying from mfn %lx", src_mfn);
                 break;
             }
 
-            mfn = gmfn_to_mfn(d, op.arg1.mfn);
+            mfn = get_gfn_untyped(d, op.arg1.mfn);
             okay = !get_page_and_type_from_pagenr(
                 mfn, PGT_writable_page, d, 0, 0);
             if ( unlikely(!okay) )
             {
+                put_gfn(d, op.arg1.mfn);
                 put_page(mfn_to_page(src_mfn));
+                put_gfn(d, op.arg2.src_mfn);
                 MEM_LOG("Error while copying to mfn %lx", mfn);
                 break;
             }
@@ -3301,7 +3331,9 @@ int do_mmuext_op(
             unmap_domain_page(src);
 
             put_page_and_type(mfn_to_page(mfn));
+            put_gfn(d, op.arg1.mfn);
             put_page(mfn_to_page(src_mfn));
+            put_gfn(d, op.arg2.src_mfn);
             break;
         }
 
@@ -3489,14 +3521,14 @@ int do_mmu_update(
 
             req.ptr -= cmd;
             gmfn = req.ptr >> PAGE_SHIFT;
-            mfn = mfn_x(gfn_to_mfn(pt_owner, gmfn, &p2mt));
+            mfn = mfn_x(get_gfn(pt_owner, gmfn, &p2mt));
             if ( !p2m_is_valid(p2mt) )
-              mfn = INVALID_MFN;
+                mfn = INVALID_MFN;
 
             if ( p2m_is_paged(p2mt) )
             {
                 p2m_mem_paging_populate(pg_owner, gmfn);
-
+                put_gfn(pt_owner, gmfn);
                 rc = -ENOENT;
                 break;
             }
@@ -3504,6 +3536,7 @@ int do_mmu_update(
             if ( unlikely(!get_page_from_pagenr(mfn, pt_owner)) )
             {
                 MEM_LOG("Could not get page for normal update");
+                put_gfn(pt_owner, gmfn);
                 break;
             }
 
@@ -3516,6 +3549,7 @@ int do_mmu_update(
             if ( rc ) {
                 unmap_domain_page_with_cache(va, &mapcache);
                 put_page(page);
+                put_gfn(pt_owner, gmfn);
                 break;
             }
 
@@ -3527,16 +3561,20 @@ int do_mmu_update(
                 {
                     l1_pgentry_t l1e = l1e_from_intpte(req.val);
                     p2m_type_t l1e_p2mt;
-                    gfn_to_mfn(pg_owner, l1e_get_pfn(l1e), &l1e_p2mt);
+                    unsigned long l1egfn = l1e_get_pfn(l1e), l1emfn;
+    
+                    l1emfn = mfn_x(get_gfn(pg_owner, l1egfn, &l1e_p2mt));
 
                     if ( p2m_is_paged(l1e_p2mt) )
                     {
                         p2m_mem_paging_populate(pg_owner, l1e_get_pfn(l1e));
+                        put_gfn(pg_owner, l1egfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_paging_in_start == l1e_p2mt && !mfn_valid(mfn) )
                     {
+                        put_gfn(pg_owner, l1egfn);
                         rc = -ENOENT;
                         break;
                     }
@@ -3553,7 +3591,10 @@ int do_mmu_update(
                                                           l1e_get_pfn(l1e), 
                                                           0);
                             if ( rc )
+                            {
+                                put_gfn(pg_owner, l1egfn);
                                 break; 
+                            }
                         }
                     } 
 #endif
@@ -3561,27 +3602,33 @@ int do_mmu_update(
                     rc = mod_l1_entry(va, l1e, mfn,
                                       cmd == MMU_PT_UPDATE_PRESERVE_AD, v,
                                       pg_owner);
+                    put_gfn(pg_owner, l1egfn);
                 }
                 break;
                 case PGT_l2_page_table:
                 {
                     l2_pgentry_t l2e = l2e_from_intpte(req.val);
                     p2m_type_t l2e_p2mt;
-                    gfn_to_mfn(pg_owner, l2e_get_pfn(l2e), &l2e_p2mt);
+                    unsigned long l2egfn = l2e_get_pfn(l2e), l2emfn;
+
+                    l2emfn = mfn_x(get_gfn(pg_owner, l2egfn, &l2e_p2mt));
 
                     if ( p2m_is_paged(l2e_p2mt) )
                     {
-                        p2m_mem_paging_populate(pg_owner, l2e_get_pfn(l2e));
+                        p2m_mem_paging_populate(pg_owner, l2egfn);
+                        put_gfn(pg_owner, l2egfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_paging_in_start == l2e_p2mt && !mfn_valid(mfn) )
                     {
+                        put_gfn(pg_owner, l2egfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_shared == l2e_p2mt )
                     {
+                        put_gfn(pg_owner, l2egfn);
                         MEM_LOG("Unexpected attempt to map shared page.\n");
                         break;
                     }
@@ -3589,33 +3636,40 @@ int do_mmu_update(
 
                     rc = mod_l2_entry(va, l2e, mfn,
                                       cmd == MMU_PT_UPDATE_PRESERVE_AD, v);
+                    put_gfn(pg_owner, l2egfn);
                 }
                 break;
                 case PGT_l3_page_table:
                 {
                     l3_pgentry_t l3e = l3e_from_intpte(req.val);
                     p2m_type_t l3e_p2mt;
-                    gfn_to_mfn(pg_owner, l3e_get_pfn(l3e), &l3e_p2mt);
+                    unsigned long l3egfn = l3e_get_pfn(l3e), l3emfn;
+
+                    l3emfn = mfn_x(get_gfn(pg_owner, l3egfn, &l3e_p2mt));
 
                     if ( p2m_is_paged(l3e_p2mt) )
                     {
-                        p2m_mem_paging_populate(pg_owner, l3e_get_pfn(l3e));
+                        p2m_mem_paging_populate(pg_owner, l3egfn);
+                        put_gfn(pg_owner, l3egfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_paging_in_start == l3e_p2mt && !mfn_valid(mfn) )
                     {
+                        put_gfn(pg_owner, l3egfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_shared == l3e_p2mt )
                     {
+                        put_gfn(pg_owner, l3egfn);
                         MEM_LOG("Unexpected attempt to map shared page.\n");
                         break;
                     }
 
                     rc = mod_l3_entry(va, l3e, mfn,
                                       cmd == MMU_PT_UPDATE_PRESERVE_AD, 1, v);
+                    put_gfn(pg_owner, l3egfn);
                 }
                 break;
 #if CONFIG_PAGING_LEVELS >= 4
@@ -3623,27 +3677,33 @@ int do_mmu_update(
                 {
                     l4_pgentry_t l4e = l4e_from_intpte(req.val);
                     p2m_type_t l4e_p2mt;
-                    gfn_to_mfn(pg_owner, l4e_get_pfn(l4e), &l4e_p2mt);
+                    unsigned long l4egfn = l4e_get_pfn(l4e), l4emfn;
+
+                    l4emfn = mfn_x(get_gfn(pg_owner, l4egfn, &l4e_p2mt));
 
                     if ( p2m_is_paged(l4e_p2mt) )
                     {
-                        p2m_mem_paging_populate(pg_owner, l4e_get_pfn(l4e));
+                        p2m_mem_paging_populate(pg_owner, l4egfn);
+                        put_gfn(pg_owner, l4egfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_paging_in_start == l4e_p2mt && !mfn_valid(mfn) )
                     {
+                        put_gfn(pg_owner, l4egfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_shared == l4e_p2mt )
                     {
+                        put_gfn(pg_owner, l4egfn);
                         MEM_LOG("Unexpected attempt to map shared page.\n");
                         break;
                     }
 
                     rc = mod_l4_entry(va, l4e, mfn,
                                       cmd == MMU_PT_UPDATE_PRESERVE_AD, 1, v);
+                    put_gfn(pg_owner, l4egfn);
                 }
                 break;
 #endif
@@ -3667,6 +3727,7 @@ int do_mmu_update(
 
             unmap_domain_page_with_cache(va, &mapcache);
             put_page(page);
+            put_gfn(pt_owner, gmfn);
         }
         break;
 
@@ -3753,10 +3814,11 @@ static int create_grant_pte_mapping(
     adjust_guest_l1e(nl1e, d);
 
     gmfn = pte_addr >> PAGE_SHIFT;
-    mfn = gmfn_to_mfn(d, gmfn);
+    mfn = get_gfn_untyped(d, gmfn);
 
     if ( unlikely(!get_page_from_pagenr(mfn, current->domain)) )
     {
+        put_gfn(d, gmfn);
         MEM_LOG("Could not get page for normal update");
         return GNTST_general_error;
     }
@@ -3794,6 +3856,7 @@ static int create_grant_pte_mapping(
  failed:
     unmap_domain_page(va);
     put_page(page);
+    put_gfn(d, gmfn);
 
     return rc;
 }
@@ -3808,10 +3871,11 @@ static int destroy_grant_pte_mapping(
     l1_pgentry_t ol1e;
 
     gmfn = addr >> PAGE_SHIFT;
-    mfn = gmfn_to_mfn(d, gmfn);
+    mfn = get_gfn_untyped(d, gmfn);
 
     if ( unlikely(!get_page_from_pagenr(mfn, current->domain)) )
     {
+        put_gfn(d, gmfn);
         MEM_LOG("Could not get page for normal update");
         return GNTST_general_error;
     }
@@ -3863,6 +3927,7 @@ static int destroy_grant_pte_mapping(
  failed:
     unmap_domain_page(va);
     put_page(page);
+    put_gfn(d, gmfn);
     return rc;
 }
 
@@ -4054,9 +4119,10 @@ static int replace_grant_p2m_mapping(
     if ( new_addr != 0 || (flags & GNTMAP_contains_pte) )
         return GNTST_general_error;
 
-    old_mfn = gfn_to_mfn(d, gfn, &type);
+    old_mfn = get_gfn(d, gfn, &type);
     if ( !p2m_is_grant(type) || mfn_x(old_mfn) != frame )
     {
+        put_gfn(d, gfn);
         gdprintk(XENLOG_WARNING,
                  "replace_grant_p2m_mapping: old mapping invalid (type %d, mfn %lx, frame %lx)\n",
                  type, mfn_x(old_mfn), frame);
@@ -4064,6 +4130,7 @@ static int replace_grant_p2m_mapping(
     }
     guest_physmap_remove_page(d, gfn, frame, 0);
 
+    put_gfn(d, gfn);
     return GNTST_okay;
 }
 
@@ -4444,15 +4511,20 @@ long set_gdt(struct vcpu *v,
     struct domain *d = v->domain;
     /* NB. There are 512 8-byte entries per GDT page. */
     int i, nr_pages = (entries + 511) / 512;
-    unsigned long mfn;
+    unsigned long mfn, *pfns;
 
     if ( entries > FIRST_RESERVED_GDT_ENTRY )
         return -EINVAL;
 
+    pfns = xmalloc_array(unsigned long, nr_pages);
+    if ( !pfns )
+        return -ENOMEM;
+
     /* Check the pages in the new GDT. */
     for ( i = 0; i < nr_pages; i++ )
     {
-        mfn = frames[i] = gmfn_to_mfn(d, frames[i]);
+        pfns[i] = frames[i];
+        mfn = frames[i] = get_gfn_untyped(d, frames[i]);
         if ( !mfn_valid(mfn) ||
              !get_page_and_type(mfn_to_page(mfn), d, PGT_seg_desc_page) )
             goto fail;
@@ -4468,13 +4540,19 @@ long set_gdt(struct vcpu *v,
         v->arch.pv_vcpu.gdt_frames[i] = frames[i];
         l1e_write(&v->arch.perdomain_ptes[i],
                   l1e_from_pfn(frames[i], __PAGE_HYPERVISOR));
+        put_gfn(d, pfns[i]);
     }
 
+    xfree(pfns);
     return 0;
 
  fail:
     while ( i-- > 0 )
+    {
         put_page_and_type(mfn_to_page(frames[i]));
+        put_gfn(d, pfns[i]);
+    }
+    xfree(pfns);
     return -EINVAL;
 }
 
@@ -4518,15 +4596,21 @@ long do_update_descriptor(u64 pa, u64 de
 
     *(u64 *)&d = desc;
 
-    mfn = gmfn_to_mfn(dom, gmfn);
+    mfn = get_gfn_untyped(dom, gmfn);
     if ( (((unsigned int)pa % sizeof(struct desc_struct)) != 0) ||
          !mfn_valid(mfn) ||
          !check_descriptor(dom, &d) )
+    {
+        put_gfn(dom, gmfn);
         return -EINVAL;
+    }
 
     page = mfn_to_page(mfn);
     if ( unlikely(!get_page(page, dom)) )
+    {
+        put_gfn(dom, gmfn);
         return -EINVAL;
+    }
 
     /* Check if the given frame is in use in an unsafe context. */
     switch ( page->u.inuse.type_info & PGT_type_mask )
@@ -4554,6 +4638,7 @@ long do_update_descriptor(u64 pa, u64 de
 
  out:
     put_page(page);
+    put_gfn(dom, gmfn);
 
     return ret;
 }
@@ -4595,6 +4680,7 @@ static int handle_iomem_range(unsigned l
 long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
 {
     struct page_info *page = NULL;
+    unsigned long gfn = 0; /* gcc ... */
     int rc;
 
     switch ( op )
@@ -4652,11 +4738,13 @@ long arch_memory_op(int op, XEN_GUEST_HA
         case XENMAPSPACE_gmfn:
         {
             p2m_type_t p2mt;
-
-            xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
+            gfn = xatp.idx;
+
+            xatp.idx = mfn_x(get_gfn_unshare(d, xatp.idx, &p2mt));
             /* If the page is still shared, exit early */
             if ( p2m_is_shared(p2mt) )
             {
+                put_gfn(d, gfn);
                 rcu_unlock_domain(d);
                 return -ENOMEM;
             }
@@ -4674,6 +4762,8 @@ long arch_memory_op(int op, XEN_GUEST_HA
         {
             if ( page )
                 put_page(page);
+            if ( xatp.space == XENMAPSPACE_gmfn )
+                put_gfn(d, gfn);
             rcu_unlock_domain(d);
             return -EINVAL;
         }
@@ -4684,7 +4774,7 @@ long arch_memory_op(int op, XEN_GUEST_HA
             put_page(page);
 
         /* Remove previously mapped page if it was present. */
-        prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
+        prev_mfn = get_gfn_untyped(d, xatp.gpfn);
         if ( mfn_valid(prev_mfn) )
         {
             if ( is_xen_heap_mfn(prev_mfn) )
@@ -4694,6 +4784,8 @@ long arch_memory_op(int op, XEN_GUEST_HA
                 /* Normal domain memory is freed, to avoid leaking memory. */
                 guest_remove_page(d, xatp.gpfn);
         }
+        /* In the XENMAPSPACE_gmfn case we still hold a ref on the old page. */
+        put_gfn(d, xatp.gpfn);
 
         /* Unmap from old location, if any. */
         gpfn = get_gpfn_from_mfn(mfn);
@@ -4704,6 +4796,9 @@ long arch_memory_op(int op, XEN_GUEST_HA
         /* Map at new location. */
         rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
 
+        /* In the XENMAPSPACE_gmfn, we took a ref and locked the p2m at the top */
+        if ( xatp.space == XENMAPSPACE_gmfn )
+            put_gfn(d, gfn);
         domain_unlock(d);
 
         rcu_unlock_domain(d);
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/mm/guest_walk.c
--- a/xen/arch/x86/mm/guest_walk.c
+++ b/xen/arch/x86/mm/guest_walk.c
@@ -86,30 +86,33 @@ static uint32_t set_ad_bits(void *guest_
     return 0;
 }
 
+/* If the map is non-NULL, we leave this function having 
+ * called get_gfn, you need to call put_gfn. */
 static inline void *map_domain_gfn(struct p2m_domain *p2m,
                                    gfn_t gfn, 
                                    mfn_t *mfn,
                                    p2m_type_t *p2mt,
                                    uint32_t *rc) 
 {
-    p2m_access_t a;
-
     /* Translate the gfn, unsharing if shared */
-    *mfn = gfn_to_mfn_type_p2m(p2m, gfn_x(gfn), p2mt, &a, p2m_unshare, NULL);
+    *mfn = get_gfn_unshare(p2m->domain, gfn_x(gfn), p2mt);
     if ( p2m_is_paging(*p2mt) )
     {
         ASSERT(!p2m_is_nestedp2m(p2m));
         p2m_mem_paging_populate(p2m->domain, gfn_x(gfn));
+        put_gfn(p2m->domain, gfn_x(gfn));
         *rc = _PAGE_PAGED;
         return NULL;
     }
     if ( p2m_is_shared(*p2mt) )
     {
+        put_gfn(p2m->domain, gfn_x(gfn));
         *rc = _PAGE_SHARED;
         return NULL;
     }
     if ( !p2m_is_ram(*p2mt) ) 
     {
+        put_gfn(p2m->domain, gfn_x(gfn));
         *rc |= _PAGE_PRESENT;
         return NULL;
     }
@@ -120,6 +123,9 @@ static inline void *map_domain_gfn(struc
 
 
 /* Walk the guest pagetables, after the manner of a hardware walker. */
+/* Because the walk is essentially random, it can cause a deadlock 
+ * warning in the p2m locking code. Highly unlikely this is an actual
+ * deadlock, because who would walk page table in the opposite order? */
 uint32_t
 guest_walk_tables(struct vcpu *v, struct p2m_domain *p2m,
                   unsigned long va, walk_t *gw, 
@@ -347,12 +353,24 @@ set_ad:
 
  out:
 #if GUEST_PAGING_LEVELS == 4
-    if ( l3p ) unmap_domain_page(l3p);
+    if ( l3p ) 
+    {
+        unmap_domain_page(l3p);
+        put_gfn(p2m->domain, gfn_x(guest_l4e_get_gfn(gw->l4e)));
+    }
 #endif
 #if GUEST_PAGING_LEVELS >= 3
-    if ( l2p ) unmap_domain_page(l2p);
+    if ( l2p ) 
+    {
+        unmap_domain_page(l2p);
+        put_gfn(p2m->domain, gfn_x(guest_l3e_get_gfn(gw->l3e))); 
+    }
 #endif
-    if ( l1p ) unmap_domain_page(l1p);
+    if ( l1p ) 
+    {
+        unmap_domain_page(l1p);
+        put_gfn(p2m->domain, gfn_x(guest_l2e_get_gfn(gw->l2e)));
+    }
 
     return rc;
 }
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/mm/hap/guest_walk.c
--- a/xen/arch/x86/mm/hap/guest_walk.c
+++ b/xen/arch/x86/mm/hap/guest_walk.c
@@ -54,28 +54,31 @@ unsigned long hap_p2m_ga_to_gfn(GUEST_PA
     mfn_t top_mfn;
     void *top_map;
     p2m_type_t p2mt;
-    p2m_access_t p2ma;
     walk_t gw;
+    unsigned long top_gfn;
 
     /* Get the top-level table's MFN */
-    top_mfn = gfn_to_mfn_type_p2m(p2m, cr3 >> PAGE_SHIFT, 
-                                  &p2mt, &p2ma, p2m_unshare, NULL);
+    top_gfn = cr3 >> PAGE_SHIFT;
+    top_mfn = get_gfn_unshare(p2m->domain, top_gfn, &p2mt);
     if ( p2m_is_paging(p2mt) )
     {
         ASSERT(!p2m_is_nestedp2m(p2m));
         p2m_mem_paging_populate(p2m->domain, cr3 >> PAGE_SHIFT);
 
         pfec[0] = PFEC_page_paged;
+        put_gfn(p2m->domain, top_gfn);
         return INVALID_GFN;
     }
     if ( p2m_is_shared(p2mt) )
     {
         pfec[0] = PFEC_page_shared;
+        put_gfn(p2m->domain, top_gfn);
         return INVALID_GFN;
     }
     if ( !p2m_is_ram(p2mt) )
     {
         pfec[0] &= ~PFEC_page_present;
+        put_gfn(p2m->domain, top_gfn);
         return INVALID_GFN;
     }
 
@@ -87,26 +90,31 @@ unsigned long hap_p2m_ga_to_gfn(GUEST_PA
 #endif
     missing = guest_walk_tables(v, p2m, ga, &gw, pfec[0], top_mfn, top_map);
     unmap_domain_page(top_map);
+    put_gfn(p2m->domain, top_gfn);
 
     /* Interpret the answer */
     if ( missing == 0 )
     {
         gfn_t gfn = guest_l1e_get_gfn(gw.l1e);
-        gfn_to_mfn_type_p2m(p2m, gfn_x(gfn), &p2mt, &p2ma, p2m_unshare, NULL);
+        (void)get_gfn_unshare(p2m->domain, gfn_x(gfn), &p2mt); 
         if ( p2m_is_paging(p2mt) )
         {
             ASSERT(!p2m_is_nestedp2m(p2m));
             p2m_mem_paging_populate(p2m->domain, gfn_x(gfn));
 
             pfec[0] = PFEC_page_paged;
+            put_gfn(p2m->domain, gfn_x(gfn));
             return INVALID_GFN;
         }
         if ( p2m_is_shared(p2mt) )
         {
             pfec[0] = PFEC_page_shared;
+            put_gfn(p2m->domain, gfn_x(gfn));
             return INVALID_GFN;
         }
 
+        put_gfn(p2m->domain, gfn_x(gfn));
+
         if ( page_order )
             *page_order = guest_walk_to_page_order(&gw);
 
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/mm/hap/nested_hap.c
--- a/xen/arch/x86/mm/hap/nested_hap.c
+++ b/xen/arch/x86/mm/hap/nested_hap.c
@@ -146,22 +146,29 @@ nestedhap_walk_L0_p2m(struct p2m_domain 
     mfn_t mfn;
     p2m_type_t p2mt;
     p2m_access_t p2ma;
+    int rc;
 
     /* walk L0 P2M table */
     mfn = gfn_to_mfn_type_p2m(p2m, L1_gpa >> PAGE_SHIFT, &p2mt, &p2ma, 
                               p2m_query, page_order);
 
+    rc = NESTEDHVM_PAGEFAULT_MMIO;
     if ( p2m_is_mmio(p2mt) )
-        return NESTEDHVM_PAGEFAULT_MMIO;
+        goto out;
 
+    rc = NESTEDHVM_PAGEFAULT_ERROR;
     if ( p2m_is_paging(p2mt) || p2m_is_shared(p2mt) || !p2m_is_ram(p2mt) )
-        return NESTEDHVM_PAGEFAULT_ERROR;
+        goto out;
 
+    rc = NESTEDHVM_PAGEFAULT_ERROR;
     if ( !mfn_valid(mfn) )
-        return NESTEDHVM_PAGEFAULT_ERROR;
+        goto out;
 
     *L0_gpa = (mfn_x(mfn) << PAGE_SHIFT) + (L1_gpa & ~PAGE_MASK);
-    return NESTEDHVM_PAGEFAULT_DONE;
+    rc = NESTEDHVM_PAGEFAULT_DONE;
+out:
+    put_gfn(p2m->domain, L1_gpa >> PAGE_SHIFT);
+    return rc;
 }
 
 /* This function uses L2_gpa to walk the P2M page table in L1. If the 
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/mm/mem_event.c
--- a/xen/arch/x86/mm/mem_event.c
+++ b/xen/arch/x86/mm/mem_event.c
@@ -47,7 +47,7 @@ static int mem_event_enable(struct domai
     unsigned long ring_addr = mec->ring_addr;
     unsigned long shared_addr = mec->shared_addr;
     l1_pgentry_t l1e;
-    unsigned long gfn;
+    unsigned long shared_gfn = 0, ring_gfn = 0; /* gcc ... */
     p2m_type_t p2mt;
     mfn_t ring_mfn;
     mfn_t shared_mfn;
@@ -60,23 +60,36 @@ static int mem_event_enable(struct domai
 
     /* Get MFN of ring page */
     guest_get_eff_l1e(v, ring_addr, &l1e);
-    gfn = l1e_get_pfn(l1e);
-    ring_mfn = gfn_to_mfn(dom_mem_event, gfn, &p2mt);
+    ring_gfn = l1e_get_pfn(l1e);
+    /* We're grabbing these two in an order that could deadlock
+     * dom0 if 1. it were an hvm 2. there were two concurrent
+     * enables 3. the two gfn's in each enable criss-crossed
+     * 2MB regions. Duly noted.... */
+    ring_mfn = get_gfn(dom_mem_event, ring_gfn, &p2mt);
 
     if ( unlikely(!mfn_valid(mfn_x(ring_mfn))) )
+    {
+        put_gfn(dom_mem_event, ring_gfn);
         return -EINVAL;
+    }
 
     /* Get MFN of shared page */
     guest_get_eff_l1e(v, shared_addr, &l1e);
-    gfn = l1e_get_pfn(l1e);
-    shared_mfn = gfn_to_mfn(dom_mem_event, gfn, &p2mt);
+    shared_gfn = l1e_get_pfn(l1e);
+    shared_mfn = get_gfn(dom_mem_event, shared_gfn, &p2mt);
 
     if ( unlikely(!mfn_valid(mfn_x(shared_mfn))) )
+    {
+        put_gfn(dom_mem_event, ring_gfn);
+        put_gfn(dom_mem_event, shared_gfn);
         return -EINVAL;
+    }
 
     /* Map ring and shared pages */
     med->ring_page = map_domain_page(mfn_x(ring_mfn));
     med->shared_page = map_domain_page(mfn_x(shared_mfn));
+    put_gfn(dom_mem_event, ring_gfn);
+    put_gfn(dom_mem_event, shared_gfn); 
 
     /* Allocate event channel */
     rc = alloc_unbound_xen_event_channel(d->vcpu[0],
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/mm/mem_sharing.c
--- a/xen/arch/x86/mm/mem_sharing.c
+++ b/xen/arch/x86/mm/mem_sharing.c
@@ -227,7 +227,7 @@ static void mem_sharing_audit(void)
                             g->domain, g->gfn, mfn_x(e->mfn));
                     continue;
                 }
-                mfn = gfn_to_mfn(d, g->gfn, &t); 
+                mfn = get_gfn_unlocked(d, g->gfn, &t); 
                 if(mfn_x(mfn) != mfn_x(e->mfn))
                     MEM_SHARING_DEBUG("Incorrect P2M for d=%d, PFN=%lx."
                                       "Expecting MFN=%ld, got %ld\n",
@@ -335,7 +335,7 @@ int mem_sharing_debug_gfn(struct domain 
     p2m_type_t p2mt;
     mfn_t mfn;
 
-    mfn = gfn_to_mfn(d, gfn, &p2mt);
+    mfn = get_gfn_unlocked(d, gfn, &p2mt);
 
     printk("Debug for domain=%d, gfn=%lx, ", 
             d->domain_id, 
@@ -460,7 +460,7 @@ int mem_sharing_nominate_page(struct dom
     *phandle = 0UL;
 
     shr_lock(); 
-    mfn = gfn_to_mfn(d, gfn, &p2mt);
+    mfn = get_gfn(d, gfn, &p2mt);
 
     /* Check if mfn is valid */
     ret = -EINVAL;
@@ -524,6 +524,7 @@ int mem_sharing_nominate_page(struct dom
     ret = 0;
 
 out:
+    put_gfn(d, gfn);
     shr_unlock();
     return ret;
 }
@@ -593,14 +594,18 @@ int mem_sharing_unshare_page(struct doma
     shr_handle_t handle;
     struct list_head *le;
 
+    /* Remove the gfn_info from the list */
+   
+    /* This is one of the reasons why we can't enforce ordering
+     * between shr_lock and p2m fine-grained locks in mm-lock. 
+     * Callers may walk in here already holding the lock for this gfn */
     shr_lock();
     mem_sharing_audit();
-    
-    /* Remove the gfn_info from the list */
-    mfn = gfn_to_mfn(d, gfn, &p2mt);
+    mfn = get_gfn(d, gfn, &p2mt);
     
     /* Has someone already unshared it? */
     if (!p2m_is_shared(p2mt)) {
+        put_gfn(d, gfn);
         shr_unlock();
         return 0;
     }
@@ -634,6 +639,7 @@ gfn_found:
             /* Even though we don't allocate a private page, we have to account
              * for the MFN that originally backed this PFN. */
             atomic_dec(&nr_saved_mfns);
+        put_gfn(d, gfn);
         shr_unlock();
         put_page_and_type(page);
         if(last_gfn && 
@@ -653,6 +659,7 @@ gfn_found:
         /* We've failed to obtain memory for private page. Need to re-add the
          * gfn_info to relevant list */
         list_add(&gfn_info->list, &hash_entry->gfns);
+        put_gfn(d, gfn);
         shr_unlock();
         return -ENOMEM;
     }
@@ -663,6 +670,13 @@ gfn_found:
     unmap_domain_page(s);
     unmap_domain_page(t);
 
+    /* NOTE: set_shared_p2m_entry will switch the underlying mfn. If
+     * we do get_page withing get_gfn, the correct sequence here
+     * should be
+       get_page(page);
+       put_page(old_page);
+     * so that the ref to the old page is dropped, and a ref to
+     * the new page is obtained to later be dropped in put_gfn */
     BUG_ON(set_shared_p2m_entry(d, gfn, page_to_mfn(page)) == 0);
     put_page_and_type(old_page);
 
@@ -683,6 +697,7 @@ private_page_found:
     /* Update m2p entry */
     set_gpfn_from_mfn(mfn_x(page_to_mfn(page)), gfn);
 
+    put_gfn(d, gfn);
     shr_unlock();
     return 0;
 }
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/mm/p2m-pod.c
--- a/xen/arch/x86/mm/p2m-pod.c
+++ b/xen/arch/x86/mm/p2m-pod.c
@@ -531,9 +531,10 @@ p2m_pod_decrease_reservation(struct doma
     /* FIXME: Add contiguous; query for PSE entries? */
     for ( i=0; i<(1<<order); i++)
     {
+        p2m_access_t a;
         p2m_type_t t;
 
-        gfn_to_mfn_query(d, gpfn + i, &t);
+        (void)p2m->get_entry(p2m, gpfn + i, &t, &a, p2m_query, NULL);
 
         if ( t == p2m_populate_on_demand )
             pod++;
@@ -572,8 +573,9 @@ p2m_pod_decrease_reservation(struct doma
     {
         mfn_t mfn;
         p2m_type_t t;
+        p2m_access_t a;
 
-        mfn = gfn_to_mfn_query(d, gpfn + i, &t);
+        mfn = p2m->get_entry(p2m, gpfn + i, &t, &a, p2m_query, NULL);
         if ( t == p2m_populate_on_demand )
         {
             set_p2m_entry(p2m, gpfn + i, _mfn(INVALID_MFN), 0, p2m_invalid, p2m->default_access);
@@ -653,8 +655,8 @@ p2m_pod_zero_check_superpage(struct p2m_
      * and aligned, and mapping them. */
     for ( i=0; i<SUPERPAGE_PAGES; i++ )
     {
-        
-        mfn = gfn_to_mfn_query(d, gfn + i, &type);
+        p2m_access_t a; 
+        mfn = p2m->get_entry(p2m, gfn + i, &type, &a, p2m_query, NULL);
 
         if ( i == 0 )
         {
@@ -782,7 +784,8 @@ p2m_pod_zero_check(struct p2m_domain *p2
     /* First, get the gfn list, translate to mfns, and map the pages. */
     for ( i=0; i<count; i++ )
     {
-        mfns[i] = gfn_to_mfn_query(d, gfns[i], types + i);
+        p2m_access_t a;
+        mfns[i] = p2m->get_entry(p2m, gfns[i], types + i, &a, p2m_query, NULL);
         /* If this is ram, and not a pagetable or from the xen heap, and probably not mapped
            elsewhere, map it; otherwise, skip. */
         if ( p2m_is_ram(types[i])
@@ -923,7 +926,8 @@ p2m_pod_emergency_sweep(struct p2m_domai
     /* FIXME: Figure out how to avoid superpages */
     for ( i=p2m->pod.reclaim_single; i > 0 ; i-- )
     {
-        gfn_to_mfn_query(p2m->domain, i, &t );
+        p2m_access_t a;
+        (void)p2m->get_entry(p2m, i, &t, &a, p2m_query, NULL);
         if ( p2m_is_ram(t) )
         {
             gfns[j] = i;
@@ -1112,7 +1116,8 @@ guest_physmap_mark_populate_on_demand(st
     /* Make sure all gpfns are unused */
     for ( i = 0; i < (1UL << order); i++ )
     {
-        omfn = gfn_to_mfn_query(d, gfn + i, &ot);
+        p2m_access_t a;
+        omfn = p2m->get_entry(p2m, gfn + i, &ot, &a, p2m_query, NULL);
         if ( p2m_is_ram(ot) )
         {
             printk("%s: gfn_to_mfn returned type %d!\n",
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/mm/p2m-pt.c
--- a/xen/arch/x86/mm/p2m-pt.c
+++ b/xen/arch/x86/mm/p2m-pt.c
@@ -1051,7 +1051,7 @@ void audit_p2m(struct p2m_domain *p2m, i
             continue;
         }
 
-        p2mfn = gfn_to_mfn_type_p2m(p2m, gfn, &type, p2m_query);
+        p2mfn = get_gfn_query(p2m->domain, gfn, &type);
         if ( strict_m2p && mfn_x(p2mfn) != mfn )
         {
             mpbad++;
@@ -1066,15 +1066,17 @@ void audit_p2m(struct p2m_domain *p2m, i
              * blow away the m2p entry. */
             set_gpfn_from_mfn(mfn, INVALID_M2P_ENTRY);
         }
+        put_gfn(p2m->domain, gfn);
 
         if ( test_linear && (gfn <= p2m->max_mapped_pfn) )
         {
-            lp2mfn = mfn_x(gfn_to_mfn_type_p2m(p2m, gfn, &type, p2m_query));
+            lp2mfn = mfn_x(get_gfn_query(p2m->domain, gfn, &type));
             if ( lp2mfn != mfn_x(p2mfn) )
             {
                 P2M_PRINTK("linear mismatch gfn %#lx -> mfn %#lx "
                            "(!= mfn %#lx)\n", gfn, lp2mfn, mfn_x(p2mfn));
             }
+            put_gfn(p2m->domain, gfn);
         }
 
         // P2M_PRINTK("OK: mfn=%#lx, gfn=%#lx, p2mfn=%#lx, lp2mfn=%#lx\n",
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -343,7 +343,6 @@ void p2m_teardown(struct p2m_domain *p2m
 #ifdef __x86_64__
     unsigned long gfn;
     p2m_type_t t;
-    p2m_access_t a;
     mfn_t mfn;
 #endif
 
@@ -353,13 +352,13 @@ void p2m_teardown(struct p2m_domain *p2m
 #ifdef __x86_64__
     for ( gfn=0; gfn < p2m->max_mapped_pfn; gfn++ )
     {
-        mfn = gfn_to_mfn_type_p2m(p2m, gfn, &t, &a, p2m_query, NULL);
+        mfn = get_gfn_query(d, gfn, &t);
         if ( mfn_valid(mfn) && (t == p2m_ram_shared) )
         {
             ASSERT(!p2m_is_nestedp2m(p2m));
             BUG_ON(mem_sharing_unshare_page(d, gfn, MEM_SHARING_DESTROY_GFN));
         }
-
+        put_gfn(d, gfn);
     }
 #endif
 
@@ -454,6 +453,7 @@ guest_physmap_add_entry(struct domain *d
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
     unsigned long i, ogfn;
     p2m_type_t ot;
+    p2m_access_t a;
     mfn_t omfn;
     int pod_count = 0;
     int rc = 0;
@@ -489,12 +489,13 @@ guest_physmap_add_entry(struct domain *d
     /* First, remove m->p mappings for existing p->m mappings */
     for ( i = 0; i < (1UL << page_order); i++ )
     {
-        omfn = gfn_to_mfn_query(d, gfn + i, &ot);
+        omfn = p2m->get_entry(p2m, gfn + i, &ot, &a, p2m_query, NULL);
         if ( p2m_is_grant(ot) )
         {
             /* Really shouldn't be unmapping grant maps this way */
             domain_crash(d);
             p2m_unlock(p2m);
+            
             return -EINVAL;
         }
         else if ( p2m_is_ram(ot) )
@@ -528,7 +529,7 @@ guest_physmap_add_entry(struct domain *d
              * address */
             P2M_DEBUG("aliased! mfn=%#lx, old gfn=%#lx, new gfn=%#lx\n",
                       mfn + i, ogfn, gfn + i);
-            omfn = gfn_to_mfn_query(d, ogfn, &ot);
+            omfn = p2m->get_entry(p2m, ogfn, &ot, &a, p2m_query, NULL);
             if ( p2m_is_ram(ot) )
             {
                 ASSERT(mfn_valid(omfn));
@@ -577,6 +578,7 @@ guest_physmap_add_entry(struct domain *d
 p2m_type_t p2m_change_type(struct domain *d, unsigned long gfn, 
                            p2m_type_t ot, p2m_type_t nt)
 {
+    p2m_access_t a;
     p2m_type_t pt;
     mfn_t mfn;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
@@ -585,7 +587,7 @@ p2m_type_t p2m_change_type(struct domain
 
     p2m_lock(p2m);
 
-    mfn = gfn_to_mfn_query(d, gfn, &pt);
+    mfn = p2m->get_entry(p2m, gfn, &pt, &a, p2m_query, NULL);
     if ( pt == ot )
         set_p2m_entry(p2m, gfn, mfn, 0, nt, p2m->default_access);
 
@@ -600,6 +602,7 @@ void p2m_change_type_range(struct domain
                            unsigned long start, unsigned long end,
                            p2m_type_t ot, p2m_type_t nt)
 {
+    p2m_access_t a;
     p2m_type_t pt;
     unsigned long gfn;
     mfn_t mfn;
@@ -612,7 +615,7 @@ void p2m_change_type_range(struct domain
 
     for ( gfn = start; gfn < end; gfn++ )
     {
-        mfn = gfn_to_mfn_query(d, gfn, &pt);
+        mfn = p2m->get_entry(p2m, gfn, &pt, &a, p2m_query, NULL);
         if ( pt == ot )
             set_p2m_entry(p2m, gfn, mfn, 0, nt, p2m->default_access);
     }
@@ -629,6 +632,7 @@ int
 set_mmio_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn)
 {
     int rc = 0;
+    p2m_access_t a;
     p2m_type_t ot;
     mfn_t omfn;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
@@ -637,7 +641,7 @@ set_mmio_p2m_entry(struct domain *d, uns
         return 0;
 
     p2m_lock(p2m);
-    omfn = gfn_to_mfn_query(d, gfn, &ot);
+    omfn = p2m->get_entry(p2m, gfn, &ot, &a, p2m_query, NULL);
     if ( p2m_is_grant(ot) )
     {
         p2m_unlock(p2m);
@@ -657,7 +661,7 @@ set_mmio_p2m_entry(struct domain *d, uns
     if ( 0 == rc )
         gdprintk(XENLOG_ERR,
             "set_mmio_p2m_entry: set_p2m_entry failed! mfn=%08lx\n",
-            mfn_x(gfn_to_mfn_query(d, gfn, &ot)));
+            mfn_x(p2m->get_entry(p2m, gfn, &ot, &a, p2m_query, NULL)));
     return rc;
 }
 
@@ -666,6 +670,7 @@ clear_mmio_p2m_entry(struct domain *d, u
 {
     int rc = 0;
     mfn_t mfn;
+    p2m_access_t a;
     p2m_type_t t;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
 
@@ -673,7 +678,7 @@ clear_mmio_p2m_entry(struct domain *d, u
         return 0;
 
     p2m_lock(p2m);
-    mfn = gfn_to_mfn_query(d, gfn, &t);
+    mfn = p2m->get_entry(p2m, gfn, &t, &a, p2m_query, NULL);
 
     /* Do not use mfn_valid() here as it will usually fail for MMIO pages. */
     if ( (INVALID_MFN == mfn_x(mfn)) || (t != p2m_mmio_direct) )
@@ -696,6 +701,7 @@ set_shared_p2m_entry(struct domain *d, u
 {
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
     int rc = 0;
+    p2m_access_t a;
     p2m_type_t ot;
     mfn_t omfn;
 
@@ -703,7 +709,7 @@ set_shared_p2m_entry(struct domain *d, u
         return 0;
 
     p2m_lock(p2m);
-    omfn = gfn_to_mfn_query(p2m->domain, gfn, &ot);
+    omfn = p2m->get_entry(p2m, gfn, &ot, &a, p2m_query, NULL);
     /* At the moment we only allow p2m change if gfn has already been made
      * sharable first */
     ASSERT(p2m_is_shared(ot));
@@ -717,7 +723,7 @@ set_shared_p2m_entry(struct domain *d, u
     if ( 0 == rc )
         gdprintk(XENLOG_ERR,
             "set_shared_p2m_entry: set_p2m_entry failed! mfn=%08lx\n",
-            mfn_x(gfn_to_mfn_query(d, gfn, &ot)));
+            mfn_x(p2m->get_entry(p2m, gfn, &ot, &a, p2m_query, NULL)));
     return rc;
 }
 
@@ -1168,7 +1174,7 @@ int p2m_set_mem_access(struct domain *d,
 {
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
     unsigned long pfn;
-    p2m_access_t a;
+    p2m_access_t a, _a;
     p2m_type_t t;
     mfn_t mfn;
     int rc = 0;
@@ -1202,7 +1208,7 @@ int p2m_set_mem_access(struct domain *d,
     p2m_lock(p2m);
     for ( pfn = start_pfn; pfn < start_pfn + nr; pfn++ )
     {
-        mfn = gfn_to_mfn_query(d, pfn, &t);
+        mfn = p2m->get_entry(p2m, pfn, &t, &_a, p2m_query, NULL);
         if ( p2m->set_entry(p2m, pfn, mfn, PAGE_ORDER_4K, t, a) == 0 )
         {
             rc = -ENOMEM;
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/mm/shadow/common.c
--- a/xen/arch/x86/mm/shadow/common.c
+++ b/xen/arch/x86/mm/shadow/common.c
@@ -3676,7 +3676,7 @@ int shadow_track_dirty_vram(struct domai
 
         /* Iterate over VRAM to track dirty bits. */
         for ( i = 0; i < nr; i++ ) {
-            mfn_t mfn = gfn_to_mfn_query(d, begin_pfn + i, &t);
+            mfn_t mfn = get_gfn_query(d, begin_pfn + i, &t);
             struct page_info *page;
             int dirty = 0;
             paddr_t sl1ma = dirty_vram->sl1ma[i];
@@ -3741,6 +3741,8 @@ int shadow_track_dirty_vram(struct domai
                 }
             }
 
+            put_gfn(d, begin_pfn + i);
+
             if ( dirty )
             {
                 dirty_vram->dirty_bitmap[i / 8] |= 1 << (i % 8);
@@ -3761,7 +3763,7 @@ int shadow_track_dirty_vram(struct domai
                 /* was clean for more than two seconds, try to disable guest
                  * write access */
                 for ( i = begin_pfn; i < end_pfn; i++ ) {
-                    mfn_t mfn = gfn_to_mfn_query(d, i, &t);
+                    mfn_t mfn = get_gfn_query_unlocked(d, i, &t);
                     if (mfn_x(mfn) != INVALID_MFN)
                         flush_tlb |= sh_remove_write_access(d->vcpu[0], mfn, 1, 0);
                 }
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/mm/shadow/multi.c
--- a/xen/arch/x86/mm/shadow/multi.c
+++ b/xen/arch/x86/mm/shadow/multi.c
@@ -2265,7 +2265,7 @@ static int validate_gl4e(struct vcpu *v,
     if ( guest_l4e_get_flags(new_gl4e) & _PAGE_PRESENT )
     {
         gfn_t gl3gfn = guest_l4e_get_gfn(new_gl4e);
-        mfn_t gl3mfn = gfn_to_mfn_query(d, gl3gfn, &p2mt);
+        mfn_t gl3mfn = get_gfn_query(d, gl3gfn, &p2mt);
         if ( p2m_is_ram(p2mt) )
             sl3mfn = get_shadow_status(v, gl3mfn, SH_type_l3_shadow);
         else if ( p2mt != p2m_populate_on_demand )
@@ -2275,6 +2275,7 @@ static int validate_gl4e(struct vcpu *v,
         if ( mfn_valid(sl3mfn) )
             shadow_resync_all(v);
 #endif
+        put_gfn(d, gfn_x(gl3gfn));
     }
     l4e_propagate_from_guest(v, new_gl4e, sl3mfn, &new_sl4e, ft_prefetch);
 
@@ -2322,7 +2323,7 @@ static int validate_gl3e(struct vcpu *v,
     if ( guest_l3e_get_flags(new_gl3e) & _PAGE_PRESENT )
     {
         gfn_t gl2gfn = guest_l3e_get_gfn(new_gl3e);
-        mfn_t gl2mfn = gfn_to_mfn_query(v->domain, gl2gfn, &p2mt);
+        mfn_t gl2mfn = get_gfn_query(v->domain, gl2gfn, &p2mt);
         if ( p2m_is_ram(p2mt) )
             sl2mfn = get_shadow_status(v, gl2mfn, SH_type_l2_shadow);
         else if ( p2mt != p2m_populate_on_demand )
@@ -2332,6 +2333,7 @@ static int validate_gl3e(struct vcpu *v,
         if ( mfn_valid(sl2mfn) )
             shadow_resync_all(v);
 #endif
+        put_gfn(v->domain, gfn_x(gl2gfn));
     }
     l3e_propagate_from_guest(v, new_gl3e, sl2mfn, &new_sl3e, ft_prefetch);
     result |= shadow_set_l3e(v, sl3p, new_sl3e, sl3mfn);
@@ -2371,11 +2373,12 @@ static int validate_gl2e(struct vcpu *v,
         }
         else
         {
-            mfn_t gl1mfn = gfn_to_mfn_query(v->domain, gl1gfn, &p2mt);
+            mfn_t gl1mfn = get_gfn_query(v->domain, gl1gfn, &p2mt);
             if ( p2m_is_ram(p2mt) )
                 sl1mfn = get_shadow_status(v, gl1mfn, SH_type_l1_shadow); 
             else if ( p2mt != p2m_populate_on_demand )
                 result |= SHADOW_SET_ERROR;
+            put_gfn(v->domain, gfn_x(gl1gfn));
         }
     }
     l2e_propagate_from_guest(v, new_gl2e, sl1mfn, &new_sl2e, ft_prefetch);
@@ -2441,7 +2444,7 @@ static int validate_gl1e(struct vcpu *v,
     perfc_incr(shadow_validate_gl1e_calls);
 
     gfn = guest_l1e_get_gfn(new_gl1e);
-    gmfn = gfn_to_mfn_query(v->domain, gfn, &p2mt);
+    gmfn = get_gfn_query(v->domain, gfn, &p2mt);
 
     l1e_propagate_from_guest(v, new_gl1e, gmfn, &new_sl1e, ft_prefetch, p2mt);
     result |= shadow_set_l1e(v, sl1p, new_sl1e, p2mt, sl1mfn);
@@ -2463,6 +2466,7 @@ static int validate_gl1e(struct vcpu *v,
     }
 #endif /* OOS */
 
+    put_gfn(v->domain, gfn_x(gfn));
     return result;
 }
 
@@ -2501,10 +2505,11 @@ void sh_resync_l1(struct vcpu *v, mfn_t 
             shadow_l1e_t nsl1e;
 
             gfn = guest_l1e_get_gfn(gl1e);
-            gmfn = gfn_to_mfn_query(v->domain, gfn, &p2mt);
+            gmfn = get_gfn_query(v->domain, gfn, &p2mt);
             l1e_propagate_from_guest(v, gl1e, gmfn, &nsl1e, ft_prefetch, p2mt);
             rc |= shadow_set_l1e(v, sl1p, nsl1e, p2mt, sl1mfn);
 
+            put_gfn(v->domain, gfn_x(gfn));
             *snpl1p = gl1e;
         }
     });
@@ -2824,7 +2829,7 @@ static void sh_prefetch(struct vcpu *v, 
 
         /* Look at the gfn that the l1e is pointing at */
         gfn = guest_l1e_get_gfn(gl1e);
-        gmfn = gfn_to_mfn_query(v->domain, gfn, &p2mt);
+        gmfn = get_gfn_query(v->domain, gfn, &p2mt);
 
         /* Propagate the entry.  */
         l1e_propagate_from_guest(v, gl1e, gmfn, &sl1e, ft_prefetch, p2mt);
@@ -2834,6 +2839,8 @@ static void sh_prefetch(struct vcpu *v, 
         if ( snpl1p != NULL )
             snpl1p[i] = gl1e;
 #endif /* OOS */
+
+        put_gfn(v->domain, gfn_x(gfn));
     }
     if ( gl1p != NULL )
         sh_unmap_domain_page(gl1p);
@@ -3182,7 +3189,7 @@ static int sh_page_fault(struct vcpu *v,
 
     /* What mfn is the guest trying to access? */
     gfn = guest_l1e_get_gfn(gw.l1e);
-    gmfn = gfn_to_mfn_guest(d, gfn, &p2mt);
+    gmfn = get_gfn_guest(d, gfn, &p2mt);
 
     if ( shadow_mode_refcounts(d) && 
          ((!p2m_is_valid(p2mt) && !p2m_is_grant(p2mt)) ||
@@ -3192,6 +3199,7 @@ static int sh_page_fault(struct vcpu *v,
         SHADOW_PRINTK("BAD gfn=%"SH_PRI_gfn" gmfn=%"PRI_mfn"\n", 
                       gfn_x(gfn), mfn_x(gmfn));
         reset_early_unshadow(v);
+        put_gfn(d, gfn_x(gfn));
         goto propagate;
     }
 
@@ -3236,6 +3244,7 @@ static int sh_page_fault(struct vcpu *v,
     if ( rc & GW_RMWR_REWALK )
     {
         paging_unlock(d);
+        put_gfn(d, gfn_x(gfn));
         goto rewalk;
     }
 #endif /* OOS */
@@ -3244,6 +3253,7 @@ static int sh_page_fault(struct vcpu *v,
     {
         perfc_incr(shadow_inconsistent_gwalk);
         paging_unlock(d);
+        put_gfn(d, gfn_x(gfn));
         goto rewalk;
     }
 
@@ -3270,6 +3280,7 @@ static int sh_page_fault(struct vcpu *v,
         ASSERT(d->is_shutting_down);
 #endif
         paging_unlock(d);
+        put_gfn(d, gfn_x(gfn));
         trace_shadow_gen(TRC_SHADOW_DOMF_DYING, va);
         return 0;
     }
@@ -3287,6 +3298,7 @@ static int sh_page_fault(struct vcpu *v,
          * failed. We cannot safely continue since some page is still
          * OOS but not in the hash table anymore. */
         paging_unlock(d);
+        put_gfn(d, gfn_x(gfn));
         return 0;
     }
 
@@ -3296,6 +3308,7 @@ static int sh_page_fault(struct vcpu *v,
     {
         perfc_incr(shadow_inconsistent_gwalk);
         paging_unlock(d);
+        put_gfn(d, gfn_x(gfn));
         goto rewalk;
     }
 #endif /* OOS */
@@ -3389,6 +3402,7 @@ static int sh_page_fault(struct vcpu *v,
     SHADOW_PRINTK("fixed\n");
     shadow_audit_tables(v);
     paging_unlock(d);
+    put_gfn(d, gfn_x(gfn));
     return EXCRET_fault_fixed;
 
  emulate:
@@ -3457,6 +3471,7 @@ static int sh_page_fault(struct vcpu *v,
     sh_audit_gw(v, &gw);
     shadow_audit_tables(v);
     paging_unlock(d);
+    put_gfn(d, gfn_x(gfn));
 
     this_cpu(trace_emulate_write_val) = 0;
 
@@ -3595,6 +3610,7 @@ static int sh_page_fault(struct vcpu *v,
     shadow_audit_tables(v);
     reset_early_unshadow(v);
     paging_unlock(d);
+    put_gfn(d, gfn_x(gfn));
     trace_shadow_gen(TRC_SHADOW_MMIO, va);
     return (handle_mmio_with_translation(va, gpa >> PAGE_SHIFT)
             ? EXCRET_fault_fixed : 0);
@@ -3605,6 +3621,7 @@ static int sh_page_fault(struct vcpu *v,
     shadow_audit_tables(v);
     reset_early_unshadow(v);
     paging_unlock(d);
+    put_gfn(d, gfn_x(gfn));
 
 propagate:
     trace_not_shadow_fault(gw.l1e, va);
@@ -4292,7 +4309,7 @@ sh_update_cr3(struct vcpu *v, int do_loc
             if ( guest_l3e_get_flags(gl3e[i]) & _PAGE_PRESENT )
             {
                 gl2gfn = guest_l3e_get_gfn(gl3e[i]);
-                gl2mfn = gfn_to_mfn_query(d, gl2gfn, &p2mt);
+                gl2mfn = get_gfn_query_unlocked(d, gfn_x(gl2gfn), &p2mt);
                 if ( p2m_is_ram(p2mt) )
                     flush |= sh_remove_write_access(v, gl2mfn, 2, 0);
             }
@@ -4305,13 +4322,14 @@ sh_update_cr3(struct vcpu *v, int do_loc
             if ( guest_l3e_get_flags(gl3e[i]) & _PAGE_PRESENT )
             {
                 gl2gfn = guest_l3e_get_gfn(gl3e[i]);
-                gl2mfn = gfn_to_mfn_query(d, gl2gfn, &p2mt);
+                gl2mfn = get_gfn_query(d, gl2gfn, &p2mt);
                 if ( p2m_is_ram(p2mt) )
                     sh_set_toplevel_shadow(v, i, gl2mfn, (i == 3) 
                                            ? SH_type_l2h_shadow 
                                            : SH_type_l2_shadow);
                 else
                     sh_set_toplevel_shadow(v, i, _mfn(INVALID_MFN), 0); 
+                put_gfn(d, gfn_x(gl2gfn));
             }
             else
                 sh_set_toplevel_shadow(v, i, _mfn(INVALID_MFN), 0); 
@@ -4689,11 +4707,12 @@ static void sh_pagetable_dying(struct vc
     int flush = 0;
     int fast_path = 0;
     paddr_t gcr3 = 0;
-    mfn_t smfn, gmfn;
     p2m_type_t p2mt;
     char *gl3pa = NULL;
     guest_l3e_t *gl3e = NULL;
     paddr_t gl2a = 0;
+    unsigned long l3gfn;
+    mfn_t l3mfn;
 
     paging_lock(v->domain);
 
@@ -4702,8 +4721,9 @@ static void sh_pagetable_dying(struct vc
     if ( gcr3 == gpa )
         fast_path = 1;
 
-    gmfn = gfn_to_mfn_query(v->domain, _gfn(gpa >> PAGE_SHIFT), &p2mt);
-    if ( !mfn_valid(gmfn) || !p2m_is_ram(p2mt) )
+    l3gfn = gpa >> PAGE_SHIFT;
+    l3mfn = get_gfn_query(v->domain, _gfn(l3gfn), &p2mt);
+    if ( !mfn_valid(l3mfn) || !p2m_is_ram(p2mt) )
     {
         printk(XENLOG_DEBUG "sh_pagetable_dying: gpa not valid %"PRIpaddr"\n",
                gpa);
@@ -4711,19 +4731,24 @@ static void sh_pagetable_dying(struct vc
     }
     if ( !fast_path )
     {
-        gl3pa = sh_map_domain_page(gmfn);
+        gl3pa = sh_map_domain_page(l3mfn);
         gl3e = (guest_l3e_t *)(gl3pa + ((unsigned long)gpa & ~PAGE_MASK));
     }
     for ( i = 0; i < 4; i++ )
     {
+        unsigned long gfn;
+        mfn_t smfn, gmfn;
+
         if ( fast_path )
             smfn = _mfn(pagetable_get_pfn(v->arch.shadow_table[i]));
         else
         {
             /* retrieving the l2s */
             gl2a = guest_l3e_get_paddr(gl3e[i]);
-            gmfn = gfn_to_mfn_query(v->domain, _gfn(gl2a >> PAGE_SHIFT), &p2mt);
+            gfn = gl2a >> PAGE_SHIFT;
+            gmfn = get_gfn_query(v->domain, _gfn(gfn), &p2mt);
             smfn = shadow_hash_lookup(v, mfn_x(gmfn), SH_type_l2_pae_shadow);
+            put_gfn(v->domain, gfn);
         }
 
         if ( mfn_valid(smfn) )
@@ -4747,6 +4772,7 @@ static void sh_pagetable_dying(struct vc
 out:
     if ( !fast_path )
         unmap_domain_page(gl3pa);
+    put_gfn(v->domain, l3gfn);
     paging_unlock(v->domain);
 }
 #else
@@ -4757,12 +4783,14 @@ static void sh_pagetable_dying(struct vc
 
     paging_lock(v->domain);
 
-    gmfn = gfn_to_mfn_query(v->domain, _gfn(gpa >> PAGE_SHIFT), &p2mt);
+    gmfn = get_gfn_query(v->domain, _gfn(gpa >> PAGE_SHIFT), &p2mt);
 #if GUEST_PAGING_LEVELS == 2
     smfn = shadow_hash_lookup(v, mfn_x(gmfn), SH_type_l2_32_shadow);
 #else
     smfn = shadow_hash_lookup(v, mfn_x(gmfn), SH_type_l4_64_shadow);
 #endif
+    put_gfn(v->domain, gpa >> PAGE_SHIFT);
+    
     if ( mfn_valid(smfn) )
     {
         mfn_to_page(gmfn)->shadow_flags |= SHF_pagetable_dying;
@@ -4811,15 +4839,22 @@ static mfn_t emulate_gva_to_mfn(struct v
 
     /* Translate the GFN to an MFN */
     ASSERT(!paging_locked_by_me(v->domain));
-    mfn = gfn_to_mfn_guest(v->domain, _gfn(gfn), &p2mt);
+    mfn = get_gfn_guest(v->domain, _gfn(gfn), &p2mt);
         
     if ( p2m_is_readonly(p2mt) )
+    {
+        put_gfn(v->domain, gfn);
         return _mfn(READONLY_GFN);
+    }
     if ( !p2m_is_ram(p2mt) )
+    {
+        put_gfn(v->domain, gfn);
         return _mfn(BAD_GFN_TO_MFN);
+    }
 
     ASSERT(mfn_valid(mfn));
     v->arch.paging.last_write_was_pt = !!sh_mfn_is_a_page_table(mfn);
+    put_gfn(v->domain, gfn);
     return mfn;
 }
 
@@ -5220,7 +5255,7 @@ int sh_audit_l1_table(struct vcpu *v, mf
             {
                 gfn = guest_l1e_get_gfn(*gl1e);
                 mfn = shadow_l1e_get_mfn(*sl1e);
-                gmfn = gfn_to_mfn_query(v->domain, gfn, &p2mt);
+                gmfn = get_gfn_query_unlocked(v->domain, gfn_x(gfn), &p2mt);
                 if ( !p2m_is_grant(p2mt) && mfn_x(gmfn) != mfn_x(mfn) )
                     AUDIT_FAIL(1, "bad translation: gfn %" SH_PRI_gfn
                                " --> %" PRI_mfn " != mfn %" PRI_mfn,
@@ -5291,16 +5326,17 @@ int sh_audit_l2_table(struct vcpu *v, mf
             mfn = shadow_l2e_get_mfn(*sl2e);
             gmfn = (guest_l2e_get_flags(*gl2e) & _PAGE_PSE)  
                 ? get_fl1_shadow_status(v, gfn)
-                : get_shadow_status(v, gfn_to_mfn_query(v->domain, gfn, &p2mt),
-                                    SH_type_l1_shadow);
+                : get_shadow_status(v, 
+                    get_gfn_query_unlocked(v->domain, gfn_x(gfn), 
+                                        &p2mt), SH_type_l1_shadow);
             if ( mfn_x(gmfn) != mfn_x(mfn) )
                 AUDIT_FAIL(2, "bad translation: gfn %" SH_PRI_gfn
                            " (--> %" PRI_mfn ")"
                            " --> %" PRI_mfn " != mfn %" PRI_mfn,
                            gfn_x(gfn), 
                            (guest_l2e_get_flags(*gl2e) & _PAGE_PSE) ? 0
-                           : mfn_x(gfn_to_mfn_query(v->domain,
-                                   gfn, &p2mt)), mfn_x(gmfn), mfn_x(mfn));
+                           : mfn_x(get_gfn_query_unlocked(v->domain,
+                                   gfn_x(gfn), &p2mt)), mfn_x(gmfn), mfn_x(mfn));
         }
     });
     sh_unmap_domain_page(gp);
@@ -5339,7 +5375,8 @@ int sh_audit_l3_table(struct vcpu *v, mf
         {
             gfn = guest_l3e_get_gfn(*gl3e);
             mfn = shadow_l3e_get_mfn(*sl3e);
-            gmfn = get_shadow_status(v, gfn_to_mfn_query(v->domain, gfn, &p2mt),
+            gmfn = get_shadow_status(v, get_gfn_query_unlocked(
+                                        v->domain, gfn_x(gfn), &p2mt),
                                      ((GUEST_PAGING_LEVELS == 3 ||
                                        is_pv_32on64_vcpu(v))
                                       && !shadow_mode_external(v->domain)
@@ -5387,8 +5424,8 @@ int sh_audit_l4_table(struct vcpu *v, mf
         {
             gfn = guest_l4e_get_gfn(*gl4e);
             mfn = shadow_l4e_get_mfn(*sl4e);
-            gmfn = get_shadow_status(v, gfn_to_mfn_query(v->domain,
-                                     gfn, &p2mt), 
+            gmfn = get_shadow_status(v, get_gfn_query_unlocked(
+                                     v->domain, gfn_x(gfn), &p2mt), 
                                      SH_type_l3_shadow);
             if ( mfn_x(gmfn) != mfn_x(mfn) )
                 AUDIT_FAIL(4, "bad translation: gfn %" SH_PRI_gfn
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/mm/shadow/types.h
--- a/xen/arch/x86/mm/shadow/types.h
+++ b/xen/arch/x86/mm/shadow/types.h
@@ -191,11 +191,11 @@ static inline shadow_l4e_t shadow_l4e_fr
 })
 #endif
 
- /* Override gfn_to_mfn to work with gfn_t */
-#undef gfn_to_mfn_query
-#define gfn_to_mfn_query(d, g, t) gfn_to_mfn_type((d), gfn_x(g), (t), p2m_query)
-#undef gfn_to_mfn_guest
-#define gfn_to_mfn_guest(d, g, t) gfn_to_mfn_type((d), gfn_x(g), (t), p2m_guest)
+ /* Override get_gfn to work with gfn_t */
+#undef get_gfn_query
+#define get_gfn_query(d, g, t) get_gfn_type((d), gfn_x(g), (t), p2m_query)
+#undef get_gfn_guest
+#define get_gfn_guest(d, g, t) get_gfn_type((d), gfn_x(g), (t), p2m_guest)
 
 /* The shadow types needed for the various levels. */
 
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/physdev.c
--- a/xen/arch/x86/physdev.c
+++ b/xen/arch/x86/physdev.c
@@ -297,16 +297,20 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
             break;
 
         ret = -EINVAL;
-        mfn = gmfn_to_mfn(current->domain, info.gmfn);
+        mfn = get_gfn_untyped(current->domain, info.gmfn);
         if ( !mfn_valid(mfn) ||
              !get_page_and_type(mfn_to_page(mfn), v->domain,
                                 PGT_writable_page) )
+        {
+            put_gfn(current->domain, info.gmfn);
             break;
+        }
 
         if ( cmpxchg(&v->domain->arch.pv_domain.pirq_eoi_map_mfn,
                      0, mfn) != 0 )
         {
             put_page_and_type(mfn_to_page(mfn));
+            put_gfn(current->domain, info.gmfn);
             ret = -EBUSY;
             break;
         }
@@ -316,10 +320,12 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
         {
             v->domain->arch.pv_domain.pirq_eoi_map_mfn = 0;
             put_page_and_type(mfn_to_page(mfn));
+            put_gfn(current->domain, info.gmfn);
             ret = -ENOSPC;
             break;
         }
 
+        put_gfn(current->domain, info.gmfn);
         ret = 0;
         break;
     }
diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -673,11 +673,12 @@ int wrmsr_hypervisor_regs(uint32_t idx, 
             return 0;
         }
 
-        mfn = gmfn_to_mfn(d, gmfn);
+        mfn = get_gfn_untyped(d, gmfn);
 
         if ( !mfn_valid(mfn) ||
              !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
         {
+            put_gfn(d, gmfn);
             gdprintk(XENLOG_WARNING,
                      "Bad GMFN %lx (MFN %lx) to MSR %08x\n",
                      gmfn, mfn, base + idx);
@@ -689,6 +690,7 @@ int wrmsr_hypervisor_regs(uint32_t idx, 
         unmap_domain_page(hypercall_page);
 
         put_page_and_type(mfn_to_page(mfn));
+        put_gfn(d, gmfn);
         break;
     }
 
@@ -2347,18 +2349,25 @@ static int emulate_privileged_op(struct 
             arch_set_cr2(v, *reg);
             break;
 
-        case 3: /* Write CR3 */
+        case 3: {/* Write CR3 */
+            unsigned long mfn, gfn;
             domain_lock(v->domain);
             if ( !is_pv_32on64_vcpu(v) )
-                rc = new_guest_cr3(gmfn_to_mfn(v->domain, xen_cr3_to_pfn(*reg)));
+            {
+                gfn = xen_cr3_to_pfn(*reg);
 #ifdef CONFIG_COMPAT
-            else
-                rc = new_guest_cr3(gmfn_to_mfn(v->domain, compat_cr3_to_pfn(*reg)));
+            } else {
+                gfn = compat_cr3_to_pfn(*reg);
 #endif
+            }
+            mfn = get_gfn_untyped(v->domain, gfn);
+            rc = new_guest_cr3(mfn);
+            put_gfn(v->domain, gfn);
             domain_unlock(v->domain);
             if ( rc == 0 ) /* not okay */
                 goto fail;
             break;
+        }
 
         case 4: /* Write CR4 */
             v->arch.pv_vcpu.ctrlreg[4] = pv_guest_cr4_fixup(v, *reg);
diff -r f07d4ebe5248 -r e9fd07479f68 xen/common/grant_table.c
--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
@@ -110,7 +110,7 @@ static unsigned inline int max_nr_maptra
 #define gfn_to_mfn_private(_d, _gfn) ({                     \
     p2m_type_t __p2mt;                                      \
     unsigned long __x;                                      \
-    __x = mfn_x(gfn_to_mfn_unshare((_d), (_gfn), &__p2mt)); \
+    __x = mfn_x(get_gfn_unshare((_d), (_gfn), &__p2mt));    \
     BUG_ON(p2m_is_shared(__p2mt)); /* XXX fixme */          \
     if ( !p2m_is_valid(__p2mt) )                            \
         __x = INVALID_MFN;                                  \
@@ -150,10 +150,10 @@ static int __get_paged_frame(unsigned lo
     mfn_t mfn;
 
     if ( readonly )
-        mfn = gfn_to_mfn(rd, gfn, &p2mt);
+        mfn = get_gfn(rd, gfn, &p2mt);
     else
     {
-        mfn = gfn_to_mfn_unshare(rd, gfn, &p2mt);
+        mfn = get_gfn_unshare(rd, gfn, &p2mt);
         BUG_ON(p2m_is_shared(p2mt));
         /* XXX Here, and above in gfn_to_mfn_private, need to handle
          * XXX failure to unshare. */
@@ -164,14 +164,16 @@ static int __get_paged_frame(unsigned lo
         if ( p2m_is_paging(p2mt) )
         {
             p2m_mem_paging_populate(rd, gfn);
+            put_gfn(rd, gfn);
             rc = GNTST_eagain;
         }
     } else {
+       put_gfn(rd, gfn);
        *frame = INVALID_MFN;
        rc = GNTST_bad_page;
     }
 #else
-    *frame = readonly ? gmfn_to_mfn(rd, gfn) : gfn_to_mfn_private(rd, gfn);
+    *frame = readonly ? get_gfn_untyped(rd, gfn) : gfn_to_mfn_private(rd, gfn);
 #endif
 
     return rc;
@@ -468,13 +470,14 @@ __gnttab_map_grant_ref(
     struct domain *ld, *rd, *owner;
     struct vcpu   *led;
     int            handle;
+    unsigned long gfn = INVALID_GFN;
     unsigned long  frame = 0, nr_gets = 0;
     struct page_info *pg;
     int            rc = GNTST_okay;
     u32            old_pin;
     u32            act_pin;
     unsigned int   cache_flags;
-    struct active_grant_entry *act;
+    struct active_grant_entry *act = NULL;
     struct grant_mapping *mt;
     grant_entry_v1_t *sha1;
     grant_entry_v2_t *sha2;
@@ -565,7 +568,6 @@ __gnttab_map_grant_ref(
 
         if ( !act->pin )
         {
-            unsigned long gfn;
             unsigned long frame;
 
             gfn = sha1 ? sha1->frame : sha2->full_page.frame;
@@ -698,6 +700,7 @@ __gnttab_map_grant_ref(
     op->handle       = handle;
     op->status       = GNTST_okay;
 
+    put_gfn(rd, gfn);
     rcu_unlock_domain(rd);
     return;
 
@@ -735,6 +738,8 @@ __gnttab_map_grant_ref(
         gnttab_clear_flag(_GTF_reading, status);
 
  unlock_out:
+    if ( gfn != INVALID_GFN )
+        put_gfn(rd, gfn);
     spin_unlock(&rd->grant_table->lock);
     op->status = rc;
     put_maptrack_handle(ld->grant_table, handle);
@@ -1475,6 +1480,7 @@ gnttab_transfer(
         /* Check the passed page frame for basic validity. */
         if ( unlikely(!mfn_valid(mfn)) )
         { 
+            put_gfn(d, gop.mfn);
             gdprintk(XENLOG_INFO, "gnttab_transfer: out-of-range %lx\n",
                     (unsigned long)gop.mfn);
             gop.status = GNTST_bad_page;
@@ -1484,6 +1490,7 @@ gnttab_transfer(
         page = mfn_to_page(mfn);
         if ( unlikely(is_xen_heap_page(page)) )
         { 
+            put_gfn(d, gop.mfn);
             gdprintk(XENLOG_INFO, "gnttab_transfer: xen frame %lx\n",
                     (unsigned long)gop.mfn);
             gop.status = GNTST_bad_page;
@@ -1492,6 +1499,7 @@ gnttab_transfer(
 
         if ( steal_page(d, page, 0) < 0 )
         {
+            put_gfn(d, gop.mfn);
             gop.status = GNTST_bad_page;
             goto copyback;
         }
@@ -1504,6 +1512,7 @@ gnttab_transfer(
         /* Find the target domain. */
         if ( unlikely((e = rcu_lock_domain_by_id(gop.domid)) == NULL) )
         {
+            put_gfn(d, gop.mfn);
             gdprintk(XENLOG_INFO, "gnttab_transfer: can't find domain %d\n",
                     gop.domid);
             page->count_info &= ~(PGC_count_mask|PGC_allocated);
@@ -1514,6 +1523,7 @@ gnttab_transfer(
 
         if ( xsm_grant_transfer(d, e) )
         {
+            put_gfn(d, gop.mfn);
             gop.status = GNTST_permission_denied;
         unlock_and_copyback:
             rcu_unlock_domain(e);
@@ -1566,6 +1576,7 @@ gnttab_transfer(
                         e->tot_pages, e->max_pages, gop.ref, e->is_dying);
             spin_unlock(&e->page_alloc_lock);
             rcu_unlock_domain(e);
+            put_gfn(d, gop.mfn);
             page->count_info &= ~(PGC_count_mask|PGC_allocated);
             free_domheap_page(page);
             gop.status = GNTST_general_error;
@@ -1579,6 +1590,7 @@ gnttab_transfer(
         page_set_owner(page, e);
 
         spin_unlock(&e->page_alloc_lock);
+        put_gfn(d, gop.mfn);
 
         TRACE_1D(TRC_MEM_PAGE_GRANT_TRANSFER, e->domain_id);
 
@@ -1850,6 +1862,8 @@ __acquire_grant_for_copy(
         {
             gfn = sha1->frame;
             rc = __get_paged_frame(gfn, &grant_frame, readonly, rd);
+            /* We drop this immediately per the comments at the top */
+            put_gfn(rd, gfn);
             if ( rc != GNTST_okay )
                 goto unlock_out;
             act->gfn = gfn;
@@ -1862,6 +1876,7 @@ __acquire_grant_for_copy(
         {
             gfn = sha2->full_page.frame;
             rc = __get_paged_frame(gfn, &grant_frame, readonly, rd);
+            put_gfn(rd, gfn);
             if ( rc != GNTST_okay )
                 goto unlock_out;
             act->gfn = gfn;
@@ -1874,6 +1889,7 @@ __acquire_grant_for_copy(
         {
             gfn = sha2->sub_page.frame;
             rc = __get_paged_frame(gfn, &grant_frame, readonly, rd);
+            put_gfn(rd, gfn);
             if ( rc != GNTST_okay )
                 goto unlock_out;
             act->gfn = gfn;
@@ -1973,6 +1989,7 @@ __gnttab_copy(
     {
 #ifdef CONFIG_X86
         rc = __get_paged_frame(op->source.u.gmfn, &s_frame, 1, sd);
+        put_gfn(sd, op->source.u.gmfn);
         if ( rc != GNTST_okay )
             goto error_out;
 #else
@@ -2012,6 +2029,7 @@ __gnttab_copy(
     {
 #ifdef CONFIG_X86
         rc = __get_paged_frame(op->dest.u.gmfn, &d_frame, 0, dd);
+        put_gfn(dd, op->dest.u.gmfn);
         if ( rc != GNTST_okay )
             goto error_out;
 #else
diff -r f07d4ebe5248 -r e9fd07479f68 xen/common/memory.c
--- a/xen/common/memory.c
+++ b/xen/common/memory.c
@@ -162,11 +162,12 @@ int guest_remove_page(struct domain *d, 
     unsigned long mfn;
 
 #ifdef CONFIG_X86
-    mfn = mfn_x(gfn_to_mfn(d, gmfn, &p2mt)); 
+    mfn = mfn_x(get_gfn(d, gmfn, &p2mt)); 
     if ( unlikely(p2m_is_paging(p2mt)) )
     {
         guest_physmap_remove_page(d, gmfn, mfn, 0);
         p2m_mem_paging_drop_page(d, gmfn);
+        put_gfn(d, gmfn);
         return 1;
     }
 #else
@@ -174,6 +175,7 @@ int guest_remove_page(struct domain *d, 
 #endif
     if ( unlikely(!mfn_valid(mfn)) )
     {
+        put_gfn(d, gmfn);
         gdprintk(XENLOG_INFO, "Domain %u page number %lx invalid\n",
                 d->domain_id, gmfn);
         return 0;
@@ -187,12 +189,14 @@ int guest_remove_page(struct domain *d, 
     {
         put_page_and_type(page);
         guest_physmap_remove_page(d, gmfn, mfn, 0);
+        put_gfn(d, gmfn);
         return 1;
     }
 
 #endif /* CONFIG_X86 */
     if ( unlikely(!get_page(page, d)) )
     {
+        put_gfn(d, gmfn);
         gdprintk(XENLOG_INFO, "Bad page free for domain %u\n", d->domain_id);
         return 0;
     }
@@ -204,6 +208,7 @@ int guest_remove_page(struct domain *d, 
         put_page(page);
 
     guest_physmap_remove_page(d, gmfn, mfn, 0);
+    put_gfn(d, gmfn);
 
     put_page(page);
 
@@ -363,9 +368,10 @@ static long memory_exchange(XEN_GUEST_HA
                 p2m_type_t p2mt;
 
                 /* Shared pages cannot be exchanged */
-                mfn = mfn_x(gfn_to_mfn_unshare(d, gmfn + k, &p2mt));
+                mfn = mfn_x(get_gfn_unshare(d, gmfn + k, &p2mt));
                 if ( p2m_is_shared(p2mt) )
                 {
+                    put_gfn(d, gmfn + k);
                     rc = -ENOMEM;
                     goto fail; 
                 }
@@ -374,6 +380,7 @@ static long memory_exchange(XEN_GUEST_HA
 #endif
                 if ( unlikely(!mfn_valid(mfn)) )
                 {
+                    put_gfn(d, gmfn + k);
                     rc = -EINVAL;
                     goto fail;
                 }
@@ -382,11 +389,13 @@ static long memory_exchange(XEN_GUEST_HA
 
                 if ( unlikely(steal_page(d, page, MEMF_no_refcount)) )
                 {
+                    put_gfn(d, gmfn + k);
                     rc = -EINVAL;
                     goto fail;
                 }
 
                 page_list_add(page, &in_chunk_list);
+                put_gfn(d, gmfn + k);
             }
         }
 
diff -r f07d4ebe5248 -r e9fd07479f68 xen/common/tmem_xen.c
--- a/xen/common/tmem_xen.c
+++ b/xen/common/tmem_xen.c
@@ -109,22 +109,28 @@ static inline void *cli_get_page(tmem_cl
     struct page_info *page;
     int ret;
 
-    cli_mfn = mfn_x(gfn_to_mfn(current->domain, cmfn, &t));
+    cli_mfn = mfn_x(get_gfn(current->domain, cmfn, &t));
     if ( t != p2m_ram_rw || !mfn_valid(cli_mfn) )
+    {
+            put_gfn(current->domain, (unsigned long) cmfn);
             return NULL;
+    }
     page = mfn_to_page(cli_mfn);
     if ( cli_write )
         ret = get_page_and_type(page, current->domain, PGT_writable_page);
     else
         ret = get_page(page, current->domain);
     if ( !ret )
+    {
+        put_gfn(current->domain, (unsigned long) cmfn);
         return NULL;
+    }
     *pcli_mfn = cli_mfn;
     *pcli_pfp = (pfp_t *)page;
     return map_domain_page(cli_mfn);
 }
 
-static inline void cli_put_page(void *cli_va, pfp_t *cli_pfp,
+static inline void cli_put_page(tmem_cli_mfn_t cmfn, void *cli_va, pfp_t *cli_pfp,
                                 unsigned long cli_mfn, bool_t mark_dirty)
 {
     if ( mark_dirty )
@@ -135,6 +141,7 @@ static inline void cli_put_page(void *cl
     else
         put_page((struct page_info *)cli_pfp);
     unmap_domain_page(cli_va);
+    put_gfn(current->domain, (unsigned long) cmfn);
 }
 #endif
 
@@ -169,7 +176,7 @@ EXPORT int tmh_copy_from_client(pfp_t *p
               (pfn_offset+len <= PAGE_SIZE) )
         memcpy((char *)tmem_va+tmem_offset,(char *)cli_va+pfn_offset,len);
     if ( !tmemc )
-        cli_put_page(cli_va, cli_pfp, cli_mfn, 0);
+        cli_put_page(cmfn, cli_va, cli_pfp, cli_mfn, 0);
     unmap_domain_page(tmem_va);
     return 1;
 }
@@ -197,7 +204,7 @@ EXPORT int tmh_compress_from_client(tmem
     ASSERT(ret == LZO_E_OK);
     *out_va = dmem;
     if ( !tmemc )
-        cli_put_page(cli_va, cli_pfp, cli_mfn, 0);
+        cli_put_page(cmfn, cli_va, cli_pfp, cli_mfn, 0);
     unmap_domain_page(cli_va);
     return 1;
 }
@@ -225,7 +232,7 @@ EXPORT int tmh_copy_to_client(tmem_cli_m
         memcpy((char *)cli_va+pfn_offset,(char *)tmem_va+tmem_offset,len);
     unmap_domain_page(tmem_va);
     if ( !tmemc )
-        cli_put_page(cli_va, cli_pfp, cli_mfn, 1);
+        cli_put_page(cmfn, cli_va, cli_pfp, cli_mfn, 1);
     mb();
     return 1;
 }
@@ -249,7 +256,7 @@ EXPORT int tmh_decompress_to_client(tmem
     ASSERT(ret == LZO_E_OK);
     ASSERT(out_len == PAGE_SIZE);
     if ( !tmemc )
-        cli_put_page(cli_va, cli_pfp, cli_mfn, 1);
+        cli_put_page(cmfn, cli_va, cli_pfp, cli_mfn, 1);
     mb();
     return 1;
 }
@@ -271,7 +278,7 @@ EXPORT int tmh_copy_tze_to_client(tmem_c
         memcpy((char *)cli_va,(char *)tmem_va,len);
     if ( len < PAGE_SIZE )
         memset((char *)cli_va+len,0,PAGE_SIZE-len);
-    cli_put_page(cli_va, cli_pfp, cli_mfn, 1);
+    cli_put_page(cmfn, cli_va, cli_pfp, cli_mfn, 1);
     mb();
     return 1;
 }
diff -r f07d4ebe5248 -r e9fd07479f68 xen/include/asm-ia64/mm.h
--- a/xen/include/asm-ia64/mm.h
+++ b/xen/include/asm-ia64/mm.h
@@ -549,6 +549,8 @@ extern u64 translate_domain_pte(u64 ptev
 #define gmfn_to_mfn(_d, gpfn)			\
     gmfn_to_mfn_foreign((_d), (gpfn))
 
+#define put_gfn(d, g)   ((void)0)
+
 #define __gpfn_invalid(_d, gpfn)			\
 	(lookup_domain_mpa((_d), ((gpfn)<<PAGE_SHIFT), NULL) == INVALID_MFN)
 
diff -r f07d4ebe5248 -r e9fd07479f68 xen/include/asm-x86/guest_pt.h
--- a/xen/include/asm-x86/guest_pt.h
+++ b/xen/include/asm-x86/guest_pt.h
@@ -51,9 +51,9 @@ gfn_to_paddr(gfn_t gfn)
     return ((paddr_t)gfn_x(gfn)) << PAGE_SHIFT;
 }
 
-/* Override gfn_to_mfn to work with gfn_t */
-#undef gfn_to_mfn
-#define gfn_to_mfn(d, g, t) gfn_to_mfn_type((d), gfn_x(g), (t), p2m_alloc)
+/* Override get_gfn to work with gfn_t */
+#undef get_gfn
+#define get_gfn(d, g, t) get_gfn_type((d), gfn_x(g), (t), p2m_alloc)
 
 
 /* Types of the guest's page tables and access functions for them */
diff -r f07d4ebe5248 -r e9fd07479f68 xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h
+++ b/xen/include/asm-x86/hvm/hvm.h
@@ -394,7 +394,10 @@ int hvm_virtual_to_linear_addr(
 
 void *hvm_map_guest_frame_rw(unsigned long gfn);
 void *hvm_map_guest_frame_ro(unsigned long gfn);
-void hvm_unmap_guest_frame(void *p);
+/* We pass back either the guest virtual or physical frame mapped,
+ * in order to drop any locks/refcounts we may have had on p2m 
+ * entries or underlying mfn's while using the map */
+void hvm_unmap_guest_frame(void *p, unsigned long addr, int is_va);
 
 static inline void hvm_set_info_guest(struct vcpu *v)
 {
diff -r f07d4ebe5248 -r e9fd07479f68 xen/include/asm-x86/hvm/vmx/vvmx.h
--- a/xen/include/asm-x86/hvm/vmx/vvmx.h
+++ b/xen/include/asm-x86/hvm/vmx/vvmx.h
@@ -25,6 +25,7 @@
 
 struct nestedvmx {
     paddr_t    vmxon_region_pa;
+    unsigned long iobitmap_gfn[2];
     void       *iobitmap[2];		/* map (va) of L1 guest I/O bitmap */
     /* deferred nested interrupt */
     struct {
diff -r f07d4ebe5248 -r e9fd07479f68 xen/include/asm-x86/p2m.h
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -305,9 +305,12 @@ struct p2m_domain *p2m_get_p2m(struct vc
 
 #define p2m_get_pagetable(p2m)  ((p2m)->phys_table)
 
+/**** p2m query accessors. After calling any of the variants below, you
+ * need to call put_gfn(domain, gfn). If you don't, you'll lock the
+ * hypervisor. ****/
 
 /* Read a particular P2M table, mapping pages as we go.  Most callers
- * should _not_ call this directly; use the other gfn_to_mfn_* functions
+ * should _not_ call this directly; use the other get_gfn* functions
  * below unless you know you want to walk a p2m that isn't a domain's
  * main one.
  * If the lookup succeeds, the return value is != INVALID_MFN and 
@@ -318,7 +321,7 @@ mfn_t gfn_to_mfn_type_p2m(struct p2m_dom
                     unsigned int *page_order);
 
 /* General conversion function from gfn to mfn */
-static inline mfn_t gfn_to_mfn_type(struct domain *d,
+static inline mfn_t get_gfn_type(struct domain *d,
                                     unsigned long gfn, p2m_type_t *t,
                                     p2m_query_t q)
 {
@@ -327,25 +330,39 @@ static inline mfn_t gfn_to_mfn_type(stru
 }
 
 /* Syntactic sugar: most callers will use one of these. 
- * N.B. gfn_to_mfn_query() is the _only_ one guaranteed not to take the
+ * N.B. get_gfn_query() is the _only_ one guaranteed not to take the
  * p2m lock; none of the others can be called with the p2m or paging
  * lock held. */
-#define gfn_to_mfn(d, g, t)         gfn_to_mfn_type((d), (g), (t), p2m_alloc)
-#define gfn_to_mfn_query(d, g, t)   gfn_to_mfn_type((d), (g), (t), p2m_query)
-#define gfn_to_mfn_guest(d, g, t)   gfn_to_mfn_type((d), (g), (t), p2m_guest)
-#define gfn_to_mfn_unshare(d, g, t) gfn_to_mfn_type((d), (g), (t), p2m_unshare)
+#define get_gfn(d, g, t)         get_gfn_type((d), (g), (t), p2m_alloc)
+#define get_gfn_query(d, g, t)   get_gfn_type((d), (g), (t), p2m_query)
+#define get_gfn_guest(d, g, t)   get_gfn_type((d), (g), (t), p2m_guest)
+#define get_gfn_unshare(d, g, t) get_gfn_type((d), (g), (t), p2m_unshare)
 
 /* Compatibility function exporting the old untyped interface */
-static inline unsigned long gmfn_to_mfn(struct domain *d, unsigned long gpfn)
+static inline unsigned long get_gfn_untyped(struct domain *d, unsigned long gpfn)
 {
     mfn_t mfn;
     p2m_type_t t;
-    mfn = gfn_to_mfn(d, gpfn, &t);
+    mfn = get_gfn(d, gpfn, &t);
     if ( p2m_is_valid(t) )
         return mfn_x(mfn);
     return INVALID_MFN;
 }
 
+/* This is a noop for now. */
+static inline void put_gfn(struct domain *d, unsigned long gfn)
+{
+}
+
+/* These are identical for now. The intent is to have the caller not worry 
+ * about put_gfn. To only be used in printk's, crash situations, or to 
+ * peek at a type. You're not holding the p2m entry exclsively after calling
+ * this. */
+#define get_gfn_unlocked(d, g, t)         get_gfn_type((d), (g), (t), p2m_alloc)
+#define get_gfn_query_unlocked(d, g, t)   get_gfn_type((d), (g), (t), p2m_query)
+#define get_gfn_guest_unlocked(d, g, t)   get_gfn_type((d), (g), (t), p2m_guest)
+#define get_gfn_unshare_unlocked(d, g, t) get_gfn_type((d), (g), (t), p2m_unshare)
+
 /* General conversion function from mfn to gfn */
 static inline unsigned long mfn_to_gfn(struct domain *d, mfn_t mfn)
 {
@@ -529,7 +546,8 @@ static inline int p2m_gfn_check_limit(
 #define p2m_gfn_check_limit(d, g, o) 0
 #endif
 
-/* Directly set a p2m entry: only for use by p2m code */
+/* Directly set a p2m entry: only for use by p2m code. Does not need
+ * a call to put_gfn afterwards/ */
 int set_p2m_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn, 
                   unsigned int page_order, p2m_type_t p2mt, p2m_access_t p2ma);
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 20:25:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 20:25:00 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNdF5-00009u-Vo; Mon, 07 Nov 2011 20:25:00 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNdDx-0008Ok-Q6
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 20:23:50 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1320726226!2655723!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12744 invoked from network); 8 Nov 2011 04:23:46 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-12.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 04:23:46 -0000
X-IronPort-AV: E=Sophos;i="4.69,474,1315180800"; 
   d="scan'208";a="8806982"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 04:23:46 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 04:23:46 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RNdDu-0007Yh-3T;
	Tue, 08 Nov 2011 04:23:46 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RNdDu-0001ms-3B;
	Tue, 08 Nov 2011 04:23:46 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9725-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 8 Nov 2011 04:23:46 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9725: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9725 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9725/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 build-amd64-oldkern           2 host-install(2)              broken
 build-amd64-pvops             2 host-install(2)              broken
 build-amd64                   2 host-install(2)              broken
 test-amd64-i386-rhel6hvm-intel  3 host-install(3)              broken  in 9722
 test-amd64-amd64-xl           3 host-install(3)              broken   in 9722
 test-amd64-i386-xl           18 leak-check/check   fail in 9722 REGR. vs. 9661
 test-amd64-i386-xl-credit2   18 leak-check/check   fail in 9722 REGR. vs. 9661
 test-amd64-amd64-xl-sedf     11 guest-localmigrate fail in 9722 REGR. vs. 9659
 test-amd64-i386-xl-multivcpu 18 leak-check/check   fail in 9722 REGR. vs. 9661
 test-amd64-i386-xl-win-vcpus1  3 host-install(3)              broken   in 9722

Tests which are failing intermittently (not blocking):
 test-i386-i386-win           14 guest-start.2                fail pass in 9722

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pv            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pair          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-amd64-xl-pcipt-intel  9 guest-start         fail in 9722 never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2          fail in 9722 never pass
 test-amd64-amd64-win         16 leak-check/check       fail in 9722 never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check       fail in 9722 never pass
 test-amd64-i386-win          16 leak-check/check       fail in 9722 never pass
 test-amd64-amd64-xl-win      13 guest-stop             fail in 9722 never pass
 test-i386-i386-win           16 leak-check/check       fail in 9722 never pass

version targeted for testing:
 xen                  4e13729a0adf
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Juergen Gross <juergen.gross@ts.fujitsu.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  broken  
 build-i386                                                   pass    
 build-amd64-oldkern                                          broken  
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           blocked 
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 blocked 
 test-amd64-i386-xl-credit2                                   blocked 
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               blocked 
 test-amd64-i386-xl-multivcpu                                 blocked 
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         blocked 
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           blocked 
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   blocked 
 test-amd64-i386-xl-win-vcpus1                                blocked 
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          blocked 
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

(No revision log; it would be 336 lines long.)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 07 23:43:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 07 Nov 2011 23:43:18 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNgL0-0004vV-KS; Mon, 07 Nov 2011 23:43:18 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNgKL-0004j7-9N
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 23:42:37 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1320738154!2269572!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5244 invoked from network); 8 Nov 2011 07:42:34 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 07:42:34 -0000
X-IronPort-AV: E=Sophos;i="4.69,476,1315180800"; 
   d="scan'208";a="8808157"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 07:42:33 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 07:42:34 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNgKH-0000Dt-Ik;
	Tue, 08 Nov 2011 07:42:33 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNgK9-0001tP-4z;
	Tue, 08 Nov 2011 07:42:25 +0000
Date: Tue, 8 Nov 2011 07:42:25 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: "Kay, Allen M" <allen.m.kay@intel.com>
Message-ID: <20111108074225.GA7257@spongy.cam.xci-test.com>
References: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
	<987664A83D2D224EAE907B061CE93D530206CE00D0@orsmsx505.amr.corp.intel.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
In-Reply-To: <987664A83D2D224EAE907B061CE93D530206CE00D0@orsmsx505.amr.corp.intel.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Tim \(Xen.org\)" <tim@xen.org>, Jean Guyader <Jean.Guyader@citrix.com>
Subject: [Xen-devel] Re: [PATCH 1/6] vtd: Refactor iotlb flush code
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


Allen,

You are probably talking about __intel_iommu_iotlb_flush.
This function takes a range of address to flush. I haven't
found a function in the vtd code to invalidate a range on
address without doing a loop of flush_iotlb_psi, so I thought
that the most efficient and quick way to flush a range would
be to use a domain selective invalidation.

Jean

On 08/11 03:10, Kay, Allen M wrote:
> Jean,
> 
> The original code does not call iommu_flush_iotlb_dsi().  What is the reason the refractored code need to use domain selective invalidation?
> 
> Allen
> -----
> 
> +        if ( page_count > 1 || gfn == -1 )
> +        {
> +            if ( iommu_flush_iotlb_dsi(iommu, iommu_domid,
> +                        0, flush_dev_iotlb) )
> +                iommu_flush_write_buffer(iommu);
> +        }
> +        else
> +        {
> +            if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
> +                        (paddr_t)gfn << PAGE_SHIFT_4K, 0,
> +                        !dma_old_pte_present, flush_dev_iotlb) )
> +                iommu_flush_write_buffer(iommu);
> 
> -----Original Message-----
> From: Jean Guyader [mailto:jean.guyader@eu.citrix.com] 
> Sent: Monday, November 07, 2011 10:25 AM
> To: xen-devel@lists.xensource.com
> Cc: tim@xen.org; Kay, Allen M; Jean Guyader
> Subject: [PATCH 1/6] vtd: Refactor iotlb flush code
> 
> 
> Factorize the iotlb flush code from map_page and unmap_page into it's own function.
> 
> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> ---
>  xen/drivers/passthrough/vtd/iommu.c |   86 +++++++++++++++++-----------------
>  1 files changed, 43 insertions(+), 43 deletions(-)
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 02:18:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 02:18:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNilc-0007kT-Lg; Tue, 08 Nov 2011 02:18:56 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNike-0007Xg-Px
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 02:17:57 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1320747472!700081!1
X-Originating-IP: [137.65.248.74]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30861 invoked from network); 8 Nov 2011 10:17:53 -0000
Received: from novprvoes0310.provo.novell.com (HELO
	novprvoes0310.provo.novell.com) (137.65.248.74)
	by server-14.tower-174.messagelabs.com with SMTP;
	8 Nov 2011 10:17:53 -0000
Received: from INET-PRV-MTA by novprvoes0310.provo.novell.com
	with Novell_GroupWise; Tue, 08 Nov 2011 03:17:29 -0700
Message-Id: <4EB8F549020000780005F87C@novprvoes0310.provo.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 Beta 
Date: Tue, 08 Nov 2011 01:24:25 -0700
From: "Jan Beulich" <JBeulich@suse.com>
To: <Jean.Guyader@citrix.com>,
 "Jean Guyader" <jean.guyader@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 2/6] iommu: Introduce iommu_flush and
	iommu_flush_all.
References: <1320678999-24995-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-3-git-send-email-jean.guyader@eu.citrix.com>
	<4EB8188B020000780005F6E4@novprvoes0310.provo.novell.com>
	<20111107170601.GB26428@spongy.cam.xci-test.com>
In-Reply-To: <20111107170601.GB26428@spongy.cam.xci-test.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "Tim \(Xen.org\)" <tim@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"allen.m.kay@intel.com" <allen.m.kay@intel.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 07.11.11 at 18:06, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> On 07/11 04:42, Jan Beulich wrote:
>> >>> On 07.11.11 at 16:16, Jean Guyader <jean.guyader@eu.citrix.com> =
wrote:
>>=20
>> > Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
>> > ---
>> >  xen/drivers/passthrough/iommu.c     |   20 ++++++++++++++++++++
>> >  xen/drivers/passthrough/vtd/iommu.c |   12 ++++++++++++
>> >  xen/include/xen/iommu.h             |    5 +++++
>> >  3 files changed, 37 insertions(+), 0 deletions(-)
>>=20
>> In iommu_iotlb_flush() you check whether the to-be-called function
>> pointer is NULL, whereas in iommu_iotlb_flush_all() you don't. I
>> actually think the second behavior is the correct one, but that
>> implies that you need to also implement respective AMD IOMMU
>> functions.
>>=20
>=20
> Yes, It's an error on my part. I've updated the patch to check
> for the present of iotlb_flush_all before I call it now.

But as said, I don't think this is the right solution: How can it be
correct on non-Intel hardware to have these functions simply do
nothing?

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 02:20:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 02:20:12 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNimq-000884-Ef; Tue, 08 Nov 2011 02:20:12 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNilr-0007nT-RD
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 02:19:12 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1320747548!3324597!1
X-Originating-IP: [137.65.248.74]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11061 invoked from network); 8 Nov 2011 10:19:08 -0000
Received: from novprvoes0310.provo.novell.com (HELO
	novprvoes0310.provo.novell.com) (137.65.248.74)
	by server-16.tower-21.messagelabs.com with SMTP;
	8 Nov 2011 10:19:08 -0000
Received: from INET-PRV-MTA by novprvoes0310.provo.novell.com
	with Novell_GroupWise; Tue, 08 Nov 2011 03:18:03 -0700
Message-Id: <4EB90273020000780005F8A9@novprvoes0310.provo.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 Beta 
Date: Tue, 08 Nov 2011 02:20:35 -0700
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jean Guyader" <jean.guyader@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 4/6] mm: New XENMEM,
	XENMEM_add_to_physmap_gmfn_range
References: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-5-git-send-email-jean.guyader@eu.citrix.com>
In-Reply-To: <1320690327-12649-5-git-send-email-jean.guyader@eu.citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: tim@xen.org, xen-devel@lists.xensource.com, allen.m.kay@intel.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 07.11.11 at 19:25, Jean Guyader <jean.guyader@eu.citrix.com> wrote:

Sorry, noticed this only now, but neither title nor description of this
are in sync with the actual patch.

Jan

> XENMEM_add_to_physmap_gmfn_range is like XENMEM_add_to_physmap on
> the gmfn space but the number of pages on which xen will iterate.
>=20
> Use the 16 bits padding between .domid and .space in struct=20
> xen_add_to_physmap
> to keep compatibility with older versions.
>=20
> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> ---
>  xen/arch/x86/mm.c           |   22 +++++++++++++++++++++-
>  xen/include/public/memory.h |    4 ++++
>  2 files changed, 25 insertions(+), 1 deletions(-)




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 02:26:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 02:26:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNise-00008m-Vr; Tue, 08 Nov 2011 02:26:13 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNis1-0008Nw-RO
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 02:25:34 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1320747927!2283458!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14761 invoked from network); 8 Nov 2011 10:25:30 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 10:25:30 -0000
X-IronPort-AV: E=Sophos;i="4.69,476,1315180800"; 
   d="scan'208";a="8812140"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 10:25:25 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 10:25:24 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNirs-00017q-83;
	Tue, 08 Nov 2011 10:25:24 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNirj-0002HT-Nm;
	Tue, 08 Nov 2011 10:25:15 +0000
Date: Tue, 8 Nov 2011 10:25:15 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 2/6] iommu: Introduce iommu_flush and
	iommu_flush_all.
Message-ID: <20111108102515.GA7818@spongy.cam.xci-test.com>
References: <1320678999-24995-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-3-git-send-email-jean.guyader@eu.citrix.com>
	<4EB8188B020000780005F6E4@novprvoes0310.provo.novell.com>
	<20111107170601.GB26428@spongy.cam.xci-test.com>
	<4EB8F549020000780005F87C@novprvoes0310.provo.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
In-Reply-To: <4EB8F549020000780005F87C@novprvoes0310.provo.novell.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: "Tim \(Xen.org\)" <tim@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"allen.m.kay@intel.com" <allen.m.kay@intel.com>,
	Jean Guyader <Jean.Guyader@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 08/11 08:24, Jan Beulich wrote:
> >>> On 07.11.11 at 18:06, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> > On 07/11 04:42, Jan Beulich wrote:
> >> >>> On 07.11.11 at 16:16, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> >> 
> >> > Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> >> > ---
> >> >  xen/drivers/passthrough/iommu.c     |   20 ++++++++++++++++++++
> >> >  xen/drivers/passthrough/vtd/iommu.c |   12 ++++++++++++
> >> >  xen/include/xen/iommu.h             |    5 +++++
> >> >  3 files changed, 37 insertions(+), 0 deletions(-)
> >> 
> >> In iommu_iotlb_flush() you check whether the to-be-called function
> >> pointer is NULL, whereas in iommu_iotlb_flush_all() you don't. I
> >> actually think the second behavior is the correct one, but that
> >> implies that you need to also implement respective AMD IOMMU
> >> functions.
> >> 
> > 
> > Yes, It's an error on my part. I've updated the patch to check
> > for the present of iotlb_flush_all before I call it now.
> 
> But as said, I don't think this is the right solution: How can it be
> correct on non-Intel hardware to have these functions simply do
> nothing?
> 

These functions are only here to counter balance the dont_flush_iotlb_flag.
If they don't acknowlage this flag doing nothing is the right thing to do.

That said I can probably implement a naive version for the AMD iommu
that will use amd_iommu_flush_pages once or in a loop.

Obviously I will remove the check for the non existing callback if I do
that as it become mandatory.

Jean

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 02:37:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 02:37:11 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNj3H-0000iw-Et; Tue, 08 Nov 2011 02:37:11 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNj2f-0000WK-4s
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 02:36:33 -0800
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1320748588!2697808!1
X-Originating-IP: [216.32.180.11]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25439 invoked from network); 8 Nov 2011 10:36:29 -0000
Received: from va3ehsobe001.messaging.microsoft.com (HELO
	VA3EHSOBE001.bigfish.com) (216.32.180.11)
	by server-15.tower-216.messagelabs.com with AES128-SHA encrypted SMTP;
	8 Nov 2011 10:36:29 -0000
Received: from mail175-va3-R.bigfish.com (10.7.14.246) by
	VA3EHSOBE001.bigfish.com (10.7.40.21) with Microsoft SMTP Server id
	14.1.225.22; Tue, 8 Nov 2011 10:36:06 +0000
Received: from mail175-va3 (localhost [127.0.0.1])	by
	mail175-va3-R.bigfish.com (Postfix) with ESMTP id 85FB768026C;
	Tue,  8 Nov 2011 10:36:04 +0000 (UTC)
X-SpamScore: -13
X-BigFish: VPS-13(zz1432N98dK4015Lzz1202hzz8275bhz2dh668h839h63h)
X-Spam-TCS-SCL: 2:0
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPV:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
Received: from mail175-va3 (localhost.localdomain [127.0.0.1]) by mail175-va3
	(MessageSwitch) id 1320748563126335_31196;
	Tue,  8 Nov 2011 10:36:03 +0000 (UTC)
Received: from VA3EHSMHS002.bigfish.com (unknown [10.7.14.254])	by
	mail175-va3.bigfish.com (Postfix) with ESMTP id 8D21740047;
	Tue,  8 Nov 2011 10:36:00 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	VA3EHSMHS002.bigfish.com (10.7.99.12) with Microsoft SMTP Server id
	14.1.225.22; Tue, 8 Nov 2011 10:35:59 +0000
X-WSS-ID: 0LUC84J-02-1WX-02
X-M-MSG: 
Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com
	[163.181.249.73])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 259E1C8062;	Tue,  8 Nov 2011 04:36:18 -0600 (CST)
Received: from sausexhtp01.amd.com (163.181.3.165) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Tue, 8 Nov 2011 04:37:13 -0600
Received: from storexhtp01.amd.com (172.24.4.3) by sausexhtp01.amd.com
	(163.181.3.165) with Microsoft SMTP Server (TLS) id 8.3.213.0;
	Tue, 8 Nov 2011 04:36:19 -0600
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp01.amd.com
	(172.24.4.3) with Microsoft SMTP Server id 8.3.213.0; Tue, 8 Nov 2011
	05:36:17 -0500
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id D2D8D49C58B; Tue,  8 Nov 2011
	10:36:16 +0000 (GMT)
Received: from gran.osrc.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id B50C15940FF; Tue,  8 Nov 2011
	11:36:16 +0100 (CET)
From: Wei Wang2 <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
Subject: Re: [Xen-devel] [PATCH 2/6] iommu: Introduce iommu_flush and
	iommu_flush_all.
Date: Tue, 8 Nov 2011 11:39:15 +0100
User-Agent: KMail/1.9.6 (enterprise 20070904.708012)
References: <1320678999-24995-1-git-send-email-jean.guyader@eu.citrix.com>
	<4EB8F549020000780005F87C@novprvoes0310.provo.novell.com>
	<20111108102515.GA7818@spongy.cam.xci-test.com>
In-Reply-To: <20111108102515.GA7818@spongy.cam.xci-test.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Message-ID: <201111081139.15943.wei.wang2@amd.com>
X-OriginatorOrg: amd.com
Cc: "allen.m.kay@intel.com" <allen.m.kay@intel.com>,
	"Tim \(Xen.org\)" <tim@xen.org>, Jean Guyader <jean.guyader@eu.citrix.com>,
	Jan Beulich <JBeulich@suse.com>, Jean Guyader <Jean.Guyader@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tuesday 08 November 2011 11:25:15 Jean Guyader wrote:
> On 08/11 08:24, Jan Beulich wrote:
> > >>> On 07.11.11 at 18:06, Jean Guyader <jean.guyader@eu.citrix.com>
> > >>> wrote:
> > >
> > > On 07/11 04:42, Jan Beulich wrote:
> > >> >>> On 07.11.11 at 16:16, Jean Guyader <jean.guyader@eu.citrix.com>
> > >> >>> wrote:
> > >> >
> > >> > Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> > >> > ---
> > >> >  xen/drivers/passthrough/iommu.c     |   20 ++++++++++++++++++++
> > >> >  xen/drivers/passthrough/vtd/iommu.c |   12 ++++++++++++
> > >> >  xen/include/xen/iommu.h             |    5 +++++
> > >> >  3 files changed, 37 insertions(+), 0 deletions(-)
> > >>
> > >> In iommu_iotlb_flush() you check whether the to-be-called function
> > >> pointer is NULL, whereas in iommu_iotlb_flush_all() you don't. I
> > >> actually think the second behavior is the correct one, but that
> > >> implies that you need to also implement respective AMD IOMMU
> > >> functions.
> > >
> > > Yes, It's an error on my part. I've updated the patch to check
> > > for the present of iotlb_flush_all before I call it now.
> >
> > But as said, I don't think this is the right solution: How can it be
> > correct on non-Intel hardware to have these functions simply do
> > nothing?
>
> These functions are only here to counter balance the dont_flush_iotlb_flag.
> If they don't acknowlage this flag doing nothing is the right thing to do.
>
> That said I can probably implement a naive version for the AMD iommu
> that will use amd_iommu_flush_pages once or in a loop.

There are some pending patches that enable ats / iotlb flush for amd iommu. 
Then, you might want to use functions: amd_iommu_flush_iotlb and 
amd_iommu_flush_all_iotlbs for this.
Thanks,
Wei

> Obviously I will remove the check for the non existing callback if I do
> that as it become mandatory.
>
> Jean
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 02:38:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 02:38:22 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNj4Q-00016K-Le; Tue, 08 Nov 2011 02:38:22 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNj2g-0000WL-1h
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 02:36:34 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1320748576!44778482!1
X-Originating-IP: [137.65.248.74]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4766 invoked from network); 8 Nov 2011 10:36:17 -0000
Received: from novprvoes0310.provo.novell.com (HELO
	novprvoes0310.provo.novell.com) (137.65.248.74)
	by server-11.tower-27.messagelabs.com with SMTP;
	8 Nov 2011 10:36:17 -0000
Received: from INET-PRV-MTA by novprvoes0310.provo.novell.com
	with Novell_GroupWise; Tue, 08 Nov 2011 03:36:29 -0700
Message-Id: <4EB91437020000780005F8D8@novprvoes0310.provo.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 Beta 
Date: Tue, 08 Nov 2011 03:36:23 -0700
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__PartAE815437.0__="
Subject: [Xen-devel] [PATCH] x86/IRQ: eliminate irq_vector[]
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--=__PartAE815437.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

The vector is already being tracked in struct irq_desc's arch.vector
member, so there's no real need for a second place where this to get
stored. The only caveat is that legacy vectors (used for interrupts
handled through the 8259) must be special cased to not prevent non-
legacy vectors from being assigned.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -452,10 +452,10 @@ static void unmask_IO_APIC_irq(struct ir
     spin_unlock_irqrestore(&ioapic_lock, flags);
 }
=20
-static void __eoi_IO_APIC_irq(unsigned int irq)
+static void __eoi_IO_APIC_irq(struct irq_desc *desc)
 {
-    struct irq_pin_list *entry =3D irq_2_pin + irq;
-    unsigned int pin, vector =3D IO_APIC_VECTOR(irq);
+    struct irq_pin_list *entry =3D irq_2_pin + desc->irq;
+    unsigned int pin, vector =3D desc->arch.vector;
=20
     for (;;) {
         pin =3D entry->pin;
@@ -468,11 +468,11 @@ static void __eoi_IO_APIC_irq(unsigned i
     }
 }
=20
-static void eoi_IO_APIC_irq(unsigned int irq)
+static void eoi_IO_APIC_irq(struct irq_desc *desc)
 {
     unsigned long flags;
     spin_lock_irqsave(&ioapic_lock, flags);
-    __eoi_IO_APIC_irq(irq);
+    __eoi_IO_APIC_irq(desc);
     spin_unlock_irqrestore(&ioapic_lock, flags);
 }
=20
@@ -1200,7 +1200,7 @@ static void /*__init*/ __print_IO_APIC(v
         struct irq_pin_list *entry =3D irq_2_pin + i;
         if (entry->pin < 0)
             continue;
-        printk(KERN_DEBUG "IRQ%d ", IO_APIC_VECTOR(i));
+        printk(KERN_DEBUG "IRQ%d ", irq_to_desc(i)->arch.vector);
         for (;;) {
             printk("-> %d:%d", entry->apic, entry->pin);
             if (!entry->next)
@@ -1621,7 +1621,7 @@ static void mask_and_ack_level_ioapic_ir
  * operation to prevent an edge-triggered interrupt escaping meanwhile.
  * The idea is from Manfred Spraul.  --macro
  */
-    i =3D IO_APIC_VECTOR(desc->irq);
+    i =3D desc->arch.vector;
=20
     v =3D apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
=20
@@ -1653,12 +1653,12 @@ static void end_level_ioapic_irq(struct=20
         {
             if ( !(desc->status & (IRQ_DISABLED|IRQ_MOVE_PENDING)) )
             {
-                eoi_IO_APIC_irq(desc->irq);
+                eoi_IO_APIC_irq(desc);
                 return;
             }
=20
             mask_IO_APIC_irq(desc);
-            eoi_IO_APIC_irq(desc->irq);
+            eoi_IO_APIC_irq(desc);
             if ( (desc->status & IRQ_MOVE_PENDING) &&
                  !io_apic_level_ack_pending(desc->irq) )
                 move_masked_irq(desc);
@@ -1689,7 +1689,7 @@ static void end_level_ioapic_irq(struct=20
  * operation to prevent an edge-triggered interrupt escaping meanwhile.
  * The idea is from Manfred Spraul.  --macro
  */
-    i =3D IO_APIC_VECTOR(desc->irq);
+    i =3D desc->arch.vector;
=20
     /* Manually EOI the old vector if we are moving to the new */
     if ( vector && i !=3D vector )
@@ -1752,7 +1752,7 @@ static inline void init_IO_APIC_traps(vo
     int irq;
     /* Xen: This is way simpler than the Linux implementation. */
     for (irq =3D 0; platform_legacy_irq(irq); irq++)
-        if (IO_APIC_IRQ(irq) && !IO_APIC_VECTOR(irq))
+        if (IO_APIC_IRQ(irq) && !irq_to_vector(irq))
             make_8259A_irq(irq);
 }
=20
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -41,7 +41,6 @@ custom_param("irq_vector_map", parse_irq
=20
 vmask_t global_used_vector_map;
=20
-u8 __read_mostly *irq_vector;
 struct irq_desc __read_mostly *irq_desc =3D NULL;
=20
 static DECLARE_BITMAP(used_vectors, NR_VECTORS);
@@ -135,8 +134,6 @@ static int __init __bind_irq_vector(int=20
         set_bit(vector, desc->arch.used_vectors);
     }
     desc->arch.used =3D IRQ_USED;
-    if (IO_APIC_IRQ(irq))
-        irq_vector[irq] =3D vector;
     return 0;
 }
=20
@@ -289,7 +286,11 @@ int irq_to_vector(int irq)
     BUG_ON(irq >=3D nr_irqs || irq < 0);
=20
     if (IO_APIC_IRQ(irq))
-        vector =3D irq_vector[irq];
+    {
+        vector =3D irq_to_desc(irq)->arch.vector;
+        if (vector >=3D FIRST_LEGACY_VECTOR && vector <=3D LAST_LEGACY_VEC=
TOR)
+            vector =3D 0;
+    }
     else if (MSI_IRQ(irq))
         vector =3D irq_to_desc(irq)->arch.vector;
     else
@@ -331,9 +332,8 @@ int __init init_irq_data(void)
         this_cpu(vector_irq)[vector] =3D -1;
=20
     irq_desc =3D xzalloc_array(struct irq_desc, nr_irqs);
-    irq_vector =3D xzalloc_array(u8, nr_irqs_gsi);
    =20
-    if ( !irq_desc || !irq_vector )
+    if ( !irq_desc )
         return -ENOMEM;
=20
     for (irq =3D 0; irq < nr_irqs_gsi; irq++) {
@@ -426,7 +426,7 @@ static int __assign_irq_vector(
     vmask_t *irq_used_vectors =3D NULL;
=20
     old_vector =3D irq_to_vector(irq);
-    if (old_vector) {
+    if (old_vector > 0) {
         cpumask_and(&tmp_mask, mask, &cpu_online_map);
         if (cpumask_intersects(&tmp_mask, desc->arch.cpu_mask)) {
             desc->arch.vector =3D old_vector;
@@ -485,7 +485,7 @@ next:
         /* Found one! */
         current_vector =3D vector;
         current_offset =3D offset;
-        if (old_vector) {
+        if (old_vector > 0) {
             desc->arch.move_in_progress =3D 1;
             cpumask_copy(desc->arch.old_cpu_mask, desc->arch.cpu_mask);
             desc->arch.old_vector =3D desc->arch.vector;
@@ -501,9 +501,6 @@ next:
                || (desc->arch.used_vectors =3D=3D irq_used_vectors));
         desc->arch.used_vectors =3D irq_used_vectors;
=20
-        if (IO_APIC_IRQ(irq))
-            irq_vector[irq] =3D vector;
-
         if ( desc->arch.used_vectors )
         {
             ASSERT(!test_bit(vector, desc->arch.used_vectors));
--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -998,7 +998,7 @@ void __init smp_intr_init(void)
      * IRQ0 must be given a fixed assignment and initialized,
      * because it's used before the IO-APIC is set up.
      */
-    irq_vector[0] =3D FIRST_HIPRIORITY_VECTOR;
+    irq_to_desc(0)->arch.vector =3D FIRST_HIPRIORITY_VECTOR;
=20
     /*
      * Also ensure serial interrupts are high priority. We do not
@@ -1008,7 +1008,6 @@ void __init smp_intr_init(void)
     {
         if ( (irq =3D serial_irq(seridx)) < 0 )
             continue;
-        irq_vector[irq] =3D FIRST_HIPRIORITY_VECTOR + seridx + 1;
         per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_VECTOR + seridx + 1] =
=3D irq;
         irq_to_desc(irq)->arch.vector =3D FIRST_HIPRIORITY_VECTOR + =
seridx + 1;
         cpumask_copy(irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map);
--- a/xen/include/asm-x86/irq.h
+++ b/xen/include/asm-x86/irq.h
@@ -14,7 +14,6 @@
 #define IO_APIC_IRQ(irq)    (platform_legacy_irq(irq) ?    \
 			     (1 << (irq)) & io_apic_irqs : \
 			     (irq) < nr_irqs_gsi)
-#define IO_APIC_VECTOR(irq) (irq_vector[irq])
=20
 #define MSI_IRQ(irq)       ((irq) >=3D nr_irqs_gsi && (irq) < nr_irqs)
=20
@@ -48,8 +47,6 @@ struct arch_irq_desc {
 typedef int vector_irq_t[NR_VECTORS];
 DECLARE_PER_CPU(vector_irq_t, vector_irq);
=20
-extern u8 *irq_vector;
-
 extern bool_t opt_noirqbalance;
=20
 #define OPT_IRQ_VECTOR_MAP_DEFAULT 0 /* Do the default thing  */



--=__PartAE815437.0__=
Content-Type: text/plain; name="x86-no-irq_vector.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="x86-no-irq_vector.patch"

x86/IRQ: eliminate irq_vector[]=0A=0AThe vector is already being tracked =
in struct irq_desc's arch.vector=0Amember, so there's no real need for a =
second place where this to get=0Astored. The only caveat is that legacy =
vectors (used for interrupts=0Ahandled through the 8259) must be special =
cased to not prevent non-=0Alegacy vectors from being assigned.=0A=0ASigned=
-off-by: Jan Beulich <jbeulich@suse.com>=0A=0A--- a/xen/arch/x86/io_apic.c=
=0A+++ b/xen/arch/x86/io_apic.c=0A@@ -452,10 +452,10 @@ static void =
unmask_IO_APIC_irq(struct ir=0A     spin_unlock_irqrestore(&ioapic_lock, =
flags);=0A }=0A =0A-static void __eoi_IO_APIC_irq(unsigned int irq)=0A+stat=
ic void __eoi_IO_APIC_irq(struct irq_desc *desc)=0A {=0A-    struct =
irq_pin_list *entry =3D irq_2_pin + irq;=0A-    unsigned int pin, vector =
=3D IO_APIC_VECTOR(irq);=0A+    struct irq_pin_list *entry =3D irq_2_pin + =
desc->irq;=0A+    unsigned int pin, vector =3D desc->arch.vector;=0A =0A   =
  for (;;) {=0A         pin =3D entry->pin;=0A@@ -468,11 +468,11 @@ static =
void __eoi_IO_APIC_irq(unsigned i=0A     }=0A }=0A =0A-static void =
eoi_IO_APIC_irq(unsigned int irq)=0A+static void eoi_IO_APIC_irq(struct =
irq_desc *desc)=0A {=0A     unsigned long flags;=0A     spin_lock_irqsave(&=
ioapic_lock, flags);=0A-    __eoi_IO_APIC_irq(irq);=0A+    __eoi_IO_APIC_ir=
q(desc);=0A     spin_unlock_irqrestore(&ioapic_lock, flags);=0A }=0A =0A@@ =
-1200,7 +1200,7 @@ static void /*__init*/ __print_IO_APIC(v=0A         =
struct irq_pin_list *entry =3D irq_2_pin + i;=0A         if (entry->pin < =
0)=0A             continue;=0A-        printk(KERN_DEBUG "IRQ%d ", =
IO_APIC_VECTOR(i));=0A+        printk(KERN_DEBUG "IRQ%d ", irq_to_desc(i)->=
arch.vector);=0A         for (;;) {=0A             printk("-> %d:%d", =
entry->apic, entry->pin);=0A             if (!entry->next)=0A@@ -1621,7 =
+1621,7 @@ static void mask_and_ack_level_ioapic_ir=0A  * operation to =
prevent an edge-triggered interrupt escaping meanwhile.=0A  * The idea is =
from Manfred Spraul.  --macro=0A  */=0A-    i =3D IO_APIC_VECTOR(desc->irq)=
;=0A+    i =3D desc->arch.vector;=0A =0A     v =3D apic_read(APIC_TMR + =
((i & ~0x1f) >> 1));=0A =0A@@ -1653,12 +1653,12 @@ static void end_level_io=
apic_irq(struct =0A         {=0A             if ( !(desc->status & =
(IRQ_DISABLED|IRQ_MOVE_PENDING)) )=0A             {=0A-                =
eoi_IO_APIC_irq(desc->irq);=0A+                eoi_IO_APIC_irq(desc);=0A   =
              return;=0A             }=0A =0A             mask_IO_APIC_irq(=
desc);=0A-            eoi_IO_APIC_irq(desc->irq);=0A+            eoi_IO_API=
C_irq(desc);=0A             if ( (desc->status & IRQ_MOVE_PENDING) &&=0A   =
               !io_apic_level_ack_pending(desc->irq) )=0A                 =
move_masked_irq(desc);=0A@@ -1689,7 +1689,7 @@ static void end_level_ioapic=
_irq(struct =0A  * operation to prevent an edge-triggered interrupt =
escaping meanwhile.=0A  * The idea is from Manfred Spraul.  --macro=0A  =
*/=0A-    i =3D IO_APIC_VECTOR(desc->irq);=0A+    i =3D desc->arch.vector;=
=0A =0A     /* Manually EOI the old vector if we are moving to the new =
*/=0A     if ( vector && i !=3D vector )=0A@@ -1752,7 +1752,7 @@ static =
inline void init_IO_APIC_traps(vo=0A     int irq;=0A     /* Xen: This is =
way simpler than the Linux implementation. */=0A     for (irq =3D 0; =
platform_legacy_irq(irq); irq++)=0A-        if (IO_APIC_IRQ(irq) && =
!IO_APIC_VECTOR(irq))=0A+        if (IO_APIC_IRQ(irq) && !irq_to_vector(irq=
))=0A             make_8259A_irq(irq);=0A }=0A =0A--- a/xen/arch/x86/irq.c=
=0A+++ b/xen/arch/x86/irq.c=0A@@ -41,7 +41,6 @@ custom_param("irq_vector_ma=
p", parse_irq=0A =0A vmask_t global_used_vector_map;=0A =0A-u8 __read_mostl=
y *irq_vector;=0A struct irq_desc __read_mostly *irq_desc =3D NULL;=0A =0A =
static DECLARE_BITMAP(used_vectors, NR_VECTORS);=0A@@ -135,8 +134,6 @@ =
static int __init __bind_irq_vector(int =0A         set_bit(vector, =
desc->arch.used_vectors);=0A     }=0A     desc->arch.used =3D IRQ_USED;=0A-=
    if (IO_APIC_IRQ(irq))=0A-        irq_vector[irq] =3D vector;=0A     =
return 0;=0A }=0A =0A@@ -289,7 +286,11 @@ int irq_to_vector(int irq)=0A    =
 BUG_ON(irq >=3D nr_irqs || irq < 0);=0A =0A     if (IO_APIC_IRQ(irq))=0A- =
       vector =3D irq_vector[irq];=0A+    {=0A+        vector =3D =
irq_to_desc(irq)->arch.vector;=0A+        if (vector >=3D FIRST_LEGACY_VECT=
OR && vector <=3D LAST_LEGACY_VECTOR)=0A+            vector =3D 0;=0A+    =
}=0A     else if (MSI_IRQ(irq))=0A         vector =3D irq_to_desc(irq)->arc=
h.vector;=0A     else=0A@@ -331,9 +332,8 @@ int __init init_irq_data(void)=
=0A         this_cpu(vector_irq)[vector] =3D -1;=0A =0A     irq_desc =3D =
xzalloc_array(struct irq_desc, nr_irqs);=0A-    irq_vector =3D xzalloc_arra=
y(u8, nr_irqs_gsi);=0A     =0A-    if ( !irq_desc || !irq_vector )=0A+    =
if ( !irq_desc )=0A         return -ENOMEM;=0A =0A     for (irq =3D 0; irq =
< nr_irqs_gsi; irq++) {=0A@@ -426,7 +426,7 @@ static int __assign_irq_vecto=
r(=0A     vmask_t *irq_used_vectors =3D NULL;=0A =0A     old_vector =3D =
irq_to_vector(irq);=0A-    if (old_vector) {=0A+    if (old_vector > 0) =
{=0A         cpumask_and(&tmp_mask, mask, &cpu_online_map);=0A         if =
(cpumask_intersects(&tmp_mask, desc->arch.cpu_mask)) {=0A             =
desc->arch.vector =3D old_vector;=0A@@ -485,7 +485,7 @@ next:=0A         =
/* Found one! */=0A         current_vector =3D vector;=0A         =
current_offset =3D offset;=0A-        if (old_vector) {=0A+        if =
(old_vector > 0) {=0A             desc->arch.move_in_progress =3D 1;=0A    =
         cpumask_copy(desc->arch.old_cpu_mask, desc->arch.cpu_mask);=0A    =
         desc->arch.old_vector =3D desc->arch.vector;=0A@@ -501,9 +501,6 =
@@ next:=0A                || (desc->arch.used_vectors =3D=3D irq_used_vect=
ors));=0A         desc->arch.used_vectors =3D irq_used_vectors;=0A =0A-    =
    if (IO_APIC_IRQ(irq))=0A-            irq_vector[irq] =3D vector;=0A-=0A=
         if ( desc->arch.used_vectors )=0A         {=0A             =
ASSERT(!test_bit(vector, desc->arch.used_vectors));=0A--- a/xen/arch/x86/sm=
pboot.c=0A+++ b/xen/arch/x86/smpboot.c=0A@@ -998,7 +998,7 @@ void __init =
smp_intr_init(void)=0A      * IRQ0 must be given a fixed assignment and =
initialized,=0A      * because it's used before the IO-APIC is set up.=0A  =
    */=0A-    irq_vector[0] =3D FIRST_HIPRIORITY_VECTOR;=0A+    irq_to_desc=
(0)->arch.vector =3D FIRST_HIPRIORITY_VECTOR;=0A =0A     /*=0A      * Also =
ensure serial interrupts are high priority. We do not=0A@@ -1008,7 +1008,6 =
@@ void __init smp_intr_init(void)=0A     {=0A         if ( (irq =3D =
serial_irq(seridx)) < 0 )=0A             continue;=0A-        irq_vector[ir=
q] =3D FIRST_HIPRIORITY_VECTOR + seridx + 1;=0A         per_cpu(vector_irq,=
 cpu)[FIRST_HIPRIORITY_VECTOR + seridx + 1] =3D irq;=0A         irq_to_desc=
(irq)->arch.vector =3D FIRST_HIPRIORITY_VECTOR + seridx + 1;=0A         =
cpumask_copy(irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map);=0A--- =
a/xen/include/asm-x86/irq.h=0A+++ b/xen/include/asm-x86/irq.h=0A@@ -14,7 =
+14,6 @@=0A #define IO_APIC_IRQ(irq)    (platform_legacy_irq(irq) ?    =
\=0A 			     (1 << (irq)) & io_apic_irqs : \=0A 		=
	     (irq) < nr_irqs_gsi)=0A-#define IO_APIC_VECTOR(irq) (irq_vecto=
r[irq])=0A =0A #define MSI_IRQ(irq)       ((irq) >=3D nr_irqs_gsi && (irq) =
< nr_irqs)=0A =0A@@ -48,8 +47,6 @@ struct arch_irq_desc {=0A typedef int =
vector_irq_t[NR_VECTORS];=0A DECLARE_PER_CPU(vector_irq_t, vector_irq);=0A =
=0A-extern u8 *irq_vector;=0A-=0A extern bool_t opt_noirqbalance;=0A =0A =
#define OPT_IRQ_VECTOR_MAP_DEFAULT 0 /* Do the default thing  */=0A
--=__PartAE815437.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__PartAE815437.0__=--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 02:39:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 02:39:52 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNj5s-0001Zp-Hq; Tue, 08 Nov 2011 02:39:52 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNj4c-00019O-Hy
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 02:38:34 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1320748711!704108!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31675 invoked from network); 8 Nov 2011 10:38:31 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 10:38:31 -0000
X-IronPort-AV: E=Sophos;i="4.69,476,1315180800"; 
   d="scan'208";a="8812700"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 10:38:30 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 10:38:30 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNj4Y-0001CH-AS;
	Tue, 08 Nov 2011 10:38:30 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNj4P-0002Ij-Rm;
	Tue, 08 Nov 2011 10:38:21 +0000
Date: Tue, 8 Nov 2011 10:38:21 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: Wei Wang2 <wei.wang2@amd.com>
Subject: Re: [Xen-devel] [PATCH 2/6] iommu: Introduce iommu_flush and
	iommu_flush_all.
Message-ID: <20111108103821.GB7818@spongy.cam.xci-test.com>
References: <1320678999-24995-1-git-send-email-jean.guyader@eu.citrix.com>
	<4EB8F549020000780005F87C@novprvoes0310.provo.novell.com>
	<20111108102515.GA7818@spongy.cam.xci-test.com>
	<201111081139.15943.wei.wang2@amd.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
In-Reply-To: <201111081139.15943.wei.wang2@amd.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, "Tim
	\(Xen.org\)" <tim@xen.org>,
	"allen.m.kay@intel.com" <allen.m.kay@intel.com>,
	Guyader <Jean.Guyader@citrix.com>, Jan Beulich <JBeulich@suse.com>, Jean
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 08/11 10:39, Wei Wang2 wrote:
> On Tuesday 08 November 2011 11:25:15 Jean Guyader wrote:
> > On 08/11 08:24, Jan Beulich wrote:
> > > >>> On 07.11.11 at 18:06, Jean Guyader <jean.guyader@eu.citrix.com>
> > > >>> wrote:
> > > >
> > > > On 07/11 04:42, Jan Beulich wrote:
> > > >> >>> On 07.11.11 at 16:16, Jean Guyader <jean.guyader@eu.citrix.com>
> > > >> >>> wrote:
> > > >> >
> > > >> > Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> > > >> > ---
> > > >> >  xen/drivers/passthrough/iommu.c     |   20 ++++++++++++++++++++
> > > >> >  xen/drivers/passthrough/vtd/iommu.c |   12 ++++++++++++
> > > >> >  xen/include/xen/iommu.h             |    5 +++++
> > > >> >  3 files changed, 37 insertions(+), 0 deletions(-)
> > > >>
> > > >> In iommu_iotlb_flush() you check whether the to-be-called function
> > > >> pointer is NULL, whereas in iommu_iotlb_flush_all() you don't. I
> > > >> actually think the second behavior is the correct one, but that
> > > >> implies that you need to also implement respective AMD IOMMU
> > > >> functions.
> > > >
> > > > Yes, It's an error on my part. I've updated the patch to check
> > > > for the present of iotlb_flush_all before I call it now.
> > >
> > > But as said, I don't think this is the right solution: How can it be
> > > correct on non-Intel hardware to have these functions simply do
> > > nothing?
> >
> > These functions are only here to counter balance the dont_flush_iotlb_flag.
> > If they don't acknowlage this flag doing nothing is the right thing to do.
> >
> > That said I can probably implement a naive version for the AMD iommu
> > that will use amd_iommu_flush_pages once or in a loop.
> 
> There are some pending patches that enable ats / iotlb flush for amd iommu. 
> Then, you might want to use functions: amd_iommu_flush_iotlb and 
> amd_iommu_flush_all_iotlbs for this.
> Thanks,
> Wei
> 

Ok, I'll do that in the next version.

Thanks,
Jean

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 02:40:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 02:40:53 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNj6r-0001x7-JP; Tue, 08 Nov 2011 02:40:53 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNj5I-0001NI-KT
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 02:39:17 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1320748723!43061165!1
X-Originating-IP: [137.65.248.74]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20958 invoked from network); 8 Nov 2011 10:38:43 -0000
Received: from novprvoes0310.provo.novell.com (HELO
	novprvoes0310.provo.novell.com) (137.65.248.74)
	by server-10.tower-27.messagelabs.com with SMTP;
	8 Nov 2011 10:38:43 -0000
Received: from INET-PRV-MTA by novprvoes0310.provo.novell.com
	with Novell_GroupWise; Tue, 08 Nov 2011 03:39:12 -0700
Message-Id: <4EB914DD020000780005F8DE@novprvoes0310.provo.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 Beta 
Date: Tue, 08 Nov 2011 03:39:09 -0700
From: "Jan Beulich" <JBeulich@suse.com>
To: <Jean.Guyader@citrix.com>,
 "Jean Guyader" <jean.guyader@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 2/6] iommu: Introduce iommu_flush and
	iommu_flush_all.
References: <1320678999-24995-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320678999-24995-3-git-send-email-jean.guyader@eu.citrix.com>
	<4EB8188B020000780005F6E4@novprvoes0310.provo.novell.com>
	<20111107170601.GB26428@spongy.cam.xci-test.com>
	<4EB8F549020000780005F87C@novprvoes0310.provo.novell.com>
	<20111108102515.GA7818@spongy.cam.xci-test.com>
In-Reply-To: <20111108102515.GA7818@spongy.cam.xci-test.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "Tim \(Xen.org\)" <tim@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"allen.m.kay@intel.com" <allen.m.kay@intel.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 08.11.11 at 11:25, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> On 08/11 08:24, Jan Beulich wrote:
>> >>> On 07.11.11 at 18:06, Jean Guyader <jean.guyader@eu.citrix.com> =
wrote:
>> > On 07/11 04:42, Jan Beulich wrote:
>> >> >>> On 07.11.11 at 16:16, Jean Guyader <jean.guyader@eu.citrix.com> =
wrote:
>> >>=20
>> >> > Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
>> >> > ---
>> >> >  xen/drivers/passthrough/iommu.c     |   20 ++++++++++++++++++++
>> >> >  xen/drivers/passthrough/vtd/iommu.c |   12 ++++++++++++
>> >> >  xen/include/xen/iommu.h             |    5 +++++
>> >> >  3 files changed, 37 insertions(+), 0 deletions(-)
>> >>=20
>> >> In iommu_iotlb_flush() you check whether the to-be-called function
>> >> pointer is NULL, whereas in iommu_iotlb_flush_all() you don't. I
>> >> actually think the second behavior is the correct one, but that
>> >> implies that you need to also implement respective AMD IOMMU
>> >> functions.
>> >>=20
>> >=20
>> > Yes, It's an error on my part. I've updated the patch to check
>> > for the present of iotlb_flush_all before I call it now.
>>=20
>> But as said, I don't think this is the right solution: How can it be
>> correct on non-Intel hardware to have these functions simply do
>> nothing?
>>=20
>=20
> These functions are only here to counter balance the dont_flush_iotlb_fla=
g.
> If they don't acknowlage this flag doing nothing is the right thing to =
do.

Ah, okay, I overlooked this aspect. Might be worth a comment in
the header file.

Jan

> That said I can probably implement a naive version for the AMD iommu
> that will use amd_iommu_flush_pages once or in a loop.
>=20
> Obviously I will remove the check for the non existing callback if I do
> that as it become mandatory.
>=20
> Jean




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 02:42:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 02:42:03 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNj7z-0002M8-CZ; Tue, 08 Nov 2011 02:42:03 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNj7U-00028Z-0o
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 02:41:33 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1320748888!2700160!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3511 invoked from network); 8 Nov 2011 10:41:29 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 10:41:29 -0000
X-IronPort-AV: E=Sophos;i="4.69,476,1315180800"; 
   d="scan'208";a="8812817"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 10:41:28 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Tue, 8 Nov 2011
	10:41:28 +0000
Subject: Re: [Xen-devel] Re: [Xen-users] Blktap in mainline kernel 3.x
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Tue, 8 Nov 2011 10:41:28 +0000
In-Reply-To: <20111102171203.GA24741@phenom.dumpdata.com>
References: <205BE649-7DF5-41EA-BB59-8089A0C5BD8D@di.uminho.pt>
	<CAEGWhjHQzKqZ3BD3Gsz5NeRaP87VWQdX+jRA8ZQXVGP2+LyTBA@mail.gmail.com>
	<4EB17360.2020201@pcann.com>
	<CAEGWhjHhq+f6c8tBfJhOJ_oUQtwDgp2DGuCRkdwur0-H4T9yuA@mail.gmail.com>
	<20111102171203.GA24741@phenom.dumpdata.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320748888.955.53.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Steven Wilcoxon <stevew@pcann.com>,
	David Della Vecchia <ddv@darkholdings.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-02 at 17:12 +0000, Konrad Rzeszutek Wilk wrote:
> On Wed, Nov 02, 2011 at 12:57:04PM -0400, David Della Vecchia wrote:
> > I've had it running for about a month now with no issues, i've got 35 beta
> > tester domU's on the box and everything seems to be going swimmingly.
> > 
> > A few things to keep in mind:
> > 
> > For some reason the debian xen packages do not have pv-grub so you need to
> > acquire that elsewhere, it doesn't need to be built on your system though,
> > i downloaded mine from a forum post somewhere (i used to download the xen
> > source and compile from scratch to get it).
> > This next one isn't so much a dom0 problem as a domU one but for some
> > reason debian squeeze (stable) guests are not capable of saving and
> > restoring their state. On restore the console and/or network devices will
> 
> 
> That is the 2.6.32 kernel? Yeah, there are couple of bug-fixes floating
> around for that. Ian might know exactly which ones.

Should be fixed in 2.6.32.47, I think.

> > 
> > As far as hvm guests go, as long as you use the hvmloader from the package
> > you'll be fine, if you custom compile xen there's a good chance your
> > hvmloader will be corrupted, it has something to do with the newer version
> > of gcc, though this may have been fixed in 4.1.2.
> 
> Yeah, it was something about __main being placed in the wrong offset.
> I *hope* that has been fixed in 4.1.2.

Correct, 23104:1976adbf2b80 in xen-4.1-testing.hg is in 4.1.2.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 02:43:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 02:43:30 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNj9O-0002jb-RJ; Tue, 08 Nov 2011 02:43:30 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNj8r-0002X4-6b
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 02:42:57 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1320748972!1346176!1
X-Originating-IP: [137.65.248.74]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7805 invoked from network); 8 Nov 2011 10:42:53 -0000
Received: from novprvoes0310.provo.novell.com (HELO
	novprvoes0310.provo.novell.com) (137.65.248.74)
	by server-13.tower-21.messagelabs.com with SMTP;
	8 Nov 2011 10:42:53 -0000
Received: from INET-PRV-MTA by novprvoes0310.provo.novell.com
	with Novell_GroupWise; Tue, 08 Nov 2011 03:42:52 -0700
Message-Id: <4EB915B7020000780005F8FC@novprvoes0310.provo.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 Beta 
Date: Tue, 08 Nov 2011 03:42:47 -0700
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part2F00D5B7.0__="
Subject: [Xen-devel] [PATCH] x86/IRQ: create_irq() should call
	assign_irq_vector()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--=__Part2F00D5B7.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

... rather than __assign_irq_vector(), to ensure desc->affinity gets
initialized properly.

This at once eliminates the need to forward-declare the latter function.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -25,7 +25,6 @@
 #include <public/physdev.h>
=20
 static void parse_irq_vector_map_param(char *s);
-static int __assign_irq_vector(int irq, struct irq_desc *, const =
cpumask_t *);
=20
 /* opt_noirqbalance: If true, software IRQ balancing/affinity is =
disabled. */
 bool_t __read_mostly opt_noirqbalance =3D 0;
@@ -153,7 +152,6 @@ int __init bind_irq_vector(int irq, int=20
  */
 int create_irq(void)
 {
-    unsigned long flags;
     int irq, ret;
     struct irq_desc *desc;
=20
@@ -169,11 +167,7 @@ int create_irq(void)
=20
     ret =3D init_one_irq_desc(desc);
     if (!ret)
-    {
-        spin_lock_irqsave(&vector_lock, flags);
-        ret =3D __assign_irq_vector(irq, desc, TARGET_CPUS);
-        spin_unlock_irqrestore(&vector_lock, flags);
-    }
+        ret =3D assign_irq_vector(irq);
     if (ret < 0)
     {
         desc->arch.used =3D IRQ_UNUSED;




--=__Part2F00D5B7.0__=
Content-Type: text/plain; name="x86-create-irq-assign-vector.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="x86-create-irq-assign-vector.patch"

x86/IRQ: create_irq() should call assign_irq_vector()=0A=0A... rather than =
__assign_irq_vector(), to ensure desc->affinity gets=0Ainitialized =
properly.=0A=0AThis at once eliminates the need to forward-declare the =
latter function.=0A=0ASigned-off-by: Jan Beulich <jbeulich@suse.com>=0A=0A-=
-- a/xen/arch/x86/irq.c=0A+++ b/xen/arch/x86/irq.c=0A@@ -25,7 +25,6 @@=0A =
#include <public/physdev.h>=0A =0A static void parse_irq_vector_map_param(c=
har *s);=0A-static int __assign_irq_vector(int irq, struct irq_desc *, =
const cpumask_t *);=0A =0A /* opt_noirqbalance: If true, software IRQ =
balancing/affinity is disabled. */=0A bool_t __read_mostly opt_noirqbalance=
 =3D 0;=0A@@ -153,7 +152,6 @@ int __init bind_irq_vector(int irq, int =0A  =
*/=0A int create_irq(void)=0A {=0A-    unsigned long flags;=0A     int =
irq, ret;=0A     struct irq_desc *desc;=0A =0A@@ -169,11 +167,7 @@ int =
create_irq(void)=0A =0A     ret =3D init_one_irq_desc(desc);=0A     if =
(!ret)=0A-    {=0A-        spin_lock_irqsave(&vector_lock, flags);=0A-     =
   ret =3D __assign_irq_vector(irq, desc, TARGET_CPUS);=0A-        =
spin_unlock_irqrestore(&vector_lock, flags);=0A-    }=0A+        ret =3D =
assign_irq_vector(irq);=0A     if (ret < 0)=0A     {=0A         desc->arch.=
used =3D IRQ_UNUSED;=0A
--=__Part2F00D5B7.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part2F00D5B7.0__=--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 03:10:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 03:10:17 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNjZJ-0003X3-3p; Tue, 08 Nov 2011 03:10:17 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNjXn-0003JN-CP; Tue, 08 Nov 2011 03:08:50 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1320750520!2308562!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25043 invoked from network); 8 Nov 2011 11:08:40 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 11:08:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,476,1315180800"; 
   d="scan'208";a="8813695"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 11:08:39 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 11:08:39 +0000
Date: Tue, 8 Nov 2011 11:09:11 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: Is: Xen 4.1.1, xend, HVM, 3.1 kernel; Was:Re: [Xen-devel] xen
	4.2 unstable; HVM; 2.6.39.3; HD/Network card error
In-Reply-To: <20111107212619.GA24889@phenom.dumpdata.com>
Message-ID: <alpine.DEB.2.00.1111081058060.3519@kaball-desktop>
References: <alpine.DEB.2.00.1107181242270.12963@kaball-desktop>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAE0cphS4zTVFjzXOjWNB7uwBAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107201238440.12963@kaball-desktop>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAIMchHuG/6dIqtJ7GgPrsOEBAAAAAA==@gmail.com>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAAKIP0TTIelKl7OMHw7/aSQBAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107251142270.12963@kaball-desktop>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAICr5HMuz3FOpEbmgui+XxgBAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107251748160.12963@kaball-desktop>
	<20111103173837.GA21554@phenom.dumpdata.com>
	<alpine.DEB.2.00.1111071646210.3519@kaball-desktop>
	<20111107212619.GA24889@phenom.dumpdata.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: Ian Campbell <Ian.Campbell@citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	Walter Robert Ditzler <ditwal001@gmail.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, 7 Nov 2011, Konrad Rzeszutek Wilk wrote:
> > > XENBUS: Timeout connecting to device: device/vkbd/0 (local state 3, remote state 1)
> > > [which seems odds as the vkb from VNC looks to be working]
> > 
> > Thanks for pointing this out: I enabled vkbd in upstream qemu but I
> > forgot to do the same in qemu-xen so as a result you would get failures
> > of this kind.
> 
> Oh boy. Seems that there are a couple of issues here. It might be that the
> timeout I had experienced was _only_ related to this and the other were red-herrings.
> 
> You might want to make sure M A Young and Stefan Bader are CC-ed on your Xen 4.1.1
> patch so they can pull it in.

Actually I have just realized that the vkbd feature couldn't possibly
have been backported to xen 4.1.1. In fact I didn't even add any vkbd
devices for HVM guests in XL in xen-unstable yet.
Of course this was to avoid situations like this one.

So my guess is that when you use "vfb" in an HVM guest config file
you cause xend to create a vkbd device that is without backend.
A PV on HVM guest would try to connect to it but it wouldn't get any
response back so it would timeout.

The solution to this problem is to avoid using vfb in the config file. I
strongly hope that the config file you showed us before is not generated
by libvirt somehow. If it is we need to file a bug against libvirt.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 03:25:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 03:25:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNjnl-0004la-MH; Tue, 08 Nov 2011 03:25:13 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNjn0-0004Yt-E1
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 03:24:26 -0800
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-9.tower-174.messagelabs.com!1320751462!713364!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16159 invoked from network); 8 Nov 2011 11:24:23 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-9.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 8 Nov 2011 11:24:23 -0000
X-Originating-Ip: [194.89.68.22]
Received: from ydin.reaktio.net (reaktio.net [194.89.68.22])
	by smtp.tele.fi (Postfix) with ESMTP id E921E2DC3;
	Tue,  8 Nov 2011 13:24:21 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id A516920057; Tue,  8 Nov 2011 13:24:21 +0200 (EET)
Date: Tue, 8 Nov 2011 13:24:21 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek nic problems
	(eth0 8139cp transmit queue timed out)
Message-ID: <20111108112421.GU12984@reaktio.net>
References: <CAD88F26.24242%keir.xen@gmail.com>
	<alpine.DEB.2.00.1111071153230.3519@kaball-desktop>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <alpine.DEB.2.00.1111071153230.3519@kaball-desktop>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: "xen@lists.fedoraproject.org" <xen@lists.fedoraproject.org>,
	Keir Fraser <keir.xen@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 07, 2011 at 12:02:03PM +0000, Stefano Stabellini wrote:
> On Thu, 3 Nov 2011, Keir Fraser wrote:
> > On 03/11/2011 18:07, "Pasi KÃ?rkkÃ?inen" <pasik@iki.fi> wrote:
> > 
> > > On Tue, Nov 01, 2011 at 10:56:06PM +0200, Pasi KÃ?rkkÃ?inen wrote:
> > >> On Mon, Oct 31, 2011 at 09:29:24PM +0200, Pasi KÃ?rkkÃ?inen wrote:
> > >>> On Mon, Oct 31, 2011 at 12:24:14PM -0700, Boris Derzhavets wrote:
> > >>>>    Seems to related
> > >>>> 
> > >>>>    https://bugs.launchpad.net/ubuntu/+source/xen/+bug/854829
> > >>>> 
> > >>> 
> > >>> Thanks, that seems to be the same bug.
> > >>> 
> > >>> Is the bugfix patch from xen-unstable going to backported to
> > >>> xen-4.1-testing.hg ?
> > >>> (4.1 backported patch available on ubuntu's launchpad above..)
> > >>> 
> > >> 
> > >> So the Ubuntu backport from xen-unstable to Xen 4.1.1 is here:
> > >> https://launchpadlibrarian.net/81948978/xen-pirq-resubmit-irq.patch
> > >> 
> > >> It seems to be shipping in Ubuntu 11.10 xen 4.1.1-2ubuntu4.1 packages.
> > >> 
> > >> Does that patch look suitable to be applied to xen-4.1-testing.hg ?
> > >> This bug should be fixed for Xen 4.1.3.
> > > 
> > > Any comments? 
> > 
> > This looks like a backport of Stefano's xen-unstable c/s 24007. I would like
> > him to submit/ack the backport, as it is not a trivial backport of the
> > xen-unstable patch.
> 
> I would rather use the following backport. Compared to the other one it
> returns EINVAL in PHYSDEVOP_irq_status_query when the arguments are not
> correct.
> 

Thanks! Mayoung added this patch in xen-4.1.2-1.1.fc14.src.rpm,
and binary rpms are built for Fedora 16 here:
http://koji.fedoraproject.org/koji/taskinfo?taskID=3495905

So people should test this patch (or the rpms above) and confirm 
that it fixes the emulated realtek/ne2k issues.

Thanks,

-- Pasi


> ---
> 
> diff -r 8c2d76193eaf xen/arch/x86/physdev.c
> --- a/xen/arch/x86/physdev.c	Wed Nov 02 15:02:18 2011 +0000
> +++ b/xen/arch/x86/physdev.c	Mon Nov 07 11:58:28 2011 +0000
> @@ -261,6 +261,7 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
>          ret = -EINVAL;
>          if ( eoi.irq >= v->domain->nr_pirqs )
>              break;
> +        spin_lock(&v->domain->event_lock);
>          if ( v->domain->arch.pirq_eoi_map )
>              evtchn_unmask(v->domain->pirq_to_evtchn[eoi.irq]);
>          if ( !is_hvm_domain(v->domain) ||
> @@ -268,6 +269,19 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
>              ret = pirq_guest_eoi(v->domain, eoi.irq);
>          else
>              ret = 0;
> +        if ( is_hvm_domain(v->domain) &&
> +                domain_pirq_to_emuirq(v->domain, eoi.irq) > 0 )
> +        {
> +            struct hvm_irq *hvm_irq = &v->domain->arch.hvm_domain.irq;
> +            int gsi = domain_pirq_to_emuirq(v->domain, eoi.irq);
> +
> +            /* if this is a level irq and count > 0, send another
> +             * notification */ 
> +            if ( gsi >= NR_ISAIRQS /* ISA irqs are edge triggered */
> +                    && hvm_irq->gsi_assert_count[gsi] )
> +                send_guest_pirq(v->domain, eoi.irq);
> +        }
> +        spin_unlock(&v->domain->event_lock);
>          break;
>      }
>  
> @@ -323,9 +337,10 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
>              break;
>          irq_status_query.flags = 0;
>          if ( is_hvm_domain(v->domain) &&
> -             domain_pirq_to_irq(v->domain, irq) <= 0 )
> +                domain_pirq_to_irq(v->domain, irq) <= 0 &&
> +                domain_pirq_to_emuirq(v->domain, irq) == IRQ_UNBOUND )
>          {
> -            ret = copy_to_guest(arg, &irq_status_query, 1) ? -EFAULT : 0;
> +            ret = -EINVAL;
>              break;
>          }
>  

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 04:07:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 04:07:48 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNkSy-0005s0-DW; Tue, 08 Nov 2011 04:07:48 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNkOs-0005cG-HQ
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 04:03:56 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1320753809!712391!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27604 invoked from network); 8 Nov 2011 12:03:30 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 12:03:30 -0000
X-IronPort-AV: E=Sophos;i="4.69,476,1315195200"; d="scan'208";a="169764873"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 07:03:28 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX02.citrite.net
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Tue, 8 Nov 2011
	07:03:28 -0500
Message-ID: <4EB91A8F.8060101@citrix.com>
Date: Tue, 8 Nov 2011 12:03:27 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: <xen-devel@lists.xensource.com>
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: create_irq() should
	call	assign_irq_vector()
References: <4EB915B7020000780005F8FC@novprvoes0310.provo.novell.com>
In-Reply-To: <4EB915B7020000780005F8FC@novprvoes0310.provo.novell.com>
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 08/11/11 10:42, Jan Beulich wrote:
> ... rather than __assign_irq_vector(), to ensure desc->affinity gets
> initialized properly.
>
> This at once eliminates the need to forward-declare the latter function.
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>

> --- a/xen/arch/x86/irq.c
> +++ b/xen/arch/x86/irq.c
> @@ -25,7 +25,6 @@
>  #include <public/physdev.h>
>  
>  static void parse_irq_vector_map_param(char *s);
> -static int __assign_irq_vector(int irq, struct irq_desc *, const cpumask_t *);
>  
>  /* opt_noirqbalance: If true, software IRQ balancing/affinity is disabled. */
>  bool_t __read_mostly opt_noirqbalance = 0;
> @@ -153,7 +152,6 @@ int __init bind_irq_vector(int irq, int 
>   */
>  int create_irq(void)
>  {
> -    unsigned long flags;
>      int irq, ret;
>      struct irq_desc *desc;
>  
> @@ -169,11 +167,7 @@ int create_irq(void)
>  
>      ret = init_one_irq_desc(desc);
>      if (!ret)
> -    {
> -        spin_lock_irqsave(&vector_lock, flags);
> -        ret = __assign_irq_vector(irq, desc, TARGET_CPUS);
> -        spin_unlock_irqrestore(&vector_lock, flags);
> -    }
> +        ret = assign_irq_vector(irq);
>      if (ret < 0)
>      {
>          desc->arch.used = IRQ_UNUSED;
>
>
>

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 04:18:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 04:18:29 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNkdI-0007G1-Pq; Tue, 08 Nov 2011 04:18:28 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNkcV-00073P-H1
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 04:17:39 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1320754656!720692!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27670 invoked from network); 8 Nov 2011 12:17:36 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 12:17:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,476,1315180800"; 
   d="scan'208";a="8815514"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 12:17:36 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 12:17:36 +0000
Date: Tue, 8 Nov 2011 12:18:17 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: xen-devel@lists.xensource.com
Message-ID: <alpine.DEB.2.00.1111081216030.3519@kaball-desktop>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Subject: [Xen-devel] [PATCH] Add a vkbd frontend/backend pair for HVM guests
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Linux PV on HVM guests can use vkbd, so add a vkbd frontend/backend pair
for HVM guests by default.
It is useful because it doesn't require frequent qemu wakeups as the usb
keyboard/mouse does.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

diff -r 54a5e994a241 tools/libxl/libxl_create.c
--- a/tools/libxl/libxl_create.c	Wed Nov 02 17:09:09 2011 +0000
+++ b/tools/libxl/libxl_create.c	Tue Nov 08 11:30:16 2011 +0000
@@ -507,6 +507,7 @@ static int do_domain_create(libxl__gc *g
     case LIBXL_DOMAIN_TYPE_HVM:
     {
         libxl_device_console console;
+        libxl_device_vkb vkb;
 
         ret = init_console_info(&console, 0);
         if ( ret )
@@ -514,6 +515,12 @@ static int do_domain_create(libxl__gc *g
         libxl__device_console_add(gc, domid, &console, &state);
         libxl_device_console_dispose(&console);
 
+        ret = libxl_device_vkb_init(ctx, &vkb);
+        if ( ret )
+            goto error_out;
+        libxl_device_vkb_add(ctx, domid, &vkb);
+        libxl_device_vkb_dispose(&vkb);
+
         dm_info->domid = domid;
         ret = libxl__create_device_model(gc, dm_info,
                                         d_config->disks, d_config->num_disks,

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 04:19:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 04:19:32 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNkeK-0007cv-4v; Tue, 08 Nov 2011 04:19:32 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNkcp-00076r-9d
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 04:17:59 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1320754674!723395!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23024 invoked from network); 8 Nov 2011 12:17:55 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-7.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 12:17:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,476,1315195200"; d="scan'208";a="18914608"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 07:17:47 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX02.citrite.net
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Tue, 8 Nov 2011
	07:17:47 -0500
Message-ID: <4EB91DEA.5050808@citrix.com>
Date: Tue, 8 Nov 2011 12:17:46 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: eliminate irq_vector[]
References: <4EB91437020000780005F8D8@novprvoes0310.provo.novell.com>
In-Reply-To: <4EB91437020000780005F8D8@novprvoes0310.provo.novell.com>
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 08/11/11 10:36, Jan Beulich wrote:
> The vector is already being tracked in struct irq_desc's arch.vector
> member, so there's no real need for a second place where this to get
> stored. The only caveat is that legacy vectors (used for interrupts
> handled through the 8259) must be special cased to not prevent non-
> legacy vectors from being assigned.
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Seems you have beaten me to this.  I had an untested patch to remove
irq_vector but this is much cleaner.

Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>

> --- a/xen/arch/x86/io_apic.c
> +++ b/xen/arch/x86/io_apic.c
> @@ -452,10 +452,10 @@ static void unmask_IO_APIC_irq(struct ir
>      spin_unlock_irqrestore(&ioapic_lock, flags);
>  }
>  
> -static void __eoi_IO_APIC_irq(unsigned int irq)
> +static void __eoi_IO_APIC_irq(struct irq_desc *desc)
>  {
> -    struct irq_pin_list *entry = irq_2_pin + irq;
> -    unsigned int pin, vector = IO_APIC_VECTOR(irq);
> +    struct irq_pin_list *entry = irq_2_pin + desc->irq;
> +    unsigned int pin, vector = desc->arch.vector;
>  
>      for (;;) {
>          pin = entry->pin;
> @@ -468,11 +468,11 @@ static void __eoi_IO_APIC_irq(unsigned i
>      }
>  }
>  
> -static void eoi_IO_APIC_irq(unsigned int irq)
> +static void eoi_IO_APIC_irq(struct irq_desc *desc)
>  {
>      unsigned long flags;
>      spin_lock_irqsave(&ioapic_lock, flags);
> -    __eoi_IO_APIC_irq(irq);
> +    __eoi_IO_APIC_irq(desc);
>      spin_unlock_irqrestore(&ioapic_lock, flags);
>  }
>  
> @@ -1200,7 +1200,7 @@ static void /*__init*/ __print_IO_APIC(v
>          struct irq_pin_list *entry = irq_2_pin + i;
>          if (entry->pin < 0)
>              continue;
> -        printk(KERN_DEBUG "IRQ%d ", IO_APIC_VECTOR(i));
> +        printk(KERN_DEBUG "IRQ%d ", irq_to_desc(i)->arch.vector);
>          for (;;) {
>              printk("-> %d:%d", entry->apic, entry->pin);
>              if (!entry->next)
> @@ -1621,7 +1621,7 @@ static void mask_and_ack_level_ioapic_ir
>   * operation to prevent an edge-triggered interrupt escaping meanwhile.
>   * The idea is from Manfred Spraul.  --macro
>   */
> -    i = IO_APIC_VECTOR(desc->irq);
> +    i = desc->arch.vector;
>  
>      v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
>  
> @@ -1653,12 +1653,12 @@ static void end_level_ioapic_irq(struct 
>          {
>              if ( !(desc->status & (IRQ_DISABLED|IRQ_MOVE_PENDING)) )
>              {
> -                eoi_IO_APIC_irq(desc->irq);
> +                eoi_IO_APIC_irq(desc);
>                  return;
>              }
>  
>              mask_IO_APIC_irq(desc);
> -            eoi_IO_APIC_irq(desc->irq);
> +            eoi_IO_APIC_irq(desc);
>              if ( (desc->status & IRQ_MOVE_PENDING) &&
>                   !io_apic_level_ack_pending(desc->irq) )
>                  move_masked_irq(desc);
> @@ -1689,7 +1689,7 @@ static void end_level_ioapic_irq(struct 
>   * operation to prevent an edge-triggered interrupt escaping meanwhile.
>   * The idea is from Manfred Spraul.  --macro
>   */
> -    i = IO_APIC_VECTOR(desc->irq);
> +    i = desc->arch.vector;
>  
>      /* Manually EOI the old vector if we are moving to the new */
>      if ( vector && i != vector )
> @@ -1752,7 +1752,7 @@ static inline void init_IO_APIC_traps(vo
>      int irq;
>      /* Xen: This is way simpler than the Linux implementation. */
>      for (irq = 0; platform_legacy_irq(irq); irq++)
> -        if (IO_APIC_IRQ(irq) && !IO_APIC_VECTOR(irq))
> +        if (IO_APIC_IRQ(irq) && !irq_to_vector(irq))
>              make_8259A_irq(irq);
>  }
>  
> --- a/xen/arch/x86/irq.c
> +++ b/xen/arch/x86/irq.c
> @@ -41,7 +41,6 @@ custom_param("irq_vector_map", parse_irq
>  
>  vmask_t global_used_vector_map;
>  
> -u8 __read_mostly *irq_vector;
>  struct irq_desc __read_mostly *irq_desc = NULL;
>  
>  static DECLARE_BITMAP(used_vectors, NR_VECTORS);
> @@ -135,8 +134,6 @@ static int __init __bind_irq_vector(int 
>          set_bit(vector, desc->arch.used_vectors);
>      }
>      desc->arch.used = IRQ_USED;
> -    if (IO_APIC_IRQ(irq))
> -        irq_vector[irq] = vector;
>      return 0;
>  }
>  
> @@ -289,7 +286,11 @@ int irq_to_vector(int irq)
>      BUG_ON(irq >= nr_irqs || irq < 0);
>  
>      if (IO_APIC_IRQ(irq))
> -        vector = irq_vector[irq];
> +    {
> +        vector = irq_to_desc(irq)->arch.vector;
> +        if (vector >= FIRST_LEGACY_VECTOR && vector <= LAST_LEGACY_VECTOR)
> +            vector = 0;
> +    }
>      else if (MSI_IRQ(irq))
>          vector = irq_to_desc(irq)->arch.vector;
>      else
> @@ -331,9 +332,8 @@ int __init init_irq_data(void)
>          this_cpu(vector_irq)[vector] = -1;
>  
>      irq_desc = xzalloc_array(struct irq_desc, nr_irqs);
> -    irq_vector = xzalloc_array(u8, nr_irqs_gsi);
>      
> -    if ( !irq_desc || !irq_vector )
> +    if ( !irq_desc )
>          return -ENOMEM;
>  
>      for (irq = 0; irq < nr_irqs_gsi; irq++) {
> @@ -426,7 +426,7 @@ static int __assign_irq_vector(
>      vmask_t *irq_used_vectors = NULL;
>  
>      old_vector = irq_to_vector(irq);
> -    if (old_vector) {
> +    if (old_vector > 0) {
>          cpumask_and(&tmp_mask, mask, &cpu_online_map);
>          if (cpumask_intersects(&tmp_mask, desc->arch.cpu_mask)) {
>              desc->arch.vector = old_vector;
> @@ -485,7 +485,7 @@ next:
>          /* Found one! */
>          current_vector = vector;
>          current_offset = offset;
> -        if (old_vector) {
> +        if (old_vector > 0) {
>              desc->arch.move_in_progress = 1;
>              cpumask_copy(desc->arch.old_cpu_mask, desc->arch.cpu_mask);
>              desc->arch.old_vector = desc->arch.vector;
> @@ -501,9 +501,6 @@ next:
>                 || (desc->arch.used_vectors == irq_used_vectors));
>          desc->arch.used_vectors = irq_used_vectors;
>  
> -        if (IO_APIC_IRQ(irq))
> -            irq_vector[irq] = vector;
> -
>          if ( desc->arch.used_vectors )
>          {
>              ASSERT(!test_bit(vector, desc->arch.used_vectors));
> --- a/xen/arch/x86/smpboot.c
> +++ b/xen/arch/x86/smpboot.c
> @@ -998,7 +998,7 @@ void __init smp_intr_init(void)
>       * IRQ0 must be given a fixed assignment and initialized,
>       * because it's used before the IO-APIC is set up.
>       */
> -    irq_vector[0] = FIRST_HIPRIORITY_VECTOR;
> +    irq_to_desc(0)->arch.vector = FIRST_HIPRIORITY_VECTOR;
>  
>      /*
>       * Also ensure serial interrupts are high priority. We do not
> @@ -1008,7 +1008,6 @@ void __init smp_intr_init(void)
>      {
>          if ( (irq = serial_irq(seridx)) < 0 )
>              continue;
> -        irq_vector[irq] = FIRST_HIPRIORITY_VECTOR + seridx + 1;
>          per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_VECTOR + seridx + 1] = irq;
>          irq_to_desc(irq)->arch.vector = FIRST_HIPRIORITY_VECTOR + seridx + 1;
>          cpumask_copy(irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map);
> --- a/xen/include/asm-x86/irq.h
> +++ b/xen/include/asm-x86/irq.h
> @@ -14,7 +14,6 @@
>  #define IO_APIC_IRQ(irq)    (platform_legacy_irq(irq) ?    \
>  			     (1 << (irq)) & io_apic_irqs : \
>  			     (irq) < nr_irqs_gsi)
> -#define IO_APIC_VECTOR(irq) (irq_vector[irq])
>  
>  #define MSI_IRQ(irq)       ((irq) >= nr_irqs_gsi && (irq) < nr_irqs)
>  
> @@ -48,8 +47,6 @@ struct arch_irq_desc {
>  typedef int vector_irq_t[NR_VECTORS];
>  DECLARE_PER_CPU(vector_irq_t, vector_irq);
>  
> -extern u8 *irq_vector;
> -
>  extern bool_t opt_noirqbalance;
>  
>  #define OPT_IRQ_VECTOR_MAP_DEFAULT 0 /* Do the default thing  */
>
>

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 04:56:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 04:56:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNlER-0002Ai-8H; Tue, 08 Nov 2011 04:56:51 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNlDZ-0001xl-D4
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 04:55:58 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1320756954!727529!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9770 invoked from network); 8 Nov 2011 12:55:54 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 12:55:54 -0000
X-IronPort-AV: E=Sophos;i="4.69,477,1315180800"; 
   d="scan'208";a="8816344"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 12:55:43 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 12:55:43 +0000
Date: Tue, 8 Nov 2011 12:56:15 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Anthony PERARD <anthony.perard@citrix.com>
In-Reply-To: <1319814456-8158-8-git-send-email-anthony.perard@citrix.com>
Message-ID: <alpine.DEB.2.00.1111081242590.3519@kaball-desktop>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-8-git-send-email-anthony.perard@citrix.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: Guy Zana <guy@neocleus.com>, Xen Devel <xen-devel@lists.xensource.com>,
	Allen Kay <allen.m.kay@intel.com>, QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH V3 07/10] Introduce Xen PCI Passthrough,
	qdevice (1/3)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, 28 Oct 2011, Anthony PERARD wrote:
> From: Allen Kay <allen.m.kay@intel.com>
> 
> Signed-off-by: Allen Kay <allen.m.kay@intel.com>
> Signed-off-by: Guy Zana <guy@neocleus.com>
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  Makefile.target                  |    2 +
>  hw/xen_pci_passthrough.c         |  838 ++++++++++++++++++++++++++++++++++++++
>  hw/xen_pci_passthrough.h         |  223 ++++++++++
>  hw/xen_pci_passthrough_helpers.c |   46 ++
>  4 files changed, 1109 insertions(+), 0 deletions(-)
>  create mode 100644 hw/xen_pci_passthrough.c
>  create mode 100644 hw/xen_pci_passthrough.h
>  create mode 100644 hw/xen_pci_passthrough_helpers.c
> 
> diff --git a/Makefile.target b/Makefile.target
> index 243f9f2..36ea47d 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -217,6 +217,8 @@ obj-i386-$(CONFIG_XEN) += xen_platform.o
> 
>  # Xen PCI Passthrough
>  obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += host-pci-device.o
> +obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pci_passthrough.o
> +obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pci_passthrough_helpers.o
> 
>  # Inter-VM PCI shared memory
>  CONFIG_IVSHMEM =
> diff --git a/hw/xen_pci_passthrough.c b/hw/xen_pci_passthrough.c
> new file mode 100644
> index 0000000..b97c5b6
> --- /dev/null
> +++ b/hw/xen_pci_passthrough.c
> @@ -0,0 +1,838 @@
> +/*
> + * Copyright (c) 2007, Neocleus Corporation.
> + * Copyright (c) 2007, Intel Corporation.
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2.  See
> + * the COPYING file in the top-level directory.
> + *
> + * Alex Novik <alex@neocleus.com>
> + * Allen Kay <allen.m.kay@intel.com>
> + * Guy Zana <guy@neocleus.com>
> + *
> + * This file implements direct PCI assignment to a HVM guest
> + */
> +
> +/*
> + * Interrupt Disable policy:
> + *
> + * INTx interrupt:
> + *   Initialize(register_real_device)
> + *     Map INTx(xc_physdev_map_pirq):
> + *       <fail>
> + *         - Set real Interrupt Disable bit to '1'.
> + *         - Set machine_irq and assigned_device->machine_irq to '0'.
> + *         * Don't bind INTx.
> + *
> + *     Bind INTx(xc_domain_bind_pt_pci_irq):
> + *       <fail>
> + *         - Set real Interrupt Disable bit to '1'.
> + *         - Unmap INTx.
> + *         - Decrement mapped_machine_irq[machine_irq]
> + *         - Set assigned_device->machine_irq to '0'.
> + *
> + *   Write to Interrupt Disable bit by guest software(pt_cmd_reg_write)
> + *     Write '0'
> + *       <ptdev->msi_trans_en is false>
> + *         - Set real bit to '0' if assigned_device->machine_irq isn't '0'.
> + *
> + *     Write '1'
> + *       <ptdev->msi_trans_en is false>
> + *         - Set real bit to '1'.
> + *
> + * MSI-INTx translation.
> + *   Initialize(xc_physdev_map_pirq_msi/pt_msi_setup)
> + *     Bind MSI-INTx(xc_domain_bind_pt_irq)
> + *       <fail>
> + *         - Unmap MSI.
> + *           <success>
> + *             - Set dev->msi->pirq to '-1'.
> + *           <fail>
> + *             - Do nothing.
> + *
> + *   Write to Interrupt Disable bit by guest software(pt_cmd_reg_write)
> + *     Write '0'
> + *       <ptdev->msi_trans_en is true>
> + *         - Set MSI Enable bit to '1'.
> + *
> + *     Write '1'
> + *       <ptdev->msi_trans_en is true>
> + *         - Set MSI Enable bit to '0'.
> + *
> + * MSI interrupt:
> + *   Initialize MSI register(pt_msi_setup, pt_msi_update)
> + *     Bind MSI(xc_domain_update_msi_irq)
> + *       <fail>
> + *         - Unmap MSI.
> + *         - Set dev->msi->pirq to '-1'.
> + *
> + * MSI-X interrupt:
> + *   Initialize MSI-X register(pt_msix_update_one)
> + *     Bind MSI-X(xc_domain_update_msi_irq)
> + *       <fail>
> + *         - Unmap MSI-X.
> + *         - Set entry->pirq to '-1'.
> + */
> +

you should move all the MSI related comments to the MSI patch


> +#include <sys/ioctl.h>
> +
> +#include "pci.h"
> +#include "xen.h"
> +#include "xen_backend.h"
> +#include "xen_pci_passthrough.h"
> +
> +#define PCI_BAR_ENTRIES (6)
> +
> +#define PT_NR_IRQS          (256)
> +char mapped_machine_irq[PT_NR_IRQS] = {0};
> +
> +/* Config Space */
> +static int pt_pci_config_access_check(PCIDevice *d, uint32_t address, int len)
> +{
> +    /* check offset range */
> +    if (address >= 0xFF) {
> +        PT_LOG("Error: Failed to access register with offset exceeding FFh. "
> +               "[%02x:%02x.%x][Offset:%02xh][Length:%d]\n",
> +               pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> +               address, len);
> +        return -1;
> +    }
> +
> +    /* check read size */
> +    if ((len != 1) && (len != 2) && (len != 4)) {
> +        PT_LOG("Error: Failed to access register with invalid access length. "
> +               "[%02x:%02x.%x][Offset:%02xh][Length:%d]\n",
> +               pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> +               address, len);
> +        return -1;
> +    }
> +
> +    /* check offset alignment */
> +    if (address & (len - 1)) {
> +        PT_LOG("Error: Failed to access register with invalid access size "
> +            "alignment. [%02x:%02x.%x][Offset:%02xh][Length:%d]\n",
> +            pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> +            address, len);
> +        return -1;
> +    }
> +
> +    return 0;
> +}
> +
> +int pt_bar_offset_to_index(uint32_t offset)
> +{
> +    int index = 0;
> +
> +    /* check Exp ROM BAR */
> +    if (offset == PCI_ROM_ADDRESS) {
> +        return PCI_ROM_SLOT;
> +    }
> +
> +    /* calculate BAR index */
> +    index = (offset - PCI_BASE_ADDRESS_0) >> 2;
> +    if (index >= PCI_NUM_REGIONS) {
> +        return -1;
> +    }
> +
> +    return index;
> +}
> +
> +static uint32_t pt_pci_read_config(PCIDevice *d, uint32_t address, int len)
> +{
> +    XenPCIPassthroughState *s = DO_UPCAST(XenPCIPassthroughState, dev, d);
> +    uint32_t val = 0;
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    int rc = 0;
> +    int emul_len = 0;
> +    uint32_t find_addr = address;
> +
> +    if (pt_pci_config_access_check(d, address, len)) {
> +        goto exit;
> +    }
> +
> +    /* check power state transition flags */
> +    if (s->pm_state != NULL && s->pm_state->flags & PT_FLAG_TRANSITING) {
> +        /* can't accept until previous power state transition is completed.
> +         * so finished previous request here.
> +         */
> +        PT_LOG("Warning: guest want to write durring power state transition\n");
> +        goto exit;
> +    }
> +
> +    /* find register group entry */
> +    reg_grp_entry = pt_find_reg_grp(s, address);
> +    if (reg_grp_entry) {
> +        /* check 0 Hardwired register group */
> +        if (reg_grp_entry->reg_grp->grp_type == GRP_TYPE_HARDWIRED) {
> +            /* no need to emulate, just return 0 */
> +            val = 0;
> +            goto exit;
> +        }
> +    }
> +
> +    /* read I/O device register value */
> +    rc = host_pci_get_block(s->real_device, address, (uint8_t *)&val, len);
> +    if (!rc) {
> +        PT_LOG("Error: pci_read_block failed. return value[%d].\n", rc);
> +        memset(&val, 0xff, len);
> +    }
> +
> +    /* just return the I/O device register value for
> +     * passthrough type register group */
> +    if (reg_grp_entry == NULL) {
> +        goto exit;
> +    }
> +
> +    /* adjust the read value to appropriate CFC-CFF window */
> +    val <<= (address & 3) << 3;
> +    emul_len = len;
> +
> +    /* loop Guest request size */
> +    while (emul_len > 0) {
> +        /* find register entry to be emulated */
> +        reg_entry = pt_find_reg(reg_grp_entry, find_addr);
> +        if (reg_entry) {
> +            XenPTRegInfo *reg = reg_entry->reg;
> +            uint32_t real_offset = reg_grp_entry->base_offset + reg->offset;
> +            uint32_t valid_mask = 0xFFFFFFFF >> ((4 - emul_len) << 3);
> +            uint8_t *ptr_val = NULL;
> +
> +            valid_mask <<= (find_addr - real_offset) << 3;
> +            ptr_val = (uint8_t *)&val + (real_offset & 3);
> +
> +            /* do emulation depend on register size */
> +            switch (reg->size) {
> +            case 1:
> +                if (reg->u.b.read) {
> +                    rc = reg->u.b.read(s, reg_entry, ptr_val, valid_mask);
> +                }
> +                break;
> +            case 2:
> +                if (reg->u.w.read) {
> +                    rc = reg->u.w.read(s, reg_entry,
> +                                       (uint16_t *)ptr_val, valid_mask);
> +                }
> +                break;
> +            case 4:
> +                if (reg->u.dw.read) {
> +                    rc = reg->u.dw.read(s, reg_entry,
> +                                        (uint32_t *)ptr_val, valid_mask);
> +                }
> +                break;
> +            }
> +
> +            if (rc < 0) {
> +                hw_error("Internal error: Invalid read emulation "
> +                         "return value[%d]. I/O emulator exit.\n", rc);
> +            }
> +
> +            /* calculate next address to find */
> +            emul_len -= reg->size;
> +            if (emul_len > 0) {
> +                find_addr = real_offset + reg->size;
> +            }
> +        } else {
> +            /* nothing to do with passthrough type register,
> +             * continue to find next byte */
> +            emul_len--;
> +            find_addr++;
> +        }
> +    }
> +
> +    /* need to shift back before returning them to pci bus emulator */
> +    val >>= ((address & 3) << 3);
> +
> +exit:
> +    PT_LOG_CONFIG("[%02x:%02x.%x]: address=%04x val=0x%08x len=%d\n",
> +                  pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> +                  address, val, len);
> +    return val;
> +}
> +
> +static void pt_pci_write_config(PCIDevice *d, uint32_t address,
> +                                uint32_t val, int len)
> +{
> +    XenPCIPassthroughState *s = DO_UPCAST(XenPCIPassthroughState, dev, d);
> +    int index = 0;
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    int rc = 0;
> +    uint32_t read_val = 0;
> +    int emul_len = 0;
> +    XenPTReg *reg_entry = NULL;
> +    uint32_t find_addr = address;
> +    XenPTRegInfo *reg = NULL;
> +
> +    if (pt_pci_config_access_check(d, address, len)) {
> +        return;
> +    }
> +
> +    PT_LOG_CONFIG("[%02x:%02x.%x]: address=%04x val=0x%08x len=%d\n",
> +                  pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> +                  address, val, len);
> +
> +    /* check unused BAR register */
> +    index = pt_bar_offset_to_index(address);
> +    if ((index >= 0) && (val > 0 && val < PT_BAR_ALLF) &&
> +        (s->bases[index].bar_flag == PT_BAR_FLAG_UNUSED)) {
> +        PT_LOG("Warning: Guest attempt to set address to unused Base Address "
> +               "Register. [%02x:%02x.%x][Offset:%02xh][Length:%d]\n",
> +               pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> +               address, len);
> +    }
> +
> +    /* check power state transition flags */
> +    if (s->pm_state != NULL && s->pm_state->flags & PT_FLAG_TRANSITING) {
> +        /* can't accept untill previous power state transition is completed.
> +         * so finished previous request here.
> +         */
> +        PT_LOG("Warning: guest want to write durring power state transition\n");
> +        return;
> +    }
> +
> +    /* find register group entry */
> +    reg_grp_entry = pt_find_reg_grp(s, address);
> +    if (reg_grp_entry) {
> +        /* check 0 Hardwired register group */
> +        if (reg_grp_entry->reg_grp->grp_type == GRP_TYPE_HARDWIRED) {
> +            /* ignore silently */
> +            PT_LOG("Warning: Access to 0 Hardwired register. "
> +                   "[%02x:%02x.%x][Offset:%02xh][Length:%d]\n",
> +                   pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> +                   address, len);
> +            return;
> +        }
> +    }
> +
> +    /* read I/O device register value */
> +    rc = host_pci_get_block(s->real_device, address,
> +                             (uint8_t *)&read_val, len);
> +    if (!rc) {
> +        PT_LOG("Error: pci_read_block failed. return value[%d].\n", rc);
> +        memset(&read_val, 0xff, len);
> +    }
> +
> +    /* pass directly to libpci for passthrough type register group */
> +    if (reg_grp_entry == NULL) {
> +        goto out;
> +    }
> +
> +    /* adjust the read and write value to appropriate CFC-CFF window */
> +    read_val <<= (address & 3) << 3;
> +    val <<= (address & 3) << 3;
> +    emul_len = len;
> +
> +    /* loop Guest request size */
> +    while (emul_len > 0) {
> +        /* find register entry to be emulated */
> +        reg_entry = pt_find_reg(reg_grp_entry, find_addr);
> +        if (reg_entry) {
> +            reg = reg_entry->reg;
> +            uint32_t real_offset = reg_grp_entry->base_offset + reg->offset;
> +            uint32_t valid_mask = 0xFFFFFFFF >> ((4 - emul_len) << 3);
> +            uint8_t *ptr_val = NULL;
> +
> +            valid_mask <<= (find_addr - real_offset) << 3;
> +            ptr_val = (uint8_t *)&val + (real_offset & 3);
> +
> +            /* do emulation depend on register size */
> +            switch (reg->size) {
> +            case 1:
> +                if (reg->u.b.write) {
> +                    rc = reg->u.b.write(s, reg_entry, ptr_val,
> +                                        read_val >> ((real_offset & 3) << 3),
> +                                        valid_mask);
> +                }
> +                break;
> +            case 2:
> +                if (reg->u.w.write) {
> +                    rc = reg->u.w.write(s, reg_entry, (uint16_t *)ptr_val,
> +                                        (read_val >> ((real_offset & 3) << 3)),
> +                                        valid_mask);
> +                }
> +                break;
> +            case 4:
> +                if (reg->u.dw.write) {
> +                    rc = reg->u.dw.write(s, reg_entry, (uint32_t *)ptr_val,
> +                                         (read_val >> ((real_offset & 3) << 3)),
> +                                         valid_mask);
> +                }
> +                break;
> +            }
> +
> +            if (rc < 0) {
> +                hw_error("Internal error: Invalid write emulation "
> +                         "return value[%d]. I/O emulator exit.\n", rc);
> +            }
> +
> +            /* calculate next address to find */
> +            emul_len -= reg->size;
> +            if (emul_len > 0) {
> +                find_addr = real_offset + reg->size;
> +            }
> +        } else {
> +            /* nothing to do with passthrough type register,
> +             * continue to find next byte */
> +            emul_len--;
> +            find_addr++;
> +        }
> +    }
> +
> +    /* need to shift back before passing them to libpci */
> +    val >>= (address & 3) << 3;
> +
> +out:
> +    if (!(reg && reg->no_wb)) {
> +        /* unknown regs are passed through */
> +        rc = host_pci_set_block(s->real_device, address, (uint8_t *)&val, len);
> +
> +        if (!rc) {
> +            PT_LOG("Error: pci_write_block failed. return value[%d].\n", rc);
> +        }
> +    }
> +
> +    if (s->pm_state != NULL && s->pm_state->flags & PT_FLAG_TRANSITING) {
> +        qemu_mod_timer(s->pm_state->pm_timer,
> +                       qemu_get_clock_ms(rt_clock) + s->pm_state->pm_delay);
> +    }
> +}

Where is this timer allocated and initialized?


> +/* ioport/iomem space*/
> +static void pt_iomem_map(XenPCIPassthroughState *s, int i,
> +                         pcibus_t e_phys, pcibus_t e_size, int type)
> +{
> +    uint32_t old_ebase = s->bases[i].e_physbase;
> +    bool first_map = s->bases[i].e_size == 0;
> +    int ret = 0;
> +
> +    s->bases[i].e_physbase = e_phys;
> +    s->bases[i].e_size = e_size;
> +
> +    PT_LOG("e_phys=%#"PRIx64" maddr=%#"PRIx64" type=%%d"
> +           " len=%#"PRIx64" index=%d first_map=%d\n",
> +           e_phys, s->bases[i].access.maddr, /*type,*/
> +           e_size, i, first_map);
> +
> +    if (e_size == 0) {
> +        return;
> +    }
> +
> +    if (!first_map && old_ebase != -1) {
> +        /* Remove old mapping */
> +        ret = xc_domain_memory_mapping(xen_xc, xen_domid,
> +                               old_ebase >> XC_PAGE_SHIFT,
> +                               s->bases[i].access.maddr >> XC_PAGE_SHIFT,
> +                               (e_size + XC_PAGE_SIZE - 1) >> XC_PAGE_SHIFT,
> +                               DPCI_REMOVE_MAPPING);
> +        if (ret != 0) {
> +            PT_LOG("Error: remove old mapping failed!\n");
> +            return;
> +        }
> +    }
> +
> +    /* map only valid guest address */
> +    if (e_phys != -1) {
> +        /* Create new mapping */
> +        ret = xc_domain_memory_mapping(xen_xc, xen_domid,
> +                                   s->bases[i].e_physbase >> XC_PAGE_SHIFT,
> +                                   s->bases[i].access.maddr >> XC_PAGE_SHIFT,
> +                                   (e_size+XC_PAGE_SIZE-1) >> XC_PAGE_SHIFT,
> +                                   DPCI_ADD_MAPPING);
> +
> +        if (ret != 0) {
> +            PT_LOG("Error: create new mapping failed!\n");
> +        }
> +    }
> +}
> +
> +static void pt_ioport_map(XenPCIPassthroughState *s, int i,
> +                          pcibus_t e_phys, pcibus_t e_size, int type)
> +{
> +    uint32_t old_ebase = s->bases[i].e_physbase;
> +    bool first_map = s->bases[i].e_size == 0;
> +    int ret = 0;
> +
> +    s->bases[i].e_physbase = e_phys;
> +    s->bases[i].e_size = e_size;
> +
> +    PT_LOG("e_phys=%#04"PRIx64" pio_base=%#04"PRIx64" len=%"PRId64" index=%d"
> +           " first_map=%d\n",
> +           e_phys, s->bases[i].access.pio_base, e_size, i, first_map);
> +
> +    if (e_size == 0) {
> +        return;
> +    }
> +
> +    if (!first_map && old_ebase != -1) {
> +        /* Remove old mapping */
> +        ret = xc_domain_ioport_mapping(xen_xc, xen_domid, old_ebase,
> +                                       s->bases[i].access.pio_base, e_size,
> +                                       DPCI_REMOVE_MAPPING);
> +        if (ret != 0) {
> +            PT_LOG("Error: remove old mapping failed!\n");
> +            return;
> +        }
> +    }
> +
> +    /* map only valid guest address (include 0) */
> +    if (e_phys != -1) {
> +        /* Create new mapping */
> +        ret = xc_domain_ioport_mapping(xen_xc, xen_domid, e_phys,
> +                                       s->bases[i].access.pio_base, e_size,
> +                                       DPCI_ADD_MAPPING);
> +        if (ret != 0) {
> +            PT_LOG("Error: create new mapping failed!\n");
> +        }
> +    }
> +
> +}
> +
> +
> +/* mapping BAR */
> +
> +void pt_bar_mapping_one(XenPCIPassthroughState *s, int bar,
> +                        int io_enable, int mem_enable)
> +{
> +    PCIDevice *dev = &s->dev;
> +    PCIIORegion *r;
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    XenPTRegion *base = NULL;
> +    pcibus_t r_size = 0, r_addr = -1;
> +    int rc = 0;
> +
> +    r = &dev->io_regions[bar];
> +
> +    /* check valid region */
> +    if (!r->size) {
> +        return;
> +    }
> +
> +    base = &s->bases[bar];
> +    /* skip unused BAR or upper 64bit BAR */
> +    if ((base->bar_flag == PT_BAR_FLAG_UNUSED)
> +        || (base->bar_flag == PT_BAR_FLAG_UPPER)) {
> +           return;
> +    }
> +
> +    /* copy region address to temporary */
> +    r_addr = r->addr;
> +
> +    /* need unmapping in case I/O Space or Memory Space disable */
> +    if (((base->bar_flag == PT_BAR_FLAG_IO) && !io_enable) ||
> +        ((base->bar_flag == PT_BAR_FLAG_MEM) && !mem_enable)) {
> +        r_addr = -1;
> +    }
> +    if ((bar == PCI_ROM_SLOT) && (r_addr != -1)) {
> +        reg_grp_entry = pt_find_reg_grp(s, PCI_ROM_ADDRESS);
> +        if (reg_grp_entry) {
> +            reg_entry = pt_find_reg(reg_grp_entry, PCI_ROM_ADDRESS);
> +            if (reg_entry && !(reg_entry->data & PCI_ROM_ADDRESS_ENABLE)) {
> +                r_addr = -1;
> +            }
> +        }
> +    }
> +
> +    /* prevent guest software mapping memory resource to 00000000h */
> +    if ((base->bar_flag == PT_BAR_FLAG_MEM) && (r_addr == 0)) {
> +        r_addr = -1;
> +    }
> +
> +    r_size = pt_get_emul_size(base->bar_flag, r->size);
> +
> +    rc = pci_check_bar_overlap(dev, r_addr, r_size, r->type);
> +    if (rc > 0) {
> +        PT_LOG("Warning: s[%02x:%02x.%x][Region:%d][Address:%"FMT_PCIBUS"h]"
> +               "[Size:%"FMT_PCIBUS"h] is overlapped.\n", pci_bus_num(dev->bus),
> +               PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn), bar,
> +               r_addr, r_size);
> +    }
> +
> +    /* check whether we need to update the mapping or not */
> +    if (r_addr != s->bases[bar].e_physbase) {
> +        /* mapping BAR */
> +        if (base->bar_flag == PT_BAR_FLAG_IO) {
> +            pt_ioport_map(s, bar, r_addr, r_size, r->type);
> +        } else {
> +            pt_iomem_map(s, bar, r_addr, r_size, r->type);
> +        }
> +    }
> +}
> +
> +void pt_bar_mapping(XenPCIPassthroughState *s, int io_enable, int mem_enable)
> +{
> +    int i;
> +
> +    for (i = 0; i < PCI_NUM_REGIONS; i++) {
> +        pt_bar_mapping_one(s, i, io_enable, mem_enable);
> +    }
> +}
> +
> +/* register regions */
> +static int pt_register_regions(XenPCIPassthroughState *s)
> +{
> +    int i = 0;
> +    uint32_t bar_data = 0;
> +    HostPCIDevice *d = s->real_device;
> +
> +    /* Register PIO/MMIO BARs */
> +    for (i = 0; i < PCI_BAR_ENTRIES; i++) {
> +        HostPCIIORegion *r = &d->io_regions[i];
> +
> +        if (r->base_addr) {
> +            s->bases[i].e_physbase = r->base_addr;
> +            s->bases[i].access.u = r->base_addr;
> +
> +            /* Register current region */
> +            if (r->flags & IORESOURCE_IO) {
> +                memory_region_init_io(&s->bar[i], NULL, NULL,
> +                                      "xen-pci-pt-bar", r->size);
> +                pci_register_bar(&s->dev, i, PCI_BASE_ADDRESS_SPACE_IO,
> +                                 &s->bar[i]);
> +            } else if (r->flags & IORESOURCE_PREFETCH) {
> +                memory_region_init_io(&s->bar[i], NULL, NULL,
> +                                      "xen-pci-pt-bar", r->size);
> +                pci_register_bar(&s->dev, i, PCI_BASE_ADDRESS_MEM_PREFETCH,
> +                                 &s->bar[i]);
> +            } else {
> +                memory_region_init_io(&s->bar[i], NULL, NULL,
> +                                      "xen-pci-pt-bar", r->size);
> +                pci_register_bar(&s->dev, i, PCI_BASE_ADDRESS_SPACE_MEMORY,
> +                                 &s->bar[i]);
> +            }
> +
> +            PT_LOG("IO region registered (size=0x%08"PRIx64
> +                   " base_addr=0x%08"PRIx64")\n",
> +                   r->size, r->base_addr);
> +        }
> +    }
> +
> +    /* Register expansion ROM address */
> +    if (d->rom.base_addr && d->rom.size) {
> +        /* Re-set BAR reported by OS, otherwise ROM can't be read. */
> +        bar_data = host_pci_get_long(d, PCI_ROM_ADDRESS);
> +        if ((bar_data & PCI_ROM_ADDRESS_MASK) == 0) {
> +            bar_data |= d->rom.base_addr & PCI_ROM_ADDRESS_MASK;
> +            host_pci_set_long(d, PCI_ROM_ADDRESS, bar_data);
> +        }
> +
> +        s->bases[PCI_ROM_SLOT].e_physbase = d->rom.base_addr;
> +        s->bases[PCI_ROM_SLOT].access.maddr = d->rom.base_addr;
> +
> +        memory_region_init_rom_device(&s->rom, NULL, NULL, &s->dev.qdev,
> +                                      "xen-pci-pt-rom", d->rom.size);
> +        pci_register_bar(&s->dev, PCI_ROM_SLOT, PCI_BASE_ADDRESS_MEM_PREFETCH,
> +                         &s->rom);
> +
> +        PT_LOG("Expansion ROM registered (size=0x%08"PRIx64
> +               " base_addr=0x%08"PRIx64")\n",
> +               d->rom.size, d->rom.base_addr);
> +    }
> +
> +    return 0;
> +}
> +
> +static void pt_unregister_regions(XenPCIPassthroughState *s)
> +{
> +    int i, type, rc;
> +    uint32_t e_size;
> +    PCIDevice *d = &s->dev;
> +
> +    for (i = 0; i < PCI_NUM_REGIONS; i++) {
> +        e_size = s->bases[i].e_size;
> +        if ((e_size == 0) || (s->bases[i].e_physbase == -1)) {
> +            continue;
> +        }
> +
> +        type = d->io_regions[i].type;
> +
> +        if (type == PCI_BASE_ADDRESS_SPACE_MEMORY
> +            || type == PCI_BASE_ADDRESS_MEM_PREFETCH) {
> +            rc = xc_domain_memory_mapping(xen_xc, xen_domid,
> +                    s->bases[i].e_physbase >> XC_PAGE_SHIFT,
> +                    s->bases[i].access.maddr >> XC_PAGE_SHIFT,
> +                    (e_size+XC_PAGE_SIZE-1) >> XC_PAGE_SHIFT,
> +                    DPCI_REMOVE_MAPPING);
> +            if (rc != 0) {
> +                PT_LOG("Error: remove old mem mapping failed!\n");
> +                continue;
> +            }
> +
> +        } else if (type == PCI_BASE_ADDRESS_SPACE_IO) {
> +            rc = xc_domain_ioport_mapping(xen_xc, xen_domid,
> +                        s->bases[i].e_physbase,
> +                        s->bases[i].access.pio_base,
> +                        e_size,
> +                        DPCI_REMOVE_MAPPING);
> +            if (rc != 0) {
> +                PT_LOG("Error: remove old io mapping failed!\n");
> +                continue;
> +            }
> +        }
> +    }
> +}
> +
> +static int pt_initfn(PCIDevice *pcidev)
> +{
> +    XenPCIPassthroughState *s = DO_UPCAST(XenPCIPassthroughState, dev, pcidev);
> +    int dom, bus;
> +    unsigned slot, func;
> +    int rc = 0;
> +    uint32_t machine_irq;
> +    int pirq = -1;
> +
> +    if (pci_parse_devaddr(s->hostaddr, &dom, &bus, &slot, &func) < 0) {
> +        fprintf(stderr, "error parse bdf: %s\n", s->hostaddr);
> +        return -1;
> +    }
> +
> +    /* register real device */
> +    PT_LOG("Assigning real physical device %02x:%02x.%x to devfn %i ...\n",
> +           bus, slot, func, s->dev.devfn);
> +
> +    s->real_device = host_pci_device_get(bus, slot, func);
> +    if (!s->real_device) {
> +        return -1;
> +    }
> +
> +    s->is_virtfn = s->real_device->is_virtfn;
> +    if (s->is_virtfn) {
> +        PT_LOG("%04x:%02x:%02x.%x is a SR-IOV Virtual Function\n",
> +               s->real_device->domain, bus, slot, func);
> +    }
> +
> +    /* Initialize virtualized PCI configuration (Extended 256 Bytes) */
> +    if (host_pci_get_block(s->real_device, 0, pcidev->config,
> +                           PCI_CONFIG_SPACE_SIZE) == -1) {
> +        return -1;
> +    }
> +
> +    /* Handle real device's MMIO/PIO BARs */
> +    pt_register_regions(s);
> +
> +    /* reinitialize each config register to be emulated */
> +    pt_config_init(s);

this function is implemented in the next patch, so you might as well add
this call there


> +    /* Bind interrupt */
> +    if (!s->dev.config[PCI_INTERRUPT_PIN]) {
> +        PT_LOG("no pin interrupt\n");
> +        goto out;
> +    }
> +
> +    machine_irq = host_pci_get_byte(s->real_device, PCI_INTERRUPT_LINE);
> +    rc = xc_physdev_map_pirq(xen_xc, xen_domid, machine_irq, &pirq);
> +
> +    if (rc) {
> +        PT_LOG("Error: Mapping irq failed, rc = %d\n", rc);
> +
> +        /* Disable PCI intx assertion (turn on bit10 of devctl) */
> +        host_pci_set_word(s->real_device,
> +                          PCI_COMMAND,
> +                          pci_get_word(s->dev.config + PCI_COMMAND)
> +                          | PCI_COMMAND_INTX_DISABLE);
> +        machine_irq = 0;
> +        s->machine_irq = 0;
> +    } else {
> +        machine_irq = pirq;
> +        s->machine_irq = pirq;
> +        mapped_machine_irq[machine_irq]++;
> +    }
> +
> +    /* bind machine_irq to device */
> +    if (rc < 0 && machine_irq != 0) {
> +        uint8_t e_device = PCI_SLOT(s->dev.devfn);
> +        uint8_t e_intx = pci_intx(s);
> +
> +        rc = xc_domain_bind_pt_pci_irq(xen_xc, xen_domid, machine_irq, 0,
> +                                       e_device, e_intx);
> +        if (rc < 0) {
> +            PT_LOG("Error: Binding of interrupt failed! rc=%d\n", rc);
> +
> +            /* Disable PCI intx assertion (turn on bit10 of devctl) */
> +            host_pci_set_word(s->real_device, PCI_COMMAND,
> +                              *(uint16_t *)(&s->dev.config[PCI_COMMAND])
> +                              | PCI_COMMAND_INTX_DISABLE);
> +            mapped_machine_irq[machine_irq]--;
> +
> +            if (mapped_machine_irq[machine_irq] == 0) {
> +                if (xc_physdev_unmap_pirq(xen_xc, xen_domid, machine_irq)) {
> +                    PT_LOG("Error: Unmapping of interrupt failed! rc=%d\n",
> +                           rc);
> +                }
> +            }
> +            s->machine_irq = 0;
> +        }
> +    }
> +
> +out:
> +    PT_LOG("Real physical device %02x:%02x.%x registered successfuly!\n"
> +           "IRQ type = %s\n", bus, slot, func, "INTx");
> +
> +    return 0;
> +}
> +
> +static int pt_unregister_device(PCIDevice *pcidev)
> +{
> +    XenPCIPassthroughState *s = DO_UPCAST(XenPCIPassthroughState, dev, pcidev);
> +    uint8_t e_device, e_intx;
> +    uint32_t machine_irq;
> +    int rc;
> +
> +    /* Unbind interrupt */
> +    e_device = PCI_SLOT(s->dev.devfn);
> +    e_intx = pci_intx(s);
> +    machine_irq = s->machine_irq;
> +
> +    if (machine_irq) {
> +        rc = xc_domain_unbind_pt_irq(xen_xc, xen_domid, machine_irq,
> +                                     PT_IRQ_TYPE_PCI, 0, e_device, e_intx, 0);
> +        if (rc < 0) {
> +            PT_LOG("Error: Unbinding of interrupt failed! rc=%d\n", rc);
> +        }
> +    }
> +
> +    if (machine_irq) {
> +        mapped_machine_irq[machine_irq]--;
> +
> +        if (mapped_machine_irq[machine_irq] == 0) {
> +            rc = xc_physdev_unmap_pirq(xen_xc, xen_domid, machine_irq);
> +
> +            if (rc < 0) {
> +                PT_LOG("Error: Unmaping of interrupt failed! rc=%d\n", rc);
> +            }
> +        }
> +    }
> +
> +    /* delete all emulated config registers */
> +    pt_config_delete(s);
> +
> +    /* unregister real device's MMIO/PIO BARs */
> +    pt_unregister_regions(s);
> +
> +    host_pci_device_put(s->real_device);
> +
> +    return 0;
> +}
> +
> +static PCIDeviceInfo xen_pci_passthrough = {
> +    .init = pt_initfn,
> +    .exit = pt_unregister_device,
> +    .qdev.name = "xen-pci-passthrough",
> +    .qdev.desc = "Assign an host pci device with Xen",
> +    .qdev.size = sizeof(XenPCIPassthroughState),
> +    .config_read = pt_pci_read_config,
> +    .config_write = pt_pci_write_config,
> +    .is_express = 0,
> +    .qdev.props = (Property[]) {
> +        DEFINE_PROP_STRING("hostaddr", XenPCIPassthroughState, hostaddr),
> +        DEFINE_PROP_BIT("power-mgmt", XenPCIPassthroughState, power_mgmt,
> +                        0, false),
> +        DEFINE_PROP_END_OF_LIST(),
> +    }
> +};
> +
> +static void xen_passthrough_register(void)
> +{
> +    pci_qdev_register(&xen_pci_passthrough);
> +}
> +
> +device_init(xen_passthrough_register);
> diff --git a/hw/xen_pci_passthrough.h b/hw/xen_pci_passthrough.h
> new file mode 100644
> index 0000000..2d1979d
> --- /dev/null
> +++ b/hw/xen_pci_passthrough.h
> @@ -0,0 +1,223 @@
> +#ifndef QEMU_HW_XEN_PCI_PASSTHROUGH_H
> +#  define QEMU_HW_XEN_PCI_PASSTHROUGH_H
> +
> +#include "qemu-common.h"
> +#include "xen_common.h"
> +#include "pci.h"
> +#include "host-pci-device.h"
> +
> +#define PT_LOGGING_ENABLED
> +#define PT_DEBUG_PCI_CONFIG_ACCESS
> +
> +#ifdef PT_LOGGING_ENABLED
> +#  define PT_LOG(_f, _a...)   fprintf(stderr, "%s: " _f, __func__, ##_a)
> +#else
> +#  define PT_LOG(_f, _a...)
> +#endif
> +
> +#ifdef PT_DEBUG_PCI_CONFIG_ACCESS
> +#  define PT_LOG_CONFIG(_f, _a...) PT_LOG(_f, ##_a)
> +#else
> +#  define PT_LOG_CONFIG(_f, _a...)
> +#endif
> +
> +
> +typedef struct XenPTRegInfo XenPTRegInfo;
> +typedef struct XenPTReg XenPTReg;
> +
> +typedef struct XenPCIPassthroughState XenPCIPassthroughState;
> +
> +/* function type for config reg */
> +typedef uint32_t (*conf_reg_init)
> +    (XenPCIPassthroughState *, XenPTRegInfo *, uint32_t real_offset);
> +typedef int (*conf_dword_write)
> +    (XenPCIPassthroughState *, XenPTReg *cfg_entry,
> +     uint32_t *val, uint32_t dev_value, uint32_t valid_mask);
> +typedef int (*conf_word_write)
> +    (XenPCIPassthroughState *, XenPTReg *cfg_entry,
> +     uint16_t *val, uint16_t dev_value, uint16_t valid_mask);
> +typedef int (*conf_byte_write)
> +    (XenPCIPassthroughState *, XenPTReg *cfg_entry,
> +     uint8_t *val, uint8_t dev_value, uint8_t valid_mask);
> +typedef int (*conf_dword_read)
> +    (XenPCIPassthroughState *, XenPTReg *cfg_entry,
> +     uint32_t *val, uint32_t valid_mask);
> +typedef int (*conf_word_read)
> +    (XenPCIPassthroughState *, XenPTReg *cfg_entry,
> +     uint16_t *val, uint16_t valid_mask);
> +typedef int (*conf_byte_read)
> +    (XenPCIPassthroughState *, XenPTReg *cfg_entry,
> +     uint8_t *val, uint8_t valid_mask);
> +typedef int (*conf_dword_restore)
> +    (XenPCIPassthroughState *, XenPTReg *cfg_entry, uint32_t real_offset,
> +     uint32_t dev_value, uint32_t *val);
> +typedef int (*conf_word_restore)
> +    (XenPCIPassthroughState *, XenPTReg *cfg_entry, uint32_t real_offset,
> +     uint16_t dev_value, uint16_t *val);
> +typedef int (*conf_byte_restore)
> +    (XenPCIPassthroughState *, XenPTReg *cfg_entry, uint32_t real_offset,
> +     uint8_t dev_value, uint8_t *val);
> +
> +/* power state transition */
> +#define PT_FLAG_TRANSITING 0x0001
> +
> +
> +typedef enum {
> +    GRP_TYPE_HARDWIRED = 0,                     /* 0 Hardwired reg group */
> +    GRP_TYPE_EMU,                               /* emul reg group */
> +} RegisterGroupType;
> +
> +typedef enum {
> +    PT_BAR_FLAG_MEM = 0,                        /* Memory type BAR */
> +    PT_BAR_FLAG_IO,                             /* I/O type BAR */
> +    PT_BAR_FLAG_UPPER,                          /* upper 64bit BAR */
> +    PT_BAR_FLAG_UNUSED,                         /* unused BAR */
> +} PTBarFlag;
> +
> +
> +typedef struct XenPTRegion {
> +    /* Virtual phys base & size */
> +    uint32_t e_physbase;
> +    uint32_t e_size;
> +    /* Index of region in qemu */
> +    uint32_t memory_index;
> +    /* BAR flag */
> +    PTBarFlag bar_flag;
> +    /* Translation of the emulated address */
> +    union {
> +        uint64_t maddr;
> +        uint64_t pio_base;
> +        uint64_t u;
> +    } access;
> +} XenPTRegion;
> +
> +/* XenPTRegInfo declaration
> + * - only for emulated register (either a part or whole bit).
> + * - for passthrough register that need special behavior (like interacting with
> + *   other component), set emu_mask to all 0 and specify r/w func properly.
> + * - do NOT use ALL F for init_val, otherwise the tbl will not be registered.
> + */
> +
> +/* emulated register infomation */
> +struct XenPTRegInfo {
> +    uint32_t offset;
> +    uint32_t size;
> +    uint32_t init_val;
> +    /* reg read only field mask (ON:RO/ROS, OFF:other) */
> +    uint32_t ro_mask;
> +    /* reg emulate field mask (ON:emu, OFF:passthrough) */
> +    uint32_t emu_mask;
> +    /* no write back allowed */
> +    uint32_t no_wb;
> +    conf_reg_init init;
> +    /* read/write/restore function pointer
> +     * for double_word/word/byte size */
> +    union {
> +        struct {
> +            conf_dword_write write;
> +            conf_dword_read read;
> +            conf_dword_restore restore;
> +        } dw;
> +        struct {
> +            conf_word_write write;
> +            conf_word_read read;
> +            conf_word_restore restore;
> +        } w;
> +        struct {
> +            conf_byte_write write;
> +            conf_byte_read read;
> +            conf_byte_restore restore;
> +        } b;
> +    } u;
> +};
> +
> +/* emulated register management */
> +struct XenPTReg {
> +    QLIST_ENTRY(XenPTReg) entries;
> +    XenPTRegInfo *reg;
> +    uint32_t data;
> +};
> +
> +typedef struct XenPTRegGroupInfo XenPTRegGroupInfo;
> +
> +/* emul reg group size initialize method */
> +typedef uint8_t (*pt_reg_size_init_fn)
> +    (XenPCIPassthroughState *, const XenPTRegGroupInfo *,
> +     uint32_t base_offset);
> +
> +/* emulated register group infomation */
> +struct XenPTRegGroupInfo {
> +    uint8_t grp_id;
> +    RegisterGroupType grp_type;
> +    uint8_t grp_size;
> +    pt_reg_size_init_fn size_init;
> +    XenPTRegInfo *emu_reg_tbl;
> +};
> +
> +/* emul register group management table */
> +typedef struct XenPTRegGroup {
> +    QLIST_ENTRY(XenPTRegGroup) entries;
> +    const XenPTRegGroupInfo *reg_grp;
> +    uint32_t base_offset;
> +    uint8_t size;
> +    QLIST_HEAD(, XenPTReg) reg_tbl_list;
> +} XenPTRegGroup;
> +
> +
> +typedef struct XenPTPM {
> +    QEMUTimer *pm_timer;  /* QEMUTimer struct */
> +    int no_soft_reset;    /* No Soft Reset flags */
> +    uint16_t flags;       /* power state transition flags */
> +    uint16_t pmc_field;   /* Power Management Capabilities field */
> +    int pm_delay;         /* power state transition delay */
> +    uint16_t cur_state;   /* current power state */
> +    uint16_t req_state;   /* requested power state */
> +    uint32_t pm_base;     /* Power Management Capability reg base offset */
> +    uint32_t aer_base;    /* AER Capability reg base offset */
> +} XenPTPM;
> +
> +struct XenPCIPassthroughState {
> +    PCIDevice dev;
> +
> +    char *hostaddr;
> +    bool is_virtfn;
> +    HostPCIDevice *real_device;
> +    XenPTRegion bases[PCI_NUM_REGIONS]; /* Access regions */
> +    QLIST_HEAD(, XenPTRegGroup) reg_grp_tbl;
> +
> +    uint32_t machine_irq;
> +
> +    uint32_t power_mgmt;
> +    XenPTPM *pm_state;
> +
> +    MemoryRegion bar[PCI_NUM_REGIONS - 1];
> +    MemoryRegion rom;
> +};
> +
> +void pt_config_init(XenPCIPassthroughState *s);
> +void pt_config_delete(XenPCIPassthroughState *s);
> +void pt_bar_mapping(XenPCIPassthroughState *s, int io_enable, int mem_enable);
> +void pt_bar_mapping_one(XenPCIPassthroughState *s, int bar,
> +                        int io_enable, int mem_enable);
> +XenPTRegGroup *pt_find_reg_grp(XenPCIPassthroughState *s, uint32_t address);
> +XenPTReg *pt_find_reg(XenPTRegGroup *reg_grp, uint32_t address);
> +int pt_bar_offset_to_index(uint32_t offset);
> +
> +static inline pcibus_t pt_get_emul_size(PTBarFlag flag, pcibus_t r_size)
> +{
> +    /* align resource size (memory type only) */
> +    if (flag == PT_BAR_FLAG_MEM) {
> +        return (r_size + XC_PAGE_SIZE - 1) & XC_PAGE_MASK;
> +    } else {
> +        return r_size;
> +    }
> +}
> +
> +/* INTx */
> +static inline uint8_t pci_read_intx(XenPCIPassthroughState *s)
> +{
> +    return host_pci_get_byte(s->real_device, PCI_INTERRUPT_PIN);
> +}
> +uint8_t pci_intx(XenPCIPassthroughState *ptdev);
> +
> +#endif /* !QEMU_HW_XEN_PCI_PASSTHROUGH_H */
> diff --git a/hw/xen_pci_passthrough_helpers.c b/hw/xen_pci_passthrough_helpers.c
> new file mode 100644
> index 0000000..192e918
> --- /dev/null
> +++ b/hw/xen_pci_passthrough_helpers.c
> @@ -0,0 +1,46 @@
> +#include "xen_pci_passthrough.h"
> +
> +/* The PCI Local Bus Specification, Rev. 3.0, {
> + * Section 6.2.4 Miscellaneous Registers, pp 223
> + * outlines 5 valid values for the intertupt pin (intx).
> + *  0: For devices (or device functions) that don't use an interrupt in
> + *  1: INTA#
> + *  2: INTB#
> + *  3: INTC#
> + *  4: INTD#
> + *
> + * Xen uses the following 4 values for intx
> + *  0: INTA#
> + *  1: INTB#
> + *  2: INTC#
> + *  3: INTD#
> + *
> + * Observing that these list of values are not the same, pci_read_intx()
> + * uses the following mapping from hw to xen values.
> + * This seems to reflect the current usage within Xen.
> + *
> + * PCI hardware    | Xen | Notes
> + * ----------------+-----+----------------------------------------------------
> + * 0               | 0   | No interrupt
> + * 1               | 0   | INTA#
> + * 2               | 1   | INTB#
> + * 3               | 2   | INTC#
> + * 4               | 3   | INTD#
> + * any other value | 0   | This should never happen, log error message
> +}
> + */
> +uint8_t pci_intx(XenPCIPassthroughState *ptdev)
> +{
> +    uint8_t r_val = pci_read_intx(ptdev);
> +
> +    PT_LOG("intx=%i\n", r_val);
> +    if (r_val < 1 || r_val > 4) {
> +        PT_LOG("Interrupt pin read from hardware is out of range: "
> +               "value=%i, acceptable range is 1 - 4\n", r_val);
> +        r_val = 0;
> +    } else {
> +        r_val -= 1;
> +    }
> +
> +    return r_val;
> +}
 
if xen_pci_passthrough_helpers.c is only going to contain this function
you might as well declared it static inline and move it to
xen_pci_passthrough.h

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 05:00:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 05:00:39 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNlI6-0002i3-MA; Tue, 08 Nov 2011 05:00:38 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNlEI-000289-U2
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 04:56:45 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1320756986!54177804!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27381 invoked from network); 8 Nov 2011 12:56:27 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 12:56:27 -0000
X-IronPort-AV: E=Sophos;i="4.69,477,1315180800"; 
   d="scan'208";a="8816372"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 12:56:39 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 12:56:39 +0000
Date: Tue, 8 Nov 2011 12:57:10 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Anthony PERARD <anthony.perard@citrix.com>
In-Reply-To: <1319814456-8158-9-git-send-email-anthony.perard@citrix.com>
Message-ID: <alpine.DEB.2.00.1111081246460.3519@kaball-desktop>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-9-git-send-email-anthony.perard@citrix.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: Guy Zana <guy@neocleus.com>, Xen Devel <xen-devel@lists.xensource.com>,
	Allen Kay <allen.m.kay@intel.com>, QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH V3 08/10] Introduce Xen PCI Passthrough,
 PCI config space helpers (2/3)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Obviously passthrough cannot work without this patch, but qemu should be
able to compile anyway. Please add to the previous patch empty stub
implementations for all the exported functions that you are going to
implement here.

I see that the timer is allocated here.
In that case it would make sense to move the timer update to this patch.

On Fri, 28 Oct 2011, Anthony PERARD wrote:
> From: Allen Kay <allen.m.kay@intel.com>
> 
> Signed-off-by: Allen Kay <allen.m.kay@intel.com>
> Signed-off-by: Guy Zana <guy@neocleus.com>
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  Makefile.target                      |    1 +
>  hw/xen_pci_passthrough.h             |    2 +
>  hw/xen_pci_passthrough_config_init.c | 2068 ++++++++++++++++++++++++++++++++++
>  3 files changed, 2071 insertions(+), 0 deletions(-)
>  create mode 100644 hw/xen_pci_passthrough_config_init.c
> 
> diff --git a/Makefile.target b/Makefile.target
> index 36ea47d..c32c688 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -219,6 +219,7 @@ obj-i386-$(CONFIG_XEN) += xen_platform.o
>  obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += host-pci-device.o
>  obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pci_passthrough.o
>  obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pci_passthrough_helpers.o
> +obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pci_passthrough_config_init.o
> 
>  # Inter-VM PCI shared memory
>  CONFIG_IVSHMEM =
> diff --git a/hw/xen_pci_passthrough.h b/hw/xen_pci_passthrough.h
> index 2d1979d..ebc04fd 100644
> --- a/hw/xen_pci_passthrough.h
> +++ b/hw/xen_pci_passthrough.h
> @@ -61,6 +61,8 @@ typedef int (*conf_byte_restore)
>  /* power state transition */
>  #define PT_FLAG_TRANSITING 0x0001
> 
> +#define PT_BAR_ALLF        0xFFFFFFFF  /* BAR ALLF value */
> +
> 
>  typedef enum {
>      GRP_TYPE_HARDWIRED = 0,                     /* 0 Hardwired reg group */
> diff --git a/hw/xen_pci_passthrough_config_init.c b/hw/xen_pci_passthrough_config_init.c
> new file mode 100644
> index 0000000..4103b59
> --- /dev/null
> +++ b/hw/xen_pci_passthrough_config_init.c
> @@ -0,0 +1,2068 @@
> +/*
> + * Copyright (c) 2007, Neocleus Corporation.
> + * Copyright (c) 2007, Intel Corporation.
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2.  See
> + * the COPYING file in the top-level directory.
> + *
> + * Alex Novik <alex@neocleus.com>
> + * Allen Kay <allen.m.kay@intel.com>
> + * Guy Zana <guy@neocleus.com>
> + *
> + * This file implements direct PCI assignment to a HVM guest
> + */
> +
> +#include "qemu-timer.h"
> +#include "xen_backend.h"
> +#include "xen_pci_passthrough.h"
> +
> +#define PT_MERGE_VALUE(value, data, val_mask) \
> +    (((value) & (val_mask)) | ((data) & ~(val_mask)))
> +
> +#define PT_INVALID_REG          0xFFFFFFFF      /* invalid register value */
> +
> +/* prototype */
> +
> +static uint32_t pt_ptr_reg_init(XenPCIPassthroughState *s, XenPTRegInfo *reg,
> +                                uint32_t real_offset);
> +static int pt_init_pci_config(XenPCIPassthroughState *s);
> +
> +
> +/* helper */
> +
> +/* A return value of 1 means the capability should NOT be exposed to guest. */
> +static int pt_hide_dev_cap(const HostPCIDevice *d, uint8_t grp_id)
> +{
> +    switch (grp_id) {
> +    case PCI_CAP_ID_EXP:
> +        /* The PCI Express Capability Structure of the VF of Intel 82599 10GbE
> +         * Controller looks trivial, e.g., the PCI Express Capabilities
> +         * Register is 0. We should not try to expose it to guest.
> +         */
> +        if (d->vendor_id == PCI_VENDOR_ID_INTEL &&
> +                d->device_id == PCI_DEVICE_ID_INTEL_82599_VF) {
> +            return 1;
> +        }
> +        break;
> +    }
> +    return 0;
> +}
> +
> +/*   find emulate register group entry */
> +XenPTRegGroup *pt_find_reg_grp(XenPCIPassthroughState *s, uint32_t address)
> +{
> +    XenPTRegGroup *entry = NULL;
> +
> +    /* find register group entry */
> +    QLIST_FOREACH(entry, &s->reg_grp_tbl, entries) {
> +        /* check address */
> +        if ((entry->base_offset <= address)
> +            && ((entry->base_offset + entry->size) > address)) {
> +            return entry;
> +        }
> +    }
> +
> +    /* group entry not found */
> +    return NULL;
> +}
> +
> +/* find emulate register entry */
> +XenPTReg *pt_find_reg(XenPTRegGroup *reg_grp, uint32_t address)
> +{
> +    XenPTReg *reg_entry = NULL;
> +    XenPTRegInfo *reg = NULL;
> +    uint32_t real_offset = 0;
> +
> +    /* find register entry */
> +    QLIST_FOREACH(reg_entry, &reg_grp->reg_tbl_list, entries) {
> +        reg = reg_entry->reg;
> +        real_offset = reg_grp->base_offset + reg->offset;
> +        /* check address */
> +        if ((real_offset <= address)
> +            && ((real_offset + reg->size) > address)) {
> +            return reg_entry;
> +        }
> +    }
> +
> +    return NULL;
> +}
> +
> +/* parse BAR */
> +static PTBarFlag pt_bar_reg_parse(XenPCIPassthroughState *s, XenPTRegInfo *reg)
> +{
> +    PCIDevice *d = &s->dev;
> +    XenPTRegion *region = NULL;
> +    PCIIORegion *r;
> +    int index = 0;
> +
> +    /* check 64bit BAR */
> +    index = pt_bar_offset_to_index(reg->offset);
> +    if ((0 < index) && (index < PCI_ROM_SLOT)) {
> +        int flags = s->real_device->io_regions[index - 1].flags;
> +
> +        if ((flags & IORESOURCE_MEM) && (flags & IORESOURCE_MEM_64)) {
> +            region = &s->bases[index - 1];
> +            if (region->bar_flag != PT_BAR_FLAG_UPPER) {
> +                return PT_BAR_FLAG_UPPER;
> +            }
> +        }
> +    }
> +
> +    /* check unused BAR */
> +    r = &d->io_regions[index];
> +    if (r->size == 0) {
> +        return PT_BAR_FLAG_UNUSED;
> +    }
> +
> +    /* for ExpROM BAR */
> +    if (index == PCI_ROM_SLOT) {
> +        return PT_BAR_FLAG_MEM;
> +    }
> +
> +    /* check BAR I/O indicator */
> +    if (s->real_device->io_regions[index].flags & IORESOURCE_IO) {
> +        return PT_BAR_FLAG_IO;
> +    } else {
> +        return PT_BAR_FLAG_MEM;
> +    }
> +}
> +
> +
> +/****************
> + * general register functions
> + */
> +
> +/* register initialization function */
> +
> +static uint32_t pt_common_reg_init(XenPCIPassthroughState *s,
> +                                   XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    return reg->init_val;
> +}
> +
> +/* Read register functions */
> +
> +static int pt_byte_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                            uint8_t *value, uint8_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint8_t valid_emu_mask = 0;
> +
> +    /* emulate byte register */
> +    valid_emu_mask = reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);
> +
> +    return 0;
> +}
> +static int pt_word_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                            uint16_t *value, uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint16_t valid_emu_mask = 0;
> +
> +    /* emulate word register */
> +    valid_emu_mask = reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);
> +
> +    return 0;
> +}
> +static int pt_long_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                            uint32_t *value, uint32_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint32_t valid_emu_mask = 0;
> +
> +    /* emulate long register */
> +    valid_emu_mask = reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);
> +
> +   return 0;
> +}
> +
> +/* Write register functions */
> +
> +static int pt_byte_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                             uint8_t *value, uint8_t dev_value,
> +                             uint8_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint8_t writable_mask = 0;
> +    uint8_t throughable_mask = 0;
> +
> +    /* modify emulate register */
> +    writable_mask = reg->emu_mask & ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    return 0;
> +}
> +static int pt_word_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                             uint16_t *value, uint16_t dev_value,
> +                             uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint16_t writable_mask = 0;
> +    uint16_t throughable_mask = 0;
> +
> +    /* modify emulate register */
> +    writable_mask = reg->emu_mask & ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    return 0;
> +}
> +static int pt_long_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                             uint32_t *value, uint32_t dev_value,
> +                             uint32_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint32_t writable_mask = 0;
> +    uint32_t throughable_mask = 0;
> +
> +    /* modify emulate register */
> +    writable_mask = reg->emu_mask & ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    return 0;
> +}
> +
> +/* common restore register fonctions */
> +static int pt_byte_reg_restore(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                               uint32_t real_offset, uint8_t dev_value,
> +                               uint8_t *value)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    PCIDevice *d = &s->dev;
> +
> +    /* use I/O device register's value as restore value */
> +    *value = pci_get_byte(d->config + real_offset);
> +
> +    /* create value for restoring to I/O device register */
> +    *value = PT_MERGE_VALUE(*value, dev_value, reg->emu_mask);
> +
> +    return 0;
> +}
> +static int pt_word_reg_restore(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                               uint32_t real_offset, uint16_t dev_value,
> +                               uint16_t *value)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    PCIDevice *d = &s->dev;
> +
> +    /* use I/O device register's value as restore value */
> +    *value = pci_get_word(d->config + real_offset);
> +
> +    /* create value for restoring to I/O device register */
> +    *value = PT_MERGE_VALUE(*value, dev_value, reg->emu_mask);
> +
> +    return 0;
> +}
> +
> +
> +/* XenPTRegInfo declaration
> + * - only for emulated register (either a part or whole bit).
> + * - for passthrough register that need special behavior (like interacting with
> + *   other component), set emu_mask to all 0 and specify r/w func properly.
> + * - do NOT use ALL F for init_val, otherwise the tbl will not be registered.
> + */
> +
> +/********************
> + * Header Type0
> + */
> +
> +static uint32_t pt_vendor_reg_init(XenPCIPassthroughState *s,
> +                                   XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    return s->real_device->vendor_id;
> +}
> +static uint32_t pt_device_reg_init(XenPCIPassthroughState *s,
> +                                   XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    return s->real_device->device_id;
> +}
> +static uint32_t pt_status_reg_init(XenPCIPassthroughState *s,
> +                                   XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    int reg_field = 0;
> +
> +    /* find Header register group */
> +    reg_grp_entry = pt_find_reg_grp(s, PCI_CAPABILITY_LIST);
> +    if (reg_grp_entry) {
> +        /* find Capabilities Pointer register */
> +        reg_entry = pt_find_reg(reg_grp_entry, PCI_CAPABILITY_LIST);
> +        if (reg_entry) {
> +            /* check Capabilities Pointer register */
> +            if (reg_entry->data) {
> +                reg_field |= PCI_STATUS_CAP_LIST;
> +            } else {
> +                reg_field &= ~PCI_STATUS_CAP_LIST;
> +            }
> +        } else {
> +            hw_error("Internal error: Couldn't find pt_reg_tbl for "
> +                     "Capabilities Pointer register. I/O emulator exit.\n");
> +        }
> +    } else {
> +        hw_error("Internal error: Couldn't find pt_reg_grp_tbl for Header. "
> +                 "I/O emulator exit.\n");
> +    }
> +
> +    return reg_field;
> +}
> +static uint32_t pt_header_type_reg_init(XenPCIPassthroughState *s,
> +                                        XenPTRegInfo *reg,
> +                                        uint32_t real_offset)
> +{
> +    /* read PCI_HEADER_TYPE */
> +    return reg->init_val | 0x80;
> +}
> +
> +/* initialize Interrupt Pin register */
> +static uint32_t pt_irqpin_reg_init(XenPCIPassthroughState *s,
> +                                   XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    return pci_read_intx(s);
> +}
> +
> +/* Command register */
> +static int pt_cmd_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                           uint16_t *value, uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint16_t valid_emu_mask = 0;
> +    uint16_t emu_mask = reg->emu_mask;
> +
> +    if (s->is_virtfn) {
> +        emu_mask |= PCI_COMMAND_MEMORY;
> +    }
> +
> +    /* emulate word register */
> +    valid_emu_mask = emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);
> +
> +    return 0;
> +}
> +static int pt_cmd_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                            uint16_t *value, uint16_t dev_value,
> +                            uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint16_t writable_mask = 0;
> +    uint16_t throughable_mask = 0;
> +    uint16_t wr_value = *value;
> +    uint16_t emu_mask = reg->emu_mask;
> +
> +    if (s->is_virtfn) {
> +        emu_mask |= PCI_COMMAND_MEMORY;
> +    }
> +
> +    /* modify emulate register */
> +    writable_mask = ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~emu_mask & valid_mask;
> +
> +    if (*value & PCI_COMMAND_INTX_DISABLE) {
> +        throughable_mask |= PCI_COMMAND_INTX_DISABLE;
> +    } else {
> +        if (s->machine_irq) {
> +            throughable_mask |= PCI_COMMAND_INTX_DISABLE;
> +        }
> +    }
> +
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    /* mapping BAR */
> +    pt_bar_mapping(s, wr_value & PCI_COMMAND_IO,
> +                   wr_value & PCI_COMMAND_MEMORY);
> +
> +    return 0;
> +}
> +static int pt_cmd_reg_restore(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                              uint32_t real_offset, uint16_t dev_value,
> +                              uint16_t *value)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    PCIDevice *d = &s->dev;
> +    uint16_t restorable_mask = 0;
> +
> +    /* use I/O device register's value as restore value */
> +    *value = pci_get_word(d->config + real_offset);
> +
> +    /* create value for restoring to I/O device register
> +     * but do not include Fast Back-to-Back Enable bit.
> +     */
> +    restorable_mask = reg->emu_mask & ~PCI_COMMAND_FAST_BACK;
> +    *value = PT_MERGE_VALUE(*value, dev_value, restorable_mask);
> +
> +    if (!s->machine_irq) {
> +        *value |= PCI_COMMAND_INTX_DISABLE;
> +    } else {
> +        *value &= ~PCI_COMMAND_INTX_DISABLE;
> +    }
> +
> +    return 0;
> +}
> +
> +/* BAR */
> +#define PT_BAR_MEM_RO_MASK      0x0000000F      /* BAR ReadOnly mask(Memory) */
> +#define PT_BAR_MEM_EMU_MASK     0xFFFFFFF0      /* BAR emul mask(Memory) */
> +#define PT_BAR_IO_RO_MASK       0x00000003      /* BAR ReadOnly mask(I/O) */
> +#define PT_BAR_IO_EMU_MASK      0xFFFFFFFC      /* BAR emul mask(I/O) */
> +
> +static inline uint32_t base_address_with_flags(HostPCIIORegion *hr)
> +{
> +    if ((hr->flags & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) {
> +        return hr->base_addr | (hr->flags & ~PCI_BASE_ADDRESS_IO_MASK);
> +    } else {
> +        return hr->base_addr | (hr->flags & ~PCI_BASE_ADDRESS_MEM_MASK);
> +    }
> +}
> +
> +static uint32_t pt_bar_reg_init(XenPCIPassthroughState *s, XenPTRegInfo *reg,
> +                                uint32_t real_offset)
> +{
> +    int reg_field = 0;
> +    int index;
> +
> +    /* get BAR index */
> +    index = pt_bar_offset_to_index(reg->offset);
> +    if (index < 0) {
> +        hw_error("Internal error: Invalid BAR index[%d]. "
> +                 "I/O emulator exit.\n", index);
> +    }
> +
> +    /* set initial guest physical base address to -1 */
> +    s->bases[index].e_physbase = -1;
> +
> +    /* set BAR flag */
> +    s->bases[index].bar_flag = pt_bar_reg_parse(s, reg);
> +    if (s->bases[index].bar_flag == PT_BAR_FLAG_UNUSED) {
> +        reg_field = PT_INVALID_REG;
> +    }
> +
> +    return reg_field;
> +}
> +static int pt_bar_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                           uint32_t *value, uint32_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint32_t valid_emu_mask = 0;
> +    uint32_t bar_emu_mask = 0;
> +    int index;
> +
> +    /* get BAR index */
> +    index = pt_bar_offset_to_index(reg->offset);
> +    if (index < 0) {
> +        hw_error("Internal error: Invalid BAR index[%d]. "
> +                 "I/O emulator exit.\n", index);
> +    }
> +
> +    /* use fixed-up value from kernel sysfs */
> +    *value = base_address_with_flags(&s->real_device->io_regions[index]);
> +
> +    /* set emulate mask depend on BAR flag */
> +    switch (s->bases[index].bar_flag) {
> +    case PT_BAR_FLAG_MEM:
> +        bar_emu_mask = PT_BAR_MEM_EMU_MASK;
> +        break;
> +    case PT_BAR_FLAG_IO:
> +        bar_emu_mask = PT_BAR_IO_EMU_MASK;
> +        break;
> +    case PT_BAR_FLAG_UPPER:
> +        bar_emu_mask = PT_BAR_ALLF;
> +        break;
> +    default:
> +        break;
> +    }
> +
> +    /* emulate BAR */
> +    valid_emu_mask = bar_emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);
> +
> +   return 0;
> +}
> +static int pt_bar_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                            uint32_t *value, uint32_t dev_value,
> +                            uint32_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    XenPTRegion *base = NULL;
> +    PCIDevice *d = &s->dev;
> +    PCIIORegion *r;
> +    uint32_t writable_mask = 0;
> +    uint32_t throughable_mask = 0;
> +    uint32_t bar_emu_mask = 0;
> +    uint32_t bar_ro_mask = 0;
> +    uint32_t new_addr, last_addr;
> +    uint32_t prev_offset;
> +    uint32_t r_size = 0;
> +    int index = 0;
> +
> +    /* get BAR index */
> +    index = pt_bar_offset_to_index(reg->offset);
> +    if (index < 0) {
> +        hw_error("Internal error: Invalid BAR index[%d]. "
> +                 "I/O emulator exit.\n", index);
> +    }
> +
> +    r = &d->io_regions[index];
> +    base = &s->bases[index];
> +    r_size = pt_get_emul_size(base->bar_flag, r->size);
> +
> +    /* set emulate mask and read-only mask depend on BAR flag */
> +    switch (s->bases[index].bar_flag) {
> +    case PT_BAR_FLAG_MEM:
> +        bar_emu_mask = PT_BAR_MEM_EMU_MASK;
> +        bar_ro_mask = PT_BAR_MEM_RO_MASK | (r_size - 1);
> +        break;
> +    case PT_BAR_FLAG_IO:
> +        bar_emu_mask = PT_BAR_IO_EMU_MASK;
> +        bar_ro_mask = PT_BAR_IO_RO_MASK | (r_size - 1);
> +        break;
> +    case PT_BAR_FLAG_UPPER:
> +        bar_emu_mask = PT_BAR_ALLF;
> +        bar_ro_mask = 0;    /* all upper 32bit are R/W */
> +        break;
> +    default:
> +        break;
> +    }
> +
> +    /* modify emulate register */
> +    writable_mask = bar_emu_mask & ~bar_ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* check whether we need to update the virtual region address or not */
> +    switch (s->bases[index].bar_flag) {
> +    case PT_BAR_FLAG_MEM:
> +        /* nothing to do */
> +        break;
> +    case PT_BAR_FLAG_IO:
> +        new_addr = cfg_entry->data;
> +        last_addr = new_addr + r_size - 1;
> +        /* check invalid address */
> +        if (last_addr <= new_addr || !new_addr || last_addr >= 0x10000) {
> +            /* check 64K range */
> +            if ((last_addr >= 0x10000) &&
> +                (cfg_entry->data != (PT_BAR_ALLF & ~bar_ro_mask))) {
> +                PT_LOG("Warning: Guest attempt to set Base Address "
> +                       "over the 64KB. [%02x:%02x.%x][Offset:%02xh]"
> +                       "[Address:%08xh][Size:%08xh]\n",
> +                       pci_bus_num(d->bus), PCI_SLOT(d->devfn),
> +                       PCI_FUNC(d->devfn),
> +                       reg->offset, new_addr, r_size);
> +            }
> +            /* just remove mapping */
> +            r->addr = -1;
> +            goto exit;
> +        }
> +        break;
> +    case PT_BAR_FLAG_UPPER:
> +        if (cfg_entry->data) {
> +            if (cfg_entry->data != (PT_BAR_ALLF & ~bar_ro_mask)) {
> +                PT_LOG("Warning: Guest attempt to set high MMIO Base Address. "
> +                       "Ignore mapping. "
> +                       "[%02x:%02x.%x][Offset:%02xh][High Address:%08xh]\n",
> +                       pci_bus_num(d->bus), PCI_SLOT(d->devfn),
> +                       PCI_FUNC(d->devfn), reg->offset, cfg_entry->data);
> +            }
> +            /* clear lower address */
> +            d->io_regions[index-1].addr = -1;
> +        } else {
> +            /* find lower 32bit BAR */
> +            prev_offset = (reg->offset - 4);
> +            reg_grp_entry = pt_find_reg_grp(s, prev_offset);
> +            if (reg_grp_entry) {
> +                reg_entry = pt_find_reg(reg_grp_entry, prev_offset);
> +                if (reg_entry) {
> +                    /* restore lower address */
> +                    d->io_regions[index-1].addr = reg_entry->data;
> +                } else {
> +                    return -1;
> +                }
> +            } else {
> +                return -1;
> +            }
> +        }
> +
> +        /* never mapping the 'empty' upper region,
> +         * because we'll do it enough for the lower region.
> +         */
> +        r->addr = -1;
> +        goto exit;
> +    default:
> +        break;
> +    }
> +
> +    /* update the corresponding virtual region address */
> +    /*
> +     * When guest code tries to get block size of mmio, it will write all "1"s
> +     * into pci bar register. In this case, cfg_entry->data == writable_mask.
> +     * Especially for devices with large mmio, the value of writable_mask
> +     * is likely to be a guest physical address that has been mapped to ram
> +     * rather than mmio. Remapping this value to mmio should be prevented.
> +     */
> +
> +    if (cfg_entry->data != writable_mask) {
> +        r->addr = cfg_entry->data;
> +    }
> +
> +exit:
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~bar_emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    /* After BAR reg update, we need to remap BAR */
> +    reg_grp_entry = pt_find_reg_grp(s, PCI_COMMAND);
> +    if (reg_grp_entry) {
> +        reg_entry = pt_find_reg(reg_grp_entry, PCI_COMMAND);
> +        if (reg_entry) {
> +            pt_bar_mapping_one(s, index, reg_entry->data & PCI_COMMAND_IO,
> +                               reg_entry->data & PCI_COMMAND_MEMORY);
> +        }
> +    }
> +
> +    return 0;
> +}
> +static int pt_bar_reg_restore(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                              uint32_t real_offset, uint32_t dev_value,
> +                              uint32_t *value)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint32_t bar_emu_mask = 0;
> +    int index = 0;
> +
> +    /* get BAR index */
> +    index = pt_bar_offset_to_index(reg->offset);
> +    if (index < 0) {
> +        hw_error("Internal error: Invalid BAR index[%d]. "
> +                 "I/O emulator exit.\n", index);
> +    }
> +
> +    /* use value from kernel sysfs */
> +    if (s->bases[index].bar_flag == PT_BAR_FLAG_UPPER) {
> +        *value = s->real_device->io_regions[index - 1].base_addr >> 32;
> +    } else {
> +        *value = base_address_with_flags(&s->real_device->io_regions[index]);
> +    }
> +
> +    /* set emulate mask depend on BAR flag */
> +    switch (s->bases[index].bar_flag) {
> +    case PT_BAR_FLAG_MEM:
> +        bar_emu_mask = PT_BAR_MEM_EMU_MASK;
> +        break;
> +    case PT_BAR_FLAG_IO:
> +        bar_emu_mask = PT_BAR_IO_EMU_MASK;
> +        break;
> +    case PT_BAR_FLAG_UPPER:
> +        bar_emu_mask = PT_BAR_ALLF;
> +        break;
> +    default:
> +        break;
> +    }
> +
> +    /* create value for restoring to I/O device register */
> +    *value = PT_MERGE_VALUE(*value, dev_value, bar_emu_mask);
> +
> +    return 0;
> +}
> +
> +/* write Exp ROM BAR */
> +static int pt_exp_rom_bar_reg_write(XenPCIPassthroughState *s,
> +                                    XenPTReg *cfg_entry, uint32_t *value,
> +                                    uint32_t dev_value, uint32_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    XenPTRegion *base = NULL;
> +    PCIDevice *d = (PCIDevice *)&s->dev;
> +    PCIIORegion *r;
> +    uint32_t writable_mask = 0;
> +    uint32_t throughable_mask = 0;
> +    pcibus_t r_size = 0;
> +    uint32_t bar_emu_mask = 0;
> +    uint32_t bar_ro_mask = 0;
> +
> +    r = &d->io_regions[PCI_ROM_SLOT];
> +    r_size = r->size;
> +    base = &s->bases[PCI_ROM_SLOT];
> +    /* align memory type resource size */
> +    pt_get_emul_size(base->bar_flag, r_size);
> +
> +    /* set emulate mask and read-only mask */
> +    bar_emu_mask = reg->emu_mask;
> +    bar_ro_mask = (reg->ro_mask | (r_size - 1)) & ~PCI_ROM_ADDRESS_ENABLE;
> +
> +    /* modify emulate register */
> +    writable_mask = ~bar_ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* update the corresponding virtual region address */
> +    /*
> +     * When guest code tries to get block size of mmio, it will write all "1"s
> +     * into pci bar register. In this case, cfg_entry->data == writable_mask.
> +     * Especially for devices with large mmio, the value of writable_mask
> +     * is likely to be a guest physical address that has been mapped to ram
> +     * rather than mmio. Remapping this value to mmio should be prevented.
> +     */
> +
> +    if (cfg_entry->data != writable_mask) {
> +        r->addr = cfg_entry->data;
> +    }
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~bar_emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    /* After BAR reg update, we need to remap BAR*/
> +    reg_grp_entry = pt_find_reg_grp(s, PCI_COMMAND);
> +    if (reg_grp_entry) {
> +        reg_entry = pt_find_reg(reg_grp_entry, PCI_COMMAND);
> +        if (reg_entry) {
> +            pt_bar_mapping_one(s, PCI_ROM_SLOT,
> +                               reg_entry->data & PCI_COMMAND_IO,
> +                               reg_entry->data & PCI_COMMAND_MEMORY);
> +        }
> +    }
> +
> +    return 0;
> +}
> +/* restore ROM BAR */
> +static int pt_exp_rom_bar_reg_restore(XenPCIPassthroughState *s,
> +                                      XenPTReg *cfg_entry,
> +                                      uint32_t real_offset,
> +                                      uint32_t dev_value, uint32_t *value)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +
> +    /* use value from kernel sysfs */
> +    *value =
> +        PT_MERGE_VALUE(host_pci_get_long(s->real_device, PCI_ROM_ADDRESS),
> +                       dev_value, reg->emu_mask);
> +    return 0;
> +}
> +
> +/* Header Type0 reg static infomation table */
> +static XenPTRegInfo pt_emu_reg_header0_tbl[] = {
> +    /* Vendor ID reg */
> +    {
> +        .offset     = PCI_VENDOR_ID,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xFFFF,
> +        .emu_mask   = 0xFFFF,
> +        .init       = pt_vendor_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = NULL,
> +    },
> +    /* Device ID reg */
> +    {
> +        .offset     = PCI_DEVICE_ID,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xFFFF,
> +        .emu_mask   = 0xFFFF,
> +        .init       = pt_device_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = NULL,
> +    },
> +    /* Command reg */
> +    {
> +        .offset     = PCI_COMMAND,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xF880,
> +        .emu_mask   = 0x0740,
> +        .init       = pt_common_reg_init,
> +        .u.w.read   = pt_cmd_reg_read,
> +        .u.w.write  = pt_cmd_reg_write,
> +        .u.w.restore  = pt_cmd_reg_restore,
> +    },
> +    /* Capabilities Pointer reg */
> +    {
> +        .offset     = PCI_CAPABILITY_LIST,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_ptr_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* Status reg */
> +    /* use emulated Cap Ptr value to initialize,
> +     * so need to be declared after Cap Ptr reg
> +     */
> +    {
> +        .offset     = PCI_STATUS,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0x06FF,
> +        .emu_mask   = 0x0010,
> +        .init       = pt_status_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = NULL,
> +    },
> +    /* Cache Line Size reg */
> +    {
> +        .offset     = PCI_CACHE_LINE_SIZE,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0x00,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_common_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = pt_byte_reg_restore,
> +    },
> +    /* Latency Timer reg */
> +    {
> +        .offset     = PCI_LATENCY_TIMER,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0x00,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_common_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = pt_byte_reg_restore,
> +    },
> +    /* Header Type reg */
> +    {
> +        .offset     = PCI_HEADER_TYPE,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0x00,
> +        .init       = pt_header_type_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* Interrupt Line reg */
> +    {
> +        .offset     = PCI_INTERRUPT_LINE,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0x00,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_common_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* Interrupt Pin reg */
> +    {
> +        .offset     = PCI_INTERRUPT_PIN,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_irqpin_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* BAR 0 reg */
> +    /* mask of BAR need to be decided later, depends on IO/MEM type */
> +    {
> +        .offset     = PCI_BASE_ADDRESS_0,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_bar_reg_read,
> +        .u.dw.write = pt_bar_reg_write,
> +        .u.dw.restore = pt_bar_reg_restore,
> +    },
> +    /* BAR 1 reg */
> +    {
> +        .offset     = PCI_BASE_ADDRESS_1,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_bar_reg_read,
> +        .u.dw.write = pt_bar_reg_write,
> +        .u.dw.restore = pt_bar_reg_restore,
> +    },
> +    /* BAR 2 reg */
> +    {
> +        .offset     = PCI_BASE_ADDRESS_2,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_bar_reg_read,
> +        .u.dw.write = pt_bar_reg_write,
> +        .u.dw.restore = pt_bar_reg_restore,
> +    },
> +    /* BAR 3 reg */
> +    {
> +        .offset     = PCI_BASE_ADDRESS_3,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_bar_reg_read,
> +        .u.dw.write = pt_bar_reg_write,
> +        .u.dw.restore = pt_bar_reg_restore,
> +    },
> +    /* BAR 4 reg */
> +    {
> +        .offset     = PCI_BASE_ADDRESS_4,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_bar_reg_read,
> +        .u.dw.write = pt_bar_reg_write,
> +        .u.dw.restore = pt_bar_reg_restore,
> +    },
> +    /* BAR 5 reg */
> +    {
> +        .offset     = PCI_BASE_ADDRESS_5,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_bar_reg_read,
> +        .u.dw.write = pt_bar_reg_write,
> +        .u.dw.restore = pt_bar_reg_restore,
> +    },
> +    /* Expansion ROM BAR reg */
> +    {
> +        .offset     = PCI_ROM_ADDRESS,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .ro_mask    = 0x000007FE,
> +        .emu_mask   = 0xFFFFF800,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_long_reg_read,
> +        .u.dw.write = pt_exp_rom_bar_reg_write,
> +        .u.dw.restore = pt_exp_rom_bar_reg_restore,
> +    },
> +    {
> +        .size = 0,
> +    },
> +};
> +
> +
> +/*********************************
> + * Vital Product Data Capability
> + */
> +
> +/* Vital Product Data Capability Structure reg static infomation table */
> +static XenPTRegInfo pt_emu_reg_vpd_tbl[] = {
> +    {
> +        .offset     = PCI_CAP_LIST_NEXT,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_ptr_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    {
> +        .size = 0,
> +    },
> +};
> +
> +
> +/**************************************
> + * Vendor Specific Capability
> + */
> +
> +/* Vendor Specific Capability Structure reg static infomation table */
> +static XenPTRegInfo pt_emu_reg_vendor_tbl[] = {
> +    {
> +        .offset     = PCI_CAP_LIST_NEXT,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_ptr_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    {
> +        .size = 0,
> +    },
> +};
> +
> +
> +/*****************************
> + * PCI Express Capability
> + */
> +
> +/* initialize Link Control register */
> +static uint32_t pt_linkctrl_reg_init(XenPCIPassthroughState *s,
> +                                     XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    uint8_t cap_ver = 0;
> +    uint8_t dev_type = 0;
> +
> +    /* TODO maybe better to use fonction from hw/pcie.c */
> +    cap_ver = pci_get_byte(s->dev.config + real_offset - reg->offset
> +                           + PCI_EXP_FLAGS)
> +        & PCI_EXP_FLAGS_VERS;
> +    dev_type = (pci_get_byte(s->dev.config + real_offset - reg->offset
> +                             + PCI_EXP_FLAGS)
> +                & PCI_EXP_FLAGS_TYPE) >> 4;
> +
> +    /* no need to initialize in case of Root Complex Integrated Endpoint
> +     * with cap_ver 1.x
> +     */
> +    if ((dev_type == PCI_EXP_TYPE_RC_END) && (cap_ver == 1)) {
> +        return PT_INVALID_REG;
> +    }
> +
> +    return reg->init_val;
> +}
> +/* initialize Device Control 2 register */
> +static uint32_t pt_devctrl2_reg_init(XenPCIPassthroughState *s,
> +                                     XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    uint8_t cap_ver = 0;
> +
> +    cap_ver = pci_get_byte(s->dev.config + real_offset - reg->offset
> +                           + PCI_EXP_FLAGS)
> +        & PCI_EXP_FLAGS_VERS;
> +
> +    /* no need to initialize in case of cap_ver 1.x */
> +    if (cap_ver == 1) {
> +        return PT_INVALID_REG;
> +    }
> +
> +    return reg->init_val;
> +}
> +/* initialize Link Control 2 register */
> +static uint32_t pt_linkctrl2_reg_init(XenPCIPassthroughState *s,
> +                                      XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    int reg_field = 0;
> +    uint8_t cap_ver = 0;
> +
> +    cap_ver = pci_get_byte(s->dev.config + real_offset - reg->offset
> +                           + PCI_EXP_FLAGS)
> +        & PCI_EXP_FLAGS_VERS;
> +
> +    /* no need to initialize in case of cap_ver 1.x */
> +    if (cap_ver == 1) {
> +        return PT_INVALID_REG;
> +    }
> +
> +    /* set Supported Link Speed */
> +    reg_field |= PCI_EXP_LNKCAP_SLS &
> +        pci_get_byte(s->dev.config + real_offset - reg->offset
> +                     + PCI_EXP_LNKCAP);
> +
> +    return reg_field;
> +}
> +
> +/* PCI Express Capability Structure reg static infomation table */
> +static XenPTRegInfo pt_emu_reg_pcie_tbl[] = {
> +    /* Next Pointer reg */
> +    {
> +        .offset     = PCI_CAP_LIST_NEXT,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_ptr_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* Device Capabilities reg */
> +    {
> +        .offset     = PCI_EXP_DEVCAP,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .ro_mask    = 0x1FFCFFFF,
> +        .emu_mask   = 0x10000000,
> +        .init       = pt_common_reg_init,
> +        .u.dw.read  = pt_long_reg_read,
> +        .u.dw.write = pt_long_reg_write,
> +        .u.dw.restore = NULL,
> +    },
> +    /* Device Control reg */
> +    {
> +        .offset     = PCI_EXP_DEVCTL,
> +        .size       = 2,
> +        .init_val   = 0x2810,
> +        .ro_mask    = 0x8400,
> +        .emu_mask   = 0xFFFF,
> +        .init       = pt_common_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = pt_word_reg_restore,
> +    },
> +    /* Link Control reg */
> +    {
> +        .offset     = PCI_EXP_LNKCTL,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xFC34,
> +        .emu_mask   = 0xFFFF,
> +        .init       = pt_linkctrl_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = pt_word_reg_restore,
> +    },
> +    /* Device Control 2 reg */
> +    {
> +        .offset     = 0x28,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xFFE0,
> +        .emu_mask   = 0xFFFF,
> +        .init       = pt_devctrl2_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = pt_word_reg_restore,
> +    },
> +    /* Link Control 2 reg */
> +    {
> +        .offset     = 0x30,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xE040,
> +        .emu_mask   = 0xFFFF,
> +        .init       = pt_linkctrl2_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = pt_word_reg_restore,
> +    },
> +    {
> +        .size = 0,
> +    },
> +};
> +
> +
> +/*********************************
> + * Power Management Capability
> + */
> +
> +/* initialize Power Management Capabilities register */
> +static uint32_t pt_pmc_reg_init(XenPCIPassthroughState *s,
> +                                XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    PCIDevice *d = &s->dev;
> +
> +    if (!s->power_mgmt) {
> +        return reg->init_val;
> +    }
> +
> +    /* set Power Management Capabilities register */
> +    s->pm_state->pmc_field = pci_get_word(d->config + real_offset);
> +
> +    return reg->init_val;
> +}
> +/* initialize PCI Power Management Control/Status register */
> +static uint32_t pt_pmcsr_reg_init(XenPCIPassthroughState *s,
> +                                  XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    PCIDevice *d = &s->dev;
> +    uint16_t cap_ver  = 0;
> +
> +    if (!s->power_mgmt) {
> +        return reg->init_val;
> +    }
> +
> +    /* check PCI Power Management support version */
> +    cap_ver = s->pm_state->pmc_field & PCI_PM_CAP_VER_MASK;
> +
> +    if (cap_ver > 2) {
> +        /* set No Soft Reset */
> +        s->pm_state->no_soft_reset =
> +            pci_get_byte(d->config + real_offset) & PCI_PM_CTRL_NO_SOFT_RESET;
> +    }
> +
> +    /* wake up real physical device */
> +    switch (host_pci_get_word(s->real_device, real_offset)
> +            & PCI_PM_CTRL_STATE_MASK) {
> +    case 0:
> +        break;
> +    case 1:
> +        PT_LOG("Power state transition D1 -> D0active\n");
> +        host_pci_set_word(s->real_device, real_offset, 0);
> +        break;
> +    case 2:
> +        PT_LOG("Power state transition D2 -> D0active\n");
> +        host_pci_set_word(s->real_device, real_offset, 0);
> +        usleep(200);
> +        break;
> +    case 3:
> +        PT_LOG("Power state transition D3hot -> D0active\n");
> +        host_pci_set_word(s->real_device, real_offset, 0);
> +        usleep(10 * 1000);
> +        pt_init_pci_config(s);
> +        break;
> +    }
> +
> +    return reg->init_val;
> +}
> +/* read Power Management Control/Status register */
> +static int pt_pmcsr_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                             uint16_t *value, uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint16_t valid_emu_mask = reg->emu_mask;
> +
> +    if (!s->power_mgmt) {
> +        valid_emu_mask |= PCI_PM_CTRL_STATE_MASK | PCI_PM_CTRL_NO_SOFT_RESET;
> +    }
> +
> +    valid_emu_mask = valid_emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);
> +
> +    return 0;
> +}
> +/* reset Interrupt and I/O resource  */
> +static void pt_reset_interrupt_and_io_mapping(XenPCIPassthroughState *s)
> +{
> +    PCIDevice *d = &s->dev;
> +    PCIIORegion *r;
> +    int i = 0;
> +    uint8_t e_device = 0;
> +    uint8_t e_intx = 0;
> +
> +    /* unbind INTx */
> +    e_device = PCI_SLOT(s->dev.devfn);
> +    e_intx = pci_intx(s);
> +
> +    if (s->machine_irq) {
> +        if (xc_domain_unbind_pt_irq(xen_xc, xen_domid, s->machine_irq,
> +                                    PT_IRQ_TYPE_PCI, 0, e_device, e_intx, 0)) {
> +            PT_LOG("Error: Unbinding of interrupt failed!\n");
> +        }
> +    }
> +
> +    /* clear all virtual region address */
> +    for (i = 0; i < PCI_NUM_REGIONS; i++) {
> +        r = &d->io_regions[i];
> +        r->addr = -1;
> +    }
> +
> +    /* unmapping BAR */
> +    pt_bar_mapping(s, 0, 0);
> +}
> +/* check power state transition */
> +static int check_power_state(XenPCIPassthroughState *s)
> +{
> +    XenPTPM *pm_state = s->pm_state;
> +    PCIDevice *d = &s->dev;
> +    uint16_t read_val = 0;
> +    uint16_t cur_state = 0;
> +
> +    /* get current power state */
> +    read_val = host_pci_get_word(s->real_device,
> +                                 pm_state->pm_base + PCI_PM_CTRL);
> +    cur_state = read_val & PCI_PM_CTRL_STATE_MASK;
> +
> +    if (pm_state->req_state != cur_state) {
> +        PT_LOG("Error: Failed to change power state. "
> +               "[%02x:%02x.%x][requested state:%d][current state:%d]\n",
> +               pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> +               pm_state->req_state, cur_state);
> +        return -1;
> +    }
> +    return 0;
> +}
> +/* write Power Management Control/Status register */
> +static void pt_from_d3hot_to_d0_with_reset(void *opaque)
> +{
> +    XenPCIPassthroughState *s = opaque;
> +    XenPTPM *pm_state = s->pm_state;
> +    int ret = 0;
> +
> +    /* check power state */
> +    ret = check_power_state(s);
> +
> +    if (ret < 0) {
> +        goto out;
> +    }
> +
> +    pt_init_pci_config(s);
> +
> +out:
> +    /* power state transition flags off */
> +    pm_state->flags &= ~PT_FLAG_TRANSITING;
> +
> +    qemu_free_timer(pm_state->pm_timer);
> +    pm_state->pm_timer = NULL;
> +}
> +static void pt_default_power_transition(void *opaque)
> +{
> +    XenPCIPassthroughState *ptdev = opaque;
> +    XenPTPM *pm_state = ptdev->pm_state;
> +
> +    /* check power state */
> +    check_power_state(ptdev);
> +
> +    /* power state transition flags off */
> +    pm_state->flags &= ~PT_FLAG_TRANSITING;
> +
> +    qemu_free_timer(pm_state->pm_timer);
> +    pm_state->pm_timer = NULL;
> +}
> +static int pt_pmcsr_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                              uint16_t *value, uint16_t dev_value,
> +                              uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    PCIDevice *d = &s->dev;
> +    uint16_t emu_mask = reg->emu_mask;
> +    uint16_t writable_mask = 0;
> +    uint16_t throughable_mask = 0;
> +    XenPTPM *pm_state = s->pm_state;
> +
> +    if (!s->power_mgmt) {
> +        emu_mask |= PCI_PM_CTRL_STATE_MASK | PCI_PM_CTRL_NO_SOFT_RESET;
> +    }
> +
> +    /* modify emulate register */
> +    writable_mask = emu_mask & ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    if (!s->power_mgmt) {
> +        return 0;
> +    }
> +
> +    /* set I/O device power state */
> +    pm_state->cur_state = dev_value & PCI_PM_CTRL_STATE_MASK;
> +
> +    /* set Guest requested PowerState */
> +    pm_state->req_state = *value & PCI_PM_CTRL_STATE_MASK;
> +
> +    /* check power state transition or not */
> +    if (pm_state->cur_state == pm_state->req_state) {
> +        /* not power state transition */
> +        return 0;
> +    }
> +
> +    /* check enable power state transition */
> +    if ((pm_state->req_state != 0) &&
> +        (pm_state->cur_state > pm_state->req_state)) {
> +        PT_LOG("Error: Invalid power transition. "
> +               "[%02x:%02x.%x][requested state:%d][current state:%d]\n",
> +               pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> +               pm_state->req_state, pm_state->cur_state);
> +
> +        return 0;
> +    }
> +
> +    /* check if this device supports the requested power state */
> +    if (((pm_state->req_state == 1) && !(pm_state->pmc_field & PCI_PM_CAP_D1))
> +        || ((pm_state->req_state == 2) &&
> +            !(pm_state->pmc_field & PCI_PM_CAP_D2))) {
> +        PT_LOG("Error: Invalid power transition. "
> +               "[%02x:%02x.%x][requested state:%d][current state:%d]\n",
> +               pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> +               pm_state->req_state, pm_state->cur_state);
> +
> +        return 0;
> +    }
> +
> +    /* in case of transition related to D3hot, it's necessary to wait 10 ms.
> +     * But because writing to register will be performed later on actually,
> +     * don't start QEMUTimer right now, just alloc and init QEMUTimer here.
> +     */
> +    if ((pm_state->cur_state == 3) || (pm_state->req_state == 3)) {
> +        if (pm_state->req_state == 0) {
> +            /* alloc and init QEMUTimer */
> +            if (!pm_state->no_soft_reset) {
> +                pm_state->pm_timer = qemu_new_timer_ms(rt_clock,
> +                    pt_from_d3hot_to_d0_with_reset, s);
> +
> +                /* reset Interrupt and I/O resource mapping */
> +                pt_reset_interrupt_and_io_mapping(s);
> +            } else {
> +                pm_state->pm_timer = qemu_new_timer_ms(rt_clock,
> +                                        pt_default_power_transition, s);
> +            }
> +        } else {
> +            /* alloc and init QEMUTimer */
> +            pm_state->pm_timer = qemu_new_timer_ms(rt_clock,
> +                pt_default_power_transition, s);
> +        }
> +
> +        /* set power state transition delay */
> +        pm_state->pm_delay = 10;
> +
> +        /* power state transition flags on */
> +        pm_state->flags |= PT_FLAG_TRANSITING;
> +    }
> +    /* in case of transition related to D0, D1 and D2,
> +     * no need to use QEMUTimer.
> +     * So, we perfom writing to register here and then read it back.
> +     */
> +    else {
> +        /* write power state to I/O device register */
> +        host_pci_set_word(s->real_device, pm_state->pm_base + PCI_PM_CTRL,
> +                          *value);
> +
> +        /* in case of transition related to D2,
> +         * it's necessary to wait 200 usec.
> +         * But because QEMUTimer do not support microsec unit right now,
> +         * so we do wait ourself here.
> +         */
> +        if ((pm_state->cur_state == 2) || (pm_state->req_state == 2)) {
> +            usleep(200);
> +        }
> +
> +        /* check power state */
> +        check_power_state(s);
> +
> +        /* recreate value for writing to I/O device register */
> +        *value = host_pci_get_word(s->real_device,
> +                                   pm_state->pm_base + PCI_PM_CTRL);
> +    }
> +
> +    return 0;
> +}
> +
> +/* restore Power Management Control/Status register */
> +static int pt_pmcsr_reg_restore(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                                uint32_t real_offset, uint16_t dev_value,
> +                                uint16_t *value)
> +{
> +    /* create value for restoring to I/O device register
> +     * No need to restore, just clear PME Enable and PME Status bit
> +     * Note: register type of PME Status bit is RW1C, so clear by writing 1b
> +     */
> +    *value = (dev_value & ~PCI_PM_CTRL_PME_ENABLE) | PCI_PM_CTRL_PME_STATUS;
> +
> +    return 0;
> +}
> +
> +
> +/* Power Management Capability reg static infomation table */
> +static XenPTRegInfo pt_emu_reg_pm_tbl[] = {
> +    /* Next Pointer reg */
> +    {
> +        .offset     = PCI_CAP_LIST_NEXT,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_ptr_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* Power Management Capabilities reg */
> +    {
> +        .offset     = PCI_CAP_FLAGS,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xFFFF,
> +        .emu_mask   = 0xF9C8,
> +        .init       = pt_pmc_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = NULL,
> +    },
> +    /* PCI Power Management Control/Status reg */
> +    {
> +        .offset     = PCI_PM_CTRL,
> +        .size       = 2,
> +        .init_val   = 0x0008,
> +        .ro_mask    = 0xE1FC,
> +        .emu_mask   = 0x8100,
> +        .init       = pt_pmcsr_reg_init,
> +        .u.w.read   = pt_pmcsr_reg_read,
> +        .u.w.write  = pt_pmcsr_reg_write,
> +        .u.w.restore  = pt_pmcsr_reg_restore,
> +    },
> +    {
> +        .size = 0,
> +    },
> +};
> +
> +
> +/****************************
> + * Capabilities
> + */
> +
> +/* AER register operations */
> +
> +static void aer_save_one_register(XenPCIPassthroughState *s, int offset)
> +{
> +    PCIDevice *d = &s->dev;
> +    uint32_t aer_base = s->pm_state->aer_base;
> +    uint32_t val = 0;
> +
> +    val = host_pci_get_long(s->real_device, aer_base + offset);
> +    pci_set_long(d->config + aer_base + offset, val);
> +}
> +static void pt_aer_reg_save(XenPCIPassthroughState *s)
> +{
> +    /* after reset, following register values should be restored.
> +     * So, save them.
> +     */
> +    aer_save_one_register(s, PCI_ERR_UNCOR_MASK);
> +    aer_save_one_register(s, PCI_ERR_UNCOR_SEVER);
> +    aer_save_one_register(s, PCI_ERR_COR_MASK);
> +    aer_save_one_register(s, PCI_ERR_CAP);
> +}
> +static void aer_restore_one_register(XenPCIPassthroughState *s, int offset)
> +{
> +    PCIDevice *d = &s->dev;
> +    uint32_t aer_base = s->pm_state->aer_base;
> +    uint32_t config = 0;
> +
> +    config = pci_get_long(d->config + aer_base + offset);
> +    host_pci_set_long(s->real_device, aer_base + offset, config);
> +}
> +static void pt_aer_reg_restore(XenPCIPassthroughState *s)
> +{
> +    /* the following registers should be reconfigured to correct values
> +     * after reset. restore them.
> +     * other registers should not be reconfigured after reset
> +     * if there is no reason
> +     */
> +    aer_restore_one_register(s, PCI_ERR_UNCOR_MASK);
> +    aer_restore_one_register(s, PCI_ERR_UNCOR_SEVER);
> +    aer_restore_one_register(s, PCI_ERR_COR_MASK);
> +    aer_restore_one_register(s, PCI_ERR_CAP);
> +}
> +
> +/* capability structure register group size functions */
> +
> +static uint8_t pt_reg_grp_size_init(XenPCIPassthroughState *s,
> +                                    const XenPTRegGroupInfo *grp_reg,
> +                                    uint32_t base_offset)
> +{
> +    return grp_reg->grp_size;
> +}
> +/* get Power Management Capability Structure register group size */
> +static uint8_t pt_pm_size_init(XenPCIPassthroughState *s,
> +                               const XenPTRegGroupInfo *grp_reg,
> +                               uint32_t base_offset)
> +{
> +    if (!s->power_mgmt) {
> +        return grp_reg->grp_size;
> +    }
> +
> +    s->pm_state = g_malloc0(sizeof (XenPTPM));
> +
> +    /* set Power Management Capability base offset */
> +    s->pm_state->pm_base = base_offset;
> +
> +    /* find AER register and set AER Capability base offset */
> +    s->pm_state->aer_base = host_pci_find_ext_cap_offset(s->real_device,
> +                                                         PCI_EXT_CAP_ID_ERR);
> +
> +    /* save AER register */
> +    if (s->pm_state->aer_base) {
> +        pt_aer_reg_save(s);
> +    }
> +
> +    return grp_reg->grp_size;
> +}
> +/* get Vendor Specific Capability Structure register group size */
> +static uint8_t pt_vendor_size_init(XenPCIPassthroughState *s,
> +                                   const XenPTRegGroupInfo *grp_reg,
> +                                   uint32_t base_offset)
> +{
> +    return pci_get_byte(s->dev.config + base_offset + 0x02);
> +}
> +/* get PCI Express Capability Structure register group size */
> +static uint8_t pt_pcie_size_init(XenPCIPassthroughState *s,
> +                                 const XenPTRegGroupInfo *grp_reg,
> +                                 uint32_t base_offset)
> +{
> +    PCIDevice *d = &s->dev;
> +    uint16_t exp_flag = 0;
> +    uint16_t type = 0;
> +    uint16_t version = 0;
> +    uint8_t pcie_size = 0;
> +
> +    exp_flag = pci_get_word(d->config + base_offset + PCI_EXP_FLAGS);
> +    type = (exp_flag & PCI_EXP_FLAGS_TYPE) >> 4;
> +    version = exp_flag & PCI_EXP_FLAGS_VERS;
> +
> +    /* calculate size depend on capability version and device/port type */
> +    /* in case of PCI Express Base Specification Rev 1.x */
> +    if (version == 1) {
> +        /* The PCI Express Capabilities, Device Capabilities, and Device
> +         * Status/Control registers are required for all PCI Express devices.
> +         * The Link Capabilities and Link Status/Control are required for all
> +         * Endpoints that are not Root Complex Integrated Endpoints. Endpoints
> +         * are not required to implement registers other than those listed
> +         * above and terminate the capability structure.
> +         */
> +        switch (type) {
> +        case PCI_EXP_TYPE_ENDPOINT:
> +        case PCI_EXP_TYPE_LEG_END:
> +            pcie_size = 0x14;
> +            break;
> +        case PCI_EXP_TYPE_RC_END:
> +            /* has no link */
> +            pcie_size = 0x0C;
> +            break;
> +        /* only EndPoint passthrough is supported */
> +        case PCI_EXP_TYPE_ROOT_PORT:
> +        case PCI_EXP_TYPE_UPSTREAM:
> +        case PCI_EXP_TYPE_DOWNSTREAM:
> +        case PCI_EXP_TYPE_PCI_BRIDGE:
> +        case PCI_EXP_TYPE_PCIE_BRIDGE:
> +        case PCI_EXP_TYPE_RC_EC:
> +        default:
> +            hw_error("Internal error: Unsupported device/port type[%d]. "
> +                     "I/O emulator exit.\n", type);
> +        }
> +    }
> +    /* in case of PCI Express Base Specification Rev 2.0 */
> +    else if (version == 2) {
> +        switch (type) {
> +        case PCI_EXP_TYPE_ENDPOINT:
> +        case PCI_EXP_TYPE_LEG_END:
> +        case PCI_EXP_TYPE_RC_END:
> +            /* For Functions that do not implement the registers,
> +             * these spaces must be hardwired to 0b.
> +             */
> +            pcie_size = 0x3C;
> +            break;
> +        /* only EndPoint passthrough is supported */
> +        case PCI_EXP_TYPE_ROOT_PORT:
> +        case PCI_EXP_TYPE_UPSTREAM:
> +        case PCI_EXP_TYPE_DOWNSTREAM:
> +        case PCI_EXP_TYPE_PCI_BRIDGE:
> +        case PCI_EXP_TYPE_PCIE_BRIDGE:
> +        case PCI_EXP_TYPE_RC_EC:
> +        default:
> +            hw_error("Internal error: Unsupported device/port type[%d]. "
> +                     "I/O emulator exit.\n", type);
> +        }
> +    } else {
> +        hw_error("Internal error: Unsupported capability version[%d]. "
> +                 "I/O emulator exit.\n", version);
> +    }
> +
> +    return pcie_size;
> +}
> +
> +static const XenPTRegGroupInfo pt_emu_reg_grp_tbl[] = {
> +    /* Header Type0 reg group */
> +    {
> +        .grp_id      = 0xFF,
> +        .grp_type    = GRP_TYPE_EMU,
> +        .grp_size    = 0x40,
> +        .size_init   = pt_reg_grp_size_init,
> +        .emu_reg_tbl = pt_emu_reg_header0_tbl,
> +    },
> +    /* PCI PowerManagement Capability reg group */
> +    {
> +        .grp_id      = PCI_CAP_ID_PM,
> +        .grp_type    = GRP_TYPE_EMU,
> +        .grp_size    = PCI_PM_SIZEOF,
> +        .size_init   = pt_pm_size_init,
> +        .emu_reg_tbl = pt_emu_reg_pm_tbl,
> +    },
> +    /* AGP Capability Structure reg group */
> +    {
> +        .grp_id     = PCI_CAP_ID_AGP,
> +        .grp_type   = GRP_TYPE_HARDWIRED,
> +        .grp_size   = 0x30,
> +        .size_init  = pt_reg_grp_size_init,
> +    },
> +    /* Vital Product Data Capability Structure reg group */
> +    {
> +        .grp_id      = PCI_CAP_ID_VPD,
> +        .grp_type    = GRP_TYPE_EMU,
> +        .grp_size    = 0x08,
> +        .size_init   = pt_reg_grp_size_init,
> +        .emu_reg_tbl = pt_emu_reg_vpd_tbl,
> +    },
> +    /* Slot Identification reg group */
> +    {
> +        .grp_id     = PCI_CAP_ID_SLOTID,
> +        .grp_type   = GRP_TYPE_HARDWIRED,
> +        .grp_size   = 0x04,
> +        .size_init  = pt_reg_grp_size_init,
> +    },
> +    /* PCI-X Capabilities List Item reg group */
> +    {
> +        .grp_id     = PCI_CAP_ID_PCIX,
> +        .grp_type   = GRP_TYPE_HARDWIRED,
> +        .grp_size   = 0x18,
> +        .size_init  = pt_reg_grp_size_init,
> +    },
> +    /* Vendor Specific Capability Structure reg group */
> +    {
> +        .grp_id      = PCI_CAP_ID_VNDR,
> +        .grp_type    = GRP_TYPE_EMU,
> +        .grp_size    = 0xFF,
> +        .size_init   = pt_vendor_size_init,
> +        .emu_reg_tbl = pt_emu_reg_vendor_tbl,
> +    },
> +    /* SHPC Capability List Item reg group */
> +    {
> +        .grp_id     = PCI_CAP_ID_SHPC,
> +        .grp_type   = GRP_TYPE_HARDWIRED,
> +        .grp_size   = 0x08,
> +        .size_init  = pt_reg_grp_size_init,
> +    },
> +    /* Subsystem ID and Subsystem Vendor ID Capability List Item reg group */
> +    {
> +        .grp_id     = PCI_CAP_ID_SSVID,
> +        .grp_type   = GRP_TYPE_HARDWIRED,
> +        .grp_size   = 0x08,
> +        .size_init  = pt_reg_grp_size_init,
> +    },
> +    /* AGP 8x Capability Structure reg group */
> +    {
> +        .grp_id     = PCI_CAP_ID_AGP3,
> +        .grp_type   = GRP_TYPE_HARDWIRED,
> +        .grp_size   = 0x30,
> +        .size_init  = pt_reg_grp_size_init,
> +    },
> +    /* PCI Express Capability Structure reg group */
> +    {
> +        .grp_id      = PCI_CAP_ID_EXP,
> +        .grp_type    = GRP_TYPE_EMU,
> +        .grp_size    = 0xFF,
> +        .size_init   = pt_pcie_size_init,
> +        .emu_reg_tbl = pt_emu_reg_pcie_tbl,
> +    },
> +    {
> +        .grp_size = 0,
> +    },
> +};
> +
> +/* initialize Capabilities Pointer or Next Pointer register */
> +static uint32_t pt_ptr_reg_init(XenPCIPassthroughState *s,
> +                                XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    /* uint32_t reg_field = (uint32_t)s->dev.config[real_offset]; */
> +    uint32_t reg_field = pci_get_byte(s->dev.config + real_offset);
> +    int i;
> +
> +    /* find capability offset */
> +    while (reg_field) {
> +        for (i = 0; pt_emu_reg_grp_tbl[i].grp_size != 0; i++) {
> +            if (pt_hide_dev_cap(s->real_device,
> +                                pt_emu_reg_grp_tbl[i].grp_id)) {
> +                continue;
> +            }
> +            if (pt_emu_reg_grp_tbl[i].grp_id == s->dev.config[reg_field]) {
> +                if (pt_emu_reg_grp_tbl[i].grp_type == GRP_TYPE_EMU) {
> +                    goto out;
> +                }
> +                /* ignore the 0 hardwired capability, find next one */
> +                break;
> +            }
> +        }
> +        /* next capability */
> +        /* reg_field = (uint32_t)s->dev.config[reg_field + 1]; */
> +        reg_field = pci_get_byte(s->dev.config + reg_field + 1);
> +    }
> +
> +out:
> +    return reg_field;
> +}
> +
> +
> +/*************
> + * Main
> + */
> +
> +/* restore a part of I/O device register */
> +static void pt_config_restore(XenPCIPassthroughState *s)
> +{
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    XenPTRegInfo *reg = NULL;
> +    uint32_t real_offset = 0;
> +    uint32_t read_val = 0;
> +    uint32_t val = 0;
> +    int ret = 0;
> +
> +    /* find emulate register group entry */
> +    QLIST_FOREACH(reg_grp_entry, &s->reg_grp_tbl, entries) {
> +        /* find emulate register entry */
> +        QLIST_FOREACH(reg_entry, &reg_grp_entry->reg_tbl_list, entries) {
> +            reg = reg_entry->reg;
> +
> +            /* check whether restoring is needed */
> +            if (!reg->u.b.restore) {
> +                continue;
> +            }
> +
> +            real_offset = reg_grp_entry->base_offset + reg->offset;
> +
> +            /* read I/O device register value */
> +            ret = host_pci_get_block(s->real_device, real_offset,
> +                                     (uint8_t *)&read_val, reg->size);
> +
> +            if (!ret) {
> +                PT_LOG("Error: pci_read_block failed. "
> +                       "return value[%d].\n", ret);
> +                memset(&read_val, 0xff, reg->size);
> +            }
> +
> +            val = 0;
> +
> +            /* restore based on register size */
> +            switch (reg->size) {
> +            case 1:
> +                /* byte register */
> +                ret = reg->u.b.restore(s, reg_entry, real_offset,
> +                                       (uint8_t)read_val, (uint8_t *)&val);
> +                break;
> +            case 2:
> +                /* word register */
> +                ret = reg->u.w.restore(s, reg_entry, real_offset,
> +                                       (uint16_t)read_val, (uint16_t *)&val);
> +                break;
> +            case 4:
> +                /* double word register */
> +                ret = reg->u.dw.restore(s, reg_entry, real_offset,
> +                                        (uint32_t)read_val, (uint32_t *)&val);
> +                break;
> +            }
> +
> +            /* restoring error */
> +            if (ret < 0) {
> +                hw_error("Internal error: Invalid restoring "
> +                         "return value[%d]. I/O emulator exit.\n", ret);
> +            }
> +
> +            PT_LOG_CONFIG("[%02x:%02x.%x]: address=%04x val=0x%08x len=%d\n",
> +                          pci_bus_num(s->dev.bus), PCI_SLOT(s->dev.devfn),
> +                          PCI_FUNC(s->dev.devfn),
> +                          real_offset, val, reg->size);
> +
> +            ret = host_pci_set_block(s->real_device, real_offset,
> +                                     (uint8_t *)&val, reg->size);
> +
> +            if (!ret) {
> +                PT_LOG("Error: pci_write_block failed. "
> +                       "return value[%d].\n", ret);
> +            }
> +        }
> +    }
> +
> +    /* if AER supported, restore it */
> +    if (s->pm_state->aer_base) {
> +        pt_aer_reg_restore(s);
> +    }
> +}
> +/* reinitialize all emulate registers */
> +static void pt_config_reinit(XenPCIPassthroughState *s)
> +{
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    XenPTRegInfo *reg = NULL;
> +
> +    /* find emulate register group entry */
> +    QLIST_FOREACH(reg_grp_entry, &s->reg_grp_tbl, entries) {
> +        /* find emulate register entry */
> +        QLIST_FOREACH(reg_entry, &reg_grp_entry->reg_tbl_list, entries) {
> +            reg = reg_entry->reg;
> +            if (reg->init) {
> +                /* initialize emulate register */
> +                reg_entry->data =
> +                    reg->init(s, reg_entry->reg,
> +                              reg_grp_entry->base_offset + reg->offset);
> +            }
> +        }
> +    }
> +}
> +
> +static int pt_init_pci_config(XenPCIPassthroughState *s)
> +{
> +    PCIDevice *d = &s->dev;
> +    int ret = 0;
> +
> +    PT_LOG("Reinitialize PCI configuration registers due to power state"
> +           " transition with internal reset. [%02x:%02x.%x]\n",
> +           pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn));
> +
> +    /* restore a part of I/O device register */
> +    pt_config_restore(s);
> +
> +    /* reinitialize all emulate register */
> +    pt_config_reinit(s);
> +
> +    /* rebind machine_irq to device */
> +    if (s->machine_irq != 0) {
> +        uint8_t e_device = PCI_SLOT(s->dev.devfn);
> +        uint8_t e_intx = pci_intx(s);
> +
> +        ret = xc_domain_bind_pt_pci_irq(xen_xc, xen_domid, s->machine_irq, 0,
> +                                        e_device, e_intx);
> +        if (ret < 0) {
> +            PT_LOG("Error: Rebinding of interrupt failed! ret=%d\n", ret);
> +        }
> +    }
> +
> +    return ret;
> +}
> +
> +static uint8_t find_cap_offset(XenPCIPassthroughState *s, uint8_t cap)
> +{
> +    int id;
> +    int max_cap = 48;
> +    int pos = PCI_CAPABILITY_LIST;
> +    int status;
> +
> +    status = host_pci_get_byte(s->real_device, PCI_STATUS);
> +    if ((status & PCI_STATUS_CAP_LIST) == 0) {
> +        return 0;
> +    }
> +
> +    while (max_cap--) {
> +        pos = host_pci_get_byte(s->real_device, pos);
> +        if (pos < 0x40) {
> +            break;
> +        }
> +
> +        pos &= ~3;
> +        id = host_pci_get_byte(s->real_device, pos + PCI_CAP_LIST_ID);
> +
> +        if (id == 0xff) {
> +            break;
> +        }
> +        if (id == cap) {
> +            return pos;
> +        }
> +
> +        pos += PCI_CAP_LIST_NEXT;
> +    }
> +    return 0;
> +}
> +
> +static void pt_config_reg_init(XenPCIPassthroughState *s,
> +                               XenPTRegGroup *reg_grp, XenPTRegInfo *reg)
> +{
> +    XenPTReg *reg_entry;
> +    uint32_t data = 0;
> +
> +    reg_entry = g_malloc0(sizeof (XenPTReg));
> +
> +    reg_entry->reg = reg;
> +    reg_entry->data = 0;
> +
> +    if (reg->init) {
> +        /* initialize emulate register */
> +        data = reg->init(s, reg_entry->reg,
> +                         reg_grp->base_offset + reg->offset);
> +        if (data == PT_INVALID_REG) {
> +            /* free unused BAR register entry */
> +            free(reg_entry);
> +            return;
> +        }
> +        /* set register value */
> +        reg_entry->data = data;
> +    }
> +    /* list add register entry */
> +    QLIST_INSERT_HEAD(&reg_grp->reg_tbl_list, reg_entry, entries);
> +
> +    return;
> +}
> +
> +void pt_config_init(XenPCIPassthroughState *s)
> +{
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    uint32_t reg_grp_offset = 0;
> +    XenPTRegInfo *reg_tbl = NULL;
> +    int i, j;
> +
> +    QLIST_INIT(&s->reg_grp_tbl);
> +
> +    for (i = 0; pt_emu_reg_grp_tbl[i].grp_size != 0; i++) {
> +        if (pt_emu_reg_grp_tbl[i].grp_id != 0xFF) {
> +            if (pt_hide_dev_cap(s->real_device,
> +                                pt_emu_reg_grp_tbl[i].grp_id)) {
> +                continue;
> +            }
> +
> +            reg_grp_offset = find_cap_offset(s, pt_emu_reg_grp_tbl[i].grp_id);
> +
> +            if (!reg_grp_offset) {
> +                continue;
> +            }
> +        }
> +
> +        reg_grp_entry = g_malloc0(sizeof (XenPTRegGroup));
> +        QLIST_INIT(&reg_grp_entry->reg_tbl_list);
> +        QLIST_INSERT_HEAD(&s->reg_grp_tbl, reg_grp_entry, entries);
> +
> +        reg_grp_entry->base_offset = reg_grp_offset;
> +        reg_grp_entry->reg_grp = pt_emu_reg_grp_tbl + i;
> +        if (pt_emu_reg_grp_tbl[i].size_init) {
> +            /* get register group size */
> +            reg_grp_entry->size =
> +                pt_emu_reg_grp_tbl[i].size_init(s, reg_grp_entry->reg_grp,
> +                                                reg_grp_offset);
> +        }
> +
> +        if (pt_emu_reg_grp_tbl[i].grp_type == GRP_TYPE_EMU) {
> +            if (pt_emu_reg_grp_tbl[i].emu_reg_tbl) {
> +                reg_tbl = pt_emu_reg_grp_tbl[i].emu_reg_tbl;
> +                /* initialize capability register */
> +                for (j = 0; reg_tbl->size != 0; j++, reg_tbl++) {
> +                    /* initialize capability register */
> +                    pt_config_reg_init(s, reg_grp_entry, reg_tbl);
> +                }
> +            }
> +        }
> +        reg_grp_offset = 0;
> +    }
> +
> +    return;
> +}
> +
> +/* delete all emulate register */
> +void pt_config_delete(XenPCIPassthroughState *s)
> +{
> +    struct XenPTRegGroup *reg_group, *next_grp;
> +    struct XenPTReg *reg, *next_reg;
> +
> +    /* free Power Management info table */
> +    if (s->pm_state) {
> +        if (s->pm_state->pm_timer) {
> +            qemu_del_timer(s->pm_state->pm_timer);
> +            qemu_free_timer(s->pm_state->pm_timer);
> +            s->pm_state->pm_timer = NULL;
> +        }
> +
> +        g_free(s->pm_state);
> +    }
> +
> +    /* free all register group entry */
> +    QLIST_FOREACH_SAFE(reg_group, &s->reg_grp_tbl, entries, next_grp) {
> +        /* free all register entry */
> +        QLIST_FOREACH_SAFE(reg, &reg_group->reg_tbl_list, entries, next_reg) {
> +            QLIST_REMOVE(reg, entries);
> +            g_free(reg);
> +        }
> +
> +        QLIST_REMOVE(reg_group, entries);
> +        g_free(reg_group);
> +    }
> +}
> --
> Anthony PERARD
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 05:04:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 05:04:20 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNlLe-0003E7-Sx; Tue, 08 Nov 2011 05:04:19 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNlEh-0002F6-OP
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 04:57:08 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1320757024!3352636!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32149 invoked from network); 8 Nov 2011 12:57:04 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 12:57:04 -0000
X-IronPort-AV: E=Sophos;i="4.69,477,1315180800"; 
   d="scan'208";a="8816381"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 12:57:04 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 12:57:04 +0000
Date: Tue, 8 Nov 2011 12:57:36 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Anthony PERARD <anthony.perard@citrix.com>
In-Reply-To: <1319814456-8158-10-git-send-email-anthony.perard@citrix.com>
Message-ID: <alpine.DEB.2.00.1111081244300.3519@kaball-desktop>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-10-git-send-email-anthony.perard@citrix.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	"Michael S. Tsirkin" <mst@redhat.com>, QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH V3 09/10] Introduce apic-msidef.h
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, 28 Oct 2011, Anthony PERARD wrote:
> This patch move the msi definition from apic.c to apic-msidef.h. So it can be
> used also by other .c files.


you should CC Michael on this one


> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  hw/apic-msidef.h |   28 ++++++++++++++++++++++++++++
>  hw/apic.c        |   11 +----------
>  2 files changed, 29 insertions(+), 10 deletions(-)
>  create mode 100644 hw/apic-msidef.h
> 
> diff --git a/hw/apic-msidef.h b/hw/apic-msidef.h
> new file mode 100644
> index 0000000..3182f0b
> --- /dev/null
> +++ b/hw/apic-msidef.h
> @@ -0,0 +1,28 @@
> +#ifndef HW_APIC_MSIDEF_H
> +#define HW_APIC_MSIDEF_H
> +
> +/*
> + * Intel APIC constants: from include/asm/msidef.h
> + */
> +
> +/*
> + * Shifts for MSI data
> + */
> +
> +#define MSI_DATA_VECTOR_SHIFT           0
> +#define  MSI_DATA_VECTOR_MASK           0x000000ff
> +
> +#define MSI_DATA_DELIVERY_MODE_SHIFT    8
> +#define MSI_DATA_LEVEL_SHIFT            14
> +#define MSI_DATA_TRIGGER_SHIFT          15
> +
> +/*
> + * Shift/mask fields for msi address
> + */
> +
> +#define MSI_ADDR_DEST_MODE_SHIFT        2
> +
> +#define MSI_ADDR_DEST_ID_SHIFT          12
> +#define  MSI_ADDR_DEST_ID_MASK          0x00ffff0
> +
> +#endif /* HW_APIC_MSIDEF_H */
> diff --git a/hw/apic.c b/hw/apic.c
> index 8289eef..18c4a87 100644
> --- a/hw/apic.c
> +++ b/hw/apic.c
> @@ -24,6 +24,7 @@
>  #include "sysbus.h"
>  #include "trace.h"
>  #include "pc.h"
> +#include "apic-msidef.h"
>  
>  /* APIC Local Vector Table */
>  #define APIC_LVT_TIMER   0
> @@ -65,16 +66,6 @@
>  #define MAX_APICS 255
>  #define MAX_APIC_WORDS 8
>  
> -/* Intel APIC constants: from include/asm/msidef.h */
> -#define MSI_DATA_VECTOR_SHIFT		0
> -#define MSI_DATA_VECTOR_MASK		0x000000ff
> -#define MSI_DATA_DELIVERY_MODE_SHIFT	8
> -#define MSI_DATA_TRIGGER_SHIFT		15
> -#define MSI_DATA_LEVEL_SHIFT		14
> -#define MSI_ADDR_DEST_MODE_SHIFT	2
> -#define MSI_ADDR_DEST_ID_SHIFT		12
> -#define	MSI_ADDR_DEST_ID_MASK		0x00ffff0
> -
>  #define MSI_ADDR_SIZE                   0x100000
>  
>  typedef struct APICState APICState;
> -- 
> Anthony PERARD
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 05:08:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 05:08:25 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNlPc-0003df-Tj; Tue, 08 Nov 2011 05:08:25 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNlMG-0003IB-MC
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 05:05:00 -0800
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-13.tower-21.messagelabs.com!1320757493!1370372!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7610 invoked from network); 8 Nov 2011 13:04:53 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-13.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 13:04:53 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RNlMA-0001W3-T1; Tue, 08 Nov 2011 13:04:50 +0000
Date: Tue, 8 Nov 2011 13:04:50 +0000
From: Tim Deegan <tim@xen.org>
To: Keir Fraser <keir.xen@gmail.com>
Subject: Re: [Xen-devel] [PATCH] mm: Cleanup,
	use PAGE_ORDER_4K as page_order instead of "0".
Message-ID: <20111108130450.GA2292@ocelot.phlegethon.org>
References: <1320693909-914-1-git-send-email-jean.guyader@eu.citrix.com>
	<CADE0556.24543%keir.xen@gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CADE0556.24543%keir.xen@gmail.com>
User-Agent: Mutt/1.4.2.1i
Cc: xen-devel@lists.xensource.com, Jean Guyader <jean.guyader@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 21:59 +0000 on 07 Nov (1320703190), Keir Fraser wrote:
> Personally I prefer it as zero. Tim can have final decision though.
> 

Since we have given them names, I think it's best to use them
everywhere.  Applied, thanks.

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 05:16:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 05:16:46 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNlXi-00047E-3E; Tue, 08 Nov 2011 05:16:46 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNlVj-0003tc-TO
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 05:14:45 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320758055!51903824!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26292 invoked from network); 8 Nov 2011 13:14:15 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 13:14:15 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 08 Nov 2011 13:14:40 +0000
Message-Id: <4EB9394D020000780005F982@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 08 Nov 2011 13:14:37 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Yang Z Zhang" <yang.z.zhang@intel.com>
Subject: Re: [Xen-devel] [PATCH] pm : provide CC7/PC2 residency
References: <749B9D3DBF0F054390025D9EAFF47F2212D2A848E5@shsmsx501.ccr.corp.intel.com>
In-Reply-To: <749B9D3DBF0F054390025D9EAFF47F2212D2A848E5@shsmsx501.ccr.corp.intel.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Keir Fraser <keir@xen.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 25.10.11 at 15:34, "Zhang, Yang Z" <yang.z.zhang@intel.com> wrote:
> x86 pm : provide CC7/PC2 residency
>=20
> Sandy bridge introduces new MSR to get cc7/pc2 residency (core C-state=20=

> 7/package C-state 2). Print the cc7/pc2 residency when on sandy =
bridge=20
> platform.
>=20
> Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>
>=20
> diff -r 662dbf6ee71c tools/libxc/xc_pm.c
> --- a/tools/libxc/xc_pm.c       Mon Oct 24 18:01:07 2011 +0100
> +++ b/tools/libxc/xc_pm.c       Fri Oct 28 21:33:07 2011 +0800
> @@ -155,11 +155,13 @@
>      cxpt->nr =3D sysctl.u.get_pmstat.u.getcx.nr;
>      cxpt->last =3D sysctl.u.get_pmstat.u.getcx.last;
>      cxpt->idle_time =3D sysctl.u.get_pmstat.u.getcx.idle_time;
> +    cxpt->pc2 =3D sysctl.u.get_pmstat.u.getcx.pc2;
>      cxpt->pc3 =3D sysctl.u.get_pmstat.u.getcx.pc3;
>      cxpt->pc6 =3D sysctl.u.get_pmstat.u.getcx.pc6;
>      cxpt->pc7 =3D sysctl.u.get_pmstat.u.getcx.pc7;
>      cxpt->cc3 =3D sysctl.u.get_pmstat.u.getcx.cc3;
>      cxpt->cc6 =3D sysctl.u.get_pmstat.u.getcx.cc6;
> +    cxpt->cc7 =3D sysctl.u.get_pmstat.u.getcx.cc7;
>=20
>  unlock_2:
>      xc_hypercall_bounce_post(xch, residencies);
> diff -r 662dbf6ee71c tools/libxc/xenctrl.h
> --- a/tools/libxc/xenctrl.h     Mon Oct 24 18:01:07 2011 +0100
> +++ b/tools/libxc/xenctrl.h     Fri Oct 28 21:33:07 2011 +0800
> @@ -1733,11 +1733,13 @@
>      uint64_t idle_time;    /* idle time from boot */
>      uint64_t *triggers;    /* Cx trigger counts */
>      uint64_t *residencies; /* Cx residencies */
> +    uint64_t pc2;
>      uint64_t pc3;
>      uint64_t pc6;
>      uint64_t pc7;
>      uint64_t cc3;
>      uint64_t cc6;
> +    uint64_t cc7;
>  };
>  typedef struct xc_cx_stat xc_cx_stat_t;
>=20
> diff -r 662dbf6ee71c tools/misc/xenpm.c
> --- a/tools/misc/xenpm.c        Mon Oct 24 18:01:07 2011 +0100
> +++ b/tools/misc/xenpm.c        Fri Oct 28 21:33:07 2011 +0800
> @@ -92,13 +92,17 @@
>          printf("                       residency  [%020"PRIu64" ms]\n",
>                 cxstat->residencies[i]/1000000UL);
>      }
> -    printf("pc3                  : [%020"PRIu64" ms]\n"
> +    printf("pc2                  : [%020"PRIu64" ms]\n"
> +           "pc3                  : [%020"PRIu64" ms]\n"
>             "pc6                  : [%020"PRIu64" ms]\n"
>             "pc7                  : [%020"PRIu64" ms]\n",
> -           cxstat->pc3/1000000UL, cxstat->pc6/1000000UL, cxstat->pc7/100=
0000UL);
> +            cxstat->pc2/1000000UL, cxstat->pc3/1000000UL,
> +            cxstat->pc6/1000000UL, cxstat->pc7/1000000UL);
>      printf("cc3                  : [%020"PRIu64" ms]\n"
> -           "cc6                  : [%020"PRIu64" ms]\n",
> -           cxstat->cc3/1000000UL, cxstat->cc6/1000000UL);
> +           "cc6                  : [%020"PRIu64" ms]\n"
> +           "cc7                  : [%020"PRIu64" ms]\n",
> +            cxstat->cc3/1000000UL, cxstat->cc6/1000000UL,
> +            cxstat->cc7/1000000UL);
>      printf("\n");
>  }
>=20
> @@ -458,6 +462,9 @@
>                          break;
>                  }
>                  printf("Socket %d\n", socket_ids[i]);
> +                res =3D cxstat_end[j].pc2 - cxstat_start[j].pc2;
> +                printf("\tPC2\t%"PRIu64" ms\t%.2f%%\n",  res / =
1000000UL,
> +                       100UL * res / (double)sum_cx[j]);
>                  res =3D cxstat_end[j].pc3 - cxstat_start[j].pc3;
>                  printf("\tPC3\t%"PRIu64" ms\t%.2f%%\n",  res / =
1000000UL,
>                         100UL * res / (double)sum_cx[j]);
> @@ -482,6 +489,9 @@
>                      res =3D cxstat_end[j].cc6 - cxstat_start[j].cc6;
>                      printf("\t\tCC6\t%"PRIu64" ms\t%.2f%%\n",  res /=20
> 1000000UL,
>                             100UL * res / (double)sum_cx[j]);
> +                    res =3D cxstat_end[j].cc7 - cxstat_start[j].cc7;
> +                    printf("\t\tCC7\t%"PRIu64" ms\t%.2f%%\n",  res /=20
> 1000000UL,
> +                           100UL * res / (double)sum_cx[j]);
>                      printf("\n");
>=20
>                  }
> diff -r 662dbf6ee71c xen/arch/x86/acpi/cpu_idle.c
> --- a/xen/arch/x86/acpi/cpu_idle.c      Mon Oct 24 18:01:07 2011 +0100
> +++ b/xen/arch/x86/acpi/cpu_idle.c      Fri Oct 28 21:33:07 2011 +0800
> @@ -60,11 +60,13 @@
>=20
>  #define GET_HW_RES_IN_NS(msr, val) \
>      do { rdmsrl(msr, val); val =3D tsc_ticks2ns(val); } while( 0 )
> +#define GET_PC2_RES(val)  GET_HW_RES_IN_NS(0x60D, val) /* SNB only */
>  #define GET_PC3_RES(val)  GET_HW_RES_IN_NS(0x3F8, val)
>  #define GET_PC6_RES(val)  GET_HW_RES_IN_NS(0x3F9, val)
>  #define GET_PC7_RES(val)  GET_HW_RES_IN_NS(0x3FA, val)
>  #define GET_CC3_RES(val)  GET_HW_RES_IN_NS(0x3FC, val)
>  #define GET_CC6_RES(val)  GET_HW_RES_IN_NS(0x3FD, val)
> +#define GET_CC7_RES(val)  GET_HW_RES_IN_NS(0x3FE, val) /* SNB only */
>=20
>  static void lapic_timer_nop(void) { }
>  static void (*lapic_timer_off)(void);
> @@ -85,11 +87,13 @@
>=20
>  struct hw_residencies
>  {
> +    uint64_t pc2;
>      uint64_t pc3;
>      uint64_t pc6;
>      uint64_t pc7;
>      uint64_t cc3;
>      uint64_t cc6;
> +    uint64_t cc7;
>  };
>=20
>  static void do_get_hw_residencies(void *arg)
> @@ -116,6 +120,17 @@
>          GET_CC3_RES(hw_res->cc3);
>          GET_CC6_RES(hw_res->cc6);
>          break;
> +    /* Sandy bridge */
> +    case 0x2A:
> +    case 0x2D:

Which group would models 0x2E and 0x2F (as documented in SDM doc
changes May 2011) belong into?

Thanks, Jan

> +        GET_PC2_RES(hw_res->pc2);
> +        GET_PC3_RES(hw_res->pc3);
> +        GET_PC6_RES(hw_res->pc6);
> +        GET_PC7_RES(hw_res->pc7);
> +        GET_CC3_RES(hw_res->cc3);
> +        GET_CC6_RES(hw_res->cc6);
> +        GET_CC7_RES(hw_res->cc7);
> +        break;
>      }
>  }
>=20
> @@ -134,10 +149,10 @@
>=20
>      get_hw_residencies(cpu, &hw_res);
>=20
> -    printk("PC3[%"PRId64"] PC6[%"PRId64"] PC7[%"PRId64"]\n",
> -           hw_res.pc3, hw_res.pc6, hw_res.pc7);
> -    printk("CC3[%"PRId64"] CC6[%"PRId64"]\n",
> -           hw_res.cc3, hw_res.cc6);
> +    printk("PC2[%"PRId64"] PC3[%"PRId64"] PC6[%"PRId64"] PC7[%"PRId64"]\=
n",
> +           hw_res.pc2, hw_res.pc3, hw_res.pc6, hw_res.pc7);
> +    printk("CC3[%"PRId64"] CC6[%"PRId64"] CC7[%"PRId64"]\n",
> +           hw_res.cc3, hw_res.cc6,hw_res.cc7);
>  }
>=20
>  static char* acpi_cstate_method_name[] =3D
> @@ -1057,11 +1072,13 @@
>               copy_to_guest_offset(stat->residencies, 0, &res, 1) )
>              return -EFAULT;
>=20
> +        stat->pc2 =3D 0;
>          stat->pc3 =3D 0;
>          stat->pc6 =3D 0;
>          stat->pc7 =3D 0;
>          stat->cc3 =3D 0;
>          stat->cc6 =3D 0;
> +        stat->cc7 =3D 0;
>          return 0;
>      }
>=20
> @@ -1086,11 +1103,13 @@
>=20
>      get_hw_residencies(cpuid, &hw_res);
>=20
> +    stat->pc2 =3D hw_res.pc2;
>      stat->pc3 =3D hw_res.pc3;
>      stat->pc6 =3D hw_res.pc6;
>      stat->pc7 =3D hw_res.pc7;
>      stat->cc3 =3D hw_res.cc3;
>      stat->cc6 =3D hw_res.cc6;
> +    stat->cc7 =3D hw_res.cc7;
>=20
>      return 0;
>  }
> diff -r 662dbf6ee71c xen/include/public/sysctl.h
> --- a/xen/include/public/sysctl.h       Mon Oct 24 18:01:07 2011 +0100
> +++ b/xen/include/public/sysctl.h       Fri Oct 28 21:33:07 2011 +0800
> @@ -225,11 +225,13 @@
>      uint64_aligned_t idle_time;                 /* idle time from boot =
*/
>      XEN_GUEST_HANDLE_64(uint64) triggers;    /* Cx trigger counts */
>      XEN_GUEST_HANDLE_64(uint64) residencies; /* Cx residencies */
> +    uint64_aligned_t pc2;
>      uint64_aligned_t pc3;
>      uint64_aligned_t pc6;
>      uint64_aligned_t pc7;
>      uint64_aligned_t cc3;
>      uint64_aligned_t cc6;
> +    uint64_aligned_t cc7;
>  };
>=20
>  struct xen_sysctl_get_pmstat {
>=20
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com=20
> http://lists.xensource.com/xen-devel=20



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 05:26:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 05:26:01 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNlgf-0004c4-7n; Tue, 08 Nov 2011 05:26:01 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNlff-0004P3-NJ
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 05:25:10 -0800
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-14.tower-216.messagelabs.com!1320758696!2720449!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32001 invoked from network); 8 Nov 2011 13:24:56 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-14.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 13:24:56 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RNlfa-0001aT-0o; Tue, 08 Nov 2011 13:24:54 +0000
Date: Tue, 8 Nov 2011 13:24:53 +0000
From: Tim Deegan <tim@xen.org>
To: Jean Guyader <jean.guyader@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 3/6] add_to_physmap: Move the code for
	XENMEM_add_to_physmap.
Message-ID: <20111108132453.GA5975@ocelot.phlegethon.org>
References: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-4-git-send-email-jean.guyader@eu.citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <1320690327-12649-4-git-send-email-jean.guyader@eu.citrix.com>
User-Agent: Mutt/1.4.2.1i
Cc: xen-devel@lists.xensource.com, allen.m.kay@intel.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 18:25 +0000 on 07 Nov (1320690324), Jean Guyader wrote:
> 
> Move the code for the XENMEM_add_to_physmap case into it's own
> function (xenmem_add_to_physmap).
> 
> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>

Acked-by: Tim Deegan <tim@xen.org>


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 05:33:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 05:33:03 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNlnS-00055F-No; Tue, 08 Nov 2011 05:33:02 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNln0-0004sl-K7
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 05:32:34 -0800
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-8.tower-216.messagelabs.com!1320759151!2727439!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8997 invoked from network); 8 Nov 2011 13:32:31 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-8.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 13:32:31 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RNlmu-0001bj-Az; Tue, 08 Nov 2011 13:32:28 +0000
Date: Tue, 8 Nov 2011 13:32:28 +0000
From: Tim Deegan <tim@xen.org>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 4/6] mm: New XENMEM,
	XENMEM_add_to_physmap_gmfn_range
Message-ID: <20111108133228.GB5975@ocelot.phlegethon.org>
References: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-5-git-send-email-jean.guyader@eu.citrix.com>
	<4EB90273020000780005F8A9@novprvoes0310.provo.novell.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4EB90273020000780005F8A9@novprvoes0310.provo.novell.com>
User-Agent: Mutt/1.4.2.1i
Cc: xen-devel@lists.xensource.com, allen.m.kay@intel.com,
	Jean Guyader <jean.guyader@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 02:20 -0700 on 08 Nov (1320718835), Jan Beulich wrote:
> >>> On 07.11.11 at 19:25, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> 
> Sorry, noticed this only now, but neither title nor description of this
> are in sync with the actual patch.


Indeed; they should be updated.  But otherwise:
Acked-by: Tim Deegan <tim@xen.org>

> > XENMEM_add_to_physmap_gmfn_range is like XENMEM_add_to_physmap on
> > the gmfn space but the number of pages on which xen will iterate.
> > 
> > Use the 16 bits padding between .domid and .space in struct 
> > xen_add_to_physmap
> > to keep compatibility with older versions.
> > 
> > Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> > ---
> >  xen/arch/x86/mm.c           |   22 +++++++++++++++++++++-
> >  xen/include/public/memory.h |    4 ++++
> >  2 files changed, 25 insertions(+), 1 deletions(-)
> 
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 05:39:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 05:39:43 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNltv-0005Z0-EJ; Tue, 08 Nov 2011 05:39:43 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNltQ-0005N5-3w
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 05:39:12 -0800
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-16.tower-182.messagelabs.com!1320759548!2315231!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2494 invoked from network); 8 Nov 2011 13:39:09 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-16.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 13:39:09 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RNltM-0001dI-2o; Tue, 08 Nov 2011 13:39:08 +0000
Date: Tue, 8 Nov 2011 13:39:08 +0000
From: Tim Deegan <tim@xen.org>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 4/6] mm: New XENMEM,
	XENMEM_add_to_physmap_gmfn_range
Message-ID: <20111108133908.GC5975@ocelot.phlegethon.org>
References: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-5-git-send-email-jean.guyader@eu.citrix.com>
	<4EB90273020000780005F8A9@novprvoes0310.provo.novell.com>
	<20111108133228.GB5975@ocelot.phlegethon.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <20111108133228.GB5975@ocelot.phlegethon.org>
User-Agent: Mutt/1.4.2.1i
Cc: xen-devel@lists.xensource.com, allen.m.kay@intel.com,
	Jean Guyader <jean.guyader@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 13:32 +0000 on 08 Nov (1320759148), Tim Deegan wrote:
> At 02:20 -0700 on 08 Nov (1320718835), Jan Beulich wrote:
> > >>> On 07.11.11 at 19:25, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> > 
> > Sorry, noticed this only now, but neither title nor description of this
> > are in sync with the actual patch.
> 
> 
> Indeed; they should be updated.  But otherwise:
> Acked-by: Tim Deegan <tim@xen.org>

No, wait, that was the other patch, which I already acked!
ENOCOFFEE. :(

I have a few other comments on this patch...

> diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
> index f75011e..cca64b8 100644
> --- a/xen/arch/x86/mm.c
> +++ b/xen/arch/x86/mm.c
> @@ -4714,9 +4714,29 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
>              return -EPERM;
>          }
>  
> -        xenmem_add_to_physmap(d, xatp);
> +        if ( xatp.space != XENMAPSPACE_gmfn_range )
> +            xatp.size = 1;
> +
> +        for ( ; xatp.size > 0; xatp.size-- )
> +        {
> +            if ( hypercall_preempt_check() )
> +            {
> +                rc = -EAGAIN;
> +                break;
> +            }
> +            xenmem_add_to_physmap(d, xatp);
> +            xatp.idx++;
> +            xatp.gpfn++;
> +        }

Having moved XATP into its own function, this loop probably belongs in
that function. 

While I'm looking at it, updating two loop vars explicitly and one in
the header is a bit ugly - why not just use a while() and update all
three together?


>          rcu_unlock_domain(d);
> +        if ( rc == -EAGAIN )
> +        {
> +            if ( copy_to_guest(arg, &xatp, 1) )
> +                return -EFAULT;
> +            rc = hypercall_create_continuation(
> +                    __HYPERVISOR_memory_op, "ih", op, arg);
> +        }

I think this might need some compat glue in
arch/x86/x86_64/compat/mm.c for it to work with 32-bit callers.


Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 05:46:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 05:46:45 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNm0j-00061L-7Y; Tue, 08 Nov 2011 05:46:45 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNm02-0005ok-Eq
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 05:46:02 -0800
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-11.tower-216.messagelabs.com!1320759959!2662755!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6668 invoked from network); 8 Nov 2011 13:45:59 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-11.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 13:45:59 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RNlzy-0001ej-19; Tue, 08 Nov 2011 13:45:58 +0000
Date: Tue, 8 Nov 2011 13:45:57 +0000
From: Tim Deegan <tim@xen.org>
To: Jean Guyader <jean.guyader@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 6/6] Introduce per cpu flag
	(iommu_dont_flush_iotlb) to avoid unnecessary iotlb flush
Message-ID: <20111108134557.GD5975@ocelot.phlegethon.org>
References: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-5-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-6-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-7-git-send-email-jean.guyader@eu.citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <1320690327-12649-7-git-send-email-jean.guyader@eu.citrix.com>
User-Agent: Mutt/1.4.2.1i
Cc: xen-devel@lists.xensource.com, allen.m.kay@intel.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 18:25 +0000 on 07 Nov (1320690327), Jean Guyader wrote:
> 
> Add cpu flag that will be checked by the iommu low level code
> to skip iotlb flushes. iommu_iotlb_flush shall be called explicitly.

The general approach is OK.  I think the explicit flush on the xatp path
belongs in the inner xatp function, along with the reat of the loop. 

Also, please add a comment beside the declaration in iommu.h to explain
what the falg does and how it should be used. 

Cheers,

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 05:52:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 05:52:26 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNm6E-0006T1-Nh; Tue, 08 Nov 2011 05:52:26 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNm5e-0006Gc-QS
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 05:51:51 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1320760307!2729958!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21149 invoked from network); 8 Nov 2011 13:51:47 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-3.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 13:51:47 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 08 Nov 2011 13:51:47 +0000
Message-Id: <4EB941FF020000780005F9C0@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 08 Nov 2011 13:51:43 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part537CA9FF.1__="
Cc: Yang Z Zhang <yang.z.zhang@intel.com>
Subject: [Xen-devel] [PATCH] bump sysctl interface version after c/s
	23995:8943a9696358
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part537CA9FF.1__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

That c/s made binary incompatible changes to struct pm_cx_stat.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/include/public/sysctl.h
+++ b/xen/include/public/sysctl.h
@@ -34,7 +34,7 @@
 #include "xen.h"
 #include "domctl.h"
=20
-#define XEN_SYSCTL_INTERFACE_VERSION 0x00000008
+#define XEN_SYSCTL_INTERFACE_VERSION 0x00000009
=20
 /*
  * Read console content from Xen buffer ring.




--=__Part537CA9FF.1__=
Content-Type: text/plain; name="sysctl-ver9.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="sysctl-ver9.patch"

bump sysctl interface version after c/s 23995:8943a9696358=0A=0AThat c/s =
made binary incompatible changes to struct pm_cx_stat.=0A=0ASigned-off-by: =
Jan Beulich <jbeulich@suse.com>=0A=0A--- a/xen/include/public/sysctl.h=0A++=
+ b/xen/include/public/sysctl.h=0A@@ -34,7 +34,7 @@=0A #include "xen.h"=0A =
#include "domctl.h"=0A =0A-#define XEN_SYSCTL_INTERFACE_VERSION 0x00000008=
=0A+#define XEN_SYSCTL_INTERFACE_VERSION 0x00000009=0A =0A /*=0A  * Read =
console content from Xen buffer ring.=0A
--=__Part537CA9FF.1__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part537CA9FF.1__=--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 06:06:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 06:06:02 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNmJN-00078Y-Dq; Tue, 08 Nov 2011 06:06:01 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNmG5-0006tz-HZ
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 06:02:48 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1320760953!2330992!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1772 invoked from network); 8 Nov 2011 14:02:34 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 14:02:34 -0000
X-IronPort-AV: E=Sophos;i="4.69,477,1315180800"; 
   d="scan'208";a="8818462"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 14:02:33 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 14:02:33 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RNmG1-0002JT-79;
	Tue, 08 Nov 2011 14:02:33 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RNmG1-0005Yg-6H;
	Tue, 08 Nov 2011 14:02:33 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9726-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 8 Nov 2011 14:02:33 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9726: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9726 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9726/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 build-amd64-oldkern           2 host-install(2)              broken
 build-amd64-pvops             2 host-install(2)              broken
 build-amd64                   2 host-install(2)              broken

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pv            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pair          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  452d9143687f
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Juergen Gross <juergen.gross@ts.fujitsu.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
  Wei Wang <wei.wang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  broken  
 build-i386                                                   pass    
 build-amd64-oldkern                                          broken  
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           blocked 
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 blocked 
 test-amd64-i386-xl-credit2                                   blocked 
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               blocked 
 test-amd64-i386-xl-multivcpu                                 blocked 
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         blocked 
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           blocked 
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   blocked 
 test-amd64-i386-xl-win-vcpus1                                blocked 
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          blocked 
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

(No revision log; it would be 459 lines long.)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 06:50:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 06:50:00 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNmzw-0001yZ-K7; Tue, 08 Nov 2011 06:50:00 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNmyq-0001lG-6A
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 06:48:52 -0800
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1320763727!2348773!1
X-Originating-IP: [65.55.88.14]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30333 invoked from network); 8 Nov 2011 14:48:49 -0000
Received: from tx2ehsobe004.messaging.microsoft.com (HELO
	TX2EHSOBE007.bigfish.com) (65.55.88.14)
	by server-2.tower-182.messagelabs.com with AES128-SHA encrypted SMTP;
	8 Nov 2011 14:48:49 -0000
Received: from mail85-tx2-R.bigfish.com (10.9.14.253) by
	TX2EHSOBE007.bigfish.com (10.9.40.27) with Microsoft SMTP Server id
	14.1.225.22; Tue, 8 Nov 2011 14:48:25 +0000
Received: from mail85-tx2 (localhost.localdomain [127.0.0.1])	by
	mail85-tx2-R.bigfish.com (Postfix) with ESMTP id 8E757D0813F;
	Tue,  8 Nov 2011 14:48:37 +0000 (UTC)
X-SpamScore: -11
X-BigFish: VPS-11(zzbb2dK1432N98dKzz1202hzz8275bhz32i668h839h93fh61h)
X-Spam-TCS-SCL: 0:0
X-Forefront-Antispam-Report: CIP:163.181.249.108; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp01.amd.com; RD:none; EFVD:NLI
Received: from mail85-tx2 (localhost.localdomain [127.0.0.1]) by mail85-tx2
	(MessageSwitch) id 1320763715954963_29934;
	Tue,  8 Nov 2011 14:48:35 +0000 (UTC)
Received: from TX2EHSMHS046.bigfish.com (unknown [10.9.14.245])	by
	mail85-tx2.bigfish.com (Postfix) with ESMTP id E26E011A804B;
	Tue,  8 Nov 2011 14:48:35 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	TX2EHSMHS046.bigfish.com (10.9.99.146) with Microsoft SMTP Server id
	14.1.225.22; Tue, 8 Nov 2011 14:48:19 +0000
X-WSS-ID: 0LUCJT3-01-01I-02
X-M-MSG: 
Received: from sausexedgep01.amd.com (sausexedgep01-ext.amd.com
	[163.181.249.72])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp01.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 211DE1028007;	Tue,  8 Nov 2011 08:48:38 -0600 (CST)
Received: from SAUSEXDAG02.amd.com (163.181.55.2) by sausexedgep01.amd.com
	(163.181.36.54) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Tue, 8 Nov 2011 08:49:36 -0600
Received: from storexhtp01.amd.com (172.24.4.3) by sausexdag02.amd.com
	(163.181.55.2) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Tue, 8 Nov 2011 08:48:40 -0600
Received: from rhodium.osrc.amd.com (165.204.15.173) by storexhtp01.amd.com
	(172.24.4.3) with Microsoft SMTP Server id 8.3.213.0; Tue, 8 Nov 2011
	09:47:33 -0500
Message-ID: <4EB94103.4070209@amd.com>
Date: Tue, 8 Nov 2011 15:47:31 +0100
From: Christoph Egger <Christoph.Egger@amd.com>
User-Agent: Mozilla/5.0 (X11; NetBSD amd64;
	rv:6.0.1) Gecko/20111102 Thunderbird/6.0.1
MIME-Version: 1.0
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 0 of 2 RESEND] tools: add two new compile
	flags and perform checks on user defined folders.
References: <patchbomb.1320313292@loki.upc.es>
In-Reply-To: <patchbomb.1320313292@loki.upc.es>
Content-Type: text/plain; charset="UTF-8"; format=flowed
Content-Transfer-Encoding: 7bit
X-OriginatorOrg: amd.com
Cc: Roger Pau Monne <roger.pau@entel.upc.edu>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


Ian,

please apply this patch series. It is needed to build xentools on NetBSD 
out-of-the box again.

Christoph


On 11/03/11 10:41, Roger Pau Monne wrote:
> Added two new sets of compile flags, and pass them to the check scripts,
 > so libraries and includes are searched there also.
>
> Resend this patches because they suffered some modifications and where scattered along the mailing list.
>
> Please review, thanks Roger.
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>


-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 07:16:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 07:16:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNnPR-0003WD-9O; Tue, 08 Nov 2011 07:16:21 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNnOO-0003JJ-Lk
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 07:15:18 -0800
X-Env-Sender: admin@dmarkey.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1320765294!47451823!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32021 invoked from network); 8 Nov 2011 15:14:56 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 15:14:56 -0000
Received: by pzd13 with SMTP id 13so1792259pzd.8
	for <xen-devel@lists.xensource.com>;
	Tue, 08 Nov 2011 07:15:11 -0800 (PST)
MIME-Version: 1.0
Received: by 10.68.0.42 with SMTP id 10mr1550373pbb.29.1320765310899; Tue, 08
	Nov 2011 07:15:10 -0800 (PST)
Received: by 10.142.180.4 with HTTP; Tue, 8 Nov 2011 07:15:10 -0800 (PST)
In-Reply-To: <20110526125239.GA7838@dumpdata.com>
References: <AEC6C66638C05B468B556EA548C1A77D01C558B2@trantor>
	<291EDFCB1E9E224A99088639C47620228D3EDCA57D@LONPMAILBOX01.citrite.net>
	<AEC6C66638C05B468B556EA548C1A77D01C558C1@trantor>
	<BANLkTin1MKmJXTe53SJBHxvw+TYgrEpdpw@mail.gmail.com>
	<AEC6C66638C05B468B556EA548C1A77D01D573FD@trantor>
	<20110526125239.GA7838@dumpdata.com>
Date: Tue, 8 Nov 2011 15:15:10 +0000
Message-ID: <CANXrN=0E70=AWfyhzUk6N3Rw=oVNqzcmUweCRforKpa3GQG4oQ@mail.gmail.com>
Subject: Re: [Xen-devel] RE: produce windows compatible dump file from Dom0
From: David Markey <admin@dmarkey.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Paul Durrant <Paul.Durrant@citrix.com>,
	James Harper <james.harper@bendigoit.com.au>, xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: admin@dmarkey.com
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1898114825=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1898114825==
Content-Type: multipart/alternative; boundary=bcaec5215c5530148904b13aa398

--bcaec5215c5530148904b13aa398
Content-Type: text/plain; charset=ISO-8859-1

Hi Konrad,

Sorry for resurrecting,

Did "the guy" manage to get clearance to release the source for this
particular project?


Thanks!

David


On 26 May 2011 13:52, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:

> On Wed, May 25, 2011 at 10:16:06PM +1000, James Harper wrote:
> > >
> > > Hi all,
> > >
> > > Did anyone make any progress on this?
> > >
> > > I'm interested in getting a Windows memory dump out of a XenServer
> > suspend
> > > image.
> > >
> > > Is it even remotely possible?
> > >
> >
> > Yes. In order for it to work I believe the DomU needs to call
> > KeInitializeCrashDumpHeader to place a crash dump header inside the
> > memory image (eg in NonPagedPool). KeInitializeCrashDumpHeader is
> > available in 2003sp1 and newer. You can then find that info in the saved
> > image and use it to build a windows compatible crash dump. There is more
> > to it than that obviously and I haven't actually done it myself. Ideally
> > it would be possible to do 'xl wincrashdump -o memory.dmp domu_name' and
> > have it all happen.
> >
> > I've BCC'd the guy who wrote a program to do it to see if he can share
> > it (hope he doesn't mind :)
>
> I am not "the guy", and while "the guy" is working on getting a blanket
> OK to release the source (or executable), let me give you some of the
> technical details in case you feel inspired to write this yourself.
>
> The process in making a dumpconverter involves finding the windows dump
> header
> in memory and putting it at the beginning of the output file, then taking
> the
> raw domain dump and writing it as is except that the following two ranges
> need
> to be skipped - which can vary from system to system:
>   1) the ELF header (by default the first 6 pages of the raw dump)
>   2) a range which might be BIOS, which by default in the tool is set to
>      pages 0x9F to 0xDF.
>
> Good luck!
>

--bcaec5215c5530148904b13aa398
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hi Konrad,<div><br></div><div>Sorry for=A0resurrecting,</div><div><br></div=
><div>Did &quot;the guy&quot; manage to get clearance to release the source=
 for this particular project?</div><div><br></div><div><br></div><div>Thank=
s!</div>
<div><br></div><div>David</div><div><br><div><br><div class=3D"gmail_quote"=
>On 26 May 2011 13:52, Konrad Rzeszutek Wilk <span dir=3D"ltr">&lt;<a href=
=3D"mailto:konrad.wilk@oracle.com">konrad.wilk@oracle.com</a>&gt;</span> wr=
ote:<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex;"><div class=3D"HOEnZb"><div class=3D"h5">On =
Wed, May 25, 2011 at 10:16:06PM +1000, James Harper wrote:<br>
&gt; &gt;<br>
&gt; &gt; Hi all,<br>
&gt; &gt;<br>
&gt; &gt; Did anyone make any progress on this?<br>
&gt; &gt;<br>
&gt; &gt; I&#39;m interested in getting a Windows memory dump out of a XenS=
erver<br>
&gt; suspend<br>
&gt; &gt; image.<br>
&gt; &gt;<br>
&gt; &gt; Is it even remotely possible?<br>
&gt; &gt;<br>
&gt;<br>
&gt; Yes. In order for it to work I believe the DomU needs to call<br>
&gt; KeInitializeCrashDumpHeader to place a crash dump header inside the<br=
>
&gt; memory image (eg in NonPagedPool). KeInitializeCrashDumpHeader is<br>
&gt; available in 2003sp1 and newer. You can then find that info in the sav=
ed<br>
&gt; image and use it to build a windows compatible crash dump. There is mo=
re<br>
&gt; to it than that obviously and I haven&#39;t actually done it myself. I=
deally<br>
&gt; it would be possible to do &#39;xl wincrashdump -o memory.dmp domu_nam=
e&#39; and<br>
&gt; have it all happen.<br>
&gt;<br>
&gt; I&#39;ve BCC&#39;d the guy who wrote a program to do it to see if he c=
an share<br>
&gt; it (hope he doesn&#39;t mind :)<br>
<br>
</div></div>I am not &quot;the guy&quot;, and while &quot;the guy&quot; is =
working on getting a blanket<br>
OK to release the source (or executable), let me give you some of the<br>
technical details in case you feel inspired to write this yourself.<br>
<br>
The process in making a dumpconverter involves finding the windows dump hea=
der<br>
in memory and putting it at the beginning of the output file, then taking t=
he<br>
raw domain dump and writing it as is except that the following two ranges n=
eed<br>
to be skipped - which can vary from system to system:<br>
 =A0 1) the ELF header (by default the first 6 pages of the raw dump)<br>
 =A0 2) a range which might be BIOS, which by default in the tool is set to=
<br>
 =A0 =A0 =A0pages 0x9F to 0xDF.<br>
<br>
Good luck!<br>
</blockquote></div><br></div></div>

--bcaec5215c5530148904b13aa398--


--===============1898114825==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1898114825==--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 07:39:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 07:39:42 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNnm1-0004JS-T0; Tue, 08 Nov 2011 07:39:42 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNnl5-00045v-4A
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 07:38:43 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1320766718!753984!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7735 invoked from network); 8 Nov 2011 15:38:39 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-15.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 15:38:39 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 08 Nov 2011 15:38:37 +0000
Message-Id: <4EB95B0B020000780005FA38@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 08 Nov 2011 15:38:35 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part3817C2EB.0__="
Subject: [Xen-devel] [PATCH] x86/cpuidle: clean up hw residencies reading
	code
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part3817C2EB.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Fold redundant code and eliminate pointless casts.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/acpi/cpu_idle.c
+++ b/xen/arch/x86/acpi/cpu_idle.c
@@ -99,13 +99,19 @@ struct hw_residencies
 static void do_get_hw_residencies(void *arg)
 {
     struct cpuinfo_x86 *c =3D &current_cpu_data;
-    struct hw_residencies *hw_res =3D (struct hw_residencies *)arg;
+    struct hw_residencies *hw_res =3D arg;
=20
     if ( c->x86_vendor !=3D X86_VENDOR_INTEL || c->x86 !=3D 6 )
         return;
=20
     switch ( c->x86_model )
     {
+    /* Sandy bridge */
+    case 0x2A:
+    case 0x2D:
+        GET_PC2_RES(hw_res->pc2);
+        GET_CC7_RES(hw_res->cc7);
+        /* fall through */
     /* Nehalem */
     case 0x1A:
     case 0x1E:
@@ -120,32 +126,22 @@ static void do_get_hw_residencies(void *
         GET_CC3_RES(hw_res->cc3);
         GET_CC6_RES(hw_res->cc6);
         break;
-    /* Sandy bridge */
-    case 0x2A:
-    case 0x2D:
-        GET_PC2_RES(hw_res->pc2);
-        GET_PC3_RES(hw_res->pc3);
-        GET_PC6_RES(hw_res->pc6);
-        GET_PC7_RES(hw_res->pc7);
-        GET_CC3_RES(hw_res->cc3);
-        GET_CC6_RES(hw_res->cc6);
-        GET_CC7_RES(hw_res->cc7);
-        break;
     }
 }
=20
 static void get_hw_residencies(uint32_t cpu, struct hw_residencies =
*hw_res)
 {
+    memset(hw_res, 0, sizeof(*hw_res));
+
     if ( smp_processor_id() =3D=3D cpu )
-        do_get_hw_residencies((void *)hw_res);
+        do_get_hw_residencies(hw_res);
     else
-        on_selected_cpus(cpumask_of(cpu),
-                         do_get_hw_residencies, (void *)hw_res, 1);
+        on_selected_cpus(cpumask_of(cpu), do_get_hw_residencies, hw_res, =
1);
 }
=20
 static void print_hw_residencies(uint32_t cpu)
 {
-    struct hw_residencies hw_res =3D {0};
+    struct hw_residencies hw_res;
=20
     get_hw_residencies(cpu, &hw_res);
=20
@@ -1042,7 +1038,7 @@ int pmstat_get_cx_stat(uint32_t cpuid, s
     struct acpi_processor_power *power =3D processor_powers[cpuid];
     uint64_t usage, res, idle_usage =3D 0, idle_res =3D 0;
     int i;
-    struct hw_residencies hw_res =3D {0};
+    struct hw_residencies hw_res;
=20
     if ( power =3D=3D NULL )
     {




--=__Part3817C2EB.0__=
Content-Type: text/plain; name="x86-cpuidle-residencies-cleanup.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="x86-cpuidle-residencies-cleanup.patch"

x86/cpuidle: clean up hw residencies reading code=0A=0AFold redundant code =
and eliminate pointless casts.=0A=0ASigned-off-by: Jan Beulich <jbeulich@su=
se.com>=0A=0A--- a/xen/arch/x86/acpi/cpu_idle.c=0A+++ b/xen/arch/x86/acpi/c=
pu_idle.c=0A@@ -99,13 +99,19 @@ struct hw_residencies=0A static void =
do_get_hw_residencies(void *arg)=0A {=0A     struct cpuinfo_x86 *c =3D =
&current_cpu_data;=0A-    struct hw_residencies *hw_res =3D (struct =
hw_residencies *)arg;=0A+    struct hw_residencies *hw_res =3D arg;=0A =0A =
    if ( c->x86_vendor !=3D X86_VENDOR_INTEL || c->x86 !=3D 6 )=0A         =
return;=0A =0A     switch ( c->x86_model )=0A     {=0A+    /* Sandy bridge =
*/=0A+    case 0x2A:=0A+    case 0x2D:=0A+        GET_PC2_RES(hw_res->pc2);=
=0A+        GET_CC7_RES(hw_res->cc7);=0A+        /* fall through */=0A     =
/* Nehalem */=0A     case 0x1A:=0A     case 0x1E:=0A@@ -120,32 +126,22 @@ =
static void do_get_hw_residencies(void *=0A         GET_CC3_RES(hw_res->cc3=
);=0A         GET_CC6_RES(hw_res->cc6);=0A         break;=0A-    /* Sandy =
bridge */=0A-    case 0x2A:=0A-    case 0x2D:=0A-        GET_PC2_RES(hw_res=
->pc2);=0A-        GET_PC3_RES(hw_res->pc3);=0A-        GET_PC6_RES(hw_res-=
>pc6);=0A-        GET_PC7_RES(hw_res->pc7);=0A-        GET_CC3_RES(hw_res->=
cc3);=0A-        GET_CC6_RES(hw_res->cc6);=0A-        GET_CC7_RES(hw_res->c=
c7);=0A-        break;=0A     }=0A }=0A =0A static void get_hw_residencies(=
uint32_t cpu, struct hw_residencies *hw_res)=0A {=0A+    memset(hw_res, 0, =
sizeof(*hw_res));=0A+=0A     if ( smp_processor_id() =3D=3D cpu )=0A-      =
  do_get_hw_residencies((void *)hw_res);=0A+        do_get_hw_residencies(h=
w_res);=0A     else=0A-        on_selected_cpus(cpumask_of(cpu),=0A-       =
                  do_get_hw_residencies, (void *)hw_res, 1);=0A+        =
on_selected_cpus(cpumask_of(cpu), do_get_hw_residencies, hw_res, 1);=0A =
}=0A =0A static void print_hw_residencies(uint32_t cpu)=0A {=0A-    struct =
hw_residencies hw_res =3D {0};=0A+    struct hw_residencies hw_res;=0A =0A =
    get_hw_residencies(cpu, &hw_res);=0A =0A@@ -1042,7 +1038,7 @@ int =
pmstat_get_cx_stat(uint32_t cpuid, s=0A     struct acpi_processor_power =
*power =3D processor_powers[cpuid];=0A     uint64_t usage, res, idle_usage =
=3D 0, idle_res =3D 0;=0A     int i;=0A-    struct hw_residencies hw_res =
=3D {0};=0A+    struct hw_residencies hw_res;=0A =0A     if ( power =3D=3D =
NULL )=0A     {=0A
--=__Part3817C2EB.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part3817C2EB.0__=--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 07:41:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 07:41:42 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNnny-0004i1-F4; Tue, 08 Nov 2011 07:41:42 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNnnB-0004V4-Cs
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 07:40:53 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1320766850!758172!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21841 invoked from network); 8 Nov 2011 15:40:50 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-4.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 15:40:50 -0000
Received: by wwf4 with SMTP id 4so779112wwf.24
	for <xen-devel@lists.xensource.com>;
	Tue, 08 Nov 2011 07:40:50 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=TvZ04V30GnIvWwhEmtyYVDZXF0A2y33Co+6h/HXoGQA=;
	b=hoY0Ugx7f95f+zyzL89zUmr3i5/a5hyxBd57hnWnhvtLxgUiQIpkPKy/s7w2/pj4WM
	Lloa7iB8phXlP1deEQU9O6KwAvZCGAUu20HjrFUn/m1grywffDRXa8aaEONvd1amHmUB
	rf8SculCD3v+8W/gB6rl7XUzk4dcjBidVhK84=
Received: by 10.216.132.157 with SMTP id o29mr8218788wei.47.1320766849945;
	Tue, 08 Nov 2011 07:40:49 -0800 (PST)
Received: from [192.168.1.3] (host86-129-249-120.range86-129.btcentralplus.com.
	[86.129.249.120])
	by mx.google.com with ESMTPS id et20sm2115533wbb.15.2011.11.08.07.40.48
	(version=SSLv3 cipher=OTHER); Tue, 08 Nov 2011 07:40:49 -0800 (PST)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Tue, 08 Nov 2011 15:40:42 +0000
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: create_irq() should call
	assign_irq_vector()
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CADEFDFA.33B8F%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] x86/IRQ: create_irq() should call
	assign_irq_vector()
Thread-Index: AcyeLMW62GSR00EXUUWnLKycmFG1CQ==
In-Reply-To: <4EB915B7020000780005F8FC@novprvoes0310.provo.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 08/11/2011 10:42, "Jan Beulich" <JBeulich@suse.com> wrote:

> ... rather than __assign_irq_vector(), to ensure desc->affinity gets
> initialized properly.
> 
> This at once eliminates the need to forward-declare the latter function.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> --- a/xen/arch/x86/irq.c
> +++ b/xen/arch/x86/irq.c
> @@ -25,7 +25,6 @@
>  #include <public/physdev.h>
>  
>  static void parse_irq_vector_map_param(char *s);
> -static int __assign_irq_vector(int irq, struct irq_desc *, const cpumask_t
> *);
>  
>  /* opt_noirqbalance: If true, software IRQ balancing/affinity is disabled. */
>  bool_t __read_mostly opt_noirqbalance = 0;
> @@ -153,7 +152,6 @@ int __init bind_irq_vector(int irq, int
>   */
>  int create_irq(void)
>  {
> -    unsigned long flags;
>      int irq, ret;
>      struct irq_desc *desc;
>  
> @@ -169,11 +167,7 @@ int create_irq(void)
>  
>      ret = init_one_irq_desc(desc);
>      if (!ret)
> -    {
> -        spin_lock_irqsave(&vector_lock, flags);
> -        ret = __assign_irq_vector(irq, desc, TARGET_CPUS);
> -        spin_unlock_irqrestore(&vector_lock, flags);
> -    }
> +        ret = assign_irq_vector(irq);
>      if (ret < 0)
>      {
>          desc->arch.used = IRQ_UNUSED;
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 07:42:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 07:42:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNnos-000559-35; Tue, 08 Nov 2011 07:42:38 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNnnf-0004ee-Ks
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 07:41:24 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1320766857!2345023!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1078 invoked from network); 8 Nov 2011 15:41:20 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-10.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 15:41:20 -0000
Received: by wyh11 with SMTP id 11so770088wyh.30
	for <xen-devel@lists.xensource.com>;
	Tue, 08 Nov 2011 07:40:48 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=2rE3Ct1Od9WHKckOMjwLw9/+T620gt43icDfULMWjfQ=;
	b=VgBCf9EmS3iSEs9CI7bs8WIZo3ymHg8HUarGrBizbXjX8sAoW9e/3dBoluae2oH67A
	JjlGMaDLJFAe0qazV/GfK+xEB8ADl1fjRL8WdRrSufN+Wy1Y4IpzFlw8DFNdRowM2vrR
	69cgqejwt6MH4lqAfrSFxXWC/cVEgamLXzkDg=
Received: by 10.216.134.28 with SMTP id r28mr7916258wei.60.1320766847818;
	Tue, 08 Nov 2011 07:40:47 -0800 (PST)
Received: from [192.168.1.3] (host86-129-249-120.range86-129.btcentralplus.com.
	[86.129.249.120])
	by mx.google.com with ESMTPS id et20sm2115533wbb.15.2011.11.08.07.40.44
	(version=SSLv3 cipher=OTHER); Tue, 08 Nov 2011 07:40:45 -0800 (PST)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Tue, 08 Nov 2011 15:40:28 +0000
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: eliminate irq_vector[]
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CADEFDEC.33B8E%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] x86/IRQ: eliminate irq_vector[]
Thread-Index: AcyeLL1imcO5Yt0c806Ydc/nS5pRXw==
In-Reply-To: <4EB91437020000780005F8D8@novprvoes0310.provo.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 08/11/2011 10:36, "Jan Beulich" <JBeulich@suse.com> wrote:

> The vector is already being tracked in struct irq_desc's arch.vector
> member, so there's no real need for a second place where this to get
> stored. The only caveat is that legacy vectors (used for interrupts
> handled through the 8259) must be special cased to not prevent non-
> legacy vectors from being assigned.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> --- a/xen/arch/x86/io_apic.c
> +++ b/xen/arch/x86/io_apic.c
> @@ -452,10 +452,10 @@ static void unmask_IO_APIC_irq(struct ir
>      spin_unlock_irqrestore(&ioapic_lock, flags);
>  }
>  
> -static void __eoi_IO_APIC_irq(unsigned int irq)
> +static void __eoi_IO_APIC_irq(struct irq_desc *desc)
>  {
> -    struct irq_pin_list *entry = irq_2_pin + irq;
> -    unsigned int pin, vector = IO_APIC_VECTOR(irq);
> +    struct irq_pin_list *entry = irq_2_pin + desc->irq;
> +    unsigned int pin, vector = desc->arch.vector;
>  
>      for (;;) {
>          pin = entry->pin;
> @@ -468,11 +468,11 @@ static void __eoi_IO_APIC_irq(unsigned i
>      }
>  }
>  
> -static void eoi_IO_APIC_irq(unsigned int irq)
> +static void eoi_IO_APIC_irq(struct irq_desc *desc)
>  {
>      unsigned long flags;
>      spin_lock_irqsave(&ioapic_lock, flags);
> -    __eoi_IO_APIC_irq(irq);
> +    __eoi_IO_APIC_irq(desc);
>      spin_unlock_irqrestore(&ioapic_lock, flags);
>  }
>  
> @@ -1200,7 +1200,7 @@ static void /*__init*/ __print_IO_APIC(v
>          struct irq_pin_list *entry = irq_2_pin + i;
>          if (entry->pin < 0)
>              continue;
> -        printk(KERN_DEBUG "IRQ%d ", IO_APIC_VECTOR(i));
> +        printk(KERN_DEBUG "IRQ%d ", irq_to_desc(i)->arch.vector);
>          for (;;) {
>              printk("-> %d:%d", entry->apic, entry->pin);
>              if (!entry->next)
> @@ -1621,7 +1621,7 @@ static void mask_and_ack_level_ioapic_ir
>   * operation to prevent an edge-triggered interrupt escaping meanwhile.
>   * The idea is from Manfred Spraul.  --macro
>   */
> -    i = IO_APIC_VECTOR(desc->irq);
> +    i = desc->arch.vector;
>  
>      v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
>  
> @@ -1653,12 +1653,12 @@ static void end_level_ioapic_irq(struct
>          {
>              if ( !(desc->status & (IRQ_DISABLED|IRQ_MOVE_PENDING)) )
>              {
> -                eoi_IO_APIC_irq(desc->irq);
> +                eoi_IO_APIC_irq(desc);
>                  return;
>              }
>  
>              mask_IO_APIC_irq(desc);
> -            eoi_IO_APIC_irq(desc->irq);
> +            eoi_IO_APIC_irq(desc);
>              if ( (desc->status & IRQ_MOVE_PENDING) &&
>                   !io_apic_level_ack_pending(desc->irq) )
>                  move_masked_irq(desc);
> @@ -1689,7 +1689,7 @@ static void end_level_ioapic_irq(struct
>   * operation to prevent an edge-triggered interrupt escaping meanwhile.
>   * The idea is from Manfred Spraul.  --macro
>   */
> -    i = IO_APIC_VECTOR(desc->irq);
> +    i = desc->arch.vector;
>  
>      /* Manually EOI the old vector if we are moving to the new */
>      if ( vector && i != vector )
> @@ -1752,7 +1752,7 @@ static inline void init_IO_APIC_traps(vo
>      int irq;
>      /* Xen: This is way simpler than the Linux implementation. */
>      for (irq = 0; platform_legacy_irq(irq); irq++)
> -        if (IO_APIC_IRQ(irq) && !IO_APIC_VECTOR(irq))
> +        if (IO_APIC_IRQ(irq) && !irq_to_vector(irq))
>              make_8259A_irq(irq);
>  }
>  
> --- a/xen/arch/x86/irq.c
> +++ b/xen/arch/x86/irq.c
> @@ -41,7 +41,6 @@ custom_param("irq_vector_map", parse_irq
>  
>  vmask_t global_used_vector_map;
>  
> -u8 __read_mostly *irq_vector;
>  struct irq_desc __read_mostly *irq_desc = NULL;
>  
>  static DECLARE_BITMAP(used_vectors, NR_VECTORS);
> @@ -135,8 +134,6 @@ static int __init __bind_irq_vector(int
>          set_bit(vector, desc->arch.used_vectors);
>      }
>      desc->arch.used = IRQ_USED;
> -    if (IO_APIC_IRQ(irq))
> -        irq_vector[irq] = vector;
>      return 0;
>  }
>  
> @@ -289,7 +286,11 @@ int irq_to_vector(int irq)
>      BUG_ON(irq >= nr_irqs || irq < 0);
>  
>      if (IO_APIC_IRQ(irq))
> -        vector = irq_vector[irq];
> +    {
> +        vector = irq_to_desc(irq)->arch.vector;
> +        if (vector >= FIRST_LEGACY_VECTOR && vector <= LAST_LEGACY_VECTOR)
> +            vector = 0;
> +    }
>      else if (MSI_IRQ(irq))
>          vector = irq_to_desc(irq)->arch.vector;
>      else
> @@ -331,9 +332,8 @@ int __init init_irq_data(void)
>          this_cpu(vector_irq)[vector] = -1;
>  
>      irq_desc = xzalloc_array(struct irq_desc, nr_irqs);
> -    irq_vector = xzalloc_array(u8, nr_irqs_gsi);
>      
> -    if ( !irq_desc || !irq_vector )
> +    if ( !irq_desc )
>          return -ENOMEM;
>  
>      for (irq = 0; irq < nr_irqs_gsi; irq++) {
> @@ -426,7 +426,7 @@ static int __assign_irq_vector(
>      vmask_t *irq_used_vectors = NULL;
>  
>      old_vector = irq_to_vector(irq);
> -    if (old_vector) {
> +    if (old_vector > 0) {
>          cpumask_and(&tmp_mask, mask, &cpu_online_map);
>          if (cpumask_intersects(&tmp_mask, desc->arch.cpu_mask)) {
>              desc->arch.vector = old_vector;
> @@ -485,7 +485,7 @@ next:
>          /* Found one! */
>          current_vector = vector;
>          current_offset = offset;
> -        if (old_vector) {
> +        if (old_vector > 0) {
>              desc->arch.move_in_progress = 1;
>              cpumask_copy(desc->arch.old_cpu_mask, desc->arch.cpu_mask);
>              desc->arch.old_vector = desc->arch.vector;
> @@ -501,9 +501,6 @@ next:
>                 || (desc->arch.used_vectors == irq_used_vectors));
>          desc->arch.used_vectors = irq_used_vectors;
>  
> -        if (IO_APIC_IRQ(irq))
> -            irq_vector[irq] = vector;
> -
>          if ( desc->arch.used_vectors )
>          {
>              ASSERT(!test_bit(vector, desc->arch.used_vectors));
> --- a/xen/arch/x86/smpboot.c
> +++ b/xen/arch/x86/smpboot.c
> @@ -998,7 +998,7 @@ void __init smp_intr_init(void)
>       * IRQ0 must be given a fixed assignment and initialized,
>       * because it's used before the IO-APIC is set up.
>       */
> -    irq_vector[0] = FIRST_HIPRIORITY_VECTOR;
> +    irq_to_desc(0)->arch.vector = FIRST_HIPRIORITY_VECTOR;
>  
>      /*
>       * Also ensure serial interrupts are high priority. We do not
> @@ -1008,7 +1008,6 @@ void __init smp_intr_init(void)
>      {
>          if ( (irq = serial_irq(seridx)) < 0 )
>              continue;
> -        irq_vector[irq] = FIRST_HIPRIORITY_VECTOR + seridx + 1;
>          per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_VECTOR + seridx + 1] = irq;
>          irq_to_desc(irq)->arch.vector = FIRST_HIPRIORITY_VECTOR + seridx + 1;
>          cpumask_copy(irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map);
> --- a/xen/include/asm-x86/irq.h
> +++ b/xen/include/asm-x86/irq.h
> @@ -14,7 +14,6 @@
>  #define IO_APIC_IRQ(irq)    (platform_legacy_irq(irq) ?    \
>     (1 << (irq)) & io_apic_irqs : \
>     (irq) < nr_irqs_gsi)
> -#define IO_APIC_VECTOR(irq) (irq_vector[irq])
>  
>  #define MSI_IRQ(irq)       ((irq) >= nr_irqs_gsi && (irq) < nr_irqs)
>  
> @@ -48,8 +47,6 @@ struct arch_irq_desc {
>  typedef int vector_irq_t[NR_VECTORS];
>  DECLARE_PER_CPU(vector_irq_t, vector_irq);
>  
> -extern u8 *irq_vector;
> -
>  extern bool_t opt_noirqbalance;
>  
>  #define OPT_IRQ_VECTOR_MAP_DEFAULT 0 /* Do the default thing  */
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 07:43:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 07:43:49 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNnq1-0005YM-4U; Tue, 08 Nov 2011 07:43:49 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNnnh-0004et-TY
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 07:41:27 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1320766881!757473!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18208 invoked from network); 8 Nov 2011 15:41:22 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-10.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 15:41:22 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA8Feg81021536
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 8 Nov 2011 15:40:43 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA8FefBB022247
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 8 Nov 2011 15:40:42 GMT
Received: from abhmt119.oracle.com (abhmt119.oracle.com [141.146.116.71])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA8FeZB8004825; Tue, 8 Nov 2011 09:40:35 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 08 Nov 2011 07:40:35 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 5B28381415; Tue,  8 Nov 2011 10:40:34 -0500 (EST)
Date: Tue, 8 Nov 2011 10:40:34 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: David Markey <admin@dmarkey.com>
Subject: Re: [Xen-devel] RE: produce windows compatible dump file from Dom0
Message-ID: <20111108154034.GA12849@phenom.dumpdata.com>
References: <AEC6C66638C05B468B556EA548C1A77D01C558B2@trantor>
	<291EDFCB1E9E224A99088639C47620228D3EDCA57D@LONPMAILBOX01.citrite.net>
	<AEC6C66638C05B468B556EA548C1A77D01C558C1@trantor>
	<BANLkTin1MKmJXTe53SJBHxvw+TYgrEpdpw@mail.gmail.com>
	<AEC6C66638C05B468B556EA548C1A77D01D573FD@trantor>
	<20110526125239.GA7838@dumpdata.com>
	<CANXrN=0E70=AWfyhzUk6N3Rw=oVNqzcmUweCRforKpa3GQG4oQ@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CANXrN=0E70=AWfyhzUk6N3Rw=oVNqzcmUweCRforKpa3GQG4oQ@mail.gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090209.4EB94D7B.00C9,ss=1,re=0.000,fgs=0
Cc: Paul Durrant <Paul.Durrant@citrix.com>,
	James Harper <james.harper@bendigoit.com.au>, xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 08, 2011 at 03:15:10PM +0000, David Markey wrote:
> Hi Konrad,
> 
> Sorry for resurrecting,

Oh no trouble.
> 
> Did "the guy" manage to get clearance to release the source for this
> particular project?

Uh, I think we lost track of this. Let me poke "the guy".

> 
> 
> Thanks!
> 
> David
> 
> 
> On 26 May 2011 13:52, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
> 
> > On Wed, May 25, 2011 at 10:16:06PM +1000, James Harper wrote:
> > > >
> > > > Hi all,
> > > >
> > > > Did anyone make any progress on this?
> > > >
> > > > I'm interested in getting a Windows memory dump out of a XenServer
> > > suspend
> > > > image.
> > > >
> > > > Is it even remotely possible?
> > > >
> > >
> > > Yes. In order for it to work I believe the DomU needs to call
> > > KeInitializeCrashDumpHeader to place a crash dump header inside the
> > > memory image (eg in NonPagedPool). KeInitializeCrashDumpHeader is
> > > available in 2003sp1 and newer. You can then find that info in the saved
> > > image and use it to build a windows compatible crash dump. There is more
> > > to it than that obviously and I haven't actually done it myself. Ideally
> > > it would be possible to do 'xl wincrashdump -o memory.dmp domu_name' and
> > > have it all happen.
> > >
> > > I've BCC'd the guy who wrote a program to do it to see if he can share
> > > it (hope he doesn't mind :)
> >
> > I am not "the guy", and while "the guy" is working on getting a blanket
> > OK to release the source (or executable), let me give you some of the
> > technical details in case you feel inspired to write this yourself.
> >
> > The process in making a dumpconverter involves finding the windows dump
> > header
> > in memory and putting it at the beginning of the output file, then taking
> > the
> > raw domain dump and writing it as is except that the following two ranges
> > need
> > to be skipped - which can vary from system to system:
> >   1) the ELF header (by default the first 6 pages of the raw dump)
> >   2) a range which might be BIOS, which by default in the tool is set to
> >      pages 0x9F to 0xDF.
> >
> > Good luck!
> >

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 08:04:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 08:04:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNoA7-0006K3-8a; Tue, 08 Nov 2011 08:04:36 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNo6K-00062W-2d
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 08:00:59 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1320768036!3413723!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3255 invoked from network); 8 Nov 2011 16:00:36 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-7.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 16:00:36 -0000
Received: by wyh11 with SMTP id 11so797671wyh.30
	for <xen-devel@lists.xensource.com>;
	Tue, 08 Nov 2011 08:00:35 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=wnI4+BVZ+FkQ4v+1T6x3SG7L8QAo18DhMXDvag5vSV4=;
	b=Wa+xsILXYiVY+/j522uv8Wl0afY22TNudGOomVqX4WRc2mrgqAoCZPIHa1MOsn0XZh
	XvCfXNTFXuS/25Zt6aQ4pT+AwNWAcg8z547UBwPA6NKso4DWDPg3ZpMUCt0e48VocWB9
	FPALnyeOw4e3YWOa8HQax5slUMMC6o+BtTPMs=
Received: by 10.180.76.175 with SMTP id l15mr13548059wiw.67.1320768033976;
	Tue, 08 Nov 2011 08:00:33 -0800 (PST)
Received: from [192.168.1.3] (host86-129-249-120.range86-129.btcentralplus.com.
	[86.129.249.120])
	by mx.google.com with ESMTPS id j5sm1106595wix.20.2011.11.08.08.00.25
	(version=SSLv3 cipher=OTHER); Tue, 08 Nov 2011 08:00:33 -0800 (PST)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Tue, 08 Nov 2011 16:00:19 +0000
Subject: Re: [Xen-devel] [PATCH] x86/cpuidle: clean up hw residencies reading
	code
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CADF0293.33B9A%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] x86/cpuidle: clean up hw residencies reading
	code
Thread-Index: AcyeL4NGr3/EZ6r4pU+HkfvlyG5zHQ==
In-Reply-To: <4EB95B0B020000780005FA38@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 08/11/2011 15:38, "Jan Beulich" <JBeulich@suse.com> wrote:

> Fold redundant code and eliminate pointless casts.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> --- a/xen/arch/x86/acpi/cpu_idle.c
> +++ b/xen/arch/x86/acpi/cpu_idle.c
> @@ -99,13 +99,19 @@ struct hw_residencies
>  static void do_get_hw_residencies(void *arg)
>  {
>      struct cpuinfo_x86 *c = &current_cpu_data;
> -    struct hw_residencies *hw_res = (struct hw_residencies *)arg;
> +    struct hw_residencies *hw_res = arg;
>  
>      if ( c->x86_vendor != X86_VENDOR_INTEL || c->x86 != 6 )
>          return;
>  
>      switch ( c->x86_model )
>      {
> +    /* Sandy bridge */
> +    case 0x2A:
> +    case 0x2D:
> +        GET_PC2_RES(hw_res->pc2);
> +        GET_CC7_RES(hw_res->cc7);
> +        /* fall through */
>      /* Nehalem */
>      case 0x1A:
>      case 0x1E:
> @@ -120,32 +126,22 @@ static void do_get_hw_residencies(void *
>          GET_CC3_RES(hw_res->cc3);
>          GET_CC6_RES(hw_res->cc6);
>          break;
> -    /* Sandy bridge */
> -    case 0x2A:
> -    case 0x2D:
> -        GET_PC2_RES(hw_res->pc2);
> -        GET_PC3_RES(hw_res->pc3);
> -        GET_PC6_RES(hw_res->pc6);
> -        GET_PC7_RES(hw_res->pc7);
> -        GET_CC3_RES(hw_res->cc3);
> -        GET_CC6_RES(hw_res->cc6);
> -        GET_CC7_RES(hw_res->cc7);
> -        break;
>      }
>  }
>  
>  static void get_hw_residencies(uint32_t cpu, struct hw_residencies *hw_res)
>  {
> +    memset(hw_res, 0, sizeof(*hw_res));
> +
>      if ( smp_processor_id() == cpu )
> -        do_get_hw_residencies((void *)hw_res);
> +        do_get_hw_residencies(hw_res);
>      else
> -        on_selected_cpus(cpumask_of(cpu),
> -                         do_get_hw_residencies, (void *)hw_res, 1);
> +        on_selected_cpus(cpumask_of(cpu), do_get_hw_residencies, hw_res, 1);
>  }
>  
>  static void print_hw_residencies(uint32_t cpu)
>  {
> -    struct hw_residencies hw_res = {0};
> +    struct hw_residencies hw_res;
>  
>      get_hw_residencies(cpu, &hw_res);
>  
> @@ -1042,7 +1038,7 @@ int pmstat_get_cx_stat(uint32_t cpuid, s
>      struct acpi_processor_power *power = processor_powers[cpuid];
>      uint64_t usage, res, idle_usage = 0, idle_res = 0;
>      int i;
> -    struct hw_residencies hw_res = {0};
> +    struct hw_residencies hw_res;
>  
>      if ( power == NULL )
>      {
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 08:06:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 08:06:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNoCO-0006iX-A9; Tue, 08 Nov 2011 08:06:56 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNo6O-00062b-16
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 08:00:55 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1320768010!43119581!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8673 invoked from network); 8 Nov 2011 16:00:11 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 16:00:11 -0000
Received: by wwf4 with SMTP id 4so807375wwf.24
	for <xen-devel@lists.xensource.com>;
	Tue, 08 Nov 2011 08:00:40 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=jL/iUQnQT87265CvliNUzUVm+amUnQk6m6kOEyO6XNY=;
	b=r2yaWj9la73ZGIhb3gyLAQn7Fukop6E2zXHpQRP5qHTMG0avMafcXV1GRU/6FZNLIO
	9GDUgqWyylsBA60TALAoNG/gxel3/AJk79znPcuCKZaHEJcFyunIcwFhFXk0Ed7+YRD9
	CC2Pr9MB1UvsBPYIaygsKTYJD+/jyGE4S/+DA=
Received: by 10.181.13.165 with SMTP id ez5mr13983018wid.51.1320768040596;
	Tue, 08 Nov 2011 08:00:40 -0800 (PST)
Received: from [192.168.1.3] (host86-129-249-120.range86-129.btcentralplus.com.
	[86.129.249.120])
	by mx.google.com with ESMTPS id j5sm1106595wix.20.2011.11.08.08.00.35
	(version=SSLv3 cipher=OTHER); Tue, 08 Nov 2011 08:00:39 -0800 (PST)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Tue, 08 Nov 2011 16:00:34 +0000
Subject: Re: [Xen-devel] [PATCH] bump sysctl interface version after c/s
	23995:8943a9696358
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CADF02A2.33B9B%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] bump sysctl interface version after c/s
	23995:8943a9696358
Thread-Index: AcyeL4w3Mjsmh+YRzECIoWG3n/R+OQ==
In-Reply-To: <4EB941FF020000780005F9C0@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: Yang Z Zhang <yang.z.zhang@intel.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 08/11/2011 13:51, "Jan Beulich" <JBeulich@suse.com> wrote:

> That c/s made binary incompatible changes to struct pm_cx_stat.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> --- a/xen/include/public/sysctl.h
> +++ b/xen/include/public/sysctl.h
> @@ -34,7 +34,7 @@
>  #include "xen.h"
>  #include "domctl.h"
>  
> -#define XEN_SYSCTL_INTERFACE_VERSION 0x00000008
> +#define XEN_SYSCTL_INTERFACE_VERSION 0x00000009
>  
>  /*
>   * Read console content from Xen buffer ring.
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 08:09:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 08:09:00 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNoEN-00077G-4w; Tue, 08 Nov 2011 08:08:59 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNo7E-00063p-Ne
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 08:01:42 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1320768093!2734476!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6705 invoked from network); 8 Nov 2011 16:01:33 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-6.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 16:01:33 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 08 Nov 2011 16:01:32 +0000
Message-Id: <4EB9606B020000780005FA5B@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 08 Nov 2011 16:01:31 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Dong Yang Li" <lidongyang@suse.com>
Subject: Re: [Xen-devel] [PATCH] xen-blkback: convert hole punching to
	discard request on loop devices
References: <1320654866-12457-1-git-send-email-lidongyang@novell.com>
In-Reply-To: <1320654866-12457-1-git-send-email-lidongyang@novell.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: lczerner@redhat.com, xen-devel@lists.xensource.com, konrad.wilk@oracle.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 07.11.11 at 09:34, Li Dongyang <lidongyang@novell.com> wrote:
> As of dfaa2ef68e80c378e610e3c8c536f1c239e8d3ef, loop devices support
> discard request now. We could just issue a discard request, and
> the loop driver will punch the hole for us, so we don't need to touch
> the internals of loop device and punch the hole ourselves, Thanks.

Looking at what the loop driver now does - doesn't the original code
here lack support for lo_offset being non-zero then? If so, should we
fix this in pre-3.2 kernels?

Jan

> Signed-off-by: Li Dongyang <lidongyang@novell.com>
> ---
>  drivers/block/xen-blkback/blkback.c |   21 +++------------------
>  1 files changed, 3 insertions(+), 18 deletions(-)
>=20
> diff --git a/drivers/block/xen-blkback/blkback.c=20
> b/drivers/block/xen-blkback/blkback.c
> index 15ec4db..ad365a7 100644
> --- a/drivers/block/xen-blkback/blkback.c
> +++ b/drivers/block/xen-blkback/blkback.c
> @@ -39,9 +39,6 @@
>  #include <linux/list.h>
>  #include <linux/delay.h>
>  #include <linux/freezer.h>
> -#include <linux/loop.h>
> -#include <linux/falloc.h>
> -#include <linux/fs.h>
> =20
>  #include <xen/events.h>
>  #include <xen/page.h>
> @@ -422,25 +419,13 @@ static void xen_blk_discard(struct xen_blkif =
*blkif,=20
> struct blkif_request *req)
>  	int status =3D BLKIF_RSP_OKAY;
>  	struct block_device *bdev =3D blkif->vbd.bdev;
> =20
> -	if (blkif->blk_backend_type =3D=3D BLKIF_BACKEND_PHY)
> -		/* just forward the discard request */
> +	if (blkif->blk_backend_type =3D=3D BLKIF_BACKEND_PHY ||
> +	    blkif->blk_backend_type =3D=3D BLKIF_BACKEND_FILE)
>  		err =3D blkdev_issue_discard(bdev,
>  				req->u.discard.sector_number,
>  				req->u.discard.nr_sectors,
>  				GFP_KERNEL, 0);
> -	else if (blkif->blk_backend_type =3D=3D BLKIF_BACKEND_FILE) {
> -		/* punch a hole in the backing file */
> -		struct loop_device *lo =3D bdev->bd_disk->private_data;
> -		struct file *file =3D lo->lo_backing_file;
> -
> -		if (file->f_op->fallocate)
> -			err =3D file->f_op->fallocate(file,
> -				FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE,=

> -				req->u.discard.sector_number << 9,
> -				req->u.discard.nr_sectors << 9);
> -		else
> -			err =3D -EOPNOTSUPP;
> -	} else
> +	else
>  		err =3D -EOPNOTSUPP;
> =20
>  	if (err =3D=3D -EOPNOTSUPP) {





_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-users-bounces@lists.xensource.com Tue Nov 08 08:17:12 2011
Return-path: <xen-users-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 08:17:12 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNoMI-0007mM-FW; Tue, 08 Nov 2011 08:17:11 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNoJo-0007QH-UG
	for xen-users@lists.xensource.com; Tue, 08 Nov 2011 08:14:38 -0800
X-Env-Sender: andrewpitman@comcast.net
X-Msg-Ref: server-7.tower-21.messagelabs.com!1320768873!3416017!1
X-Originating-IP: [76.96.62.56]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18745 invoked from network); 8 Nov 2011 16:14:33 -0000
Received: from qmta06.westchester.pa.mail.comcast.net (HELO
	qmta06.westchester.pa.mail.comcast.net) (76.96.62.56)
	by server-7.tower-21.messagelabs.com with SMTP;
	8 Nov 2011 16:14:33 -0000
Received: from omta07.westchester.pa.mail.comcast.net ([76.96.62.59])
	by qmta06.westchester.pa.mail.comcast.net with comcast
	id ugCo1h00C1GhbT856gEZPN; Tue, 08 Nov 2011 16:14:33 +0000
Received: from sz0032.wc.mail.comcast.net ([76.96.58.82])
	by omta07.westchester.pa.mail.comcast.net with comcast
	id ugEZ1h00A1mSqQC3TgEZNZ; Tue, 08 Nov 2011 16:14:33 +0000
Date: Tue, 8 Nov 2011 16:14:33 +0000 (UTC)
From: andrewpitman@comcast.net
To: George Dunlap <george.dunlap@eu.citrix.com>
Message-ID: <1138586740.1551436.1320768873221.JavaMail.root@sz0032a.westchester.pa.mail.comcast.net>
In-Reply-To: <4E398EC4.9010705@eu.citrix.com>
Subject: Re: [Xen-devel] Re: [Xen-users] Xen 4.1.1 crash when manipulating
	cpupools.
MIME-Version: 1.0
X-Originating-IP: [216.178.70.8]
X-Mailer: Zimbra 6.0.13_GA_2934 (ZimbraWebClient - FF3.0 (Win)/6.0.13_GA_2934)
Cc: Juergen Gross <juergen.gross@ts.fujitsu.com>, xen-devel@lists.xensource.com,
	xen-users@lists.xensource.com,
	=?utf-8?Q?Pasi_K=C3=A4rkk=C3=A4inen?= <pasik@iki.fi>
X-BeenThere: xen-users@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen user discussion <xen-users.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-users>,
	<mailto:xen-users-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-users@lists.xensource.com>
List-Help: <mailto:xen-users-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-users>,
	<mailto:xen-users-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1100381491=="
Sender: xen-users-bounces@lists.xensource.com
Errors-To: xen-users-bounces@lists.xensource.com

--===============1100381491==
Content-Type: multipart/alternative; 
	boundary="----=_Part_1551435_1391335370.1320768873220"

------=_Part_1551435_1391335370.1320768873220
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

George,=20

Do you know if this was addressed in 4.1.2?=20

Thanks,=20
Andy=20

----- Original Message -----
From: "George Dunlap" <george.dunlap@eu.citrix.com>=20
To: andrewpitman@comcast.net=20
Cc: xen-devel@lists.xensource.com, xen-users@lists.xensource.com, "Pasi K=
=C3=A4rkk=C3=A4inen" <pasik@iki.fi>, "Juergen Gross" <juergen.gross@ts.fuji=
tsu.com>=20
Sent: Wednesday, August 3, 2011 2:09:08 PM=20
Subject: Re: [Xen-devel] Re: [Xen-users] Xen 4.1.1 crash when manipulating =
cpupools.=20

Yes, I'm aware of the crash when setting weight. I've had a quick look, and=
 it's not obvious what the problem is, and I haven't had a chance to look d=
eeper.=20
-George=20

On 08/02/2011 12:44 PM, andrewpitman@comcast.net wrote:=20


George,=20

Thanks, that would be great! It would definitely be useful to have the cred=
it2 scheduler fully support cpupools.=20

One other thing I did notice was that when I try to weight Domain-0 it cras=
hes the hypervisor as well (example: "xm sched-credit2 -d Domain-0 -w 512")=
.=20

Thanks,=20
Andy=20

----- Original Message -----
From: "George Dunlap" <george.dunlap@citrix.com>=20
To: "Juergen Gross" <juergen.gross@ts.fujitsu.com>=20
Cc: "George Dunlap" <George.Dunlap@eu.citrix.com> , xen-devel@lists.xensour=
ce.com , xen-users@lists.xensource.com , "Pasi K=C3=A4rkk=C3=A4inen" <pasik=
@iki.fi> , andrewpitman@comcast.net=20
Sent: Thursday, July 21, 2011 9:47:19 AM=20
Subject: Re: [Xen-devel] Re: [Xen-users] Xen 4.1.1 crash when manipulating =
cpupools.=20

On Thu, 2011-07-21 at 14:15 +0100, Juergen Gross wrote:=20
> I don't think credit2 is supporting cpupools up to now (at least not any =
other=20
> cpupool than Pool-0). George?=20

I think that here were some unfortunate corner cases wrt credit2 +=20
cpupools that I didn't get worked out. In any case, it's certainly not=20
being tested regularly, so it would be no surprise of something broke.=20

I'll take a look at it in the next few [working] days in hope that=20
there's a relatively simple fix.=20

-George=20


_______________________________________________=20
Xen-users mailing list=20
Xen-users@lists.xensource.com=20
http://lists.xensource.com/xen-users=20




------=_Part_1551435_1391335370.1320768873220
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable

<html><head><style type=3D'text/css'>p { margin: 0; }</style></head><body><=
div style=3D'font-family: Arial; font-size: 12pt; color: #000000'>George,<b=
r><br>Do you know if this was addressed in 4.1.2?<br><br>Thanks,<br>Andy<br=
><br><hr id=3D"zwchr"><b>From: </b>"George Dunlap" &lt;george.dunlap@eu.cit=
rix.com&gt;<br><b>To: </b>andrewpitman@comcast.net<br><b>Cc: </b>xen-devel@=
lists.xensource.com, xen-users@lists.xensource.com, "Pasi K=C3=A4rkk=C3=A4i=
nen" &lt;pasik@iki.fi&gt;, "Juergen Gross" &lt;juergen.gross@ts.fujitsu.com=
&gt;<br><b>Sent: </b>Wednesday, August 3, 2011 2:09:08 PM<br><b>Subject: </=
b>Re: [Xen-devel] Re: [Xen-users] Xen 4.1.1 crash when manipulating cpupool=
s.<br><br>

 =20
   =20
 =20
 =20
    Yes, I'm aware of the crash when setting weight.&nbsp; I've had a quick
    look, and it's not obvious what the problem is, and I haven't had a
    chance to look deeper. <br>
    &nbsp;-George<br>
    <br>
    On 08/02/2011 12:44 PM, <a class=3D"moz-txt-link-abbreviated" href=3D"m=
ailto:andrewpitman@comcast.net" target=3D"_blank">andrewpitman@comcast.net<=
/a> wrote:
    <blockquote cite=3D"mid:845913821.111513.1312314276410.JavaMail.root@sz=
0032a.westchester.pa.mail.comcast.net">
      <style>p { margin: 0; }</style>
      <div style=3D"font-family: Arial; font-size: 12pt; color: rgb(0, 0,
        0);">George,<br>
        <br>
        Thanks, that would be great!&nbsp; It would definitely be useful to
        have the credit2 scheduler fully support cpupools.<br>
        <br>
        One other thing I did notice was that when I try to weight
        Domain-0 it crashes the hypervisor as well (example: "xm
        sched-credit2 -d Domain-0 -w 512").<br>
        <br>
        Thanks,<br>
        Andy<br>
        <br>
        <hr id=3D"zwchr"><b>From: </b>"George Dunlap"
        <a class=3D"moz-txt-link-rfc2396E" href=3D"mailto:george.dunlap@cit=
rix.com" target=3D"_blank">&lt;george.dunlap@citrix.com&gt;</a><br>
        <b>To: </b>"Juergen Gross" <a class=3D"moz-txt-link-rfc2396E" href=
=3D"mailto:juergen.gross@ts.fujitsu.com" target=3D"_blank">&lt;juergen.gros=
s@ts.fujitsu.com&gt;</a><br>
        <b>Cc: </b>"George Dunlap" <a class=3D"moz-txt-link-rfc2396E" href=
=3D"mailto:George.Dunlap@eu.citrix.com" target=3D"_blank">&lt;George.Dunlap=
@eu.citrix.com&gt;</a>,
        <a class=3D"moz-txt-link-abbreviated" href=3D"mailto:xen-devel@list=
s.xensource.com" target=3D"_blank">xen-devel@lists.xensource.com</a>, <a cl=
ass=3D"moz-txt-link-abbreviated" href=3D"mailto:xen-users@lists.xensource.c=
om" target=3D"_blank">xen-users@lists.xensource.com</a>,
        "Pasi K=C3=A4rkk=C3=A4inen" <a class=3D"moz-txt-link-rfc2396E" href=
=3D"mailto:pasik@iki.fi" target=3D"_blank">&lt;pasik@iki.fi&gt;</a>, <a cla=
ss=3D"moz-txt-link-abbreviated" href=3D"mailto:andrewpitman@comcast.net" ta=
rget=3D"_blank">andrewpitman@comcast.net</a><br>
        <b>Sent: </b>Thursday, July 21, 2011 9:47:19 AM<br>
        <b>Subject: </b>Re: [Xen-devel] Re: [Xen-users] Xen 4.1.1 crash
        when manipulating&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp=
upools.<br>
        <br>
        On Thu, 2011-07-21 at 14:15 +0100, Juergen Gross wrote:<br>
        &gt; I don't think credit2 is supporting cpupools up to now (at
        least not any other<br>
        &gt; cpupool than Pool-0). George?<br>
        <br>
        I think that here were some unfortunate corner cases wrt credit2
        +<br>
        cpupools that I didn't get worked out. &nbsp;In any case, it's
        certainly not<br>
        being tested regularly, so it would be no surprise of something
        broke.<br>
        <br>
        I'll take a look at it in the next few [working] days in hope
        that<br>
        there's a relatively simple fix.<br>
        <br>
        &nbsp;-George<br>
        <br>
        <br>
        _______________________________________________<br>
        Xen-users mailing list<br>
        <a class=3D"moz-txt-link-abbreviated" href=3D"mailto:Xen-users@list=
s.xensource.com" target=3D"_blank">Xen-users@lists.xensource.com</a><br>
        <a class=3D"moz-txt-link-freetext" href=3D"http://lists.xensource.c=
om/xen-users" target=3D"_blank">http://lists.xensource.com/xen-users</a><br=
>
      </div>
    </blockquote>
    <br>
 =20

</div></body></html>
------=_Part_1551435_1391335370.1320768873220--


--===============1100381491==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-users mailing list
Xen-users@lists.xensource.com
http://lists.xensource.com/xen-users
--===============1100381491==--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 08:21:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 08:21:22 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNoQM-0000J4-73; Tue, 08 Nov 2011 08:21:22 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNoKw-0007Yj-PJ
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 08:15:48 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1320768943!2340168!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30134 invoked from network); 8 Nov 2011 16:15:43 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 16:15:43 -0000
X-IronPort-AV: E=Sophos;i="4.69,477,1315180800"; 
   d="scan'208";a="8822396"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 16:15:32 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 16:15:32 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RNoKh-00033s-O8;
	Tue, 08 Nov 2011 16:15:31 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RNoKh-0000ix-Nr;
	Tue, 08 Nov 2011 16:15:31 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9727-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 8 Nov 2011 16:15:31 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9727: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9727 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9727/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 build-amd64-oldkern           2 host-install(2)              broken
 build-amd64-pvops             2 host-install(2)              broken
 build-amd64                   2 host-install(2)              broken
 test-i386-i386-win            5 xen-boot                   fail REGR. vs. 9661

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pv            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pair          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  be8daf78856a
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Jean Guyader <jean.guyader@eu.citrix.com>
  Juergen Gross <juergen.gross@ts.fujitsu.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
  Wei Wang <wei.wang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  broken  
 build-i386                                                   pass    
 build-amd64-oldkern                                          broken  
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           blocked 
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 blocked 
 test-amd64-i386-xl-credit2                                   blocked 
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               blocked 
 test-amd64-i386-xl-multivcpu                                 blocked 
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         blocked 
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           blocked 
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   blocked 
 test-amd64-i386-xl-win-vcpus1                                blocked 
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          blocked 
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

(No revision log; it would be 469 lines long.)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 08:22:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 08:22:41 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNoRd-0000nU-Me; Tue, 08 Nov 2011 08:22:41 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNoPw-00009W-M3
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 08:20:57 -0800
X-Env-Sender: Paul.Durrant@citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1320769216!56003197!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19092 invoked from network); 8 Nov 2011 16:20:16 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 16:20:16 -0000
X-IronPort-AV: E=Sophos;i="4.69,477,1315180800"; 
   d="scan'208";a="8822521"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 16:20:53 +0000
Received: from LONPMAILBOX01.citrite.net ([10.30.224.161]) by
	LONPMAILMX01.citrite.net ([10.30.203.162]) with mapi; Tue, 8 Nov 2011
	16:20:54 +0000
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, David Markey
	<admin@dmarkey.com>
Date: Tue, 8 Nov 2011 16:20:58 +0000
Subject: RE: [Xen-devel] RE: produce windows compatible dump file from Dom0
Thread-Topic: [Xen-devel] RE: produce windows compatible dump file from Dom0
Thread-Index: AcyeLN3esRwg4EeZSr2MPd3la0q4xQABXNdA
Message-ID: <291EDFCB1E9E224A99088639C4762022B4543AB142@LONPMAILBOX01.citrite.net>
References: <AEC6C66638C05B468B556EA548C1A77D01C558B2@trantor>
	<291EDFCB1E9E224A99088639C47620228D3EDCA57D@LONPMAILBOX01.citrite.net>
	<AEC6C66638C05B468B556EA548C1A77D01C558C1@trantor>
	<BANLkTin1MKmJXTe53SJBHxvw+TYgrEpdpw@mail.gmail.com>
	<AEC6C66638C05B468B556EA548C1A77D01D573FD@trantor>
	<20110526125239.GA7838@dumpdata.com>
	<CANXrN=0E70=AWfyhzUk6N3Rw=oVNqzcmUweCRforKpa3GQG4oQ@mail.gmail.com>
	<20111108154034.GA12849@phenom.dumpdata.com>
In-Reply-To: <20111108154034.GA12849@phenom.dumpdata.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Cc: James Harper <james.harper@bendigoit.com.au>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Can't this now be done using kdd?

  Paul

> -----Original Message-----
> From: Konrad Rzeszutek Wilk [mailto:konrad.wilk@oracle.com]
> Sent: 08 November 2011 15:41
> To: David Markey
> Cc: James Harper; Paul Durrant; xen-devel@lists.xensource.com
> Subject: Re: [Xen-devel] RE: produce windows compatible dump file
> from Dom0
>=20
> On Tue, Nov 08, 2011 at 03:15:10PM +0000, David Markey wrote:
> > Hi Konrad,
> >
> > Sorry for resurrecting,
>=20
> Oh no trouble.
> >
> > Did "the guy" manage to get clearance to release the source for
> this
> > particular project?
>=20
> Uh, I think we lost track of this. Let me poke "the guy".
>=20
> >
> >
> > Thanks!
> >
> > David
> >
> >
> > On 26 May 2011 13:52, Konrad Rzeszutek Wilk
> <konrad.wilk@oracle.com> wrote:
> >
> > > On Wed, May 25, 2011 at 10:16:06PM +1000, James Harper wrote:
> > > > >
> > > > > Hi all,
> > > > >
> > > > > Did anyone make any progress on this?
> > > > >
> > > > > I'm interested in getting a Windows memory dump out of a
> > > > > XenServer
> > > > suspend
> > > > > image.
> > > > >
> > > > > Is it even remotely possible?
> > > > >
> > > >
> > > > Yes. In order for it to work I believe the DomU needs to call
> > > > KeInitializeCrashDumpHeader to place a crash dump header
> inside
> > > > the memory image (eg in NonPagedPool).
> KeInitializeCrashDumpHeader
> > > > is available in 2003sp1 and newer. You can then find that info
> in
> > > > the saved image and use it to build a windows compatible crash
> > > > dump. There is more to it than that obviously and I haven't
> > > > actually done it myself. Ideally it would be possible to do
> 'xl
> > > > wincrashdump -o memory.dmp domu_name' and have it all happen.
> > > >
> > > > I've BCC'd the guy who wrote a program to do it to see if he
> can
> > > > share it (hope he doesn't mind :)
> > >
> > > I am not "the guy", and while "the guy" is working on getting a
> > > blanket OK to release the source (or executable), let me give
> you
> > > some of the technical details in case you feel inspired to write
> this yourself.
> > >
> > > The process in making a dumpconverter involves finding the
> windows
> > > dump header in memory and putting it at the beginning of the
> output
> > > file, then taking the raw domain dump and writing it as is
> except
> > > that the following two ranges need to be skipped - which can
> vary
> > > from system to system:
> > >   1) the ELF header (by default the first 6 pages of the raw
> dump)
> > >   2) a range which might be BIOS, which by default in the tool
> is set to
> > >      pages 0x9F to 0xDF.
> > >
> > > Good luck!
> > >

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 08:27:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 08:27:03 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNoVr-0001E7-7W; Tue, 08 Nov 2011 08:27:03 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNoVH-00011f-Et
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 08:26:27 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1320769583!3362759!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32257 invoked from network); 8 Nov 2011 16:26:24 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-2.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 8 Nov 2011 16:26:24 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA8GQLfl026209
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 8 Nov 2011 16:26:22 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA8GQKBV026798
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 8 Nov 2011 16:26:21 GMT
Received: from abhmt119.oracle.com (abhmt119.oracle.com [141.146.116.71])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA8GQF11011058; Tue, 8 Nov 2011 10:26:15 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 08 Nov 2011 08:26:15 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 4907081415; Tue,  8 Nov 2011 11:26:14 -0500 (EST)
Date: Tue, 8 Nov 2011 11:26:14 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Li Dongyang <lidongyang@novell.com>
Subject: Re: [Xen-devel] [PATCH] xen-blkback: convert hole punching to
	discard request on loop devices
Message-ID: <20111108162614.GA18361@phenom.dumpdata.com>
References: <1320654866-12457-1-git-send-email-lidongyang@novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1320654866-12457-1-git-send-email-lidongyang@novell.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090204.4EB9582E.00F5,ss=1,re=0.000,fgs=0
Cc: lczerner@redhat.com, xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 07, 2011 at 04:34:26PM +0800, Li Dongyang wrote:
> As of dfaa2ef68e80c378e610e3c8c536f1c239e8d3ef, loop devices support
> discard request now. We could just issue a discard request, and
> the loop driver will punch the hole for us, so we don't need to touch
> the internals of loop device and punch the hole ourselves, Thanks.

Can I ask you to do two things:
 1). Look in whether we can just eliminate the BLKIF_BACKEND_FILE altogether?
 2). Rebase this on top #devel/for-jens-3.3 (git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git)

Thanks!
> 
> Signed-off-by: Li Dongyang <lidongyang@novell.com>
> ---
>  drivers/block/xen-blkback/blkback.c |   21 +++------------------
>  1 files changed, 3 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
> index 15ec4db..ad365a7 100644
> --- a/drivers/block/xen-blkback/blkback.c
> +++ b/drivers/block/xen-blkback/blkback.c
> @@ -39,9 +39,6 @@
>  #include <linux/list.h>
>  #include <linux/delay.h>
>  #include <linux/freezer.h>
> -#include <linux/loop.h>
> -#include <linux/falloc.h>
> -#include <linux/fs.h>
>  
>  #include <xen/events.h>
>  #include <xen/page.h>
> @@ -422,25 +419,13 @@ static void xen_blk_discard(struct xen_blkif *blkif, struct blkif_request *req)
>  	int status = BLKIF_RSP_OKAY;
>  	struct block_device *bdev = blkif->vbd.bdev;
>  
> -	if (blkif->blk_backend_type == BLKIF_BACKEND_PHY)
> -		/* just forward the discard request */
> +	if (blkif->blk_backend_type == BLKIF_BACKEND_PHY ||
> +	    blkif->blk_backend_type == BLKIF_BACKEND_FILE)
>  		err = blkdev_issue_discard(bdev,
>  				req->u.discard.sector_number,
>  				req->u.discard.nr_sectors,
>  				GFP_KERNEL, 0);
> -	else if (blkif->blk_backend_type == BLKIF_BACKEND_FILE) {
> -		/* punch a hole in the backing file */
> -		struct loop_device *lo = bdev->bd_disk->private_data;
> -		struct file *file = lo->lo_backing_file;
> -
> -		if (file->f_op->fallocate)
> -			err = file->f_op->fallocate(file,
> -				FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE,
> -				req->u.discard.sector_number << 9,
> -				req->u.discard.nr_sectors << 9);
> -		else
> -			err = -EOPNOTSUPP;
> -	} else
> +	else
>  		err = -EOPNOTSUPP;
>  
>  	if (err == -EOPNOTSUPP) {
> -- 
> 1.7.7
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 08:29:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 08:29:16 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNoY0-0001ch-2Y; Tue, 08 Nov 2011 08:29:16 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNoXO-0001Ph-2x
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 08:28:38 -0800
X-Env-Sender: admin@dmarkey.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1320769713!2733641!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15361 invoked from network); 8 Nov 2011 16:28:34 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-4.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 16:28:34 -0000
Received: by vcbfk13 with SMTP id fk13so743628vcb.30
	for <xen-devel@lists.xensource.com>;
	Tue, 08 Nov 2011 08:28:33 -0800 (PST)
MIME-Version: 1.0
Received: by 10.68.24.234 with SMTP id x10mr1799710pbf.97.1320769713093; Tue,
	08 Nov 2011 08:28:33 -0800 (PST)
Received: by 10.142.180.4 with HTTP; Tue, 8 Nov 2011 08:28:32 -0800 (PST)
In-Reply-To: <291EDFCB1E9E224A99088639C4762022B4543AB142@LONPMAILBOX01.citrite.net>
References: <AEC6C66638C05B468B556EA548C1A77D01C558B2@trantor>
	<291EDFCB1E9E224A99088639C47620228D3EDCA57D@LONPMAILBOX01.citrite.net>
	<AEC6C66638C05B468B556EA548C1A77D01C558C1@trantor>
	<BANLkTin1MKmJXTe53SJBHxvw+TYgrEpdpw@mail.gmail.com>
	<AEC6C66638C05B468B556EA548C1A77D01D573FD@trantor>
	<20110526125239.GA7838@dumpdata.com>
	<CANXrN=0E70=AWfyhzUk6N3Rw=oVNqzcmUweCRforKpa3GQG4oQ@mail.gmail.com>
	<20111108154034.GA12849@phenom.dumpdata.com>
	<291EDFCB1E9E224A99088639C4762022B4543AB142@LONPMAILBOX01.citrite.net>
Date: Tue, 8 Nov 2011 16:28:32 +0000
Message-ID: <CANXrN=1Lno3WKxaQ=7QkV5W_ieRdSCPXsUoL4to+_7AL6GHYWA@mail.gmail.com>
Subject: Re: [Xen-devel] RE: produce windows compatible dump file from Dom0
From: David Markey <admin@dmarkey.com>
To: Paul Durrant <Paul.Durrant@citrix.com>
Cc: James Harper <james.harper@bendigoit.com.au>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: admin@dmarkey.com
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0319183751=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0319183751==
Content-Type: multipart/alternative; boundary=bcaec520e6c3943c5e04b13ba958

--bcaec520e6c3943c5e04b13ba958
Content-Type: text/plain; charset=ISO-8859-1

Kdd is for live debugging,(I thought)

I'm looking to specifically convert a VM save image(i,e, after suspend)
into a WinDBG compatible image.

It looked like the utility Konrad spoke of could have achieved this.

David



On 8 November 2011 16:20, Paul Durrant <Paul.Durrant@citrix.com> wrote:

> Can't this now be done using kdd?
>
>  Paul
>
> > -----Original Message-----
> > From: Konrad Rzeszutek Wilk [mailto:konrad.wilk@oracle.com]
> > Sent: 08 November 2011 15:41
> > To: David Markey
> > Cc: James Harper; Paul Durrant; xen-devel@lists.xensource.com
> > Subject: Re: [Xen-devel] RE: produce windows compatible dump file
> > from Dom0
> >
> > On Tue, Nov 08, 2011 at 03:15:10PM +0000, David Markey wrote:
> > > Hi Konrad,
> > >
> > > Sorry for resurrecting,
> >
> > Oh no trouble.
> > >
> > > Did "the guy" manage to get clearance to release the source for
> > this
> > > particular project?
> >
> > Uh, I think we lost track of this. Let me poke "the guy".
> >
> > >
> > >
> > > Thanks!
> > >
> > > David
> > >
> > >
> > > On 26 May 2011 13:52, Konrad Rzeszutek Wilk
> > <konrad.wilk@oracle.com> wrote:
> > >
> > > > On Wed, May 25, 2011 at 10:16:06PM +1000, James Harper wrote:
> > > > > >
> > > > > > Hi all,
> > > > > >
> > > > > > Did anyone make any progress on this?
> > > > > >
> > > > > > I'm interested in getting a Windows memory dump out of a
> > > > > > XenServer
> > > > > suspend
> > > > > > image.
> > > > > >
> > > > > > Is it even remotely possible?
> > > > > >
> > > > >
> > > > > Yes. In order for it to work I believe the DomU needs to call
> > > > > KeInitializeCrashDumpHeader to place a crash dump header
> > inside
> > > > > the memory image (eg in NonPagedPool).
> > KeInitializeCrashDumpHeader
> > > > > is available in 2003sp1 and newer. You can then find that info
> > in
> > > > > the saved image and use it to build a windows compatible crash
> > > > > dump. There is more to it than that obviously and I haven't
> > > > > actually done it myself. Ideally it would be possible to do
> > 'xl
> > > > > wincrashdump -o memory.dmp domu_name' and have it all happen.
> > > > >
> > > > > I've BCC'd the guy who wrote a program to do it to see if he
> > can
> > > > > share it (hope he doesn't mind :)
> > > >
> > > > I am not "the guy", and while "the guy" is working on getting a
> > > > blanket OK to release the source (or executable), let me give
> > you
> > > > some of the technical details in case you feel inspired to write
> > this yourself.
> > > >
> > > > The process in making a dumpconverter involves finding the
> > windows
> > > > dump header in memory and putting it at the beginning of the
> > output
> > > > file, then taking the raw domain dump and writing it as is
> > except
> > > > that the following two ranges need to be skipped - which can
> > vary
> > > > from system to system:
> > > >   1) the ELF header (by default the first 6 pages of the raw
> > dump)
> > > >   2) a range which might be BIOS, which by default in the tool
> > is set to
> > > >      pages 0x9F to 0xDF.
> > > >
> > > > Good luck!
> > > >
>

--bcaec520e6c3943c5e04b13ba958
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<div><br></div><div>Kdd is for live debugging,(I thought)</div><div><br></d=
iv><div>I&#39;m looking to=A0specifically=A0convert a VM save image(i,e, af=
ter suspend) into a WinDBG compatible image.</div><div><br></div><div>It lo=
oked like the utility Konrad spoke of could have achieved this.</div>
<div><br></div><div>David</div><div><br></div><div><br><br><div class=3D"gm=
ail_quote">On 8 November 2011 16:20, Paul Durrant <span dir=3D"ltr">&lt;<a =
href=3D"mailto:Paul.Durrant@citrix.com">Paul.Durrant@citrix.com</a>&gt;</sp=
an> wrote:<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex;">Can&#39;t this now be done using kdd?<br>
<span class=3D"HOEnZb"><font color=3D"#888888"><br>
 =A0Paul<br>
</font></span><div class=3D"im HOEnZb"><br>
&gt; -----Original Message-----<br>
&gt; From: Konrad Rzeszutek Wilk [mailto:<a href=3D"mailto:konrad.wilk@orac=
le.com">konrad.wilk@oracle.com</a>]<br>
&gt; Sent: 08 November 2011 15:41<br>
&gt; To: David Markey<br>
&gt; Cc: James Harper; Paul Durrant; <a href=3D"mailto:xen-devel@lists.xens=
ource.com">xen-devel@lists.xensource.com</a><br>
&gt; Subject: Re: [Xen-devel] RE: produce windows compatible dump file<br>
&gt; from Dom0<br>
&gt;<br>
</div><div class=3D"HOEnZb"><div class=3D"h5">&gt; On Tue, Nov 08, 2011 at =
03:15:10PM +0000, David Markey wrote:<br>
&gt; &gt; Hi Konrad,<br>
&gt; &gt;<br>
&gt; &gt; Sorry for resurrecting,<br>
&gt;<br>
&gt; Oh no trouble.<br>
&gt; &gt;<br>
&gt; &gt; Did &quot;the guy&quot; manage to get clearance to release the so=
urce for<br>
&gt; this<br>
&gt; &gt; particular project?<br>
&gt;<br>
&gt; Uh, I think we lost track of this. Let me poke &quot;the guy&quot;.<br=
>
&gt;<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; Thanks!<br>
&gt; &gt;<br>
&gt; &gt; David<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; On 26 May 2011 13:52, Konrad Rzeszutek Wilk<br>
&gt; &lt;<a href=3D"mailto:konrad.wilk@oracle.com">konrad.wilk@oracle.com</=
a>&gt; wrote:<br>
&gt; &gt;<br>
&gt; &gt; &gt; On Wed, May 25, 2011 at 10:16:06PM +1000, James Harper wrote=
:<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; Hi all,<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; Did anyone make any progress on this?<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; I&#39;m interested in getting a Windows memory dum=
p out of a<br>
&gt; &gt; &gt; &gt; &gt; XenServer<br>
&gt; &gt; &gt; &gt; suspend<br>
&gt; &gt; &gt; &gt; &gt; image.<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; Is it even remotely possible?<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; Yes. In order for it to work I believe the DomU needs t=
o call<br>
&gt; &gt; &gt; &gt; KeInitializeCrashDumpHeader to place a crash dump heade=
r<br>
&gt; inside<br>
&gt; &gt; &gt; &gt; the memory image (eg in NonPagedPool).<br>
&gt; KeInitializeCrashDumpHeader<br>
&gt; &gt; &gt; &gt; is available in 2003sp1 and newer. You can then find th=
at info<br>
&gt; in<br>
&gt; &gt; &gt; &gt; the saved image and use it to build a windows compatibl=
e crash<br>
&gt; &gt; &gt; &gt; dump. There is more to it than that obviously and I hav=
en&#39;t<br>
&gt; &gt; &gt; &gt; actually done it myself. Ideally it would be possible t=
o do<br>
&gt; &#39;xl<br>
&gt; &gt; &gt; &gt; wincrashdump -o memory.dmp domu_name&#39; and have it a=
ll happen.<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; I&#39;ve BCC&#39;d the guy who wrote a program to do it=
 to see if he<br>
&gt; can<br>
&gt; &gt; &gt; &gt; share it (hope he doesn&#39;t mind :)<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; I am not &quot;the guy&quot;, and while &quot;the guy&quot; =
is working on getting a<br>
&gt; &gt; &gt; blanket OK to release the source (or executable), let me giv=
e<br>
&gt; you<br>
&gt; &gt; &gt; some of the technical details in case you feel inspired to w=
rite<br>
&gt; this yourself.<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; The process in making a dumpconverter involves finding the<b=
r>
&gt; windows<br>
&gt; &gt; &gt; dump header in memory and putting it at the beginning of the=
<br>
&gt; output<br>
&gt; &gt; &gt; file, then taking the raw domain dump and writing it as is<b=
r>
&gt; except<br>
&gt; &gt; &gt; that the following two ranges need to be skipped - which can=
<br>
&gt; vary<br>
&gt; &gt; &gt; from system to system:<br>
&gt; &gt; &gt; =A0 1) the ELF header (by default the first 6 pages of the r=
aw<br>
&gt; dump)<br>
&gt; &gt; &gt; =A0 2) a range which might be BIOS, which by default in the =
tool<br>
&gt; is set to<br>
&gt; &gt; &gt; =A0 =A0 =A0pages 0x9F to 0xDF.<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; Good luck!<br>
&gt; &gt; &gt;<br>
</div></div></blockquote></div><br></div>

--bcaec520e6c3943c5e04b13ba958--


--===============0319183751==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0319183751==--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 08:49:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 08:49:30 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNorZ-0002OI-Sr; Tue, 08 Nov 2011 08:49:30 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNoqq-0002BB-Al
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 08:48:44 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1320770919!2365737!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17001 invoked from network); 8 Nov 2011 16:48:41 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-2.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 8 Nov 2011 16:48:41 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA8GmWHC017815
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 8 Nov 2011 16:48:34 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA8GmTAD009405
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 8 Nov 2011 16:48:30 GMT
Received: from abhmt106.oracle.com (abhmt106.oracle.com [141.146.116.58])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA8GmMEg031086; Tue, 8 Nov 2011 10:48:22 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 08 Nov 2011 08:48:21 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 4042281415; Tue,  8 Nov 2011 11:48:20 -0500 (EST)
Date: Tue, 8 Nov 2011 11:48:20 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: zhenzhong.duan@oracle.com,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Message-ID: <20111108164820.GA30802@phenom.dumpdata.com>
References: <1319779739-19300-1-git-send-email-zhenzhong.duan@oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319779739-19300-1-git-send-email-zhenzhong.duan@oracle.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090209.4EB95D63.0106,ss=1,re=0.000,fgs=0
Cc: jeremy@goop.org, xen-devel@lists.xensource.com, joe.jin@oracle.com,
	linux-x86_64@vger.kernel.org, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] Re: [PATCH] enable pvhvm vcpu placement in kernel
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Oct 27, 2011 at 10:28:59PM -0700, zhenzhong.duan@oracle.com wrote:
> pvhvm running with more than 32 vcpus and pv_irq/pv_time enabled 
> need vcpu placement to work, or else it will softlockup.

Stefano?

> 
> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@oracle.com>
> ---
> diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
> index da8afd5..1f92865 100644
> --- a/arch/x86/xen/enlighten.c
> +++ b/arch/x86/xen/enlighten.c
> @@ -1356,7 +1356,7 @@ static int __cpuinit xen_hvm_cpu_notify(struct notifier_block *self,
>  	int cpu = (long)hcpu;
>  	switch (action) {
>  	case CPU_UP_PREPARE:
> -		per_cpu(xen_vcpu, cpu) = &HYPERVISOR_shared_info->vcpu_info[cpu];
> +		xen_vcpu_setup(cpu);
>  		if (xen_have_vector_callback)
>  			xen_init_lock_cpu(cpu);
>  		break;
> @@ -1386,7 +1386,6 @@ static void __init xen_hvm_guest_init(void)
>  	xen_hvm_smp_init();
>  	register_cpu_notifier(&xen_hvm_cpu_notifier);
>  	xen_unplug_emulated_devices();
> -	have_vcpu_info_placement = 0;
>  	x86_init.irqs.intr_init = xen_init_IRQ;
>  	xen_hvm_init_time_ops();
>  	xen_hvm_init_mmu_ops();

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 08:50:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 08:50:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNosw-0002nC-A0; Tue, 08 Nov 2011 08:50:54 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNoqt-0002BH-QT
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 08:48:50 -0800
X-Env-Sender: Paul.Durrant@citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1320770924!2337721!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26198 invoked from network); 8 Nov 2011 16:48:44 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 16:48:44 -0000
X-IronPort-AV: E=Sophos;i="4.69,477,1315180800"; d="scan'208,217";a="8823208"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 16:48:44 +0000
Received: from LONPMAILBOX01.citrite.net ([10.30.224.161]) by
	LONPMAILMX01.citrite.net ([10.30.203.162]) with mapi; Tue, 8 Nov 2011
	16:48:44 +0000
From: Paul Durrant <Paul.Durrant@citrix.com>
To: "admin@dmarkey.com" <admin@dmarkey.com>
Date: Tue, 8 Nov 2011 16:48:47 +0000
Subject: RE: [Xen-devel] RE: produce windows compatible dump file from Dom0
Thread-Topic: [Xen-devel] RE: produce windows compatible dump file from Dom0
Thread-Index: AcyeM45RzbtIMYRFS2qoZLhB5F83uwAAm7JA
Message-ID: <291EDFCB1E9E224A99088639C4762022B4543AB147@LONPMAILBOX01.citrite.net>
References: <AEC6C66638C05B468B556EA548C1A77D01C558B2@trantor>
	<291EDFCB1E9E224A99088639C47620228D3EDCA57D@LONPMAILBOX01.citrite.net>
	<AEC6C66638C05B468B556EA548C1A77D01C558C1@trantor>
	<BANLkTin1MKmJXTe53SJBHxvw+TYgrEpdpw@mail.gmail.com>
	<AEC6C66638C05B468B556EA548C1A77D01D573FD@trantor>
	<20110526125239.GA7838@dumpdata.com>
	<CANXrN=0E70=AWfyhzUk6N3Rw=oVNqzcmUweCRforKpa3GQG4oQ@mail.gmail.com>
	<20111108154034.GA12849@phenom.dumpdata.com>
	<291EDFCB1E9E224A99088639C4762022B4543AB142@LONPMAILBOX01.citrite.net>
	<CANXrN=1Lno3WKxaQ=7QkV5W_ieRdSCPXsUoL4to+_7AL6GHYWA@mail.gmail.com>
In-Reply-To: <CANXrN=1Lno3WKxaQ=7QkV5W_ieRdSCPXsUoL4to+_7AL6GHYWA@mail.gmail.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
MIME-Version: 1.0
Cc: James Harper <james.harper@bendigoit.com.au>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1484638869=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1484638869==
Content-Language: en-US
Content-Type: multipart/alternative;
	boundary="_000_291EDFCB1E9E224A99088639C4762022B4543AB147LONPMAILBOX01_"

--_000_291EDFCB1E9E224A99088639C4762022B4543AB147LONPMAILBOX01_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

Ah, you want to convert a save image. Kdd could be modified to talk to a sa=
ve image rather than a live VM (which is something I want to do at some sta=
ge, but it's way down my priority list). It would be kind of a shame to hav=
e to rely on something in the guest rather than a purely external solution =
(which kdd offers).

  Paul

From: David Markey [mailto:admin@dmarkey.com]
Sent: 08 November 2011 16:29
To: Paul Durrant
Cc: Konrad Rzeszutek Wilk; James Harper; xen-devel@lists.xensource.com
Subject: Re: [Xen-devel] RE: produce windows compatible dump file from Dom0


Kdd is for live debugging,(I thought)

I'm looking to specifically convert a VM save image(i,e, after suspend) int=
o a WinDBG compatible image.

It looked like the utility Konrad spoke of could have achieved this.

David


On 8 November 2011 16:20, Paul Durrant <Paul.Durrant@citrix.com<mailto:Paul=
.Durrant@citrix.com>> wrote:
Can't this now be done using kdd?

 Paul

> -----Original Message-----
> From: Konrad Rzeszutek Wilk [mailto:konrad.wilk@oracle.com<mailto:konrad.=
wilk@oracle.com>]
> Sent: 08 November 2011 15:41
> To: David Markey
> Cc: James Harper; Paul Durrant; xen-devel@lists.xensource.com<mailto:xen-=
devel@lists.xensource.com>
> Subject: Re: [Xen-devel] RE: produce windows compatible dump file
> from Dom0
>
> On Tue, Nov 08, 2011 at 03:15:10PM +0000, David Markey wrote:
> > Hi Konrad,
> >
> > Sorry for resurrecting,
>
> Oh no trouble.
> >
> > Did "the guy" manage to get clearance to release the source for
> this
> > particular project?
>
> Uh, I think we lost track of this. Let me poke "the guy".
>
> >
> >
> > Thanks!
> >
> > David
> >
> >
> > On 26 May 2011 13:52, Konrad Rzeszutek Wilk
> <konrad.wilk@oracle.com<mailto:konrad.wilk@oracle.com>> wrote:
> >
> > > On Wed, May 25, 2011 at 10:16:06PM +1000, James Harper wrote:
> > > > >
> > > > > Hi all,
> > > > >
> > > > > Did anyone make any progress on this?
> > > > >
> > > > > I'm interested in getting a Windows memory dump out of a
> > > > > XenServer
> > > > suspend
> > > > > image.
> > > > >
> > > > > Is it even remotely possible?
> > > > >
> > > >
> > > > Yes. In order for it to work I believe the DomU needs to call
> > > > KeInitializeCrashDumpHeader to place a crash dump header
> inside
> > > > the memory image (eg in NonPagedPool).
> KeInitializeCrashDumpHeader
> > > > is available in 2003sp1 and newer. You can then find that info
> in
> > > > the saved image and use it to build a windows compatible crash
> > > > dump. There is more to it than that obviously and I haven't
> > > > actually done it myself. Ideally it would be possible to do
> 'xl
> > > > wincrashdump -o memory.dmp domu_name' and have it all happen.
> > > >
> > > > I've BCC'd the guy who wrote a program to do it to see if he
> can
> > > > share it (hope he doesn't mind :)
> > >
> > > I am not "the guy", and while "the guy" is working on getting a
> > > blanket OK to release the source (or executable), let me give
> you
> > > some of the technical details in case you feel inspired to write
> this yourself.
> > >
> > > The process in making a dumpconverter involves finding the
> windows
> > > dump header in memory and putting it at the beginning of the
> output
> > > file, then taking the raw domain dump and writing it as is
> except
> > > that the following two ranges need to be skipped - which can
> vary
> > > from system to system:
> > >   1) the ELF header (by default the first 6 pages of the raw
> dump)
> > >   2) a range which might be BIOS, which by default in the tool
> is set to
> > >      pages 0x9F to 0xDF.
> > >
> > > Good luck!
> > >


--_000_291EDFCB1E9E224A99088639C4762022B4543AB147LONPMAILBOX01_
Content-Type: text/html; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

<html xmlns:v=3D"urn:schemas-microsoft-com:vml" xmlns:o=3D"urn:schemas-micr=
osoft-com:office:office" xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
xmlns:m=3D"http://schemas.microsoft.com/office/2004/12/omml" xmlns=3D"http:=
//www.w3.org/TR/REC-html40"><head><meta http-equiv=3DContent-Type content=
=3D"text/html; charset=3Dus-ascii"><meta name=3DGenerator content=3D"Micros=
oft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
	{font-family:Tahoma;
	panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
	{font-family:"Lucida Console";
	panose-1:2 11 6 9 4 5 4 2 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0cm;
	margin-bottom:.0001pt;
	font-size:12.0pt;
	font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
	{mso-style-priority:99;
	color:blue;
	text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
	{mso-style-priority:99;
	color:purple;
	text-decoration:underline;}
span.hoenzb
	{mso-style-name:hoenzb;}
span.EmailStyle18
	{mso-style-type:personal-reply;
	font-family:"Lucida Console";
	color:#1F497D;
	font-weight:normal;
	font-style:normal;
	text-decoration:none none;}
.MsoChpDefault
	{mso-style-type:export-only;
	font-family:"Calibri","sans-serif";
	mso-fareast-language:EN-US;}
@page WordSection1
	{size:612.0pt 792.0pt;
	margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
	{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext=3D"edit" spidmax=3D"1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext=3D"edit">
<o:idmap v:ext=3D"edit" data=3D"1" />
</o:shapelayout></xml><![endif]--></head><body lang=3DEN-GB link=3Dblue vli=
nk=3Dpurple><div class=3DWordSection1><p class=3DMsoNormal><span style=3D'f=
ont-size:8.0pt;font-family:"Lucida Console";color:#1F497D'>Ah, you want to =
convert a save image. Kdd could be modified to talk to a save image rather =
than a live VM (which is something I want to do at some stage, but it&#8217=
;s way down my priority list). It would be kind of a shame to have to rely =
on something in the guest rather than a purely external solution (which kdd=
 offers).<o:p></o:p></span></p><p class=3DMsoNormal><span style=3D'font-siz=
e:8.0pt;font-family:"Lucida Console";color:#1F497D'><o:p>&nbsp;</o:p></span=
></p><p class=3DMsoNormal><span style=3D'font-size:8.0pt;font-family:"Lucid=
a Console";color:#1F497D'>&nbsp; Paul<o:p></o:p></span></p><p class=3DMsoNo=
rmal><span style=3D'font-size:8.0pt;font-family:"Lucida Console";color:#1F4=
97D'><o:p>&nbsp;</o:p></span></p><div style=3D'border:none;border-left:soli=
d blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'><div><div style=3D'border:none;bord=
er-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=3DMsoNormal>=
<b><span lang=3DEN-US style=3D'font-size:10.0pt;font-family:"Tahoma","sans-=
serif"'>From:</span></b><span lang=3DEN-US style=3D'font-size:10.0pt;font-f=
amily:"Tahoma","sans-serif"'> David Markey [mailto:admin@dmarkey.com] <br><=
b>Sent:</b> 08 November 2011 16:29<br><b>To:</b> Paul Durrant<br><b>Cc:</b>=
 Konrad Rzeszutek Wilk; James Harper; xen-devel@lists.xensource.com<br><b>S=
ubject:</b> Re: [Xen-devel] RE: produce windows compatible dump file from D=
om0<o:p></o:p></span></p></div></div><p class=3DMsoNormal><o:p>&nbsp;</o:p>=
</p><div><p class=3DMsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=3DMs=
oNormal>Kdd is for live debugging,(I thought)<o:p></o:p></p></div><div><p c=
lass=3DMsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=3DMsoNormal>I'm l=
ooking to&nbsp;specifically&nbsp;convert a VM save image(i,e, after suspend=
) into a WinDBG compatible image.<o:p></o:p></p></div><div><p class=3DMsoNo=
rmal><o:p>&nbsp;</o:p></p></div><div><p class=3DMsoNormal>It looked like th=
e utility Konrad spoke of could have achieved this.<o:p></o:p></p></div><di=
v><p class=3DMsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=3DMsoNormal=
>David<o:p></o:p></p></div><div><p class=3DMsoNormal><o:p>&nbsp;</o:p></p><=
/div><div><p class=3DMsoNormal style=3D'margin-bottom:12.0pt'><o:p>&nbsp;</=
o:p></p><div><p class=3DMsoNormal>On 8 November 2011 16:20, Paul Durrant &l=
t;<a href=3D"mailto:Paul.Durrant@citrix.com">Paul.Durrant@citrix.com</a>&gt=
; wrote:<o:p></o:p></p><p class=3DMsoNormal>Can't this now be done using kd=
d?<br><span style=3D'color:#888888'><br><span class=3Dhoenzb>&nbsp;Paul</sp=
an></span><o:p></o:p></p><div><p class=3DMsoNormal><br>&gt; -----Original M=
essage-----<br>&gt; From: Konrad Rzeszutek Wilk [mailto:<a href=3D"mailto:k=
onrad.wilk@oracle.com">konrad.wilk@oracle.com</a>]<br>&gt; Sent: 08 Novembe=
r 2011 15:41<br>&gt; To: David Markey<br>&gt; Cc: James Harper; Paul Durran=
t; <a href=3D"mailto:xen-devel@lists.xensource.com">xen-devel@lists.xensour=
ce.com</a><br>&gt; Subject: Re: [Xen-devel] RE: produce windows compatible =
dump file<br>&gt; from Dom0<br>&gt;<o:p></o:p></p></div><div><div><p class=
=3DMsoNormal>&gt; On Tue, Nov 08, 2011 at 03:15:10PM +0000, David Markey wr=
ote:<br>&gt; &gt; Hi Konrad,<br>&gt; &gt;<br>&gt; &gt; Sorry for resurrecti=
ng,<br>&gt;<br>&gt; Oh no trouble.<br>&gt; &gt;<br>&gt; &gt; Did &quot;the =
guy&quot; manage to get clearance to release the source for<br>&gt; this<br=
>&gt; &gt; particular project?<br>&gt;<br>&gt; Uh, I think we lost track of=
 this. Let me poke &quot;the guy&quot;.<br>&gt;<br>&gt; &gt;<br>&gt; &gt;<b=
r>&gt; &gt; Thanks!<br>&gt; &gt;<br>&gt; &gt; David<br>&gt; &gt;<br>&gt; &g=
t;<br>&gt; &gt; On 26 May 2011 13:52, Konrad Rzeszutek Wilk<br>&gt; &lt;<a =
href=3D"mailto:konrad.wilk@oracle.com">konrad.wilk@oracle.com</a>&gt; wrote=
:<br>&gt; &gt;<br>&gt; &gt; &gt; On Wed, May 25, 2011 at 10:16:06PM +1000, =
James Harper wrote:<br>&gt; &gt; &gt; &gt; &gt;<br>&gt; &gt; &gt; &gt; &gt;=
 Hi all,<br>&gt; &gt; &gt; &gt; &gt;<br>&gt; &gt; &gt; &gt; &gt; Did anyone=
 make any progress on this?<br>&gt; &gt; &gt; &gt; &gt;<br>&gt; &gt; &gt; &=
gt; &gt; I'm interested in getting a Windows memory dump out of a<br>&gt; &=
gt; &gt; &gt; &gt; XenServer<br>&gt; &gt; &gt; &gt; suspend<br>&gt; &gt; &g=
t; &gt; &gt; image.<br>&gt; &gt; &gt; &gt; &gt;<br>&gt; &gt; &gt; &gt; &gt;=
 Is it even remotely possible?<br>&gt; &gt; &gt; &gt; &gt;<br>&gt; &gt; &gt=
; &gt;<br>&gt; &gt; &gt; &gt; Yes. In order for it to work I believe the Do=
mU needs to call<br>&gt; &gt; &gt; &gt; KeInitializeCrashDumpHeader to plac=
e a crash dump header<br>&gt; inside<br>&gt; &gt; &gt; &gt; the memory imag=
e (eg in NonPagedPool).<br>&gt; KeInitializeCrashDumpHeader<br>&gt; &gt; &g=
t; &gt; is available in 2003sp1 and newer. You can then find that info<br>&=
gt; in<br>&gt; &gt; &gt; &gt; the saved image and use it to build a windows=
 compatible crash<br>&gt; &gt; &gt; &gt; dump. There is more to it than tha=
t obviously and I haven't<br>&gt; &gt; &gt; &gt; actually done it myself. I=
deally it would be possible to do<br>&gt; 'xl<br>&gt; &gt; &gt; &gt; wincra=
shdump -o memory.dmp domu_name' and have it all happen.<br>&gt; &gt; &gt; &=
gt;<br>&gt; &gt; &gt; &gt; I've BCC'd the guy who wrote a program to do it =
to see if he<br>&gt; can<br>&gt; &gt; &gt; &gt; share it (hope he doesn't m=
ind :)<br>&gt; &gt; &gt;<br>&gt; &gt; &gt; I am not &quot;the guy&quot;, an=
d while &quot;the guy&quot; is working on getting a<br>&gt; &gt; &gt; blank=
et OK to release the source (or executable), let me give<br>&gt; you<br>&gt=
; &gt; &gt; some of the technical details in case you feel inspired to writ=
e<br>&gt; this yourself.<br>&gt; &gt; &gt;<br>&gt; &gt; &gt; The process in=
 making a dumpconverter involves finding the<br>&gt; windows<br>&gt; &gt; &=
gt; dump header in memory and putting it at the beginning of the<br>&gt; ou=
tput<br>&gt; &gt; &gt; file, then taking the raw domain dump and writing it=
 as is<br>&gt; except<br>&gt; &gt; &gt; that the following two ranges need =
to be skipped - which can<br>&gt; vary<br>&gt; &gt; &gt; from system to sys=
tem:<br>&gt; &gt; &gt; &nbsp; 1) the ELF header (by default the first 6 pag=
es of the raw<br>&gt; dump)<br>&gt; &gt; &gt; &nbsp; 2) a range which might=
 be BIOS, which by default in the tool<br>&gt; is set to<br>&gt; &gt; &gt; =
&nbsp; &nbsp; &nbsp;pages 0x9F to 0xDF.<br>&gt; &gt; &gt;<br>&gt; &gt; &gt;=
 Good luck!<br>&gt; &gt; &gt;<o:p></o:p></p></div></div></div><p class=3DMs=
oNormal><o:p>&nbsp;</o:p></p></div></div></div></body></html>=

--_000_291EDFCB1E9E224A99088639C4762022B4543AB147LONPMAILBOX01_--


--===============1484638869==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1484638869==--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 08:53:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 08:53:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNovL-0003IP-Ii; Tue, 08 Nov 2011 08:53:23 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNoud-00035g-Kq
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 08:52:40 -0800
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-13.tower-27.messagelabs.com!1320771137!47468148!1
X-Originating-IP: [142.103.6.52]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27854 invoked from network); 8 Nov 2011 16:52:18 -0000
Received: from smtp.cs.ubc.ca (HELO smtp.cs.ubc.ca) (142.103.6.52)
	by server-13.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 8 Nov 2011 16:52:18 -0000
Received: from mail-bw0-f43.google.com (mail-bw0-f43.google.com
	[209.85.214.43]) (authenticated bits=0)
	by smtp.cs.ubc.ca (8.14.3/8.13.6) with ESMTP id pA8GqVeR012016
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=FAIL)
	for <xen-devel@lists.xensource.com>; Tue, 8 Nov 2011 08:52:32 -0800
Received: by bkbzt12 with SMTP id zt12so788070bkb.30
	for <xen-devel@lists.xensource.com>;
	Tue, 08 Nov 2011 08:52:29 -0800 (PST)
Received: by 10.204.132.211 with SMTP id c19mr23391475bkt.94.1320771149270;
	Tue, 08 Nov 2011 08:52:29 -0800 (PST)
MIME-Version: 1.0
Received: by 10.204.180.130 with HTTP; Tue, 8 Nov 2011 08:51:48 -0800 (PST)
In-Reply-To: <CAP8mzPM1Fxj6M5R+H79nKToSCxHxsMaq1CKN=csjRMMocG0LRA@mail.gmail.com>
References: <patchbomb.1320350703@athos.nss.cs.ubc.ca>
	<20147.55048.90214.665321@mariner.uk.xensource.com>
	<CAP8mzPM1Fxj6M5R+H79nKToSCxHxsMaq1CKN=csjRMMocG0LRA@mail.gmail.com>
From: Shriram Rajagopalan <rshriram@cs.ubc.ca>
Date: Tue, 8 Nov 2011 08:51:48 -0800
Message-ID: <CAP8mzPOqv9oiNyCRTSz9DaBDwB-MtOvPJ9+3xc5NwAepOgUm7w@mail.gmail.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Cc: "brendan@cs.ubc.ca" <brendan@cs.ubc.ca>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH 0 of 2 V5] libxc: checkpoint compression
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: rshriram@cs.ubc.ca
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1614596109=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1614596109==
Content-Type: multipart/alternative; boundary=001517447f1a2e8daf04b13bff92

--001517447f1a2e8daf04b13bff92
Content-Type: text/plain; charset=ISO-8859-1

On Fri, Nov 4, 2011 at 12:21 PM, Shriram Rajagopalan <rshriram@cs.ubc.ca>wrote:

> Why posix_memalign?
>
> The compression code involves a lot of memcpys at 4K granularity (dirty
> pages
> copied from domU's memory to internal cache/page buffers etc). I would
> like to
> keep these memcpys page aligned for purposes of speed. The source pages
> (from domU) are already aligned. The destination pages allocated by the
> compression code need to be page aligned.
>
> correct me if I am wrong:
>  mallocing a huge buffer for this purpose is not optimal. malloc aligns
> allocations
>  on 16byte (or 8byte) granularity but if a 4K region straddles across two
> physical
> memory frames, then the memcpy is going to be suboptimal. OTOH, memalign
> ensures that we are dealing with just 2 memory frames as opposed
> to 3 (possible) frames in malloc.
>
> A simple 8Mb memcpy test shows an average of 500us overhead for malloc
> based allocation compared to posix_memalign based allocation. While this
> might seem low, the checkpoints are being taken at high frequency
> (every 20ms for instance).
>
> It is not okay to use malloc on other platforms. I simply dont have access
> to other
> platforms to test their equivalent versions.  Short of using something
> like qemu_memalign function.
>
> I am open to suggestions :)
>
> shriram
>
>
Ping.


> On Fri, Nov 4, 2011 at 5:14 AM, Ian Jackson <Ian.Jackson@eu.citrix.com>wrote:
>
>> rshriram@cs.ubc.ca writes ("[PATCH 0 of 2 V5] libxc: checkpoint
>> compression"):
>> > This patch series adds checkpoint compression functionality, while
>> > running under Remus.
>> ...
>> > Changes since last version:
>> > 1. use posix_memalign only on linux platforms and switch to normal
>> malloc for
>> >    the rest. stubdom compiles successfully.
>>
>> Looking at this in more detail, I don't understand why you're using
>> posix_memalign rather than just malloc, anyway.  If it's necessary to
>> use posix_memalign on Linux, why is it OK to use malloc on other
>> platforms ?
>>
>> Also this #ifdef is quite ugly.
>>
>> Ian.
>>
>>
>

--001517447f1a2e8daf04b13bff92
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<div class=3D"gmail_quote">On Fri, Nov 4, 2011 at 12:21 PM, Shriram Rajagop=
alan <span dir=3D"ltr">&lt;<a href=3D"mailto:rshriram@cs.ubc.ca">rshriram@c=
s.ubc.ca</a>&gt;</span> wrote:<br><blockquote class=3D"gmail_quote" style=
=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

Why posix_memalign?<br><br>The compression code involves a lot of memcpys a=
t 4K granularity (dirty pages<br>copied from domU&#39;s memory to internal =
cache/page buffers etc). I would like to<br>keep these memcpys page aligned=
 for purposes of speed. The source pages <br>


(from domU) are already aligned. The destination pages allocated by the <br=
>compression code need to be page aligned.<br><br>correct me if I am wrong:=
<br>=A0mallocing a huge buffer for this purpose is not optimal. malloc alig=
ns allocations<br>


=A0on 16byte (or 8byte) granularity but if a 4K region straddles across two=
 physical<br>memory frames, then the memcpy is going to be suboptimal. OTOH=
, memalign <br>ensures that we are dealing with just 2 memory frames as opp=
osed <br>


to 3 (possible) frames in malloc.<br><br>A simple 8Mb memcpy test shows an =
average of 500us overhead for malloc <br>based allocation compared to posix=
_memalign based allocation. While this <br>might seem low, the checkpoints =
are being taken at high frequency <br>


(every 20ms for instance). <br><br>It is not okay to use malloc on other pl=
atforms. I simply dont have access to other<br>platforms to test their equi=
valent versions.=A0 Short of using something <br>like qemu_memalign functio=
n.<br>


<br>I am open to suggestions :)<span class=3D"HOEnZb"><font color=3D"#88888=
8"><br><br>shriram</font></span><div class=3D"HOEnZb"><div class=3D"h5"><br=
></div></div></blockquote><div><br>Ping.<br>=A0<br></div><blockquote class=
=3D"gmail_quote" style=3D"margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid=
 rgb(204, 204, 204); padding-left: 1ex;">

<div class=3D"HOEnZb"><div class=3D"h5"><div class=3D"gmail_quote">On Fri, =
Nov 4, 2011 at 5:14 AM, Ian Jackson <span dir=3D"ltr">&lt;<a href=3D"mailto=
:Ian.Jackson@eu.citrix.com" target=3D"_blank">Ian.Jackson@eu.citrix.com</a>=
&gt;</span> wrote:<br>


<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex"><a href=3D"mailto:rshriram@cs.ubc.ca" target=
=3D"_blank">rshriram@cs.ubc.ca</a> writes (&quot;[PATCH 0 of 2 V5] libxc: c=
heckpoint compression&quot;):<br>



<div>&gt; This patch series adds checkpoint compression functionality, whil=
e<br>
&gt; running under Remus.<br>
</div>...<br>
<div>&gt; Changes since last version:<br>
&gt; 1. use posix_memalign only on linux platforms and switch to normal mal=
loc for<br>
&gt; =A0 =A0the rest. stubdom compiles successfully.<br>
<br>
</div>Looking at this in more detail, I don&#39;t understand why you&#39;re=
 using<br>
posix_memalign rather than just malloc, anyway. =A0If it&#39;s necessary to=
<br>
use posix_memalign on Linux, why is it OK to use malloc on other<br>
platforms ?<br>
<br>
Also this #ifdef is quite ugly.<br>
<span><font color=3D"#888888"><br>
Ian.<br>
<br>
</font></span></blockquote></div><br>
</div></div></blockquote></div><br>

--001517447f1a2e8daf04b13bff92--


--===============1614596109==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1614596109==--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 08:54:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 08:54:32 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNowS-0003fR-Qm; Tue, 08 Nov 2011 08:54:32 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNovd-0003ND-U0
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 08:53:42 -0800
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-7.tower-182.messagelabs.com!1320771218!2355797!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8126 invoked from network); 8 Nov 2011 16:53:38 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-7.tower-182.messagelabs.com with SMTP;
	8 Nov 2011 16:53:38 -0000
Received: from tarius.tycho.ncsc.mil (localhost [127.0.0.1])
	by msux-gh1-uea01.nsa.gov (8.12.10/8.12.10) with ESMTP id
	pA8GrZYu009367; Tue, 8 Nov 2011 16:53:35 GMT
Received: from moss-nexus.epoch.ncsc.mil (moss-nexus [144.51.25.48])
	by tarius.tycho.ncsc.mil (8.13.1/8.13.1) with ESMTP id pA8GrZjR016167; 
	Tue, 8 Nov 2011 11:53:35 -0500
Message-ID: <4EB95EA3.9040809@tycho.nsa.gov>
Date: Tue, 08 Nov 2011 11:53:55 -0500
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Organization: National Security Agency
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: "konrad.wilk@oracle.com" <konrad.wilk@oracle.com>
References: <1319061927-5967-1-git-send-email-dgdegra@tycho.nsa.gov>
	<alpine.DEB.2.00.1110201128130.3519@kaball-desktop>
In-Reply-To: <alpine.DEB.2.00.1110201128130.3519@kaball-desktop>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH] xen: Remove hanging references to
	CONFIG_XEN_PLATFORM_PCI
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 10/20/2011 06:28 AM, Stefano Stabellini wrote:
> On Wed, 19 Oct 2011, Daniel De Graaf wrote:
>> In 5fbdc10395cd500d6ff844825a918c4e6f38de37 the XEN_PLATFORM_PCI config
>> option was removed, but references in header files remained. Clean up
>> those references.
>>
>> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> 
> Good catch, thanks!
> 

This didn't make it into 3.2-rc1, and I don't see it on any of Konrad's
git trees. The CONFIG_XEN_PVHVM change breaks PV-on-HVM drivers without
this patch because the grant table is not initialized:

[    3.667543] Event-channel device installed.
[    3.669093] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
...
[    3.775482] vbd vbd-51712: 28 granting access to ring page
[    3.777126] vbd vbd-51712: 28 xenbus_dev_probe on device/vbd/51712
[    3.778649] vbd: probe of vbd-51712 failed with error -28
[    3.783523] ata_piix 0000:00:01.1: version 2.13
[    3.784001] ata_piix 0000:00:01.1: setting latency timer to 64
[    3.785453] scsi0 : ata_piix
[    3.786886] scsi1 : ata_piix
[    3.788174] ata1: PATA max MWDMA2 cmd 0x1f0 ctl 0x3f6 bmdma 0xc160 irq 14
[    3.789444] ata2: PATA max MWDMA2 cmd 0x170 ctl 0x376 bmdma 0xc168 irq 15
[    3.790958] Fixed MDIO Bus: probed
[    3.793015] Initialising Xen virtual ethernet driver.
[    3.795331] #### netfront can't alloc tx grant refs
[    3.797402] vif vif-0: 12 creating netdev
[    3.798859] vif vif-0: 12 xenbus_dev_probe on device/vif/0
[    3.800777] vif: probe of vif-0 failed with error -12

Versus a boot with working pv-hvm drivers:
[    3.284850] Event-channel device installed.
[    3.286468] xen: --> pirq=22 -> irq=28 (gsi=28)
[    3.286471] xen-platform-pci 0000:00:03.0: PCI INT A -> GSI 28 (level, low) -> IRQ 28
[    3.288181] Grant table initialized
[    3.289598] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
...

>> ---
>>  include/xen/platform_pci.h |    6 ++----
>>  1 files changed, 2 insertions(+), 4 deletions(-)
>>
>> diff --git a/include/xen/platform_pci.h b/include/xen/platform_pci.h
>> index a785a3b..438c256 100644
>> --- a/include/xen/platform_pci.h
>> +++ b/include/xen/platform_pci.h
>> @@ -29,8 +29,7 @@
>>  static inline int xen_must_unplug_nics(void) {
>>  #if (defined(CONFIG_XEN_NETDEV_FRONTEND) || \
>>  		defined(CONFIG_XEN_NETDEV_FRONTEND_MODULE)) && \
>> -		(defined(CONFIG_XEN_PLATFORM_PCI) || \
>> -		 defined(CONFIG_XEN_PLATFORM_PCI_MODULE))
>> +		defined(CONFIG_XEN_PVHVM)
>>          return 1;
>>  #else
>>          return 0;
>> @@ -40,8 +39,7 @@ static inline int xen_must_unplug_nics(void) {
>>  static inline int xen_must_unplug_disks(void) {
>>  #if (defined(CONFIG_XEN_BLKDEV_FRONTEND) || \
>>  		defined(CONFIG_XEN_BLKDEV_FRONTEND_MODULE)) && \
>> -		(defined(CONFIG_XEN_PLATFORM_PCI) || \
>> -		 defined(CONFIG_XEN_PLATFORM_PCI_MODULE))
>> +		defined(CONFIG_XEN_PVHVM)
>>          return 1;
>>  #else
>>          return 0;
>> -- 
>> 1.7.6.4
>>
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 08:55:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 08:55:40 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNoxX-00042w-EW; Tue, 08 Nov 2011 08:55:39 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNowa-0003hP-BQ
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 08:54:40 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1320771276!2736876!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28921 invoked from network); 8 Nov 2011 16:54:37 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-4.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 16:54:37 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 08 Nov 2011 16:54:36 +0000
Message-Id: <4EB96CDA020000780005FAA0@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 08 Nov 2011 16:54:34 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part1B34E1DA.0__="
Subject: [Xen-devel] [PATCH] x86/MSI: fix dump_msi() after c/s
	24068:6928172f7ded
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part1B34E1DA.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

The function must not blindly take the lock on IRQ descriptors.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/msi.c
+++ b/xen/arch/x86/msi.c
@@ -1076,6 +1076,9 @@ static void dump_msi(unsigned char key)
         unsigned long flags;
         char type;
=20
+        if ( !irq_desc_initialized(desc) )
+            continue;
+
         spin_lock_irqsave(&desc->lock, flags);
=20
         entry =3D desc->msi_desc;




--=__Part1B34E1DA.0__=
Content-Type: text/plain; name="x86-dump_msi-locking.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="x86-dump_msi-locking.patch"

x86/MSI: fix dump_msi() after c/s 24068:6928172f7ded=0A=0AThe function =
must not blindly take the lock on IRQ descriptors.=0A=0ASigned-off-by: Jan =
Beulich <jbeulich@suse.com>=0A=0A--- a/xen/arch/x86/msi.c=0A+++ b/xen/arch/=
x86/msi.c=0A@@ -1076,6 +1076,9 @@ static void dump_msi(unsigned char =
key)=0A         unsigned long flags;=0A         char type;=0A =0A+        =
if ( !irq_desc_initialized(desc) )=0A+            continue;=0A+=0A         =
spin_lock_irqsave(&desc->lock, flags);=0A =0A         entry =3D desc->msi_d=
esc;=0A
--=__Part1B34E1DA.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part1B34E1DA.0__=--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 09:03:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 09:03:01 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNp4e-0004Yg-IH; Tue, 08 Nov 2011 09:03:00 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNp1H-0004JP-QG
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 08:59:34 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1320771567!2339015!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25588 invoked from network); 8 Nov 2011 16:59:28 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-14.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 16:59:28 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA8GxOl6008589
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 8 Nov 2011 16:59:25 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA8GxNJh028569
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 8 Nov 2011 16:59:23 GMT
Received: from abhmt118.oracle.com (abhmt118.oracle.com [141.146.116.70])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA8GxGpY007653; Tue, 8 Nov 2011 10:59:17 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 08 Nov 2011 08:59:16 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 9B35581415; Tue,  8 Nov 2011 11:59:15 -0500 (EST)
Date: Tue, 8 Nov 2011 11:59:15 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Daniel Kiper <dkiper@net-space.pl>
Subject: Re: [Xen-devel] [PATCH] xen: document balloon driver sysfs files
Message-ID: <20111108165915.GB30802@phenom.dumpdata.com>
References: <1319626664-28225-1-git-send-email-david.vrabel@citrix.com>
	<20111026191212.GA17424@router-fw-old.local.net-space.pl>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111026191212.GA17424@router-fw-old.local.net-space.pl>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090204.4EB95FED.010F,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, David Vrabel <david.vrabel@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Oct 26, 2011 at 09:12:12PM +0200, Daniel Kiper wrote:
> On Wed, Oct 26, 2011 at 11:57:43AM +0100, David Vrabel wrote:
> > From: David Vrabel <david.vrabel@citrix.com>
> >
> > Add ABI documentation for the balloon driver's sysfs files.
> >
> > Signed-off-by: David Vrabel <david.vrabel@citrix.com>
> > ---
> >  .../ABI/stable/sysfs-devices-system-xen_memory     |   72 ++++++++++++++++++++
> >  1 files changed, 72 insertions(+), 0 deletions(-)
> >  create mode 100644 Documentation/ABI/stable/sysfs-devices-system-xen_memory
> >
> > diff --git a/Documentation/ABI/stable/sysfs-devices-system-xen_memory b/Documentation/ABI/stable/sysfs-devices-system-xen_memory
> > new file mode 100644
> > index 0000000..4fbc446
> > --- /dev/null
> > +++ b/Documentation/ABI/stable/sysfs-devices-system-xen_memory
> > @@ -0,0 +1,72 @@
> > +What:		/sys/devices/system/xen_memory/xen_memory0/max_retry_count
> > +Date:		April 2008
> 
> May 2011
> 
> > +KernelVersion:	2.6.26
> 
> 2.6.39, git commit 95d2ac4a0c904942a4fecf815781ebd4171e7a30
> and 40095de1f9082f058970b985a96d2fbef43f94f4.
> 
> Additionally, I think it is worth to add default value and special
> cases description (e.g. max_retry_count == 0 => RETRY_UNLIMITED).
> Please look into drivers/xen/{balloon.c,xen-balloon.c}
> and include/xen/balloon.h for details.
> 
> > +Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > +Description:
> > +		The maximum number of times the balloon driver will
> > +		attempt to increase the balloon before giving up.  See
> > +		also 'retry_count' below.
> > +
> > +What:		/sys/devices/system/xen_memory/xen_memory0/max_schedule_delay
> > +Date:		April 2008
> 
> Ditto.
> 
> > +KernelVersion:	2.6.26
> 
> Ditto.
> 
> > +Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > +Description:
> > +		The limit that 'schedule_delay' (see below) will be
> > +		increased to.
> > +
> > +What:		/sys/devices/system/xen_memory/xen_memory0/retry_count
> > +Date:		April 2008
> 
> Ditto.
> 
> > +KernelVersion:	2.6.26
> 
> Ditto.
> 
> > +Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > +Description:
> > +		The current number of times that the balloon driver
> > +		has attempted to increase the size of the balloon.
> > +
> > +What:		/sys/devices/system/xen_memory/xen_memory0/schedule_delay
> > +Date:		April 2008
> 
> Ditto.
> 
> > +KernelVersion:	2.6.26
> 
> Ditto.
> 
> Daniel

Daniel, how does this look ? I added your Reviewed-by, but if you want
to make some more modifications I can certainly do so.


>From d759668b660f111b6f35b632031eaf1a136a22f3 Mon Sep 17 00:00:00 2001
From: David Vrabel <david.vrabel@citrix.com>
Date: Wed, 26 Oct 2011 11:57:43 +0100
Subject: [PATCH] xen: document balloon driver sysfs files

Add ABI documentation for the balloon driver's sysfs files.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Reviewed-by: Daniel Kiper <dkiper@net-space.pl>
[v2: Added comments from Daniel]
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 .../ABI/stable/sysfs-devices-system-xen_memory     |   77 ++++++++++++++++++++
 1 files changed, 77 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/ABI/stable/sysfs-devices-system-xen_memory

diff --git a/Documentation/ABI/stable/sysfs-devices-system-xen_memory b/Documentation/ABI/stable/sysfs-devices-system-xen_memory
new file mode 100644
index 0000000..39463d0
--- /dev/null
+++ b/Documentation/ABI/stable/sysfs-devices-system-xen_memory
@@ -0,0 +1,77 @@
+What:		/sys/devices/system/xen_memory/xen_memory0/max_retry_count
+Date:		May 2011
+KernelVersion:	2.6.39
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+		The maximum number of times the balloon driver will
+		attempt to increase the balloon before giving up.  See
+		also 'retry_count' below.
+		A value of zero means retry forever and is the default one.
+
+What:		/sys/devices/system/xen_memory/xen_memory0/max_schedule_delay
+Date:		May 2011
+KernelVersion:	2.6.39
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+		The limit that 'schedule_delay' (see below) will be
+		increased to. The default value is 32.
+
+What:		/sys/devices/system/xen_memory/xen_memory0/retry_count
+Date:		May 2011
+KernelVersion:	2.6.39
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+		The current number of times that the balloon driver
+		has attempted to increase the size of the balloon.
+		The default value is one. With max_retry_count being
+		zero (unlimited), this means that the driver will attempt
+		to retry with a 'schedule_delay' delay.
+
+What:		/sys/devices/system/xen_memory/xen_memory0/schedule_delay
+Date:		May 2011
+KernelVersion:	2.6.39
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+		The time (in jiffies) to wait between attempts to
+		increase the balloon.  Each time the balloon cannot be
+		increased, 'schedule_delay' is increased (until
+		'max_schedule_delay' is reached at which point it
+		will use that value).
+
+What:		/sys/devices/system/xen_memory/xen_memory0/target
+Date:		April 2008
+KernelVersion:	2.6.26
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+		The target number of pages to adjust this domain's
+		memory reservation to.
+
+What:		/sys/devices/system/xen_memory/xen_memory0/target_kb
+Date:		April 2008
+KernelVersion:	2.6.26
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+		As target above, except the value is in KiB.
+
+What:		/sys/devices/system/xen_memory/xen_memory0/info/current_kb
+Date:		April 2008
+KernelVersion:	2.6.26
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+		Current size (in KiB) of this domain's memory
+		reservation.
+
+What:		/sys/devices/system/xen_memory/xen_memory0/info/high_kb
+Date:		April 2008
+KernelVersion:	2.6.26
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+		Amount (in KiB) of high memory in the balloon.
+
+What:		/sys/devices/system/xen_memory/xen_memory0/info/low_kb
+Date:		April 2008
+KernelVersion:	2.6.26
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+		Amount (in KiB) of low (or normal) memory in the
+		balloon.
-- 
1.7.7.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 09:05:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 09:05:24 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNp6w-0004yG-Tk; Tue, 08 Nov 2011 09:05:23 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNp4F-0004Tn-Ue
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 09:02:41 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1320771752!3430949!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7328 invoked from network); 8 Nov 2011 17:02:32 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 17:02:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,477,1315180800"; 
   d="scan'208";a="8823587"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 17:02:32 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Tue, 8 Nov 2011
	17:02:32 +0000
Subject: Re: [Xen-devel] Re: [PATCH 0 of 2 V5] libxc: checkpoint compression
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "rshriram@cs.ubc.ca" <rshriram@cs.ubc.ca>
Date: Tue, 8 Nov 2011 17:02:31 +0000
In-Reply-To: <CAP8mzPOqv9oiNyCRTSz9DaBDwB-MtOvPJ9+3xc5NwAepOgUm7w@mail.gmail.com>
References: <patchbomb.1320350703@athos.nss.cs.ubc.ca>
	<20147.55048.90214.665321@mariner.uk.xensource.com>
	<CAP8mzPM1Fxj6M5R+H79nKToSCxHxsMaq1CKN=csjRMMocG0LRA@mail.gmail.com>
	<CAP8mzPOqv9oiNyCRTSz9DaBDwB-MtOvPJ9+3xc5NwAepOgUm7w@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320771752.955.109.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "brendan@cs.ubc.ca" <brendan@cs.ubc.ca>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-11-08 at 16:51 +0000, Shriram Rajagopalan wrote:
> On Fri, Nov 4, 2011 at 12:21 PM, Shriram Rajagopalan
> <rshriram@cs.ubc.ca> wrote:
>         Why posix_memalign?
>         
>         The compression code involves a lot of memcpys at 4K
>         granularity (dirty pages
>         copied from domU's memory to internal cache/page buffers etc).
>         I would like to
>         keep these memcpys page aligned for purposes of speed. The
>         source pages 
>         (from domU) are already aligned. The destination pages
>         allocated by the 
>         compression code need to be page aligned.
>         
>         correct me if I am wrong:
>          mallocing a huge buffer for this purpose is not optimal.
>         malloc aligns allocations
>          on 16byte (or 8byte) granularity but if a 4K region straddles
>         across two physical
>         memory frames, then the memcpy is going to be suboptimal.
>         OTOH, memalign 
>         ensures that we are dealing with just 2 memory frames as
>         opposed 
>         to 3 (possible) frames in malloc.
>         
>         A simple 8Mb memcpy test shows an average of 500us overhead
>         for malloc 
>         based allocation compared to posix_memalign based allocation.
>         While this 
>         might seem low, the checkpoints are being taken at high
>         frequency 
>         (every 20ms for instance). 
>         
>         It is not okay to use malloc on other platforms. I simply dont
>         have access to other
>         platforms to test their equivalent versions.  Short of using
>         something 
>         like qemu_memalign function.
>         
>         I am open to suggestions :)

This is due to minios (aka stubdoms) not having posix_memalign, right?

minios (or rather newlib) does appear to have memalign though, which if
true would also work, right? You could potentially also implement
posix_memalign in terms of memalign on minios and avoid the ifdef.

Ian.

>         
>         shriram
>         
>         
> 
> Ping.
>  
> 
>         On Fri, Nov 4, 2011 at 5:14 AM, Ian Jackson
>         <Ian.Jackson@eu.citrix.com> wrote:
>                 rshriram@cs.ubc.ca writes ("[PATCH 0 of 2 V5] libxc:
>                 checkpoint compression"):
>                 > This patch series adds checkpoint compression
>                 functionality, while
>                 > running under Remus.
>                 
>                 ...
>                 > Changes since last version:
>                 > 1. use posix_memalign only on linux platforms and
>                 switch to normal malloc for
>                 >    the rest. stubdom compiles successfully.
>                 
>                 
>                 Looking at this in more detail, I don't understand why
>                 you're using
>                 posix_memalign rather than just malloc, anyway.  If
>                 it's necessary to
>                 use posix_memalign on Linux, why is it OK to use
>                 malloc on other
>                 platforms ?
>                 
>                 Also this #ifdef is quite ugly.
>                 
>                 Ian.
>                 
>         
>         
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 09:08:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 09:08:06 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNp9Z-0005T7-FC; Tue, 08 Nov 2011 09:08:05 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNp6S-0004ra-QB
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 09:04:53 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1320771887!765707!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28075 invoked from network); 8 Nov 2011 17:04:49 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-15.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 17:04:49 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA8H4iw7007918
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 8 Nov 2011 17:04:45 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA8H4f8x011012
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 8 Nov 2011 17:04:44 GMT
Received: from abhmt108.oracle.com (abhmt108.oracle.com [141.146.116.60])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA8H4ZWK010613; Tue, 8 Nov 2011 11:04:35 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 08 Nov 2011 09:04:35 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id ED60281415; Tue,  8 Nov 2011 12:04:30 -0500 (EST)
Date: Tue, 8 Nov 2011 12:04:30 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Message-ID: <20111108170430.GA4465@phenom.dumpdata.com>
References: <1319061927-5967-1-git-send-email-dgdegra@tycho.nsa.gov>
	<alpine.DEB.2.00.1110201128130.3519@kaball-desktop>
	<4EB95EA3.9040809@tycho.nsa.gov>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EB95EA3.9040809@tycho.nsa.gov>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090209.4EB9612D.012E,ss=1,re=0.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH] xen: Remove hanging references to
	CONFIG_XEN_PLATFORM_PCI
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 08, 2011 at 11:53:55AM -0500, Daniel De Graaf wrote:
> On 10/20/2011 06:28 AM, Stefano Stabellini wrote:
> > On Wed, 19 Oct 2011, Daniel De Graaf wrote:
> >> In 5fbdc10395cd500d6ff844825a918c4e6f38de37 the XEN_PLATFORM_PCI config
> >> option was removed, but references in header files remained. Clean up
> >> those references.
> >>
> >> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> > 
> > Good catch, thanks!
> > 
> 
> This didn't make it into 3.2-rc1, and I don't see it on any of Konrad's
> git trees. The CONFIG_XEN_PVHVM change breaks PV-on-HVM drivers without
> this patch because the grant table is not initialized:

Yikes. Looks like I missed the patch. Thanks for testing, will queue it up.


> 
> [    3.667543] Event-channel device installed.
> [    3.669093] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
> ...
> [    3.775482] vbd vbd-51712: 28 granting access to ring page
> [    3.777126] vbd vbd-51712: 28 xenbus_dev_probe on device/vbd/51712
> [    3.778649] vbd: probe of vbd-51712 failed with error -28
> [    3.783523] ata_piix 0000:00:01.1: version 2.13
> [    3.784001] ata_piix 0000:00:01.1: setting latency timer to 64
> [    3.785453] scsi0 : ata_piix
> [    3.786886] scsi1 : ata_piix
> [    3.788174] ata1: PATA max MWDMA2 cmd 0x1f0 ctl 0x3f6 bmdma 0xc160 irq 14
> [    3.789444] ata2: PATA max MWDMA2 cmd 0x170 ctl 0x376 bmdma 0xc168 irq 15
> [    3.790958] Fixed MDIO Bus: probed
> [    3.793015] Initialising Xen virtual ethernet driver.
> [    3.795331] #### netfront can't alloc tx grant refs
> [    3.797402] vif vif-0: 12 creating netdev
> [    3.798859] vif vif-0: 12 xenbus_dev_probe on device/vif/0
> [    3.800777] vif: probe of vif-0 failed with error -12
> 
> Versus a boot with working pv-hvm drivers:
> [    3.284850] Event-channel device installed.
> [    3.286468] xen: --> pirq=22 -> irq=28 (gsi=28)
> [    3.286471] xen-platform-pci 0000:00:03.0: PCI INT A -> GSI 28 (level, low) -> IRQ 28
> [    3.288181] Grant table initialized
> [    3.289598] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
> ...
> 
> >> ---
> >>  include/xen/platform_pci.h |    6 ++----
> >>  1 files changed, 2 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/include/xen/platform_pci.h b/include/xen/platform_pci.h
> >> index a785a3b..438c256 100644
> >> --- a/include/xen/platform_pci.h
> >> +++ b/include/xen/platform_pci.h
> >> @@ -29,8 +29,7 @@
> >>  static inline int xen_must_unplug_nics(void) {
> >>  #if (defined(CONFIG_XEN_NETDEV_FRONTEND) || \
> >>  		defined(CONFIG_XEN_NETDEV_FRONTEND_MODULE)) && \
> >> -		(defined(CONFIG_XEN_PLATFORM_PCI) || \
> >> -		 defined(CONFIG_XEN_PLATFORM_PCI_MODULE))
> >> +		defined(CONFIG_XEN_PVHVM)
> >>          return 1;
> >>  #else
> >>          return 0;
> >> @@ -40,8 +39,7 @@ static inline int xen_must_unplug_nics(void) {
> >>  static inline int xen_must_unplug_disks(void) {
> >>  #if (defined(CONFIG_XEN_BLKDEV_FRONTEND) || \
> >>  		defined(CONFIG_XEN_BLKDEV_FRONTEND_MODULE)) && \
> >> -		(defined(CONFIG_XEN_PLATFORM_PCI) || \
> >> -		 defined(CONFIG_XEN_PLATFORM_PCI_MODULE))
> >> +		defined(CONFIG_XEN_PVHVM)
> >>          return 1;
> >>  #else
> >>          return 0;
> >> -- 
> >> 1.7.6.4
> >>
> > 
> > _______________________________________________
> > Xen-devel mailing list
> > Xen-devel@lists.xensource.com
> > http://lists.xensource.com/xen-devel
> > 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 09:10:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 09:10:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNpBc-0005qj-JK; Tue, 08 Nov 2011 09:10:12 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNp72-0004yn-NT
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 09:05:29 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1320771925!2358446!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2990 invoked from network); 8 Nov 2011 17:05:25 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 17:05:25 -0000
X-IronPort-AV: E=Sophos;i="4.69,477,1315180800"; 
   d="scan'208";a="8823657"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 17:05:09 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 17:05:09 +0000
Date: Tue, 8 Nov 2011 17:05:39 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Jiageng Yu <yujiageng734@gmail.com>
Subject: Re: [Xen-devel] Re: Linux Stubdom Problem
In-Reply-To: <CAJ0pt15daSuXGi_8T3NS53E2Xv0bYV90b94100Wi6ajt99gedQ@mail.gmail.com>
Message-ID: <alpine.DEB.2.00.1111081412270.3519@kaball-desktop>
References: <alpine.DEB.2.00.1109021401000.12963@kaball-desktop>
	<CA8694A1.20379%keir.xen@gmail.com>
	<CAJ0pt17eoZbEnmziLaSd1Cxi+sU90rJ-c8TSgt+ikE3wZj1jhA@mail.gmail.com>
	<alpine.DEB.2.00.1109151110020.12963@kaball-desktop>
	<CAJ0pt15daSuXGi_8T3NS53E2Xv0bYV90b94100Wi6ajt99gedQ@mail.gmail.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="8323329-138511813-1320761654=:3519"
Content-ID: <alpine.DEB.2.00.1111081416300.3519@kaball-desktop>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Keir Fraser <keir.xen@gmail.com>, Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	"Tim \(Xen.org\)" <tim@xen.org>, Konrad, Samuel,
	Anthony PERARD <anthony.perard@gmail.com>,
	Thibault <samuel.thibault@ens-lyon.org>,
	Ian Campbell <Ian.Campbell@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--8323329-138511813-1320761654=:3519
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8BIT
Content-ID: <alpine.DEB.2.00.1111081416301.3519@kaball-desktop>

On Thu, 27 Oct 2011, Jiageng Yu wrote:
> Hi Stefano,
> 
> 	I have some progress in linux based stubdom project. As shown in the
> attached video, I have started the emulated vga device in the linux
> based stubdom.
> 
> 	In a short conclusion, for the linux based stubdom, there are two
> major problems about vga device emulation. The first is the vram
> mapping, which we discussed a lot previously and handled it.

Do you have an updated version of the patch you used?


> Another
> is the vga BIOS mapping (address 0xc0000-0xc8fff of hvm guest).

This is caused by qemu trying to map that memory area in its own address
space, right?


> 	I found the vga BIOS mapping problem in remap_area_mfn_pte_fn()
> function. The pte_mkspecial() will return invalid value when I try to
> map 0xc0000-0xc8fff into linux based stubdom.

What is exactly the error you are seeing?


> pte_mkspecial()
> 	->pte_set_flags()
> 		->native_pte_val()
> 		->native_make_pte()
> 
> 	According to my test, the root cause of vga BIOS mapping problem is
> native_xxx functions. We could avoid the problem by invoking functions
> defined in paravirt.h instead. The patch is as follows. But I think it
> is not a good way to handle the problem. Maybe you can give me some
> suggestions.
> 
> 	I also found the hard disk didnÃƒ??Ãƒ?????Ãƒ??Ãƒ????Ãƒ??Ãƒ???Ãƒ??Ãƒ??Ãƒ??Ãƒ?Ã‚Â¢??t work well. I will investigate it these days.
> 
> 
> --- a/arch/x86/xen/mmu.c
> +++ b/arch/x86/xen/mmu.c
> @@ -2639,12 +2640,16 @@ static int remap_area_mfn_pte_fn(pte_t *ptep,
> pgtable_t token,
>  				 unsigned long addr, void *data)
>  {
>  	struct remap_data *rmd = data;
> -	pte_t pte = pte_mkspecial(pfn_pte(rmd->mfn++, rmd->prot));
> +    if((rmd->mfn & 0xfffffff0) == 0xc0){
> +	    pte_t pte = pfn_pte(rmd->mfn++, rmd->prot);
> +	    rmd->mmu_update->val = pte_val(pte);
> +    }else{
> +	    pte_t pte = pte_mkspecial(pfn_pte(rmd->mfn++, rmd->prot));
> +	    rmd->mmu_update->val = pte_val_ma(pte);
> +    }

Even if the fix is not the correct one I think I might understand what
the real problem is:

pfn_pte -> xen_make_pte

if (unlikely(pte & _PAGE_IOMAP) &&
        (xen_initial_domain() || addr >= ISA_END_ADDRESS)) {
    pte = iomap_pte(pte);
} else {
    pte &= ~_PAGE_IOMAP;
    pte = pte_pfn_to_mfn(pte);
}

considering that in this case xen_initial_domain() returns false and
addr is < ISA_END_ADDRESS (it is a gpfn address), xen_make_pte is going
to threat the mfn as a pfn erroneously.

In your patch you replaced pte_val_ma with pte_val that does the
opposite translation (mfn -> pfn) so the end result is that you get the
original mfn in rmd->mmu_update->val.

The real fix should something along these lines:



diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
index 3dd53f9..f2fadfc 100644
--- a/arch/x86/xen/mmu.c
+++ b/arch/x86/xen/mmu.c
@@ -422,7 +422,7 @@ static pteval_t xen_pte_val(pte_t pte)
 		pteval = (pteval & ~_PAGE_PAT) | _PAGE_PWT;
 	}
 
-	if (xen_initial_domain() && (pteval & _PAGE_IOMAP))
+	if (pteval & _PAGE_IOMAP)
 		return pteval;
 
 	return pte_mfn_to_pfn(pteval);
@@ -483,8 +483,7 @@ static pte_t xen_make_pte(pteval_t pte)
 	 * mappings are just dummy local mappings to keep other
 	 * parts of the kernel happy.
 	 */
-	if (unlikely(pte & _PAGE_IOMAP) &&
-	    (xen_initial_domain() || addr >= ISA_END_ADDRESS)) {
+	if (unlikely(pte & _PAGE_IOMAP)) {
 		pte = iomap_pte(pte);
 	} else {
 		pte &= ~_PAGE_IOMAP;
---

Could you please confirm whether this patch fixes your problem?

Konrad, do you know if this could have any unintended consequences?
I don't think it can be a problem security wise because Xen is going to
do all the permission checks anyway.
The only problem I can see is if a domU is going to call xen_make_pte
with _PAGE_IOMAP and a pfn->mfn translation is supposed to happen.
--8323329-138511813-1320761654=:3519
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--8323329-138511813-1320761654=:3519--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 09:12:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 09:12:01 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNpDN-0006FM-DM; Tue, 08 Nov 2011 09:12:01 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNp9E-0005O6-Gv
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 09:07:44 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1320772061!2352900!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7742 invoked from network); 8 Nov 2011 17:07:41 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 17:07:41 -0000
X-IronPort-AV: E=Sophos;i="4.69,477,1315180800"; 
   d="scan'208";a="8823722"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 17:07:41 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 17:07:41 +0000
Date: Tue, 8 Nov 2011 17:08:11 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
In-Reply-To: <20111108164820.GA30802@phenom.dumpdata.com>
Message-ID: <alpine.DEB.2.00.1111081708030.3519@kaball-desktop>
References: <1319779739-19300-1-git-send-email-zhenzhong.duan@oracle.com>
	<20111108164820.GA30802@phenom.dumpdata.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stabellini <Stefano.Stabellini@eu.citrix.com>,
	"joe.jin@oracle.com" <joe.jin@oracle.com>,
	"zhenzhong.duan@oracle.com" <zhenzhong.duan@oracle.com>, Stefano,
	"linux-x86_64@vger.kernel.org" <linux-x86_64@vger.kernel.org>
Subject: [Xen-devel] Re: [PATCH] enable pvhvm vcpu placement in kernel
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 8 Nov 2011, Konrad Rzeszutek Wilk wrote:
> On Thu, Oct 27, 2011 at 10:28:59PM -0700, zhenzhong.duan@oracle.com wrote:
> > pvhvm running with more than 32 vcpus and pv_irq/pv_time enabled 
> > need vcpu placement to work, or else it will softlockup.
> 
> Stefano?

Ack.

> > 
> > Signed-off-by: Zhenzhong Duan <zhenzhong.duan@oracle.com>
> > ---
> > diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
> > index da8afd5..1f92865 100644
> > --- a/arch/x86/xen/enlighten.c
> > +++ b/arch/x86/xen/enlighten.c
> > @@ -1356,7 +1356,7 @@ static int __cpuinit xen_hvm_cpu_notify(struct notifier_block *self,
> >  	int cpu = (long)hcpu;
> >  	switch (action) {
> >  	case CPU_UP_PREPARE:
> > -		per_cpu(xen_vcpu, cpu) = &HYPERVISOR_shared_info->vcpu_info[cpu];
> > +		xen_vcpu_setup(cpu);
> >  		if (xen_have_vector_callback)
> >  			xen_init_lock_cpu(cpu);
> >  		break;
> > @@ -1386,7 +1386,6 @@ static void __init xen_hvm_guest_init(void)
> >  	xen_hvm_smp_init();
> >  	register_cpu_notifier(&xen_hvm_cpu_notifier);
> >  	xen_unplug_emulated_devices();
> > -	have_vcpu_info_placement = 0;
> >  	x86_init.irqs.intr_init = xen_init_IRQ;
> >  	xen_hvm_init_time_ops();
> >  	xen_hvm_init_mmu_ops();
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 09:18:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 09:18:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNpJJ-0007Nl-A2; Tue, 08 Nov 2011 09:18:09 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNpFL-0006hg-1s
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 09:14:09 -0800
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-4.tower-216.messagelabs.com!1320772436!2739641!1
X-Originating-IP: [142.103.6.52]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29421 invoked from network); 8 Nov 2011 17:13:58 -0000
Received: from smtp.cs.ubc.ca (HELO smtp.cs.ubc.ca) (142.103.6.52)
	by server-4.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 8 Nov 2011 17:13:58 -0000
Received: from mail-bw0-f43.google.com (mail-bw0-f43.google.com
	[209.85.214.43]) (authenticated bits=0)
	by smtp.cs.ubc.ca (8.14.3/8.13.6) with ESMTP id pA8HDsIe015923
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=FAIL)
	for <xen-devel@lists.xensource.com>; Tue, 8 Nov 2011 09:13:55 -0800
Received: by bkbzt12 with SMTP id zt12so815223bkb.30
	for <xen-devel@lists.xensource.com>;
	Tue, 08 Nov 2011 09:13:53 -0800 (PST)
Received: by 10.204.141.198 with SMTP id n6mr1408191bku.81.1320772433142; Tue,
	08 Nov 2011 09:13:53 -0800 (PST)
MIME-Version: 1.0
Received: by 10.204.180.130 with HTTP; Tue, 8 Nov 2011 09:13:12 -0800 (PST)
In-Reply-To: <1320771752.955.109.camel@zakaz.uk.xensource.com>
References: <patchbomb.1320350703@athos.nss.cs.ubc.ca>
	<20147.55048.90214.665321@mariner.uk.xensource.com>
	<CAP8mzPM1Fxj6M5R+H79nKToSCxHxsMaq1CKN=csjRMMocG0LRA@mail.gmail.com>
	<CAP8mzPOqv9oiNyCRTSz9DaBDwB-MtOvPJ9+3xc5NwAepOgUm7w@mail.gmail.com>
	<1320771752.955.109.camel@zakaz.uk.xensource.com>
From: Shriram Rajagopalan <rshriram@cs.ubc.ca>
Date: Tue, 8 Nov 2011 09:13:12 -0800
Message-ID: <CAP8mzPO49gNVbouAB8nehBRC4K7Q37O+FgX8bGR_3EHSY8p6JQ@mail.gmail.com>
Subject: Re: [Xen-devel] Re: [PATCH 0 of 2 V5] libxc: checkpoint compression
To: Ian Campbell <Ian.Campbell@citrix.com>
Cc: "brendan@cs.ubc.ca" <brendan@cs.ubc.ca>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: rshriram@cs.ubc.ca
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0233787107=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0233787107==
Content-Type: multipart/alternative; boundary=0015174c4648b4e59804b13c4b62

--0015174c4648b4e59804b13c4b62
Content-Type: text/plain; charset=ISO-8859-1

On Tue, Nov 8, 2011 at 9:02 AM, Ian Campbell <Ian.Campbell@citrix.com>wrote:

> On Tue, 2011-11-08 at 16:51 +0000, Shriram Rajagopalan wrote:
> > On Fri, Nov 4, 2011 at 12:21 PM, Shriram Rajagopalan
> > <rshriram@cs.ubc.ca> wrote:
> >         Why posix_memalign?
> >
> >         The compression code involves a lot of memcpys at 4K
> >         granularity (dirty pages
> >         copied from domU's memory to internal cache/page buffers etc).
> >         I would like to
> >         keep these memcpys page aligned for purposes of speed. The
> >         source pages
> >         (from domU) are already aligned. The destination pages
> >         allocated by the
> >         compression code need to be page aligned.
> >
> >         correct me if I am wrong:
> >          mallocing a huge buffer for this purpose is not optimal.
> >         malloc aligns allocations
> >          on 16byte (or 8byte) granularity but if a 4K region straddles
> >         across two physical
> >         memory frames, then the memcpy is going to be suboptimal.
> >         OTOH, memalign
> >         ensures that we are dealing with just 2 memory frames as
> >         opposed
> >         to 3 (possible) frames in malloc.
> >
> >         A simple 8Mb memcpy test shows an average of 500us overhead
> >         for malloc
> >         based allocation compared to posix_memalign based allocation.
> >         While this
> >         might seem low, the checkpoints are being taken at high
> >         frequency
> >         (every 20ms for instance).
> >
> >         It is not okay to use malloc on other platforms. I simply dont
> >         have access to other
> >         platforms to test their equivalent versions.  Short of using
> >         something
> >         like qemu_memalign function.
> >
> >         I am open to suggestions :)
>
> This is due to minios (aka stubdoms) not having posix_memalign, right?
>
> minios (or rather newlib) does appear to have memalign though, which if
> true would also work, right? You could potentially also implement
> posix_memalign in terms of memalign on minios and avoid the ifdef.
>
>
Sounds good. In that case, can I just post a patch to minios, implementing
posix_memalign and will you then directly take the previous version V4 of
this
patch series (the one without #ifdefs) ?

thanks
shriram

Ian.
>
> >
> >         shriram
> >
> >
> >
> > Ping.
> >
> >
> >         On Fri, Nov 4, 2011 at 5:14 AM, Ian Jackson
> >         <Ian.Jackson@eu.citrix.com> wrote:
> >                 rshriram@cs.ubc.ca writes ("[PATCH 0 of 2 V5] libxc:
> >                 checkpoint compression"):
> >                 > This patch series adds checkpoint compression
> >                 functionality, while
> >                 > running under Remus.
> >
> >                 ...
> >                 > Changes since last version:
> >                 > 1. use posix_memalign only on linux platforms and
> >                 switch to normal malloc for
> >                 >    the rest. stubdom compiles successfully.
> >
> >
> >                 Looking at this in more detail, I don't understand why
> >                 you're using
> >                 posix_memalign rather than just malloc, anyway.  If
> >                 it's necessary to
> >                 use posix_memalign on Linux, why is it OK to use
> >                 malloc on other
> >                 platforms ?
> >
> >                 Also this #ifdef is quite ugly.
> >
> >                 Ian.
> >
> >
> >
> >
>
>
>

--0015174c4648b4e59804b13c4b62
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<div class=3D"gmail_quote">On Tue, Nov 8, 2011 at 9:02 AM, Ian Campbell <sp=
an dir=3D"ltr">&lt;<a href=3D"mailto:Ian.Campbell@citrix.com">Ian.Campbell@=
citrix.com</a>&gt;</span> wrote:<br><blockquote class=3D"gmail_quote" style=
=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class=3D"HOEnZb"><div class=3D"h5">On Tue, 2011-11-08 at 16:51 +0000, =
Shriram Rajagopalan wrote:<br>
&gt; On Fri, Nov 4, 2011 at 12:21 PM, Shriram Rajagopalan<br>
&gt; &lt;<a href=3D"mailto:rshriram@cs.ubc.ca">rshriram@cs.ubc.ca</a>&gt; w=
rote:<br>
&gt; =A0 =A0 =A0 =A0 Why posix_memalign?<br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 The compression code involves a lot of memcpys at 4K<b=
r>
&gt; =A0 =A0 =A0 =A0 granularity (dirty pages<br>
&gt; =A0 =A0 =A0 =A0 copied from domU&#39;s memory to internal cache/page b=
uffers etc).<br>
&gt; =A0 =A0 =A0 =A0 I would like to<br>
&gt; =A0 =A0 =A0 =A0 keep these memcpys page aligned for purposes of speed.=
 The<br>
&gt; =A0 =A0 =A0 =A0 source pages<br>
&gt; =A0 =A0 =A0 =A0 (from domU) are already aligned. The destination pages=
<br>
&gt; =A0 =A0 =A0 =A0 allocated by the<br>
&gt; =A0 =A0 =A0 =A0 compression code need to be page aligned.<br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 correct me if I am wrong:<br>
&gt; =A0 =A0 =A0 =A0 =A0mallocing a huge buffer for this purpose is not opt=
imal.<br>
&gt; =A0 =A0 =A0 =A0 malloc aligns allocations<br>
&gt; =A0 =A0 =A0 =A0 =A0on 16byte (or 8byte) granularity but if a 4K region=
 straddles<br>
&gt; =A0 =A0 =A0 =A0 across two physical<br>
&gt; =A0 =A0 =A0 =A0 memory frames, then the memcpy is going to be suboptim=
al.<br>
&gt; =A0 =A0 =A0 =A0 OTOH, memalign<br>
&gt; =A0 =A0 =A0 =A0 ensures that we are dealing with just 2 memory frames =
as<br>
&gt; =A0 =A0 =A0 =A0 opposed<br>
&gt; =A0 =A0 =A0 =A0 to 3 (possible) frames in malloc.<br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 A simple 8Mb memcpy test shows an average of 500us ove=
rhead<br>
&gt; =A0 =A0 =A0 =A0 for malloc<br>
&gt; =A0 =A0 =A0 =A0 based allocation compared to posix_memalign based allo=
cation.<br>
&gt; =A0 =A0 =A0 =A0 While this<br>
&gt; =A0 =A0 =A0 =A0 might seem low, the checkpoints are being taken at hig=
h<br>
&gt; =A0 =A0 =A0 =A0 frequency<br>
&gt; =A0 =A0 =A0 =A0 (every 20ms for instance).<br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 It is not okay to use malloc on other platforms. I sim=
ply dont<br>
&gt; =A0 =A0 =A0 =A0 have access to other<br>
&gt; =A0 =A0 =A0 =A0 platforms to test their equivalent versions. =A0Short =
of using<br>
&gt; =A0 =A0 =A0 =A0 something<br>
&gt; =A0 =A0 =A0 =A0 like qemu_memalign function.<br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 I am open to suggestions :)<br>
<br>
</div></div>This is due to minios (aka stubdoms) not having posix_memalign,=
 right?<br>
<br>
minios (or rather newlib) does appear to have memalign though, which if<br>
true would also work, right? You could potentially also implement<br>
posix_memalign in terms of memalign on minios and avoid the ifdef.<br>
<span class=3D"HOEnZb"><font color=3D"#888888"><br></font></span></blockquo=
te><div><br>Sounds good. In that case, can I just post a patch to minios, i=
mplementing<br>posix_memalign and will you then directly take the previous =
version V4 of this<br>

patch series (the one without #ifdefs) ?<br><br>thanks<br>shriram<br><br></=
div><blockquote class=3D"gmail_quote" style=3D"margin: 0pt 0pt 0pt 0.8ex; b=
order-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><span class=
=3D"HOEnZb"><font color=3D"#888888">
Ian.<br>
</font></span><div class=3D"HOEnZb"><div class=3D"h5"><br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 shriram<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; Ping.<br>
&gt;<br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 On Fri, Nov 4, 2011 at 5:14 AM, Ian Jackson<br>
&gt; =A0 =A0 =A0 =A0 &lt;<a href=3D"mailto:Ian.Jackson@eu.citrix.com">Ian.J=
ackson@eu.citrix.com</a>&gt; wrote:<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 <a href=3D"mailto:rshriram@cs.ubc.ca">=
rshriram@cs.ubc.ca</a> writes (&quot;[PATCH 0 of 2 V5] libxc:<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 checkpoint compression&quot;):<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &gt; This patch series adds checkpoint=
 compression<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 functionality, while<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &gt; running under Remus.<br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ...<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &gt; Changes since last version:<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &gt; 1. use posix_memalign only on lin=
ux platforms and<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 switch to normal malloc for<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &gt; =A0 =A0the rest. stubdom compiles=
 successfully.<br>
&gt;<br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 Looking at this in more detail, I don&=
#39;t understand why<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 you&#39;re using<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 posix_memalign rather than just malloc=
, anyway. =A0If<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 it&#39;s necessary to<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 use posix_memalign on Linux, why is it=
 OK to use<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 malloc on other<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 platforms ?<br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 Also this #ifdef is quite ugly.<br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 Ian.<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
<br>
<br>
</div></div></blockquote></div><br>

--0015174c4648b4e59804b13c4b62--


--===============0233787107==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0233787107==--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 09:20:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 09:20:42 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNpLl-0007m1-4h; Tue, 08 Nov 2011 09:20:41 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNpHN-00074t-2Y
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 09:16:11 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1320772565!2351842!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9981 invoked from network); 8 Nov 2011 17:16:05 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 17:16:05 -0000
X-IronPort-AV: E=Sophos;i="4.69,477,1315180800"; 
   d="scan'208";a="8823936"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 17:16:05 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Tue, 8 Nov 2011
	17:16:05 +0000
Subject: Re: [Xen-devel] Re: [PATCH 0 of 2 V5] libxc: checkpoint compression
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "rshriram@cs.ubc.ca" <rshriram@cs.ubc.ca>
Date: Tue, 8 Nov 2011 17:16:04 +0000
In-Reply-To: <CAP8mzPO49gNVbouAB8nehBRC4K7Q37O+FgX8bGR_3EHSY8p6JQ@mail.gmail.com>
References: <patchbomb.1320350703@athos.nss.cs.ubc.ca>
	<20147.55048.90214.665321@mariner.uk.xensource.com>
	<CAP8mzPM1Fxj6M5R+H79nKToSCxHxsMaq1CKN=csjRMMocG0LRA@mail.gmail.com>
	<CAP8mzPOqv9oiNyCRTSz9DaBDwB-MtOvPJ9+3xc5NwAepOgUm7w@mail.gmail.com>
	<1320771752.955.109.camel@zakaz.uk.xensource.com>
	<CAP8mzPO49gNVbouAB8nehBRC4K7Q37O+FgX8bGR_3EHSY8p6JQ@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320772565.955.110.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "brendan@cs.ubc.ca" <brendan@cs.ubc.ca>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-11-08 at 17:13 +0000, Shriram Rajagopalan wrote:
> On Tue, Nov 8, 2011 at 9:02 AM, Ian Campbell <Ian.Campbell@citrix.com>
> wrote:
>         On Tue, 2011-11-08 at 16:51 +0000, Shriram Rajagopalan wrote:
>         > On Fri, Nov 4, 2011 at 12:21 PM, Shriram Rajagopalan
>         > <rshriram@cs.ubc.ca> wrote:
>         >         Why posix_memalign?
>         >
>         >         The compression code involves a lot of memcpys at 4K
>         >         granularity (dirty pages
>         >         copied from domU's memory to internal cache/page
>         buffers etc).
>         >         I would like to
>         >         keep these memcpys page aligned for purposes of
>         speed. The
>         >         source pages
>         >         (from domU) are already aligned. The destination
>         pages
>         >         allocated by the
>         >         compression code need to be page aligned.
>         >
>         >         correct me if I am wrong:
>         >          mallocing a huge buffer for this purpose is not
>         optimal.
>         >         malloc aligns allocations
>         >          on 16byte (or 8byte) granularity but if a 4K region
>         straddles
>         >         across two physical
>         >         memory frames, then the memcpy is going to be
>         suboptimal.
>         >         OTOH, memalign
>         >         ensures that we are dealing with just 2 memory
>         frames as
>         >         opposed
>         >         to 3 (possible) frames in malloc.
>         >
>         >         A simple 8Mb memcpy test shows an average of 500us
>         overhead
>         >         for malloc
>         >         based allocation compared to posix_memalign based
>         allocation.
>         >         While this
>         >         might seem low, the checkpoints are being taken at
>         high
>         >         frequency
>         >         (every 20ms for instance).
>         >
>         >         It is not okay to use malloc on other platforms. I
>         simply dont
>         >         have access to other
>         >         platforms to test their equivalent versions.  Short
>         of using
>         >         something
>         >         like qemu_memalign function.
>         >
>         >         I am open to suggestions :)
>         
>         
>         This is due to minios (aka stubdoms) not having
>         posix_memalign, right?
>         
>         minios (or rather newlib) does appear to have memalign though,
>         which if
>         true would also work, right? You could potentially also
>         implement
>         posix_memalign in terms of memalign on minios and avoid the
>         ifdef.
>         
> 
> Sounds good. In that case, can I just post a patch to minios,
> implementing posix_memalign and will you then directly take the
> previous version V4 of this patch series (the one without #ifdefs) ?

Well, *I* won't be taking any version of the patch but that sounds like
a sane plan to me, assuming V4 builds after your minios patch.

> 
> thanks
> shriram
> 
> 
>         Ian.
>         
>         >
>         >         shriram
>         >
>         >
>         >
>         > Ping.
>         >
>         >
>         >         On Fri, Nov 4, 2011 at 5:14 AM, Ian Jackson
>         >         <Ian.Jackson@eu.citrix.com> wrote:
>         >                 rshriram@cs.ubc.ca writes ("[PATCH 0 of 2
>         V5] libxc:
>         >                 checkpoint compression"):
>         >                 > This patch series adds checkpoint
>         compression
>         >                 functionality, while
>         >                 > running under Remus.
>         >
>         >                 ...
>         >                 > Changes since last version:
>         >                 > 1. use posix_memalign only on linux
>         platforms and
>         >                 switch to normal malloc for
>         >                 >    the rest. stubdom compiles
>         successfully.
>         >
>         >
>         >                 Looking at this in more detail, I don't
>         understand why
>         >                 you're using
>         >                 posix_memalign rather than just malloc,
>         anyway.  If
>         >                 it's necessary to
>         >                 use posix_memalign on Linux, why is it OK to
>         use
>         >                 malloc on other
>         >                 platforms ?
>         >
>         >                 Also this #ifdef is quite ugly.
>         >
>         >                 Ian.
>         >
>         >
>         >
>         >
>         
>         
>         
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 09:24:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 09:24:25 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNpPN-0008IP-3I; Tue, 08 Nov 2011 09:24:25 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNpNa-00084L-K7
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 09:22:35 -0800
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-14.tower-182.messagelabs.com!1320772866!2341771!1
X-Originating-IP: [142.103.6.52]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31332 invoked from network); 8 Nov 2011 17:22:05 -0000
Received: from smtp.cs.ubc.ca (HELO smtp.cs.ubc.ca) (142.103.6.52)
	by server-14.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 17:22:05 -0000
Received: from mail-bw0-f43.google.com (mail-bw0-f43.google.com
	[209.85.214.43]) (authenticated bits=0)
	by smtp.cs.ubc.ca (8.14.3/8.13.6) with ESMTP id pA8HL0iK016920
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=FAIL)
	for <xen-devel@lists.xensource.com>; Tue, 8 Nov 2011 09:21:01 -0800
Received: by bkbzt12 with SMTP id zt12so824612bkb.30
	for <xen-devel@lists.xensource.com>;
	Tue, 08 Nov 2011 09:20:59 -0800 (PST)
Received: by 10.204.34.75 with SMTP id k11mr23556159bkd.68.1320772859171; Tue,
	08 Nov 2011 09:20:59 -0800 (PST)
MIME-Version: 1.0
Received: by 10.204.180.130 with HTTP; Tue, 8 Nov 2011 09:20:18 -0800 (PST)
In-Reply-To: <1320772565.955.110.camel@zakaz.uk.xensource.com>
References: <patchbomb.1320350703@athos.nss.cs.ubc.ca>
	<20147.55048.90214.665321@mariner.uk.xensource.com>
	<CAP8mzPM1Fxj6M5R+H79nKToSCxHxsMaq1CKN=csjRMMocG0LRA@mail.gmail.com>
	<CAP8mzPOqv9oiNyCRTSz9DaBDwB-MtOvPJ9+3xc5NwAepOgUm7w@mail.gmail.com>
	<1320771752.955.109.camel@zakaz.uk.xensource.com>
	<CAP8mzPO49gNVbouAB8nehBRC4K7Q37O+FgX8bGR_3EHSY8p6JQ@mail.gmail.com>
	<1320772565.955.110.camel@zakaz.uk.xensource.com>
From: Shriram Rajagopalan <rshriram@cs.ubc.ca>
Date: Tue, 8 Nov 2011 09:20:18 -0800
Message-ID: <CAP8mzPPZcU6H_EtadDZZ2aTwXMxxtAQntpFPZ7aQ1g5k1nSKcA@mail.gmail.com>
Subject: Re: [Xen-devel] Re: [PATCH 0 of 2 V5] libxc: checkpoint compression
To: Ian Campbell <Ian.Campbell@citrix.com>
Cc: "brendan@cs.ubc.ca" <brendan@cs.ubc.ca>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: rshriram@cs.ubc.ca
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1655701622=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1655701622==
Content-Type: multipart/alternative; boundary=0022154015921993d204b13c6507

--0022154015921993d204b13c6507
Content-Type: text/plain; charset=ISO-8859-1

On Tue, Nov 8, 2011 at 9:16 AM, Ian Campbell <Ian.Campbell@citrix.com>wrote:

> On Tue, 2011-11-08 at 17:13 +0000, Shriram Rajagopalan wrote:
> > On Tue, Nov 8, 2011 at 9:02 AM, Ian Campbell <Ian.Campbell@citrix.com>
> > wrote:
> >         On Tue, 2011-11-08 at 16:51 +0000, Shriram Rajagopalan wrote:
> >         > On Fri, Nov 4, 2011 at 12:21 PM, Shriram Rajagopalan
> >         > <rshriram@cs.ubc.ca> wrote:
> >         >         Why posix_memalign?
> >         >
> >         >         The compression code involves a lot of memcpys at 4K
> >         >         granularity (dirty pages
> >         >         copied from domU's memory to internal cache/page
> >         buffers etc).
> >         >         I would like to
> >         >         keep these memcpys page aligned for purposes of
> >         speed. The
> >         >         source pages
> >         >         (from domU) are already aligned. The destination
> >         pages
> >         >         allocated by the
> >         >         compression code need to be page aligned.
> >         >
> >         >         correct me if I am wrong:
> >         >          mallocing a huge buffer for this purpose is not
> >         optimal.
> >         >         malloc aligns allocations
> >         >          on 16byte (or 8byte) granularity but if a 4K region
> >         straddles
> >         >         across two physical
> >         >         memory frames, then the memcpy is going to be
> >         suboptimal.
> >         >         OTOH, memalign
> >         >         ensures that we are dealing with just 2 memory
> >         frames as
> >         >         opposed
> >         >         to 3 (possible) frames in malloc.
> >         >
> >         >         A simple 8Mb memcpy test shows an average of 500us
> >         overhead
> >         >         for malloc
> >         >         based allocation compared to posix_memalign based
> >         allocation.
> >         >         While this
> >         >         might seem low, the checkpoints are being taken at
> >         high
> >         >         frequency
> >         >         (every 20ms for instance).
> >         >
> >         >         It is not okay to use malloc on other platforms. I
> >         simply dont
> >         >         have access to other
> >         >         platforms to test their equivalent versions.  Short
> >         of using
> >         >         something
> >         >         like qemu_memalign function.
> >         >
> >         >         I am open to suggestions :)
> >
> >
> >         This is due to minios (aka stubdoms) not having
> >         posix_memalign, right?
> >
> >         minios (or rather newlib) does appear to have memalign though,
> >         which if
> >         true would also work, right? You could potentially also
> >         implement
> >         posix_memalign in terms of memalign on minios and avoid the
> >         ifdef.
> >
> >
> > Sounds good. In that case, can I just post a patch to minios,
> > implementing posix_memalign and will you then directly take the
> > previous version V4 of this patch series (the one without #ifdefs) ?
>
> Well, *I* won't be taking any version of the patch but that sounds like
> a sane plan to me, assuming V4 builds after your minios patch.
>
>
oops. sorry.. I was referring to IanJ.

 >
> > thanks
> > shriram
> >
> >
> >         Ian.
> >
> >         >
> >         >         shriram
> >         >
> >         >
> >         >
> >         > Ping.
> >         >
> >         >
> >         >         On Fri, Nov 4, 2011 at 5:14 AM, Ian Jackson
> >         >         <Ian.Jackson@eu.citrix.com> wrote:
> >         >                 rshriram@cs.ubc.ca writes ("[PATCH 0 of 2
> >         V5] libxc:
> >         >                 checkpoint compression"):
> >         >                 > This patch series adds checkpoint
> >         compression
> >         >                 functionality, while
> >         >                 > running under Remus.
> >         >
> >         >                 ...
> >         >                 > Changes since last version:
> >         >                 > 1. use posix_memalign only on linux
> >         platforms and
> >         >                 switch to normal malloc for
> >         >                 >    the rest. stubdom compiles
> >         successfully.
> >         >
> >         >
> >         >                 Looking at this in more detail, I don't
> >         understand why
> >         >                 you're using
> >         >                 posix_memalign rather than just malloc,
> >         anyway.  If
> >         >                 it's necessary to
> >         >                 use posix_memalign on Linux, why is it OK to
> >         use
> >         >                 malloc on other
> >         >                 platforms ?
> >         >
> >         >                 Also this #ifdef is quite ugly.
> >         >
> >         >                 Ian.
> >         >
> >         >
> >         >
> >         >
> >
> >
> >
> >
>
>
>

--0022154015921993d204b13c6507
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<div class=3D"gmail_quote">On Tue, Nov 8, 2011 at 9:16 AM, Ian Campbell <sp=
an dir=3D"ltr">&lt;<a href=3D"mailto:Ian.Campbell@citrix.com">Ian.Campbell@=
citrix.com</a>&gt;</span> wrote:<br><blockquote class=3D"gmail_quote" style=
=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class=3D"HOEnZb"><div class=3D"h5">On Tue, 2011-11-08 at 17:13 +0000, =
Shriram Rajagopalan wrote:<br>
&gt; On Tue, Nov 8, 2011 at 9:02 AM, Ian Campbell &lt;<a href=3D"mailto:Ian=
.Campbell@citrix.com">Ian.Campbell@citrix.com</a>&gt;<br>
&gt; wrote:<br>
&gt; =A0 =A0 =A0 =A0 On Tue, 2011-11-08 at 16:51 +0000, Shriram Rajagopalan=
 wrote:<br>
&gt; =A0 =A0 =A0 =A0 &gt; On Fri, Nov 4, 2011 at 12:21 PM, Shriram Rajagopa=
lan<br>
&gt; =A0 =A0 =A0 =A0 &gt; &lt;<a href=3D"mailto:rshriram@cs.ubc.ca">rshrira=
m@cs.ubc.ca</a>&gt; wrote:<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 Why posix_memalign?<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 The compression code involves a l=
ot of memcpys at 4K<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 granularity (dirty pages<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 copied from domU&#39;s memory to =
internal cache/page<br>
&gt; =A0 =A0 =A0 =A0 buffers etc).<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 I would like to<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 keep these memcpys page aligned f=
or purposes of<br>
&gt; =A0 =A0 =A0 =A0 speed. The<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 source pages<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 (from domU) are already aligned. =
The destination<br>
&gt; =A0 =A0 =A0 =A0 pages<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 allocated by the<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 compression code need to be page =
aligned.<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 correct me if I am wrong:<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0mallocing a huge buffer for th=
is purpose is not<br>
&gt; =A0 =A0 =A0 =A0 optimal.<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 malloc aligns allocations<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0on 16byte (or 8byte) granulari=
ty but if a 4K region<br>
&gt; =A0 =A0 =A0 =A0 straddles<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 across two physical<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 memory frames, then the memcpy is=
 going to be<br>
&gt; =A0 =A0 =A0 =A0 suboptimal.<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 OTOH, memalign<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 ensures that we are dealing with =
just 2 memory<br>
&gt; =A0 =A0 =A0 =A0 frames as<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 opposed<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 to 3 (possible) frames in malloc.=
<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 A simple 8Mb memcpy test shows an=
 average of 500us<br>
&gt; =A0 =A0 =A0 =A0 overhead<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 for malloc<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 based allocation compared to posi=
x_memalign based<br>
&gt; =A0 =A0 =A0 =A0 allocation.<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 While this<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 might seem low, the checkpoints a=
re being taken at<br>
&gt; =A0 =A0 =A0 =A0 high<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 frequency<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 (every 20ms for instance).<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 It is not okay to use malloc on o=
ther platforms. I<br>
&gt; =A0 =A0 =A0 =A0 simply dont<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 have access to other<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 platforms to test their equivalen=
t versions. =A0Short<br>
&gt; =A0 =A0 =A0 =A0 of using<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 something<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 like qemu_memalign function.<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 I am open to suggestions :)<br>
&gt;<br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 This is due to minios (aka stubdoms) not having<br>
&gt; =A0 =A0 =A0 =A0 posix_memalign, right?<br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 minios (or rather newlib) does appear to have memalign=
 though,<br>
&gt; =A0 =A0 =A0 =A0 which if<br>
&gt; =A0 =A0 =A0 =A0 true would also work, right? You could potentially als=
o<br>
&gt; =A0 =A0 =A0 =A0 implement<br>
&gt; =A0 =A0 =A0 =A0 posix_memalign in terms of memalign on minios and avoi=
d the<br>
&gt; =A0 =A0 =A0 =A0 ifdef.<br>
&gt;<br>
&gt;<br>
&gt; Sounds good. In that case, can I just post a patch to minios,<br>
&gt; implementing posix_memalign and will you then directly take the<br>
&gt; previous version V4 of this patch series (the one without #ifdefs) ?<b=
r>
<br>
</div></div>Well, *I* won&#39;t be taking any version of the patch but that=
 sounds like<br>
a sane plan to me, assuming V4 builds after your minios patch.<br>
<div class=3D"HOEnZb"><div class=3D"h5"><br></div></div></blockquote><div><=
br>oops. sorry.. I was referring to IanJ.=A0 <br><br></div><blockquote clas=
s=3D"gmail_quote" style=3D"margin: 0pt 0pt 0pt 0.8ex; border-left: 1px soli=
d rgb(204, 204, 204); padding-left: 1ex;">

<div class=3D"HOEnZb"><div class=3D"h5">
&gt;<br>
&gt; thanks<br>
&gt; shriram<br>
&gt;<br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 Ian.<br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 shriram<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; Ping.<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 On Fri, Nov 4, 2011 at 5:14 AM, I=
an Jackson<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 &lt;<a href=3D"mailto:Ian.Jackson=
@eu.citrix.com">Ian.Jackson@eu.citrix.com</a>&gt; wrote:<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 <a href=3D"mailto=
:rshriram@cs.ubc.ca">rshriram@cs.ubc.ca</a> writes (&quot;[PATCH 0 of 2<br>
&gt; =A0 =A0 =A0 =A0 V5] libxc:<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 checkpoint compre=
ssion&quot;):<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &gt; This patch s=
eries adds checkpoint<br>
&gt; =A0 =A0 =A0 =A0 compression<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 functionality, wh=
ile<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &gt; running unde=
r Remus.<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ...<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &gt; Changes sinc=
e last version:<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &gt; 1. use posix=
_memalign only on linux<br>
&gt; =A0 =A0 =A0 =A0 platforms and<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 switch to normal =
malloc for<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &gt; =A0 =A0the r=
est. stubdom compiles<br>
&gt; =A0 =A0 =A0 =A0 successfully.<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 Looking at this i=
n more detail, I don&#39;t<br>
&gt; =A0 =A0 =A0 =A0 understand why<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 you&#39;re using<=
br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 posix_memalign ra=
ther than just malloc,<br>
&gt; =A0 =A0 =A0 =A0 anyway. =A0If<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 it&#39;s necessar=
y to<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 use posix_memalig=
n on Linux, why is it OK to<br>
&gt; =A0 =A0 =A0 =A0 use<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 malloc on other<b=
r>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 platforms ?<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 Also this #ifdef =
is quite ugly.<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 Ian.<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
<br>
<br>
</div></div></blockquote></div><br>

--0022154015921993d204b13c6507--


--===============1655701622==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1655701622==--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 09:35:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 09:35:24 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNpa0-0000OJ-DS; Tue, 08 Nov 2011 09:35:24 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNpYl-0000Ap-Cu
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 09:34:07 -0800
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-10.tower-27.messagelabs.com!1320773614!43132780!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18342 invoked from network); 8 Nov 2011 17:33:34 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-10.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 8 Nov 2011 17:33:34 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320773643; l=2542;
	s=domk; d=aepfle.de;
	h=To:From:Date:Subject:Content-Transfer-Encoding:MIME-Version:
	Content-Type:X-RZG-CLASS-ID:X-RZG-AUTH;
	bh=07ZX4oKozbUdZuH2xUqI8eMeOaM=;
	b=LWzXRcH9DlSvg07DvgM5wJIG0qwmTaRHe7hIZ83HKxnybaSzakSB9boNgMN/4AGvZXa
	iztManv070hu6EfWAxyAYrlpQ7o+D/2hulbe2DXfQo3Xi7t1ALFIUHZqru2kxbAHPpZCB
	p/ODuFgjdjapQ26ZvDVVi2aRqTfn0a5KKqo=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV67U=
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-1.vodafone-net.de [80.226.24.1])
	by smtp.strato.de (jimi mo64) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id t02b95nA8FssdP
	for <xen-devel@lists.xensource.com>;
	Tue, 8 Nov 2011 18:33:55 +0100 (MET)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 2122E18637
	for <xen-devel@lists.xensource.com>;
	Tue,  8 Nov 2011 18:33:53 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: a7e49740fbfe3a4ec0a21186e2a4c579a30e0838
Message-Id: <a7e49740fbfe3a4ec0a2.1320773631@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Tue, 08 Nov 2011 18:33:51 +0100
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] mem_event: check capabilities only once
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1320773602 -3600
# Node ID a7e49740fbfe3a4ec0a21186e2a4c579a30e0838
# Parent  c681dd5aecf3da3c6fd0e4d8a760a9cd18617033
mem_event: check capabilities only once

It is not required to check the system capabilities during every domctl.
Rearrange the code to check them only once.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r c681dd5aecf3 -r a7e49740fbfe xen/arch/x86/mm/mem_event.c
--- a/xen/arch/x86/mm/mem_event.c
+++ b/xen/arch/x86/mm/mem_event.c
@@ -253,32 +253,35 @@ int mem_event_domctl(struct domain *d, x
     case XEN_DOMCTL_MEM_EVENT_OP_PAGING:
     {
         struct mem_event_domain *med = &d->mem_paging;
-        struct p2m_domain *p2m = p2m_get_hostp2m(d);
-        rc = -ENODEV;
-        /* Only HAP is supported */
-        if ( !hap_enabled(d) )
-            break;
-
-        /* Currently only EPT is supported */
-        if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL )
-            break;
-
-        rc = -EXDEV;
-        /* Disallow paging in a PoD guest */
-        if ( p2m->pod.entry_count )
-            break;
+        rc = -EINVAL;
 
         switch( mec->op )
         {
         case XEN_DOMCTL_MEM_EVENT_OP_PAGING_ENABLE:
         {
+            struct p2m_domain *p2m = p2m_get_hostp2m(d);
+            rc = -ENODEV;
+            /* Only HAP is supported */
+            if ( !hap_enabled(d) )
+                break;
+
+            /* Currently only EPT is supported */
+            if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL )
+                break;
+
+            rc = -EXDEV;
+            /* Disallow paging in a PoD guest */
+            if ( p2m->pod.entry_count )
+                break;
+
             rc = mem_event_enable(d, mec, med);
         }
         break;
 
         case XEN_DOMCTL_MEM_EVENT_OP_PAGING_DISABLE:
         {
-            rc = mem_event_disable(med);
+            if ( med->ring_page )
+                rc = mem_event_disable(med);
         }
         break;
 
@@ -295,26 +298,29 @@ int mem_event_domctl(struct domain *d, x
     case XEN_DOMCTL_MEM_EVENT_OP_ACCESS: 
     {
         struct mem_event_domain *med = &d->mem_access;
-        rc = -ENODEV;
-        /* Only HAP is supported */
-        if ( !hap_enabled(d) )
-            break;
-
-        /* Currently only EPT is supported */
-        if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL )
-            break;
+        rc = -EINVAL;
 
         switch( mec->op )
         {
         case XEN_DOMCTL_MEM_EVENT_OP_ACCESS_ENABLE:
         {
+            rc = -ENODEV;
+            /* Only HAP is supported */
+            if ( !hap_enabled(d) )
+                break;
+
+            /* Currently only EPT is supported */
+            if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL )
+                break;
+
             rc = mem_event_enable(d, mec, med);
         }
         break;
 
         case XEN_DOMCTL_MEM_EVENT_OP_ACCESS_DISABLE:
         {
-            rc = mem_event_disable(&d->mem_access);
+            if ( med->ring_page )
+                rc = mem_event_disable(&d->mem_access);
         }
         break;
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 09:37:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 09:37:03 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNpbb-0000mi-1y; Tue, 08 Nov 2011 09:37:03 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNpZA-0000CJ-2e
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 09:34:33 -0800
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-9.tower-182.messagelabs.com!1320773668!2354137!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29978 invoked from network); 8 Nov 2011 17:34:29 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-9.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 8 Nov 2011 17:34:29 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320773668; l=828;
	s=domk; d=aepfle.de;
	h=To:From:Date:Subject:Content-Transfer-Encoding:MIME-Version:
	Content-Type:X-RZG-CLASS-ID:X-RZG-AUTH;
	bh=uorDvkP0vkIoXQIeN5wexX8l2Xg=;
	b=WpQDPrKnWCoZSpu1a3D4KBq6yxyuDdAG2PBR751WFxAdt54zFbjHbfNSIeJEd4dC159
	1SByEpH/y7sXngMMMFd1DnlbjlR7vTAQnDCAcscLq331kTGmjt3ujJlXQiOovXVPn/HAS
	zWuvNLfdoffrF90EzlVkqSNSPpTfLaJM3D4=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV67U=
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-1.vodafone-net.de [80.226.24.1])
	by smtp.strato.de (cohen mo54) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id N06de5nA8FhuWd
	for <xen-devel@lists.xensource.com>;
	Tue, 8 Nov 2011 18:34:25 +0100 (MET)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 1602018637
	for <xen-devel@lists.xensource.com>;
	Tue,  8 Nov 2011 18:34:23 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: c6f1423918baecb7a11eb7a151b9d5fb00888228
Message-Id: <c6f1423918baecb7a11e.1320773661@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Tue, 08 Nov 2011 18:34:21 +0100
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] xenpaging: compare domain pointer in
	p2m_mem_paging_populate
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1320773636 -3600
# Node ID c6f1423918baecb7a11eb7a151b9d5fb00888228
# Parent  a7e49740fbfe3a4ec0a21186e2a4c579a30e0838
xenpaging: compare domain pointer in p2m_mem_paging_populate

Compare just the domain pointer instead of the domain_id number.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r a7e49740fbfe -r c6f1423918ba xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -906,7 +906,7 @@ void p2m_mem_paging_populate(struct doma
     p2m_unlock(p2m);
 
     /* Pause domain if request came from guest and gfn has paging type */
-    if (  p2m_is_paging(p2mt) && v->domain->domain_id == d->domain_id )
+    if (  p2m_is_paging(p2mt) && v->domain == d )
     {
         vcpu_pause_nosync(v);
         req.flags |= MEM_EVENT_FLAG_VCPU_PAUSED;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 09:38:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 09:38:41 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNpdA-0001AN-Sz; Tue, 08 Nov 2011 09:38:41 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNpZr-0000LM-Dh
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 09:35:17 -0800
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-7.tower-216.messagelabs.com!1320773712!2763435!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1725 invoked from network); 8 Nov 2011 17:35:12 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-7.tower-216.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 8 Nov 2011 17:35:12 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320773711; l=1592;
	s=domk; d=aepfle.de;
	h=To:From:Date:Subject:Content-Transfer-Encoding:MIME-Version:
	Content-Type:X-RZG-CLASS-ID:X-RZG-AUTH;
	bh=cx7gVFRVRWFx4t6w/P595EOliE8=;
	b=wikWR84j2JKMkyjXcPPCZtOWmJ+tU02tErnQaz5ED9qnMvO/dCWlHBhrji72Z+81Vl+
	04MRsbpclygeLUnTkbMUIEBiBfQCWb5Vgg3xMCMgB3d/btP1ddx9UMeS39iWVAFoozGDk
	rhUk9LGJxIkKms1YlexoQ1Y8Kg7rAcirm+0=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV67U=
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-1.vodafone-net.de [80.226.24.1])
	by smtp.strato.de (fruni mo45) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id 6037c8nA8HPgwQ
	for <xen-devel@lists.xensource.com>;
	Tue, 8 Nov 2011 18:34:57 +0100 (MET)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 1E27F18637
	for <xen-devel@lists.xensource.com>;
	Tue,  8 Nov 2011 18:34:55 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 455f064fe54eeb57a43aa0c45a56cc4c4847d7a0
Message-Id: <455f064fe54eeb57a43a.1320773693@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Tue, 08 Nov 2011 18:34:53 +0100
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] waitqueue: increase stack array
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1320773665 -3600
# Node ID 455f064fe54eeb57a43aa0c45a56cc4c4847d7a0
# Parent  c6f1423918baecb7a11eb7a151b9d5fb00888228
waitqueue: increase stack array

In my testing 1500 bytes were not enough, at least 1800 bytes were required.
Allocate a whole page for waitqueue_vcpu and use the remainder as stack array.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r c6f1423918ba -r 455f064fe54e xen/common/wait.c
--- a/xen/common/wait.c
+++ b/xen/common/wait.c
@@ -33,7 +33,8 @@ struct waitqueue_vcpu {
      * hypervisor context before sleeping (descheduling), setjmp/longjmp-style.
      */
     void *esp;
-    char stack[1500];
+    unsigned short stack_len;
+    char stack[0];
 #endif
 };
 
@@ -41,12 +42,13 @@ int init_waitqueue_vcpu(struct vcpu *v)
 {
     struct waitqueue_vcpu *wqv;
 
-    wqv = xzalloc(struct waitqueue_vcpu);
+    wqv = alloc_xenheap_page();
     if ( wqv == NULL )
         return -ENOMEM;
 
     INIT_LIST_HEAD(&wqv->list);
     wqv->vcpu = v;
+    wqv->stack_len = PAGE_SIZE - sizeof(*wqv);
 
     v->waitqueue_vcpu = wqv;
 
@@ -62,7 +64,7 @@ void destroy_waitqueue_vcpu(struct vcpu 
         return;
 
     BUG_ON(!list_empty(&wqv->list));
-    xfree(wqv);
+    free_xenheap_page(wqv);
 
     v->waitqueue_vcpu = NULL;
 }
@@ -114,7 +116,7 @@ static void __prepare_to_wait(struct wai
         : "=S" (wqv->esp)
         : "c" (cpu_info), "D" (wqv->stack)
         : "memory" );
-    BUG_ON((cpu_info - (char *)wqv->esp) > sizeof(wqv->stack));
+    BUG_ON((cpu_info - (char *)wqv->esp) > wqv->stack_len);
 }
 
 static void __finish_wait(struct waitqueue_vcpu *wqv)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 09:50:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 09:50:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNpoY-0002PR-FX; Tue, 08 Nov 2011 09:50:27 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNpnj-0002Cr-AW
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 09:49:35 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1320774572!3373511!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30668 invoked from network); 8 Nov 2011 17:49:32 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 17:49:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,477,1315180800"; 
   d="scan'208";a="8824594"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 17:49:31 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 17:49:31 +0000
Date: Tue, 8 Nov 2011 17:50:13 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH DOCDAY] introduce an xl man page in pod format
In-Reply-To: <1320262456.3084.54.camel@cthulhu.hellion.org.uk>
Message-ID: <alpine.DEB.2.00.1111081746070.3519@kaball-desktop>
References: <alpine.DEB.2.00.1110271659380.3519@kaball-desktop>
	<20144.15937.655455.992347@mariner.uk.xensource.com>
	<1320262456.3084.54.camel@cthulhu.hellion.org.uk>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2 Nov 2011, Ian Campbell wrote:
> On Tue, 2011-11-01 at 14:45 -0400, Ian Jackson wrote:
> > Stefano Stabellini writes ("[Xen-devel] [PATCH DOCDAY] introduce an xl man page in pod format"):
> > > This is the initial version of an xl man page, based on the old xm man
> > > page.
> > 
> > Thanks.  I have applied this.  There were various suggestions for
> > improvements in the thread, but I think this manpage is better than
> > nothing so it should go in ASAP.  Further improvents are indeed
> > welcome and should come as patches against this.
> 
> Sure. Stefano, are you going to address the review or shall I do it?

I am going to address the review.
However I am not so sure about splitting the man page, after all using /
to search through it has worked very well in the past 40 years. Are you
sure you haven't been drinking the kool-aid? ;)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 11:32:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 11:32:40 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNrPU-0005tD-CR; Tue, 08 Nov 2011 11:32:40 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNrOn-0005fn-T1
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 11:31:58 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1320780714!3435441!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26640 invoked from network); 8 Nov 2011 19:31:54 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 19:31:54 -0000
X-IronPort-AV: E=Sophos;i="4.69,478,1315180800"; 
   d="scan'208";a="8825788"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 19:31:53 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 19:31:53 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RNrOj-0004As-Fx;
	Tue, 08 Nov 2011 19:31:53 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RNrOj-0002CB-FX;
	Tue, 08 Nov 2011 19:31:53 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9729-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 8 Nov 2011 19:31:53 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9729: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9729 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9729/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 build-amd64-oldkern           2 host-install(2)              broken
 build-amd64-pvops             2 host-install(2)              broken
 build-amd64                   2 host-install(2)              broken

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pv            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pair          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  7f150d70ce5c
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Jean Guyader <jean.guyader@eu.citrix.com>
  Juergen Gross <juergen.gross@ts.fujitsu.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
  Wei Wang <wei.wang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  broken  
 build-i386                                                   pass    
 build-amd64-oldkern                                          broken  
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           blocked 
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 blocked 
 test-amd64-i386-xl-credit2                                   blocked 
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               blocked 
 test-amd64-i386-xl-multivcpu                                 blocked 
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         blocked 
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           blocked 
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   blocked 
 test-amd64-i386-xl-win-vcpus1                                blocked 
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          blocked 
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

(No revision log; it would be 509 lines long.)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 11:43:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 11:43:24 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNrZr-0006R0-SV; Tue, 08 Nov 2011 11:43:23 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNrYz-0006Cn-Sj
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 11:42:31 -0800
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-13.tower-216.messagelabs.com!1320781343!2777398!1
X-Originating-IP: [142.103.6.52]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19258 invoked from network); 8 Nov 2011 19:42:25 -0000
Received: from smtp.cs.ubc.ca (HELO smtp.cs.ubc.ca) (142.103.6.52)
	by server-13.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 19:42:25 -0000
Received: from mail-bw0-f43.google.com (mail-bw0-f43.google.com
	[209.85.214.43]) (authenticated bits=0)
	by smtp.cs.ubc.ca (8.14.3/8.13.6) with ESMTP id pA8JgKSe004734
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=FAIL)
	for <xen-devel@lists.xensource.com>; Tue, 8 Nov 2011 11:42:21 -0800
Received: by bkbzt12 with SMTP id zt12so993821bkb.30
	for <xen-devel@lists.xensource.com>;
	Tue, 08 Nov 2011 11:42:19 -0800 (PST)
Received: by 10.205.117.10 with SMTP id fk10mr3252468bkc.29.1320781339377;
	Tue, 08 Nov 2011 11:42:19 -0800 (PST)
MIME-Version: 1.0
Received: by 10.204.180.130 with HTTP; Tue, 8 Nov 2011 11:41:38 -0800 (PST)
In-Reply-To: <CAP8mzPPZcU6H_EtadDZZ2aTwXMxxtAQntpFPZ7aQ1g5k1nSKcA@mail.gmail.com>
References: <patchbomb.1320350703@athos.nss.cs.ubc.ca>
	<20147.55048.90214.665321@mariner.uk.xensource.com>
	<CAP8mzPM1Fxj6M5R+H79nKToSCxHxsMaq1CKN=csjRMMocG0LRA@mail.gmail.com>
	<CAP8mzPOqv9oiNyCRTSz9DaBDwB-MtOvPJ9+3xc5NwAepOgUm7w@mail.gmail.com>
	<1320771752.955.109.camel@zakaz.uk.xensource.com>
	<CAP8mzPO49gNVbouAB8nehBRC4K7Q37O+FgX8bGR_3EHSY8p6JQ@mail.gmail.com>
	<1320772565.955.110.camel@zakaz.uk.xensource.com>
	<CAP8mzPPZcU6H_EtadDZZ2aTwXMxxtAQntpFPZ7aQ1g5k1nSKcA@mail.gmail.com>
From: Shriram Rajagopalan <rshriram@cs.ubc.ca>
Date: Tue, 8 Nov 2011 11:41:38 -0800
Message-ID: <CAP8mzPPKM5UYaJEkNJkK1rAzO8EJE3jzM5ZG49n_iQziNF=3sw@mail.gmail.com>
Subject: Re: [Xen-devel] Re: [PATCH 0 of 2 V5] libxc: checkpoint compression
To: Ian Campbell <Ian.Campbell@citrix.com>
Cc: "brendan@cs.ubc.ca" <brendan@cs.ubc.ca>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: rshriram@cs.ubc.ca
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0344264810=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0344264810==
Content-Type: multipart/alternative; boundary=000e0ce0d2248f3fa304b13e5edd

--000e0ce0d2248f3fa304b13e5edd
Content-Type: text/plain; charset=ISO-8859-1

On Tue, Nov 8, 2011 at 9:20 AM, Shriram Rajagopalan <rshriram@cs.ubc.ca>wrote:

> On Tue, Nov 8, 2011 at 9:16 AM, Ian Campbell <Ian.Campbell@citrix.com>wrote:
>
>> On Tue, 2011-11-08 at 17:13 +0000, Shriram Rajagopalan wrote:
>> > On Tue, Nov 8, 2011 at 9:02 AM, Ian Campbell <Ian.Campbell@citrix.com>
>> > wrote:
>> >         On Tue, 2011-11-08 at 16:51 +0000, Shriram Rajagopalan wrote:
>> >         > On Fri, Nov 4, 2011 at 12:21 PM, Shriram Rajagopalan
>> >         > <rshriram@cs.ubc.ca> wrote:
>> >         >         Why posix_memalign?
>> >         >
>> >         >         The compression code involves a lot of memcpys at 4K
>> >         >         granularity (dirty pages
>> >         >         copied from domU's memory to internal cache/page
>> >         buffers etc).
>> >         >         I would like to
>> >         >         keep these memcpys page aligned for purposes of
>> >         speed. The
>> >         >         source pages
>> >         >         (from domU) are already aligned. The destination
>> >         pages
>> >         >         allocated by the
>> >         >         compression code need to be page aligned.
>> >         >
>> >         >         correct me if I am wrong:
>> >         >          mallocing a huge buffer for this purpose is not
>> >         optimal.
>> >         >         malloc aligns allocations
>> >         >          on 16byte (or 8byte) granularity but if a 4K region
>> >         straddles
>> >         >         across two physical
>> >         >         memory frames, then the memcpy is going to be
>> >         suboptimal.
>> >         >         OTOH, memalign
>> >         >         ensures that we are dealing with just 2 memory
>> >         frames as
>> >         >         opposed
>> >         >         to 3 (possible) frames in malloc.
>> >         >
>> >         >         A simple 8Mb memcpy test shows an average of 500us
>> >         overhead
>> >         >         for malloc
>> >         >         based allocation compared to posix_memalign based
>> >         allocation.
>> >         >         While this
>> >         >         might seem low, the checkpoints are being taken at
>> >         high
>> >         >         frequency
>> >         >         (every 20ms for instance).
>> >         >
>> >         >         It is not okay to use malloc on other platforms. I
>> >         simply dont
>> >         >         have access to other
>> >         >         platforms to test their equivalent versions.  Short
>> >         of using
>> >         >         something
>> >         >         like qemu_memalign function.
>> >         >
>> >         >         I am open to suggestions :)
>> >
>> >
>> >         This is due to minios (aka stubdoms) not having
>> >         posix_memalign, right?
>> >
>> >         minios (or rather newlib) does appear to have memalign though,
>> >         which if
>> >         true would also work, right? You could potentially also
>> >         implement
>> >         posix_memalign in terms of memalign on minios and avoid the
>> >         ifdef.
>> >
>> >
>> > Sounds good. In that case, can I just post a patch to minios,
>> > implementing posix_memalign and will you then directly take the
>> > previous version V4 of this patch series (the one without #ifdefs) ?
>>
>> Well, *I* won't be taking any version of the patch but that sounds like
>> a sane plan to me, assuming V4 builds after your minios patch.
>>
>>
> oops. sorry.. I was referring to IanJ.
>
>
Just realized i forgot to state why I had to the __linux__.

a. minios lacks posix_memalign
b. I looked up online. solaris has no posix_memalign. I am not sure about
netbsd.
c. in tools/libxc/
xc_solaris.c uses memalign
xc_netbsd.c uses valloc
xc_minios.c uses memalign
xc_linux_osdep.c uses posix_memalign!

further posix_memalign manpage states that
*"*posix_memalign() verifies that *alignment* matches the requirements
detailed above.
 memalign**() may not check that the *boundary* argument is correct."

fortified by newlib-1.16.0's comments in mallocr.c
(newlib-1.16.0/newlib/libc/stdlib/)
"The alignment argument must be a power of two. This property is not
checked by memalign, so misuse may result in random runtime errors."

Judging by all this mess, I thought i was better off doing a #ifdef
__linux__ and
resorting to simple malloc for the other platforms.

One alternative would be to add the xc_memalign function alone, that was
removed
by c/s 22520.

-void *xc_memalign(size_t alignment, size_t size)
-{
-#if defined(_POSIX_C_SOURCE) && !defined(__sun__)
-    int ret;
-    void *ptr;
-    ret = posix_memalign(&ptr, alignment, size);
-    if (ret != 0)
-        return NULL;
-    return ptr;
-#elif defined(__NetBSD__) || defined(__OpenBSD__)
-    return valloc(size);
-#else
-    return memalign(alignment, size);
-#endif
-}
-

shriram


>  >
>> > thanks
>> > shriram
>> >
>> >
>> >         Ian.
>> >
>> >         >
>> >         >         shriram
>> >         >
>> >         >
>> >         >
>> >         > Ping.
>> >         >
>> >         >
>> >         >         On Fri, Nov 4, 2011 at 5:14 AM, Ian Jackson
>> >         >         <Ian.Jackson@eu.citrix.com> wrote:
>> >         >                 rshriram@cs.ubc.ca writes ("[PATCH 0 of 2
>> >         V5] libxc:
>> >         >                 checkpoint compression"):
>> >         >                 > This patch series adds checkpoint
>> >         compression
>> >         >                 functionality, while
>> >         >                 > running under Remus.
>> >         >
>> >         >                 ...
>> >         >                 > Changes since last version:
>> >         >                 > 1. use posix_memalign only on linux
>> >         platforms and
>> >         >                 switch to normal malloc for
>> >         >                 >    the rest. stubdom compiles
>> >         successfully.
>> >         >
>> >         >
>> >         >                 Looking at this in more detail, I don't
>> >         understand why
>> >         >                 you're using
>> >         >                 posix_memalign rather than just malloc,
>> >         anyway.  If
>> >         >                 it's necessary to
>> >         >                 use posix_memalign on Linux, why is it OK to
>> >         use
>> >         >                 malloc on other
>> >         >                 platforms ?
>> >         >
>> >         >                 Also this #ifdef is quite ugly.
>> >         >
>> >         >                 Ian.
>> >         >
>> >         >
>> >         >
>> >         >
>> >
>> >
>> >
>> >
>>
>>
>>
>

--000e0ce0d2248f3fa304b13e5edd
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<div class=3D"gmail_quote">On Tue, Nov 8, 2011 at 9:20 AM, Shriram Rajagopa=
lan <span dir=3D"ltr">&lt;<a href=3D"mailto:rshriram@cs.ubc.ca">rshriram@cs=
.ubc.ca</a>&gt;</span> wrote:<br><blockquote class=3D"gmail_quote" style=3D=
"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class=3D"gmail_quote"><div><div class=3D"h5">On Tue, Nov 8, 2011 at 9:=
16 AM, Ian Campbell <span dir=3D"ltr">&lt;<a href=3D"mailto:Ian.Campbell@ci=
trix.com" target=3D"_blank">Ian.Campbell@citrix.com</a>&gt;</span> wrote:<b=
r><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:=
1px #ccc solid;padding-left:1ex">


<div><div>On Tue, 2011-11-08 at 17:13 +0000, Shriram Rajagopalan wrote:<br>
&gt; On Tue, Nov 8, 2011 at 9:02 AM, Ian Campbell &lt;<a href=3D"mailto:Ian=
.Campbell@citrix.com" target=3D"_blank">Ian.Campbell@citrix.com</a>&gt;<br>
&gt; wrote:<br>
&gt; =A0 =A0 =A0 =A0 On Tue, 2011-11-08 at 16:51 +0000, Shriram Rajagopalan=
 wrote:<br>
&gt; =A0 =A0 =A0 =A0 &gt; On Fri, Nov 4, 2011 at 12:21 PM, Shriram Rajagopa=
lan<br>
&gt; =A0 =A0 =A0 =A0 &gt; &lt;<a href=3D"mailto:rshriram@cs.ubc.ca" target=
=3D"_blank">rshriram@cs.ubc.ca</a>&gt; wrote:<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 Why posix_memalign?<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 The compression code involves a l=
ot of memcpys at 4K<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 granularity (dirty pages<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 copied from domU&#39;s memory to =
internal cache/page<br>
&gt; =A0 =A0 =A0 =A0 buffers etc).<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 I would like to<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 keep these memcpys page aligned f=
or purposes of<br>
&gt; =A0 =A0 =A0 =A0 speed. The<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 source pages<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 (from domU) are already aligned. =
The destination<br>
&gt; =A0 =A0 =A0 =A0 pages<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 allocated by the<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 compression code need to be page =
aligned.<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 correct me if I am wrong:<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0mallocing a huge buffer for th=
is purpose is not<br>
&gt; =A0 =A0 =A0 =A0 optimal.<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 malloc aligns allocations<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0on 16byte (or 8byte) granulari=
ty but if a 4K region<br>
&gt; =A0 =A0 =A0 =A0 straddles<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 across two physical<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 memory frames, then the memcpy is=
 going to be<br>
&gt; =A0 =A0 =A0 =A0 suboptimal.<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 OTOH, memalign<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 ensures that we are dealing with =
just 2 memory<br>
&gt; =A0 =A0 =A0 =A0 frames as<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 opposed<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 to 3 (possible) frames in malloc.=
<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 A simple 8Mb memcpy test shows an=
 average of 500us<br>
&gt; =A0 =A0 =A0 =A0 overhead<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 for malloc<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 based allocation compared to posi=
x_memalign based<br>
&gt; =A0 =A0 =A0 =A0 allocation.<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 While this<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 might seem low, the checkpoints a=
re being taken at<br>
&gt; =A0 =A0 =A0 =A0 high<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 frequency<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 (every 20ms for instance).<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 It is not okay to use malloc on o=
ther platforms. I<br>
&gt; =A0 =A0 =A0 =A0 simply dont<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 have access to other<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 platforms to test their equivalen=
t versions. =A0Short<br>
&gt; =A0 =A0 =A0 =A0 of using<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 something<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 like qemu_memalign function.<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 I am open to suggestions :)<br>
&gt;<br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 This is due to minios (aka stubdoms) not having<br>
&gt; =A0 =A0 =A0 =A0 posix_memalign, right?<br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 minios (or rather newlib) does appear to have memalign=
 though,<br>
&gt; =A0 =A0 =A0 =A0 which if<br>
&gt; =A0 =A0 =A0 =A0 true would also work, right? You could potentially als=
o<br>
&gt; =A0 =A0 =A0 =A0 implement<br>
&gt; =A0 =A0 =A0 =A0 posix_memalign in terms of memalign on minios and avoi=
d the<br>
&gt; =A0 =A0 =A0 =A0 ifdef.<br>
&gt;<br>
&gt;<br>
&gt; Sounds good. In that case, can I just post a patch to minios,<br>
&gt; implementing posix_memalign and will you then directly take the<br>
&gt; previous version V4 of this patch series (the one without #ifdefs) ?<b=
r>
<br>
</div></div>Well, *I* won&#39;t be taking any version of the patch but that=
 sounds like<br>
a sane plan to me, assuming V4 builds after your minios patch.<br>
<div><div><br></div></div></blockquote></div></div><div><br>oops. sorry.. I=
 was referring to IanJ.=A0 <br><br></div></div></blockquote><div><br>Just r=
ealized i forgot to state why I had to the __linux__.<br><br>a. minios lack=
s posix_memalign<br>

b. I looked up online. solaris has no posix_memalign. I am not sure about n=
etbsd.<br>c. in tools/libxc/<br>xc_solaris.c uses memalign<br>xc_netbsd.c u=
ses valloc<br>xc_minios.c uses memalign<br>xc_linux_osdep.c uses posix_mema=
lign!<br>

<br>further posix_memalign manpage states that<br><b>&quot;</b><span class=
=3D"highlight">posix_memalign()</span> verifies that <i>alignment</i> match=
es the requirements detailed above.<br>=A0memalign<b></b>() may not check t=
hat the <i>boundary</i>
argument is correct.&quot;<br><br>fortified by newlib-1.16.0&#39;s comments=
 in mallocr.c (newlib-1.16.0/newlib/libc/stdlib/)<br>&quot;The alignment ar=
gument must be a power of two. This property is not<br>checked by memalign,=
 so misuse may result in random runtime errors.&quot;<br>

<br>Judging by all this mess, I thought i was better off doing a #ifdef __l=
inux__ and<br>resorting to simple malloc for the other platforms.<br><br>On=
e alternative would be to add the xc_memalign function alone, that was remo=
ved<br>

by c/s 22520.<br><br>-void *xc_memalign(size_t alignment, size_t size)<br>-=
{<br>-#if defined(_POSIX_C_SOURCE) &amp;&amp; !defined(__sun__)<br>-=A0=A0=
=A0 int ret;<br>-=A0=A0=A0 void *ptr;<br>-=A0=A0=A0 ret =3D posix_memalign(=
&amp;ptr, alignment, size);<br>

-=A0=A0=A0 if (ret !=3D 0)<br>-=A0=A0=A0=A0=A0=A0=A0 return NULL;<br>-=A0=
=A0=A0 return ptr;<br>-#elif defined(__NetBSD__) || defined(__OpenBSD__)<br=
>-=A0=A0=A0 return valloc(size);<br>-#else<br>-=A0=A0=A0 return memalign(al=
ignment, size);<br>-#endif<br>-}<br>-<br>

<br>shriram<br>=A0</div><blockquote class=3D"gmail_quote" style=3D"margin: =
0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left:=
 1ex;"><div class=3D"gmail_quote"><div></div><div><div class=3D"h5"><blockq=
uote class=3D"gmail_quote" style=3D"margin:0pt 0pt 0pt 0.8ex;border-left:1p=
x solid rgb(204, 204, 204);padding-left:1ex">


<div><div>
&gt;<br>
&gt; thanks<br>
&gt; shriram<br>
&gt;<br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 Ian.<br>
&gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 shriram<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; Ping.<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 On Fri, Nov 4, 2011 at 5:14 AM, I=
an Jackson<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 &lt;<a href=3D"mailto:Ian.Jackson=
@eu.citrix.com" target=3D"_blank">Ian.Jackson@eu.citrix.com</a>&gt; wrote:<=
br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 <a href=3D"mailto=
:rshriram@cs.ubc.ca" target=3D"_blank">rshriram@cs.ubc.ca</a> writes (&quot=
;[PATCH 0 of 2<br>
&gt; =A0 =A0 =A0 =A0 V5] libxc:<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 checkpoint compre=
ssion&quot;):<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &gt; This patch s=
eries adds checkpoint<br>
&gt; =A0 =A0 =A0 =A0 compression<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 functionality, wh=
ile<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &gt; running unde=
r Remus.<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ...<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &gt; Changes sinc=
e last version:<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &gt; 1. use posix=
_memalign only on linux<br>
&gt; =A0 =A0 =A0 =A0 platforms and<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 switch to normal =
malloc for<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &gt; =A0 =A0the r=
est. stubdom compiles<br>
&gt; =A0 =A0 =A0 =A0 successfully.<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 Looking at this i=
n more detail, I don&#39;t<br>
&gt; =A0 =A0 =A0 =A0 understand why<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 you&#39;re using<=
br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 posix_memalign ra=
ther than just malloc,<br>
&gt; =A0 =A0 =A0 =A0 anyway. =A0If<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 it&#39;s necessar=
y to<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 use posix_memalig=
n on Linux, why is it OK to<br>
&gt; =A0 =A0 =A0 =A0 use<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 malloc on other<b=
r>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 platforms ?<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 Also this #ifdef =
is quite ugly.<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 Ian.<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt; =A0 =A0 =A0 =A0 &gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
<br>
<br>
</div></div></blockquote></div></div></div><br>
</blockquote></div><br>

--000e0ce0d2248f3fa304b13e5edd--


--===============0344264810==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0344264810==--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 11:57:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 11:57:26 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNrnS-00072w-Qy; Tue, 08 Nov 2011 11:57:26 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNrmX-0006pG-VL
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 11:56:30 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-16.tower-182.messagelabs.com!1320782186!2359524!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22983 invoked from network); 8 Nov 2011 19:56:26 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 19:56:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,478,1315180800"; 
   d="scan'208";a="8826035"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 19:56:25 +0000
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Tue, 8 Nov 2011
	19:56:25 +0000
Subject: Re: [Xen-devel] Re: [PATCH 0 of 2 V5] libxc: checkpoint compression
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "rshriram@cs.ubc.ca" <rshriram@cs.ubc.ca>
In-Reply-To: <CAP8mzPPKM5UYaJEkNJkK1rAzO8EJE3jzM5ZG49n_iQziNF=3sw@mail.gmail.com>
References: <patchbomb.1320350703@athos.nss.cs.ubc.ca>
	<20147.55048.90214.665321@mariner.uk.xensource.com>
	<CAP8mzPM1Fxj6M5R+H79nKToSCxHxsMaq1CKN=csjRMMocG0LRA@mail.gmail.com>
	<CAP8mzPOqv9oiNyCRTSz9DaBDwB-MtOvPJ9+3xc5NwAepOgUm7w@mail.gmail.com>
	<1320771752.955.109.camel@zakaz.uk.xensource.com>
	<CAP8mzPO49gNVbouAB8nehBRC4K7Q37O+FgX8bGR_3EHSY8p6JQ@mail.gmail.com>
	<1320772565.955.110.camel@zakaz.uk.xensource.com>
	<CAP8mzPPZcU6H_EtadDZZ2aTwXMxxtAQntpFPZ7aQ1g5k1nSKcA@mail.gmail.com>
	<CAP8mzPPKM5UYaJEkNJkK1rAzO8EJE3jzM5ZG49n_iQziNF=3sw@mail.gmail.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Tue, 8 Nov 2011 19:56:24 +0000
Message-ID: <1320782185.16747.85.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: "brendan@cs.ubc.ca" <brendan@cs.ubc.ca>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-11-08 at 19:41 +0000, Shriram Rajagopalan wrote:

> One alternative would be to add the xc_memalign function alone, that
> was removed by c/s 22520.

22520 is 22520:6df91a11dcb0 "libxc: remove comment obsoleted by addition
of hypercall bounce buffer." here. Did you mean 22312:9fad5e5e2fc1
(remember the cset number is not globally unique/stable, only the longer
node hash is)

I think putting xc_memalign back would be fine, better than the other
options we've discussed even.

I'd be tempted to do it as separate functions
tools/libxc/xc_{minios,netbsd,linux}.c rather than using #ifdef though.

(For my money you can ignore Solaris, it's been unmaintained for long
enough that I bet it doesn't even build now and there's no one we can
ask to even build test it).

> 
> -void *xc_memalign(size_t alignment, size_t size)
> -{
> -#if defined(_POSIX_C_SOURCE) && !defined(__sun__)
> -    int ret;
> -    void *ptr;
> -    ret = posix_memalign(&ptr, alignment, size);
> -    if (ret != 0)
> -        return NULL;
> -    return ptr;
> -#elif defined(__NetBSD__) || defined(__OpenBSD__)
> -    return valloc(size);
> -#else
> -    return memalign(alignment, size);
> -#endif
> -}
> -
> 
> shriram
>  
>         
>                 >
>                 > thanks
>                 > shriram
>                 >
>                 >
>                 >         Ian.
>                 >
>                 >         >
>                 >         >         shriram
>                 >         >
>                 >         >
>                 >         >
>                 >         > Ping.
>                 >         >
>                 >         >
>                 >         >         On Fri, Nov 4, 2011 at 5:14 AM,
>                 Ian Jackson
>                 >         >         <Ian.Jackson@eu.citrix.com> wrote:
>                 >         >                 rshriram@cs.ubc.ca writes
>                 ("[PATCH 0 of 2
>                 >         V5] libxc:
>                 >         >                 checkpoint compression"):
>                 >         >                 > This patch series adds
>                 checkpoint
>                 >         compression
>                 >         >                 functionality, while
>                 >         >                 > running under Remus.
>                 >         >
>                 >         >                 ...
>                 >         >                 > Changes since last
>                 version:
>                 >         >                 > 1. use posix_memalign
>                 only on linux
>                 >         platforms and
>                 >         >                 switch to normal malloc
>                 for
>                 >         >                 >    the rest. stubdom
>                 compiles
>                 >         successfully.
>                 >         >
>                 >         >
>                 >         >                 Looking at this in more
>                 detail, I don't
>                 >         understand why
>                 >         >                 you're using
>                 >         >                 posix_memalign rather than
>                 just malloc,
>                 >         anyway.  If
>                 >         >                 it's necessary to
>                 >         >                 use posix_memalign on
>                 Linux, why is it OK to
>                 >         use
>                 >         >                 malloc on other
>                 >         >                 platforms ?
>                 >         >
>                 >         >                 Also this #ifdef is quite
>                 ugly.
>                 >         >
>                 >         >                 Ian.
>                 >         >
>                 >         >
>                 >         >
>                 >         >
>                 >
>                 >
>                 >
>                 >
>                 
>                 
>                 
>         
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 12:00:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 12:00:41 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNrqZ-0007YH-Sm; Tue, 08 Nov 2011 12:00:40 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNrn7-0006xT-CT
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 11:57:06 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320782222!3407952!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12453 invoked from network); 8 Nov 2011 19:57:02 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 19:57:02 -0000
X-IronPort-AV: E=Sophos;i="4.69,478,1315180800"; 
   d="scan'208";a="8826041"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 19:57:01 +0000
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Tue, 8 Nov 2011
	19:57:01 +0000
Subject: Re: [Xen-devel] [PATCH DOCDAY] introduce an xl man page in pod format
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
In-Reply-To: <alpine.DEB.2.00.1111081746070.3519@kaball-desktop>
References: <alpine.DEB.2.00.1110271659380.3519@kaball-desktop>
	<20144.15937.655455.992347@mariner.uk.xensource.com>
	<1320262456.3084.54.camel@cthulhu.hellion.org.uk>
	<alpine.DEB.2.00.1111081746070.3519@kaball-desktop>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Tue, 8 Nov 2011 19:57:00 +0000
Message-ID: <1320782220.16747.86.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-11-08 at 17:50 +0000, Stefano Stabellini wrote:
> On Wed, 2 Nov 2011, Ian Campbell wrote:
> > On Tue, 2011-11-01 at 14:45 -0400, Ian Jackson wrote:
> > > Stefano Stabellini writes ("[Xen-devel] [PATCH DOCDAY] introduce an xl man page in pod format"):
> > > > This is the initial version of an xl man page, based on the old xm man
> > > > page.
> > > 
> > > Thanks.  I have applied this.  There were various suggestions for
> > > improvements in the thread, but I think this manpage is better than
> > > nothing so it should go in ASAP.  Further improvents are indeed
> > > welcome and should come as patches against this.
> > 
> > Sure. Stefano, are you going to address the review or shall I do it?
> 
> I am going to address the review.

Great.

> However I am not so sure about splitting the man page, after all using /
> to search through it has worked very well in the past 40 years. Are you
> sure you haven't been drinking the kool-aid? ;)

By that rationale we only need one manpage for all of POSIX and another
for SysV and we are done ;-)

Long manpages documenting lots of commands don't scale that well, have
you ever tried to use e.g. bash-builtins(7) or perlfunc(1) to find the
documentation for a particular function? They are basically unusable,
even with search, because they glom everything into a single page. The
xl one is reasonably short right now but I expect it will grow as it
gets flesh out, we add more examples etc etc.

As well as keeping each individual doc shorter (which I think makes them
more manageable, less intimidating and easier on the reader etc)
splitting things up also means that each command can be documented in
the more traditional style, i.e. with its own SYNOPSYS, DESCRIPTION,
OPTIONS, RETURNS, EXAMPLES, SEE ALSO etc. If you merge them altogether
then this becomes cumbersome.

xl happens to be a single binary but in reality it is implementing
multiple commands, in some sense those commands are even unrelated (e.g.
what has vcpu pinning really got to do with migration?). It could just
as well been implemented that way too (e.g. the xl-<subcommand> form)
and then we would naturally have had separate pages.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 12:07:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 12:07:33 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNrxE-0008LZ-M7; Tue, 08 Nov 2011 12:07:32 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNruy-00083Q-89
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 12:05:13 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320782675!45122633!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8306 invoked from network); 8 Nov 2011 20:04:36 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 20:04:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,478,1315180800"; 
   d="scan'208";a="8826121"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 20:04:48 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 20:04:48 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNruZ-0004Lf-S5;
	Tue, 08 Nov 2011 20:04:47 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNruR-0004sz-1S;
	Tue, 08 Nov 2011 20:04:39 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Tue, 8 Nov 2011 20:04:22 +0000
Message-ID: <1320782668-18109-1-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
MIME-Version: 1.0
Content-Type: text/plain
Cc: allen.m.kay@intel.com, tim@xen.org
Subject: [Xen-devel] [PATCH 0/6] IOMMU, vtd and iotlb flush rework (v4)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

In one of my previous email I detailed a bug I was seeing when passing
through a Intel GPU on a guest that has more that 4G or RAM.

Allen suggested that I go for the Plan B but after a discussion with Tim
we agreed that Plan B was way to disruptive in term of code change.

This patch series implements Plan A.

http://xen.1045712.n5.nabble.com/VTD-Intel-iommu-IOTLB-flush-really-slow-td4952866.html

Changes between v3 and v4:
        - Move the loop for gmfn_range from arch_memory_op to xenmem_add_to_physmap.
        - Add a comment to comment to explain the purpose of iommu_dont_flush_iotlb.

Changes between v2 and v3:
       - Check for the presence iotlb_flush_all callback before calling it.

Changes between v1 and v2:
      - Move size in struct xen_add_to_physmap in padding between .domid and .space.
      - Store iommu_dont_flush per cpu
      - Change the code in hvmloader to relocate by batch of 64K, .size is now 16 bits.


 tools/firmware/hvmloader/pci.c      |   20 +++++--
 xen/arch/x86/mm.c                   |   82 ++++++++++++++++++++++------
 xen/arch/x86/x86_64/compat/mm.c     |    4 ++
 xen/drivers/passthrough/iommu.c     |   25 +++++++++
 xen/drivers/passthrough/vtd/iommu.c |  100 ++++++++++++++++++++---------------
 xen/include/public/memory.h         |    4 ++
 xen/include/xen/iommu.h             |   17 ++++++
 7 files changed, 186 insertions(+), 66 deletions(-)

Jean Guyader (6):
      vtd: Refactor iotlb flush code
      iommu: Introduce iommu_flush and iommu_flush_all.
      add_to_physmap: Move the code for XENMEM_add_to_physmap.
      mm: New XENMEM space, XENMAPSPACE_gmfn_range
      hvmloader: Change memory relocation loop when overlap with PCI hole.
      Introduce per cpu flag (iommu_dont_flush_iotlb) to avoid unnecessary iotlb flush



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 12:09:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 12:09:36 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNrzD-0000He-Va; Tue, 08 Nov 2011 12:09:36 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNruy-00083R-MI
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 12:05:14 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320782675!45122633!2
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8311 invoked from network); 8 Nov 2011 20:04:36 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 20:04:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,478,1315180800"; 
   d="scan'208";a="8826120"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 20:04:48 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 20:04:48 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNruZ-0004Li-W7;
	Tue, 08 Nov 2011 20:04:48 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNruR-0004t1-61;
	Tue, 08 Nov 2011 20:04:39 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Tue, 8 Nov 2011 20:04:23 +0000
Message-ID: <1320782668-18109-2-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320782668-18109-1-git-send-email-jean.guyader@eu.citrix.com>
References: <1320782668-18109-1-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 1/6] vtd: Refactor iotlb flush code
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Factorize the iotlb flush code from map_page and unmap_page into
it's own function.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/drivers/passthrough/vtd/iommu.c |   86 +++++++++++++++++-----------------
 1 files changed, 43 insertions(+), 43 deletions(-)


--------------true
Content-Type: text/x-patch; name="0001-vtd-Refactor-iotlb-flush-code.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0001-vtd-Refactor-iotlb-flush-code.patch"

diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 7717ab4..5a5b6be 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -578,16 +578,53 @@ static void iommu_flush_all(void)
     }
 }
 
+static void __intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn,
+        int dma_old_pte_present, unsigned int page_count)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+    struct acpi_drhd_unit *drhd;
+    struct iommu *iommu;
+    int flush_dev_iotlb;
+    int iommu_domid;
+
+    /*
+     * No need pcideves_lock here because we have flush
+     * when assign/deassign device
+     */
+    for_each_drhd_unit ( drhd )
+    {
+        iommu = drhd->iommu;
+
+        if ( !test_bit(iommu->index, &hd->iommu_bitmap) )
+            continue;
+
+        flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
+        iommu_domid= domain_iommu_domid(d, iommu);
+        if ( iommu_domid == -1 )
+            continue;
+
+        if ( page_count > 1 || gfn == -1 )
+        {
+            if ( iommu_flush_iotlb_dsi(iommu, iommu_domid,
+                        0, flush_dev_iotlb) )
+                iommu_flush_write_buffer(iommu);
+        }
+        else
+        {
+            if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
+                        (paddr_t)gfn << PAGE_SHIFT_4K, 0,
+                        !dma_old_pte_present, flush_dev_iotlb) )
+                iommu_flush_write_buffer(iommu);
+        }
+    }
+}
+
 /* clear one page's page table */
 static void dma_pte_clear_one(struct domain *domain, u64 addr)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(domain);
-    struct acpi_drhd_unit *drhd;
-    struct iommu *iommu;
     struct dma_pte *page = NULL, *pte = NULL;
     u64 pg_maddr;
-    int flush_dev_iotlb;
-    int iommu_domid;
     struct mapped_rmrr *mrmrr;
 
     spin_lock(&hd->mapping_lock);
@@ -613,21 +650,7 @@ static void dma_pte_clear_one(struct domain *domain, u64 addr)
     spin_unlock(&hd->mapping_lock);
     iommu_flush_cache_entry(pte, sizeof(struct dma_pte));
 
-    /* No need pcidevs_lock here since do that on assign/deassign device*/
-    for_each_drhd_unit ( drhd )
-    {
-        iommu = drhd->iommu;
-        if ( test_bit(iommu->index, &hd->iommu_bitmap) )
-        {
-            flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
-            iommu_domid= domain_iommu_domid(domain, iommu);
-            if ( iommu_domid == -1 )
-                continue;
-            if ( iommu_flush_iotlb_psi(iommu, iommu_domid, addr,
-                                       0, 0, flush_dev_iotlb) )
-                iommu_flush_write_buffer(iommu);
-        }
-    }
+    __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
 
     unmap_vtd_domain_page(page);
 
@@ -1677,12 +1700,8 @@ static int intel_iommu_map_page(
     unsigned int flags)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(d);
-    struct acpi_drhd_unit *drhd;
-    struct iommu *iommu;
     struct dma_pte *page = NULL, *pte = NULL, old, new = { 0 };
     u64 pg_maddr;
-    int flush_dev_iotlb;
-    int iommu_domid;
 
     /* Do nothing if VT-d shares EPT page table */
     if ( iommu_use_hap_pt(d) )
@@ -1724,26 +1743,7 @@ static int intel_iommu_map_page(
     spin_unlock(&hd->mapping_lock);
     unmap_vtd_domain_page(page);
 
-    /*
-     * No need pcideves_lock here because we have flush
-     * when assign/deassign device
-     */
-    for_each_drhd_unit ( drhd )
-    {
-        iommu = drhd->iommu;
-
-        if ( !test_bit(iommu->index, &hd->iommu_bitmap) )
-            continue;
-
-        flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
-        iommu_domid= domain_iommu_domid(d, iommu);
-        if ( iommu_domid == -1 )
-            continue;
-        if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
-                                   (paddr_t)gfn << PAGE_SHIFT_4K, 0,
-                                   !dma_pte_present(old), flush_dev_iotlb) )
-            iommu_flush_write_buffer(iommu);
-    }
+    __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
 
     return 0;
 }

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 12:11:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 12:11:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNs11-0000g0-8K; Tue, 08 Nov 2011 12:11:27 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNruz-00083d-BI
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 12:05:15 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320782675!45122633!6
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8372 invoked from network); 8 Nov 2011 20:04:36 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 20:04:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,478,1315180800"; 
   d="scan'208";a="8826126"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 20:04:49 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 20:04:49 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNrua-0004Lx-RV;
	Tue, 08 Nov 2011 20:04:48 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNruS-0004tG-60;
	Tue, 08 Nov 2011 20:04:40 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Tue, 8 Nov 2011 20:04:28 +0000
Message-ID: <1320782668-18109-7-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320782668-18109-6-git-send-email-jean.guyader@eu.citrix.com>
References: <1320782668-18109-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-5-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-6-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 6/6] Introduce per cpu flag
	(iommu_dont_flush_iotlb) to avoid unnecessary iotlb flush
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Add cpu flag that will be checked by the iommu low level code
to skip iotlb flushes. iommu_iotlb_flush shall be called explicitly.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c                   |   14 ++++++++++++++
 xen/drivers/passthrough/iommu.c     |    5 +++++
 xen/drivers/passthrough/vtd/iommu.c |    6 ++++--
 xen/include/xen/iommu.h             |   12 ++++++++++++
 4 files changed, 35 insertions(+), 2 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0006-Introduce-per-cpu-flag-iommu_dont_flush_iotlb-to-avo.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0006-Introduce-per-cpu-flag-iommu_dont_flush_iotlb-to-avo.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 2417fe9..17a8504 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4594,13 +4594,20 @@ static int handle_iomem_range(unsigned long s, unsigned long e, void *p)
 
 static int xenmem_add_to_physmap(struct domain *d, struct xen_add_to_physmap xatp)
 {
+    struct xen_add_to_physmap start_xatp;
     struct page_info *page = NULL;
     unsigned long prev_mfn, mfn = 0, gpfn;
     int rc;
 
     if ( xatp.space != XENMAPSPACE_gmfn_range )
         xatp.size = 1;
+    else
+    {
+        if ( need_iommu(d) )
+            this_cpu(iommu_dont_flush_iotlb) = 1;
+    }
 
+    start_xatp = xatp;
     while ( xatp.size > 0 )
     {
         if ( hypercall_preempt_check() )
@@ -4705,6 +4712,13 @@ static int xenmem_add_to_physmap(struct domain *d, struct xen_add_to_physmap xat
             break;
     }
 
+    if ( xatp.space == XENMAPSPACE_gmfn_range && need_iommu(d) )
+    {
+        this_cpu(iommu_dont_flush_iotlb) = 0;
+        iommu_iotlb_flush(d, start_xatp.idx, start_xatp.size - xatp.size);
+        iommu_iotlb_flush(d, start_xatp.gpfn, start_xatp.size - xatp.size);
+    }
+
     return rc;
 }
 
diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index ca7b37b..bacca11 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -52,6 +52,8 @@ bool_t __read_mostly iommu_hap_pt_share = 1;
 bool_t __read_mostly iommu_debug;
 bool_t __read_mostly amd_iommu_perdev_intremap;
 
+DEFINE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
+
 static void __init parse_iommu_param(char *s)
 {
     char *ss;
@@ -227,6 +229,7 @@ static int iommu_populate_page_table(struct domain *d)
 
     spin_lock(&d->page_alloc_lock);
 
+    this_cpu(iommu_dont_flush_iotlb) = 1;
     page_list_for_each ( page, &d->page_list )
     {
         if ( is_hvm_domain(d) ||
@@ -244,6 +247,8 @@ static int iommu_populate_page_table(struct domain *d)
             }
         }
     }
+    this_cpu(iommu_dont_flush_iotlb) = 0;
+    iommu_iotlb_flush_all(d);
     spin_unlock(&d->page_alloc_lock);
     return 0;
 }
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 7ec9541..a3dd018 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -660,7 +660,8 @@ static void dma_pte_clear_one(struct domain *domain, u64 addr)
     spin_unlock(&hd->mapping_lock);
     iommu_flush_cache_entry(pte, sizeof(struct dma_pte));
 
-    __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
+    if ( !this_cpu(iommu_dont_flush_iotlb) )
+        __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
 
     unmap_vtd_domain_page(page);
 
@@ -1753,7 +1754,8 @@ static int intel_iommu_map_page(
     spin_unlock(&hd->mapping_lock);
     unmap_vtd_domain_page(page);
 
-    __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
+    if ( !this_cpu(iommu_dont_flush_iotlb) )
+        __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
 
     return 0;
 }
diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
index a1034df..6f7fbf7 100644
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -160,4 +160,16 @@ int iommu_do_domctl(struct xen_domctl *, XEN_GUEST_HANDLE(xen_domctl_t));
 void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count);
 void iommu_iotlb_flush_all(struct domain *d);
 
+/*
+ * The purpose of the iommu_dont_flush_iotlb optional cpu flag is to
+ * avoid unecessary iotlb_flush in the low level IOMMU code.
+ *
+ * iommu_map_page/iommu_unmap_page must flush the iotlb but somethimes
+ * this operation can be really expensive. This flag will be set by the
+ * caller to notify the low level IOMMU code to avoid the iotlb flushes.
+ * iommu_iotlb_flush/iommu_iotlb_flush_all will be explicitly called by
+ * the caller.
+ */
+DECLARE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
+
 #endif /* _IOMMU_H_ */

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 12:12:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 12:12:58 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNs2T-00013p-S9; Tue, 08 Nov 2011 12:12:57 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNruy-00083X-So
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 12:05:16 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320782675!45122633!3
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8336 invoked from network); 8 Nov 2011 20:04:36 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 20:04:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,478,1315180800"; 
   d="scan'208";a="8826122"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 20:04:48 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 20:04:48 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNrua-0004Ll-6B;
	Tue, 08 Nov 2011 20:04:48 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNruR-0004t4-Er;
	Tue, 08 Nov 2011 20:04:39 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Tue, 8 Nov 2011 20:04:24 +0000
Message-ID: <1320782668-18109-3-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320782668-18109-2-git-send-email-jean.guyader@eu.citrix.com>
References: <1320782668-18109-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-2-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 2/6] iommu: Introduce iommu_flush and
	iommu_flush_all.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/drivers/passthrough/iommu.c     |   20 ++++++++++++++++++++
 xen/drivers/passthrough/vtd/iommu.c |   12 ++++++++++++
 xen/include/xen/iommu.h             |    5 +++++
 3 files changed, 37 insertions(+), 0 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0002-iommu-Introduce-iommu_flush-and-iommu_flush_all.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0002-iommu-Introduce-iommu_flush-and-iommu_flush_all.patch"

diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index cd6174d..ca7b37b 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -301,6 +301,26 @@ int iommu_unmap_page(struct domain *d, unsigned long gfn)
     return hd->platform_ops->unmap_page(d, gfn);
 }
 
+void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+    if ( !iommu_enabled || !hd->platform_ops || !hd->platform_ops->iotlb_flush )
+        return;
+
+    hd->platform_ops->iotlb_flush(d, gfn, page_count);
+}
+
+void iommu_iotlb_flush_all(struct domain *d)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+    if ( !iommu_enabled || !hd->platform_ops || !hd->platform_ops->iotlb_flush_all )
+        return;
+
+    hd->platform_ops->iotlb_flush_all(d);
+}
+
 /* caller should hold the pcidevs_lock */
 int deassign_device(struct domain *d, u16 seg, u8 bus, u8 devfn)
 {
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 5a5b6be..7ec9541 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -619,6 +619,16 @@ static void __intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn,
     }
 }
 
+static void intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count)
+{
+    __intel_iommu_iotlb_flush(d, gfn, 1, page_count);
+}
+
+static void intel_iommu_iotlb_flush_all(struct domain *d)
+{
+    __intel_iommu_iotlb_flush(d, 0, 0, 0);
+}
+
 /* clear one page's page table */
 static void dma_pte_clear_one(struct domain *domain, u64 addr)
 {
@@ -2329,6 +2339,8 @@ const struct iommu_ops intel_iommu_ops = {
     .resume = vtd_resume,
     .share_p2m = iommu_set_pgd,
     .crash_shutdown = vtd_crash_shutdown,
+    .iotlb_flush = intel_iommu_iotlb_flush,
+    .iotlb_flush_all = intel_iommu_iotlb_flush_all,
 };
 
 /*
diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
index 837e60d..a1034df 100644
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -139,6 +139,8 @@ struct iommu_ops {
     void (*resume)(void);
     void (*share_p2m)(struct domain *d);
     void (*crash_shutdown)(void);
+    void (*iotlb_flush)(struct domain *d, unsigned long gfn, unsigned int page_count);
+    void (*iotlb_flush_all)(struct domain *d);
 };
 
 void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value);
@@ -155,4 +157,7 @@ void iommu_share_p2m_table(struct domain *d);
 
 int iommu_do_domctl(struct xen_domctl *, XEN_GUEST_HANDLE(xen_domctl_t));
 
+void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count);
+void iommu_iotlb_flush_all(struct domain *d);
+
 #endif /* _IOMMU_H_ */

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 12:14:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 12:14:36 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNs44-0001Re-3v; Tue, 08 Nov 2011 12:14:36 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNruz-00083a-5i
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 12:05:16 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320782675!45122633!5
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8359 invoked from network); 8 Nov 2011 20:04:36 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 20:04:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,478,1315180800"; 
   d="scan'208";a="8826125"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 20:04:49 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 20:04:49 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNrua-0004Lu-Lm;
	Tue, 08 Nov 2011 20:04:48 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNruS-0004tD-14;
	Tue, 08 Nov 2011 20:04:40 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Tue, 8 Nov 2011 20:04:27 +0000
Message-ID: <1320782668-18109-6-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320782668-18109-5-git-send-email-jean.guyader@eu.citrix.com>
References: <1320782668-18109-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-5-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 5/6] hvmloader: Change memory relocation loop
	when overlap with PCI hole.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Change the way we relocate the memory page if they overlap with pci hole.
Use new map space (XENMAPSPACE_gmfn_range) to move the loop into xen.

This code usually get triggered when a device is pass through to a guest
and the PCI hole has to be extended to have enough room to map the device BARs.
The PCI hole will starts lower and it might overlap with some RAM that has been
alocated for the guest. That usually happen if the guest has more than 4G of RAM.
We have to relocate those pages in high mem otherwise they won't be accessible.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 tools/firmware/hvmloader/pci.c |   20 ++++++++++++++------
 1 files changed, 14 insertions(+), 6 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0005-hvmloader-Change-memory-relocation-loop-when-overlap.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0005-hvmloader-Change-memory-relocation-loop-when-overlap.patch"

diff --git a/tools/firmware/hvmloader/pci.c b/tools/firmware/hvmloader/pci.c
index 29ec011..3bd6ac5 100644
--- a/tools/firmware/hvmloader/pci.c
+++ b/tools/firmware/hvmloader/pci.c
@@ -50,6 +50,7 @@ void pci_setup(void)
         uint32_t devfn, bar_reg, bar_sz;
     } *bars = (struct bars *)scratch_start;
     unsigned int i, nr_bars = 0;
+    unsigned long pci_mem_start_pg;
 
     /* Program PCI-ISA bridge with appropriate link routes. */
     isa_irq = 0;
@@ -185,17 +186,24 @@ void pci_setup(void)
             ((pci_mem_start << 1) != 0) )
         pci_mem_start <<= 1;
 
-    while ( (pci_mem_start >> PAGE_SHIFT) < hvm_info->low_mem_pgend )
+    /* Relocate RAM that overlaps (in 64K chunks) */
+    pci_mem_start_pg = (pci_mem_start >> PAGE_SHIFT);
+    while (pci_mem_start_pg < hvm_info->low_mem_pgend)
     {
         struct xen_add_to_physmap xatp;
-        if ( hvm_info->high_mem_pgend == 0 )
-            hvm_info->high_mem_pgend = 1ull << (32 - PAGE_SHIFT);
+        unsigned int size = hvm_info->low_mem_pgend - pci_mem_start_pg;
         xatp.domid = DOMID_SELF;
-        xatp.space = XENMAPSPACE_gmfn;
-        xatp.idx   = --hvm_info->low_mem_pgend;
-        xatp.gpfn  = hvm_info->high_mem_pgend++;
+        xatp.space = XENMAPSPACE_gmfn_range;
+        xatp.idx = pci_mem_start_pg;
+        xatp.gpfn = hvm_info->high_mem_pgend;
+        size = size > ((1 << 16) - 1) ? ((1 << 16) - 1) : size;
+        xatp.size = size;
+
         if ( hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0 )
             BUG();
+        pci_mem_start_pg += size;
+        hvm_info->high_mem_pgend += size;
+        hvm_info->low_mem_pgend = pci_mem_start_pg;
     }
 
     mem_resource.base = pci_mem_start;

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 12:16:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 12:16:22 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNs5j-0001pc-Tm; Tue, 08 Nov 2011 12:16:20 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNruz-00083Z-2I
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 12:05:16 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320782675!45122633!4
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8349 invoked from network); 8 Nov 2011 20:04:36 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 20:04:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,478,1315180800"; 
   d="scan'208";a="8826123"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 20:04:48 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 20:04:48 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNrua-0004Lo-AX;
	Tue, 08 Nov 2011 20:04:48 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNruR-0004t7-Md;
	Tue, 08 Nov 2011 20:04:39 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Tue, 8 Nov 2011 20:04:25 +0000
Message-ID: <1320782668-18109-4-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320782668-18109-3-git-send-email-jean.guyader@eu.citrix.com>
References: <1320782668-18109-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-3-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] [PATCH 3/6] add_to_physmap: Move the code for
	XENMEM_add_to_physmap.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Move the code for the XENMEM_add_to_physmap case into it's own
function (xenmem_add_to_physmap).

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c |  188 ++++++++++++++++++++++++++++-------------------------
 1 files changed, 99 insertions(+), 89 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0003-add_to_physmap-Move-the-code-for-XENMEM_add_to_physm.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0003-add_to_physmap-Move-the-code-for-XENMEM_add_to_physm.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index acc1f34..f75011e 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4592,119 +4592,129 @@ static int handle_iomem_range(unsigned long s, unsigned long e, void *p)
     return 0;
 }
 
-long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
+static int xenmem_add_to_physmap(struct domain *d, struct xen_add_to_physmap xatp)
 {
     struct page_info *page = NULL;
+    unsigned long prev_mfn, mfn = 0, gpfn;
     int rc;
 
-    switch ( op )
-    {
-    case XENMEM_add_to_physmap:
+    switch ( xatp.space )
     {
-        struct xen_add_to_physmap xatp;
-        unsigned long prev_mfn, mfn = 0, gpfn;
-        struct domain *d;
-
-        if ( copy_from_guest(&xatp, arg, 1) )
-            return -EFAULT;
+    case XENMAPSPACE_shared_info:
+        if ( xatp.idx == 0 )
+            mfn = virt_to_mfn(d->shared_info);
+        break;
+    case XENMAPSPACE_grant_table:
+        spin_lock(&d->grant_table->lock);
 
-        rc = rcu_lock_target_domain_by_id(xatp.domid, &d);
-        if ( rc != 0 )
-            return rc;
+        if ( d->grant_table->gt_version == 0 )
+            d->grant_table->gt_version = 1;
 
-        if ( xsm_add_to_physmap(current->domain, d) )
+        if ( d->grant_table->gt_version == 2 &&
+             (xatp.idx & XENMAPIDX_grant_table_status) )
         {
-            rcu_unlock_domain(d);
-            return -EPERM;
+            xatp.idx &= ~XENMAPIDX_grant_table_status;
+            if ( xatp.idx < nr_status_frames(d->grant_table) )
+                mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
+        }
+        else
+        {
+            if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
+                 (xatp.idx < max_nr_grant_frames) )
+                gnttab_grow_table(d, xatp.idx + 1);
+
+            if ( xatp.idx < nr_grant_frames(d->grant_table) )
+                mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
         }
 
-        switch ( xatp.space )
+        spin_unlock(&d->grant_table->lock);
+        break;
+    case XENMAPSPACE_gmfn:
+    {
+        p2m_type_t p2mt;
+
+        xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
+        /* If the page is still shared, exit early */
+        if ( p2m_is_shared(p2mt) )
         {
-        case XENMAPSPACE_shared_info:
-            if ( xatp.idx == 0 )
-                mfn = virt_to_mfn(d->shared_info);
+            rcu_unlock_domain(d);
+            return -ENOMEM;
+        }
+        if ( !get_page_from_pagenr(xatp.idx, d) )
             break;
-        case XENMAPSPACE_grant_table:
-            spin_lock(&d->grant_table->lock);
+        mfn = xatp.idx;
+        page = mfn_to_page(mfn);
+        break;
+    }
+    default:
+        break;
+    }
 
-            if ( d->grant_table->gt_version == 0 )
-                d->grant_table->gt_version = 1;
+    if ( !paging_mode_translate(d) || (mfn == 0) )
+    {
+        if ( page )
+            put_page(page);
+        rcu_unlock_domain(d);
+        return -EINVAL;
+    }
 
-            if ( d->grant_table->gt_version == 2 &&
-                 (xatp.idx & XENMAPIDX_grant_table_status) )
-            {
-                xatp.idx &= ~XENMAPIDX_grant_table_status;
-                if ( xatp.idx < nr_status_frames(d->grant_table) )
-                    mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
-            }
-            else
-            {
-                if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
-                     (xatp.idx < max_nr_grant_frames) )
-                    gnttab_grow_table(d, xatp.idx + 1);
+    domain_lock(d);
 
-                if ( xatp.idx < nr_grant_frames(d->grant_table) )
-                    mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
-            }
+    if ( page )
+        put_page(page);
 
-            spin_unlock(&d->grant_table->lock);
-            break;
-        case XENMAPSPACE_gmfn:
-        {
-            p2m_type_t p2mt;
+    /* Remove previously mapped page if it was present. */
+    prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
+    if ( mfn_valid(prev_mfn) )
+    {
+        if ( is_xen_heap_mfn(prev_mfn) )
+            /* Xen heap frames are simply unhooked from this phys slot. */
+            guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
+        else
+            /* Normal domain memory is freed, to avoid leaking memory. */
+            guest_remove_page(d, xatp.gpfn);
+    }
 
-            xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
-            /* If the page is still shared, exit early */
-            if ( p2m_is_shared(p2mt) )
-            {
-                rcu_unlock_domain(d);
-                return -ENOMEM;
-            }
-            if ( !get_page_from_pagenr(xatp.idx, d) )
-                break;
-            mfn = xatp.idx;
-            page = mfn_to_page(mfn);
-            break;
-        }
-        default:
-            break;
-        }
+    /* Unmap from old location, if any. */
+    gpfn = get_gpfn_from_mfn(mfn);
+    ASSERT( gpfn != SHARED_M2P_ENTRY );
+    if ( gpfn != INVALID_M2P_ENTRY )
+        guest_physmap_remove_page(d, gpfn, mfn, 0);
 
-        if ( !paging_mode_translate(d) || (mfn == 0) )
-        {
-            if ( page )
-                put_page(page);
-            rcu_unlock_domain(d);
-            return -EINVAL;
-        }
+    /* Map at new location. */
+    rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
 
-        domain_lock(d);
+    domain_unlock(d);
 
-        if ( page )
-            put_page(page);
+    return rc;
+}
 
-        /* Remove previously mapped page if it was present. */
-        prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
-        if ( mfn_valid(prev_mfn) )
-        {
-            if ( is_xen_heap_mfn(prev_mfn) )
-                /* Xen heap frames are simply unhooked from this phys slot. */
-                guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
-            else
-                /* Normal domain memory is freed, to avoid leaking memory. */
-                guest_remove_page(d, xatp.gpfn);
-        }
 
-        /* Unmap from old location, if any. */
-        gpfn = get_gpfn_from_mfn(mfn);
-        ASSERT( gpfn != SHARED_M2P_ENTRY );
-        if ( gpfn != INVALID_M2P_ENTRY )
-            guest_physmap_remove_page(d, gpfn, mfn, 0);
+long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
+{
+    int rc;
+
+    switch ( op )
+    {
+    case XENMEM_add_to_physmap:
+    {
+        struct xen_add_to_physmap xatp;
+        struct domain *d;
 
-        /* Map at new location. */
-        rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
+        if ( copy_from_guest(&xatp, arg, 1) )
+            return -EFAULT;
+
+        rc = rcu_lock_target_domain_by_id(xatp.domid, &d);
+        if ( rc != 0 )
+            return rc;
+
+        if ( xsm_add_to_physmap(current->domain, d) )
+        {
+            rcu_unlock_domain(d);
+            return -EPERM;
+        }
 
-        domain_unlock(d);
+        xenmem_add_to_physmap(d, xatp);
 
         rcu_unlock_domain(d);
 

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 12:17:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 12:17:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNs7F-0002Ck-K8; Tue, 08 Nov 2011 12:17:53 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNruz-00083e-DN
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 12:05:16 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320782675!45122633!7
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8386 invoked from network); 8 Nov 2011 20:04:37 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 20:04:37 -0000
X-IronPort-AV: E=Sophos;i="4.69,478,1315180800"; 
   d="scan'208";a="8826124"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 20:04:48 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 20:04:48 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RNrua-0004Lr-Gs;
	Tue, 08 Nov 2011 20:04:48 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RNruR-0004tA-R0;
	Tue, 08 Nov 2011 20:04:39 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Tue, 8 Nov 2011 20:04:26 +0000
Message-ID: <1320782668-18109-5-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320782668-18109-4-git-send-email-jean.guyader@eu.citrix.com>
References: <1320782668-18109-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-4-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] 
	[PATCH 4/6] mm: New XENMEM space, XENMAPSPACE_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


XENMAPSPACE_gmfn_range is like XENMAPSPACE_gmfn but it runs on
a range of pages. The size of the range is defined in a new field.

This new field .size is located in the 16 bits padding between .domid
and .space in struct xen_add_to_physmap to stay compatible with older
versions.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c               |  164 ++++++++++++++++++++++-----------------
 xen/arch/x86/x86_64/compat/mm.c |    4 +
 xen/include/public/memory.h     |    4 +
 3 files changed, 102 insertions(+), 70 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0004-mm-New-XENMEM-space-XENMAPSPACE_gmfn_range.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0004-mm-New-XENMEM-space-XENMAPSPACE_gmfn_range.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index f75011e..2417fe9 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4598,93 +4598,112 @@ static int xenmem_add_to_physmap(struct domain *d, struct xen_add_to_physmap xat
     unsigned long prev_mfn, mfn = 0, gpfn;
     int rc;
 
-    switch ( xatp.space )
-    {
-    case XENMAPSPACE_shared_info:
-        if ( xatp.idx == 0 )
-            mfn = virt_to_mfn(d->shared_info);
-        break;
-    case XENMAPSPACE_grant_table:
-        spin_lock(&d->grant_table->lock);
+    if ( xatp.space != XENMAPSPACE_gmfn_range )
+        xatp.size = 1;
 
-        if ( d->grant_table->gt_version == 0 )
-            d->grant_table->gt_version = 1;
-
-        if ( d->grant_table->gt_version == 2 &&
-             (xatp.idx & XENMAPIDX_grant_table_status) )
+    while ( xatp.size > 0 )
+    {
+        if ( hypercall_preempt_check() )
         {
-            xatp.idx &= ~XENMAPIDX_grant_table_status;
-            if ( xatp.idx < nr_status_frames(d->grant_table) )
-                mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
+            rc = -EAGAIN;
+            break;
         }
-        else
+
+        switch ( xatp.space )
         {
-            if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
-                 (xatp.idx < max_nr_grant_frames) )
-                gnttab_grow_table(d, xatp.idx + 1);
+        case XENMAPSPACE_shared_info:
+            if ( xatp.idx == 0 )
+                mfn = virt_to_mfn(d->shared_info);
+            break;
+        case XENMAPSPACE_grant_table:
+            spin_lock(&d->grant_table->lock);
 
-            if ( xatp.idx < nr_grant_frames(d->grant_table) )
-                mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
-        }
+            if ( d->grant_table->gt_version == 0 )
+                d->grant_table->gt_version = 1;
 
-        spin_unlock(&d->grant_table->lock);
-        break;
-    case XENMAPSPACE_gmfn:
-    {
-        p2m_type_t p2mt;
+            if ( d->grant_table->gt_version == 2 &&
+                 (xatp.idx & XENMAPIDX_grant_table_status) )
+            {
+                xatp.idx &= ~XENMAPIDX_grant_table_status;
+                if ( xatp.idx < nr_status_frames(d->grant_table) )
+                    mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
+            }
+            else
+            {
+                if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
+                     (xatp.idx < max_nr_grant_frames) )
+                    gnttab_grow_table(d, xatp.idx + 1);
+
+                if ( xatp.idx < nr_grant_frames(d->grant_table) )
+                    mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
+            }
 
-        xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
-        /* If the page is still shared, exit early */
-        if ( p2m_is_shared(p2mt) )
+            spin_unlock(&d->grant_table->lock);
+            break;
+        case XENMAPSPACE_gmfn:
         {
-            rcu_unlock_domain(d);
-            return -ENOMEM;
+            p2m_type_t p2mt;
+
+            xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
+            /* If the page is still shared, exit early */
+            if ( p2m_is_shared(p2mt) )
+            {
+                rcu_unlock_domain(d);
+                return -ENOMEM;
+            }
+            if ( !get_page_from_pagenr(xatp.idx, d) )
+                break;
+            mfn = xatp.idx;
+            page = mfn_to_page(mfn);
+            break;
         }
-        if ( !get_page_from_pagenr(xatp.idx, d) )
+        default:
             break;
-        mfn = xatp.idx;
-        page = mfn_to_page(mfn);
-        break;
-    }
-    default:
-        break;
-    }
+        }
+
+        if ( !paging_mode_translate(d) || (mfn == 0) )
+        {
+            if ( page )
+                put_page(page);
+            rcu_unlock_domain(d);
+            return -EINVAL;
+        }
+
+        domain_lock(d);
 
-    if ( !paging_mode_translate(d) || (mfn == 0) )
-    {
         if ( page )
             put_page(page);
-        rcu_unlock_domain(d);
-        return -EINVAL;
-    }
 
-    domain_lock(d);
+        /* Remove previously mapped page if it was present. */
+        prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
+        if ( mfn_valid(prev_mfn) )
+        {
+            if ( is_xen_heap_mfn(prev_mfn) )
+                /* Xen heap frames are simply unhooked from this phys slot. */
+                guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
+            else
+                /* Normal domain memory is freed, to avoid leaking memory. */
+                guest_remove_page(d, xatp.gpfn);
+        }
 
-    if ( page )
-        put_page(page);
+        /* Unmap from old location, if any. */
+        gpfn = get_gpfn_from_mfn(mfn);
+        ASSERT( gpfn != SHARED_M2P_ENTRY );
+        if ( gpfn != INVALID_M2P_ENTRY )
+            guest_physmap_remove_page(d, gpfn, mfn, 0);
 
-    /* Remove previously mapped page if it was present. */
-    prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
-    if ( mfn_valid(prev_mfn) )
-    {
-        if ( is_xen_heap_mfn(prev_mfn) )
-            /* Xen heap frames are simply unhooked from this phys slot. */
-            guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
-        else
-            /* Normal domain memory is freed, to avoid leaking memory. */
-            guest_remove_page(d, xatp.gpfn);
-    }
+        /* Map at new location. */
+        rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
 
-    /* Unmap from old location, if any. */
-    gpfn = get_gpfn_from_mfn(mfn);
-    ASSERT( gpfn != SHARED_M2P_ENTRY );
-    if ( gpfn != INVALID_M2P_ENTRY )
-        guest_physmap_remove_page(d, gpfn, mfn, 0);
+        domain_unlock(d);
 
-    /* Map at new location. */
-    rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
+        xatp.idx++;
+        xatp.gpfn++;
+        xatp.size--;
 
-    domain_unlock(d);
+        if ( rc != 0 )
+            break;
+    }
 
     return rc;
 }
@@ -4714,10 +4733,15 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
             return -EPERM;
         }
 
-        xenmem_add_to_physmap(d, xatp);
-
+        rc = xenmem_add_to_physmap(d, xatp);
         rcu_unlock_domain(d);
 
+        if ( rc == -EAGAIN )
+        {
+            rc = hypercall_create_continuation(
+                    __HYPERVISOR_memory_op, "ih", op, arg);
+        }
+
         return rc;
     }
 
diff --git a/xen/arch/x86/x86_64/compat/mm.c b/xen/arch/x86/x86_64/compat/mm.c
index 2c05099..05c3098 100644
--- a/xen/arch/x86/x86_64/compat/mm.c
+++ b/xen/arch/x86/x86_64/compat/mm.c
@@ -63,6 +63,10 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
 
         XLAT_add_to_physmap(nat, &cmp);
         rc = arch_memory_op(op, guest_handle_from_ptr(nat, void));
+        XLAT_add_to_physmap(&cmp, nat);
+
+        if ( copy_to_guest(arg, &cmp, 1) )
+            return -EFAULT;
 
         break;
     }
diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h
index 08355e3..c5b78a8 100644
--- a/xen/include/public/memory.h
+++ b/xen/include/public/memory.h
@@ -208,10 +208,14 @@ struct xen_add_to_physmap {
     /* Which domain to change the mapping for. */
     domid_t domid;
 
+    /* Number of pages to go through for gmfn_range */
+    uint16_t    size;
+
     /* Source mapping space. */
 #define XENMAPSPACE_shared_info 0 /* shared info page */
 #define XENMAPSPACE_grant_table 1 /* grant table page */
 #define XENMAPSPACE_gmfn        2 /* GMFN */
+#define XENMAPSPACE_gmfn_range  3 /* GMFN range */
     unsigned int space;
 
 #define XENMAPIDX_grant_table_status 0x80000000

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 12:19:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 12:19:59 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNs9G-0002gn-Qa; Tue, 08 Nov 2011 12:19:58 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNs0X-0000Z5-Vi
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 12:11:00 -0800
X-Env-Sender: dkiper@net-space.pl
X-Msg-Ref: server-2.tower-182.messagelabs.com!1320783051!2382897!1
X-Originating-IP: [89.174.63.77]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24656 invoked from network); 8 Nov 2011 20:10:54 -0000
Received: from router-fw.net-space.pl (HELO router-fw.net-space.pl)
	(89.174.63.77)
	by server-2.tower-182.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 8 Nov 2011 20:10:54 -0000
Received: (from localhost user: 'dkiper' uid#4000 fake: STDIN
	(dkiper@router-fw.net-space.pl)) by router-fw-old.local.net-space.pl
	id S1602534Ab1KHUKn (ORCPT <rfc822;xen-devel@lists.xensource.com>);
	Tue, 8 Nov 2011 21:10:43 +0100
Date: Tue, 8 Nov 2011 21:10:43 +0100
From: Daniel Kiper <dkiper@net-space.pl>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] [PATCH] xen: document balloon driver sysfs files
Message-ID: <20111108201043.GB6539@router-fw-old.local.net-space.pl>
References: <1319626664-28225-1-git-send-email-david.vrabel@citrix.com>
	<20111026191212.GA17424@router-fw-old.local.net-space.pl>
	<20111108165915.GB30802@phenom.dumpdata.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111108165915.GB30802@phenom.dumpdata.com>
User-Agent: Mutt/1.3.28i
Cc: xen-devel@lists.xensource.com, David Vrabel <david.vrabel@citrix.com>,
	Daniel Kiper <dkiper@net-space.pl>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 08, 2011 at 11:59:15AM -0500, Konrad Rzeszutek Wilk wrote:
> On Wed, Oct 26, 2011 at 09:12:12PM +0200, Daniel Kiper wrote:
> > On Wed, Oct 26, 2011 at 11:57:43AM +0100, David Vrabel wrote:
> > > From: David Vrabel <david.vrabel@citrix.com>
> > >
> > > Add ABI documentation for the balloon driver's sysfs files.
> > >
> > > Signed-off-by: David Vrabel <david.vrabel@citrix.com>
> > > ---
> > >  .../ABI/stable/sysfs-devices-system-xen_memory     |   72 ++++++++++++++++++++
> > >  1 files changed, 72 insertions(+), 0 deletions(-)
> > >  create mode 100644 Documentation/ABI/stable/sysfs-devices-system-xen_memory
> > >
> > > diff --git a/Documentation/ABI/stable/sysfs-devices-system-xen_memory b/Documentation/ABI/stable/sysfs-devices-system-xen_memory
> > > new file mode 100644
> > > index 0000000..4fbc446
> > > --- /dev/null
> > > +++ b/Documentation/ABI/stable/sysfs-devices-system-xen_memory
> > > @@ -0,0 +1,72 @@
> > > +What:		/sys/devices/system/xen_memory/xen_memory0/max_retry_count
> > > +Date:		April 2008
> >
> > May 2011
> >
> > > +KernelVersion:	2.6.26
> >
> > 2.6.39, git commit 95d2ac4a0c904942a4fecf815781ebd4171e7a30
> > and 40095de1f9082f058970b985a96d2fbef43f94f4.
> >
> > Additionally, I think it is worth to add default value and special
> > cases description (e.g. max_retry_count == 0 => RETRY_UNLIMITED).
> > Please look into drivers/xen/{balloon.c,xen-balloon.c}
> > and include/xen/balloon.h for details.
> >
> > > +Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > > +Description:
> > > +		The maximum number of times the balloon driver will
> > > +		attempt to increase the balloon before giving up.  See
> > > +		also 'retry_count' below.
> > > +
> > > +What:		/sys/devices/system/xen_memory/xen_memory0/max_schedule_delay
> > > +Date:		April 2008
> >
> > Ditto.
> >
> > > +KernelVersion:	2.6.26
> >
> > Ditto.
> >
> > > +Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > > +Description:
> > > +		The limit that 'schedule_delay' (see below) will be
> > > +		increased to.
> > > +
> > > +What:		/sys/devices/system/xen_memory/xen_memory0/retry_count
> > > +Date:		April 2008
> >
> > Ditto.
> >
> > > +KernelVersion:	2.6.26
> >
> > Ditto.
> >
> > > +Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > > +Description:
> > > +		The current number of times that the balloon driver
> > > +		has attempted to increase the size of the balloon.
> > > +
> > > +What:		/sys/devices/system/xen_memory/xen_memory0/schedule_delay
> > > +Date:		April 2008
> >
> > Ditto.
> >
> > > +KernelVersion:	2.6.26
> >
> > Ditto.
> >
> > Daniel
>
> Daniel, how does this look ? I added your Reviewed-by, but if you want
> to make some more modifications I can certainly do so.

Thanks for correcting that. I think that I have found
only one small issue. Please look below.

> >From d759668b660f111b6f35b632031eaf1a136a22f3 Mon Sep 17 00:00:00 2001
> From: David Vrabel <david.vrabel@citrix.com>
> Date: Wed, 26 Oct 2011 11:57:43 +0100
> Subject: [PATCH] xen: document balloon driver sysfs files
>
> Add ABI documentation for the balloon driver's sysfs files.
>
> Signed-off-by: David Vrabel <david.vrabel@citrix.com>
> Reviewed-by: Daniel Kiper <dkiper@net-space.pl>
> [v2: Added comments from Daniel]
> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> ---
>  .../ABI/stable/sysfs-devices-system-xen_memory     |   77 ++++++++++++++++++++
>  1 files changed, 77 insertions(+), 0 deletions(-)
>  create mode 100644 Documentation/ABI/stable/sysfs-devices-system-xen_memory
>
> diff --git a/Documentation/ABI/stable/sysfs-devices-system-xen_memory b/Documentation/ABI/stable/sysfs-devices-system-xen_memory
> new file mode 100644
> index 0000000..39463d0
> --- /dev/null
> +++ b/Documentation/ABI/stable/sysfs-devices-system-xen_memory
> @@ -0,0 +1,77 @@
> +What:		/sys/devices/system/xen_memory/xen_memory0/max_retry_count
> +Date:		May 2011
> +KernelVersion:	2.6.39
> +Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> +Description:
> +		The maximum number of times the balloon driver will
> +		attempt to increase the balloon before giving up.  See
> +		also 'retry_count' below.
> +		A value of zero means retry forever and is the default one.
> +
> +What:		/sys/devices/system/xen_memory/xen_memory0/max_schedule_delay
> +Date:		May 2011
> +KernelVersion:	2.6.39
> +Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> +Description:
> +		The limit that 'schedule_delay' (see below) will be
> +		increased to. The default value is 32.
> +
> +What:		/sys/devices/system/xen_memory/xen_memory0/retry_count
> +Date:		May 2011
> +KernelVersion:	2.6.39
> +Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> +Description:
> +		The current number of times that the balloon driver
> +		has attempted to increase the size of the balloon.
> +		The default value is one. With max_retry_count being
> +		zero (unlimited), this means that the driver will attempt
> +		to retry with a 'schedule_delay' delay.
> +
> +What:		/sys/devices/system/xen_memory/xen_memory0/schedule_delay
> +Date:		May 2011
> +KernelVersion:	2.6.39
> +Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> +Description:
> +		The time (in jiffies) to wait between attempts to

It is in seconds. Please look at the end of balloon_process() funtion.
This value is multiplicated by HZ constant (which indeed is scaled in
jiffies, however, I think in this case second is better unit).

Daniel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 13:08:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 13:08:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNstw-0003xF-HV; Tue, 08 Nov 2011 13:08:13 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNsqu-0003iG-RC
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 13:05:10 -0800
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-3.tower-21.messagelabs.com!1320786301!3452765!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24817 invoked from network); 8 Nov 2011 21:05:01 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-3.tower-21.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 8 Nov 2011 21:05:01 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320786301; l=12382;
	s=domk; d=aepfle.de;
	h=To:From:Date:Subject:Content-Transfer-Encoding:MIME-Version:
	Content-Type:X-RZG-CLASS-ID:X-RZG-AUTH;
	bh=UFvof+LOHn0Gbl6M8zWEB0KcvZM=;
	b=enhNXbRAVl8GJuV2LOXAreRqnvZtR5lbLXsufsQxNFqmhnlXM3WgkLDM4A4xgk4FYHR
	gh9DB9/cXAH9/OcPc/O9UNdIhNFAZUN82lPottW8Oz1lhhWJlkIdWIVRsvJR68/fnKcTL
	zgE9azr87J8YBLz8oB6FCxk7LTPMBasiqDQ=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV67U=
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-1.vodafone-net.de [80.226.24.1])
	by smtp.strato.de (fruni mo14) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id d02b6dnA8HnY1F
	for <xen-devel@lists.xensource.com>;
	Tue, 8 Nov 2011 22:04:54 +0100 (MET)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id B5EAC18637
	for <xen-devel@lists.xensource.com>;
	Tue,  8 Nov 2011 22:04:52 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 601d9ee4f1364e5e05b69f24be5e6c3b33e428ca
Message-Id: <601d9ee4f1364e5e05b6.1320786291@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Tue, 08 Nov 2011 22:04:51 +0100
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] RFC: mem_event: use wait queue when ring is full
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1320786230 -3600
# Node ID 601d9ee4f1364e5e05b69f24be5e6c3b33e428ca
# Parent  455f064fe54eeb57a43aa0c45a56cc4c4847d7a0
RFC: mem_event: use wait queue when ring is full

CAUTION: while the patch by itself is supposed to be complete,
the added usage of waitqueues will lead to guest hangs and
even sudden host reboots!


This change is based on an idea/patch from Adin Scannell.

If the ring is full, put the current vcpu to sleep if it belongs to the
target domain. The wakeup happens in the p2m_*_resume functions.
A request from another domain will use the existing ->req_producers
functionality because sleeping is not possible if the vcpu does not
belong to the target domain.

This change fixes also a bug in p2m_mem_paging_drop_page(). Up to now a
full ring will lead to harmless inconsistency in the pager,

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 455f064fe54e -r 601d9ee4f136 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -4026,7 +4026,7 @@ static int hvm_memory_event_traps(long p
         return 1;
     
     rc = mem_event_check_ring(d, &d->mem_access);
-    if ( rc )
+    if ( rc < 0 )
         return rc;
     
     memset(&req, 0, sizeof(req));
diff -r 455f064fe54e -r 601d9ee4f136 xen/arch/x86/mm/mem_event.c
--- a/xen/arch/x86/mm/mem_event.c
+++ b/xen/arch/x86/mm/mem_event.c
@@ -23,6 +23,7 @@
 
 #include <asm/domain.h>
 #include <xen/event.h>
+#include <xen/wait.h>
 #include <asm/p2m.h>
 #include <asm/mem_event.h>
 #include <asm/mem_paging.h>
@@ -39,6 +40,7 @@
 
 static int mem_event_enable(struct domain *d,
                             xen_domctl_mem_event_op_t *mec,
+                            int mem_event_bit,
                             struct mem_event_domain *med)
 {
     int rc;
@@ -94,8 +96,12 @@ static int mem_event_enable(struct domai
 
     mem_event_ring_lock_init(med);
 
+    med->mem_event_bit = mem_event_bit;
+
+    init_waitqueue_head(&med->wq);
+
     /* Wake any VCPUs paused for memory events */
-    mem_event_unpause_vcpus(d);
+    mem_event_unpause_vcpus(d, med);
 
     return 0;
 
@@ -111,6 +117,9 @@ static int mem_event_enable(struct domai
 
 static int mem_event_disable(struct mem_event_domain *med)
 {
+    if (!list_empty(&med->wq.list))
+        return -EBUSY;
+
     unmap_domain_page(med->ring_page);
     med->ring_page = NULL;
 
@@ -120,13 +129,18 @@ static int mem_event_disable(struct mem_
     return 0;
 }
 
-void mem_event_put_request(struct domain *d, struct mem_event_domain *med, mem_event_request_t *req)
+static int _mem_event_put_request(struct domain *d, struct mem_event_domain *med, mem_event_request_t *req)
 {
     mem_event_front_ring_t *front_ring;
     RING_IDX req_prod;
 
     mem_event_ring_lock(med);
 
+    if (RING_FREE_REQUESTS(&med->front_ring) == 0) {
+        mem_event_ring_unlock(med);
+        return 0;
+    }
+
     front_ring = &med->front_ring;
     req_prod = front_ring->req_prod_pvt;
 
@@ -142,6 +156,20 @@ void mem_event_put_request(struct domain
     mem_event_ring_unlock(med);
 
     notify_via_xen_event_channel(d, med->xen_port);
+
+    return 1;
+}
+
+void mem_event_put_request(struct domain *d, struct mem_event_domain *med, mem_event_request_t *req)
+{
+	if (_mem_event_put_request(d, med, req))
+		return;
+	if (current->domain == d) {
+		wait_event(med->wq, _mem_event_put_request(d, med, req));
+		return;
+	}
+	/* Ring was full, unable to sleep */
+	printk("Failed to put memreq: d %u t %x f %x gfn %lx\n", d->domain_id, req->type, req->flags, (unsigned long)req->gfn);
 }
 
 void mem_event_get_response(struct mem_event_domain *med, mem_event_response_t *rsp)
@@ -165,21 +193,27 @@ void mem_event_get_response(struct mem_e
     mem_event_ring_unlock(med);
 }
 
-void mem_event_unpause_vcpus(struct domain *d)
+void mem_event_unpause_vcpus(struct domain *d, struct mem_event_domain *med)
 {
     struct vcpu *v;
 
     for_each_vcpu ( d, v )
-        if ( test_and_clear_bit(_VPF_mem_event, &v->pause_flags) )
+        if ( test_and_clear_bit(med->mem_event_bit, &v->pause_flags) )
             vcpu_wake(v);
 }
 
-void mem_event_mark_and_pause(struct vcpu *v)
+void mem_event_mark_and_pause(struct vcpu *v, struct mem_event_domain *med)
 {
-    set_bit(_VPF_mem_event, &v->pause_flags);
+    set_bit(med->mem_event_bit, &v->pause_flags);
     vcpu_sleep_nosync(v);
 }
 
+/**
+ * mem_event_put_req_producers - Release a claimed slot
+ * @med: mem_event ring
+ *
+ * mem_event_put_req_producers() releases a claimed slot in the mem_event ring.
+ */
 void mem_event_put_req_producers(struct mem_event_domain *med)
 {
     mem_event_ring_lock(med);
@@ -187,9 +221,26 @@ void mem_event_put_req_producers(struct 
     mem_event_ring_unlock(med);
 }
 
+/**
+ * mem_event_check_ring - Check state of a mem_event ring
+ * @d: guest domain
+ * @med: mem_event ring
+ *
+ * Return codes: < 0: the ring is not yet configured
+ *                 0: the ring has some room
+ *               > 0: the ring is full
+ *
+ * mem_event_check_ring() checks the state of the given mem_event ring.
+ * If the current vcpu belongs to the guest domain, the function assumes that
+ * mem_event_put_request() will sleep until the ring has room again.
+ *
+ * If the current vcpu does not belong to the target domain the caller must try
+ * again until there is room. A slot is claimed and the caller can place a
+ * request. If the caller does not need to send a request, the claimed slot has
+ * to be released with mem_event_put_req_producers().
+ */
 int mem_event_check_ring(struct domain *d, struct mem_event_domain *med)
 {
-    struct vcpu *curr = current;
     int free_requests;
     int ring_full = 1;
 
@@ -205,8 +256,8 @@ int mem_event_check_ring(struct domain *
         ring_full = 0;
     }
 
-    if ( ring_full && (curr->domain == d) )
-        mem_event_mark_and_pause(curr);
+    if ( current->domain == d )
+        ring_full = 0;
 
     mem_event_ring_unlock(med);
 
@@ -274,7 +325,7 @@ int mem_event_domctl(struct domain *d, x
             if ( p2m->pod.entry_count )
                 break;
 
-            rc = mem_event_enable(d, mec, med);
+            rc = mem_event_enable(d, mec, _VPF_me_mem_paging, med);
         }
         break;
 
@@ -313,7 +364,7 @@ int mem_event_domctl(struct domain *d, x
             if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL )
                 break;
 
-            rc = mem_event_enable(d, mec, med);
+            rc = mem_event_enable(d, mec, _VPF_me_mem_access, med);
         }
         break;
 
diff -r 455f064fe54e -r 601d9ee4f136 xen/arch/x86/mm/mem_sharing.c
--- a/xen/arch/x86/mm/mem_sharing.c
+++ b/xen/arch/x86/mm/mem_sharing.c
@@ -253,19 +253,11 @@ static void mem_sharing_audit(void)
 #endif
 
 
-static struct page_info* mem_sharing_alloc_page(struct domain *d, 
-                                                unsigned long gfn)
+static void mem_sharing_notify_helper(struct domain *d, unsigned long gfn)
 {
-    struct page_info* page;
     struct vcpu *v = current;
     mem_event_request_t req;
 
-    page = alloc_domheap_page(d, 0); 
-    if(page != NULL) return page;
-
-    memset(&req, 0, sizeof(req));
-    req.type = MEM_EVENT_TYPE_SHARED;
-
     if ( v->domain != d )
     {
         /* XXX This path needs some attention.  For now, just fail foreign 
@@ -275,20 +267,19 @@ static struct page_info* mem_sharing_all
         gdprintk(XENLOG_ERR, 
                  "Failed alloc on unshare path for foreign (%d) lookup\n",
                  d->domain_id);
-        return page;
+        return;
     }
 
-    vcpu_pause_nosync(v);
-    req.flags |= MEM_EVENT_FLAG_VCPU_PAUSED;
+    if (mem_event_check_ring(d, &d->mem_share) < 0)
+        return;
 
-    if(mem_event_check_ring(d, &d->mem_share)) return page;
-
+    memset(&req, 0, sizeof(req));
+    req.type = MEM_EVENT_TYPE_SHARED;
+    req.flags = MEM_EVENT_FLAG_VCPU_PAUSED;
     req.gfn = gfn;
     req.p2mt = p2m_ram_shared;
     req.vcpu_id = v->vcpu_id;
     mem_event_put_request(d, &d->mem_share, &req);
-
-    return page;
 }
 
 unsigned int mem_sharing_get_nr_saved_mfns(void)
@@ -647,13 +638,14 @@ gfn_found:
     if(ret == 0) goto private_page_found;
         
     old_page = page;
-    page = mem_sharing_alloc_page(d, gfn);
+    page = alloc_domheap_page(d, 0); 
     if(!page) 
     {
         /* We've failed to obtain memory for private page. Need to re-add the
          * gfn_info to relevant list */
         list_add(&gfn_info->list, &hash_entry->gfns);
         shr_unlock();
+        mem_sharing_notify_helper(d, gfn);
         return -ENOMEM;
     }
 
diff -r 455f064fe54e -r 601d9ee4f136 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -840,17 +840,13 @@ void p2m_mem_paging_drop_page(struct dom
     struct vcpu *v = current;
     mem_event_request_t req;
 
-    /* Check that there's space on the ring for this request */
-    if ( mem_event_check_ring(d, &d->mem_paging) == 0)
-    {
-        /* Send release notification to pager */
-        memset(&req, 0, sizeof(req));
-        req.flags |= MEM_EVENT_FLAG_DROP_PAGE;
-        req.gfn = gfn;
-        req.vcpu_id = v->vcpu_id;
+   /* Send release notification to pager */
+   memset(&req, 0, sizeof(req));
+   req.flags |= MEM_EVENT_FLAG_DROP_PAGE;
+   req.gfn = gfn;
+   req.vcpu_id = v->vcpu_id;
 
-        mem_event_put_request(d, &d->mem_paging, &req);
-    }
+   mem_event_put_request(d, &d->mem_paging, &req);
 }
 
 /**
@@ -1027,8 +1023,8 @@ void p2m_mem_paging_resume(struct domain
     if ( rsp.flags & MEM_EVENT_FLAG_VCPU_PAUSED )
         vcpu_unpause(d->vcpu[rsp.vcpu_id]);
 
-    /* Unpause any domains that were paused because the ring was full */
-    mem_event_unpause_vcpus(d);
+    /* Unpause all vcpus that were paused because the ring was full */
+    wake_up(&d->mem_paging.wq);
 }
 
 void p2m_mem_access_check(unsigned long gpa, bool_t gla_valid, unsigned long gla, 
@@ -1067,7 +1063,7 @@ void p2m_mem_access_check(unsigned long 
                    "Memory access permissions failure, no mem_event listener: pausing VCPU %d, dom %d\n",
                    v->vcpu_id, d->domain_id);
 
-            mem_event_mark_and_pause(v);
+            mem_event_mark_and_pause(v, &d->mem_access);
         }
         else
         {
@@ -1117,9 +1113,11 @@ void p2m_mem_access_resume(struct p2m_do
     if ( rsp.flags & MEM_EVENT_FLAG_VCPU_PAUSED )
         vcpu_unpause(d->vcpu[rsp.vcpu_id]);
 
-    /* Unpause any domains that were paused because the ring was full or no listener 
-     * was available */
-    mem_event_unpause_vcpus(d);
+    /* Wakeup all vcpus waiting because the ring was full */
+    wake_up(&d->mem_access.wq);
+
+    /* Unpause all vcpus that were paused because no listener was available */
+    mem_event_unpause_vcpus(d, &d->mem_access);
 }
 
 
diff -r 455f064fe54e -r 601d9ee4f136 xen/include/asm-x86/mem_event.h
--- a/xen/include/asm-x86/mem_event.h
+++ b/xen/include/asm-x86/mem_event.h
@@ -25,12 +25,12 @@
 #define __MEM_EVENT_H__
 
 /* Pauses VCPU while marking pause flag for mem event */
-void mem_event_mark_and_pause(struct vcpu *v);
+void mem_event_mark_and_pause(struct vcpu *v, struct mem_event_domain *med);
 int mem_event_check_ring(struct domain *d, struct mem_event_domain *med);
 void mem_event_put_req_producers(struct mem_event_domain *med);
 void mem_event_put_request(struct domain *d, struct mem_event_domain *med, mem_event_request_t *req);
 void mem_event_get_response(struct mem_event_domain *med, mem_event_response_t *rsp);
-void mem_event_unpause_vcpus(struct domain *d);
+void mem_event_unpause_vcpus(struct domain *d, struct mem_event_domain *med);
 
 int mem_event_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec,
                      XEN_GUEST_HANDLE(void) u_domctl);
diff -r 455f064fe54e -r 601d9ee4f136 xen/include/xen/sched.h
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -14,6 +14,7 @@
 #include <xen/nodemask.h>
 #include <xen/radix-tree.h>
 #include <xen/multicall.h>
+#include <xen/wait.h>
 #include <public/xen.h>
 #include <public/domctl.h>
 #include <public/sysctl.h>
@@ -192,6 +193,10 @@ struct mem_event_domain
     mem_event_front_ring_t front_ring;
     /* event channel port (vcpu0 only) */
     int xen_port;
+    /* mem_event bit for vcpu->pause_flags */
+    int mem_event_bit;
+    /* list of vcpus waiting for room in the ring */
+    struct waitqueue_head wq;
 };
 
 struct domain
@@ -588,9 +593,12 @@ extern struct domain *domain_list;
  /* VCPU affinity has changed: migrating to a new CPU. */
 #define _VPF_migrating       3
 #define VPF_migrating        (1UL<<_VPF_migrating)
- /* VCPU is blocked on memory-event ring. */
-#define _VPF_mem_event       4
-#define VPF_mem_event        (1UL<<_VPF_mem_event)
+ /* VCPU is blocked on mem_paging ring. */
+#define _VPF_me_mem_paging   4
+#define VPF_me_mem_paging    (1UL<<_VPF_me_mem_paging)
+ /* VCPU is blocked on mem_access ring. */
+#define _VPF_me_mem_access   5
+#define VPF_me_mem_access    (1UL<<_VPF_me_mem_access)
 
 static inline int vcpu_runnable(struct vcpu *v)
 {

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 13:17:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 13:17:40 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNt36-0005DS-4G; Tue, 08 Nov 2011 13:17:40 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNt2H-00050h-Jq
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 13:16:49 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1320787005!4119051!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7836 invoked from network); 8 Nov 2011 21:16:46 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-2.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 8 Nov 2011 21:16:46 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA8LFY7g009190
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 8 Nov 2011 21:15:35 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA8LFW46025546
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 8 Nov 2011 21:15:32 GMT
Received: from abhmt106.oracle.com (abhmt106.oracle.com [141.146.116.58])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA8LFO8g002489; Tue, 8 Nov 2011 15:15:24 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 08 Nov 2011 13:15:24 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id BF8CA81448; Tue,  8 Nov 2011 16:15:22 -0500 (EST)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, x86@kernel.org, len.brown@intel.com,
	tglx@linutronix.de, jeremy@goop.org, hpa@zytor.com, bp@alien8.de,
	tj@kernel.org, trenn@suse.de
Date: Tue,  8 Nov 2011 16:15:11 -0500
Message-Id: <1320786914-10541-1-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.7.1
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090201.4EB99BF8.00E2,ss=1,re=0.000,fgs=0
Cc: mingo@redhat.com, xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] x86/acpi fixes for 3.2 (v1) impacting
	distributions.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

I am posting three patches that are impacting distributions (both Ubuntu
and Fedora Core 16) when running the Linux v3.1 (or later) under Xen.

The first one is a regression:
 [PATCH 1/3] cpuidle: If disable_cpuidle() is called, set pm_idle to

In 3.1 we set pm_idle to something else besides the default_idle which
is not good. We want to use the default_halt as it does a yield hypercall, while
the other pm_idle do not. Worst yet, when we would migrate a guest we could
be using the wrong pm_idle code (on AMD boxes).

The two other ones are more controversial and I am not sure if the path
I had choosen is the "best" to fix the corruption problem. The "Right Way"
would be to wrap pte_flags with a pvops call, but that has serious performance
drawback implications. Ad nauseum details are in the patch:

 [PATCH 2/3] x86/cpa: Use pte_attrs instead of pte_flags on

and the last one is not that important, but nonethless if somebody is running
CONFIG_CPA_DEBUG and with a radeon or nouveau card they might get sporadic:
"CPA (x) bad PTE" messages. This patch fixes that.

 [PATCH 3/3] x86/paravirt: Use pte_val instead of pte_flags on CPA

The patches are also located in 

git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git stable/for-x86

 arch/x86/include/asm/pgtable.h |    5 +++++
 arch/x86/kernel/process.c      |    5 +++++
 arch/x86/mm/pageattr-test.c    |    6 +++++-
 arch/x86/mm/pageattr.c         |    2 +-
 include/linux/cpuidle.h        |    2 ++
 5 files changed, 18 insertions(+), 2 deletions(-)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 13:18:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 13:18:55 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNt4J-0005ap-3K; Tue, 08 Nov 2011 13:18:55 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNt2V-00053U-HP
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 13:17:04 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1320787018!792169!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7254 invoked from network); 8 Nov 2011 21:17:00 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-4.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 8 Nov 2011 21:17:00 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA8LFbHn009259
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 8 Nov 2011 21:15:38 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA8LFZsI000013
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 8 Nov 2011 21:15:35 GMT
Received: from abhmt113.oracle.com (abhmt113.oracle.com [141.146.116.65])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA8LFSit006175; Tue, 8 Nov 2011 15:15:28 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 08 Nov 2011 13:15:28 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 0BC0481448; Tue,  8 Nov 2011 16:15:27 -0500 (EST)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, x86@kernel.org, len.brown@intel.com,
	tglx@linutronix.de, jeremy@goop.org, hpa@zytor.com, bp@alien8.de,
	tj@kernel.org, trenn@suse.de
Date: Tue,  8 Nov 2011 16:15:12 -0500
Message-Id: <1320786914-10541-2-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.7.1
In-Reply-To: <1320786914-10541-1-git-send-email-konrad.wilk@oracle.com>
References: <1320786914-10541-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090203.4EB99BFB.0001,ss=1,re=0.000,fgs=0
Cc: stable@kernel.org, mingo@redhat.com, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 1/3] cpuidle: If disable_cpuidle() is called,
	set pm_idle to default_idle.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

. however we ignore the disable_cpuidle() directive and
in select_idle_routine() set it to type preferred by the CPU.

This is a regression introduced by

 commit a0bfa1373859e9d11dc92561a8667588803e42d8
 Author: Len Brown <len.brown@intel.com>
 Date:   Fri Apr 1 19:34:59 2011 -0400

     cpuidle: stop depending on pm_idle

specifically this patch:

 commit d91ee5863b71e8c90eaf6035bff3078a85e2e7b5
 Author: Len Brown <len.brown@intel.com>
 Date:   Fri Apr 1 18:28:35 2011 -0400

     cpuidle: replace xen access to x86 pm_idle and default_idle

     ..scribble on pm_idle and access default_idle,
    have it simply disable_cpuidle() so acpi_idle will not load and
    architecture default HLT will be used.

.. but the default HLT does not get used. Instead we end up in the
situation that select_idle_routine() is called from arch/x86/kernel/cpu/common.c
and if we called cpuidle_disable(), then the pm_idle is not set, and
we end up setting pm_idle to mwait_idle or amd_e400_idle.

This patch uses the cpuidle_disabled() functionality and
makes select_idle_routine() adhere to that.

Reported-by: Stefan Bader <stefan.bader@canonical.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

CC: Thomas Gleixner <tglx@linutronix.de>
CC: Ingo Molnar <mingo@redhat.com>
CC: "H. Peter Anvin" <hpa@zytor.com>
CC: x86@kernel.org
CC: Len Brown <len.brown@intel.com>
CC: Borislav Petkov <bp@alien8.de>
CC: Tejun Heo <tj@kernel.org>
CC: Thomas Renninger <trenn@suse.de>
CC: stable@kernel.org
---
 arch/x86/kernel/process.c |    5 +++++
 include/linux/cpuidle.h   |    2 ++
 2 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index e7e3b01..1f7f8c8 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -14,6 +14,7 @@
 #include <linux/utsname.h>
 #include <trace/events/power.h>
 #include <linux/hw_breakpoint.h>
+#include <linux/cpuidle.h>
 #include <asm/cpu.h>
 #include <asm/system.h>
 #include <asm/apic.h>
@@ -587,6 +588,10 @@ void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c)
 	if (pm_idle)
 		return;
 
+	if (cpuidle_disabled()) {
+		pm_idle = default_idle;
+		return;
+	}
 	if (cpu_has(c, X86_FEATURE_MWAIT) && mwait_usable(c)) {
 		/*
 		 * One CPU supports mwait => All CPUs supports mwait
diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h
index b51629e..123fe9e 100644
--- a/include/linux/cpuidle.h
+++ b/include/linux/cpuidle.h
@@ -122,6 +122,7 @@ struct cpuidle_driver {
 };
 
 #ifdef CONFIG_CPU_IDLE
+extern int cpuidle_disabled(void);
 extern void disable_cpuidle(void);
 extern int cpuidle_idle_call(void);
 
@@ -137,6 +138,7 @@ extern int cpuidle_enable_device(struct cpuidle_device *dev);
 extern void cpuidle_disable_device(struct cpuidle_device *dev);
 
 #else
+static inline int cpuidle_disabled(void) { return 1; }
 static inline void disable_cpuidle(void) { }
 static inline int cpuidle_idle_call(void) { return -ENODEV; }
 
-- 
1.7.7.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 13:19:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 13:19:47 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNt59-0005xb-8V; Tue, 08 Nov 2011 13:19:47 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNt2U-00053F-DQ
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 13:17:04 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320787018!3413643!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6308 invoked from network); 8 Nov 2011 21:16:59 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-14.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 8 Nov 2011 21:16:59 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA8LFabK032671
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 8 Nov 2011 21:15:36 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA8LFZWw027370
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 8 Nov 2011 21:15:35 GMT
Received: from abhmt111.oracle.com (abhmt111.oracle.com [141.146.116.63])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA8LFSud000977; Tue, 8 Nov 2011 15:15:28 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 08 Nov 2011 13:15:28 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 2267A8144A; Tue,  8 Nov 2011 16:15:27 -0500 (EST)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, x86@kernel.org, len.brown@intel.com,
	tglx@linutronix.de, jeremy@goop.org, hpa@zytor.com, bp@alien8.de,
	tj@kernel.org, trenn@suse.de
Date: Tue,  8 Nov 2011 16:15:14 -0500
Message-Id: <1320786914-10541-4-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.7.1
In-Reply-To: <1320786914-10541-1-git-send-email-konrad.wilk@oracle.com>
References: <1320786914-10541-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A02020B.4EB99BF9.00D5,ss=1,re=0.000,fgs=0
Cc: stable@kernel.org, mingo@redhat.com, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 3/3] x86/paravirt: Use pte_val instead of
	pte_flags on CPA pageattr_test
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

For details refer to patch "x86/paravirt: Use pte_attrs instead of
pte_flags on CPA/set_p.._wb/wc operations." which explains that
some pages have the _PAGE_PWT bit set in the _PAGE_PSE field
when running under Xen.

When pageattr_test is running it uses pte_flags to check whether
it succedded in setting _PAGE_UNUSED1 bit, but also whether the
page had _PAGE_PSE. This can happen when one of the randomly selected
pages to be tested is a page that has been set to be _PAGE_WC
as under Xen, that field is under _PAGE_PSE. Since the 'pte_huge'
call is using the pte_flags(x) macro, which extracts the "raw" contents
of the PTE, the translation of _PAGE_PSE -> _PAGE_PWT does not happen
and we incorrectly identify the PTE as bad.

Using the 'pte_val' instead of 'pte_flags' fixes the problem and
this patch does that.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
CC: stable@kernel.org
---
 arch/x86/mm/pageattr-test.c |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/arch/x86/mm/pageattr-test.c b/arch/x86/mm/pageattr-test.c
index b008656..da853e3 100644
--- a/arch/x86/mm/pageattr-test.c
+++ b/arch/x86/mm/pageattr-test.c
@@ -38,6 +38,10 @@ static int pte_testbit(pte_t pte)
 {
 	return pte_flags(pte) & _PAGE_UNUSED1;
 }
+static int pte_testhuge(pte_t pte)
+{
+	return pte_val(pte) & _PAGE_PSE;
+}
 
 struct split_state {
 	long lpg, gpg, spg, exec;
@@ -180,7 +184,7 @@ static int pageattr_test(void)
 		}
 
 		pte = lookup_address(addr[i], &level);
-		if (!pte || !pte_testbit(*pte) || pte_huge(*pte)) {
+		if (!pte || !pte_testbit(*pte) || pte_testhuge(*pte)) {
 			printk(KERN_ERR "CPA %lx: bad pte %Lx\n", addr[i],
 				pte ? (u64)pte_val(*pte) : 0ULL);
 			failed++;
-- 
1.7.7.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 13:21:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 13:21:04 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNt6O-0006Li-1O; Tue, 08 Nov 2011 13:21:04 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNt2a-00054x-8P
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 13:17:08 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1320787006!47492370!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12480 invoked from network); 8 Nov 2011 21:16:47 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-13.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 8 Nov 2011 21:16:47 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA8LFZCQ009238
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 8 Nov 2011 21:15:36 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA8LFYPR025615
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 8 Nov 2011 21:15:35 GMT
Received: from abhmt111.oracle.com (abhmt111.oracle.com [141.146.116.63])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA8LFSQc002545; Tue, 8 Nov 2011 15:15:28 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 08 Nov 2011 13:15:28 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 176CD81449; Tue,  8 Nov 2011 16:15:27 -0500 (EST)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, x86@kernel.org, len.brown@intel.com,
	tglx@linutronix.de, jeremy@goop.org, hpa@zytor.com, bp@alien8.de,
	tj@kernel.org, trenn@suse.de
Date: Tue,  8 Nov 2011 16:15:13 -0500
Message-Id: <1320786914-10541-3-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.7.1
In-Reply-To: <1320786914-10541-1-git-send-email-konrad.wilk@oracle.com>
References: <1320786914-10541-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090203.4EB99BF9.0023,ss=1,re=0.000,fgs=0
Cc: stable@kernel.org, mingo@redhat.com, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 2/3] x86/cpa: Use pte_attrs instead of pte_flags
	on CPA/set_p.._wb/wc operations.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

When using the paravirt interface, most of the page operations are wrapped
in the pvops interface. The one that is not is the pte_flags. The reason
being that for most cases, the "raw" PTE flag values for baremetal and whatever
pvops platform is running (in this case) - share the same bit meaning.

Except for PAT. Under Linux, the PAT MSR is written to be:

          PAT4                 PAT0
+---+----+----+----+-----+----+----+
 WC | WC | WB | UC | UC- | WC | WB |  <= Linux
+---+----+----+----+-----+----+----+
 WC | WT | WB | UC | UC- | WT | WB |  <= BIOS
+---+----+----+----+-----+----+----+
 WC | WP | WC | UC | UC- | WT | WB |  <= Xen
+---+----+----+----+-----+----+----+

The lookup of this index table translates to looking up
Bit 7, Bit 4, and Bit 3 of PTE:

 PAT/PSE (bit 7) ... PCD (bit 4) .. PWT (bit 3).

If all bits are off, then we are using PAT0. If bit 3 turned on,
then we are using PAT1, if bit 3 and bit 4, then PAT2..

Back to the PAT MSR table:

As you can see, the PAT1 translates to PAT4 under Xen. Under Linux
we only use PAT0, PAT1, and PAT2 for the caching as:

 WB = none (so PAT0)
 WC = PWT (bit 3 on)
 UC = PWT | PCD (bit 3 and 4 are on).

But to make it work with Xen, we end up doing for WC a translation:

 PWT (so bit 3 on) --> PAT (so bit 7 is on) and clear bit 3

And to translate back (when the paravirt pte_val is used) we would:

 PAT (bit 7 on) --> PWT (bit 3 on) and clear bit 7.

This works quite well, except if code uses the pte_flags, as pte_flags
reads the raw value and does not go through the paravirt. Which means
that if (when running under Xen):

 1) we allocate some pages.
 2) call set_pages_array_wc, which ends up calling:
     __page_change_att_set_clr(.., __pgprot(__PAGE_WC),  /* set */
                                 , __pgprot(__PAGE_MASK), /* clear */
    which ends up reading the _raw_ PTE flags and _only_ look at the
    _PTE_FLAG_MASK contents with __PAGE_MASK cleared (0x18) and
    __PAGE_WC (0x8) set.

     read raw *pte -> 0x67
     *pte = 0x67 & ^0x18 | 0x8
     *pte = 0x67 & 0xfffffe7 | 0x8
     *pte = 0x6f

   [now set_pte_atomic is called, and 0x6f is written in, but under
    xen_make_pte, the bit 3 is translated to bit 7, so it ends up
    writting 0xa7, which is correct]

 3) do something to them.
 4) call set_pages_array_wb
     __page_change_att_set_clr(.., __pgprot(__PAGE_WB),  /* set */
                                 , __pgprot(__PAGE_MASK), /* clear */
    which ends up reading the _raw_ PTE and _only_ look at the
    _PTE_FLAG_MASK contents with _PAGE_MASK cleared (0x18) and
    __PAGE_WB (0x0) set:

     read raw *pte -> 0xa7
     *pte = 0xa7 & &0x18 | 0
     *pte = 0xa7 & 0xfffffe7 | 0
     *pte = 0xa7

   [we check whether the old PTE is different from the new one

    if (pte_val(old_pte) != pte_val(new_pte)) {
        set_pte_atomic(kpte, new_pte);
        ...

   and find out that 0xA7 == 0xA7 so we do not write the new PTE value in]

   End result is that we failed at removing the WC caching bit!

 5) free them.
   [and have pages with PAT4 (bit 7) set, so other subsystems end up using
    the pages that have the write combined bit set resulting in crashes. Yikes!].

The fix, which this patch proposes, is to wrap the pte_pgprot in the CPA
code with newly introduced pte_attrs which can go through the pvops interface
to get the "emulated" value instead of the raw. Naturally if CONFIG_PARAVIRT is
not set, it would end calling native_pte_val.

The other way to fix this is by wrapping pte_flags and go through the pvops
interface and it really is the Right Thing to do.  The problem is, that past
experience with mprotect stuff demonstrates that it be really expensive in inner
loops, and pte_flags() is used in some very perf-critical areas.

Example code to run this and see the various mysterious subsystems/applications
crashing

MODULE_AUTHOR("Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>");
MODULE_DESCRIPTION("wb_to_wc_and_back");
MODULE_LICENSE("GPL");
MODULE_VERSION(WB_TO_WC);

static int thread(void *arg)
{
	struct page *a[MAX_PAGES];
	unsigned int i, j;
	do {
		for (j = 0, i = 0;i < MAX_PAGES; i++, j++) {
			a[i] = alloc_page(GFP_KERNEL);
			if (!a[i])
				break;
		}
		set_pages_array_wc(a, j);
		set_current_state(TASK_INTERRUPTIBLE);
		schedule_timeout_interruptible(HZ);
		for (i = 0; i < j; i++) {
			unsigned long *addr = page_address(a[i]);
			if (addr) {
				memset(addr, 0xc2, PAGE_SIZE);
			}
		}
		set_pages_array_wb(a, j);
		for (i = 0; i< MAX_PAGES; i++) {
			if (a[i])
				__free_page(a[i]);
			a[i] = NULL;
		}
	} while (!kthread_should_stop());
	return 0;
}
static struct task_struct *t;
static int __init wb_to_wc_init(void)
{
	t = kthread_run(thread, NULL, "wb_to_wc_and_back");
	return 0;
}
static void __exit wb_to_wc_exit(void)
{
	if (t)
		kthread_stop(t);
}
module_init(wb_to_wc_init);
module_exit(wb_to_wc_exit);

This fixes RH BZ #742032
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
CC: stable@kernel.org
---
 arch/x86/include/asm/pgtable.h |    5 +++++
 arch/x86/mm/pageattr.c         |    2 +-
 2 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
index 18601c8..34027b0 100644
--- a/arch/x86/include/asm/pgtable.h
+++ b/arch/x86/include/asm/pgtable.h
@@ -349,6 +349,11 @@ static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot)
 	return __pgprot(preservebits | addbits);
 }
 
+static inline pgprot_t pte_attrs(pte_t pte)
+{
+	return __pgprot(pte_val(pte) & PTE_FLAGS_MASK);
+}
+
 #define pte_pgprot(x) __pgprot(pte_flags(x) & PTE_FLAGS_MASK)
 
 #define canon_pgprot(p) __pgprot(massage_pgprot(p))
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index f9e5267..efa8040 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -651,7 +651,7 @@ repeat:
 
 	if (level == PG_LEVEL_4K) {
 		pte_t new_pte;
-		pgprot_t new_prot = pte_pgprot(old_pte);
+		pgprot_t new_prot = pte_attrs(old_pte);
 		unsigned long pfn = pte_pfn(old_pte);
 
 		pgprot_val(new_prot) &= ~pgprot_val(cpa->mask_clr);
-- 
1.7.7.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 13:23:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 13:23:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNt95-0007P8-5R; Tue, 08 Nov 2011 13:23:51 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNt62-0006BZ-7J
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 13:20:42 -0800
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-8.tower-27.messagelabs.com!1320787214!51460022!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18865 invoked from network); 8 Nov 2011 21:20:15 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-8.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 8 Nov 2011 21:20:15 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320787237; l=1138;
	s=domk; d=aepfle.de;
	h=Content-Type:MIME-Version:Subject:To:From:Date:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=Y8EFbohvRpZvx75cdG1OEGivs3w=;
	b=iMrDJYvKNeeEGLopylcq7jPL3T4DSSLdR7BL2YbLvCCCUKoxuW4HGBoV2Eu3sQefCKb
	GKKa+3mpYZ8rD22jL/lL/j8bVP6ILqgQjjSn/tHCyjzDSW/JXOT9RDVGCZJrE+PnZHc2h
	2q8CpDZy8sHFaffqwOzLSf7PX605t54OCaw=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV67U=
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-1.vodafone-net.de [80.226.24.1])
	by post.strato.de (mrclete mo32) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id V016e0nA8JOXX4
	for <xen-devel@lists.xensource.com>;
	Tue, 8 Nov 2011 22:20:26 +0100 (MET)
Received: by probook.site (Postfix, from userid 1000)
	id 769F418638; Tue,  8 Nov 2011 22:20:24 +0100 (CET)
Date: Tue, 8 Nov 2011 22:20:24 +0100
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Message-ID: <20111108212024.GA5276@aepfle.de>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
Subject: [Xen-devel] Need help with fixing the Xen waitqueue feature
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


The patch 'mem_event: use wait queue when ring is full' I just sent out
makes use of the waitqueue feature. There are two issues I get with the
change applied:

I think I got the logic right, and in my testing vcpu->pause_count drops
to zero in p2m_mem_paging_resume(). But for some reason the vcpu does
not make progress after the first wakeup. In my debugging there is one
wakeup, the ring is still full, but further wakeups dont happen.
The fully decoded xentrace output may provide some hints about the
underlying issue. But its hard to get due to the second issue.

Another thing is that sometimes the host suddenly reboots without any
message. I think the reason for this is that a vcpu whose stack was put
aside and that was later resumed may find itself on another physical
cpu. And if that happens, wouldnt that invalidate some of the local
variables back in the callchain? If some of them point to the old
physical cpu, how could this be fixed? Perhaps a few "volatiles" are
needed in some places.

I will check wether pinning the guests vcpus to physical cpus actually
avoids the sudden reboots.

Olaf

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 13:43:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 13:43:39 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNtSE-0000L2-Pe; Tue, 08 Nov 2011 13:43:39 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNtRN-00007v-IY
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 13:42:45 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-9.tower-174.messagelabs.com!1320788561!791060!1
X-Originating-IP: [208.97.132.81]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 348 invoked from network); 8 Nov 2011 21:42:42 -0000
Received: from caiajhbdcaib.dreamhost.com (HELO homiemail-a23.g.dreamhost.com)
	(208.97.132.81) by server-9.tower-174.messagelabs.com with SMTP;
	8 Nov 2011 21:42:42 -0000
Received: from homiemail-a23.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a23.g.dreamhost.com (Postfix) with ESMTP id A7A014B0090;
	Tue,  8 Nov 2011 13:42:40 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id:date
	:from:to:cc; q=dns; s=lagarcavilla.org; b=vK0mpUWH49IK52cY2psVKK
	LcQ1IPXHOtzKnBnRC15g2Zfh1+vrCMv47YRVsgf91wgeOWjPiiVuzonm4wCb4ed2
	sdHXgl1liTBuUxA+TyY7clYaPkwsykHs4TUDX/fLOXwS+f4Udq6I99WpqtV1OnQW
	uHoJIvvbb4n7/mPQeRfbI=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:date:from:to:cc; s=lagarcavilla.org; bh=ANcKdckj63go
	3oVevJcTadupcV8=; b=sg4DFG/BJ/TKWtZ9H6fYet1fWhNglNWCFcXZQyiBhgrh
	Dwa9ErD3oWeKH6G21N6AXEhrx9x7xCpXjDH76NHafnFJ7JKNXUp3gvYktX3qwL/R
	WxXkHs+r42kiWO1W8Uw15hStu7zdOEqOHTKz4nL+rudb+6EhV8xGnifQD9BCWZs=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a23.g.dreamhost.com (Postfix) with ESMTPSA id 2A1964B0086; 
	Tue,  8 Nov 2011 13:42:38 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1320788543@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Tue, 08 Nov 2011 16:42:23 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: olaf@aepfle.de, George.Dunlap@eu.citrix.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 0 of 3] p2m synchronization second part
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

In this patch series we add actual synchronization. 

We first refine the API update posted previously (I can fold 
the previous and this first patch together, keep separate, whatever)

Then, we make p2m-lookups actually lock the p2m. For now it's still
the global p2m lock. It can be eventually made more fine grained.

Finally, we ensure that within a get_gfn/put_gfn critical section,
the caller has an additional ref on the underlying mfn. This requires
some trickery for manipulations that remove the mfn or swap it
(sharing).

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

 xen/arch/x86/hvm/hvm.c        |   3 +-
 xen/arch/x86/mm/p2m.c         |   8 +++---
 xen/common/grant_table.c      |   2 +-
 xen/common/memory.c           |   6 +++-
 xen/arch/x86/mm/mm-locks.h    |  13 +++++----
 xen/arch/x86/mm/p2m.c         |  18 +++++++++++++-
 xen/include/asm-x86/p2m.h     |  39 ++++++++++++++++++-----------
 xen/arch/x86/mm.c             |  18 +++++++++----
 xen/arch/x86/mm/mem_sharing.c |  13 +++------
 xen/arch/x86/mm/p2m.c         |  56 +++++++++++++++++++++++++++++++++++++++++-
 xen/common/grant_table.c      |   4 +-
 xen/common/memory.c           |  10 +++---
 xen/include/asm-x86/mm.h      |   3 +-
 xen/include/asm-x86/p2m.h     |  10 ++++++-
 xen/include/xen/paging.h      |   2 +-
 xen/include/xen/tmem_xen.h    |   2 +-
 16 files changed, 148 insertions(+), 59 deletions(-)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 13:44:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 13:44:47 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNtTL-0000iR-2a; Tue, 08 Nov 2011 13:44:47 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNtRO-00007z-Fi
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 13:42:46 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-6.tower-174.messagelabs.com!1320788562!791535!1
X-Originating-IP: [208.97.132.66]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8290 invoked from network); 8 Nov 2011 21:42:43 -0000
Received: from caiajhbdcagg.dreamhost.com (HELO homiemail-a23.g.dreamhost.com)
	(208.97.132.66) by server-6.tower-174.messagelabs.com with SMTP;
	8 Nov 2011 21:42:43 -0000
Received: from homiemail-a23.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a23.g.dreamhost.com (Postfix) with ESMTP id 1FD9A4B0084;
	Tue,  8 Nov 2011 13:42:42 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=N2/BFVRg8Dz77IeK8U+su5n7oc61RJgynuJJFy4PdhPT
	OkXYHGXwA+jatKqRIt5qElflSZxgZCz9rjDs6I431Vqf1Ew/TIq8Oj5OQFcVF2bv
	LirvOfo1yGylx7IOoawFnwNRZLo+cgg8eHom1UsuPXl14VgR8wlY39SxWPp78O8=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=WKzG6AVLYoYKaRKG5+3PUZmtPBc=; b=NZftiipPJFI
	/hWfdpcf1uMPa/YmDPUXCQrK8xXuIGqavbsFC/PI+3Tdzm5ePOLp5LnUEMWjnPiy
	jhzkFJldMZM8cYFrPUyBTamOobxoviqGiYPkcsv7JmAXj9C2vBvobtUid1H41sP5
	f7Qca/N5FzbksKRj5XjszjkPWW77+/CQ=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a23.g.dreamhost.com (Postfix) with ESMTPSA id E5A764B0091; 
	Tue,  8 Nov 2011 13:42:40 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: a0c55cc5d696294a899cd41a57f608a6bb9f7711
Message-Id: <a0c55cc5d696294a899c.1320788544@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1320788543@xdev.gridcentric.ca>
References: <patchbomb.1320788543@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Tue, 08 Nov 2011 16:42:24 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: olaf@aepfle.de, George.Dunlap@eu.citrix.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 1 of 3] Improvements over API change for p2m
	lookups
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 xen/arch/x86/hvm/hvm.c   |  3 +--
 xen/arch/x86/mm/p2m.c    |  8 ++++----
 xen/common/grant_table.c |  2 +-
 xen/common/memory.c      |  6 +++++-
 4 files changed, 11 insertions(+), 8 deletions(-)


Ranging from the cosmetic to actual bug fixing.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r 390d6dc6c34b -r a0c55cc5d696 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -1791,8 +1791,7 @@ int hvm_virtual_to_linear_addr(
     return 0;
 }
 
-/* We leave this function holding a lock on the p2m entry and a ref
- * on the mapped mfn */
+/* We leave this function holding a lock on the p2m entry */
 static void *__hvm_map_guest_frame(unsigned long gfn, bool_t writable)
 {
     unsigned long mfn;
diff -r 390d6dc6c34b -r a0c55cc5d696 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -349,21 +349,21 @@ void p2m_teardown(struct p2m_domain *p2m
     if (p2m == NULL)
         return;
 
+    p2m_lock(p2m);
+
 #ifdef __x86_64__
     for ( gfn=0; gfn < p2m->max_mapped_pfn; gfn++ )
     {
-        mfn = get_gfn_query(d, gfn, &t);
+        p2m_access_t a;
+        mfn = p2m->get_entry(p2m, gfn, &t, &a, p2m_query, NULL);
         if ( mfn_valid(mfn) && (t == p2m_ram_shared) )
         {
             ASSERT(!p2m_is_nestedp2m(p2m));
             BUG_ON(mem_sharing_unshare_page(d, gfn, MEM_SHARING_DESTROY_GFN));
         }
-        put_gfn(d, gfn);
     }
 #endif
 
-    p2m_lock(p2m);
-
     p2m->phys_table = pagetable_null();
 
     while ( (pg = page_list_remove_head(&p2m->pages)) )
diff -r 390d6dc6c34b -r a0c55cc5d696 xen/common/grant_table.c
--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
@@ -470,7 +470,7 @@ __gnttab_map_grant_ref(
     struct domain *ld, *rd, *owner;
     struct vcpu   *led;
     int            handle;
-    unsigned long gfn = INVALID_GFN;
+    unsigned long  gfn = INVALID_GFN;
     unsigned long  frame = 0, nr_gets = 0;
     struct page_info *pg;
     int            rc = GNTST_okay;
diff -r 390d6dc6c34b -r a0c55cc5d696 xen/common/memory.c
--- a/xen/common/memory.c
+++ b/xen/common/memory.c
@@ -270,7 +270,7 @@ static long memory_exchange(XEN_GUEST_HA
     PAGE_LIST_HEAD(out_chunk_list);
     unsigned long in_chunk_order, out_chunk_order;
     xen_pfn_t     gpfn, gmfn, mfn;
-    unsigned long i, j, k;
+    unsigned long i, j, k = 0; /* gcc ... */
     unsigned int  memflags = 0;
     long          rc = 0;
     struct domain *d;
@@ -496,8 +496,12 @@ static long memory_exchange(XEN_GUEST_HA
  fail:
     /* Reassign any input pages we managed to steal. */
     while ( (page = page_list_remove_head(&in_chunk_list)) )
+    {
+        put_gfn(d, gmfn + k--);
         if ( assign_pages(d, page, 0, MEMF_no_refcount) )
             BUG();
+    }
+
  dying:
     rcu_unlock_domain(d);
     /* Free any output pages we managed to allocate. */

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 13:46:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 13:46:07 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNtUd-0001DC-Cm; Tue, 08 Nov 2011 13:46:07 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNtRQ-000082-2j
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 13:42:49 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-6.tower-182.messagelabs.com!1320788564!2379323!1
X-Originating-IP: [208.97.132.66]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3679 invoked from network); 8 Nov 2011 21:42:44 -0000
Received: from caiajhbdcagg.dreamhost.com (HELO homiemail-a23.g.dreamhost.com)
	(208.97.132.66) by server-6.tower-182.messagelabs.com with SMTP;
	8 Nov 2011 21:42:44 -0000
Received: from homiemail-a23.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a23.g.dreamhost.com (Postfix) with ESMTP id 943C14B0089;
	Tue,  8 Nov 2011 13:42:43 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=njGKcLqpqJcvKucKl5KCbED/PZBlLBvNNtdKVAE7DoWO
	PUoDu0h4FJbf02AZ8oqdCblXte0Rh4DITrB30OXuxxft/OGtWB3TR7ZbQqa2c8Rh
	lI6RCHFS7Iurmz83aApfBynzWBnSIXzV8avMXYRybHKf2NEVMX5QLl8e0ielaMA=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=I67qK6vW9OWjR7CHm/ALtbleGUA=; b=oNUTsNRMhdw
	LoBttmdM0A6b3v703jM10Sh1AUHJgxo4rK/P1B5vkTzQveDptI/uWhn6PshiAzAx
	mLsUoXcIyvzVlUZY8miobvr+K97EZdQxX8uCctKoo3La1k2hXoQfB4sWuorJ61vj
	8TTHKsFvoRBkXHyNBvIX6t08+nGYe/A4=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a23.g.dreamhost.com (Postfix) with ESMTPSA id 9F4444B0086; 
	Tue,  8 Nov 2011 13:42:42 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 6203a0549d8a1a21753bfd95fecea302b5208638
Message-Id: <6203a0549d8a1a21753b.1320788545@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1320788543@xdev.gridcentric.ca>
References: <patchbomb.1320788543@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Tue, 08 Nov 2011 16:42:25 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: olaf@aepfle.de, George.Dunlap@eu.citrix.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 2 of 3] Make p2m lookups fully synchronized wrt
	modifications
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 xen/arch/x86/mm/mm-locks.h |  13 +++++++------
 xen/arch/x86/mm/p2m.c      |  18 +++++++++++++++++-
 xen/include/asm-x86/p2m.h  |  39 ++++++++++++++++++++++++---------------
 3 files changed, 48 insertions(+), 22 deletions(-)


We achieve this by locking/unlocking the global p2m_lock in get/put_gfn.
This brings about a few consequences for the p2m_lock:

 - not ordered anymore in mm-locks.h: unshare does get_gfn -> shr_lock,
   there are code paths that do paging_lock -> get_gfn. All of these
   would cause mm-locks.h to panic.
 - the lock is always taken recursively, as there are many paths that
   do get_gfn -> p2m_lock

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r a0c55cc5d696 -r 6203a0549d8a xen/arch/x86/mm/mm-locks.h
--- a/xen/arch/x86/mm/mm-locks.h
+++ b/xen/arch/x86/mm/mm-locks.h
@@ -165,14 +165,15 @@ declare_mm_lock(nestedp2m)
 
 /* P2M lock (per-p2m-table)
  * 
- * This protects all updates to the p2m table.  Updates are expected to
- * be safe against concurrent reads, which do *not* require the lock. */
+ * This protects all queries and updates to the p2m table. Because queries
+ * can happen interleaved with other locks in here, we do not enforce
+ * ordering, and make all locking recursive. */
 
-declare_mm_lock(p2m)
-#define p2m_lock(p)           mm_lock(p2m, &(p)->lock)
-#define p2m_lock_recursive(p) mm_lock_recursive(p2m, &(p)->lock)
-#define p2m_unlock(p)         mm_unlock(&(p)->lock)
+#define p2m_lock(p)           spin_lock_recursive(&(p)->lock.lock)
+#define p2m_lock_recursive(p) spin_lock_recursive(&(p)->lock.lock)
+#define p2m_unlock(p)         spin_unlock_recursive(&(p)->lock.lock)
 #define p2m_locked_by_me(p)   mm_locked_by_me(&(p)->lock)
+#define gfn_locked_by_me(p,g) mm_locked_by_me(&(p)->lock)
 
 /* Page alloc lock (per-domain)
  *
diff -r a0c55cc5d696 -r 6203a0549d8a xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -158,6 +158,9 @@ mfn_t gfn_to_mfn_type_p2m(struct p2m_dom
         return _mfn(gfn);
     }
 
+    /* Grab the lock here, don't release until put_gfn */
+    p2m_lock(p2m);
+
     mfn = p2m->get_entry(p2m, gfn, t, a, q, page_order);
 
 #ifdef __x86_64__
@@ -182,6 +185,19 @@ mfn_t gfn_to_mfn_type_p2m(struct p2m_dom
     return mfn;
 }
 
+void put_gfn(struct domain *d, unsigned long gfn)
+{
+    struct p2m_domain *p2m = p2m_get_hostp2m(d);
+
+    if ( !p2m || !paging_mode_translate(d) )
+        /* Nothing to do in this case */
+        return;
+
+    ASSERT(p2m_locked_by_me(p2m));
+
+    p2m_unlock(p2m);
+}
+
 int set_p2m_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn, 
                   unsigned int page_order, p2m_type_t p2mt, p2m_access_t p2ma)
 {
@@ -190,7 +206,7 @@ int set_p2m_entry(struct p2m_domain *p2m
     unsigned int order;
     int rc = 1;
 
-    ASSERT(p2m_locked_by_me(p2m));
+    ASSERT(gfn_locked_by_me(p2m, gfn));
 
     while ( todo )
     {
diff -r a0c55cc5d696 -r 6203a0549d8a xen/include/asm-x86/p2m.h
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -305,9 +305,10 @@ struct p2m_domain *p2m_get_p2m(struct vc
 
 #define p2m_get_pagetable(p2m)  ((p2m)->phys_table)
 
-/**** p2m query accessors. After calling any of the variants below, you
- * need to call put_gfn(domain, gfn). If you don't, you'll lock the
- * hypervisor. ****/
+/**** p2m query accessors. They lock p2m_lock, and thus serialize
+ * lookups wrt modifications. They _do not_ release the lock on exit.
+ * After calling any of the variants below, caller needs to use
+ * put_gfn. ****/
 
 /* Read a particular P2M table, mapping pages as we go.  Most callers
  * should _not_ call this directly; use the other get_gfn* functions
@@ -349,19 +350,27 @@ static inline unsigned long get_gfn_unty
     return INVALID_MFN;
 }
 
-/* This is a noop for now. */
-static inline void put_gfn(struct domain *d, unsigned long gfn)
-{
-}
+/* Will release the p2m_lock and put the page behind this mapping. */
+void put_gfn(struct domain *d, unsigned long gfn);
 
-/* These are identical for now. The intent is to have the caller not worry 
- * about put_gfn. To only be used in printk's, crash situations, or to 
- * peek at a type. You're not holding the p2m entry exclsively after calling
- * this. */
-#define get_gfn_unlocked(d, g, t)         get_gfn_type((d), (g), (t), p2m_alloc)
-#define get_gfn_query_unlocked(d, g, t)   get_gfn_type((d), (g), (t), p2m_query)
-#define get_gfn_guest_unlocked(d, g, t)   get_gfn_type((d), (g), (t), p2m_guest)
-#define get_gfn_unshare_unlocked(d, g, t) get_gfn_type((d), (g), (t), p2m_unshare)
+/* The intent is to have the caller not worry about put_gfn. They apply to 
+ * very specific situations: debug printk's, dumps during a domain crash,
+ * or to peek at a p2m entry/type. Caller is not holding the p2m entry 
+ * exclusively after calling this. */
+#define build_unlocked_accessor(name)                                   \
+    static inline mfn_t get_gfn ## name ## _unlocked(struct domain *d,  \
+                                                unsigned long gfn,      \
+                                                p2m_type_t *t)          \
+    {                                                                   \
+        mfn_t mfn = get_gfn ##name (d, gfn, t);                         \
+        put_gfn(d, gfn);                                                \
+        return mfn;                                                     \
+    }
+
+build_unlocked_accessor()
+build_unlocked_accessor(_query)
+build_unlocked_accessor(_guest)
+build_unlocked_accessor(_unshare)
 
 /* General conversion function from mfn to gfn */
 static inline unsigned long mfn_to_gfn(struct domain *d, mfn_t mfn)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 13:46:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 13:46:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNtVR-0001Zl-7V; Tue, 08 Nov 2011 13:46:57 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNtRR-000087-7R
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 13:42:50 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-12.tower-216.messagelabs.com!1320788565!2781978!1
X-Originating-IP: [208.97.132.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31151 invoked from network); 8 Nov 2011 21:42:45 -0000
Received: from caiajhbdcbhh.dreamhost.com (HELO homiemail-a23.g.dreamhost.com)
	(208.97.132.177) by server-12.tower-216.messagelabs.com with SMTP;
	8 Nov 2011 21:42:45 -0000
Received: from homiemail-a23.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a23.g.dreamhost.com (Postfix) with ESMTP id B1B304B0084;
	Tue,  8 Nov 2011 13:42:44 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=Zx/P7bxN8X1h4oWuOVC4o0K4AfHriCMGBvenzDptVAg0
	LipJp6IowQaLJGkDy/g7306710pj7US0+PiT+9kbmf7Jj9XvHdsk3DfSj31L1hFz
	ob3wHXe1KbptgovgMJALgGUf49AS408hrYQ8EJfzfvOeY96sWrq/upJUv4Ytuhs=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=ASKtW1CnwC1VSDOKLpwAlt7PJHM=; b=BqiNYL4NVT2
	mQVqjpDAkjrwR4cww6sST1HjXePQ7EdPgiVccNOLHmWQ9XAbYwMs5//6/LW89J9D
	SjT9swpZgUhfZGjjo1actF8dOZJbytY3Zqeq4vKKHBzb4e7KHXskxCmMoxwe0C05
	gdJrWdmbKu5iVcd0uT4g29imox61rcog=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a23.g.dreamhost.com (Postfix) with ESMTPSA id CE2AA4B0086; 
	Tue,  8 Nov 2011 13:42:43 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 4b684fa7463630e061b0d474250c013cbeaeebdb
Message-Id: <4b684fa7463630e061b0.1320788546@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1320788543@xdev.gridcentric.ca>
References: <patchbomb.1320788543@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Tue, 08 Nov 2011 16:42:26 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: olaf@aepfle.de, George.Dunlap@eu.citrix.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 3 of 3] Make p2m critical sections hold a ref on
 the underlying mfn
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 xen/arch/x86/mm.c             |  18 +++++++++----
 xen/arch/x86/mm/mem_sharing.c |  13 +++------
 xen/arch/x86/mm/p2m.c         |  56 +++++++++++++++++++++++++++++++++++++++++-
 xen/common/grant_table.c      |   4 +-
 xen/common/memory.c           |  10 +++---
 xen/include/asm-x86/mm.h      |   3 +-
 xen/include/asm-x86/p2m.h     |  10 ++++++-
 xen/include/xen/paging.h      |   2 +-
 xen/include/xen/tmem_xen.h    |   2 +-
 9 files changed, 89 insertions(+), 29 deletions(-)


For translated domains, critical sections demarcated by a
get_gfn/put_gfn pair will hold an additional ref on the
underlying mfn.

This requires keeping tabs on special manipulations that
change said mfn:
 - physmap remove page
 - sharing
 - steal page

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r 6203a0549d8a -r 4b684fa74636 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4128,7 +4128,7 @@ static int replace_grant_p2m_mapping(
                  type, mfn_x(old_mfn), frame);
         return GNTST_general_error;
     }
-    guest_physmap_remove_page(d, gfn, frame, 0);
+    guest_physmap_remove_page(d, gfn, frame, 0, HOLDING_GFN);
 
     put_gfn(d, gfn);
     return GNTST_okay;
@@ -4248,8 +4248,10 @@ int donate_page(
 }
 
 int steal_page(
-    struct domain *d, struct page_info *page, unsigned int memflags)
+    struct domain *d, struct page_info *page, unsigned int memflags,
+    int holding_gfn)
 {
+    unsigned count;
     unsigned long x, y;
     bool_t drop_dom_ref = 0;
 
@@ -4261,11 +4263,14 @@ int steal_page(
     /*
      * We require there is just one reference (PGC_allocated). We temporarily
      * drop this reference now so that we can safely swizzle the owner.
+     * If, however, this is invoked by a caller holding the p2m entry, there
+     * will be another reference.
      */
+    count = (holding_gfn) ? 1 : 2;
     y = page->count_info;
     do {
         x = y;
-        if ( (x & (PGC_count_mask|PGC_allocated)) != (1 | PGC_allocated) )
+        if ( (x & (PGC_count_mask|PGC_allocated)) != (count | PGC_allocated) )
             goto fail;
         y = cmpxchg(&page->count_info, x, x & ~PGC_count_mask);
     } while ( y != x );
@@ -4276,7 +4281,7 @@ int steal_page(
     do {
         x = y;
         BUG_ON((x & (PGC_count_mask|PGC_allocated)) != PGC_allocated);
-    } while ( (y = cmpxchg(&page->count_info, x, x | 1)) != x );
+    } while ( (y = cmpxchg(&page->count_info, x, x | count)) != x );
 
     /* Unlink from original owner. */
     if ( !(memflags & MEMF_no_refcount) && !--d->tot_pages )
@@ -4779,7 +4784,8 @@ long arch_memory_op(int op, XEN_GUEST_HA
         {
             if ( is_xen_heap_mfn(prev_mfn) )
                 /* Xen heap frames are simply unhooked from this phys slot. */
-                guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
+                guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0, 
+                                            HOLDING_GFN);
             else
                 /* Normal domain memory is freed, to avoid leaking memory. */
                 guest_remove_page(d, xatp.gpfn);
@@ -4791,7 +4797,7 @@ long arch_memory_op(int op, XEN_GUEST_HA
         gpfn = get_gpfn_from_mfn(mfn);
         ASSERT( gpfn != SHARED_M2P_ENTRY );
         if ( gpfn != INVALID_M2P_ENTRY )
-            guest_physmap_remove_page(d, gpfn, mfn, 0);
+            guest_physmap_remove_page(d, gpfn, mfn, 0, (gpfn == gfn));
 
         /* Map at new location. */
         rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
diff -r 6203a0549d8a -r 4b684fa74636 xen/arch/x86/mm/mem_sharing.c
--- a/xen/arch/x86/mm/mem_sharing.c
+++ b/xen/arch/x86/mm/mem_sharing.c
@@ -561,7 +561,7 @@ int mem_sharing_share_pages(shr_handle_t
         list_del(&gfn->list);
         d = get_domain_by_id(gfn->domain);
         BUG_ON(!d);
-        BUG_ON(set_shared_p2m_entry(d, gfn->gfn, se->mfn) == 0);
+        BUG_ON(set_shared_p2m_entry(d, gfn->gfn, se->mfn, 0) == 0);
         put_domain(d);
         list_add(&gfn->list, &se->gfns);
         put_page_and_type(cpage);
@@ -670,14 +670,9 @@ gfn_found:
     unmap_domain_page(s);
     unmap_domain_page(t);
 
-    /* NOTE: set_shared_p2m_entry will switch the underlying mfn. If
-     * we do get_page withing get_gfn, the correct sequence here
-     * should be
-       get_page(page);
-       put_page(old_page);
-     * so that the ref to the old page is dropped, and a ref to
-     * the new page is obtained to later be dropped in put_gfn */
-    BUG_ON(set_shared_p2m_entry(d, gfn, page_to_mfn(page)) == 0);
+    /* NOTE: set_shared_p2m_entry will swap the underlying mfn and the refs. 
+     * It is safe to call put_gfn as usual after this. */
+    BUG_ON(set_shared_p2m_entry(d, gfn, page_to_mfn(page), HOLDING_GFN) == 0);
     put_page_and_type(old_page);
 
 private_page_found:    
diff -r 6203a0549d8a -r 4b684fa74636 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -182,6 +182,13 @@ mfn_t gfn_to_mfn_type_p2m(struct p2m_dom
     }
 #endif
 
+    /* Do a get page to get one additional ref on the mfn */
+    if ( mfn_valid(mfn) )
+    {
+        struct page_info *pg = mfn_to_page(mfn);
+        BUG_ON( !page_get_owner_and_reference(pg) );
+    }
+
     return mfn;
 }
 
@@ -195,6 +202,21 @@ void put_gfn(struct domain *d, unsigned 
 
     ASSERT(p2m_locked_by_me(p2m));
 
+    {
+        p2m_access_t a;
+        p2m_type_t t;
+        mfn_t mfn = p2m->get_entry(p2m, gfn, &t, &a, 
+                                    p2m_query, NULL);
+
+        if ( mfn_valid(mfn) )
+        {
+#ifdef __x86_64__
+            if (likely( !(p2m_is_broken(t)) ))
+#endif
+                put_page(mfn_to_page(mfn));
+        }
+    }    
+
     p2m_unlock(p2m);
 }
 
@@ -416,6 +438,28 @@ void p2m_final_teardown(struct domain *d
     p2m_teardown_nestedp2m(d);
 }
 
+/* If the caller has done get_gfn on this entry, then it has a ref on the
+ * old mfn. Swap the refs so put_gfn puts the appropriate ref */
+static inline void __p2m_swap_entry_refs(struct p2m_domain *p2m, 
+                                         unsigned long gfn, mfn_t mfn)
+{
+    p2m_type_t t;
+    p2m_access_t a;
+    mfn_t omfn;
+
+    if ( !paging_mode_translate(p2m->domain) )
+        return;
+
+    ASSERT(gfn_locked_by_me(p2m, gfn));
+
+    omfn = p2m->get_entry(p2m, gfn, &t, &a, p2m_query, NULL);
+
+    if ( mfn_valid(mfn) )
+        BUG_ON( !page_get_owner_and_reference(mfn_to_page(mfn)) );
+
+    if ( mfn_valid(omfn) )
+        put_page(mfn_to_page(omfn));
+}
 
 static void
 p2m_remove_page(struct p2m_domain *p2m, unsigned long gfn, unsigned long mfn,
@@ -451,11 +495,14 @@ p2m_remove_page(struct p2m_domain *p2m, 
 
 void
 guest_physmap_remove_page(struct domain *d, unsigned long gfn,
-                          unsigned long mfn, unsigned int page_order)
+                          unsigned long mfn, unsigned int page_order,
+                          int holding_gfn)
 {
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
     p2m_lock(p2m);
     audit_p2m(p2m, 1);
+    if (holding_gfn)
+        __p2m_swap_entry_refs(p2m, gfn, _mfn(INVALID_MFN));
     p2m_remove_page(p2m, gfn, mfn, page_order);
     audit_p2m(p2m, 1);
     p2m_unlock(p2m);
@@ -713,7 +760,8 @@ out:
 }
 
 int
-set_shared_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn)
+set_shared_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn, 
+                        int holding_gfn)
 {
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
     int rc = 0;
@@ -730,6 +778,10 @@ set_shared_p2m_entry(struct domain *d, u
      * sharable first */
     ASSERT(p2m_is_shared(ot));
     ASSERT(mfn_valid(omfn));
+
+    if ( holding_gfn )
+        __p2m_swap_entry_refs(p2m, gfn, mfn);
+
     /* XXX: M2P translations have to be handled properly for shared pages */
     set_gpfn_from_mfn(mfn_x(omfn), INVALID_M2P_ENTRY);
 
diff -r 6203a0549d8a -r 4b684fa74636 xen/common/grant_table.c
--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
@@ -1497,7 +1497,7 @@ gnttab_transfer(
             goto copyback;
         }
 
-        if ( steal_page(d, page, 0) < 0 )
+        if ( steal_page(d, page, 0, HOLDING_GFN) < 0 )
         {
             put_gfn(d, gop.mfn);
             gop.status = GNTST_bad_page;
@@ -1505,7 +1505,7 @@ gnttab_transfer(
         }
 
 #ifndef __ia64__ /* IA64 implicitly replaces the old page in steal_page(). */
-        guest_physmap_remove_page(d, gop.mfn, mfn, 0);
+        guest_physmap_remove_page(d, gop.mfn, mfn, 0, HOLDING_GFN);
 #endif
         flush_tlb_mask(d->domain_dirty_cpumask);
 
diff -r 6203a0549d8a -r 4b684fa74636 xen/common/memory.c
--- a/xen/common/memory.c
+++ b/xen/common/memory.c
@@ -165,7 +165,7 @@ int guest_remove_page(struct domain *d, 
     mfn = mfn_x(get_gfn(d, gmfn, &p2mt)); 
     if ( unlikely(p2m_is_paging(p2mt)) )
     {
-        guest_physmap_remove_page(d, gmfn, mfn, 0);
+        guest_physmap_remove_page(d, gmfn, mfn, 0, HOLDING_GFN);
         p2m_mem_paging_drop_page(d, gmfn);
         put_gfn(d, gmfn);
         return 1;
@@ -188,7 +188,7 @@ int guest_remove_page(struct domain *d, 
     if(p2m_is_shared(p2mt))
     {
         put_page_and_type(page);
-        guest_physmap_remove_page(d, gmfn, mfn, 0);
+        guest_physmap_remove_page(d, gmfn, mfn, 0, HOLDING_GFN);
         put_gfn(d, gmfn);
         return 1;
     }
@@ -207,7 +207,7 @@ int guest_remove_page(struct domain *d, 
     if ( test_and_clear_bit(_PGC_allocated, &page->count_info) )
         put_page(page);
 
-    guest_physmap_remove_page(d, gmfn, mfn, 0);
+    guest_physmap_remove_page(d, gmfn, mfn, 0, HOLDING_GFN);
     put_gfn(d, gmfn);
 
     put_page(page);
@@ -387,7 +387,7 @@ static long memory_exchange(XEN_GUEST_HA
 
                 page = mfn_to_page(mfn);
 
-                if ( unlikely(steal_page(d, page, MEMF_no_refcount)) )
+                if ( unlikely(steal_page(d, page, MEMF_no_refcount, HOLDING_GFN)) )
                 {
                     put_gfn(d, gmfn + k);
                     rc = -EINVAL;
@@ -427,7 +427,7 @@ static long memory_exchange(XEN_GUEST_HA
             gfn = mfn_to_gmfn(d, mfn);
             /* Pages were unshared above */
             BUG_ON(SHARED_M2P(gfn));
-            guest_physmap_remove_page(d, gfn, mfn, 0);
+            guest_physmap_remove_page(d, gfn, mfn, 0, 0);
             put_page(page);
         }
 
diff -r 6203a0549d8a -r 4b684fa74636 xen/include/asm-x86/mm.h
--- a/xen/include/asm-x86/mm.h
+++ b/xen/include/asm-x86/mm.h
@@ -578,7 +578,8 @@ int compat_arch_memory_op(int op, XEN_GU
 int compat_subarch_memory_op(int op, XEN_GUEST_HANDLE(void));
 
 int steal_page(
-    struct domain *d, struct page_info *page, unsigned int memflags);
+    struct domain *d, struct page_info *page, unsigned int memflags,
+    int holding_gfn);
 int donate_page(
     struct domain *d, struct page_info *page, unsigned int memflags);
 int page_make_sharable(struct domain *d, 
diff -r 6203a0549d8a -r 4b684fa74636 xen/include/asm-x86/p2m.h
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -353,6 +353,10 @@ static inline unsigned long get_gfn_unty
 /* Will release the p2m_lock and put the page behind this mapping. */
 void put_gfn(struct domain *d, unsigned long gfn);
 
+/* Operations that change the underlying mfn in a p2m entry need to be 
+ * told whether the caller is holding the current gfn */
+#define HOLDING_GFN 1
+
 /* The intent is to have the caller not worry about put_gfn. They apply to 
  * very specific situations: debug printk's, dumps during a domain crash,
  * or to peek at a p2m entry/type. Caller is not holding the p2m entry 
@@ -410,7 +414,8 @@ static inline int guest_physmap_add_page
 /* Remove a page from a domain's p2m table */
 void guest_physmap_remove_page(struct domain *d,
                                unsigned long gfn,
-                               unsigned long mfn, unsigned int page_order);
+                               unsigned long mfn, unsigned int page_order,
+                               int holding_gfn);
 
 /* Set a p2m range as populate-on-demand */
 int guest_physmap_mark_populate_on_demand(struct domain *d, unsigned long gfn,
@@ -471,7 +476,8 @@ p2m_pod_offline_or_broken_replace(struct
 
 #ifdef __x86_64__
 /* Modify p2m table for shared gfn */
-int set_shared_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn);
+int set_shared_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn,
+                            int holding_gfn);
 
 /* Check if a nominated gfn is valid to be paged out */
 int p2m_mem_paging_nominate(struct domain *d, unsigned long gfn);
diff -r 6203a0549d8a -r 4b684fa74636 xen/include/xen/paging.h
--- a/xen/include/xen/paging.h
+++ b/xen/include/xen/paging.h
@@ -21,7 +21,7 @@
 #define paging_mode_translate(d)              (0)
 #define paging_mode_external(d)               (0)
 #define guest_physmap_add_page(d, p, m, o)    (0)
-#define guest_physmap_remove_page(d, p, m, o) ((void)0)
+#define guest_physmap_remove_page(d, p, m, o, h)    ((void)0)
 
 #endif
 
diff -r 6203a0549d8a -r 4b684fa74636 xen/include/xen/tmem_xen.h
--- a/xen/include/xen/tmem_xen.h
+++ b/xen/include/xen/tmem_xen.h
@@ -198,7 +198,7 @@ static inline void _tmh_free_page_thispo
     struct domain *d = page_get_owner(pi);
 
     ASSERT(IS_VALID_PAGE(pi));
-    if ( (d == NULL) || steal_page(d,pi,0) == 0 )
+    if ( (d == NULL) || steal_page(d,pi,0,0) == 0 )
         tmh_page_list_put(pi);
     else
     {

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 14:07:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 14:07:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNtoz-0002Oy-Op; Tue, 08 Nov 2011 14:07:09 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNtmT-0002AH-Pz
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 14:04:41 -0800
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320789838!52319175!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26802 invoked from network); 8 Nov 2011 22:03:59 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-5.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 22:03:59 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RNtmI-0003KW-Fv; Tue, 08 Nov 2011 22:04:22 +0000
Date: Tue, 8 Nov 2011 22:04:22 +0000
From: Tim Deegan <tim@xen.org>
To: David Markey <admin@dmarkey.com>
Subject: Re: [Xen-devel] RE: produce windows compatible dump file from Dom0
Message-ID: <20111108220422.GA12734@ocelot.phlegethon.org>
References: <AEC6C66638C05B468B556EA548C1A77D01C558B2@trantor>
	<291EDFCB1E9E224A99088639C47620228D3EDCA57D@LONPMAILBOX01.citrite.net>
	<AEC6C66638C05B468B556EA548C1A77D01C558C1@trantor>
	<BANLkTin1MKmJXTe53SJBHxvw+TYgrEpdpw@mail.gmail.com>
	<AEC6C66638C05B468B556EA548C1A77D01D573FD@trantor>
	<20110526125239.GA7838@dumpdata.com>
	<CANXrN=0E70=AWfyhzUk6N3Rw=oVNqzcmUweCRforKpa3GQG4oQ@mail.gmail.com>
	<20111108154034.GA12849@phenom.dumpdata.com>
	<291EDFCB1E9E224A99088639C4762022B4543AB142@LONPMAILBOX01.citrite.net>
	<CANXrN=1Lno3WKxaQ=7QkV5W_ieRdSCPXsUoL4to+_7AL6GHYWA@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CANXrN=1Lno3WKxaQ=7QkV5W_ieRdSCPXsUoL4to+_7AL6GHYWA@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
Cc: Paul Durrant <Paul.Durrant@citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	James Harper <james.harper@bendigoit.com.au>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 16:28 +0000 on 08 Nov (1320769712), David Markey wrote:
> Kdd is for live debugging,(I thought)

It could be converted to run against a save file -- internally the
windowsy bits are kept separate from the state-access bits so it should
"just" be a matter of writing a new backend that can unfold save files
to get at memory and CPU state. 

For a quicker, uglier fix, you could restore (a copy of) the state file
into a paused VM. :)

kdd needs a bit of care and attention, actually; its internal list of
magic constants will need updating for recent windowses, and it hasn't
been tested against very recent debugger versions.  Sadly, I doubt I'll
have time to spend installing/prodding various windows flavours any time
soon. :(

Tim.

> I'm looking to specifically convert a VM save image(i,e, after suspend)
> into a WinDBG compatible image.
> 
> It looked like the utility Konrad spoke of could have achieved this.
> 
> David
> 
> 
> 
> On 8 November 2011 16:20, Paul Durrant <Paul.Durrant@citrix.com> wrote:
> 
> > Can't this now be done using kdd?
> >
> >  Paul
> >
> > > -----Original Message-----
> > > From: Konrad Rzeszutek Wilk [mailto:konrad.wilk@oracle.com]
> > > Sent: 08 November 2011 15:41
> > > To: David Markey
> > > Cc: James Harper; Paul Durrant; xen-devel@lists.xensource.com
> > > Subject: Re: [Xen-devel] RE: produce windows compatible dump file
> > > from Dom0
> > >
> > > On Tue, Nov 08, 2011 at 03:15:10PM +0000, David Markey wrote:
> > > > Hi Konrad,
> > > >
> > > > Sorry for resurrecting,
> > >
> > > Oh no trouble.
> > > >
> > > > Did "the guy" manage to get clearance to release the source for
> > > this
> > > > particular project?
> > >
> > > Uh, I think we lost track of this. Let me poke "the guy".
> > >
> > > >
> > > >
> > > > Thanks!
> > > >
> > > > David
> > > >
> > > >
> > > > On 26 May 2011 13:52, Konrad Rzeszutek Wilk
> > > <konrad.wilk@oracle.com> wrote:
> > > >
> > > > > On Wed, May 25, 2011 at 10:16:06PM +1000, James Harper wrote:
> > > > > > >
> > > > > > > Hi all,
> > > > > > >
> > > > > > > Did anyone make any progress on this?
> > > > > > >
> > > > > > > I'm interested in getting a Windows memory dump out of a
> > > > > > > XenServer
> > > > > > suspend
> > > > > > > image.
> > > > > > >
> > > > > > > Is it even remotely possible?
> > > > > > >
> > > > > >
> > > > > > Yes. In order for it to work I believe the DomU needs to call
> > > > > > KeInitializeCrashDumpHeader to place a crash dump header
> > > inside
> > > > > > the memory image (eg in NonPagedPool).
> > > KeInitializeCrashDumpHeader
> > > > > > is available in 2003sp1 and newer. You can then find that info
> > > in
> > > > > > the saved image and use it to build a windows compatible crash
> > > > > > dump. There is more to it than that obviously and I haven't
> > > > > > actually done it myself. Ideally it would be possible to do
> > > 'xl
> > > > > > wincrashdump -o memory.dmp domu_name' and have it all happen.
> > > > > >
> > > > > > I've BCC'd the guy who wrote a program to do it to see if he
> > > can
> > > > > > share it (hope he doesn't mind :)
> > > > >
> > > > > I am not "the guy", and while "the guy" is working on getting a
> > > > > blanket OK to release the source (or executable), let me give
> > > you
> > > > > some of the technical details in case you feel inspired to write
> > > this yourself.
> > > > >
> > > > > The process in making a dumpconverter involves finding the
> > > windows
> > > > > dump header in memory and putting it at the beginning of the
> > > output
> > > > > file, then taking the raw domain dump and writing it as is
> > > except
> > > > > that the following two ranges need to be skipped - which can
> > > vary
> > > > > from system to system:
> > > > >   1) the ELF header (by default the first 6 pages of the raw
> > > dump)
> > > > >   2) a range which might be BIOS, which by default in the tool
> > > is set to
> > > > >      pages 0x9F to 0xDF.
> > > > >
> > > > > Good luck!
> > > > >
> >

> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 14:09:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 14:09:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNtqw-0002nQ-99; Tue, 08 Nov 2011 14:09:10 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNtni-0002Bi-EL
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 14:05:53 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1320789947!2383465!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2163 invoked from network); 8 Nov 2011 22:05:47 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-5.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 22:05:47 -0000
Received: by wwf4 with SMTP id 4so1231931wwf.24
	for <xen-devel@lists.xensource.com>;
	Tue, 08 Nov 2011 14:05:47 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=user-agent:date:subject:from:to:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=1nT32tXylBcOUvv79kqTLSYIH9Qi/WQe7QsFfgfa5wc=;
	b=WxZXGfOP8xJiz3Y/JYXV+MKnbcLZk6k364GdjVV/nIzFIJbAiY8PkaVC+GsIMfAW/I
	wUlqHtIDctPGcfW7ZKmSbt2/vqdDeOYHxpS6O4ifwby+Yw5F26IpSYB5/WRjxsWlhIS4
	Bao3kg7ANlr+Fa0tbD0tIe1dqIEP2kYSAftk4=
Received: by 10.180.95.134 with SMTP id dk6mr14174348wib.59.1320789946987;
	Tue, 08 Nov 2011 14:05:46 -0800 (PST)
Received: from [192.168.1.71]
	(host86-129-249-120.range86-129.btcentralplus.com. [86.129.249.120])
	by mx.google.com with ESMTPS id v6sm1746381wix.1.2011.11.08.14.05.45
	(version=SSLv3 cipher=OTHER); Tue, 08 Nov 2011 14:05:46 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Tue, 08 Nov 2011 22:05:41 +0000
Subject: Re: [Xen-devel] Need help with fixing the Xen waitqueue feature
From: Keir Fraser <keir.xen@gmail.com>
To: Olaf Hering <olaf@aepfle.de>,
	<xen-devel@lists.xensource.com>
Message-ID: <CADF5835.245E1%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] Need help with fixing the Xen waitqueue feature
Thread-Index: AcyeYo3OrP4N8Ihww06cxS9uKo6mbg==
In-Reply-To: <20111108212024.GA5276@aepfle.de>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 08/11/2011 21:20, "Olaf Hering" <olaf@aepfle.de> wrote:

> Another thing is that sometimes the host suddenly reboots without any
> message. I think the reason for this is that a vcpu whose stack was put
> aside and that was later resumed may find itself on another physical
> cpu. And if that happens, wouldnt that invalidate some of the local
> variables back in the callchain? If some of them point to the old
> physical cpu, how could this be fixed? Perhaps a few "volatiles" are
> needed in some places.

>From how many call sites can we end up on a wait queue? I know we were going
to end up with a small and explicit number (e.g., in __hvm_copy()) but does
this patch make it a more generally-used mechanism? There will unavoidably
be many constraints on callers who want to be able to yield the cpu. We can
add Linux-style get_cpu/put_cpu abstractions to catch some of them. Actually
I don't think it's *that* common that hypercall contexts cache things like
per-cpu pointers. But every caller will need auditing, I expect.

A sudden reboot is very extreme. No message even on a serial line? That most
commonly indicates bad page tables. Most other bugs you'd at least get a
double fault message.

 -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 14:15:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 14:15:47 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNtxK-0003FT-Vp; Tue, 08 Nov 2011 14:15:47 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNtwo-00033j-GB
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 14:15:14 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320790475!62415258!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22792 invoked from network); 8 Nov 2011 22:14:35 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 22:14:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,479,1315180800"; 
   d="scan'208";a="8827873"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Nov 2011 22:15:10 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 8 Nov 2011 22:15:10 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RNtwk-00055W-87;
	Tue, 08 Nov 2011 22:15:10 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RNtwk-0007hH-7b;
	Tue, 08 Nov 2011 22:15:10 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9732-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 8 Nov 2011 22:15:10 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9732: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9732 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9732/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 build-amd64-oldkern           2 host-install(2)              broken
 build-amd64-pvops             2 host-install(2)              broken
 build-amd64                   2 host-install(2)              broken

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pv            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pair          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  fb1b32c9d03d
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Jean Guyader <jean.guyader@eu.citrix.com>
  Juergen Gross <juergen.gross@ts.fujitsu.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  Tim Deegan <tim@xen.org>
  Wei Wang <wei.wang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  broken  
 build-i386                                                   pass    
 build-amd64-oldkern                                          broken  
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           blocked 
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 blocked 
 test-amd64-i386-xl-credit2                                   blocked 
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               blocked 
 test-amd64-i386-xl-multivcpu                                 blocked 
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         blocked 
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           blocked 
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   blocked 
 test-amd64-i386-xl-win-vcpus1                                blocked 
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          blocked 
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

(No revision log; it would be 557 lines long.)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 14:21:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 14:21:08 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNu2W-0003hx-CS; Tue, 08 Nov 2011 14:21:08 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNu21-0003Vb-Ho
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 14:20:37 -0800
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-9.tower-174.messagelabs.com!1320790834!793499!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1051 invoked from network); 8 Nov 2011 22:20:34 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-9.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 8 Nov 2011 22:20:34 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320790833; l=1951;
	s=domk; d=aepfle.de;
	h=In-Reply-To:Content-Type:MIME-Version:References:Subject:Cc:To:From:
	Date:X-RZG-CLASS-ID:X-RZG-AUTH;
	bh=ECa2OemGz1TamOHFP2bHOKSX8Wo=;
	b=T7e49dCr2c4nW/hyv3YGbHR4UclBc8PUQ7ZjXZodatuQ7XEyy+zFwYxFKKWOCQL/KhZ
	fsN5zzNaHEH9gHV25l9f74Um4NwDe9/fTyGhzcpUVffnhHTQZ1XIElmaZ2w1UHfOSroDc
	lziKMbluSY6ZIpVKtF8LLnfAvGzwJO5uf3M=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV67U=
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-1.vodafone-net.de [80.226.24.1])
	by smtp.strato.de (jimi mo43) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id Q0238dnA8M52mF ;
	Tue, 8 Nov 2011 23:20:15 +0100 (MET)
Received: by probook.site (Postfix, from userid 1000)
	id 95E8D18638; Tue,  8 Nov 2011 23:20:11 +0100 (CET)
Date: Tue, 8 Nov 2011 23:20:11 +0100
From: Olaf Hering <olaf@aepfle.de>
To: Keir Fraser <keir.xen@gmail.com>
Subject: Re: [Xen-devel] Need help with fixing the Xen waitqueue feature
Message-ID: <20111108222011.GA23969@aepfle.de>
References: <20111108212024.GA5276@aepfle.de>
	<CADF5835.245E1%keir.xen@gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <CADF5835.245E1%keir.xen@gmail.com>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 08, Keir Fraser wrote:

> On 08/11/2011 21:20, "Olaf Hering" <olaf@aepfle.de> wrote:
> 
> > Another thing is that sometimes the host suddenly reboots without any
> > message. I think the reason for this is that a vcpu whose stack was put
> > aside and that was later resumed may find itself on another physical
> > cpu. And if that happens, wouldnt that invalidate some of the local
> > variables back in the callchain? If some of them point to the old
> > physical cpu, how could this be fixed? Perhaps a few "volatiles" are
> > needed in some places.
> 
> From how many call sites can we end up on a wait queue? I know we were going
> to end up with a small and explicit number (e.g., in __hvm_copy()) but does
> this patch make it a more generally-used mechanism? There will unavoidably
> be many constraints on callers who want to be able to yield the cpu. We can
> add Linux-style get_cpu/put_cpu abstractions to catch some of them. Actually
> I don't think it's *that* common that hypercall contexts cache things like
> per-cpu pointers. But every caller will need auditing, I expect.

I havent started to audit the callers. In my testing
mem_event_put_request() is called from p2m_mem_paging_drop_page() and
p2m_mem_paging_populate(). The latter is called from more places.

My plan is to put the sleep into ept_get_entry(), but I'm not there yet.
First I want to test waitqueues in a rather simple code path like
mem_event_put_request().

> A sudden reboot is very extreme. No message even on a serial line? That most
> commonly indicates bad page tables. Most other bugs you'd at least get a
> double fault message.

There is no output on serial, I boot with this cmdline:
  vga=mode-normal console=com1 com1=57600 loglvl=all guest_loglvl=all
  sync_console conring_size=123456 maxcpus=8 dom0_vcpus_pin
  dom0_max_vcpus=2
My base changeset is 24003, the testhost is a Xeon X5670  @ 2.93GHz.

Olaf

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 14:42:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 14:42:08 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNuMq-0004OV-AE; Tue, 08 Nov 2011 14:42:08 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNuLn-0004BF-Er
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 14:41:04 -0800
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-6.tower-21.messagelabs.com!1320792058!3450545!1
X-Originating-IP: [198.162.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6859 invoked from network); 8 Nov 2011 22:40:59 -0000
Received: from unknown (HELO athos.nss.cs.ubc.ca) (198.162.52.240)
	by server-6.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 8 Nov 2011 22:40:59 -0000
Received: from athos.nss.cs.ubc.ca (localhost [127.0.0.1])
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Debian-9.1ubuntu1) with ESMTP id
	pA8Meot4022117; Tue, 8 Nov 2011 14:40:50 -0800
Received: (from root@localhost)
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Submit) id pA8Meox3022114;
	Tue, 8 Nov 2011 14:40:50 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1320791985@athos.nss.cs.ubc.ca>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Tue, 08 Nov 2011 14:39:45 -0800
From: rshriram@cs.ubc.ca
To: xen-devel@lists.xensource.com
Cc: brendan@cs.ubc.ca, ian.jackson@eu.citrix.com, ian.campbell@citrix.com
Subject: [Xen-devel] [PATCH 0 of 3 V6] libxc: checkpoint compression
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This patch series adds checkpoint compression functionality, while
running under Remus.

Changes since last version:
1. Introduced a generic api page_aligned_alloc() for allocating page aligned buffers.
   Also provided platform specific implementations using memalign/valloc/posix_memalign
   in xc_{minios, linux, netbsd, solaris}.c
2. use the above generic api for allocating cache/page buffers in xc_compression.c.
   Also modified xc_{minios,linux,netbsd,solaris}.c : {os}_privcmd_alloc_hypercall_buffer
   to use page_aligned_alloc instead of allocating memory via memalign calls. 

Shriram



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 14:43:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 14:43:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNuO1-0004m9-3y; Tue, 08 Nov 2011 14:43:21 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNuLn-0004BE-8R
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 14:41:04 -0800
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-8.tower-216.messagelabs.com!1320792058!2785930!1
X-Originating-IP: [198.162.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11712 invoked from network); 8 Nov 2011 22:40:59 -0000
Received: from unknown (HELO athos.nss.cs.ubc.ca) (198.162.52.240)
	by server-8.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 8 Nov 2011 22:40:59 -0000
Received: from athos.nss.cs.ubc.ca (localhost [127.0.0.1])
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Debian-9.1ubuntu1) with ESMTP id
	pA8Mepq5022124; Tue, 8 Nov 2011 14:40:51 -0800
Received: (from root@localhost)
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Submit) id pA8Mepi3022121;
	Tue, 8 Nov 2011 14:40:51 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 58a24a7d4b87540692363b081dd72f62a6d380dd
Message-Id: <58a24a7d4b8754069236.1320791986@athos.nss.cs.ubc.ca>
In-Reply-To: <patchbomb.1320791985@athos.nss.cs.ubc.ca>
References: <patchbomb.1320791985@athos.nss.cs.ubc.ca>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Tue, 08 Nov 2011 14:39:46 -0800
From: rshriram@cs.ubc.ca
To: xen-devel@lists.xensource.com
Cc: brendan@cs.ubc.ca, ian.jackson@eu.citrix.com, ian.campbell@citrix.com
Subject: [Xen-devel] [PATCH 1 of 3 V6] tools/libxc: introduce
	page_aligned_alloc in xc_{minios, linux, solaris, netbsd}.c
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Shriram Rajagopalan <rshriram@cs.ubc.ca>
# Date 1320791162 28800
# Node ID 58a24a7d4b87540692363b081dd72f62a6d380dd
# Parent  54a5e994a241a506900ee0e197bb42e5f1d8e759
tools/libxc: introduce page_aligned_alloc in xc_{minios,linux,solaris,netbsd}.c

Move (page aligned) buffer allocations in {os}_privcmd_alloc_hypercall_buffer
into a global function page_aligned_alloc. This API is also used by Remus
compression code to allocate compression caches that need to be page aligned.

Signed-off-by: Shriram Rajagopalan <rshriram@cs.ubc.ca>

diff -r 54a5e994a241 -r 58a24a7d4b87 tools/libxc/xc_linux.c
--- a/tools/libxc/xc_linux.c	Wed Nov 02 17:09:09 2011 +0000
+++ b/tools/libxc/xc_linux.c	Tue Nov 08 14:26:02 2011 -0800
@@ -55,6 +55,18 @@
     errno = saved_errno;
 }
 
+void *page_aligned_alloc(xc_interface *xch, size_t size)
+{
+    int ret;
+    void *ptr;
+
+    ret = posix_memalign(&ptr, XC_PAGE_SIZE, size);
+    if (ret != 0 || !ptr)
+        return NULL;
+
+    return ptr;
+}
+
 /*
  * Local variables:
  * mode: C
diff -r 54a5e994a241 -r 58a24a7d4b87 tools/libxc/xc_linux_osdep.c
--- a/tools/libxc/xc_linux_osdep.c	Wed Nov 02 17:09:09 2011 +0000
+++ b/tools/libxc/xc_linux_osdep.c	Tue Nov 08 14:26:02 2011 -0800
@@ -36,9 +36,17 @@
 #include <xen/sys/gntdev.h>
 #include <xen/sys/gntalloc.h>
 
+#include "xc_private.h"
 #include "xenctrl.h"
 #include "xenctrlosdep.h"
 
+/* We need xc_private.h for page_aligned_alloc().
+ * xc_private.h already defines ERROR and PERROR.
+ * So we undef it and redefine it here.
+ */
+#undef ERROR
+#undef PERROR
+
 #define ERROR(_m, _a...)  xc_osdep_log(xch,XTL_ERROR,XC_INTERNAL_ERROR,_m , ## _a )
 #define PERROR(_m, _a...) xc_osdep_log(xch,XTL_ERROR,XC_INTERNAL_ERROR,_m \
                   " (%d = %s)", ## _a , errno, xc_strerror(xch, errno))
@@ -91,10 +99,9 @@
 {
     size_t size = npages * XC_PAGE_SIZE;
     void *p;
-    int ret;
 
-    ret = posix_memalign(&p, XC_PAGE_SIZE, size);
-    if (ret != 0 || !p)
+    p = page_aligned_alloc(xch, size);
+    if (!p)
         return NULL;
 
     if ( mlock(p, size) < 0 )
diff -r 54a5e994a241 -r 58a24a7d4b87 tools/libxc/xc_minios.c
--- a/tools/libxc/xc_minios.c	Wed Nov 02 17:09:09 2011 +0000
+++ b/tools/libxc/xc_minios.c	Tue Nov 08 14:26:02 2011 -0800
@@ -73,7 +73,7 @@
 
 static void *minios_privcmd_alloc_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, int npages)
 {
-    return memalign(PAGE_SIZE, npages * PAGE_SIZE);
+    return page_aligned_alloc(xch, npages * PAGE_SIZE);
 }
 
 static void minios_privcmd_free_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, void *ptr, int npages)
@@ -437,6 +437,11 @@
         fsync(fd);
 }
 
+void *page_aligned_alloc(xc_interface *xch, size_t size)
+{
+    return memalign(PAGE_SIZE, size);
+}
+
 static xc_osdep_handle minios_gnttab_open(xc_gnttab *xcg)
 {
     int fd = alloc_fd(FTYPE_GNTMAP);
diff -r 54a5e994a241 -r 58a24a7d4b87 tools/libxc/xc_netbsd.c
--- a/tools/libxc/xc_netbsd.c	Wed Nov 02 17:09:09 2011 +0000
+++ b/tools/libxc/xc_netbsd.c	Tue Nov 08 14:26:02 2011 -0800
@@ -71,8 +71,9 @@
 static void *netbsd_privcmd_alloc_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, int npages)
 {
     size_t size = npages * XC_PAGE_SIZE;
-    void *p = valloc(size);
+    void *p;
 
+    p = page_aligned_alloc(xch, size);
     if (!p)
         return NULL;
 
@@ -378,6 +379,11 @@
     errno = saved_errno;
 }
 
+void *page_aligned_alloc(xc_interface *xch, size_t size)
+{
+    return valloc(size);
+}
+
 static struct xc_osdep_ops *netbsd_osdep_init(xc_interface *xch, enum xc_osdep_type type)
 {
     switch ( type )
diff -r 54a5e994a241 -r 58a24a7d4b87 tools/libxc/xc_private.h
--- a/tools/libxc/xc_private.h	Wed Nov 02 17:09:09 2011 +0000
+++ b/tools/libxc/xc_private.h	Tue Nov 08 14:26:02 2011 -0800
@@ -302,6 +302,9 @@
 /* Optionally flush file to disk and discard page cache */
 void discard_file_cache(xc_interface *xch, int fd, int flush);
 
+/* Encapsulates memalign style calls for different OSes. */
+void *page_aligned_alloc(xc_interface *xch, size_t size);
+
 #define MAX_MMU_UPDATES 1024
 struct xc_mmu {
     mmu_update_t updates[MAX_MMU_UPDATES];
diff -r 54a5e994a241 -r 58a24a7d4b87 tools/libxc/xc_solaris.c
--- a/tools/libxc/xc_solaris.c	Wed Nov 02 17:09:09 2011 +0000
+++ b/tools/libxc/xc_solaris.c	Tue Nov 08 14:26:02 2011 -0800
@@ -70,7 +70,7 @@
 
 static void *solaris_privcmd_alloc_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, int npages)
 {
-    return memalign(XC_PAGE_SIZE, npages * XC_PAGE_SIZE);
+    return page_aligned_alloc(xch, npages * XC_PAGE_SIZE);
 }
 
 static void solaris_privcmd_free_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, void *ptr, int npages)
@@ -314,6 +314,11 @@
     // TODO: Implement for Solaris!
 }
 
+void *page_aligned_alloc(xc_interface *xch, size_t size)
+{
+    return memalign(XC_PAGE_SIZE, size);
+}
+
 static struct xc_osdep_ops *solaris_osdep_init(xc_interface *xch, enum xc_osdep_type type)
 {
     switch ( type )

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 14:44:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 14:44:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNuPV-0005Fi-V4; Tue, 08 Nov 2011 14:44:54 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNuLn-0004BG-Pk
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 14:41:05 -0800
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-2.tower-174.messagelabs.com!1320792058!785612!1
X-Originating-IP: [198.162.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20452 invoked from network); 8 Nov 2011 22:41:00 -0000
Received: from unknown (HELO athos.nss.cs.ubc.ca) (198.162.52.240)
	by server-2.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 8 Nov 2011 22:41:00 -0000
Received: from athos.nss.cs.ubc.ca (localhost [127.0.0.1])
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Debian-9.1ubuntu1) with ESMTP id
	pA8MepPx022131; Tue, 8 Nov 2011 14:40:51 -0800
Received: (from root@localhost)
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Submit) id pA8MepnO022128;
	Tue, 8 Nov 2011 14:40:51 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 326b1e6172f1f2557087a2b1b69978021fa9ac1f
Message-Id: <326b1e6172f1f2557087.1320791987@athos.nss.cs.ubc.ca>
In-Reply-To: <patchbomb.1320791985@athos.nss.cs.ubc.ca>
References: <patchbomb.1320791985@athos.nss.cs.ubc.ca>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Tue, 08 Nov 2011 14:39:47 -0800
From: rshriram@cs.ubc.ca
To: xen-devel@lists.xensource.com
Cc: brendan@cs.ubc.ca, ian.jackson@eu.citrix.com, ian.campbell@citrix.com
Subject: [Xen-devel] [PATCH 2 of 3 V6] tools/libxc: Remus Checkpoint
	Compression
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Shriram Rajagopalan <rshriram@cs.ubc.ca>
# Date 1320791182 28800
# Node ID 326b1e6172f1f2557087a2b1b69978021fa9ac1f
# Parent  58a24a7d4b87540692363b081dd72f62a6d380dd
tools/libxc: Remus Checkpoint Compression

Instead of sending dirty pages of guest memory as-is, use a simple compression
algorithm that sends a RLE-encoded XOR of the page against its last sent copy.
A small LRU cache is used to hold recently dirtied pages. Pagetable pages are
sent as-is, as they are canonicalized at sender side and uncanonicalized at
receiver.

Signed-off-by: Shriram Rajagopalan <rshriram@cs.ubc.ca>

diff -r 58a24a7d4b87 -r 326b1e6172f1 tools/libxc/Makefile
--- a/tools/libxc/Makefile	Tue Nov 08 14:26:02 2011 -0800
+++ b/tools/libxc/Makefile	Tue Nov 08 14:26:22 2011 -0800
@@ -42,7 +42,7 @@
 GUEST_SRCS-y :=
 GUEST_SRCS-y += xg_private.c xc_suspend.c
 GUEST_SRCS-$(CONFIG_MIGRATE) += xc_domain_restore.c xc_domain_save.c
-GUEST_SRCS-$(CONFIG_MIGRATE) += xc_offline_page.c
+GUEST_SRCS-$(CONFIG_MIGRATE) += xc_offline_page.c xc_compression.c
 GUEST_SRCS-$(CONFIG_HVM) += xc_hvm_build.c
 
 vpath %.c ../../xen/common/libelf
diff -r 58a24a7d4b87 -r 326b1e6172f1 tools/libxc/xc_compression.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxc/xc_compression.c	Tue Nov 08 14:26:22 2011 -0800
@@ -0,0 +1,552 @@
+/******************************************************************************
+ * xc_compression.c
+ *
+ * Checkpoint Compression using Page Delta Algorithm.
+ * - A LRU cache of recently dirtied guest pages is maintained.
+ * - For each dirty guest page in the checkpoint, if a previous version of the
+ * page exists in the cache, XOR both pages and send the non-zero sections
+ * to the receiver. The cache is then updated with the newer copy of guest page.
+ * - The receiver will XOR the non-zero sections against its copy of the guest
+ * page, thereby bringing the guest page up-to-date with the sender side.
+ *
+ * Copyright (c) 2011 Shriram Rajagopalan (rshriram@cs.ubc.ca).
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <inttypes.h>
+#include <errno.h>
+#include "xc_private.h"
+#include "xenctrl.h"
+#include "xg_save_restore.h"
+#include "xg_private.h"
+#include "xc_dom.h"
+
+/* Page Cache for Delta Compression*/
+#define DELTA_CACHE_SIZE (XC_PAGE_SIZE * 8192)
+
+/* Internal page buffer to hold dirty pages of a checkpoint,
+ * to be compressed after the domain is resumed for execution.
+ */
+#define PAGE_BUFFER_SIZE (XC_PAGE_SIZE * 8192)
+
+struct cache_page
+{
+    char *page;
+    xen_pfn_t pfn;
+    struct cache_page *next;
+    struct cache_page *prev;
+};
+
+struct compression_ctx
+{
+    /* compression buffer - holds compressed data */
+    char *compbuf;
+    unsigned long compbuf_size;
+    unsigned long compbuf_pos;
+
+    /* Page buffer to hold pages to be compressed */
+    char *inputbuf;
+    /* pfns of pages to be compressed */
+    xen_pfn_t *sendbuf_pfns;
+    unsigned int pfns_len;
+    unsigned int pfns_index;
+
+    /* Compression Cache (LRU) */
+    char *cache_base;
+    struct cache_page **pfn2cache;
+    struct cache_page *cache;
+    struct cache_page *page_list_head;
+    struct cache_page *page_list_tail;
+    unsigned long dom_pfnlist_size;
+};
+
+#define RUNFLAG 0
+#define SKIPFLAG ((char)128)
+#define FLAGMASK SKIPFLAG
+#define LENMASK ((char)127)
+
+/*
+ * see xg_save_restore.h for details on the compressed stream format.
+ * delta size = 4 bytes.
+ * run header = 1 byte (1 bit for runtype, 7bits for run length).
+ *  i.e maximum size of a run = 127 * 4 = 508 bytes.
+ * Worst case compression: Entire page has changed.
+ * In the worst case, the size of the compressed page is
+ *  8 runs of 508 bytes + 1 run of 32 bytes + 9 run headers 
+ *  = 4105 bytes.
+ * We could detect this worst case and send the entire page with a
+ * FULL_PAGE marker, reducing the total size to 4097 bytes. The cost
+ * of this size reduction is an additional memcpy, on top of two previous
+ * memcpy (to the compressed stream and the cache page in the for loop).
+ *
+ * We might as well sacrifice an extra 8 bytes instead of a memcpy.
+ */
+#define WORST_COMP_PAGE_SIZE (XC_PAGE_SIZE + 9)
+
+/*
+ * A zero length skip indicates full page.
+ */
+#define EMPTY_PAGE 0
+#define FULL_PAGE SKIPFLAG
+#define FULL_PAGE_SIZE (XC_PAGE_SIZE + 1)
+#define MAX_DELTAS (XC_PAGE_SIZE/sizeof(uint32_t))
+
+/*
+ * Add a pagetable page or a new page (uncached)
+ * if srcpage is a pagetable page, cache_page is null.
+ * if srcpage is a page that was not previously in the cache,
+ *  cache_page points to a free page slot in the cache where
+ *  this new page can be copied to.
+ */
+static int add_full_page(comp_ctx *ctx, char *srcpage, char *cache_page)
+{
+    char *dest = (ctx->compbuf + ctx->compbuf_pos);
+
+    if ( (ctx->compbuf_pos + FULL_PAGE_SIZE) > ctx->compbuf_size)
+        return -1;
+
+    if (cache_page)
+        memcpy(cache_page, srcpage, XC_PAGE_SIZE);
+    dest[0] = FULL_PAGE;
+    memcpy(&dest[1], srcpage, XC_PAGE_SIZE);
+    ctx->compbuf_pos += FULL_PAGE_SIZE;
+
+    return FULL_PAGE_SIZE;
+}
+
+static int compress_page(comp_ctx *ctx, char *srcpage, char *cache_page)
+{
+    char *dest = (ctx->compbuf + ctx->compbuf_pos);
+    uint32_t *new, *old;
+
+    int off, runptr = 0;
+    int wascopying = 0, copying = 0, bytes_skipped = 0;
+    int complen = 0, pageoff = 0, runbytes = 0;
+
+    char runlen = 0;
+
+    if ( (ctx->compbuf_pos + WORST_COMP_PAGE_SIZE) > ctx->compbuf_size)
+        return -1;
+
+    /*
+     * There are no alignment issues here since srcpage is
+     * domU's page passed from xc_domain_save and cache_page is
+     * a ptr to cache page (cache is page aligned).
+     */
+    new = (uint32_t*)srcpage;
+    old = (uint32_t*)cache_page;
+
+    for (off = 0; off <= MAX_DELTAS; off++)
+    {
+        /*
+         * At (off == MAX_DELTAS), we are processing the last run
+         * in the page. Since there is no XORing, make wascopying != copying
+         * to satisfy the if-block below.
+         */
+        copying = ((off < MAX_DELTAS) ? (old[off] != new[off]) : !wascopying);
+
+        if (runlen)
+        {
+            /* switching between run types or current run is full */
+            if ( (wascopying != copying) || (runlen == LENMASK) )
+            {
+                runbytes = runlen * sizeof(uint32_t);
+                runlen |= (wascopying ? RUNFLAG : SKIPFLAG);
+                dest[complen++] = runlen;
+
+                if (wascopying) /* RUNFLAG */
+                {
+                    pageoff = runptr * sizeof(uint32_t);
+                    memcpy(dest + complen, srcpage + pageoff, runbytes);
+                    memcpy(cache_page + pageoff, srcpage + pageoff, runbytes);
+                    complen += runbytes;
+                }
+                else /* SKIPFLAG */
+                {
+                    bytes_skipped += runbytes;
+                }
+
+                runlen = 0;
+                runptr = off;
+            }
+        }
+        runlen++;
+        wascopying = copying;
+    }
+
+    /*
+     * Check for empty page.
+     */
+    if (bytes_skipped == XC_PAGE_SIZE)
+    {
+        complen = 1;
+        dest[0] = EMPTY_PAGE;
+    }
+    ctx->compbuf_pos += complen;
+
+    return complen;
+}
+
+static
+char *get_cache_page(comp_ctx *ctx, xen_pfn_t pfn,
+                     int *israw)
+{
+    struct cache_page *item = NULL;
+
+    item = ctx->pfn2cache[pfn];
+
+    if (!item)
+    {
+        *israw = 1;
+
+        /* If the list is full, evict a page from the tail end. */
+        item = ctx->page_list_tail;
+        if (item->pfn != INVALID_P2M_ENTRY)
+            ctx->pfn2cache[item->pfn] = NULL;
+
+        item->pfn = pfn;
+        ctx->pfn2cache[pfn] = item;
+    }
+        
+    /* 	if requested item is in cache move to head of list */
+    if (item != ctx->page_list_head)
+    {
+        if (item == ctx->page_list_tail)
+        {
+            /* item at tail of list. */
+            ctx->page_list_tail = item->prev;
+            (ctx->page_list_tail)->next = NULL;
+        }
+        else
+        {
+            /* item in middle of list */
+            item->prev->next = item->next;
+            item->next->prev = item->prev;
+        }
+
+        item->prev = NULL;
+        item->next = ctx->page_list_head;
+        (ctx->page_list_head)->prev = item;
+        ctx->page_list_head = item;
+    }
+
+    return (ctx->page_list_head)->page;
+}
+
+/* Remove pagetable pages from cache and move to tail, as free pages */
+static
+void invalidate_cache_page(comp_ctx *ctx, xen_pfn_t pfn)
+{
+    struct cache_page *item = NULL;
+
+    item = ctx->pfn2cache[pfn];
+    if (item)
+    {
+        if (item != ctx->page_list_tail)
+        {
+            /* item at head of list */
+            if (item == ctx->page_list_head)
+            {
+                ctx->page_list_head = (ctx->page_list_head)->next;
+                (ctx->page_list_head)->prev = NULL;
+            }
+            else /* item in middle of list */
+            {            
+                item->prev->next = item->next;
+                item->next->prev = item->prev;
+            }
+
+            item->next = NULL;
+            item->prev = ctx->page_list_tail;
+            (ctx->page_list_tail)->next = item;
+            ctx->page_list_tail = item;
+        }
+        ctx->pfn2cache[pfn] = NULL;
+        (ctx->page_list_tail)->pfn = INVALID_P2M_ENTRY;
+    }
+}
+
+int xc_compression_add_page(xc_interface *xch, comp_ctx *ctx,
+                            char *page, xen_pfn_t pfn, int israw)
+{
+    if (pfn > ctx->dom_pfnlist_size)
+    {
+        ERROR("Invalid pfn passed into "
+              "xc_compression_add_page %" PRIpfn "\n", pfn);
+        return -2;
+    }
+
+    /* pagetable page */
+    if (israw)
+        invalidate_cache_page(ctx, pfn);
+    ctx->sendbuf_pfns[ctx->pfns_len] = israw ? INVALID_P2M_ENTRY : pfn;
+    memcpy(ctx->inputbuf + ctx->pfns_len * XC_PAGE_SIZE, page, XC_PAGE_SIZE);
+    ctx->pfns_len++;
+
+    /* check if we have run out of space. If so,
+     * we need to synchronously compress the pages and flush them out
+     */
+    if (ctx->pfns_len == NRPAGES(PAGE_BUFFER_SIZE))
+        return -1;
+    return 0;
+}
+
+int xc_compression_compress_pages(xc_interface *xch, comp_ctx *ctx,
+                                  char *compbuf, unsigned long compbuf_size,
+                                  unsigned long *compbuf_len)
+{
+    char *cache_copy = NULL, *current_page = NULL;
+    int israw, rc = 1;
+
+    if (!ctx->pfns_len || (ctx->pfns_index == ctx->pfns_len)) {
+        ctx->pfns_len = ctx->pfns_index = 0;
+        return 0;
+    }
+
+    ctx->compbuf_pos = 0;
+    ctx->compbuf = compbuf;
+    ctx->compbuf_size = compbuf_size;
+
+    for (; ctx->pfns_index < ctx->pfns_len; ctx->pfns_index++)
+    {
+        israw = 0;
+        cache_copy = NULL;
+        current_page = ctx->inputbuf + ctx->pfns_index * XC_PAGE_SIZE;
+
+        if (ctx->sendbuf_pfns[ctx->pfns_index] == INVALID_P2M_ENTRY)
+            israw = 1;
+        else
+            cache_copy = get_cache_page(ctx,
+                                        ctx->sendbuf_pfns[ctx->pfns_index],
+                                        &israw);
+
+        if (israw)
+            rc = (add_full_page(ctx, current_page, cache_copy) >= 0);
+        else
+            rc = (compress_page(ctx, current_page, cache_copy) >= 0);
+
+        if ( !rc )
+        {
+            /* Out of space in outbuf! flush and come back */
+            rc = -1;
+            break;
+        }
+    }
+    if (compbuf_len)
+        *compbuf_len = ctx->compbuf_pos;
+
+    return rc;
+}
+
+inline
+void xc_compression_reset_pagebuf(xc_interface *xch, comp_ctx *ctx)
+{
+    ctx->pfns_index = ctx->pfns_len = 0;
+}
+
+int xc_compression_uncompress_page(xc_interface *xch, char *compbuf,
+                                   unsigned long compbuf_size,
+                                   unsigned long *compbuf_pos, char *destpage)
+{
+    unsigned long pos;
+    unsigned int len = 0, pagepos = 0;
+    char flag;
+
+    pos = *compbuf_pos;
+    if (pos >= compbuf_size)
+    {
+        ERROR("Out of bounds exception in compression buffer (a):"
+              "read ptr:%lu, bufsize = %lu\n",
+              *compbuf_pos, compbuf_size);
+        return -1;
+    }
+
+    switch (compbuf[pos])
+    {
+    case EMPTY_PAGE:
+        pos++;
+        break;
+
+    case FULL_PAGE:
+        {
+            /* Check if the input buffer has 4KB of data */
+            if ((pos + FULL_PAGE_SIZE) > compbuf_size)
+            {
+                ERROR("Out of bounds exception in compression buffer (b):"
+                      "read ptr = %lu, bufsize = %lu\n",
+                      *compbuf_pos, compbuf_size);
+                return -1;
+            }
+            memcpy(destpage, &compbuf[pos + 1], XC_PAGE_SIZE);
+            pos += FULL_PAGE_SIZE;
+        }
+        break;
+
+    default: /* Normal page with one or more runs */
+        {
+            do
+            {
+                flag = compbuf[pos] & FLAGMASK;
+                len = (compbuf[pos] & LENMASK) * sizeof(uint32_t);
+                /* Sanity Check: Zero-length runs are allowed only for
+                 * FULL_PAGE and EMPTY_PAGE.
+                 */
+                if (!len)
+                {
+                    ERROR("Zero length run encountered for normal page: "
+                          "buffer (d):read ptr = %lu, flag = %u, "
+                          "bufsize = %lu, pagepos = %u\n",
+                          pos, (unsigned int)flag, compbuf_size, pagepos);
+                    return -1;
+                }
+
+                pos++;
+                if (flag == RUNFLAG)
+                {
+                    /* Check if the input buffer has len bytes of data
+                     * and whether it would fit in the destination page.
+                     */
+                    if (((pos + len) > compbuf_size)
+                        || ((pagepos + len) > XC_PAGE_SIZE))
+                    {
+                        ERROR("Out of bounds exception in compression "
+                              "buffer (c):read ptr = %lu, runlen = %u, "
+                              "bufsize = %lu, pagepos = %u\n",
+                              pos, len, compbuf_size, pagepos);
+                        return -1;
+                    }
+                    memcpy(&destpage[pagepos], &compbuf[pos], len);
+                    pos += len;
+                }
+                pagepos += len;
+            } while ((pagepos < XC_PAGE_SIZE) && (pos < compbuf_size));
+
+            /* Make sure we have copied/skipped 4KB worth of data */
+            if (pagepos != XC_PAGE_SIZE)
+            {
+                ERROR("Invalid data in compression buffer:"
+                      "read ptr = %lu, bufsize = %lu, pagepos = %u\n",
+                      pos, compbuf_size, pagepos);
+                return -1;
+            }
+        }
+    }
+    *compbuf_pos = pos;
+    return 0;
+}
+
+void xc_compression_free_context(xc_interface *xch, comp_ctx *ctx)
+{
+    if (!ctx) return;
+
+    if (ctx->inputbuf)
+        free(ctx->inputbuf);
+    if (ctx->sendbuf_pfns)
+        free(ctx->sendbuf_pfns);
+    if (ctx->cache_base)
+        free(ctx->cache_base);
+    if (ctx->pfn2cache)
+        free(ctx->pfn2cache);
+    if (ctx->cache)
+        free(ctx->cache);
+    free(ctx);
+}
+
+comp_ctx *xc_compression_create_context(xc_interface *xch,
+                                        unsigned long p2m_size)
+{
+    unsigned long i;
+    comp_ctx *ctx = NULL;
+    unsigned long num_cache_pages = DELTA_CACHE_SIZE/XC_PAGE_SIZE;
+
+    ctx = (comp_ctx *)malloc(sizeof(comp_ctx));
+    if (!ctx)
+    {
+        ERROR("Failed to allocate compression_ctx\n");
+        goto error;
+    }
+    memset(ctx, 0, sizeof(comp_ctx));
+
+    ctx->inputbuf = page_aligned_alloc(xch, PAGE_BUFFER_SIZE);
+    if (!ctx->inputbuf)
+    {
+        ERROR("Failed to allocate page buffer\n");
+        goto error;
+    }
+
+    ctx->cache_base = page_aligned_alloc(xch, DELTA_CACHE_SIZE);
+    if (!ctx->cache_base)
+    {
+        ERROR("Failed to allocate delta cache\n");
+        goto error;
+    }
+
+    ctx->sendbuf_pfns = malloc(NRPAGES(PAGE_BUFFER_SIZE) *
+                               sizeof(xen_pfn_t));
+    if (!ctx->sendbuf_pfns)
+    {
+        ERROR("Could not alloc sendbuf_pfns\n");
+        goto error;
+    }
+    memset(ctx->sendbuf_pfns, -1,
+           NRPAGES(PAGE_BUFFER_SIZE) * sizeof(xen_pfn_t));
+
+    ctx->pfn2cache = calloc(p2m_size, sizeof(struct cache_page *));
+    if (!ctx->pfn2cache)
+    {
+        ERROR("Could not alloc pfn2cache map\n");
+        goto error;
+    }
+
+    ctx->cache = malloc(num_cache_pages * sizeof(struct cache_page));
+    if (!ctx->cache)
+    {
+        ERROR("Could not alloc compression cache\n");
+        goto error;
+    }
+
+    for (i = 0; i < num_cache_pages; i++)
+    {
+        ctx->cache[i].pfn = INVALID_P2M_ENTRY;
+        ctx->cache[i].page = ctx->cache_base + i * XC_PAGE_SIZE;
+        ctx->cache[i].prev = (i == 0) ? NULL : &(ctx->cache[i - 1]);
+        ctx->cache[i].next = ((i+1) == num_cache_pages)? NULL :
+            &(ctx->cache[i + 1]);
+    }
+    ctx->page_list_head = &(ctx->cache[0]);
+    ctx->page_list_tail = &(ctx->cache[num_cache_pages -1]);
+    ctx->dom_pfnlist_size = p2m_size;
+
+    return ctx;
+error:
+    xc_compression_free_context(xch, ctx);
+    return NULL;
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r 58a24a7d4b87 -r 326b1e6172f1 tools/libxc/xc_domain_restore.c
--- a/tools/libxc/xc_domain_restore.c	Tue Nov 08 14:26:02 2011 -0800
+++ b/tools/libxc/xc_domain_restore.c	Tue Nov 08 14:26:22 2011 -0800
@@ -43,6 +43,7 @@
     xen_pfn_t *p2m_batch; /* A table of P2M mappings in the current region.  */
     int completed; /* Set when a consistent image is available */
     int last_checkpoint; /* Set when we should commit to the current checkpoint when it completes. */
+    int compressing; /* Set when sender signals that pages would be sent compressed (for Remus) */
     struct domain_info_context dinfo;
 };
 
@@ -663,6 +664,10 @@
     /* pages is of length nr_physpages, pfn_types is of length nr_pages */
     unsigned int nr_physpages, nr_pages;
 
+    /* checkpoint compression state */
+    int compressing;
+    unsigned long compbuf_pos, compbuf_size;
+
     /* Types of the pfns in the current region */
     unsigned long* pfn_types;
 
@@ -700,6 +705,7 @@
 {
     int count, countpages, oldcount, i;
     void* ptmp;
+    unsigned long compbuf_size;
 
     if ( RDEXACT(fd, &count, sizeof(count)) )
     {
@@ -809,6 +815,40 @@
         }
         return pagebuf_get_one(xch, ctx, buf, fd, dom);
 
+    case XC_SAVE_ID_ENABLE_COMPRESSION:
+        /* We cannot set compression flag directly in pagebuf structure,
+         * since this pagebuf still has uncompressed pages that are yet to
+         * be applied. We enable the compression field in pagebuf structure
+         * after receiving the first tailbuf.
+         */
+        ctx->compressing = 1;
+        // DPRINTF("compression flag received");
+        return pagebuf_get_one(xch, ctx, buf, fd, dom);
+
+    case XC_SAVE_ID_COMPRESSED_DATA:
+
+        /* read the length of compressed chunk coming in */
+        if ( RDEXACT(fd, &compbuf_size, sizeof(unsigned long)) )
+        {
+            PERROR("Error when reading compbuf_size");
+            return -1;
+        }
+        if (!compbuf_size) return 1;
+
+        buf->compbuf_size += compbuf_size;
+        if (!(ptmp = realloc(buf->pages, buf->compbuf_size))) {
+            ERROR("Could not (re)allocate compression buffer");
+            return -1;
+        }
+        buf->pages = ptmp;
+
+        if ( RDEXACT(fd, buf->pages + (buf->compbuf_size - compbuf_size),
+                     compbuf_size) ) {
+            PERROR("Error when reading compression buffer");
+            return -1;
+        }
+        return compbuf_size;
+
     default:
         if ( (count > MAX_BATCH_SIZE) || (count < 0) ) {
             ERROR("Max batch size exceeded (%d). Giving up.", count);
@@ -846,6 +886,13 @@
     if (!countpages)
         return count;
 
+    /* If Remus Checkpoint Compression is turned on, we will only be
+     * receiving the pfn lists now. The compressed pages will come in later,
+     * following a <XC_SAVE_ID_COMPRESSED_DATA, compressedChunkSize> tuple.
+     */
+    if (buf->compressing)
+        return pagebuf_get_one(xch, ctx, buf, fd, dom);
+
     oldcount = buf->nr_physpages;
     buf->nr_physpages += countpages;
     if (!buf->pages) {
@@ -874,6 +921,7 @@
     int rc;
 
     buf->nr_physpages = buf->nr_pages = 0;
+    buf->compbuf_pos = buf->compbuf_size = 0;
 
     do {
         rc = pagebuf_get_one(xch, ctx, buf, fd, dom);
@@ -1091,7 +1139,21 @@
         /* In verify mode, we use a copy; otherwise we work in place */
         page = pagebuf->verify ? (void *)buf : (region_base + i*PAGE_SIZE);
 
-        memcpy(page, pagebuf->pages + (curpage + curbatch) * PAGE_SIZE, PAGE_SIZE);
+        /* Remus - page decompression */
+        if (pagebuf->compressing)
+        {
+            if (xc_compression_uncompress_page(xch, pagebuf->pages,
+                                               pagebuf->compbuf_size,
+                                               &pagebuf->compbuf_pos,
+                                               (char *)page))
+            {
+                ERROR("Failed to uncompress page (pfn=%lx)\n", pfn);
+                goto err_mapped;
+            }
+        }
+        else
+            memcpy(page, pagebuf->pages + (curpage + curbatch) * PAGE_SIZE,
+                   PAGE_SIZE);
 
         pagetype &= XEN_DOMCTL_PFINFO_LTABTYPE_MASK;
 
@@ -1353,6 +1415,7 @@
 
         if ( !ctx->completed ) {
             pagebuf.nr_physpages = pagebuf.nr_pages = 0;
+            pagebuf.compbuf_pos = pagebuf.compbuf_size = 0;
             if ( pagebuf_get_one(xch, ctx, &pagebuf, io_fd, dom) < 0 ) {
                 PERROR("Error when reading batch");
                 goto out;
@@ -1395,6 +1458,7 @@
         }
 
         pagebuf.nr_physpages = pagebuf.nr_pages = 0;
+        pagebuf.compbuf_pos = pagebuf.compbuf_size = 0;
 
         n += j; /* crude stats */
 
@@ -1438,6 +1502,13 @@
          */
         if ( !ctx->last_checkpoint )
             fcntl(io_fd, F_SETFL, orig_io_fd_flags | O_NONBLOCK);
+
+        /*
+         * If sender had sent enable compression flag, switch to compressed
+         * checkpoints mode once the first checkpoint is received.
+         */
+        if (ctx->compressing)
+            pagebuf.compressing = 1;
     }
 
     if (pagebuf.acpi_ioport_location == 1) {
diff -r 58a24a7d4b87 -r 326b1e6172f1 tools/libxc/xc_domain_save.c
--- a/tools/libxc/xc_domain_save.c	Tue Nov 08 14:26:02 2011 -0800
+++ b/tools/libxc/xc_domain_save.c	Tue Nov 08 14:26:22 2011 -0800
@@ -218,6 +218,56 @@
         return noncached_write(xch, ob, fd, buf, len);
 }
 
+static int write_compressed(xc_interface *xch, comp_ctx *compress_ctx,
+                            int dobuf, struct outbuf* ob, int fd)
+{
+    int rc = 0;
+    int header = sizeof(int) + sizeof(unsigned long);
+    int marker = XC_SAVE_ID_COMPRESSED_DATA;
+    unsigned long compbuf_len = 0;
+
+    do
+    {
+        /* check for available space (atleast 8k) */
+        if ((ob->pos + header + XC_PAGE_SIZE * 2) > ob->size)
+        {
+            if (outbuf_flush(xch, ob, fd) < 0)
+            {
+                ERROR("Error when flushing outbuf intermediate");
+                return -1;
+            }
+        }
+
+        rc = xc_compression_compress_pages(xch, compress_ctx,
+                                           ob->buf + ob->pos + header,
+                                           ob->size - ob->pos - header,
+                                           &compbuf_len);
+        if (!rc)
+            return 0;
+
+        if (outbuf_hardwrite(xch, ob, fd, &marker, sizeof(marker)) < 0)
+        {
+            PERROR("Error when writing marker (errno %d)", errno);
+            return -1;
+        }
+
+        if (outbuf_hardwrite(xch, ob, fd, &compbuf_len, sizeof(compbuf_len)) < 0)
+        {
+            PERROR("Error when writing compbuf_len (errno %d)", errno);
+            return -1;
+        }
+
+        ob->pos += (size_t) compbuf_len;
+        if (!dobuf && outbuf_flush(xch, ob, fd) < 0)
+        {
+            ERROR("Error when writing compressed chunk");
+            return -1;
+        }
+    } while (rc != 0);
+
+    return 0;
+}
+
 struct time_stats {
     struct timeval wall;
     long long d0_cpu, d1_cpu;
@@ -815,11 +865,35 @@
 
     unsigned long mfn;
 
-    struct outbuf ob;
+    /* Without checkpoint compression, the dirty pages, pfn arrays
+     * and tailbuf (vcpu ctx, shared info page, etc.)  are written
+     * directly to outbuf. All of this is done while the domain is
+     * suspended.
+     *
+     * When checkpoint compression is enabled, the dirty pages are
+     * buffered, compressed "after" the domain is resumed and then
+     * written to outbuf. Since tailbuf data are collected while a
+     * domain is suspended, they cannot be directly written to the
+     * outbuf as there is no dirty page data preceeding tailbuf.
+     *
+     * So,two output buffers are maintained. Tailbuf data goes into
+     * ob_tailbuf. The dirty pages are compressed after resuming the
+     * domain and written to ob_pagebuf. ob_tailbuf is then appended
+     * to ob_pagebuf and finally flushed out.
+     */
+    struct outbuf ob_pagebuf, ob_tailbuf, *ob = NULL;
     struct save_ctx _ctx;
     struct save_ctx *ctx = &_ctx;
     struct domain_info_context *dinfo = &ctx->dinfo;
 
+    /* Compression context */
+    comp_ctx *compress_ctx= NULL;
+    /* Even if XCFLAGS_CHECKPOINT_COMPRESS is set, we enable compression only
+     * after sending XC_SAVE_ID_ENABLE_COMPRESSION and the tailbuf for
+     * first time.
+     */
+    int compressing = 0;
+
     int completed = 0;
 
     if ( hvm && !callbacks->switch_qemu_logdirty )
@@ -829,7 +903,7 @@
         return 1;
     }
 
-    outbuf_init(xch, &ob, OUTBUF_SIZE);
+    outbuf_init(xch, &ob_pagebuf, OUTBUF_SIZE);
 
     memset(ctx, 0, sizeof(*ctx));
 
@@ -917,6 +991,16 @@
         }
     }
 
+    if ( flags & XCFLAGS_CHECKPOINT_COMPRESS )
+    {
+        if (!(compress_ctx = xc_compression_create_context(xch, dinfo->p2m_size)))
+        {
+            ERROR("Failed to create compression context");
+            goto out;
+        }
+        outbuf_init(xch, &ob_tailbuf, OUTBUF_SIZE/4);
+    }
+
     last_iter = !live;
 
     /* pretend we sent all the pages last iteration */
@@ -1025,9 +1109,11 @@
     }
 
   copypages:
-#define wrexact(fd, buf, len) write_buffer(xch, last_iter, &ob, (fd), (buf), (len))
-#define wruncached(fd, live, buf, len) write_uncached(xch, last_iter, &ob, (fd), (buf), (len))
+#define wrexact(fd, buf, len) write_buffer(xch, last_iter, ob, (fd), (buf), (len))
+#define wruncached(fd, live, buf, len) write_uncached(xch, last_iter, ob, (fd), (buf), (len))
+#define wrcompressed(fd) write_compressed(xch, compress_ctx, last_iter, ob, (fd))
 
+    ob = &ob_pagebuf; /* Holds pfn_types, pages/compressed pages */
     /* Now write out each data page, canonicalising page tables as we go... */
     for ( ; ; )
     {
@@ -1270,7 +1356,7 @@
                 {
                     /* If the page is not a normal data page, write out any
                        run of pages we may have previously acumulated */
-                    if ( run )
+                    if ( !compressing && run )
                     {
                         if ( wruncached(io_fd, live,
                                        (char*)region_base+(PAGE_SIZE*(j-run)), 
@@ -1305,7 +1391,41 @@
                         goto out;
                     }
 
-                    if ( wruncached(io_fd, live, page, PAGE_SIZE) != PAGE_SIZE )
+                    if (compressing)
+                    {
+                        int c_err;
+                        /* Mark pagetable page to be sent uncompressed */
+                        c_err = xc_compression_add_page(xch, compress_ctx, page,
+                                                        pfn, 1 /* raw page */);
+                        if (c_err == -2) /* OOB PFN */
+                        {
+                            ERROR("Could not add pagetable page "
+                                  "(pfn:%" PRIpfn "to page buffer\n", pfn);
+                            goto out;
+                        }
+
+                        if (c_err == -1)
+                        {
+                            /*
+                             * We are out of buffer space to hold dirty
+                             * pages. Compress and flush the current buffer
+                             * to make space. This is a corner case, that
+                             * slows down checkpointing as the compression
+                             * happens while domain is suspended. Happens
+                             * seldom and if you find this occuring
+                             * frequently, increase the PAGE_BUFFER_SIZE
+                             * in xc_compression.c.
+                             */
+                            if (wrcompressed(io_fd) < 0)
+                            {
+                                ERROR("Error when writing compressed"
+                                      " data (4b)\n");
+                                goto out;
+                            }
+                        }
+                    }
+                    else if ( wruncached(io_fd, live, page,
+                                         PAGE_SIZE) != PAGE_SIZE )
                     {
                         PERROR("Error when writing to state file (4b)"
                               " (errno %d)", errno);
@@ -1315,7 +1435,34 @@
                 else
                 {
                     /* We have a normal page: accumulate it for writing. */
-                    run++;
+                    if (compressing)
+                    {
+                        int c_err;
+                        /* For checkpoint compression, accumulate the page in the
+                         * page buffer, to be compressed later.
+                         */
+                        c_err = xc_compression_add_page(xch, compress_ctx, spage,
+                                                        pfn, 0 /* not raw page */);
+
+                        if (c_err == -2) /* OOB PFN */
+                        {
+                            ERROR("Could not add page "
+                                  "(pfn:%" PRIpfn "to page buffer\n", pfn);
+                            goto out;
+                        }
+
+                        if (c_err == -1)
+                        {
+                            if (wrcompressed(io_fd) < 0)
+                            {
+                                ERROR("Error when writing compressed"
+                                      " data (4c)\n");
+                                goto out;
+                            }
+                        }
+                    }
+                    else
+                        run++;
                 }
             } /* end of the write out for this batch */
 
@@ -1423,6 +1570,15 @@
 
     DPRINTF("All memory is saved\n");
 
+    /* After last_iter, buffer the rest of pagebuf & tailbuf data into a
+     * separate output buffer and flush it after the compressed page chunks.
+     */
+    if (compressing)
+    {
+        ob = &ob_tailbuf;
+        ob->pos = 0;
+    }
+
     {
         struct {
             int id;
@@ -1522,6 +1678,25 @@
         }
     }
 
+    /* Enable compression logic on both sides by sending this
+     * one time marker.
+     * NOTE: We could have simplified this procedure by sending
+     * the enable/disable compression flag before the beginning of
+     * the main for loop. But this would break compatibility for
+     * live migration code, with older versions of xen. So we have
+     * to enable it after the last_iter, when the XC_SAVE_ID_*
+     * elements are sent.
+     */
+    if (!compressing && (flags & XCFLAGS_CHECKPOINT_COMPRESS))
+    {
+        i = XC_SAVE_ID_ENABLE_COMPRESSION;
+        if ( wrexact(io_fd, &i, sizeof(int)) )
+        {
+            PERROR("Error when writing enable_compression marker");
+            goto out;
+        }
+    }
+
     /* Zero terminate */
     i = 0;
     if ( wrexact(io_fd, &i, sizeof(int)) )
@@ -1766,14 +1941,38 @@
     if ( !rc && callbacks->postcopy )
         callbacks->postcopy(callbacks->data);
 
+    /* guest has been resumed. Now we can compress data
+     * at our own pace.
+     */
+    if (!rc && compressing)
+    {
+        ob = &ob_pagebuf;
+        if (wrcompressed(io_fd) < 0)
+        {
+            ERROR("Error when writing compressed data, after postcopy\n");
+            rc = 1;
+            goto out;
+        }
+        /* Append the tailbuf data to the main outbuf */
+        if ( wrexact(io_fd, ob_tailbuf.buf, ob_tailbuf.pos) )
+        {
+            rc = 1;
+            PERROR("Error when copying tailbuf into outbuf");
+            goto out;
+        }
+    }
+
     /* Flush last write and discard cache for file. */
-    if ( outbuf_flush(xch, &ob, io_fd) < 0 ) {
+    if ( outbuf_flush(xch, ob, io_fd) < 0 ) {
         PERROR("Error when flushing output buffer");
         rc = 1;
     }
 
     discard_file_cache(xch, io_fd, 1 /* flush */);
 
+    /* Enable compression now, finally */
+    compressing = (flags & XCFLAGS_CHECKPOINT_COMPRESS);
+
     /* checkpoint_cb can spend arbitrarily long in between rounds */
     if (!rc && callbacks->checkpoint &&
         callbacks->checkpoint(callbacks->data) > 0)
@@ -1815,6 +2014,9 @@
             DPRINTF("Warning - couldn't disable qemu log-dirty mode");
     }
 
+    if (compress_ctx)
+        xc_compression_free_context(xch, compress_ctx);
+
     if ( live_shinfo )
         munmap(live_shinfo, PAGE_SIZE);
 
diff -r 58a24a7d4b87 -r 326b1e6172f1 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h	Tue Nov 08 14:26:02 2011 -0800
+++ b/tools/libxc/xenctrl.h	Tue Nov 08 14:26:22 2011 -0800
@@ -1908,4 +1908,64 @@
                         int verbose);
 /* Useful for callers who also use libelf. */
 
+/**
+ * Checkpoint Compression
+ */
+typedef struct compression_ctx comp_ctx;
+comp_ctx *xc_compression_create_context(xc_interface *xch,
+					unsigned long p2m_size);
+void xc_compression_free_context(xc_interface *xch, comp_ctx *ctx);
+
+/**
+ * Add a page to compression page buffer, to be compressed later.
+ *
+ * returns 0 if the page was successfully added to the page buffer
+ *
+ * returns -1 if there is no space in buffer. In this case, the
+ *  application should call xc_compression_compress_pages to compress
+ *  the buffer (or atleast part of it), thereby freeing some space in
+ *  the page buffer.
+ *
+ * returns -2 if the pfn is out of bounds, where the bound is p2m_size
+ *  parameter passed during xc_compression_create_context.
+ */
+int xc_compression_add_page(xc_interface *xch, comp_ctx *ctx, char *page,
+			    unsigned long pfn, int israw);
+
+/**
+ * Delta compress pages in the compression buffer and inserts the
+ * compressed data into the supplied compression buffer compbuf, whose
+ * size is compbuf_size.
+ * After compression, the pages are copied to the internal LRU cache.
+ *
+ * This function compresses as many pages as possible into the
+ * supplied compression buffer. It maintains an internal iterator to
+ * keep track of pages in the input buffer that are yet to be compressed.
+ *
+ * returns -1 if the compression buffer has run out of space.  
+ * returns 1 on success.
+ * returns 0 if no more pages are left to be compressed.
+ *  When the return value is non-zero, compbuf_len indicates the actual
+ *  amount of data present in compbuf (<=compbuf_size).
+ */
+int xc_compression_compress_pages(xc_interface *xch, comp_ctx *ctx,
+				  char *compbuf, unsigned long compbuf_size,
+				  unsigned long *compbuf_len);
+
+/**
+ * Resets the internal page buffer that holds dirty pages before compression.
+ * Also resets the iterators.
+ */
+void xc_compression_reset_pagebuf(xc_interface *xch, comp_ctx *ctx);
+
+/**
+ * Caller must supply the compression buffer (compbuf),
+ * its size (compbuf_size) and a reference to index variable (compbuf_pos)
+ * that is used internally. Each call pulls out one page from the compressed
+ * chunk and copies it to dest.
+ */
+int xc_compression_uncompress_page(xc_interface *xch, char *compbuf,
+				   unsigned long compbuf_size,
+				   unsigned long *compbuf_pos, char *dest);
+
 #endif /* XENCTRL_H */
diff -r 58a24a7d4b87 -r 326b1e6172f1 tools/libxc/xenguest.h
--- a/tools/libxc/xenguest.h	Tue Nov 08 14:26:02 2011 -0800
+++ b/tools/libxc/xenguest.h	Tue Nov 08 14:26:22 2011 -0800
@@ -27,6 +27,7 @@
 #define XCFLAGS_DEBUG     2
 #define XCFLAGS_HVM       4
 #define XCFLAGS_STDVGA    8
+#define XCFLAGS_CHECKPOINT_COMPRESS    16
 #define X86_64_B_SIZE   64 
 #define X86_32_B_SIZE   32
 
diff -r 58a24a7d4b87 -r 326b1e6172f1 tools/libxc/xg_save_restore.h
--- a/tools/libxc/xg_save_restore.h	Tue Nov 08 14:26:02 2011 -0800
+++ b/tools/libxc/xg_save_restore.h	Tue Nov 08 14:26:22 2011 -0800
@@ -67,7 +67,7 @@
  *
  *   consists of p2m_size bytes comprising an array of xen_pfn_t sized entries.
  *
- * BODY PHASE
+ * BODY PHASE - Format A (for live migration or Remus without compression)
  * ----------
  *
  * A series of chunks with a common header:
@@ -87,6 +87,122 @@
  *
  * If chunk type is 0 then body phase is complete.
  *
+ *
+ * BODY PHASE - Format B (for Remus with compression)
+ * ----------
+ *
+ * A series of chunks with a common header:
+ *   int              : chunk type
+ *
+ * If the chunk type is +ve then chunk contains array of PFNs corresponding
+ * to guest memory and type contains the number of PFNs in the batch:
+ *
+ *     unsigned long[]  : PFN array, length == number of pages in batch
+ *                        Each entry consists of XEN_DOMCTL_PFINFO_*
+ *                        in bits 31-28 and the PFN number in bits 27-0.
+ *
+ * If the chunk type is -ve then chunk consists of one of a number of
+ * metadata types.  See definitions of XC_SAVE_ID_* below.
+ *
+ * If the chunk type is -ve and equals XC_SAVE_ID_COMPRESSED_DATA, then the
+ * chunk consists of compressed page data, in the following format:
+ *
+ *     unsigned long        : Size of the compressed chunk to follow
+ *     compressed data :      variable length data of size indicated above.
+ *                            This chunk consists of compressed page data.
+ *                            The number of pages in one chunk depends on
+ *                            the amount of space available in the sender's
+ *                            output buffer.
+ *
+ * Format of compressed data:
+ *   compressed_data = <deltas>*
+ *   delta           = <marker, run*>
+ *   marker          = (RUNFLAG|SKIPFLAG) bitwise-or RUNLEN [1 byte marker]
+ *   RUNFLAG         = 0
+ *   SKIPFLAG        = 1 << 7
+ *   RUNLEN          = 7-bit unsigned value indicating number of WORDS in the run
+ *   run             = string of bytes of length sizeof(WORD) * RUNLEN
+ *
+ *    If marker contains RUNFLAG, then RUNLEN * sizeof(WORD) bytes of data following
+ *   the marker is copied into the target page at the appropriate offset indicated by
+ *   the offset_ptr
+ *    If marker contains SKIPFLAG, then the offset_ptr is advanced
+ *   by RUNLEN * sizeof(WORD).
+ *
+ * If chunk type is 0 then body phase is complete.
+ *
+ * There can be one or more chunks with type XC_SAVE_ID_COMPRESSED_DATA,
+ * containing compressed pages. The compressed chunks are collated to form
+ * one single compressed chunk for the entire iteration. The number of pages
+ * present in this final compressed chunk will be equal to the total number
+ * of valid PFNs specified by the +ve chunks.
+ *
+ * At the sender side, compressed pages are inserted into the output stream
+ * in the same order as they would have been if compression logic was absent.
+ *
+ * Until last iteration, the BODY is sent in Format A, to maintain live
+ * migration compatibility with receivers of older Xen versions.
+ * At the last iteration, if Remus compression was enabled, the sender sends
+ * a trigger, XC_SAVE_ID_ENABLE_COMPRESSION to tell the receiver to parse the
+ * BODY in Format B from the next iteration onwards.
+ *
+ * An example sequence of chunks received in Format B:
+ *     +16                              +ve chunk
+ *     unsigned long[16]                PFN array
+ *     +100                             +ve chunk
+ *     unsigned long[100]               PFN array
+ *     +50                              +ve chunk
+ *     unsigned long[50]                PFN array
+ *
+ *     XC_SAVE_ID_COMPRESSED_DATA       TAG
+ *       N                              Length of compressed data
+ *       N bytes of DATA                Decompresses to 166 pages
+ *
+ *     XC_SAVE_ID_*                     other xc save chunks
+ *     0                                END BODY TAG
+ *
+ * Corner case with checkpoint compression:
+ *     At sender side, after pausing the domain, dirty pages are usually
+ *   copied out to a temporary buffer. After the domain is resumed,
+ *   compression is done and the compressed chunk(s) are sent, followed by
+ *   other XC_SAVE_ID_* chunks.
+ *     If the temporary buffer gets full while scanning for dirty pages,
+ *   the sender stops buffering of dirty pages, compresses the temporary
+ *   buffer and sends the compressed data with XC_SAVE_ID_COMPRESSED_DATA.
+ *   The sender then resumes the buffering of dirty pages and continues
+ *   scanning for the dirty pages.
+ *     For e.g., assume that the temporary buffer can hold 4096 pages and
+ *   there are 5000 dirty pages. The following is the sequence of chunks
+ *   that the receiver will see:
+ *
+ *     +1024                       +ve chunk
+ *     unsigned long[1024]         PFN array
+ *     +1024                       +ve chunk
+ *     unsigned long[1024]         PFN array
+ *     +1024                       +ve chunk
+ *     unsigned long[1024]         PFN array
+ *     +1024                       +ve chunk
+ *     unsigned long[1024]         PFN array
+ *
+ *     XC_SAVE_ID_COMPRESSED_DATA  TAG
+ *      N                          Length of compressed data
+ *      N bytes of DATA            Decompresses to 4096 pages
+ *
+ *     +4                          +ve chunk
+ *     unsigned long[4]            PFN array
+ *
+ *     XC_SAVE_ID_COMPRESSED_DATA  TAG
+ *      M                          Length of compressed data
+ *      M bytes of DATA            Decompresses to 4 pages
+ *
+ *     XC_SAVE_ID_*                other xc save chunks
+ *     0                           END BODY TAG
+ *
+ *     In other words, XC_SAVE_ID_COMPRESSED_DATA can be interleaved with
+ *   +ve chunks arbitrarily. But at the receiver end, the following condition
+ *   always holds true until the end of BODY PHASE:
+ *    num(PFN entries +ve chunks) >= num(pages received in compressed form)
+ *
  * TAIL PHASE
  * ----------
  *
@@ -134,6 +250,8 @@
 #define XC_SAVE_ID_HVM_CONSOLE_PFN    -8 /* (HVM-only) */
 #define XC_SAVE_ID_LAST_CHECKPOINT    -9 /* Commit to restoring after completion of current iteration. */
 #define XC_SAVE_ID_HVM_ACPI_IOPORTS_LOCATION -10
+#define XC_SAVE_ID_COMPRESSED_DATA    -11 /* Marker to indicate arrival of compressed data */
+#define XC_SAVE_ID_ENABLE_COMPRESSION -12 /* Marker to enable compression logic at receiver side */
 
 /*
 ** We process save/restore/migrate in batches of pages; the below

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 14:57:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 14:57:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNubZ-0005yM-Gt; Tue, 08 Nov 2011 14:57:21 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNuae-0005kC-6P
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 14:56:24 -0800
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-16.tower-182.messagelabs.com!1320792979!2370151!1
X-Originating-IP: [198.162.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23507 invoked from network); 8 Nov 2011 22:56:20 -0000
Received: from unknown (HELO athos.nss.cs.ubc.ca) (198.162.52.240)
	by server-16.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 22:56:20 -0000
Received: from athos.nss.cs.ubc.ca (localhost [127.0.0.1])
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Debian-9.1ubuntu1) with ESMTP id
	pA8MepHO022138; Tue, 8 Nov 2011 14:40:51 -0800
Received: (from root@localhost)
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Submit) id pA8MepPc022135;
	Tue, 8 Nov 2011 14:40:51 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 9a33be85736845a984dca151ff9abfcb99e8e1d2
Message-Id: <9a33be85736845a984dc.1320791988@athos.nss.cs.ubc.ca>
In-Reply-To: <patchbomb.1320791985@athos.nss.cs.ubc.ca>
References: <patchbomb.1320791985@athos.nss.cs.ubc.ca>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Tue, 08 Nov 2011 14:39:48 -0800
From: rshriram@cs.ubc.ca
To: xen-devel@lists.xensource.com
Cc: brendan@cs.ubc.ca, ian.jackson@eu.citrix.com, ian.campbell@citrix.com
Subject: [Xen-devel] [PATCH 3 of 3 V6] remus: command line switch to
	enable/disable checkpoint compression
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Shriram Rajagopalan <rshriram@cs.ubc.ca>
# Date 1320791205 28800
# Node ID 9a33be85736845a984dca151ff9abfcb99e8e1d2
# Parent  326b1e6172f1f2557087a2b1b69978021fa9ac1f
remus: command line switch to enable/disable checkpoint compression

Add a command line switch to remus script that allows the user to
enable or disable checkpoint compression in the libxc code.

Signed-off-by: Shriram Rajagopalan <rshriram@cs.ubc.ca>

diff -r 326b1e6172f1 -r 9a33be857368 tools/python/xen/lowlevel/checkpoint/checkpoint.c
--- a/tools/python/xen/lowlevel/checkpoint/checkpoint.c	Tue Nov 08 14:26:22 2011 -0800
+++ b/tools/python/xen/lowlevel/checkpoint/checkpoint.c	Tue Nov 08 14:26:45 2011 -0800
@@ -104,13 +104,14 @@
   PyObject* postcopy_cb = NULL;
   PyObject* checkpoint_cb = NULL;
   unsigned int interval = 0;
+  unsigned int flags = 0;
 
   int fd;
   struct save_callbacks callbacks;
   int rc;
 
-  if (!PyArg_ParseTuple(args, "O|OOOI", &iofile, &suspend_cb, &postcopy_cb,
-                       &checkpoint_cb, &interval))
+  if (!PyArg_ParseTuple(args, "O|OOOII", &iofile, &suspend_cb, &postcopy_cb,
+			&checkpoint_cb, &interval, &flags))
     return NULL;
 
   self->interval = interval;
@@ -160,7 +161,7 @@
   callbacks.data = self;
 
   self->threadstate = PyEval_SaveThread();
-  rc = checkpoint_start(&self->cps, fd, &callbacks);
+  rc = checkpoint_start(&self->cps, fd, &callbacks, flags);
   PyEval_RestoreThread(self->threadstate);
 
   if (rc < 0) {
diff -r 326b1e6172f1 -r 9a33be857368 tools/python/xen/lowlevel/checkpoint/checkpoint.h
--- a/tools/python/xen/lowlevel/checkpoint/checkpoint.h	Tue Nov 08 14:26:22 2011 -0800
+++ b/tools/python/xen/lowlevel/checkpoint/checkpoint.h	Tue Nov 08 14:26:45 2011 -0800
@@ -40,13 +40,15 @@
     timer_t timer;
 } checkpoint_state;
 
+#define CHECKPOINT_FLAGS_COMPRESSION 1
 char* checkpoint_error(checkpoint_state* s);
 
 void checkpoint_init(checkpoint_state* s);
 int checkpoint_open(checkpoint_state* s, unsigned int domid);
 void checkpoint_close(checkpoint_state* s);
 int checkpoint_start(checkpoint_state* s, int fd,
-                    struct save_callbacks* callbacks);
+		     struct save_callbacks* callbacks,
+		     unsigned int remus_flags);
 int checkpoint_suspend(checkpoint_state* s);
 int checkpoint_resume(checkpoint_state* s);
 int checkpoint_postflush(checkpoint_state* s);
diff -r 326b1e6172f1 -r 9a33be857368 tools/python/xen/lowlevel/checkpoint/libcheckpoint.c
--- a/tools/python/xen/lowlevel/checkpoint/libcheckpoint.c	Tue Nov 08 14:26:22 2011 -0800
+++ b/tools/python/xen/lowlevel/checkpoint/libcheckpoint.c	Tue Nov 08 14:26:45 2011 -0800
@@ -170,7 +170,8 @@
 }
 
 int checkpoint_start(checkpoint_state* s, int fd,
-                    struct save_callbacks* callbacks)
+		     struct save_callbacks* callbacks,
+		     unsigned int remus_flags)
 {
     int hvm, rc;
     int flags = XCFLAGS_LIVE;
@@ -188,6 +189,8 @@
        if (switch_qemu_logdirty(s, 1))
            return -1;
     }
+    if (remus_flags & CHECKPOINT_FLAGS_COMPRESSION)
+      flags |= XCFLAGS_CHECKPOINT_COMPRESS;
 
     callbacks->switch_qemu_logdirty = noop_switch_logdirty;
 
diff -r 326b1e6172f1 -r 9a33be857368 tools/python/xen/remus/save.py
--- a/tools/python/xen/remus/save.py	Tue Nov 08 14:26:22 2011 -0800
+++ b/tools/python/xen/remus/save.py	Tue Nov 08 14:26:45 2011 -0800
@@ -133,7 +133,7 @@
 
 class Saver(object):
     def __init__(self, domid, fd, suspendcb=None, resumecb=None,
-                 checkpointcb=None, interval=0):
+                 checkpointcb=None, interval=0, flags=0):
         """Create a Saver object for taking guest checkpoints.
         domid:        name, number or UUID of a running domain
         fd:           a stream to which checkpoint data will be written.
@@ -141,12 +141,14 @@
         resumecb:     callback invoked before guest resumes
         checkpointcb: callback invoked when a checkpoint is complete. Return
                       True to take another checkpoint, or False to stop.
+        flags:        Remus flags to be passed to xc_domain_save
         """
         self.fd = fd
         self.suspendcb = suspendcb
         self.resumecb = resumecb
         self.checkpointcb = checkpointcb
         self.interval = interval
+        self.flags = flags
 
         self.vm = vm.VM(domid)
 
@@ -164,7 +166,8 @@
             try:
                 self.checkpointer.open(self.vm.domid)
                 self.checkpointer.start(self.fd, self.suspendcb, self.resumecb,
-                                        self.checkpointcb, self.interval)
+                                        self.checkpointcb, self.interval,
+                                        self.flags)
             except xen.lowlevel.checkpoint.error, e:
                 raise CheckpointError(e)
         finally:
diff -r 326b1e6172f1 -r 9a33be857368 tools/remus/remus
--- a/tools/remus/remus	Tue Nov 08 14:26:22 2011 -0800
+++ b/tools/remus/remus	Tue Nov 08 14:26:45 2011 -0800
@@ -16,6 +16,9 @@
 class CfgException(Exception): pass
 
 class Cfg(object):
+
+    REMUS_FLAGS_COMPRESSION = 1
+
     def __init__(self):
         # must be set
         self.domid = 0
@@ -25,6 +28,7 @@
         self.port = XendOptions.instance().get_xend_relocation_port()
         self.interval = 200
         self.netbuffer = True
+        self.flags = self.REMUS_FLAGS_COMPRESSION
         self.timer = False
 
         parser = optparse.OptionParser()
@@ -38,6 +42,8 @@
                           help='replicate to /dev/null (no disk checkpoints, only memory & net buffering)')
         parser.add_option('', '--no-net', dest='nonet', action='store_true',
                           help='run without net buffering (benchmark option)')
+        parser.add_option('', '--no-compression', dest='nocompress', action='store_true',
+                          help='run without checkpoint compression')
         parser.add_option('', '--timer', dest='timer', action='store_true',
                           help='force pause at checkpoint interval (experimental)')
         self.parser = parser
@@ -56,6 +62,8 @@
             self.nullremus = True
         if opts.nonet:
             self.netbuffer = False
+        if opts.nocompress:
+            self.flags &= ~self.REMUS_FLAGS_COMPRESSION
         if opts.timer:
             self.timer = True
 
@@ -190,7 +198,7 @@
     rc = 0
 
     checkpointer = save.Saver(cfg.domid, fd, postsuspend, preresume, commit,
-                              interval)
+                              interval, cfg.flags)
 
     try:
         checkpointer.start()

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 15:05:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 15:05:16 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNujB-0006Tb-0O; Tue, 08 Nov 2011 15:05:14 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNugC-0006Dp-Tp
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 15:02:23 -0800
X-Env-Sender: akpm@linux-foundation.org
X-Msg-Ref: server-10.tower-21.messagelabs.com!1320793317!3420354!1
X-Originating-IP: [140.211.169.12]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18459 invoked from network); 8 Nov 2011 23:01:57 -0000
Received: from mail.linuxfoundation.org (HELO mail.linuxfoundation.org)
	(140.211.169.12) by server-10.tower-21.messagelabs.com with SMTP;
	8 Nov 2011 23:01:57 -0000
Received: from akpm.mtv.corp.google.com (216-239-45-4.google.com
	[216.239.45.4])
	by mail.linuxfoundation.org (Postfix) with ESMTPSA id E809D38E;
	Tue,  8 Nov 2011 23:00:51 +0000 (UTC)
Date: Tue, 8 Nov 2011 15:01:53 -0800
From: Andrew Morton <akpm@linux-foundation.org>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Re: [Revert] Re: [PATCH] mm: sync vmalloc address
	space page tables in alloc_vm_area()
Message-Id: <20111108150153.e3229374.akpm@linux-foundation.org>
In-Reply-To: <20111107203613.GA6546@phenom.dumpdata.com>
References: <1314877863-21977-1-git-send-email-david.vrabel@citrix.com>
	<20110901161134.GA8979@dumpdata.com> <4E5FED1A.1000300@goop.org>
	<20110901141754.76cef93b.akpm@linux-foundation.org>
	<4E60C067.4010600@citrix.com>
	<20110902153204.59a928c1.akpm@linux-foundation.org>
	<20110906163553.GA28971@dumpdata.com>
	<20111105133846.GA4415@phenom.dumpdata.com>
	<20111107203613.GA6546@phenom.dumpdata.com>
X-Mailer: Sylpheed 3.0.2 (GTK+ 2.20.1; x86_64-pc-linux-gnu)
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"namhyung@gmail.com" <namhyung@gmail.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>,
	David Vrabel <david.vrabel@citrix.com>,
	"rientjes@google.com" <rientjes@google.com>,
	"paulmck@linux.vnet.ibm.com" <paulmck@linux.vnet.ibm.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, 7 Nov 2011 15:36:13 -0500
Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:

> > > > 
> > > > oookay, I queued this for 3.1 and tagged it for a 3.0.x backport.  I
> > > > *think* that's the outcome of this discussion, for the short-term?
> > > 
> > > <nods> Yup. Thanks!
> > 
> > Hey Andrew,
> > 
> > The long term outcome is the patchset that David worked on. I've sent
> > a GIT PULL to Linus to pick up the Xen related patches that switch over
> > the users of the right API:
> > 
> >  (xen) stable/vmalloc-3.2 for Linux 3.2-rc0
> > 
> > (https://lkml.org/lkml/2011/10/29/82)
> 
> And Linus picked it up.

I've no idea what's going on here.

> .. snip..
> > 
> > Also, not sure what you thought of this patch below?
> 
> Patch included as attachment for easier review..

The patch "xen: map foreign pages for shared rings by updating the PTEs
directly" (whcih looks harnless enough) is not present in 3.2-rc1 or linux-next.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 15:07:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 15:07:46 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNule-0006sB-EC; Tue, 08 Nov 2011 15:07:46 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNugC-0006Dr-Tl
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 15:02:23 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1320793295!43156198!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27289 invoked from network); 8 Nov 2011 23:01:35 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Nov 2011 23:01:35 -0000
Received: by wyh11 with SMTP id 11so1300689wyh.30
	for <xen-devel@lists.xensource.com>;
	Tue, 08 Nov 2011 15:02:05 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=+V9RilHIzVbWMBuWyWJLy9OEaIH+cIGTzhpbzOqaVk4=;
	b=eg8lUuRguh+p9b8RJFaiiTUjUGzfpr8NpkqTAq0r2vMwqVNqpBSS1zY4BdjLZusoVp
	ksETxP76lP3AEKrQjVAAi6la9ppVXeNoOvCOYDuOK40CqqF2xfWIzUhKWHAGtuSCva7y
	Y7cNvigIBq1rTsqBDxK8Qh7CrmQvHtGkcP4D8=
Received: by 10.216.135.37 with SMTP id t37mr2032554wei.44.1320792894999;
	Tue, 08 Nov 2011 14:54:54 -0800 (PST)
Received: from [192.168.1.71]
	(host86-129-249-120.range86-129.btcentralplus.com. [86.129.249.120])
	by mx.google.com with ESMTPS id en13sm3390798wbb.22.2011.11.08.14.54.53
	(version=SSLv3 cipher=OTHER); Tue, 08 Nov 2011 14:54:54 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Tue, 08 Nov 2011 22:54:52 +0000
Subject: Re: [Xen-devel] Need help with fixing the Xen waitqueue feature
From: Keir Fraser <keir.xen@gmail.com>
To: Olaf Hering <olaf@aepfle.de>
Message-ID: <CADF63BC.2460E%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] Need help with fixing the Xen waitqueue feature
Thread-Index: AcyeaWy9VwMMr8R9aEGkD4pv/L4XAw==
In-Reply-To: <20111108222011.GA23969@aepfle.de>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 08/11/2011 22:20, "Olaf Hering" <olaf@aepfle.de> wrote:

> On Tue, Nov 08, Keir Fraser wrote:
> 
>> On 08/11/2011 21:20, "Olaf Hering" <olaf@aepfle.de> wrote:
>> 
>>> Another thing is that sometimes the host suddenly reboots without any
>>> message. I think the reason for this is that a vcpu whose stack was put
>>> aside and that was later resumed may find itself on another physical
>>> cpu. And if that happens, wouldnt that invalidate some of the local
>>> variables back in the callchain? If some of them point to the old
>>> physical cpu, how could this be fixed? Perhaps a few "volatiles" are
>>> needed in some places.
>> 
>> From how many call sites can we end up on a wait queue? I know we were going
>> to end up with a small and explicit number (e.g., in __hvm_copy()) but does
>> this patch make it a more generally-used mechanism? There will unavoidably
>> be many constraints on callers who want to be able to yield the cpu. We can
>> add Linux-style get_cpu/put_cpu abstractions to catch some of them. Actually
>> I don't think it's *that* common that hypercall contexts cache things like
>> per-cpu pointers. But every caller will need auditing, I expect.
> 
> I havent started to audit the callers. In my testing
> mem_event_put_request() is called from p2m_mem_paging_drop_page() and
> p2m_mem_paging_populate(). The latter is called from more places.

Tbh I wonder anyway whether stale hypercall context would be likely to cause
a silent machine reboot. Booting with max_cpus=1 would eliminate moving
between CPUs as a cause of inconsistencies, or pin the guest under test.
Another problem could be sleeping with locks held, but we do test for that
(in debug builds at least) and I'd expect crash/hang rather than silent
reboot. Another problem could be if the vcpu has its own state in an
inconsistent/invalid state temporarily (e.g., its pagetable base pointers)
which then is attempted to be restored during a waitqueue wakeup. That could
certainly cause a reboot, but I don't know of an example where this might
happen.

 -- Keir

> My plan is to put the sleep into ept_get_entry(), but I'm not there yet.
> First I want to test waitqueues in a rather simple code path like
> mem_event_put_request().
> 
>> A sudden reboot is very extreme. No message even on a serial line? That most
>> commonly indicates bad page tables. Most other bugs you'd at least get a
>> double fault message.
> 
> There is no output on serial, I boot with this cmdline:
>   vga=mode-normal console=com1 com1=57600 loglvl=all guest_loglvl=all
>   sync_console conring_size=123456 maxcpus=8 dom0_vcpus_pin
>   dom0_max_vcpus=2
> My base changeset is 24003, the testhost is a Xeon X5670  @ 2.93GHz.
> 
> Olaf



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 15:32:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 15:32:46 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNv9p-0007em-Lh; Tue, 08 Nov 2011 15:32:45 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNv8z-0007Re-KM
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 15:31:54 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1320795109!3406239!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19999 invoked from network); 8 Nov 2011 23:31:50 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-12.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 8 Nov 2011 23:31:50 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA8NVfCY026487
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 8 Nov 2011 23:31:42 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA8NVdMF013200
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 8 Nov 2011 23:31:40 GMT
Received: from abhmt102.oracle.com (abhmt102.oracle.com [141.146.116.54])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA8NVXDl027939; Tue, 8 Nov 2011 17:31:33 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 08 Nov 2011 15:31:33 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id B438281448; Tue,  8 Nov 2011 18:31:32 -0500 (EST)
Date: Tue, 8 Nov 2011 18:31:32 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [Xen-devel] Re: [Revert] Re: [PATCH] mm: sync vmalloc address
	space page tables in alloc_vm_area()
Message-ID: <20111108233132.GA1230@phenom.dumpdata.com>
References: <1314877863-21977-1-git-send-email-david.vrabel@citrix.com>
	<20110901161134.GA8979@dumpdata.com> <4E5FED1A.1000300@goop.org>
	<20110901141754.76cef93b.akpm@linux-foundation.org>
	<4E60C067.4010600@citrix.com>
	<20110902153204.59a928c1.akpm@linux-foundation.org>
	<20110906163553.GA28971@dumpdata.com>
	<20111105133846.GA4415@phenom.dumpdata.com>
	<20111107203613.GA6546@phenom.dumpdata.com>
	<20111108150153.e3229374.akpm@linux-foundation.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111108150153.e3229374.akpm@linux-foundation.org>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090206.4EB9BBDE.00A9,ss=1,re=0.000,fgs=0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"namhyung@gmail.com" <namhyung@gmail.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>,
	David Vrabel <david.vrabel@citrix.com>,
	"rientjes@google.com" <rientjes@google.com>,
	"paulmck@linux.vnet.ibm.com" <paulmck@linux.vnet.ibm.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> > And Linus picked it up.
> 
> I've no idea what's going on here.

Heh. Sorry for being so confusing. Merge windows are a bit stressful and
I sometimes end up writing run-on sentences.
> 
> > .. snip..
> > > 
> > > Also, not sure what you thought of this patch below?
> > 
> > Patch included as attachment for easier review..
> 
> The patch "xen: map foreign pages for shared rings by updating the PTEs
> directly" (whcih looks harnless enough) is not present in 3.2-rc1 or linux-next.

<nods>. That is b/c it does not have your Ack. The patch applies cleanly to
3.2-rc1 (as all the other patches that it depends on are now in 3.2-rc1).

I am humbly asking for you to:
 a) review the patch (which you did) and get an idea whether you are OK (sounds like you are)
 b) pick it up in your -mm tree.

or alternately:
 b) give an Ack on the patch so I can put it in my linux-next and push it
    for 3.2-rc1.

Thank you for you consideration!

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 15:37:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 15:37:30 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNvEP-00085K-WC; Tue, 08 Nov 2011 15:37:30 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNvDd-0007sf-T0
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 15:36:42 -0800
X-Env-Sender: akpm@linux-foundation.org
X-Msg-Ref: server-7.tower-21.messagelabs.com!1320795398!3451526!1
X-Originating-IP: [140.211.169.12]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20294 invoked from network); 8 Nov 2011 23:36:38 -0000
Received: from mail.linuxfoundation.org (HELO mail.linuxfoundation.org)
	(140.211.169.12) by server-7.tower-21.messagelabs.com with SMTP;
	8 Nov 2011 23:36:38 -0000
Received: from akpm.mtv.corp.google.com (216-239-45-4.google.com
	[216.239.45.4])
	by mail.linuxfoundation.org (Postfix) with ESMTPSA id 77784336;
	Tue,  8 Nov 2011 23:35:34 +0000 (UTC)
Date: Tue, 8 Nov 2011 15:36:35 -0800
From: Andrew Morton <akpm@linux-foundation.org>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Re: [Revert] Re: [PATCH] mm: sync vmalloc address
	space page tables in alloc_vm_area()
Message-Id: <20111108153635.45b3c517.akpm@linux-foundation.org>
In-Reply-To: <20111108233132.GA1230@phenom.dumpdata.com>
References: <1314877863-21977-1-git-send-email-david.vrabel@citrix.com>
	<20110901161134.GA8979@dumpdata.com> <4E5FED1A.1000300@goop.org>
	<20110901141754.76cef93b.akpm@linux-foundation.org>
	<4E60C067.4010600@citrix.com>
	<20110902153204.59a928c1.akpm@linux-foundation.org>
	<20110906163553.GA28971@dumpdata.com>
	<20111105133846.GA4415@phenom.dumpdata.com>
	<20111107203613.GA6546@phenom.dumpdata.com>
	<20111108150153.e3229374.akpm@linux-foundation.org>
	<20111108233132.GA1230@phenom.dumpdata.com>
X-Mailer: Sylpheed 3.0.2 (GTK+ 2.20.1; x86_64-pc-linux-gnu)
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"namhyung@gmail.com" <namhyung@gmail.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>,
	David Vrabel <david.vrabel@citrix.com>,
	"rientjes@google.com" <rientjes@google.com>,
	"paulmck@linux.vnet.ibm.com" <paulmck@linux.vnet.ibm.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 8 Nov 2011 18:31:32 -0500
Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:

> > > And Linus picked it up.
> > 
> > I've no idea what's going on here.
> 
> Heh. Sorry for being so confusing. Merge windows are a bit stressful and
> I sometimes end up writing run-on sentences.
> > 
> > > .. snip..
> > > > 
> > > > Also, not sure what you thought of this patch below?
> > > 
> > > Patch included as attachment for easier review..
> > 
> > The patch "xen: map foreign pages for shared rings by updating the PTEs
> > directly" (whcih looks harnless enough) is not present in 3.2-rc1 or linux-next.
> 
> <nods>. That is b/c it does not have your Ack. The patch applies cleanly to
> 3.2-rc1 (as all the other patches that it depends on are now in 3.2-rc1).
> 
> I am humbly asking for you to:
>  a) review the patch (which you did) and get an idea whether you are OK (sounds like you are)

Yup.

>  b) pick it up in your -mm tree.

No added benefit there.

> or alternately:
>  b) give an Ack on the patch so I can put it in my linux-next and push it
>     for 3.2-rc1.

That's OK by me.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 16:04:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 16:04:29 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNveW-0000Tc-3e; Tue, 08 Nov 2011 16:04:28 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNvaK-0000Db-4L
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 16:00:19 -0800
X-Env-Sender: yunhong.jiang@intel.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1320796802!2379110!1
X-Originating-IP: [192.55.52.88]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30142 invoked from network); 9 Nov 2011 00:00:03 -0000
Received: from mga01.intel.com (HELO mga01.intel.com) (192.55.52.88)
	by server-15.tower-182.messagelabs.com with SMTP;
	9 Nov 2011 00:00:03 -0000
Received: from fmsmga002.fm.intel.com ([10.253.24.26])
	by fmsmga101.fm.intel.com with ESMTP; 08 Nov 2011 16:00:01 -0800
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.69,479,1315206000"; 
	d="p7s'?scan'208";a="87688764"
Received: from pgsmsx602.gar.corp.intel.com ([10.221.43.81])
	by fmsmga002.fm.intel.com with ESMTP; 08 Nov 2011 16:00:00 -0800
Received: from pgsmsx104.gar.corp.intel.com (10.221.44.91) by
	pgsmsx602.gar.corp.intel.com (10.221.43.81) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Wed, 9 Nov 2011 07:59:47 +0800
Received: from shsmsx602.ccr.corp.intel.com (10.239.4.104) by
	PGSMSX104.gar.corp.intel.com (10.221.44.91) with Microsoft SMTP Server
	(TLS) id 14.1.323.3; Wed, 9 Nov 2011 07:59:47 +0800
Received: from shsmsx501.ccr.corp.intel.com ([10.239.4.141]) by
	SHSMSX602.ccr.corp.intel.com ([10.239.4.104]) with mapi; Wed, 9 Nov 2011
	07:59:45 +0800
From: "Jiang, Yunhong" <yunhong.jiang@intel.com>
To: "JBeulich@suse.com" <JBeulich@suse.com>, "Liu, Jinsong"
	<jinsong.liu@intel.com>
Date: Wed, 9 Nov 2011 07:59:42 +0800
Thread-Topic: [PATCH] X86 MCE: Add SRAR handler
Thread-Index: AcyZRd2RaetyDoBdRh6fnn6oNntfrAFK8yFg
Message-ID: <789F9655DD1B8F43B48D77C5D306597312D557C0F7@shsmsx501.ccr.corp.intel.com>
References: <BC00F5384FCFC9499AF06F92E8B78A9E26A4F3C1DA@shsmsx502.ccr.corp.intel.com>
	<4EB1221F020000780005E635@nat28.tlf.novell.com>
In-Reply-To: <4EB1221F020000780005E635@nat28.tlf.novell.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: yes
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"keir.xen@gmail.com" <keir.xen@gmail.com>, "Shan,
	Haitao" <haitao.shan@intel.com>,
	"tim.deegan@citrix.com" <tim.deegan@citrix.com>
Subject: [Xen-devel] RE: [PATCH] X86 MCE: Add SRAR handler
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0944698364=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0944698364==
Content-Language: en-US
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature";
	micalg=SHA1; boundary="----=_NextPart_000_055C_01CC9EB5.8990A910"

------=_NextPart_000_055C_01CC9EB5.8990A910
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: 7bit



> > Concern 1: for SRAR IFU error, since RIPV=EIPV=0, it maybe an async
error
> > which occur at guest but root from hypervisor.
> > [Jinsong]:
> >     Yes, but EIPV didn't tell us where the error root from (it's just a
> > hint, warning us async possibility).
> >     It no need to overkill xen at mce isr, instead, at mce softirq we
can
> > find out error root location and then handle accordingly:
> >     * at mce isr:
> >             /* a total insurance */
> >             /* if error is async, we delay handle it at mce softirq */
> >             if ( !(gstatus & MCG_STATUS_RIPV) && !guest_mode(regs))
> >                 return -1;
> 
> I continue to think that guest_mode() must not be used without
> EIPV, no matter what the purpose of the use.

Jan, as explained before, this is purely a sanity check to make sure we can
go to next level error handling, and the check for guest_mode have nothing
to do with where the error happen, but just make sure that if the context in
the stack is for hypervisor mode, and RIPV told us that we can't switch
context, then we can't do anything more but just panic since it's complexity
to pre-emption/ context switch in hypervisor mode.

Thanks
--jyh


------=_NextPart_000_055C_01CC9EB5.8990A910
Content-Type: application/x-pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"

MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIYYDCCAyAw
ggKJoAMCAQICBDXe9M8wDQYJKoZIhvcNAQEFBQAwTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0Vx
dWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw05
ODA4MjIxNjQxNTFaFw0xODA4MjIxNjQxNTFaME4xCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdFcXVp
ZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwgZ8wDQYJ
KoZIhvcNAQEBBQADgY0AMIGJAoGBAMFdsVhnCGLuoJotHwhtkRRomAoe/toEbxOEYiHD0XzOnwXg
uAHwTjTs4oqVBGSs8WtTXwWzy2eAv0ICjv7dAQns4QAUT/z78AzdQ7pbK+EfgHCZFVeTFvEPl2q3
wmgjHMxNWTCsUR47ryvW7mNFe8XZX1DS41APOojnvxT94Me5AgMBAAGjggEJMIIBBTBwBgNVHR8E
aTBnMGWgY6BhpF8wXTELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTENMAsGA1UEAxMEQ1JMMTAaBgNVHRAE
EzARgQ8yMDE4MDgyMjE2NDE1MVowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFEjmaPkr0rKV10fY
IyAQTzOYkJ/UMB0GA1UdDgQWBBRI5mj5K9KylddH2CMgEE8zmJCf1DAMBgNVHRMEBTADAQH/MBoG
CSqGSIb2fQdBAAQNMAsbBVYzLjBjAwIGwDANBgkqhkiG9w0BAQUFAAOBgQBYzinq/Pfetc4CuRe1
hdG54+CVzCUxDQCmkm5/tpJjnlCV0Zpv5BHeY4VumO6o/1rI01WyZnFX3sAh6z0qpyNJAQSGQnv8
7n+iFlK1Z2fTQNs7JliyKHc9rhR3Ydb6KmYnoA36p3Nc6nDxlCFlRF/6/O8paKmih3nvee9PrAd3
ODCCAz0wggKmoAMCAQICAwWw/zANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
MB4XDTA2MDIxNjE4MDEzMFoXDTE2MDIxOTE4MDEzMFowUjELMAkGA1UEBhMCVVMxGjAYBgNVBAoT
EUludGVsIENvcnBvcmF0aW9uMScwJQYDVQQDEx5JbnRlbCBFeHRlcm5hbCBCYXNpYyBQb2xpY3kg
Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBpd/XOb9QVqEZ8mQ1042TdOIq3ATD
IsV2xDyt30yLyMR5Wjtus0bn3B+he89BiNO/LP6+rFzEwlD55PlX+HLGIKeNNG97dqyc30FElEUj
ZzTZFq2N4e3kVJ/XAEEgANzV8v9qp7qWwxugPgfc3z9BkYot+CifozexHLb/hEZj+yISCU61kRZv
uSQ0E11yYL4dRgcglJeaHo3oX57rvIckaLsYV5/1Aj+R8DM1Ppk965XQAKsHfnyT7C4S50T4lVn4
lz36wOdNZn/zegG1zp41lnoTFfT4KuKVJH5x7YD1p6KbgJCKLovnujGuohquBNfdXKpZkvz6pGv+
iC1HawJdAgMBAAGjgaAwgZ0wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQaxgxKxEdvqNutK/D0
Vgaj7TdUDDA6BgNVHR8EMzAxMC+gLaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3Nl
Y3VyZWNhLmNybDAfBgNVHSMEGDAWgBRI5mj5K9KylddH2CMgEE8zmJCf1DAPBgNVHRMBAf8EBTAD
AQH/MA0GCSqGSIb3DQEBBQUAA4GBABMQOK2kVKVIlUWwLTdywJ+e2O+PC/uQltK2F3lRyrPfBn69
tOkIP4SgDJOfsxyobIrPLe75kBLw+Dom13OBDp/EMZJZ1CglQfVV8co9mT3aZMjSGGQiMgkJLR3j
Mfr900fXZKj5XeqCJ+JP0mEhJGEdVCY+FFlksJjV86fDrq1QMIIFijCCBHKgAwIBAgIKYSCKYgAA
AAAACDANBgkqhkiG9w0BAQUFADBSMQswCQYDVQQGEwJVUzEaMBgGA1UEChMRSW50ZWwgQ29ycG9y
YXRpb24xJzAlBgNVBAMTHkludGVsIEV4dGVybmFsIEJhc2ljIFBvbGljeSBDQTAeFw0wOTA1MTUx
OTI3MjZaFw0xNTA1MTUxOTM3MjZaMFYxCzAJBgNVBAYTAlVTMRowGAYDVQQKExFJbnRlbCBDb3Jw
b3JhdGlvbjErMCkGA1UEAxMiSW50ZWwgRXh0ZXJuYWwgQmFzaWMgSXNzdWluZyBDQSAzQjCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKQEM1Wn9TU9vc9C+/Tc7KB+eiYElmrcEWE32WUd
HvWG+IcQHVQsikTmMyKKojNLw2B5s6Iekc8ivDo/wCfjZzX9JyftMnc+AArc0la87Olybzm8K9jX
EfTBvTnUSFSiI9ZYefITdiUgqlAFuljFZEHYKYtLuhrRacpmQfP4mV63NKdc2bT804HRf6YptZFa
4k6YN94zlrGNrBuQQ74WFzz/jLBusbUpEkro6Mu/ZYFOFWQrV9lBhF9Ruk8yN+3N6n9fUo/qBigi
F2kEn9xVh1ykl7SCGL2jBUkXx4qgV27a6Si8lRRdgrHGtN/HWnSWlLXTH5l575H4Lq++77OFv38C
AwEAAaOCAlwwggJYMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFA7GKvdZsggQkCVvw939imYx
MCvFMAsGA1UdDwQEAwIBhjASBgkrBgEEAYI3FQEEBQIDAQABMCMGCSsGAQQBgjcVAgQWBBQ5oFY2
ekKQ/5Ktim+VdMeSWb4QWTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAfBgNVHSMEGDAWgBQa
xgxKxEdvqNutK/D0Vgaj7TdUDDCBvQYDVR0fBIG1MIGyMIGvoIGsoIGphk5odHRwOi8vd3d3Lmlu
dGVsLmNvbS9yZXBvc2l0b3J5L0NSTC9JbnRlbCUyMEV4dGVybmFsJTIwQmFzaWMlMjBQb2xpY3kl
MjBDQS5jcmyGV2h0dHA6Ly9jZXJ0aWZpY2F0ZXMuaW50ZWwuY29tL3JlcG9zaXRvcnkvQ1JML0lu
dGVsJTIwRXh0ZXJuYWwlMjBCYXNpYyUyMFBvbGljeSUyMENBLmNybDCB4wYIKwYBBQUHAQEEgdYw
gdMwYwYIKwYBBQUHMAKGV2h0dHA6Ly93d3cuaW50ZWwuY29tL3JlcG9zaXRvcnkvY2VydGlmaWNh
dGVzL0ludGVsJTIwRXh0ZXJuYWwlMjBCYXNpYyUyMFBvbGljeSUyMENBLmNydDBsBggrBgEFBQcw
AoZgaHR0cDovL2NlcnRpZmljYXRlcy5pbnRlbC5jb20vcmVwb3NpdG9yeS9jZXJ0aWZpY2F0ZXMv
SW50ZWwlMjBFeHRlcm5hbCUyMEJhc2ljJTIwUG9saWN5JTIwQ0EuY3J0MA0GCSqGSIb3DQEBBQUA
A4IBAQCxtQEHchVQhXyjEqtMVUMe6gkmPsIczHxSeqNbo9dsD+6xbT65JT+oYgpIAtfEsYXeUJu1
cChqpb22U5bMAz7eaQcW5bzefufWvA6lg2048B8oczBj/q+5P5NpYrUO8jOmN4jTjfJq3ElZ7yFW
py7rB3Vm/aN6ATYqWfMbS/xfh+JCxmH3droUmMJI0/aZJHsLtjbjFnNsHDNrJZX1vxlM78Lb1hjs
kTENPmhbVbfTj5i/ZGnhv4tmI8QZPCNtcegXJrfhRl2D9bWpdTOPrWiLDUqzy1Z6KL7TcOS/PCl8
RHCJXkPau/thTQCpIoDa2+c+3XA++gRTfAQ4svTO260NMIIGDzCCBPegAwIBAgIKMrqXMwABAAB4
/jANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJVUzEaMBgGA1UEChMRSW50ZWwgQ29ycG9yYXRp
b24xKzApBgNVBAMTIkludGVsIEV4dGVybmFsIEJhc2ljIElzc3VpbmcgQ0EgM0IwHhcNMTEwOTIw
MDQzODAxWhcNMTQwOTA0MDQzODAxWjBBMRcwFQYDVQQDEw5KaWFuZywgWXVuaG9uZzEmMCQGCSqG
SIb3DQEJARYXeXVuaG9uZy5qaWFuZ0BpbnRlbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQDGluME2LxwiaZBmdSeObEa8UoyyQ4118LL15UR62zUFyr2kdn7QQ2Co9qLKbtqZPZm
xsNmtIC6V8zgOmCd9kq2CZphuFvrJQKBALrKbv3SuVDu2hyYnhfOKMZJtnOH7bw9kYWsrOtdF01z
ChRgSz6dUXYCNvtlBIyKvAcsBKRH3ZVDKdvPgdZ6bSQIfkROR1LTplxq3lo4yBeAdYy+3XM40YMc
QUAa2lHQNm/fovdPjMpdBL0LYEgiBKCjddpEPDOLKVfpNUV0Q7sjzyO6OL8fS50TLWY14DahsWRb
maoNJO9puq2px4nykvb5mZRtNSJqn6Zz80gMRkyKa+yrw1ebAgMBAAGjggLyMIIC7jALBgNVHQ8E
BAMCB4AwPAYJKwYBBAGCNxUHBC8wLQYlKwYBBAGCNxUIhsOMdYSZ5VGD/YEohY6fU4KRwAlngd69
OZXwQwIBZAIBCDAdBgNVHQ4EFgQUOTubyHaKHy8V2UbyBz1VEhvF404wHwYDVR0jBBgwFoAUDsYq
91myCBCQJW/D3f2KZjEwK8Uwgc8GA1UdHwSBxzCBxDCBwaCBvqCBu4ZXaHR0cDovL3d3dy5pbnRl
bC5jb20vcmVwb3NpdG9yeS9DUkwvSW50ZWwlMjBFeHRlcm5hbCUyMEJhc2ljJTIwSXNzdWluZyUy
MENBJTIwM0IoMSkuY3JshmBodHRwOi8vY2VydGlmaWNhdGVzLmludGVsLmNvbS9yZXBvc2l0b3J5
L0NSTC9JbnRlbCUyMEV4dGVybmFsJTIwQmFzaWMlMjBJc3N1aW5nJTIwQ0ElMjAzQigxKS5jcmww
gfUGCCsGAQUFBwEBBIHoMIHlMGwGCCsGAQUFBzAChmBodHRwOi8vd3d3LmludGVsLmNvbS9yZXBv
c2l0b3J5L2NlcnRpZmljYXRlcy9JbnRlbCUyMEV4dGVybmFsJTIwQmFzaWMlMjBJc3N1aW5nJTIw
Q0ElMjAzQigxKS5jcnQwdQYIKwYBBQUHMAKGaWh0dHA6Ly9jZXJ0aWZpY2F0ZXMuaW50ZWwuY29t
L3JlcG9zaXRvcnkvY2VydGlmaWNhdGVzL0ludGVsJTIwRXh0ZXJuYWwlMjBCYXNpYyUyMElzc3Vp
bmclMjBDQSUyMDNCKDEpLmNydDAfBgNVHSUEGDAWBggrBgEFBQcDBAYKKwYBBAGCNwoDDDApBgkr
BgEEAYI3FQoEHDAaMAoGCCsGAQUFBwMEMAwGCisGAQQBgjcKAwwwSwYDVR0RBEQwQqAnBgorBgEE
AYI3FAIDoBkMF3l1bmhvbmcuamlhbmdAaW50ZWwuY29tgRd5dW5ob25nLmppYW5nQGludGVsLmNv
bTANBgkqhkiG9w0BAQUFAAOCAQEAM2zDUSfyzj7kqPHtToqlASdoH5fWS8yNqtpC//2YFdqV8PZa
hZbcsaTsi9st/Jld2nHPbTlR7RoY3JI5x8jVw++yjfz6DnRJn3TbQEKSC+r1jZMFeXJFEz3WWwRR
raGRGsH9KlvtA60n5V4DqZMvKau4nvz6VFecAGfZGPe8f6Th7olmb48pMXFaQKnZokuQQXvVlXOi
4wFzm1Qhx//DZBLPTMyzR3nSbewXeJDFobwDDZl1eGoymmpPk8wUX343jx1CV0FgG7u4sEvXzBoe
h30e6XHDLP500zYTt5QeX1R8v9Eumny1PPuxsx1X/QM4pWw6aP/JVDA+xQ+Wr7jNDzCCBlYwggU+
oAMCAQICCjK50GgAAQAAeP0wDQYJKoZIhvcNAQEFBQAwVjELMAkGA1UEBhMCVVMxGjAYBgNVBAoT
EUludGVsIENvcnBvcmF0aW9uMSswKQYDVQQDEyJJbnRlbCBFeHRlcm5hbCBCYXNpYyBJc3N1aW5n
IENBIDNCMB4XDTExMDkyMDA0MzcwNloXDTE0MDkwNDA0MzcwNlowQTEXMBUGA1UEAxMOSmlhbmcs
IFl1bmhvbmcxJjAkBgkqhkiG9w0BCQEWF3l1bmhvbmcuamlhbmdAaW50ZWwuY29tMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuS/sEhB+AG+TGAUigP7DhPRf7dDpO5IBEnsdOZk4MT1L
md7SGnLJlPJij5ktbwQCvN1xMmdKG1TUJeMgI6sf6xSQIOzEtLjhJ0H700QnOJMI7L8iy6Yxpx5o
q7RMdNHjIVBCCq/iHCQGCRLCDjkQCzzTjwGcvpYxy27dNF4PywSudUIln5cvlVUOJM61i48JObA1
bClVDzmA9b2CHWH0F9Zic5CVp3ZpRwvlvJiV/THcqiC1yZoN5s6DFn6lg1nybB0JNZt9AXvLC3N5
yBrMfQ1/jTQJ1Ubk/8hGkIxVOS5nwRUSQV4cmd4mY+pQpsCZ2x7xthojS4kr7lW6cElZLQIDAQAB
o4IDOTCCAzUwCwYDVR0PBAQDAgQwMD0GCSsGAQQBgjcVBwQwMC4GJisGAQQBgjcVCIbDjHWEmeVR
g/2BKIWOn1OCkcAJZ4S52UGHhP9OAgFkAgEMMEQGCSqGSIb3DQEJDwQ3MDUwDgYIKoZIhvcNAwIC
AgCAMA4GCCqGSIb3DQMEAgIAgDAHBgUrDgMCBzAKBggqhkiG9w0DBzAdBgNVHQ4EFgQUH3wL5R5h
cJPF0e3+Fi4mIg58jYcwHwYDVR0jBBgwFoAUDsYq91myCBCQJW/D3f2KZjEwK8Uwgc8GA1UdHwSB
xzCBxDCBwaCBvqCBu4ZXaHR0cDovL3d3dy5pbnRlbC5jb20vcmVwb3NpdG9yeS9DUkwvSW50ZWwl
MjBFeHRlcm5hbCUyMEJhc2ljJTIwSXNzdWluZyUyMENBJTIwM0IoMSkuY3JshmBodHRwOi8vY2Vy
dGlmaWNhdGVzLmludGVsLmNvbS9yZXBvc2l0b3J5L0NSTC9JbnRlbCUyMEV4dGVybmFsJTIwQmFz
aWMlMjBJc3N1aW5nJTIwQ0ElMjAzQigxKS5jcmwwgfUGCCsGAQUFBwEBBIHoMIHlMGwGCCsGAQUF
BzAChmBodHRwOi8vd3d3LmludGVsLmNvbS9yZXBvc2l0b3J5L2NlcnRpZmljYXRlcy9JbnRlbCUy
MEV4dGVybmFsJTIwQmFzaWMlMjBJc3N1aW5nJTIwQ0ElMjAzQigxKS5jcnQwdQYIKwYBBQUHMAKG
aWh0dHA6Ly9jZXJ0aWZpY2F0ZXMuaW50ZWwuY29tL3JlcG9zaXRvcnkvY2VydGlmaWNhdGVzL0lu
dGVsJTIwRXh0ZXJuYWwlMjBCYXNpYyUyMElzc3VpbmclMjBDQSUyMDNCKDEpLmNydDAfBgNVHSUE
GDAWBggrBgEFBQcDBAYKKwYBBAGCNwoDBDApBgkrBgEEAYI3FQoEHDAaMAoGCCsGAQUFBwMEMAwG
CisGAQQBgjcKAwQwSwYDVR0RBEQwQqAnBgorBgEEAYI3FAIDoBkMF3l1bmhvbmcuamlhbmdAaW50
ZWwuY29tgRd5dW5ob25nLmppYW5nQGludGVsLmNvbTANBgkqhkiG9w0BAQUFAAOCAQEAZ9Sdy8Lt
E3PqdHP75WMmC7Ae5p8zY/5MIWT6sl9i4u0VlfzHHANvcJqhsxIkhoN2IpHQ7M6MFsIkWKubCPTi
wr4CfYVq6HIQB/hxf7fk8tBMvKw+HiOt7helIZhFdScVtmq3ZYhD5pj6D+EuOh+zr7RhC2FnQxEW
XpNUMFbOPdt492gfzZ1hkJsZ6paeIQchsyi3B3pPrIqg4pJgsb4rHZ6HsOdV+Y7QnwU7vXv6akm4
RsnHYTvlY+pkWRg2ArBoQFe/yRHWoL0OUa+ykfbA+IDdIirnxzr+E+FIhwPhubyspcANi2Nwgpo2
yH6u1VZ0dgnWrshpmZosIsh+s3CFqzGCA5IwggOOAgEBMGQwVjELMAkGA1UEBhMCVVMxGjAYBgNV
BAoTEUludGVsIENvcnBvcmF0aW9uMSswKQYDVQQDEyJJbnRlbCBFeHRlcm5hbCBCYXNpYyBJc3N1
aW5nIENBIDNCAgoyupczAAEAAHj+MAkGBSsOAwIaBQCgggIDMBgGCSqGSIb3DQEJAzELBgkqhkiG
9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTExMTEwODIzNTk0MlowIwYJKoZIhvcNAQkEMRYEFHVu+6po
E0lWQusaUNA4cysOOLLbMHMGCSsGAQQBgjcQBDFmMGQwVjELMAkGA1UEBhMCVVMxGjAYBgNVBAoT
EUludGVsIENvcnBvcmF0aW9uMSswKQYDVQQDEyJJbnRlbCBFeHRlcm5hbCBCYXNpYyBJc3N1aW5n
IENBIDNCAgoyudBoAAEAAHj9MHUGCyqGSIb3DQEJEAILMWagZDBWMQswCQYDVQQGEwJVUzEaMBgG
A1UEChMRSW50ZWwgQ29ycG9yYXRpb24xKzApBgNVBAMTIkludGVsIEV4dGVybmFsIEJhc2ljIElz
c3VpbmcgQ0EgM0ICCjK50GgAAQAAeP0wgbcGCSqGSIb3DQEJDzGBqTCBpjALBglghkgBZQMEASow
CwYJYIZIAWUDBAEWMAoGCCqGSIb3DQMHMAsGCWCGSAFlAwQBAjAOBggqhkiG9w0DAgICAIAwBwYF
Kw4DAgcwDQYIKoZIhvcNAwICAUAwDQYIKoZIhvcNAwICASgwBwYFKw4DAhowCwYJYIZIAWUDBAID
MAsGCWCGSAFlAwQCAjALBglghkgBZQMEAgEwCgYIKoZIhvcNAgUwDQYJKoZIhvcNAQEBBQAEggEA
o2A/mAmLG2DBirs2ijbIIcJ8zJgT6PQ8YsJumkFu3yKFQQlm3a3kYLHNXA1z/UBoO1Gz9G969o45
WkXYQczpyx3QlY+wexuiMv+lJQDPmKIiCCbNoKRDgdguP+K4XKD/+fCFoy9syorWFfJW0z1CHdvz
93zPeBgUDNscuJHqtXB4Yisgyxaz1f49Ni0c75TftWmG4aqdUnY9sfOCYjj3WwFIdIij3DZlVnWp
J30nGukh89lkOw4d5e9nLd5OKj1ZPVIsUm6y46KLLh1fOgaYp433FWSsMsLXGKqFLfeRdc0RK8fO
M3OKJQ33Z0IoENalZV9TgmmaGQuVLy6Aq5+6+QAAAAAAAA==

------=_NextPart_000_055C_01CC9EB5.8990A910--


--===============0944698364==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0944698364==--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 16:07:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 16:07:34 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNvhV-0000yK-Jm; Tue, 08 Nov 2011 16:07:33 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNvc2-0000Es-Rt
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 16:02:14 -0800
X-Env-Sender: greg@kroah.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1320796908!3440777!1
X-Originating-IP: [66.111.4.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12356 invoked from network); 9 Nov 2011 00:01:49 -0000
Received: from out1.smtp.messagingengine.com (HELO
	out1.smtp.messagingengine.com) (66.111.4.25)
	by server-4.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 00:01:49 -0000
Received: from compute6.internal (compute6.nyi.mail.srv.osa [10.202.2.46])
	by gateway1.nyi.mail.srv.osa (Postfix) with ESMTP id A519120E6F
	for <xen-devel@lists.xensource.com>;
	Tue,  8 Nov 2011 19:01:46 -0500 (EST)
Received: from frontend1.nyi.mail.srv.osa ([10.202.2.160])
	by compute6.internal (MEProxy); Tue, 08 Nov 2011 19:01:46 -0500
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=subject:to:cc:from:date:message-id
	:mime-version:content-type:content-transfer-encoding; s=smtpout;
	bh=sD0zOD4JTIOAXtOlqTHQTRFEmVk=; b=leX5kzlhcmvMX6HjASEA9D1VO8QQ
	s7X6ahwCGd3RZRYYfVs/d3VGtBsjjMHgApb9RyjF4Jwcvjjn+tJ/+wg/x+Qb7VYM
	arKVCz78OhpxBF74CJ6euCFNKtKU4VRCefLr9Hok659Ffusr5TqKh/1Zr/9yRbTR
	HCm1PSGKF750VQ8=
X-Sasl-enc: uxxyLvUE5ozANzKUl/APkEopIGDTyn5eJDgX2dvo7W8e 1320796906
Received: from localhost (c-76-121-69-168.hsd1.wa.comcast.net [76.121.69.168])
	by mail.messagingengine.com (Postfix) with ESMTPSA id 27BCD8E00A8;
	Tue,  8 Nov 2011 19:01:46 -0500 (EST)
To: gregkh@suse.de, ian.campbell@citrix.com, Jeremy.Fitzhardinge@citrix.com,
	jslaby@suse.cz, konrad.wilk@oracle.com,
	linux-kernel.bfrz@manchmal.in-ulm.de, rjw@sisk.pl,
	tglx@linutronix.de, xen-devel@lists.xensource.com
From: <gregkh@suse.de>
Date: Tue, 08 Nov 2011 16:01:37 -0800
Message-ID: <13207968972743@kroah.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=ASCII
Content-Transfer-Encoding: 8bit
Cc: stable@vger.kernel.org, stable-commits@vger.kernel.org
Subject: [Xen-devel] Patch "Revert "genirq: Add IRQF_RESUME_EARLY and resume
	such IRQs earlier"" has been added to the 2.6.32-longterm tree
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


This is a note to let you know that I've just added the patch titled

    Revert "genirq: Add IRQF_RESUME_EARLY and resume such IRQs earlier"

to the 2.6.32-longterm tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/longterm/longterm-queue-2.6.32.git;a=summary

The filename of the patch is:
     0001-Revert-genirq-Add-IRQF_RESUME_EARLY-and-resume-such-.patch
and it can be found in the queue-2.6.32 subdirectory.

If you, or anyone else, feels it should not be added to the 2.6.32 longterm tree,
please let <stable@vger.kernel.org> know about it.


>From 402a1955b2c0072733b13500b7f6378149e1f72e Mon Sep 17 00:00:00 2001
From: Greg Kroah-Hartman <gregkh@suse.de>
Date: Tue, 8 Nov 2011 15:40:42 -0800
Subject: Revert "genirq: Add IRQF_RESUME_EARLY and resume such IRQs earlier"

This reverts commit 0f12a6ad9fa3a03f2bcee36c9cb704821e244c40.

It causes too many build errors and needs to be done properly.

Reported-by: Jiri Slaby <jslaby@suse.cz>
Reported-by: Christoph Biedl <linux-kernel.bfrz@manchmal.in-ulm.de>
Cc: Ian Campbell <ian.campbell@citrix.com>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Cc: Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>
Cc: xen-devel <xen-devel@lists.xensource.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>


---
 drivers/base/sys.c        |    6 ------
 drivers/xen/events.c      |    2 +-
 include/linux/interrupt.h |    5 -----
 kernel/irq/pm.c           |   35 +++++++----------------------------
 4 files changed, 8 insertions(+), 40 deletions(-)

--- a/drivers/base/sys.c
+++ b/drivers/base/sys.c
@@ -471,12 +471,6 @@ int sysdev_resume(void)
 {
 	struct sysdev_class *cls;
 
-	/*
-	 * Called from syscore in mainline but called directly here
-	 * since syscore does not exist in this tree.
-	 */
-	irq_pm_syscore_resume();
-
 	WARN_ONCE(!irqs_disabled(),
 		"Interrupts enabled while resuming system devices\n");
 
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -536,7 +536,7 @@ int bind_ipi_to_irqhandler(enum ipi_vect
 	if (irq < 0)
 		return irq;
 
-	irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME | IRQF_EARLY_RESUME;
+	irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME;
 	retval = request_irq(irq, handler, irqflags, devname, dev_id);
 	if (retval != 0) {
 		unbind_from_irq(irq);
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -54,8 +54,6 @@
  *                irq line disabled until the threaded handler has been run.
  * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend
  * IRQF_FORCE_RESUME - Force enable it on resume even if IRQF_NO_SUSPEND is set
- * IRQF_EARLY_RESUME - Resume IRQ early during syscore instead of at device
- *                resume time.
  */
 #define IRQF_DISABLED		0x00000020
 #define IRQF_SAMPLE_RANDOM	0x00000040
@@ -68,7 +66,6 @@
 #define IRQF_ONESHOT		0x00002000
 #define IRQF_NO_SUSPEND		0x00004000
 #define IRQF_FORCE_RESUME	0x00008000
-#define IRQF_EARLY_RESUME	0x00020000
 
 #define IRQF_TIMER		(__IRQF_TIMER | IRQF_NO_SUSPEND)
 
@@ -199,7 +196,6 @@ extern void enable_irq(unsigned int irq)
 #ifdef CONFIG_GENERIC_HARDIRQS
 extern void suspend_device_irqs(void);
 extern void resume_device_irqs(void);
-extern void irq_pm_syscore_resume(void);
 #ifdef CONFIG_PM_SLEEP
 extern int check_wakeup_irqs(void);
 #else
@@ -208,7 +204,6 @@ static inline int check_wakeup_irqs(void
 #else
 static inline void suspend_device_irqs(void) { };
 static inline void resume_device_irqs(void) { };
-static inline void irq_pm_syscore_resume(void) { };
 static inline int check_wakeup_irqs(void) { return 0; }
 #endif
 
--- a/kernel/irq/pm.c
+++ b/kernel/irq/pm.c
@@ -39,46 +39,25 @@ void suspend_device_irqs(void)
 }
 EXPORT_SYMBOL_GPL(suspend_device_irqs);
 
-static void resume_irqs(bool want_early)
+/**
+ * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs()
+ *
+ * Enable all interrupt lines previously disabled by suspend_device_irqs() that
+ * have the IRQ_SUSPENDED flag set.
+ */
+void resume_device_irqs(void)
 {
 	struct irq_desc *desc;
 	int irq;
 
 	for_each_irq_desc(irq, desc) {
 		unsigned long flags;
-		bool is_early = desc->action &&
-			desc->action->flags & IRQF_EARLY_RESUME;
-
-		if (is_early != want_early)
-			continue;
 
 		spin_lock_irqsave(&desc->lock, flags);
 		__enable_irq(desc, irq, true);
 		spin_unlock_irqrestore(&desc->lock, flags);
 	}
 }
-
-/**
- * irq_pm_syscore_ops - enable interrupt lines early
- *
- * Enable all interrupt lines with %IRQF_EARLY_RESUME set.
- */
-void irq_pm_syscore_resume(void)
-{
-	resume_irqs(true);
-}
-
-/**
- * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs()
- *
- * Enable all non-%IRQF_EARLY_RESUME interrupt lines previously
- * disabled by suspend_device_irqs() that have the IRQS_SUSPENDED flag
- * set as well as those with %IRQF_FORCE_RESUME.
- */
-void resume_device_irqs(void)
-{
-	resume_irqs(false);
-}
 EXPORT_SYMBOL_GPL(resume_device_irqs);
 
 /**


Patches currently in longterm-queue-2.6.32 which might be from gregkh@suse.de are

/home/gregkh/linux/longterm/longterm-queue-2.6.32/queue-2.6.32/make-scsi_free_queue-kill-pending-scsi-commands.patch
/home/gregkh/linux/longterm/longterm-queue-2.6.32/queue-2.6.32/0003-Revert-powerpc-mpic-Fix-problem-that-affinity-is-not.patch
/home/gregkh/linux/longterm/longterm-queue-2.6.32/queue-2.6.32/netlink-validate-nla_msecs-length.patch
/home/gregkh/linux/longterm/longterm-queue-2.6.32/queue-2.6.32/mtd-mtdchar-add-missing-initializer-on-raw-write.patch
/home/gregkh/linux/longterm/longterm-queue-2.6.32/queue-2.6.32/pm-suspend-off-by-one-in-pm_suspend.patch
/home/gregkh/linux/longterm/longterm-queue-2.6.32/queue-2.6.32/st-fix-race-in-st_scsi_execute_end.patch
/home/gregkh/linux/longterm/longterm-queue-2.6.32/queue-2.6.32/0001-Revert-genirq-Add-IRQF_RESUME_EARLY-and-resume-such-.patch
/home/gregkh/linux/longterm/longterm-queue-2.6.32/queue-2.6.32/nfs-sunrpc-don-t-use-a-credential-with-extra-groups.patch
/home/gregkh/linux/longterm/longterm-queue-2.6.32/queue-2.6.32/0002-Revert-ASoC-wm8940-Properly-set-codec-dapm.bias_leve.patch

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 17:18:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 17:18:19 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNwny-0002R7-9T; Tue, 08 Nov 2011 17:18:18 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNwmt-0002ET-MF
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 17:17:12 -0800
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-7.tower-216.messagelabs.com!1320801426!2794517!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30949 invoked from network); 9 Nov 2011 01:17:08 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-7.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 01:17:08 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:1cce:53ff:fe21:acda])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 7A3029817;
	Tue,  8 Nov 2011 17:17:05 -0800 (PST)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id D8A1920240;
	Tue,  8 Nov 2011 17:17:03 -0800 (PST)
Message-ID: <4EB9D48F.5010201@goop.org>
Date: Tue, 08 Nov 2011 17:17:03 -0800
From: Jeremy Fitzhardinge <jeremy@goop.org>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: "H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [GIT PULL] More cleanups for atomic memory
	operations/spinlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

I forgot to push these for the just-closed merge window, but they're
fine for the next one.  Could you find them a home in tip.git?

Thanks,
    J

The following changes since commit 1ea6b8f48918282bdca0b32a34095504ee65bab5:

  Linux 3.2-rc1 (2011-11-07 16:16:02 -0800)

are available in the git repository at:
  git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen.git upstream/ticketlock-cleanup

Jeremy Fitzhardinge (2):
      x86/cmpxchg: add a locked add() helper
      x86: consolidate xchg and xadd macros

 arch/x86/include/asm/cmpxchg.h  |  140 +++++++++++++++++++-------------------
 arch/x86/include/asm/spinlock.h |   15 +----
 2 files changed, 71 insertions(+), 84 deletions(-)

diff --git a/arch/x86/include/asm/cmpxchg.h b/arch/x86/include/asm/cmpxchg.h
index 5d3acdf..5488e10 100644
--- a/arch/x86/include/asm/cmpxchg.h
+++ b/arch/x86/include/asm/cmpxchg.h
@@ -14,6 +14,8 @@ extern void __cmpxchg_wrong_size(void)
 	__compiletime_error("Bad argument size for cmpxchg");
 extern void __xadd_wrong_size(void)
 	__compiletime_error("Bad argument size for xadd");
+extern void __add_wrong_size(void)
+	__compiletime_error("Bad argument size for add");
 
 /*
  * Constants for operation sizes. On 32-bit, the 64-bit size it set to
@@ -31,60 +33,47 @@ extern void __xadd_wrong_size(void)
 #define	__X86_CASE_Q	-1		/* sizeof will never return -1 */
 #endif
 
+/* 
+ * An exchange-type operation, which takes a value and a pointer, and
+ * returns a the old value.
+ */
+#define __xchg_op(ptr, arg, op, lock)					\
+	({								\
+	        __typeof__ (*(ptr)) __ret = (arg);			\
+		switch (sizeof(*(ptr))) {				\
+		case __X86_CASE_B:					\
+			asm volatile (lock #op "b %b0, %1\n"		\
+				      : "+r" (__ret), "+m" (*(ptr))	\
+				      : : "memory", "cc");		\
+			break;						\
+		case __X86_CASE_W:					\
+			asm volatile (lock #op "w %w0, %1\n"		\
+				      : "+r" (__ret), "+m" (*(ptr))	\
+				      : : "memory", "cc");		\
+			break;						\
+		case __X86_CASE_L:					\
+			asm volatile (lock #op "l %0, %1\n"		\
+				      : "+r" (__ret), "+m" (*(ptr))	\
+				      : : "memory", "cc");		\
+			break;						\
+		case __X86_CASE_Q:					\
+			asm volatile (lock #op "q %q0, %1\n"		\
+				      : "+r" (__ret), "+m" (*(ptr))	\
+				      : : "memory", "cc");		\
+			break;						\
+		default:						\
+			__ ## op ## _wrong_size();			\
+		}							\
+		__ret;							\
+	})
+
 /*
  * Note: no "lock" prefix even on SMP: xchg always implies lock anyway.
  * Since this is generally used to protect other memory information, we
  * use "asm volatile" and "memory" clobbers to prevent gcc from moving
  * information around.
  */
-#define __xchg(x, ptr, size)						\
-({									\
-	__typeof(*(ptr)) __x = (x);					\
-	switch (size) {							\
-	case __X86_CASE_B:						\
-	{								\
-		volatile u8 *__ptr = (volatile u8 *)(ptr);		\
-		asm volatile("xchgb %0,%1"				\
-			     : "=q" (__x), "+m" (*__ptr)		\
-			     : "0" (__x)				\
-			     : "memory");				\
-		break;							\
-	}								\
-	case __X86_CASE_W:						\
-	{								\
-		volatile u16 *__ptr = (volatile u16 *)(ptr);		\
-		asm volatile("xchgw %0,%1"				\
-			     : "=r" (__x), "+m" (*__ptr)		\
-			     : "0" (__x)				\
-			     : "memory");				\
-		break;							\
-	}								\
-	case __X86_CASE_L:						\
-	{								\
-		volatile u32 *__ptr = (volatile u32 *)(ptr);		\
-		asm volatile("xchgl %0,%1"				\
-			     : "=r" (__x), "+m" (*__ptr)		\
-			     : "0" (__x)				\
-			     : "memory");				\
-		break;							\
-	}								\
-	case __X86_CASE_Q:						\
-	{								\
-		volatile u64 *__ptr = (volatile u64 *)(ptr);		\
-		asm volatile("xchgq %0,%1"				\
-			     : "=r" (__x), "+m" (*__ptr)		\
-			     : "0" (__x)				\
-			     : "memory");				\
-		break;							\
-	}								\
-	default:							\
-		__xchg_wrong_size();					\
-	}								\
-	__x;								\
-})
-
-#define xchg(ptr, v)							\
-	__xchg((v), (ptr), sizeof(*ptr))
+#define xchg(ptr, v)	__xchg_op((ptr), (v), xchg, "")
 
 /*
  * Atomic compare and exchange.  Compare OLD with MEM, if identical,
@@ -165,46 +154,57 @@ extern void __xadd_wrong_size(void)
 	__cmpxchg_local((ptr), (old), (new), sizeof(*ptr))
 #endif
 
-#define __xadd(ptr, inc, lock)						\
+/*
+ * xadd() adds "inc" to "*ptr" and atomically returns the previous
+ * value of "*ptr".
+ *
+ * xadd() is locked when multiple CPUs are online
+ * xadd_sync() is always locked
+ * xadd_local() is never locked
+ */
+#define __xadd(ptr, inc, lock)	__xchg_op((ptr), (inc), xadd, lock)
+#define xadd(ptr, inc)		__xadd((ptr), (inc), LOCK_PREFIX)
+#define xadd_sync(ptr, inc)	__xadd((ptr), (inc), "lock; ")
+#define xadd_local(ptr, inc)	__xadd((ptr), (inc), "")
+
+#define __add(ptr, inc, lock)						\
 	({								\
 	        __typeof__ (*(ptr)) __ret = (inc);			\
 		switch (sizeof(*(ptr))) {				\
 		case __X86_CASE_B:					\
-			asm volatile (lock "xaddb %b0, %1\n"		\
-				      : "+r" (__ret), "+m" (*(ptr))	\
-				      : : "memory", "cc");		\
+			asm volatile (lock "addb %b1, %0\n"		\
+				      : "+m" (*(ptr)) : "ri" (inc)	\
+				      : "memory", "cc");		\
 			break;						\
 		case __X86_CASE_W:					\
-			asm volatile (lock "xaddw %w0, %1\n"		\
-				      : "+r" (__ret), "+m" (*(ptr))	\
-				      : : "memory", "cc");		\
+			asm volatile (lock "addw %w1, %0\n"		\
+				      : "+m" (*(ptr)) : "ri" (inc)	\
+				      : "memory", "cc");		\
 			break;						\
 		case __X86_CASE_L:					\
-			asm volatile (lock "xaddl %0, %1\n"		\
-				      : "+r" (__ret), "+m" (*(ptr))	\
-				      : : "memory", "cc");		\
+			asm volatile (lock "addl %1, %0\n"		\
+				      : "+m" (*(ptr)) : "ri" (inc)	\
+				      : "memory", "cc");		\
 			break;						\
 		case __X86_CASE_Q:					\
-			asm volatile (lock "xaddq %q0, %1\n"		\
-				      : "+r" (__ret), "+m" (*(ptr))	\
-				      : : "memory", "cc");		\
+			asm volatile (lock "addq %1, %0\n"		\
+				      : "+m" (*(ptr)) : "ri" (inc)	\
+				      : "memory", "cc");		\
 			break;						\
 		default:						\
-			__xadd_wrong_size();				\
+			__add_wrong_size();				\
 		}							\
 		__ret;							\
 	})
 
 /*
- * xadd() adds "inc" to "*ptr" and atomically returns the previous
- * value of "*ptr".
+ * add_*() adds "inc" to "*ptr"
  *
- * xadd() is locked when multiple CPUs are online
- * xadd_sync() is always locked
- * xadd_local() is never locked
+ * __add() takes a lock prefix
+ * add_smp() is locked when multiple CPUs are online
+ * add_sync() is always locked
  */
-#define xadd(ptr, inc)		__xadd((ptr), (inc), LOCK_PREFIX)
-#define xadd_sync(ptr, inc)	__xadd((ptr), (inc), "lock; ")
-#define xadd_local(ptr, inc)	__xadd((ptr), (inc), "")
+#define add_smp(ptr, inc)	__add((ptr), (inc), LOCK_PREFIX)
+#define add_sync(ptr, inc)	__add((ptr), (inc), "lock; ")
 
 #endif	/* ASM_X86_CMPXCHG_H */
diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h
index 972c260..a82c2bf 100644
--- a/arch/x86/include/asm/spinlock.h
+++ b/arch/x86/include/asm/spinlock.h
@@ -79,23 +79,10 @@ static __always_inline int __ticket_spin_trylock(arch_spinlock_t *lock)
 	return cmpxchg(&lock->head_tail, old.head_tail, new.head_tail) == old.head_tail;
 }
 
-#if (NR_CPUS < 256)
 static __always_inline void __ticket_spin_unlock(arch_spinlock_t *lock)
 {
-	asm volatile(UNLOCK_LOCK_PREFIX "incb %0"
-		     : "+m" (lock->head_tail)
-		     :
-		     : "memory", "cc");
+	__add(&lock->tickets.head, 1, UNLOCK_LOCK_PREFIX);
 }
-#else
-static __always_inline void __ticket_spin_unlock(arch_spinlock_t *lock)
-{
-	asm volatile(UNLOCK_LOCK_PREFIX "incw %0"
-		     : "+m" (lock->head_tail)
-		     :
-		     : "memory", "cc");
-}
-#endif
 
 static inline int __ticket_spin_is_locked(arch_spinlock_t *lock)
 {



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 18:42:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 18:42:58 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNy7t-0004Av-Sa; Tue, 08 Nov 2011 18:42:57 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNy6o-0003yH-E0
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 18:41:51 -0800
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320806481!51981123!1
X-Originating-IP: [134.134.136.24]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16884 invoked from network); 9 Nov 2011 02:41:21 -0000
Received: from mga09.intel.com (HELO mga09.intel.com) (134.134.136.24)
	by server-9.tower-27.messagelabs.com with SMTP;
	9 Nov 2011 02:41:21 -0000
Received: from orsmga001.jf.intel.com ([10.7.209.18])
	by orsmga102.jf.intel.com with ESMTP; 08 Nov 2011 18:41:45 -0800
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.67,352,1309762800"; d="scan'208";a="72644302"
Received: from orsmsx602.amr.corp.intel.com ([10.22.226.211])
	by orsmga001.jf.intel.com with ESMTP; 08 Nov 2011 18:41:45 -0800
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx602.amr.corp.intel.com ([10.22.226.211]) with mapi;
	Tue, 8 Nov 2011 18:41:45 -0800
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: Jean Guyader <jean.guyader@eu.citrix.com>
Date: Tue, 8 Nov 2011 18:41:43 -0800
Thread-Topic: [PATCH 1/6] vtd: Refactor iotlb flush code
Thread-Index: Acyd6f7EAS5GJ2oGTlGzSFmV66xijgAnlrmQ
Message-ID: <987664A83D2D224EAE907B061CE93D53021196C476@orsmsx505.amr.corp.intel.com>
References: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
	<987664A83D2D224EAE907B061CE93D530206CE00D0@orsmsx505.amr.corp.intel.com>
	<20111108074225.GA7257@spongy.cam.xci-test.com>
In-Reply-To: <20111108074225.GA7257@spongy.cam.xci-test.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Tim \(Xen.org\)" <tim@xen.org>, Jean Guyader <Jean.Guyader@citrix.com>
Subject: [Xen-devel] RE: [PATCH 1/6] vtd: Refactor iotlb flush code
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Jean,

Page 122 of VT-d spec indicates you can invalidate multiple pages by settin=
g the Address Mask (AM) field.  Will this achieve what you wanted to do?

http://download.intel.com/technology/computing/vptech/Intel(r)_VT_for_Direc=
t_IO.pdf

Allen

-----Original Message-----
From: Jean Guyader [mailto:jean.guyader@eu.citrix.com]=20
Sent: Monday, November 07, 2011 11:42 PM
To: Kay, Allen M
Cc: Jean Guyader; xen-devel@lists.xensource.com; Tim (Xen.org)
Subject: Re: [PATCH 1/6] vtd: Refactor iotlb flush code


Allen,

You are probably talking about __intel_iommu_iotlb_flush.
This function takes a range of address to flush. I haven't found a function=
 in the vtd code to invalidate a range on address without doing a loop of f=
lush_iotlb_psi, so I thought that the most efficient and quick way to flush=
 a range would be to use a domain selective invalidation.

Jean

On 08/11 03:10, Kay, Allen M wrote:
> Jean,
>=20
> The original code does not call iommu_flush_iotlb_dsi().  What is the rea=
son the refractored code need to use domain selective invalidation?
>=20
> Allen
> -----
>=20
> +        if ( page_count > 1 || gfn =3D=3D -1 )
> +        {
> +            if ( iommu_flush_iotlb_dsi(iommu, iommu_domid,
> +                        0, flush_dev_iotlb) )
> +                iommu_flush_write_buffer(iommu);
> +        }
> +        else
> +        {
> +            if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
> +                        (paddr_t)gfn << PAGE_SHIFT_4K, 0,
> +                        !dma_old_pte_present, flush_dev_iotlb) )
> +                iommu_flush_write_buffer(iommu);
>=20
> -----Original Message-----
> From: Jean Guyader [mailto:jean.guyader@eu.citrix.com]
> Sent: Monday, November 07, 2011 10:25 AM
> To: xen-devel@lists.xensource.com
> Cc: tim@xen.org; Kay, Allen M; Jean Guyader
> Subject: [PATCH 1/6] vtd: Refactor iotlb flush code
>=20
>=20
> Factorize the iotlb flush code from map_page and unmap_page into it's own=
 function.
>=20
> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> ---
>  xen/drivers/passthrough/vtd/iommu.c |   86 +++++++++++++++++------------=
-----
>  1 files changed, 43 insertions(+), 43 deletions(-)
>=20

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 18:51:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 18:51:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNyFq-0004fA-Jk; Tue, 08 Nov 2011 18:51:10 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNyFF-0004St-QL
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 18:50:34 -0800
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1320807029!805469!1
X-Originating-IP: [192.55.52.93]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9403 invoked from network); 9 Nov 2011 02:50:30 -0000
Received: from mga11.intel.com (HELO mga11.intel.com) (192.55.52.93)
	by server-12.tower-174.messagelabs.com with SMTP;
	9 Nov 2011 02:50:30 -0000
Received: from fmsmga002.fm.intel.com ([10.253.24.26])
	by fmsmga102.fm.intel.com with ESMTP; 08 Nov 2011 18:50:29 -0800
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.69,480,1315206000"; d="scan'208";a="87735623"
Received: from orsmsx603.amr.corp.intel.com ([10.22.226.49])
	by fmsmga002.fm.intel.com with ESMTP; 08 Nov 2011 18:50:29 -0800
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx603.amr.corp.intel.com ([10.22.226.49]) with mapi; Tue, 8 Nov 2011
	18:50:29 -0800
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: Jean Guyader <jean.guyader@eu.citrix.com>
Date: Tue, 8 Nov 2011 18:50:26 -0800
Thread-Topic: [PATCH 1/6] vtd: Refactor iotlb flush code
Thread-Index: Acyd6f7EAS5GJ2oGTlGzSFmV66xijgAnlrmQAABl5LA=
Message-ID: <987664A83D2D224EAE907B061CE93D53021196C47C@orsmsx505.amr.corp.intel.com>
References: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
	<987664A83D2D224EAE907B061CE93D530206CE00D0@orsmsx505.amr.corp.intel.com>
	<20111108074225.GA7257@spongy.cam.xci-test.com> 
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Tim \(Xen.org\)" <tim@xen.org>, Jean Guyader <Jean.Guyader@citrix.com>
Subject: [Xen-devel] RE: [PATCH 1/6] vtd: Refactor iotlb flush code
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

The fourth parameter, currently 0,  is supposed to be the AM field.  It is =
named order now.

+            if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
+                        (paddr_t)gfn << PAGE_SHIFT_4K, 0,
+                        !dma_old_pte_present, flush_dev_iotlb) )

-----Original Message-----
From: Kay, Allen M=20
Sent: Tuesday, November 08, 2011 6:42 PM
To: 'Jean Guyader'
Cc: Jean Guyader; xen-devel@lists.xensource.com; Tim (Xen.org)
Subject: RE: [PATCH 1/6] vtd: Refactor iotlb flush code

Jean,

Page 122 of VT-d spec indicates you can invalidate multiple pages by settin=
g the Address Mask (AM) field.  Will this achieve what you wanted to do?

http://download.intel.com/technology/computing/vptech/Intel(r)_VT_for_Direc=
t_IO.pdf

Allen

-----Original Message-----
From: Jean Guyader [mailto:jean.guyader@eu.citrix.com]=20
Sent: Monday, November 07, 2011 11:42 PM
To: Kay, Allen M
Cc: Jean Guyader; xen-devel@lists.xensource.com; Tim (Xen.org)
Subject: Re: [PATCH 1/6] vtd: Refactor iotlb flush code


Allen,

You are probably talking about __intel_iommu_iotlb_flush.
This function takes a range of address to flush. I haven't found a function=
 in the vtd code to invalidate a range on address without doing a loop of f=
lush_iotlb_psi, so I thought that the most efficient and quick way to flush=
 a range would be to use a domain selective invalidation.

Jean

On 08/11 03:10, Kay, Allen M wrote:
> Jean,
>=20
> The original code does not call iommu_flush_iotlb_dsi().  What is the rea=
son the refractored code need to use domain selective invalidation?
>=20
> Allen
> -----
>=20
> +        if ( page_count > 1 || gfn =3D=3D -1 )
> +        {
> +            if ( iommu_flush_iotlb_dsi(iommu, iommu_domid,
> +                        0, flush_dev_iotlb) )
> +                iommu_flush_write_buffer(iommu);
> +        }
> +        else
> +        {
> +            if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
> +                        (paddr_t)gfn << PAGE_SHIFT_4K, 0,
> +                        !dma_old_pte_present, flush_dev_iotlb) )
> +                iommu_flush_write_buffer(iommu);
>=20
> -----Original Message-----
> From: Jean Guyader [mailto:jean.guyader@eu.citrix.com]
> Sent: Monday, November 07, 2011 10:25 AM
> To: xen-devel@lists.xensource.com
> Cc: tim@xen.org; Kay, Allen M; Jean Guyader
> Subject: [PATCH 1/6] vtd: Refactor iotlb flush code
>=20
>=20
> Factorize the iotlb flush code from map_page and unmap_page into it's own=
 function.
>=20
> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> ---
>  xen/drivers/passthrough/vtd/iommu.c |   86 +++++++++++++++++------------=
-----
>  1 files changed, 43 insertions(+), 43 deletions(-)
>=20

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 19:03:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 19:03:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNyRP-0005Dz-Sl; Tue, 08 Nov 2011 19:03:09 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNyMz-0004xL-TD
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 18:58:39 -0800
X-Env-Sender: haitao.shan@intel.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1320807505!799261!1
X-Originating-IP: [134.134.136.20]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29260 invoked from network); 9 Nov 2011 02:58:26 -0000
Received: from mga02.intel.com (HELO mga02.intel.com) (134.134.136.20)
	by server-13.tower-174.messagelabs.com with SMTP;
	9 Nov 2011 02:58:26 -0000
Received: from orsmga001.jf.intel.com ([10.7.209.18])
	by orsmga101.jf.intel.com with ESMTP; 08 Nov 2011 18:58:24 -0800
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.67,352,1309762800"; 
	d="p7s'?scan'208";a="72647919"
Received: from pgsmsx601.gar.corp.intel.com ([10.221.43.69])
	by orsmga001.jf.intel.com with ESMTP; 08 Nov 2011 18:58:23 -0800
Received: from shsmsx602.ccr.corp.intel.com (10.239.4.104) by
	pgsmsx601.gar.corp.intel.com (10.221.43.69) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Wed, 9 Nov 2011 10:56:58 +0800
Received: from shsmsx502.ccr.corp.intel.com ([10.239.4.96]) by
	SHSMSX602.ccr.corp.intel.com ([10.239.4.104]) with mapi; Wed, 9 Nov 2011
	10:56:53 +0800
From: "Shan, Haitao" <haitao.shan@intel.com>
To: Jan Beulich <JBeulich@suse.com>, Haitao Shan <maillists.shan@gmail.com>
Date: Wed, 9 Nov 2011 10:56:52 +0800
Thread-Topic: Ping#2: [PATCH] VMX: extend last branch MSR info to cover
	newer CPU models
Thread-Index: AcyaClpDPvRyAxnPSNG9C1PhyAYwxgEgE2ag
Message-ID: <04F972F38B3C4E4E91C4697DA8BF9F527E41C1F0DD@shsmsx502.ccr.corp.intel.com>
References: <4EB26BB1020000780005EA78@nat28.tlf.novell.com>
In-Reply-To: <4EB26BB1020000780005EA78@nat28.tlf.novell.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: yes
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Keir Fraser <keir@xen.org>, "Nakajima,
	Jun" <jun.nakajima@intel.com>, "Dugger,
	Donald D" <donald.d.dugger@intel.com>
Subject: [Xen-devel] RE: Ping#2: [PATCH] VMX: extend last branch MSR info to
	cover newer CPU models
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0971514047=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0971514047==
Content-Language: en-US
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature";
	micalg=SHA1; boundary="----=_NextPart_000_00B9_01CC9ECE.49CBDB10"

------=_NextPart_000_00B9_01CC9ECE.49CBDB10
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: 7bit

Hi, Jan,

I found one useful document in intel website.
http://software.intel.com/en-us/articles/intel-processor-identification-with
-cpuid-model-and-family-numbers/
>From the doc, it seems model 45 is not in the list.

Shan Haitao

> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@suse.com]
> Sent: Thursday, November 03, 2011 5:24 PM
> To: Haitao Shan; Shan, Haitao
> Cc: Dugger, Donald D; Nakajima, Jun; xen-devel@lists.xensource.com; Keir
> Fraser
> Subject: Ping#2: [PATCH] VMX: extend last branch MSR info to cover newer
> CPU models
> 
> VMX: extend last branch MSR info to cover newer CPU models #2
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> 
> --- a/xen/arch/x86/hvm/vmx/vmx.c
> +++ b/xen/arch/x86/hvm/vmx/vmx.c
> @@ -1738,10 +1738,9 @@ static const struct lbr_info *last_branc
>          case 23:
>              return c2_lbr;
>              break;
> -        /* Nehalem */
> -        case 26: case 30: case 31: case 46:
> -        /* Sandy Bridge */
> -        case 42: case 45:
> +        /* Nehalem/Sandy Bridge */
> +        case 26: case 30: case 31: case 37:
> +        case 42: case 44: case 45: case 46: case 47:
>              return nh_lbr;
>              break;
>          /* Atom */
> 
> 


------=_NextPart_000_00B9_01CC9ECE.49CBDB10
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"

MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIYUDCCAyAw
ggKJoAMCAQICBDXe9M8wDQYJKoZIhvcNAQEFBQAwTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0Vx
dWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw05
ODA4MjIxNjQxNTFaFw0xODA4MjIxNjQxNTFaME4xCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdFcXVp
ZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwgZ8wDQYJ
KoZIhvcNAQEBBQADgY0AMIGJAoGBAMFdsVhnCGLuoJotHwhtkRRomAoe/toEbxOEYiHD0XzOnwXg
uAHwTjTs4oqVBGSs8WtTXwWzy2eAv0ICjv7dAQns4QAUT/z78AzdQ7pbK+EfgHCZFVeTFvEPl2q3
wmgjHMxNWTCsUR47ryvW7mNFe8XZX1DS41APOojnvxT94Me5AgMBAAGjggEJMIIBBTBwBgNVHR8E
aTBnMGWgY6BhpF8wXTELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTENMAsGA1UEAxMEQ1JMMTAaBgNVHRAE
EzARgQ8yMDE4MDgyMjE2NDE1MVowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFEjmaPkr0rKV10fY
IyAQTzOYkJ/UMB0GA1UdDgQWBBRI5mj5K9KylddH2CMgEE8zmJCf1DAMBgNVHRMEBTADAQH/MBoG
CSqGSIb2fQdBAAQNMAsbBVYzLjBjAwIGwDANBgkqhkiG9w0BAQUFAAOBgQBYzinq/Pfetc4CuRe1
hdG54+CVzCUxDQCmkm5/tpJjnlCV0Zpv5BHeY4VumO6o/1rI01WyZnFX3sAh6z0qpyNJAQSGQnv8
7n+iFlK1Z2fTQNs7JliyKHc9rhR3Ydb6KmYnoA36p3Nc6nDxlCFlRF/6/O8paKmih3nvee9PrAd3
ODCCAz0wggKmoAMCAQICAwWw/zANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
MB4XDTA2MDIxNjE4MDEzMFoXDTE2MDIxOTE4MDEzMFowUjELMAkGA1UEBhMCVVMxGjAYBgNVBAoT
EUludGVsIENvcnBvcmF0aW9uMScwJQYDVQQDEx5JbnRlbCBFeHRlcm5hbCBCYXNpYyBQb2xpY3kg
Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBpd/XOb9QVqEZ8mQ1042TdOIq3ATD
IsV2xDyt30yLyMR5Wjtus0bn3B+he89BiNO/LP6+rFzEwlD55PlX+HLGIKeNNG97dqyc30FElEUj
ZzTZFq2N4e3kVJ/XAEEgANzV8v9qp7qWwxugPgfc3z9BkYot+CifozexHLb/hEZj+yISCU61kRZv
uSQ0E11yYL4dRgcglJeaHo3oX57rvIckaLsYV5/1Aj+R8DM1Ppk965XQAKsHfnyT7C4S50T4lVn4
lz36wOdNZn/zegG1zp41lnoTFfT4KuKVJH5x7YD1p6KbgJCKLovnujGuohquBNfdXKpZkvz6pGv+
iC1HawJdAgMBAAGjgaAwgZ0wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQaxgxKxEdvqNutK/D0
Vgaj7TdUDDA6BgNVHR8EMzAxMC+gLaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3Nl
Y3VyZWNhLmNybDAfBgNVHSMEGDAWgBRI5mj5K9KylddH2CMgEE8zmJCf1DAPBgNVHRMBAf8EBTAD
AQH/MA0GCSqGSIb3DQEBBQUAA4GBABMQOK2kVKVIlUWwLTdywJ+e2O+PC/uQltK2F3lRyrPfBn69
tOkIP4SgDJOfsxyobIrPLe75kBLw+Dom13OBDp/EMZJZ1CglQfVV8co9mT3aZMjSGGQiMgkJLR3j
Mfr900fXZKj5XeqCJ+JP0mEhJGEdVCY+FFlksJjV86fDrq1QMIIFijCCBHKgAwIBAgIKYSCKYgAA
AAAACDANBgkqhkiG9w0BAQUFADBSMQswCQYDVQQGEwJVUzEaMBgGA1UEChMRSW50ZWwgQ29ycG9y
YXRpb24xJzAlBgNVBAMTHkludGVsIEV4dGVybmFsIEJhc2ljIFBvbGljeSBDQTAeFw0wOTA1MTUx
OTI3MjZaFw0xNTA1MTUxOTM3MjZaMFYxCzAJBgNVBAYTAlVTMRowGAYDVQQKExFJbnRlbCBDb3Jw
b3JhdGlvbjErMCkGA1UEAxMiSW50ZWwgRXh0ZXJuYWwgQmFzaWMgSXNzdWluZyBDQSAzQjCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKQEM1Wn9TU9vc9C+/Tc7KB+eiYElmrcEWE32WUd
HvWG+IcQHVQsikTmMyKKojNLw2B5s6Iekc8ivDo/wCfjZzX9JyftMnc+AArc0la87Olybzm8K9jX
EfTBvTnUSFSiI9ZYefITdiUgqlAFuljFZEHYKYtLuhrRacpmQfP4mV63NKdc2bT804HRf6YptZFa
4k6YN94zlrGNrBuQQ74WFzz/jLBusbUpEkro6Mu/ZYFOFWQrV9lBhF9Ruk8yN+3N6n9fUo/qBigi
F2kEn9xVh1ykl7SCGL2jBUkXx4qgV27a6Si8lRRdgrHGtN/HWnSWlLXTH5l575H4Lq++77OFv38C
AwEAAaOCAlwwggJYMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFA7GKvdZsggQkCVvw939imYx
MCvFMAsGA1UdDwQEAwIBhjASBgkrBgEEAYI3FQEEBQIDAQABMCMGCSsGAQQBgjcVAgQWBBQ5oFY2
ekKQ/5Ktim+VdMeSWb4QWTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAfBgNVHSMEGDAWgBQa
xgxKxEdvqNutK/D0Vgaj7TdUDDCBvQYDVR0fBIG1MIGyMIGvoIGsoIGphk5odHRwOi8vd3d3Lmlu
dGVsLmNvbS9yZXBvc2l0b3J5L0NSTC9JbnRlbCUyMEV4dGVybmFsJTIwQmFzaWMlMjBQb2xpY3kl
MjBDQS5jcmyGV2h0dHA6Ly9jZXJ0aWZpY2F0ZXMuaW50ZWwuY29tL3JlcG9zaXRvcnkvQ1JML0lu
dGVsJTIwRXh0ZXJuYWwlMjBCYXNpYyUyMFBvbGljeSUyMENBLmNybDCB4wYIKwYBBQUHAQEEgdYw
gdMwYwYIKwYBBQUHMAKGV2h0dHA6Ly93d3cuaW50ZWwuY29tL3JlcG9zaXRvcnkvY2VydGlmaWNh
dGVzL0ludGVsJTIwRXh0ZXJuYWwlMjBCYXNpYyUyMFBvbGljeSUyMENBLmNydDBsBggrBgEFBQcw
AoZgaHR0cDovL2NlcnRpZmljYXRlcy5pbnRlbC5jb20vcmVwb3NpdG9yeS9jZXJ0aWZpY2F0ZXMv
SW50ZWwlMjBFeHRlcm5hbCUyMEJhc2ljJTIwUG9saWN5JTIwQ0EuY3J0MA0GCSqGSIb3DQEBBQUA
A4IBAQCxtQEHchVQhXyjEqtMVUMe6gkmPsIczHxSeqNbo9dsD+6xbT65JT+oYgpIAtfEsYXeUJu1
cChqpb22U5bMAz7eaQcW5bzefufWvA6lg2048B8oczBj/q+5P5NpYrUO8jOmN4jTjfJq3ElZ7yFW
py7rB3Vm/aN6ATYqWfMbS/xfh+JCxmH3droUmMJI0/aZJHsLtjbjFnNsHDNrJZX1vxlM78Lb1hjs
kTENPmhbVbfTj5i/ZGnhv4tmI8QZPCNtcegXJrfhRl2D9bWpdTOPrWiLDUqzy1Z6KL7TcOS/PCl8
RHCJXkPau/thTQCpIoDa2+c+3XA++gRTfAQ4svTO260NMIIGBzCCBO+gAwIBAgIKEx06gQABAAB7
rTANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJVUzEaMBgGA1UEChMRSW50ZWwgQ29ycG9yYXRp
b24xKzApBgNVBAMTIkludGVsIEV4dGVybmFsIEJhc2ljIElzc3VpbmcgQ0EgM0IwHhcNMTExMDEy
MDEyNDIwWhcNMTQwOTI2MDEyNDIwWjA9MRUwEwYDVQQDEwxTaGFuLCBIYWl0YW8xJDAiBgkqhkiG
9w0BCQEWFWhhaXRhby5zaGFuQGludGVsLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBALpHYbXkMy06K6Pl9IGxbsKl0zT/OYd523Rh3CX7tHG/80ZGcPeLlzFK+l+30Fhpzf8fsFwG
l5fX2pRtWqT96BUWecXEVJhisfa1Wrq7DBC6coxEnExFADU+2UsBQ/ACKFSCiq/fADojyFWJgPKv
4PLDKJ9LU23Q+g1WRruGHfBnhCMv0KxnkE7pTk3cFRXtNUSUnYLqcvrZwt9VogQNiNNw3jMlDb8t
bJjMsXdhrwqFGW49z/gAJ2Mnr6/lNnqBdcKF2Qm28SfYXRohGrmam3KReM49ZG0+J/+JPF5drbiw
UAV++PMHA3IXIvZF2c66jQM5BzbF93SkoZXmrQZA2jMCAwEAAaOCAu4wggLqMAsGA1UdDwQEAwIH
gDA8BgkrBgEEAYI3FQcELzAtBiUrBgEEAYI3FQiGw4x1hJnlUYP9gSiFjp9TgpHACWeB3r05lfBD
AgFkAgEIMB0GA1UdDgQWBBQ/OInBCgrko9ziRWiEhjM+SyeeoDAfBgNVHSMEGDAWgBQOxir3WbII
EJAlb8Pd/YpmMTArxTCBzwYDVR0fBIHHMIHEMIHBoIG+oIG7hldodHRwOi8vd3d3LmludGVsLmNv
bS9yZXBvc2l0b3J5L0NSTC9JbnRlbCUyMEV4dGVybmFsJTIwQmFzaWMlMjBJc3N1aW5nJTIwQ0El
MjAzQigxKS5jcmyGYGh0dHA6Ly9jZXJ0aWZpY2F0ZXMuaW50ZWwuY29tL3JlcG9zaXRvcnkvQ1JM
L0ludGVsJTIwRXh0ZXJuYWwlMjBCYXNpYyUyMElzc3VpbmclMjBDQSUyMDNCKDEpLmNybDCB9QYI
KwYBBQUHAQEEgegwgeUwbAYIKwYBBQUHMAKGYGh0dHA6Ly93d3cuaW50ZWwuY29tL3JlcG9zaXRv
cnkvY2VydGlmaWNhdGVzL0ludGVsJTIwRXh0ZXJuYWwlMjBCYXNpYyUyMElzc3VpbmclMjBDQSUy
MDNCKDEpLmNydDB1BggrBgEFBQcwAoZpaHR0cDovL2NlcnRpZmljYXRlcy5pbnRlbC5jb20vcmVw
b3NpdG9yeS9jZXJ0aWZpY2F0ZXMvSW50ZWwlMjBFeHRlcm5hbCUyMEJhc2ljJTIwSXNzdWluZyUy
MENBJTIwM0IoMSkuY3J0MB8GA1UdJQQYMBYGCCsGAQUFBwMEBgorBgEEAYI3CgMMMCkGCSsGAQQB
gjcVCgQcMBowCgYIKwYBBQUHAwQwDAYKKwYBBAGCNwoDDDBHBgNVHREEQDA+oCUGCisGAQQBgjcU
AgOgFwwVaGFpdGFvLnNoYW5AaW50ZWwuY29tgRVoYWl0YW8uc2hhbkBpbnRlbC5jb20wDQYJKoZI
hvcNAQEFBQADggEBAG5Us26ruu8jKt3RhZuirjqgF61p+wZer/xV6BTABUx5++DhWXslTztavsvy
JZ5WsZ7xaijBUO3UQViWTylwmSyGwbhEwreu3XRNGlMOnRk+sH7JGiXZJIpqoD/jtRWp0ypHG2g3
nDqAQ1/j4wUgcI0b12KUJyYAeN6cwEeAqIV4mdD8GpH3DS2nZbEZjTNhkaeJuT7lO1jRqzEGOSCk
KDHPfqUtqpw+wZa6mFbzSso9swc4ypgRIl4l5i/4OwNMQazHm2O6Ov91aDJs6j3DCdALzP736hmF
QFfHWL34GFQMRdpO/OI6z/Q0VYm/6N9o4SD/s4J9Edq8zyYNQxBR03QwggZOMIIFNqADAgECAgoT
I00xAAEAAHuuMA0GCSqGSIb3DQEBBQUAMFYxCzAJBgNVBAYTAlVTMRowGAYDVQQKExFJbnRlbCBD
b3Jwb3JhdGlvbjErMCkGA1UEAxMiSW50ZWwgRXh0ZXJuYWwgQmFzaWMgSXNzdWluZyBDQSAzQjAe
Fw0xMTEwMTIwMTMwNTZaFw0xNDA5MjYwMTMwNTZaMD0xFTATBgNVBAMTDFNoYW4sIEhhaXRhbzEk
MCIGCSqGSIb3DQEJARYVaGFpdGFvLnNoYW5AaW50ZWwuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEApaOcuQtYCobUiLQTadd0Hi+U/ausgzeSE59iUrc57VUzvLsLNnKRxLPm+T26
KN9fMDAS3/MZOl5tf+9mKEwrergim5GzwJpfZWPLAyK2Gs57+F+BMgtX6DT0eh4sGQLQDahPZDhy
Ubo420AiTGuTA9/L22B/qbPNuDRNMMJoreAZeSNBSVPa7Q+Y0oXcfKpAmKzHH2Y+WAzupN5jfxhJ
6yb7MpsPDqoU0Ek4VttgUIl4AQlRFMI18ScKvAG2p9kWSSgq+Z9xdQl7F/3ASkXlQMKEOHCDw8E7
XUzqy4pOoXGaI3FVI4AerPeLgz2SkNINfqLnxdhN+BQ6iuRgsOeyIwIDAQABo4IDNTCCAzEwCwYD
VR0PBAQDAgQwMD0GCSsGAQQBgjcVBwQwMC4GJisGAQQBgjcVCIbDjHWEmeVRg/2BKIWOn1OCkcAJ
Z4S52UGHhP9OAgFkAgEMMEQGCSqGSIb3DQEJDwQ3MDUwDgYIKoZIhvcNAwICAgCAMA4GCCqGSIb3
DQMEAgIAgDAHBgUrDgMCBzAKBggqhkiG9w0DBzAdBgNVHQ4EFgQU/+6IdpvPrUveCml7StYwqL40
iqMwHwYDVR0jBBgwFoAUDsYq91myCBCQJW/D3f2KZjEwK8Uwgc8GA1UdHwSBxzCBxDCBwaCBvqCB
u4ZXaHR0cDovL3d3dy5pbnRlbC5jb20vcmVwb3NpdG9yeS9DUkwvSW50ZWwlMjBFeHRlcm5hbCUy
MEJhc2ljJTIwSXNzdWluZyUyMENBJTIwM0IoMSkuY3JshmBodHRwOi8vY2VydGlmaWNhdGVzLmlu
dGVsLmNvbS9yZXBvc2l0b3J5L0NSTC9JbnRlbCUyMEV4dGVybmFsJTIwQmFzaWMlMjBJc3N1aW5n
JTIwQ0ElMjAzQigxKS5jcmwwgfUGCCsGAQUFBwEBBIHoMIHlMGwGCCsGAQUFBzAChmBodHRwOi8v
d3d3LmludGVsLmNvbS9yZXBvc2l0b3J5L2NlcnRpZmljYXRlcy9JbnRlbCUyMEV4dGVybmFsJTIw
QmFzaWMlMjBJc3N1aW5nJTIwQ0ElMjAzQigxKS5jcnQwdQYIKwYBBQUHMAKGaWh0dHA6Ly9jZXJ0
aWZpY2F0ZXMuaW50ZWwuY29tL3JlcG9zaXRvcnkvY2VydGlmaWNhdGVzL0ludGVsJTIwRXh0ZXJu
YWwlMjBCYXNpYyUyMElzc3VpbmclMjBDQSUyMDNCKDEpLmNydDAfBgNVHSUEGDAWBggrBgEFBQcD
BAYKKwYBBAGCNwoDBDApBgkrBgEEAYI3FQoEHDAaMAoGCCsGAQUFBwMEMAwGCisGAQQBgjcKAwQw
RwYDVR0RBEAwPqAlBgorBgEEAYI3FAIDoBcMFWhhaXRhby5zaGFuQGludGVsLmNvbYEVaGFpdGFv
LnNoYW5AaW50ZWwuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQAqWvSRW8jKGuWVwUKo/+QRxKvuT3cv
/975omnwo7QeOj78XruY/Wsl6/tnzI8jgf6ZE5SRoj5sSGBHmy7qHSZNWodLuJgjN+a0Fk2hy0jB
wX2UJLS3ctijemo4e4u8/YFebLVXCzy81lWa7dZcidebnslLlcQXHNzl8hhFAfQwhcCXMAiA89NO
3uJqd9Sk/PSfG90b/f+1u2xIthxQmeh7u1yuiHZrf1u/e6rJWS50iW+LWmrH0c70XN8voHpLXVDo
09C9DETzJOUrhr1BqLVSxKjNn/uhCOcQxNYM3CYsgQBwVogKsGj59xeGFA5iWPKGRj7SfUXH0m3T
kiSaWLnWMYIDhjCCA4ICAQEwZDBWMQswCQYDVQQGEwJVUzEaMBgGA1UEChMRSW50ZWwgQ29ycG9y
YXRpb24xKzApBgNVBAMTIkludGVsIEV4dGVybmFsIEJhc2ljIElzc3VpbmcgQ0EgM0ICChMdOoEA
AQAAe60wCQYFKw4DAhoFAKCCAfcwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0B
CQUxDxcNMTExMTA5MDI1NjUyWjAjBgkqhkiG9w0BCQQxFgQU6+CS3lbdjC4VqUrRc/F616v8D7ow
cwYJKwYBBAGCNxAEMWYwZDBWMQswCQYDVQQGEwJVUzEaMBgGA1UEChMRSW50ZWwgQ29ycG9yYXRp
b24xKzApBgNVBAMTIkludGVsIEV4dGVybmFsIEJhc2ljIElzc3VpbmcgQ0EgM0ICChMjTTEAAQAA
e64wdQYLKoZIhvcNAQkQAgsxZqBkMFYxCzAJBgNVBAYTAlVTMRowGAYDVQQKExFJbnRlbCBDb3Jw
b3JhdGlvbjErMCkGA1UEAxMiSW50ZWwgRXh0ZXJuYWwgQmFzaWMgSXNzdWluZyBDQSAzQgIKEyNN
MQABAAB7rjCBqwYJKoZIhvcNAQkPMYGdMIGaMAoGCCqGSIb3DQMHMAsGCWCGSAFlAwQBKjALBglg
hkgBZQMEARYwCwYJYIZIAWUDBAECMA4GCCqGSIb3DQMCAgIAgDAHBgUrDgMCBzANBggqhkiG9w0D
AgIBQDANBggqhkiG9w0DAgIBKDAHBgUrDgMCGjALBglghkgBZQMEAgMwCwYJYIZIAWUDBAICMAsG
CWCGSAFlAwQCATANBgkqhkiG9w0BAQEFAASCAQApmK6qhBITLu0qt3Buc6QdvcbKhj6GgCB6LENC
rK0rB2sitTLQ8MjuKmiqIn5qbPQMD10qsDzOghcwnFG2tksUyFswTNCtDlOC9F+yKEHvb7sKG+So
A2TNv8gpNEN8Xf8Qs2u2+UoqrxJc4ZdWGsy3QXbzLt5ch56VETvOM8dCMmjlHPFtfeIoUu2/wZhZ
WUyRIU3c+S23MLT8NCIv/nAcyMh3KFWIZQs6eVWJyEHd8z4aWZkjM9JfdyMHqF13nF2QiZYMv8BD
TV6Nx52KtpyYWXKoUAQ2O568LYSZ/d/e1RBA7EcLnIPdYKYsLlO7sEgsJTParT62WZsbghOyoHUm
AAAAAAAA

------=_NextPart_000_00B9_01CC9ECE.49CBDB10--


--===============0971514047==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0971514047==--


From xen-devel-bounces@lists.xensource.com Tue Nov 08 19:39:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 19:39:12 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNz0K-0006sA-4x; Tue, 08 Nov 2011 19:39:12 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNyxo-00067c-T9
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 19:36:37 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1320809793!3411187!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8424 invoked from network); 9 Nov 2011 03:36:33 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 03:36:33 -0000
X-IronPort-AV: E=Sophos;i="4.69,481,1315180800"; 
   d="scan'208";a="8829268"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 03:36:32 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 03:36:32 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RNyxk-0006qd-AB;
	Wed, 09 Nov 2011 03:36:32 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RNyxk-00011l-8r;
	Wed, 09 Nov 2011 03:36:32 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9733-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 9 Nov 2011 03:36:32 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9733: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9733 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9733/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 build-amd64-oldkern           2 host-install(2)              broken
 build-amd64-pvops             2 host-install(2)              broken
 build-amd64                   2 host-install(2)              broken

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pv            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pair          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  fb1b32c9d03d
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Jean Guyader <jean.guyader@eu.citrix.com>
  Juergen Gross <juergen.gross@ts.fujitsu.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  Tim Deegan <tim@xen.org>
  Wei Wang <wei.wang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  broken  
 build-i386                                                   pass    
 build-amd64-oldkern                                          broken  
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           blocked 
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 blocked 
 test-amd64-i386-xl-credit2                                   blocked 
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               blocked 
 test-amd64-i386-xl-multivcpu                                 blocked 
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         blocked 
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           blocked 
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   blocked 
 test-amd64-i386-xl-win-vcpus1                                blocked 
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          blocked 
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

(No revision log; it would be 557 lines long.)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 19:40:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 19:40:29 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNz1Z-0007Fi-Hc; Tue, 08 Nov 2011 19:40:29 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNyzD-0006UM-Dd
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 19:38:03 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-15.tower-21.messagelabs.com!1320809879!3436979!1
X-Originating-IP: [208.97.132.5]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2145 invoked from network); 9 Nov 2011 03:38:00 -0000
Received: from mailbigip.dreamhost.com (HELO homiemail-a75.g.dreamhost.com)
	(208.97.132.5) by server-15.tower-21.messagelabs.com with SMTP;
	9 Nov 2011 03:38:00 -0000
Received: from homiemail-a75.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a75.g.dreamhost.com (Postfix) with ESMTP id 137985EC07E;
	Tue,  8 Nov 2011 19:37:59 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:reply-to
	:mime-version:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.org; b=cD02bepAOpRgq1jKtI3n7/3H8j5mpcJG3+6de7e53Fbr
	vK8BoMTJa70uCIiV+fWoG+qNJoAagq/HA4P4svUPR74JKDtS++h7gXDo/EIPoBVc
	baxpi03Wql+fNgcDzcF8gAJdhmsZp7PPgINJFdyT5JxhzzupMQP2G7xMSFfuRpg=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:reply-to:mime-version:content-type:content-transfer-encoding;
	s=lagarcavilla.org; bh=M0Xmpt612BSWfhWBMic1y0EEjFo=; b=qYxwYADB
	RkPpxrGHtwKYRRGpKYboKws3irRhdOgOT/Vo+ak8mgGm9u/GFgD+sc67yYJbS0m4
	GYUWBOuikDH4LaHFBipVmGfxMht/sd009nKbIRgwOBX+j0/t1W8kPsr69TdnXmfZ
	SP+enaS1xjLqtftPFjhhtifrkQueh8rAjsM=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a75.g.dreamhost.com (Postfix) with ESMTPA id D49865EC07C; 
	Tue,  8 Nov 2011 19:37:58 -0800 (PST)
Received: from 99.255.91.65 (proxying for 99.255.91.65)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP; Tue, 8 Nov 2011 19:37:59 -0800
Message-ID: <c51adac89cc2096d54a7347c1accb18e.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <20111108214540.EAEBB72C4A1@homiemail-mx8.g.dreamhost.com>
References: <20111108214540.EAEBB72C4A1@homiemail-mx8.g.dreamhost.com>
Date: Tue, 8 Nov 2011 19:37:59 -0800
From: "Andres Lagar-Cavilla" <andres@lagarcavilla.org>
To: olaf@aepfle.de
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: Need help with fixing the Xen waitqueue feature
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: andres@lagarcavilla.org
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Olaf,
are waitqueue's on the mem-event ring meant to be the way to deal with
ring exhaustion? i.e. is this meant to go beyond a testing vehicle for
waitqueue's?

With the pager itself generating events, and foreign mappings generating
events, you'll end up putting dom0 vcpu's in a waitqueue. This will
basically deadlock the host.

Am I missing something here?
Andres

> Date: Tue, 8 Nov 2011 22:20:24 +0100
> From: Olaf Hering <olaf@aepfle.de>
> Subject: [Xen-devel] Need help with fixing the Xen waitqueue feature
> To: xen-devel@lists.xensource.com
> Message-ID: <20111108212024.GA5276@aepfle.de>
> Content-Type: text/plain; charset=3Dutf-8
>
>
> The patch 'mem_event: use wait queue when ring is full' I just sent out
> makes use of the waitqueue feature. There are two issues I get with the
> change applied:
>
> I think I got the logic right, and in my testing vcpu->pause_count drop=
s
> to zero in p2m_mem_paging_resume(). But for some reason the vcpu does
> not make progress after the first wakeup. In my debugging there is one
> wakeup, the ring is still full, but further wakeups dont happen.
> The fully decoded xentrace output may provide some hints about the
> underlying issue. But its hard to get due to the second issue.
>
> Another thing is that sometimes the host suddenly reboots without any
> message. I think the reason for this is that a vcpu whose stack was put
> aside and that was later resumed may find itself on another physical
> cpu. And if that happens, wouldnt that invalidate some of the local
> variables back in the callchain? If some of them point to the old
> physical cpu, how could this be fixed? Perhaps a few "volatiles" are
> needed in some places.
>
> I will check wether pinning the guests vcpus to physical cpus actually
> avoids the sudden reboots.
>
> Olaf
>


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 19:53:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 19:53:03 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RNzDj-0007p6-L1; Tue, 08 Nov 2011 19:53:03 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNzDI-0007cP-CC
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 19:52:36 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320810719!45147063!1
X-Originating-IP: [208.97.132.81]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23219 invoked from network); 9 Nov 2011 03:51:59 -0000
Received: from caiajhbdcaib.dreamhost.com (HELO homiemail-a20.g.dreamhost.com)
	(208.97.132.81) by server-3.tower-27.messagelabs.com with SMTP;
	9 Nov 2011 03:51:59 -0000
Received: from homiemail-a20.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a20.g.dreamhost.com (Postfix) with ESMTP id E05777EC069;
	Tue,  8 Nov 2011 19:52:31 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:reply-to
	:mime-version:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.org; b=HW60HBAjPi84t/0/9Wc0td4sisww61Ka265EKUBXKTsG
	Tnq96nirJy+zj0Fwatfe+oVH3C6K6gamg3x2PfyLIT0S+mmvavH4ywsScu3oswGI
	kWocWu6QTvguYY4+OTk9N92aFiy56zKy77y0LA7gsQJRPXzdRJ+rJISWTYSvQ9s=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:reply-to:mime-version:content-type:content-transfer-encoding;
	s=lagarcavilla.org; bh=b6dtQ0DfcYHqze6G4OtBFtbhd6g=; b=tVXQyTZG
	gjyFOgQevqEYZHjP5UtihmOfelOc7GAzvuKj32xk7J4UX+gXq5rBve+dXPfn8hBy
	YYuadgyUUSZGoqZHCzMTDWSTaVP7bEe12CqFEievpVJ5N2+RGb9cw2iHhUWhLiQJ
	xpYlpmIJn4yoVxqz8XbfZ+qj+RmXPQa3320=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a20.g.dreamhost.com (Postfix) with ESMTPA id AAA797EC065; 
	Tue,  8 Nov 2011 19:52:31 -0800 (PST)
Received: from 99.255.91.65 (proxying for 99.255.91.65)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP; Tue, 8 Nov 2011 19:52:31 -0800
Message-ID: <3c097da8e49a42af1210e4ffcd39fd48.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <20111108224414.83985CF73A@homiemail-mx7.g.dreamhost.com>
References: <20111108224414.83985CF73A@homiemail-mx7.g.dreamhost.com>
Date: Tue, 8 Nov 2011 19:52:31 -0800
From: "Andres Lagar-Cavilla" <andres@lagarcavilla.org>
To: keir.xen@gmail.com
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: Need help with fixing the Xen waitqueue feature
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: andres@lagarcavilla.org
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> Date: Tue, 08 Nov 2011 22:05:41 +0000
> From: Keir Fraser <keir.xen@gmail.com>
> Subject: Re: [Xen-devel] Need help with fixing the Xen waitqueue
> 	feature
> To: Olaf Hering <olaf@aepfle.de>,	<xen-devel@lists.xensource.com>
> Message-ID: <CADF5835.245E1%keir.xen@gmail.com>
> Content-Type: text/plain;	charset=3D"US-ASCII"
>
> On 08/11/2011 21:20, "Olaf Hering" <olaf@aepfle.de> wrote:
>
>> Another thing is that sometimes the host suddenly reboots without any
>> message. I think the reason for this is that a vcpu whose stack was pu=
t
>> aside and that was later resumed may find itself on another physical
>> cpu. And if that happens, wouldnt that invalidate some of the local
>> variables back in the callchain? If some of them point to the old
>> physical cpu, how could this be fixed? Perhaps a few "volatiles" are
>> needed in some places.
>
>>From how many call sites can we end up on a wait queue? I know we were
>> going
> to end up with a small and explicit number (e.g., in __hvm_copy()) but
> does
> this patch make it a more generally-used mechanism? There will unavoida=
bly
> be many constraints on callers who want to be able to yield the cpu. We
> can
> add Linux-style get_cpu/put_cpu abstractions to catch some of them.
> Actually
> I don't think it's *that* common that hypercall contexts cache things l=
ike
> per-cpu pointers. But every caller will need auditing, I expect.

Tbh, for paging to be effective, we need to be prepared to yield on every
p2m lookup.

Let's compare paging to PoD. They're essentially the same thing: pages
disappear, and get allocated on the fly when you need them. PoD is a
highly optimized in-hypervisor optimization that does not need a
user-space helper -- but the pager could do PoD easily and remove all tha=
t
p2m-pod.c code from the hypervisor.

PoD only introduces extraneous side-effects when there is a complete
absence of memory to allocate pages. The same cannot be said of paging, t=
o
put it mildly. It returns EINVAL all over the place. Right now, qemu can
be crashed in a blink by paging out the right gfn.

To get paging to where PoD is, all these situations need to be handled in
a manner other than returning EINVAL. That means putting the vcpu on a
waitqueue on every location p2m_pod_demand_populate is called, not just
__hvm_copy.

I don't know that that's gonna be altogether doable. Many of these gfn
lookups happen in atomic contexts, not to mention cpu-specific pointers.
But at least we should aim for that.

Andres
>
> A sudden reboot is very extreme. No message even on a serial line? That
> most
> commonly indicates bad page tables. Most other bugs you'd at least get =
a
> double fault message.
>
>  -- Keir
>


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 23:03:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 23:03:29 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO2C1-000433-17; Tue, 08 Nov 2011 23:03:29 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO2BI-0003qd-3M
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 23:02:44 -0800
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-5.tower-21.messagelabs.com!1320822160!1895058!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 478 invoked from network); 9 Nov 2011 07:02:40 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-5.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 07:02:40 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320822159; l=657;
	s=domk; d=aepfle.de;
	h=In-Reply-To:Content-Type:MIME-Version:References:Subject:Cc:To:From:
	Date:X-RZG-CLASS-ID:X-RZG-AUTH;
	bh=aTqynNdYlc6+PuQpnPI7g4yLBUc=;
	b=uVtzICbv4g9bxUmUCwNhQdBKJZl/YNhUpOwMkDGqjFWFOuEmFY03Hcfm3V64xQi3y8S
	Gz/r7xds5HhWJ4bfr/O7zP4OevkVjp2AZ6qS1lfj83HaVxKSET5X0OMaURzxoRGxD3nnC
	x9C4Z8raaAGv/i8i1bl1bHDXKbRlvzT+us0=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV69v6
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-13.vodafone-net.de [80.226.24.13])
	by smtp.strato.de (jimi mo14) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id d017bbnA96VvQr ;
	Wed, 9 Nov 2011 08:02:19 +0100 (MET)
Received: by probook.site (Postfix, from userid 1000)
	id D25BE18638; Wed,  9 Nov 2011 08:02:17 +0100 (CET)
Date: Wed, 9 Nov 2011 08:02:17 +0100
From: Olaf Hering <olaf@aepfle.de>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Message-ID: <20111109070217.GA26154@aepfle.de>
References: <20111108214540.EAEBB72C4A1@homiemail-mx8.g.dreamhost.com>
	<c51adac89cc2096d54a7347c1accb18e.squirrel@webmail.lagarcavilla.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <c51adac89cc2096d54a7347c1accb18e.squirrel@webmail.lagarcavilla.org>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: Need help with fixing the Xen waitqueue feature
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 08, Andres Lagar-Cavilla wrote:

> Olaf,
> are waitqueue's on the mem-event ring meant to be the way to deal with
> ring exhaustion? i.e. is this meant to go beyond a testing vehicle for
> waitqueue's?

Putting the guest to sleep when the ring is full is at least required
for p2m_mem_paging_drop_page(), so that the page gets informed about all
gfns from decrease_reservation.

> With the pager itself generating events, and foreign mappings generating
> events, you'll end up putting dom0 vcpu's in a waitqueue. This will
> basically deadlock the host.

Those vcpus can not go to sleep and my change handles that case.

Olaf

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 23:07:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 23:07:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO2GE-0004Sk-Th; Tue, 08 Nov 2011 23:07:50 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO2Fl-0004Gu-GV
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 23:07:21 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1320822438!824727!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21503 invoked from network); 9 Nov 2011 07:07:18 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 07:07:18 -0000
X-IronPort-AV: E=Sophos;i="4.69,482,1315180800"; 
   d="scan'208";a="8830313"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 07:07:17 +0000
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Wed, 9 Nov 2011
	07:07:17 +0000
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "rshriram@cs.ubc.ca" <rshriram@cs.ubc.ca>
In-Reply-To: <58a24a7d4b8754069236.1320791986@athos.nss.cs.ubc.ca>
References: <patchbomb.1320791985@athos.nss.cs.ubc.ca>
	<58a24a7d4b8754069236.1320791986@athos.nss.cs.ubc.ca>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Wed, 9 Nov 2011 07:07:16 +0000
Message-ID: <1320822437.16747.90.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: "brendan@cs.ubc.ca" <brendan@cs.ubc.ca>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, Ian
	Jackson <Ian.Jackson@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH 1 of 3 V6] tools/libxc: introduce
 page_aligned_alloc in xc_{minios, linux, solaris, netbsd}.c
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-11-08 at 22:39 +0000, rshriram@cs.ubc.ca wrote:
> diff -r 54a5e994a241 -r 58a24a7d4b87 tools/libxc/xc_linux_osdep.c
> --- a/tools/libxc/xc_linux_osdep.c	Wed Nov 02 17:09:09 2011 +0000
> +++ b/tools/libxc/xc_linux_osdep.c	Tue Nov 08 14:26:02 2011 -0800
> @@ -36,9 +36,17 @@
>  #include <xen/sys/gntdev.h>
>  #include <xen/sys/gntalloc.h>
>  
> +#include "xc_private.h"

I'd like to avoid including xc_private from this file. Although it's in
tree it is a plugin and avoiding internal APIs serves to help ensure
that external plugins can actually be written using the public APIs.

I think you can make this function public, as long as you name it
xc_blah.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 08 23:10:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 08 Nov 2011 23:10:18 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO2Ic-0004rP-C6; Tue, 08 Nov 2011 23:10:18 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO2Hx-0004et-CM
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 23:09:37 -0800
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-6.tower-21.messagelabs.com!1320822574!3481147!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26892 invoked from network); 9 Nov 2011 07:09:34 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-6.tower-21.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 9 Nov 2011 07:09:34 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320822573; l=1174;
	s=domk; d=aepfle.de;
	h=In-Reply-To:Content-Type:MIME-Version:References:Subject:Cc:To:From:
	Date:X-RZG-CLASS-ID:X-RZG-AUTH;
	bh=FLMxbi1TvgCoSGMRZzEi/upIHig=;
	b=LkNcfq/ItYyJGr52CuADgZyI0td3NaHaJtyv6nxjOKsiBFGWcVJ4fUo3ySdF9TcCJh+
	bWAN9HI3L2FeZxXSIffM2otSGliY29UH4MLRaq+47rMCqbCKwiMSyfCjNQg//kk3oiLSR
	yyQSSpU3MxC/Nf1vLKI/2Azd+a78tNwNfvY=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV69v6
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-13.vodafone-net.de [80.226.24.13])
	by post.strato.de (mrclete mo18) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id 501216nA96c21U ;
	Wed, 9 Nov 2011 08:09:29 +0100 (MET)
Received: by probook.site (Postfix, from userid 1000)
	id BBB7518638; Wed,  9 Nov 2011 08:09:27 +0100 (CET)
Date: Wed, 9 Nov 2011 08:09:27 +0100
From: Olaf Hering <olaf@aepfle.de>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Message-ID: <20111109070927.GB26154@aepfle.de>
References: <20111108224414.83985CF73A@homiemail-mx7.g.dreamhost.com>
	<3c097da8e49a42af1210e4ffcd39fd48.squirrel@webmail.lagarcavilla.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <3c097da8e49a42af1210e4ffcd39fd48.squirrel@webmail.lagarcavilla.org>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
Cc: keir.xen@gmail.com, xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: Need help with fixing the Xen waitqueue feature
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 08, Andres Lagar-Cavilla wrote:

> Tbh, for paging to be effective, we need to be prepared to yield on every
> p2m lookup.

Yes, if a gfn is missing the vcpu should go to sleep rather than
returning -ENOENT to the caller. Only the query part of gfn_to_mfn
should return the p2m paging types.

> Let's compare paging to PoD. They're essentially the same thing: pages
> disappear, and get allocated on the fly when you need them. PoD is a
> highly optimized in-hypervisor optimization that does not need a
> user-space helper -- but the pager could do PoD easily and remove all that
> p2m-pod.c code from the hypervisor.

Perhaps PoD and paging could be merged, I havent had time to study the
PoD code.

> PoD only introduces extraneous side-effects when there is a complete
> absence of memory to allocate pages. The same cannot be said of paging, to
> put it mildly. It returns EINVAL all over the place. Right now, qemu can
> be crashed in a blink by paging out the right gfn.

I have seen qemu crashes when using emulated storage, but havent
debugged them yet. I suspect they were caused by a race between nominate
and evict.

Olaf

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 00:03:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 00:03:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO38R-00064w-ER; Wed, 09 Nov 2011 00:03:51 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO33x-0005oY-3l
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 23:59:26 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1320825548!2413685!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6415 invoked from network); 9 Nov 2011 07:59:09 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-5.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 07:59:09 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA97x39Q003083
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 07:59:04 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA97x0up019003
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 07:59:01 GMT
Received: from abhmt101.oracle.com (abhmt101.oracle.com [141.146.116.53])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA97wrmx023455; Wed, 9 Nov 2011 01:58:53 -0600
Received: from [10.154.35.146] (/10.154.35.146)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 08 Nov 2011 23:58:53 -0800
Message-ID: <4EBA32B7.7020804@oracle.com>
Date: Wed, 09 Nov 2011 15:58:47 +0800
From: ANNIE LI <annie.li@oracle.com>
Organization: Oracle Corporation
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;
	rv:1.9.2.23) Gecko/20110920 Thunderbird/3.1.15
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	linux-kernel@vger.kernel.org,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, jeremy@goop.org
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090204.4EBA32C9.0002,ss=1,re=0.000,fgs=0
Cc: Kurt Hackel <Kurt.Hackel@oracle.com>,
	Paul Durrant <paul.durrant@citrix.com>
Subject: [Xen-devel] patches of upstreaming grant table version 2
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0680367766=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============0680367766==
Content-Type: multipart/alternative;
	boundary="------------010409060202080208000709"

This is a multi-part message in MIME format.
--------------010409060202080208000709
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

Hi

The following patches introduce and implement grant table version 2, and 
they are based on v3.1.0-rc9+.

Descriptions for those patches:

1. In those patches, the grant table code supports both grant table v1 
and v2 version, v2 is an extension from v1. Grant table of guest domain 
can be either v1 or v2 version, and every grant table entry on one guest 
should be the same version.

2. Full page structure of grant table v2 play the same role as grant 
table v1. Although full page structure is different from v1, grant table 
2 is totally backwards compatible with v1. Grant table is shared between 
guest and Xen, domu and dom0 all have their own grant table shared with 
Xen, and their grant table version should be set before any grants are 
activated. When domu grants an entry to dom0 to map a frame, following 
are steps:
* domu introduces a grant entry by reference
* domu informs dom0 the gref
* dom0 sends hypercall to map frame through this reference, Xen copy 
shared entry to active entry and update frame
* dom0 does its work and release the frame, Xen releases the entry.
* domu redo those steps for a new cycle.

Xen mapping process can be found in function __gnttab_map_grant_ref in 
link: 
http://xenbits.xen.org/hg/xen-4.1-testing.hg/file/81e39a4978ea/xen/common/grant_table.c#l2172 


3. If dom0 supports grant table v2, guests run on it can either supports 
v1 or v2. Xen is responsible to judge what version the guests are using. 
This is implemented in link: 
http://xenbits.xen.org/hg/xen-4.1-testing.hg/file/81e39a4978ea/xen/common/grant_table.c#l2172. 
Key word is:  rd->grant_table->gt_version.

4. Grant table2 is a precondition to netchannel2 mechanism. Netchannel2 
imports a new device type: vif2. To support this type, we need new 
netback2, netfront2 driver and modification in Xen. If all are ready, 
two types of vif can be supported: vif and vif2. vif is for original 
backend and frontend, vif2 is for netback2 and netfront2.

Thanks
Annie

--------------010409060202080208000709
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8bit

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body text="#000000" bgcolor="#ffffff">
    <div class="moz-text-flowed" style="font-family: -moz-fixed;
      font-size: 13px;" lang="x-unicode">Hi
      <br>
      <br>
      The following patches introduce and implement grant table version
      2, and they are based on v3.1.0-rc9+.
      <br>
      <br>
      Descriptions for those patches:
      <br>
      <br>
      1. In those patches, the grant table code supports both grant
      table v1 and v2 version, v2 is an extension from v1. Grant table
      of guest domain can be either v1 or v2 version, and every grant
      table entry on one guest should be the same version.
      <br>
      <br>
      2. Full page structure of grant table v2 play the same role as
      grant table v1. Although full page structure is different from v1,
      grant table 2 is totally backwards compatible with v1. Grant table
      is shared between guest and Xen, domu and dom0 all have their own
      grant table shared with Xen, and their grant table version should
      be set before any grants are activated. When domu grants an entry
      to dom0 to map a frame, following are steps:
      <br>
      * domu introduces a grant entry by reference
      <br>
      * domu informs dom0 the gref
      <br>
      * dom0 sends hypercall to map frame through this reference, Xen
      copy shared entry to active entry and update frame
      <br>
      * dom0 does its work and release the frame, Xen releases the
      entry.
      <br>
      * domu redo those steps for a new cycle.
      <br>
      <br>
      Xen mapping process can be found in function
      __gnttab_map_grant_ref in link: <a class="moz-txt-link-freetext"
href="http://xenbits.xen.org/hg/xen-4.1-testing.hg/file/81e39a4978ea/xen/common/grant_table.c#l2172">http://xenbits.xen.org/hg/xen-4.1-testing.hg/file/81e39a4978ea/xen/common/grant_table.c#l2172</a>
      <br>
      <br>
      3. If dom0 supports grant table v2, guests run on it can either
      supports v1 or v2. Xen is responsible to judge what version the
      guests are using. This is implemented in link: <a
        class="moz-txt-link-freetext"
href="http://xenbits.xen.org/hg/xen-4.1-testing.hg/file/81e39a4978ea/xen/common/grant_table.c#l2172">http://xenbits.xen.org/hg/xen-4.1-testing.hg/file/81e39a4978ea/xen/common/grant_table.c#l2172</a>.
      Key word is:Â  rd-&gt;grant_table-&gt;gt_version.
      <br>
      <br>
      4. Grant table2 is a precondition to netchannel2 mechanism.
      Netchannel2 imports a new device type: vif2. To support this type,
      we need new netback2, netfront2 driver and modification in Xen. If
      all are ready, two types of vif can be supported: vif and vif2.
      vif is for original backend and frontend, vif2 is for netback2 and
      netfront2.
      <br>
      <br>
      Thanks
      <br>
      Annie
      <br>
    </div>
  </body>
</html>

--------------010409060202080208000709--


--===============0680367766==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0680367766==--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 00:15:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 00:15:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO3Jb-0006hI-T8; Wed, 09 Nov 2011 00:15:24 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO3Gl-0006Sf-3Y
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 00:12:34 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320826316!52004277!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1507 invoked from network); 9 Nov 2011 08:11:57 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-9.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 08:11:57 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA98CH8D016948
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 08:12:18 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA98CFkR008063
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 08:12:16 GMT
Received: from abhmt107.oracle.com (abhmt107.oracle.com [141.146.116.59])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA98C9Pd004286; Wed, 9 Nov 2011 02:12:09 -0600
Received: from [10.182.39.81] (/10.182.39.81)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 00:12:09 -0800
Message-ID: <4EBA35D3.3020506@oracle.com>
Date: Wed, 09 Nov 2011 16:12:03 +0800
From: ANNIE LI <annie.li@oracle.com>
Organization: Oracle Corporation
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;
	rv:1.9.2.23) Gecko/20110920 Thunderbird/3.1.15
MIME-Version: 1.0
To: linux-kernel@vger.kernel.org,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, jeremy@goop.org
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090204.4EBA35E3.00D6,ss=1,re=0.000,fgs=0
Cc: Kurt Hackel <Kurt.Hackel@oracle.com>,
	Paul Durrant <paul.durrant@citrix.com>
Subject: [Xen-devel] patches of upstreaming grant table version 2
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi

The following patches introduce and implement grant table version 2, and 
they are based on v3.1.0-rc9+.

Descriptions for those patches:

1. In those patches, the grant table code supports both grant table v1 
and v2 version, v2 is an extension from v1. Grant table of guest domain 
can be either v1 or v2 version, and every grant table entry on one guest 
should be the same version.

2. Full page structure of grant table v2 play the same role as grant 
table v1. Although full page structure is different from v1, grant table 
2 is totally backwards compatible with v1. Grant table is shared between 
guest and Xen, domu and dom0 all have their own grant table shared with 
Xen, and their grant table version should be set before any grants are 
activated. When domu grants an entry to dom0 to map a frame, following 
are steps:
* domu introduces a grant entry by reference
* domu informs dom0 the gref
* dom0 sends hypercall to map frame through this reference, Xen copy 
shared entry to active entry and update frame
* dom0 does its work and release the frame, Xen releases the entry.
* domu redo those steps for a new cycle.

Xen mapping process can be found in function __gnttab_map_grant_ref in 
link: 
http://xenbits.xen.org/hg/xen-4.1-testing.hg/file/81e39a4978ea/xen/common/grant_table.c#l2172 


3. If dom0 supports grant table v2, guests run on it can either supports 
v1 or v2. Xen is responsible to judge what version the guests are using. 
This is implemented in link: 
http://xenbits.xen.org/hg/xen-4.1-testing.hg/file/81e39a4978ea/xen/common/grant_table.c#l2172. 
Key word is:  rd->grant_table->gt_version.

4. Grant table2 is a precondition to netchannel2 mechanism. Netchannel2 
imports a new device type: vif2. To support this type, we need new 
netback2, netfront2 driver and modification in Xen. If all are ready, 
two types of vif can be supported: vif and vif2. vif is for original 
backend and frontend, vif2 is for netback2 and netfront2.

Thanks
Annie

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 00:17:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 00:17:36 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO3Lk-00075N-GU; Wed, 09 Nov 2011 00:17:36 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO3JV-0006fd-Ez
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 00:15:20 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1320826512!828955!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14940 invoked from network); 9 Nov 2011 08:15:13 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-6.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 08:15:13 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA98F0WK026052
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 08:15:01 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA98ExXM011791
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 08:15:00 GMT
Received: from abhmt103.oracle.com (abhmt103.oracle.com [141.146.116.55])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA98Es5W005853; Wed, 9 Nov 2011 02:14:54 -0600
Received: from annie2.cn.oracle.com.com (/10.182.37.169)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 00:14:54 -0800
From: annie.li@oracle.com
To: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	konrad.wilk@oracle.com, jeremy@goop.org
Date: Wed,  9 Nov 2011 16:14:50 +0800
Message-Id: <1320826490-29362-1-git-send-email-annie.li@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <4EBA35D3.3020506@oracle.com>
References: <4EBA35D3.3020506@oracle.com>
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090208.4EBA3686.003E,ss=1,re=-2.300,fgs=0
Cc: kurt.hackel@oracle.com, annie.li@oracle.com, paul.durrant@citrix.com
Subject: [Xen-devel] [PATCH 1/3] Introducing grant table V2 stucture
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Annie Li <annie.li@oracle.com>

This patch introduces new structures of grant table V2, grant table V2 is an
extension from V1. Grant table is shared between guest and Xen, and Xen is
responsible to do corresponding work for grant operations, such as: figure
out guest's grant table version, perform different actions based on
different grant table version, etc. Although full-page structure of V2
is different from V1, it play the same role as V1.

This patch also changes existing grant table V1 interfaces into **_V1 style in
order to keep consistence with **_V2 interfaces.

Signed-off-by: Annie Li <annie.li@oracle.com>
---
 arch/x86/xen/grant-table.c          |    7 +-
 drivers/xen/grant-table.c           |  181 ++++++++++++++++++++++++++++++-----
 include/xen/grant_table.h           |    4 +-
 include/xen/interface/grant_table.h |  167 +++++++++++++++++++++++++++++++-
 include/xen/interface/xen.h         |    2 +
 5 files changed, 326 insertions(+), 35 deletions(-)

diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c
index 49ba9b5..65ce508 100644
--- a/arch/x86/xen/grant-table.c
+++ b/arch/x86/xen/grant-table.c
@@ -64,10 +64,10 @@ static int unmap_pte_fn(pte_t *pte, struct page *pmd_page,
 
 int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
 			   unsigned long max_nr_gframes,
-			   struct grant_entry **__shared)
+			   void **__shared)
 {
 	int rc;
-	struct grant_entry *shared = *__shared;
+	void *shared = *__shared;
 
 	if (shared == NULL) {
 		struct vm_struct *area =
@@ -83,8 +83,7 @@ int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
 	return rc;
 }
 
-void arch_gnttab_unmap_shared(struct grant_entry *shared,
-			      unsigned long nr_gframes)
+void arch_gnttab_unmap_shared(void *shared, unsigned long nr_gframes)
 {
 	apply_to_page_range(&init_mm, (unsigned long)shared,
 			    PAGE_SIZE * nr_gframes, unmap_pte_fn, NULL);
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
index 4f44b34..0d481a9 100644
--- a/drivers/xen/grant-table.c
+++ b/drivers/xen/grant-table.c
@@ -53,7 +53,7 @@
 /* External tools reserve first few grant table entries. */
 #define NR_RESERVED_ENTRIES 8
 #define GNTTAB_LIST_END 0xffffffff
-#define GREFS_PER_GRANT_FRAME (PAGE_SIZE / sizeof(struct grant_entry))
+#define GREFS_PER_GRANT_FRAME (PAGE_SIZE / sizeof(struct grant_entry_v1))
 
 static grant_ref_t **gnttab_list;
 static unsigned int nr_grant_frames;
@@ -64,7 +64,72 @@ static DEFINE_SPINLOCK(gnttab_list_lock);
 unsigned long xen_hvm_resume_frames;
 EXPORT_SYMBOL_GPL(xen_hvm_resume_frames);
 
-static struct grant_entry *shared;
+static union {
+	struct grant_entry_v1 *v1;
+	void *ring_addr;
+} shared;
+
+/*
+ * This function is null for grant table v1, adding it here in order to keep
+ * consistent with *_v2 interface.
+ */
+static int gnttab_map_status_v1(unsigned int nr_gframes);
+/*
+ * This function is null for grant table v1, adding it here in order to keep
+ * consistent with *_v2 interface.
+ */
+static void gnttab_unmap_status_v1(void);
+
+/*This is a structure of function pointers for grant table v1*/
+static struct {
+	/*
+	 * Mapping a list of frames for storing grant entry status, this
+	 * mechanism can allow better synchronization using barriers. Input
+	 * parameter is frame number, returning GNTST_okay means success and
+	 * negative value means failure.
+	 */
+	int (*_gnttab_map_status)(unsigned int);
+	/*
+	 * Release a list of frames which are mapped in _gnttab_map_status for
+	 * grant entry status.
+	 */
+	void (*_gnttab_unmap_status)(void);
+	/*
+	 * Introducing a valid entry into the grant table, granting the frame
+	 * of this grant entry to domain for accessing, or transfering, or
+	 * transitively accessing. First input parameter is reference of this
+	 * introduced grant entry, second one is domid of granted domain, third
+	 * one is the frame to be granted, and the last one is status of the
+	 * grant entry to be updated.
+	 */
+	void (*_update_grant_entry)(grant_ref_t, domid_t,
+		unsigned long, unsigned);
+	/*
+	 * Stop granting a grant entry to domain for accessing. First input
+	 * parameter is reference of a grant entry whose grant access will be
+	 * stopped, second one is not in use now. If the grant entry is
+	 * currently mapped for reading or writing, just return failure(==0)
+	 * directly and don't tear down the grant access. Otherwise, stop grant
+	 * access for this entry and return success(==1).
+	 */
+	int (*_gnttab_end_foreign_access_ref)(grant_ref_t, int);
+	/*
+	 * Stop granting a grant entry to domain for transfer. If tranfer has
+	 * not started, just reclaim the grant entry and return failure(==0).
+	 * Otherwise, wait for the transfer to complete and then return the
+	 * frame.
+	 */
+	unsigned long (*_gnttab_end_foreign_transfer_ref)(grant_ref_t);
+	/*
+	 * Query the status of a grant entry. Input parameter is reference of
+	 * queried grant entry, return value is the status of queried entry.
+	 * Detailed status(writing/reading) can be gotten from the return value
+	 * by bit operations.
+	 */
+	int (*_gnttab_query_foreign_access)(grant_ref_t);
+} gnttab_interface;
+
+static int grant_table_version;
 
 static struct gnttab_free_callback *gnttab_free_callback_list;
 
@@ -142,6 +207,15 @@ static void put_free_entry(grant_ref_t ref)
 	spin_unlock_irqrestore(&gnttab_list_lock, flags);
 }
 
+static void update_grant_entry_v1(grant_ref_t ref, domid_t domid,
+				  unsigned long frame, unsigned flags)
+{
+	shared.v1[ref].frame = frame;
+	shared.v1[ref].domid = domid;
+	wmb();
+	shared.v1[ref].flags = flags;
+}
+
 static void update_grant_entry(grant_ref_t ref, domid_t domid,
 			       unsigned long frame, unsigned flags)
 {
@@ -155,12 +229,10 @@ static void update_grant_entry(grant_ref_t ref, domid_t domid,
 	 *  3. Write memory barrier (WMB).
 	 *  4. Write ent->flags, inc. valid type.
 	 */
-	shared[ref].frame = frame;
-	shared[ref].domid = domid;
-	wmb();
-	shared[ref].flags = flags;
+	gnttab_interface._update_grant_entry(ref, domid, frame, flags);
 }
 
+
 /*
  * Public grant-issuing interface functions
  */
@@ -187,31 +259,40 @@ int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
 }
 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access);
 
-int gnttab_query_foreign_access(grant_ref_t ref)
+int gnttab_query_foreign_access_v1(grant_ref_t ref)
 {
-	u16 nflags;
-
-	nflags = shared[ref].flags;
+	return shared.v1[ref].flags & (GTF_reading|GTF_writing);
+}
 
-	return (nflags & (GTF_reading|GTF_writing));
+int gnttab_query_foreign_access(grant_ref_t ref)
+{
+	return gnttab_interface._gnttab_query_foreign_access(ref);
 }
 EXPORT_SYMBOL_GPL(gnttab_query_foreign_access);
 
-int gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly)
+int gnttab_end_foreign_access_ref_v1(grant_ref_t ref, int readonly)
 {
 	u16 flags, nflags;
+	u16 *pflags;
 
-	nflags = shared[ref].flags;
+	pflags = &shared.v1[ref].flags;
+	nflags = *pflags;
 	do {
 		flags = nflags;
 		if (flags & (GTF_reading|GTF_writing)) {
 			printk(KERN_ALERT "WARNING: g.e. still in use!\n");
 			return 0;
 		}
-	} while ((nflags = sync_cmpxchg(&shared[ref].flags, flags, 0)) != flags);
+	} while ((nflags = sync_cmpxchg(&shared.v1[ref].flags, flags, 0))
+			!= flags);
 
 	return 1;
 }
+
+int gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly)
+{
+	return gnttab_interface._gnttab_end_foreign_access_ref(ref, readonly);
+}
 EXPORT_SYMBOL_GPL(gnttab_end_foreign_access_ref);
 
 void gnttab_end_foreign_access(grant_ref_t ref, int readonly,
@@ -250,33 +331,41 @@ void gnttab_grant_foreign_transfer_ref(grant_ref_t ref, domid_t domid,
 }
 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_transfer_ref);
 
-unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref)
+unsigned long gnttab_end_foreign_transfer_ref_v1(grant_ref_t ref)
 {
 	unsigned long frame;
 	u16           flags;
+	u16          *pflags;
+
+	pflags = &shared.v1[ref].flags;
 
 	/*
 	 * If a transfer is not even yet started, try to reclaim the grant
 	 * reference and return failure (== 0).
 	 */
-	while (!((flags = shared[ref].flags) & GTF_transfer_committed)) {
-		if (sync_cmpxchg(&shared[ref].flags, flags, 0) == flags)
+	while (!((flags = *pflags) & GTF_transfer_committed)) {
+		if (sync_cmpxchg(pflags, flags, 0) == flags)
 			return 0;
 		cpu_relax();
 	}
 
 	/* If a transfer is in progress then wait until it is completed. */
 	while (!(flags & GTF_transfer_completed)) {
-		flags = shared[ref].flags;
+		flags = *pflags;
 		cpu_relax();
 	}
 
 	rmb();	/* Read the frame number /after/ reading completion status. */
-	frame = shared[ref].frame;
+	frame = shared.v1[ref].frame;
 	BUG_ON(frame == 0);
 
 	return frame;
 }
+
+unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref)
+{
+	return gnttab_interface._gnttab_end_foreign_transfer_ref(ref);
+}
 EXPORT_SYMBOL_GPL(gnttab_end_foreign_transfer_ref);
 
 unsigned long gnttab_end_foreign_transfer(grant_ref_t ref)
@@ -520,6 +609,32 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
 }
 EXPORT_SYMBOL_GPL(gnttab_unmap_refs);
 
+static void gnttab_request_version(void)
+{
+	grant_table_version = 1;
+	gnttab_interface._gnttab_map_status = gnttab_map_status_v1;
+	gnttab_interface._gnttab_unmap_status = gnttab_unmap_status_v1;
+	gnttab_interface._update_grant_entry = update_grant_entry_v1;
+	gnttab_interface._gnttab_end_foreign_access_ref =
+					gnttab_end_foreign_access_ref_v1;
+	gnttab_interface._gnttab_end_foreign_transfer_ref =
+					gnttab_end_foreign_transfer_ref_v1;
+	gnttab_interface._gnttab_query_foreign_access =
+					gnttab_query_foreign_access_v1;
+	printk(KERN_INFO "Grant tables using version %d layout.\n",
+		grant_table_version);
+}
+
+static int gnttab_map_status_v1(unsigned int nr_gframes)
+{
+	return 0;
+}
+
+static int gnttab_map_status(unsigned int nr_gframes)
+{
+	return gnttab_interface._gnttab_map_status(nr_gframes);
+}
+
 static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
 {
 	struct gnttab_setup_table setup;
@@ -567,8 +682,14 @@ static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
 
 	BUG_ON(rc || setup.status);
 
+	rc = gnttab_map_status(nr_gframes);
+	if (rc < 0) {
+		kfree(frames);
+		return rc;
+	}
+
 	rc = arch_gnttab_map_shared(frames, nr_gframes, gnttab_max_grant_frames(),
-				    &shared);
+				    &shared.ring_addr);
 	BUG_ON(rc);
 
 	kfree(frames);
@@ -580,6 +701,7 @@ int gnttab_resume(void)
 {
 	unsigned int max_nr_gframes;
 
+	gnttab_request_version();
 	max_nr_gframes = gnttab_max_grant_frames();
 	if (max_nr_gframes < nr_grant_frames)
 		return -ENOSYS;
@@ -587,9 +709,10 @@ int gnttab_resume(void)
 	if (xen_pv_domain())
 		return gnttab_map(0, nr_grant_frames - 1);
 
-	if (!shared) {
-		shared = ioremap(xen_hvm_resume_frames, PAGE_SIZE * max_nr_gframes);
-		if (shared == NULL) {
+	if (!shared.ring_addr) {
+		shared.ring_addr = ioremap(xen_hvm_resume_frames,
+						PAGE_SIZE * max_nr_gframes);
+		if (shared.ring_addr == NULL) {
 			printk(KERN_WARNING
 					"Failed to ioremap gnttab share frames!");
 			return -ENOMEM;
@@ -601,9 +724,19 @@ int gnttab_resume(void)
 	return 0;
 }
 
+static void gnttab_unmap_status_v1(void)
+{
+}
+
+void gnttab_unmap_status(void)
+{
+	return gnttab_interface._gnttab_unmap_status();
+}
+
 int gnttab_suspend(void)
 {
-	arch_gnttab_unmap_shared(shared, nr_grant_frames);
+	arch_gnttab_unmap_shared(shared.ring_addr, nr_grant_frames);
+	gnttab_interface._gnttab_unmap_status();
 	return 0;
 }
 
diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
index b1fab6b..405879d 100644
--- a/include/xen/grant_table.h
+++ b/include/xen/grant_table.h
@@ -146,8 +146,8 @@ gnttab_set_unmap_op(struct gnttab_unmap_grant_ref *unmap, phys_addr_t addr,
 
 int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
 			   unsigned long max_nr_gframes,
-			   struct grant_entry **__shared);
-void arch_gnttab_unmap_shared(struct grant_entry *shared,
+			   void **__shared);
+void arch_gnttab_unmap_shared(void *shared,
 			      unsigned long nr_gframes);
 
 extern unsigned long xen_hvm_resume_frames;
diff --git a/include/xen/interface/grant_table.h b/include/xen/interface/grant_table.h
index 39e5717..a17d844 100644
--- a/include/xen/interface/grant_table.h
+++ b/include/xen/interface/grant_table.h
@@ -85,12 +85,22 @@
  */
 
 /*
+ * Reference to a grant entry in a specified domain's grant table.
+ */
+typedef uint32_t grant_ref_t;
+
+/*
  * A grant table comprises a packed array of grant entries in one or more
  * page frames shared between Xen and a guest.
  * [XEN]: This field is written by Xen and read by the sharing guest.
  * [GST]: This field is written by the guest and read by Xen.
  */
-struct grant_entry {
+
+/*
+ * Version 1 of the grant table entry structure is maintained purely
+ * for backwards compatibility.  New guests should use version 2.
+ */
+struct grant_entry_v1 {
     /* GTF_xxx: various type and flag information.  [XEN,GST] */
     uint16_t flags;
     /* The domain being granted foreign privileges. [GST] */
@@ -108,10 +118,13 @@ struct grant_entry {
  *  GTF_permit_access: Allow @domid to map/access @frame.
  *  GTF_accept_transfer: Allow @domid to transfer ownership of one page frame
  *                       to this guest. Xen writes the page number to @frame.
+ *  GTF_transitive: Allow @domid to transitively access a subrange of
+ *                  @trans_grant in @trans_domid.  No mappings are allowed.
  */
 #define GTF_invalid         (0U<<0)
 #define GTF_permit_access   (1U<<0)
 #define GTF_accept_transfer (2U<<0)
+#define GTF_transitive      (3U<<0)
 #define GTF_type_mask       (3U<<0)
 
 /*
@@ -119,6 +132,9 @@ struct grant_entry {
  *  GTF_readonly: Restrict @domid to read-only mappings and accesses. [GST]
  *  GTF_reading: Grant entry is currently mapped for reading by @domid. [XEN]
  *  GTF_writing: Grant entry is currently mapped for writing by @domid. [XEN]
+ *  GTF_sub_page: Grant access to only a subrange of the page.  @domid
+ *                will only be allowed to copy from the grant, and not
+ *                map it. [GST]
  */
 #define _GTF_readonly       (2)
 #define GTF_readonly        (1U<<_GTF_readonly)
@@ -126,6 +142,8 @@ struct grant_entry {
 #define GTF_reading         (1U<<_GTF_reading)
 #define _GTF_writing        (4)
 #define GTF_writing         (1U<<_GTF_writing)
+#define _GTF_sub_page       (8)
+#define GTF_sub_page        (1U<<_GTF_sub_page)
 
 /*
  * Subflags for GTF_accept_transfer:
@@ -142,15 +160,81 @@ struct grant_entry {
 #define _GTF_transfer_completed (3)
 #define GTF_transfer_completed  (1U<<_GTF_transfer_completed)
 
+/*
+ * Version 2 grant table entries.  These fulfil the same role as
+ * version 1 entries, but can represent more complicated operations.
+ * Any given domain will have either a version 1 or a version 2 table,
+ * and every entry in the table will be the same version.
+ *
+ * The interface by which domains use grant references does not depend
+ * on the grant table version in use by the other domain.
+ */
 
-/***********************************
- * GRANT TABLE QUERIES AND USES
+/*
+ * Version 1 and version 2 grant entries share a common prefix.  The
+ * fields of the prefix are documented as part of struct
+ * grant_entry_v1.
  */
+struct grant_entry_header {
+    uint16_t flags;
+    domid_t  domid;
+};
 
 /*
- * Reference to a grant entry in a specified domain's grant table.
+ * Version 2 of the grant entry structure, here is an union because three
+ * different types are suppotted: full_page, sub_page and transitive.
+ */
+union grant_entry_v2 {
+    struct grant_entry_header hdr;
+
+    /*
+     * This member is used for V1-style full page grants, where either:
+     *
+     * -- hdr.type is GTF_accept_transfer, or
+     * -- hdr.type is GTF_permit_access and GTF_sub_page is not set.
+     *
+     * In that case, the frame field has the same semantics as the
+     * field of the same name in the V1 entry structure.
+     */
+    struct {
+	struct grant_entry_header hdr;
+	uint32_t pad0;
+	uint64_t frame;
+    } full_page;
+
+    /*
+     * If the grant type is GTF_grant_access and GTF_sub_page is set,
+     * @domid is allowed to access bytes [@page_off,@page_off+@length)
+     * in frame @frame.
+     */
+    struct {
+	struct grant_entry_header hdr;
+	uint16_t page_off;
+	uint16_t length;
+	uint64_t frame;
+    } sub_page;
+
+    /*
+     * If the grant is GTF_transitive, @domid is allowed to use the
+     * grant @gref in domain @trans_domid, as if it was the local
+     * domain.  Obviously, the transitive access must be compatible
+     * with the original grant.
+     */
+    struct {
+	struct grant_entry_header hdr;
+	domid_t trans_domid;
+	uint16_t pad0;
+	grant_ref_t gref;
+    } transitive;
+
+    uint32_t __spacer[4]; /* Pad to a power of two */
+};
+
+typedef uint16_t grant_status_t;
+
+/***********************************
+ * GRANT TABLE QUERIES AND USES
  */
-typedef uint32_t grant_ref_t;
 
 /*
  * Handle to track a mapping created via a grant reference.
@@ -322,6 +406,79 @@ struct gnttab_query_size {
 DEFINE_GUEST_HANDLE_STRUCT(gnttab_query_size);
 
 /*
+ * GNTTABOP_unmap_and_replace: Destroy one or more grant-reference mappings
+ * tracked by <handle> but atomically replace the page table entry with one
+ * pointing to the machine address under <new_addr>.  <new_addr> will be
+ * redirected to the null entry.
+ * NOTES:
+ *  1. The call may fail in an undefined manner if either mapping is not
+ *     tracked by <handle>.
+ *  2. After executing a batch of unmaps, it is guaranteed that no stale
+ *     mappings will remain in the device or host TLBs.
+ */
+#define GNTTABOP_unmap_and_replace    7
+struct gnttab_unmap_and_replace {
+    /* IN parameters. */
+    uint64_t host_addr;
+    uint64_t new_addr;
+    grant_handle_t handle;
+    /* OUT parameters. */
+    int16_t  status;              /* GNTST_* */
+};
+DEFINE_GUEST_HANDLE_STRUCT(gnttab_unmap_and_replace);
+
+/*
+ * GNTTABOP_set_version: Request a particular version of the grant
+ * table shared table structure.  This operation can only be performed
+ * once in any given domain.  It must be performed before any grants
+ * are activated; otherwise, the domain will be stuck with version 1.
+ * The only defined versions are 1 and 2.
+ */
+#define GNTTABOP_set_version          8
+struct gnttab_set_version {
+    /* IN parameters */
+    uint32_t version;
+};
+DEFINE_GUEST_HANDLE_STRUCT(gnttab_set_version);
+
+/*
+ * GNTTABOP_get_status_frames: Get the list of frames used to store grant
+ * status for <dom>. In grant format version 2, the status is separated
+ * from the other shared grant fields to allow more efficient synchronization
+ * using barriers instead of atomic cmpexch operations.
+ * <nr_frames> specify the size of vector <frame_list>.
+ * The frame addresses are returned in the <frame_list>.
+ * Only <nr_frames> addresses are returned, even if the table is larger.
+ * NOTES:
+ *  1. <dom> may be specified as DOMID_SELF.
+ *  2. Only a sufficiently-privileged domain may specify <dom> != DOMID_SELF.
+ */
+#define GNTTABOP_get_status_frames     9
+struct gnttab_get_status_frames {
+    /* IN parameters. */
+    uint32_t nr_frames;
+    domid_t  dom;
+    /* OUT parameters. */
+    int16_t  status;              /* GNTST_* */
+    GUEST_HANDLE(uint64_t) frame_list;
+};
+DEFINE_GUEST_HANDLE_STRUCT(gnttab_get_status_frames);
+
+/*
+ * GNTTABOP_get_version: Get the grant table version which is in
+ * effect for domain <dom>.
+ */
+#define GNTTABOP_get_version          10
+struct gnttab_get_version {
+    /* IN parameters */
+    domid_t dom;
+    uint16_t pad;
+    /* OUT parameters */
+    uint32_t version;
+};
+DEFINE_GUEST_HANDLE_STRUCT(gnttab_get_version);
+
+/*
  * Bitfield values for update_pin_status.flags.
  */
  /* Map the grant entry for access by I/O devices. */
diff --git a/include/xen/interface/xen.h b/include/xen/interface/xen.h
index 6acd9ce..9353bdf 100644
--- a/include/xen/interface/xen.h
+++ b/include/xen/interface/xen.h
@@ -522,6 +522,8 @@ struct tmem_op {
 	} u;
 };
 
+DEFINE_GUEST_HANDLE(uint64_t);
+
 #else /* __ASSEMBLY__ */
 
 /* In assembly code we cannot use C numeric constant suffixes. */
-- 
1.7.6


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 00:19:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 00:19:44 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO3Nn-0007TN-BR; Wed, 09 Nov 2011 00:19:43 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO3K0-0006kh-NZ
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 00:15:49 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1320826543!831877!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31171 invoked from network); 9 Nov 2011 08:15:45 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-7.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 08:15:45 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA98Feb8020404
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 08:15:41 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA98Fdkr028490
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 08:15:40 GMT
Received: from abhmt106.oracle.com (abhmt106.oracle.com [141.146.116.58])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA98FYO7006301; Wed, 9 Nov 2011 02:15:34 -0600
Received: from annie2.cn.oracle.com.com (/10.182.37.169)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 00:15:34 -0800
From: annie.li@oracle.com
To: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	konrad.wilk@oracle.com, jeremy@goop.org
Date: Wed,  9 Nov 2011 16:15:41 +0800
Message-Id: <1320826541-29398-1-git-send-email-annie.li@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <4EBA35D3.3020506@oracle.com>
References: <4EBA35D3.3020506@oracle.com>
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090206.4EBA36AD.0069,ss=1,re=-2.300,fgs=0
Cc: kurt.hackel@oracle.com, annie.li@oracle.com, paul.durrant@citrix.com
Subject: [Xen-devel] [PATCH 2/3] Grant tables v2 implementation.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Annie Li <annie.li@oracle.com>

Receiver-side copying of packets is based on this implementation, it gives
better performance and better CPU accounting. It totally supports three types:
full-page, sub-page and transitive grants.

However this patch does not cover sub-page and transitive grants, it mainly
focus on Full-page part and implements grant table V2 interfaces corresponding
to what already exists in grant table V1, such as: grant table V2
initialization, mapping, releasing and exported interfaces.

Each guest can only supports one type of grant table type, every entry in grant
table should be the same version. It is necessary to set V1 or V2 version before
initializing the grant table.

Grant table exported interfaces of V2 are same with those of V1, Xen is
responsible to judge what grant table version guests are using in every grant
operation.

V2 fulfills the same role of V1, and it is totally backwards compitable with V1.
If dom0 support grant table V2, the guests runing on it can run with either V1
or V2.

Signed-off-by: Annie Li <annie.li@oracle.com>
---
 arch/x86/xen/grant-table.c |   34 ++++++++-
 drivers/xen/grant-table.c  |  194 +++++++++++++++++++++++++++++++++++++++++---
 include/xen/grant_table.h  |    6 +-
 3 files changed, 220 insertions(+), 14 deletions(-)

diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c
index 65ce508..3e9f936 100644
--- a/arch/x86/xen/grant-table.c
+++ b/arch/x86/xen/grant-table.c
@@ -54,6 +54,17 @@ static int map_pte_fn(pte_t *pte, struct page *pmd_page,
 	return 0;
 }
 
+/*32bits is not enough since Xen supports sparse physical memory*/
+static int map_pte_fn_status(pte_t *pte, struct page *pmd_page,
+			     unsigned long addr, void *data)
+{
+	uint64_t **frames = (uint64_t **)data;
+
+	set_pte_at(&init_mm, addr, pte, mfn_pte((*frames)[0], PAGE_KERNEL));
+	(*frames)++;
+	return 0;
+}
+
 static int unmap_pte_fn(pte_t *pte, struct page *pmd_page,
 			unsigned long addr, void *data)
 {
@@ -83,7 +94,28 @@ int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
 	return rc;
 }
 
-void arch_gnttab_unmap_shared(void *shared, unsigned long nr_gframes)
+int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_gframes,
+			   unsigned long max_nr_gframes,
+			   grant_status_t **__shared)
+{
+	int rc;
+	grant_status_t *shared = *__shared;
+
+	if (shared == NULL) {
+		struct vm_struct *area =
+			xen_alloc_vm_area(PAGE_SIZE * max_nr_gframes);
+		BUG_ON(area == NULL);
+		shared = area->addr;
+		*__shared = shared;
+	}
+
+	rc = apply_to_page_range(&init_mm, (unsigned long)shared,
+				 PAGE_SIZE * nr_gframes,
+				 map_pte_fn_status, &frames);
+	return rc;
+}
+
+void arch_gnttab_unmap(void *shared, unsigned long nr_gframes)
 {
 	apply_to_page_range(&init_mm, (unsigned long)shared,
 			    PAGE_SIZE * nr_gframes, unmap_pte_fn, NULL);
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
index 0d481a9..a3294a26 100644
--- a/drivers/xen/grant-table.c
+++ b/drivers/xen/grant-table.c
@@ -44,6 +44,7 @@
 #include <xen/page.h>
 #include <xen/grant_table.h>
 #include <xen/interface/memory.h>
+#include <xen/hvc-console.h>
 #include <asm/xen/hypercall.h>
 
 #include <asm/pgtable.h>
@@ -53,7 +54,10 @@
 /* External tools reserve first few grant table entries. */
 #define NR_RESERVED_ENTRIES 8
 #define GNTTAB_LIST_END 0xffffffff
-#define GREFS_PER_GRANT_FRAME (PAGE_SIZE / sizeof(struct grant_entry_v1))
+#define GREFS_PER_GRANT_FRAME \
+(grant_table_version == 1 ?                      \
+ (PAGE_SIZE / sizeof(struct grant_entry_v1)) :   \
+ (PAGE_SIZE / sizeof(union grant_entry_v2)))
 
 static grant_ref_t **gnttab_list;
 static unsigned int nr_grant_frames;
@@ -66,6 +70,7 @@ EXPORT_SYMBOL_GPL(xen_hvm_resume_frames);
 
 static union {
 	struct grant_entry_v1 *v1;
+	union grant_entry_v2 *v2;
 	void *ring_addr;
 } shared;
 
@@ -75,12 +80,25 @@ static union {
  */
 static int gnttab_map_status_v1(unsigned int nr_gframes);
 /*
+ * Mapping grant entry status into a list of frames, returning GNTST_okay means
+ * success and negative value means failure.
+ */
+static int gnttab_map_status_v2(unsigned int nr_gframes);
+/*
  * This function is null for grant table v1, adding it here in order to keep
  * consistent with *_v2 interface.
  */
 static void gnttab_unmap_status_v1(void);
+/*
+ * Release a list of frames mapped in gnttab_map_status_** for grant entry
+ * status.
+ */
+static void gnttab_unmap_status_v2(void);
 
-/*This is a structure of function pointers for grant table v1*/
+/*
+ * This is a structure of function pointers which allows v1 and v2 to use
+ * identical interface.
+ */
 static struct {
 	/*
 	 * Mapping a list of frames for storing grant entry status, this
@@ -129,6 +147,9 @@ static struct {
 	int (*_gnttab_query_foreign_access)(grant_ref_t);
 } gnttab_interface;
 
+/*This reflects status of grant entries, so act as a global value*/
+static grant_status_t *grstatus;
+
 static int grant_table_version;
 
 static struct gnttab_free_callback *gnttab_free_callback_list;
@@ -136,6 +157,7 @@ static struct gnttab_free_callback *gnttab_free_callback_list;
 static int gnttab_expand(unsigned int req_entries);
 
 #define RPP (PAGE_SIZE / sizeof(grant_ref_t))
+#define SPP (PAGE_SIZE / sizeof(grant_status_t))
 
 static inline grant_ref_t *__gnttab_entry(grant_ref_t entry)
 {
@@ -216,6 +238,15 @@ static void update_grant_entry_v1(grant_ref_t ref, domid_t domid,
 	shared.v1[ref].flags = flags;
 }
 
+static void update_grant_entry_v2(grant_ref_t ref, domid_t domid,
+				  unsigned long frame, unsigned flags)
+{
+	shared.v2[ref].full_page.frame = frame;
+	shared.v2[ref].hdr.domid = domid;
+	wmb();
+	shared.v2[ref].hdr.flags = GTF_permit_access | flags;
+}
+
 static void update_grant_entry(grant_ref_t ref, domid_t domid,
 			       unsigned long frame, unsigned flags)
 {
@@ -264,6 +295,11 @@ int gnttab_query_foreign_access_v1(grant_ref_t ref)
 	return shared.v1[ref].flags & (GTF_reading|GTF_writing);
 }
 
+int gnttab_query_foreign_access_v2(grant_ref_t ref)
+{
+	return grstatus[ref] & (GTF_reading|GTF_writing);
+}
+
 int gnttab_query_foreign_access(grant_ref_t ref)
 {
 	return gnttab_interface._gnttab_query_foreign_access(ref);
@@ -289,6 +325,29 @@ int gnttab_end_foreign_access_ref_v1(grant_ref_t ref, int readonly)
 	return 1;
 }
 
+int gnttab_end_foreign_access_ref_v2(grant_ref_t ref, int readonly)
+{
+	shared.v2[ref].hdr.flags = 0;
+	mb();
+	if (grstatus[ref] & (GTF_reading|GTF_writing)) {
+		return 0;
+	} else {
+		/* The read of grstatus needs to have acquire
+		semantics.  On x86, reads already have
+		that, and we just need to protect against
+		compiler reorderings.  On other
+		architectures we may need a full
+		barrier. */
+#ifdef CONFIG_X86
+		barrier();
+#else
+		mb();
+#endif
+		}
+
+	return 1;
+}
+
 int gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly)
 {
 	return gnttab_interface._gnttab_end_foreign_access_ref(ref, readonly);
@@ -362,6 +421,37 @@ unsigned long gnttab_end_foreign_transfer_ref_v1(grant_ref_t ref)
 	return frame;
 }
 
+unsigned long gnttab_end_foreign_transfer_ref_v2(grant_ref_t ref)
+{
+	unsigned long frame;
+	u16           flags;
+	u16          *pflags;
+
+	pflags = &shared.v2[ref].hdr.flags;
+
+	/*
+	 * If a transfer is not even yet started, try to reclaim the grant
+	 * reference and return failure (== 0).
+	 */
+	while (!((flags = *pflags) & GTF_transfer_committed)) {
+		if (sync_cmpxchg(pflags, flags, 0) == flags)
+			return 0;
+		cpu_relax();
+	}
+
+	/* If a transfer is in progress then wait until it is completed. */
+	while (!(flags & GTF_transfer_completed)) {
+		flags = *pflags;
+		cpu_relax();
+	}
+
+	rmb();  /* Read the frame number /after/ reading completion status. */
+	frame = shared.v2[ref].full_page.frame;
+	BUG_ON(frame == 0);
+
+	return frame;
+}
+
 unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref)
 {
 	return gnttab_interface._gnttab_end_foreign_transfer_ref(ref);
@@ -588,7 +678,7 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,
 EXPORT_SYMBOL_GPL(gnttab_map_refs);
 
 int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
-		struct page **pages, unsigned int count)
+		      struct page **pages, unsigned int count)
 {
 	int i, ret;
 
@@ -609,18 +699,54 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
 }
 EXPORT_SYMBOL_GPL(gnttab_unmap_refs);
 
+static unsigned nr_status_frames(unsigned nr_grant_frames)
+{
+	return (nr_grant_frames * GREFS_PER_GRANT_FRAME + SPP - 1) / SPP;
+}
+
 static void gnttab_request_version(void)
 {
-	grant_table_version = 1;
-	gnttab_interface._gnttab_map_status = gnttab_map_status_v1;
-	gnttab_interface._gnttab_unmap_status = gnttab_unmap_status_v1;
-	gnttab_interface._update_grant_entry = update_grant_entry_v1;
-	gnttab_interface._gnttab_end_foreign_access_ref =
+	int rc;
+	struct gnttab_set_version gsv;
+	const char *str = "we need grant tables version 2, but only version 1 is available\n";
+
+	gsv.version = 2;
+	rc = HYPERVISOR_grant_table_op(GNTTABOP_set_version, &gsv, 1);
+	if (rc == 0) {
+		grant_table_version = 2;
+		gnttab_interface._gnttab_map_status = gnttab_map_status_v2;
+		gnttab_interface._gnttab_unmap_status = gnttab_unmap_status_v2;
+		gnttab_interface._update_grant_entry = update_grant_entry_v2;
+		gnttab_interface._gnttab_end_foreign_access_ref =
+					gnttab_end_foreign_access_ref_v2;
+		gnttab_interface._gnttab_end_foreign_transfer_ref =
+					gnttab_end_foreign_transfer_ref_v2;
+		gnttab_interface._gnttab_query_foreign_access =
+					gnttab_query_foreign_access_v2;
+	} else {
+		if (grant_table_version == 2) {
+			/*
+			 * If we've already used version 2 features,
+			 * but then suddenly discover that they're not
+			 * available (e.g. migrating to an older
+			 * version of Xen), almost unbounded badness
+			 * can happen.
+			 */
+			xen_raw_printk(str);
+			panic(str);
+		}
+		grant_table_version = 1;
+		gnttab_interface._gnttab_map_status = gnttab_map_status_v1;
+		gnttab_interface._gnttab_unmap_status = gnttab_unmap_status_v1;
+		gnttab_interface._update_grant_entry = update_grant_entry_v1;
+		gnttab_interface._gnttab_end_foreign_access_ref =
 					gnttab_end_foreign_access_ref_v1;
-	gnttab_interface._gnttab_end_foreign_transfer_ref =
+		gnttab_interface._gnttab_end_foreign_transfer_ref =
 					gnttab_end_foreign_transfer_ref_v1;
-	gnttab_interface._gnttab_query_foreign_access =
+		gnttab_interface._gnttab_query_foreign_access =
 					gnttab_query_foreign_access_v1;
+
+	}
 	printk(KERN_INFO "Grant tables using version %d layout.\n",
 		grant_table_version);
 }
@@ -630,6 +756,44 @@ static int gnttab_map_status_v1(unsigned int nr_gframes)
 	return 0;
 }
 
+static int gnttab_map_status_v2(unsigned int nr_gframes)
+{
+	uint64_t *sframes;
+	unsigned int nr_sframes;
+	struct gnttab_get_status_frames getframes;
+	int rc;
+
+	nr_sframes = nr_status_frames(nr_gframes);
+
+	/* No need for kzalloc as it is initialized in following hyercall
+	 * GNTTABOP_get_status_frames.
+	 */
+	sframes = kmalloc(nr_sframes  * sizeof(uint64_t), GFP_ATOMIC);
+	if (!sframes)
+		return -ENOMEM;
+
+	getframes.dom        = DOMID_SELF;
+	getframes.nr_frames  = nr_sframes;
+	set_xen_guest_handle(getframes.frame_list, sframes);
+
+	rc = HYPERVISOR_grant_table_op(GNTTABOP_get_status_frames,
+				       &getframes, 1);
+	if (rc == -ENOSYS) {
+		kfree(sframes);
+		return -ENOSYS;
+	}
+
+	BUG_ON(rc || getframes.status);
+
+	rc = arch_gnttab_map_status(sframes, nr_sframes,
+				    nr_status_frames(gnttab_max_grant_frames()),
+				    &grstatus);
+	BUG_ON(rc);
+	kfree(sframes);
+
+	return 0;
+}
+
 static int gnttab_map_status(unsigned int nr_gframes)
 {
 	return gnttab_interface._gnttab_map_status(nr_gframes);
@@ -666,6 +830,9 @@ static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
 		return rc;
 	}
 
+	/* No need for kzalloc as it is initialized in following hyercall
+	 * GNTTABOP_setup_table.
+	 */
 	frames = kmalloc(nr_gframes * sizeof(unsigned long), GFP_ATOMIC);
 	if (!frames)
 		return -ENOMEM;
@@ -728,6 +895,11 @@ static void gnttab_unmap_status_v1(void)
 {
 }
 
+static void gnttab_unmap_status_v2(void)
+{
+	arch_gnttab_unmap(grstatus, nr_status_frames(nr_grant_frames));
+}
+
 void gnttab_unmap_status(void)
 {
 	return gnttab_interface._gnttab_unmap_status();
@@ -735,7 +907,7 @@ void gnttab_unmap_status(void)
 
 int gnttab_suspend(void)
 {
-	arch_gnttab_unmap_shared(shared.ring_addr, nr_grant_frames);
+	arch_gnttab_unmap(shared.ring_addr, nr_grant_frames);
 	gnttab_interface._gnttab_unmap_status();
 	return 0;
 }
diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
index 405879d..4568498 100644
--- a/include/xen/grant_table.h
+++ b/include/xen/grant_table.h
@@ -147,8 +147,10 @@ gnttab_set_unmap_op(struct gnttab_unmap_grant_ref *unmap, phys_addr_t addr,
 int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
 			   unsigned long max_nr_gframes,
 			   void **__shared);
-void arch_gnttab_unmap_shared(void *shared,
-			      unsigned long nr_gframes);
+int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_gframes,
+			   unsigned long max_nr_gframes,
+			   grant_status_t **__shared);
+void arch_gnttab_unmap(void *shared, unsigned long nr_gframes);
 
 extern unsigned long xen_hvm_resume_frames;
 unsigned int gnttab_max_grant_frames(void);
-- 
1.7.6


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 00:22:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 00:22:07 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO3Q6-0007y6-Uw; Wed, 09 Nov 2011 00:22:06 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO3KX-0006r4-Vz
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 00:16:23 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1320826577!2801269!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28162 invoked from network); 9 Nov 2011 08:16:18 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-4.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 08:16:18 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA98GDVa027357
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 08:16:14 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA98GDUl014792
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 08:16:13 GMT
Received: from abhmt108.oracle.com (abhmt108.oracle.com [141.146.116.60])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA98G7k5006620; Wed, 9 Nov 2011 02:16:07 -0600
Received: from annie2.cn.oracle.com.com (/10.182.37.169)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 00:16:07 -0800
From: annie.li@oracle.com
To: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	konrad.wilk@oracle.com, jeremy@goop.org
Date: Wed,  9 Nov 2011 16:16:14 +0800
Message-Id: <1320826574-29427-1-git-send-email-annie.li@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <4EBA35D3.3020506@oracle.com>
References: <4EBA35D3.3020506@oracle.com>
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090208.4EBA36CE.006B,ss=1,re=0.000,fgs=0
Cc: kurt.hackel@oracle.com, annie.li@oracle.com, paul.durrant@citrix.com
Subject: [Xen-devel] [PATCH 3/3] code clean up
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Annie Li <annie.li@oracle.com>

Signed-off-by: Annie Li <annie.li@oracle.com>
---
 drivers/xen/grant-table.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
index a3294a26..458c00d 100644
--- a/drivers/xen/grant-table.c
+++ b/drivers/xen/grant-table.c
@@ -708,7 +708,8 @@ static void gnttab_request_version(void)
 {
 	int rc;
 	struct gnttab_set_version gsv;
-	const char *str = "we need grant tables version 2, but only version 1 is available\n";
+	const char *str = "we need grant tables version 2, "
+					"but only version 1 is available\n";
 
 	gsv.version = 2;
 	rc = HYPERVISOR_grant_table_op(GNTTABOP_set_version, &gsv, 1);
-- 
1.7.6


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 00:45:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 00:45:18 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO3mY-0000xg-0G; Wed, 09 Nov 2011 00:45:18 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO3lj-0000kw-M7
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 00:44:27 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1320828263!2821508!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15122 invoked from network); 9 Nov 2011 08:44:24 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-14.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 9 Nov 2011 08:44:24 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 09 Nov 2011 08:44:22 +0000
Message-Id: <4EBA4B72020000780005FC80@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 09 Nov 2011 08:44:18 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Haitao Shan" <maillists.shan@gmail.com>,
	"Haitao Shan" <haitao.shan@intel.com>
References: <4EB26BB1020000780005EA78@nat28.tlf.novell.com>
	<04F972F38B3C4E4E91C4697DA8BF9F527E41C1F0DD@shsmsx502.ccr.corp.intel.com>
In-Reply-To: <04F972F38B3C4E4E91C4697DA8BF9F527E41C1F0DD@shsmsx502.ccr.corp.intel.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Keir Fraser <keir@xen.org>, Jun Nakajima <jun.nakajima@intel.com>,
	Donald D Dugger <donald.d.dugger@intel.com>
Subject: [Xen-devel] RE: Ping#2: [PATCH] VMX: extend last branch MSR info to
	cover newer CPU models
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 09.11.11 at 03:56, "Shan, Haitao" <haitao.shan@intel.com> wrote:
> Hi, Jan,
>=20
> I found one useful document in intel website.
> http://software.intel.com/en-us/articles/intel-processor-identification-w=
ith=20
> -cpuid-model-and-family-numbers/
> From the doc, it seems model 45 is not in the list.

Neither is model 31.

Which tells us what? That the page isn't up-to-date? After all model 31
is referenced in SDM Vol 3 appendix B.4, and model 45 in the same
document appendix B.7. They're also both in table B-1 of the SDM
doc changes (rev 032 from May this year). Or are you saying the SDM
is incorrect?

At least this answers the question raised in
http://lists.xensource.com/archives/html/xen-devel/2011-11/msg00411.html=20=

- 0x2E and 0x2F are supposed to go into the Nehalem/Westmere
group then for cpuidle purposes.

Jan

> Shan Haitao
>=20
>> -----Original Message-----
>> From: Jan Beulich [mailto:JBeulich@suse.com]=20
>> Sent: Thursday, November 03, 2011 5:24 PM
>> To: Haitao Shan; Shan, Haitao
>> Cc: Dugger, Donald D; Nakajima, Jun; xen-devel@lists.xensource.com; =
Keir
>> Fraser
>> Subject: Ping#2: [PATCH] VMX: extend last branch MSR info to cover =
newer
>> CPU models
>>=20
>> VMX: extend last branch MSR info to cover newer CPU models #2
>>=20
>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>>=20
>> --- a/xen/arch/x86/hvm/vmx/vmx.c
>> +++ b/xen/arch/x86/hvm/vmx/vmx.c
>> @@ -1738,10 +1738,9 @@ static const struct lbr_info *last_branc
>>          case 23:
>>              return c2_lbr;
>>              break;
>> -        /* Nehalem */
>> -        case 26: case 30: case 31: case 46:
>> -        /* Sandy Bridge */
>> -        case 42: case 45:
>> +        /* Nehalem/Sandy Bridge */
>> +        case 26: case 30: case 31: case 37:
>> +        case 42: case 44: case 45: case 46: case 47:
>>              return nh_lbr;
>>              break;
>>          /* Atom */
>>=20
>>=20




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 00:55:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 00:55:53 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO3wm-0001VH-HT; Wed, 09 Nov 2011 00:55:52 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO3vs-0001Ie-2U
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 00:54:56 -0800
X-Env-Sender: kgrace.liu@gmail.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1320828891!833198!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31143 invoked from network); 9 Nov 2011 08:54:52 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-9.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 08:54:52 -0000
Received: by vcbfk13 with SMTP id fk13so1683659vcb.30
	for <xen-devel@lists.xensource.com>;
	Wed, 09 Nov 2011 00:54:51 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:cc:content-type;
	bh=zIFrXPsS9ven4AJ1vrt3qk2f3sMDGVa3O5Yx9XZjoYs=;
	b=TsUlpO67xsp90NSvphhhk2cfuJDc9QX+YZb6aZymtkwlzLfjgpNZIwtownS0Vlfv0m
	k17i24tIDXEUGyYqOSJh3ztXhl5JNKAn5HsXb4pCTun84Qys5HVTPKv00Zxes0xalTmE
	EU8Zo9jJmRR85FwhMIAHk9cg03sy1NE3GzPPU=
MIME-Version: 1.0
Received: by 10.52.97.35 with SMTP id dx3mr2967241vdb.2.1320828890956; Wed, 09
	Nov 2011 00:54:50 -0800 (PST)
Received: by 10.52.25.111 with HTTP; Wed, 9 Nov 2011 00:54:50 -0800 (PST)
In-Reply-To: <alpine.DEB.2.00.1111071354570.3519@kaball-desktop>
References: <1319808450-9617-1-git-send-email-cyliu@suse.com>
	<4EB184DE020000660000603E@novprvlin0050.provo.novell.com>
	<alpine.DEB.2.00.1111071354570.3519@kaball-desktop>
Date: Wed, 9 Nov 2011 16:54:50 +0800
X-Google-Sender-Auth: NNDZ58yxjvFpJDCpZmrQY5HSupY
Message-ID: <CAERYnobDfg9pNhETxcabkGizwYowTWAVDsmHnDXH8yR4FhpsQw@mail.gmail.com>
Subject: Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images fail
From: Chunyan Liu <cyliu@suse.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0674061276=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0674061276==
Content-Type: multipart/alternative; boundary=20cf307f31a8dac2f604b14970ee

--20cf307f31a8dac2f604b14970ee
Content-Type: text/plain; charset=ISO-8859-1

2011/11/7 Stefano Stabellini <stefano.stabellini@eu.citrix.com>

> On Wed, 2 Nov 2011, Chun Yan Liu wrote:
> > Stefano, could you review the revised patch and share your comments?
> Thanks.
>
> Sure.
>
> > >>> Chunyan Liu <cyliu@suse.com> 10/28/2011 9:27 PM >>>
> > Start qemu-nbd to mount non-raw qdisk in dom0 so that xl can create PV
> guest with qcow/qcow2 disk image and using pygrub.
> > v2: use fork and exec instead of system(3)
> >
> > Signed-off-by: Chunyan Liu <cyliu@suse.com>
> >
> > diff -r b4cf57bbc3fb tools/libxl/libxl.c
> > --- a/tools/libxl/libxl.cThu Oct 20 15:24:46 2011 +0800
> > +++ b/tools/libxl/libxl.cFri Oct 28 20:50:36 2011 +0800
> > @@ -1077,6 +1077,58 @@ out_free:
> >      libxl__free_all(&gc);
> >      return rc;
> > }
> > +static int fork_exec(char *arg0, char **args)
> > +{
> > +    pid_t pid;
> > +    int status;
> > +
> > +    pid = fork();
> > +    if (pid < 0)
> > +        return -1;
> > +    else if (pid == 0){
> > +        execvp(arg0, args);
> > +        exit(127);
> > +    }
> > +    sleep(1);
>
> In a following email you wrote that without the sleep the device is
> "not prepared yet".
> What do you mean by that?
> The device is present but reading/writing to it returns an error?
>
If so, rather than a sleep we need an explicit wait for the device
> to be ready. Even trying to read from the device in a loop until it
> succeeds would be better than a sleep. At least we would know exactly
> what we are doing and why we are doing it.
>

OK, after checking qemu-nbd source code, I think I know where the problem
is. I tried to fork_exec "qemu-nbd -c /dev/nbd0 disk.img", with this
command option, qemu-nbd will call daemon(3) to run in background and
itself should exit immediately, that's why waitpid can successfully wait
the exit of qemu-nbd pid and fork_exec will return 0. The problem is that I
should not use fork_exec return value to decide if the disk.img is already
connected to nbd device. That's not correct.


> > +    while (waitpid(pid, &status, 0) < 0) {
> > +        if (errno != EINTR) {
> > +            status = -1;
> > +            break;
> > +        }
> > +    }
> > +    return status;
> > +}
>
> Here you are waiting for the death of qemu-nbd; I thought that qemu-nbd
> needs to be kept running?
>
> Same as above.


> > +static char * nbd_mount_disk(libxl__gc *gc, libxl_device_disk *disk)
> > +{
> > +    int i;
> > +    int nbds_max = 16;
> > +    char *nbd_dev = NULL;
> > +    char *args[] = {"qemu-nbd","-c",NULL,NULL,NULL};
> > +    char *ret = NULL;
> > +
> > +    for (i = 0; i < nbds_max; i++) {
> > +        nbd_dev = libxl__sprintf(gc, "/dev/nbd%d", i);
> > +        args[2] = libxl__sprintf(gc, "%s", nbd_dev);
> > +        args[3] = libxl__sprintf(gc, "%s", disk->pdev_path);
> > +        if (fork_exec(args[0], args) == 0) {
> > +            ret = strdup(nbd_dev);
> > +            break;
> > +        }
> > +    }
> > +
> > +    return ret;
> > +}
>
> This is not great. I would read /proc/partitions instead.
>
Thanks, that's a better way to find if a nbd device is free. The whole
thing (find a free nbd device and connect disk.img to that nbd device)
seems better to write a script to do that and in libxl call that script.


> Also keep in mind that xl works on BSD now so at the very least you need
> to ifdef all the linux specific code.
>

My fault, thanks for reminding.

--20cf307f31a8dac2f604b14970ee
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<br><br><div class=3D"gmail_quote">2011/11/7 Stefano Stabellini <span dir=
=3D"ltr">&lt;<a href=3D"mailto:stefano.stabellini@eu.citrix.com">stefano.st=
abellini@eu.citrix.com</a>&gt;</span><br><blockquote class=3D"gmail_quote" =
style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class=3D"im">On Wed, 2 Nov 2011, Chun Yan Liu wrote:<br>
&gt; Stefano, could you review the revised patch and share your comments? T=
hanks.<br>
<br>
</div>Sure.<br>
<div class=3D"im"><br>
&gt; &gt;&gt;&gt; Chunyan Liu &lt;<a href=3D"mailto:cyliu@suse.com">cyliu@s=
use.com</a>&gt; 10/28/2011 9:27 PM &gt;&gt;&gt;<br>
&gt; Start qemu-nbd to mount non-raw qdisk in dom0 so that xl can create PV=
 guest with qcow/qcow2 disk image and using pygrub.<br>
&gt; v2: use fork and exec instead of system(3)<br>
&gt;<br>
&gt; Signed-off-by: Chunyan Liu &lt;<a href=3D"mailto:cyliu@suse.com">cyliu=
@suse.com</a>&gt;<br>
&gt;<br>
&gt; diff -r b4cf57bbc3fb tools/libxl/libxl.c<br>
&gt; --- a/tools/libxl/libxl.cThu Oct 20 15:24:46 2011 +0800<br>
&gt; +++ b/tools/libxl/libxl.cFri Oct 28 20:50:36 2011 +0800<br>
&gt; @@ -1077,6 +1077,58 @@ out_free:<br>
&gt; =A0=A0=A0=A0 libxl__free_all(&amp;gc);<br>
&gt; =A0=A0=A0=A0 return rc;<br>
&gt; }<br>
&gt; +static int fork_exec(char *arg0, char **args)<br>
&gt; +{<br>
&gt; +=A0=A0=A0 pid_t pid;<br>
&gt; +=A0=A0=A0 int status;<br>
&gt; +<br>
&gt; +=A0=A0=A0 pid =3D fork();<br>
&gt; +=A0=A0=A0 if (pid &lt; 0)<br>
&gt; +=A0=A0=A0=A0=A0=A0=A0 return -1;<br>
&gt; +=A0=A0=A0 else if (pid =3D=3D 0){<br>
&gt; +=A0=A0=A0=A0=A0=A0=A0 execvp(arg0, args);<br>
&gt; +=A0=A0=A0=A0=A0=A0=A0 exit(127);<br>
&gt; +=A0=A0=A0 }<br>
&gt; +=A0=A0=A0 sleep(1);<br>
<br>
</div>In a following email you wrote that without the sleep the device is<b=
r>
&quot;not prepared yet&quot;.<br>
What do you mean by that?<br>
The device is present but reading/writing to it returns an error?<br></bloc=
kquote><blockquote class=3D"gmail_quote" style=3D"margin: 0pt 0pt 0pt 0.8ex=
; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
If so, rather than a sleep we need an explicit wait for the device<br>
to be ready. Even trying to read from the device in a loop until it<br>
succeeds would be better than a sleep. At least we would know exactly<br>
what we are doing and why we are doing it.<br><div class=3D"im"></div></blo=
ckquote><div><br>OK, after checking qemu-nbd source code, I think I know wh=
ere the problem is. I tried to fork_exec &quot;qemu-nbd -c /dev/nbd0 disk.i=
mg&quot;, with this command option, qemu-nbd will call daemon(3) to run in =
background and itself should exit immediately, that&#39;s why waitpid can s=
uccessfully wait the exit of qemu-nbd pid and fork_exec will return 0. The =
problem is that I should not use fork_exec return value to decide if the di=
sk.img is already connected to nbd device. That&#39;s not correct.<br>
=A0<br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0pt 0pt 0pt=
 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div=
 class=3D"im">
&gt; +=A0=A0=A0 while (waitpid(pid, &amp;status, 0) &lt; 0) {<br>
&gt; +=A0=A0=A0=A0=A0=A0=A0 if (errno !=3D EINTR) {<br>
&gt; +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 status =3D -1;<br>
&gt; +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 break;<br>
&gt; +=A0=A0=A0=A0=A0=A0=A0 }<br>
&gt; +=A0=A0=A0 }<br>
</div>&gt; +=A0=A0=A0 return status;<br>
&gt; +}<br>
<br>
Here you are waiting for the death of qemu-nbd; I thought that qemu-nbd<br>
needs to be kept running?<br>
<div class=3D"im"><br></div></blockquote><div>Same as above. <br><br></div>=
<blockquote class=3D"gmail_quote" style=3D"margin: 0pt 0pt 0pt 0.8ex; borde=
r-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div class=3D"im"=
>
<br>
&gt; +static char * nbd_mount_disk(libxl__gc *gc, libxl_device_disk *disk)<=
br>
&gt; +{<br>
&gt; +=A0=A0=A0 int i;<br>
&gt; +=A0=A0=A0 int nbds_max =3D 16;<br>
&gt; +=A0=A0=A0 char *nbd_dev =3D NULL;<br>
&gt; +=A0=A0=A0 char *args[] =3D {&quot;qemu-nbd&quot;,&quot;-c&quot;,NULL,=
NULL,NULL};<br>
&gt; +=A0=A0=A0 char *ret =3D NULL;<br>
&gt; +<br>
&gt; +=A0=A0=A0 for (i =3D 0; i &lt; nbds_max; i++) {<br>
&gt; +=A0=A0=A0=A0=A0=A0=A0 nbd_dev =3D libxl__sprintf(gc, &quot;/dev/nbd%d=
&quot;, i);<br>
&gt; +=A0=A0=A0=A0=A0=A0=A0 args[2] =3D libxl__sprintf(gc, &quot;%s&quot;, =
nbd_dev);<br>
&gt; +=A0=A0=A0=A0=A0=A0=A0 args[3] =3D libxl__sprintf(gc, &quot;%s&quot;, =
disk-&gt;pdev_path);<br>
&gt; +=A0=A0=A0=A0=A0=A0=A0 if (fork_exec(args[0], args) =3D=3D 0) {<br>
&gt; +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ret =3D strdup(nbd_dev);<br>
&gt; +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 break;<br>
&gt; +=A0=A0=A0=A0=A0=A0=A0 }<br>
&gt; +=A0=A0=A0 }<br>
&gt; +<br>
&gt; +=A0=A0=A0 return ret;<br>
&gt; +}<br>
<br>
</div>This is not great. I would read /proc/partitions instead.<br></blockq=
uote><div>Thanks, that&#39;s a better way to find if a nbd device is free. =
The whole thing (find a free nbd device and connect disk.img to that nbd de=
vice) seems better to write a script to do that and in libxl call that scri=
pt.<br>
=A0<br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0pt 0pt 0pt=
 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Also keep in mind that xl works on BSD now so at the very least you need<br=
>
to ifdef all the linux specific code.<br></blockquote><div><br>My fault, th=
anks for reminding. <br></div></div><br>

--20cf307f31a8dac2f604b14970ee--


--===============0674061276==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0674061276==--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 01:03:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 01:03:18 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO43w-0001zu-Vy; Wed, 09 Nov 2011 01:03:17 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO409-0001kf-P6
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 01:00:03 -0800
X-Env-Sender: yujiageng734@gmail.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1320829119!56074447!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2710 invoked from network); 9 Nov 2011 08:58:40 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 08:58:40 -0000
Received: by iaqq3 with SMTP id q3so1898325iaq.30
	for <xen-devel@lists.xensource.com>;
	Wed, 09 Nov 2011 00:59:16 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type:content-transfer-encoding;
	bh=ZaeTWuzz1lotsK5P+iwxAjIJD5smGqVa2eQG1kL5+vQ=;
	b=X7YLlxo1od0ylpz+UwnyhlTC8ghBPGnqi2uduRHONBwx01P12c2tmJVw76rtAXiXIJ
	00yEofSJs4PIB4VOEwtwheoSDY+kND8o417xtqu4DX2rc4gBXDwaXMXRiYNpapn9h5fO
	OgBOyQAx5tyGKx1pfMYXms/7voiKzOGXZBLY4=
MIME-Version: 1.0
Received: by 10.42.149.71 with SMTP id u7mr1415430icv.37.1320829156061; Wed,
	09 Nov 2011 00:59:16 -0800 (PST)
Received: by 10.42.170.197 with HTTP; Wed, 9 Nov 2011 00:59:15 -0800 (PST)
In-Reply-To: <alpine.DEB.2.00.1111081412270.3519@kaball-desktop>
References: <alpine.DEB.2.00.1109021401000.12963@kaball-desktop>
	<CA8694A1.20379%keir.xen@gmail.com>
	<CAJ0pt17eoZbEnmziLaSd1Cxi+sU90rJ-c8TSgt+ikE3wZj1jhA@mail.gmail.com>
	<alpine.DEB.2.00.1109151110020.12963@kaball-desktop>
	<CAJ0pt15daSuXGi_8T3NS53E2Xv0bYV90b94100Wi6ajt99gedQ@mail.gmail.com>
	<alpine.DEB.2.00.1111081412270.3519@kaball-desktop>
Date: Wed, 9 Nov 2011 16:59:15 +0800
Message-ID: <CAJ0pt154u9GY-6x6ZJA2UDyfgE135hZkr27XHnJ2ooaaNtTEmw@mail.gmail.com>
Subject: Re: [Xen-devel] Re: Linux Stubdom Problem
From: Jiageng Yu <yujiageng734@gmail.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	"Tim \(Xen.org\)" <tim@xen.org>, Keir Fraser <keir.xen@gmail.com>,
	Anthony PERARD <anthony.perard@gmail.com>,
	Samuel Thibault <samuel.thibault@ens-lyon.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

2011/11/9 Stefano Stabellini <stefano.stabellini@eu.citrix.com>
>
> On Thu, 27 Oct 2011, Jiageng Yu wrote:
> > Hi Stefano,
> >
> > =C2=A0 =C2=A0 =C2=A0 I have some progress in linux based stubdom projec=
t. As shown in the
> > attached video, I have started the emulated vga device in the linux
> > based stubdom.
> >
> > =C2=A0 =C2=A0 =C2=A0 In a short conclusion, for the linux based stubdom=
, there are two
> > major problems about vga device emulation. The first is the vram
> > mapping, which we discussed a lot previously and handled it.
>
> Do you have an updated version of the patch you used?
>
>
> > Another
> > is the vga BIOS mapping (address 0xc0000-0xc8fff of hvm guest).
>
> This is caused by qemu trying to map that memory area in its own address
> space, right?
>
>
> > =C2=A0 =C2=A0 =C2=A0 I found the vga BIOS mapping problem in remap_area=
_mfn_pte_fn()
> > function. The pte_mkspecial() will return invalid value when I try to
> > map 0xc0000-0xc8fff into linux based stubdom.
>
> What is exactly the error you are seeing?
>
>
> > pte_mkspecial()
> > =C2=A0 =C2=A0 =C2=A0 ->pte_set_flags()
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ->native_pte_val()
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ->native_make_pte()
> >
> > =C2=A0 =C2=A0 =C2=A0 According to my test, the root cause of vga BIOS m=
apping problem is
> > native_xxx functions. We could avoid the problem by invoking functions
> > defined in paravirt.h instead. The patch is as follows. But I think it
> > is not a good way to handle the problem. Maybe you can give me some
> > suggestions.
> >
> > =C2=A0 =C2=A0 =C2=A0 I also found the hard disk didn=C3=83??=C3=83?????=
=C3=83??=C3=83????=C3=83??=C3=83???=C3=83??=C3=83??=C3=83??=C3=83?=C3=82=C2=
=A2??t work well. I will investigate it these days.
> >
> >
> > --- a/arch/x86/xen/mmu.c
> > +++ b/arch/x86/xen/mmu.c
> > @@ -2639,12 +2640,16 @@ static int remap_area_mfn_pte_fn(pte_t *ptep,
> > pgtable_t token,
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned long addr, void *data)
> > =C2=A0{
> > =C2=A0 =C2=A0 =C2=A0 struct remap_data *rmd =3D data;
> > - =C2=A0 =C2=A0 pte_t pte =3D pte_mkspecial(pfn_pte(rmd->mfn++, rmd->pr=
ot));
> > + =C2=A0 =C2=A0if((rmd->mfn & 0xfffffff0) =3D=3D 0xc0){
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 pte_t pte =3D pfn_pte(rmd->mfn++, rmd->pr=
ot);
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 rmd->mmu_update->val =3D pte_val(pte);
> > + =C2=A0 =C2=A0}else{
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 pte_t pte =3D pte_mkspecial(pfn_pte(rmd->=
mfn++, rmd->prot));
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 rmd->mmu_update->val =3D pte_val_ma(pte);
> > + =C2=A0 =C2=A0}
>
> Even if the fix is not the correct one I think I might understand what
> the real problem is:
>
> pfn_pte -> xen_make_pte
>
> if (unlikely(pte & _PAGE_IOMAP) &&
> =C2=A0 =C2=A0 =C2=A0 =C2=A0(xen_initial_domain() || addr >=3D ISA_END_ADD=
RESS)) {
> =C2=A0 =C2=A0pte =3D iomap_pte(pte);
> } else {
> =C2=A0 =C2=A0pte &=3D ~_PAGE_IOMAP;
> =C2=A0 =C2=A0pte =3D pte_pfn_to_mfn(pte);
> }
>
> considering that in this case xen_initial_domain() returns false and
> addr is < ISA_END_ADDRESS (it is a gpfn address), xen_make_pte is going
> to threat the mfn as a pfn erroneously.
>
> In your patch you replaced pte_val_ma with pte_val that does the
> opposite translation (mfn -> pfn) so the end result is that you get the
> original mfn in rmd->mmu_update->val.
>

Indeed!

> The real fix should something along these lines:
>
>
>
> diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
> index 3dd53f9..f2fadfc 100644
> --- a/arch/x86/xen/mmu.c
> +++ b/arch/x86/xen/mmu.c
> @@ -422,7 +422,7 @@ static pteval_t xen_pte_val(pte_t pte)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pteval =3D (pteval=
 & ~_PAGE_PAT) | _PAGE_PWT;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>
> - =C2=A0 =C2=A0 =C2=A0 if (xen_initial_domain() && (pteval & _PAGE_IOMAP)=
)
> + =C2=A0 =C2=A0 =C2=A0 if (pteval & _PAGE_IOMAP)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return pteval;
>
> =C2=A0 =C2=A0 =C2=A0 =C2=A0return pte_mfn_to_pfn(pteval);
> @@ -483,8 +483,7 @@ static pte_t xen_make_pte(pteval_t pte)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 * mappings are just dummy local mappings to k=
eep other
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 * parts of the kernel happy.
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 */
> - =C2=A0 =C2=A0 =C2=A0 if (unlikely(pte & _PAGE_IOMAP) &&
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (xen_initial_domain() || addr >=3D I=
SA_END_ADDRESS)) {
> + =C2=A0 =C2=A0 =C2=A0 if (unlikely(pte & _PAGE_IOMAP)) {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pte =3D iomap_pte(=
pte);
> =C2=A0 =C2=A0 =C2=A0 =C2=A0} else {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pte &=3D ~_PAGE_IO=
MAP;
> ---
>
> Could you please confirm whether this patch fixes your problem?


Sorry, it did=C2=A0not=C2=A0succeed. The Linux stubdom kernel crashed durin=
g
booting. The debug info is as follows.


<5>Linux version 2.6.32.41 (root@localhost.localdomain) (gcc version
4.4.1 20090725 (Red Hat 4.4.1-2) (GCC) ) #1 Wed Nov 9 15:26:21 GMT
2011
<6>KERNEL supported cpus:
<6>  Intel GenuineIntel
<6>  AMD AuthenticAMD
<6>  NSC Geode by NSC
<6>  Cyrix CyrixInstead
<6>  Centaur CentaurHauls
<6>  Transmeta GenuineTMx86
<6>  Transmeta TransmetaCPU
<6>  UMC UMC UMC UMC
<6>released 0 pages of unused memory
<6>BIOS-provided physical RAM map:
<6> Xen: 0000000000000000 - 00000000000a0000 <c>(usable)<c>
<6> Xen: 00000000000a0000 - 0000000000100000 <c>(reserved)<c>
<6> Xen: 0000000000100000 - 0000000004000000 <c>(usable)<c>
(XEN) mm.c:859:d36 Non-privileged (36) attempt to map I/O space 000000f0
(XEN) mm.c:5046:d36 ptwr_emulate: could not get_page_from_l1e()
(XEN) d36:v0: unhandled page fault (ec=3D0003)
(XEN) Pagetable walk from c038c000:
(XEN)  L3[0x003] =3D 000000009791d001 000003c8
(XEN)  L2[0x001] =3D 0000000097d34067 000012f1
(XEN)  L1[0x18c] =3D 0000000093df9061 0000038c
(XEN) domain_crash_sync called from entry.S (ff1ddf7c)
(XEN) Domain 36 (vcpu#0) crashed on cpu#3:
(XEN) ----[ Xen-4.2-unstable  x86_32p  debug=3Dy  Not tainted ]----
(XEN) CPU:    3
(XEN) EIP:    e019:[<c01048bc>]
(XEN) EFLAGS: 00000246   EM: 1   CONTEXT: pv guest
(XEN) eax: 00000000   ebx: c038c000   ecx: 00000000   edx: c0320000
(XEN) esi: 000f0463   edi: 00000000   ebp: c038c000   esp: c0321e8c
(XEN) cr0: 8005003b   cr4: 000426f4   cr3: 00a96200   cr2: c038c000
(XEN) ds: e021   es: e021   fs: 0000   gs: 0000   ss: e021   cs: e019
(XEN) Guest stack trace from esp=3Dc0321e8c:
(XEN)    00000003 c01048bc 0001e019 00010046 f5600000 000f0000 00000000 c03=
563c8
(XEN)    000f0000 00000000 000f0000 00000000 000f0000 00000000 c035677e 000=
00563
(XEN)    80000000 c0368f78 c0368f7e c0349728 c0214090 00000010 00000000 000=
001ff
(XEN)    00000000 c036b550 c038ed40 c0321fd4 c035683e 00000563 80000000 c03=
62757
(XEN)    00000000 c0368f7e 00000000 c02de171 00000000 00000000 c036b550 c03=
8ed40
(XEN)    c0321fd4 00000000 c036b550 c038ed40 c0321fd4 c034cf01 00000004 000=
00000
(XEN)    ffffffff 0000000a ffffffff ffffffff c0321fc4 00000035 00000000 c03=
21fd0
(XEN)    ffffffff ffffffff c0393360 c0393160 00000200 c02e3791 00000004 000=
00000
(XEN)    ffffffff 0000000a ffffffff c0321fcc c0214090 00000090 c02de1cc c03=
21fcc
(XEN)    c029f093 c0321fd0 02040800 00534000 c032aa7c 00000000 c03494d5 c02=
de1cc
(XEN)    c02a3020 c02e3791 c036ace0 02040800 c034b11c 00000000 1f898175 8c0=
80201
(XEN)    02040800 0001067a 00000000 c12eb000 00000000 00000000 00000000 000=
00000
(XEN)    00000000 00000000 00000000 9791d001 00000000 00000000 00000000 000=
00000
(XEN)    00000000 00000000 00000000 00000000 00000000 00000000 00000000 000=
00000
(XEN)    00000000 00000000 00000000 00000000 00000000 00000000 00000000 000=
00000
(XEN)    00000000 00000000 00000000 00000000 00000000 00000000 00000000 000=
00000
(XEN)    00000000 00000000 00000000 00000000 00000000 00000000 00000000 000=
00000
(XEN)    00000000 00000000 00000000 00000000 00000000 00000000 00000000 000=
00000
(XEN)    00000000 00000000 00000000 00000000 00000000 00000000 00000000 000=
00000
(XEN)    00000000 00000000 00000000 00000000 00000000 00000000 00000000 000=
00000


>
> Konrad, do you know if this could have any unintended consequences?
> I don't think it can be a problem security wise because Xen is going to
> do all the permission checks anyway.
> The only problem I can see is if a domU is going to call xen_make_pte
> with _PAGE_IOMAP and a pfn->mfn translation is supposed to happen.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 01:09:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 01:09:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO49o-0002X2-Qa; Wed, 09 Nov 2011 01:09:20 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO46N-0002CJ-RR
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 01:05:51 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1320829543!1878330!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30019 invoked from network); 9 Nov 2011 09:05:44 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-13.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 9 Nov 2011 09:05:44 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA995dfN015200
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 09:05:40 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA995cuZ018902
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 09:05:39 GMT
Received: from abhmt115.oracle.com (abhmt115.oracle.com [141.146.116.67])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA995X8X031444; Wed, 9 Nov 2011 03:05:33 -0600
Received: from [10.182.39.81] (/10.182.39.81)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 01:05:33 -0800
Message-ID: <4EBA4258.3070800@oracle.com>
Date: Wed, 09 Nov 2011 17:05:28 +0800
From: ANNIE LI <annie.li@oracle.com>
Organization: Oracle Corporation
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;
	rv:1.9.2.23) Gecko/20110920 Thunderbird/3.1.15
MIME-Version: 1.0
To: linux-kernel@vger.kernel.org,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, jeremy@goop.org
Subject: Re: [Xen-devel] patches of upstreaming grant table version 2
References: <4EBA35D3.3020506@oracle.com>
In-Reply-To: <4EBA35D3.3020506@oracle.com>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090202.4EBA4264.00DF,ss=1,re=0.000,fgs=0
Cc: Kurt Hackel <Kurt.Hackel@oracle.com>,
	Paul Durrant <paul.durrant@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Diff and shortlog:

  arch/x86/xen/grant-table.c          |   39 ++++-
  drivers/xen/grant-table.c           |  354 
++++++++++++++++++++++++++++++++---
  include/xen/grant_table.h           |    8 +-
  include/xen/interface/grant_table.h |  167 ++++++++++++++++-
  include/xen/interface/xen.h         |    2 +
  5 files changed, 534 insertions(+), 36 deletions(-)

Annie Li (3):
       Introducing grant table V2 stucture
       Grant tables v2 implementation.
       code clean up

Thanks
Annie

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 01:11:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 01:11:45 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO4C9-0002ut-0D; Wed, 09 Nov 2011 01:11:45 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RO48h-0002L4-5Z
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 01:08:15 -0800
X-Env-Sender: haitao.shan@intel.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1320829686!831303!1
X-Originating-IP: [143.182.124.21]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22428 invoked from network); 9 Nov 2011 09:08:07 -0000
Received: from mga03.intel.com (HELO mga03.intel.com) (143.182.124.21)
	by server-13.tower-174.messagelabs.com with SMTP;
	9 Nov 2011 09:08:07 -0000
Received: from azsmga001.ch.intel.com ([10.2.17.19])
	by azsmga101.ch.intel.com with ESMTP; 09 Nov 2011 01:08:05 -0800
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.69,483,1315206000"; 
	d="p7s'?scan'208";a="72175696"
Received: from pgsmsx601.gar.corp.intel.com ([10.221.43.69])
	by azsmga001.ch.intel.com with ESMTP; 09 Nov 2011 01:08:04 -0800
Received: from pgsmsx104.gar.corp.intel.com (10.221.44.91) by
	pgsmsx601.gar.corp.intel.com (10.221.43.69) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Wed, 9 Nov 2011 17:07:53 +0800
Received: from shsmsx602.ccr.corp.intel.com (10.239.4.104) by
	PGSMSX104.gar.corp.intel.com (10.221.44.91) with Microsoft SMTP Server
	(TLS) id 14.1.323.3; Wed, 9 Nov 2011 17:07:53 +0800
Received: from shsmsx502.ccr.corp.intel.com ([10.239.4.96]) by
	SHSMSX602.ccr.corp.intel.com ([10.239.4.104]) with mapi; Wed, 9 Nov 2011
	17:07:51 +0800
From: "Shan, Haitao" <haitao.shan@intel.com>
To: Jan Beulich <JBeulich@suse.com>, Haitao Shan <maillists.shan@gmail.com>
Date: Wed, 9 Nov 2011 17:07:50 +0800
Thread-Topic: Ping#2: [PATCH] VMX: extend last branch MSR info to cover
	newer CPU models
Thread-Index: Acyeu8pfa4jDxPgfTl26PZrsJ0g1kwAAav3g
Message-ID: <04F972F38B3C4E4E91C4697DA8BF9F527E41C1F4B9@shsmsx502.ccr.corp.intel.com>
References: <4EB26BB1020000780005EA78@nat28.tlf.novell.com>
	<04F972F38B3C4E4E91C4697DA8BF9F527E41C1F0DD@shsmsx502.ccr.corp.intel.com>
	<4EBA4B72020000780005FC80@nat28.tlf.novell.com>
In-Reply-To: <4EBA4B72020000780005FC80@nat28.tlf.novell.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: yes
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Keir Fraser <keir@xen.org>, "Nakajima,
	Jun" <jun.nakajima@intel.com>, "Dugger,
	Donald D" <donald.d.dugger@intel.com>
Subject: [Xen-devel] RE: Ping#2: [PATCH] VMX: extend last branch MSR info to
 cover newer CPU models
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============2050745199=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============2050745199==
Content-Language: en-US
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature";
	micalg=SHA1; boundary="----=_NextPart_000_009E_01CC9F02.1C59CD20"

------=_NextPart_000_009E_01CC9F02.1C59CD20
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: 7bit

Frankly speaking, it is also a puzzle to me how to get an accurate
exhaustive list of {Family, Model} given an architecture. Anyway, my thought
is "if any models are listed in any intel public document, that information
should be accurate". I myself does not know that SDMs also contains such
kind of info. 

Thus, I can ACK your patch now.

Shan Haitao

> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@suse.com]
> Sent: Wednesday, November 09, 2011 4:44 PM
> To: Haitao Shan; Shan, Haitao
> Cc: Dugger, Donald D; Nakajima, Jun; xen-devel@lists.xensource.com; Keir
> Fraser
> Subject: RE: Ping#2: [PATCH] VMX: extend last branch MSR info to cover
> newer CPU models
> 
> >>> On 09.11.11 at 03:56, "Shan, Haitao" <haitao.shan@intel.com> wrote:
> > Hi, Jan,
> >
> > I found one useful document in intel website.
> > http://software.intel.com/en-us/articles/intel-processor-identificatio
> > n-with
> > -cpuid-model-and-family-numbers/
> > From the doc, it seems model 45 is not in the list.
> 
> Neither is model 31.
> 
> Which tells us what? That the page isn't up-to-date? After all model 31 is
> referenced in SDM Vol 3 appendix B.4, and model 45 in the same document
> appendix B.7. They're also both in table B-1 of the SDM doc changes (rev
032
> from May this year). Or are you saying the SDM is incorrect?
> 
> At least this answers the question raised in
> http://lists.xensource.com/archives/html/xen-devel/2011-
> 11/msg00411.html
> - 0x2E and 0x2F are supposed to go into the Nehalem/Westmere group then
> for cpuidle purposes.
> 
> Jan
> 
> > Shan Haitao
> >
> >> -----Original Message-----
> >> From: Jan Beulich [mailto:JBeulich@suse.com]
> >> Sent: Thursday, November 03, 2011 5:24 PM
> >> To: Haitao Shan; Shan, Haitao
> >> Cc: Dugger, Donald D; Nakajima, Jun; xen-devel@lists.xensource.com;
> >> Keir Fraser
> >> Subject: Ping#2: [PATCH] VMX: extend last branch MSR info to cover
> >> newer CPU models
> >>
> >> VMX: extend last branch MSR info to cover newer CPU models #2
> >>
> >> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> >>
> >> --- a/xen/arch/x86/hvm/vmx/vmx.c
> >> +++ b/xen/arch/x86/hvm/vmx/vmx.c
> >> @@ -1738,10 +1738,9 @@ static const struct lbr_info *last_branc
> >>          case 23:
> >>              return c2_lbr;
> >>              break;
> >> -        /* Nehalem */
> >> -        case 26: case 30: case 31: case 46:
> >> -        /* Sandy Bridge */
> >> -        case 42: case 45:
> >> +        /* Nehalem/Sandy Bridge */
> >> +        case 26: case 30: case 31: case 37:
> >> +        case 42: case 44: case 45: case 46: case 47:
> >>              return nh_lbr;
> >>              break;
> >>          /* Atom */
> >>
> >>
> 
> 


------=_NextPart_000_009E_01CC9F02.1C59CD20
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"

MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIYUDCCAyAw
ggKJoAMCAQICBDXe9M8wDQYJKoZIhvcNAQEFBQAwTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0Vx
dWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw05
ODA4MjIxNjQxNTFaFw0xODA4MjIxNjQxNTFaME4xCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdFcXVp
ZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwgZ8wDQYJ
KoZIhvcNAQEBBQADgY0AMIGJAoGBAMFdsVhnCGLuoJotHwhtkRRomAoe/toEbxOEYiHD0XzOnwXg
uAHwTjTs4oqVBGSs8WtTXwWzy2eAv0ICjv7dAQns4QAUT/z78AzdQ7pbK+EfgHCZFVeTFvEPl2q3
wmgjHMxNWTCsUR47ryvW7mNFe8XZX1DS41APOojnvxT94Me5AgMBAAGjggEJMIIBBTBwBgNVHR8E
aTBnMGWgY6BhpF8wXTELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTENMAsGA1UEAxMEQ1JMMTAaBgNVHRAE
EzARgQ8yMDE4MDgyMjE2NDE1MVowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFEjmaPkr0rKV10fY
IyAQTzOYkJ/UMB0GA1UdDgQWBBRI5mj5K9KylddH2CMgEE8zmJCf1DAMBgNVHRMEBTADAQH/MBoG
CSqGSIb2fQdBAAQNMAsbBVYzLjBjAwIGwDANBgkqhkiG9w0BAQUFAAOBgQBYzinq/Pfetc4CuRe1
hdG54+CVzCUxDQCmkm5/tpJjnlCV0Zpv5BHeY4VumO6o/1rI01WyZnFX3sAh6z0qpyNJAQSGQnv8
7n+iFlK1Z2fTQNs7JliyKHc9rhR3Ydb6KmYnoA36p3Nc6nDxlCFlRF/6/O8paKmih3nvee9PrAd3
ODCCAz0wggKmoAMCAQICAwWw/zANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
MB4XDTA2MDIxNjE4MDEzMFoXDTE2MDIxOTE4MDEzMFowUjELMAkGA1UEBhMCVVMxGjAYBgNVBAoT
EUludGVsIENvcnBvcmF0aW9uMScwJQYDVQQDEx5JbnRlbCBFeHRlcm5hbCBCYXNpYyBQb2xpY3kg
Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBpd/XOb9QVqEZ8mQ1042TdOIq3ATD
IsV2xDyt30yLyMR5Wjtus0bn3B+he89BiNO/LP6+rFzEwlD55PlX+HLGIKeNNG97dqyc30FElEUj
ZzTZFq2N4e3kVJ/XAEEgANzV8v9qp7qWwxugPgfc3z9BkYot+CifozexHLb/hEZj+yISCU61kRZv
uSQ0E11yYL4dRgcglJeaHo3oX57rvIckaLsYV5/1Aj+R8DM1Ppk965XQAKsHfnyT7C4S50T4lVn4
lz36wOdNZn/zegG1zp41lnoTFfT4KuKVJH5x7YD1p6KbgJCKLovnujGuohquBNfdXKpZkvz6pGv+
iC1HawJdAgMBAAGjgaAwgZ0wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQaxgxKxEdvqNutK/D0
Vgaj7TdUDDA6BgNVHR8EMzAxMC+gLaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3Nl
Y3VyZWNhLmNybDAfBgNVHSMEGDAWgBRI5mj5K9KylddH2CMgEE8zmJCf1DAPBgNVHRMBAf8EBTAD
AQH/MA0GCSqGSIb3DQEBBQUAA4GBABMQOK2kVKVIlUWwLTdywJ+e2O+PC/uQltK2F3lRyrPfBn69
tOkIP4SgDJOfsxyobIrPLe75kBLw+Dom13OBDp/EMZJZ1CglQfVV8co9mT3aZMjSGGQiMgkJLR3j
Mfr900fXZKj5XeqCJ+JP0mEhJGEdVCY+FFlksJjV86fDrq1QMIIFijCCBHKgAwIBAgIKYSCKYgAA
AAAACDANBgkqhkiG9w0BAQUFADBSMQswCQYDVQQGEwJVUzEaMBgGA1UEChMRSW50ZWwgQ29ycG9y
YXRpb24xJzAlBgNVBAMTHkludGVsIEV4dGVybmFsIEJhc2ljIFBvbGljeSBDQTAeFw0wOTA1MTUx
OTI3MjZaFw0xNTA1MTUxOTM3MjZaMFYxCzAJBgNVBAYTAlVTMRowGAYDVQQKExFJbnRlbCBDb3Jw
b3JhdGlvbjErMCkGA1UEAxMiSW50ZWwgRXh0ZXJuYWwgQmFzaWMgSXNzdWluZyBDQSAzQjCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKQEM1Wn9TU9vc9C+/Tc7KB+eiYElmrcEWE32WUd
HvWG+IcQHVQsikTmMyKKojNLw2B5s6Iekc8ivDo/wCfjZzX9JyftMnc+AArc0la87Olybzm8K9jX
EfTBvTnUSFSiI9ZYefITdiUgqlAFuljFZEHYKYtLuhrRacpmQfP4mV63NKdc2bT804HRf6YptZFa
4k6YN94zlrGNrBuQQ74WFzz/jLBusbUpEkro6Mu/ZYFOFWQrV9lBhF9Ruk8yN+3N6n9fUo/qBigi
F2kEn9xVh1ykl7SCGL2jBUkXx4qgV27a6Si8lRRdgrHGtN/HWnSWlLXTH5l575H4Lq++77OFv38C
AwEAAaOCAlwwggJYMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFA7GKvdZsggQkCVvw939imYx
MCvFMAsGA1UdDwQEAwIBhjASBgkrBgEEAYI3FQEEBQIDAQABMCMGCSsGAQQBgjcVAgQWBBQ5oFY2
ekKQ/5Ktim+VdMeSWb4QWTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAfBgNVHSMEGDAWgBQa
xgxKxEdvqNutK/D0Vgaj7TdUDDCBvQYDVR0fBIG1MIGyMIGvoIGsoIGphk5odHRwOi8vd3d3Lmlu
dGVsLmNvbS9yZXBvc2l0b3J5L0NSTC9JbnRlbCUyMEV4dGVybmFsJTIwQmFzaWMlMjBQb2xpY3kl
MjBDQS5jcmyGV2h0dHA6Ly9jZXJ0aWZpY2F0ZXMuaW50ZWwuY29tL3JlcG9zaXRvcnkvQ1JML0lu
dGVsJTIwRXh0ZXJuYWwlMjBCYXNpYyUyMFBvbGljeSUyMENBLmNybDCB4wYIKwYBBQUHAQEEgdYw
gdMwYwYIKwYBBQUHMAKGV2h0dHA6Ly93d3cuaW50ZWwuY29tL3JlcG9zaXRvcnkvY2VydGlmaWNh
dGVzL0ludGVsJTIwRXh0ZXJuYWwlMjBCYXNpYyUyMFBvbGljeSUyMENBLmNydDBsBggrBgEFBQcw
AoZgaHR0cDovL2NlcnRpZmljYXRlcy5pbnRlbC5jb20vcmVwb3NpdG9yeS9jZXJ0aWZpY2F0ZXMv
SW50ZWwlMjBFeHRlcm5hbCUyMEJhc2ljJTIwUG9saWN5JTIwQ0EuY3J0MA0GCSqGSIb3DQEBBQUA
A4IBAQCxtQEHchVQhXyjEqtMVUMe6gkmPsIczHxSeqNbo9dsD+6xbT65JT+oYgpIAtfEsYXeUJu1
cChqpb22U5bMAz7eaQcW5bzefufWvA6lg2048B8oczBj/q+5P5NpYrUO8jOmN4jTjfJq3ElZ7yFW
py7rB3Vm/aN6ATYqWfMbS/xfh+JCxmH3droUmMJI0/aZJHsLtjbjFnNsHDNrJZX1vxlM78Lb1hjs
kTENPmhbVbfTj5i/ZGnhv4tmI8QZPCNtcegXJrfhRl2D9bWpdTOPrWiLDUqzy1Z6KL7TcOS/PCl8
RHCJXkPau/thTQCpIoDa2+c+3XA++gRTfAQ4svTO260NMIIGBzCCBO+gAwIBAgIKEx06gQABAAB7
rTANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJVUzEaMBgGA1UEChMRSW50ZWwgQ29ycG9yYXRp
b24xKzApBgNVBAMTIkludGVsIEV4dGVybmFsIEJhc2ljIElzc3VpbmcgQ0EgM0IwHhcNMTExMDEy
MDEyNDIwWhcNMTQwOTI2MDEyNDIwWjA9MRUwEwYDVQQDEwxTaGFuLCBIYWl0YW8xJDAiBgkqhkiG
9w0BCQEWFWhhaXRhby5zaGFuQGludGVsLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBALpHYbXkMy06K6Pl9IGxbsKl0zT/OYd523Rh3CX7tHG/80ZGcPeLlzFK+l+30Fhpzf8fsFwG
l5fX2pRtWqT96BUWecXEVJhisfa1Wrq7DBC6coxEnExFADU+2UsBQ/ACKFSCiq/fADojyFWJgPKv
4PLDKJ9LU23Q+g1WRruGHfBnhCMv0KxnkE7pTk3cFRXtNUSUnYLqcvrZwt9VogQNiNNw3jMlDb8t
bJjMsXdhrwqFGW49z/gAJ2Mnr6/lNnqBdcKF2Qm28SfYXRohGrmam3KReM49ZG0+J/+JPF5drbiw
UAV++PMHA3IXIvZF2c66jQM5BzbF93SkoZXmrQZA2jMCAwEAAaOCAu4wggLqMAsGA1UdDwQEAwIH
gDA8BgkrBgEEAYI3FQcELzAtBiUrBgEEAYI3FQiGw4x1hJnlUYP9gSiFjp9TgpHACWeB3r05lfBD
AgFkAgEIMB0GA1UdDgQWBBQ/OInBCgrko9ziRWiEhjM+SyeeoDAfBgNVHSMEGDAWgBQOxir3WbII
EJAlb8Pd/YpmMTArxTCBzwYDVR0fBIHHMIHEMIHBoIG+oIG7hldodHRwOi8vd3d3LmludGVsLmNv
bS9yZXBvc2l0b3J5L0NSTC9JbnRlbCUyMEV4dGVybmFsJTIwQmFzaWMlMjBJc3N1aW5nJTIwQ0El
MjAzQigxKS5jcmyGYGh0dHA6Ly9jZXJ0aWZpY2F0ZXMuaW50ZWwuY29tL3JlcG9zaXRvcnkvQ1JM
L0ludGVsJTIwRXh0ZXJuYWwlMjBCYXNpYyUyMElzc3VpbmclMjBDQSUyMDNCKDEpLmNybDCB9QYI
KwYBBQUHAQEEgegwgeUwbAYIKwYBBQUHMAKGYGh0dHA6Ly93d3cuaW50ZWwuY29tL3JlcG9zaXRv
cnkvY2VydGlmaWNhdGVzL0ludGVsJTIwRXh0ZXJuYWwlMjBCYXNpYyUyMElzc3VpbmclMjBDQSUy
MDNCKDEpLmNydDB1BggrBgEFBQcwAoZpaHR0cDovL2NlcnRpZmljYXRlcy5pbnRlbC5jb20vcmVw
b3NpdG9yeS9jZXJ0aWZpY2F0ZXMvSW50ZWwlMjBFeHRlcm5hbCUyMEJhc2ljJTIwSXNzdWluZyUy
MENBJTIwM0IoMSkuY3J0MB8GA1UdJQQYMBYGCCsGAQUFBwMEBgorBgEEAYI3CgMMMCkGCSsGAQQB
gjcVCgQcMBowCgYIKwYBBQUHAwQwDAYKKwYBBAGCNwoDDDBHBgNVHREEQDA+oCUGCisGAQQBgjcU
AgOgFwwVaGFpdGFvLnNoYW5AaW50ZWwuY29tgRVoYWl0YW8uc2hhbkBpbnRlbC5jb20wDQYJKoZI
hvcNAQEFBQADggEBAG5Us26ruu8jKt3RhZuirjqgF61p+wZer/xV6BTABUx5++DhWXslTztavsvy
JZ5WsZ7xaijBUO3UQViWTylwmSyGwbhEwreu3XRNGlMOnRk+sH7JGiXZJIpqoD/jtRWp0ypHG2g3
nDqAQ1/j4wUgcI0b12KUJyYAeN6cwEeAqIV4mdD8GpH3DS2nZbEZjTNhkaeJuT7lO1jRqzEGOSCk
KDHPfqUtqpw+wZa6mFbzSso9swc4ypgRIl4l5i/4OwNMQazHm2O6Ov91aDJs6j3DCdALzP736hmF
QFfHWL34GFQMRdpO/OI6z/Q0VYm/6N9o4SD/s4J9Edq8zyYNQxBR03QwggZOMIIFNqADAgECAgoT
I00xAAEAAHuuMA0GCSqGSIb3DQEBBQUAMFYxCzAJBgNVBAYTAlVTMRowGAYDVQQKExFJbnRlbCBD
b3Jwb3JhdGlvbjErMCkGA1UEAxMiSW50ZWwgRXh0ZXJuYWwgQmFzaWMgSXNzdWluZyBDQSAzQjAe
Fw0xMTEwMTIwMTMwNTZaFw0xNDA5MjYwMTMwNTZaMD0xFTATBgNVBAMTDFNoYW4sIEhhaXRhbzEk
MCIGCSqGSIb3DQEJARYVaGFpdGFvLnNoYW5AaW50ZWwuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEApaOcuQtYCobUiLQTadd0Hi+U/ausgzeSE59iUrc57VUzvLsLNnKRxLPm+T26
KN9fMDAS3/MZOl5tf+9mKEwrergim5GzwJpfZWPLAyK2Gs57+F+BMgtX6DT0eh4sGQLQDahPZDhy
Ubo420AiTGuTA9/L22B/qbPNuDRNMMJoreAZeSNBSVPa7Q+Y0oXcfKpAmKzHH2Y+WAzupN5jfxhJ
6yb7MpsPDqoU0Ek4VttgUIl4AQlRFMI18ScKvAG2p9kWSSgq+Z9xdQl7F/3ASkXlQMKEOHCDw8E7
XUzqy4pOoXGaI3FVI4AerPeLgz2SkNINfqLnxdhN+BQ6iuRgsOeyIwIDAQABo4IDNTCCAzEwCwYD
VR0PBAQDAgQwMD0GCSsGAQQBgjcVBwQwMC4GJisGAQQBgjcVCIbDjHWEmeVRg/2BKIWOn1OCkcAJ
Z4S52UGHhP9OAgFkAgEMMEQGCSqGSIb3DQEJDwQ3MDUwDgYIKoZIhvcNAwICAgCAMA4GCCqGSIb3
DQMEAgIAgDAHBgUrDgMCBzAKBggqhkiG9w0DBzAdBgNVHQ4EFgQU/+6IdpvPrUveCml7StYwqL40
iqMwHwYDVR0jBBgwFoAUDsYq91myCBCQJW/D3f2KZjEwK8Uwgc8GA1UdHwSBxzCBxDCBwaCBvqCB
u4ZXaHR0cDovL3d3dy5pbnRlbC5jb20vcmVwb3NpdG9yeS9DUkwvSW50ZWwlMjBFeHRlcm5hbCUy
MEJhc2ljJTIwSXNzdWluZyUyMENBJTIwM0IoMSkuY3JshmBodHRwOi8vY2VydGlmaWNhdGVzLmlu
dGVsLmNvbS9yZXBvc2l0b3J5L0NSTC9JbnRlbCUyMEV4dGVybmFsJTIwQmFzaWMlMjBJc3N1aW5n
JTIwQ0ElMjAzQigxKS5jcmwwgfUGCCsGAQUFBwEBBIHoMIHlMGwGCCsGAQUFBzAChmBodHRwOi8v
d3d3LmludGVsLmNvbS9yZXBvc2l0b3J5L2NlcnRpZmljYXRlcy9JbnRlbCUyMEV4dGVybmFsJTIw
QmFzaWMlMjBJc3N1aW5nJTIwQ0ElMjAzQigxKS5jcnQwdQYIKwYBBQUHMAKGaWh0dHA6Ly9jZXJ0
aWZpY2F0ZXMuaW50ZWwuY29tL3JlcG9zaXRvcnkvY2VydGlmaWNhdGVzL0ludGVsJTIwRXh0ZXJu
YWwlMjBCYXNpYyUyMElzc3VpbmclMjBDQSUyMDNCKDEpLmNydDAfBgNVHSUEGDAWBggrBgEFBQcD
BAYKKwYBBAGCNwoDBDApBgkrBgEEAYI3FQoEHDAaMAoGCCsGAQUFBwMEMAwGCisGAQQBgjcKAwQw
RwYDVR0RBEAwPqAlBgorBgEEAYI3FAIDoBcMFWhhaXRhby5zaGFuQGludGVsLmNvbYEVaGFpdGFv
LnNoYW5AaW50ZWwuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQAqWvSRW8jKGuWVwUKo/+QRxKvuT3cv
/975omnwo7QeOj78XruY/Wsl6/tnzI8jgf6ZE5SRoj5sSGBHmy7qHSZNWodLuJgjN+a0Fk2hy0jB
wX2UJLS3ctijemo4e4u8/YFebLVXCzy81lWa7dZcidebnslLlcQXHNzl8hhFAfQwhcCXMAiA89NO
3uJqd9Sk/PSfG90b/f+1u2xIthxQmeh7u1yuiHZrf1u/e6rJWS50iW+LWmrH0c70XN8voHpLXVDo
09C9DETzJOUrhr1BqLVSxKjNn/uhCOcQxNYM3CYsgQBwVogKsGj59xeGFA5iWPKGRj7SfUXH0m3T
kiSaWLnWMYIDhjCCA4ICAQEwZDBWMQswCQYDVQQGEwJVUzEaMBgGA1UEChMRSW50ZWwgQ29ycG9y
YXRpb24xKzApBgNVBAMTIkludGVsIEV4dGVybmFsIEJhc2ljIElzc3VpbmcgQ0EgM0ICChMdOoEA
AQAAe60wCQYFKw4DAhoFAKCCAfcwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0B
CQUxDxcNMTExMTA5MDkwNzUwWjAjBgkqhkiG9w0BCQQxFgQULCMXwVzlnLFOHaZQeWsD/6mPA+Yw
cwYJKwYBBAGCNxAEMWYwZDBWMQswCQYDVQQGEwJVUzEaMBgGA1UEChMRSW50ZWwgQ29ycG9yYXRp
b24xKzApBgNVBAMTIkludGVsIEV4dGVybmFsIEJhc2ljIElzc3VpbmcgQ0EgM0ICChMjTTEAAQAA
e64wdQYLKoZIhvcNAQkQAgsxZqBkMFYxCzAJBgNVBAYTAlVTMRowGAYDVQQKExFJbnRlbCBDb3Jw
b3JhdGlvbjErMCkGA1UEAxMiSW50ZWwgRXh0ZXJuYWwgQmFzaWMgSXNzdWluZyBDQSAzQgIKEyNN
MQABAAB7rjCBqwYJKoZIhvcNAQkPMYGdMIGaMAoGCCqGSIb3DQMHMAsGCWCGSAFlAwQBKjALBglg
hkgBZQMEARYwCwYJYIZIAWUDBAECMA4GCCqGSIb3DQMCAgIAgDAHBgUrDgMCBzANBggqhkiG9w0D
AgIBQDANBggqhkiG9w0DAgIBKDAHBgUrDgMCGjALBglghkgBZQMEAgMwCwYJYIZIAWUDBAICMAsG
CWCGSAFlAwQCATANBgkqhkiG9w0BAQEFAASCAQAMED0r9Z5pc/YP/aLcxdyN2rGnbeOdEDDlAb0A
WAvTBYhA8hyb9DC6ii7cIXP8g9GcMTgMEFVKLRU/7gCIxCbtzVrfbbLZOPjbM0I5pArnF9rsxaLF
QD1euD/j0v+8e6iUvXXip5oRWQ/Q0bELMgPenlJWqQaBLM0MQUzRNpi31QQD80i/jZ+YFph4URJo
OKrWBlvSrb09RCTIGFDYyzewRYwamn5B2b8/RxgKbC/gRI64CktNBev6pyk53xCk9MOwNi1JuMin
+ldb/h7Oxdjt8SJt4eBKeDJLsrCH4OQFz9UAvhjOlwqxjW/1sCgb/leG6fTQIcbj6ROmZJssjvyG
AAAAAAAA

------=_NextPart_000_009E_01CC9F02.1C59CD20--


--===============2050745199==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============2050745199==--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 01:17:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 01:17:35 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO4Hn-0003Ll-5Z; Wed, 09 Nov 2011 01:17:35 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO4HB-00039O-6P
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 01:16:57 -0800
X-Env-Sender: lidongyang@novell.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1320830212!2421161!1
X-Originating-IP: [137.65.250.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3555 invoked from network); 9 Nov 2011 09:16:54 -0000
Received: from victor.provo.novell.com (HELO victor.provo.novell.com)
	(137.65.250.26)
	by server-3.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 09:16:54 -0000
Received: from mail-gy0-f171.google.com (prv-ext-foundry1int.gns.novell.com
	[137.65.251.240])
	by victor.provo.novell.com with ESMTP (TLS encrypted);
	Wed, 09 Nov 2011 02:16:45 -0700
Received: by gyg8 with SMTP id 8so2206994gyg.30
	for <xen-devel@lists.xensource.com>;
	Wed, 09 Nov 2011 01:16:43 -0800 (PST)
MIME-Version: 1.0
Received: by 10.50.12.131 with SMTP id y3mr1546660igb.39.1320830203221; Wed,
	09 Nov 2011 01:16:43 -0800 (PST)
Received: by 10.50.47.231 with HTTP; Wed, 9 Nov 2011 01:16:43 -0800 (PST)
In-Reply-To: <4EB9606B020000780005FA5B@victor.provo.novell.com>
References: <1320654866-12457-1-git-send-email-lidongyang@novell.com>
	<4EB9606B020000780005FA5B@victor.provo.novell.com>
Date: Wed, 9 Nov 2011 17:16:43 +0800
Message-ID: <CAKH3R49wm08ZNn2aT-2OMevahQMrr3qC7dXpKq94VU58ugUYpQ@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] xen-blkback: convert hole punching to discard
	request on loop devices
From: Li Dongyang <lidongyang@novell.com>
To: Jan Beulich <JBeulich@suse.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: lczerner@redhat.com, Dong Yang Li <lidongyang@suse.com>,
	xen-devel@lists.xensource.com, konrad.wilk@oracle.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Nov 9, 2011 at 12:01 AM, Jan Beulich <JBeulich@suse.com> wrote:
>>>> On 07.11.11 at 09:34, Li Dongyang <lidongyang@novell.com> wrote:
>> As of dfaa2ef68e80c378e610e3c8c536f1c239e8d3ef, loop devices support
>> discard request now. We could just issue a discard request, and
>> the loop driver will punch the hole for us, so we don't need to touch
>> the internals of loop device and punch the hole ourselves, Thanks.
>
> Looking at what the loop driver now does - doesn't the original code
> here lack support for lo_offset being non-zero then? If so, should we
> fix this in pre-3.2 kernels?
yes, you are right, but will we ever setup the loop device with
lo_offset non-zero?
I don't think so but I'm not sure.
>
> Jan
>
>> Signed-off-by: Li Dongyang <lidongyang@novell.com>
>> ---
>> =A0drivers/block/xen-blkback/blkback.c | =A0 21 +++------------------
>> =A01 files changed, 3 insertions(+), 18 deletions(-)
>>
>> diff --git a/drivers/block/xen-blkback/blkback.c
>> b/drivers/block/xen-blkback/blkback.c
>> index 15ec4db..ad365a7 100644
>> --- a/drivers/block/xen-blkback/blkback.c
>> +++ b/drivers/block/xen-blkback/blkback.c
>> @@ -39,9 +39,6 @@
>> =A0#include <linux/list.h>
>> =A0#include <linux/delay.h>
>> =A0#include <linux/freezer.h>
>> -#include <linux/loop.h>
>> -#include <linux/falloc.h>
>> -#include <linux/fs.h>
>>
>> =A0#include <xen/events.h>
>> =A0#include <xen/page.h>
>> @@ -422,25 +419,13 @@ static void xen_blk_discard(struct xen_blkif *blki=
f,
>> struct blkif_request *req)
>> =A0 =A0 =A0 int status =3D BLKIF_RSP_OKAY;
>> =A0 =A0 =A0 struct block_device *bdev =3D blkif->vbd.bdev;
>>
>> - =A0 =A0 if (blkif->blk_backend_type =3D=3D BLKIF_BACKEND_PHY)
>> - =A0 =A0 =A0 =A0 =A0 =A0 /* just forward the discard request */
>> + =A0 =A0 if (blkif->blk_backend_type =3D=3D BLKIF_BACKEND_PHY ||
>> + =A0 =A0 =A0 =A0 blkif->blk_backend_type =3D=3D BLKIF_BACKEND_FILE)
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 err =3D blkdev_issue_discard(bdev,
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 req->u.disca=
rd.sector_number,
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 req->u.disca=
rd.nr_sectors,
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 GFP_KERNEL, =
0);
>> - =A0 =A0 else if (blkif->blk_backend_type =3D=3D BLKIF_BACKEND_FILE) {
>> - =A0 =A0 =A0 =A0 =A0 =A0 /* punch a hole in the backing file */
>> - =A0 =A0 =A0 =A0 =A0 =A0 struct loop_device *lo =3D bdev->bd_disk->priv=
ate_data;
>> - =A0 =A0 =A0 =A0 =A0 =A0 struct file *file =3D lo->lo_backing_file;
>> -
>> - =A0 =A0 =A0 =A0 =A0 =A0 if (file->f_op->fallocate)
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 err =3D file->f_op->fallocate(=
file,
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 FALLOC_FL_KEEP=
_SIZE | FALLOC_FL_PUNCH_HOLE,
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 req->u.discard=
.sector_number << 9,
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 req->u.discard=
.nr_sectors << 9);
>> - =A0 =A0 =A0 =A0 =A0 =A0 else
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 err =3D -EOPNOTSUPP;
>> - =A0 =A0 } else
>> + =A0 =A0 else
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 err =3D -EOPNOTSUPP;
>>
>> =A0 =A0 =A0 if (err =3D=3D -EOPNOTSUPP) {
>
>
>
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 01:18:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 01:18:46 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO4Iw-0003j0-4u; Wed, 09 Nov 2011 01:18:46 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO4IN-0003X5-6S
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 01:18:11 -0800
X-Env-Sender: lidongyang@novell.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1320830286!3452133!1
X-Originating-IP: [137.65.250.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25603 invoked from network); 9 Nov 2011 09:18:08 -0000
Received: from victor.provo.novell.com (HELO victor.provo.novell.com)
	(137.65.250.26)
	by server-12.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 09:18:08 -0000
Received: from mail-iy0-f171.google.com (prv-ext-foundry1int.gns.novell.com
	[137.65.251.240])
	by victor.provo.novell.com with ESMTP (TLS encrypted);
	Wed, 09 Nov 2011 02:17:58 -0700
Received: by iaqq3 with SMTP id q3so1921470iaq.30
	for <xen-devel@lists.xensource.com>;
	Wed, 09 Nov 2011 01:17:57 -0800 (PST)
MIME-Version: 1.0
Received: by 10.50.185.232 with SMTP id ff8mr1577336igc.32.1320830277355; Wed,
	09 Nov 2011 01:17:57 -0800 (PST)
Received: by 10.50.47.231 with HTTP; Wed, 9 Nov 2011 01:17:57 -0800 (PST)
In-Reply-To: <20111108162614.GA18361@phenom.dumpdata.com>
References: <1320654866-12457-1-git-send-email-lidongyang@novell.com>
	<20111108162614.GA18361@phenom.dumpdata.com>
Date: Wed, 9 Nov 2011 17:17:57 +0800
Message-ID: <CAKH3R48ni0GeginUZCvQvwOf6e1oaEC_hfGD+BjKkw7dKD6YFg@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] xen-blkback: convert hole punching to discard
	request on loop devices
From: Li Dongyang <lidongyang@novell.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: lczerner@redhat.com, xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Nov 9, 2011 at 12:26 AM, Konrad Rzeszutek Wilk
<konrad.wilk@oracle.com> wrote:
> On Mon, Nov 07, 2011 at 04:34:26PM +0800, Li Dongyang wrote:
>> As of dfaa2ef68e80c378e610e3c8c536f1c239e8d3ef, loop devices support
>> discard request now. We could just issue a discard request, and
>> the loop driver will punch the hole for us, so we don't need to touch
>> the internals of loop device and punch the hole ourselves, Thanks.
>
> Can I ask you to do two things:
> =A01). Look in whether we can just eliminate the BLKIF_BACKEND_FILE altog=
ether?
I think we still need that flag, as for other type of backing dev, we
will figure it out and send back a EOPNOTSUPP.
> =A02). Rebase this on top #devel/for-jens-3.3 (git://git.kernel.org/pub/s=
cm/linux/kernel/git/konrad/xen.git)
no problem
>
> Thanks!
>>
>> Signed-off-by: Li Dongyang <lidongyang@novell.com>
>> ---
>> =A0drivers/block/xen-blkback/blkback.c | =A0 21 +++------------------
>> =A01 files changed, 3 insertions(+), 18 deletions(-)
>>
>> diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blk=
back/blkback.c
>> index 15ec4db..ad365a7 100644
>> --- a/drivers/block/xen-blkback/blkback.c
>> +++ b/drivers/block/xen-blkback/blkback.c
>> @@ -39,9 +39,6 @@
>> =A0#include <linux/list.h>
>> =A0#include <linux/delay.h>
>> =A0#include <linux/freezer.h>
>> -#include <linux/loop.h>
>> -#include <linux/falloc.h>
>> -#include <linux/fs.h>
>>
>> =A0#include <xen/events.h>
>> =A0#include <xen/page.h>
>> @@ -422,25 +419,13 @@ static void xen_blk_discard(struct xen_blkif *blki=
f, struct blkif_request *req)
>> =A0 =A0 =A0 int status =3D BLKIF_RSP_OKAY;
>> =A0 =A0 =A0 struct block_device *bdev =3D blkif->vbd.bdev;
>>
>> - =A0 =A0 if (blkif->blk_backend_type =3D=3D BLKIF_BACKEND_PHY)
>> - =A0 =A0 =A0 =A0 =A0 =A0 /* just forward the discard request */
>> + =A0 =A0 if (blkif->blk_backend_type =3D=3D BLKIF_BACKEND_PHY ||
>> + =A0 =A0 =A0 =A0 blkif->blk_backend_type =3D=3D BLKIF_BACKEND_FILE)
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 err =3D blkdev_issue_discard(bdev,
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 req->u.disca=
rd.sector_number,
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 req->u.disca=
rd.nr_sectors,
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 GFP_KERNEL, =
0);
>> - =A0 =A0 else if (blkif->blk_backend_type =3D=3D BLKIF_BACKEND_FILE) {
>> - =A0 =A0 =A0 =A0 =A0 =A0 /* punch a hole in the backing file */
>> - =A0 =A0 =A0 =A0 =A0 =A0 struct loop_device *lo =3D bdev->bd_disk->priv=
ate_data;
>> - =A0 =A0 =A0 =A0 =A0 =A0 struct file *file =3D lo->lo_backing_file;
>> -
>> - =A0 =A0 =A0 =A0 =A0 =A0 if (file->f_op->fallocate)
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 err =3D file->f_op->fallocate(=
file,
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 FALLOC_FL_KEEP=
_SIZE | FALLOC_FL_PUNCH_HOLE,
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 req->u.discard=
.sector_number << 9,
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 req->u.discard=
.nr_sectors << 9);
>> - =A0 =A0 =A0 =A0 =A0 =A0 else
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 err =3D -EOPNOTSUPP;
>> - =A0 =A0 } else
>> + =A0 =A0 else
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 err =3D -EOPNOTSUPP;
>>
>> =A0 =A0 =A0 if (err =3D=3D -EOPNOTSUPP) {
>> --
>> 1.7.7
>>
>>
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com
>> http://lists.xensource.com/xen-devel
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 01:28:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 01:28:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO4S3-0004Kk-6v; Wed, 09 Nov 2011 01:28:11 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO4RJ-00048Q-37
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 01:27:25 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1320830841!1881073!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24452 invoked from network); 9 Nov 2011 09:27:21 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 09:27:21 -0000
X-IronPort-AV: E=Sophos;i="4.69,483,1315180800"; 
   d="scan'208";a="8833065"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 09:27:21 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 09:27:21 +0000
Date: Wed, 9 Nov 2011 09:27:53 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Chunyan Liu <cyliu@suse.com>
Subject: Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images fail
In-Reply-To: <CAERYnobDfg9pNhETxcabkGizwYowTWAVDsmHnDXH8yR4FhpsQw@mail.gmail.com>
Message-ID: <alpine.DEB.2.00.1111090926080.3519@kaball-desktop>
References: <1319808450-9617-1-git-send-email-cyliu@suse.com>
	<4EB184DE020000660000603E@novprvlin0050.provo.novell.com>
	<alpine.DEB.2.00.1111071354570.3519@kaball-desktop>
	<CAERYnobDfg9pNhETxcabkGizwYowTWAVDsmHnDXH8yR4FhpsQw@mail.gmail.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 9 Nov 2011, Chunyan Liu wrote:
> In a following email you wrote that without the sleep the device is
> "not prepared yet".
> What do you mean by that?
> The device is present but reading/writing to it returns an error?
> 
>       If so, rather than a sleep we need an explicit wait for the device
>       to be ready. Even trying to read from the device in a loop until it
>       succeeds would be better than a sleep. At least we would know exactly
>       what we are doing and why we are doing it.
> 
> 
> OK, after checking qemu-nbd source code, I think I know where the problem is. I tried to fork_exec "qemu-nbd -c /dev/nbd0
> disk.img", with this command option, qemu-nbd will call daemon(3) to run in background and itself should exit immediately,
> that's why waitpid can successfully wait the exit of qemu-nbd pid and fork_exec will return 0. The problem is that I
> should not use fork_exec return value to decide if the disk.img is already connected to nbd device. That's not correct.

Good.


> This is not great. I would read /proc/partitions instead.
> 
> Thanks, that's a better way to find if a nbd device is free. The whole thing (find a free nbd device and connect disk.img
> to that nbd device) seems better to write a script to do that and in libxl call that script.

Maybe, but I think it makes sense for it to be in libxl and after all
reading/writing a file can be done quite well in a library too.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 01:36:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 01:36:49 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO4aO-0004sR-MH; Wed, 09 Nov 2011 01:36:48 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO4Zq-0004gh-7a
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 01:36:14 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1320831370!2419347!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7858 invoked from network); 9 Nov 2011 09:36:11 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 09:36:11 -0000
X-IronPort-AV: E=Sophos;i="4.69,483,1315180800"; 
   d="scan'208";a="8833298"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 09:36:10 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Wed, 9 Nov 2011
	09:36:10 +0000
Subject: Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images fail
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Wed, 9 Nov 2011 09:36:10 +0000
In-Reply-To: <alpine.DEB.2.00.1111090926080.3519@kaball-desktop>
References: <1319808450-9617-1-git-send-email-cyliu@suse.com>
	<4EB184DE020000660000603E@novprvlin0050.provo.novell.com>
	<alpine.DEB.2.00.1111071354570.3519@kaball-desktop>
	<CAERYnobDfg9pNhETxcabkGizwYowTWAVDsmHnDXH8yR4FhpsQw@mail.gmail.com>
	<alpine.DEB.2.00.1111090926080.3519@kaball-desktop>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320831370.955.114.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Chunyan Liu <cyliu@suse.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-09 at 09:27 +0000, Stefano Stabellini wrote:
> On Wed, 9 Nov 2011, Chunyan Liu wrote:
> > In a following email you wrote that without the sleep the device is
> > "not prepared yet".
> > What do you mean by that?
> > The device is present but reading/writing to it returns an error?
> > 
> >       If so, rather than a sleep we need an explicit wait for the device
> >       to be ready. Even trying to read from the device in a loop until it
> >       succeeds would be better than a sleep. At least we would know exactly
> >       what we are doing and why we are doing it.
> > 
> > 
> > OK, after checking qemu-nbd source code, I think I know where the problem is. I tried to fork_exec "qemu-nbd -c /dev/nbd0
> > disk.img", with this command option, qemu-nbd will call daemon(3) to run in background and itself should exit immediately,
> > that's why waitpid can successfully wait the exit of qemu-nbd pid and fork_exec will return 0. The problem is that I
> > should not use fork_exec return value to decide if the disk.img is already connected to nbd device. That's not correct.
> 
> Good.
> 
> 
> > This is not great. I would read /proc/partitions instead.
> > 
> > Thanks, that's a better way to find if a nbd device is free. The whole thing (find a free nbd device and connect disk.img
> > to that nbd device) seems better to write a script to do that and in libxl call that script.

Really this is the sort of thing qemu-nbd should do for us (c.f.
"losetup -f"). I think it would be worth getting such a patch upstream
even if we can't yet make use of it.

Ian.

> 
> Maybe, but I think it makes sense for it to be in libxl and after all
> reading/writing a file can be done quite well in a library too.
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 01:42:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 01:42:45 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO4g9-0005K3-Er; Wed, 09 Nov 2011 01:42:45 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO4fP-00057X-DX
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 01:41:59 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1320831715!2841920!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12963 invoked from network); 9 Nov 2011 09:41:56 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 9 Nov 2011 09:41:56 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 09 Nov 2011 09:41:55 +0000
Message-Id: <4EBA58F2020000780005FCCC@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 09 Nov 2011 09:41:53 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part2708DEF1.1__="
Cc: Yang Z Zhang <yang.z.zhang@intel.com>, Haitao Shan <haitao.shan@intel.com>
Subject: [Xen-devel] [PATCH] x86/cpuidle: add Westmere-EX support to hw
	residencies reading logic
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part2708DEF1.1__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

This is in accordance with
http://software.intel.com/en-us/articles/intel-processor-identification-wit=
h-cpuid-model-and-family-numbers/=20

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/acpi/cpu_idle.c
+++ b/xen/arch/x86/acpi/cpu_idle.c
@@ -120,6 +120,7 @@ static void do_get_hw_residencies(void *
     /* Westmere */
     case 0x25:
     case 0x2C:
+    case 0x2F:
         GET_PC3_RES(hw_res->pc3);
         GET_PC6_RES(hw_res->pc6);
         GET_PC7_RES(hw_res->pc7);




--=__Part2708DEF1.1__=
Content-Type: text/plain; name="x86-cpuidle-Westmere-EX.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="x86-cpuidle-Westmere-EX.patch"

x86/cpuidle: add Westmere-EX support to hw residencies reading logic=0A=0AT=
his is in accordance with=0Ahttp://software.intel.com/en-us/articles/intel-=
processor-identification-with-cpuid-model-and-family-numbers/=0A=0ASigned-o=
ff-by: Jan Beulich <jbeulich@suse.com>=0A=0A--- a/xen/arch/x86/acpi/cpu_idl=
e.c=0A+++ b/xen/arch/x86/acpi/cpu_idle.c=0A@@ -120,6 +120,7 @@ static void =
do_get_hw_residencies(void *=0A     /* Westmere */=0A     case 0x25:=0A    =
 case 0x2C:=0A+    case 0x2F:=0A         GET_PC3_RES(hw_res->pc3);=0A      =
   GET_PC6_RES(hw_res->pc6);=0A         GET_PC7_RES(hw_res->pc7);=0A
--=__Part2708DEF1.1__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part2708DEF1.1__=--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 01:44:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 01:44:18 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO4he-0005i5-K2; Wed, 09 Nov 2011 01:44:18 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RO4gs-0005Va-TR
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 01:43:31 -0800
X-Env-Sender: bderzhavets@yahoo.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1320831794!54289272!1
X-Originating-IP: [98.139.52.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16144 invoked from network); 9 Nov 2011 09:43:14 -0000
Received: from nm24.bullet.mail.ac4.yahoo.com (HELO
	nm24.bullet.mail.ac4.yahoo.com) (98.139.52.221)
	by server-15.tower-27.messagelabs.com with SMTP;
	9 Nov 2011 09:43:14 -0000
Received: from [98.139.52.188] by nm24.bullet.mail.ac4.yahoo.com with NNFMP;
	09 Nov 2011 09:43:27 -0000
Received: from [98.139.52.178] by tm1.bullet.mail.ac4.yahoo.com with NNFMP;
	09 Nov 2011 09:43:27 -0000
Received: from [127.0.0.1] by omp1061.mail.ac4.yahoo.com with NNFMP;
	09 Nov 2011 09:43:26 -0000
X-Yahoo-Newman-Property: ymail-3
X-Yahoo-Newman-Id: 991326.2981.bm@omp1061.mail.ac4.yahoo.com
Received: (qmail 92217 invoked by uid 60001); 9 Nov 2011 09:43:26 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024;
	t=1320831806; bh=JPgDuwkKJS5YO8zHZ9bzfMlDjWV6LEf4/4hZiS2whm4=;
	h=X-YMail-OSG:Received:X-Mailer:Message-ID:Date:From:Subject:To:Cc:MIME-Version:Content-Type;
	b=orrTEFjcxq4D3pJpLIo2ePEgHvRKVHF7X84dQWgRDXEHqZQpXL3Crxdgg2AKM+p1KaN508qPMJIdL3KovLFyIW1FjbWH+OPIU531iUEGQcFSEO7joJkOvOjposJMSpUm7wA/nUAFHwzmWguDs0sf+K3gp0IeKHx8ou2nfGOZE2c=
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com;
	h=X-YMail-OSG:Received:X-Mailer:Message-ID:Date:From:Subject:To:Cc:MIME-Version:Content-Type;
	b=N4sjxE5dmyZhXSiOW8B2oiDN35hjRb5nM8OZcy/Y2ts24zuAO1bwjyNRpTXhCnmC5P0/JO3B6D5NDCXO+BmAEBsRvjwcpKBVxfOOzlIwCQSAj80/brYtc/aHD2f8SkCXCNlKD0DoWef3g17rO1b73SciiRMPq7pui0Ab55cA2mQ=;
X-YMail-OSG: Uj6g2OIVM1lJypBL3D3gcVPWCHWog4IHA9ug_9GKFlXIUXP
	sWVwetiJQivfFCqT3hWTxWkqf8uqzJL9EHHiR4k1zrrYsvLpt_5x8Rky2NZa
	4QZQkG_tUPW2waS7x081Ti3FdvE38ua4dugqUi0.v5rk_JFqhjaVgcIzPxhY
	xRshfnn9ZK6sQa7eyHtv88QQ5beszQUQrUT6tfHUdxSri..GEdBMlHLSPdN.
	Li9LSvgTwJXK_mkSVuFTqahZVuW5pzhRfKdb4aWlXRYOnAOuSmMv_jU_aN7Z
	4SS3EO1ULqslIv9TbVYRiRlXVn2mGGwCl_8nk93aWIr5AdRwXXowWCnAXDoS
	fKBFxbUJ_iBbGHTvn2t7bOUao6Nez6v_b.SihCNpa8TBIufpTakgSQLTQMdB
	Ep6TyxVr.hFG7V_fw4Sce8pV6yxuLaT.CDxZmX2sCTbpHxzJqPilYlKN3TIB
	nm8b0b088CxmBbrJ6ESvIbLEsFzoAywdScH_lr9eqmw.DdB6KUMEk56l2iqj
	G4tD2y8GXSK3ypnliaGVH6fyySbKp8WaGEcQZ7b1Qq8Ud1cKGsVFLbAX.tEs
	6as_AS9NePdcMAXdqreJXQa9tggRJ.BBNXb1fhx8L8RD6hAHh5bE7oo8mu9M
	jCoCRCozz1t0yDnXJTAo2RUlCoxvd.rxnw3kkdEjL6FaKHnUFhyj.JBKIX1L wr46l
Received: from [188.114.1.218] by web65916.mail.ac4.yahoo.com via HTTP;
	Wed, 09 Nov 2011 01:43:26 PST
X-Mailer: YahooMailClassic/14.0.11 YahooMailWebService/0.8.115.325013
Message-ID: <1320831806.91503.YahooMailClassic@web65916.mail.ac4.yahoo.com>
Date: Wed, 9 Nov 2011 01:43:26 -0800 (PST)
From: Boris Derzhavets <bderzhavets@yahoo.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
MIME-Version: 1.0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Why CONFIG_XEN_PLATFORM_PCI should be equal "y" ?
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0852104737=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0852104737==
Content-Type: multipart/alternative;
	boundary="-2036203160-1056398082-1320831806=:91503"

---2036203160-1056398082-1320831806=:91503
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

I've recently found the link :-

=C2=A0 http://xen.1045712.n5.nabble.com/PATCH-xen-remove-XEN-PLATFORM-PCI-c=
onfig-option-td4833154.html

In Ubuntu 3.1 kernel configuration :-

Symbol: XEN_PLATFORM_PCI [=3Dm]=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=20
=C2=A0 =E2=94=82 Type=C2=A0 : tristate=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=20
=C2=A0 =E2=94=82 Prompt: xen platform pci device driver=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=20
=C2=A0 =E2=94=82=C2=A0=C2=A0 Defined at drivers/xen/Kconfig:140=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=20
=C2=A0 =E2=94=82=C2=A0=C2=A0 Depends on: XEN [=3Dy] && XEN_PVHVM [=3Dy] && =
PCI [=3Dy]=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=20
=C2=A0 =E2=94=82=C2=A0=C2=A0 Location:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=20
=C2=A0 =E2=94=82=C2=A0=C2=A0=C2=A0=C2=A0 -> Device Drivers=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=20
=C2=A0 =E2=94=82=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 -> Xen driver support

I believe due to dependencies it should be [y].

On the other hand including xen-platform-pci.ko into initrd.img for Oneiric=
 HVM will also
enable PV-on-HVM

Boris.

---2036203160-1056398082-1320831806=:91503
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable

<table cellspacing=3D"0" cellpadding=3D"0" border=3D"0" ><tr><td valign=3D"=
top" style=3D"font: inherit;"><div id=3D"yiv1406146836"><table id=3D"yiv140=
6146836bodyDrftID" class=3D"yiv1406146836" border=3D"0" cellpadding=3D"0" c=
ellspacing=3D"0"><tbody><tr><td id=3D"yiv1406146836drftMsgContent" style=3D=
"font:inherit;font-family:arial;font-size:10pt;">I've recently found the li=
nk :-<br><br>&nbsp; http://xen.1045712.n5.nabble.com/PATCH-xen-remove-XEN-P=
LATFORM-PCI-config-option-td4833154.html<br><br>In Ubuntu 3.1 kernel config=
uration :-<br><br>Symbol: XEN_PLATFORM_PCI [=3Dm]&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; =E2=94=82 Type&nbsp; :
 tristate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbs=
p; =E2=94=82 Prompt: xen platform pci device driver&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; =
=E2=94=82&nbsp;&nbsp; Defined at
 drivers/xen/Kconfig:140&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; =E2=94=82&nbsp;&nbsp; Depends on:=
 XEN [=3Dy] &amp;&amp; XEN_PVHVM [=3Dy] &amp;&amp; PCI [=3Dy]&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; =E2=94=82&nbsp;&n=
bsp;
 Location:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; =E2=94=82&nbsp;&nbsp;&nbsp;&nbsp; -&gt; D=
evice Drivers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;
 =E2=94=82&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; Xen driver support<br>=
<br>I believe due to dependencies it should be [y].<br><br>On the other han=
d including xen-platform-pci.ko into initrd.img for Oneiric HVM will also<b=
r>enable PV-on-HVM<br><br>Boris.<br></td></tr></tbody></table></div></td></=
tr></table>
---2036203160-1056398082-1320831806=:91503--


--===============0852104737==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0852104737==--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 01:54:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 01:54:52 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO4rs-0006tX-IT; Wed, 09 Nov 2011 01:54:52 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO4rI-0006hh-HK
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 01:54:16 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1320832453!838701!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29968 invoked from network); 9 Nov 2011 09:54:13 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 09:54:13 -0000
X-IronPort-AV: E=Sophos;i="4.69,483,1315180800"; 
   d="scan'208";a="8834091"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 09:54:12 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Wed, 9 Nov 2011
	09:54:12 +0000
Subject: Re: [Xen-devel] Why CONFIG_XEN_PLATFORM_PCI should be equal "y" ?
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Boris Derzhavets <bderzhavets@yahoo.com>
Date: Wed, 9 Nov 2011 09:54:12 +0000
In-Reply-To: <1320831806.91503.YahooMailClassic@web65916.mail.ac4.yahoo.com>
References: <1320831806.91503.YahooMailClassic@web65916.mail.ac4.yahoo.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1320832452.955.119.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-09 at 09:43 +0000, Boris Derzhavets wrote:
> I've recently found the link :-
> 
> 
> http://xen.1045712.n5.nabble.com/PATCH-xen-remove-XEN-PLATFORM-PCI-config-option-td4833154.html
> 
> In Ubuntu 3.1 kernel configuration :-
> 
> Symbol: XEN_PLATFORM_PCI
> [=m]                                                              
>   â”‚ Type  :
> tristate                                                                         
>   â”‚ Prompt: xen platform pci device
> driver                                                     
>   â”‚   Defined at
> drivers/xen/Kconfig:140                                                    
>   â”‚   Depends on: XEN [=y] && XEN_PVHVM [=y] && PCI
> [=y]                                    
>   â”‚
> Location:                                                                              
>   â”‚     -> Device
> Drivers                                                                   
>   â”‚       -> Xen driver support
> 
> I believe due to dependencies it should be [y].

A symbol A depending on a symbol B only means that B must be enabled but
says nothing about whether A must be enabled. If B is y this does not
imply that A must be y also.

> 
> On the other hand including xen-platform-pci.ko into initrd.img for
> Oneiric HVM will also
> enable PV-on-HVM
> 
This requires every distro to modify its initrd tools to understand when
this module is necessary (since it cannot be inferred from the explicit
dependencies), this has been a source of many bugreports. Since the code
is tiny (a few kilobytes) it was decided that it was better to build
this in. This was done in this commit, which is probably in 3.2 but not
3.1?

commit 5fbdc10395cd500d6ff844825a918c4e6f38de37
Author: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date:   Thu Sep 29 12:05:58 2011 +0100

    xen: remove XEN_PLATFORM_PCI config option
    
    Xen PVHVM needs xen-platform-pci, on the other hand xen-platform-pci is
    useless in any other cases.
    Therefore remove the XEN_PLATFORM_PCI config option and compile
    xen-platform-pci built-in if XEN_PVHVM is selected.
    
    Changes to v1:
    
    - remove xen-platform-pci.o and just use platform-pci.o since it is not
    externally visible anymore.
    
    Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
    Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 01:56:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 01:56:46 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO4ti-0007Hy-EZ; Wed, 09 Nov 2011 01:56:46 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO4sj-000750-0q; Wed, 09 Nov 2011 01:55:45 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1320832424!43619928!1
X-Originating-IP: [80.70.172.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12923 invoked from network); 9 Nov 2011 09:53:44 -0000
Received: from dgate10.ts.fujitsu.com (HELO dgate10.ts.fujitsu.com)
	(80.70.172.49)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 09:53:44 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Message-ID:Date:From:Organization:
	User-Agent:MIME-Version:To:CC:Subject:References:
	In-Reply-To:Content-Type;
	b=uQcq7o9rqfoJJCDthwGuIg4VIDTLo3x3jIHvWtPhxeT8I0SMDR1tHgTx
	LefMSS7upTJ1rLmcAtiyEgqWj77w7+xoRRvC/EYT0BvVwRYbkKwuEAMOo
	2QA7iwrM9Pv98Yz6lySSMvbExllXh94dTOphm17CA6MNpYnPvJnOvXSHD
	s0JG+6U15337l9KQ0y3xpWI0i+mMoOlg3Ay+Pk7b5elE4N+YLCrUPkm2R
	HE91BxB0GbJhzYS/WT+Esd+vgboD/;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1320832541; x=1352368541;
	h=message-id:date:from:mime-version:to:cc:subject:
	references:in-reply-to;
	bh=A7lAE6x3FUaNHUa6xioWJbyp8oPHisv8Ej6sT/SirM4=;
	b=vtkirveQ8Vhp2ZjEtXrj4VGG8YzScy2O5JYhoVcgp9reupyJFfy1IkrT
	iQNMnqY3dbqGAqz/PQeg4lDFv4wSxOOOTvey9R2UD7A4N7WGXeSOSrXWs
	QqyCS5eh7BB7h4gCi28zbV46U1Q8q7AozlSOPyHdUq3wZ71C/f1jTQKa6
	9qtVpeoj5oJmGFK1K3w9pdK7QAAObq7uEqv+QHRZL/ZCTrgb2a/uD+a1T
	vEdqmN+h8NhTO96oiw9LDADBVGA+0;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,481,1315173600"; d="scan'208,217";a="92538550"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate10u.abg.fsc.net with ESMTP; 09 Nov 2011 10:55:41 +0100
X-IronPort-AV: E=Sophos;i="4.69,483,1315173600"; 
	d="scan'208,217";a="122691455"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 09 Nov 2011 10:55:41 +0100
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id 10BC895AB78;
	Wed,  9 Nov 2011 10:55:41 +0100 (CET)
Message-ID: <4EBA4E1D.6040306@ts.fujitsu.com>
Date: Wed, 09 Nov 2011 10:55:41 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
Organization: Fujitsu Technology Solutions
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20111010 Iceowl/1.0b2 Icedove/3.1.15
MIME-Version: 1.0
To: andrewpitman@comcast.net
Subject: Re: [Xen-devel] Re: [Xen-users] Xen 4.1.1 crash when manipulating
	cpupools.
References: <1138586740.1551436.1320768873221.JavaMail.root@sz0032a.westchester.pa.mail.comcast.net>
In-Reply-To: <1138586740.1551436.1320768873221.JavaMail.root@sz0032a.westchester.pa.mail.comcast.net>
Cc: George Dunlap <george.dunlap@eu.citrix.com>, xen-devel@lists.xensource.com,
	xen-users@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0632835167=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============0632835167==
Content-Type: multipart/alternative;
	boundary="------------030703080501020505050606"

This is a multi-part message in MIME format.
--------------030703080501020505050606
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit

Andy,

the last problem with credit2 and cpupools I'm aware of was fixed with
cs 23156 in xen 4.1, which is included in 4.1.2. I think this addressed
your original problem.


Juergen

On 11/08/2011 05:14 PM, andrewpitman@comcast.net wrote:
> George,
>
> Do you know if this was addressed in 4.1.2?
>
> Thanks,
> Andy
>
> ------------------------------------------------------------------------------
> *From: *"George Dunlap" <george.dunlap@eu.citrix.com>
> *To: *andrewpitman@comcast.net
> *Cc: *xen-devel@lists.xensource.com, xen-users@lists.xensource.com, "Pasi 
> KÃ¤rkkÃ¤inen" <pasik@iki.fi>, "Juergen Gross" <juergen.gross@ts.fujitsu.com>
> *Sent: *Wednesday, August 3, 2011 2:09:08 PM
> *Subject: *Re: [Xen-devel] Re: [Xen-users] Xen 4.1.1 crash when manipulating 
> cpupools.
>
> Yes, I'm aware of the crash when setting weight.  I've had a quick look, and 
> it's not obvious what the problem is, and I haven't had a chance to look 
> deeper.
>  -George
>
> On 08/02/2011 12:44 PM, andrewpitman@comcast.net wrote:
>
>     George,
>
>     Thanks, that would be great!  It would definitely be useful to have the
>     credit2 scheduler fully support cpupools.
>
>     One other thing I did notice was that when I try to weight Domain-0 it
>     crashes the hypervisor as well (example: "xm sched-credit2 -d Domain-0
>     -w 512").
>
>     Thanks,
>     Andy
>
>     ------------------------------------------------------------------------------
>     *From: *"George Dunlap" <george.dunlap@citrix.com>
>     *To: *"Juergen Gross" <juergen.gross@ts.fujitsu.com>
>     *Cc: *"George Dunlap" <George.Dunlap@eu.citrix.com>,
>     xen-devel@lists.xensource.com, xen-users@lists.xensource.com, "Pasi
>     KÃ¤rkkÃ¤inen" <pasik@iki.fi>, andrewpitman@comcast.net
>     *Sent: *Thursday, July 21, 2011 9:47:19 AM
>     *Subject: *Re: [Xen-devel] Re: [Xen-users] Xen 4.1.1 crash when
>     manipulating        cpupools.
>
>     On Thu, 2011-07-21 at 14:15 +0100, Juergen Gross wrote:
>     > I don't think credit2 is supporting cpupools up to now (at least not
>     any other
>     > cpupool than Pool-0). George?
>
>     I think that here were some unfortunate corner cases wrt credit2 +
>     cpupools that I didn't get worked out.  In any case, it's certainly not
>     being tested regularly, so it would be no surprise of something broke.
>
>     I'll take a look at it in the next few [working] days in hope that
>     there's a relatively simple fix.
>
>      -George
>
>
>     _______________________________________________
>     Xen-users mailing list
>     Xen-users@lists.xensource.com
>     http://lists.xensource.com/xen-users
>
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel


-- 
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: juergen.gross@ts.fujitsu.com
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html


--------------030703080501020505050606
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8bit

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
    <title></title>
  </head>
  <body bgcolor="#ffffff" text="#000000">
    Andy,<br>
    <br>
    the last problem with credit2 and cpupools I'm aware of was fixed
    with<br>
    cs 23156 in xen 4.1, which is included in 4.1.2. I think this
    addressed<br>
    your original problem.<br>
    <br>
    <br>
    Juergen<br>
    <br>
    On 11/08/2011 05:14 PM, <a class="moz-txt-link-abbreviated" href="mailto:andrewpitman@comcast.net">andrewpitman@comcast.net</a> wrote:
    <blockquote
cite="mid:1138586740.1551436.1320768873221.JavaMail.root@sz0032a.westchester.pa.mail.comcast.net"
      type="cite">
      <style type="text/css">p { margin: 0; }</style>
      <div style="font-family: Arial; font-size: 12pt; color: rgb(0, 0,
        0);">George,<br>
        <br>
        Do you know if this was addressed in 4.1.2?<br>
        <br>
        Thanks,<br>
        Andy<br>
        <br>
        <hr id="zwchr"><b>From: </b>"George Dunlap"
        <a class="moz-txt-link-rfc2396E" href="mailto:george.dunlap@eu.citrix.com">&lt;george.dunlap@eu.citrix.com&gt;</a><br>
        <b>To: </b><a class="moz-txt-link-abbreviated" href="mailto:andrewpitman@comcast.net">andrewpitman@comcast.net</a><br>
        <b>Cc: </b><a class="moz-txt-link-abbreviated" href="mailto:xen-devel@lists.xensource.com">xen-devel@lists.xensource.com</a>,
        <a class="moz-txt-link-abbreviated" href="mailto:xen-users@lists.xensource.com">xen-users@lists.xensource.com</a>, "Pasi KÃ¤rkkÃ¤inen"
        <a class="moz-txt-link-rfc2396E" href="mailto:pasik@iki.fi">&lt;pasik@iki.fi&gt;</a>, "Juergen Gross"
        <a class="moz-txt-link-rfc2396E" href="mailto:juergen.gross@ts.fujitsu.com">&lt;juergen.gross@ts.fujitsu.com&gt;</a><br>
        <b>Sent: </b>Wednesday, August 3, 2011 2:09:08 PM<br>
        <b>Subject: </b>Re: [Xen-devel] Re: [Xen-users] Xen 4.1.1 crash
        when manipulating cpupools.<br>
        <br>
        Yes, I'm aware of the crash when setting weight.Â  I've had a
        quick look, and it's not obvious what the problem is, and I
        haven't had a chance to look deeper. <br>
        Â -George<br>
        <br>
        On 08/02/2011 12:44 PM, <a moz-do-not-send="true"
          class="moz-txt-link-abbreviated"
          href="mailto:andrewpitman@comcast.net" target="_blank">andrewpitman@comcast.net</a>
        wrote:
        <blockquote
cite="mid:845913821.111513.1312314276410.JavaMail.root@sz0032a.westchester.pa.mail.comcast.net">
          <style>p { margin: 0; }</style>
          <div style="font-family: Arial; font-size: 12pt; color: rgb(0,
            0, 0);">George,<br>
            <br>
            Thanks, that would be great!Â  It would definitely be useful
            to have the credit2 scheduler fully support cpupools.<br>
            <br>
            One other thing I did notice was that when I try to weight
            Domain-0 it crashes the hypervisor as well (example: "xm
            sched-credit2 -d Domain-0 -w 512").<br>
            <br>
            Thanks,<br>
            Andy<br>
            <br>
            <hr id="zwchr"><b>From: </b>"George Dunlap" <a
              moz-do-not-send="true" class="moz-txt-link-rfc2396E"
              href="mailto:george.dunlap@citrix.com" target="_blank">&lt;george.dunlap@citrix.com&gt;</a><br>
            <b>To: </b>"Juergen Gross" <a moz-do-not-send="true"
              class="moz-txt-link-rfc2396E"
              href="mailto:juergen.gross@ts.fujitsu.com" target="_blank">&lt;juergen.gross@ts.fujitsu.com&gt;</a><br>
            <b>Cc: </b>"George Dunlap" <a moz-do-not-send="true"
              class="moz-txt-link-rfc2396E"
              href="mailto:George.Dunlap@eu.citrix.com" target="_blank">&lt;George.Dunlap@eu.citrix.com&gt;</a>,
            <a moz-do-not-send="true" class="moz-txt-link-abbreviated"
              href="mailto:xen-devel@lists.xensource.com"
              target="_blank">xen-devel@lists.xensource.com</a>, <a
              moz-do-not-send="true" class="moz-txt-link-abbreviated"
              href="mailto:xen-users@lists.xensource.com"
              target="_blank">xen-users@lists.xensource.com</a>, "Pasi
            KÃ¤rkkÃ¤inen" <a moz-do-not-send="true"
              class="moz-txt-link-rfc2396E" href="mailto:pasik@iki.fi"
              target="_blank">&lt;pasik@iki.fi&gt;</a>, <a
              moz-do-not-send="true" class="moz-txt-link-abbreviated"
              href="mailto:andrewpitman@comcast.net" target="_blank">andrewpitman@comcast.net</a><br>
            <b>Sent: </b>Thursday, July 21, 2011 9:47:19 AM<br>
            <b>Subject: </b>Re: [Xen-devel] Re: [Xen-users] Xen 4.1.1
            crash when manipulatingÂ Â Â Â Â Â Â Â cpupools.<br>
            <br>
            On Thu, 2011-07-21 at 14:15 +0100, Juergen Gross wrote:<br>
            &gt; I don't think credit2 is supporting cpupools up to now
            (at least not any other<br>
            &gt; cpupool than Pool-0). George?<br>
            <br>
            I think that here were some unfortunate corner cases wrt
            credit2 +<br>
            cpupools that I didn't get worked out. Â In any case, it's
            certainly not<br>
            being tested regularly, so it would be no surprise of
            something broke.<br>
            <br>
            I'll take a look at it in the next few [working] days in
            hope that<br>
            there's a relatively simple fix.<br>
            <br>
            Â -George<br>
            <br>
            <br>
            _______________________________________________<br>
            Xen-users mailing list<br>
            <a moz-do-not-send="true" class="moz-txt-link-abbreviated"
              href="mailto:Xen-users@lists.xensource.com"
              target="_blank">Xen-users@lists.xensource.com</a><br>
            <a moz-do-not-send="true" class="moz-txt-link-freetext"
              href="http://lists.xensource.com/xen-users"
              target="_blank">http://lists.xensource.com/xen-users</a><br>
          </div>
        </blockquote>
        <br>
      </div>
      <pre wrap="">
<fieldset class="mimeAttachmentHeader"></fieldset>
_______________________________________________
Xen-devel mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Xen-devel@lists.xensource.com">Xen-devel@lists.xensource.com</a>
<a class="moz-txt-link-freetext" href="http://lists.xensource.com/xen-devel">http://lists.xensource.com/xen-devel</a>
</pre>
    </blockquote>
    <br>
    <br>
    <pre class="moz-signature" cols="78">-- 
Juergen Gross                 Principal Developer Operating Systems
PDG ES&amp;S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: <a class="moz-txt-link-abbreviated" href="mailto:juergen.gross@ts.fujitsu.com">juergen.gross@ts.fujitsu.com</a>
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html
</pre>
  </body>
</html>

--------------030703080501020505050606--


--===============0632835167==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0632835167==--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 02:05:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 02:05:56 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO52Y-00007d-WD; Wed, 09 Nov 2011 02:05:55 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RO4z8-0008Bd-Pb
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 02:02:57 -0800
X-Env-Sender: bderzhavets@yahoo.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320832913!52022174!1
X-Originating-IP: [98.139.52.236]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17791 invoked from network); 9 Nov 2011 10:01:53 -0000
Received: from nm15-vm0.bullet.mail.ac4.yahoo.com (HELO
	nm15-vm0.bullet.mail.ac4.yahoo.com) (98.139.52.236)
	by server-9.tower-27.messagelabs.com with SMTP;
	9 Nov 2011 10:01:53 -0000
Received: from [98.139.52.196] by nm15.bullet.mail.ac4.yahoo.com with NNFMP;
	09 Nov 2011 10:02:18 -0000
Received: from [98.139.52.149] by tm9.bullet.mail.ac4.yahoo.com with NNFMP;
	09 Nov 2011 10:02:18 -0000
Received: from [127.0.0.1] by omp1032.mail.ac4.yahoo.com with NNFMP;
	09 Nov 2011 10:02:18 -0000
X-Yahoo-Newman-Property: ymail-3
X-Yahoo-Newman-Id: 721088.45627.bm@omp1032.mail.ac4.yahoo.com
Received: (qmail 7923 invoked by uid 60001); 9 Nov 2011 10:02:18 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024;
	t=1320832938; bh=1xylfeZzsCprm7cZzMGD17Ba+q56xGCQxCRoIVys3jI=;
	h=X-YMail-OSG:Received:X-Mailer:Message-ID:Date:From:Subject:To:Cc:In-Reply-To:MIME-Version:Content-Type;
	b=EHeSZ1wb6LzYYp/nqO7qJU19efrEHQBEvcTnwm6AAuymEi9BpokkeqAocrnH45OdY8LQTiyF4Wki4xwXmSN/COlsRvRj+L5Bjkaev/2eFvvihfgEG2hco0VWsVX0s474xhbumSNvkpyNQzfuRJTtwt4nRKXsxvlUzlVzXjllIXE=
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com;
	h=X-YMail-OSG:Received:X-Mailer:Message-ID:Date:From:Subject:To:Cc:In-Reply-To:MIME-Version:Content-Type;
	b=2PKLH87obzysMxD1FX+AvxwLRm+SGDJxPTHU0dzjINOY+jEqlOekUhtSYQlIPgQduvjEAzhbDR2+prMw5+tZRLh3z6sbCXVr12/Yy8HDyHzRxQ0vWPMbjtbpXtKJRPKGtDZxStsGHpcqeSUZyRW+WcNRh7bY+rq3WcLgVA/mYVs=;
X-YMail-OSG: VQMEFXcVM1m6nYvfqu83c5J7XUgavg_PR4.mtuzOwD0SRLe
	VhCh4bzRxVB7AezRd0PxoTS5fvYGwzK2DVj3jlkd00qTVp2DQTKW0VaGPlqa
	7WY3A3o5OubVJcn3uFXLP1SCAlaoh4JjohjtOAAtIXBBt1jv6zZDucsdoCIz
	LDJPvmgGQbf48Tvj0c056dYwlluiqLBGk13frsNL5lSIsWelktI5fj3oxZm.
	UgYQi_5dvsfoe4batoW4lJ7hyQyOGXDSwfBmNPYAqnh516.cNE0Qqenwl_JI
	q24jOHknCm0K34Z2Zs1nsqyz8c38tpGM.3rhgr_660cRWChiCCCUDQQUoMVU
	q0gB9cuGYGspCuYpC.PH5ok70sI2kxJ.7f.55.DkyEloO4OPnMGN5tR9HN7S
	BZvZ2_lBIIOLoF1NGQB5Jy70YFVksrZn06Hdk8U_7lXP4pBje7RqLsIdedtw
	qpKq4.PrYR4ct_5vTJfaPSdsEYEwsqwdyYmt.onQoHMaOQg3Hq6DND4LkxYJ
	0I6AU2ig5JwFikOT7OyOTmmRtryrospkXg1bhO3kOT2ezDG6qER_sNtalStl
	.ItFkFnDKUvW2PfM_KL4jqgBs2CmeZfC6JJOPUyipMoUclKm3V0K.EvmejBp
	J7IElKphM0MRKwMDBlnAxxn7XsXNRgfjMeUzIwCwNRLfLGLgTGCblDSUumgN
	hN6JrXZwmc73wyJ4wo4fUP2FX03KR
Received: from [188.114.1.218] by web65907.mail.ac4.yahoo.com via HTTP;
	Wed, 09 Nov 2011 02:02:18 PST
X-Mailer: YahooMailClassic/14.0.11 YahooMailWebService/0.8.115.325013
Message-ID: <1320832938.6518.YahooMailClassic@web65907.mail.ac4.yahoo.com>
Date: Wed, 9 Nov 2011 02:02:18 -0800 (PST)
From: Boris Derzhavets <bderzhavets@yahoo.com>
Subject: Re: [Xen-devel] Why CONFIG_XEN_PLATFORM_PCI should be equal "y" ?
To: Ian Campbell <Ian.Campbell@citrix.com>
In-Reply-To: <1320832452.955.119.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0002791841=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0002791841==
Content-Type: multipart/alternative;
	boundary="-963947445-1106529042-1320832938=:6518"

---963947445-1106529042-1320832938=:6518
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Thanks a lot for quick response.

Boris.

--- On Wed, 11/9/11, Ian Campbell <Ian.Campbell@citrix.com> wrote:

From: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] Why CONFIG_XEN_PLATFORM_PCI should be equal "y" ?
To: "Boris Derzhavets" <bderzhavets@yahoo.com>
Cc: "Stefano Stabellini" <Stefano.Stabellini@eu.citrix.com>, "Jeremy Fitzha=
rdinge" <jeremy@goop.org>, "xen-devel@lists.xensource.com" <xen-devel@lists=
.xensource.com>
Date: Wednesday, November 9, 2011, 4:54 AM

On Wed, 2011-11-09 at 09:43 +0000, Boris Derzhavets wrote:
> I've recently found the link :-
>=20
>=20
> http://xen.1045712.n5.nabble.com/PATCH-xen-remove-XEN-PLATFORM-PCI-config=
-option-td4833154.html
>=20
> In Ubuntu 3.1 kernel configuration :-
>=20
> Symbol: XEN_PLATFORM_PCI
> [=3Dm]=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0=20
>=C2=A0=C2=A0=C2=A0=E2=94=82 Type=C2=A0 :
> tristate=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0=C2=A0
>=C2=A0=C2=A0=C2=A0=E2=94=82 Prompt: xen platform pci device
> driver=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0=C2=A0
>=C2=A0=C2=A0=C2=A0=E2=94=82=C2=A0=C2=A0=C2=A0Defined at
> drivers/xen/Kconfig:140=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=20
>=C2=A0=C2=A0=C2=A0=E2=94=82=C2=A0=C2=A0=C2=A0Depends on: XEN [=3Dy] && XEN=
_PVHVM [=3Dy] && PCI
> [=3Dy]=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=20
>=C2=A0=C2=A0=C2=A0=E2=94=82
> Location:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=20
>=C2=A0=C2=A0=C2=A0=E2=94=82=C2=A0 =C2=A0=C2=A0=C2=A0-> Device
> Drivers=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0=C2=A0=C2=A0
>=C2=A0=C2=A0=C2=A0=E2=94=82=C2=A0 =C2=A0 =C2=A0=C2=A0=C2=A0-> Xen driver s=
upport
>=20
> I believe due to dependencies it should be [y].

A symbol A depending on a symbol B only means that B must be enabled but
says nothing about whether A must be enabled. If B is y this does not
imply that A must be y also.

>=20
> On the other hand including xen-platform-pci.ko into initrd.img for
> Oneiric HVM will also
> enable PV-on-HVM
>=20
This requires every distro to modify its initrd tools to understand when
this module is necessary (since it cannot be inferred from the explicit
dependencies), this has been a source of many bugreports. Since the code
is tiny (a few kilobytes) it was decided that it was better to build
this in. This was done in this commit, which is probably in 3.2 but not
3.1?

commit 5fbdc10395cd500d6ff844825a918c4e6f38de37
Author: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date:=C2=A0=C2=A0=C2=A0Thu Sep 29 12:05:58 2011 +0100

=C2=A0 =C2=A0 xen: remove XEN_PLATFORM_PCI config option
=C2=A0 =C2=A0=20
=C2=A0 =C2=A0 Xen PVHVM needs xen-platform-pci, on the other hand xen-platf=
orm-pci is
=C2=A0 =C2=A0 useless in any other cases.
=C2=A0 =C2=A0 Therefore remove the XEN_PLATFORM_PCI config option and compi=
le
=C2=A0 =C2=A0 xen-platform-pci built-in if XEN_PVHVM is selected.
=C2=A0 =C2=A0=20
=C2=A0 =C2=A0 Changes to v1:
=C2=A0 =C2=A0=20
=C2=A0 =C2=A0 - remove xen-platform-pci.o and just use platform-pci.o since=
 it is not
=C2=A0 =C2=A0 externally visible anymore.
=C2=A0 =C2=A0=20
=C2=A0 =C2=A0 Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citr=
ix.com>
=C2=A0 =C2=A0 Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

Ian.


---963947445-1106529042-1320832938=:6518
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable

<table cellspacing=3D"0" cellpadding=3D"0" border=3D"0" ><tr><td valign=3D"=
top" style=3D"font: inherit;">Thanks a lot for quick response.<br><br>Boris=
.<br><br>--- On <b>Wed, 11/9/11, Ian Campbell <i>&lt;Ian.Campbell@citrix.co=
m&gt;</i></b> wrote:<br><blockquote style=3D"border-left: 2px solid rgb(16,=
 16, 255); margin-left: 5px; padding-left: 5px;"><br>From: Ian Campbell &lt=
;Ian.Campbell@citrix.com&gt;<br>Subject: Re: [Xen-devel] Why CONFIG_XEN_PLA=
TFORM_PCI should be equal "y" ?<br>To: "Boris Derzhavets" &lt;bderzhavets@y=
ahoo.com&gt;<br>Cc: "Stefano Stabellini" &lt;Stefano.Stabellini@eu.citrix.c=
om&gt;, "Jeremy Fitzhardinge" &lt;jeremy@goop.org&gt;, "xen-devel@lists.xen=
source.com" &lt;xen-devel@lists.xensource.com&gt;<br>Date: Wednesday, Novem=
ber 9, 2011, 4:54 AM<br><br><div class=3D"plainMail">On Wed, 2011-11-09 at =
09:43 +0000, Boris Derzhavets wrote:<br>&gt; I've recently found the link :=
-<br>&gt; <br>&gt; <br>&gt; <a
 href=3D"http://xen.1045712.n5.nabble.com/PATCH-xen-remove-XEN-PLATFORM-PCI=
-config-option-td4833154.html" target=3D"_blank">http://xen.1045712.n5.nabb=
le.com/PATCH-xen-remove-XEN-PLATFORM-PCI-config-option-td4833154.html</a><b=
r>&gt; <br>&gt; In Ubuntu 3.1 kernel configuration :-<br>&gt; <br>&gt; Symb=
ol: XEN_PLATFORM_PCI<br>&gt; [=3Dm]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp=
; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nb=
sp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &=
nbsp; &nbsp; &nbsp; &nbsp; <br>&gt;&nbsp;&nbsp;&nbsp;=E2=94=82 Type&nbsp; :=
<br>&gt; tristate&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &n=
bsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp=
; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;<br>&gt;&nbsp;&nbsp;=
&nbsp;=E2=94=82 Prompt: xen platform pci device<br>&gt; driver&nbsp; &nbsp;=
 &nbsp;
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbs=
p; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &n=
bsp; &nbsp;&nbsp;&nbsp;<br>&gt;&nbsp;&nbsp;&nbsp;=E2=94=82&nbsp;&nbsp;&nbsp=
;Defined at<br>&gt; drivers/xen/Kconfig:140&nbsp; &nbsp; &nbsp; &nbsp; &nbs=
p; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &n=
bsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =
<br>&gt;&nbsp;&nbsp;&nbsp;=E2=94=82&nbsp;&nbsp;&nbsp;Depends on: XEN [=3Dy]=
 &amp;&amp; XEN_PVHVM [=3Dy] &amp;&amp; PCI<br>&gt; [=3Dy]&nbsp; &nbsp; &nb=
sp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &=
nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&gt;&nbsp;&nbsp;&nbsp;=E2=94=82<br>&g=
t; Location:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp=
; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nb=
sp; &nbsp; &nbsp;
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&gt;&nbsp;&nbsp;&nbsp;=E2=94=
=82&nbsp; &nbsp;&nbsp;&nbsp;-&gt; Device<br>&gt; Drivers&nbsp; &nbsp; &nbsp=
; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nb=
sp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &=
nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;<b=
r>&gt;&nbsp;&nbsp;&nbsp;=E2=94=82&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;-&gt; Xen =
driver support<br>&gt; <br>&gt; I believe due to dependencies it should be =
[y].<br><br>A symbol A depending on a symbol B only means that B must be en=
abled but<br>says nothing about whether A must be enabled. If B is y this d=
oes not<br>imply that A must be y also.<br><br>&gt; <br>&gt; On the other h=
and including xen-platform-pci.ko into initrd.img for<br>&gt; Oneiric HVM w=
ill also<br>&gt; enable PV-on-HVM<br>&gt; <br>This requires every distro to=
 modify its initrd tools to understand when<br>this module is necessary (si=
nce
 it cannot be inferred from the explicit<br>dependencies), this has been a =
source of many bugreports. Since the code<br>is tiny (a few kilobytes) it w=
as decided that it was better to build<br>this in. This was done in this co=
mmit, which is probably in 3.2 but not<br>3.1?<br><br>commit 5fbdc10395cd50=
0d6ff844825a918c4e6f38de37<br>Author: Stefano Stabellini &lt;<a ymailto=3D"=
mailto:stefano.stabellini@eu.citrix.com" href=3D"/mc/compose?to=3Dstefano.s=
tabellini@eu.citrix.com">stefano.stabellini@eu.citrix.com</a>&gt;<br>Date:&=
nbsp;&nbsp;&nbsp;Thu Sep 29 12:05:58 2011 +0100<br><br>&nbsp; &nbsp; xen: r=
emove XEN_PLATFORM_PCI config option<br>&nbsp; &nbsp; <br>&nbsp; &nbsp; Xen=
 PVHVM needs xen-platform-pci, on the other hand xen-platform-pci is<br>&nb=
sp; &nbsp; useless in any other cases.<br>&nbsp; &nbsp; Therefore remove th=
e XEN_PLATFORM_PCI config option and compile<br>&nbsp; &nbsp; xen-platform-=
pci built-in if XEN_PVHVM is selected.<br>&nbsp; &nbsp; <br>&nbsp; &nbsp;
 Changes to v1:<br>&nbsp; &nbsp; <br>&nbsp; &nbsp; - remove xen-platform-pc=
i.o and just use platform-pci.o since it is not<br>&nbsp; &nbsp; externally=
 visible anymore.<br>&nbsp; &nbsp; <br>&nbsp; &nbsp; Signed-off-by: Stefano=
 Stabellini &lt;<a ymailto=3D"mailto:stefano.stabellini@eu.citrix.com" href=
=3D"/mc/compose?to=3Dstefano.stabellini@eu.citrix.com">stefano.stabellini@e=
u.citrix.com</a>&gt;<br>&nbsp; &nbsp; Signed-off-by: Konrad Rzeszutek Wilk =
&lt;<a ymailto=3D"mailto:konrad.wilk@oracle.com" href=3D"/mc/compose?to=3Dk=
onrad.wilk@oracle.com">konrad.wilk@oracle.com</a>&gt;<br><br>Ian.<br><br></=
div></blockquote></td></tr></table>
---963947445-1106529042-1320832938=:6518--


--===============0002791841==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0002791841==--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 02:13:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 02:13:16 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO59f-0000be-FF; Wed, 09 Nov 2011 02:13:15 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO56R-0000M2-Sy
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 02:10:36 -0800
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320833354!62473007!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27529 invoked from network); 9 Nov 2011 10:09:15 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-2.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 9 Nov 2011 10:09:15 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RO56K-0008Ul-2O; Wed, 09 Nov 2011 10:09:48 +0000
Date: Wed, 9 Nov 2011 10:09:46 +0000
From: Tim Deegan <tim@xen.org>
To: Jean Guyader <jean.guyader@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 4/6] mm: New XENMEM space,
	XENMAPSPACE_gmfn_range
Message-ID: <20111109100946.GB31979@ocelot.phlegethon.org>
References: <1320782668-18109-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320782668-18109-5-git-send-email-jean.guyader@eu.citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <1320782668-18109-5-git-send-email-jean.guyader@eu.citrix.com>
User-Agent: Mutt/1.4.2.1i
Cc: xen-devel@lists.xensource.com, allen.m.kay@intel.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi, 

diff --git a/xen/arch/x86/x86_64/compat/mm.c b/xen/arch/x86/x86_64/compat/mm.c
index 2c05099..05c3098 100644
--- a/xen/arch/x86/x86_64/compat/mm.c
+++ b/xen/arch/x86/x86_64/compat/mm.c
@@ -63,6 +63,10 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
 
         XLAT_add_to_physmap(nat, &cmp);
         rc = arch_memory_op(op, guest_handle_from_ptr(nat, void));
+        XLAT_add_to_physmap(&cmp, nat);
+
+        if ( copy_to_guest(arg, &cmp, 1) )
+            return -EFAULT;
 
         break;
     }

I think you might need to do a bit more than this - have a look at how
XENMEM_get_pod_target is handled (in the same file), including
re-translating the hypercall continuation.

Please explicitly test the case where the hypercall gets interrupted and
the caller is a 32-bit compat guest, and make sure it does what you want.

(Apart from that the x86/mm parts of the series are now fine by me)

Cheers,

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 02:31:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 02:31:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO5RD-0001GB-6Z; Wed, 09 Nov 2011 02:31:23 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO5Q2-000131-V1
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 02:30:11 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320834570!62477114!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9967 invoked from network); 9 Nov 2011 10:29:31 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 10:29:31 -0000
X-IronPort-AV: E=Sophos;i="4.69,483,1315195200"; d="scan'208";a="18947599"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 05:30:06 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX02.citrite.net
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Wed, 9 Nov 2011
	05:30:06 -0500
Message-ID: <4EBA562D.8010808@citrix.com>
Date: Wed, 9 Nov 2011 10:30:05 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, Keir
	Fraser <keir.xen@gmail.com>
X-Enigmail-Version: 1.1.2
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: 
Subject: [Xen-devel] Request to backport 23511:450f1d198e1e to testing
	branches.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

c/s 23511:450f1d198e1e prevents cache flushing on AMD Valencia CPUs.

The result of not having this changeset, which we see on our new
hardware, is that HVM operations proceed at a glacial pace. (1 minute
for HVM bios to start, 3 minutes between booting memtest and it actually
starting to test memory.  Attempting to install windows gets very boring
very quickly.)

The patch applies cleanly to xen-4.1-testing.

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 03:08:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 03:08:46 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO61N-0002Ky-Dt; Wed, 09 Nov 2011 03:08:45 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO608-00028Q-37
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 03:07:28 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1320836844!2438703!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32413 invoked from network); 9 Nov 2011 11:07:25 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-8.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 9 Nov 2011 11:07:25 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 09 Nov 2011 11:07:24 +0000
Message-Id: <4EBA6CF7020000780005FD1E@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 09 Nov 2011 11:07:19 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: <ian.jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [xen-unstable test] 9733: regressions -
	trouble: blocked/broken/fail/pass
References: <osstest-9733-mainreport@xen.org>
In-Reply-To: <osstest-9733-mainreport@xen.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com, Keir Fraser <keir@xen.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 09.11.11 at 04:36, xen.org <ian.jackson@eu.citrix.com> wrote:
> flight 9733 xen-unstable real [real]
> http://www.chiark.greenend.org.uk/~xensrcts/logs/9733/=20
>=20
> Regressions :-(
>=20
> Tests which did not succeed and are blocking:
>  test-i386-i386-xl            18 leak-check/check           fail REGR. =
vs. 9661
>  build-amd64-oldkern           2 host-install(2)              broken
>  build-amd64-pvops             2 host-install(2)              broken
>  build-amd64                   2 host-install(2)              broken

Repeating a reply to an earlier regression report - earwig continues to
be on c/s 24069:

Nov  9 02:07:03.138530 (XEN) Xen version 4.2-unstable (osstest@cam.xci-test=
.com) (gcc version 4.4.5 (Debian 4.4.5-8) ) Thu Nov  3 20:23:16 GMT 2011
Nov  9 02:07:03.158495 (XEN) Latest ChangeSet: Thu Nov 03 17:28:41 2011 =
+0100 24069:801ca6c0fbfa

Which continues to block the regression fixes (24081 and 24108) from
getting validated/pushed (or useful data - for analysis - to be produced).

What's going on here?

Jan

> Tests which did not succeed, but are not blocking,
> including regressions (tests previously passed) regarded as allowable:
>  test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked =
 n/a
>  test-amd64-amd64-pv           1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-amd64-xl           1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-pv            1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-xl            1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-amd64-pair         1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-amd64-win          1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-pair          1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-i386-win           1 xen-build-check(1)           blocked  =
n/a
>  test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  =
n/a
>  test-i386-i386-xl-win        13 guest-stop                   fail   =
never pass
>  test-i386-i386-win           16 leak-check/check             fail   =
never pass
>=20
> version targeted for testing:
>  xen                  fb1b32c9d03d
> baseline version:
>  xen                  54a5e994a241
>=20
> ------------------------------------------------------------
> People who touched revisions under test:
>   Andrew Cooper <andrew.cooper3@citrix.com>
>   Anthony PERARD <anthony.perard@citrix.com>
>   Christoph Egger <Christoph.Egger@amd.com>
>   Ian Campbell <ian.campbell@citrix.com>
>   Ian Jackson <ian.jackson.citrix.com>
>   Ian Jackson <ian.jackson@eu.citrix.com>
>   Jan Beulich <jbeulich@suse.com>
>   Jean Guyader <jean.guyader@eu.citrix.com>
>   Juergen Gross <juergen.gross@ts.fujitsu.com>
>   juergen.gross@ts.fujitsu.com=20
>   Keir Fraser <keir@xen.org>
>   Olaf Hering <olaf@aepfle.de>
>   Tim Deegan <tim@xen.org>
>   Wei Wang <wei.wang2@amd.com>
> ------------------------------------------------------------
>=20
> jobs:
>  build-amd64                                                  broken =20
>  build-i386                                                   pass   =20
>  build-amd64-oldkern                                          broken =20
>  build-i386-oldkern                                           pass   =20
>  build-amd64-pvops                                            broken =20
>  build-i386-pvops                                             pass   =20
>  test-amd64-amd64-xl                                          blocked=20
>  test-amd64-i386-xl                                           blocked=20
>  test-i386-i386-xl                                            fail   =20
>  test-amd64-i386-rhel6hvm-amd                                 blocked=20
>  test-amd64-i386-xl-credit2                                   blocked=20
>  test-amd64-amd64-xl-pcipt-intel                              blocked=20
>  test-amd64-i386-rhel6hvm-intel                               blocked=20
>  test-amd64-i386-xl-multivcpu                                 blocked=20
>  test-amd64-amd64-pair                                        blocked=20
>  test-amd64-i386-pair                                         blocked=20
>  test-i386-i386-pair                                          pass   =20
>  test-amd64-amd64-pv                                          blocked=20
>  test-amd64-i386-pv                                           blocked=20
>  test-i386-i386-pv                                            pass   =20
>  test-amd64-amd64-xl-sedf                                     blocked=20
>  test-amd64-i386-win-vcpus1                                   blocked=20
>  test-amd64-i386-xl-win-vcpus1                                blocked=20
>  test-amd64-amd64-win                                         blocked=20
>  test-amd64-i386-win                                          blocked=20
>  test-i386-i386-win                                           fail   =20
>  test-amd64-amd64-xl-win                                      blocked=20
>  test-i386-i386-xl-win                                        fail   =20
>=20
>=20
> ------------------------------------------------------------
> sg-report-flight on woking.cam.xci-test.com
> logs: /home/xc_osstest/logs
> images: /home/xc_osstest/images
>=20
> Logs, config files, etc. are available at
>     http://www.chiark.greenend.org.uk/~xensrcts/logs=20
>=20
> Test harness code can be found at
>     http://xenbits.xensource.com/gitweb?p=3Dosstest.git;a=3Dsummary=20
>=20
>=20
> Not pushing.
>=20
> (No revision log; it would be 557 lines long.)
>=20
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com=20
> http://lists.xensource.com/xen-devel=20



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 03:11:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 03:11:52 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO64O-0002kC-9G; Wed, 09 Nov 2011 03:11:52 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO63r-0002YA-Eo
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 03:11:19 -0800
X-Env-Sender: Paul.Durrant@citrix.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1320837076!2441646!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28511 invoked from network); 9 Nov 2011 11:11:16 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 11:11:16 -0000
X-IronPort-AV: E=Sophos;i="4.69,483,1315180800"; 
   d="scan'208";a="8836858"
Received: from lonpmailmx02.citrite.net ([10.30.203.163])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:11:16 +0000
Received: from LONPMAILBOX01.citrite.net ([10.30.224.161]) by
	LONPMAILMX02.citrite.net ([10.30.203.163]) with mapi; Wed, 9 Nov 2011
	11:11:16 +0000
From: Paul Durrant <Paul.Durrant@citrix.com>
To: "annie.li@oracle.com" <annie.li@oracle.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"konrad.wilk@oracle.com" <konrad.wilk@oracle.com>, "jeremy@goop.org"
	<jeremy@goop.org>
Date: Wed, 9 Nov 2011 11:11:22 +0000
Thread-Topic: [PATCH 1/3] Introducing grant table V2 stucture
Thread-Index: Acyet8ZYqfvoa7PvSFarsEFl6ZbbZQAFzQUg
Message-ID: <291EDFCB1E9E224A99088639C4762022B4543AB1BD@LONPMAILBOX01.citrite.net>
References: <4EBA35D3.3020506@oracle.com>
	<1320826490-29362-1-git-send-email-annie.li@oracle.com>
In-Reply-To: <1320826490-29362-1-git-send-email-annie.li@oracle.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Cc: "kurt.hackel@oracle.com" <kurt.hackel@oracle.com>
Subject: [Xen-devel] RE: [PATCH 1/3] Introducing grant table V2 stucture
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Annie,

  Comments inline below...

> -----Original Message-----
[snip]
> -static struct grant_entry *shared;
> +static union {
> +	struct grant_entry_v1 *v1;
> +	void *ring_addr;
> +} shared;
> +

'ring_addr' seems like the wrong name here; how about 'raw'?

> +/*
> + * This function is null for grant table v1, adding it here in
> order to
> +keep
> + * consistent with *_v2 interface.
> + */
> +static int gnttab_map_status_v1(unsigned int nr_gframes);
> +/*
> + * This function is null for grant table v1, adding it here in
> order to
> +keep
> + * consistent with *_v2 interface.
> + */
> +static void gnttab_unmap_status_v1(void);
> +

I don't really like the idea of having null operations. How about abstracti=
ng at the level of gnttab_map/unmap so that you can include the status mapp=
ing for v2 but just do the arch_gnttab_map_shared for v1?

> +/*This is a structure of function pointers for grant table v1*/
> static
> +struct {
> +	/*
> +	 * Mapping a list of frames for storing grant entry status,
> this
> +	 * mechanism can allow better synchronization using barriers.
> Input
> +	 * parameter is frame number, returning GNTST_okay means
> success and
> +	 * negative value means failure.
> +	 */
> +	int (*_gnttab_map_status)(unsigned int);
> +	/*
> +	 * Release a list of frames which are mapped in
> _gnttab_map_status for
> +	 * grant entry status.
> +	 */
> +	void (*_gnttab_unmap_status)(void);
> +	/*
> +	 * Introducing a valid entry into the grant table, granting
> the frame
> +	 * of this grant entry to domain for accessing, or
> transfering, or
> +	 * transitively accessing. First input parameter is reference
> of this
> +	 * introduced grant entry, second one is domid of granted
> domain, third
> +	 * one is the frame to be granted, and the last one is status
> of the
> +	 * grant entry to be updated.
> +	 */
> +	void (*_update_grant_entry)(grant_ref_t, domid_t,
> +		unsigned long, unsigned);
> +	/*
> +	 * Stop granting a grant entry to domain for accessing. First
> input
> +	 * parameter is reference of a grant entry whose grant access
> will be
> +	 * stopped, second one is not in use now. If the grant entry
> is
> +	 * currently mapped for reading or writing, just return
> failure(=3D=3D0)
> +	 * directly and don't tear down the grant access. Otherwise,
> stop grant
> +	 * access for this entry and return success(=3D=3D1).
> +	 */
> +	int (*_gnttab_end_foreign_access_ref)(grant_ref_t, int);
> +	/*
> +	 * Stop granting a grant entry to domain for transfer. If
> tranfer has
> +	 * not started, just reclaim the grant entry and return
> failure(=3D=3D0).
> +	 * Otherwise, wait for the transfer to complete and then
> return the
> +	 * frame.
> +	 */
> +	unsigned long
> (*_gnttab_end_foreign_transfer_ref)(grant_ref_t);
> +	/*
> +	 * Query the status of a grant entry. Input parameter is
> reference of
> +	 * queried grant entry, return value is the status of queried
> entry.
> +	 * Detailed status(writing/reading) can be gotten from the
> return value
> +	 * by bit operations.
> +	 */
> +	int (*_gnttab_query_foreign_access)(grant_ref_t);
> +} gnttab_interface;
> +

Why the leading '_' in the names?

> +static int grant_table_version;
>=20
>  static struct gnttab_free_callback *gnttab_free_callback_list;
>=20
> @@ -142,6 +207,15 @@ static void put_free_entry(grant_ref_t ref)
>  	spin_unlock_irqrestore(&gnttab_list_lock, flags);  }
>=20
> +static void update_grant_entry_v1(grant_ref_t ref, domid_t domid,
> +				  unsigned long frame, unsigned flags) {
> +	shared.v1[ref].frame =3D frame;
> +	shared.v1[ref].domid =3D domid;
> +	wmb();
> +	shared.v1[ref].flags =3D flags;
> +}
> +
>  static void update_grant_entry(grant_ref_t ref, domid_t domid,
>  			       unsigned long frame, unsigned flags)  {
> @@ -155,12 +229,10 @@ static void update_grant_entry(grant_ref_t
> ref, domid_t domid,
>  	 *  3. Write memory barrier (WMB).
>  	 *  4. Write ent->flags, inc. valid type.
>  	 */

The comment above probably should be moved into the v1 function itself sinc=
e the v2 code differs.

> -	shared[ref].frame =3D frame;
> -	shared[ref].domid =3D domid;
> -	wmb();
> -	shared[ref].flags =3D flags;
> +	gnttab_interface._update_grant_entry(ref, domid, frame,
> flags);
>  }
[snip]

  Paul

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 03:16:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 03:16:03 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO68R-0003Gb-7f; Wed, 09 Nov 2011 03:16:03 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO67n-000347-OB
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 03:15:24 -0800
X-Env-Sender: Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1320837320!2840906!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13007 invoked from network); 9 Nov 2011 11:15:20 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 11:15:20 -0000
X-IronPort-AV: E=Sophos;i="4.69,483,1315180800"; 
   d="scan'208";a="8836956"
Received: from lonpmailmx02.citrite.net ([10.30.203.163])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:15:04 +0000
Received: from LONPMAILBOX01.citrite.net ([10.30.224.161]) by
	LONPMAILMX02.citrite.net ([10.30.203.163]) with mapi; Wed, 9 Nov 2011
	11:15:04 +0000
From: Paul Durrant <Paul.Durrant@citrix.com>
To: "annie.li@oracle.com" <annie.li@oracle.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"konrad.wilk@oracle.com" <konrad.wilk@oracle.com>, "jeremy@goop.org"
	<jeremy@goop.org>
Date: Wed, 9 Nov 2011 11:15:10 +0000
Thread-Topic: [PATCH 3/3] code clean up
Thread-Index: Acyet93NDMFQL+dQRzyQps2PvQu7SwAGNNiw
Message-ID: <291EDFCB1E9E224A99088639C4762022B4543AB1BE@LONPMAILBOX01.citrite.net>
References: <4EBA35D3.3020506@oracle.com>
	<1320826574-29427-1-git-send-email-annie.li@oracle.com>
In-Reply-To: <1320826574-29427-1-git-send-email-annie.li@oracle.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Cc: "kurt.hackel@oracle.com" <kurt.hackel@oracle.com>
Subject: [Xen-devel] RE: [PATCH 3/3] code clean up
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Annie,

  Why was this split out as a separate patch? Can it not be folded into pat=
ch 2 since the line it re-formats was introduced there?

  Paul

> -----Original Message-----
> From: annie.li@oracle.com [mailto:annie.li@oracle.com]
> Sent: 09 November 2011 08:16
> To: xen-devel@lists.xensource.com; linux-kernel@vger.kernel.org;
> konrad.wilk@oracle.com; jeremy@goop.org
> Cc: kurt.hackel@oracle.com; Paul Durrant; annie.li@oracle.com
> Subject: [PATCH 3/3] code clean up
>=20
> From: Annie Li <annie.li@oracle.com>
>=20
> Signed-off-by: Annie Li <annie.li@oracle.com>
> ---
>  drivers/xen/grant-table.c |    3 ++-
>  1 files changed, 2 insertions(+), 1 deletions(-)
>=20
> diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
> index a3294a26..458c00d 100644
> --- a/drivers/xen/grant-table.c
> +++ b/drivers/xen/grant-table.c
> @@ -708,7 +708,8 @@ static void gnttab_request_version(void)  {
>  	int rc;
>  	struct gnttab_set_version gsv;
> -	const char *str =3D "we need grant tables version 2, but only
> version 1 is available\n";
> +	const char *str =3D "we need grant tables version 2, "
> +					"but only version 1 is
> available\n";
>=20
>  	gsv.version =3D 2;
>  	rc =3D HYPERVISOR_grant_table_op(GNTTABOP_set_version, &gsv,
> 1);
> --
> 1.7.6


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 04:19:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 04:19:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO78G-0005G9-Kq; Wed, 09 Nov 2011 04:19:56 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO76p-00053P-Hx
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 04:18:27 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1320841080!51547208!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12872 invoked from network); 9 Nov 2011 12:18:00 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 12:18:00 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315180800"; 
   d="scan'208";a="8838359"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 12:18:24 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Wed, 9 Nov 2011
	12:18:24 +0000
Subject: Re: [Xen-devel] RE: [PATCH 3/3] code clean up
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Paul Durrant <Paul.Durrant@citrix.com>
Date: Wed, 9 Nov 2011 12:18:23 +0000
In-Reply-To: <291EDFCB1E9E224A99088639C4762022B4543AB1BE@LONPMAILBOX01.citrite.net>
References: <4EBA35D3.3020506@oracle.com>
	<1320826574-29427-1-git-send-email-annie.li@oracle.com>
	<291EDFCB1E9E224A99088639C4762022B4543AB1BE@LONPMAILBOX01.citrite.net>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320841103.955.120.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"konrad.wilk@oracle.com" <konrad.wilk@oracle.com>,
	"kurt.hackel@oracle.com" <kurt.hackel@oracle.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"annie.li@oracle.com" <annie.li@oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-09 at 11:15 +0000, Paul Durrant wrote:
> Annie,
> 
>   Why was this split out as a separate patch? Can it not be folded into patch 2 since the line it re-formats was introduced there?

It is not generally necessary to split string constants in order to meet
the 80 column (soft) limit in Linux code. Some people frown on it
because it breaks grep'ability.

Ian.

> 
>   Paul
> 
> > -----Original Message-----
> > From: annie.li@oracle.com [mailto:annie.li@oracle.com]
> > Sent: 09 November 2011 08:16
> > To: xen-devel@lists.xensource.com; linux-kernel@vger.kernel.org;
> > konrad.wilk@oracle.com; jeremy@goop.org
> > Cc: kurt.hackel@oracle.com; Paul Durrant; annie.li@oracle.com
> > Subject: [PATCH 3/3] code clean up
> > 
> > From: Annie Li <annie.li@oracle.com>
> > 
> > Signed-off-by: Annie Li <annie.li@oracle.com>
> > ---
> >  drivers/xen/grant-table.c |    3 ++-
> >  1 files changed, 2 insertions(+), 1 deletions(-)
> > 
> > diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
> > index a3294a26..458c00d 100644
> > --- a/drivers/xen/grant-table.c
> > +++ b/drivers/xen/grant-table.c
> > @@ -708,7 +708,8 @@ static void gnttab_request_version(void)  {
> >  	int rc;
> >  	struct gnttab_set_version gsv;
> > -	const char *str = "we need grant tables version 2, but only
> > version 1 is available\n";
> > +	const char *str = "we need grant tables version 2, "
> > +					"but only version 1 is
> > available\n";
> > 
> >  	gsv.version = 2;
> >  	rc = HYPERVISOR_grant_table_op(GNTTABOP_set_version, &gsv,
> > 1);
> > --
> > 1.7.6
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 05:14:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 05:14:02 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO7yb-0007Bx-Ba; Wed, 09 Nov 2011 05:14:01 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO7xI-0006yT-G2
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 05:12:41 -0800
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1320844355!876543!1
X-Originating-IP: [216.32.180.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9647 invoked from network); 9 Nov 2011 13:12:36 -0000
Received: from mail-va3.bigfish.com (HELO VA3EHSOBE010.bigfish.com)
	(216.32.180.10)
	by server-8.tower-174.messagelabs.com with AES128-SHA encrypted SMTP;
	9 Nov 2011 13:12:36 -0000
Received: from mail99-va3-R.bigfish.com (10.7.14.239) by
	VA3EHSOBE010.bigfish.com (10.7.40.12) with Microsoft SMTP Server id
	14.1.225.22; Wed, 9 Nov 2011 13:12:12 +0000
Received: from mail99-va3 (localhost [127.0.0.1])	by mail99-va3-R.bigfish.com
	(Postfix) with ESMTP id B49E03601A8;
	Wed,  9 Nov 2011 13:13:16 +0000 (UTC)
X-SpamScore: 0
X-BigFish: VPS0(zzc85dhzz1202hzz8275bhz2dh668h839h34h)
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPV:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
Received: from mail99-va3 (localhost.localdomain [127.0.0.1]) by mail99-va3
	(MessageSwitch) id 1320844396476924_19983;
	Wed,  9 Nov 2011 13:13:16 +0000 (UTC)
Received: from VA3EHSMHS033.bigfish.com (unknown [10.7.14.244])	by
	mail99-va3.bigfish.com (Postfix) with ESMTP id 69188540046;
	Wed,  9 Nov 2011 13:13:16 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	VA3EHSMHS033.bigfish.com (10.7.99.43) with Microsoft SMTP Server id
	14.1.225.22; Wed, 9 Nov 2011 13:12:10 +0000
X-WSS-ID: 0LUEA0U-02-AGU-02
X-M-MSG: 
Received: from sausexedgep01.amd.com (sausexedgep01-ext.amd.com
	[163.181.249.72])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 27ED6C806D;	Wed,  9 Nov 2011 07:12:30 -0600 (CST)
Received: from SAUSEXDAG03.amd.com (163.181.55.3) by sausexedgep01.amd.com
	(163.181.36.54) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Wed, 9 Nov 2011 07:13:31 -0600
Received: from storexhtp01.amd.com (172.24.4.3) by sausexdag03.amd.com
	(163.181.55.3) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Wed, 9 Nov 2011 07:12:31 -0600
Received: from rhodium.osrc.amd.com (165.204.15.173) by storexhtp01.amd.com
	(172.24.4.3) with Microsoft SMTP Server id 8.3.213.0; Wed, 9 Nov 2011
	08:12:29 -0500
Message-ID: <4EBA7C3A.6010801@amd.com>
Date: Wed, 9 Nov 2011 14:12:26 +0100
From: Christoph Egger <Christoph.Egger@amd.com>
User-Agent: Mozilla/5.0 (X11; NetBSD amd64;
	rv:6.0.1) Gecko/20111102 Thunderbird/6.0.1
MIME-Version: 1.0
To: Ian Jackson <Ian.Jackson@eu.citrix.com>, "xen-devel@lists.xensource.com"
	<xen-devel@lists.xensource.com>
Content-Type: multipart/mixed; boundary="------------070007040106090605000108"
X-OriginatorOrg: amd.com
Cc: 
Subject: [Xen-devel] [PATCH] libxc: Refactor x86 specific code into x86
	specific files
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------070007040106090605000108
Content-Type: text/plain; charset="ISO-8859-15"; format=flowed
Content-Transfer-Encoding: 7bit


Move x86 specific code into x86 specific files.
Eliminate arch specific PAGE constants by using common
XC_PAGE_* contants.

Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>

-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632

--------------070007040106090605000108
Content-Type: text/plain; name="xen_tools_libxc_x86.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="xen_tools_libxc_x86.diff"
Content-Description: xen_tools_libxc_x86.diff

diff -r c2a8bde9ad6e tools/libxc/Makefile
--- a/tools/libxc/Makefile	Wed Nov 02 14:54:36 2011 +0100
+++ b/tools/libxc/Makefile	Wed Nov 09 14:01:30 2011 +0100
@@ -13,6 +13,7 @@ CTRL_SRCS-y       += xc_domain.c
 CTRL_SRCS-y       += xc_evtchn.c
 CTRL_SRCS-y       += xc_gnttab.c
 CTRL_SRCS-y       += xc_misc.c
+CTRL_SRCS-$(CONFIG_X86) += xc_misc_x86.c
 CTRL_SRCS-y       += xc_flask.c
 CTRL_SRCS-y       += xc_physdev.c
 CTRL_SRCS-y       += xc_private.c
diff -r c2a8bde9ad6e tools/libxc/xc_dom_ia64.c
--- a/tools/libxc/xc_dom_ia64.c	Wed Nov 02 14:54:36 2011 +0100
+++ b/tools/libxc/xc_dom_ia64.c	Wed Nov 09 14:01:30 2011 +0100
@@ -83,7 +83,7 @@ int start_info_ia64(struct xc_dom_image 
         bp->initrd_start = start_info->mod_start;
         bp->initrd_size = start_info->mod_len;
     }
-    bp->command_line = (dom->start_info_pfn << PAGE_SHIFT_IA64)
+    bp->command_line = (dom->start_info_pfn << XC_PAGE_SHIFT)
         + offsetof(start_info_t, cmd_line);
     if ( dom->cmdline )
     {
@@ -128,7 +128,7 @@ static int vcpu_ia64(struct xc_dom_image
 #ifdef __ia64__			/* FIXME */
     ctxt->regs.ar.fpsr = xc_ia64_fpsr_default();
 #endif
-    ctxt->regs.r[28] = (dom->start_info_pfn << PAGE_SHIFT_IA64)
+    ctxt->regs.r[28] = (dom->start_info_pfn << XC_PAGE_SHIFT)
         + sizeof(start_info_ia64_t);
     return 0;
 }
@@ -138,7 +138,7 @@ static int vcpu_ia64(struct xc_dom_image
 static struct xc_dom_arch xc_dom_arch = {
     .guest_type = "xen-3.0-ia64",
     .native_protocol = XEN_IO_PROTO_ABI_IA64,
-    .page_shift = PAGE_SHIFT_IA64,
+    .page_shift = XC_PAGE_SHIFT,
     .alloc_magic_pages = alloc_magic_pages,
     .start_info = start_info_ia64,
     .shared_info = shared_info_ia64,
@@ -148,7 +148,7 @@ static struct xc_dom_arch xc_dom_arch = 
 static struct xc_dom_arch xc_dom_arch_ia64be = {
     .guest_type = "xen-3.0-ia64be",
     .native_protocol = XEN_IO_PROTO_ABI_IA64,
-    .page_shift = PAGE_SHIFT_IA64,
+    .page_shift = XC_PAGE_SHIFT,
     .alloc_magic_pages = alloc_magic_pages,
     .start_info = start_info_ia64,
     .shared_info = shared_info_ia64,
@@ -173,8 +173,8 @@ int arch_setup_meminit(struct xc_dom_ima
     /* setup initial p2m */
     if (dom->guest_type && strcmp(dom->guest_type,
                                   "hvm-3.0-ia64-sioemu") == 0) {
-        start = FW_MEM_BASE >> PAGE_SHIFT_IA64;
-        nbr = FW_MEM_SIZE >> PAGE_SHIFT_IA64;
+        start = FW_MEM_BASE >> XC_PAGE_SHIFT;
+        nbr = FW_MEM_SIZE >> XC_PAGE_SHIFT;
     } else {
         start = 0;
         nbr = dom->total_pages;
diff -r c2a8bde9ad6e tools/libxc/xc_dom_x86.c
--- a/tools/libxc/xc_dom_x86.c	Wed Nov 02 14:54:36 2011 +0100
+++ b/tools/libxc/xc_dom_x86.c	Wed Nov 09 14:01:30 2011 +0100
@@ -89,7 +89,7 @@ static int count_pgtables(struct xc_dom_
     pages = extra_pages;
     for ( ; ; )
     {
-        try_virt_end = round_up(dom->virt_alloc_end + pages * PAGE_SIZE_X86,
+        try_virt_end = round_up(dom->virt_alloc_end + pages * XC_PAGE_SIZE,
                                 bits_to_mask(22)); /* 4MB alignment */
         dom->pg_l4 =
             nr_page_tables(dom, dom->parms.virt_base, try_virt_end, l4_bits);
@@ -107,7 +107,7 @@ static int count_pgtables(struct xc_dom_
         }
         dom->pgtables = dom->pg_l4 + dom->pg_l3 + dom->pg_l2 + dom->pg_l1;
         pages = dom->pgtables + extra_pages;
-        if ( dom->virt_alloc_end + pages * PAGE_SIZE_X86 <= try_virt_end + 1 )
+        if ( dom->virt_alloc_end + pages * XC_PAGE_SIZE <= try_virt_end + 1 )
             break;
     }
     dom->virt_pgtab_end = try_virt_end + 1;
@@ -132,7 +132,7 @@ static int count_pgtables_x86_32_pae(str
                           L3_PAGETABLE_SHIFT_PAE, L2_PAGETABLE_SHIFT_PAE);
 }
 
-#define pfn_to_paddr(pfn) ((xen_paddr_t)(pfn) << PAGE_SHIFT_X86)
+#define pfn_to_paddr(pfn) ((xen_paddr_t)(pfn) << XC_PAGE_SHIFT)
 
 static int setup_pgtables_x86_32(struct xc_dom_image *dom)
 {
@@ -145,7 +145,7 @@ static int setup_pgtables_x86_32(struct 
     xen_pfn_t pgpfn;
 
     for ( addr = dom->parms.virt_base; addr < dom->virt_pgtab_end;
-          addr += PAGE_SIZE_X86 )
+          addr += XC_PAGE_SIZE )
     {
         if ( l1tab == NULL )
         {
@@ -159,7 +159,7 @@ static int setup_pgtables_x86_32(struct 
 
         /* make L1 entry */
         l1off = l1_table_offset_i386(addr);
-        pgpfn = (addr - dom->parms.virt_base) >> PAGE_SHIFT_X86;
+        pgpfn = (addr - dom->parms.virt_base) >> XC_PAGE_SHIFT;
         l1tab[l1off] =
             pfn_to_paddr(xc_dom_p2m_guest(dom, pgpfn)) | L1_PROT;
         if ( (addr >= dom->pgtables_seg.vstart) && 
@@ -264,7 +264,7 @@ static int setup_pgtables_x86_32_pae(str
     l3tab = xc_dom_pfn_to_ptr(dom, l3pfn, 1);
 
     for ( addr = dom->parms.virt_base; addr < dom->virt_pgtab_end;
-          addr += PAGE_SIZE_X86 )
+          addr += XC_PAGE_SIZE )
     {
         if ( l2tab == NULL )
         {
@@ -290,7 +290,7 @@ static int setup_pgtables_x86_32_pae(str
 
         /* make L1 entry */
         l1off = l1_table_offset_pae(addr);
-        pgpfn = (addr - dom->parms.virt_base) >> PAGE_SHIFT_X86;
+        pgpfn = (addr - dom->parms.virt_base) >> XC_PAGE_SHIFT;
         l1tab[l1off] =
             pfn_to_paddr(xc_dom_p2m_guest(dom, pgpfn)) | L1_PROT;
         if ( (addr >= dom->pgtables_seg.vstart) &&
@@ -345,7 +345,7 @@ static int setup_pgtables_x86_64(struct 
     xen_pfn_t pgpfn;
 
     for ( addr = dom->parms.virt_base; addr < dom->virt_pgtab_end;
-          addr += PAGE_SIZE_X86 )
+          addr += XC_PAGE_SIZE )
     {
         if ( l3tab == NULL )
         {
@@ -383,7 +383,7 @@ static int setup_pgtables_x86_64(struct 
 
         /* make L1 entry */
         l1off = l1_table_offset_x86_64(addr);
-        pgpfn = (addr - dom->parms.virt_base) >> PAGE_SHIFT_X86;
+        pgpfn = (addr - dom->parms.virt_base) >> XC_PAGE_SHIFT;
         l1tab[l1off] =
             pfn_to_paddr(xc_dom_p2m_guest(dom, pgpfn)) | L1_PROT;
         if ( (addr >= dom->pgtables_seg.vstart) && 
@@ -438,7 +438,7 @@ static int start_info_x86_32(struct xc_d
     strncpy(start_info->magic, dom->guest_type, sizeof(start_info->magic));
     start_info->magic[sizeof(start_info->magic) - 1] = '\0';
     start_info->nr_pages = dom->total_pages;
-    start_info->shared_info = shinfo << PAGE_SHIFT_X86;
+    start_info->shared_info = shinfo << XC_PAGE_SHIFT;
     start_info->pt_base = dom->pgtables_seg.vstart;
     start_info->nr_pt_frames = dom->pgtables;
     start_info->mfn_list = dom->p2m_seg.vstart;
@@ -478,7 +478,7 @@ static int start_info_x86_64(struct xc_d
     strncpy(start_info->magic, dom->guest_type, sizeof(start_info->magic));
     start_info->magic[sizeof(start_info->magic) - 1] = '\0';
     start_info->nr_pages = dom->total_pages;
-    start_info->shared_info = shinfo << PAGE_SHIFT_X86;
+    start_info->shared_info = shinfo << XC_PAGE_SHIFT;
     start_info->pt_base = dom->pgtables_seg.vstart;
     start_info->nr_pt_frames = dom->pgtables;
     start_info->mfn_list = dom->p2m_seg.vstart;
@@ -550,9 +550,9 @@ static int vcpu_x86_32(struct xc_dom_ima
     ctxt->user_regs.cs = FLAT_KERNEL_CS_X86_32;
     ctxt->user_regs.eip = dom->parms.virt_entry;
     ctxt->user_regs.esp =
-        dom->parms.virt_base + (dom->bootstack_pfn + 1) * PAGE_SIZE_X86;
+        dom->parms.virt_base + (dom->bootstack_pfn + 1) * XC_PAGE_SIZE;
     ctxt->user_regs.esi =
-        dom->parms.virt_base + (dom->start_info_pfn) * PAGE_SIZE_X86;
+        dom->parms.virt_base + (dom->start_info_pfn) * XC_PAGE_SIZE;
     ctxt->user_regs.eflags = 1 << 9; /* Interrupt Enable */
 
     ctxt->kernel_ss = ctxt->user_regs.ss;
@@ -589,9 +589,9 @@ static int vcpu_x86_64(struct xc_dom_ima
     ctxt->user_regs.cs = FLAT_KERNEL_CS_X86_64;
     ctxt->user_regs.rip = dom->parms.virt_entry;
     ctxt->user_regs.rsp =
-        dom->parms.virt_base + (dom->bootstack_pfn + 1) * PAGE_SIZE_X86;
+        dom->parms.virt_base + (dom->bootstack_pfn + 1) * XC_PAGE_SIZE;
     ctxt->user_regs.rsi =
-        dom->parms.virt_base + (dom->start_info_pfn) * PAGE_SIZE_X86;
+        dom->parms.virt_base + (dom->start_info_pfn) * XC_PAGE_SIZE;
     ctxt->user_regs.rflags = 1 << 9; /* Interrupt Enable */
 
     ctxt->kernel_ss = ctxt->user_regs.ss;
@@ -611,7 +611,7 @@ static int vcpu_x86_64(struct xc_dom_ima
 static struct xc_dom_arch xc_dom_32 = {
     .guest_type = "xen-3.0-x86_32",
     .native_protocol = XEN_IO_PROTO_ABI_X86_32,
-    .page_shift = PAGE_SHIFT_X86,
+    .page_shift = XC_PAGE_SHIFT,
     .sizeof_pfn = 4,
     .alloc_magic_pages = alloc_magic_pages,
     .count_pgtables = count_pgtables_x86_32,
@@ -623,7 +623,7 @@ static struct xc_dom_arch xc_dom_32 = {
 static struct xc_dom_arch xc_dom_32_pae = {
     .guest_type = "xen-3.0-x86_32p",
     .native_protocol = XEN_IO_PROTO_ABI_X86_32,
-    .page_shift = PAGE_SHIFT_X86,
+    .page_shift = XC_PAGE_SHIFT,
     .sizeof_pfn = 4,
     .alloc_magic_pages = alloc_magic_pages,
     .count_pgtables = count_pgtables_x86_32_pae,
@@ -636,7 +636,7 @@ static struct xc_dom_arch xc_dom_32_pae 
 static struct xc_dom_arch xc_dom_64 = {
     .guest_type = "xen-3.0-x86_64",
     .native_protocol = XEN_IO_PROTO_ABI_X86_64,
-    .page_shift = PAGE_SHIFT_X86,
+    .page_shift = XC_PAGE_SHIFT,
     .sizeof_pfn = 8,
     .alloc_magic_pages = alloc_magic_pages,
     .count_pgtables = count_pgtables_x86_64,
@@ -855,13 +855,13 @@ int arch_setup_bootlate(struct xc_dom_im
     DOMPRINTF("%s: shared_info: pfn 0x%" PRIpfn ", mfn 0x%" PRIpfn "",
               __FUNCTION__, dom->shared_info_pfn, dom->shared_info_mfn);
     shared_info = xc_map_foreign_range(dom->xch, dom->guest_domid,
-                                       PAGE_SIZE_X86,
+                                       XC_PAGE_SIZE,
                                        PROT_READ | PROT_WRITE,
                                        shinfo);
     if ( shared_info == NULL )
         return -1;
     dom->arch_hooks->shared_info(dom, shared_info);
-    munmap(shared_info, PAGE_SIZE_X86);
+    munmap(shared_info, XC_PAGE_SIZE);
 
     return 0;
 }
diff -r c2a8bde9ad6e tools/libxc/xc_misc.c
--- a/tools/libxc/xc_misc.c	Wed Nov 02 14:54:36 2011 +0100
+++ b/tools/libxc/xc_misc.c	Wed Nov 09 14:01:30 2011 +0100
@@ -177,28 +177,6 @@ int xc_sched_id(xc_interface *xch,
     return 0;
 }
 
-#if defined(__i386__) || defined(__x86_64__)
-int xc_mca_op(xc_interface *xch, struct xen_mc *mc)
-{
-    int ret = 0;
-    DECLARE_HYPERCALL;
-    DECLARE_HYPERCALL_BOUNCE(mc, sizeof(*mc), XC_HYPERCALL_BUFFER_BOUNCE_BOTH);
-
-    if ( xc_hypercall_bounce_pre(xch, mc) )
-    {
-        PERROR("Could not bounce xen_mc memory buffer");
-        return -1;
-    }
-    mc->interface_version = XEN_MCA_INTERFACE_VERSION;
-
-    hypercall.op = __HYPERVISOR_mca;
-    hypercall.arg[0] = HYPERCALL_BUFFER_AS_ARG(mc);
-    ret = do_xen_hypercall(xch, &hypercall);
-    xc_hypercall_bounce_post(xch, mc);
-    return ret;
-}
-#endif
-
 int xc_perfc_reset(xc_interface *xch)
 {
     DECLARE_SYSCTL;
diff -r c2a8bde9ad6e tools/libxc/xc_misc_x86.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxc/xc_misc_x86.c	Wed Nov 09 14:01:30 2011 +0100
@@ -0,0 +1,51 @@
+/******************************************************************************
+ * xc_misc_x86.c
+ *
+ * Miscellaneous x86 specific control interface functions.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include "xc_private.h"
+
+int xc_mca_op(xc_interface *xch, struct xen_mc *mc)
+{
+    int ret = 0;
+    DECLARE_HYPERCALL;
+    DECLARE_HYPERCALL_BOUNCE(mc, sizeof(*mc), XC_HYPERCALL_BUFFER_BOUNCE_BOTH);
+
+    if ( xc_hypercall_bounce_pre(xch, mc) )
+    {
+        PERROR("Could not bounce xen_mc memory buffer");
+        return -1;
+    }
+    mc->interface_version = XEN_MCA_INTERFACE_VERSION;
+
+    hypercall.op = __HYPERVISOR_mca;
+    hypercall.arg[0] = HYPERCALL_BUFFER_AS_ARG(mc);
+    ret = do_xen_hypercall(xch, &hypercall);
+    xc_hypercall_bounce_post(xch, mc);
+    return ret;
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r c2a8bde9ad6e tools/libxc/xc_offline_page.c
--- a/tools/libxc/xc_offline_page.c	Wed Nov 02 14:54:36 2011 +0100
+++ b/tools/libxc/xc_offline_page.c	Wed Nov 09 14:01:30 2011 +0100
@@ -369,7 +369,7 @@ static int __clear_pte(xc_interface *xch
 
     /* XXX Check for PSE bit here */
     /* Hit one entry */
-    if ( ((pte >> PAGE_SHIFT_X86) & MFN_MASK_X86) == mfn)
+    if ( ((pte >> XC_PAGE_SHIFT) & MFN_MASK_X86) == mfn)
     {
         *new_pte = pte & ~_PAGE_PRESENT;
         if (!backup_ptes(table_mfn, table_offset, backup))
@@ -400,7 +400,7 @@ static int __update_pte(xc_interface *xc
         if (pte & _PAGE_PRESENT)
             ERROR("Page present while in backup ptes\n");
         pte &= ~MFN_MASK_X86;
-        pte |= (new_mfn << PAGE_SHIFT_X86) | _PAGE_PRESENT;
+        pte |= (new_mfn << XC_PAGE_SHIFT) | _PAGE_PRESENT;
         *new_pte = pte;
         return 1;
     }
diff -r c2a8bde9ad6e tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h	Wed Nov 02 14:54:36 2011 +0100
+++ b/tools/libxc/xenctrl.h	Wed Nov 09 14:01:30 2011 +0100
@@ -49,52 +49,6 @@
 
 #include "xentoollog.h"
 
-#if defined(__i386__) || defined(__x86_64__)
-#include <xen/foreign/x86_32.h>
-#include <xen/foreign/x86_64.h>
-#include <xen/arch-x86/xen-mca.h>
-#endif
-
-#ifdef __ia64__
-#define XC_PAGE_SHIFT           14
-#else
-#define XC_PAGE_SHIFT           12
-#endif
-#define XC_PAGE_SIZE            (1UL << XC_PAGE_SHIFT)
-#define XC_PAGE_MASK            (~(XC_PAGE_SIZE-1))
-
-#define INVALID_MFN  (~0UL)
-
-/*
- *  DEFINITIONS FOR CPU BARRIERS
- */
-
-#if defined(__i386__)
-#define xen_mb()  asm volatile ( "lock; addl $0,0(%%esp)" : : : "memory" )
-#define xen_rmb() asm volatile ( "lock; addl $0,0(%%esp)" : : : "memory" )
-#define xen_wmb() asm volatile ( "" : : : "memory")
-#elif defined(__x86_64__)
-#define xen_mb()  asm volatile ( "mfence" : : : "memory")
-#define xen_rmb() asm volatile ( "lfence" : : : "memory")
-#define xen_wmb() asm volatile ( "" : : : "memory")
-#elif defined(__ia64__)
-#define xen_mb()   asm volatile ("mf" ::: "memory")
-#define xen_rmb()  asm volatile ("mf" ::: "memory")
-#define xen_wmb()  asm volatile ("mf" ::: "memory")
-#else
-#error "Define barriers"
-#endif
-
-
-#define XENCTRL_HAS_XC_INTERFACE 1
-/* In Xen 4.0 and earlier, xc_interface_open and xc_evtchn_open would
- * both return ints being the file descriptor.  In 4.1 and later, they
- * return an xc_interface* and xc_evtchn*, respectively - ie, a
- * pointer to an opaque struct.  This #define is provided in 4.1 and
- * later, allowing out-of-tree callers to more easily distinguish
- * between, and be compatible with, both versions.
- */
-
 
 /*
  *  GENERAL
@@ -119,6 +73,43 @@ typedef struct xc_interface_core xc_gnts
 typedef enum xc_error_code xc_error_code;
 
 
+#if defined(__i386__) || defined(__x86_64__)
+#include "xenctrl_x86.h"
+#endif
+
+#ifdef __ia64__
+#define XC_PAGE_SHIFT           14
+#endif
+#define XC_PAGE_SIZE            (1UL << XC_PAGE_SHIFT)
+#define XC_PAGE_MASK            (~(XC_PAGE_SIZE-1))
+
+#define INVALID_MFN  (~0UL)
+
+#define XENCTRL_HAS_XC_INTERFACE 1
+/* In Xen 4.0 and earlier, xc_interface_open and xc_evtchn_open would
+ * both return ints being the file descriptor.  In 4.1 and later, they
+ * return an xc_interface* and xc_evtchn*, respectively - ie, a
+ * pointer to an opaque struct.  This #define is provided in 4.1 and
+ * later, allowing out-of-tree callers to more easily distinguish
+ * between, and be compatible with, both versions.
+ */
+
+
+/*
+ *  DEFINITIONS FOR CPU BARRIERS
+ */
+
+#ifdef __ia64__
+#define xen_mb()   asm volatile ("mf" ::: "memory")
+#define xen_rmb()  asm volatile ("mf" ::: "memory")
+#define xen_wmb()  asm volatile ("mf" ::: "memory")
+#else
+#ifndef xen_mb
+#error "Define barriers"
+#endif
+#endif
+
+
 /*
  *  INITIALIZATION FUNCTIONS
  */
@@ -364,33 +355,22 @@ typedef struct xc_dominfo {
 
 typedef xen_domctl_getdomaininfo_t xc_domaininfo_t;
 
+#ifdef __ia64__
 typedef union 
 {
-#if defined(__i386__) || defined(__x86_64__)
-    vcpu_guest_context_x86_64_t x64;
-    vcpu_guest_context_x86_32_t x32;   
-#endif
     vcpu_guest_context_t c;
 } vcpu_guest_context_any_t;
 
 typedef union
 {
-#if defined(__i386__) || defined(__x86_64__)
-    shared_info_x86_64_t x64;
-    shared_info_x86_32_t x32;
-#endif
     shared_info_t s;
 } shared_info_any_t;
 
 typedef union
 {
-#if defined(__i386__) || defined(__x86_64__)
-    start_info_x86_64_t x64;
-    start_info_x86_32_t x32;
-#endif
     start_info_t s;
 } start_info_any_t;
-
+#endif
 
 int xc_domain_create(xc_interface *xch,
                      uint32_t ssidref,
@@ -968,32 +948,6 @@ int xc_domain_set_memmap_limit(xc_interf
                                uint32_t domid,
                                unsigned long map_limitkb);
 
-#if defined(__i386__) || defined(__x86_64__)
-/*
- * PC BIOS standard E820 types and structure.
- */
-#define E820_RAM          1
-#define E820_RESERVED     2
-#define E820_ACPI         3
-#define E820_NVS          4
-#define E820_UNUSABLE     5
-
-#define E820MAX           (128)
-
-struct e820entry {
-    uint64_t addr;
-    uint64_t size;
-    uint32_t type;
-} __attribute__((packed));
-int xc_domain_set_memory_map(xc_interface *xch,
-                               uint32_t domid,
-                               struct e820entry entries[],
-                               uint32_t nr_entries);
-
-int xc_get_machine_memory_map(xc_interface *xch,
-                              struct e820entry entries[],
-                              uint32_t max_entries);
-#endif
 int xc_domain_set_time_offset(xc_interface *xch,
                               uint32_t domid,
                               int32_t time_offset_seconds);
@@ -1691,23 +1645,6 @@ int xc_domain_debug_control(xc_interface
                             uint32_t sop,
                             uint32_t vcpu);
 
-#if defined(__i386__) || defined(__x86_64__)
-int xc_cpuid_check(xc_interface *xch,
-                   const unsigned int *input,
-                   const char **config,
-                   char **config_transformed);
-int xc_cpuid_set(xc_interface *xch,
-                 domid_t domid,
-                 const unsigned int *input,
-                 const char **config,
-                 char **config_transformed);
-int xc_cpuid_apply_policy(xc_interface *xch,
-                          domid_t domid);
-void xc_cpuid_to_str(const unsigned int *regs,
-                     char **strs);
-int xc_mca_op(xc_interface *xch, struct xen_mc *mc);
-#endif
-
 struct xc_px_val {
     uint64_t freq;        /* Px core frequency */
     uint64_t residency;   /* Px residency time */
diff -r c2a8bde9ad6e tools/libxc/xenctrl_x86.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxc/xenctrl_x86.h	Wed Nov 09 14:01:30 2011 +0100
@@ -0,0 +1,111 @@
+/******************************************************************************
+ * xenctrl.h
+ *
+ * A library for low-level access to the Xen x86 control interfaces.
+ *
+ * Copyright (c) 2003-2004, K A Fraser.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifndef XENCTRL_X86_H
+#define XENCTRL_X86_H
+
+#include <xen/foreign/x86_32.h>
+#include <xen/foreign/x86_64.h>
+#include <xen/arch-x86/xen-mca.h>
+
+#define XC_PAGE_SHIFT           12
+
+/*
+ *  DEFINITIONS FOR CPU BARRIERS
+ */
+
+#if defined(__i386__)
+#define xen_mb()  asm volatile ( "lock; addl $0,0(%%esp)" : : : "memory" )
+#define xen_rmb() asm volatile ( "lock; addl $0,0(%%esp)" : : : "memory" )
+#define xen_wmb() asm volatile ( "" : : : "memory")
+#elif defined(__x86_64__)
+#define xen_mb()  asm volatile ( "mfence" : : : "memory")
+#define xen_rmb() asm volatile ( "lfence" : : : "memory")
+#define xen_wmb() asm volatile ( "" : : : "memory")
+#endif
+
+
+typedef union 
+{
+    vcpu_guest_context_x86_64_t x64;
+    vcpu_guest_context_x86_32_t x32;   
+    vcpu_guest_context_t c;
+} vcpu_guest_context_any_t;
+
+typedef union
+{
+    shared_info_x86_64_t x64;
+    shared_info_x86_32_t x32;
+    shared_info_t s;
+} shared_info_any_t;
+
+typedef union
+{
+    start_info_x86_64_t x64;
+    start_info_x86_32_t x32;
+    start_info_t s;
+} start_info_any_t;
+
+
+/*
+ * PC BIOS standard E820 types and structure.
+ */
+#define E820_RAM          1
+#define E820_RESERVED     2
+#define E820_ACPI         3
+#define E820_NVS          4
+#define E820_UNUSABLE     5
+
+#define E820MAX           (128)
+
+struct e820entry {
+    uint64_t addr;
+    uint64_t size;
+    uint32_t type;
+} __attribute__((packed));
+
+int xc_domain_set_memory_map(xc_interface *xch,
+                               uint32_t domid,
+                               struct e820entry entries[],
+                               uint32_t nr_entries);
+
+int xc_get_machine_memory_map(xc_interface *xch,
+                              struct e820entry entries[],
+                              uint32_t max_entries);
+
+
+int xc_cpuid_check(xc_interface *xch,
+                   const unsigned int *input,
+                   const char **config,
+                   char **config_transformed);
+int xc_cpuid_set(xc_interface *xch,
+                 domid_t domid,
+                 const unsigned int *input,
+                 const char **config,
+                 char **config_transformed);
+int xc_cpuid_apply_policy(xc_interface *xch,
+                          domid_t domid);
+void xc_cpuid_to_str(const unsigned int *regs,
+                     char **strs);
+int xc_mca_op(xc_interface *xch, struct xen_mc *mc);
+
+#endif /* XENCTRL_X86_H */
diff -r c2a8bde9ad6e tools/libxc/xg_private.h
--- a/tools/libxc/xg_private.h	Wed Nov 02 14:54:36 2011 +0100
+++ b/tools/libxc/xg_private.h	Wed Nov 09 14:01:30 2011 +0100
@@ -34,6 +34,10 @@
 #include <xen/memory.h>
 #include <xen/elfnote.h>
 
+#if defined(__i386__) || defined(__x86_64__)
+#include "xg_x86_private.h"
+#endif
+
 #ifndef ELFSIZE
 #include <limits.h>
 #if UINT_MAX == ULONG_MAX
@@ -52,112 +56,8 @@ char *xc_inflate_buffer(xc_interface *xc
 
 unsigned long csum_page (void * page);
 
-#define _PAGE_PRESENT   0x001
-#define _PAGE_RW        0x002
-#define _PAGE_USER      0x004
-#define _PAGE_PWT       0x008
-#define _PAGE_PCD       0x010
-#define _PAGE_ACCESSED  0x020
-#define _PAGE_DIRTY     0x040
-#define _PAGE_PAT       0x080
-#define _PAGE_PSE       0x080
-#define _PAGE_GLOBAL    0x100
-
-#define L1_PAGETABLE_SHIFT_I386       12
-#define L2_PAGETABLE_SHIFT_I386       22
-#define L1_PAGETABLE_ENTRIES_I386   1024
-#define L2_PAGETABLE_ENTRIES_I386   1024
-
-#define L1_PAGETABLE_SHIFT_PAE        12
-#define L2_PAGETABLE_SHIFT_PAE        21
-#define L3_PAGETABLE_SHIFT_PAE        30
-#define L1_PAGETABLE_ENTRIES_PAE     512
-#define L2_PAGETABLE_ENTRIES_PAE     512
-#define L3_PAGETABLE_ENTRIES_PAE       4
-
-#define L1_PAGETABLE_SHIFT_X86_64     12
-#define L2_PAGETABLE_SHIFT_X86_64     21
-#define L3_PAGETABLE_SHIFT_X86_64     30
-#define L4_PAGETABLE_SHIFT_X86_64     39
-#define L1_PAGETABLE_ENTRIES_X86_64  512
-#define L2_PAGETABLE_ENTRIES_X86_64  512
-#define L3_PAGETABLE_ENTRIES_X86_64  512
-#define L4_PAGETABLE_ENTRIES_X86_64  512
-
-#if defined(__i386__)
-#define L1_PAGETABLE_SHIFT     L1_PAGETABLE_SHIFT_I386
-#define L2_PAGETABLE_SHIFT     L2_PAGETABLE_SHIFT_I386
-#define L1_PAGETABLE_ENTRIES   L1_PAGETABLE_ENTRIES_I386
-#define L2_PAGETABLE_ENTRIES   L2_PAGETABLE_ENTRIES_I386
-#elif defined(__x86_64__)
-#define L1_PAGETABLE_SHIFT     L1_PAGETABLE_SHIFT_X86_64
-#define L2_PAGETABLE_SHIFT     L2_PAGETABLE_SHIFT_X86_64
-#define L3_PAGETABLE_SHIFT     L3_PAGETABLE_SHIFT_X86_64
-#define L4_PAGETABLE_SHIFT     L4_PAGETABLE_SHIFT_X86_64
-#define L1_PAGETABLE_ENTRIES   L1_PAGETABLE_ENTRIES_X86_64
-#define L2_PAGETABLE_ENTRIES   L2_PAGETABLE_ENTRIES_X86_64
-#define L3_PAGETABLE_ENTRIES   L3_PAGETABLE_ENTRIES_X86_64
-#define L4_PAGETABLE_ENTRIES   L4_PAGETABLE_ENTRIES_X86_64
-#endif
-
-typedef uint32_t l1_pgentry_32_t;
-typedef uint32_t l2_pgentry_32_t;
-typedef uint64_t l1_pgentry_64_t;
-typedef uint64_t l2_pgentry_64_t;
-typedef uint64_t l3_pgentry_64_t;
-typedef uint64_t l4_pgentry_64_t;
-
-#if defined(__i386__)
-typedef l1_pgentry_32_t l1_pgentry_t;
-typedef l2_pgentry_32_t l2_pgentry_t;
-#elif defined(__x86_64__)
-typedef l1_pgentry_64_t l1_pgentry_t;
-typedef l2_pgentry_64_t l2_pgentry_t;
-typedef l3_pgentry_64_t l3_pgentry_t;
-typedef l4_pgentry_64_t l4_pgentry_t;
-#endif
-
-#define l1_table_offset_i386(_a) \
-  (((_a) >> L1_PAGETABLE_SHIFT_I386) & (L1_PAGETABLE_ENTRIES_I386 - 1))
-#define l2_table_offset_i386(_a) \
-  (((_a) >> L2_PAGETABLE_SHIFT_I386) & (L2_PAGETABLE_ENTRIES_I386 - 1))
-
-#define l1_table_offset_pae(_a) \
-  (((_a) >> L1_PAGETABLE_SHIFT_PAE) & (L1_PAGETABLE_ENTRIES_PAE - 1))
-#define l2_table_offset_pae(_a) \
-  (((_a) >> L2_PAGETABLE_SHIFT_PAE) & (L2_PAGETABLE_ENTRIES_PAE - 1))
-#define l3_table_offset_pae(_a) \
-  (((_a) >> L3_PAGETABLE_SHIFT_PAE) & (L3_PAGETABLE_ENTRIES_PAE - 1))
-
-#define l1_table_offset_x86_64(_a) \
-  (((_a) >> L1_PAGETABLE_SHIFT_X86_64) & (L1_PAGETABLE_ENTRIES_X86_64 - 1))
-#define l2_table_offset_x86_64(_a) \
-  (((_a) >> L2_PAGETABLE_SHIFT_X86_64) & (L2_PAGETABLE_ENTRIES_X86_64 - 1))
-#define l3_table_offset_x86_64(_a) \
-  (((_a) >> L3_PAGETABLE_SHIFT_X86_64) & (L3_PAGETABLE_ENTRIES_X86_64 - 1))
-#define l4_table_offset_x86_64(_a) \
-  (((_a) >> L4_PAGETABLE_SHIFT_X86_64) & (L4_PAGETABLE_ENTRIES_X86_64 - 1))
-
-#if defined(__i386__)
-#define l1_table_offset(_a) l1_table_offset_i386(_a)
-#define l2_table_offset(_a) l2_table_offset_i386(_a)
-#elif defined(__x86_64__)
-#define l1_table_offset(_a) l1_table_offset_x86_64(_a)
-#define l2_table_offset(_a) l2_table_offset_x86_64(_a)
-#define l3_table_offset(_a) l3_table_offset_x86_64(_a)
-#define l4_table_offset(_a) l4_table_offset_x86_64(_a)
-#endif
-
-#define PAGE_SHIFT_X86          12
-#define PAGE_SIZE_X86           (1UL << PAGE_SHIFT_X86)
-#define PAGE_MASK_X86           (~(PAGE_SIZE_X86-1))
-
-#define PAGE_SHIFT_IA64         14
-#define PAGE_SIZE_IA64          (1UL << PAGE_SHIFT_IA64)
-#define PAGE_MASK_IA64          (~(PAGE_SIZE_IA64-1))
-
 #define ROUNDUP(_x,_w) (((unsigned long)(_x)+(1UL<<(_w))-1) & ~((1UL<<(_w))-1))
-#define NRPAGES(x) (ROUNDUP(x, PAGE_SHIFT) >> PAGE_SHIFT)
+#define NRPAGES(x) (ROUNDUP(x, XC_PAGE_SHIFT) >> XC_PAGE_SHIFT)
 
 
 /* XXX SMH: following skanky macros rely on variable p2m_size being set */
@@ -169,7 +69,7 @@ struct domain_info_context {
 };
 
 /* Number of xen_pfn_t in a page */
-#define FPP             (PAGE_SIZE/(dinfo->guest_width))
+#define FPP             (XC_PAGE_SIZE/(dinfo->guest_width))
 
 /* Number of entries in the pfn_to_mfn_frame_list_list */
 #define P2M_FLL_ENTRIES (((dinfo->p2m_size)+(FPP*FPP)-1)/(FPP*FPP))
@@ -182,11 +82,6 @@ struct domain_info_context {
 #define P2M_TOOLS_FL_SIZE ((P2M_FL_ENTRIES) *                           \
                            MAX((sizeof (xen_pfn_t)), dinfo->guest_width))
 
-/* Masks for PTE<->PFN conversions */
-#define MADDR_BITS_X86  ((dinfo->guest_width == 8) ? 52 : 44)
-#define MFN_MASK_X86    ((1ULL << (MADDR_BITS_X86 - PAGE_SHIFT_X86)) - 1)
-#define MADDR_MASK_X86  (MFN_MASK_X86 << PAGE_SHIFT_X86)
-
 
 #define PAEKERN_no           0
 #define PAEKERN_yes          1
diff -r c2a8bde9ad6e tools/libxc/xg_x86_private.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxc/xg_x86_private.h	Wed Nov 09 14:01:30 2011 +0100
@@ -0,0 +1,121 @@
+/*
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifndef XG_X86_PRIVATE_H
+#define XG_X86_PRIVATE_H
+
+#define _PAGE_PRESENT   0x001
+#define _PAGE_RW        0x002
+#define _PAGE_USER      0x004
+#define _PAGE_PWT       0x008
+#define _PAGE_PCD       0x010
+#define _PAGE_ACCESSED  0x020
+#define _PAGE_DIRTY     0x040
+#define _PAGE_PAT       0x080
+#define _PAGE_PSE       0x080
+#define _PAGE_GLOBAL    0x100
+
+#define L1_PAGETABLE_SHIFT_I386       12
+#define L2_PAGETABLE_SHIFT_I386       22
+#define L1_PAGETABLE_ENTRIES_I386   1024
+#define L2_PAGETABLE_ENTRIES_I386   1024
+
+#define L1_PAGETABLE_SHIFT_PAE        12
+#define L2_PAGETABLE_SHIFT_PAE        21
+#define L3_PAGETABLE_SHIFT_PAE        30
+#define L1_PAGETABLE_ENTRIES_PAE     512
+#define L2_PAGETABLE_ENTRIES_PAE     512
+#define L3_PAGETABLE_ENTRIES_PAE       4
+
+#define L1_PAGETABLE_SHIFT_X86_64     12
+#define L2_PAGETABLE_SHIFT_X86_64     21
+#define L3_PAGETABLE_SHIFT_X86_64     30
+#define L4_PAGETABLE_SHIFT_X86_64     39
+#define L1_PAGETABLE_ENTRIES_X86_64  512
+#define L2_PAGETABLE_ENTRIES_X86_64  512
+#define L3_PAGETABLE_ENTRIES_X86_64  512
+#define L4_PAGETABLE_ENTRIES_X86_64  512
+
+#if defined(__i386__)
+#define L1_PAGETABLE_SHIFT     L1_PAGETABLE_SHIFT_I386
+#define L2_PAGETABLE_SHIFT     L2_PAGETABLE_SHIFT_I386
+#define L1_PAGETABLE_ENTRIES   L1_PAGETABLE_ENTRIES_I386
+#define L2_PAGETABLE_ENTRIES   L2_PAGETABLE_ENTRIES_I386
+#elif defined(__x86_64__)
+#define L1_PAGETABLE_SHIFT     L1_PAGETABLE_SHIFT_X86_64
+#define L2_PAGETABLE_SHIFT     L2_PAGETABLE_SHIFT_X86_64
+#define L3_PAGETABLE_SHIFT     L3_PAGETABLE_SHIFT_X86_64
+#define L4_PAGETABLE_SHIFT     L4_PAGETABLE_SHIFT_X86_64
+#define L1_PAGETABLE_ENTRIES   L1_PAGETABLE_ENTRIES_X86_64
+#define L2_PAGETABLE_ENTRIES   L2_PAGETABLE_ENTRIES_X86_64
+#define L3_PAGETABLE_ENTRIES   L3_PAGETABLE_ENTRIES_X86_64
+#define L4_PAGETABLE_ENTRIES   L4_PAGETABLE_ENTRIES_X86_64
+#endif
+
+typedef uint32_t l1_pgentry_32_t;
+typedef uint32_t l2_pgentry_32_t;
+typedef uint64_t l1_pgentry_64_t;
+typedef uint64_t l2_pgentry_64_t;
+typedef uint64_t l3_pgentry_64_t;
+typedef uint64_t l4_pgentry_64_t;
+
+#if defined(__i386__)
+typedef l1_pgentry_32_t l1_pgentry_t;
+typedef l2_pgentry_32_t l2_pgentry_t;
+#elif defined(__x86_64__)
+typedef l1_pgentry_64_t l1_pgentry_t;
+typedef l2_pgentry_64_t l2_pgentry_t;
+typedef l3_pgentry_64_t l3_pgentry_t;
+typedef l4_pgentry_64_t l4_pgentry_t;
+#endif
+
+#define l1_table_offset_i386(_a) \
+  (((_a) >> L1_PAGETABLE_SHIFT_I386) & (L1_PAGETABLE_ENTRIES_I386 - 1))
+#define l2_table_offset_i386(_a) \
+  (((_a) >> L2_PAGETABLE_SHIFT_I386) & (L2_PAGETABLE_ENTRIES_I386 - 1))
+
+#define l1_table_offset_pae(_a) \
+  (((_a) >> L1_PAGETABLE_SHIFT_PAE) & (L1_PAGETABLE_ENTRIES_PAE - 1))
+#define l2_table_offset_pae(_a) \
+  (((_a) >> L2_PAGETABLE_SHIFT_PAE) & (L2_PAGETABLE_ENTRIES_PAE - 1))
+#define l3_table_offset_pae(_a) \
+  (((_a) >> L3_PAGETABLE_SHIFT_PAE) & (L3_PAGETABLE_ENTRIES_PAE - 1))
+
+#define l1_table_offset_x86_64(_a) \
+  (((_a) >> L1_PAGETABLE_SHIFT_X86_64) & (L1_PAGETABLE_ENTRIES_X86_64 - 1))
+#define l2_table_offset_x86_64(_a) \
+  (((_a) >> L2_PAGETABLE_SHIFT_X86_64) & (L2_PAGETABLE_ENTRIES_X86_64 - 1))
+#define l3_table_offset_x86_64(_a) \
+  (((_a) >> L3_PAGETABLE_SHIFT_X86_64) & (L3_PAGETABLE_ENTRIES_X86_64 - 1))
+#define l4_table_offset_x86_64(_a) \
+  (((_a) >> L4_PAGETABLE_SHIFT_X86_64) & (L4_PAGETABLE_ENTRIES_X86_64 - 1))
+
+#if defined(__i386__)
+#define l1_table_offset(_a) l1_table_offset_i386(_a)
+#define l2_table_offset(_a) l2_table_offset_i386(_a)
+#elif defined(__x86_64__)
+#define l1_table_offset(_a) l1_table_offset_x86_64(_a)
+#define l2_table_offset(_a) l2_table_offset_x86_64(_a)
+#define l3_table_offset(_a) l3_table_offset_x86_64(_a)
+#define l4_table_offset(_a) l4_table_offset_x86_64(_a)
+#endif
+
+/* Masks for PTE<->PFN conversions */
+#define MADDR_BITS_X86  ((dinfo->guest_width == 8) ? 52 : 44)
+#define MFN_MASK_X86    ((1ULL << (MADDR_BITS_X86 - XC_PAGE_SHIFT)) - 1)
+#define MADDR_MASK_X86  (MFN_MASK_X86 << XC_PAGE_SHIFT)
+
+#endif /* XG_X86_PRIVATE_H */

--------------070007040106090605000108
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------070007040106090605000108--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 05:29:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 05:29:03 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO8D8-0007uu-Vb; Wed, 09 Nov 2011 05:29:03 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO8CE-0007hm-MV
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 05:28:07 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1320845246!56134713!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2702 invoked from network); 9 Nov 2011 13:27:26 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 13:27:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315180800"; 
   d="scan'208";a="8840043"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 13:28:03 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Wed, 9 Nov 2011
	13:28:03 +0000
Subject: Re: [Xen-devel] [PATCH 1/3] Introducing grant table V2 stucture
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "annie.li@oracle.com" <annie.li@oracle.com>
Date: Wed, 9 Nov 2011 13:28:03 +0000
In-Reply-To: <1320826490-29362-1-git-send-email-annie.li@oracle.com>
References: <4EBA35D3.3020506@oracle.com>
	<1320826490-29362-1-git-send-email-annie.li@oracle.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320845283.955.131.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"konrad.wilk@oracle.com" <konrad.wilk@oracle.com>,
	"kurt.hackel@oracle.com" <kurt.hackel@oracle.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Durrant <Paul.Durrant@citrix.com>, Paul
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-09 at 08:14 +0000, annie.li@oracle.com wrote:
> diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
> index 4f44b34..0d481a9 100644
> --- a/drivers/xen/grant-table.c
> +++ b/drivers/xen/grant-table.c
> @@ -53,7 +53,7 @@
>  /* External tools reserve first few grant table entries. */
>  #define NR_RESERVED_ENTRIES 8
>  #define GNTTAB_LIST_END 0xffffffff
> -#define GREFS_PER_GRANT_FRAME (PAGE_SIZE / sizeof(struct grant_entry))
> +#define GREFS_PER_GRANT_FRAME (PAGE_SIZE / sizeof(struct grant_entry_v1))

Does this need to become GREFS_V1_PER... or something?

> 
>  static grant_ref_t **gnttab_list;
>  static unsigned int nr_grant_frames;
> @@ -64,7 +64,72 @@ static DEFINE_SPINLOCK(gnttab_list_lock);
>  unsigned long xen_hvm_resume_frames;
>  EXPORT_SYMBOL_GPL(xen_hvm_resume_frames);
> 
> -static struct grant_entry *shared;
> +static union {
> +       struct grant_entry_v1 *v1;
> +       void *ring_addr;
> +} shared;
> +
> +/*
> + * This function is null for grant table v1, adding it here in order to keep
> + * consistent with *_v2 interface.
> + */
> +static int gnttab_map_status_v1(unsigned int nr_gframes);
> +/*
> + * This function is null for grant table v1, adding it here in order to keep
> + * consistent with *_v2 interface.
> + */
> +static void gnttab_unmap_status_v1(void);

If you reorder the declarations of gnttab_request_version and
gnttab_(un)map_status_v1 below then you can avoid these forward
declarations.

Also I don't think the comment really adds much once you have the empty
declaration underneath (like you do below). A simple "/* Nothing to do
for v1 */" in the implementation would be sufficient.

> +
> +/*This is a structure of function pointers for grant table v1*/

and eventually v2, right? Actually I think the v1 is unnecessary. e.g.:
	/*This is a structure of function pointers for grant table*/

> +static struct {
> +       /*
> +        * Mapping a list of frames for storing grant entry status, this
> +        * mechanism can allow better synchronization using barriers. Input
> +        * parameter is frame number, returning GNTST_okay means success and
> +        * negative value means failure.
> +        */
> +       int (*_gnttab_map_status)(unsigned int);

I think you can drop the "_gnttab_" prefix from all of these, it'll be
clear from the gnttab->foo what the namespace is.

[...]
> +} gnttab_interface;
> +
> +static int grant_table_version;
> 
>  static struct gnttab_free_callback *gnttab_free_callback_list;
> 

> @@ -155,12 +229,10 @@ static void update_grant_entry(grant_ref_t ref, domid_t domid,
>          *  3. Write memory barrier (WMB).
>          *  4. Write ent->flags, inc. valid type.
>          */
> -       shared[ref].frame = frame;
> -       shared[ref].domid = domid;
> -       wmb();
> -       shared[ref].flags = flags;
> +       gnttab_interface._update_grant_entry(ref, domid, frame, flags);
>  }
> 
> +

Please avoid unrelated whitespace changes.

>  /*
>   * Public grant-issuing interface functions
>   */
> @@ -187,31 +259,40 @@ int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
>  }
>  EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access);
> 
> -int gnttab_query_foreign_access(grant_ref_t ref)
> +int gnttab_query_foreign_access_v1(grant_ref_t ref)

This and all the other similar functions can now be made static.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 05:33:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 05:33:25 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO8HM-0008Lx-QI; Wed, 09 Nov 2011 05:33:25 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO8Gp-00089N-T9
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 05:32:52 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320845539!52419305!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24786 invoked from network); 9 Nov 2011 13:32:19 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 13:32:19 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315180800"; 
   d="scan'208";a="8840177"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 13:32:48 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Wed, 9 Nov 2011
	13:32:48 +0000
Subject: Re: [Xen-devel] [PATCH 2/3] Grant tables v2 implementation.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "annie.li@oracle.com" <annie.li@oracle.com>
Date: Wed, 9 Nov 2011 13:32:48 +0000
In-Reply-To: <1320826541-29398-1-git-send-email-annie.li@oracle.com>
References: <4EBA35D3.3020506@oracle.com>
	<1320826541-29398-1-git-send-email-annie.li@oracle.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320845568.955.134.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"konrad.wilk@oracle.com" <konrad.wilk@oracle.com>,
	"kurt.hackel@oracle.com" <kurt.hackel@oracle.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Durrant <Paul.Durrant@citrix.com>, Paul
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-09 at 08:15 +0000, annie.li@oracle.com wrote:
> From: Annie Li <annie.li@oracle.com>
> 
> Receiver-side copying of packets is based on this implementation, it gives
> better performance and better CPU accounting. It totally supports three types:
> full-page, sub-page and transitive grants.
> 
> However this patch does not cover sub-page and transitive grants, it mainly
> focus on Full-page part and implements grant table V2 interfaces corresponding
> to what already exists in grant table V1, such as: grant table V2
> initialization, mapping, releasing and exported interfaces.
> 
> Each guest can only supports one type of grant table type, every entry in grant
> table should be the same version. It is necessary to set V1 or V2 version before
> initializing the grant table.
> 
> Grant table exported interfaces of V2 are same with those of V1, Xen is
> responsible to judge what grant table version guests are using in every grant
> operation.
> 
> V2 fulfills the same role of V1, and it is totally backwards compitable with V1.
> If dom0 support grant table V2, the guests runing on it can run with either V1
> or V2.
> 
> Signed-off-by: Annie Li <annie.li@oracle.com>
> ---
>  arch/x86/xen/grant-table.c |   34 ++++++++-
>  drivers/xen/grant-table.c  |  194 +++++++++++++++++++++++++++++++++++++++++---
>  include/xen/grant_table.h  |    6 +-
>  3 files changed, 220 insertions(+), 14 deletions(-)
> 
> diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c
> index 65ce508..3e9f936 100644
> --- a/arch/x86/xen/grant-table.c
> +++ b/arch/x86/xen/grant-table.c
> @@ -54,6 +54,17 @@ static int map_pte_fn(pte_t *pte, struct page *pmd_page,
>         return 0;
>  }
> 
> +/*32bits is not enough since Xen supports sparse physical memory*/

What does this mean?

> +static int map_pte_fn_status(pte_t *pte, struct page *pmd_page,
> +                            unsigned long addr, void *data)
> +{
> +       uint64_t **frames = (uint64_t **)data;
> +
> +       set_pte_at(&init_mm, addr, pte, mfn_pte((*frames)[0], PAGE_KERNEL));
> +       (*frames)++;
> +       return 0;
> +}

Isn't this function identical to map_pte_fn?

> +
>  static int unmap_pte_fn(pte_t *pte, struct page *pmd_page,
>                         unsigned long addr, void *data)
>  {

> @@ -630,6 +756,44 @@ static int gnttab_map_status_v1(unsigned int nr_gframes)
>         return 0;
>  }
> 
> +static int gnttab_map_status_v2(unsigned int nr_gframes)
> +{
> +       uint64_t *sframes;
> +       unsigned int nr_sframes;
> +       struct gnttab_get_status_frames getframes;
> +       int rc;
> +
> +       nr_sframes = nr_status_frames(nr_gframes);
> +
> +       /* No need for kzalloc as it is initialized in following hyercall

                                                                   hypercall

> +        * GNTTABOP_get_status_frames.
> +        */
> +       sframes = kmalloc(nr_sframes  * sizeof(uint64_t), GFP_ATOMIC);
> +       if (!sframes)
> +               return -ENOMEM;
> +
> +       getframes.dom        = DOMID_SELF;
> +       getframes.nr_frames  = nr_sframes;
> +       set_xen_guest_handle(getframes.frame_list, sframes);
> +
> +       rc = HYPERVISOR_grant_table_op(GNTTABOP_get_status_frames,
> +                                      &getframes, 1);
> +       if (rc == -ENOSYS) {
> +               kfree(sframes);
> +               return -ENOSYS;
> +       }
> +
> +       BUG_ON(rc || getframes.status);
> +
> +       rc = arch_gnttab_map_status(sframes, nr_sframes,
> +                                   nr_status_frames(gnttab_max_grant_frames()),
> +                                   &grstatus);
> +       BUG_ON(rc);
> +       kfree(sframes);
> +
> +       return 0;
> +}
> +
>  static int gnttab_map_status(unsigned int nr_gframes)
>  {
>         return gnttab_interface._gnttab_map_status(nr_gframes);
> @@ -666,6 +830,9 @@ static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
>                 return rc;
>         }
> 
> +       /* No need for kzalloc as it is initialized in following hyercall

"hypercall" again

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 05:36:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 05:36:02 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO8Ju-0000KL-E6; Wed, 09 Nov 2011 05:36:02 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO8JN-00007W-2J
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 05:35:29 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1320845725!2460482!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16133 invoked from network); 9 Nov 2011 13:35:26 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 9 Nov 2011 13:35:26 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 09 Nov 2011 13:35:25 +0000
Message-Id: <4EBA8FAA020000780005FD5F@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 09 Nov 2011 13:35:22 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Laszlo Ersek" <lersek@redhat.com>
Subject: Re: [Xen-devel] [PATCH] remove blocked time accounting from
	xen "clockchip"
References: <1318970579-6282-1-git-send-email-lersek@redhat.com>
In-Reply-To: <1318970579-6282-1-git-send-email-lersek@redhat.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Jeremy Fitzhardinge <jeremy@goop.org>, xen-devel@lists.xensource.com,
	Joe Jin <joe.jin@oracle.com>, Zhenzhong Duan <zhenzhong.duan@oracle.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 18.10.11 at 22:42, Laszlo Ersek <lersek@redhat.com> wrote:
> ... because the "clock_event_device framework" already accounts for idle
> time through the "event_handler" function pointer in
> xen_timer_interrupt().
>=20
> The patch is intended as the completion of [1]. It should fix the double
> idle times seen in PV guests' /proc/stat [2]. It should be orthogonal to
> stolen time accounting (the removed code seems to be isolated).

After some more looking around I still think it's incorrect, albeit for
a different reason: What tick_nohz_restart_sched_tick() accounts
as idle time is *all* time that passed while in cpu_idle(). What gets
accounted in do_stolen_accounting() (without your patch) is
different:
- time the vCPU was in RUNSTATE_blocked gets accounted as idle
- time the vCPU was in RUNSTATE_runnable and RUNSTATE_offline
  gets accounted as stolen.

That is, on an overcommitted system (and without your patch) I
would expect you to not see the (full) double idle increment for a not
fully idle and not fully loaded vCPU.

Now we can of course say that for most purposes it's fine to
ignore the difference between idle and steal time, but there must
be a reason these have been getting accounted separately in Linux
without regard to Xen.

So I really think that what needs to be suppressed to address this
is tick_nohz_restart_sched_tick()'s call to account_idle_ticks(). But
simply forcing CONFIG_VIRT_CPU_ACCOUNTING is not an immediate
option (not even when considering a Xen-only kernel), as that has
further implications. Instead I wonder whether under Xen we should
e.g. update per_cpu(tick_cpu_sched, cpu).idle_jiffies prior to calling
tick_nohz_restart_sched_tick() (possibly implicitly by doing the
update in do_stolen_accounting(), though that wouldn't work when
the wakeup is due to an interrupt other than the timer one).

The alternative of accounting the negative of the steal time as
idle time in do_stolen_accounting() doesn't look correct either,
since not all stolen time was necessarily accounted as idle (some
would have got - also incorrectly - accounted as process or system
time).

So my conclusion is that only the full implementation of what
CONFIG_VIRT_CPU_ACCOUNTING expects would actually get
things sorted out properly (but that would imply Xen *and* native
are willing to pay the performance price, or the enabling of this
can be made dynamic so that at least native could remain
unaffected).

Or the negative stolen time should be accounted to the current
process, the system, or as idle, depending on the context which
do_stolen_accounting() runs in (just like timer_interrupt() did in
the XenoLinux kernels for positive accounting).

Jan

> The approach may be completely misguided.
>=20
> [1] https://lkml.org/lkml/2011/10/6/10=20
> [2] http://lists.xensource.com/archives/html/xen-devel/2010-08/msg01068.h=
tml=20
>=20
> Signed-off-by: Laszlo Ersek <lersek@redhat.com>
> ---
>  arch/x86/xen/time.c |   17 ++---------------
>  1 files changed, 2 insertions(+), 15 deletions(-)
>=20
> diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
> index 163b467..377f6ae 100644
> --- a/arch/x86/xen/time.c
> +++ b/arch/x86/xen/time.c
> @@ -36,9 +36,8 @@ static DEFINE_PER_CPU(struct vcpu_runstate_info,=20
> xen_runstate);
>  /* snapshots of runstate info */
>  static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate_snapshot);=

> =20
> -/* unused ns of stolen and blocked time */
> +/* unused ns of stolen time */
>  static DEFINE_PER_CPU(u64, xen_residual_stolen);
> -static DEFINE_PER_CPU(u64, xen_residual_blocked);
> =20
>  /* return an consistent snapshot of 64-bit time/counter value */
>  static u64 get64(const u64 *p)
> @@ -115,7 +114,7 @@ static void do_stolen_accounting(void)
>  {
>  	struct vcpu_runstate_info state;
>  	struct vcpu_runstate_info *snap;
> -	s64 blocked, runnable, offline, stolen;
> +	s64 runnable, offline, stolen;
>  	cputime_t ticks;
> =20
>  	get_runstate_snapshot(&state);
> @@ -125,7 +124,6 @@ static void do_stolen_accounting(void)
>  	snap =3D &__get_cpu_var(xen_runstate_snapshot);
> =20
>  	/* work out how much time the VCPU has not been runn*ing*  */
> -	blocked =3D state.time[RUNSTATE_blocked] - snap->time[RUNSTATE_bloc=
ked];
>  	runnable =3D state.time[RUNSTATE_runnable] - snap->time[RUNSTATE_ru=
nnable];
>  	offline =3D state.time[RUNSTATE_offline] - snap->time[RUNSTATE_offl=
ine];
> =20
> @@ -141,17 +139,6 @@ static void do_stolen_accounting(void)
>  	ticks =3D iter_div_u64_rem(stolen, NS_PER_TICK, &stolen);
>  	__this_cpu_write(xen_residual_stolen, stolen);
>  	account_steal_ticks(ticks);
> -
> -	/* Add the appropriate number of ticks of blocked time,
> -	   including any left-overs from last time. */
> -	blocked +=3D __this_cpu_read(xen_residual_blocked);
> -
> -	if (blocked < 0)
> -		blocked =3D 0;
> -
> -	ticks =3D iter_div_u64_rem(blocked, NS_PER_TICK, &blocked);
> -	__this_cpu_write(xen_residual_blocked, blocked);
> -	account_idle_ticks(ticks);
>  }
> =20
>  /* Get the TSC speed from Xen */




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 05:47:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 05:47:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO8Uj-0000w4-A2; Wed, 09 Nov 2011 05:47:13 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO8Ts-0000jG-Dl
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 05:46:20 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1320846377!1538577!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6008 invoked from network); 9 Nov 2011 13:46:17 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-13.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 9 Nov 2011 13:46:17 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 09 Nov 2011 13:46:16 +0000
Message-Id: <4EBA9235020000780005FD7D@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 09 Nov 2011 13:46:13 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Ian Jackson" <Ian.Jackson@eu.citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: George Dunlap <George.Dunlap@eu.citrix.com>, Keir Fraser <keir@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Haitao Shan <haitao.shan@intel.com>
Subject: [Xen-devel] qemu MSI-X handling patch disposition
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ian,

in http://lists.xensource.com/archives/html/xen-devel/2011-09/msg01161.html=
=20
Haitao proposed a patch to deal with an MSI-X security issue, which you
never commented on but which also never got committed. What's the
situation/plan here?

Thanks, Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 05:48:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 05:48:20 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO8Vo-0001JS-Iw; Wed, 09 Nov 2011 05:48:20 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO8Ud-0000tg-99
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 05:47:08 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1320846423!2462169!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19418 invoked from network); 9 Nov 2011 13:47:04 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 13:47:04 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315180800"; 
   d="scan'208";a="8840714"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 13:47:03 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 13:47:03 +0000
Date: Wed, 9 Nov 2011 13:47:36 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Jiageng Yu <yujiageng734@gmail.com>
Subject: Re: [Xen-devel] Re: Linux Stubdom Problem
In-Reply-To: <CAJ0pt154u9GY-6x6ZJA2UDyfgE135hZkr27XHnJ2ooaaNtTEmw@mail.gmail.com>
Message-ID: <alpine.DEB.2.00.1111091340110.3519@kaball-desktop>
References: <alpine.DEB.2.00.1109021401000.12963@kaball-desktop>
	<CA8694A1.20379%keir.xen@gmail.com>
	<CAJ0pt17eoZbEnmziLaSd1Cxi+sU90rJ-c8TSgt+ikE3wZj1jhA@mail.gmail.com>
	<alpine.DEB.2.00.1109151110020.12963@kaball-desktop>
	<CAJ0pt15daSuXGi_8T3NS53E2Xv0bYV90b94100Wi6ajt99gedQ@mail.gmail.com>
	<alpine.DEB.2.00.1111081412270.3519@kaball-desktop>
	<CAJ0pt154u9GY-6x6ZJA2UDyfgE135hZkr27XHnJ2ooaaNtTEmw@mail.gmail.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="8323329-1608073033-1320846471=:3519"
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Keir Fraser <keir.xen@gmail.com>, Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	"Tim \(Xen.org\)" <tim@xen.org>, Konrad, Samuel,
	Anthony PERARD <anthony.perard@gmail.com>,
	Thibault <samuel.thibault@ens-lyon.org>,
	Ian Campbell <Ian.Campbell@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--8323329-1608073033-1320846471=:3519
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8BIT

On Wed, 9 Nov 2011, Jiageng Yu wrote:
> 2011/11/9 Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> >
> > On Thu, 27 Oct 2011, Jiageng Yu wrote:
> > > Hi Stefano,
> > >
> > > Â  Â  Â  I have some progress in linux based stubdom project. As shown in the
> > > attached video, I have started the emulated vga device in the linux
> > > based stubdom.
> > >
> > > Â  Â  Â  In a short conclusion, for the linux based stubdom, there are two
> > > major problems about vga device emulation. The first is the vram
> > > mapping, which we discussed a lot previously and handled it.
> >
> > Do you have an updated version of the patch you used?
> >
> >
> > > Another
> > > is the vga BIOS mapping (address 0xc0000-0xc8fff of hvm guest).
> >
> > This is caused by qemu trying to map that memory area in its own address
> > space, right?
> >
> >
> > > Â  Â  Â  I found the vga BIOS mapping problem in remap_area_mfn_pte_fn()
> > > function. The pte_mkspecial() will return invalid value when I try to
> > > map 0xc0000-0xc8fff into linux based stubdom.
> >
> > What is exactly the error you are seeing?
> >
> >
> > > pte_mkspecial()
> > > Â  Â  Â  ->pte_set_flags()
> > > Â  Â  Â  Â  Â  Â  Â  ->native_pte_val()
> > > Â  Â  Â  Â  Â  Â  Â  ->native_make_pte()
> > >
> > > Â  Â  Â  According to my test, the root cause of vga BIOS mapping problem is
> > > native_xxx functions. We could avoid the problem by invoking functions
> > > defined in paravirt.h instead. The patch is as follows. But I think it
> > > is not a good way to handle the problem. Maybe you can give me some
> > > suggestions.
> > >
> > > Â  Â  Â  I also found the hard disk didnÃƒ??Ãƒ?????Ãƒ??Ãƒ????Ãƒ??Ãƒ???Ãƒ??Ãƒ??Ãƒ??Ãƒ?Ã‚Â¢??t work well. I will investigate it these days.
> > >
> > >
> > > --- a/arch/x86/xen/mmu.c
> > > +++ b/arch/x86/xen/mmu.c
> > > @@ -2639,12 +2640,16 @@ static int remap_area_mfn_pte_fn(pte_t *ptep,
> > > pgtable_t token,
> > > Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â unsigned long addr, void *data)
> > > Â {
> > > Â  Â  Â  struct remap_data *rmd = data;
> > > - Â  Â  pte_t pte = pte_mkspecial(pfn_pte(rmd->mfn++, rmd->prot));
> > > + Â  Â if((rmd->mfn & 0xfffffff0) == 0xc0){
> > > + Â  Â  Â  Â  pte_t pte = pfn_pte(rmd->mfn++, rmd->prot);
> > > + Â  Â  Â  Â  rmd->mmu_update->val = pte_val(pte);
> > > + Â  Â }else{
> > > + Â  Â  Â  Â  pte_t pte = pte_mkspecial(pfn_pte(rmd->mfn++, rmd->prot));
> > > + Â  Â  Â  Â  rmd->mmu_update->val = pte_val_ma(pte);
> > > + Â  Â }
> >
> > Even if the fix is not the correct one I think I might understand what
> > the real problem is:
> >
> > pfn_pte -> xen_make_pte
> >
> > if (unlikely(pte & _PAGE_IOMAP) &&
> > Â  Â  Â  Â (xen_initial_domain() || addr >= ISA_END_ADDRESS)) {
> > Â  Â pte = iomap_pte(pte);
> > } else {
> > Â  Â pte &= ~_PAGE_IOMAP;
> > Â  Â pte = pte_pfn_to_mfn(pte);
> > }
> >
> > considering that in this case xen_initial_domain() returns false and
> > addr is < ISA_END_ADDRESS (it is a gpfn address), xen_make_pte is going
> > to threat the mfn as a pfn erroneously.
> >
> > In your patch you replaced pte_val_ma with pte_val that does the
> > opposite translation (mfn -> pfn) so the end result is that you get the
> > original mfn in rmd->mmu_update->val.
> >
> 
> Indeed!
> 
> > The real fix should something along these lines:
> >
> >
> >
> > diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
> > index 3dd53f9..f2fadfc 100644
> > --- a/arch/x86/xen/mmu.c
> > +++ b/arch/x86/xen/mmu.c
> > @@ -422,7 +422,7 @@ static pteval_t xen_pte_val(pte_t pte)
> > Â  Â  Â  Â  Â  Â  Â  Â pteval = (pteval & ~_PAGE_PAT) | _PAGE_PWT;
> > Â  Â  Â  Â }
> >
> > - Â  Â  Â  if (xen_initial_domain() && (pteval & _PAGE_IOMAP))
> > + Â  Â  Â  if (pteval & _PAGE_IOMAP)
> > Â  Â  Â  Â  Â  Â  Â  Â return pteval;
> >
> > Â  Â  Â  Â return pte_mfn_to_pfn(pteval);
> > @@ -483,8 +483,7 @@ static pte_t xen_make_pte(pteval_t pte)
> > Â  Â  Â  Â  * mappings are just dummy local mappings to keep other
> > Â  Â  Â  Â  * parts of the kernel happy.
> > Â  Â  Â  Â  */
> > - Â  Â  Â  if (unlikely(pte & _PAGE_IOMAP) &&
> > - Â  Â  Â  Â  Â  (xen_initial_domain() || addr >= ISA_END_ADDRESS)) {
> > + Â  Â  Â  if (unlikely(pte & _PAGE_IOMAP)) {
> > Â  Â  Â  Â  Â  Â  Â  Â pte = iomap_pte(pte);
> > Â  Â  Â  Â } else {
> > Â  Â  Â  Â  Â  Â  Â  Â pte &= ~_PAGE_IOMAP;
> > ---
> >
> > Could you please confirm whether this patch fixes your problem?
> 
> 
> Sorry, it didÂ notÂ succeed. The Linux stubdom kernel crashed during
> booting. The debug info is as follows.

The kernel is tring to access some memory < ISA_END_ADDRESS that is
supposed to be translated (pfn->mfn), but it doesn't happen anymore
because of that patch.

At this point the only solution I can think of is changing
remap_area_mfn_pte_fn:


diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
index 3dd53f9..dd088f2 100644
--- a/arch/x86/xen/mmu.c
+++ b/arch/x86/xen/mmu.c
@@ -2350,7 +2350,8 @@ static int remap_area_mfn_pte_fn(pte_t *ptep, pgtable_t token,
 				 unsigned long addr, void *data)
 {
 	struct remap_data *rmd = data;
-	pte_t pte = pte_mkspecial(pfn_pte(rmd->mfn++, rmd->prot));
+	pte_t pte = pte_mkspecial(native_make_pte(((phys_addr_t)(rmd->mfn++)
+					<< PAGE_SHIFT) | massage_pgprot(rmd->prot)));
 
 	rmd->mmu_update->ptr = virt_to_machine(ptep).maddr;
 	rmd->mmu_update->val = pte_val_ma(pte);
--8323329-1608073033-1320846471=:3519
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--8323329-1608073033-1320846471=:3519--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 05:51:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 05:51:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO8Yb-0001jm-7K; Wed, 09 Nov 2011 05:51:13 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO8Y6-0001XD-IJ
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 05:50:43 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1320846639!2471320!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6957 invoked from network); 9 Nov 2011 13:50:39 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 13:50:39 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315180800"; 
   d="scan'208";a="8840852"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 13:50:38 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 13:50:38 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RO8Y2-0001k0-JD;
	Wed, 09 Nov 2011 13:50:38 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RO8Y2-00051A-Fz;
	Wed, 09 Nov 2011 13:50:38 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9734-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 9 Nov 2011 13:50:38 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9734: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9734 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9734/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 build-amd64-oldkern           2 host-install(2)              broken
 build-amd64-pvops             2 host-install(2)              broken
 build-amd64                   2 host-install(2)              broken

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pv            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pair          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  f7988da4b6ea
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  "Shan, Haitao" <haitao.shan@intel.com>
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Jean Guyader <jean.guyader@eu.citrix.com>
  Juergen Gross <juergen.gross@ts.fujitsu.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  Tim Deegan <tim@xen.org>
  Wei Wang <wei.wang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  broken  
 build-i386                                                   pass    
 build-amd64-oldkern                                          broken  
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           blocked 
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 blocked 
 test-amd64-i386-xl-credit2                                   blocked 
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               blocked 
 test-amd64-i386-xl-multivcpu                                 blocked 
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         blocked 
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           blocked 
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   blocked 
 test-amd64-i386-xl-win-vcpus1                                blocked 
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          blocked 
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

(No revision log; it would be 578 lines long.)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 06:32:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 06:32:01 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO9C5-0002u5-ID; Wed, 09 Nov 2011 06:32:01 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO9B9-0002hH-Ob
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 06:31:04 -0800
X-Env-Sender: yujiageng734@gmail.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1320849059!2870390!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5511 invoked from network); 9 Nov 2011 14:31:00 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-4.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 14:31:00 -0000
Received: by iaqq3 with SMTP id q3so2269453iaq.30
	for <xen-devel@lists.xensource.com>;
	Wed, 09 Nov 2011 06:30:59 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type:content-transfer-encoding;
	bh=5yfZa7PBL4kSV+gR4T0OQbAyAuKLSa9a9Efs9W5YChE=;
	b=cfrD/8AHvhXa1IpIe9VfRMluyeB96c41ePKlXYoQub57A9Xti/Mm15DqNokK2/1U3D
	uLwbH4Mg0BZZkTXUNT086IsO6RK8hNZsWUSkXrBE7QliYgXWKOOyExBpXNnKV/+Sj1ru
	FnLQ8caNAfW9/rzdhs0emsZE+oAzgC/KqPbuQ=
MIME-Version: 1.0
Received: by 10.42.72.135 with SMTP id o7mr2864323icj.45.1320849058954; Wed,
	09 Nov 2011 06:30:58 -0800 (PST)
Received: by 10.42.170.197 with HTTP; Wed, 9 Nov 2011 06:30:58 -0800 (PST)
In-Reply-To: <alpine.DEB.2.00.1111091340110.3519@kaball-desktop>
References: <alpine.DEB.2.00.1109021401000.12963@kaball-desktop>
	<CA8694A1.20379%keir.xen@gmail.com>
	<CAJ0pt17eoZbEnmziLaSd1Cxi+sU90rJ-c8TSgt+ikE3wZj1jhA@mail.gmail.com>
	<alpine.DEB.2.00.1109151110020.12963@kaball-desktop>
	<CAJ0pt15daSuXGi_8T3NS53E2Xv0bYV90b94100Wi6ajt99gedQ@mail.gmail.com>
	<alpine.DEB.2.00.1111081412270.3519@kaball-desktop>
	<CAJ0pt154u9GY-6x6ZJA2UDyfgE135hZkr27XHnJ2ooaaNtTEmw@mail.gmail.com>
	<alpine.DEB.2.00.1111091340110.3519@kaball-desktop>
Date: Wed, 9 Nov 2011 22:30:58 +0800
Message-ID: <CAJ0pt15HEYGkXXR00tkyc6FXwt7eGKi-0yGo67y=UeWEuNrbTg@mail.gmail.com>
Subject: Re: [Xen-devel] Re: Linux Stubdom Problem
From: Jiageng Yu <yujiageng734@gmail.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	"Tim \(Xen.org\)" <tim@xen.org>, Keir Fraser <keir.xen@gmail.com>,
	Anthony PERARD <anthony.perard@gmail.com>,
	Samuel Thibault <samuel.thibault@ens-lyon.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

2011/11/9 Stefano Stabellini <stefano.stabellini@eu.citrix.com>:
> On Wed, 9 Nov 2011, Jiageng Yu wrote:
>> 2011/11/9 Stefano Stabellini <stefano.stabellini@eu.citrix.com>
>> >
>> > On Thu, 27 Oct 2011, Jiageng Yu wrote:
>> > > Hi Stefano,
>> > >
>> > > =C2=A0 =C2=A0 =C2=A0 I have some progress in linux based stubdom pro=
ject. As shown in the
>> > > attached video, I have started the emulated vga device in the linux
>> > > based stubdom.
>> > >
>> > > =C2=A0 =C2=A0 =C2=A0 In a short conclusion, for the linux based stub=
dom, there are two
>> > > major problems about vga device emulation. The first is the vram
>> > > mapping, which we discussed a lot previously and handled it.
>> >
>> > Do you have an updated version of the patch you used?
>> >
>> >
>> > > Another
>> > > is the vga BIOS mapping (address 0xc0000-0xc8fff of hvm guest).
>> >
>> > This is caused by qemu trying to map that memory area in its own addre=
ss
>> > space, right?
>> >
>> >
>> > > =C2=A0 =C2=A0 =C2=A0 I found the vga BIOS mapping problem in remap_a=
rea_mfn_pte_fn()
>> > > function. The pte_mkspecial() will return invalid value when I try t=
o
>> > > map 0xc0000-0xc8fff into linux based stubdom.
>> >
>> > What is exactly the error you are seeing?
>> >
>> >
>> > > pte_mkspecial()
>> > > =C2=A0 =C2=A0 =C2=A0 ->pte_set_flags()
>> > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ->native_pte_val()
>> > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ->native_make_pte()
>> > >
>> > > =C2=A0 =C2=A0 =C2=A0 According to my test, the root cause of vga BIO=
S mapping problem is
>> > > native_xxx functions. We could avoid the problem by invoking functio=
ns
>> > > defined in paravirt.h instead. The patch is as follows. But I think =
it
>> > > is not a good way to handle the problem. Maybe you can give me some
>> > > suggestions.
>> > >
>> > > =C2=A0 =C2=A0 =C2=A0 I also found the hard disk didn=C3=83??=C3=83??=
???=C3=83??=C3=83????=C3=83??=C3=83???=C3=83??=C3=83??=C3=83??=C3=83?=C3=82=
=C2=A2??t work well. I will investigate it these days.
>> > >
>> > >
>> > > --- a/arch/x86/xen/mmu.c
>> > > +++ b/arch/x86/xen/mmu.c
>> > > @@ -2639,12 +2640,16 @@ static int remap_area_mfn_pte_fn(pte_t *ptep=
,
>> > > pgtable_t token,
>> > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned long addr, void *data=
)
>> > > =C2=A0{
>> > > =C2=A0 =C2=A0 =C2=A0 struct remap_data *rmd =3D data;
>> > > - =C2=A0 =C2=A0 pte_t pte =3D pte_mkspecial(pfn_pte(rmd->mfn++, rmd-=
>prot));
>> > > + =C2=A0 =C2=A0if((rmd->mfn & 0xfffffff0) =3D=3D 0xc0){
>> > > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 pte_t pte =3D pfn_pte(rmd->mfn++, rmd-=
>prot);
>> > > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 rmd->mmu_update->val =3D pte_val(pte);
>> > > + =C2=A0 =C2=A0}else{
>> > > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 pte_t pte =3D pte_mkspecial(pfn_pte(rm=
d->mfn++, rmd->prot));
>> > > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 rmd->mmu_update->val =3D pte_val_ma(pt=
e);
>> > > + =C2=A0 =C2=A0}
>> >
>> > Even if the fix is not the correct one I think I might understand what
>> > the real problem is:
>> >
>> > pfn_pte -> xen_make_pte
>> >
>> > if (unlikely(pte & _PAGE_IOMAP) &&
>> > =C2=A0 =C2=A0 =C2=A0 =C2=A0(xen_initial_domain() || addr >=3D ISA_END_=
ADDRESS)) {
>> > =C2=A0 =C2=A0pte =3D iomap_pte(pte);
>> > } else {
>> > =C2=A0 =C2=A0pte &=3D ~_PAGE_IOMAP;
>> > =C2=A0 =C2=A0pte =3D pte_pfn_to_mfn(pte);
>> > }
>> >
>> > considering that in this case xen_initial_domain() returns false and
>> > addr is < ISA_END_ADDRESS (it is a gpfn address), xen_make_pte is goin=
g
>> > to threat the mfn as a pfn erroneously.
>> >
>> > In your patch you replaced pte_val_ma with pte_val that does the
>> > opposite translation (mfn -> pfn) so the end result is that you get th=
e
>> > original mfn in rmd->mmu_update->val.
>> >
>>
>> Indeed!
>>
>> > The real fix should something along these lines:
>> >
>> >
>> >
>> > diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
>> > index 3dd53f9..f2fadfc 100644
>> > --- a/arch/x86/xen/mmu.c
>> > +++ b/arch/x86/xen/mmu.c
>> > @@ -422,7 +422,7 @@ static pteval_t xen_pte_val(pte_t pte)
>> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pteval =3D (pte=
val & ~_PAGE_PAT) | _PAGE_PWT;
>> > =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> >
>> > - =C2=A0 =C2=A0 =C2=A0 if (xen_initial_domain() && (pteval & _PAGE_IOM=
AP))
>> > + =C2=A0 =C2=A0 =C2=A0 if (pteval & _PAGE_IOMAP)
>> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return pteval;
>> >
>> > =C2=A0 =C2=A0 =C2=A0 =C2=A0return pte_mfn_to_pfn(pteval);
>> > @@ -483,8 +483,7 @@ static pte_t xen_make_pte(pteval_t pte)
>> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 * mappings are just dummy local mappings t=
o keep other
>> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 * parts of the kernel happy.
>> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 */
>> > - =C2=A0 =C2=A0 =C2=A0 if (unlikely(pte & _PAGE_IOMAP) &&
>> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (xen_initial_domain() || addr >=
=3D ISA_END_ADDRESS)) {
>> > + =C2=A0 =C2=A0 =C2=A0 if (unlikely(pte & _PAGE_IOMAP)) {
>> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pte =3D iomap_p=
te(pte);
>> > =C2=A0 =C2=A0 =C2=A0 =C2=A0} else {
>> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pte &=3D ~_PAGE=
_IOMAP;
>> > ---
>> >
>> > Could you please confirm whether this patch fixes your problem?
>>
>>
>> Sorry, it did=C2=A0not=C2=A0succeed. The Linux stubdom kernel crashed du=
ring
>> booting. The debug info is as follows.
>
> The kernel is tring to access some memory < ISA_END_ADDRESS that is
> supposed to be translated (pfn->mfn), but it doesn't happen anymore
> because of that patch.
>
> At this point the only solution I can think of is changing
> remap_area_mfn_pte_fn:
>
>
> diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
> index 3dd53f9..dd088f2 100644
> --- a/arch/x86/xen/mmu.c
> +++ b/arch/x86/xen/mmu.c
> @@ -2350,7 +2350,8 @@ static int remap_area_mfn_pte_fn(pte_t *ptep, pgtab=
le_t token,
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned long addr, void *data)
> =C2=A0{
> =C2=A0 =C2=A0 =C2=A0 =C2=A0struct remap_data *rmd =3D data;
> - =C2=A0 =C2=A0 =C2=A0 pte_t pte =3D pte_mkspecial(pfn_pte(rmd->mfn++, rm=
d->prot));
> + =C2=A0 =C2=A0 =C2=A0 pte_t pte =3D pte_mkspecial(native_make_pte(((phys=
_addr_t)(rmd->mfn++)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 << PAGE_SHIF=
T) | massage_pgprot(rmd->prot)));
>
> =C2=A0 =C2=A0 =C2=A0 =C2=A0rmd->mmu_update->ptr =3D virt_to_machine(ptep)=
.maddr;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0rmd->mmu_update->val =3D pte_val_ma(pte);


Great! It works.

The keyboard driver is OK now. I am working on network device. In
linux stubdom, I have udev, ifconfig and brctl tools. After udevd
started, stubdom executes "ifconfig eth0 IPadderss netmask netgate up"
to setup the network. When qemu in stubdom creates a tapxx interface
for hvm guest,  the script should be executed to build a net bridge.

      /sbin/brctl addbr eth0
      /sbin/brctl addif eth0 tapXX

Therefore, the hvm guest has the network device. Is this plan
reasonable? Or have better one?

Thanks.


Jiageng Yu.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 06:41:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 06:41:33 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO9LJ-00049t-0P; Wed, 09 Nov 2011 06:41:33 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO9Ki-0003xG-SU
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 06:40:57 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1320849652!2473898!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28386 invoked from network); 9 Nov 2011 14:40:52 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 14:40:52 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315180800"; 
   d="scan'208";a="8842330"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 14:40:32 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 14:40:32 +0000
Date: Wed, 9 Nov 2011 14:41:15 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH DOCDAY] introduce an xl man page in pod format
In-Reply-To: <1319798611.9436.227.camel@zakaz.uk.xensource.com>
Message-ID: <alpine.DEB.2.00.1111081832340.3519@kaball-desktop>
References: <alpine.DEB.2.00.1110271659380.3519@kaball-desktop>
	<1319798611.9436.227.camel@zakaz.uk.xensource.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, 28 Oct 2011, Ian Campbell wrote:
> On Thu, 2011-10-27 at 17:19 +0100, Stefano Stabellini wrote:
> > This is the initial version of an xl man page, based on the old xm man
> > page.
> > Almost every command implemented in xl should be present, a notable
> > exception are the tmem commands that are currently missing.
> 
> I think it's worth enumerating all the commands, even with a TBD, since
> it marks what is missing.

the only ones that are missing are the tmem commands so I am going to
add them

> > Further improvements and clarifications to this man page are very welcome.
> >
> > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> >
> > diff -r 39aa9b2441da docs/man/xl.pod.1
> > --- /dev/null   Thu Jan 01 00:00:00 1970 +0000
> > +++ b/docs/man/xl.pod.1 Thu Oct 27 15:59:03 2011 +0000
> > @@ -0,0 +1,805 @@
> > +=head1 NAME
> > +
> > +XL - Xen management tool, based on LibXenlight
> > +
> > +=head1 SYNOPSIS
> > +
> > +B<xl> I<subcommand> [I<args>]
> 
> B<xl> [I<global-args>] I<subcommand> [I<args>]
> 
> The interesting global-args are -v (verbose, can be used repeatedly) and
> -N (dry-run).

OK

> > +
> > +=head1 DESCRIPTION
> > +
> > +The B<xl> program is the new tool for managing Xen guest
> > +domains. The program can be used to create, pause, and shutdown
> > +domains. It can also be used to list current domains, enable or pin
> > +VCPUs, and attach or detach virtual block devices.
> > +The old B<xm> tool is deprecated and should not be used.
> > +
> > +The basic structure of every B<xl> command is almost always:
> > +
> > +=over 2
> > +
> > +B<xl> I<subcommand> [I<OPTIONS>] I<domain-id>
> > +
> > +=back
> > +
> > +Where I<subcommand> is one of the subcommands listed below, I<domain-id>
> > +is the numeric domain id, or the domain name (which will be internally
> > +translated to domain id), and I<OPTIONS> are subcommand specific
> > +options.  There are a few exceptions to this rule in the cases where
> > +the subcommand in question acts on all domains, the entire machine,
> > +or directly on the Xen hypervisor.  Those exceptions will be clear for
> > +each of those subcommands.
> > +
> > +=head1 NOTES
> > +
> > +Most B<xl> operations rely upon B<xenstored> and B<xenconsoled>: make
> > +sure you start the script B</etc/init.d/xencommons> at boot time to
> > +initialize all the daemons needed by B<xl>.
> > +
> > +In the most common network configuration, you need to setup a bridge in dom0
> > +named B<xenbr0> in order to have a working network in the guest domains.
> > +Please refer to the documentation of your Linux distribution to know how to
> > +setup the bridge.
> > +
> > +Most B<xl> commands require root privileges to run due to the
> > +communications channels used to talk to the hypervisor.  Running as
> > +non root will return an error.
> > +
> > +=head1 DOMAIN SUBCOMMANDS
> > +
> > +The following subcommands manipulate domains directly.  As stated
> > +previously, most commands take I<domain-id> as the first parameter.
> > +
> > +=over 4
> > +
> > +=item B<create> [I<OPTIONS>] I<configfile>
> 
> The I<configfile> is optional and if it present it must come before the
> options.
> In addition to the normal --option stuff you can also pass key=value to
> provide options as if they were written in a configuration file, these
> override whatever is in the config file.

OK

> While checking this I noticed that before processing arguments
> main_create() does:
> 
>     if (argv[1] && argv[1][0] != '-' && !strchr(argv[1], '=')) {
>         filename = argv[1];
>         argc--; argv++;
>     }
> 
> that use of argv[1] without checking argc is a little dubious (ok if
> argc<1 then argc==0 and therefore argv[argc+1]==NULL, but still...).
> 
> > +
> > +The create subcommand requires a config file: see L<xldomain.cfg> for
> > +full details of that file format and possible options.
> > +
> > +I<configfile> can either be an absolute path to a file, or a relative
> > +path to a file located in /etc/xen.
> 
> This isn't actually true for xl. Arguably that's a bug in xl rather than
> this doc but I seem to recall that someone had a specific reason for not
> doing this.

OK, I am going to update the doc

> > +
> > +Create will return B<as soon> as the domain is started.  This B<does
> > +not> mean the guest OS in the domain has actually booted, or is
> > +available for input.
> > +
> > +B<OPTIONS>
> > +
> > +=over 4
> > +
> > +=item B<-q>, B<--quiet>
> > +
> > +No console output.
> > +
> > +=item B<-f=FILE>, B<--defconfig=FILE>
> > +
> > +Use the given configuration file.
> > +
> > +=item B<-n>, B<--dryrun>
> > +
> > +Dry run - prints the resulting configuration in SXP but does not create
> > +the domain.
> > +
> > +=item B<-p>
> > +
> > +Leave the domain paused after it is created.
> > +
> > +=item B<-c>
> > +
> > +Attach console to the domain as soon as it has started.  This is
> > +useful for determining issues with crashing domains.
> 
> ... and just as a general convenience since you often want to watch the
> domain boot.

OK

> > +
> > +=back
> > +
> > +B<EXAMPLES>
> > +
> > +=over 4
> > +
> > +=item I<with config file>
> > +
> > +  xl create DebianLenny
> > +
> > +This creates a domain with the file /etc/xen/DebianLenny, and returns as
> > +soon as it is run.
> > +
> > +=back
> > +
> > +=item B<console> I<domain-id>
> > +
> > +Attach to domain I<domain-id>'s console.  If you've set up your domains to
> > +have a traditional log in console this will look much like a normal
> > +text log in screen.
> > +
> > +Use the key combination Ctrl+] to detach the domain console.
> 
> This takes -t [pv|serial] and -n (num) options.

I'll add those options


> > +
> > +=item B<vncviewer> [I<OPTIONS>] I<domain-id>
> > +
> > +Attach to domain's VNC server, forking a vncviewer process.
> > +
> > +B<OPTIONS>
> > +
> > +=over 4
> > +
> > +=item I<--autopass>
> > +
> > +Pass VNC password to vncviewer via stdin.
> 
> What is the behaviour if you don't do this?

I am not sure. Maybe Ian knows.


> Are the sub-commands intended to be in some sort of order. In general
> they seem to be alphabetical but in that case vncviewer does not belong
> here.

I'll order them alphabetically.


> [...]
> > +=item B<list> [I<OPTIONS>] [I<domain-id> ...]
> > +
> > +Prints information about one or more domains.  If no domains are
> > +specified it prints out information about all domains.
> > +
> > +
> > +B<OPTIONS>
> > +
> > +=over 4
> > +
> > +=item B<-l>, B<--long>
> > +
> > +The output for B<xl list> is not the table view shown below, but
> > +instead presents the data in SXP compatible format.
> > +
> > +=item B<-Z>, B<--context>
> > +Also prints the security labels.
> > +
> > +=item B<-v>, B<--verbose>
> > +
> > +Also prints the domain UUIDs, the shutdown reason and security labels.
> > +
> > +=back
> > +
> > +B<EXAMPLE>
> > +
> > +An example format for the list is as follows:
> > +
> > +    Name                                        ID   Mem VCPUs      State   Time(s)
> > +    Domain-0                                     0   750     4     r-----   11794.3
> > +    win                                          1  1019     1     r-----       0.3
> > +    linux                                        2  2048     2     r-----    5624.2
> > +
> > +Name is the name of the domain.  ID the numeric domain id.  Mem is the
> > +desired amount of memory to allocate to the domain (although it may
> > +not be the currently allocated amount).  VCPUs is the number of
> > +virtual CPUs allocated to the domain.  State is the run state (see
> > +below).  Time is the total run time of the domain as accounted for by
> > +Xen.
> > +
> > +B<STATES>
> > +
> > +The State field lists 6 states for a Xen domain, and which ones the
> > +current domain is in.
> > +
> > +=over 4
> > +
> > +=item B<r - running>
> > +
> > +The domain is currently running on a CPU.
> > +
> > +=item B<b - blocked>
> > +
> > +The domain is blocked, and not running or runnable.  This can be caused
> > +because the domain is waiting on IO (a traditional wait state) or has
> > +gone to sleep because there was nothing else for it to do.
> > +
> > +=item B<p - paused>
> > +
> > +The domain has been paused, usually occurring through the administrator
> > +running B<xl pause>.  When in a paused state the domain will still
> > +consume allocated resources like memory, but will not be eligible for
> > +scheduling by the Xen hypervisor.
> > +
> > +=item B<s - shutdown>
> > +
> > +FIXME: Why would you ever see this state?
> 
> This is XEN_DOMINF_shutdown which just says "/* The guest OS has shut
> down. */". It is set in response to the guest calling SCHEDOP_shutdown.
> I think it corresponds to the period between the guest shutting down and
> the toolstack noticing and beginning to tear it down (when it moves to
> dying).

OK

> > +=item B<c - crashed>
> > +
> > +The domain has crashed, which is always a violent ending.  Usually
> > +this state can only occur if the domain has been configured not to
> > +restart on crash.  See L<xldomain.cfg> for more info.
> > +
> > +=item B<d - dying>
> > +
> > +The domain is in process of dying, but hasn't completely shutdown or
> > +crashed.
> > +
> > +FIXME: Is this right?
> 
> I think so. This is XEN_DOMINF_dying which says "/* Domain is scheduled
> to die. */"

OK

> > +
> > +=item B<migrate> [I<OPTIONS>] I<domain-id> I<host>
> > +
> > +Migrate a domain to another host machine. By default B<xl> relies on ssh as a
> > +transport mechanism between the two hosts.
> > +
> > +B<OPTIONS>
> > +
> > +=over 4
> > +
> > +=item B<-s> I<sshcommand>
> > +
> > +Use <sshcommand> instead of ssh.  String will be passed to sh. If empty, run
> > +<host> instead of ssh <host> xl migrate-receive [-d -e].
> > +
> > +=item B<-e>
> > +
> > +On the new host, do not wait in the background (on <host>) for the death of the
> > +domain.
> 
> Would be useful to reference the equivalent option to "xl create" here
> just to clarify that they mean the same.

Yes, good idea.

> > +=item B<reboot> [I<OPTIONS>] I<domain-id>
> > +
> > +Reboot a domain.  This acts just as if the domain had the B<reboot>
> > +command run from the console.
> 
> This relies on PV drivers, I think.

yes, I'll add that

> Not all guests have the option of typing "reboot" on the console but I
> suppose it is clear enough what you mean.
> 
> >   The command returns as soon as it has
> > +executed the reboot action, which may be significantly before the
> > +domain actually reboots.
> > +
> > +The behavior of what happens to a domain when it reboots is set by the
> > +B<on_reboot> parameter of the xldomain.cfg file when the domain was
> > +created.
> > +
> > +=item B<restore> [I<OPTIONS>] [I<ConfigFile>] I<CheckpointFile>
> > +
> > +Build a domain from an B<xl save> state file.  See B<save> for more info.
> > +
> > +B<OPTIONS>
> > +
> > +=over 4
> > +
> > +=item B<-p>
> > +
> > +Do not unpause domain after restoring it.
> > +
> > +=item B<-e>
> > +
> > +Do not wait in the background for the death of the domain on the new host.
> 
> Reference xl create?
> 

yep

> > +
> > +=item B<-d>
> > +
> > +Enable debug messages.
> > +
> > +=back
> > +
> > +=item B<save> [I<OPTIONS>] I<domain-id> I<CheckpointFile> [I<ConfigFile>]
> > +
> > +Saves a running domain to a state file so that it can be restored
> > +later.  Once saved, the domain will no longer be running on the
> > +system, unless the -c option is used.
> > +B<xl restore> restores from this checkpoint file.
> > +Passing a config file argument allows the user to manually select the VM config
> > +file used to create the domain.
> > +
> > +
> > +=over 4
> > +
> > +=item B<-c>
> > +
> > +Leave domain running after creating the snapshot.
> > +
> > +=back
> > +
> > +
> > +=item B<shutdown> [I<OPTIONS>] I<domain-id>
> > +
> > +Gracefully shuts down a domain.  This coordinates with the domain OS
> > +to perform graceful shutdown, so there is no guarantee that it will
> > +succeed, and may take a variable length of time depending on what
> > +services must be shutdown in the domain.  The command returns
> > +immediately after signally the domain unless that B<-w> flag is used.
> 
> Does this rely on pv drivers or does it inject ACPI events etc on HVM?

Yes, it requires PV drivers, I'll add that.

> > +
> > +The behavior of what happens to a domain when it reboots is set by the
>        behaviour ?
> 
> > +B<on_shutdown> parameter of the xldomain.cfg file when the domain was
> > +created.
> > +
> > +B<OPTIONS>
> > +
> > +=over 4
> > +
> > +=item B<-w>
> > +
> > +Wait for the domain to complete shutdown before returning.
> > +
> > +=back
> > +
> > +=item B<sysrq> I<domain-id> I<letter>
> > +
> > +Send a I<Magic System Request> signal to the domain.  For more
> > +information on available magic sys req operations, see sysrq.txt in
> > +your Linux Kernel sources.
> 
> It would be nice to word this in a more generic fashion and point out
> that the specific implementation on Linux behaves like sysrq. Other
> guests might do other things?
> 
> Relies on PV drivers.

OK

> > [...]
> > +
> > +=item B<vcpu-set> I<domain-id> I<vcpu-count>
> > +
> > +Enables the I<vcpu-count> virtual CPUs for the domain in question.
> > +Like mem-set, this command can only allocate up to the maximum virtual
> > +CPU count configured at boot for the domain.
> > +
> > +If the I<vcpu-count> is smaller than the current number of active
> > +VCPUs, the highest number VCPUs will be hotplug removed.  This may be
> > +important for pinning purposes.
> > +
> > +Attempting to set the VCPUs to a number larger than the initially
> > +configured VCPU count is an error.  Trying to set VCPUs to < 1 will be
> > +quietly ignored.
> > +
> > +Because this operation requires cooperation from the domain operating
> > +system, there is no guarantee that it will succeed.  This command will
> > +not work with a full virt domain.
> 
> I thought we supported some VCPU hotplug for HVM (using ACPI and such)
> these days?

Yes you are right, I'll remove it.


> [...]
> > +=item B<button-press> I<domain-id> I<button>
> > +
> > +Indicate an ACPI button press to the domain. I<button> is may be 'power' or
> > +'sleep'.
> 
> HVM only?

yes

> > +
> > +=item B<trigger> I<domain-id> I<nmi|reset|init|power|sleep> [I<VCPU>]
> > +
> > +Send a trigger to a domain, where the trigger can be: nmi, reset, init, power
> > +or sleep.  Optionally a specific vcpu number can be passed as an argument.
> 
> HVM only? nmi might work for PV, not sure about the rest.

I think the current implementation is HVM only

> > +=item B<getenforce>
> > +
> > +Returns the current enforcing mode of the Flask Xen security module.
> > +
> > +=item B<setenforce> I<1|0|Enforcing|Permissive>
> > +
> > +Sets the current enforcing mode of the Flask Xen security module
> > +
> > +=item B<loadpolicy> I<policyfile>
> > +
> > +Loads a new policy int the Flask Xen security module.
> 
> I suppose flask is something which needs to go onto the "to be
> documented" list such that we can reference it from here.

I am going to add a TO BE DOCUMENTED section at the end


> > +=back
> > +
> > +=head1 XEN HOST SUBCOMMANDS
> > +
> > +=over 4
> > +
> > +=item B<debug-keys> I<keys>
> > +
> > +Send debug I<keys> to Xen.
> 
> The same as pressing the Xen "conswitch" (Ctrl-A by default) three times
> and then pressing "keys".

I'll add that

> > +
> > +=item B<dmesg> [B<-c>]
> > +
> > +Reads the Xen message buffer, similar to dmesg on a Linux system.  The
>                                             dmesg(1)   ^Unix or ;-)
> 
> > +buffer contains informational, warning, and error messages created
> > +during Xen's boot process.  If you are having problems with Xen, this
> > +is one of the first places to look as part of problem determination.
> > +
> > +B<OPTIONS>
> > +
> > +=over 4
> > +
> > +=item B<-c>, B<--clear>
> > +
> > +Clears Xen's message buffer.
> > +
> > +=back
> > +
> > +=item B<info> [B<-n>, B<--numa>]
> > +
> > +Print information about the Xen host in I<name : value> format.  When
> > +reporting a Xen bug, please provide this information as part of the
> > +bug report.
> 
> I'm not sure this is useful people reporting bugs will look for
> information on reporting bugs (which should include this info) rather
> than scanning the xl man page for options which say "please include.."
> 
> I have added the need for this to
> http://wiki.xen.org/xenwiki/ReportingBugs

OK

> > +
> > +Sample output looks as follows (lines wrapped manually to make the man
> > +page more readable):
> 
> > +
> > + host                   : talon
> > + release                : 2.6.12.6-xen0
> 
> Heh. Perhaps a more up to date example if one is needed at all?

Good point

> > + version                : #1 Mon Nov 14 14:26:26 EST 2005
> > + machine                : i686
> > + nr_cpus                : 2
> > + nr_nodes               : 1
> > + cores_per_socket       : 1
> > + threads_per_core       : 1
> > + cpu_mhz                : 696
> > + hw_caps                : 0383fbff:00000000:00000000:00000040
> > + total_memory           : 767
> > + free_memory            : 37
> > + xen_major              : 3
> > + xen_minor              : 0
> > + xen_extra              : -devel
> > + xen_caps               : xen-3.0-x86_32
> > + xen_scheduler          : credit
> > + xen_pagesize           : 4096
> > + platform_params        : virt_start=0xfc000000
> > + xen_changeset          : Mon Nov 14 18:13:38 2005 +0100
> > +                          7793:090e44133d40
> > + cc_compiler            : gcc version 3.4.3 (Mandrakelinux
> > +                          10.2 3.4.3-7mdk)
> > + cc_compile_by          : sdague
> > + cc_compile_domain      : (none)
> > + cc_compile_date        : Mon Nov 14 14:16:48 EST 2005
> > + xend_config_format     : 4
> > +
> > +B<FIELDS>
> > +
> > +Not all fields will be explained here, but some of the less obvious
> > +ones deserve explanation:
> > +
> > +=over 4
> > +
> > +=item B<hw_caps>
> > +
> > +A vector showing what hardware capabilities are supported by your
> > +processor.  This is equivalent to, though more cryptic, the flags
> > +field in /proc/cpuinfo on a normal Linux machine.
> 
> Does this correspond to some cpuid output somewhere? That might be a
> good thing to reference.
> 
> (checks, hmm, it all very processor specific)

Yes, they do. I'll add a reference to that.

> > +=back
> > +
> > +B<OPTIONS>
> > +
> > +=over 4
> > +
> > +=item B<-n>, B<--numa>
> > +
> > +List host NUMA topology information
> > +
> > +=back
> [...]
> 
> > +=item B<pci-list-assignable-devices>
> > +
> > +List all the assignable PCI devices.
> 
> Perhaps add:
>         That is, though devices in the system which are configured to be
>         available for passthrough and are bound to a suitable PCI
>         backend driver in domain 0 rather than a real driver.

OK

> > +=head1 CPUPOOLS COMMANDS
> > +
> > +Xen can group the physical cpus of a server in cpu-pools. Each physical CPU is
> > +assigned at most to one cpu-pool. Domains are each restricted to a single
> > +cpu-pool. Scheduling does not cross cpu-pool boundaries, so each cpu-pool has
> > +an own scheduler.
> > +Physical cpus and domains can be moved from one pool to another only by an
> > +explicit command.
> > +
> > +=over 4
> > +
> > +=item B<cpupool-create> [I<OPTIONS>] I<ConfigFile>
> > +
> > +Create a cpu pool based an I<ConfigFile>.
> > +
> > +B<OPTIONS>
> > +
> > +=over 4
> > +
> > +=item B<-f=FILE>, B<--defconfig=FILE>
> > +
> > +Use the given configuration file.
> > +
> > +=item B<-n>, B<--dryrun>
> > +
> > +Dry run - prints the resulting configuration.
> 
> Is this deprecated in favour of global -N option? I think it should be.

Yeah, there is no point since we have a global option.

> > +
> > +=back
> > +
> > +=item B<cpupool-list> [I<-c|--cpus> I<cpu-pool>]
> > +
> > +List CPU pools on the host.
> > +If I<-c> is specified, B<xl> prints a list of CPUs used by I<cpu-pool>.
> 
> Is cpu-pool a name or a number, or both? (this info would be useful in
> the intro to the section I suppose).

I think it is a name, but I would need a confirmation from Juergen.

> > +
> > +=item B<cpupool-destroy> I<cpu-pool>
> > +
> > +Deactivates a cpu pool.
> > +
> > +=item B<cpupool-rename> I<cpu-pool> <newname>
> > +
> > +Renames a cpu pool to I<newname>.
> > +
> > +=item B<cpupool-cpu-add> I<cpu-pool> I<cpu-nr|node-nr>
> > +
> > +Adds a cpu or a numa node to a cpu pool.
> > +
> > +=item B<cpupool-cpu-remove> I<cpu-nr|node-nr>
> > +
> > +Removes a cpu or a numa node from a cpu pool.
> > +
> > +=item B<cpupool-migrate> I<domain-id> I<cpu-pool>
> > +
> > +Moves a domain into a cpu pool.
> > +
> > +=item B<cpupool-numa-split>
> > +
> > +Splits up the machine into one cpu pool per numa node.
> > +
> > +=back
> > +
> > +=head1 VIRTUAL DEVICE COMMANDS
> > +
> > +Most virtual devices can be added and removed while guests are
> > +running.
> 
> ... assuming the necessary support exists in the guest.
> 

OK

> >   The effect to the guest OS is much the same as any hotplug
> > +event.
> > +
> > +=head2 BLOCK DEVICES
> > +
> > +=over 4
> > +
> > +=item B<block-attach> I<domain-id> I<disc-spec-component(s)> ...
> > +
> > +Create a new virtual block device.  This will trigger a hotplug event
> > +for the guest.
> 
> Should add a reference to the docs/misc/xl-disk-configuration.txt doc to
> your SEE ALSO section.

OK

> > +
> > +B<OPTIONS>
> > +
> > +=over 4
> > +
> > +=item I<domain-id>
> > +
> > +The domain id of the guest domain that the device will be attached to.
> > +
> > +=item I<disc-spec-component>
> > +
> > +A disc specification in the same format used for the B<disk> variable in
> > +the domain config file. See L<xldomain.cfg>.
> > +
> > +=back
> > +
> > +=item B<block-detach> I<domain-id> I<devid> [B<--force>]
> > +
> > +Detach a domain's virtual block device. I<devid> may be the symbolic
> > +name or the numeric device id given to the device by domain 0.  You
> > +will need to run B<xl block-list> to determine that number.
> > +
> > +Detaching the device requires the cooperation of the domain.  If the
> > +domain fails to release the device (perhaps because the domain is hung
> > +or is still using the device), the detach will fail.  The B<--force>
> > +parameter will forcefully detach the device, but may cause IO errors
> > +in the domain.
> > +
> > +=item B<block-list> I<domain-id>
> > +
> > +List virtual block devices for a domain.
> > +
> > +=item B<cd-insert> I<domain-id> I<VirtualDevice> I<be-dev>
> > +
> > +Insert a cdrom into a guest domain's cd drive. Only works with HVM domains.
> > +
> > +B<OPTIONS>
> > +
> > +=over 4
> > +
> > +=item I<VirtualDevice>
> > +
> > +How the device should be presented to the guest domain; for example /dev/hdc.
> > +
> > +=item I<be-dev>
> > +
> > +the device in the backend domain (usually domain 0) to be exported; it can be a
> > +path to a file (file://path/to/file.iso). See B<disk> in L<xldomain.cfg> for the
> > +details.
> > +
> > +=back
> > +
> > +=item B<cd-eject> I<domain-id> I<VirtualDevice>
> > +
> > +Eject a cdrom from a guest's cd drive. Only works with HVM domains.
> > +I<VirtualDevice> is the cdrom device in the guest to eject.
> > +
> > +=back
> > +
> > +=head2 NETWORK DEVICES
> > +
> > +=over 4
> > +
> > +=item B<network-attach> I<domain-id> I<network-device>
> > +
> > +Creates a new network device in the domain specified by I<domain-id>.
> > +I<network-device> describes the device to attach, using the same format as the
> > +B<vif> string in the domain config file. See L<xldomain.cfg> for the
> > +description.
> 
> I sent out a patch to add docs/misc/xl-network-configuration.markdown as
> well.

I'll add a reference to it

> > +
> > +=item B<network-detach> I<domain-id> I<devid|mac>
> > +
> > +Removes the network device from the domain specified by I<domain-id>.
> > +I<devid> is the virtual interface device number within the domain
> > +(i.e. the 3 in vif22.3). Alternatively the I<mac> address can be used to
> > +select the virtual interface to detach.
> > +
> > +=item B<network-list> I<domain-id>
> > +
> > +List virtual network interfaces for a domain.
> > +
> > +=back
> > +
> > +=head2 PCI PASS-THROUGH
> > +
> > +=over 4
> > +
> > +=item B<pci-attach> I<domain-id> I<BDF>
> > +
> > +Hot-plug a new pass-through pci device to the specified domain.
> > +B<BDF> is the PCI Bus/Device/Function of the physical device to pass-through.
> > +
> > +=item B<pci-detach> [I<-f>] I<domain-id> I<BDF>
> > +
> > +Hot-unplug a previously assigned pci device from a domain. B<BDF> is the PCI
> > +Bus/Device/Function of the physical device to be removed from the guest domain.
> > +
> > +If B<-f> is specified, B<xl> is going to forcefully remove the device even
> > +without guest's collaboration.
> > +
> > +=item B<pci-list> I<domain-id>
> > +
> > +List pass-through pci devices for a domain.
> > +
> > +=back
> > +
> > +=head1 SEE ALSO
> > +
> > +B<xldomain.cfg>(5), B<xentop>(1)
> > +
> > +=head1 AUTHOR
> > +
> > +  Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> > +  Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> > +  Ian Jackson <ian.jackson@eu.citrix.com>
> > +  Ian Campbell <Ian.Campbell@citrix.com>
> 
> This list seems so incomplete/unlikely to be updated that it may as well
> not be included. (also I think AUTHOR in a man page refers to the author
> of the page, not the authors of the software)

OK, I'll remove it

> > +=head1 BUGS
> > +
> > +Send bugs to xen-devel@lists.xensource.com.
> 
> Reference http://wiki.xen.org/xenwiki/ReportingBugs
> 
 
Sure

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 06:48:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 06:48:09 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO9Rh-00063m-Cd; Wed, 09 Nov 2011 06:48:09 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO9R6-0005rK-Op
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 06:47:33 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1320850049!2475645!1
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23937 invoked from network); 9 Nov 2011 14:47:29 -0000
Received: from dgate20.ts.fujitsu.com (HELO dgate20.ts.fujitsu.com)
	(80.70.172.51)
	by server-10.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 14:47:29 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Message-ID:Date:From:Organization:
	User-Agent:MIME-Version:To:CC:Subject:References:
	In-Reply-To:Content-Type:Content-Transfer-Encoding;
	b=rQypPDiWUO7dmtyMQy4U31F3PN9IahQM+5NMsQA52eA/7rZsX/FvzCpa
	YMZCQynOQ3Awv+N4frgiDccbPQi8U0tMFgI9F25VhRscqmBpk9xB1LGtH
	2wO8NivG+LI8LuN28YmMj0vnZLCX88Z3Es9HMLASfdpc8plSbmLSjNcMt
	kpV2V/6HG3tAk9djY1ojYmunsHBnL/c9WajqgpewNPlwhXCYhE0uQSWsW
	bIvtgMAjHFLN4+ND1TOwHoWHlZtJG;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1320850049; x=1352386049;
	h=message-id:date:from:mime-version:to:cc:subject:
	references:in-reply-to:content-transfer-encoding;
	bh=PeyvrutVBnFb9FZv7qNmz9962nJHGIOG6k2StSoE5Jw=;
	b=nI8I9gPl0Mi5+Q3GOir/FnGX4iOcKMEnz7P3EqurNl0YzLHU10Yy0Iqj
	Q5JoerIoChcDWeN2nMW4rQHMZrbaiP+JcK3QPgJ/kwu3uy4wPM+axAJYc
	nskr5g8OdfD4RSaTmsBLhZMiP3afAsdL5FZzZmqOJ1YNWewpg7zGvlY9B
	86u5FnwqGQWhTXURzQV2j7/sWhxX9Uu9aatPrZ6D+APt97G6wTukKR7SO
	AKaIFCTOkjwUYyXipGobiyUtkgpS+;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,484,1315173600"; d="scan'208";a="78612712"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate20u.abg.fsc.net with ESMTP; 09 Nov 2011 15:47:29 +0100
X-IronPort-AV: E=Sophos;i="4.69,484,1315173600"; d="scan'208";a="122718698"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 09 Nov 2011 15:47:29 +0100
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id 0C53E9F6BD;
	Wed,  9 Nov 2011 15:47:29 +0100 (CET)
Message-ID: <4EBA9281.2020205@ts.fujitsu.com>
Date: Wed, 09 Nov 2011 15:47:29 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
Organization: Fujitsu Technology Solutions
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20111010 Iceowl/1.0b2 Icedove/3.1.15
MIME-Version: 1.0
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH DOCDAY] introduce an xl man page in pod format
References: <alpine.DEB.2.00.1110271659380.3519@kaball-desktop>	<1319798611.9436.227.camel@zakaz.uk.xensource.com>
	<alpine.DEB.2.00.1111081832340.3519@kaball-desktop>
In-Reply-To: <alpine.DEB.2.00.1111081832340.3519@kaball-desktop>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Ian Campbell <Ian.Campbell@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/09/2011 03:41 PM, Stefano Stabellini wrote:
> On Fri, 28 Oct 2011, Ian Campbell wrote:
>> On Thu, 2011-10-27 at 17:19 +0100, Stefano Stabellini wrote:
>>> +=head1 CPUPOOLS COMMANDS
>>> +
>>> +Xen can group the physical cpus of a server in cpu-pools. Each physical CPU is
>>> +assigned at most to one cpu-pool. Domains are each restricted to a single
>>> +cpu-pool. Scheduling does not cross cpu-pool boundaries, so each cpu-pool has
>>> +an own scheduler.
>>> +Physical cpus and domains can be moved from one pool to another only by an
>>> +explicit command.
>>> +
>>> +=over 4
>>> +
>>> +=item B<cpupool-create>  [I<OPTIONS>] I<ConfigFile>
>>> +
>>> +Create a cpu pool based an I<ConfigFile>.
>>> +
>>> +B<OPTIONS>
>>> +
>>> +=over 4
>>> +
>>> +=item B<-f=FILE>, B<--defconfig=FILE>
>>> +
>>> +Use the given configuration file.
>>> +
>>> +=item B<-n>, B<--dryrun>
>>> +
>>> +Dry run - prints the resulting configuration.
>> Is this deprecated in favour of global -N option? I think it should be.
> Yeah, there is no point since we have a global option.
>
>>> +
>>> +=back
>>> +
>>> +=item B<cpupool-list>  [I<-c|--cpus>  I<cpu-pool>]
>>> +
>>> +List CPU pools on the host.
>>> +If I<-c>  is specified, B<xl>  prints a list of CPUs used by I<cpu-pool>.
>> Is cpu-pool a name or a number, or both? (this info would be useful in
>> the intro to the section I suppose).
> I think it is a name, but I would need a confirmation from Juergen.
>

Already specified by cs 24066.


Juergen

-- 
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: juergen.gross@ts.fujitsu.com
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 06:54:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 06:54:56 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO9YF-0007Cg-UD; Wed, 09 Nov 2011 06:54:55 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO9Xi-00070U-Ck
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 06:54:22 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1320850340!43686861!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29059 invoked from network); 9 Nov 2011 14:52:22 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-14.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 14:52:22 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA9EsEEX009098
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 14:54:15 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA9EsDrv019752
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 14:54:13 GMT
Received: from abhmt109.oracle.com (abhmt109.oracle.com [141.146.116.61])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA9Es80l013693; Wed, 9 Nov 2011 08:54:08 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 06:54:07 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 3A1BE8144B; Wed,  9 Nov 2011 09:49:22 -0500 (EST)
Date: Wed, 9 Nov 2011 09:49:22 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Paul Durrant <Paul.Durrant@citrix.com>
Message-ID: <20111109144922.GC8410@phenom.dumpdata.com>
References: <4EBA35D3.3020506@oracle.com>
	<1320826490-29362-1-git-send-email-annie.li@oracle.com>
	<291EDFCB1E9E224A99088639C4762022B4543AB1BD@LONPMAILBOX01.citrite.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <291EDFCB1E9E224A99088639C4762022B4543AB1BD@LONPMAILBOX01.citrite.net>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090207.4EBA9417.013B,ss=1,re=0.000,fgs=0
Cc: "kurt.hackel@oracle.com" <kurt.hackel@oracle.com>,
	"annie.li@oracle.com" <annie.li@oracle.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"jeremy@goop.org" <jeremy@goop.org>
Subject: [Xen-devel] Re: [PATCH 1/3] Introducing grant table V2 stucture
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Nov 09, 2011 at 11:11:22AM +0000, Paul Durrant wrote:
> Annie,
> 
>   Comments inline below...
> 
> > -----Original Message-----
> [snip]
> > -static struct grant_entry *shared;
> > +static union {
> > +	struct grant_entry_v1 *v1;
> > +	void *ring_addr;
> > +} shared;
> > +
> 
> 'ring_addr' seems like the wrong name here; how about 'raw'?

Or 'ring'. I asked Annie to change it from 'raw' to something else and the first
thing that came in my mind was 'ring_addr'. But this does not point to a ring, so
the 'ring' part is wrong.

Point here is to make it descriptive. 'raw' does not carry meaning of _what_
it is suppose to do. 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 06:55:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 06:55:52 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO9Z9-0007Zo-QD; Wed, 09 Nov 2011 06:55:51 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO9Xi-00070V-Va
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 06:54:23 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1320850458!898592!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8846 invoked from network); 9 Nov 2011 14:54:19 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-11.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 9 Nov 2011 14:54:19 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA9EsE2R009090
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 14:54:14 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA9EsDTw029988
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 14:54:13 GMT
Received: from abhmt112.oracle.com (abhmt112.oracle.com [141.146.116.64])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA9Es8hR018690; Wed, 9 Nov 2011 08:54:08 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 06:54:07 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 8561881448; Wed,  9 Nov 2011 09:22:56 -0500 (EST)
Date: Wed, 9 Nov 2011 09:22:56 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: ANNIE LI <annie.li@oracle.com>
Message-ID: <20111109142256.GA8410@phenom.dumpdata.com>
References: <4EBA32B7.7020804@oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EBA32B7.7020804@oracle.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090204.4EBA9417.00EA,ss=1,re=0.000,fgs=0
Cc: Kurt Hackel <Kurt.Hackel@oracle.com>, jeremy@goop.org,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	linux-kernel@vger.kernel.org, Paul Durrant <paul.durrant@citrix.com>
Subject: [Xen-devel] Re: patches of upstreaming grant table version 2
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Nov 09, 2011 at 03:58:47PM +0800, ANNIE LI wrote:
> Hi
> 
> The following patches introduce and implement grant table version 2,
> and they are based on v3.1.0-rc9+.

Yeey! Thanks for posting them.
> 
> Descriptions for those patches:
> 
> 1. In those patches, the grant table code supports both grant table
> v1 and v2 version, v2 is an extension from v1. Grant table of guest
> domain can be either v1 or v2 version, and every grant table entry
> on one guest should be the same version.
> 
> 2. Full page structure of grant table v2 play the same role as grant
> table v1. Although full page structure is different from v1, grant
> table 2 is totally backwards compatible with v1. Grant table is
> shared between guest and Xen, domu and dom0 all have their own grant
> table shared with Xen, and their grant table version should be set
> before any grants are activated. When domu grants an entry to dom0
> to map a frame, following are steps:
> * domu introduces a grant entry by reference
> * domu informs dom0 the gref
> * dom0 sends hypercall to map frame through this reference, Xen copy
> shared entry to active entry and update frame
> * dom0 does its work and release the frame, Xen releases the entry.
> * domu redo those steps for a new cycle.
> 
> Xen mapping process can be found in function __gnttab_map_grant_ref
> in link: http://xenbits.xen.org/hg/xen-4.1-testing.hg/file/81e39a4978ea/xen/common/grant_table.c#l2172
> 
> 
> 3. If dom0 supports grant table v2, guests run on it can either
> supports v1 or v2. Xen is responsible to judge what version the
> guests are using. This is implemented in link: http://xenbits.xen.org/hg/xen-4.1-testing.hg/file/81e39a4978ea/xen/common/grant_table.c#l2172.
> Key word is:  rd->grant_table->gt_version.
> 
> 4. Grant table2 is a precondition to netchannel2 mechanism.

Well, .. parts of netchannel2 that are going to be put in the netback
and netfront as ways of expanding the driver (add new features).

netchannel2 by itself is dead, and we can pick some of its grand ideas
from it and put them in netback/netfront.

> Netchannel2 imports a new device type: vif2. To support this type,
> we need new netback2, netfront2 driver and modification in Xen. If
> all are ready, two types of vif can be supported: vif and vif2. vif
> is for original backend and frontend, vif2 is for netback2 and
> netfront2.
> 
> Thanks
> Annie

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 07:03:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 07:03:05 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO9g8-0000Je-72; Wed, 09 Nov 2011 07:03:04 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO9Zw-0007qy-Gs
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 06:56:41 -0800
X-Env-Sender: Paul.Durrant@citrix.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1320850596!2891024!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16128 invoked from network); 9 Nov 2011 14:56:36 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-12.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 14:56:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315180800"; 
   d="scan'208";a="8842789"
Received: from lonpmailmx02.citrite.net ([10.30.203.163])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 14:56:36 +0000
Received: from LONPMAILBOX01.citrite.net ([10.30.224.161]) by
	LONPMAILMX02.citrite.net ([10.30.203.163]) with mapi; Wed, 9 Nov 2011
	14:56:36 +0000
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, "annie.li@oracle.com"
	<annie.li@oracle.com>
Date: Wed, 9 Nov 2011 14:56:42 +0000
Thread-Topic: [PATCH 1/3] Introducing grant table V2 stucture
Thread-Index: Acye73UbdvaN+on5SqWNNgKu2cVKewAACtWw
Message-ID: <291EDFCB1E9E224A99088639C4762022B4543AB204@LONPMAILBOX01.citrite.net>
References: <4EBA35D3.3020506@oracle.com>
	<1320826490-29362-1-git-send-email-annie.li@oracle.com>
	<291EDFCB1E9E224A99088639C4762022B4543AB1BD@LONPMAILBOX01.citrite.net>
	<20111109144922.GC8410@phenom.dumpdata.com>
In-Reply-To: <20111109144922.GC8410@phenom.dumpdata.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Cc: "kurt.hackel@oracle.com" <kurt.hackel@oracle.com>,
	"jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: [Xen-devel] RE: [PATCH 1/3] Introducing grant table V2 stucture
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

I'd be happy with 'addr' or 'opaque' or somesuch if 'raw' is distasteful.

  Paul

> -----Original Message-----
> From: Konrad Rzeszutek Wilk [mailto:konrad.wilk@oracle.com]
> Sent: 09 November 2011 14:49
> To: Paul Durrant
> Cc: annie.li@oracle.com; xen-devel@lists.xensource.com; linux-
> kernel@vger.kernel.org; jeremy@goop.org; kurt.hackel@oracle.com
> Subject: Re: [PATCH 1/3] Introducing grant table V2 stucture
>=20
> On Wed, Nov 09, 2011 at 11:11:22AM +0000, Paul Durrant wrote:
> > Annie,
> >
> >   Comments inline below...
> >
> > > -----Original Message-----
> > [snip]
> > > -static struct grant_entry *shared;
> > > +static union {
> > > +	struct grant_entry_v1 *v1;
> > > +	void *ring_addr;
> > > +} shared;
> > > +
> >
> > 'ring_addr' seems like the wrong name here; how about 'raw'?
>=20
> Or 'ring'. I asked Annie to change it from 'raw' to something else
> and the first thing that came in my mind was 'ring_addr'. But this
> does not point to a ring, so the 'ring' part is wrong.
>=20
> Point here is to make it descriptive. 'raw' does not carry meaning
> of _what_ it is suppose to do.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 07:06:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 07:06:17 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO9jF-0000jT-1t; Wed, 09 Nov 2011 07:06:17 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO9bp-0008JV-9O
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 06:58:43 -0800
X-Env-Sender: beto.rvs@gmail.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1320850708!903979!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21797 invoked from network); 9 Nov 2011 14:58:29 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-10.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 14:58:29 -0000
Received: by vcbfk13 with SMTP id fk13so2055382vcb.30
	for <xen-devel@lists.xensource.com>;
	Wed, 09 Nov 2011 06:58:27 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=35bLp1Fg6n+e6NbZOKAnSkUwDxxnYvbmYAto5CVbYWQ=;
	b=DZfgBHMKViFVQ07dyUktB3f3AeZxnvTTtbXroOZqarAGmoG/DGBV5jX+x/cgMYQcXh
	M9Eu9uuI+Y38z+ieenNsLUMUdguMwFTBILI3KTY3+16zV1aoLzXc4BfM7RZ8Euwzvjcx
	AuVVM53xTT3woZ/Ay0dzL5ZMrAqrA4SqTizQQ=
MIME-Version: 1.0
Received: by 10.52.33.69 with SMTP id p5mr5031566vdi.78.1320850707658; Wed, 09
	Nov 2011 06:58:27 -0800 (PST)
Received: by 10.220.5.72 with HTTP; Wed, 9 Nov 2011 06:58:27 -0800 (PST)
Date: Wed, 9 Nov 2011 12:58:27 -0200
Message-ID: <CAOdhoheOhKGWp3f-tvXDX5SuGMXmsyY4fP==EXL-CWfiF52NzQ@mail.gmail.com>
From: Roberto Scudeller <beto.rvs@gmail.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] why do I get bad disk write performance in the kernel
	3.1?
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0604361362=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0604361362==
Content-Type: multipart/alternative; boundary=20cf3079ba543b36bf04b14e8577

--20cf3079ba543b36bf04b14e8577
Content-Type: text/plain; charset=ISO-8859-1

Hi all,

I'm testing the new kernel 3.1 from kernel.org, and xen 4.1.2-rc1-pre.
I execute a CrystalMark IO Benchmark, in windows 2003 VM with gplpv
drivers, and receive an amazing result for reading, but the write numbers
are very disappointing.

I run the VM in local disk, and receive these numbers:
Seq read: 244 MB/s
512K read: 239 MB/s
4K read: 27 MB/s
4K QD 32: 90 MB/s

Seq write: 20 MB/s
512K: 20 MB/s
4K: 8 MB/s
4K QD 32: 12MB/s

In older kernel, 2.6.32.x:
Seq read: 189 MB/s
512K read: 169 MB/s
4K read: 11 MB/s
4K QD 32: 34 MB/s

Seq write: 177 MB/s
512K: 166 MB/s
4K: 12 MB/s
4K QD 32: 36 MB/s

Could anyone help me. Why is the new kernel faster in reading, but too slow
writing ?

-- 
Roberto Scudeller

--20cf3079ba543b36bf04b14e8577
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hi all,<br><br>I&#39;m testing the new kernel 3.1 from <a href=3D"http://ke=
rnel.org">kernel.org</a>, and xen 4.1.2-rc1-pre. <br>I execute a CrystalMar=
k IO Benchmark, in windows 2003 VM with gplpv drivers, and receive an amazi=
ng result for reading, but the write numbers are very disappointing.<br>
<br>I run the VM in local disk, and receive these numbers:<br>Seq read: 244=
 MB/s<br>512K read: 239 MB/s<br>4K read: 27 MB/s<br>4K QD 32: 90 MB/s<br><b=
r>Seq write: 20 MB/s<br>512K: 20 MB/s<br>4K: 8 MB/s<br>4K QD 32: 12MB/s<br>
<br>In older kernel, 2.6.32.x:<br>Seq read: 189 MB/s<br>
512K read: 169 MB/s<br>
4K read: 11 MB/s<br>
4K QD 32: 34 MB/s<br>
<br>
Seq write: 177 MB/s<br>
512K: 166 MB/s<br>
4K: 12 MB/s<br>
4K QD 32: 36 MB/s<br><br>Could anyone help me. Why is the new kernel faster=
 in reading, but too slow writing ?<br clear=3D"all"><br>-- <br>Roberto Scu=
deller<br><br><br>

--20cf3079ba543b36bf04b14e8577--


--===============0604361362==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0604361362==--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 07:08:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 07:08:45 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO9lc-000189-TO; Wed, 09 Nov 2011 07:08:44 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO9di-00005G-GQ
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 07:00:40 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1320850831!2891704!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30105 invoked from network); 9 Nov 2011 15:00:31 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-12.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 15:00:31 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315180800"; 
   d="scan'208";a="8842883"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 15:00:31 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Wed, 9 Nov 2011
	15:00:30 +0000
Subject: Re: [Xen-devel] [PATCH 3 of 7] docs: add a document describing the
	xl cfg file syntax
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, "Zhou
	Peng" <zhoupeng@nfs.iscas.ac.cn>
Date: Wed, 9 Nov 2011 15:00:30 +0000
In-Reply-To: <291f6cb0d03e56e4edbe.1320678792@cosworth.uk.xensource.com>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
	<291f6cb0d03e56e4edbe.1320678792@cosworth.uk.xensource.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320850830.955.171.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Ian Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, 2011-11-07 at 15:13 +0000, Ian Campbell wrote:
> 
> +### Spice Graphics Support
> +
> + * `spice=BOOLEAN`: XXX
> +
> + * `spiceport=XXX`: XXX
> +
> + * `spicetls_port=XXX`: XXX
> +
> + * `spicehost=XXX`: XXX
> +
> + * `spicedisable_ticketing=XXX`: XXX
> +
> + * `spiceagent_mouse=XXX`: XXX 

Hi Zhou,

It seems that you added most of these commands to xl. Can I trouble you
to write a few words about what they do?

Thanks,

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 07:10:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 07:10:56 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO9nj-0001Vy-OU; Wed, 09 Nov 2011 07:10:55 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO9hF-0000Vm-S5
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 07:04:15 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1320851049!900160!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17713 invoked from network); 9 Nov 2011 15:04:10 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-9.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 15:04:10 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA9F3i2c022794
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 15:03:45 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA9EsG3t005724
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 14:54:17 GMT
Received: from abhmt104.oracle.com (abhmt104.oracle.com [141.146.116.56])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA9EsA5G018722; Wed, 9 Nov 2011 08:54:10 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 06:54:09 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 53E1C8144A; Wed,  9 Nov 2011 09:44:41 -0500 (EST)
Date: Wed, 9 Nov 2011 09:44:41 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Deepthi Dharwar <deepthi@linux.vnet.ibm.com>
Message-ID: <20111109144440.GB8410@phenom.dumpdata.com>
References: <1320786914-10541-1-git-send-email-konrad.wilk@oracle.com>
	<1320786914-10541-2-git-send-email-konrad.wilk@oracle.com>
	<4EBA53C5.9040603@linux.vnet.ibm.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EBA53C5.9040603@linux.vnet.ibm.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A020201.4EBA9652.00C8,ss=1,re=0.000,fgs=0
Cc: len.brown@intel.com, jeremy@goop.org, xen-devel@lists.xensource.com,
	x86@kernel.org, linux-kernel@vger.kernel.org, stable@kernel.org,
	mingo@redhat.com, bp@alien8.de, hpa@zytor.com, tj@kernel.org,
	tglx@linutronix.de, trenn@suse.de
Subject: [Xen-devel] 
 Re: [PATCH 1/3] cpuidle: If disable_cpuidle() is called, set pm_idle
 to default_idle.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

. snip..
> > 
> >      ..scribble on pm_idle and access default_idle,
> >     have it simply disable_cpuidle() so acpi_idle will not load and
> >     architecture default HLT will be used.
> > 
> > .. but the default HLT does not get used. Instead we end up in the

Hey Deepthi,

> > +	if (cpuidle_disabled()) {
> > +		pm_idle = default_idle;
> > +		return;
> > +	}
> 
> 
> The above check is needed to initialise pm_idle to default_idle if
> cpuidle is disabled but this requirement here is Zen specific. 
> On other architectures, if cpuidle is disabled on boot then we 
> rather would want mwait_idle or amd_e400_idle to be enabled than 
> default_idle. Can we make this check Zen specific ? 

We do? Why? I would have thought that if you want to disable the cpuidle
you would want the default_idle. 

Perhaps there is another way do this is:

diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
index becd6d9..04b10a4 100644
--- a/drivers/cpuidle/cpuidle.c
+++ b/drivers/cpuidle/cpuidle.c
@@ -38,6 +38,7 @@ int cpuidle_disabled(void)
 void disable_cpuidle(void)
 {
 	off = 1;
+	pm_idle = default_idle;
 }

which would do almost the same thing as this patch (well, except
that if you run cpuidle.off=1 you still end up with amd_e400_idle
instead of default_idle, so it is not the complete solution).

> 
> ...  if(ZEN_ARCH && cpuidle_disabled()) ... 

That would not work very well. For one thing you would need to call
'xen_domain()', and pull in a lots of header files. Second of, it
looks quite ugly and kernel folks like pretty code.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 07:20:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 07:20:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RO9wj-00022u-GS; Wed, 09 Nov 2011 07:20:13 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO9vP-0001pP-B7
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 07:18:55 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1320851809!43691584!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5201 invoked from network); 9 Nov 2011 15:16:50 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-14.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 15:16:50 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA9FIimt017535
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 15:18:45 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA9FIhHI003613
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 15:18:44 GMT
Received: from abhmt120.oracle.com (abhmt120.oracle.com [141.146.116.72])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA9FIelT008005; Wed, 9 Nov 2011 09:18:40 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 07:18:39 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 277ED81448; Wed,  9 Nov 2011 10:18:39 -0500 (EST)
Date: Wed, 9 Nov 2011 10:18:39 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Roberto Scudeller <beto.rvs@gmail.com>
Subject: Re: [Xen-devel] why do I get bad disk write performance in the
	kernel 3.1?
Message-ID: <20111109151838.GA26277@phenom.dumpdata.com>
References: <CAOdhoheOhKGWp3f-tvXDX5SuGMXmsyY4fP==EXL-CWfiF52NzQ@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAOdhoheOhKGWp3f-tvXDX5SuGMXmsyY4fP==EXL-CWfiF52NzQ@mail.gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090201.4EBA99D5.015D,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Nov 09, 2011 at 12:58:27PM -0200, Roberto Scudeller wrote:
> Hi all,
> 
> I'm testing the new kernel 3.1 from kernel.org, and xen 4.1.2-rc1-pre.
> I execute a CrystalMark IO Benchmark, in windows 2003 VM with gplpv
> drivers, and receive an amazing result for reading, but the write numbers
> are very disappointing.
> 
> I run the VM in local disk, and receive these numbers:
> Seq read: 244 MB/s
> 512K read: 239 MB/s
> 4K read: 27 MB/s
> 4K QD 32: 90 MB/s
> 
> Seq write: 20 MB/s
> 512K: 20 MB/s
> 4K: 8 MB/s
> 4K QD 32: 12MB/s
> 
> In older kernel, 2.6.32.x:
> Seq read: 189 MB/s
> 512K read: 169 MB/s
> 4K read: 11 MB/s
> 4K QD 32: 34 MB/s
> 
> Seq write: 177 MB/s
> 512K: 166 MB/s
> 4K: 12 MB/s
> 4K QD 32: 36 MB/s
> 
> Could anyone help me. Why is the new kernel faster in reading, but too slow
> writing ?

It would help if you gave an idea of what the guest configuration is and
what is the backend. It might be that the backend you are using in 3.1 is
QEMU qdisk, not xen-blkback.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 07:52:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 07:52:31 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROARz-00065I-DS; Wed, 09 Nov 2011 07:52:31 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROARH-0005sU-Fp
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 07:51:48 -0800
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1320853903!3517938!1
X-Originating-IP: [65.55.88.14]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8752 invoked from network); 9 Nov 2011 15:51:44 -0000
Received: from tx2ehsobe004.messaging.microsoft.com (HELO
	TX2EHSOBE008.bigfish.com) (65.55.88.14)
	by server-2.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	9 Nov 2011 15:51:44 -0000
Received: from mail52-tx2-R.bigfish.com (10.9.14.244) by
	TX2EHSOBE008.bigfish.com (10.9.40.28) with Microsoft SMTP Server id
	14.1.225.22; Wed, 9 Nov 2011 15:51:19 +0000
Received: from mail52-tx2 (localhost.localdomain [127.0.0.1])	by
	mail52-tx2-R.bigfish.com (Postfix) with ESMTP id 09E961B18269;
	Wed,  9 Nov 2011 15:51:31 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzz8275bhz32i668h839h944h61h)
X-Spam-TCS-SCL: 0:0
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
Received: from mail52-tx2 (localhost.localdomain [127.0.0.1]) by mail52-tx2
	(MessageSwitch) id 1320853890683085_21058;
	Wed,  9 Nov 2011 15:51:30 +0000 (UTC)
Received: from TX2EHSMHS029.bigfish.com (unknown [10.9.14.243])	by
	mail52-tx2.bigfish.com (Postfix) with ESMTP id 9499A16C0059;
	Wed,  9 Nov 2011 15:51:30 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	TX2EHSMHS029.bigfish.com (10.9.99.129) with Microsoft SMTP Server id
	14.1.225.22; Wed, 9 Nov 2011 15:51:17 +0000
X-WSS-ID: 0LUEHE1-02-7G0-02
X-M-MSG: 
Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com
	[163.181.249.73])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 2340EC8071;	Wed,  9 Nov 2011 09:51:36 -0600 (CST)
Received: from sausexhtp02.amd.com (163.181.3.152) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Wed, 9 Nov 2011 09:52:37 -0600
Received: from storexhtp01.amd.com (172.24.4.3) by sausexhtp02.amd.com
	(163.181.3.152) with Microsoft SMTP Server (TLS) id 8.3.213.0;
	Wed, 9 Nov 2011 09:51:38 -0600
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp01.amd.com
	(172.24.4.3) with Microsoft SMTP Server id 8.3.213.0; Wed, 9 Nov 2011
	10:51:36 -0500
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id BEF0349C5E5; Wed,  9 Nov 2011
	15:51:35 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id ABEA3594884; Wed,  9 Nov 2011
	16:51:35 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 3de4c299af619a8c992d779e255e6060d79f9ff6
Message-ID: <3de4c299af619a8c992d.1320853858@gran.amd.com>
In-Reply-To: <patchbomb.1320853855@gran.amd.com>
References: <patchbomb.1320853855@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Wed, 9 Nov 2011 16:50:58 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <JBeulich@suse.com>
X-OriginatorOrg: amd.com
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 3 of 6] amd iommu: Simplify IVHD device flag
	handling
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Wei Wang <wei.wang2@amd.com>
# Date 1320852001 -3600
# Node ID 3de4c299af619a8c992d779e255e6060d79f9ff6
# Parent  4b115815bc13e4f2a3a178f3de7477ecf46cb44b
amd iommu: Simplify IVHD device flag handling.
These bits are aligned to corresponding fields in device table entry. They
can be updated by a single device entry write.

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r 4b115815bc13 -r 3de4c299af61 xen/drivers/passthrough/amd/iommu_acpi.c
--- a/xen/drivers/passthrough/amd/iommu_acpi.c	Wed Nov 09 16:19:57 2011 +0100
+++ b/xen/drivers/passthrough/amd/iommu_acpi.c	Wed Nov 09 16:20:01 2011 +0100
@@ -31,38 +31,14 @@ static void __init add_ivrs_mapping_entr
     u16 bdf, u16 alias_id, u8 flags, struct amd_iommu *iommu)
 {
     struct ivrs_mappings *ivrs_mappings = get_ivrs_mappings(iommu->seg);
-    u8 sys_mgt, lint1_pass, lint0_pass, nmi_pass, ext_int_pass, init_pass;
+
     ASSERT( ivrs_mappings != NULL );
 
     /* setup requestor id */
     ivrs_mappings[bdf].dte_requestor_id = alias_id;
 
     /* override flags for range of devices */
-    sys_mgt = get_field_from_byte(flags,
-                                  AMD_IOMMU_ACPI_SYS_MGT_MASK,
-                                  AMD_IOMMU_ACPI_SYS_MGT_SHIFT);
-    lint1_pass = get_field_from_byte(flags,
-                                  AMD_IOMMU_ACPI_LINT1_PASS_MASK,
-                                  AMD_IOMMU_ACPI_LINT1_PASS_SHIFT);
-    lint0_pass = get_field_from_byte(flags,
-                                  AMD_IOMMU_ACPI_LINT0_PASS_MASK,
-                                  AMD_IOMMU_ACPI_LINT0_PASS_SHIFT);
-    nmi_pass = get_field_from_byte(flags,
-                                  AMD_IOMMU_ACPI_NMI_PASS_MASK,
-                                  AMD_IOMMU_ACPI_NMI_PASS_SHIFT);
-    ext_int_pass = get_field_from_byte(flags,
-                                  AMD_IOMMU_ACPI_EINT_PASS_MASK,
-                                  AMD_IOMMU_ACPI_EINT_PASS_SHIFT);
-    init_pass = get_field_from_byte(flags,
-                                  AMD_IOMMU_ACPI_INIT_PASS_MASK,
-                                  AMD_IOMMU_ACPI_INIT_PASS_SHIFT);
-
-    ivrs_mappings[bdf].dte_sys_mgt_enable = sys_mgt;
-    ivrs_mappings[bdf].dte_lint1_pass = lint1_pass;
-    ivrs_mappings[bdf].dte_lint0_pass = lint0_pass;
-    ivrs_mappings[bdf].dte_nmi_pass = nmi_pass;
-    ivrs_mappings[bdf].dte_ext_int_pass = ext_int_pass;
-    ivrs_mappings[bdf].dte_init_pass = init_pass;
+    ivrs_mappings[bdf].device_flags = flags;
 
     if (ivrs_mappings[alias_id].intremap_table == NULL )
     {
diff -r 4b115815bc13 -r 3de4c299af61 xen/drivers/passthrough/amd/iommu_init.c
--- a/xen/drivers/passthrough/amd/iommu_init.c	Wed Nov 09 16:19:57 2011 +0100
+++ b/xen/drivers/passthrough/amd/iommu_init.c	Wed Nov 09 16:20:01 2011 +0100
@@ -790,18 +790,12 @@ static int __init alloc_ivrs_mappings(u1
     for ( bdf = 0; bdf < ivrs_bdf_entries; bdf++ )
     {
         ivrs_mappings[bdf].dte_requestor_id = bdf;
-        ivrs_mappings[bdf].dte_sys_mgt_enable =
-            IOMMU_DEV_TABLE_SYS_MGT_MSG_FORWARDED;
         ivrs_mappings[bdf].dte_allow_exclusion = IOMMU_CONTROL_DISABLED;
         ivrs_mappings[bdf].unity_map_enable = IOMMU_CONTROL_DISABLED;
         ivrs_mappings[bdf].iommu = NULL;
 
         ivrs_mappings[bdf].intremap_table = NULL;
-        ivrs_mappings[bdf].dte_lint1_pass = IOMMU_CONTROL_DISABLED;
-        ivrs_mappings[bdf].dte_lint0_pass = IOMMU_CONTROL_DISABLED;
-        ivrs_mappings[bdf].dte_nmi_pass = IOMMU_CONTROL_DISABLED;
-        ivrs_mappings[bdf].dte_ext_int_pass = IOMMU_CONTROL_DISABLED;
-        ivrs_mappings[bdf].dte_init_pass = IOMMU_CONTROL_DISABLED;
+        ivrs_mappings[bdf].device_flags = 0;
 
         if ( amd_iommu_perdev_intremap )
             spin_lock_init(&ivrs_mappings[bdf].intremap_lock);
@@ -817,8 +811,6 @@ static int __init amd_iommu_setup_device
 {
     int bdf;
     void *intr_tb, *dte;
-    int sys_mgt, dev_ex, lint1_pass, lint0_pass,
-       nmi_pass, ext_int_pass, init_pass;
 
     BUG_ON( (ivrs_bdf_entries == 0) );
 
@@ -840,21 +832,9 @@ static int __init amd_iommu_setup_device
 
         if ( intr_tb )
         {
-            sys_mgt = ivrs_mappings[bdf].dte_sys_mgt_enable;
-            dev_ex = ivrs_mappings[bdf].dte_allow_exclusion;
-
-            /* get interrupt remapping settings */
-            lint1_pass = ivrs_mappings[bdf].dte_lint1_pass;
-            lint0_pass = ivrs_mappings[bdf].dte_lint0_pass;
-            nmi_pass = ivrs_mappings[bdf].dte_nmi_pass;
-            ext_int_pass = ivrs_mappings[bdf].dte_ext_int_pass;
-            init_pass = ivrs_mappings[bdf].dte_init_pass;
-
             /* add device table entry */
             dte = device_table.buffer + (bdf * IOMMU_DEV_TABLE_ENTRY_SIZE);
-            amd_iommu_add_dev_table_entry(
-                dte, sys_mgt, dev_ex, lint1_pass, lint0_pass,
-                nmi_pass, ext_int_pass, init_pass);
+            iommu_dte_add_device_entry(dte, &ivrs_mappings[bdf]);
 
             amd_iommu_set_intremap_table(
                 dte, (u64)virt_to_maddr(intr_tb), iommu_intremap);
diff -r 4b115815bc13 -r 3de4c299af61 xen/drivers/passthrough/amd/iommu_map.c
--- a/xen/drivers/passthrough/amd/iommu_map.c	Wed Nov 09 16:19:57 2011 +0100
+++ b/xen/drivers/passthrough/amd/iommu_map.c	Wed Nov 09 16:20:01 2011 +0100
@@ -25,6 +25,7 @@
 #include <asm/hvm/svm/amd-iommu-proto.h>
 #include "../ats.h"
 #include <xen/pci.h>
+#include <asm/hvm/svm/amd-iommu-acpi.h>
 
 static int queue_iommu_command(struct amd_iommu *iommu, u32 cmd[])
 {
@@ -419,35 +420,23 @@ void __init amd_iommu_set_intremap_table
     dte[4] = entry;
 }
 
-void __init amd_iommu_add_dev_table_entry(
-    u32 *dte, u8 sys_mgt, u8 dev_ex, u8 lint1_pass, u8 lint0_pass, 
-    u8 nmi_pass, u8 ext_int_pass, u8 init_pass)
+void __init iommu_dte_add_device_entry(u32 *dte, struct ivrs_mappings* ivrs_dev)
 {
     u32 entry;
+    u8 sys_mgt, dev_ex, flags;
+    u8 mask = ~(0x7 << 3);
 
     dte[7] = dte[6] = dte[4] = dte[2] = dte[1] = dte[0] = 0;
 
+    flags = ivrs_dev->device_flags;
+    sys_mgt = get_field_from_byte(flags, AMD_IOMMU_ACPI_SYS_MGT_MASK,
+                                  AMD_IOMMU_ACPI_SYS_MGT_SHIFT);
+    dev_ex = ivrs_dev->dte_allow_exclusion;
 
-    set_field_in_reg_u32(init_pass ? IOMMU_CONTROL_ENABLED :
-                        IOMMU_CONTROL_DISABLED, 0,
-                        IOMMU_DEV_TABLE_INIT_PASSTHRU_MASK,
-                        IOMMU_DEV_TABLE_INIT_PASSTHRU_SHIFT, &entry);
-    set_field_in_reg_u32(ext_int_pass ? IOMMU_CONTROL_ENABLED :
-                        IOMMU_CONTROL_DISABLED, entry,
-                        IOMMU_DEV_TABLE_EINT_PASSTHRU_MASK,
-                        IOMMU_DEV_TABLE_EINT_PASSTHRU_SHIFT, &entry);
-    set_field_in_reg_u32(nmi_pass ? IOMMU_CONTROL_ENABLED :
-                        IOMMU_CONTROL_DISABLED, entry,
-                        IOMMU_DEV_TABLE_NMI_PASSTHRU_MASK,
-                        IOMMU_DEV_TABLE_NMI_PASSTHRU_SHIFT, &entry);
-    set_field_in_reg_u32(lint0_pass ? IOMMU_CONTROL_ENABLED :
-                        IOMMU_CONTROL_DISABLED, entry,
-                        IOMMU_DEV_TABLE_LINT0_ENABLE_MASK,
-                        IOMMU_DEV_TABLE_LINT0_ENABLE_SHIFT, &entry);
-    set_field_in_reg_u32(lint1_pass ? IOMMU_CONTROL_ENABLED :
-                        IOMMU_CONTROL_DISABLED, entry,
-                        IOMMU_DEV_TABLE_LINT1_ENABLE_MASK,
-                        IOMMU_DEV_TABLE_LINT1_ENABLE_SHIFT, &entry);
+    flags &= mask;
+    set_field_in_reg_u32(flags, 0,
+                         IOMMU_DEV_TABLE_IVHD_FLAGS_MASK,
+                         IOMMU_DEV_TABLE_IVHD_FLAGS_SHIFT, &entry);
     dte[5] = entry;
 
     set_field_in_reg_u32(sys_mgt, 0,
diff -r 4b115815bc13 -r 3de4c299af61 xen/include/asm-x86/amd-iommu.h
--- a/xen/include/asm-x86/amd-iommu.h	Wed Nov 09 16:19:57 2011 +0100
+++ b/xen/include/asm-x86/amd-iommu.h	Wed Nov 09 16:20:01 2011 +0100
@@ -86,7 +86,6 @@ struct amd_iommu {
 
 struct ivrs_mappings {
     u16 dte_requestor_id;
-    u8 dte_sys_mgt_enable;
     u8 dte_allow_exclusion;
     u8 unity_map_enable;
     u8 write_permission;
@@ -99,12 +98,8 @@ struct ivrs_mappings {
     void *intremap_table;
     spinlock_t intremap_lock;
 
-    /* interrupt remapping settings */
-    u8 dte_lint1_pass;
-    u8 dte_lint0_pass;
-    u8 dte_nmi_pass;
-    u8 dte_ext_int_pass;
-    u8 dte_init_pass;
+    /* ivhd device data settings */
+    u8 device_flags;
 };
 
 extern unsigned short ivrs_bdf_entries;
diff -r 4b115815bc13 -r 3de4c299af61 xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Wed Nov 09 16:19:57 2011 +0100
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Wed Nov 09 16:20:01 2011 +0100
@@ -158,18 +158,11 @@
 /* DeviceTable Entry[191:160] */
 #define IOMMU_DEV_TABLE_INT_TABLE_PTR_HIGH_MASK     0x000FFFFF
 #define IOMMU_DEV_TABLE_INT_TABLE_PTR_HIGH_SHIFT    0
-#define IOMMU_DEV_TABLE_INIT_PASSTHRU_MASK      0x01000000
-#define IOMMU_DEV_TABLE_INIT_PASSTHRU_SHIFT     24
-#define IOMMU_DEV_TABLE_EINT_PASSTHRU_MASK      0x02000000
-#define IOMMU_DEV_TABLE_EINT_PASSTHRU_SHIFT     25
-#define IOMMU_DEV_TABLE_NMI_PASSTHRU_MASK       0x04000000
-#define IOMMU_DEV_TABLE_NMI_PASSTHRU_SHIFT      26
+#define IOMMU_DEV_TABLE_IVHD_FLAGS_SHIFT        24
+#define IOMMU_DEV_TABLE_IVHD_FLAGS_MASK         0xC7000000
 #define IOMMU_DEV_TABLE_INT_CONTROL_MASK        0x30000000
 #define IOMMU_DEV_TABLE_INT_CONTROL_SHIFT       28
-#define IOMMU_DEV_TABLE_LINT0_ENABLE_MASK       0x40000000
-#define IOMMU_DEV_TABLE_LINT0_ENABLE_SHIFT      30
-#define IOMMU_DEV_TABLE_LINT1_ENABLE_MASK       0x80000000
-#define IOMMU_DEV_TABLE_LINT1_ENABLE_SHIFT      31
+
 
 /* Command Buffer */
 #define IOMMU_CMD_BUFFER_BASE_LOW_OFFSET	0x08
diff -r 4b115815bc13 -r 3de4c299af61 xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Wed Nov 09 16:19:57 2011 +0100
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Wed Nov 09 16:20:01 2011 +0100
@@ -68,14 +68,12 @@ void amd_iommu_share_p2m(struct domain *
 
 /* device table functions */
 int get_dma_requestor_id(u16 seg, u16 bdf);
-void amd_iommu_add_dev_table_entry(
-    u32 *dte, u8 sys_mgt, u8 dev_ex, u8 lint1_pass, u8 lint0_pass, 
-    u8 nmi_pass, u8 ext_int_pass, u8 init_pass);
 void amd_iommu_set_intremap_table(
     u32 *dte, u64 intremap_ptr, u8 int_valid);
 void amd_iommu_set_root_page_table(
     u32 *dte, u64 root_ptr, u16 domain_id, u8 paging_mode, u8 valid);
 void iommu_dte_set_iotlb(u32 *dte, u8 i);
+void iommu_dte_add_device_entry(u32 *dte, struct ivrs_mappings* ivrs_dev);
 void invalidate_dev_table_entry(struct amd_iommu *iommu, u16 devic_id);
 
 /* send cmd to iommu */


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 07:53:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 07:53:26 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROASs-0006Sc-HK; Wed, 09 Nov 2011 07:53:26 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROARJ-0005sW-58
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 07:51:49 -0800
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1320853904!3558050!1
X-Originating-IP: [216.32.181.186]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26022 invoked from network); 9 Nov 2011 15:51:46 -0000
Received: from ch1ehsobe006.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.186)
	by server-4.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	9 Nov 2011 15:51:46 -0000
Received: from mail219-ch1-R.bigfish.com (10.43.68.251) by
	CH1EHSOBE016.bigfish.com (10.43.70.66) with Microsoft SMTP Server id
	14.1.225.22; Wed, 9 Nov 2011 15:51:20 +0000
Received: from mail219-ch1 (localhost.localdomain [127.0.0.1])	by
	mail219-ch1-R.bigfish.com (Postfix) with ESMTP id 6917210482F7;
	Wed,  9 Nov 2011 15:51:34 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzz8275bhz32i668h839h944h)
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
Received: from mail219-ch1 (localhost.localdomain [127.0.0.1]) by mail219-ch1
	(MessageSwitch) id 1320853892144421_25232;
	Wed,  9 Nov 2011 15:51:32 +0000 (UTC)
Received: from CH1EHSMHS033.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.253])	by mail219-ch1.bigfish.com (Postfix) with ESMTP id
	15B026F804C;	Wed,  9 Nov 2011 15:51:32 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	CH1EHSMHS033.bigfish.com (10.43.70.33) with Microsoft SMTP Server id
	14.1.225.22; Wed, 9 Nov 2011 15:51:18 +0000
X-WSS-ID: 0LUEHE1-02-7FZ-02
X-M-MSG: 
Received: from sausexedgep01.amd.com (sausexedgep01-ext.amd.com
	[163.181.249.72])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 26F84C8070;	Wed,  9 Nov 2011 09:51:36 -0600 (CST)
Received: from SAUSEXDAG01.amd.com (163.181.55.1) by sausexedgep01.amd.com
	(163.181.36.54) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Wed, 9 Nov 2011 09:52:38 -0600
Received: from storexhtp02.amd.com (172.24.4.4) by sausexdag01.amd.com
	(163.181.55.1) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Wed, 9 Nov 2011 09:51:38 -0600
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.213.0; Wed, 9 Nov 2011
	10:51:36 -0500
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id CEA8949C623; Wed,  9 Nov 2011
	15:51:35 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id BF2F7594885; Wed,  9 Nov 2011
	16:51:35 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 60d51bc20139471cf71e3d6854534d4176853de2
Message-ID: <60d51bc20139471cf71e.1320853859@gran.amd.com>
In-Reply-To: <patchbomb.1320853855@gran.amd.com>
References: <patchbomb.1320853855@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Wed, 9 Nov 2011 16:50:59 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <JBeulich@suse.com>
X-OriginatorOrg: amd.com
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 4 of 6] amd iommu: Disable debug output for
	early DTE update
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Wei Wang <wei.wang2@amd.com>
# Date 1320852002 -3600
# Node ID 60d51bc20139471cf71e3d6854534d4176853de2
# Parent  3de4c299af619a8c992d779e255e6060d79f9ff6
amd iommu: Disable debug output for early DTE update.
Some systems may have IVHD device entries that cover large device id range.
Having those entries displayed will take very long time to boot.

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r 3de4c299af61 -r 60d51bc20139 xen/drivers/passthrough/amd/iommu_init.c
--- a/xen/drivers/passthrough/amd/iommu_init.c	Wed Nov 09 16:20:01 2011 +0100
+++ b/xen/drivers/passthrough/amd/iommu_init.c	Wed Nov 09 16:20:02 2011 +0100
@@ -838,10 +838,6 @@ static int __init amd_iommu_setup_device
 
             amd_iommu_set_intremap_table(
                 dte, (u64)virt_to_maddr(intr_tb), iommu_intremap);
-
-            AMD_IOMMU_DEBUG("Add device table entry: device id = 0x%04x, "
-                            "interupt table = 0x%"PRIx64"\n", bdf,
-                            (u64)virt_to_maddr(intr_tb));
         }
     }
 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 07:54:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 07:54:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROATn-0006q9-IF; Wed, 09 Nov 2011 07:54:23 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROARJ-0005sX-T9
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 07:51:51 -0800
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1320853905!912111!1
X-Originating-IP: [65.55.88.11]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16677 invoked from network); 9 Nov 2011 15:51:46 -0000
Received: from tx2ehsobe001.messaging.microsoft.com (HELO
	TX2EHSOBE001.bigfish.com) (65.55.88.11)
	by server-10.tower-174.messagelabs.com with AES128-SHA encrypted SMTP;
	9 Nov 2011 15:51:46 -0000
Received: from mail48-tx2-R.bigfish.com (10.9.14.243) by
	TX2EHSOBE001.bigfish.com (10.9.40.21) with Microsoft SMTP Server id
	14.1.225.22; Wed, 9 Nov 2011 15:51:21 +0000
Received: from mail48-tx2 (localhost.localdomain [127.0.0.1])	by
	mail48-tx2-R.bigfish.com (Postfix) with ESMTP id D0B56A9836A;
	Wed,  9 Nov 2011 15:51:34 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzz8275bhz32i668h839h944h61h)
X-Spam-TCS-SCL: 0:0
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
Received: from mail48-tx2 (localhost.localdomain [127.0.0.1]) by mail48-tx2
	(MessageSwitch) id 1320853894451319_7107;
	Wed,  9 Nov 2011 15:51:34 +0000 (UTC)
Received: from TX2EHSMHS037.bigfish.com (unknown [10.9.14.245])	by
	mail48-tx2.bigfish.com (Postfix) with ESMTP id 66ED74005B;
	Wed,  9 Nov 2011 15:51:34 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	TX2EHSMHS037.bigfish.com (10.9.99.137) with Microsoft SMTP Server id
	14.1.225.22; Wed, 9 Nov 2011 15:51:43 +0000
X-WSS-ID: 0LUEHE4-02-7GA-02
X-M-MSG: 
Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com
	[163.181.249.73])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 271C8C8073;	Wed,  9 Nov 2011 09:51:40 -0600 (CST)
Received: from SAUSEXDAG01.amd.com (163.181.55.1) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Wed, 9 Nov 2011 09:52:41 -0600
Received: from storexhtp02.amd.com (172.24.4.4) by sausexdag01.amd.com
	(163.181.55.1) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Wed, 9 Nov 2011 09:51:41 -0600
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.213.0; Wed, 9 Nov 2011
	10:51:38 -0500
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id E12CC49C625; Wed,  9 Nov 2011
	15:51:35 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id CEE64594886; Wed,  9 Nov 2011
	16:51:35 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: c75cf540a1fe57a439f9cb0503bf69f120066b92
Message-ID: <c75cf540a1fe57a439f9.1320853860@gran.amd.com>
In-Reply-To: <patchbomb.1320853855@gran.amd.com>
References: <patchbomb.1320853855@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Wed, 9 Nov 2011 16:51:00 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <JBeulich@suse.com>
X-OriginatorOrg: amd.com
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 5 of 6] amd iommu: Compress hyper-transport
 flags into a single byte
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Wei Wang <wei.wang2@amd.com>
# Date 1320852003 -3600
# Node ID c75cf540a1fe57a439f9cb0503bf69f120066b92
# Parent  60d51bc20139471cf71e3d6854534d4176853de2
amd iommu: Compress hyper-transport flags into a single byte.
These flags are single bit, no need to be saved as integers.
Add 3 inline helpers to make single bit access easier.
Introduce iommu_has_ht_flag and set_iommu_ht_flags

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r 60d51bc20139 -r c75cf540a1fe xen/drivers/passthrough/amd/iommu_detect.c
--- a/xen/drivers/passthrough/amd/iommu_detect.c	Wed Nov 09 16:20:02 2011 +0100
+++ b/xen/drivers/passthrough/amd/iommu_detect.c	Wed Nov 09 16:20:03 2011 +0100
@@ -98,25 +98,8 @@ int __init amd_iommu_detect_one_acpi(voi
     iommu->cap_offset = ivhd_block->cap_offset;
     iommu->mmio_base_phys = ivhd_block->mmio_base;
 
-    /* override IOMMU support flags */
-    iommu->coherent = get_field_from_byte(ivhd_block->header.flags,
-                        AMD_IOMMU_ACPI_COHERENT_MASK,
-                        AMD_IOMMU_ACPI_COHERENT_SHIFT);
-    iommu->iotlb_support = get_field_from_byte(ivhd_block->header.flags,
-                        AMD_IOMMU_ACPI_IOTLB_SUP_MASK,
-                        AMD_IOMMU_ACPI_IOTLB_SUP_SHIFT);
-    iommu->isochronous = get_field_from_byte(ivhd_block->header.flags,
-                        AMD_IOMMU_ACPI_ISOC_MASK,
-                        AMD_IOMMU_ACPI_ISOC_SHIFT);
-    iommu->res_pass_pw = get_field_from_byte(ivhd_block->header.flags,
-                        AMD_IOMMU_ACPI_RES_PASS_PW_MASK,
-                        AMD_IOMMU_ACPI_RES_PASS_PW_SHIFT);
-    iommu->pass_pw = get_field_from_byte(ivhd_block->header.flags,
-                        AMD_IOMMU_ACPI_PASS_PW_MASK,
-                        AMD_IOMMU_ACPI_PASS_PW_SHIFT);
-    iommu->ht_tunnel_enable = get_field_from_byte(ivhd_block->header.flags,
-                        AMD_IOMMU_ACPI_HT_TUN_ENB_MASK,
-                        AMD_IOMMU_ACPI_HT_TUN_ENB_SHIFT);
+    /* override IOMMU HT flags */
+    iommu->ht_flags = ivhd_block->header.flags;
 
     bus = PCI_BUS(iommu->bdf);
     dev = PCI_SLOT(iommu->bdf);
diff -r 60d51bc20139 -r c75cf540a1fe xen/drivers/passthrough/amd/iommu_init.c
--- a/xen/drivers/passthrough/amd/iommu_init.c	Wed Nov 09 16:20:02 2011 +0100
+++ b/xen/drivers/passthrough/amd/iommu_init.c	Wed Nov 09 16:20:03 2011 +0100
@@ -28,6 +28,7 @@
 #include <asm/hvm/svm/amd-iommu-proto.h>
 #include <asm-x86/fixmap.h>
 #include <mach_apic.h>
+#include <asm/hvm/svm/amd-iommu-acpi.h>
 
 static int __initdata nr_amd_iommus;
 
@@ -36,6 +37,12 @@ static struct radix_tree_root ivrs_maps;
 struct list_head amd_iommu_head;
 struct table_struct device_table;
 
+static int iommu_has_ht_flag(struct amd_iommu *iommu, uint8_t bit)
+{
+    u8 mask = (1U << bit) & 0xff;
+    return iommu->ht_flags & mask;
+}
+
 static int __init map_iommu_mmio_region(struct amd_iommu *iommu)
 {
     unsigned long mfn;
@@ -66,6 +73,34 @@ static void __init unmap_iommu_mmio_regi
     }
 }
 
+static void set_iommu_ht_flags(struct amd_iommu *iommu)
+{
+    u32 entry;
+    entry = readl(iommu->mmio_base + IOMMU_CONTROL_MMIO_OFFSET);
+
+    /* Setup HT flags */
+    iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_HT_TUN_ENB_SHIFT) ?
+        iommu_set_bit(&entry, IOMMU_CONTROL_HT_TUNNEL_TRANSLATION_SHIFT):
+        iommu_clear_bit(&entry, IOMMU_CONTROL_HT_TUNNEL_TRANSLATION_SHIFT);
+
+    iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_RES_PASS_PW_SHIFT) ?
+        iommu_set_bit(&entry, IOMMU_CONTROL_RESP_PASS_POSTED_WRITE_SHIFT):
+        iommu_clear_bit(&entry, IOMMU_CONTROL_RESP_PASS_POSTED_WRITE_SHIFT);
+
+    iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_ISOC_SHIFT) ?
+        iommu_set_bit(&entry, IOMMU_CONTROL_ISOCHRONOUS_SHIFT):
+        iommu_clear_bit(&entry, IOMMU_CONTROL_ISOCHRONOUS_SHIFT);
+
+    iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_PASS_PW_SHIFT) ?
+        iommu_set_bit(&entry, IOMMU_CONTROL_PASS_POSTED_WRITE_SHIFT):
+        iommu_clear_bit(&entry, IOMMU_CONTROL_PASS_POSTED_WRITE_SHIFT);
+
+    /* Force coherent */
+    iommu_set_bit(&entry, IOMMU_CONTROL_COHERENT_SHIFT);
+
+    writel(entry, iommu->mmio_base+IOMMU_CONTROL_MMIO_OFFSET);
+}
+
 static void register_iommu_dev_table_in_mmio_space(struct amd_iommu *iommu)
 {
     u64 addr_64, addr_lo, addr_hi;
@@ -150,33 +185,10 @@ static void set_iommu_translation_contro
 
     entry = readl(iommu->mmio_base + IOMMU_CONTROL_MMIO_OFFSET);
 
-    if ( enable )
-    {
-        set_field_in_reg_u32(iommu->ht_tunnel_support ? IOMMU_CONTROL_ENABLED :
-                         IOMMU_CONTROL_DISABLED, entry,
-                         IOMMU_CONTROL_HT_TUNNEL_TRANSLATION_MASK,
-                         IOMMU_CONTROL_HT_TUNNEL_TRANSLATION_SHIFT, &entry);
-        set_field_in_reg_u32(iommu->isochronous ? IOMMU_CONTROL_ENABLED :
-                         IOMMU_CONTROL_DISABLED, entry,
-                         IOMMU_CONTROL_ISOCHRONOUS_MASK,
-                         IOMMU_CONTROL_ISOCHRONOUS_SHIFT, &entry);
-        set_field_in_reg_u32(iommu->coherent ? IOMMU_CONTROL_ENABLED :
-                         IOMMU_CONTROL_DISABLED, entry,
-                         IOMMU_CONTROL_COHERENT_MASK,
-                         IOMMU_CONTROL_COHERENT_SHIFT, &entry);
-        set_field_in_reg_u32(iommu->res_pass_pw ? IOMMU_CONTROL_ENABLED :
-                         IOMMU_CONTROL_DISABLED, entry,
-                         IOMMU_CONTROL_RESP_PASS_POSTED_WRITE_MASK,
-                         IOMMU_CONTROL_RESP_PASS_POSTED_WRITE_SHIFT, &entry);
-        /* do not set PassPW bit */
-        set_field_in_reg_u32(IOMMU_CONTROL_DISABLED, entry,
-                         IOMMU_CONTROL_PASS_POSTED_WRITE_MASK,
-                         IOMMU_CONTROL_PASS_POSTED_WRITE_SHIFT, &entry);
-    }
-    set_field_in_reg_u32(enable ? IOMMU_CONTROL_ENABLED :
-                         IOMMU_CONTROL_DISABLED, entry,
-                         IOMMU_CONTROL_TRANSLATION_ENABLE_MASK,
-                         IOMMU_CONTROL_TRANSLATION_ENABLE_SHIFT, &entry);
+    enable ?
+        iommu_set_bit(&entry, IOMMU_CONTROL_TRANSLATION_ENABLE_SHIFT):
+        iommu_clear_bit(&entry, IOMMU_CONTROL_TRANSLATION_ENABLE_SHIFT);
+
     writel(entry, iommu->mmio_base+IOMMU_CONTROL_MMIO_OFFSET);
 }
 
@@ -186,17 +198,17 @@ static void set_iommu_command_buffer_con
     u32 entry;
 
     entry = readl(iommu->mmio_base + IOMMU_CONTROL_MMIO_OFFSET);
-    set_field_in_reg_u32(enable ? IOMMU_CONTROL_ENABLED :
-                         IOMMU_CONTROL_DISABLED, entry,
-                         IOMMU_CONTROL_COMMAND_BUFFER_ENABLE_MASK,
-                         IOMMU_CONTROL_COMMAND_BUFFER_ENABLE_SHIFT, &entry);
 
     /*reset head and tail pointer manually before enablement */
-    if ( enable == IOMMU_CONTROL_ENABLED )
+    if ( enable )
     {
         writel(0x0, iommu->mmio_base + IOMMU_CMD_BUFFER_HEAD_OFFSET);
         writel(0x0, iommu->mmio_base + IOMMU_CMD_BUFFER_TAIL_OFFSET);
+
+        iommu_set_bit(&entry, IOMMU_CONTROL_COMMAND_BUFFER_ENABLE_SHIFT);
     }
+    else
+        iommu_clear_bit(&entry, IOMMU_CONTROL_COMMAND_BUFFER_ENABLE_SHIFT);
 
     writel(entry, iommu->mmio_base+IOMMU_CONTROL_MMIO_OFFSET);
 }
@@ -247,24 +259,24 @@ static void set_iommu_event_log_control(
     u32 entry;
 
     entry = readl(iommu->mmio_base + IOMMU_CONTROL_MMIO_OFFSET);
-    set_field_in_reg_u32(enable ? IOMMU_CONTROL_ENABLED :
-                         IOMMU_CONTROL_DISABLED, entry,
-                         IOMMU_CONTROL_EVENT_LOG_ENABLE_MASK,
-                         IOMMU_CONTROL_EVENT_LOG_ENABLE_SHIFT, &entry);
-    set_field_in_reg_u32(enable ? IOMMU_CONTROL_ENABLED :
-                         IOMMU_CONTROL_DISABLED, entry,
-                         IOMMU_CONTROL_EVENT_LOG_INT_MASK,
-                         IOMMU_CONTROL_EVENT_LOG_INT_SHIFT, &entry);
-    set_field_in_reg_u32(IOMMU_CONTROL_DISABLED, entry,
-                         IOMMU_CONTROL_COMP_WAIT_INT_MASK,
-                         IOMMU_CONTROL_COMP_WAIT_INT_SHIFT, &entry);
 
     /*reset head and tail pointer manually before enablement */
-    if ( enable == IOMMU_CONTROL_ENABLED )
+    if ( enable )
     {
         writel(0x0, iommu->mmio_base + IOMMU_EVENT_LOG_HEAD_OFFSET);
         writel(0x0, iommu->mmio_base + IOMMU_EVENT_LOG_TAIL_OFFSET);
+
+        iommu_set_bit(&entry, IOMMU_CONTROL_EVENT_LOG_INT_SHIFT);
+        iommu_set_bit(&entry, IOMMU_CONTROL_EVENT_LOG_ENABLE_SHIFT);
     }
+    else
+    {
+        iommu_clear_bit(&entry, IOMMU_CONTROL_EVENT_LOG_INT_SHIFT);
+        iommu_clear_bit(&entry, IOMMU_CONTROL_EVENT_LOG_ENABLE_SHIFT);
+    }
+
+    iommu_clear_bit(&entry, IOMMU_CONTROL_COMP_WAIT_INT_SHIFT);
+
     writel(entry, iommu->mmio_base + IOMMU_CONTROL_MMIO_OFFSET);
 }
 
@@ -313,9 +325,7 @@ static void amd_iommu_reset_event_log(st
     /* wait until EventLogRun bit = 0 */
     do {
         entry = readl(iommu->mmio_base + IOMMU_STATUS_MMIO_OFFSET);
-        log_run = get_field_from_reg_u32(entry,
-                                        IOMMU_STATUS_EVENT_LOG_RUN_MASK,
-                                        IOMMU_STATUS_EVENT_LOG_RUN_SHIFT);
+        log_run = iommu_get_bit(entry, IOMMU_STATUS_EVENT_LOG_RUN_SHIFT);
         loop_count--;
     } while ( log_run && loop_count );
 
@@ -330,11 +340,9 @@ static void amd_iommu_reset_event_log(st
 
     /* read event log for debugging */
     amd_iommu_read_event_log(iommu);
+    /*clear overflow bit */
+    iommu_clear_bit(&entry, IOMMU_STATUS_EVENT_OVERFLOW_SHIFT);
 
-    /*clear overflow bit */
-    set_field_in_reg_u32(IOMMU_CONTROL_DISABLED, entry,
-                         IOMMU_STATUS_EVENT_OVERFLOW_MASK,
-                         IOMMU_STATUS_EVENT_OVERFLOW_SHIFT, &entry);
     writel(entry, iommu->mmio_base+IOMMU_STATUS_MMIO_OFFSET);
 
     /*reset event log base address */
@@ -519,7 +527,6 @@ static void amd_iommu_page_fault(int irq
 {
     u32 entry;
     unsigned long flags;
-    int of;
     struct amd_iommu *iommu = dev_id;
 
     spin_lock_irqsave(&iommu->lock, flags);
@@ -527,19 +534,14 @@ static void amd_iommu_page_fault(int irq
 
     /*check event overflow */
     entry = readl(iommu->mmio_base + IOMMU_STATUS_MMIO_OFFSET);
-    of = get_field_from_reg_u32(entry,
-                               IOMMU_STATUS_EVENT_OVERFLOW_MASK,
-                               IOMMU_STATUS_EVENT_OVERFLOW_SHIFT);
 
-    /* reset event log if event overflow */
-    if ( of )
+    if ( iommu_get_bit(entry, IOMMU_STATUS_EVENT_OVERFLOW_SHIFT) )
         amd_iommu_reset_event_log(iommu);
 
     /* reset interrupt status bit */
     entry = readl(iommu->mmio_base + IOMMU_STATUS_MMIO_OFFSET);
-    set_field_in_reg_u32(IOMMU_CONTROL_ENABLED, entry,
-                         IOMMU_STATUS_EVENT_LOG_INT_MASK,
-                         IOMMU_STATUS_EVENT_LOG_INT_SHIFT, &entry);
+    iommu_set_bit(&entry, IOMMU_STATUS_EVENT_LOG_INT_SHIFT);
+
     writel(entry, iommu->mmio_base+IOMMU_STATUS_MMIO_OFFSET);
     spin_unlock_irqrestore(&iommu->lock, flags);
 }
@@ -590,6 +592,7 @@ static void enable_iommu(struct amd_iomm
     iommu_msi_set_affinity(irq_to_desc(iommu->irq), &cpu_online_map);
     amd_iommu_msi_enable(iommu, IOMMU_CONTROL_ENABLED);
 
+    set_iommu_ht_flags(iommu);
     set_iommu_command_buffer_control(iommu, IOMMU_CONTROL_ENABLED);
     set_iommu_event_log_control(iommu, IOMMU_CONTROL_ENABLED);
     set_iommu_translation_control(iommu, IOMMU_CONTROL_ENABLED);
diff -r 60d51bc20139 -r c75cf540a1fe xen/include/asm-x86/amd-iommu.h
--- a/xen/include/asm-x86/amd-iommu.h	Wed Nov 09 16:20:02 2011 +0100
+++ b/xen/include/asm-x86/amd-iommu.h	Wed Nov 09 16:20:03 2011 +0100
@@ -57,11 +57,7 @@ struct amd_iommu {
     u8 ht_tunnel_support;
     u8 iotlb_support;
 
-    u8 isochronous;
-    u8 coherent;
-    u8 res_pass_pw;
-    u8 pass_pw;
-    u8 ht_tunnel_enable;
+    u8 ht_flags;
 
     void *mmio_base;
     unsigned long mmio_base_phys;
diff -r 60d51bc20139 -r c75cf540a1fe xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Wed Nov 09 16:20:02 2011 +0100
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Wed Nov 09 16:20:03 2011 +0100
@@ -166,4 +166,19 @@ static inline void __free_amd_iommu_tabl
     free_xenheap_pages(table, order);
 }
 
+static inline void iommu_set_bit(uint32_t *reg, uint32_t bit)
+{
+    set_field_in_reg_u32(IOMMU_CONTROL_ENABLED, *reg, 1U << bit, bit, reg);
+}
+
+static inline void iommu_clear_bit(uint32_t *reg, uint32_t bit)
+{
+    set_field_in_reg_u32(IOMMU_CONTROL_DISABLED, *reg, 1U << bit, bit, reg);
+}
+
+static inline uint32_t iommu_get_bit(uint32_t reg, uint32_t bit)
+{
+    return get_field_from_reg_u32(reg, 1U << bit, bit);
+}
+
 #endif /* _ASM_X86_64_AMD_IOMMU_PROTO_H */


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 07:56:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 07:56:00 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROAVL-0007Jz-HL; Wed, 09 Nov 2011 07:55:59 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROARL-0005sd-UZ
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 07:51:52 -0800
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1320853907!2881788!1
X-Originating-IP: [216.32.181.181]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20798 invoked from network); 9 Nov 2011 15:51:48 -0000
Received: from ch1ehsobe001.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.181)
	by server-4.tower-216.messagelabs.com with AES128-SHA encrypted SMTP;
	9 Nov 2011 15:51:48 -0000
Received: from mail102-ch1-R.bigfish.com (10.43.68.252) by
	CH1EHSOBE003.bigfish.com (10.43.70.53) with Microsoft SMTP Server id
	14.1.225.22; Wed, 9 Nov 2011 15:51:23 +0000
Received: from mail102-ch1 (localhost.localdomain [127.0.0.1])	by
	mail102-ch1-R.bigfish.com (Postfix) with ESMTP id 9B54F102036B;
	Wed,  9 Nov 2011 15:51:37 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzz8275bhz32i668h839h944h)
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
Received: from mail102-ch1 (localhost.localdomain [127.0.0.1]) by mail102-ch1
	(MessageSwitch) id 132085389561883_729;
	Wed,  9 Nov 2011 15:51:35 +0000 (UTC)
Received: from CH1EHSMHS020.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.251])	by mail102-ch1.bigfish.com (Postfix) with ESMTP id
	EE48831005E;	Wed,  9 Nov 2011 15:51:34 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	CH1EHSMHS020.bigfish.com (10.43.70.20) with Microsoft SMTP Server id
	14.1.225.22; Wed, 9 Nov 2011 15:51:40 +0000
X-WSS-ID: 0LUEHE1-02-7G1-02
X-M-MSG: 
Received: from sausexedgep01.amd.com (sausexedgep01-ext.amd.com
	[163.181.249.72])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 24F19C806E;	Wed,  9 Nov 2011 09:51:36 -0600 (CST)
Received: from sausexhtp02.amd.com (163.181.3.152) by sausexedgep01.amd.com
	(163.181.36.54) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Wed, 9 Nov 2011 09:52:38 -0600
Received: from storexhtp01.amd.com (172.24.4.3) by sausexhtp02.amd.com
	(163.181.3.152) with Microsoft SMTP Server (TLS) id 8.3.213.0;
	Wed, 9 Nov 2011 09:51:38 -0600
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp01.amd.com
	(172.24.4.3) with Microsoft SMTP Server id 8.3.213.0; Wed, 9 Nov 2011
	10:51:36 -0500
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 98F1349C58D; Wed,  9 Nov 2011
	15:51:35 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 8C931594882; Wed,  9 Nov 2011
	16:51:35 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 4769713326a876c25bdc0f9d1f90594f90fba9c5
Message-ID: <4769713326a876c25bdc.1320853856@gran.amd.com>
In-Reply-To: <patchbomb.1320853855@gran.amd.com>
References: <patchbomb.1320853855@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Wed, 9 Nov 2011 16:50:56 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <JBeulich@suse.com>
X-OriginatorOrg: amd.com
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 1 of 6] amd iommu: Use pci access function to
 detect msi capabilities
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Wei Wang <wei.wang2@amd.com>
# Date 1320841109 -3600
# Node ID 4769713326a876c25bdc0f9d1f90594f90fba9c5
# Parent  452d9143687f826a30d0e56b7ba3b9783fb6bf24
amd iommu: Use pci access function to detect msi capabilities.

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r 452d9143687f -r 4769713326a8 xen/drivers/passthrough/amd/iommu_detect.c
--- a/xen/drivers/passthrough/amd/iommu_detect.c	Tue Nov 08 11:26:53 2011 +0100
+++ b/xen/drivers/passthrough/amd/iommu_detect.c	Wed Nov 09 13:18:29 2011 +0100
@@ -30,38 +30,19 @@
 static int __init get_iommu_msi_capabilities(
     u16 seg, u8 bus, u8 dev, u8 func, struct amd_iommu *iommu)
 {
-    int cap_ptr, cap_id;
-    u32 cap_header;
+    int pos;
     u16 control;
-    int count = 0;
 
-    cap_ptr = pci_conf_read8(seg, bus, dev, func,
-            PCI_CAPABILITY_LIST);
+    pos = pci_find_cap_offset(seg, bus, dev, func, PCI_CAP_ID_MSI);
 
-    while ( cap_ptr >= PCI_MIN_CAP_OFFSET &&
-        count < PCI_MAX_CAP_BLOCKS )
-    {
-        cap_ptr &= PCI_CAP_PTR_MASK;
-        cap_header = pci_conf_read32(seg, bus, dev, func, cap_ptr);
-        cap_id = get_field_from_reg_u32(cap_header,
-                PCI_CAP_ID_MASK, PCI_CAP_ID_SHIFT);
-
-        if ( cap_id == PCI_CAP_ID_MSI )
-        {
-            iommu->msi_cap = cap_ptr;
-            break;
-        }
-        cap_ptr = get_field_from_reg_u32(cap_header,
-                PCI_CAP_NEXT_PTR_MASK, PCI_CAP_NEXT_PTR_SHIFT);
-        count++;
-    }
-
-    if ( !iommu->msi_cap )
+    if ( !pos )
         return -ENODEV;
 
-    AMD_IOMMU_DEBUG("Found MSI capability block \n");
+    AMD_IOMMU_DEBUG("Found MSI capability block at 0x%x\n", pos);
+
+    iommu->msi_cap = pos;
     control = pci_conf_read16(seg, bus, dev, func,
-            iommu->msi_cap + PCI_MSI_FLAGS);
+                              iommu->msi_cap + PCI_MSI_FLAGS);
     iommu->maskbit = control & PCI_MSI_FLAGS_MASKBIT;
     return 0;
 }


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 07:57:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 07:57:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROAWv-0007kk-PT; Wed, 09 Nov 2011 07:57:37 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROARU-0005uk-B5
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 07:52:00 -0800
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1320853916!3580407!1
X-Originating-IP: [65.55.88.12]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19074 invoked from network); 9 Nov 2011 15:51:57 -0000
Received: from tx2ehsobe002.messaging.microsoft.com (HELO
	TX2EHSOBE004.bigfish.com) (65.55.88.12)
	by server-8.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	9 Nov 2011 15:51:57 -0000
Received: from mail188-tx2-R.bigfish.com (10.9.14.239) by
	TX2EHSOBE004.bigfish.com (10.9.40.24) with Microsoft SMTP Server id
	14.1.225.22; Wed, 9 Nov 2011 15:51:31 +0000
Received: from mail188-tx2 (localhost.localdomain [127.0.0.1])	by
	mail188-tx2-R.bigfish.com (Postfix) with ESMTP id E3422CC0392;
	Wed,  9 Nov 2011 15:51:44 +0000 (UTC)
X-SpamScore: -3
X-BigFish: VPS-3(zz4015Lzz1202hzzz32i668h839h944h62h)
X-Spam-TCS-SCL: 1:0
X-Forefront-Antispam-Report: CIP:163.181.249.108; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp01.amd.com; RD:none; EFVD:NLI
X-FB-SS: 0,
Received: from mail188-tx2 (localhost.localdomain [127.0.0.1]) by mail188-tx2
	(MessageSwitch) id 132085389383306_23386;
	Wed,  9 Nov 2011 15:51:33 +0000 (UTC)
Received: from TX2EHSMHS047.bigfish.com (unknown [10.9.14.244])	by
	mail188-tx2.bigfish.com (Postfix) with ESMTP id E96E242004B;
	Wed,  9 Nov 2011 15:51:32 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	TX2EHSMHS047.bigfish.com (10.9.99.147) with Microsoft SMTP Server id
	14.1.225.22; Wed, 9 Nov 2011 15:51:16 +0000
X-WSS-ID: 0LUEHE0-01-EWY-02
X-M-MSG: 
Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com
	[163.181.249.73])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp01.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 2CF5B1028011;	Wed,  9 Nov 2011 09:51:36 -0600 (CST)
Received: from SAUSEXDAG01.amd.com (163.181.55.1) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Wed, 9 Nov 2011 09:52:36 -0600
Received: from storexhtp02.amd.com (172.24.4.4) by sausexdag01.amd.com
	(163.181.55.1) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Wed, 9 Nov 2011 09:51:37 -0600
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.213.0; Wed, 9 Nov 2011
	10:51:36 -0500
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 9490249C1FF; Wed,  9 Nov 2011
	15:51:35 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 7B6945940FF; Wed,  9 Nov 2011
	16:51:35 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-ID: <patchbomb.1320853855@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Wed, 9 Nov 2011 16:50:55 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <JBeulich@suse.com>
X-OriginatorOrg: amd.com
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 0 of 6] amd iommu: cleanup codes
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Jan, 
This patch set cleanups amd iommu codes in many aspects without functional changes. Please apply them to unstable.
Thanks,
Wei


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 08:01:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 08:01:20 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROAaV-0008BR-1I; Wed, 09 Nov 2011 08:01:19 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROARv-00062T-6S
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 07:52:27 -0800
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1320853929!54369362!1
X-Originating-IP: [216.32.181.184]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11519 invoked from network); 9 Nov 2011 15:52:11 -0000
Received: from ch1ehsobe004.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.184)
	by server-15.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	9 Nov 2011 15:52:11 -0000
Received: from mail14-ch1-R.bigfish.com (10.43.68.254) by
	CH1EHSOBE002.bigfish.com (10.43.70.52) with Microsoft SMTP Server id
	14.1.225.22; Wed, 9 Nov 2011 15:51:59 +0000
Received: from mail14-ch1 (localhost.localdomain [127.0.0.1])	by
	mail14-ch1-R.bigfish.com (Postfix) with ESMTP id E11C51982B0;
	Wed,  9 Nov 2011 15:52:11 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzz8275bhz32i668h839h944h)
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
X-FB-SS: 0,13,
Received: from mail14-ch1 (localhost.localdomain [127.0.0.1]) by mail14-ch1
	(MessageSwitch) id 1320853893698027_22920;
	Wed,  9 Nov 2011 15:51:33 +0000 (UTC)
Received: from CH1EHSMHS023.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.240])	by mail14-ch1.bigfish.com (Postfix) with ESMTP id
	A5C91CF8050;	Wed,  9 Nov 2011 15:51:33 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	CH1EHSMHS023.bigfish.com (10.43.70.23) with Microsoft SMTP Server id
	14.1.225.22; Wed, 9 Nov 2011 15:51:42 +0000
X-WSS-ID: 0LUEHE4-02-7G7-02
X-M-MSG: 
Received: from sausexedgep01.amd.com (sausexedgep01-ext.amd.com
	[163.181.249.72])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 2DE74C8070;	Wed,  9 Nov 2011 09:51:39 -0600 (CST)
Received: from SAUSEXDAG01.amd.com (163.181.55.1) by sausexedgep01.amd.com
	(163.181.36.54) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Wed, 9 Nov 2011 09:52:41 -0600
Received: from storexhtp02.amd.com (172.24.4.4) by sausexdag01.amd.com
	(163.181.55.1) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Wed, 9 Nov 2011 09:51:41 -0600
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.213.0; Wed, 9 Nov 2011
	10:51:38 -0500
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 048CC49C626; Wed,  9 Nov 2011
	15:51:36 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id E1603594887; Wed,  9 Nov 2011
	16:51:35 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: fc109be12bf682299b47ea8ebb549afc6ac52952
Message-ID: <fc109be12bf682299b47.1320853861@gran.amd.com>
In-Reply-To: <patchbomb.1320853855@gran.amd.com>
References: <patchbomb.1320853855@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Wed, 9 Nov 2011 16:51:01 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <JBeulich@suse.com>
X-OriginatorOrg: amd.com
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 6 of 6] amd iommu: Introduce iommu_has_cap()
	function
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Wei Wang <wei.wang2@amd.com>
# Date 1320852003 -3600
# Node ID fc109be12bf682299b47ea8ebb549afc6ac52952
# Parent  c75cf540a1fe57a439f9cb0503bf69f120066b92
amd iommu: Introduce iommu_has_cap() function.
Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r c75cf540a1fe -r fc109be12bf6 xen/drivers/passthrough/amd/iommu_init.c
--- a/xen/drivers/passthrough/amd/iommu_init.c	Wed Nov 09 16:20:03 2011 +0100
+++ b/xen/drivers/passthrough/amd/iommu_init.c	Wed Nov 09 16:20:03 2011 +0100
@@ -79,9 +79,12 @@ static void set_iommu_ht_flags(struct am
     entry = readl(iommu->mmio_base + IOMMU_CONTROL_MMIO_OFFSET);
 
     /* Setup HT flags */
-    iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_HT_TUN_ENB_SHIFT) ?
+    if ( iommu_has_cap(iommu, PCI_CAP_HT_TUNNEL_SHIFT) )
+    {
+        iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_HT_TUN_ENB_SHIFT) ?
         iommu_set_bit(&entry, IOMMU_CONTROL_HT_TUNNEL_TRANSLATION_SHIFT):
         iommu_clear_bit(&entry, IOMMU_CONTROL_HT_TUNNEL_TRANSLATION_SHIFT);
+    }
 
     iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_RES_PASS_PW_SHIFT) ?
         iommu_set_bit(&entry, IOMMU_CONTROL_RESP_PASS_POSTED_WRITE_SHIFT):
diff -r c75cf540a1fe -r fc109be12bf6 xen/drivers/passthrough/amd/iommu_map.c
--- a/xen/drivers/passthrough/amd/iommu_map.c	Wed Nov 09 16:20:03 2011 +0100
+++ b/xen/drivers/passthrough/amd/iommu_map.c	Wed Nov 09 16:20:03 2011 +0100
@@ -996,7 +996,7 @@ void amd_iommu_flush_iotlb(struct pci_de
         return;
     }
 
-    if ( !iommu->iotlb_support )
+    if ( !iommu_has_cap(iommu, PCI_CAP_IOTLB_SHIFT) )
         return;
 
     req_id = get_dma_requestor_id(iommu->seg, bdf);
diff -r c75cf540a1fe -r fc109be12bf6 xen/drivers/passthrough/amd/pci_amd_iommu.c
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c	Wed Nov 09 16:20:03 2011 +0100
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c	Wed Nov 09 16:20:03 2011 +0100
@@ -115,7 +115,7 @@ static void amd_iommu_setup_domain_devic
             hd->paging_mode, valid);
 
         if ( pci_ats_device(iommu->seg, bus, devfn) &&
-             iommu->iotlb_support )
+             iommu_has_cap(iommu, PCI_CAP_IOTLB_SHIFT) )
             iommu_dte_set_iotlb((u32 *)dte, dte_i);
 
         invalidate_dev_table_entry(iommu, req_id);
@@ -307,7 +307,7 @@ void amd_iommu_disable_domain_device(str
         disable_translation((u32 *)dte);
 
         if ( pci_ats_device(iommu->seg, bus, devfn) &&
-             iommu->iotlb_support )
+             iommu_has_cap(iommu, PCI_CAP_IOTLB_SHIFT) )
             iommu_dte_set_iotlb((u32 *)dte, 0);
 
         invalidate_dev_table_entry(iommu, req_id);
diff -r c75cf540a1fe -r fc109be12bf6 xen/include/asm-x86/amd-iommu.h
--- a/xen/include/asm-x86/amd-iommu.h	Wed Nov 09 16:20:03 2011 +0100
+++ b/xen/include/asm-x86/amd-iommu.h	Wed Nov 09 16:20:03 2011 +0100
@@ -53,10 +53,6 @@ struct amd_iommu {
     u16 cap_offset;
     iommu_cap_t cap;
 
-    u8 pte_not_present_cached;
-    u8 ht_tunnel_support;
-    u8 iotlb_support;
-
     u8 ht_flags;
 
     void *mmio_base;
diff -r c75cf540a1fe -r fc109be12bf6 xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Wed Nov 09 16:20:03 2011 +0100
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Wed Nov 09 16:20:03 2011 +0100
@@ -181,4 +181,10 @@ static inline uint32_t iommu_get_bit(uin
     return get_field_from_reg_u32(reg, 1U << bit, bit);
 }
 
+static inline int iommu_has_cap(struct amd_iommu *iommu, uint32_t bit)
+{
+    u32 mask = (1U << bit) & 0xffffffff;
+    return iommu->cap.header & mask;
+}
+
 #endif /* _ASM_X86_64_AMD_IOMMU_PROTO_H */


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 08:04:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 08:04:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROAdX-00009a-4a; Wed, 09 Nov 2011 08:04:27 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROAWo-0007iq-59
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 07:57:30 -0800
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1320854245!3575612!1
X-Originating-IP: [65.55.88.13]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9534 invoked from network); 9 Nov 2011 15:57:27 -0000
Received: from tx2ehsobe003.messaging.microsoft.com (HELO
	TX2EHSOBE006.bigfish.com) (65.55.88.13)
	by server-6.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	9 Nov 2011 15:57:27 -0000
Received: from mail184-tx2-R.bigfish.com (10.9.14.241) by
	TX2EHSOBE006.bigfish.com (10.9.40.26) with Microsoft SMTP Server id
	14.1.225.22; Wed, 9 Nov 2011 15:51:51 +0000
Received: from mail184-tx2 (localhost.localdomain [127.0.0.1])	by
	mail184-tx2-R.bigfish.com (Postfix) with ESMTP id B1999330094;
	Wed,  9 Nov 2011 15:52:04 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzz8275bhz32i668h839h944h61h)
X-Spam-TCS-SCL: 0:0
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
X-FB-SS: 0,
Received: from mail184-tx2 (localhost.localdomain [127.0.0.1]) by mail184-tx2
	(MessageSwitch) id 1320853891101748_29480;
	Wed,  9 Nov 2011 15:51:31 +0000 (UTC)
Received: from TX2EHSMHS031.bigfish.com (unknown [10.9.14.254])	by
	mail184-tx2.bigfish.com (Postfix) with ESMTP id 004FDA1805A;
	Wed,  9 Nov 2011 15:51:31 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	TX2EHSMHS031.bigfish.com (10.9.99.131) with Microsoft SMTP Server id
	14.1.225.22; Wed, 9 Nov 2011 15:51:17 +0000
X-WSS-ID: 0LUEHE2-02-7G2-02
X-M-MSG: 
Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com
	[163.181.249.73])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 2D3B4C8073;	Wed,  9 Nov 2011 09:51:37 -0600 (CST)
Received: from SAUSEXDAG01.amd.com (163.181.55.1) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Wed, 9 Nov 2011 09:52:38 -0600
Received: from storexhtp02.amd.com (172.24.4.4) by sausexdag01.amd.com
	(163.181.55.1) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Wed, 9 Nov 2011 09:51:39 -0600
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.213.0; Wed, 9 Nov 2011
	10:51:36 -0500
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id AB8A349C58F; Wed,  9 Nov 2011
	15:51:35 +0000 (GMT)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 98EE0594883; Wed,  9 Nov 2011
	16:51:35 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 4b115815bc13e4f2a3a178f3de7477ecf46cb44b
Message-ID: <4b115815bc13e4f2a3a1.1320853857@gran.amd.com>
In-Reply-To: <patchbomb.1320853855@gran.amd.com>
References: <patchbomb.1320853855@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Wed, 9 Nov 2011 16:50:57 +0100
From: Wei Wang <wei.wang2@amd.com>
To: <JBeulich@suse.com>
X-OriginatorOrg: amd.com
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 2 of 6] amd iommu: Cleanup iommu pci capabilites
	detection
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Wei Wang <wei.wang2@amd.com>
# Date 1320851997 -3600
# Node ID 4b115815bc13e4f2a3a178f3de7477ecf46cb44b
# Parent  4769713326a876c25bdc0f9d1f90594f90fba9c5
amd iommu: Cleanup iommu pci capabilites detection.
* Define new structure to represent capability block.
* Remove unnecessary read for unused information.
* Add sanity check into get_iommu_capabilities.
* iommu capability offset is 16 bit not 8 bit, fix that.

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r 4769713326a8 -r 4b115815bc13 xen/drivers/passthrough/amd/iommu_detect.c
--- a/xen/drivers/passthrough/amd/iommu_detect.c	Wed Nov 09 13:18:29 2011 +0100
+++ b/xen/drivers/passthrough/amd/iommu_detect.c	Wed Nov 09 16:19:57 2011 +0100
@@ -48,25 +48,16 @@ static int __init get_iommu_msi_capabili
 }
 
 static int __init get_iommu_capabilities(
-    u16 seg, u8 bus, u8 dev, u8 func, u8 cap_ptr, struct amd_iommu *iommu)
+    u16 seg, u8 bus, u8 dev, u8 func, u16 cap_ptr, struct amd_iommu *iommu)
 {
-    u32 cap_header, cap_range, misc_info;
+    u8 type;
 
-    cap_header = pci_conf_read32(seg, bus, dev, func, cap_ptr);
-    iommu->revision = get_field_from_reg_u32(
-        cap_header, PCI_CAP_REV_MASK, PCI_CAP_REV_SHIFT);
-    iommu->pte_not_present_cached = get_field_from_reg_u32(
-        cap_header, PCI_CAP_NP_CACHE_MASK, PCI_CAP_NP_CACHE_SHIFT);
+    iommu->cap.header = pci_conf_read32(seg, bus, dev, func, cap_ptr);
+    type = get_field_from_reg_u32(iommu->cap.header, PCI_CAP_TYPE_MASK, 
+                                  PCI_CAP_TYPE_SHIFT);
 
-    cap_range = pci_conf_read32(seg, bus, dev, func,
-                                cap_ptr + PCI_CAP_RANGE_OFFSET);
-    iommu->unit_id = get_field_from_reg_u32(
-        cap_range, PCI_CAP_UNIT_ID_MASK, PCI_CAP_UNIT_ID_SHIFT);
-
-    misc_info = pci_conf_read32(seg, bus, dev, func,
-                                cap_ptr + PCI_MISC_INFO_OFFSET);
-    iommu->msi_number = get_field_from_reg_u32(
-        misc_info, PCI_CAP_MSI_NUMBER_MASK, PCI_CAP_MSI_NUMBER_SHIFT);
+    if ( type != PCI_CAP_TYPE_IOMMU )
+        return -ENODEV;
 
     return 0;
 }
@@ -76,6 +67,7 @@ int __init amd_iommu_detect_one_acpi(voi
     struct amd_iommu *iommu;
     u8 bus, dev, func;
     struct acpi_ivhd_block_header *ivhd_block;
+    int rt = 0;
 
     ivhd_block = (struct acpi_ivhd_block_header *)ivhd;
 
@@ -125,12 +117,19 @@ int __init amd_iommu_detect_one_acpi(voi
     iommu->ht_tunnel_enable = get_field_from_byte(ivhd_block->header.flags,
                         AMD_IOMMU_ACPI_HT_TUN_ENB_MASK,
                         AMD_IOMMU_ACPI_HT_TUN_ENB_SHIFT);
-    bus = iommu->bdf >> 8;
-    dev = PCI_SLOT(iommu->bdf & 0xFF);
-    func = PCI_FUNC(iommu->bdf & 0xFF);
-    get_iommu_capabilities(iommu->seg, bus, dev, func,
-                           iommu->cap_offset, iommu);
-    get_iommu_msi_capabilities(iommu->seg, bus, dev, func, iommu);
+
+    bus = PCI_BUS(iommu->bdf);
+    dev = PCI_SLOT(iommu->bdf);
+    func = PCI_FUNC(iommu->bdf);
+
+    rt = get_iommu_capabilities(iommu->seg, bus, dev, func,
+                                iommu->cap_offset, iommu);
+    if ( rt )
+        return -ENODEV;
+
+    rt = get_iommu_msi_capabilities(iommu->seg, bus, dev, func, iommu);
+    if ( rt )
+        return -ENODEV;
 
     list_add_tail(&iommu->list, &amd_iommu_head);
 
diff -r 4769713326a8 -r 4b115815bc13 xen/include/asm-x86/amd-iommu.h
--- a/xen/include/asm-x86/amd-iommu.h	Wed Nov 09 13:18:29 2011 +0100
+++ b/xen/include/asm-x86/amd-iommu.h	Wed Nov 09 16:19:57 2011 +0100
@@ -36,16 +36,22 @@ struct table_struct {
     unsigned long alloc_size;
 };
 
+typedef struct iommu_cap {
+    uint32_t header;                    /* offset 00h */
+    uint32_t base_low;                  /* offset 04h */
+    uint32_t base_hi;                   /* offset 08h */
+    uint32_t range;                     /* offset 0Ch */
+    uint32_t misc;                      /* offset 10h */
+} iommu_cap_t;
+
 struct amd_iommu {
     struct list_head list;
     spinlock_t lock; /* protect iommu */
 
     u16 seg;
     u16 bdf;
-    u8  cap_offset;
-    u8  revision;
-    u8  unit_id;
-    u8  msi_number;
+    u16 cap_offset;
+    iommu_cap_t cap;
 
     u8 pte_not_present_cached;
     u8 ht_tunnel_support;
diff -r 4769713326a8 -r 4b115815bc13 xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Wed Nov 09 13:18:29 2011 +0100
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Wed Nov 09 16:19:57 2011 +0100
@@ -74,7 +74,7 @@
 
 #define PCI_CAP_UNIT_ID_MASK    0x0000001F
 #define PCI_CAP_UNIT_ID_SHIFT   0
-#define PCI_MISC_INFO_OFFSET    0x10
+#define PCI_CAP_MISC_INFO_OFFSET    0x10
 #define PCI_CAP_MSI_NUMBER_MASK     0x0000001F
 #define PCI_CAP_MSI_NUMBER_SHIFT    0
 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 08:12:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 08:12:55 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROAli-0001LG-RX; Wed, 09 Nov 2011 08:12:54 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROAaT-0008BA-8n
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:01:24 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1320854442!43279790!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11671 invoked from network); 9 Nov 2011 16:00:43 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-10.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 16:00:43 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA9G17j5019996
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 16:01:08 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA9G15bZ000302
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 16:01:06 GMT
Received: from abhmt110.oracle.com (abhmt110.oracle.com [141.146.116.62])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA9G10U4006263; Wed, 9 Nov 2011 10:01:01 -0600
Received: from [10.154.43.72] (/10.154.43.72)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 08:00:58 -0800
Message-ID: <4EBAA3B1.8010401@oracle.com>
Date: Thu, 10 Nov 2011 00:00:49 +0800
From: annie li <annie.li@oracle.com>
Organization: Oracle Corporation
User-Agent: Thunderbird 1.5.0.9 (Windows/20061207)
MIME-Version: 1.0
To: Paul Durrant <Paul.Durrant@citrix.com>
Subject: Re: [Xen-devel] RE: [PATCH 1/3] Introducing grant table V2 stucture
References: <4EBA35D3.3020506@oracle.com>	<1320826490-29362-1-git-send-email-annie.li@oracle.com>	<291EDFCB1E9E224A99088639C4762022B4543AB1BD@LONPMAILBOX01.citrite.net>	<20111109144922.GC8410@phenom.dumpdata.com>
	<291EDFCB1E9E224A99088639C4762022B4543AB204@LONPMAILBOX01.citrite.net>
In-Reply-To: <291EDFCB1E9E224A99088639C4762022B4543AB204@LONPMAILBOX01.citrite.net>
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090205.4EBAA3C5.001C,ss=1,re=0.000,fgs=0
Cc: "kurt.hackel@oracle.com" <kurt.hackel@oracle.com>,
	"jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0664551692=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============0664551692==
Content-Type: multipart/alternative;
	boundary="------------090207080908050300060005"

This is a multi-part message in MIME format.
--------------090207080908050300060005
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Maybe addr or gnttab_addr?

Thanks
Annie

On 2011-11-9 22:56, Paul Durrant wrote:
> I'd be happy with 'addr' or 'opaque' or somesuch if 'raw' is distasteful.
>
>   Paul
>
>   
>> -----Original Message-----
>> From: Konrad Rzeszutek Wilk [mailto:konrad.wilk@oracle.com]
>> Sent: 09 November 2011 14:49
>> To: Paul Durrant
>> Cc: annie.li@oracle.com; xen-devel@lists.xensource.com; linux-
>> kernel@vger.kernel.org; jeremy@goop.org; kurt.hackel@oracle.com
>> Subject: Re: [PATCH 1/3] Introducing grant table V2 stucture
>>
>> On Wed, Nov 09, 2011 at 11:11:22AM +0000, Paul Durrant wrote:
>>     
>>> Annie,
>>>
>>>   Comments inline below...
>>>
>>>       
>>>> -----Original Message-----
>>>>         
>>> [snip]
>>>       
>>>> -static struct grant_entry *shared;
>>>> +static union {
>>>> +	struct grant_entry_v1 *v1;
>>>> +	void *ring_addr;
>>>> +} shared;
>>>> +
>>>>         
>>> 'ring_addr' seems like the wrong name here; how about 'raw'?
>>>       
>> Or 'ring'. I asked Annie to change it from 'raw' to something else
>> and the first thing that came in my mind was 'ring_addr'. But this
>> does not point to a ring, so the 'ring' part is wrong.
>>
>> Point here is to make it descriptive. 'raw' does not carry meaning
>> of _what_ it is suppose to do.
>>     
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>   

--------------090207080908050300060005
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
  <title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
Maybe addr or gnttab_addr?<br>
<br>
Thanks<br>
Annie<br>
<br>
On 2011-11-9 22:56, Paul Durrant wrote:
<blockquote
 cite="mid291EDFCB1E9E224A99088639C4762022B4543AB204@LONPMAILBOX01.citrite.net"
 type="cite">
  <pre wrap="">I'd be happy with 'addr' or 'opaque' or somesuch if 'raw' is distasteful.

  Paul

  </pre>
  <blockquote type="cite">
    <pre wrap="">-----Original Message-----
From: Konrad Rzeszutek Wilk [<a class="moz-txt-link-freetext" href="mailto:konrad.wilk@oracle.com">mailto:konrad.wilk@oracle.com</a>]
Sent: 09 November 2011 14:49
To: Paul Durrant
Cc: <a class="moz-txt-link-abbreviated" href="mailto:annie.li@oracle.com">annie.li@oracle.com</a>; <a class="moz-txt-link-abbreviated" href="mailto:xen-devel@lists.xensource.com">xen-devel@lists.xensource.com</a>; linux-
<a class="moz-txt-link-abbreviated" href="mailto:kernel@vger.kernel.org">kernel@vger.kernel.org</a>; <a class="moz-txt-link-abbreviated" href="mailto:jeremy@goop.org">jeremy@goop.org</a>; <a class="moz-txt-link-abbreviated" href="mailto:kurt.hackel@oracle.com">kurt.hackel@oracle.com</a>
Subject: Re: [PATCH 1/3] Introducing grant table V2 stucture

On Wed, Nov 09, 2011 at 11:11:22AM +0000, Paul Durrant wrote:
    </pre>
    <blockquote type="cite">
      <pre wrap="">Annie,

  Comments inline below...

      </pre>
      <blockquote type="cite">
        <pre wrap="">-----Original Message-----
        </pre>
      </blockquote>
      <pre wrap="">[snip]
      </pre>
      <blockquote type="cite">
        <pre wrap="">-static struct grant_entry *shared;
+static union {
+	struct grant_entry_v1 *v1;
+	void *ring_addr;
+} shared;
+
        </pre>
      </blockquote>
      <pre wrap="">'ring_addr' seems like the wrong name here; how about 'raw'?
      </pre>
    </blockquote>
    <pre wrap="">Or 'ring'. I asked Annie to change it from 'raw' to something else
and the first thing that came in my mind was 'ring_addr'. But this
does not point to a ring, so the 'ring' part is wrong.

Point here is to make it descriptive. 'raw' does not carry meaning
of _what_ it is suppose to do.
    </pre>
  </blockquote>
  <pre wrap=""><!---->
_______________________________________________
Xen-devel mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Xen-devel@lists.xensource.com">Xen-devel@lists.xensource.com</a>
<a class="moz-txt-link-freetext" href="http://lists.xensource.com/xen-devel">http://lists.xensource.com/xen-devel</a>
  </pre>
</blockquote>
</body>
</html>

--------------090207080908050300060005--


--===============0664551692==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0664551692==--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 08:16:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 08:16:06 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROAon-0001y4-2Z; Wed, 09 Nov 2011 08:16:05 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROAhU-0000dm-4X
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:08:38 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320854874!45264279!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13557 invoked from network); 9 Nov 2011 16:07:55 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 16:07:55 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA9G8Okj026161
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 16:08:24 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA9G8McA011433
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 16:08:23 GMT
Received: from abhmt113.oracle.com (abhmt113.oracle.com [141.146.116.65])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA9G8HNZ014534; Wed, 9 Nov 2011 10:08:17 -0600
Received: from [10.154.43.72] (/10.154.43.72)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 08:08:15 -0800
Message-ID: <4EBAA566.80909@oracle.com>
Date: Thu, 10 Nov 2011 00:08:06 +0800
From: annie li <annie.li@oracle.com>
Organization: Oracle Corporation
User-Agent: Thunderbird 1.5.0.9 (Windows/20061207)
MIME-Version: 1.0
To: Paul Durrant <Paul.Durrant@citrix.com>
References: <4EBA35D3.3020506@oracle.com>
	<1320826490-29362-1-git-send-email-annie.li@oracle.com>
	<291EDFCB1E9E224A99088639C4762022B4543AB1BD@LONPMAILBOX01.citrite.net>
In-Reply-To: <291EDFCB1E9E224A99088639C4762022B4543AB1BD@LONPMAILBOX01.citrite.net>
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090202.4EBAA579.0094,ss=1,re=-2.300,fgs=0
Cc: "kurt.hackel@oracle.com" <kurt.hackel@oracle.com>,
	"jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"konrad.wilk@oracle.com" <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH 1/3] Introducing grant table V2 stucture
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1887570781=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============1887570781==
Content-Type: multipart/alternative;
	boundary="------------010104080206070704040901"

This is a multi-part message in MIME format.
--------------010104080206070704040901
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Thanks, Paul. See following,

On 2011-11-9 19:11, Paul Durrant wrote:
>  
>   
>> +/*
>> + * This function is null for grant table v1, adding it here in
>> order to
>> +keep
>> + * consistent with *_v2 interface.
>> + */
>> +static int gnttab_map_status_v1(unsigned int nr_gframes);
>> +/*
>> + * This function is null for grant table v1, adding it here in
>> order to
>> +keep
>> + * consistent with *_v2 interface.
>> + */
>> +static void gnttab_unmap_status_v1(void);
>> +
>>     
>
> I don't really like the idea of having null operations. How about abstracting at the level of gnttab_map/unmap so that you can include the status mapping for v2 but just do the arch_gnttab_map_shared for v1?
>   
I see. v2 function includes mapping and arch_gnttab_map_shared, v1 
function only include arch_gnttab_map_sh, right? This will lead to some 
code duplicated in two functions. 
>   
>> +/*This is a structure of function pointers for grant table v1*/
>> static
>> +struct {
>> +	/*
>> +	 * Mapping a list of frames for storing grant entry status,
>> this
>> +	 * mechanism can allow better synchronization using barriers.
>> Input
>> +	 * parameter is frame number, returning GNTST_okay means
>> success and
>> +	 * negative value means failure.
>> +	 */
>> +	int (*_gnttab_map_status)(unsigned int);
>> +	/*
>> +	 * Release a list of frames which are mapped in
>> _gnttab_map_status for
>> +	 * grant entry status.
>> +	 */
>> +	void (*_gnttab_unmap_status)(void);
>> +	/*
>> +	 * Introducing a valid entry into the grant table, granting
>> the frame
>> +	 * of this grant entry to domain for accessing, or
>> transfering, or
>> +	 * transitively accessing. First input parameter is reference
>> of this
>> +	 * introduced grant entry, second one is domid of granted
>> domain, third
>> +	 * one is the frame to be granted, and the last one is status
>> of the
>> +	 * grant entry to be updated.
>> +	 */
>> +	void (*_update_grant_entry)(grant_ref_t, domid_t,
>> +		unsigned long, unsigned);
>> +	/*
>> +	 * Stop granting a grant entry to domain for accessing. First
>> input
>> +	 * parameter is reference of a grant entry whose grant access
>> will be
>> +	 * stopped, second one is not in use now. If the grant entry
>> is
>> +	 * currently mapped for reading or writing, just return
>> failure(==0)
>> +	 * directly and don't tear down the grant access. Otherwise,
>> stop grant
>> +	 * access for this entry and return success(==1).
>> +	 */
>> +	int (*_gnttab_end_foreign_access_ref)(grant_ref_t, int);
>> +	/*
>> +	 * Stop granting a grant entry to domain for transfer. If
>> tranfer has
>> +	 * not started, just reclaim the grant entry and return
>> failure(==0).
>> +	 * Otherwise, wait for the transfer to complete and then
>> return the
>> +	 * frame.
>> +	 */
>> +	unsigned long
>> (*_gnttab_end_foreign_transfer_ref)(grant_ref_t);
>> +	/*
>> +	 * Query the status of a grant entry. Input parameter is
>> reference of
>> +	 * queried grant entry, return value is the status of queried
>> entry.
>> +	 * Detailed status(writing/reading) can be gotten from the
>> return value
>> +	 * by bit operations.
>> +	 */
>> +	int (*_gnttab_query_foreign_access)(grant_ref_t);
>> +} gnttab_interface;
>> +
>>     
>
> Why the leading '_' in the names?
>   
Just in order to differ those function pointers from the original functions.
>   
>> +static int grant_table_version;
>>
>>  static struct gnttab_free_callback *gnttab_free_callback_list;
>>
>> @@ -142,6 +207,15 @@ static void put_free_entry(grant_ref_t ref)
>>  	spin_unlock_irqrestore(&gnttab_list_lock, flags);  }
>>
>> +static void update_grant_entry_v1(grant_ref_t ref, domid_t domid,
>> +				  unsigned long frame, unsigned flags) {
>> +	shared.v1[ref].frame = frame;
>> +	shared.v1[ref].domid = domid;
>> +	wmb();
>> +	shared.v1[ref].flags = flags;
>> +}
>> +
>>  static void update_grant_entry(grant_ref_t ref, domid_t domid,
>>  			       unsigned long frame, unsigned flags)  {
>> @@ -155,12 +229,10 @@ static void update_grant_entry(grant_ref_t
>> ref, domid_t domid,
>>  	 *  3. Write memory barrier (WMB).
>>  	 *  4. Write ent->flags, inc. valid type.
>>  	 */
>>     
>
> The comment above probably should be moved into the v1 function itself since the v2 code differs.
>   
Yes, you are right. Comments for v2 should be added too.

Thanks
Annie
>   
>> -	shared[ref].frame = frame;
>> -	shared[ref].domid = domid;
>> -	wmb();
>> -	shared[ref].flags = flags;
>> +	gnttab_interface._update_grant_entry(ref, domid, frame,
>> flags);
>>  }
>>     
> [snip]
>
>   Paul
>   

--------------010104080206070704040901
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Thanks, Paul. See following,<br>
<br>
On 2011-11-9 19:11, Paul Durrant wrote:
<blockquote
 cite="mid291EDFCB1E9E224A99088639C4762022B4543AB1BD@LONPMAILBOX01.citrite.net"
 type="cite">
  <pre wrap=""> 
  </pre>
  <blockquote type="cite">
    <pre wrap="">+/*
+ * This function is null for grant table v1, adding it here in
order to
+keep
+ * consistent with *_v2 interface.
+ */
+static int gnttab_map_status_v1(unsigned int nr_gframes);
+/*
+ * This function is null for grant table v1, adding it here in
order to
+keep
+ * consistent with *_v2 interface.
+ */
+static void gnttab_unmap_status_v1(void);
+
    </pre>
  </blockquote>
  <pre wrap=""><!---->
I don't really like the idea of having null operations. How about abstracting at the level of gnttab_map/unmap so that you can include the status mapping for v2 but just do the arch_gnttab_map_shared for v1?
  </pre>
</blockquote>
I see. v2 function includes mapping and arch_gnttab_map_shared, v1
function only include arch_gnttab_map_sh, right? This will lead to some
code duplicated in two functions.&nbsp;
<blockquote
 cite="mid291EDFCB1E9E224A99088639C4762022B4543AB1BD@LONPMAILBOX01.citrite.net"
 type="cite">
  <pre wrap="">
  </pre>
  <blockquote type="cite">
    <pre wrap="">+/*This is a structure of function pointers for grant table v1*/
static
+struct {
+	/*
+	 * Mapping a list of frames for storing grant entry status,
this
+	 * mechanism can allow better synchronization using barriers.
Input
+	 * parameter is frame number, returning GNTST_okay means
success and
+	 * negative value means failure.
+	 */
+	int (*_gnttab_map_status)(unsigned int);
+	/*
+	 * Release a list of frames which are mapped in
_gnttab_map_status for
+	 * grant entry status.
+	 */
+	void (*_gnttab_unmap_status)(void);
+	/*
+	 * Introducing a valid entry into the grant table, granting
the frame
+	 * of this grant entry to domain for accessing, or
transfering, or
+	 * transitively accessing. First input parameter is reference
of this
+	 * introduced grant entry, second one is domid of granted
domain, third
+	 * one is the frame to be granted, and the last one is status
of the
+	 * grant entry to be updated.
+	 */
+	void (*_update_grant_entry)(grant_ref_t, domid_t,
+		unsigned long, unsigned);
+	/*
+	 * Stop granting a grant entry to domain for accessing. First
input
+	 * parameter is reference of a grant entry whose grant access
will be
+	 * stopped, second one is not in use now. If the grant entry
is
+	 * currently mapped for reading or writing, just return
failure(==0)
+	 * directly and don't tear down the grant access. Otherwise,
stop grant
+	 * access for this entry and return success(==1).
+	 */
+	int (*_gnttab_end_foreign_access_ref)(grant_ref_t, int);
+	/*
+	 * Stop granting a grant entry to domain for transfer. If
tranfer has
+	 * not started, just reclaim the grant entry and return
failure(==0).
+	 * Otherwise, wait for the transfer to complete and then
return the
+	 * frame.
+	 */
+	unsigned long
(*_gnttab_end_foreign_transfer_ref)(grant_ref_t);
+	/*
+	 * Query the status of a grant entry. Input parameter is
reference of
+	 * queried grant entry, return value is the status of queried
entry.
+	 * Detailed status(writing/reading) can be gotten from the
return value
+	 * by bit operations.
+	 */
+	int (*_gnttab_query_foreign_access)(grant_ref_t);
+} gnttab_interface;
+
    </pre>
  </blockquote>
  <pre wrap=""><!---->
Why the leading '_' in the names?
  </pre>
</blockquote>
Just in order to differ those function pointers from the original
functions.<br>
<blockquote
 cite="mid291EDFCB1E9E224A99088639C4762022B4543AB1BD@LONPMAILBOX01.citrite.net"
 type="cite">
  <pre wrap="">
  </pre>
  <blockquote type="cite">
    <pre wrap="">+static int grant_table_version;

 static struct gnttab_free_callback *gnttab_free_callback_list;

@@ -142,6 +207,15 @@ static void put_free_entry(grant_ref_t ref)
 	spin_unlock_irqrestore(&amp;gnttab_list_lock, flags);  }

+static void update_grant_entry_v1(grant_ref_t ref, domid_t domid,
+				  unsigned long frame, unsigned flags) {
+	shared.v1[ref].frame = frame;
+	shared.v1[ref].domid = domid;
+	wmb();
+	shared.v1[ref].flags = flags;
+}
+
 static void update_grant_entry(grant_ref_t ref, domid_t domid,
 			       unsigned long frame, unsigned flags)  {
@@ -155,12 +229,10 @@ static void update_grant_entry(grant_ref_t
ref, domid_t domid,
 	 *  3. Write memory barrier (WMB).
 	 *  4. Write ent-&gt;flags, inc. valid type.
 	 */
    </pre>
  </blockquote>
  <pre wrap=""><!---->
The comment above probably should be moved into the v1 function itself since the v2 code differs.
  </pre>
</blockquote>
Yes, you are right. Comments for v2 should be added too.<br>
<br>
Thanks<br>
Annie<br>
<blockquote
 cite="mid291EDFCB1E9E224A99088639C4762022B4543AB1BD@LONPMAILBOX01.citrite.net"
 type="cite">
  <pre wrap="">
  </pre>
  <blockquote type="cite">
    <pre wrap="">-	shared[ref].frame = frame;
-	shared[ref].domid = domid;
-	wmb();
-	shared[ref].flags = flags;
+	gnttab_interface._update_grant_entry(ref, domid, frame,
flags);
 }
    </pre>
  </blockquote>
  <pre wrap=""><!---->[snip]

  Paul
  </pre>
</blockquote>
</body>
</html>

--------------010104080206070704040901--


--===============1887570781==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1887570781==--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 08:17:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 08:17:50 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROAqU-0002M6-18; Wed, 09 Nov 2011 08:17:50 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROAjT-00015O-Cd
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:10:39 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1320855030!2902594!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21568 invoked from network); 9 Nov 2011 16:10:32 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-14.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 9 Nov 2011 16:10:32 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA9GAMXR001142
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 16:10:22 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA9GALlR028933
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 16:10:21 GMT
Received: from abhmt103.oracle.com (abhmt103.oracle.com [141.146.116.55])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA9GAGxp019325; Wed, 9 Nov 2011 10:10:16 -0600
Received: from [10.154.43.72] (/10.154.43.72)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 08:10:15 -0800
Message-ID: <4EBAA5DD.3060103@oracle.com>
Date: Thu, 10 Nov 2011 00:10:05 +0800
From: annie li <annie.li@oracle.com>
Organization: Oracle Corporation
User-Agent: Thunderbird 1.5.0.9 (Windows/20061207)
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] RE: [PATCH 3/3] code clean up
References: <4EBA35D3.3020506@oracle.com>	
	<1320826574-29427-1-git-send-email-annie.li@oracle.com>	
	<291EDFCB1E9E224A99088639C4762022B4543AB1BE@LONPMAILBOX01.citrite.net>
	<1320841103.955.120.camel@zakaz.uk.xensource.com>
In-Reply-To: <1320841103.955.120.camel@zakaz.uk.xensource.com>
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090205.4EBAA5EF.001A,ss=1,re=0.000,fgs=0
Cc: "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"konrad.wilk@oracle.com" <konrad.wilk@oracle.com>,
	"kurt.hackel@oracle.com" <kurt.hackel@oracle.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Paul Durrant <Paul.Durrant@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1054793237=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============1054793237==
Content-Type: multipart/alternative;
	boundary="------------010005040509040707020100"

This is a multi-part message in MIME format.
--------------010005040509040707020100
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit



On 2011-11-9 20:18, Ian Campbell wrote:
> On Wed, 2011-11-09 at 11:15 +0000, Paul Durrant wrote:
>   
>> Annie,
>>
>>   Why was this split out as a separate patch? Can it not be folded into patch 2 since the line it re-formats was introduced there?
>>     
>
> It is not generally necessary to split string constants in order to meet
> the 80 column (soft) limit in Linux code. Some people frown on it
> because it breaks grep'ability.
>   
If so, I'd like to revert the change.

Thanks
Annie
> Ian.
>
>   
>>   Paul
>>
>>     
>>> -----Original Message-----
>>> From: annie.li@oracle.com [mailto:annie.li@oracle.com]
>>> Sent: 09 November 2011 08:16
>>> To: xen-devel@lists.xensource.com; linux-kernel@vger.kernel.org;
>>> konrad.wilk@oracle.com; jeremy@goop.org
>>> Cc: kurt.hackel@oracle.com; Paul Durrant; annie.li@oracle.com
>>> Subject: [PATCH 3/3] code clean up
>>>
>>> From: Annie Li <annie.li@oracle.com>
>>>
>>> Signed-off-by: Annie Li <annie.li@oracle.com>
>>> ---
>>>  drivers/xen/grant-table.c |    3 ++-
>>>  1 files changed, 2 insertions(+), 1 deletions(-)
>>>
>>> diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
>>> index a3294a26..458c00d 100644
>>> --- a/drivers/xen/grant-table.c
>>> +++ b/drivers/xen/grant-table.c
>>> @@ -708,7 +708,8 @@ static void gnttab_request_version(void)  {
>>>  	int rc;
>>>  	struct gnttab_set_version gsv;
>>> -	const char *str = "we need grant tables version 2, but only
>>> version 1 is available\n";
>>> +	const char *str = "we need grant tables version 2, "
>>> +					"but only version 1 is
>>> available\n";
>>>
>>>  	gsv.version = 2;
>>>  	rc = HYPERVISOR_grant_table_op(GNTTABOP_set_version, &gsv,
>>> 1);
>>> --
>>> 1.7.6
>>>       
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com
>> http://lists.xensource.com/xen-devel
>>     
>
>
>   

--------------010005040509040707020100
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=UTF-8" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
<br>
<br>
On 2011-11-9 20:18, Ian Campbell wrote:
<blockquote cite="mid1320841103.955.120.camel@zakaz.uk.xensource.com"
 type="cite">
  <pre wrap="">On Wed, 2011-11-09 at 11:15 +0000, Paul Durrant wrote:
  </pre>
  <blockquote type="cite">
    <pre wrap="">Annie,

  Why was this split out as a separate patch? Can it not be folded into patch 2 since the line it re-formats was introduced there?
    </pre>
  </blockquote>
  <pre wrap=""><!---->
It is not generally necessary to split string constants in order to meet
the 80 column (soft) limit in Linux code. Some people frown on it
because it breaks grep'ability.
  </pre>
</blockquote>
If so, I'd like to revert the change.<br>
<br>
Thanks<br>
Annie<br>
<blockquote cite="mid1320841103.955.120.camel@zakaz.uk.xensource.com"
 type="cite">
  <pre wrap="">
Ian.

  </pre>
  <blockquote type="cite">
    <pre wrap="">  Paul

    </pre>
    <blockquote type="cite">
      <pre wrap="">-----Original Message-----
From: <a class="moz-txt-link-abbreviated" href="mailto:annie.li@oracle.com">annie.li@oracle.com</a> [<a class="moz-txt-link-freetext" href="mailto:annie.li@oracle.com">mailto:annie.li@oracle.com</a>]
Sent: 09 November 2011 08:16
To: <a class="moz-txt-link-abbreviated" href="mailto:xen-devel@lists.xensource.com">xen-devel@lists.xensource.com</a>; <a class="moz-txt-link-abbreviated" href="mailto:linux-kernel@vger.kernel.org">linux-kernel@vger.kernel.org</a>;
<a class="moz-txt-link-abbreviated" href="mailto:konrad.wilk@oracle.com">konrad.wilk@oracle.com</a>; <a class="moz-txt-link-abbreviated" href="mailto:jeremy@goop.org">jeremy@goop.org</a>
Cc: <a class="moz-txt-link-abbreviated" href="mailto:kurt.hackel@oracle.com">kurt.hackel@oracle.com</a>; Paul Durrant; <a class="moz-txt-link-abbreviated" href="mailto:annie.li@oracle.com">annie.li@oracle.com</a>
Subject: [PATCH 3/3] code clean up

From: Annie Li <a class="moz-txt-link-rfc2396E" href="mailto:annie.li@oracle.com">&lt;annie.li@oracle.com&gt;</a>

Signed-off-by: Annie Li <a class="moz-txt-link-rfc2396E" href="mailto:annie.li@oracle.com">&lt;annie.li@oracle.com&gt;</a>
---
 drivers/xen/grant-table.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
index a3294a26..458c00d 100644
--- a/drivers/xen/grant-table.c
+++ b/drivers/xen/grant-table.c
@@ -708,7 +708,8 @@ static void gnttab_request_version(void)  {
 	int rc;
 	struct gnttab_set_version gsv;
-	const char *str = "we need grant tables version 2, but only
version 1 is available\n";
+	const char *str = "we need grant tables version 2, "
+					"but only version 1 is
available\n";

 	gsv.version = 2;
 	rc = HYPERVISOR_grant_table_op(GNTTABOP_set_version, &amp;gsv,
1);
--
1.7.6
      </pre>
    </blockquote>
    <pre wrap="">
_______________________________________________
Xen-devel mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Xen-devel@lists.xensource.com">Xen-devel@lists.xensource.com</a>
<a class="moz-txt-link-freetext" href="http://lists.xensource.com/xen-devel">http://lists.xensource.com/xen-devel</a>
    </pre>
  </blockquote>
  <pre wrap=""><!---->

  </pre>
</blockquote>
</body>
</html>

--------------010005040509040707020100--


--===============1054793237==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1054793237==--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 08:21:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 08:21:24 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROAtu-0002oU-2R; Wed, 09 Nov 2011 08:21:22 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROAnY-0001j9-M1
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:14:49 -0800
X-Env-Sender: Paul.Durrant@citrix.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1320855285!2840614!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32249 invoked from network); 9 Nov 2011 16:14:45 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:14:45 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315180800"; 
   d="scan'208";a="8844890"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 16:14:45 +0000
Received: from LONPMAILBOX01.citrite.net ([10.30.224.161]) by
	LONPMAILMX01.citrite.net ([10.30.203.162]) with mapi; Wed, 9 Nov 2011
	16:14:45 +0000
From: Paul Durrant <Paul.Durrant@citrix.com>
To: annie li <annie.li@oracle.com>
Date: Wed, 9 Nov 2011 16:14:51 +0000
Thread-Topic: [PATCH 1/3] Introducing grant table V2 stucture
Thread-Index: Acye+dkSPeFs66I4SLaoqnjbJAaG5gAAC9+A
Message-ID: <291EDFCB1E9E224A99088639C4762022B4543AB213@LONPMAILBOX01.citrite.net>
References: <4EBA35D3.3020506@oracle.com>
	<1320826490-29362-1-git-send-email-annie.li@oracle.com>
	<291EDFCB1E9E224A99088639C4762022B4543AB1BD@LONPMAILBOX01.citrite.net>
	<4EBAA566.80909@oracle.com>
In-Reply-To: <4EBAA566.80909@oracle.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Cc: "kurt.hackel@oracle.com" <kurt.hackel@oracle.com>,
	"jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"konrad.wilk@oracle.com" <konrad.wilk@oracle.com>
Subject: [Xen-devel] RE: [PATCH 1/3] Introducing grant table V2 stucture
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Annie,

On 2011-11-9 19:11, Paul Durrant wrote:=20
> I see. v2 function includes mapping and arch_gnttab_map_shared, v1 functi=
on only include arch_gnttab_map_sh, right?
> This will lead to some code duplicated in two functions.=A0

My preference would be to have duplicated calls to arch_gnttab_map_shared()=
. I think it's more illustrative of the difference between v1 and v2 having=
 separate status pages.

  Paul

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 08:27:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 08:27:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROAzU-0003xs-W6; Wed, 09 Nov 2011 08:27:09 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROAsP-0002ZR-RS
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:19:50 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1320855559!47824648!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28261 invoked from network); 9 Nov 2011 16:19:20 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-4.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 16:19:20 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA9GJfXY014015
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 16:19:41 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA9GJepE009527
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 16:19:40 GMT
Received: from abhmt107.oracle.com (abhmt107.oracle.com [141.146.116.59])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA9GJYBJ023467; Wed, 9 Nov 2011 10:19:34 -0600
Received: from [10.154.43.72] (/10.154.43.72)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 08:19:33 -0800
Message-ID: <4EBAA80D.5050300@oracle.com>
Date: Thu, 10 Nov 2011 00:19:25 +0800
From: annie li <annie.li@oracle.com>
Organization: Oracle Corporation
User-Agent: Thunderbird 1.5.0.9 (Windows/20061207)
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 1/3] Introducing grant table V2 stucture
References: <4EBA35D3.3020506@oracle.com>	
	<1320826490-29362-1-git-send-email-annie.li@oracle.com>
	<1320845283.955.131.camel@zakaz.uk.xensource.com>
In-Reply-To: <1320845283.955.131.camel@zakaz.uk.xensource.com>
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090206.4EBAA81E.00B8,ss=1,re=-2.300,fgs=0
Cc: "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"konrad.wilk@oracle.com" <konrad.wilk@oracle.com>,
	"kurt.hackel@oracle.com" <kurt.hackel@oracle.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Paul Durrant <Paul.Durrant@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1039684802=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============1039684802==
Content-Type: multipart/alternative;
	boundary="------------000104060803070302010500"

This is a multi-part message in MIME format.
--------------000104060803070302010500
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit



On 2011-11-9 21:28, Ian Campbell wrote:
> On Wed, 2011-11-09 at 08:14 +0000, annie.li@oracle.com wrote:
>   
>> diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
>> index 4f44b34..0d481a9 100644
>> --- a/drivers/xen/grant-table.c
>> +++ b/drivers/xen/grant-table.c
>> @@ -53,7 +53,7 @@
>>  /* External tools reserve first few grant table entries. */
>>  #define NR_RESERVED_ENTRIES 8
>>  #define GNTTAB_LIST_END 0xffffffff
>> -#define GREFS_PER_GRANT_FRAME (PAGE_SIZE / sizeof(struct grant_entry))
>> +#define GREFS_PER_GRANT_FRAME (PAGE_SIZE / sizeof(struct grant_entry_v1))
>>     
>
> Does this need to become GREFS_V1_PER... or something?
>   
This is common definition for both V1 and V2, and is used by both v1 and 
v2 implementation. If it is changed to GREFS_V1_PER... or something with 
v1 tag in this patch, it is necessary to change it back in following 
"grant table v2 implementation" patch again. So I just keep it unchanged 
here.
>   
>>  static grant_ref_t **gnttab_list;
>>  static unsigned int nr_grant_frames;
>> @@ -64,7 +64,72 @@ static DEFINE_SPINLOCK(gnttab_list_lock);
>>  unsigned long xen_hvm_resume_frames;
>>  EXPORT_SYMBOL_GPL(xen_hvm_resume_frames);
>>
>> -static struct grant_entry *shared;
>> +static union {
>> +       struct grant_entry_v1 *v1;
>> +       void *ring_addr;
>> +} shared;
>> +
>> +/*
>> + * This function is null for grant table v1, adding it here in order to keep
>> + * consistent with *_v2 interface.
>> + */
>> +static int gnttab_map_status_v1(unsigned int nr_gframes);
>> +/*
>> + * This function is null for grant table v1, adding it here in order to keep
>> + * consistent with *_v2 interface.
>> + */
>> +static void gnttab_unmap_status_v1(void);
>>     
>
> If you reorder the declarations of gnttab_request_version and
> gnttab_(un)map_status_v1 below then you can avoid these forward
> declarations.
>   
Yes, you are right, thanks.
> Also I don't think the comment really adds much once you have the empty
> declaration underneath (like you do below). A simple "/* Nothing to do
> for v1 */" in the implementation would be sufficient.
>   
I agree.
>   
>> +
>> +/*This is a structure of function pointers for grant table v1*/
>>     
>
> and eventually v2, right? Actually I think the v1 is unnecessary. e.g.:
> 	/*This is a structure of function pointers for grant table*/
>
>   
Thanks, will change it.
>> +static struct {
>> +       /*
>> +        * Mapping a list of frames for storing grant entry status, this
>> +        * mechanism can allow better synchronization using barriers. Input
>> +        * parameter is frame number, returning GNTST_okay means success and
>> +        * negative value means failure.
>> +        */
>> +       int (*_gnttab_map_status)(unsigned int);
>>     
>
> I think you can drop the "_gnttab_" prefix from all of these, it'll be
> clear from the gnttab->foo what the namespace is.
>   
Ok, no problem.
> [...]
>   
>> +} gnttab_interface;
>> +
>> +static int grant_table_version;
>>
>>  static struct gnttab_free_callback *gnttab_free_callback_list;
>>
>>     
>
>   
>> @@ -155,12 +229,10 @@ static void update_grant_entry(grant_ref_t ref, domid_t domid,
>>          *  3. Write memory barrier (WMB).
>>          *  4. Write ent->flags, inc. valid type.
>>          */
>> -       shared[ref].frame = frame;
>> -       shared[ref].domid = domid;
>> -       wmb();
>> -       shared[ref].flags = flags;
>> +       gnttab_interface._update_grant_entry(ref, domid, frame, flags);
>>  }
>>
>> +
>>     
>
> Please avoid unrelated whitespace changes.
>   
Oh, it was ignored. Thanks, i will delete it.
>   
>>  /*
>>   * Public grant-issuing interface functions
>>   */
>> @@ -187,31 +259,40 @@ int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
>>  }
>>  EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access);
>>
>> -int gnttab_query_foreign_access(grant_ref_t ref)
>> +int gnttab_query_foreign_access_v1(grant_ref_t ref)
>>     
>
> This and all the other similar functions can now be made static.
>   
Ok, got it, thanks.

Thanks
Annie
> Ian.
>
>   

--------------000104060803070302010500
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=UTF-8" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
<br>
<br>
On 2011-11-9 21:28, Ian Campbell wrote:
<blockquote cite="mid1320845283.955.131.camel@zakaz.uk.xensource.com"
 type="cite">
  <pre wrap="">On Wed, 2011-11-09 at 08:14 +0000, <a class="moz-txt-link-abbreviated" href="mailto:annie.li@oracle.com">annie.li@oracle.com</a> wrote:
  </pre>
  <blockquote type="cite">
    <pre wrap="">diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
index 4f44b34..0d481a9 100644
--- a/drivers/xen/grant-table.c
+++ b/drivers/xen/grant-table.c
@@ -53,7 +53,7 @@
 /* External tools reserve first few grant table entries. */
 #define NR_RESERVED_ENTRIES 8
 #define GNTTAB_LIST_END 0xffffffff
-#define GREFS_PER_GRANT_FRAME (PAGE_SIZE / sizeof(struct grant_entry))
+#define GREFS_PER_GRANT_FRAME (PAGE_SIZE / sizeof(struct grant_entry_v1))
    </pre>
  </blockquote>
  <pre wrap=""><!---->
Does this need to become GREFS_V1_PER... or something?
  </pre>
</blockquote>
This is common definition for both V1 and V2, and is used by both v1
and v2 implementation. If it is changed to GREFS_V1_PER... or something
with v1 tag in this patch, it is necessary to change it back in
following "grant table v2 implementation" patch again. So I just keep
it unchanged here.
<blockquote cite="mid1320845283.955.131.camel@zakaz.uk.xensource.com"
 type="cite">
  <pre wrap="">
  </pre>
  <blockquote type="cite">
    <pre wrap=""> static grant_ref_t **gnttab_list;
 static unsigned int nr_grant_frames;
@@ -64,7 +64,72 @@ static DEFINE_SPINLOCK(gnttab_list_lock);
 unsigned long xen_hvm_resume_frames;
 EXPORT_SYMBOL_GPL(xen_hvm_resume_frames);

-static struct grant_entry *shared;
+static union {
+       struct grant_entry_v1 *v1;
+       void *ring_addr;
+} shared;
+
+/*
+ * This function is null for grant table v1, adding it here in order to keep
+ * consistent with *_v2 interface.
+ */
+static int gnttab_map_status_v1(unsigned int nr_gframes);
+/*
+ * This function is null for grant table v1, adding it here in order to keep
+ * consistent with *_v2 interface.
+ */
+static void gnttab_unmap_status_v1(void);
    </pre>
  </blockquote>
  <pre wrap=""><!---->
If you reorder the declarations of gnttab_request_version and
gnttab_(un)map_status_v1 below then you can avoid these forward
declarations.
  </pre>
</blockquote>
Yes, you are right, thanks.<br>
<blockquote cite="mid1320845283.955.131.camel@zakaz.uk.xensource.com"
 type="cite">
  <pre wrap="">
Also I don't think the comment really adds much once you have the empty
declaration underneath (like you do below). A simple "/* Nothing to do
for v1 */" in the implementation would be sufficient.
  </pre>
</blockquote>
I agree.<br>
<blockquote cite="mid1320845283.955.131.camel@zakaz.uk.xensource.com"
 type="cite">
  <pre wrap="">
  </pre>
  <blockquote type="cite">
    <pre wrap="">+
+/*This is a structure of function pointers for grant table v1*/
    </pre>
  </blockquote>
  <pre wrap=""><!---->
and eventually v2, right? Actually I think the v1 is unnecessary. e.g.:
	/*This is a structure of function pointers for grant table*/

  </pre>
</blockquote>
Thanks, will change it.<br>
<blockquote cite="mid1320845283.955.131.camel@zakaz.uk.xensource.com"
 type="cite">
  <pre wrap=""></pre>
  <blockquote type="cite">
    <pre wrap="">+static struct {
+       /*
+        * Mapping a list of frames for storing grant entry status, this
+        * mechanism can allow better synchronization using barriers. Input
+        * parameter is frame number, returning GNTST_okay means success and
+        * negative value means failure.
+        */
+       int (*_gnttab_map_status)(unsigned int);
    </pre>
  </blockquote>
  <pre wrap=""><!---->
I think you can drop the "_gnttab_" prefix from all of these, it'll be
clear from the gnttab-&gt;foo what the namespace is.
  </pre>
</blockquote>
Ok, no problem.<br>
<blockquote cite="mid1320845283.955.131.camel@zakaz.uk.xensource.com"
 type="cite">
  <pre wrap="">
[...]
  </pre>
  <blockquote type="cite">
    <pre wrap="">+} gnttab_interface;
+
+static int grant_table_version;

 static struct gnttab_free_callback *gnttab_free_callback_list;

    </pre>
  </blockquote>
  <pre wrap=""><!---->
  </pre>
  <blockquote type="cite">
    <pre wrap="">@@ -155,12 +229,10 @@ static void update_grant_entry(grant_ref_t ref, domid_t domid,
         *  3. Write memory barrier (WMB).
         *  4. Write ent-&gt;flags, inc. valid type.
         */
-       shared[ref].frame = frame;
-       shared[ref].domid = domid;
-       wmb();
-       shared[ref].flags = flags;
+       gnttab_interface._update_grant_entry(ref, domid, frame, flags);
 }

+
    </pre>
  </blockquote>
  <pre wrap=""><!---->
Please avoid unrelated whitespace changes.
  </pre>
</blockquote>
Oh, it was ignored. Thanks, i will delete it.<br>
<blockquote cite="mid1320845283.955.131.camel@zakaz.uk.xensource.com"
 type="cite">
  <pre wrap="">
  </pre>
  <blockquote type="cite">
    <pre wrap=""> /*
  * Public grant-issuing interface functions
  */
@@ -187,31 +259,40 @@ int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
 }
 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access);

-int gnttab_query_foreign_access(grant_ref_t ref)
+int gnttab_query_foreign_access_v1(grant_ref_t ref)
    </pre>
  </blockquote>
  <pre wrap=""><!---->
This and all the other similar functions can now be made static.
  </pre>
</blockquote>
Ok, got it, thanks.<br>
<br>
Thanks<br>
Annie<br>
<blockquote cite="mid1320845283.955.131.camel@zakaz.uk.xensource.com"
 type="cite">
  <pre wrap="">
Ian.

  </pre>
</blockquote>
</body>
</html>

--------------000104060803070302010500--


--===============1039684802==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1039684802==--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 08:30:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 08:30:50 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROB33-0004U2-Iv; Wed, 09 Nov 2011 08:30:49 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROAue-0002ya-1e
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:22:08 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320855691!45266262!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18693 invoked from network); 9 Nov 2011 16:21:31 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:21:31 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315180800"; 
   d="scan'208";a="8845056"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 16:22:04 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Wed, 9 Nov 2011
	16:22:04 +0000
Subject: Re: [Xen-devel] RE: [PATCH 1/3] Introducing grant table V2 stucture
From: Ian Campbell <Ian.Campbell@citrix.com>
To: annie li <annie.li@oracle.com>
Date: Wed, 9 Nov 2011 16:22:04 +0000
In-Reply-To: <4EBAA3B1.8010401@oracle.com>
References: <4EBA35D3.3020506@oracle.com>
	<1320826490-29362-1-git-send-email-annie.li@oracle.com>
	<291EDFCB1E9E224A99088639C4762022B4543AB1BD@LONPMAILBOX01.citrite.net>
	<20111109144922.GC8410@phenom.dumpdata.com>
	<291EDFCB1E9E224A99088639C4762022B4543AB204@LONPMAILBOX01.citrite.net>
	<4EBAA3B1.8010401@oracle.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320855724.955.183.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, Konrad
	Rzeszutek Wilk <konrad.wilk@oracle.com>,
	"kurt.hackel@oracle.com" <kurt.hackel@oracle.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Paul Durrant <Paul.Durrant@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-09 at 16:00 +0000, annie li wrote:
> Maybe addr or gnttab_addr?

IMHO the gnttab_ bit belongs in either (or both) the struct name or the
variable names referencing the struct, rather than the fields
themselves. It should be obvious from the context that this member is
something to do with gnttab. e.g. I think gnttab_shared->addr would be
fine, as would shared->addr in the context of gnttab.c etc.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 08:36:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 08:36:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROB8U-0005gw-W2; Wed, 09 Nov 2011 08:36:27 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROB2o-0004PR-RH
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:30:36 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1320856230!3546055!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25634 invoked from network); 9 Nov 2011 16:30:31 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-11.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 16:30:31 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA9GUOH3029599
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 16:30:27 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA9GUNAF026115
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 16:30:23 GMT
Received: from abhmt109.oracle.com (abhmt109.oracle.com [141.146.116.61])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA9GUHMm032455; Wed, 9 Nov 2011 10:30:18 -0600
Received: from [10.154.43.72] (/10.154.43.72)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 08:30:16 -0800
Message-ID: <4EBAAA91.6010108@oracle.com>
Date: Thu, 10 Nov 2011 00:30:09 +0800
From: annie li <annie.li@oracle.com>
Organization: Oracle Corporation
User-Agent: Thunderbird 1.5.0.9 (Windows/20061207)
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 2/3] Grant tables v2 implementation.
References: <4EBA35D3.3020506@oracle.com>	
	<1320826541-29398-1-git-send-email-annie.li@oracle.com>
	<1320845568.955.134.camel@zakaz.uk.xensource.com>
In-Reply-To: <1320845568.955.134.camel@zakaz.uk.xensource.com>
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090203.4EBAAAA3.01A9,ss=1,re=-2.300,fgs=0
Cc: "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"konrad.wilk@oracle.com" <konrad.wilk@oracle.com>,
	"kurt.hackel@oracle.com" <kurt.hackel@oracle.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Paul Durrant <Paul.Durrant@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1577071368=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============1577071368==
Content-Type: multipart/alternative;
	boundary="------------030906030502030702010208"

This is a multi-part message in MIME format.
--------------030906030502030702010208
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit



On 2011-11-9 21:32, Ian Campbell wrote:
> On Wed, 2011-11-09 at 08:15 +0000, annie.li@oracle.com wrote:
>   
>> From: Annie Li <annie.li@oracle.com>
>>
>> Receiver-side copying of packets is based on this implementation, it gives
>> better performance and better CPU accounting. It totally supports three types:
>> full-page, sub-page and transitive grants.
>>
>> However this patch does not cover sub-page and transitive grants, it mainly
>> focus on Full-page part and implements grant table V2 interfaces corresponding
>> to what already exists in grant table V1, such as: grant table V2
>> initialization, mapping, releasing and exported interfaces.
>>
>> Each guest can only supports one type of grant table type, every entry in grant
>> table should be the same version. It is necessary to set V1 or V2 version before
>> initializing the grant table.
>>
>> Grant table exported interfaces of V2 are same with those of V1, Xen is
>> responsible to judge what grant table version guests are using in every grant
>> operation.
>>
>> V2 fulfills the same role of V1, and it is totally backwards compitable with V1.
>> If dom0 support grant table V2, the guests runing on it can run with either V1
>> or V2.
>>
>> Signed-off-by: Annie Li <annie.li@oracle.com>
>> ---
>>  arch/x86/xen/grant-table.c |   34 ++++++++-
>>  drivers/xen/grant-table.c  |  194 +++++++++++++++++++++++++++++++++++++++++---
>>  include/xen/grant_table.h  |    6 +-
>>  3 files changed, 220 insertions(+), 14 deletions(-)
>>
>> diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c
>> index 65ce508..3e9f936 100644
>> --- a/arch/x86/xen/grant-table.c
>> +++ b/arch/x86/xen/grant-table.c
>> @@ -54,6 +54,17 @@ static int map_pte_fn(pte_t *pte, struct page *pmd_page,
>>         return 0;
>>  }
>>
>> +/*32bits is not enough since Xen supports sparse physical memory*/
>>     
>
> What does this mean?
>   
Sorry for the confusion, my comment seems not so precise.
This function is used to map the status frames of grant table 2, and the 
status definition is uint64_t. So it requires 64bits even on both 32bit 
guest.
>   
>> +static int map_pte_fn_status(pte_t *pte, struct page *pmd_page,
>> +                            unsigned long addr, void *data)
>> +{
>> +       uint64_t **frames = (uint64_t **)data;
>> +
>> +       set_pte_at(&init_mm, addr, pte, mfn_pte((*frames)[0], PAGE_KERNEL));
>> +       (*frames)++;
>> +       return 0;
>> +}
>>     
>
> Isn't this function identical to map_pte_fn?
>
>   
Yes, map_pte_fn already exists, but the frames definition is different.

uint64_t **frames in map_pte_fn_status  VS unsigned long **frames in 
map_pte_fn

Grant table 2 added status frames which is defined as uint64_t, so I 
kept both map_pte_fn and map_pte_fn_status.
>> +
>>  static int unmap_pte_fn(pte_t *pte, struct page *pmd_page,
>>                         unsigned long addr, void *data)
>>  {
>>     
>
>   
>> @@ -630,6 +756,44 @@ static int gnttab_map_status_v1(unsigned int nr_gframes)
>>         return 0;
>>  }
>>
>> +static int gnttab_map_status_v2(unsigned int nr_gframes)
>> +{
>> +       uint64_t *sframes;
>> +       unsigned int nr_sframes;
>> +       struct gnttab_get_status_frames getframes;
>> +       int rc;
>> +
>> +       nr_sframes = nr_status_frames(nr_gframes);
>> +
>> +       /* No need for kzalloc as it is initialized in following hyercall
>>     
>
>                                                                    hypercall
>   
Thanks, will fix it.
>   
>> +        * GNTTABOP_get_status_frames.
>> +        */
>> +       sframes = kmalloc(nr_sframes  * sizeof(uint64_t), GFP_ATOMIC);
>> +       if (!sframes)
>> +               return -ENOMEM;
>> +
>> +       getframes.dom        = DOMID_SELF;
>> +       getframes.nr_frames  = nr_sframes;
>> +       set_xen_guest_handle(getframes.frame_list, sframes);
>> +
>> +       rc = HYPERVISOR_grant_table_op(GNTTABOP_get_status_frames,
>> +                                      &getframes, 1);
>> +       if (rc == -ENOSYS) {
>> +               kfree(sframes);
>> +               return -ENOSYS;
>> +       }
>> +
>> +       BUG_ON(rc || getframes.status);
>> +
>> +       rc = arch_gnttab_map_status(sframes, nr_sframes,
>> +                                   nr_status_frames(gnttab_max_grant_frames()),
>> +                                   &grstatus);
>> +       BUG_ON(rc);
>> +       kfree(sframes);
>> +
>> +       return 0;
>> +}
>> +
>>  static int gnttab_map_status(unsigned int nr_gframes)
>>  {
>>         return gnttab_interface._gnttab_map_status(nr_gframes);
>> @@ -666,6 +830,9 @@ static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
>>                 return rc;
>>         }
>>
>> +       /* No need for kzalloc as it is initialized in following hyercall
>>     
>
> "hypercall" again
>   
Thanks, will fix it.

Thanks
Annie
> Ian.
>
>
>   

--------------030906030502030702010208
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=UTF-8" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
<br>
<br>
On 2011-11-9 21:32, Ian Campbell wrote:
<blockquote cite="mid1320845568.955.134.camel@zakaz.uk.xensource.com"
 type="cite">
  <pre wrap="">On Wed, 2011-11-09 at 08:15 +0000, <a class="moz-txt-link-abbreviated" href="mailto:annie.li@oracle.com">annie.li@oracle.com</a> wrote:
  </pre>
  <blockquote type="cite">
    <pre wrap="">From: Annie Li <a class="moz-txt-link-rfc2396E" href="mailto:annie.li@oracle.com">&lt;annie.li@oracle.com&gt;</a>

Receiver-side copying of packets is based on this implementation, it gives
better performance and better CPU accounting. It totally supports three types:
full-page, sub-page and transitive grants.

However this patch does not cover sub-page and transitive grants, it mainly
focus on Full-page part and implements grant table V2 interfaces corresponding
to what already exists in grant table V1, such as: grant table V2
initialization, mapping, releasing and exported interfaces.

Each guest can only supports one type of grant table type, every entry in grant
table should be the same version. It is necessary to set V1 or V2 version before
initializing the grant table.

Grant table exported interfaces of V2 are same with those of V1, Xen is
responsible to judge what grant table version guests are using in every grant
operation.

V2 fulfills the same role of V1, and it is totally backwards compitable with V1.
If dom0 support grant table V2, the guests runing on it can run with either V1
or V2.

Signed-off-by: Annie Li <a class="moz-txt-link-rfc2396E" href="mailto:annie.li@oracle.com">&lt;annie.li@oracle.com&gt;</a>
---
 arch/x86/xen/grant-table.c |   34 ++++++++-
 drivers/xen/grant-table.c  |  194 +++++++++++++++++++++++++++++++++++++++++---
 include/xen/grant_table.h  |    6 +-
 3 files changed, 220 insertions(+), 14 deletions(-)

diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c
index 65ce508..3e9f936 100644
--- a/arch/x86/xen/grant-table.c
+++ b/arch/x86/xen/grant-table.c
@@ -54,6 +54,17 @@ static int map_pte_fn(pte_t *pte, struct page *pmd_page,
        return 0;
 }

+/*32bits is not enough since Xen supports sparse physical memory*/
    </pre>
  </blockquote>
  <pre wrap=""><!---->
What does this mean?
  </pre>
</blockquote>
Sorry for the confusion, my comment seems not so precise.<br>
This function is used to map the status frames of grant table 2, and
the status definition is uint64_t. So it requires 64bits even on both
32bit guest.<br>
<blockquote cite="mid1320845568.955.134.camel@zakaz.uk.xensource.com"
 type="cite">
  <pre wrap="">
  </pre>
  <blockquote type="cite">
    <pre wrap="">+static int map_pte_fn_status(pte_t *pte, struct page *pmd_page,
+                            unsigned long addr, void *data)
+{
+       uint64_t **frames = (uint64_t **)data;
+
+       set_pte_at(&amp;init_mm, addr, pte, mfn_pte((*frames)[0], PAGE_KERNEL));
+       (*frames)++;
+       return 0;
+}
    </pre>
  </blockquote>
  <pre wrap=""><!---->
Isn't this function identical to map_pte_fn?

  </pre>
</blockquote>
Yes, map_pte_fn already exists, but the frames definition is different.
<br>
<br>
uint64_t **frames in map_pte_fn_statusÂ  VS unsigned long **frames in
map_pte_fn
<br>
<br>
Grant table 2 added status frames which is defined as uint64_t, so I
kept both map_pte_fn and map_pte_fn_status.
<blockquote cite="mid1320845568.955.134.camel@zakaz.uk.xensource.com"
 type="cite">
  <pre wrap=""></pre>
  <blockquote type="cite">
    <pre wrap="">+
 static int unmap_pte_fn(pte_t *pte, struct page *pmd_page,
                        unsigned long addr, void *data)
 {
    </pre>
  </blockquote>
  <pre wrap=""><!---->
  </pre>
  <blockquote type="cite">
    <pre wrap="">@@ -630,6 +756,44 @@ static int gnttab_map_status_v1(unsigned int nr_gframes)
        return 0;
 }

+static int gnttab_map_status_v2(unsigned int nr_gframes)
+{
+       uint64_t *sframes;
+       unsigned int nr_sframes;
+       struct gnttab_get_status_frames getframes;
+       int rc;
+
+       nr_sframes = nr_status_frames(nr_gframes);
+
+       /* No need for kzalloc as it is initialized in following hyercall
    </pre>
  </blockquote>
  <pre wrap=""><!---->
                                                                   hypercall
  </pre>
</blockquote>
Thanks, will fix it.<br>
<blockquote cite="mid1320845568.955.134.camel@zakaz.uk.xensource.com"
 type="cite">
  <pre wrap="">
  </pre>
  <blockquote type="cite">
    <pre wrap="">+        * GNTTABOP_get_status_frames.
+        */
+       sframes = kmalloc(nr_sframes  * sizeof(uint64_t), GFP_ATOMIC);
+       if (!sframes)
+               return -ENOMEM;
+
+       getframes.dom        = DOMID_SELF;
+       getframes.nr_frames  = nr_sframes;
+       set_xen_guest_handle(getframes.frame_list, sframes);
+
+       rc = HYPERVISOR_grant_table_op(GNTTABOP_get_status_frames,
+                                      &amp;getframes, 1);
+       if (rc == -ENOSYS) {
+               kfree(sframes);
+               return -ENOSYS;
+       }
+
+       BUG_ON(rc || getframes.status);
+
+       rc = arch_gnttab_map_status(sframes, nr_sframes,
+                                   nr_status_frames(gnttab_max_grant_frames()),
+                                   &amp;grstatus);
+       BUG_ON(rc);
+       kfree(sframes);
+
+       return 0;
+}
+
 static int gnttab_map_status(unsigned int nr_gframes)
 {
        return gnttab_interface._gnttab_map_status(nr_gframes);
@@ -666,6 +830,9 @@ static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
                return rc;
        }

+       /* No need for kzalloc as it is initialized in following hyercall
    </pre>
  </blockquote>
  <pre wrap=""><!---->
"hypercall" again
  </pre>
</blockquote>
Thanks, will fix it.<br>
<br>
Thanks<br>
Annie<br>
<blockquote cite="mid1320845568.955.134.camel@zakaz.uk.xensource.com"
 type="cite">
  <pre wrap="">
Ian.


  </pre>
</blockquote>
</body>
</html>

--------------030906030502030702010208--


--===============1577071368==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1577071368==--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 08:50:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 08:50:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBMW-0001LE-QY; Wed, 09 Nov 2011 08:50:56 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBLw-00017i-Ab
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:50:20 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1320857415!2473799!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21680 invoked from network); 9 Nov 2011 16:50:17 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-14.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:50:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315195200"; d="scan'208";a="18960499"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:50:15 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 11:50:15 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pA9GoDIR019779;
	Wed, 9 Nov 2011 08:50:14 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 9 Nov 2011 16:50:43 +0000
Message-ID: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 01/18] xl.pod.1: add a barebone description of
	tmem commands
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 docs/man/xl.pod.1 |   66 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 66 insertions(+), 0 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index 1e3deeb..7022852 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -793,6 +793,72 @@ List pass-through pci devices for a domain.
 
 =back
 
+=head2 TMEM
+
+=over 4
+
+=item B<tmem-list> I[<-l>] I<domain-id>
+
+List tmem pools. If I<-l> is specified, also list tmem stats.
+
+=item B<tmem-freeze> I<domain-id>
+
+Freeze tmem pools.
+
+=item B<tmem-destroy> I<domain-id>
+
+Destroy tmem pools.
+
+=item B<tmem-thaw> I<domain-id>
+
+Thaw tmem pools.
+
+=item B<tmem-set> I<domain-id> [I<OPTIONS>]
+
+Change tmem settings.
+
+B<OPTIONS>
+
+=over 4
+
+=item B<-w> I<WEIGHT>
+
+Weight (int)
+
+=item B<-c> I<CAP>
+
+Cap (int)
+
+=item B<-p> I<COMPRESS>
+
+Compress (int)
+
+=back
+
+=item B<tmem-shared-auth> I<domain-id> [I<OPTIONS>]
+
+De/authenticate shared tmem pool.
+
+B<OPTIONS>
+
+=over 4
+
+=item B<-u> I<UUID>
+
+Specify uuid (abcdef01-2345-6789-1234-567890abcdef)
+
+=item B<-a> I<AUTH>
+
+0=auth,1=deauth
+
+=back
+
+=item B<tmem-freeable>
+
+Get information about how much freeable memory (MB) is in-use by tmem.
+
+=back
+
 =head1 SEE ALSO
 
 B<xldomain.cfg>(5), B<xlcpupool.cfg>(5), B<xentop>(1)
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 08:51:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 08:51:56 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBNT-0001if-Uq; Wed, 09 Nov 2011 08:51:56 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBLx-00017k-1u
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:50:21 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1320857415!2473799!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21757 invoked from network); 9 Nov 2011 16:50:17 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-14.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:50:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315195200"; d="scan'208";a="18960500"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:50:17 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 11:50:17 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pA9GoDIT019779;
	Wed, 9 Nov 2011 08:50:16 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 9 Nov 2011 16:50:45 +0000
Message-ID: <1320857460-18088-3-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 03/18] xl.pod.1: improve create documentation
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 docs/man/xl.pod.1 |   22 ++++++++++++++++------
 1 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index 84da191..127a607 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -52,13 +52,15 @@ previously, most commands take I<domain-id> as the first parameter.
 
 =over 4
 
-=item B<create> [I<OPTIONS>] I<configfile>
+=item B<create> [I<configfile>] [I<OPTIONS>]
 
-The create subcommand requires a config file: see L<xldomain.cfg> for
-full details of that file format and possible options.
+The create subcommand takes a config file as first argument: see
+L<xldomain.cfg> for full details of that file format and possible
+options.
+If I<configfile> is missing B<XL> creates the domain starting from the
+default value for every option.
 
-I<configfile> can either be an absolute path to a file, or a relative
-path to a file located in /etc/xen.
+I<configfile> has to be an absolute path to a file.
 
 Create will return B<as soon> as the domain is started.  This B<does
 not> mean the guest OS in the domain has actually booted, or is
@@ -88,7 +90,15 @@ Leave the domain paused after it is created.
 =item B<-c>
 
 Attach console to the domain as soon as it has started.  This is
-useful for determining issues with crashing domains.
+useful for determining issues with crashing domains and just as a
+general convenience since you often want to watch the
+domain boot.
+
+=item B<key=value>
+
+It is possible to pass I<key=value> pairs on the command line to provide
+options as if they were written in the configuration file; these override
+whatever is in the I<configfile>.
 
 =back
 
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 08:52:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 08:52:46 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBOI-00025i-Ax; Wed, 09 Nov 2011 08:52:46 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBLz-00017n-4u
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:50:23 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1320857415!2473799!3
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21860 invoked from network); 9 Nov 2011 16:50:19 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-14.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:50:19 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315195200"; d="scan'208";a="18960501"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:50:19 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 11:50:19 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pA9GoDIV019779;
	Wed, 9 Nov 2011 08:50:18 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 9 Nov 2011 16:50:47 +0000
Message-ID: <1320857460-18088-5-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 05/18] xl.pod.1: order subcommands alphabetically
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 docs/man/xl.pod.1 |   59 ++++++++++++++++++++++++++---------------------------
 1 files changed, 29 insertions(+), 30 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index c3c6afd..07ec21d 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -68,6 +68,11 @@ previously, most commands take I<domain-id> as the first parameter.
 
 =over 4
 
+=item B<button-press> I<domain-id> I<button>
+
+Indicate an ACPI button press to the domain. I<button> is may be 'power' or
+'sleep'.
+
 =item B<create> [I<configfile>] [I<OPTIONS>]
 
 The create subcommand takes a config file as first argument: see
@@ -156,20 +161,6 @@ Connect to console number I<NUM>. Console numbers start from 0.
 
 =back
 
-=item B<vncviewer> [I<OPTIONS>] I<domain-id>
-
-Attach to domain's VNC server, forking a vncviewer process.
-
-B<OPTIONS>
-
-=over 4
-
-=item I<--autopass>
-
-Pass VNC password to vncviewer via stdin.
-
-=back
-
 =item B<destroy> I<domain-id>
 
 Immediately terminate the domain I<domain-id>.  This doesn't give the
@@ -196,6 +187,10 @@ I<filename> specified, without pausing the domain.  The dump file will
 be written to a distribution specific directory for dump files.  Such
 as: /var/lib/xen/dump or /var/xen/dump.
 
+=item B<getenforce>
+
+Returns the current enforcing mode of the Flask Xen security module.
+
 =item B<help> [I<--long>]
 
 Displays the short help message (i.e. common commands).
@@ -299,6 +294,10 @@ less utilized than a high CPU workload.  Consider yourself warned.
 
 =back
 
+=item B<loadpolicy> I<policyfile>
+
+Loads a new policy int the Flask Xen security module.
+
 =item B<mem-max> I<domain-id> I<mem>
 
 Specify the maximum amount of memory the domain is able to use, appending 't'
@@ -387,6 +386,10 @@ Enable debug messages.
 
 =back
 
+=item B<setenforce> I<1|0|Enforcing|Permissive>
+
+Sets the current enforcing mode of the Flask Xen security module
+
 =item B<save> [I<OPTIONS>] I<domain-id> I<CheckpointFile> [I<ConfigFile>]
 
 Saves a running domain to a state file so that it can be restored
@@ -396,7 +399,6 @@ B<xl restore> restores from this checkpoint file.
 Passing a config file argument allows the user to manually select the VM config
 file used to create the domain.
 
-
 =over 4
 
 =item B<-c>
@@ -434,6 +436,11 @@ Send a I<Magic System Request> signal to the domain.  For more
 information on available magic sys req operations, see sysrq.txt in
 your Linux Kernel sources.
 
+=item B<trigger> I<domain-id> I<nmi|reset|init|power|sleep> [I<VCPU>]
+
+Send a trigger to a domain, where the trigger can be: nmi, reset, init, power
+or sleep.  Optionally a specific vcpu number can be passed as an argument.
+
 =item B<unpause> I<domain-id>
 
 Moves a domain out of the paused state.  This will allow a previously
@@ -473,27 +480,19 @@ different run state is appropriate.  Pinning can be used to restrict
 this, by ensuring certain VCPUs can only run on certain physical
 CPUs.
 
-=item B<button-press> I<domain-id> I<button>
-
-Indicate an ACPI button press to the domain. I<button> is may be 'power' or
-'sleep'.
-
-=item B<trigger> I<domain-id> I<nmi|reset|init|power|sleep> [I<VCPU>]
-
-Send a trigger to a domain, where the trigger can be: nmi, reset, init, power
-or sleep.  Optionally a specific vcpu number can be passed as an argument.
+=item B<vncviewer> [I<OPTIONS>] I<domain-id>
 
-=item B<getenforce>
+Attach to domain's VNC server, forking a vncviewer process.
 
-Returns the current enforcing mode of the Flask Xen security module.
+B<OPTIONS>
 
-=item B<setenforce> I<1|0|Enforcing|Permissive>
+=over 4
 
-Sets the current enforcing mode of the Flask Xen security module
+=item I<--autopass>
 
-=item B<loadpolicy> I<policyfile>
+Pass VNC password to vncviewer via stdin.
 
-Loads a new policy int the Flask Xen security module.
+=back
 
 =back
 
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 08:54:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 08:54:06 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBPa-0002ah-Hu; Wed, 09 Nov 2011 08:54:06 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBM1-00018D-0O
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:50:25 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1320857415!2473799!4
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22256 invoked from network); 9 Nov 2011 16:50:21 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-14.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:50:21 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315195200"; d="scan'208";a="18960502"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:50:21 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 11:50:21 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pA9GoDIX019779;
	Wed, 9 Nov 2011 08:50:20 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 9 Nov 2011 16:50:49 +0000
Message-ID: <1320857460-18088-7-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 07/18] xl.pod.1: add a reference to create in
	the -e option
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Add a reference to the create subcommand in the description of
the -e option to unpause and migrate.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 docs/man/xl.pod.1 |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index a711f35..a50ea3e 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -338,7 +338,7 @@ Use <sshcommand> instead of ssh.  String will be passed to sh. If empty, run
 =item B<-e>
 
 On the new host, do not wait in the background (on <host>) for the death of the
-domain.
+domain. See the corresponding option of the I<create> subcommand.
 
 =item B<-C> I<config>
 
@@ -378,6 +378,7 @@ Do not unpause domain after restoring it.
 =item B<-e>
 
 Do not wait in the background for the death of the domain on the new host.
+See the corresponding option of the I<create> subcommand.
 
 =item B<-d>
 
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 08:54:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 08:54:59 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBQR-0002ya-9L; Wed, 09 Nov 2011 08:54:59 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBM3-00019V-9w
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:50:27 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1320857415!2473799!5
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22405 invoked from network); 9 Nov 2011 16:50:24 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-14.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:50:24 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315195200"; d="scan'208";a="18960505"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:50:23 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 11:50:23 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pA9GoDIZ019779;
	Wed, 9 Nov 2011 08:50:22 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 9 Nov 2011 16:50:51 +0000
Message-ID: <1320857460-18088-9-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 09/18] xl.pod.1: better description for the
	sysreq subcommand
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 docs/man/xl.pod.1 |    8 +++++---
 1 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index d7d5f77..5352dd0 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -434,9 +434,11 @@ Wait for the domain to complete shutdown before returning.
 
 =item B<sysrq> I<domain-id> I<letter>
 
-Send a I<Magic System Request> signal to the domain.  For more
-information on available magic sys req operations, see sysrq.txt in
-your Linux Kernel sources.
+Send a <Magic System Request> to the domain, each type of request is
+represented by a different letter.
+It can be used to send SysRq requests to Linux guests, see sysrq.txt in
+your Linux Kernel sources for more information.
+It requires PV drivers to be installed in your guest OS.
 
 =item B<trigger> I<domain-id> I<nmi|reset|init|power|sleep> [I<VCPU>]
 
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 08:55:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 08:55:48 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBRD-0003NM-6b; Wed, 09 Nov 2011 08:55:47 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBM5-0001A3-8c
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:50:29 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1320857415!2473799!6
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22541 invoked from network); 9 Nov 2011 16:50:26 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-14.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:50:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315195200"; d="scan'208";a="18960506"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:50:25 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 11:50:25 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pA9GoDIb019779;
	Wed, 9 Nov 2011 08:50:24 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 9 Nov 2011 16:50:53 +0000
Message-ID: <1320857460-18088-11-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 11/18] xl.pod.1: introduce a TO BE DOCUMENTED
	section
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 docs/man/xl.pod.1 |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index 677fd24..5bc0086 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -902,6 +902,22 @@ Get information about how much freeable memory (MB) is in-use by tmem.
 
 =back
 
+=head1 TO BE DOCUMENTED
+
+We need better documentation for:
+
+=over 4
+
+=item B<tmem>
+
+Trascendent Memory.
+
+=item B<Flask>
+
+Xen Flask security module.
+
+=back
+
 =head1 SEE ALSO
 
 B<xldomain.cfg>(5), B<xlcpupool.cfg>(5), B<xentop>(1)
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 08:56:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 08:56:31 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBRv-0003kH-Hj; Wed, 09 Nov 2011 08:56:31 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBM7-0001Al-88
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:50:31 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1320857415!2473799!7
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22628 invoked from network); 9 Nov 2011 16:50:28 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-14.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:50:28 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315195200"; d="scan'208";a="18960507"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:50:27 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 11:50:27 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pA9GoDId019779;
	Wed, 9 Nov 2011 08:50:26 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 9 Nov 2011 16:50:55 +0000
Message-ID: <1320857460-18088-13-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 13/18] xl.pod.1: improve the description of the
	info subcommand
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

also update the example

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 docs/man/xl.pod.1 |   55 +++++++++++++++++++++++++++-------------------------
 1 files changed, 29 insertions(+), 26 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index 0179b66..d68c6b9 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -527,39 +527,41 @@ Clears Xen's message buffer.
 
 Print information about the Xen host in I<name : value> format.  When
 reporting a Xen bug, please provide this information as part of the
-bug report.
+bug report. See I<http://wiki.xen.org/xenwiki/ReportingBugs> on how to
+report Xen bugs.
 
-Sample output looks as follows (lines wrapped manually to make the man
-page more readable):
+Sample output looks as follows:
 
- host                   : talon
- release                : 2.6.12.6-xen0
- version                : #1 Mon Nov 14 14:26:26 EST 2005
- machine                : i686
- nr_cpus                : 2
+ host                   : scarlett
+ release                : 3.1.0-rc4+
+ version                : #1001 SMP Wed Oct 19 11:09:54 UTC 2011
+ machine                : x86_64
+ nr_cpus                : 4
  nr_nodes               : 1
- cores_per_socket       : 1
+ cores_per_socket       : 4
  threads_per_core       : 1
- cpu_mhz                : 696
- hw_caps                : 0383fbff:00000000:00000000:00000040
- total_memory           : 767
- free_memory            : 37
- xen_major              : 3
- xen_minor              : 0
- xen_extra              : -devel
- xen_caps               : xen-3.0-x86_32
+ cpu_mhz                : 2266
+ hw_caps                : bfebfbff:28100800:00000000:00003b40:009ce3bd:00000000:00000001:00000000
+ virt_caps              : hvm hvm_directio
+ total_memory           : 6141
+ free_memory            : 4274
+ free_cpus              : 0
+ xen_major              : 4
+ xen_minor              : 2
+ xen_extra              : -unstable
+ xen_caps               : xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64 
  xen_scheduler          : credit
  xen_pagesize           : 4096
- platform_params        : virt_start=0xfc000000
- xen_changeset          : Mon Nov 14 18:13:38 2005 +0100 
-                          7793:090e44133d40
- cc_compiler            : gcc version 3.4.3 (Mandrakelinux 
-                          10.2 3.4.3-7mdk)
- cc_compile_by          : sdague
- cc_compile_domain      : (none)
- cc_compile_date        : Mon Nov 14 14:16:48 EST 2005
+ platform_params        : virt_start=0xffff800000000000
+ xen_changeset          : Wed Nov 02 17:09:09 2011 +0000 24066:54a5e994a241
+ xen_commandline        : com1=115200,8n1 guest_loglvl=all dom0_mem=750M console=com1 
+ cc_compiler            : gcc version 4.4.5 (Debian 4.4.5-8) 
+ cc_compile_by          : sstabellini
+ cc_compile_domain      : uk.xensource.com
+ cc_compile_date        : Tue Nov  8 12:03:05 UTC 2011
  xend_config_format     : 4
 
+
 B<FIELDS>
 
 Not all fields will be explained here, but some of the less obvious
@@ -571,7 +573,8 @@ ones deserve explanation:
 
 A vector showing what hardware capabilities are supported by your
 processor.  This is equivalent to, though more cryptic, the flags
-field in /proc/cpuinfo on a normal Linux machine.
+field in /proc/cpuinfo on a normal Linux machine: they both derive from
+the feature bits returned by the cpuid command on x86 platforms.
 
 =item B<free_memory>
 
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 08:57:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 08:57:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBSp-0004Aw-8c; Wed, 09 Nov 2011 08:57:27 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBM9-0001BH-8o
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:50:33 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1320857415!2473799!8
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22730 invoked from network); 9 Nov 2011 16:50:30 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-14.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:50:30 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315195200"; d="scan'208";a="18960509"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:50:29 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 11:50:29 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pA9GoDIf019779;
	Wed, 9 Nov 2011 08:50:28 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 9 Nov 2011 16:50:57 +0000
Message-ID: <1320857460-18088-15-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 15/18] xl.pod.1: remove dry-run option from
	create and cpupool-create
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

there is already a global dry-run option, there is no point in adding
another one for each subcommand

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 docs/man/xl.pod.1 |    9 ---------
 1 files changed, 0 insertions(+), 9 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index 0a50074..720e3b9 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -99,11 +99,6 @@ No console output.
 
 Use the given configuration file.
 
-=item B<-n>, B<--dryrun>
-
-Dry run - prints the resulting configuration in SXP but does not create
-the domain.
-
 =item B<-p>
 
 Leave the domain paused after it is created.
@@ -685,10 +680,6 @@ B<OPTIONS>
 
 Use the given configuration file.
 
-=item B<-n>, B<--dryrun>
-
-Dry run - prints the resulting configuration.
-
 =back
 
 =item B<cpupool-list> [I<-c|--cpus>] [I<cpu-pool>]
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:00:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:00:20 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBVb-0004dY-9Z; Wed, 09 Nov 2011 09:00:19 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBMA-0001CB-Ph
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:50:35 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1320857427!2885248!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29132 invoked from network); 9 Nov 2011 16:50:30 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-16.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:50:30 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315195200"; d="scan'208";a="169972573"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:50:20 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 11:50:20 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pA9GoDIW019779;
	Wed, 9 Nov 2011 08:50:19 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 9 Nov 2011 16:50:48 +0000
Message-ID: <1320857460-18088-6-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 06/18] xl.pod.1: remove the two FIXME
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 docs/man/xl.pod.1 |    5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index 07ec21d..a711f35 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -264,7 +264,8 @@ scheduling by the Xen hypervisor.
 
 =item B<s - shutdown>
 
-FIXME: Why would you ever see this state?
+The guest OS has shut down (SCHEDOP_shutdown has been called) but the
+domain is not dying yet.
 
 =item B<c - crashed>
 
@@ -277,8 +278,6 @@ restart on crash.  See L<xldomain.cfg> for more info.
 The domain is in process of dying, but hasn't completely shutdown or
 crashed.
 
-FIXME: Is this right?
-
 =back
 
 B<NOTES>
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:04:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:04:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBZM-00052r-HS; Wed, 09 Nov 2011 09:04:12 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBMB-0001CO-BL
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:50:35 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1320857429!2910002!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20359 invoked from network); 9 Nov 2011 16:50:32 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-7.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:50:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315195200"; d="scan'208";a="169972597"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:50:24 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 11:50:24 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pA9GoDIa019779;
	Wed, 9 Nov 2011 08:50:23 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 9 Nov 2011 16:50:52 +0000
Message-ID: <1320857460-18088-10-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 10/18] xl.pod.1: state when a subcommand is only
	available to HVM guests
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 docs/man/xl.pod.1 |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index 5352dd0..677fd24 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -71,7 +71,7 @@ previously, most commands take I<domain-id> as the first parameter.
 =item B<button-press> I<domain-id> I<button>
 
 Indicate an ACPI button press to the domain. I<button> is may be 'power' or
-'sleep'.
+'sleep'. This command is only available for HVM domains.
 
 =item B<create> [I<configfile>] [I<OPTIONS>]
 
@@ -444,6 +444,7 @@ It requires PV drivers to be installed in your guest OS.
 
 Send a trigger to a domain, where the trigger can be: nmi, reset, init, power
 or sleep.  Optionally a specific vcpu number can be passed as an argument.
+This command is only available for HVM domains.
 
 =item B<unpause> I<domain-id>
 
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:05:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:05:58 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBb2-0005QP-SZ; Wed, 09 Nov 2011 09:05:56 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBMB-0001CN-Bb
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:50:35 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1320857415!2473799!9
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22840 invoked from network); 9 Nov 2011 16:50:32 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-14.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:50:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315195200"; d="scan'208";a="18960510"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:50:31 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 11:50:31 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pA9GoDIh019779;
	Wed, 9 Nov 2011 08:50:30 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 9 Nov 2011 16:50:59 +0000
Message-ID: <1320857460-18088-17-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 17/18] xl.pod.1: remove AUTHORS section
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 docs/man/xl.pod.1 |    7 -------
 1 files changed, 0 insertions(+), 7 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index 15a9870..0f372b9 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -928,13 +928,6 @@ And the following documents available in the Xen source tree:
 B<docs/misc/xl-network-configuration.markdown>
 B<docs/misc/xl-disk-configuration.txt>
 
-=head1 AUTHOR
-
-  Stefano Stabellini <stefano.stabellini@eu.citrix.com>
-  Vincent Hanquez <vincent.hanquez@eu.citrix.com>
-  Ian Jackson <ian.jackson@eu.citrix.com>
-  Ian Campbell <Ian.Campbell@citrix.com>
-
 =head1 BUGS
 
 Send bugs to xen-devel@lists.xensource.com.
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:08:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:08:37 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBdb-0005oy-Nu; Wed, 09 Nov 2011 09:08:35 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBM9-0001BV-Jr
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:50:34 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1320857427!2885248!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29037 invoked from network); 9 Nov 2011 16:50:29 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-16.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:50:29 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315195200"; d="scan'208";a="169972569"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:50:18 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 11:50:18 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pA9GoDIU019779;
	Wed, 9 Nov 2011 08:50:17 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 9 Nov 2011 16:50:46 +0000
Message-ID: <1320857460-18088-4-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 04/18] xl.pod.1: add a description of the global
	options
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 docs/man/xl.pod.1 |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index 127a607..c3c6afd 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -45,6 +45,22 @@ Most B<xl> commands require root privileges to run due to the
 communications channels used to talk to the hypervisor.  Running as
 non root will return an error.
 
+=head1 GLOBAL OPTIONS
+
+Few global options are always available:
+
+=over 4
+
+=item B<-v>
+
+Verbose.
+
+=item B<-N>
+
+Dry run: do not actually execute the command.
+
+=back
+
 =head1 DOMAIN SUBCOMMANDS
 
 The following subcommands manipulate domains directly.  As stated
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:11:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:11:08 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBg3-0006Db-9t; Wed, 09 Nov 2011 09:11:07 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBMA-0001Bm-6d
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:50:34 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1320857429!2910002!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20316 invoked from network); 9 Nov 2011 16:50:31 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-7.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:50:31 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315195200"; d="scan'208";a="169972563"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:50:16 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 11:50:16 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pA9GoDIS019779;
	Wed, 9 Nov 2011 08:50:15 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 9 Nov 2011 16:50:44 +0000
Message-ID: <1320857460-18088-2-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 02/18] xl.pod.1: add a description of console
	options
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 docs/man/xl.pod.1 |   19 ++++++++++++++++++-
 1 files changed, 18 insertions(+), 1 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index 7022852..84da191 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -105,7 +105,7 @@ soon as it is run.
 
 =back
 
-=item B<console> I<domain-id>
+=item B<console> [I<OPTIONS>] I<domain-id>
 
 Attach to domain I<domain-id>'s console.  If you've set up your domains to
 have a traditional log in console this will look much like a normal
@@ -113,6 +113,23 @@ text log in screen.
 
 Use the key combination Ctrl+] to detach the domain console.
 
+B<OPTIONS>
+
+=over 4
+
+=item I<-t [pv|serial]>
+
+Connect to a PV console or connect to an emulated serial console.
+PV consoles are the only consoles available for PV domains while HVM
+domains can have both. If this option is not specified it defaults to
+emulated serial for HVM guests.
+
+=item I<-n NUM>
+
+Connect to console number I<NUM>. Console numbers start from 0.
+
+=back
+
 =item B<vncviewer> [I<OPTIONS>] I<domain-id>
 
 Attach to domain's VNC server, forking a vncviewer process.
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:13:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:13:56 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBil-0006bw-Sv; Wed, 09 Nov 2011 09:13:55 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBMB-0001CS-Lw
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:50:36 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1320857427!2885248!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29205 invoked from network); 9 Nov 2011 16:50:31 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-16.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:50:31 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315195200"; d="scan'208";a="169972587"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:50:23 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 11:50:22 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pA9GoDIY019779;
	Wed, 9 Nov 2011 08:50:21 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 9 Nov 2011 16:50:50 +0000
Message-ID: <1320857460-18088-8-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 08/18] xl.pod.1: state when a command requires
	PV drivers installed
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Remove an old incorrect comment about vcpu-set requiring cooperation
from the guest.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 docs/man/xl.pod.1 |    6 ++----
 1 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index a50ea3e..d7d5f77 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -358,6 +358,7 @@ Reboot a domain.  This acts just as if the domain had the B<reboot>
 command run from the console.  The command returns as soon as it has
 executed the reboot action, which may be significantly before the
 domain actually reboots.
+It requires PV drivers installed in your guest OS.
 
 The behavior of what happens to a domain when it reboots is set by the
 B<on_reboot> parameter of the xldomain.cfg file when the domain was
@@ -415,6 +416,7 @@ to perform graceful shutdown, so there is no guarantee that it will
 succeed, and may take a variable length of time depending on what
 services must be shutdown in the domain.  The command returns
 immediately after signally the domain unless that B<-w> flag is used.
+For HVM domains it requires PV drivers to be installed in your guest OS.
 
 The behavior of what happens to a domain when it reboots is set by the
 B<on_shutdown> parameter of the xldomain.cfg file when the domain was
@@ -460,10 +462,6 @@ Attempting to set the VCPUs to a number larger than the initially
 configured VCPU count is an error.  Trying to set VCPUs to < 1 will be
 quietly ignored.
 
-Because this operation requires cooperation from the domain operating
-system, there is no guarantee that it will succeed.  This command will
-not work with a full virt domain.
-
 =item B<vcpu-list> [I<domain-id>]
 
 Lists VCPU information for a specific domain.  If no domain is
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:16:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:16:50 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBlZ-00076a-Rc; Wed, 09 Nov 2011 09:16:49 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBMD-0001D4-Hq
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:50:38 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1320857429!2910002!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20439 invoked from network); 9 Nov 2011 16:50:34 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-7.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:50:34 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315195200"; d="scan'208";a="169972618"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:50:28 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 11:50:28 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pA9GoDIe019779;
	Wed, 9 Nov 2011 08:50:27 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 9 Nov 2011 16:50:56 +0000
Message-ID: <1320857460-18088-14-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 14/18] xl.pod.1: improve the description of
	pci-list-assignable-devices
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 docs/man/xl.pod.1 |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index d68c6b9..0a50074 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -615,6 +615,9 @@ Prints the current uptime of the domains running.
 =item B<pci-list-assignable-devices>
 
 List all the assignable PCI devices.
+These are devices in the system which are configured to be
+available for passthrough and are bound to a suitable PCI
+backend driver in domain 0 rather than a real driver.
 
 =back
 
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:19:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:19:12 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBns-0007VG-Bc; Wed, 09 Nov 2011 09:19:12 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBMF-0001E5-Rl
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:50:40 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1320857429!2910002!4
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20581 invoked from network); 9 Nov 2011 16:50:36 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-7.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:50:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315195200"; d="scan'208";a="169972633"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:50:31 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 11:50:30 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pA9GoDIg019779;
	Wed, 9 Nov 2011 08:50:29 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 9 Nov 2011 16:50:58 +0000
Message-ID: <1320857460-18088-16-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 16/18] xl.pod.1: improve description of virtual
	device subcommands
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Add a reference to docs/misc/xl-disk-configuration.txt and
docs/misc/xl-network-configuration.markdown.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 docs/man/xl.pod.1 |   18 +++++++++++++-----
 1 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index 720e3b9..15a9870 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -717,8 +717,8 @@ Splits up the machine into one cpu-pool per numa node.
 =head1 VIRTUAL DEVICE COMMANDS
 
 Most virtual devices can be added and removed while guests are
-running.  The effect to the guest OS is much the same as any hotplug
-event.
+running, assuming that the necessary support exists in the guest.  The
+effect to the guest OS is much the same as any hotplug event.
 
 =head2 BLOCK DEVICES
 
@@ -740,7 +740,8 @@ The domain id of the guest domain that the device will be attached to.
 =item I<disc-spec-component>
 
 A disc specification in the same format used for the B<disk> variable in
-the domain config file. See L<xldomain.cfg>.
+the domain config file. See L<xldomain.cfg> and
+I<docs/misc/xl-disk-configuration.txt>.
 
 =back
 
@@ -795,8 +796,8 @@ I<VirtualDevice> is the cdrom device in the guest to eject.
 
 Creates a new network device in the domain specified by I<domain-id>.
 I<network-device> describes the device to attach, using the same format as the
-B<vif> string in the domain config file. See L<xldomain.cfg> for the
-description.
+B<vif> string in the domain config file. See L<xldomain.cfg> and
+I<docs/misc/xl-network-configuration.markdown> for more informations.
 
 =item B<network-detach> I<domain-id> I<devid|mac>
 
@@ -918,8 +919,15 @@ Xen Flask security module.
 
 =head1 SEE ALSO
 
+The following man pages:
+
 B<xldomain.cfg>(5), B<xlcpupool.cfg>(5), B<xentop>(1)
 
+And the following documents available in the Xen source tree:
+
+B<docs/misc/xl-network-configuration.markdown>
+B<docs/misc/xl-disk-configuration.txt>
+
 =head1 AUTHOR
 
   Stefano Stabellini <stefano.stabellini@eu.citrix.com>
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:20:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:20:34 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBpC-0007sS-AF; Wed, 09 Nov 2011 09:20:34 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBMH-0001EQ-MX
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:50:42 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1320857429!2910002!5
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20646 invoked from network); 9 Nov 2011 16:50:38 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-7.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:50:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315195200"; d="scan'208";a="169972603"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:50:26 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 11:50:26 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pA9GoDIc019779;
	Wed, 9 Nov 2011 08:50:25 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 9 Nov 2011 16:50:54 +0000
Message-ID: <1320857460-18088-12-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 12/18] xl.pod.1: improve the debug-keys
	subcommand description
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 docs/man/xl.pod.1 |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index 5bc0086..0179b66 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -503,7 +503,8 @@ Pass VNC password to vncviewer via stdin.
 
 =item B<debug-keys> I<keys>
 
-Send debug I<keys> to Xen.
+Send debug I<keys> to Xen. It is the same as pressing the Xen
+"conswitch" (Ctrl-A by default) three times and then pressing "keys".
 
 =item B<dmesg> [B<-c>]
 
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:21:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:21:26 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBq2-0008Fa-D9; Wed, 09 Nov 2011 09:21:26 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBMI-0001Eq-Hv
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:50:42 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1320857429!2910002!6
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20673 invoked from network); 9 Nov 2011 16:50:39 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-7.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:50:39 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315195200"; d="scan'208";a="169972644"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 11:50:33 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 11:50:32 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pA9GoDIi019779;
	Wed, 9 Nov 2011 08:50:31 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 9 Nov 2011 16:51:00 +0000
Message-ID: <1320857460-18088-18-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 18/18] xl.pod.1: add a refence to
	http://wiki.xen.org/xenwiki/ReportingBugs
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 docs/man/xl.pod.1 |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index 0f372b9..8108489 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -930,4 +930,5 @@ B<docs/misc/xl-disk-configuration.txt>
 
 =head1 BUGS
 
-Send bugs to xen-devel@lists.xensource.com.
+Send bugs to xen-devel@lists.xensource.com, see
+http://wiki.xen.org/xenwiki/ReportingBugs on how to send bug reports.
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:23:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:23:03 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBrb-0000BU-Q3; Wed, 09 Nov 2011 09:23:03 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBOa-0002CL-5Y
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 08:53:04 -0800
X-Env-Sender: beto.rvs@gmail.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1320857579!3591519!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3181 invoked from network); 9 Nov 2011 16:53:00 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-3.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 16:53:00 -0000
Received: by vws13 with SMTP id 13so2238221vws.30
	for <xen-devel@lists.xensource.com>;
	Wed, 09 Nov 2011 08:52:59 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type;
	bh=tlkuvr0TWrWZgMByQxHPqppyiBTnUQJkEdhNRkZUJOs=;
	b=HkXCZ4o//fY+Rm+ZTDALan3xKyqIGNvF3yYnkZT769xTTKHPAWmziSKplTfPSU5V6D
	9yQxd/b6MMGj0+ihDx3pWz8PZo1kN3c6dDrF3Z6jmyWPlve3Mi5fKnlcdhp6u4bqZKJv
	j6/0OUSNbcYjn7uq/+cSz0mPECJadyMHHQHx4=
MIME-Version: 1.0
Received: by 10.52.33.69 with SMTP id p5mr5742534vdi.78.1320857579509; Wed, 09
	Nov 2011 08:52:59 -0800 (PST)
Received: by 10.220.5.72 with HTTP; Wed, 9 Nov 2011 08:52:59 -0800 (PST)
In-Reply-To: <20111109151838.GA26277@phenom.dumpdata.com>
References: <CAOdhoheOhKGWp3f-tvXDX5SuGMXmsyY4fP==EXL-CWfiF52NzQ@mail.gmail.com>
	<20111109151838.GA26277@phenom.dumpdata.com>
Date: Wed, 9 Nov 2011 14:52:59 -0200
Message-ID: <CAOdhohc+UoicOGTW2W_rzdf7d4RR48QyOb4dr=f2g-LAWKB-dA@mail.gmail.com>
Subject: Re: [Xen-devel] why do I get bad disk write performance in the kernel
	3.1?
From: Roberto Scudeller <beto.rvs@gmail.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0195738266=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0195738266==
Content-Type: multipart/alternative; boundary=20cf3079ba54d3583404b1501e8b

--20cf3079ba54d3583404b1501e8b
Content-Type: text/plain; charset=ISO-8859-1

Konrad,

Thanks for help.

My windows.cfg is:
name='benchCM-windows-2003-64b-std-test'
kernel='/usr/lib/xen/boot/hvmloader'
builder='hvm'
memory=512
vcpus=2
pae=1
acpi=1
apic=1
disk=[ 'tap2:aio:/local-disk/benchCM-windows-2003-64b-std/xvda,xvda,w' ]
device_model='/usr/lib/xen/bin/qemu-dm'
boot='c'
sdl=0
vnc=1
vncunused=1
vnclisten='0.0.0.0'
vncpasswd=''
stdvga=0
extra=''
on_reboot='restart'
on_shutdown='destroy'
ramdisk=''
image_name=''
on_crash='destroy'
bootloader=''
root=''
platform='xen'
network_mode='tap'
usb = 1
usbdevice = 'tablet'

The xvda disk is a raw disk, created with dd.
I use the windows.cfg in both kernel.



2011/11/9 Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

> On Wed, Nov 09, 2011 at 12:58:27PM -0200, Roberto Scudeller wrote:
> > Hi all,
> >
> > I'm testing the new kernel 3.1 from kernel.org, and xen 4.1.2-rc1-pre.
> > I execute a CrystalMark IO Benchmark, in windows 2003 VM with gplpv
> > drivers, and receive an amazing result for reading, but the write numbers
> > are very disappointing.
> >
> > I run the VM in local disk, and receive these numbers:
> > Seq read: 244 MB/s
> > 512K read: 239 MB/s
> > 4K read: 27 MB/s
> > 4K QD 32: 90 MB/s
> >
> > Seq write: 20 MB/s
> > 512K: 20 MB/s
> > 4K: 8 MB/s
> > 4K QD 32: 12MB/s
> >
> > In older kernel, 2.6.32.x:
> > Seq read: 189 MB/s
> > 512K read: 169 MB/s
> > 4K read: 11 MB/s
> > 4K QD 32: 34 MB/s
> >
> > Seq write: 177 MB/s
> > 512K: 166 MB/s
> > 4K: 12 MB/s
> > 4K QD 32: 36 MB/s
> >
> > Could anyone help me. Why is the new kernel faster in reading, but too
> slow
> > writing ?
>
> It would help if you gave an idea of what the guest configuration is and
> what is the backend. It might be that the backend you are using in 3.1 is
> QEMU qdisk, not xen-blkback.
>



-- 
Roberto Scudeller

--20cf3079ba54d3583404b1501e8b
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Konrad,<br><br>Thanks for help. <br><br>My windows.cfg is:<br>name=3D&#39;b=
enchCM-windows-2003-64b-std-test&#39;<br>kernel=3D&#39;/usr/lib/xen/boot/hv=
mloader&#39;<br>builder=3D&#39;hvm&#39;<br>memory=3D512<br>vcpus=3D2<br>pae=
=3D1<br>acpi=3D1<br>
apic=3D1<br>disk=3D[ &#39;tap2:aio:/local-disk/benchCM-windows-2003-64b-std=
/xvda,xvda,w&#39; ]<br>device_model=3D&#39;/usr/lib/xen/bin/qemu-dm&#39;<br=
>boot=3D&#39;c&#39;<br>sdl=3D0<br>vnc=3D1<br>vncunused=3D1<br>vnclisten=3D&=
#39;0.0.0.0&#39;<br>
vncpasswd=3D&#39;&#39;<br>stdvga=3D0<br>extra=3D&#39;&#39;<br>on_reboot=3D&=
#39;restart&#39;<br>on_shutdown=3D&#39;destroy&#39;<br>ramdisk=3D&#39;&#39;=
<br>image_name=3D&#39;&#39;<br>on_crash=3D&#39;destroy&#39;<br>bootloader=
=3D&#39;&#39;<br>
root=3D&#39;&#39;<br>platform=3D&#39;xen&#39;<br>network_mode=3D&#39;tap&#3=
9;<br>usb =3D 1<br>usbdevice =3D &#39;tablet&#39;<br><br>The xvda disk is a=
 raw disk, created with dd.<br>I use the windows.cfg in both kernel.<br><br=
><br><br>
<div class=3D"gmail_quote">2011/11/9 Konrad Rzeszutek Wilk <span dir=3D"ltr=
">&lt;<a href=3D"mailto:konrad.wilk@oracle.com">konrad.wilk@oracle.com</a>&=
gt;</span><br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;=
border-left:1px #ccc solid;padding-left:1ex;">
<div class=3D"HOEnZb"><div class=3D"h5">On Wed, Nov 09, 2011 at 12:58:27PM =
-0200, Roberto Scudeller wrote:<br>
&gt; Hi all,<br>
&gt;<br>
&gt; I&#39;m testing the new kernel 3.1 from <a href=3D"http://kernel.org" =
target=3D"_blank">kernel.org</a>, and xen 4.1.2-rc1-pre.<br>
&gt; I execute a CrystalMark IO Benchmark, in windows 2003 VM with gplpv<br=
>
&gt; drivers, and receive an amazing result for reading, but the write numb=
ers<br>
&gt; are very disappointing.<br>
&gt;<br>
&gt; I run the VM in local disk, and receive these numbers:<br>
&gt; Seq read: 244 MB/s<br>
&gt; 512K read: 239 MB/s<br>
&gt; 4K read: 27 MB/s<br>
&gt; 4K QD 32: 90 MB/s<br>
&gt;<br>
&gt; Seq write: 20 MB/s<br>
&gt; 512K: 20 MB/s<br>
&gt; 4K: 8 MB/s<br>
&gt; 4K QD 32: 12MB/s<br>
&gt;<br>
&gt; In older kernel, 2.6.32.x:<br>
&gt; Seq read: 189 MB/s<br>
&gt; 512K read: 169 MB/s<br>
&gt; 4K read: 11 MB/s<br>
&gt; 4K QD 32: 34 MB/s<br>
&gt;<br>
&gt; Seq write: 177 MB/s<br>
&gt; 512K: 166 MB/s<br>
&gt; 4K: 12 MB/s<br>
&gt; 4K QD 32: 36 MB/s<br>
&gt;<br>
&gt; Could anyone help me. Why is the new kernel faster in reading, but too=
 slow<br>
&gt; writing ?<br>
<br>
</div></div>It would help if you gave an idea of what the guest configurati=
on is and<br>
what is the backend. It might be that the backend you are using in 3.1 is<b=
r>
QEMU qdisk, not xen-blkback.<br>
</blockquote></div><br><br clear=3D"all"><br>-- <br>Roberto Scudeller<br><b=
r><br>

--20cf3079ba54d3583404b1501e8b--


--===============0195738266==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0195738266==--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:24:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:24:37 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBt7-0000Zs-3q; Wed, 09 Nov 2011 09:24:37 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBZE-00051J-Va
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 09:04:10 -0800
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1320858240!3545832!1
X-Originating-IP: [209.85.216.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30508 invoked from network); 9 Nov 2011 17:04:01 -0000
Received: from mail-qy0-f171.google.com (HELO mail-qy0-f171.google.com)
	(209.85.216.171)
	by server-15.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 17:04:01 -0000
Received: by qyg36 with SMTP id 36so5706534qyg.9
	for <xen-devel@lists.xensource.com>;
	Wed, 09 Nov 2011 09:04:00 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:from:date
	:x-google-sender-auth:message-id:subject:to:cc:content-type
	:content-transfer-encoding;
	bh=3wv0JUTzDuw+ig5pGw8N+TrmoKzmDFtCWDHGu9SlvW0=;
	b=Y7JK1vMctE0LSU5IjYtm+kBv7xpeYrB81RtVc47qWG0tOHW6AM9t9vKlImKNQC5GPv
	7L3uabqY5v4alntOh8zxx8UylRh/xm6e78jYur+E6UHJgeXWWmqB/1l/kUxNRpFIEarF
	51ScPSZL1KT9lvSlv1JNVqP2LrI8dsdANdCv4=
Received: by 10.182.180.116 with SMTP id dn20mr1041484obc.26.1320858240190;
	Wed, 09 Nov 2011 09:04:00 -0800 (PST)
MIME-Version: 1.0
Received: by 10.182.37.225 with HTTP; Wed, 9 Nov 2011 09:03:29 -0800 (PST)
In-Reply-To: <alpine.DEB.2.00.1111081242590.3519@kaball-desktop>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-8-git-send-email-anthony.perard@citrix.com>
	<alpine.DEB.2.00.1111081242590.3519@kaball-desktop>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Wed, 9 Nov 2011 17:03:29 +0000
X-Google-Sender-Auth: nU-0vvZQgh5FI-iEnJU5uRVOswM
Message-ID: <CAJJyHjJZriNiyHWHNrZSiyGBYBKOQmv-5URJhjAvyxanWjzh=Q@mail.gmail.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Guy Zana <guy@neocleus.com>, Xen Devel <xen-devel@lists.xensource.com>,
	Allen Kay <allen.m.kay@intel.com>, QEMU-devel <qemu-devel@nongnu.org>
Subject: [Xen-devel] Re: [Qemu-devel] [PATCH V3 07/10] Introduce Xen PCI
 Passthrough, qdevice (1/3)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 8, 2011 at 12:56, Stefano Stabellini
<stefano.stabellini@eu.citrix.com> wrote:
> On Fri, 28 Oct 2011, Anthony PERARD wrote:
>> From: Allen Kay <allen.m.kay@intel.com>
>>
>> Signed-off-by: Allen Kay <allen.m.kay@intel.com>
>> Signed-off-by: Guy Zana <guy@neocleus.com>
>> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
>> ---
>> =C2=A0Makefile.target =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0| =C2=A0 =C2=A02 +
>> =C2=A0hw/xen_pci_passthrough.c =C2=A0 =C2=A0 =C2=A0 =C2=A0 | =C2=A0838 +=
+++++++++++++++++++++++++++++++++++++
>> =C2=A0hw/xen_pci_passthrough.h =C2=A0 =C2=A0 =C2=A0 =C2=A0 | =C2=A0223 +=
+++++++++
>> =C2=A0hw/xen_pci_passthrough_helpers.c | =C2=A0 46 ++
>> =C2=A04 files changed, 1109 insertions(+), 0 deletions(-)
>> =C2=A0create mode 100644 hw/xen_pci_passthrough.c
>> =C2=A0create mode 100644 hw/xen_pci_passthrough.h
>> =C2=A0create mode 100644 hw/xen_pci_passthrough_helpers.c
>>
>> diff --git a/Makefile.target b/Makefile.target
>> index 243f9f2..36ea47d 100644
>> --- a/Makefile.target
>> +++ b/Makefile.target
>> @@ -217,6 +217,8 @@ obj-i386-$(CONFIG_XEN) +=3D xen_platform.o
>>
>> =C2=A0# Xen PCI Passthrough
>> =C2=A0obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) +=3D host-pci-device.o
>> +obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) +=3D xen_pci_passthrough.o
>> +obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) +=3D xen_pci_passthrough_helpers=
.o
>>
>> =C2=A0# Inter-VM PCI shared memory
>> =C2=A0CONFIG_IVSHMEM =3D
>> diff --git a/hw/xen_pci_passthrough.c b/hw/xen_pci_passthrough.c
>> new file mode 100644
>> index 0000000..b97c5b6
>> --- /dev/null
>> +++ b/hw/xen_pci_passthrough.c
>> @@ -0,0 +1,838 @@
>> +/*
>> + * Copyright (c) 2007, Neocleus Corporation.
>> + * Copyright (c) 2007, Intel Corporation.
>> + *
>> + * This work is licensed under the terms of the GNU GPL, version 2. =C2=
=A0See
>> + * the COPYING file in the top-level directory.
>> + *
>> + * Alex Novik <alex@neocleus.com>
>> + * Allen Kay <allen.m.kay@intel.com>
>> + * Guy Zana <guy@neocleus.com>
>> + *
>> + * This file implements direct PCI assignment to a HVM guest
>> + */
>> +
>> +/*
>> + * Interrupt Disable policy:
>> + *
>> + * INTx interrupt:
>> + * =C2=A0 Initialize(register_real_device)
>> + * =C2=A0 =C2=A0 Map INTx(xc_physdev_map_pirq):
>> + * =C2=A0 =C2=A0 =C2=A0 <fail>
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 - Set real Interrupt Disable bit to '1'.
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 - Set machine_irq and assigned_device->m=
achine_irq to '0'.
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 * Don't bind INTx.
>> + *
>> + * =C2=A0 =C2=A0 Bind INTx(xc_domain_bind_pt_pci_irq):
>> + * =C2=A0 =C2=A0 =C2=A0 <fail>
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 - Set real Interrupt Disable bit to '1'.
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 - Unmap INTx.
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 - Decrement mapped_machine_irq[machine_i=
rq]
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 - Set assigned_device->machine_irq to '0=
'.
>> + *
>> + * =C2=A0 Write to Interrupt Disable bit by guest software(pt_cmd_reg_w=
rite)
>> + * =C2=A0 =C2=A0 Write '0'
>> + * =C2=A0 =C2=A0 =C2=A0 <ptdev->msi_trans_en is false>
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 - Set real bit to '0' if assigned_device=
->machine_irq isn't '0'.
>> + *
>> + * =C2=A0 =C2=A0 Write '1'
>> + * =C2=A0 =C2=A0 =C2=A0 <ptdev->msi_trans_en is false>
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 - Set real bit to '1'.
>> + *
>> + * MSI-INTx translation.
>> + * =C2=A0 Initialize(xc_physdev_map_pirq_msi/pt_msi_setup)
>> + * =C2=A0 =C2=A0 Bind MSI-INTx(xc_domain_bind_pt_irq)
>> + * =C2=A0 =C2=A0 =C2=A0 <fail>
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 - Unmap MSI.
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 <success>
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 - Set dev->msi->pirq to '-=
1'.
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 <fail>
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 - Do nothing.
>> + *
>> + * =C2=A0 Write to Interrupt Disable bit by guest software(pt_cmd_reg_w=
rite)
>> + * =C2=A0 =C2=A0 Write '0'
>> + * =C2=A0 =C2=A0 =C2=A0 <ptdev->msi_trans_en is true>
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 - Set MSI Enable bit to '1'.
>> + *
>> + * =C2=A0 =C2=A0 Write '1'
>> + * =C2=A0 =C2=A0 =C2=A0 <ptdev->msi_trans_en is true>
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 - Set MSI Enable bit to '0'.
>> + *
>> + * MSI interrupt:
>> + * =C2=A0 Initialize MSI register(pt_msi_setup, pt_msi_update)
>> + * =C2=A0 =C2=A0 Bind MSI(xc_domain_update_msi_irq)
>> + * =C2=A0 =C2=A0 =C2=A0 <fail>
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 - Unmap MSI.
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 - Set dev->msi->pirq to '-1'.
>> + *
>> + * MSI-X interrupt:
>> + * =C2=A0 Initialize MSI-X register(pt_msix_update_one)
>> + * =C2=A0 =C2=A0 Bind MSI-X(xc_domain_update_msi_irq)
>> + * =C2=A0 =C2=A0 =C2=A0 <fail>
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 - Unmap MSI-X.
>> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 - Set entry->pirq to '-1'.
>> + */
>> +
>
> you should move all the MSI related comments to the MSI patch

OK, I will move MSI comments.

>> +#include <sys/ioctl.h>
>> +
>> +#include "pci.h"
>> +#include "xen.h"
>> +#include "xen_backend.h"
>> +#include "xen_pci_passthrough.h"
>> +
>> +#define PCI_BAR_ENTRIES (6)
>> +
>> +#define PT_NR_IRQS =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(256)
>> +char mapped_machine_irq[PT_NR_IRQS] =3D {0};
>> +
>> +/* Config Space */
>> +static int pt_pci_config_access_check(PCIDevice *d, uint32_t address, i=
nt len)
>> +{
>> + =C2=A0 =C2=A0/* check offset range */
>> + =C2=A0 =C2=A0if (address >=3D 0xFF) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Error: Failed to access register wi=
th offset exceeding FFh. "
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "[%02x:%02x.%x][Offse=
t:%02xh][Length:%d]\n",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pci_bus_num(d->bus), =
PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 address, len);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return -1;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* check read size */
>> + =C2=A0 =C2=A0if ((len !=3D 1) && (len !=3D 2) && (len !=3D 4)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Error: Failed to access register wi=
th invalid access length. "
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "[%02x:%02x.%x][Offse=
t:%02xh][Length:%d]\n",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pci_bus_num(d->bus), =
PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 address, len);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return -1;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* check offset alignment */
>> + =C2=A0 =C2=A0if (address & (len - 1)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Error: Failed to access register wi=
th invalid access size "
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"alignment. [%02x:%02x.%x][Of=
fset:%02xh][Length:%d]\n",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pci_bus_num(d->bus), PCI_SLOT=
(d->devfn), PCI_FUNC(d->devfn),
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0address, len);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return -1;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0return 0;
>> +}
>> +
>> +int pt_bar_offset_to_index(uint32_t offset)
>> +{
>> + =C2=A0 =C2=A0int index =3D 0;
>> +
>> + =C2=A0 =C2=A0/* check Exp ROM BAR */
>> + =C2=A0 =C2=A0if (offset =3D=3D PCI_ROM_ADDRESS) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return PCI_ROM_SLOT;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* calculate BAR index */
>> + =C2=A0 =C2=A0index =3D (offset - PCI_BASE_ADDRESS_0) >> 2;
>> + =C2=A0 =C2=A0if (index >=3D PCI_NUM_REGIONS) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return -1;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0return index;
>> +}
>> +
>> +static uint32_t pt_pci_read_config(PCIDevice *d, uint32_t address, int =
len)
>> +{
>> + =C2=A0 =C2=A0XenPCIPassthroughState *s =3D DO_UPCAST(XenPCIPassthrough=
State, dev, d);
>> + =C2=A0 =C2=A0uint32_t val =3D 0;
>> + =C2=A0 =C2=A0XenPTRegGroup *reg_grp_entry =3D NULL;
>> + =C2=A0 =C2=A0XenPTReg *reg_entry =3D NULL;
>> + =C2=A0 =C2=A0int rc =3D 0;
>> + =C2=A0 =C2=A0int emul_len =3D 0;
>> + =C2=A0 =C2=A0uint32_t find_addr =3D address;
>> +
>> + =C2=A0 =C2=A0if (pt_pci_config_access_check(d, address, len)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0goto exit;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* check power state transition flags */
>> + =C2=A0 =C2=A0if (s->pm_state !=3D NULL && s->pm_state->flags & PT_FLAG=
_TRANSITING) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* can't accept until previous power state =
transition is completed.
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 * so finished previous request here.
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Warning: guest want to write durrin=
g power state transition\n");
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0goto exit;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* find register group entry */
>> + =C2=A0 =C2=A0reg_grp_entry =3D pt_find_reg_grp(s, address);
>> + =C2=A0 =C2=A0if (reg_grp_entry) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* check 0 Hardwired register group */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (reg_grp_entry->reg_grp->grp_type =3D=3D=
 GRP_TYPE_HARDWIRED) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* no need to emulate, just r=
eturn 0 */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0val =3D 0;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto exit;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* read I/O device register value */
>> + =C2=A0 =C2=A0rc =3D host_pci_get_block(s->real_device, address, (uint8=
_t *)&val, len);
>> + =C2=A0 =C2=A0if (!rc) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Error: pci_read_block failed. retur=
n value[%d].\n", rc);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0memset(&val, 0xff, len);
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* just return the I/O device register value for
>> + =C2=A0 =C2=A0 * passthrough type register group */
>> + =C2=A0 =C2=A0if (reg_grp_entry =3D=3D NULL) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0goto exit;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* adjust the read value to appropriate CFC-CFF window */
>> + =C2=A0 =C2=A0val <<=3D (address & 3) << 3;
>> + =C2=A0 =C2=A0emul_len =3D len;
>> +
>> + =C2=A0 =C2=A0/* loop Guest request size */
>> + =C2=A0 =C2=A0while (emul_len > 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* find register entry to be emulated */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0reg_entry =3D pt_find_reg(reg_grp_entry, fi=
nd_addr);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (reg_entry) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0XenPTRegInfo *reg =3D reg_ent=
ry->reg;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0uint32_t real_offset =3D reg_=
grp_entry->base_offset + reg->offset;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0uint32_t valid_mask =3D 0xFFF=
FFFFF >> ((4 - emul_len) << 3);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0uint8_t *ptr_val =3D NULL;
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0valid_mask <<=3D (find_addr -=
 real_offset) << 3;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ptr_val =3D (uint8_t *)&val +=
 (real_offset & 3);
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* do emulation depend on reg=
ister size */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0switch (reg->size) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case 1:
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (reg->u.b.re=
ad) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0r=
c =3D reg->u.b.read(s, reg_entry, ptr_val, valid_mask);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case 2:
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (reg->u.w.re=
ad) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0r=
c =3D reg->u.w.read(s, reg_entry,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (uint16_t *)=
ptr_val, valid_mask);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case 4:
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (reg->u.dw.r=
ead) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0r=
c =3D reg->u.dw.read(s, reg_entry,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(uint3=
2_t *)ptr_val, valid_mask);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (rc < 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0hw_error("Inter=
nal error: Invalid read emulation "
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 "return value[%d]. I/O emulator exit.\n", rc);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* calculate next address to =
find */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0emul_len -=3D reg->size;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (emul_len > 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0find_addr =3D r=
eal_offset + reg->size;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0} else {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* nothing to do with passthr=
ough type register,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * continue to find next byte=
 */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0emul_len--;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0find_addr++;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* need to shift back before returning them to pci bus em=
ulator */
>> + =C2=A0 =C2=A0val >>=3D ((address & 3) << 3);
>> +
>> +exit:
>> + =C2=A0 =C2=A0PT_LOG_CONFIG("[%02x:%02x.%x]: address=3D%04x val=3D0x%08=
x len=3D%d\n",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pci_bus_=
num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0address,=
 val, len);
>> + =C2=A0 =C2=A0return val;
>> +}
>> +
>> +static void pt_pci_write_config(PCIDevice *d, uint32_t address,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0uint32_t val, int len)
>> +{
>> + =C2=A0 =C2=A0XenPCIPassthroughState *s =3D DO_UPCAST(XenPCIPassthrough=
State, dev, d);
>> + =C2=A0 =C2=A0int index =3D 0;
>> + =C2=A0 =C2=A0XenPTRegGroup *reg_grp_entry =3D NULL;
>> + =C2=A0 =C2=A0int rc =3D 0;
>> + =C2=A0 =C2=A0uint32_t read_val =3D 0;
>> + =C2=A0 =C2=A0int emul_len =3D 0;
>> + =C2=A0 =C2=A0XenPTReg *reg_entry =3D NULL;
>> + =C2=A0 =C2=A0uint32_t find_addr =3D address;
>> + =C2=A0 =C2=A0XenPTRegInfo *reg =3D NULL;
>> +
>> + =C2=A0 =C2=A0if (pt_pci_config_access_check(d, address, len)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0PT_LOG_CONFIG("[%02x:%02x.%x]: address=3D%04x val=3D0x%08=
x len=3D%d\n",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pci_bus_=
num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0address,=
 val, len);
>> +
>> + =C2=A0 =C2=A0/* check unused BAR register */
>> + =C2=A0 =C2=A0index =3D pt_bar_offset_to_index(address);
>> + =C2=A0 =C2=A0if ((index >=3D 0) && (val > 0 && val < PT_BAR_ALLF) &&
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0(s->bases[index].bar_flag =3D=3D PT_BAR_FLA=
G_UNUSED)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Warning: Guest attempt to set addre=
ss to unused Base Address "
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "Register. [%02x:%02x=
.%x][Offset:%02xh][Length:%d]\n",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pci_bus_num(d->bus), =
PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 address, len);
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* check power state transition flags */
>> + =C2=A0 =C2=A0if (s->pm_state !=3D NULL && s->pm_state->flags & PT_FLAG=
_TRANSITING) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* can't accept untill previous power state=
 transition is completed.
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 * so finished previous request here.
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Warning: guest want to write durrin=
g power state transition\n");
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* find register group entry */
>> + =C2=A0 =C2=A0reg_grp_entry =3D pt_find_reg_grp(s, address);
>> + =C2=A0 =C2=A0if (reg_grp_entry) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* check 0 Hardwired register group */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (reg_grp_entry->reg_grp->grp_type =3D=3D=
 GRP_TYPE_HARDWIRED) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* ignore silently */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Warning: Access to 0 =
Hardwired register. "
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "[%02x:=
%02x.%x][Offset:%02xh][Length:%d]\n",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pci_bus=
_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 address=
, len);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* read I/O device register value */
>> + =C2=A0 =C2=A0rc =3D host_pci_get_block(s->real_device, address,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 (uint8_t *)&read_val, len);
>> + =C2=A0 =C2=A0if (!rc) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Error: pci_read_block failed. retur=
n value[%d].\n", rc);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0memset(&read_val, 0xff, len);
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* pass directly to libpci for passthrough type register =
group */
>> + =C2=A0 =C2=A0if (reg_grp_entry =3D=3D NULL) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* adjust the read and write value to appropriate CFC-CFF=
 window */
>> + =C2=A0 =C2=A0read_val <<=3D (address & 3) << 3;
>> + =C2=A0 =C2=A0val <<=3D (address & 3) << 3;
>> + =C2=A0 =C2=A0emul_len =3D len;
>> +
>> + =C2=A0 =C2=A0/* loop Guest request size */
>> + =C2=A0 =C2=A0while (emul_len > 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* find register entry to be emulated */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0reg_entry =3D pt_find_reg(reg_grp_entry, fi=
nd_addr);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (reg_entry) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0reg =3D reg_entry->reg;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0uint32_t real_offset =3D reg_=
grp_entry->base_offset + reg->offset;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0uint32_t valid_mask =3D 0xFFF=
FFFFF >> ((4 - emul_len) << 3);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0uint8_t *ptr_val =3D NULL;
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0valid_mask <<=3D (find_addr -=
 real_offset) << 3;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ptr_val =3D (uint8_t *)&val +=
 (real_offset & 3);
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* do emulation depend on reg=
ister size */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0switch (reg->size) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case 1:
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (reg->u.b.wr=
ite) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0r=
c =3D reg->u.b.write(s, reg_entry, ptr_val,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0read_v=
al >> ((real_offset & 3) << 3),
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0valid_=
mask);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case 2:
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (reg->u.w.wr=
ite) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0r=
c =3D reg->u.w.write(s, reg_entry, (uint16_t *)ptr_val,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(read_=
val >> ((real_offset & 3) << 3)),
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0valid_=
mask);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case 4:
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (reg->u.dw.w=
rite) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0r=
c =3D reg->u.dw.write(s, reg_entry, (uint32_t *)ptr_val,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (read=
_val >> ((real_offset & 3) << 3)),
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 valid=
_mask);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (rc < 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0hw_error("Inter=
nal error: Invalid write emulation "
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 "return value[%d]. I/O emulator exit.\n", rc);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* calculate next address to =
find */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0emul_len -=3D reg->size;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (emul_len > 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0find_addr =3D r=
eal_offset + reg->size;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0} else {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* nothing to do with passthr=
ough type register,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * continue to find next byte=
 */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0emul_len--;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0find_addr++;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* need to shift back before passing them to libpci */
>> + =C2=A0 =C2=A0val >>=3D (address & 3) << 3;
>> +
>> +out:
>> + =C2=A0 =C2=A0if (!(reg && reg->no_wb)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* unknown regs are passed through */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D host_pci_set_block(s->real_device, a=
ddress, (uint8_t *)&val, len);
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!rc) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Error: pci_write_bloc=
k failed. return value[%d].\n", rc);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0if (s->pm_state !=3D NULL && s->pm_state->flags & PT_FLAG=
_TRANSITING) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0qemu_mod_timer(s->pm_state->pm_timer,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 qemu_get_clock_ms(rt_clock) + s->pm_state->pm_delay);
>> + =C2=A0 =C2=A0}
>> +}
>
> Where is this timer allocated and initialized?

In the next patch, I will move this lines to the releated patch.

>> +/* ioport/iomem space*/
>> +static void pt_iomem_map(XenPCIPassthroughState *s, int i,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 pcibus_t e_phys, pcibus_t e_size, int type)
>> +{
>> + =C2=A0 =C2=A0uint32_t old_ebase =3D s->bases[i].e_physbase;
>> + =C2=A0 =C2=A0bool first_map =3D s->bases[i].e_size =3D=3D 0;
>> + =C2=A0 =C2=A0int ret =3D 0;
>> +
>> + =C2=A0 =C2=A0s->bases[i].e_physbase =3D e_phys;
>> + =C2=A0 =C2=A0s->bases[i].e_size =3D e_size;
>> +
>> + =C2=A0 =C2=A0PT_LOG("e_phys=3D%#"PRIx64" maddr=3D%#"PRIx64" type=3D%%d=
"
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 " len=3D%#"PRIx64" index=3D%d first=
_map=3D%d\n",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 e_phys, s->bases[i].access.maddr, /=
*type,*/
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 e_size, i, first_map);
>> +
>> + =C2=A0 =C2=A0if (e_size =3D=3D 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0if (!first_map && old_ebase !=3D -1) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Remove old mapping */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D xc_domain_memory_mapping(xen_xc, xe=
n_domid,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 old_ebase >> XC_PAGE_SHIFT,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 s->bases[i].access.maddr >> XC_PAGE_SHIF=
T,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (e_size + XC_PAGE_SIZE - 1) >> XC_PAGE_S=
HIFT,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 DPCI_REMOVE_MAPPING);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret !=3D 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Error: remove old map=
ping failed!\n");
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* map only valid guest address */
>> + =C2=A0 =C2=A0if (e_phys !=3D -1) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Create new mapping */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D xc_domain_memory_mapping(xen_xc, xe=
n_domid,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 s->bases[i].e_physbase >> =
XC_PAGE_SHIFT,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 s->bases[i].access.maddr >=
> XC_PAGE_SHIFT,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (e_size+XC_PAGE_SIZE-1) >>=
 XC_PAGE_SHIFT,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 DPCI_ADD_MAPPING);
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret !=3D 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Error: create new map=
ping failed!\n");
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> +}
>> +
>> +static void pt_ioport_map(XenPCIPassthroughState *s, int i,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0pcibus_t e_phys, pcibus_t e_size, int type)
>> +{
>> + =C2=A0 =C2=A0uint32_t old_ebase =3D s->bases[i].e_physbase;
>> + =C2=A0 =C2=A0bool first_map =3D s->bases[i].e_size =3D=3D 0;
>> + =C2=A0 =C2=A0int ret =3D 0;
>> +
>> + =C2=A0 =C2=A0s->bases[i].e_physbase =3D e_phys;
>> + =C2=A0 =C2=A0s->bases[i].e_size =3D e_size;
>> +
>> + =C2=A0 =C2=A0PT_LOG("e_phys=3D%#04"PRIx64" pio_base=3D%#04"PRIx64" len=
=3D%"PRId64" index=3D%d"
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 " first_map=3D%d\n",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 e_phys, s->bases[i].access.pio_base=
, e_size, i, first_map);
>> +
>> + =C2=A0 =C2=A0if (e_size =3D=3D 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0if (!first_map && old_ebase !=3D -1) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Remove old mapping */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D xc_domain_ioport_mapping(xen_xc, xe=
n_domid, old_ebase,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 s->bases[i].=
access.pio_base, e_size,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 DPCI_REMOVE_=
MAPPING);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret !=3D 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Error: remove old map=
ping failed!\n");
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* map only valid guest address (include 0) */
>> + =C2=A0 =C2=A0if (e_phys !=3D -1) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Create new mapping */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D xc_domain_ioport_mapping(xen_xc, xe=
n_domid, e_phys,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 s->bases[i].=
access.pio_base, e_size,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 DPCI_ADD_MAP=
PING);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret !=3D 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Error: create new map=
ping failed!\n");
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> +
>> +}
>> +
>> +
>> +/* mapping BAR */
>> +
>> +void pt_bar_mapping_one(XenPCIPassthroughState *s, int bar,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0int io_enable, int mem_enable)
>> +{
>> + =C2=A0 =C2=A0PCIDevice *dev =3D &s->dev;
>> + =C2=A0 =C2=A0PCIIORegion *r;
>> + =C2=A0 =C2=A0XenPTRegGroup *reg_grp_entry =3D NULL;
>> + =C2=A0 =C2=A0XenPTReg *reg_entry =3D NULL;
>> + =C2=A0 =C2=A0XenPTRegion *base =3D NULL;
>> + =C2=A0 =C2=A0pcibus_t r_size =3D 0, r_addr =3D -1;
>> + =C2=A0 =C2=A0int rc =3D 0;
>> +
>> + =C2=A0 =C2=A0r =3D &dev->io_regions[bar];
>> +
>> + =C2=A0 =C2=A0/* check valid region */
>> + =C2=A0 =C2=A0if (!r->size) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0base =3D &s->bases[bar];
>> + =C2=A0 =C2=A0/* skip unused BAR or upper 64bit BAR */
>> + =C2=A0 =C2=A0if ((base->bar_flag =3D=3D PT_BAR_FLAG_UNUSED)
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0|| (base->bar_flag =3D=3D PT_BAR_FLAG_UPPER=
)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* copy region address to temporary */
>> + =C2=A0 =C2=A0r_addr =3D r->addr;
>> +
>> + =C2=A0 =C2=A0/* need unmapping in case I/O Space or Memory Space disab=
le */
>> + =C2=A0 =C2=A0if (((base->bar_flag =3D=3D PT_BAR_FLAG_IO) && !io_enable=
) ||
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0((base->bar_flag =3D=3D PT_BAR_FLAG_MEM) &&=
 !mem_enable)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0r_addr =3D -1;
>> + =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0if ((bar =3D=3D PCI_ROM_SLOT) && (r_addr !=3D -1)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0reg_grp_entry =3D pt_find_reg_grp(s, PCI_RO=
M_ADDRESS);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (reg_grp_entry) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0reg_entry =3D pt_find_reg(reg=
_grp_entry, PCI_ROM_ADDRESS);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (reg_entry && !(reg_entry-=
>data & PCI_ROM_ADDRESS_ENABLE)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0r_addr =3D -1;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* prevent guest software mapping memory resource to 0000=
0000h */
>> + =C2=A0 =C2=A0if ((base->bar_flag =3D=3D PT_BAR_FLAG_MEM) && (r_addr =
=3D=3D 0)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0r_addr =3D -1;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0r_size =3D pt_get_emul_size(base->bar_flag, r->size);
>> +
>> + =C2=A0 =C2=A0rc =3D pci_check_bar_overlap(dev, r_addr, r_size, r->type=
);
>> + =C2=A0 =C2=A0if (rc > 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Warning: s[%02x:%02x.%x][Region:%d]=
[Address:%"FMT_PCIBUS"h]"
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "[Size:%"FMT_PCIBUS"h=
] is overlapped.\n", pci_bus_num(dev->bus),
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 PCI_SLOT(dev->devfn),=
 PCI_FUNC(dev->devfn), bar,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 r_addr, r_size);
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* check whether we need to update the mapping or not */
>> + =C2=A0 =C2=A0if (r_addr !=3D s->bases[bar].e_physbase) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* mapping BAR */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (base->bar_flag =3D=3D PT_BAR_FLAG_IO) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pt_ioport_map(s, bar, r_addr,=
 r_size, r->type);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0} else {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pt_iomem_map(s, bar, r_addr, =
r_size, r->type);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> +}
>> +
>> +void pt_bar_mapping(XenPCIPassthroughState *s, int io_enable, int mem_e=
nable)
>> +{
>> + =C2=A0 =C2=A0int i;
>> +
>> + =C2=A0 =C2=A0for (i =3D 0; i < PCI_NUM_REGIONS; i++) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0pt_bar_mapping_one(s, i, io_enable, mem_ena=
ble);
>> + =C2=A0 =C2=A0}
>> +}
>> +
>> +/* register regions */
>> +static int pt_register_regions(XenPCIPassthroughState *s)
>> +{
>> + =C2=A0 =C2=A0int i =3D 0;
>> + =C2=A0 =C2=A0uint32_t bar_data =3D 0;
>> + =C2=A0 =C2=A0HostPCIDevice *d =3D s->real_device;
>> +
>> + =C2=A0 =C2=A0/* Register PIO/MMIO BARs */
>> + =C2=A0 =C2=A0for (i =3D 0; i < PCI_BAR_ENTRIES; i++) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0HostPCIIORegion *r =3D &d->io_regions[i];
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (r->base_addr) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0s->bases[i].e_physbase =3D r-=
>base_addr;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0s->bases[i].access.u =3D r->b=
ase_addr;
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Register current region */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (r->flags & IORESOURCE_IO)=
 {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0memory_region_i=
nit_io(&s->bar[i], NULL, NULL,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"xen-pci-pt-b=
ar", r->size);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pci_register_ba=
r(&s->dev, i, PCI_BASE_ADDRESS_SPACE_IO,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &s->bar[i]);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0} else if (r->flags & IORESOU=
RCE_PREFETCH) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0memory_region_i=
nit_io(&s->bar[i], NULL, NULL,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"xen-pci-pt-b=
ar", r->size);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pci_register_ba=
r(&s->dev, i, PCI_BASE_ADDRESS_MEM_PREFETCH,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &s->bar[i]);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0} else {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0memory_region_i=
nit_io(&s->bar[i], NULL, NULL,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"xen-pci-pt-b=
ar", r->size);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pci_register_ba=
r(&s->dev, i, PCI_BASE_ADDRESS_SPACE_MEMORY,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &s->bar[i]);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("IO region registered =
(size=3D0x%08"PRIx64
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 " base_=
addr=3D0x%08"PRIx64")\n",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 r->size=
, r->base_addr);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* Register expansion ROM address */
>> + =C2=A0 =C2=A0if (d->rom.base_addr && d->rom.size) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Re-set BAR reported by OS, otherwise ROM=
 can't be read. */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0bar_data =3D host_pci_get_long(d, PCI_ROM_A=
DDRESS);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if ((bar_data & PCI_ROM_ADDRESS_MASK) =3D=
=3D 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bar_data |=3D d->rom.base_add=
r & PCI_ROM_ADDRESS_MASK;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0host_pci_set_long(d, PCI_ROM_=
ADDRESS, bar_data);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0s->bases[PCI_ROM_SLOT].e_physbase =3D d->ro=
m.base_addr;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0s->bases[PCI_ROM_SLOT].access.maddr =3D d->=
rom.base_addr;
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0memory_region_init_rom_device(&s->rom, NULL=
, NULL, &s->dev.qdev,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"xen-pci-pt-r=
om", d->rom.size);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0pci_register_bar(&s->dev, PCI_ROM_SLOT, PCI=
_BASE_ADDRESS_MEM_PREFETCH,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 &s->rom);
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Expansion ROM registered (size=3D0x=
%08"PRIx64
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 " base_addr=3D0x%08"P=
RIx64")\n",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 d->rom.size, d->rom.b=
ase_addr);
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0return 0;
>> +}
>> +
>> +static void pt_unregister_regions(XenPCIPassthroughState *s)
>> +{
>> + =C2=A0 =C2=A0int i, type, rc;
>> + =C2=A0 =C2=A0uint32_t e_size;
>> + =C2=A0 =C2=A0PCIDevice *d =3D &s->dev;
>> +
>> + =C2=A0 =C2=A0for (i =3D 0; i < PCI_NUM_REGIONS; i++) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0e_size =3D s->bases[i].e_size;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if ((e_size =3D=3D 0) || (s->bases[i].e_phy=
sbase =3D=3D -1)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0continue;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0type =3D d->io_regions[i].type;
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (type =3D=3D PCI_BASE_ADDRESS_SPACE_MEMO=
RY
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|| type =3D=3D PCI_BASE_ADDRE=
SS_MEM_PREFETCH) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D xc_domain_memory_mappi=
ng(xen_xc, xen_domid,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0s=
->bases[i].e_physbase >> XC_PAGE_SHIFT,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0s=
->bases[i].access.maddr >> XC_PAGE_SHIFT,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(=
e_size+XC_PAGE_SIZE-1) >> XC_PAGE_SHIFT,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0D=
PCI_REMOVE_MAPPING);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (rc !=3D 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Error: =
remove old mem mapping failed!\n");
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0continue;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0} else if (type =3D=3D PCI_BASE_ADDRESS_SPA=
CE_IO) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D xc_domain_ioport_mappi=
ng(xen_xc, xen_domid,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0s->bases[i].e_physbase,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0s->bases[i].access.pio_base,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0e_size,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0DPCI_REMOVE_MAPPING);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (rc !=3D 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Error: =
remove old io mapping failed!\n");
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0continue;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> +}
>> +
>> +static int pt_initfn(PCIDevice *pcidev)
>> +{
>> + =C2=A0 =C2=A0XenPCIPassthroughState *s =3D DO_UPCAST(XenPCIPassthrough=
State, dev, pcidev);
>> + =C2=A0 =C2=A0int dom, bus;
>> + =C2=A0 =C2=A0unsigned slot, func;
>> + =C2=A0 =C2=A0int rc =3D 0;
>> + =C2=A0 =C2=A0uint32_t machine_irq;
>> + =C2=A0 =C2=A0int pirq =3D -1;
>> +
>> + =C2=A0 =C2=A0if (pci_parse_devaddr(s->hostaddr, &dom, &bus, &slot, &fu=
nc) < 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr, "error parse bdf: %s\n", s-=
>hostaddr);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return -1;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* register real device */
>> + =C2=A0 =C2=A0PT_LOG("Assigning real physical device %02x:%02x.%x to de=
vfn %i ...\n",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 bus, slot, func, s->dev.devfn);
>> +
>> + =C2=A0 =C2=A0s->real_device =3D host_pci_device_get(bus, slot, func);
>> + =C2=A0 =C2=A0if (!s->real_device) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return -1;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0s->is_virtfn =3D s->real_device->is_virtfn;
>> + =C2=A0 =C2=A0if (s->is_virtfn) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("%04x:%02x:%02x.%x is a SR-IOV Virtu=
al Function\n",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 s->real_device->domai=
n, bus, slot, func);
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* Initialize virtualized PCI configuration (Extended 256=
 Bytes) */
>> + =C2=A0 =C2=A0if (host_pci_get_block(s->real_device, 0, pcidev->config,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 PCI_CONFIG_SPACE_SIZE) =3D=3D -1) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return -1;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* Handle real device's MMIO/PIO BARs */
>> + =C2=A0 =C2=A0pt_register_regions(s);
>> +
>> + =C2=A0 =C2=A0/* reinitialize each config register to be emulated */
>> + =C2=A0 =C2=A0pt_config_init(s);
>
> this function is implemented in the next patch, so you might as well add
> this call there

Ok, I will move this.

>> + =C2=A0 =C2=A0/* Bind interrupt */
>> + =C2=A0 =C2=A0if (!s->dev.config[PCI_INTERRUPT_PIN]) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("no pin interrupt\n");
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0machine_irq =3D host_pci_get_byte(s->real_device, PCI_INT=
ERRUPT_LINE);
>> + =C2=A0 =C2=A0rc =3D xc_physdev_map_pirq(xen_xc, xen_domid, machine_irq=
, &pirq);
>> +
>> + =C2=A0 =C2=A0if (rc) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Error: Mapping irq failed, rc =3D %=
d\n", rc);
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Disable PCI intx assertion (turn on bit1=
0 of devctl) */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0host_pci_set_word(s->real_device,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0PCI_COMMAND,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0pci_get_word(s->dev.config + PCI_COMMAND)
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0| PCI_COMMAND_INTX_DISABLE);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0machine_irq =3D 0;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0s->machine_irq =3D 0;
>> + =C2=A0 =C2=A0} else {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0machine_irq =3D pirq;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0s->machine_irq =3D pirq;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0mapped_machine_irq[machine_irq]++;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* bind machine_irq to device */
>> + =C2=A0 =C2=A0if (rc < 0 && machine_irq !=3D 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0uint8_t e_device =3D PCI_SLOT(s->dev.devfn)=
;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0uint8_t e_intx =3D pci_intx(s);
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D xc_domain_bind_pt_pci_irq(xen_xc, xe=
n_domid, machine_irq, 0,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 e_device, e_=
intx);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (rc < 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Error: Binding of int=
errupt failed! rc=3D%d\n", rc);
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Disable PCI intx assertion=
 (turn on bit10 of devctl) */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0host_pci_set_word(s->real_dev=
ice, PCI_COMMAND,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*(uint16_t *)(&s->dev.config[PCI_COMMAND]=
)
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| PCI_COMMAND_INTX_DISABLE);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0mapped_machine_irq[machine_ir=
q]--;
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (mapped_machine_irq[machin=
e_irq] =3D=3D 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xc_physdev_=
unmap_pirq(xen_xc, xen_domid, machine_irq)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0P=
T_LOG("Error: Unmapping of interrupt failed! rc=3D%d\n",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 rc);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0s->machine_irq =3D 0;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> +
>> +out:
>> + =C2=A0 =C2=A0PT_LOG("Real physical device %02x:%02x.%x registered succ=
essfuly!\n"
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "IRQ type =3D %s\n", bus, slot, fun=
c, "INTx");
>> +
>> + =C2=A0 =C2=A0return 0;
>> +}
>> +
>> +static int pt_unregister_device(PCIDevice *pcidev)
>> +{
>> + =C2=A0 =C2=A0XenPCIPassthroughState *s =3D DO_UPCAST(XenPCIPassthrough=
State, dev, pcidev);
>> + =C2=A0 =C2=A0uint8_t e_device, e_intx;
>> + =C2=A0 =C2=A0uint32_t machine_irq;
>> + =C2=A0 =C2=A0int rc;
>> +
>> + =C2=A0 =C2=A0/* Unbind interrupt */
>> + =C2=A0 =C2=A0e_device =3D PCI_SLOT(s->dev.devfn);
>> + =C2=A0 =C2=A0e_intx =3D pci_intx(s);
>> + =C2=A0 =C2=A0machine_irq =3D s->machine_irq;
>> +
>> + =C2=A0 =C2=A0if (machine_irq) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D xc_domain_unbind_pt_irq(xen_xc, xen_=
domid, machine_irq,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 PT_IRQ_TYPE_PCI, 0,=
 e_device, e_intx, 0);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (rc < 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Error: Unbinding of i=
nterrupt failed! rc=3D%d\n", rc);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0if (machine_irq) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0mapped_machine_irq[machine_irq]--;
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (mapped_machine_irq[machine_irq] =3D=3D =
0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D xc_physdev_unmap_pirq(=
xen_xc, xen_domid, machine_irq);
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (rc < 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Error: =
Unmaping of interrupt failed! rc=3D%d\n", rc);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0/* delete all emulated config registers */
>> + =C2=A0 =C2=A0pt_config_delete(s);
>> +
>> + =C2=A0 =C2=A0/* unregister real device's MMIO/PIO BARs */
>> + =C2=A0 =C2=A0pt_unregister_regions(s);
>> +
>> + =C2=A0 =C2=A0host_pci_device_put(s->real_device);
>> +
>> + =C2=A0 =C2=A0return 0;
>> +}
>> +
>> +static PCIDeviceInfo xen_pci_passthrough =3D {
>> + =C2=A0 =C2=A0.init =3D pt_initfn,
>> + =C2=A0 =C2=A0.exit =3D pt_unregister_device,
>> + =C2=A0 =C2=A0.qdev.name =3D "xen-pci-passthrough",
>> + =C2=A0 =C2=A0.qdev.desc =3D "Assign an host pci device with Xen",
>> + =C2=A0 =C2=A0.qdev.size =3D sizeof(XenPCIPassthroughState),
>> + =C2=A0 =C2=A0.config_read =3D pt_pci_read_config,
>> + =C2=A0 =C2=A0.config_write =3D pt_pci_write_config,
>> + =C2=A0 =C2=A0.is_express =3D 0,
>> + =C2=A0 =C2=A0.qdev.props =3D (Property[]) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0DEFINE_PROP_STRING("hostaddr", XenPCIPassth=
roughState, hostaddr),
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0DEFINE_PROP_BIT("power-mgmt", XenPCIPassthr=
oughState, power_mgmt,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A00, false),
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0DEFINE_PROP_END_OF_LIST(),
>> + =C2=A0 =C2=A0}
>> +};
>> +
>> +static void xen_passthrough_register(void)
>> +{
>> + =C2=A0 =C2=A0pci_qdev_register(&xen_pci_passthrough);
>> +}
>> +
>> +device_init(xen_passthrough_register);
>> diff --git a/hw/xen_pci_passthrough.h b/hw/xen_pci_passthrough.h
>> new file mode 100644
>> index 0000000..2d1979d
>> --- /dev/null
>> +++ b/hw/xen_pci_passthrough.h
>> @@ -0,0 +1,223 @@
>> +#ifndef QEMU_HW_XEN_PCI_PASSTHROUGH_H
>> +# =C2=A0define QEMU_HW_XEN_PCI_PASSTHROUGH_H
>> +
>> +#include "qemu-common.h"
>> +#include "xen_common.h"
>> +#include "pci.h"
>> +#include "host-pci-device.h"
>> +
>> +#define PT_LOGGING_ENABLED
>> +#define PT_DEBUG_PCI_CONFIG_ACCESS
>> +
>> +#ifdef PT_LOGGING_ENABLED
>> +# =C2=A0define PT_LOG(_f, _a...) =C2=A0 fprintf(stderr, "%s: " _f, __fu=
nc__, ##_a)
>> +#else
>> +# =C2=A0define PT_LOG(_f, _a...)
>> +#endif
>> +
>> +#ifdef PT_DEBUG_PCI_CONFIG_ACCESS
>> +# =C2=A0define PT_LOG_CONFIG(_f, _a...) PT_LOG(_f, ##_a)
>> +#else
>> +# =C2=A0define PT_LOG_CONFIG(_f, _a...)
>> +#endif
>> +
>> +
>> +typedef struct XenPTRegInfo XenPTRegInfo;
>> +typedef struct XenPTReg XenPTReg;
>> +
>> +typedef struct XenPCIPassthroughState XenPCIPassthroughState;
>> +
>> +/* function type for config reg */
>> +typedef uint32_t (*conf_reg_init)
>> + =C2=A0 =C2=A0(XenPCIPassthroughState *, XenPTRegInfo *, uint32_t real_=
offset);
>> +typedef int (*conf_dword_write)
>> + =C2=A0 =C2=A0(XenPCIPassthroughState *, XenPTReg *cfg_entry,
>> + =C2=A0 =C2=A0 uint32_t *val, uint32_t dev_value, uint32_t valid_mask);
>> +typedef int (*conf_word_write)
>> + =C2=A0 =C2=A0(XenPCIPassthroughState *, XenPTReg *cfg_entry,
>> + =C2=A0 =C2=A0 uint16_t *val, uint16_t dev_value, uint16_t valid_mask);
>> +typedef int (*conf_byte_write)
>> + =C2=A0 =C2=A0(XenPCIPassthroughState *, XenPTReg *cfg_entry,
>> + =C2=A0 =C2=A0 uint8_t *val, uint8_t dev_value, uint8_t valid_mask);
>> +typedef int (*conf_dword_read)
>> + =C2=A0 =C2=A0(XenPCIPassthroughState *, XenPTReg *cfg_entry,
>> + =C2=A0 =C2=A0 uint32_t *val, uint32_t valid_mask);
>> +typedef int (*conf_word_read)
>> + =C2=A0 =C2=A0(XenPCIPassthroughState *, XenPTReg *cfg_entry,
>> + =C2=A0 =C2=A0 uint16_t *val, uint16_t valid_mask);
>> +typedef int (*conf_byte_read)
>> + =C2=A0 =C2=A0(XenPCIPassthroughState *, XenPTReg *cfg_entry,
>> + =C2=A0 =C2=A0 uint8_t *val, uint8_t valid_mask);
>> +typedef int (*conf_dword_restore)
>> + =C2=A0 =C2=A0(XenPCIPassthroughState *, XenPTReg *cfg_entry, uint32_t =
real_offset,
>> + =C2=A0 =C2=A0 uint32_t dev_value, uint32_t *val);
>> +typedef int (*conf_word_restore)
>> + =C2=A0 =C2=A0(XenPCIPassthroughState *, XenPTReg *cfg_entry, uint32_t =
real_offset,
>> + =C2=A0 =C2=A0 uint16_t dev_value, uint16_t *val);
>> +typedef int (*conf_byte_restore)
>> + =C2=A0 =C2=A0(XenPCIPassthroughState *, XenPTReg *cfg_entry, uint32_t =
real_offset,
>> + =C2=A0 =C2=A0 uint8_t dev_value, uint8_t *val);
>> +
>> +/* power state transition */
>> +#define PT_FLAG_TRANSITING 0x0001
>> +
>> +
>> +typedef enum {
>> + =C2=A0 =C2=A0GRP_TYPE_HARDWIRED =3D 0, =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* 0 Hardwired reg group */
>> + =C2=A0 =C2=A0GRP_TYPE_EMU, =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* emul reg =
group */
>> +} RegisterGroupType;
>> +
>> +typedef enum {
>> + =C2=A0 =C2=A0PT_BAR_FLAG_MEM =3D 0, =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Memory type BAR */
>> + =C2=A0 =C2=A0PT_BAR_FLAG_IO, =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* I/O type BAR */
>> + =C2=A0 =C2=A0PT_BAR_FLAG_UPPER, =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* upper 64bit BAR */
>> + =C2=A0 =C2=A0PT_BAR_FLAG_UNUSED, =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* unused BAR */
>> +} PTBarFlag;
>> +
>> +
>> +typedef struct XenPTRegion {
>> + =C2=A0 =C2=A0/* Virtual phys base & size */
>> + =C2=A0 =C2=A0uint32_t e_physbase;
>> + =C2=A0 =C2=A0uint32_t e_size;
>> + =C2=A0 =C2=A0/* Index of region in qemu */
>> + =C2=A0 =C2=A0uint32_t memory_index;
>> + =C2=A0 =C2=A0/* BAR flag */
>> + =C2=A0 =C2=A0PTBarFlag bar_flag;
>> + =C2=A0 =C2=A0/* Translation of the emulated address */
>> + =C2=A0 =C2=A0union {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0uint64_t maddr;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0uint64_t pio_base;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0uint64_t u;
>> + =C2=A0 =C2=A0} access;
>> +} XenPTRegion;
>> +
>> +/* XenPTRegInfo declaration
>> + * - only for emulated register (either a part or whole bit).
>> + * - for passthrough register that need special behavior (like interact=
ing with
>> + * =C2=A0 other component), set emu_mask to all 0 and specify r/w func =
properly.
>> + * - do NOT use ALL F for init_val, otherwise the tbl will not be regis=
tered.
>> + */
>> +
>> +/* emulated register infomation */
>> +struct XenPTRegInfo {
>> + =C2=A0 =C2=A0uint32_t offset;
>> + =C2=A0 =C2=A0uint32_t size;
>> + =C2=A0 =C2=A0uint32_t init_val;
>> + =C2=A0 =C2=A0/* reg read only field mask (ON:RO/ROS, OFF:other) */
>> + =C2=A0 =C2=A0uint32_t ro_mask;
>> + =C2=A0 =C2=A0/* reg emulate field mask (ON:emu, OFF:passthrough) */
>> + =C2=A0 =C2=A0uint32_t emu_mask;
>> + =C2=A0 =C2=A0/* no write back allowed */
>> + =C2=A0 =C2=A0uint32_t no_wb;
>> + =C2=A0 =C2=A0conf_reg_init init;
>> + =C2=A0 =C2=A0/* read/write/restore function pointer
>> + =C2=A0 =C2=A0 * for double_word/word/byte size */
>> + =C2=A0 =C2=A0union {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0struct {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0conf_dword_write write;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0conf_dword_read read;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0conf_dword_restore restore;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0} dw;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0struct {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0conf_word_write write;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0conf_word_read read;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0conf_word_restore restore;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0} w;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0struct {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0conf_byte_write write;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0conf_byte_read read;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0conf_byte_restore restore;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0} b;
>> + =C2=A0 =C2=A0} u;
>> +};
>> +
>> +/* emulated register management */
>> +struct XenPTReg {
>> + =C2=A0 =C2=A0QLIST_ENTRY(XenPTReg) entries;
>> + =C2=A0 =C2=A0XenPTRegInfo *reg;
>> + =C2=A0 =C2=A0uint32_t data;
>> +};
>> +
>> +typedef struct XenPTRegGroupInfo XenPTRegGroupInfo;
>> +
>> +/* emul reg group size initialize method */
>> +typedef uint8_t (*pt_reg_size_init_fn)
>> + =C2=A0 =C2=A0(XenPCIPassthroughState *, const XenPTRegGroupInfo *,
>> + =C2=A0 =C2=A0 uint32_t base_offset);
>> +
>> +/* emulated register group infomation */
>> +struct XenPTRegGroupInfo {
>> + =C2=A0 =C2=A0uint8_t grp_id;
>> + =C2=A0 =C2=A0RegisterGroupType grp_type;
>> + =C2=A0 =C2=A0uint8_t grp_size;
>> + =C2=A0 =C2=A0pt_reg_size_init_fn size_init;
>> + =C2=A0 =C2=A0XenPTRegInfo *emu_reg_tbl;
>> +};
>> +
>> +/* emul register group management table */
>> +typedef struct XenPTRegGroup {
>> + =C2=A0 =C2=A0QLIST_ENTRY(XenPTRegGroup) entries;
>> + =C2=A0 =C2=A0const XenPTRegGroupInfo *reg_grp;
>> + =C2=A0 =C2=A0uint32_t base_offset;
>> + =C2=A0 =C2=A0uint8_t size;
>> + =C2=A0 =C2=A0QLIST_HEAD(, XenPTReg) reg_tbl_list;
>> +} XenPTRegGroup;
>> +
>> +
>> +typedef struct XenPTPM {
>> + =C2=A0 =C2=A0QEMUTimer *pm_timer; =C2=A0/* QEMUTimer struct */
>> + =C2=A0 =C2=A0int no_soft_reset; =C2=A0 =C2=A0/* No Soft Reset flags */
>> + =C2=A0 =C2=A0uint16_t flags; =C2=A0 =C2=A0 =C2=A0 /* power state trans=
ition flags */
>> + =C2=A0 =C2=A0uint16_t pmc_field; =C2=A0 /* Power Management Capabiliti=
es field */
>> + =C2=A0 =C2=A0int pm_delay; =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* power state =
transition delay */
>> + =C2=A0 =C2=A0uint16_t cur_state; =C2=A0 /* current power state */
>> + =C2=A0 =C2=A0uint16_t req_state; =C2=A0 /* requested power state */
>> + =C2=A0 =C2=A0uint32_t pm_base; =C2=A0 =C2=A0 /* Power Management Capab=
ility reg base offset */
>> + =C2=A0 =C2=A0uint32_t aer_base; =C2=A0 =C2=A0/* AER Capability reg bas=
e offset */
>> +} XenPTPM;
>> +
>> +struct XenPCIPassthroughState {
>> + =C2=A0 =C2=A0PCIDevice dev;
>> +
>> + =C2=A0 =C2=A0char *hostaddr;
>> + =C2=A0 =C2=A0bool is_virtfn;
>> + =C2=A0 =C2=A0HostPCIDevice *real_device;
>> + =C2=A0 =C2=A0XenPTRegion bases[PCI_NUM_REGIONS]; /* Access regions */
>> + =C2=A0 =C2=A0QLIST_HEAD(, XenPTRegGroup) reg_grp_tbl;
>> +
>> + =C2=A0 =C2=A0uint32_t machine_irq;
>> +
>> + =C2=A0 =C2=A0uint32_t power_mgmt;
>> + =C2=A0 =C2=A0XenPTPM *pm_state;
>> +
>> + =C2=A0 =C2=A0MemoryRegion bar[PCI_NUM_REGIONS - 1];
>> + =C2=A0 =C2=A0MemoryRegion rom;
>> +};
>> +
>> +void pt_config_init(XenPCIPassthroughState *s);
>> +void pt_config_delete(XenPCIPassthroughState *s);
>> +void pt_bar_mapping(XenPCIPassthroughState *s, int io_enable, int mem_e=
nable);
>> +void pt_bar_mapping_one(XenPCIPassthroughState *s, int bar,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0int io_enable, int mem_enable);
>> +XenPTRegGroup *pt_find_reg_grp(XenPCIPassthroughState *s, uint32_t addr=
ess);
>> +XenPTReg *pt_find_reg(XenPTRegGroup *reg_grp, uint32_t address);
>> +int pt_bar_offset_to_index(uint32_t offset);
>> +
>> +static inline pcibus_t pt_get_emul_size(PTBarFlag flag, pcibus_t r_size=
)
>> +{
>> + =C2=A0 =C2=A0/* align resource size (memory type only) */
>> + =C2=A0 =C2=A0if (flag =3D=3D PT_BAR_FLAG_MEM) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return (r_size + XC_PAGE_SIZE - 1) & XC_PAG=
E_MASK;
>> + =C2=A0 =C2=A0} else {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return r_size;
>> + =C2=A0 =C2=A0}
>> +}
>> +
>> +/* INTx */
>> +static inline uint8_t pci_read_intx(XenPCIPassthroughState *s)
>> +{
>> + =C2=A0 =C2=A0return host_pci_get_byte(s->real_device, PCI_INTERRUPT_PI=
N);
>> +}
>> +uint8_t pci_intx(XenPCIPassthroughState *ptdev);
>> +
>> +#endif /* !QEMU_HW_XEN_PCI_PASSTHROUGH_H */
>> diff --git a/hw/xen_pci_passthrough_helpers.c b/hw/xen_pci_passthrough_h=
elpers.c
>> new file mode 100644
>> index 0000000..192e918
>> --- /dev/null
>> +++ b/hw/xen_pci_passthrough_helpers.c
>> @@ -0,0 +1,46 @@
>> +#include "xen_pci_passthrough.h"
>> +
>> +/* The PCI Local Bus Specification, Rev. 3.0, {
>> + * Section 6.2.4 Miscellaneous Registers, pp 223
>> + * outlines 5 valid values for the intertupt pin (intx).
>> + * =C2=A00: For devices (or device functions) that don't use an interru=
pt in
>> + * =C2=A01: INTA#
>> + * =C2=A02: INTB#
>> + * =C2=A03: INTC#
>> + * =C2=A04: INTD#
>> + *
>> + * Xen uses the following 4 values for intx
>> + * =C2=A00: INTA#
>> + * =C2=A01: INTB#
>> + * =C2=A02: INTC#
>> + * =C2=A03: INTD#
>> + *
>> + * Observing that these list of values are not the same, pci_read_intx(=
)
>> + * uses the following mapping from hw to xen values.
>> + * This seems to reflect the current usage within Xen.
>> + *
>> + * PCI hardware =C2=A0 =C2=A0| Xen | Notes
>> + * ----------------+-----+---------------------------------------------=
-------
>> + * 0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | 0 =C2=A0 | No i=
nterrupt
>> + * 1 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | 0 =C2=A0 | INTA=
#
>> + * 2 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | 1 =C2=A0 | INTB=
#
>> + * 3 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | 2 =C2=A0 | INTC=
#
>> + * 4 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | 3 =C2=A0 | INTD=
#
>> + * any other value | 0 =C2=A0 | This should never happen, log error mes=
sage
>> +}
>> + */
>> +uint8_t pci_intx(XenPCIPassthroughState *ptdev)
>> +{
>> + =C2=A0 =C2=A0uint8_t r_val =3D pci_read_intx(ptdev);
>> +
>> + =C2=A0 =C2=A0PT_LOG("intx=3D%i\n", r_val);
>> + =C2=A0 =C2=A0if (r_val < 1 || r_val > 4) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0PT_LOG("Interrupt pin read from hardware is=
 out of range: "
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "value=3D%i, acceptab=
le range is 1 - 4\n", r_val);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0r_val =3D 0;
>> + =C2=A0 =C2=A0} else {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0r_val -=3D 1;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0return r_val;
>> +}
>
> if xen_pci_passthrough_helpers.c is only going to contain this function
> you might as well declared it static inline and move it to
> xen_pci_passthrough.h

Ok, I will.

--=20
Anthony PERARD

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:28:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:28:53 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROBxF-0001lG-LC; Wed, 09 Nov 2011 09:28:53 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBas-0005Mh-7h
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 09:05:46 -0800
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1320858342!2494429!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8470 invoked from network); 9 Nov 2011 17:05:43 -0000
Received: from mail-bw0-f43.google.com (HELO mail-bw0-f43.google.com)
	(209.85.214.43)
	by server-7.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 17:05:43 -0000
Received: by bkbzt12 with SMTP id zt12so2181875bkb.30
	for <xen-devel@lists.xensource.com>;
	Wed, 09 Nov 2011 09:05:42 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:from:date
	:x-google-sender-auth:message-id:subject:to:cc:content-type;
	bh=AtXF+GAG8IxGlXHHmAqfQn5PlrC+hiFUtCf1oAO0beY=;
	b=M3Kmz8d9ud7vp+/UTp+40X59XIITnSnWnm11mMU5tLoyIgWJgkrYPu+lNhCpAVQsT+
	icHjANHPslPhElXJOUU9ODZV0ziqGpfjblswf/IIiRHdvO7bx6c+v8jN2R+7FflRhEuG
	j57ynHmN95eD5ldaIHJFb5RWZtH1p2qaXy7A8=
Received: by 10.182.139.34 with SMTP id qv2mr1042763obb.46.1320858342100; Wed,
	09 Nov 2011 09:05:42 -0800 (PST)
MIME-Version: 1.0
Received: by 10.182.37.225 with HTTP; Wed, 9 Nov 2011 09:05:11 -0800 (PST)
In-Reply-To: <alpine.DEB.2.00.1111081246460.3519@kaball-desktop>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-9-git-send-email-anthony.perard@citrix.com>
	<alpine.DEB.2.00.1111081246460.3519@kaball-desktop>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Wed, 9 Nov 2011 17:05:11 +0000
X-Google-Sender-Auth: xfgswh5aBPGiXKdqCgUcoe53ZGk
Message-ID: <CAJJyHj+L0dxDTQ1c87ZJ=sKxWLLJdFD3kqn1OD4AZymUTh2G8g@mail.gmail.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
Cc: Guy Zana <guy@neocleus.com>, Xen Devel <xen-devel@lists.xensource.com>,
	Allen Kay <allen.m.kay@intel.com>, QEMU-devel <qemu-devel@nongnu.org>
Subject: [Xen-devel] Re: [Qemu-devel] [PATCH V3 08/10] Introduce Xen PCI
 Passthrough, PCI config space helpers (2/3)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 8, 2011 at 12:57, Stefano Stabellini
<stefano.stabellini@eu.citrix.com> wrote:
> Obviously passthrough cannot work without this patch, but qemu should be
> able to compile anyway. Please add to the previous patch empty stub
> implementations for all the exported functions that you are going to
> implement here.
>
> I see that the timer is allocated here.
> In that case it would make sense to move the timer update to this patch.

Ok, I will do that.

-- 
Anthony PERARD

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:31:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:31:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROC0D-0002pk-H6; Wed, 09 Nov 2011 09:31:57 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBjI-0006gw-3Q
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 09:14:37 -0800
X-Env-Sender: beto.rvs@gmail.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1320858863!911936!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6971 invoked from network); 9 Nov 2011 17:14:24 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 17:14:24 -0000
Received: by vws13 with SMTP id 13so2266061vws.30
	for <xen-devel@lists.xensource.com>;
	Wed, 09 Nov 2011 09:14:23 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type;
	bh=mEZ7m+wk/ZWM7N5NeBelqJ1xgvZB/DBriIS4s78lBF4=;
	b=QijTIN6WE3pFftL8UIwxy6bNQBiMx3Q9tKodxRej36X3tTQNgNNF70Lh8gvzVI0jSb
	2H1lpydQVc+4jSePiQGGSR8PbamiX0srVOnTkF2S7dULoLlX+gEdmdJL5aAKZf4cBvzb
	CC++rC0RaaD2rXVMEVLjpaytB/NnY3uscOoHE=
MIME-Version: 1.0
Received: by 10.52.91.237 with SMTP id ch13mr5815831vdb.129.1320858863318;
	Wed, 09 Nov 2011 09:14:23 -0800 (PST)
Received: by 10.220.5.72 with HTTP; Wed, 9 Nov 2011 09:14:23 -0800 (PST)
In-Reply-To: <CAOdhohc+UoicOGTW2W_rzdf7d4RR48QyOb4dr=f2g-LAWKB-dA@mail.gmail.com>
References: <CAOdhoheOhKGWp3f-tvXDX5SuGMXmsyY4fP==EXL-CWfiF52NzQ@mail.gmail.com>
	<20111109151838.GA26277@phenom.dumpdata.com>
	<CAOdhohc+UoicOGTW2W_rzdf7d4RR48QyOb4dr=f2g-LAWKB-dA@mail.gmail.com>
Date: Wed, 9 Nov 2011 15:14:23 -0200
Message-ID: <CAOdhohdMhi-7eZCuHdRaXiDgQFt-ddCpre3r5HAmfJh=fFVGwQ@mail.gmail.com>
Subject: Re: [Xen-devel] why do I get bad disk write performance in the kernel
	3.1?
From: Roberto Scudeller <beto.rvs@gmail.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1666448479=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1666448479==
Content-Type: multipart/alternative; boundary=20cf307c9e2058b65304b1506b21

--20cf307c9e2058b65304b1506b21
Content-Type: text/plain; charset=ISO-8859-1

Konrad,

# xenstore-ls /local/domain/6/device/vbd
51712 = ""
 backend = "/local/domain/0/backend/qdisk/6/51712"
 backend-id = "0"
 state = "4"
 virtual-device = "51712"
 device-type = "disk"
 ring-ref = "16383"
 event-channel = "7"
51728 = ""
 backend = "/local/domain/0/backend/qdisk/6/51728"
 backend-id = "0"
 state = "4"
 virtual-device = "51728"
 device-type = "disk"
 ring-ref = "16371"
 event-channel = "8"

Thanks for help.



2011/11/9 Roberto Scudeller <beto.rvs@gmail.com>

> Konrad,
>
> Thanks for help.
>
> My windows.cfg is:
> name='benchCM-windows-2003-64b-std-test'
> kernel='/usr/lib/xen/boot/hvmloader'
> builder='hvm'
> memory=512
> vcpus=2
> pae=1
> acpi=1
> apic=1
> disk=[ 'tap2:aio:/local-disk/benchCM-windows-2003-64b-std/xvda,xvda,w' ]
> device_model='/usr/lib/xen/bin/qemu-dm'
> boot='c'
> sdl=0
> vnc=1
> vncunused=1
> vnclisten='0.0.0.0'
> vncpasswd=''
> stdvga=0
> extra=''
> on_reboot='restart'
> on_shutdown='destroy'
> ramdisk=''
> image_name=''
> on_crash='destroy'
> bootloader=''
> root=''
> platform='xen'
> network_mode='tap'
> usb = 1
> usbdevice = 'tablet'
>
> The xvda disk is a raw disk, created with dd.
> I use the windows.cfg in both kernel.
>
>
>
>
> 2011/11/9 Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
>
>> On Wed, Nov 09, 2011 at 12:58:27PM -0200, Roberto Scudeller wrote:
>> > Hi all,
>> >
>> > I'm testing the new kernel 3.1 from kernel.org, and xen 4.1.2-rc1-pre.
>> > I execute a CrystalMark IO Benchmark, in windows 2003 VM with gplpv
>> > drivers, and receive an amazing result for reading, but the write
>> numbers
>> > are very disappointing.
>> >
>> > I run the VM in local disk, and receive these numbers:
>> > Seq read: 244 MB/s
>> > 512K read: 239 MB/s
>> > 4K read: 27 MB/s
>> > 4K QD 32: 90 MB/s
>> >
>> > Seq write: 20 MB/s
>> > 512K: 20 MB/s
>> > 4K: 8 MB/s
>> > 4K QD 32: 12MB/s
>> >
>> > In older kernel, 2.6.32.x:
>> > Seq read: 189 MB/s
>> > 512K read: 169 MB/s
>> > 4K read: 11 MB/s
>> > 4K QD 32: 34 MB/s
>> >
>> > Seq write: 177 MB/s
>> > 512K: 166 MB/s
>> > 4K: 12 MB/s
>> > 4K QD 32: 36 MB/s
>> >
>> > Could anyone help me. Why is the new kernel faster in reading, but too
>> slow
>> > writing ?
>>
>> It would help if you gave an idea of what the guest configuration is and
>> what is the backend. It might be that the backend you are using in 3.1 is
>> QEMU qdisk, not xen-blkback.
>>
>
>
>
> --
> Roberto Scudeller
>
>
>


-- 
Roberto Scudeller

--20cf307c9e2058b65304b1506b21
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Konrad, <br><br># xenstore-ls /local/domain/6/device/vbd<br>51712 =3D &quot=
;&quot;<br>=A0backend =3D &quot;/local/domain/0/backend/qdisk/6/51712&quot;=
<br>=A0backend-id =3D &quot;0&quot;<br>=A0state =3D &quot;4&quot;<br>=A0vir=
tual-device =3D &quot;51712&quot;<br>
=A0device-type =3D &quot;disk&quot;<br>=A0ring-ref =3D &quot;16383&quot;<br=
>=A0event-channel =3D &quot;7&quot;<br>51728 =3D &quot;&quot;<br>=A0backend=
 =3D &quot;/local/domain/0/backend/qdisk/6/51728&quot;<br>=A0backend-id =3D=
 &quot;0&quot;<br>
=A0state =3D &quot;4&quot;<br>=A0virtual-device =3D &quot;51728&quot;<br>=
=A0device-type =3D &quot;disk&quot;<br>=A0ring-ref =3D &quot;16371&quot;<br=
>=A0event-channel =3D &quot;8&quot;<br><br>Thanks for help.<br><br><br><br>=
<div class=3D"gmail_quote">
2011/11/9 Roberto Scudeller <span dir=3D"ltr">&lt;<a href=3D"mailto:beto.rv=
s@gmail.com">beto.rvs@gmail.com</a>&gt;</span><br><blockquote class=3D"gmai=
l_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left=
:1ex;">
Konrad,<br><br>Thanks for help. <br><br>My windows.cfg is:<br>name=3D&#39;b=
enchCM-windows-2003-64b-std-test&#39;<br>kernel=3D&#39;/usr/lib/xen/boot/hv=
mloader&#39;<br>builder=3D&#39;hvm&#39;<br>memory=3D512<br>vcpus=3D2<br>pae=
=3D1<br>
acpi=3D1<br>
apic=3D1<br>disk=3D[ &#39;tap2:aio:/local-disk/benchCM-windows-2003-64b-std=
/xvda,xvda,w&#39; ]<br>device_model=3D&#39;/usr/lib/xen/bin/qemu-dm&#39;<br=
>boot=3D&#39;c&#39;<br>sdl=3D0<br>vnc=3D1<br>vncunused=3D1<br>vnclisten=3D&=
#39;0.0.0.0&#39;<br>

vncpasswd=3D&#39;&#39;<br>stdvga=3D0<br>extra=3D&#39;&#39;<br>on_reboot=3D&=
#39;restart&#39;<br>on_shutdown=3D&#39;destroy&#39;<br>ramdisk=3D&#39;&#39;=
<br>image_name=3D&#39;&#39;<br>on_crash=3D&#39;destroy&#39;<br>bootloader=
=3D&#39;&#39;<br>

root=3D&#39;&#39;<br>platform=3D&#39;xen&#39;<br>network_mode=3D&#39;tap&#3=
9;<br>usb =3D 1<br>usbdevice =3D &#39;tablet&#39;<br><br>The xvda disk is a=
 raw disk, created with dd.<br>I use the windows.cfg in both kernel.<div cl=
ass=3D"HOEnZb">
<div class=3D"h5"><br><br><br><br>
<div class=3D"gmail_quote">2011/11/9 Konrad Rzeszutek Wilk <span dir=3D"ltr=
">&lt;<a href=3D"mailto:konrad.wilk@oracle.com" target=3D"_blank">konrad.wi=
lk@oracle.com</a>&gt;</span><br><blockquote class=3D"gmail_quote" style=3D"=
margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div><div>On Wed, Nov 09, 2011 at 12:58:27PM -0200, Roberto Scudeller wrote=
:<br>
&gt; Hi all,<br>
&gt;<br>
&gt; I&#39;m testing the new kernel 3.1 from <a href=3D"http://kernel.org" =
target=3D"_blank">kernel.org</a>, and xen 4.1.2-rc1-pre.<br>
&gt; I execute a CrystalMark IO Benchmark, in windows 2003 VM with gplpv<br=
>
&gt; drivers, and receive an amazing result for reading, but the write numb=
ers<br>
&gt; are very disappointing.<br>
&gt;<br>
&gt; I run the VM in local disk, and receive these numbers:<br>
&gt; Seq read: 244 MB/s<br>
&gt; 512K read: 239 MB/s<br>
&gt; 4K read: 27 MB/s<br>
&gt; 4K QD 32: 90 MB/s<br>
&gt;<br>
&gt; Seq write: 20 MB/s<br>
&gt; 512K: 20 MB/s<br>
&gt; 4K: 8 MB/s<br>
&gt; 4K QD 32: 12MB/s<br>
&gt;<br>
&gt; In older kernel, 2.6.32.x:<br>
&gt; Seq read: 189 MB/s<br>
&gt; 512K read: 169 MB/s<br>
&gt; 4K read: 11 MB/s<br>
&gt; 4K QD 32: 34 MB/s<br>
&gt;<br>
&gt; Seq write: 177 MB/s<br>
&gt; 512K: 166 MB/s<br>
&gt; 4K: 12 MB/s<br>
&gt; 4K QD 32: 36 MB/s<br>
&gt;<br>
&gt; Could anyone help me. Why is the new kernel faster in reading, but too=
 slow<br>
&gt; writing ?<br>
<br>
</div></div>It would help if you gave an idea of what the guest configurati=
on is and<br>
what is the backend. It might be that the backend you are using in 3.1 is<b=
r>
QEMU qdisk, not xen-blkback.<br>
</blockquote></div><br><br clear=3D"all"><br></div></div><span class=3D"HOE=
nZb"><font color=3D"#888888">-- <br>Roberto Scudeller<br><br><br>
</font></span></blockquote></div><br><br clear=3D"all"><br>-- <br>Roberto S=
cudeller<br><br><br>

--20cf307c9e2058b65304b1506b21--


--===============1666448479==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1666448479==--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:33:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:33:05 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROC1J-0003GS-CO; Wed, 09 Nov 2011 09:33:05 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBlk-00078E-Uk
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 09:17:03 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1320859017!2911620!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23075 invoked from network); 9 Nov 2011 17:16:57 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 17:16:57 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315180800"; 
   d="scan'208";a="8846505"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 17:16:54 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Wed, 9 Nov 2011
	17:16:54 +0000
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "stefano.stabellini@eu.citrix.com" <stefano.stabellini@eu.citrix.com>
Date: Wed, 9 Nov 2011 17:16:54 +0000
In-Reply-To: <1320857460-18088-16-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
	<1320857460-18088-16-git-send-email-stefano.stabellini@eu.citrix.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320859014.955.186.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH 16/18] xl.pod.1: improve description of
 virtual device subcommands
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-09 at 16:50 +0000, stefano.stabellini@eu.citrix.com
wrote:
> @@ -918,8 +919,15 @@ Xen Flask security module.
>  
>  =head1 SEE ALSO
>  
> +The following man pages:
> +
>  B<xldomain.cfg>(5), B<xlcpupool.cfg>(5), B<xentop>(1)
>  
> +And the following documents available in the Xen source tree:
> +
> +B<docs/misc/xl-network-configuration.markdown>
> +B<docs/misc/xl-disk-configuration.txt>
> +
>  =head1 AUTHOR 

I sent out a patch (yesterday, I think) which modified this section to
reference xl-domain-config.markdown rather than xldomain.cfg so this
will conflict, but otherwise this looks nice.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:34:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:34:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROC2Q-0003iH-Nt; Wed, 09 Nov 2011 09:34:14 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBn8-0007OV-88
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 09:18:27 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320859069!45272997!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28187 invoked from network); 9 Nov 2011 17:17:49 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 17:17:49 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315180800"; 
   d="scan'208";a="8846534"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 17:18:23 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Wed, 9 Nov 2011
	17:18:23 +0000
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "stefano.stabellini@eu.citrix.com" <stefano.stabellini@eu.citrix.com>
Date: Wed, 9 Nov 2011 17:18:22 +0000
In-Reply-To: <1320857460-18088-2-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
	<1320857460-18088-2-git-send-email-stefano.stabellini@eu.citrix.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320859103.955.187.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH 02/18] xl.pod.1: add a description of
	console options
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-09 at 16:50 +0000, stefano.stabellini@eu.citrix.com
wrote:
> From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> 
> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> ---
>  docs/man/xl.pod.1 |   19 ++++++++++++++++++-
>  1 files changed, 18 insertions(+), 1 deletions(-)
> 
> diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
> index 7022852..84da191 100644
> --- a/docs/man/xl.pod.1
> +++ b/docs/man/xl.pod.1
> @@ -105,7 +105,7 @@ soon as it is run.
>  
>  =back
>  
> -=item B<console> I<domain-id>
> +=item B<console> [I<OPTIONS>] I<domain-id>
>  
>  Attach to domain I<domain-id>'s console.  If you've set up your domains to
>  have a traditional log in console this will look much like a normal
> @@ -113,6 +113,23 @@ text log in screen.
>  
>  Use the key combination Ctrl+] to detach the domain console.
>  
> +B<OPTIONS>
> +
> +=over 4
> +
> +=item I<-t [pv|serial]>
> +
> +Connect to a PV console or connect to an emulated serial console.
> +PV consoles are the only consoles available for PV domains while HVM
> +domains can have both. If this option is not specified it defaults to
> +emulated serial for HVM guests.

I know it can be inferred from the previous sentence (and is pretty
obvious) but
        If this option is not specified it defaults to emulated serial
        for HVM guests and PV console for PV guests.
is clearer.

> +
> +=item I<-n NUM>
> +
> +Connect to console number I<NUM>. Console numbers start from 0.
> +
> +=back
> +
>  =item B<vncviewer> [I<OPTIONS>] I<domain-id>
>  
>  Attach to domain's VNC server, forking a vncviewer process.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:36:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:36:58 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROC54-00050O-A2; Wed, 09 Nov 2011 09:36:58 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBpw-0008BM-PJ
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 09:21:21 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1320859277!3594854!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16793 invoked from network); 9 Nov 2011 17:21:17 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 17:21:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315180800"; 
   d="scan'208";a="8846602"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 17:21:17 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0; Wed, 9 Nov 2011
	17:21:17 +0000
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "stefano.stabellini@eu.citrix.com" <stefano.stabellini@eu.citrix.com>
Date: Wed, 9 Nov 2011 17:21:17 +0000
In-Reply-To: <1320857460-18088-4-git-send-email-stefano.stabellini@eu.citrix.com>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
	<1320857460-18088-4-git-send-email-stefano.stabellini@eu.citrix.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320859277.955.189.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH 04/18] xl.pod.1: add a description of the
	global options
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-09 at 16:50 +0000, stefano.stabellini@eu.citrix.com
wrote:
> From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> 
> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> ---
>  docs/man/xl.pod.1 |   16 ++++++++++++++++
>  1 files changed, 16 insertions(+), 0 deletions(-)
> 
> diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
> index 127a607..c3c6afd 100644
> --- a/docs/man/xl.pod.1
> +++ b/docs/man/xl.pod.1
> @@ -45,6 +45,22 @@ Most B<xl> commands require root privileges to run due to the
>  communications channels used to talk to the hypervisor.  Running as
>  non root will return an error.
>  
> +=head1 GLOBAL OPTIONS
> +
> +Few global options are always available:

"A few..." or "Some...". "Few..." means that of the many global options
only some of them are always available, or something like that.

> +
> +=over 4
> +
> +=item B<-v>
> +
> +Verbose.
> +
> +=item B<-N>
> +
> +Dry run: do not actually execute the command.
> +
> +=back
> +
>  =head1 DOMAIN SUBCOMMANDS
>  
>  The following subcommands manipulate domains directly.  As stated



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:40:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:40:50 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROC8n-0006XO-JM; Wed, 09 Nov 2011 09:40:50 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROBzT-0002ZR-Ct
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 09:31:11 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1320859868!2896425!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2892 invoked from network); 9 Nov 2011 17:31:08 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 17:31:08 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315180800"; 
   d="scan'208";a="8846842"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 17:31:08 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 17:31:08 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1ROBzP-0002xi-TA;
	Wed, 09 Nov 2011 17:31:07 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1ROBzP-0006zH-Ia;
	Wed, 09 Nov 2011 17:31:07 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9735-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 9 Nov 2011 17:31:07 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9735: regressions - trouble:
	broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9735 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9735/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-i386-rhel6hvm-intel  7 redhat-install           fail REGR. vs. 9661
 test-amd64-amd64-xl           3 host-install(3)              broken
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl           18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-credit2   18 leak-check/check           fail REGR. vs. 9661
 test-amd64-amd64-xl-sedf     11 guest-localmigrate         fail REGR. vs. 9659
 test-amd64-i386-xl-multivcpu 18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-win-vcpus1    3 host-install(3)              broken
 test-i386-i386-win            3 host-install(3)              broken

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  f7988da4b6ea
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  "Shan, Haitao" <haitao.shan@intel.com>
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Jean Guyader <jean.guyader@eu.citrix.com>
  Juergen Gross <juergen.gross@ts.fujitsu.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  Tim Deegan <tim@xen.org>
  Wei Wang <wei.wang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          broken  
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   broken  
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           broken  
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

(No revision log; it would be 578 lines long.)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 09:46:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 09:46:34 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROCEM-0008RH-7s; Wed, 09 Nov 2011 09:46:34 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1ROCDt-0008Ag-Iz
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 09:46:05 -0800
X-Env-Sender: lersek@redhat.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1320860738!43957651!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32032 invoked from network); 9 Nov 2011 17:45:39 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-12.tower-27.messagelabs.com with SMTP;
	9 Nov 2011 17:45:39 -0000
Received: from int-mx12.intmail.prod.int.phx2.redhat.com
	(int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id pA9Hjx3r013124
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 12:45:59 -0500
Received: from [10.34.1.169] (dhcp-1-169.brq.redhat.com [10.34.1.169])
	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id pA9Hjta8001749; Wed, 9 Nov 2011 12:45:56 -0500
Message-ID: <4EBABCAE.40704@redhat.com>
Date: Wed, 09 Nov 2011 18:47:26 +0100
From: Laszlo Ersek <lersek@redhat.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110928 Fedora/3.1.15-1.fc14
	Lightning/1.0b3pre Mnenhy/0.8.4 Thunderbird/3.1.15
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH] remove blocked time accounting from	 xen
	"clockchip"
References: <1318970579-6282-1-git-send-email-lersek@redhat.com>
	<4EBA8FAA020000780005FD5F@nat28.tlf.novell.com>
In-Reply-To: <4EBA8FAA020000780005FD5F@nat28.tlf.novell.com>
Content-Type: multipart/mixed; boundary="------------090702040602050905030609"
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
Cc: Jeremy Fitzhardinge <jeremy@goop.org>, xen-devel@lists.xensource.com,
	Joe Jin <joe.jin@oracle.com>, Zhenzhong Duan <zhenzhong.duan@oracle.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--------------090702040602050905030609
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

On 11/09/11 14:35, Jan Beulich wrote:
>>>> On 18.10.11 at 22:42, Laszlo Ersek<lersek@redhat.com>  wrote:
>> ... because the "clock_event_device framework" already accounts for idle
>> time through the "event_handler" function pointer in
>> xen_timer_interrupt().
>>
>> The patch is intended as the completion of [1]. It should fix the double
>> idle times seen in PV guests' /proc/stat [2]. It should be orthogonal to
>> stolen time accounting (the removed code seems to be isolated).
>
> After some more looking around I still think it's incorrect, albeit for
> a different reason: What tick_nohz_restart_sched_tick() accounts
> as idle time is *all* time that passed while in cpu_idle(). What gets
> accounted in do_stolen_accounting() (without your patch) is
> different:
> - time the vCPU was in RUNSTATE_blocked gets accounted as idle
> - time the vCPU was in RUNSTATE_runnable and RUNSTATE_offline
>    gets accounted as stolen.
>
> That is, on an overcommitted system (and without your patch) I
> would expect you to not see the (full) double idle increment for a not
> fully idle and not fully loaded vCPU.

I tried to verify this with an experiment. Please examine if the 
experiment is bogus or not.

On a four-PCPU host (hyperthreading off, RHEL-5.7+ hypervisor & dom0) I 
started three virtual machines:

VM1: four VCPUs, four processes running a busy loop each, independently.
VM2: ditto
VM3: single VCPU running the attached program (which otherwise puts 1/2 
load on a single CPU, virtual or physical.) OS is RHEL-6.1.

In VM3, I also ran this script:

$ grep cpu0 /proc/stat; sleep 20; grep cpu0 /proc/stat
cpu0 10421 0 510 119943 608 0 1 122 0
cpu0 11420 0 510 121942 608 0 1 126 0

The difference in the fourth numerical column is still 1999, even though 
only 10 seconds of those 20 were spent idly.

Does the experiment miss the point (or do I), or does this disprove the 
idea?

(Interestingly, according to virt-manager, the load distribution between 
the VMs looked like:

VM1: 7/16 = 43.75%
VM2: 7/16 = 43.75%
VM3: 2/16 = 1/8 = 12.50%

as if VM3's load had been first extracted and the rest split between VM1 
and VM2. When I stop VM1 and VM2, VM3 stays at 12.5%. Under the above 
load, I would have expected:

VM1: 8/17 ~= 47.06%
VM2: 8/17 ~= 47.06%
VM3: 1/17 ~= 5.88%

ie. "eight and half" VCPUs sharing the host evenly. Could this have any 
relevance?)

Thank you
Laszlo

--------------090702040602050905030609
Content-Type: text/plain;
 name="50.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="50.c"

#define _XOPEN_SOURCE 500 /* SUSv2 */

#include <signal.h>       /* sigaction() */
#include <sys/time.h>     /* setitimer() */
#include <assert.h>       /* assert() */
#include <unistd.h>       /* pause() */

static volatile sig_atomic_t flag;

static void
ring(int sig)
{
  flag = !flag;
}

int
main(void)
{
  struct sigaction act;
  int tmp;
  struct itimerval itmv;
  
  act.sa_handler = &ring;
  tmp = sigemptyset(&act.sa_mask); assert(0 == tmp);
  act.sa_flags = 0;
  tmp = sigaction(SIGALRM, &act, 0); assert(0 == tmp);

  itmv.it_value.tv_sec = itmv.it_interval.tv_sec = 0;
  itmv.it_value.tv_usec = itmv.it_interval.tv_usec = 100 * 1000;
  tmp = setitimer(ITIMER_REAL, &itmv, 0); assert(0 == tmp);

  for (;;) {
    while (0 == flag)
      ;
    (void)pause();
  }
}

--------------090702040602050905030609
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------090702040602050905030609--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 10:19:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 10:19:24 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROCk7-00033S-1S; Wed, 09 Nov 2011 10:19:23 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1ROCcc-0001cP-0m
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 10:11:39 -0800
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-5.tower-21.messagelabs.com!1320862294!2005792!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12881 invoked from network); 9 Nov 2011 18:11:34 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-5.tower-21.messagelabs.com with SMTP;
	9 Nov 2011 18:11:34 -0000
Received: from tarius.tycho.ncsc.mil (localhost [127.0.0.1])
	by msux-gh1-uea01.nsa.gov (8.12.10/8.12.10) with ESMTP id
	pA9IBVdc026925; Wed, 9 Nov 2011 18:11:31 GMT
Received: from moss-nexus.epoch.ncsc.mil (moss-nexus [144.51.25.48])
	by tarius.tycho.ncsc.mil (8.13.1/8.13.1) with ESMTP id pA9IBV2J022913; 
	Wed, 9 Nov 2011 13:11:31 -0500
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: ian.jackson@eu.citrix.com
Date: Wed,  9 Nov 2011 13:11:26 -0500
Message-Id: <1320862287-11787-1-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>, xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 1/2] xenstore: xenbus cannot be opened read-only
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

In order to read keys from xenstore, the xenstore libraries need to
write the request to the xenbus socket. This means that the socket
cannot be opened read-only.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 tools/xenstore/xs.c |   18 ++++++++----------
 1 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/tools/xenstore/xs.c b/tools/xenstore/xs.c
index c72ea83..df270f7 100644
--- a/tools/xenstore/xs.c
+++ b/tools/xenstore/xs.c
@@ -182,15 +182,13 @@ error:
 	return -1;
 }
 
-static int get_dev(const char *connect_to, unsigned long flags)
+static int get_dev(const char *connect_to)
 {
-	if (flags & XS_OPEN_READONLY)
-		return open(connect_to, O_RDONLY);
-	else
-		return open(connect_to, O_RDWR);
+	/* We cannot open read-only because requests are writes */
+	return open(connect_to, O_RDWR);
 }
 
-static struct xs_handle *get_handle(const char *connect_to, unsigned long flags)
+static struct xs_handle *get_handle(const char *connect_to)
 {
 	struct stat buf;
 	struct xs_handle *h = NULL;
@@ -202,7 +200,7 @@ static struct xs_handle *get_handle(const char *connect_to, unsigned long flags)
 	if (S_ISSOCK(buf.st_mode))
 		fd = get_socket(connect_to);
 	else
-		fd = get_dev(connect_to, flags);
+		fd = get_dev(connect_to);
 
 	if (fd == -1)
 		return NULL;
@@ -258,12 +256,12 @@ struct xs_handle *xs_open(unsigned long flags)
 	struct xs_handle *xsh = NULL;
 
 	if (flags & XS_OPEN_READONLY)
-		xsh = get_handle(xs_daemon_socket_ro(), flags);
+		xsh = get_handle(xs_daemon_socket_ro());
 	else
-		xsh = get_handle(xs_daemon_socket(), flags);
+		xsh = get_handle(xs_daemon_socket());
 
 	if (!xsh && !(flags & XS_OPEN_SOCKETONLY))
-		xsh = get_handle(xs_domain_dev(), flags);
+		xsh = get_handle(xs_domain_dev());
 
 	return xsh;
 }
-- 
1.7.6.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 10:21:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 10:21:58 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROCmc-0003Rs-45; Wed, 09 Nov 2011 10:21:58 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1ROCcc-0001cO-0z
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 10:11:39 -0800
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-4.tower-174.messagelabs.com!1320862294!929903!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13064 invoked from network); 9 Nov 2011 18:11:34 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-4.tower-174.messagelabs.com with SMTP;
	9 Nov 2011 18:11:34 -0000
Received: from tarius.tycho.ncsc.mil (localhost [127.0.0.1])
	by msux-gh1-uea01.nsa.gov (8.12.10/8.12.10) with ESMTP id
	pA9IBVdc026926; Wed, 9 Nov 2011 18:11:31 GMT
Received: from moss-nexus.epoch.ncsc.mil (moss-nexus [144.51.25.48])
	by tarius.tycho.ncsc.mil (8.13.1/8.13.1) with ESMTP id pA9IBV2K022913; 
	Wed, 9 Nov 2011 13:11:31 -0500
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: ian.jackson@eu.citrix.com
Date: Wed,  9 Nov 2011 13:11:27 -0500
Message-Id: <1320862287-11787-2-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1320862287-11787-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1320862287-11787-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>, xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 2/2] xenstat: Use local domain names
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

The domain name stored in /local/domain/$domid/name is simpler to
access and is the only domain name modified by "xl rename". Use this
domain name in libxenstat's reporting.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 tools/xenstat/libxenstat/src/xenstat.c |   12 ++----------
 1 files changed, 2 insertions(+), 10 deletions(-)

diff --git a/tools/xenstat/libxenstat/src/xenstat.c b/tools/xenstat/libxenstat/src/xenstat.c
index 2791cc1..104655d 100644
--- a/tools/xenstat/libxenstat/src/xenstat.c
+++ b/tools/xenstat/libxenstat/src/xenstat.c
@@ -739,17 +739,9 @@ unsigned long long xenstat_tmem_succ_pers_gets(xenstat_tmem *tmem)
 
 static char *xenstat_get_domain_name(xenstat_handle *handle, unsigned int domain_id)
 {
-	char path[80], *vmpath;
+	char path[80];
 
-	snprintf(path, sizeof(path),"/local/domain/%i/vm", domain_id);
-
-	vmpath = xs_read(handle->xshandle, XBT_NULL, path, NULL);
-
-	if (vmpath == NULL)
-		return NULL;
-
-	snprintf(path, sizeof(path),"%s/name", vmpath);
-	free(vmpath);
+	snprintf(path, sizeof(path),"/local/domain/%i/name", domain_id);
 
 	return xs_read(handle->xshandle, XBT_NULL, path, NULL);
 }
-- 
1.7.6.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 10:45:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 10:45:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROD9p-0005Al-Gt; Wed, 09 Nov 2011 10:45:57 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROD90-0004xX-Sv
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 10:45:07 -0800
X-Env-Sender: dan.magenheimer@oracle.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1320864302!3555650!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5405 invoked from network); 9 Nov 2011 18:45:03 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-15.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 18:45:03 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA9IivRF008105
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 18:44:58 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA9IiuJw016771
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 18:44:56 GMT
Received: from abhmt105.oracle.com (abhmt105.oracle.com [141.146.116.57])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA9IioIi002927; Wed, 9 Nov 2011 12:44:50 -0600
MIME-Version: 1.0
Message-ID: <4eceba6c-dd2d-48a9-8f2d-646b150a24e6@default>
Date: Wed, 9 Nov 2011 10:44:53 -0800 (PST)
From: Dan Magenheimer <dan.magenheimer@oracle.com>
To: stefano.stabellini@eu.citrix.com, xen-devel@lists.xensource.com
Subject: RE: [Xen-devel] [PATCH 01/18] xl.pod.1: add a barebone description of
	tmem commands
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
In-Reply-To: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
X-Priority: 3
X-Mailer: Oracle Beehive Extensions for Outlook 2.0.1.4.1.0  (410211) [OL
	12.0.6562.5003]
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090201.4EBACA2A.00F1,ss=1,re=0.000,fgs=0
Cc: Ian.Campbell@citrix.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> From: stefano.stabellini@eu.citrix.com [mailto:stefano.stabellini@eu.citr=
ix.com]
> Sent: Wednesday, November 09, 2011 9:51 AM
> To: xen-devel@lists.xensource.com
> Cc: Ian.Campbell@citrix.com; stefano.stabellini@eu.citrix.com
> Subject: [Xen-devel] [PATCH 01/18] xl.pod.1: add a barebone description o=
f tmem commands

Oops, sorry, I saw the request for this awhile ago but it got buried.

Should I wait until this is committed into xen-unstable
and provide a patch with more description (in pod)?  Or
do you want me to write some raw words that you can roll in
to this patchset?

Dan

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 11:14:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 11:14:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RODbl-0007uG-P5; Wed, 09 Nov 2011 11:14:49 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RODUj-0006oD-8O
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 11:07:56 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1320865649!3593721!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12094 invoked from network); 9 Nov 2011 19:07:29 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 19:07:29 -0000
X-IronPort-AV: E=Sophos;i="4.69,484,1315180800"; 
   d="scan'208";a="8848159"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 19:07:29 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 19:07:29 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RODUf-0003V7-53;
	Wed, 09 Nov 2011 19:07:29 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RODUf-0006G6-0l;
	Wed, 09 Nov 2011 19:07:29 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9737-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 9 Nov 2011 19:07:29 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9737: regressions - trouble:
	blocked/broken/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9737 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9737/

Regressions :-(

Tests which did not succeed and are blocking:
 build-i386                    2 host-install(2)              broken
 test-amd64-i386-rhel6hvm-intel  7 redhat-install   fail in 9735 REGR. vs. 9661
 test-amd64-amd64-xl           3 host-install(3)              broken   in 9735
 test-i386-i386-xl            18 leak-check/check   fail in 9735 REGR. vs. 9661
 test-amd64-i386-xl           18 leak-check/check   fail in 9735 REGR. vs. 9661
 test-amd64-i386-xl-credit2   18 leak-check/check   fail in 9735 REGR. vs. 9661
 test-amd64-amd64-xl-sedf     11 guest-localmigrate fail in 9735 REGR. vs. 9659
 test-amd64-i386-xl-multivcpu 18 leak-check/check   fail in 9735 REGR. vs. 9661
 test-amd64-i386-win-vcpus1    3 host-install(3)              broken   in 9735
 test-i386-i386-win            3 host-install(3)              broken   in 9735

Tests which are failing intermittently (not blocking):
 build-amd64-pvops             3 host-build-prep              fail pass in 9735
 build-amd64                   3 host-build-prep              fail pass in 9735

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  n/a
 test-i386-i386-pv             1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pv            1 xen-build-check(1)           blocked  n/a
 test-i386-i386-xl             1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-i386-i386-pair           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pair          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a
 test-i386-i386-xl-win         1 xen-build-check(1)           blocked  n/a
 test-i386-i386-win            1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-pcipt-intel  9 guest-start         fail in 9735 never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2          fail in 9735 never pass
 test-amd64-amd64-win         16 leak-check/check       fail in 9735 never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop            fail in 9735 never pass
 test-amd64-i386-win          16 leak-check/check       fail in 9735 never pass
 test-amd64-amd64-xl-win      13 guest-stop             fail in 9735 never pass
 test-i386-i386-xl-win        13 guest-stop             fail in 9735 never pass

version targeted for testing:
 xen                  f7988da4b6ea
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  "Shan, Haitao" <haitao.shan@intel.com>
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Jean Guyader <jean.guyader@eu.citrix.com>
  Juergen Gross <juergen.gross@ts.fujitsu.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  Tim Deegan <tim@xen.org>
  Wei Wang <wei.wang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  broken  
 build-i386                                                   broken  
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            broken  
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           blocked 
 test-i386-i386-xl                                            blocked 
 test-amd64-i386-rhel6hvm-amd                                 blocked 
 test-amd64-i386-xl-credit2                                   blocked 
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               blocked 
 test-amd64-i386-xl-multivcpu                                 blocked 
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         blocked 
 test-i386-i386-pair                                          blocked 
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           blocked 
 test-i386-i386-pv                                            blocked 
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   blocked 
 test-amd64-i386-xl-win-vcpus1                                blocked 
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          blocked 
 test-i386-i386-win                                           blocked 
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        blocked 


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

(No revision log; it would be 578 lines long.)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 11:16:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 11:16:08 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RODd2-0008Hz-1H; Wed, 09 Nov 2011 11:16:08 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RODWX-00070u-4P
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 11:09:29 -0800
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-9.tower-174.messagelabs.com!1320865760!927548!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15901 invoked from network); 9 Nov 2011 19:09:21 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-9.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 19:09:21 -0000
Received: from saboo.goop.org (adsl-69-107-87-184.dsl.pltn13.pacbell.net
	[69.107.87.184]) (Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 6C24E92F7;
	Wed,  9 Nov 2011 11:09:18 -0800 (PST)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 8146E20138;
	Wed,  9 Nov 2011 11:09:16 -0800 (PST)
Message-ID: <4EBACFDC.50202@goop.org>
Date: Wed, 09 Nov 2011 11:09:16 -0800
From: Jeremy Fitzhardinge <jeremy@goop.org>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] Re: MSI error when reloading iwlagn module
References: <4E822AA6.4010605@goop.org>
	<4E82F7F10200007800058259@nat28.tlf.novell.com>
	<CAFLBxZbOF=Lh=AUrSDcpJr2+YosKs0h9_N40RAkhS6Y5AFRtZg@mail.gmail.com>
	<4EB7BC3F020000780005F504@nat28.tlf.novell.com>
In-Reply-To: <4EB7BC3F020000780005F504@nat28.tlf.novell.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: George Dunlap <George.Dunlap@eu.citrix.com>, andrew.cooper3@citrix.com,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/07/2011 02:08 AM, Jan Beulich wrote:
> Jeremy,
>
> are you still having this problem? If so, did you have time to look into it
> at least to some degree? Or alternatively, did you find other ways to
> reproduce this (so others - e.g. me - could try to look into it)?

I haven't had a chance to re-try it, but I will once I've stabilized F16.

    J

>
> Thanks, Jan
>
>>>> On 28.09.11 at 12:17, George Dunlap <George.Dunlap@eu.citrix.com> wrote:
>> Jeremy, can you try the attached patch (which reverts some of the
>> changes from c/s 23786:3a05da2dc7c0)?
>>  -George
>>
>> On Wed, Sep 28, 2011 at 9:33 AM, Jan Beulich <JBeulich@suse.com> wrote:
>>>>>> On 27.09.11 at 21:57, Jeremy Fitzhardinge <jeremy@goop.org> wrote:
>>>> Hi,
>>>>
>>>> With a fairly current kernel + xen, I'm seeing this if I rmmod iwlagn
>>>> and try to reload it:
>>>>
>>>> [51230.646678] Intel(R) Wireless WiFi Link AGN driver for Linux, in-tree:
>>>> [51230.646685] Copyright(c) 2003-2011 Intel Corporation
>>>> [51230.646760] xen: registering gsi 17 triggering 0 polarity 1
>>>> [51230.646773] xen_map_pirq_gsi: returning irq 17 for gsi 17
>>>> [51230.646777] xen: --> pirq=17 -> irq=17 (gsi=17)
>>>> [51230.646781] Already setup the GSI :17
>>>> [51230.646789] iwlagn 0000:03:00.0: PCI INT A -> GSI 17 (level, low) -> IRQ 17
>>>> [51230.646814] iwlagn 0000:03:00.0: setting latency timer to 64
>>>> [51230.646935] iwlagn 0000:03:00.0: pci_resource_len = 0x00002000
>>>> [51230.646941] iwlagn 0000:03:00.0: pci_resource_base = ffffc9000671c000
>>>> [51230.646945] iwlagn 0000:03:00.0: HW Revision ID = 0x35
>>>> [51230.647075] iwlagn 0000:03:00.0: xen map irq failed -22 for 32752 domain
>>>> [51230.647081] iwlagn 0000:03:00.0: pci_enable_msi failed
>>>> [51230.647113] iwlagn 0000:03:00.0: PCI INT A disabled
>>>> [51230.647126] iwlagn: probe of 0000:03:00.0 failed with error -22
>>>>
>>>> with this on the Xen console
>>>>
>>>> (XEN) physdev.c:139: dom0: can't create irq for msi!
>>>>
>>>>
>>>> I'm running Xen as of a422e2a4451e, which your MSI changes in them,
>>>> which I suspect of having caused a regression (since I don't remember
>>>> having problems reloading msi-using drivers before).
>>> Are you certain (i.e. did you try reverting the top 1 to 3 commits from
>>> there)? Alternatively, do you know what c/s last worked for you? Is
>>> this one the first removal, or after several of them?
>>>
>>> The message solely indicates a failure of create_irq(), with either
>>> find_unassigned_irq() or __assign_irq_vector() failing being the cause,
>>> none of which I touched recently. Instead I wonder whether
>>> 23812:32814ad7458d wouldn't be a more likely candidate (with
>>> 23815:9fa77d26a813 and 23816:7f357e1ef60a being less likely ones).
>>>
>>> I'll nevertheless see whether this reproduces with one of the MSI
>>> drivers that my machines have in use and allow easy removal/reload.
>>>
>>> Jan
>>>
>>>
>>> _______________________________________________
>>> Xen-devel mailing list
>>> Xen-devel@lists.xensource.com 
>>> http://lists.xensource.com/xen-devel 
>>>
>
>


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 12:28:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 12:28:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROElC-00042V-F6; Wed, 09 Nov 2011 12:28:38 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROEkP-0003ps-1j
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 12:27:49 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1320870441!43970907!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27835 invoked from network); 9 Nov 2011 20:27:23 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-12.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 20:27:23 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA9KRf6E031043
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 20:27:42 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA9KReut003086
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 20:27:41 GMT
Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA9KRYhD012712; Wed, 9 Nov 2011 14:27:35 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 12:27:34 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id F062581448; Wed,  9 Nov 2011 12:58:53 -0500 (EST)
Date: Wed, 9 Nov 2011 12:58:53 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Stefan Bader <stefan.bader@canonical.com>
Subject: Re: [Xen-devel] Re: Regression in 3.1 causes Xen to use wrong idle
	routine
Message-ID: <20111109175853.GA16318@phenom.dumpdata.com>
References: <4EA7DFD1.9060608@canonical.com>
	<20111026133003.GA6654@phenom.dumpdata.com>
	<4EA80CF2.5040309@canonical.com>
	<20111026134843.GA31609@phenom.dumpdata.com>
	<4EA811BB.6010005@canonical.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EA811BB.6010005@canonical.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090209.4EBAE23E.0152,ss=1,re=0.000,fgs=0
Cc: len.brown@intel.com,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Oct 26, 2011 at 03:57:15PM +0200, Stefan Bader wrote:
> On 26.10.2011 15:48, Konrad Rzeszutek Wilk wrote:
> >>> What about using the cpuidle_disabled() functionality and adhere to that?
> >>> As so:
> >>>
> > .. snip..
> >>
> >> >From reading over it, this should work. Though I would be interested to hear
> >> from the linux-acpi folks. Also to double check that calling pm_idle when
> >> cpuidle.off was specified really is what is intended.
> > 
> > Oh yeah, definitly need the input from linux-acpi folks. And also to be actually
> > tested :-)
> 
> I can volunteer to do the testing. But I am lazy enough to hold back a bit as
> someone may tell us this is completely the wrong way to fix it. :)

So the other option is to use 'idle=halt' on the Linux command line. That should
provide the workaround for the folks reporting this (is there a BZ for it?).

At least until a good solution is hammered out.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 12:54:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 12:54:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROFAM-0008EB-R3; Wed, 09 Nov 2011 12:54:38 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROF8w-0007Vz-Kv
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 12:53:10 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1320871986!2937427!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30200 invoked from network); 9 Nov 2011 20:53:07 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-9.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 20:53:07 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA9Kqjue031793
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 20:52:46 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA9Kqg9O011087
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 20:52:43 GMT
Received: from abhmt110.oracle.com (abhmt110.oracle.com [141.146.116.62])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA9KqZVs029337; Wed, 9 Nov 2011 14:52:35 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 12:52:34 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 01B9D81449; Wed,  9 Nov 2011 12:05:38 -0500 (EST)
Date: Wed, 9 Nov 2011 12:05:38 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] Re: Linux Stubdom Problem
Message-ID: <20111109170538.GA987@phenom.dumpdata.com>
References: <alpine.DEB.2.00.1109021401000.12963@kaball-desktop>
	<CA8694A1.20379%keir.xen@gmail.com>
	<CAJ0pt17eoZbEnmziLaSd1Cxi+sU90rJ-c8TSgt+ikE3wZj1jhA@mail.gmail.com>
	<alpine.DEB.2.00.1109151110020.12963@kaball-desktop>
	<CAJ0pt15daSuXGi_8T3NS53E2Xv0bYV90b94100Wi6ajt99gedQ@mail.gmail.com>
	<alpine.DEB.2.00.1111081412270.3519@kaball-desktop>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <alpine.DEB.2.00.1111081412270.3519@kaball-desktop>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090201.4EBAE81F.0063,ss=1,re=0.000,fgs=0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>, "Tim \(Xen.org\)" <tim@xen.org>,
	Anthony PERARD <anthony.perard@gmail.com>,
	Keir Fraser <keir.xen@gmail.com>,
	Jiageng Yu <yujiageng734@gmail.com>, Samuel@rcsinet13.oracle.com,
	Thibault <samuel.thibault@ens-lyon.org>, Konrad@rcsinet13.oracle.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> The real fix should something along these lines:
> 
> 
> 
> diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
> index 3dd53f9..f2fadfc 100644
> --- a/arch/x86/xen/mmu.c
> +++ b/arch/x86/xen/mmu.c
> @@ -422,7 +422,7 @@ static pteval_t xen_pte_val(pte_t pte)
>  		pteval = (pteval & ~_PAGE_PAT) | _PAGE_PWT;
>  	}
>  
> -	if (xen_initial_domain() && (pteval & _PAGE_IOMAP))
> +	if (pteval & _PAGE_IOMAP)
>  		return pteval;
>  
>  	return pte_mfn_to_pfn(pteval);
> @@ -483,8 +483,7 @@ static pte_t xen_make_pte(pteval_t pte)
>  	 * mappings are just dummy local mappings to keep other
>  	 * parts of the kernel happy.
>  	 */
> -	if (unlikely(pte & _PAGE_IOMAP) &&
> -	    (xen_initial_domain() || addr >= ISA_END_ADDRESS)) {
> +	if (unlikely(pte & _PAGE_IOMAP)) {
>  		pte = iomap_pte(pte);
>  	} else {
>  		pte &= ~_PAGE_IOMAP;
> ---
> 
> Could you please confirm whether this patch fixes your problem?
> 
> Konrad, do you know if this could have any unintended consequences?
> I don't think it can be a problem security wise because Xen is going to
> do all the permission checks anyway.
> The only problem I can see is if a domU is going to call xen_make_pte
> with _PAGE_IOMAP and a pfn->mfn translation is supposed to happen.

I am not sure. I think I tried this at some point but ran in some problems, but
I can't recall which ones. Let me stick this in my #testing branch and see how it
fares with Dom0/DomU/DomU PCI/ etc.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 13:22:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 13:22:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROFb9-0001tp-2m; Wed, 09 Nov 2011 13:22:21 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1ROFa5-0001hA-30
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 13:21:13 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-8.tower-182.messagelabs.com!1320873669!2508897!1
X-Originating-IP: [208.97.132.66]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9806 invoked from network); 9 Nov 2011 21:21:09 -0000
Received: from caiajhbdcagg.dreamhost.com (HELO homiemail-a18.g.dreamhost.com)
	(208.97.132.66) by server-8.tower-182.messagelabs.com with SMTP;
	9 Nov 2011 21:21:09 -0000
Received: from homiemail-a18.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a18.g.dreamhost.com (Postfix) with ESMTP id 54067250075;
	Wed,  9 Nov 2011 13:21:08 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:reply-to
	:mime-version:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.org; b=jfHggjQng8wJaPyUeKv2HUOQH0YU8sbVEHj63lHXzpLB
	2HnCWRiS3DW1Fo2OBAzAWnQhkX037KigzKfY03MII/Sk4imi9o1cKuN3yuyW2oSO
	AMVduzztoG+u9FgOeioDS2g2AgY+jf9FEI2iuXVVxqpSlhU0Pzt2CI3VJzCliAI=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:reply-to:mime-version:content-type:content-transfer-encoding;
	s=lagarcavilla.org; bh=s28f7ZtXGM8dGML6Au+pkpTe3UQ=; b=Qlr1H77R
	v1FWngd2JRGIsSOLFmjtMiqgceG4/BoMLp/EKNy+ZAqioc1mrORMaqfdVnRDAvxM
	T5au1X+I3Beui5Kwk6mTnfuogdy9nP7ecR/vr5AwI2k4BxK7mfoCCKd+iozf4WPG
	7oBABCVlooZuf/nQQhHy+pfePpotj8mEf6k=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a18.g.dreamhost.com (Postfix) with ESMTPA id D53C9250074; 
	Wed,  9 Nov 2011 13:21:07 -0800 (PST)
Received: from 206.223.182.18 (proxying for 206.223.182.18)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP; Wed, 9 Nov 2011 13:21:08 -0800
Message-ID: <7e96f2129a4c9ecbd10073c9c0f6da48.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <20111109070927.GB26154@aepfle.de>
References: <20111108224414.83985CF73A@homiemail-mx7.g.dreamhost.com>
	<3c097da8e49a42af1210e4ffcd39fd48.squirrel@webmail.lagarcavilla.org>
	<20111109070927.GB26154@aepfle.de>
Date: Wed, 9 Nov 2011 13:21:08 -0800
From: "Andres Lagar-Cavilla" <andres@lagarcavilla.org>
To: "Olaf Hering" <olaf@aepfle.de>
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: keir.xen@gmail.com, xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: Need help with fixing the Xen waitqueue feature
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: andres@lagarcavilla.org
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi there,
> On Tue, Nov 08, Andres Lagar-Cavilla wrote:
>
>> Tbh, for paging to be effective, we need to be prepared to yield on
>> every
>> p2m lookup.
>
> Yes, if a gfn is missing the vcpu should go to sleep rather than
> returning -ENOENT to the caller. Only the query part of gfn_to_mfn
> should return the p2m paging types.
>
>> Let's compare paging to PoD. They're essentially the same thing: pages
>> disappear, and get allocated on the fly when you need them. PoD is a
>> highly optimized in-hypervisor optimization that does not need a
>> user-space helper -- but the pager could do PoD easily and remove all
>> that
>> p2m-pod.c code from the hypervisor.
>
> Perhaps PoD and paging could be merged, I havent had time to study the
> PoD code.

Well, PoD can be implemented with a pager that simply shortcuts the step
that actually populates the page with contents. A zeroed heap page is goo=
d
enough. It's fairly simple for a pager to know for which pages it should
return zero.

PoD also does emergency sweeps under memory pressure to identify zeroes,
that can be easily implemented by a user-space utility.

The hypervisor code keeps a list of 2M superpages -- that feature would b=
e
lost.

But I doubt this would fly anyways: PoD works for non-ept modes, which I
guess don't want to lose that functionality.

>
>> PoD only introduces extraneous side-effects when there is a complete
>> absence of memory to allocate pages. The same cannot be said of paging=
,
>> to
>> put it mildly. It returns EINVAL all over the place. Right now, qemu c=
an
>> be crashed in a blink by paging out the right gfn.
>
> I have seen qemu crashes when using emulated storage, but havent
> debugged them yet. I suspect they were caused by a race between nominat=
e
> and evict.
>
> Olaf
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 13:31:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 13:31:04 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROFjc-0002Pl-6f; Wed, 09 Nov 2011 13:31:04 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1ROFim-0002Cl-M9
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 13:30:13 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-10.tower-182.messagelabs.com!1320874208!2513941!1
X-Originating-IP: [208.97.132.66]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14323 invoked from network); 9 Nov 2011 21:30:08 -0000
Received: from caiajhbdcagg.dreamhost.com (HELO homiemail-a19.g.dreamhost.com)
	(208.97.132.66) by server-10.tower-182.messagelabs.com with SMTP;
	9 Nov 2011 21:30:08 -0000
Received: from homiemail-a19.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a19.g.dreamhost.com (Postfix) with ESMTP id 8A2C0604076;
	Wed,  9 Nov 2011 13:30:07 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:reply-to
	:mime-version:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.org; b=mm6GUCYfr7HMCvkUvxNqy5ErojvykRTy0f26i5eRNoRO
	DFbzRM3sZkQ/aCLjby16AqFH/n8zytYJ5sqVyP3l5+fO9yyJYfN9hx1ZWcraH+EB
	Zd7q2AoekS/YCggLODxabLLjGjccZKL21Eg7SXHMCguNGmRHwGE3ydbYW/RR8Ho=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:reply-to:mime-version:content-type:content-transfer-encoding;
	s=lagarcavilla.org; bh=wVOCXTMB+PlKg0Os3LwD36lHDrg=; b=P6A1Kmby
	C7olaOc2cEGkP8ZvOXwC2mPZ1sj5Pl+a70waM9VHuaOH/I9MkhSsxvpWsylVymkT
	K+YCIhEp0266/iG537sFqGP+Q1sUrVBBiepyIrR0acL5ZE3Pg9zuex9jA+FLK44U
	+rG/MHCm6WDOmAaK0FCH8Tmfk/s3aerctHg=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a19.g.dreamhost.com (Postfix) with ESMTPA id 48F1A60405D; 
	Wed,  9 Nov 2011 13:30:07 -0800 (PST)
Received: from 206.223.182.18 (proxying for 206.223.182.18)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP; Wed, 9 Nov 2011 13:30:07 -0800
Message-ID: <0bb01a4d216a68c4ae8441b037927f61.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <20111109070927.GB26154@aepfle.de>
References: <20111108224414.83985CF73A@homiemail-mx7.g.dreamhost.com>
	<3c097da8e49a42af1210e4ffcd39fd48.squirrel@webmail.lagarcavilla.org>
	<20111109070927.GB26154@aepfle.de>
Date: Wed, 9 Nov 2011 13:30:07 -0800
From: "Andres Lagar-Cavilla" <andres@lagarcavilla.org>
To: "Olaf Hering" <olaf@aepfle.de>
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: keir.xen@gmail.com, xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: Need help with fixing the Xen waitqueue feature
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: andres@lagarcavilla.org
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Also,
> On Tue, Nov 08, Andres Lagar-Cavilla wrote:
>
>> Tbh, for paging to be effective, we need to be prepared to yield on
>> every
>> p2m lookup.
>
> Yes, if a gfn is missing the vcpu should go to sleep rather than
> returning -ENOENT to the caller. Only the query part of gfn_to_mfn
> should return the p2m paging types.
>
>> Let's compare paging to PoD. They're essentially the same thing: pages
>> disappear, and get allocated on the fly when you need them. PoD is a
>> highly optimized in-hypervisor optimization that does not need a
>> user-space helper -- but the pager could do PoD easily and remove all
>> that
>> p2m-pod.c code from the hypervisor.
>
> Perhaps PoD and paging could be merged, I havent had time to study the
> PoD code.
>
>> PoD only introduces extraneous side-effects when there is a complete
>> absence of memory to allocate pages. The same cannot be said of paging=
,
>> to
>> put it mildly. It returns EINVAL all over the place. Right now, qemu c=
an
>> be crashed in a blink by paging out the right gfn.
>
> I have seen qemu crashes when using emulated storage, but havent
> debugged them yet. I suspect they were caused by a race between nominat=
e
> and evict.

After a bit of thinking, things are far more complicated. I don't think
this is a "race." If the pager removed a page that later gets scheduled b=
y
the guest OS for IO, qemu will want to foreign-map that. With the
hypervisor returning ENOENT, the foreign map will fail, and there goes
qemu.

Same will happen for pv backend mapping grants, or the checkpoint/migrate
code.

I guess qemu/migrate/libxc could retry until the pager is done and the
mapping succeeds. It will be delicate. It won't work for pv backends. It
will flood the mem_event ring.

Wait-queueing the dom0 vcpu is a no-go -- the machine will deadlock quicl=
y.

My thinking is that the best bet is to wait-queue the dom0 process. The
dom0 kernel code handling the foreign map will need to put the mapping
thread in a wait-queue. It can establish a ring-based notification
mechanism with Xen. When Xen completes the paging in, it can add a
notification to the ring. dom0 can then awake the mapping thread and
retry.

Not simple at all. Ideas out there?

Andres

>
> Olaf
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 13:40:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 13:40:52 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROFt5-0002yE-Uv; Wed, 09 Nov 2011 13:40:51 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROFsT-0002ly-O3
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 13:40:14 -0800
X-Env-Sender: dan.magenheimer@oracle.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1320874809!2518638!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24553 invoked from network); 9 Nov 2011 21:40:10 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-5.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 21:40:10 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA9Le5xV022782
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 9 Nov 2011 21:40:05 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA9Le4tl024410
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 9 Nov 2011 21:40:05 GMT
Received: from abhmt105.oracle.com (abhmt105.oracle.com [141.146.116.57])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA9LdwEp031268; Wed, 9 Nov 2011 15:39:59 -0600
MIME-Version: 1.0
Message-ID: <ead5b75a-55db-43ba-9db9-c8302d4d7edc@default>
Date: Wed, 9 Nov 2011 13:40:01 -0800 (PST)
From: Dan Magenheimer <dan.magenheimer@oracle.com>
To: ian.jackson@eu.citrix.com, stefano.stabellini@eu.citrix.com
X-Priority: 3
X-Mailer: Oracle Beehive Extensions for Outlook 2.0.1.4.1.0  (410211) [OL
	12.0.6562.5003]
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090208.4EBAF336.008E,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] tools: misc: xen-tmem-list-parse: fix output
	ugliness
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

(This should apply cleanly to 4.0, 4.1, and unstable.  It would
be nice to apply to the next dot release of 4.0 and 4.1, but
please definitely apply at least to unstable.)

Fix ugly parse output for xen-tmem-list-parse

This program parses the output of xm/xl tmem-list into
human-readable format.  A missing NULL terminator sometimes
causes garbage to be spewed where the two-letter pool type
should be printed.

Signed-off-by: Dan Magenheimer <dan.magenheimer@oracle.com>

diff -r 54a5e994a241 tools/misc/xen-tmem-list-parse.c
--- a/tools/misc/xen-tmem-list-parse.c=09Wed Nov 02 17:09:09 2011 +0000
+++ b/tools/misc/xen-tmem-list-parse.c=09Wed Nov 09 14:28:40 2011 -0700
@@ -64,6 +64,7 @@
         return;
     for ( i =3D 0; i < len; i++ )
         *buf++ =3D *s1++;
+    *buf =3D '\0';
 }
=20
 void parse_sharers(char *s, char *match, char *buf, int len)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 14:05:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 14:05:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROGGn-0004Rr-9U; Wed, 09 Nov 2011 14:05:21 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROGC0-0004BT-4U
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 14:00:57 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1320876020!2519961!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29924 invoked from network); 9 Nov 2011 22:00:20 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 22:00:20 -0000
X-IronPort-AV: E=Sophos;i="4.69,485,1315180800"; 
   d="scan'208";a="8849535"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 22:00:14 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 22:00:14 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1ROGBq-0004Ru-2q;
	Wed, 09 Nov 2011 22:00:14 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1ROGBp-0006dT-TL;
	Wed, 09 Nov 2011 22:00:13 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9738-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 9 Nov 2011 22:00:13 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9738: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9738 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9738/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-pv           3 host-install(3)              broken
 test-amd64-i386-rhel6hvm-intel  3 host-install(3)              broken
 test-amd64-amd64-xl          18 leak-check/check           fail REGR. vs. 9661
 build-i386                    2 host-install(2)              broken
 test-amd64-i386-win-vcpus1    4 xen-install                fail REGR. vs. 9661
 test-amd64-i386-rhel6hvm-intel  7 redhat-install   fail in 9735 REGR. vs. 9661
 test-amd64-amd64-xl           3 host-install(3)              broken   in 9735
 test-i386-i386-xl            18 leak-check/check   fail in 9735 REGR. vs. 9661
 test-amd64-i386-xl           18 leak-check/check   fail in 9735 REGR. vs. 9661
 test-amd64-i386-xl-credit2   18 leak-check/check   fail in 9735 REGR. vs. 9661
 test-amd64-i386-xl-multivcpu 18 leak-check/check   fail in 9735 REGR. vs. 9661
 test-amd64-i386-win-vcpus1    3 host-install(3)              broken   in 9735
 test-i386-i386-win            3 host-install(3)              broken   in 9735

Tests which are failing intermittently (not blocking):
 test-amd64-i386-pv            4 xen-install                  fail pass in 9735
 test-amd64-i386-xl            4 xen-install                  fail pass in 9735
 test-amd64-i386-xl-credit2    4 xen-install                  fail pass in 9735
 test-amd64-i386-rhel6hvm-amd  4 xen-install                  fail pass in 9735
 test-amd64-i386-xl-multivcpu  4 xen-install                  fail pass in 9735
 test-amd64-i386-pair          6 xen-install/dst_host         fail pass in 9735
 test-amd64-i386-pair          5 xen-install/src_host         fail pass in 9735
 test-amd64-i386-xl-win-vcpus1  4 xen-install                 fail pass in 9735
 test-amd64-i386-win           4 xen-install                  fail pass in 9735
 test-amd64-amd64-xl-sedf     11 guest-localmigrate   fail in 9735 pass in 9738

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-i386-i386-pv             1 xen-build-check(1)           blocked  n/a
 test-i386-i386-xl             1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf     18 leak-check/check          fail blocked in 9661
 test-i386-i386-pair           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-xl-win         1 xen-build-check(1)           blocked  n/a
 test-i386-i386-win            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2          fail in 9735 never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop            fail in 9735 never pass
 test-amd64-i386-win          16 leak-check/check       fail in 9735 never pass
 test-i386-i386-xl-win        13 guest-stop             fail in 9735 never pass

version targeted for testing:
 xen                  f7988da4b6ea
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  "Shan, Haitao" <haitao.shan@intel.com>
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Jean Guyader <jean.guyader@eu.citrix.com>
  Juergen Gross <juergen.gross@ts.fujitsu.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  Tim Deegan <tim@xen.org>
  Wei Wang <wei.wang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   broken  
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            blocked 
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               broken  
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         fail    
 test-i386-i386-pair                                          blocked 
 test-amd64-amd64-pv                                          broken  
 test-amd64-i386-pv                                           fail    
 test-i386-i386-pv                                            blocked 
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           blocked 
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        blocked 


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

(No revision log; it would be 578 lines long.)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 14:12:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 14:12:47 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROGNz-0005gn-EQ; Wed, 09 Nov 2011 14:12:47 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROGNK-0005UR-8D
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 14:12:06 -0800
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-7.tower-27.messagelabs.com!1320876685!56195804!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4438 invoked from network); 9 Nov 2011 22:11:25 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-7.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 9 Nov 2011 22:11:25 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320876722; l=839;
	s=domk; d=aepfle.de;
	h=In-Reply-To:Content-Type:MIME-Version:References:Subject:Cc:To:From:
	Date:X-RZG-CLASS-ID:X-RZG-AUTH;
	bh=qb9sQnRVBeVMJAttPIK8Ig967Hg=;
	b=Uv5696Hc0gzICuKwmMk9ZSWWG537XznjPcMb0qSkFuPWnNnl0bC9dUHG3muXYoUCfC2
	vww1GbGx4uLPF0ol/+kyMG3KfaDpmvdzKymwqSLK7Td89//1bBThKcsvCCl9GnHd2sCke
	+UFbl5zXigHuP4/suY9YCNj5Gs3jY8tKGcU=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV69v6
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-13.vodafone-net.de [80.226.24.13])
	by smtp.strato.de (fruni mo46) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id D06d94nA9Ks6lT ;
	Wed, 9 Nov 2011 23:11:53 +0100 (MET)
Received: by probook.site (Postfix, from userid 1000)
	id 2DBE118638; Wed,  9 Nov 2011 23:11:49 +0100 (CET)
Date: Wed, 9 Nov 2011 23:11:49 +0100
From: Olaf Hering <olaf@aepfle.de>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Message-ID: <20111109221148.GA17166@aepfle.de>
References: <20111108224414.83985CF73A@homiemail-mx7.g.dreamhost.com>
	<3c097da8e49a42af1210e4ffcd39fd48.squirrel@webmail.lagarcavilla.org>
	<20111109070927.GB26154@aepfle.de>
	<0bb01a4d216a68c4ae8441b037927f61.squirrel@webmail.lagarcavilla.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <0bb01a4d216a68c4ae8441b037927f61.squirrel@webmail.lagarcavilla.org>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
Cc: keir.xen@gmail.com, xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: Need help with fixing the Xen waitqueue feature
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Nov 09, Andres Lagar-Cavilla wrote:

> After a bit of thinking, things are far more complicated. I don't think
> this is a "race." If the pager removed a page that later gets scheduled by
> the guest OS for IO, qemu will want to foreign-map that. With the
> hypervisor returning ENOENT, the foreign map will fail, and there goes
> qemu.

The tools are supposed to catch ENOENT and try again.
linux_privcmd_map_foreign_bulk() does that. linux_gnttab_grant_map()
appears to do that as well. What code path uses qemu that leads to a
crash?

> I guess qemu/migrate/libxc could retry until the pager is done and the
> mapping succeeds. It will be delicate. It won't work for pv backends. It
> will flood the mem_event ring.

There will no flood, only one request is sent per gfn in
p2m_mem_paging_populate().

Olaf

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 14:16:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 14:16:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROGRv-00067M-HN; Wed, 09 Nov 2011 14:16:51 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROGRH-0005vG-KR
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 14:16:13 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1320876968!2922535!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8294 invoked from network); 9 Nov 2011 22:16:08 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Nov 2011 22:16:08 -0000
X-IronPort-AV: E=Sophos;i="4.69,485,1315180800"; 
   d="scan'208";a="8849672"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Nov 2011 22:16:08 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 9 Nov 2011 22:16:08 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROGRE-0004Xr-65;
	Wed, 09 Nov 2011 22:16:08 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROGR5-000092-5i;
	Wed, 09 Nov 2011 22:15:59 +0000
Date: Wed, 9 Nov 2011 22:15:59 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: "Kay, Allen M" <allen.m.kay@intel.com>
Message-ID: <20111109221559.GA501@spongy.cam.xci-test.com>
References: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
	<987664A83D2D224EAE907B061CE93D530206CE00D0@orsmsx505.amr.corp.intel.com>
	<20111108074225.GA7257@spongy.cam.xci-test.com>
	<987664A83D2D224EAE907B061CE93D53021196C476@orsmsx505.amr.corp.intel.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
In-Reply-To: <987664A83D2D224EAE907B061CE93D53021196C476@orsmsx505.amr.corp.intel.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Tim \(Xen.org\)" <tim@xen.org>, Jean Guyader <Jean.Guyader@citrix.com>
Subject: [Xen-devel] Re: [PATCH 1/6] vtd: Refactor iotlb flush code
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Allen,

The addresses in input are not necessarily aligned, to be able to use this feature
I will have to break the range into aligned chunks of different sizes and flush
them separatly.

I personally don't think this optimization is worth the effort.

Jean

On 09/11 02:41, Kay, Allen M wrote:
> Jean,
> 
> Page 122 of VT-d spec indicates you can invalidate multiple pages by setting the Address Mask (AM) field.  Will this achieve what you wanted to do?
> 
> http://download.intel.com/technology/computing/vptech/Intel(r)_VT_for_Direct_IO.pdf
> 
> Allen
> 
> -----Original Message-----
> From: Jean Guyader [mailto:jean.guyader@eu.citrix.com] 
> Sent: Monday, November 07, 2011 11:42 PM
> To: Kay, Allen M
> Cc: Jean Guyader; xen-devel@lists.xensource.com; Tim (Xen.org)
> Subject: Re: [PATCH 1/6] vtd: Refactor iotlb flush code
> 
> 
> Allen,
> 
> You are probably talking about __intel_iommu_iotlb_flush.
> This function takes a range of address to flush. I haven't found a function in the vtd code to invalidate a range on address without doing a loop of flush_iotlb_psi, so I thought that the most efficient and quick way to flush a range would be to use a domain selective invalidation.
> 
> Jean
> 
> On 08/11 03:10, Kay, Allen M wrote:
> > Jean,
> > 
> > The original code does not call iommu_flush_iotlb_dsi().  What is the reason the refractored code need to use domain selective invalidation?
> > 
> > Allen
> > -----
> > 
> > +        if ( page_count > 1 || gfn == -1 )
> > +        {
> > +            if ( iommu_flush_iotlb_dsi(iommu, iommu_domid,
> > +                        0, flush_dev_iotlb) )
> > +                iommu_flush_write_buffer(iommu);
> > +        }
> > +        else
> > +        {
> > +            if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
> > +                        (paddr_t)gfn << PAGE_SHIFT_4K, 0,
> > +                        !dma_old_pte_present, flush_dev_iotlb) )
> > +                iommu_flush_write_buffer(iommu);
> > 
> > -----Original Message-----
> > From: Jean Guyader [mailto:jean.guyader@eu.citrix.com]
> > Sent: Monday, November 07, 2011 10:25 AM
> > To: xen-devel@lists.xensource.com
> > Cc: tim@xen.org; Kay, Allen M; Jean Guyader
> > Subject: [PATCH 1/6] vtd: Refactor iotlb flush code
> > 
> > 
> > Factorize the iotlb flush code from map_page and unmap_page into it's own function.
> > 
> > Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> > ---
> >  xen/drivers/passthrough/vtd/iommu.c |   86 +++++++++++++++++-----------------
> >  1 files changed, 43 insertions(+), 43 deletions(-)
> > 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 15:25:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 15:25:55 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROHWl-0001rE-Cv; Wed, 09 Nov 2011 15:25:55 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1ROHWE-0001fJ-6Z
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 15:25:22 -0800
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1320881118!4270596!1
X-Originating-IP: [143.182.124.21]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3410 invoked from network); 9 Nov 2011 23:25:19 -0000
Received: from mga03.intel.com (HELO mga03.intel.com) (143.182.124.21)
	by server-2.tower-216.messagelabs.com with SMTP;
	9 Nov 2011 23:25:19 -0000
Received: from azsmga002.ch.intel.com ([10.2.17.35])
	by azsmga101.ch.intel.com with ESMTP; 09 Nov 2011 15:25:17 -0800
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.69,486,1315206000"; d="scan'208";a="35076764"
Received: from orsmsx604.amr.corp.intel.com ([10.22.226.87])
	by AZSMGA002.ch.intel.com with ESMTP; 09 Nov 2011 15:25:17 -0800
Received: from orsmsx601.amr.corp.intel.com (10.22.226.213) by
	orsmsx604.amr.corp.intel.com (10.22.226.87) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Wed, 9 Nov 2011 15:25:16 -0800
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx601.amr.corp.intel.com ([10.22.226.213]) with mapi;
	Wed, 9 Nov 2011 15:25:16 -0800
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: Jean Guyader <jean.guyader@eu.citrix.com>
Date: Wed, 9 Nov 2011 15:25:14 -0800
Thread-Topic: [PATCH 1/6] vtd: Refactor iotlb flush code
Thread-Index: AcyfLTE6lvuALywaQOqmKIvzi2kQYwACYv6A
Message-ID: <987664A83D2D224EAE907B061CE93D530211D8580D@orsmsx505.amr.corp.intel.com>
References: <1320690327-12649-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320690327-12649-2-git-send-email-jean.guyader@eu.citrix.com>
	<987664A83D2D224EAE907B061CE93D530206CE00D0@orsmsx505.amr.corp.intel.com>
	<20111108074225.GA7257@spongy.cam.xci-test.com>
	<987664A83D2D224EAE907B061CE93D53021196C476@orsmsx505.amr.corp.intel.com>
	<20111109221559.GA501@spongy.cam.xci-test.com>
In-Reply-To: <20111109221559.GA501@spongy.cam.xci-test.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Tim \(Xen.org\)" <tim@xen.org>, Jean Guyader <Jean.Guyader@citrix.com>
Subject: [Xen-devel] RE: [PATCH 1/6] vtd: Refactor iotlb flush code
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Jean,

I think this is fine.  Ack for VT-d related changes.

Allen

-----Original Message-----
From: Jean Guyader [mailto:jean.guyader@eu.citrix.com]=20
Sent: Wednesday, November 09, 2011 2:16 PM
To: Kay, Allen M
Cc: Jean Guyader; xen-devel@lists.xensource.com; Tim (Xen.org)
Subject: Re: [PATCH 1/6] vtd: Refactor iotlb flush code

Allen,

The addresses in input are not necessarily aligned, to be able to use this =
feature I will have to break the range into aligned chunks of different siz=
es and flush them separatly.

I personally don't think this optimization is worth the effort.

Jean

On 09/11 02:41, Kay, Allen M wrote:
> Jean,
>=20
> Page 122 of VT-d spec indicates you can invalidate multiple pages by sett=
ing the Address Mask (AM) field.  Will this achieve what you wanted to do?
>=20
> http://download.intel.com/technology/computing/vptech/Intel(r)_VT_for_
> Direct_IO.pdf
>=20
> Allen
>=20
> -----Original Message-----
> From: Jean Guyader [mailto:jean.guyader@eu.citrix.com]
> Sent: Monday, November 07, 2011 11:42 PM
> To: Kay, Allen M
> Cc: Jean Guyader; xen-devel@lists.xensource.com; Tim (Xen.org)
> Subject: Re: [PATCH 1/6] vtd: Refactor iotlb flush code
>=20
>=20
> Allen,
>=20
> You are probably talking about __intel_iommu_iotlb_flush.
> This function takes a range of address to flush. I haven't found a functi=
on in the vtd code to invalidate a range on address without doing a loop of=
 flush_iotlb_psi, so I thought that the most efficient and quick way to flu=
sh a range would be to use a domain selective invalidation.
>=20
> Jean
>=20
> On 08/11 03:10, Kay, Allen M wrote:
> > Jean,
> >=20
> > The original code does not call iommu_flush_iotlb_dsi().  What is the r=
eason the refractored code need to use domain selective invalidation?
> >=20
> > Allen
> > -----
> >=20
> > +        if ( page_count > 1 || gfn =3D=3D -1 )
> > +        {
> > +            if ( iommu_flush_iotlb_dsi(iommu, iommu_domid,
> > +                        0, flush_dev_iotlb) )
> > +                iommu_flush_write_buffer(iommu);
> > +        }
> > +        else
> > +        {
> > +            if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
> > +                        (paddr_t)gfn << PAGE_SHIFT_4K, 0,
> > +                        !dma_old_pte_present, flush_dev_iotlb) )
> > +                iommu_flush_write_buffer(iommu);
> >=20
> > -----Original Message-----
> > From: Jean Guyader [mailto:jean.guyader@eu.citrix.com]
> > Sent: Monday, November 07, 2011 10:25 AM
> > To: xen-devel@lists.xensource.com
> > Cc: tim@xen.org; Kay, Allen M; Jean Guyader
> > Subject: [PATCH 1/6] vtd: Refactor iotlb flush code
> >=20
> >=20
> > Factorize the iotlb flush code from map_page and unmap_page into it's o=
wn function.
> >=20
> > Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> > ---
> >  xen/drivers/passthrough/vtd/iommu.c |   86 +++++++++++++++++----------=
-------
> >  1 files changed, 43 insertions(+), 43 deletions(-)
> >=20

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 17:42:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 17:42:24 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROJeq-0006l6-07; Wed, 09 Nov 2011 17:42:24 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROJe8-0006YZ-79
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 17:41:40 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320889045!52139901!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2970 invoked from network); 10 Nov 2011 01:37:26 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-9.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 01:37:26 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAA1bkZi023080
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 10 Nov 2011 01:37:47 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAA1bhI5023570
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 10 Nov 2011 01:37:44 GMT
Received: from abhmt101.oracle.com (abhmt101.oracle.com [141.146.116.53])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAA1bacu028797; Wed, 9 Nov 2011 19:37:36 -0600
Received: from [10.182.39.81] (/10.182.39.81)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 17:37:35 -0800
Message-ID: <4EBB2ADD.1090602@oracle.com>
Date: Thu, 10 Nov 2011 09:37:33 +0800
From: ANNIE LI <annie.li@oracle.com>
Organization: Oracle Corporation
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;
	rv:1.9.2.23) Gecko/20110920 Thunderbird/3.1.15
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
References: <4EBA32B7.7020804@oracle.com>
	<20111109142256.GA8410@phenom.dumpdata.com>
In-Reply-To: <20111109142256.GA8410@phenom.dumpdata.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090209.4EBB2AEC.0034,ss=1,re=0.000,fgs=0
Cc: Kurt Hackel <Kurt.Hackel@oracle.com>, jeremy@goop.org,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	linux-kernel@vger.kernel.org, Paul Durrant <paul.durrant@citrix.com>
Subject: [Xen-devel] Re: patches of upstreaming grant table version 2
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> Well, .. parts of netchannel2 that are going to be put in the netback
> and netfront as ways of expanding the driver (add new features).
>
> netchannel2 by itself is dead, and we can pick some of its grand ideas
> from it and put them in netback/netfront.
Yes, I should not mention netchannel2 here, will update the comments.

Thanks
Annie

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 17:51:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 17:51:31 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROJnf-0007GV-JO; Wed, 09 Nov 2011 17:51:31 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROJnA-000741-Ts
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 17:51:01 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1320889856!1985982!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16754 invoked from network); 10 Nov 2011 01:50:57 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-13.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 01:50:57 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAA1oqkU001548
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 10 Nov 2011 01:50:53 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAA1oplW003207
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 10 Nov 2011 01:50:52 GMT
Received: from abhmt108.oracle.com (abhmt108.oracle.com [141.146.116.60])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAA1ojjp032685; Wed, 9 Nov 2011 19:50:45 -0600
Received: from [10.182.39.81] (/10.182.39.81)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 17:50:45 -0800
Message-ID: <4EBB2DF3.2050504@oracle.com>
Date: Thu, 10 Nov 2011 09:50:43 +0800
From: ANNIE LI <annie.li@oracle.com>
Organization: Oracle Corporation
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;
	rv:1.9.2.23) Gecko/20110920 Thunderbird/3.1.15
MIME-Version: 1.0
To: Paul Durrant <Paul.Durrant@citrix.com>
Subject: Re: [Xen-devel] RE: [PATCH 1/3] Introducing grant table V2 stucture
References: <4EBA35D3.3020506@oracle.com>	<1320826490-29362-1-git-send-email-annie.li@oracle.com>	<291EDFCB1E9E224A99088639C4762022B4543AB1BD@LONPMAILBOX01.citrite.net>	<4EBAA566.80909@oracle.com>
	<291EDFCB1E9E224A99088639C4762022B4543AB213@LONPMAILBOX01.citrite.net>
In-Reply-To: <291EDFCB1E9E224A99088639C4762022B4543AB213@LONPMAILBOX01.citrite.net>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090209.4EBB2DFE.0006,ss=1,re=0.000,fgs=0
Cc: "kurt.hackel@oracle.com" <kurt.hackel@oracle.com>,
	"jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"konrad.wilk@oracle.com" <konrad.wilk@oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com



On 2011-11-10 0:14, Paul Durrant wrote:
> Annie,
>
> On 2011-11-9 19:11, Paul Durrant wrote:
>> I see. v2 function includes mapping and arch_gnttab_map_shared, v1 function only include arch_gnttab_map_sh, right?
>> This will lead to some code duplicated in two functions.
> My preference would be to have duplicated calls to arch_gnttab_map_shared(). I think it's more illustrative of the difference between v1 and v2 having separate status pages.
Ok, will do as you suggested, thanks.

Thanks
Annie

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 17:59:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 17:59:35 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROJvQ-0007ll-MC; Wed, 09 Nov 2011 17:59:33 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROJtB-0007XX-BK
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 17:57:13 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1320890191!56206544!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11845 invoked from network); 10 Nov 2011 01:56:32 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-7.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 01:56:32 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAA1v5p0007151
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 10 Nov 2011 01:57:06 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAA1v4XZ019555
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 10 Nov 2011 01:57:05 GMT
Received: from abhmt107.oracle.com (abhmt107.oracle.com [141.146.116.59])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAA1uxcc003022; Wed, 9 Nov 2011 19:56:59 -0600
Received: from [10.182.39.81] (/10.182.39.81)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 17:56:59 -0800
Message-ID: <4EBB2F68.8070609@oracle.com>
Date: Thu, 10 Nov 2011 09:56:56 +0800
From: ANNIE LI <annie.li@oracle.com>
Organization: Oracle Corporation
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;
	rv:1.9.2.23) Gecko/20110920 Thunderbird/3.1.15
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] RE: [PATCH 1/3] Introducing grant table V2 stucture
References: <4EBA35D3.3020506@oracle.com>	<1320826490-29362-1-git-send-email-annie.li@oracle.com>	<291EDFCB1E9E224A99088639C4762022B4543AB1BD@LONPMAILBOX01.citrite.net>	<20111109144922.GC8410@phenom.dumpdata.com>	<291EDFCB1E9E224A99088639C4762022B4543AB204@LONPMAILBOX01.citrite.net>	<4EBAA3B1.8010401@oracle.com>
	<1320855724.955.183.camel@zakaz.uk.xensource.com>
In-Reply-To: <1320855724.955.183.camel@zakaz.uk.xensource.com>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090209.4EBB2F73.000F,ss=1,re=0.000,fgs=0
Cc: "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	"kurt.hackel@oracle.com" <kurt.hackel@oracle.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Paul Durrant <Paul.Durrant@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com



On 2011-11-10 0:22, Ian Campbell wrote:
> IMHO the gnttab_ bit belongs in either (or both) the struct name or the
> variable names referencing the struct, rather than the fields
> themselves. It should be obvious from the context that this member is
> something to do with gnttab. e.g. I think gnttab_shared->addr would be
> fine, as would shared->addr in the context of gnttab.c etc.
Right.
Thanks you all for the review, I will improve patches based on those 
suggestions and resend them.

Thanks
Annie

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 19:20:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 19:20:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROLBd-0001iV-56; Wed, 09 Nov 2011 19:20:21 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROLAu-0001Vs-0s
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 19:19:36 -0800
X-Env-Sender: naizhengtan@gmail.com
X-Msg-Ref: server-16.tower-182.messagelabs.com!1320895171!2518908!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22562 invoked from network); 10 Nov 2011 03:19:32 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-16.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 03:19:32 -0000
Received: by ywp17 with SMTP id 17so3420647ywp.30
	for <xen-devel@lists.xensource.com>;
	Wed, 09 Nov 2011 19:19:31 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:date:x-google-sender-auth:message-id:subject
	:from:to:content-type;
	bh=WTGFARYPX0oCqhwCeGv0wUxodxqkSsG5UtKNmiFjbUo=;
	b=XEH2zEHJ1Ier0P/Q7JaJC9ptHITMRLfP60h2tjADvx9afdW1hfJNHC1IZnMzDuIiKR
	n2OZHg4piUhZ41GDTAf2C6cuj56yOUCpPXrWLoybEIvggy3yNJWwRwlKtAF/XTSUanAh
	kMnEfAYuWhJeRFIXwWyVSUqWlwHnY7p8T76UI=
MIME-Version: 1.0
Received: by 10.50.42.198 with SMTP id q6mr5930049igl.34.1320895171435; Wed,
	09 Nov 2011 19:19:31 -0800 (PST)
Received: by 10.231.17.197 with HTTP; Wed, 9 Nov 2011 19:19:31 -0800 (PST)
Date: Thu, 10 Nov 2011 11:19:31 +0800
X-Google-Sender-Auth: vcuI6ZfnRe9zheuRLPcbrdcWdy0
Message-ID: <CAOPAWnZZV6VYK+-QPpqDhEsMz+8ASJktS6tCiHLeVARP+OMriA@mail.gmail.com>
From: NaizhengTAN <njudroid@gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1
Subject: [Xen-devel] Question about unplug a pass-through device
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi,
   Are there any tools in XEN to unplug a pass-through device and
immediately introduce another emulate device?

regards,

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 19:25:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 19:25:49 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROLGu-00029w-U6; Wed, 09 Nov 2011 19:25:48 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROLFj-0001wt-Lk
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 19:24:36 -0800
X-Env-Sender: gregkh@suse.de
X-Msg-Ref: server-13.tower-216.messagelabs.com!1320895472!2954743!1
X-Originating-IP: [195.135.220.15]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18520 invoked from network); 10 Nov 2011 03:24:32 -0000
Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15)
	by server-13.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 03:24:32 -0000
Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	by mx2.suse.de (Postfix) with ESMTP id A0B658BB22;
	Thu, 10 Nov 2011 04:24:31 +0100 (CET)
X-Mailbox-Line: From gregkh@clark.kroah.org Wed Nov  9 13:27:09 2011
Message-Id: <20111109212709.441682153@clark.kroah.org>
User-Agent: quilt/0.48-16.4
Date: Wed, 09 Nov 2011 13:26:51 -0800
From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
In-Reply-To: <20111109212847.GA20838@kroah.com>
Cc: Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	Ian Campbell <ian.campbell@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	"Rafael J. Wysocki" <rjw@sisk.pl>,
	xen-devel <xen-devel@lists.xensource.com>,
	akpm@linux-foundation.org, torvalds@linux-foundation.org,
	Thomas Gleixner <tglx@linutronix.de>, alan@lxorguk.ukuu.org.uk
Subject: [Xen-devel] [089/262] genirq: Add IRQF_RESUME_EARLY and resume such
	IRQs earlier
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

3.0-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Ian Campbell <ian.campbell@citrix.com>

commit 9bab0b7fbaceec47d32db51cd9e59c82fb071f5a upstream.

This adds a mechanism to resume selected IRQs during syscore_resume
instead of dpm_resume_noirq.

Under Xen we need to resume IRQs associated with IPIs early enough
that the resched IPI is unmasked and we can therefore schedule
ourselves out of the stop_machine where the suspend/resume takes
place.

This issue was introduced by 676dc3cf5bc3 "xen: Use IRQF_FORCE_RESUME".

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Cc: Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>
Cc: xen-devel <xen-devel@lists.xensource.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Link: http://lkml.kernel.org/r/1318713254.11016.52.camel@dagon.hellion.org.uk
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 drivers/xen/events.c      |    2 -
 include/linux/interrupt.h |    3 ++
 kernel/irq/pm.c           |   48 +++++++++++++++++++++++++++++++++++++++-------
 3 files changed, 45 insertions(+), 8 deletions(-)

--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -1026,7 +1026,7 @@ int bind_ipi_to_irqhandler(enum ipi_vect
 	if (irq < 0)
 		return irq;
 
-	irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME;
+	irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME | IRQF_EARLY_RESUME;
 	retval = request_irq(irq, handler, irqflags, devname, dev_id);
 	if (retval != 0) {
 		unbind_from_irq(irq);
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -59,6 +59,8 @@
  * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend
  * IRQF_FORCE_RESUME - Force enable it on resume even if IRQF_NO_SUSPEND is set
  * IRQF_NO_THREAD - Interrupt cannot be threaded
+ * IRQF_EARLY_RESUME - Resume IRQ early during syscore instead of at device
+ *                resume time.
  */
 #define IRQF_DISABLED		0x00000020
 #define IRQF_SAMPLE_RANDOM	0x00000040
@@ -72,6 +74,7 @@
 #define IRQF_NO_SUSPEND		0x00004000
 #define IRQF_FORCE_RESUME	0x00008000
 #define IRQF_NO_THREAD		0x00010000
+#define IRQF_EARLY_RESUME	0x00020000
 
 #define IRQF_TIMER		(__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD)
 
--- a/kernel/irq/pm.c
+++ b/kernel/irq/pm.c
@@ -9,6 +9,7 @@
 #include <linux/irq.h>
 #include <linux/module.h>
 #include <linux/interrupt.h>
+#include <linux/syscore_ops.h>
 
 #include "internals.h"
 
@@ -39,25 +40,58 @@ void suspend_device_irqs(void)
 }
 EXPORT_SYMBOL_GPL(suspend_device_irqs);
 
-/**
- * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs()
- *
- * Enable all interrupt lines previously disabled by suspend_device_irqs() that
- * have the IRQS_SUSPENDED flag set.
- */
-void resume_device_irqs(void)
+static void resume_irqs(bool want_early)
 {
 	struct irq_desc *desc;
 	int irq;
 
 	for_each_irq_desc(irq, desc) {
 		unsigned long flags;
+		bool is_early = desc->action &&
+			desc->action->flags & IRQF_EARLY_RESUME;
+
+		if (is_early != want_early)
+			continue;
 
 		raw_spin_lock_irqsave(&desc->lock, flags);
 		__enable_irq(desc, irq, true);
 		raw_spin_unlock_irqrestore(&desc->lock, flags);
 	}
 }
+
+/**
+ * irq_pm_syscore_ops - enable interrupt lines early
+ *
+ * Enable all interrupt lines with %IRQF_EARLY_RESUME set.
+ */
+static void irq_pm_syscore_resume(void)
+{
+	resume_irqs(true);
+}
+
+static struct syscore_ops irq_pm_syscore_ops = {
+	.resume		= irq_pm_syscore_resume,
+};
+
+static int __init irq_pm_init_ops(void)
+{
+	register_syscore_ops(&irq_pm_syscore_ops);
+	return 0;
+}
+
+device_initcall(irq_pm_init_ops);
+
+/**
+ * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs()
+ *
+ * Enable all non-%IRQF_EARLY_RESUME interrupt lines previously
+ * disabled by suspend_device_irqs() that have the IRQS_SUSPENDED flag
+ * set as well as those with %IRQF_FORCE_RESUME.
+ */
+void resume_device_irqs(void)
+{
+	resume_irqs(false);
+}
 EXPORT_SYMBOL_GPL(resume_device_irqs);
 
 /**



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 19:34:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 19:34:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROLPH-0002mT-DL; Wed, 09 Nov 2011 19:34:27 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROLOV-0002Zq-Bi
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 19:33:39 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1320896016!2950698!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32456 invoked from network); 10 Nov 2011 03:33:36 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 03:33:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,486,1315180800"; 
   d="scan'208";a="8851218"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 03:33:35 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 03:33:35 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1ROLOR-0006Hp-CO;
	Thu, 10 Nov 2011 03:33:35 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1ROLOR-000406-Bl;
	Thu, 10 Nov 2011 03:33:35 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9740-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 10 Nov 2011 03:33:35 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9740: regressions - trouble:
	blocked/broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9740 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9740/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl          18 leak-check/check           fail REGR. vs. 9661
 build-i386-pvops              2 host-install(2)              broken
 build-i386-oldkern            2 host-install(2)              broken
 build-i386                    2 host-install(2)              broken

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  n/a
 test-i386-i386-pv             1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pv            1 xen-build-check(1)           blocked  n/a
 test-i386-i386-xl             1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      5 xen-boot                     fail    like 9661
 test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  n/a
 test-i386-i386-pair           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pair          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-i386-win           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-xl-win         1 xen-build-check(1)           blocked  n/a
 test-i386-i386-win            1 xen-build-check(1)           blocked  n/a

version targeted for testing:
 xen                  f7988da4b6ea
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  "Shan, Haitao" <haitao.shan@intel.com>
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Jean Guyader <jean.guyader@eu.citrix.com>
  Juergen Gross <juergen.gross@ts.fujitsu.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  Tim Deegan <tim@xen.org>
  Wei Wang <wei.wang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   broken  
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           broken  
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             broken  
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           blocked 
 test-i386-i386-xl                                            blocked 
 test-amd64-i386-rhel6hvm-amd                                 blocked 
 test-amd64-i386-xl-credit2                                   blocked 
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               blocked 
 test-amd64-i386-xl-multivcpu                                 blocked 
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         blocked 
 test-i386-i386-pair                                          blocked 
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           blocked 
 test-i386-i386-pv                                            blocked 
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   blocked 
 test-amd64-i386-xl-win-vcpus1                                blocked 
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          blocked 
 test-i386-i386-win                                           blocked 
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        blocked 


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

(No revision log; it would be 578 lines long.)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 19:41:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 19:41:15 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROLVr-0003HT-Ms; Wed, 09 Nov 2011 19:41:15 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROLVL-000351-Fs
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 19:40:43 -0800
X-Env-Sender: gregkh@suse.de
X-Msg-Ref: server-12.tower-216.messagelabs.com!1320896440!2949289!1
X-Originating-IP: [195.135.220.15]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2780 invoked from network); 10 Nov 2011 03:40:40 -0000
Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15)
	by server-12.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 03:40:40 -0000
Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	by mx2.suse.de (Postfix) with ESMTP id 0B97F8D167;
	Thu, 10 Nov 2011 04:40:40 +0100 (CET)
X-Mailbox-Line: From gregkh@clark.kroah.org Wed Nov  9 13:31:53 2011
Message-Id: <20111109213153.300523313@clark.kroah.org>
User-Agent: quilt/0.48-16.4
Date: Wed, 09 Nov 2011 13:32:38 -0800
From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
In-Reply-To: <20111109213508.GA3476@kroah.com>
Cc: Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	Ian Campbell <ian.campbell@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	"Rafael J. Wysocki" <rjw@sisk.pl>,
	xen-devel <xen-devel@lists.xensource.com>,
	akpm@linux-foundation.org, torvalds@linux-foundation.org,
	Thomas Gleixner <tglx@linutronix.de>, alan@lxorguk.ukuu.org.uk
Subject: [Xen-devel] [111/264] genirq: Add IRQF_RESUME_EARLY and resume such
	IRQs earlier
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

3.1-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Ian Campbell <ian.campbell@citrix.com>

commit 9bab0b7fbaceec47d32db51cd9e59c82fb071f5a upstream.

This adds a mechanism to resume selected IRQs during syscore_resume
instead of dpm_resume_noirq.

Under Xen we need to resume IRQs associated with IPIs early enough
that the resched IPI is unmasked and we can therefore schedule
ourselves out of the stop_machine where the suspend/resume takes
place.

This issue was introduced by 676dc3cf5bc3 "xen: Use IRQF_FORCE_RESUME".

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Cc: Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>
Cc: xen-devel <xen-devel@lists.xensource.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Link: http://lkml.kernel.org/r/1318713254.11016.52.camel@dagon.hellion.org.uk
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 drivers/xen/events.c      |    2 -
 include/linux/interrupt.h |    3 ++
 kernel/irq/pm.c           |   48 +++++++++++++++++++++++++++++++++++++++-------
 3 files changed, 45 insertions(+), 8 deletions(-)

--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -1021,7 +1021,7 @@ int bind_ipi_to_irqhandler(enum ipi_vect
 	if (irq < 0)
 		return irq;
 
-	irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME;
+	irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME | IRQF_EARLY_RESUME;
 	retval = request_irq(irq, handler, irqflags, devname, dev_id);
 	if (retval != 0) {
 		unbind_from_irq(irq);
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -59,6 +59,8 @@
  * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend
  * IRQF_FORCE_RESUME - Force enable it on resume even if IRQF_NO_SUSPEND is set
  * IRQF_NO_THREAD - Interrupt cannot be threaded
+ * IRQF_EARLY_RESUME - Resume IRQ early during syscore instead of at device
+ *                resume time.
  */
 #define IRQF_DISABLED		0x00000020
 #define IRQF_SAMPLE_RANDOM	0x00000040
@@ -72,6 +74,7 @@
 #define IRQF_NO_SUSPEND		0x00004000
 #define IRQF_FORCE_RESUME	0x00008000
 #define IRQF_NO_THREAD		0x00010000
+#define IRQF_EARLY_RESUME	0x00020000
 
 #define IRQF_TIMER		(__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD)
 
--- a/kernel/irq/pm.c
+++ b/kernel/irq/pm.c
@@ -9,6 +9,7 @@
 #include <linux/irq.h>
 #include <linux/module.h>
 #include <linux/interrupt.h>
+#include <linux/syscore_ops.h>
 
 #include "internals.h"
 
@@ -39,25 +40,58 @@ void suspend_device_irqs(void)
 }
 EXPORT_SYMBOL_GPL(suspend_device_irqs);
 
-/**
- * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs()
- *
- * Enable all interrupt lines previously disabled by suspend_device_irqs() that
- * have the IRQS_SUSPENDED flag set.
- */
-void resume_device_irqs(void)
+static void resume_irqs(bool want_early)
 {
 	struct irq_desc *desc;
 	int irq;
 
 	for_each_irq_desc(irq, desc) {
 		unsigned long flags;
+		bool is_early = desc->action &&
+			desc->action->flags & IRQF_EARLY_RESUME;
+
+		if (is_early != want_early)
+			continue;
 
 		raw_spin_lock_irqsave(&desc->lock, flags);
 		__enable_irq(desc, irq, true);
 		raw_spin_unlock_irqrestore(&desc->lock, flags);
 	}
 }
+
+/**
+ * irq_pm_syscore_ops - enable interrupt lines early
+ *
+ * Enable all interrupt lines with %IRQF_EARLY_RESUME set.
+ */
+static void irq_pm_syscore_resume(void)
+{
+	resume_irqs(true);
+}
+
+static struct syscore_ops irq_pm_syscore_ops = {
+	.resume		= irq_pm_syscore_resume,
+};
+
+static int __init irq_pm_init_ops(void)
+{
+	register_syscore_ops(&irq_pm_syscore_ops);
+	return 0;
+}
+
+device_initcall(irq_pm_init_ops);
+
+/**
+ * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs()
+ *
+ * Enable all non-%IRQF_EARLY_RESUME interrupt lines previously
+ * disabled by suspend_device_irqs() that have the IRQS_SUSPENDED flag
+ * set as well as those with %IRQF_FORCE_RESUME.
+ */
+void resume_device_irqs(void)
+{
+	resume_irqs(false);
+}
 EXPORT_SYMBOL_GPL(resume_device_irqs);
 
 /**



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 19:44:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 19:44:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROLYr-0003gt-Jm; Wed, 09 Nov 2011 19:44:21 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROLXP-0003TS-RQ
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 19:42:52 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1320896567!2526678!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31933 invoked from network); 10 Nov 2011 03:42:48 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-12.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 03:42:48 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAA3gjfQ031180
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 10 Nov 2011 03:42:46 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAA3giCp004195
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 10 Nov 2011 03:42:45 GMT
Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAA3gdPV020388; Wed, 9 Nov 2011 21:42:39 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 19:42:38 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 19FEB81449; Wed,  9 Nov 2011 22:42:38 -0500 (EST)
Date: Wed, 9 Nov 2011 22:42:37 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Roberto Scudeller <beto.rvs@gmail.com>
Subject: Re: [Xen-devel] why do I get bad disk write performance in the
	kernel 3.1?
Message-ID: <20111110034237.GA3156@phenom.dumpdata.com>
References: <CAOdhoheOhKGWp3f-tvXDX5SuGMXmsyY4fP==EXL-CWfiF52NzQ@mail.gmail.com>
	<20111109151838.GA26277@phenom.dumpdata.com>
	<CAOdhohc+UoicOGTW2W_rzdf7d4RR48QyOb4dr=f2g-LAWKB-dA@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAOdhohc+UoicOGTW2W_rzdf7d4RR48QyOb4dr=f2g-LAWKB-dA@mail.gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090203.4EBB4836.002B,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Nov 09, 2011 at 02:52:59PM -0200, Roberto Scudeller wrote:
> Konrad,
> 
> Thanks for help.

OK, so looks like you are using qdisk. Can you try creating an
LVM and blasting the image onto that?

And obviously then using 'phy:/dev/vg_guest/...' ?

You could also try the 'file:/local-disk' which will setup a loopback device
and use that. Try that as well.

> 
> My windows.cfg is:
> name='benchCM-windows-2003-64b-std-test'
> kernel='/usr/lib/xen/boot/hvmloader'
> builder='hvm'
> memory=512
> vcpus=2
> pae=1
> acpi=1
> apic=1
> disk=[ 'tap2:aio:/local-disk/benchCM-windows-2003-64b-std/xvda,xvda,w' ]
> device_model='/usr/lib/xen/bin/qemu-dm'
> boot='c'
> sdl=0
> vnc=1
> vncunused=1
> vnclisten='0.0.0.0'
> vncpasswd=''
> stdvga=0
> extra=''
> on_reboot='restart'
> on_shutdown='destroy'
> ramdisk=''
> image_name=''
> on_crash='destroy'
> bootloader=''
> root=''
> platform='xen'
> network_mode='tap'
> usb = 1
> usbdevice = 'tablet'
> 
> The xvda disk is a raw disk, created with dd.
> I use the windows.cfg in both kernel.
> 
> 
> 
> 2011/11/9 Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> 
> > On Wed, Nov 09, 2011 at 12:58:27PM -0200, Roberto Scudeller wrote:
> > > Hi all,
> > >
> > > I'm testing the new kernel 3.1 from kernel.org, and xen 4.1.2-rc1-pre.
> > > I execute a CrystalMark IO Benchmark, in windows 2003 VM with gplpv
> > > drivers, and receive an amazing result for reading, but the write numbers
> > > are very disappointing.
> > >
> > > I run the VM in local disk, and receive these numbers:
> > > Seq read: 244 MB/s
> > > 512K read: 239 MB/s
> > > 4K read: 27 MB/s
> > > 4K QD 32: 90 MB/s
> > >
> > > Seq write: 20 MB/s
> > > 512K: 20 MB/s
> > > 4K: 8 MB/s
> > > 4K QD 32: 12MB/s
> > >
> > > In older kernel, 2.6.32.x:
> > > Seq read: 189 MB/s
> > > 512K read: 169 MB/s
> > > 4K read: 11 MB/s
> > > 4K QD 32: 34 MB/s
> > >
> > > Seq write: 177 MB/s
> > > 512K: 166 MB/s
> > > 4K: 12 MB/s
> > > 4K QD 32: 36 MB/s
> > >
> > > Could anyone help me. Why is the new kernel faster in reading, but too
> > slow
> > > writing ?
> >
> > It would help if you gave an idea of what the guest configuration is and
> > what is the backend. It might be that the backend you are using in 3.1 is
> > QEMU qdisk, not xen-blkback.
> >
> 
> 
> 
> -- 
> Roberto Scudeller

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 20:09:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 20:09:07 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROLwn-0005nw-T8; Wed, 09 Nov 2011 20:09:06 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROLvF-0005ae-Hz
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 20:07:30 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1320898045!954485!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11647 invoked from network); 10 Nov 2011 04:07:26 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-13.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 04:07:26 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAA46xRj016974
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 10 Nov 2011 04:07:00 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAA46soN014179
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 10 Nov 2011 04:06:57 GMT
Received: from abhmt107.oracle.com (abhmt107.oracle.com [141.146.116.59])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAA46k0U031032; Wed, 9 Nov 2011 22:06:46 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 09 Nov 2011 20:06:46 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id A559A81449; Wed,  9 Nov 2011 23:06:44 -0500 (EST)
Date: Wed, 9 Nov 2011 23:06:44 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, x86@kernel.org, len.brown@intel.com,
	tglx@linutronix.de, jeremy@goop.org, hpa@zytor.com, bp@alien8.de,
	tj@kernel.org, trenn@suse.de
Subject: Re: [Xen-devel] [PATCH 1/3] cpuidle: If disable_cpuidle() is called, 
	set pm_idle to default_idle.
Message-ID: <20111110040644.GA5434@phenom.dumpdata.com>
References: <1320786914-10541-1-git-send-email-konrad.wilk@oracle.com>
	<1320786914-10541-2-git-send-email-konrad.wilk@oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1320786914-10541-2-git-send-email-konrad.wilk@oracle.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090208.4EBB4DE6.000A,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, mingo@redhat.com, stable@kernel.org
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 08, 2011 at 04:15:12PM -0500, Konrad Rzeszutek Wilk wrote:
> . however we ignore the disable_cpuidle() directive and
> in select_idle_routine() set it to type preferred by the CPU.
> 
> This is a regression introduced by
> 
>  commit a0bfa1373859e9d11dc92561a8667588803e42d8
>  Author: Len Brown <len.brown@intel.com>
>  Date:   Fri Apr 1 19:34:59 2011 -0400
> 
>      cpuidle: stop depending on pm_idle
> 
> specifically this patch:
> 
>  commit d91ee5863b71e8c90eaf6035bff3078a85e2e7b5
>  Author: Len Brown <len.brown@intel.com>
>  Date:   Fri Apr 1 18:28:35 2011 -0400
> 
>      cpuidle: replace xen access to x86 pm_idle and default_idle
> 
>      ..scribble on pm_idle and access default_idle,
>     have it simply disable_cpuidle() so acpi_idle will not load and
>     architecture default HLT will be used.
> 
> .. but the default HLT does not get used. Instead we end up in the
> situation that select_idle_routine() is called from arch/x86/kernel/cpu/common.c
> and if we called cpuidle_disable(), then the pm_idle is not set, and
> we end up setting pm_idle to mwait_idle or amd_e400_idle.
> 
> This patch uses the cpuidle_disabled() functionality and
> makes select_idle_routine() adhere to that.
> 
> Reported-by: Stefan Bader <stefan.bader@canonical.com>
> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

And just found that there is a BZ for this as well:
https://bugzilla.redhat.com/show_bug.cgi?id=739499

And this patch fixes the Linux kernel to boot under Amazon EC2.

Another option which I played with today was to do this instead:

diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c
index 46d6d21..45136f2 100644
--- a/arch/x86/xen/setup.c
+++ b/arch/x86/xen/setup.c
@@ -448,6 +448,6 @@ void __init xen_arch_setup(void)
 #endif
        disable_cpuidle();
        boot_option_idle_override = IDLE_HALT;
-
+       pm_idle = default_idle;
        fiddle_vdso();
 }


But that defeats the whole purpose of the patch series that Len developed
where we would _not_ scribble on the pm_idle. <sigh>

Thoughts?
> 
> CC: Thomas Gleixner <tglx@linutronix.de>
> CC: Ingo Molnar <mingo@redhat.com>
> CC: "H. Peter Anvin" <hpa@zytor.com>
> CC: x86@kernel.org
> CC: Len Brown <len.brown@intel.com>
> CC: Borislav Petkov <bp@alien8.de>
> CC: Tejun Heo <tj@kernel.org>
> CC: Thomas Renninger <trenn@suse.de>
> CC: stable@kernel.org
> ---
>  arch/x86/kernel/process.c |    5 +++++
>  include/linux/cpuidle.h   |    2 ++
>  2 files changed, 7 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
> index e7e3b01..1f7f8c8 100644
> --- a/arch/x86/kernel/process.c
> +++ b/arch/x86/kernel/process.c
> @@ -14,6 +14,7 @@
>  #include <linux/utsname.h>
>  #include <trace/events/power.h>
>  #include <linux/hw_breakpoint.h>
> +#include <linux/cpuidle.h>
>  #include <asm/cpu.h>
>  #include <asm/system.h>
>  #include <asm/apic.h>
> @@ -587,6 +588,10 @@ void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c)
>  	if (pm_idle)
>  		return;
>  
> +	if (cpuidle_disabled()) {
> +		pm_idle = default_idle;
> +		return;
> +	}
>  	if (cpu_has(c, X86_FEATURE_MWAIT) && mwait_usable(c)) {
>  		/*
>  		 * One CPU supports mwait => All CPUs supports mwait
> diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h
> index b51629e..123fe9e 100644
> --- a/include/linux/cpuidle.h
> +++ b/include/linux/cpuidle.h
> @@ -122,6 +122,7 @@ struct cpuidle_driver {
>  };
>  
>  #ifdef CONFIG_CPU_IDLE
> +extern int cpuidle_disabled(void);
>  extern void disable_cpuidle(void);
>  extern int cpuidle_idle_call(void);
>  
> @@ -137,6 +138,7 @@ extern int cpuidle_enable_device(struct cpuidle_device *dev);
>  extern void cpuidle_disable_device(struct cpuidle_device *dev);
>  
>  #else
> +static inline int cpuidle_disabled(void) { return 1; }
>  static inline void disable_cpuidle(void) { }
>  static inline int cpuidle_idle_call(void) { return -ENODEV; }
>  
> -- 
> 1.7.7.1
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 20:17:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 20:17:32 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROM4y-0006IH-Be; Wed, 09 Nov 2011 20:17:32 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROM2q-000647-00
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 20:15:24 -0800
X-Env-Sender: jxinpku@gmail.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1320898515!3633875!1
X-Originating-IP: [209.85.213.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31524 invoked from network); 10 Nov 2011 04:15:16 -0000
Received: from mail-yx0-f171.google.com (HELO mail-yx0-f171.google.com)
	(209.85.213.171)
	by server-8.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 04:15:16 -0000
Received: by yenl6 with SMTP id l6so2048134yen.30
	for <xen-devel@lists.xensource.com>;
	Wed, 09 Nov 2011 20:15:15 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=DGvg5JnKxFb5kxSFPe5peZEDq5puyb9Elu+wwPzX4PM=;
	b=sKgqvSnIKRG40JseJo3GNUe/2HrqYwhQ8okc1fHWOCszJIpi1oYxruaOCbD2B+6LDc
	S8ScTRhRIuDIn4JMz4IgQTunKr83a2+i0A4pX475jACr9BfhM3FgLTksM1nYmxt0y+cd
	Hm/Z9Ree+ShfCTBH3KBk+fY06FF8ZWGgXc7dM=
MIME-Version: 1.0
Received: by 10.68.17.3 with SMTP id k3mr10831497pbd.69.1320898515009; Wed, 09
	Nov 2011 20:15:15 -0800 (PST)
Received: by 10.143.39.7 with HTTP; Wed, 9 Nov 2011 20:15:14 -0800 (PST)
Date: Wed, 9 Nov 2011 23:15:14 -0500
Message-ID: <CAKpDeakqB2eRMbGLZwuY9Dyka+BFJSwNO+1g=9WmyJ6uF+b61A@mail.gmail.com>
From: Xin Jin <jxinpku@gmail.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] Cannot get shared page in domU
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1210080802=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1210080802==
Content-Type: multipart/alternative; boundary=bcaec51f99ddc57eb504b159a620

--bcaec51f99ddc57eb504b159a620
Content-Type: text/plain; charset=ISO-8859-1

Hi, I cannot get a shared page in domU.

In a domU, I used the folloing code to grant a page to another domU.
share_mem = (share_mem_desp *) __get_free_page(GFP_KERNEL);
share_mem->gref = gnttab_grant_foreign_access(domid_remote,
virt_to_mfn(share_mem), 0);

In another domU, I used the folloing code to get the shared page.
share_vmarea = alloc_vm_area(PAGE_SIZE);
gnttab_set_map_op( &map_op, (unsigned long)share_vmarea->addr,
GNTMAP_host_map, gref, domid_remote );
HYPERVISOR_grant_table_op( GNTTABOP_map_grant_ref, &map_op, 1 );

While using the exactly same code to get the shared page in dom0, it woks
all well. But it cannot work in domU.

I use Xen 4.1.1 and fedora 14 ( linux 3.1.0 both for dom0 and domU ).

Can anyone help me?

Thanks!

-- Xin

--bcaec51f99ddc57eb504b159a620
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hi, I cannot get a shared page in domU.<div><br></div><div>In a domU, I use=
d the folloing code to grant a page to another domU.</div><div><div>share_m=
em =3D (share_mem_desp *) __get_free_page(GFP_KERNEL);</div><div>share_mem-=
&gt;gref =3D gnttab_grant_foreign_access(domid_remote, virt_to_mfn(share_me=
m), 0);</div>
<div><br></div><div>In another domU, I used the folloing code to get the sh=
ared page.</div><div><div>share_vmarea =3D alloc_vm_area(PAGE_SIZE);</div><=
div>gnttab_set_map_op( &amp;map_op, (unsigned long)share_vmarea-&gt;addr, G=
NTMAP_host_map, gref, domid_remote );</div>
<div>HYPERVISOR_grant_table_op( GNTTABOP_map_grant_ref, &amp;map_op, 1 );</=
div></div><div><br></div><div>While using the exactly same code to get the =
shared page in dom0, it woks all well. But it cannot work in domU.</div>
<div><br></div><div>I use Xen 4.1.1 and fedora 14 ( linux 3.1.0 both for do=
m0 and domU ).</div><div><br></div><div>Can anyone help me?</div><div><br><=
/div><div>Thanks!</div><div><br></div>-- Xin<br><br>
</div>

--bcaec51f99ddc57eb504b159a620--


--===============1210080802==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1210080802==--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 20:30:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 20:30:02 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROMH3-0006uq-0a; Wed, 09 Nov 2011 20:30:01 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1ROMGS-0006j7-4O
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 20:29:24 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-4.tower-27.messagelabs.com!1320899334!47871808!1
X-Originating-IP: [208.97.132.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13285 invoked from network); 10 Nov 2011 04:28:54 -0000
Received: from caiajhbdcbhh.dreamhost.com (HELO homiemail-a23.g.dreamhost.com)
	(208.97.132.177) by server-4.tower-27.messagelabs.com with SMTP;
	10 Nov 2011 04:28:54 -0000
Received: from homiemail-a23.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a23.g.dreamhost.com (Postfix) with ESMTP id B56E74B0086;
	Wed,  9 Nov 2011 20:29:19 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:reply-to
	:mime-version:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.org; b=GY199qOuFAA/t4gRTt0oOT/RrgGDd9UMXKlIhjyOlBtB
	CDaJUF77FJLPz9SJJEzusEkc5gMNJAkoZdn3ZHF9ix5eqklm3Cef1S/vWK5RYWf2
	vXW9teco2+NMOmY+KX2ju+Ycps2gdyA78LJvHxeJsrtAcs7E4d7vIrEKG4JL4HU=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:reply-to:mime-version:content-type:content-transfer-encoding;
	s=lagarcavilla.org; bh=aCUTPas2qBT3+Nlu/6JXBXfV89A=; b=fhOkJN3P
	T6eHzOY4QsQTQ9ZJxjozqnMdncXHLRBvXG+R9TiucR6LC+BrwsbHcFc27o7SuSyA
	wnh0AAbPGG1a3bYZtM24A/aIUCWyoGmq0Zn6Azu3gdRU3u7sqwN8BHQ0Q5R4ex1A
	dvKW3ioIhJJke76n+BKCrmq5uldq/XkUBdE=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a23.g.dreamhost.com (Postfix) with ESMTPA id E143D4B007C; 
	Wed,  9 Nov 2011 20:29:18 -0800 (PST)
Received: from 99.255.91.65 (proxying for 99.255.91.65)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP; Wed, 9 Nov 2011 20:29:19 -0800
Message-ID: <5d7d38b18271fcc7aa750604eeb52bbd.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <20111109221148.GA17166@aepfle.de>
References: <20111108224414.83985CF73A@homiemail-mx7.g.dreamhost.com>
	<3c097da8e49a42af1210e4ffcd39fd48.squirrel@webmail.lagarcavilla.org>
	<20111109070927.GB26154@aepfle.de>
	<0bb01a4d216a68c4ae8441b037927f61.squirrel@webmail.lagarcavilla.org>
	<20111109221148.GA17166@aepfle.de>
Date: Wed, 9 Nov 2011 20:29:19 -0800
From: "Andres Lagar-Cavilla" <andres@lagarcavilla.org>
To: "Olaf Hering" <olaf@aepfle.de>
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: xen-devel@lists.xensource.com, keir.xen@gmail.com,
	Andres Lagar-Cavilla <andres@lagarcavilla.org>
Subject: [Xen-devel] Re: Need help with fixing the Xen waitqueue feature
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: andres@lagarcavilla.org
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Olaf,
> On Wed, Nov 09, Andres Lagar-Cavilla wrote:
>
>> After a bit of thinking, things are far more complicated. I don't thin=
k
>> this is a "race." If the pager removed a page that later gets schedule=
d
>> by
>> the guest OS for IO, qemu will want to foreign-map that. With the
>> hypervisor returning ENOENT, the foreign map will fail, and there goes
>> qemu.
>
> The tools are supposed to catch ENOENT and try again.
> linux_privcmd_map_foreign_bulk() does that. linux_gnttab_grant_map()
> appears to do that as well. What code path uses qemu that leads to a
> crash?

The tools retry as long as IOCTL_PRIVCMD_MMAPBATCH_V2 is supported. Which
it isn't on mainline linux 3.0, 3.1, etc. Which dom0 kernel are you using=
?

And for backend drivers implemented in the kernel (netback, etc), there i=
s
no retrying.

All those ram_paging types and their interactions give me a headache, but
I'll trust you that only one event is put in the ring.

I'm using 24066:54a5e994a241. I start windows 7, make xenpaging try to
evict 90% of the RAM, qemu lasts for about two seconds. Linux fights
harder, but qemu also dies. No pv drivers. I haven't been able to trace
back the qemu crash (segfault on a NULL ide_if field for a dma callback)
to the exact paging action yet, but no crashes without paging.

Andres

>
>> I guess qemu/migrate/libxc could retry until the pager is done and the
>> mapping succeeds. It will be delicate. It won't work for pv backends. =
It
>> will flood the mem_event ring.
>
> There will no flood, only one request is sent per gfn in
> p2m_mem_paging_populate().
>
> Olaf
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 21:10:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 21:10:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROMtw-0007yM-Uy; Wed, 09 Nov 2011 21:10:13 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROMt3-0007ld-Ox
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 21:09:18 -0800
X-Env-Sender: evil.dani@gmail.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1320901754!3639038!1
X-Originating-IP: [209.85.161.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23293 invoked from network); 10 Nov 2011 05:09:14 -0000
Received: from mail-fx0-f43.google.com (HELO mail-fx0-f43.google.com)
	(209.85.161.43)
	by server-3.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 05:09:14 -0000
Received: by fabs1 with SMTP id s1so1652628fab.30
	for <xen-devel@lists.xensource.com>;
	Wed, 09 Nov 2011 21:09:14 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type:content-transfer-encoding;
	bh=xUNK1EN8r9n7rTALMN3PHUtp7cxumJdM+0gWwQVQzAI=;
	b=KtFPQqTl3bh8YFN83sK4FxxnD8lcJgNpFWMMwXDUJIotIsNQi/Fjl7WjzusH0ETeOx
	kjNKrtZOza9E0uH9EYmBIeUS+SuvYH5kBIXpXRFCcG6ITojjAW+JILylUEmCXXiEBNqb
	uwgxScsXyyt4Sy7p33FmaGRhcClkcyxaneLF0=
MIME-Version: 1.0
Received: by 10.223.15.13 with SMTP id i13mr9593117faa.36.1320901753852; Wed,
	09 Nov 2011 21:09:13 -0800 (PST)
Received: by 10.223.96.75 with HTTP; Wed, 9 Nov 2011 21:09:13 -0800 (PST)
In-Reply-To: <CAKpDeakqB2eRMbGLZwuY9Dyka+BFJSwNO+1g=9WmyJ6uF+b61A@mail.gmail.com>
References: <CAKpDeakqB2eRMbGLZwuY9Dyka+BFJSwNO+1g=9WmyJ6uF+b61A@mail.gmail.com>
Date: Thu, 10 Nov 2011 14:09:13 +0900
Message-ID: <CAP2B858Uiic4+ZOKBcTNChf+Nt++G4pwktyrE=U+CLn2sCdwjg@mail.gmail.com>
Subject: Re: [Xen-devel] Cannot get shared page in domU
From: Daniel Castro <evil.dani@gmail.com>
To: Xin Jin <jxinpku@gmail.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Nov 10, 2011 at 1:15 PM, Xin Jin <jxinpku@gmail.com> wrote:
> Hi, I cannot get a shared page in domU.
> In a domU, I used the folloing code to grant a page to another domU.
> share_mem =3D (share_mem_desp *) __get_free_page(GFP_KERNEL);
> share_mem->gref =3D gnttab_grant_foreign_access(domid_remote,
> virt_to_mfn(share_mem), 0);
> In another domU, I used the folloing code to get the shared page.
> share_vmarea =3D alloc_vm_area(PAGE_SIZE);
> gnttab_set_map_op( &map_op, (unsigned long)share_vmarea->addr,
> GNTMAP_host_map, gref, domid_remote );
> HYPERVISOR_grant_table_op( GNTTABOP_map_grant_ref, &map_op, 1 );
> While using the exactly same code to get the shared page in dom0, it woks
> all well. But it cannot work in domU.
> I use Xen 4.1.1 and fedora 14 ( linux 3.1.0 both for dom0 and domU ).
> Can anyone help me?
On the interface struct when you issue the hypercall you need to
specify the domid that can use the gref. Maybe the default is domid 0.
The struct grant_entry_v1 has member domid for the foreign guest,
check that value.

> Thanks!
> -- Xin
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>
>



--=20
+-=3D=3D=3D=3D=3D---------------------------+
| +---------------------------------+ | This space intentionally blank
for notetaking.
| |=A0=A0 | Daniel Castro,=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 |
| |=A0=A0 | Consultant/Programmer.|
| |=A0=A0 | U Andes=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=A0 |
+-------------------------------------+

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 21:19:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 21:19:09 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RON2a-0000hP-By; Wed, 09 Nov 2011 21:19:08 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RON1Z-0000Ng-18
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 21:18:05 -0800
X-Env-Sender: zpengxen@gmail.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1320902243!56215680!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26495 invoked from network); 10 Nov 2011 05:17:24 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 05:17:24 -0000
Received: by ywn1 with SMTP id 1so78003ywn.30
	for <xen-devel@lists.xensource.com>;
	Wed, 09 Nov 2011 21:18:00 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type;
	bh=8LIHxXMMwb4Fh7a2zKbBfYmy1tTIac/f9UYmrs5fH1w=;
	b=XvqUXjXTgbsNmfXSILRIRq8VBEftgmJX2yRQfQz4Ed9/xk9+4/ZKXRgY89fptyFvK/
	KpGB2iNWXRHPYP402xMqtM4MCQmrwn2jhzpNJs9MaRe1qTsXhHG8vdUAugkF5YEJLT0n
	35HvBliq1vyUzinu+RJlYCl9W2+3q7gru+LDc=
MIME-Version: 1.0
Received: by 10.182.5.197 with SMTP id u5mr1544623obu.23.1320902280429; Wed,
	09 Nov 2011 21:18:00 -0800 (PST)
Received: by 10.182.150.40 with HTTP; Wed, 9 Nov 2011 21:18:00 -0800 (PST)
In-Reply-To: <1320850830.955.171.camel@zakaz.uk.xensource.com>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
	<291f6cb0d03e56e4edbe.1320678792@cosworth.uk.xensource.com>
	<1320850830.955.171.camel@zakaz.uk.xensource.com>
Date: Thu, 10 Nov 2011 13:18:00 +0800
Message-ID: <CAAh7U5NSdSbhkvFqMGpy+UFBRngsxdxdGf8M+T7cNe_3TJa-pQ@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 3 of 7] docs: add a document describing the xl
	cfg file syntax
From: ZhouPeng <zpengxen@gmail.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=ISO-8859-1
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Zhou Peng <zhoupeng@nfs.iscas.ac.cn>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Nov 9, 2011 at 11:00 PM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> It seems that you added most of these commands to xl. Can I trouble you
> to write a few words about what they do?
Hi Ian,
This is the doc in line below.
Sorry not sent in a diff patch. I checked but It seems your doc patch has
not been committed into the unstable.

Signed-off-by: Zhou Peng <zhoupeng@nfs.iscas.ac.cn>

### Spice Graphics Support

The following options control the features of SPICE.

 * `spice=BOOLEAN`: Allow access to the display via the SPICE protocol.
    This enables the other SPICE-related settings.

 * `spicehost="ADDRESS"`: Specify the interface address to listen on if
    given, otherwise any interface.

 * `spiceport=NUMBER`: Specify the port to listen on by the SPICE server
    if the SPICE is enabled.

 * `spicetls_port=NUMBER`: Specify the secure port to listen on
    by the SPICE server if the SPICE is enabled. At least one of the
    spiceport or spicetls_port must be given if SPICE is enabled.
    NB. the options depending on spicetls_port have not been supported.

 * `spicedisable_ticketing=BOOLEAN`: Enable client connection
    without password. The default is false. If it's false (set to 0),
    spicepasswd must be set.

 * `spicepasswd="PASSWORD"`: Specify the ticket password which is used by
    a client for connection.

 * `spiceagent_mouse=BOOLEAN`: Whether SPICE agent is used
    for client mouse mode. The default is true (turn on)

-- 
Zhou Peng

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 21:47:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 21:47:26 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RONTx-0001Y1-37; Wed, 09 Nov 2011 21:47:25 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RONTF-0001Lb-I9
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 21:46:41 -0800
X-Env-Sender: evil.dani@gmail.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1320903998!3524987!1
X-Originating-IP: [209.85.161.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27170 invoked from network); 10 Nov 2011 05:46:38 -0000
Received: from mail-fx0-f43.google.com (HELO mail-fx0-f43.google.com)
	(209.85.161.43)
	by server-10.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 05:46:38 -0000
Received: by fabs1 with SMTP id s1so1679630fab.30
	for <xen-devel@lists.xensource.com>;
	Wed, 09 Nov 2011 21:46:38 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:content-type
	:content-transfer-encoding;
	bh=PsYegPy5DjZmWE2/U5NhrXdec6ZKnFWWJIKGakfz5QE=;
	b=mWywMgdZBlnnH7IGPhBqb8vDmiQjTipjASIMNgNZO2QyFgbKymN1CzMEAKWlsvnw6O
	slK0MzJCEqJm17F1ebMXpIt8y4Z3z1afKvyb2owsGMSinWGcnzXnji0X1VkjtB07+9L/
	FXiW5sj1RkQCKoOPXdXJ2ugk1Wle19gf8zSGo=
MIME-Version: 1.0
Received: by 10.223.7.14 with SMTP id b14mr10111902fab.10.1320903997840; Wed,
	09 Nov 2011 21:46:37 -0800 (PST)
Received: by 10.223.96.75 with HTTP; Wed, 9 Nov 2011 21:46:37 -0800 (PST)
Date: Thu, 10 Nov 2011 14:46:37 +0900
Message-ID: <CAP2B85-NrwhELRMpndhq3vzxqEuZRjsZi3C6bJ6ze3q=Dfu=aA@mail.gmail.com>
From: Daniel Castro <evil.dani@gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Subject: [Xen-devel] Grant a partial page
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hello,
I to issue a grant on a page, but only partially.
I have a pointer to somewhere in memory and need to issue the grant
for such a pointer but not to the entire page.
I know FLAG GTF_sub_page is used for that purpose but grant_entry_v1
apparently has no fields for sub_page, should I change the code to use
Version 2 grant table entries?

Thanks,

Daniel

--=20
+-=3D=3D=3D=3D=3D---------------------------+
| +---------------------------------+ | This space intentionally blank
for notetaking.
| |=A0=A0 | Daniel Castro,=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 |
| |=A0=A0 | Consultant/Programmer.|
| |=A0=A0 | U Andes=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=A0 |
+-------------------------------------+

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 22:28:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 22:28:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROO7Y-0002UY-OV; Wed, 09 Nov 2011 22:28:20 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1ROO6a-0002Hu-Ij
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 22:27:21 -0800
X-Env-Sender: jasonsmr@hotmail.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1320906436!972635!1
X-Originating-IP: [65.55.34.17]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11415 invoked from network); 10 Nov 2011 06:27:17 -0000
Received: from col0-omc1-s7.col0.hotmail.com (HELO
	col0-omc1-s7.col0.hotmail.com) (65.55.34.17)
	by server-10.tower-174.messagelabs.com with SMTP;
	10 Nov 2011 06:27:17 -0000
Received: from COL124-W18 ([65.55.34.8]) by col0-omc1-s7.col0.hotmail.com with
	Microsoft SMTPSVC(6.0.3790.4675); Wed, 9 Nov 2011 22:27:16 -0800
Message-ID: <COL124-W18EC727F214C2B995D7F96DADC0@phx.gbl>
X-Originating-IP: [118.96.248.180]
From: =?iso-2022-jp?B?GyRCJTglJyUkJT0lcxsoQiBKYXNvbiAbJEIlayVXJWklJCVIGyhCIFJ1?=
	=?iso-2022-jp?B?cHJpZ2h0?= <jasonsmr@hotmail.com>
To: <wirwilj@fsuimail.ferris.edu>, <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 15:27:15 +0900
Importance: Normal
MIME-Version: 1.0
X-OriginalArrivalTime: 10 Nov 2011 06:27:16.0347 (UTC)
	FILETIME=[CA71ACB0:01CC9F71]
Cc: 
Subject: [Xen-devel] I am my own boss try it out for yourself.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1893772539=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1893772539==
Content-Type: multipart/alternative;
	boundary="_75ec3b57-88a0-4bdc-9cef-7c7c2b39cc5c_"

--_75ec3b57-88a0-4bdc-9cef-7c7c2b39cc5c_
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

hi.
I was completely exhausted there is nothing else like this out there everything worked out in my favor seriously consider this
http://www.jez-sro.cz/RobertStewart27.html
goodbye.
 		 	   		  
--_75ec3b57-88a0-4bdc-9cef-7c7c2b39cc5c_
Content-Type: text/html; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'><div dir='ltr'>hi.<br>I was completely exhausted there is nothing else like this out there everything worked out in my favor seriously consider this<br><a href='http://www.jez-sro.cz/RobertStewart27.html'>http://www.jez-sro.cz/RobertStewart27.html</a><br>goodbye.<br> 		 	   		  </div></body>
</html>
--_75ec3b57-88a0-4bdc-9cef-7c7c2b39cc5c_--


--===============1893772539==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1893772539==--


From xen-devel-bounces@lists.xensource.com Wed Nov 09 22:37:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 22:37:02 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROOFy-00030J-Ob; Wed, 09 Nov 2011 22:37:02 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROOFE-0002na-S8
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 22:36:17 -0800
X-Env-Sender: lidongyang@novell.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1320906941!43337382!1
X-Originating-IP: [137.65.250.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14732 invoked from network); 10 Nov 2011 06:35:43 -0000
Received: from victor.provo.novell.com (HELO victor.provo.novell.com)
	(137.65.250.26)
	by server-10.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 06:35:43 -0000
Received: from mail-iy0-f171.google.com (prv-ext-foundry1int.gns.novell.com
	[137.65.251.240])
	by victor.provo.novell.com with ESMTP (TLS encrypted);
	Wed, 09 Nov 2011 23:36:04 -0700
Received: by iaqq3 with SMTP id q3so3203338iaq.30
	for <xen-devel@lists.xensource.com>;
	Wed, 09 Nov 2011 22:36:01 -0800 (PST)
MIME-Version: 1.0
Received: by 10.50.140.1 with SMTP id rc1mr6713308igb.25.1320906961927; Wed,
	09 Nov 2011 22:36:01 -0800 (PST)
Received: by 10.50.47.231 with HTTP; Wed, 9 Nov 2011 22:36:01 -0800 (PST)
In-Reply-To: <CAKH3R48ni0GeginUZCvQvwOf6e1oaEC_hfGD+BjKkw7dKD6YFg@mail.gmail.com>
References: <1320654866-12457-1-git-send-email-lidongyang@novell.com>
	<20111108162614.GA18361@phenom.dumpdata.com>
	<CAKH3R48ni0GeginUZCvQvwOf6e1oaEC_hfGD+BjKkw7dKD6YFg@mail.gmail.com>
Date: Thu, 10 Nov 2011 14:36:01 +0800
Message-ID: <CAKH3R48pwdciySkzTnzV3GKBNmBJOEb-PUA3JTTCM2VNkww-KQ@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] xen-blkback: convert hole punching to discard
	request on loop devices
From: Li Dongyang <lidongyang@novell.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, lczerner@redhat.com
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

What am bit not sure is the secure_discard, since you've added the
sec_discard to your tree,
I'm wondering if we should treat hole punching as a secure discard to guest=
.
Lukas, why u didn't add QUEUE_FLAG_SECDISCARD in your commit? is there
something need to
do with loop driver to have that flag? Thanks

On Wed, Nov 9, 2011 at 5:17 PM, Li Dongyang <lidongyang@novell.com> wrote:
> On Wed, Nov 9, 2011 at 12:26 AM, Konrad Rzeszutek Wilk
> <konrad.wilk@oracle.com> wrote:
>> On Mon, Nov 07, 2011 at 04:34:26PM +0800, Li Dongyang wrote:
>>> As of dfaa2ef68e80c378e610e3c8c536f1c239e8d3ef, loop devices support
>>> discard request now. We could just issue a discard request, and
>>> the loop driver will punch the hole for us, so we don't need to touch
>>> the internals of loop device and punch the hole ourselves, Thanks.
>>
>> Can I ask you to do two things:
>> =A01). Look in whether we can just eliminate the BLKIF_BACKEND_FILE alto=
gether?
> I think we still need that flag, as for other type of backing dev, we
> will figure it out and send back a EOPNOTSUPP.
>> =A02). Rebase this on top #devel/for-jens-3.3 (git://git.kernel.org/pub/=
scm/linux/kernel/git/konrad/xen.git)
> no problem
>>
>> Thanks!
>>>
>>> Signed-off-by: Li Dongyang <lidongyang@novell.com>
>>> ---
>>> =A0drivers/block/xen-blkback/blkback.c | =A0 21 +++------------------
>>> =A01 files changed, 3 insertions(+), 18 deletions(-)
>>>
>>> diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-bl=
kback/blkback.c
>>> index 15ec4db..ad365a7 100644
>>> --- a/drivers/block/xen-blkback/blkback.c
>>> +++ b/drivers/block/xen-blkback/blkback.c
>>> @@ -39,9 +39,6 @@
>>> =A0#include <linux/list.h>
>>> =A0#include <linux/delay.h>
>>> =A0#include <linux/freezer.h>
>>> -#include <linux/loop.h>
>>> -#include <linux/falloc.h>
>>> -#include <linux/fs.h>
>>>
>>> =A0#include <xen/events.h>
>>> =A0#include <xen/page.h>
>>> @@ -422,25 +419,13 @@ static void xen_blk_discard(struct xen_blkif *blk=
if, struct blkif_request *req)
>>> =A0 =A0 =A0 int status =3D BLKIF_RSP_OKAY;
>>> =A0 =A0 =A0 struct block_device *bdev =3D blkif->vbd.bdev;
>>>
>>> - =A0 =A0 if (blkif->blk_backend_type =3D=3D BLKIF_BACKEND_PHY)
>>> - =A0 =A0 =A0 =A0 =A0 =A0 /* just forward the discard request */
>>> + =A0 =A0 if (blkif->blk_backend_type =3D=3D BLKIF_BACKEND_PHY ||
>>> + =A0 =A0 =A0 =A0 blkif->blk_backend_type =3D=3D BLKIF_BACKEND_FILE)
>>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 err =3D blkdev_issue_discard(bdev,
>>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 req->u.disc=
ard.sector_number,
>>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 req->u.disc=
ard.nr_sectors,
>>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 GFP_KERNEL,=
 0);
>>> - =A0 =A0 else if (blkif->blk_backend_type =3D=3D BLKIF_BACKEND_FILE) {
>>> - =A0 =A0 =A0 =A0 =A0 =A0 /* punch a hole in the backing file */
>>> - =A0 =A0 =A0 =A0 =A0 =A0 struct loop_device *lo =3D bdev->bd_disk->pri=
vate_data;
>>> - =A0 =A0 =A0 =A0 =A0 =A0 struct file *file =3D lo->lo_backing_file;
>>> -
>>> - =A0 =A0 =A0 =A0 =A0 =A0 if (file->f_op->fallocate)
>>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 err =3D file->f_op->fallocate=
(file,
>>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 FALLOC_FL_KEE=
P_SIZE | FALLOC_FL_PUNCH_HOLE,
>>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 req->u.discar=
d.sector_number << 9,
>>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 req->u.discar=
d.nr_sectors << 9);
>>> - =A0 =A0 =A0 =A0 =A0 =A0 else
>>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 err =3D -EOPNOTSUPP;
>>> - =A0 =A0 } else
>>> + =A0 =A0 else
>>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 err =3D -EOPNOTSUPP;
>>>
>>> =A0 =A0 =A0 if (err =3D=3D -EOPNOTSUPP) {
>>> --
>>> 1.7.7
>>>
>>>
>>> _______________________________________________
>>> Xen-devel mailing list
>>> Xen-devel@lists.xensource.com
>>> http://lists.xensource.com/xen-devel
>>
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 23:52:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 23:52:02 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROPQY-0004Yw-K9; Wed, 09 Nov 2011 23:52:02 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROPPi-0004MG-LF
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 23:51:11 -0800
X-Env-Sender: lidongyang@novell.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1320911465!2933880!1
X-Originating-IP: [137.65.250.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26769 invoked from network); 10 Nov 2011 07:51:07 -0000
Received: from victor.provo.novell.com (HELO victor.provo.novell.com)
	(137.65.250.26)
	by server-3.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 07:51:07 -0000
Received: from mail-iy0-f171.google.com (prv-ext-foundry1int.gns.novell.com
	[137.65.251.240])
	by victor.provo.novell.com with ESMTP (TLS encrypted);
	Thu, 10 Nov 2011 00:51:02 -0700
Received: by iaqq3 with SMTP id q3so3279301iaq.30
	for <xen-devel@lists.xensource.com>;
	Wed, 09 Nov 2011 23:51:00 -0800 (PST)
MIME-Version: 1.0
Received: by 10.50.197.167 with SMTP id iv7mr6589193igc.46.1320911460446; Wed,
	09 Nov 2011 23:51:00 -0800 (PST)
Received: by 10.50.47.231 with HTTP; Wed, 9 Nov 2011 23:51:00 -0800 (PST)
In-Reply-To: <alpine.LFD.2.00.1111100822420.5081@dhcp-27-109.brq.redhat.com>
References: <1320654866-12457-1-git-send-email-lidongyang@novell.com>
	<20111108162614.GA18361@phenom.dumpdata.com>
	<CAKH3R48ni0GeginUZCvQvwOf6e1oaEC_hfGD+BjKkw7dKD6YFg@mail.gmail.com>
	<CAKH3R48pwdciySkzTnzV3GKBNmBJOEb-PUA3JTTCM2VNkww-KQ@mail.gmail.com>
	<alpine.LFD.2.00.1111100822420.5081@dhcp-27-109.brq.redhat.com>
Date: Thu, 10 Nov 2011 15:51:00 +0800
Message-ID: <CAKH3R4_Di1cadS45cqCWvF1yyqoH_zpAJuJjnCWAuV+VynhhoA@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] xen-blkback: convert hole punching to discard
	request on loop devices
From: Li Dongyang <lidongyang@novell.com>
To: Lukas Czerner <lczerner@redhat.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Thanks for this, so we are good then, we just set the SEC_DISCARD flag
only if the backing dev
really have that flag on the queue and, if it's a file backend, the
flag is always cleared, I'll send out
the rebased patch soon, Thanks.

On Thu, Nov 10, 2011 at 3:31 PM, Lukas Czerner <lczerner@redhat.com> wrote:
> On Thu, 10 Nov 2011, Li Dongyang wrote:
>
>> What am bit not sure is the secure_discard, since you've added the
>> sec_discard to your tree,
>> I'm wondering if we should treat hole punching as a secure discard to gu=
est.
>> Lukas, why u didn't add QUEUE_FLAG_SECDISCARD in your commit? is there
>> something need to
>> do with loop driver to have that flag? Thanks
>
> Hi,
>
> IIRC secure discard is almost the same as the "regular" discard, except
> all sectors previously used for this data (moved by garbage collector)
> are discarded as well. That is something only hardware can do, so I do
> not think we should support this in loop driver. We would not be doing
> anything different from "regular" discard anyway - that means just send
> punch hole to the file system.
>
> So I think that there is no reason secure discard should be supported by
> loop driver, since there is nothing more "secure" about it.
>
> Thanks!
> -Lukas
>
>>
>> On Wed, Nov 9, 2011 at 5:17 PM, Li Dongyang <lidongyang@novell.com> wrot=
e:
>> > On Wed, Nov 9, 2011 at 12:26 AM, Konrad Rzeszutek Wilk
>> > <konrad.wilk@oracle.com> wrote:
>> >> On Mon, Nov 07, 2011 at 04:34:26PM +0800, Li Dongyang wrote:
>> >>> As of dfaa2ef68e80c378e610e3c8c536f1c239e8d3ef, loop devices support
>> >>> discard request now. We could just issue a discard request, and
>> >>> the loop driver will punch the hole for us, so we don't need to touc=
h
>> >>> the internals of loop device and punch the hole ourselves, Thanks.
>> >>
>> >> Can I ask you to do two things:
>> >> =A01). Look in whether we can just eliminate the BLKIF_BACKEND_FILE a=
ltogether?
>> > I think we still need that flag, as for other type of backing dev, we
>> > will figure it out and send back a EOPNOTSUPP.
>> >> =A02). Rebase this on top #devel/for-jens-3.3 (git://git.kernel.org/p=
ub/scm/linux/kernel/git/konrad/xen.git)
>> > no problem
>> >>
>> >> Thanks!
>> >>>
>> >>> Signed-off-by: Li Dongyang <lidongyang@novell.com>
>> >>> ---
>> >>> =A0drivers/block/xen-blkback/blkback.c | =A0 21 +++-----------------=
-
>> >>> =A01 files changed, 3 insertions(+), 18 deletions(-)
>> >>>
>> >>> diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen=
-blkback/blkback.c
>> >>> index 15ec4db..ad365a7 100644
>> >>> --- a/drivers/block/xen-blkback/blkback.c
>> >>> +++ b/drivers/block/xen-blkback/blkback.c
>> >>> @@ -39,9 +39,6 @@
>> >>> =A0#include <linux/list.h>
>> >>> =A0#include <linux/delay.h>
>> >>> =A0#include <linux/freezer.h>
>> >>> -#include <linux/loop.h>
>> >>> -#include <linux/falloc.h>
>> >>> -#include <linux/fs.h>
>> >>>
>> >>> =A0#include <xen/events.h>
>> >>> =A0#include <xen/page.h>
>> >>> @@ -422,25 +419,13 @@ static void xen_blk_discard(struct xen_blkif *=
blkif, struct blkif_request *req)
>> >>> =A0 =A0 =A0 int status =3D BLKIF_RSP_OKAY;
>> >>> =A0 =A0 =A0 struct block_device *bdev =3D blkif->vbd.bdev;
>> >>>
>> >>> - =A0 =A0 if (blkif->blk_backend_type =3D=3D BLKIF_BACKEND_PHY)
>> >>> - =A0 =A0 =A0 =A0 =A0 =A0 /* just forward the discard request */
>> >>> + =A0 =A0 if (blkif->blk_backend_type =3D=3D BLKIF_BACKEND_PHY ||
>> >>> + =A0 =A0 =A0 =A0 blkif->blk_backend_type =3D=3D BLKIF_BACKEND_FILE)
>> >>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 err =3D blkdev_issue_discard(bdev,
>> >>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 req->u.d=
iscard.sector_number,
>> >>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 req->u.d=
iscard.nr_sectors,
>> >>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 GFP_KERN=
EL, 0);
>> >>> - =A0 =A0 else if (blkif->blk_backend_type =3D=3D BLKIF_BACKEND_FILE=
) {
>> >>> - =A0 =A0 =A0 =A0 =A0 =A0 /* punch a hole in the backing file */
>> >>> - =A0 =A0 =A0 =A0 =A0 =A0 struct loop_device *lo =3D bdev->bd_disk->=
private_data;
>> >>> - =A0 =A0 =A0 =A0 =A0 =A0 struct file *file =3D lo->lo_backing_file;
>> >>> -
>> >>> - =A0 =A0 =A0 =A0 =A0 =A0 if (file->f_op->fallocate)
>> >>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 err =3D file->f_op->falloc=
ate(file,
>> >>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 FALLOC_FL_=
KEEP_SIZE | FALLOC_FL_PUNCH_HOLE,
>> >>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 req->u.dis=
card.sector_number << 9,
>> >>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 req->u.dis=
card.nr_sectors << 9);
>> >>> - =A0 =A0 =A0 =A0 =A0 =A0 else
>> >>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 err =3D -EOPNOTSUPP;
>> >>> - =A0 =A0 } else
>> >>> + =A0 =A0 else
>> >>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 err =3D -EOPNOTSUPP;
>> >>>
>> >>> =A0 =A0 =A0 if (err =3D=3D -EOPNOTSUPP) {
>> >>> --
>> >>> 1.7.7
>> >>>
>> >>>
>> >>> _______________________________________________
>> >>> Xen-devel mailing list
>> >>> Xen-devel@lists.xensource.com
>> >>> http://lists.xensource.com/xen-devel
>> >>
>> >
>>
>
> --

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 09 23:53:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 09 Nov 2011 23:53:32 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROPS0-00052O-8G; Wed, 09 Nov 2011 23:53:32 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROPRA-0004j2-LX
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 23:52:41 -0800
X-Env-Sender: lidongyang@novell.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320911555!3612355!1
X-Originating-IP: [137.65.250.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16940 invoked from network); 10 Nov 2011 07:52:37 -0000
Received: from victor.provo.novell.com (HELO victor.provo.novell.com)
	(137.65.250.26)
	by server-14.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 07:52:37 -0000
Received: from localhost.localdomain (prv-ext-foundry1int.gns.novell.com
	[137.65.251.240])
	by victor.provo.novell.com with ESMTP (TLS encrypted);
	Thu, 10 Nov 2011 00:52:17 -0700
From: Li Dongyang <lidongyang@novell.com>
To: xen-devel@lists.xensource.com
Date: Thu, 10 Nov 2011 15:52:06 +0800
Message-Id: <1320911526-2303-1-git-send-email-lidongyang@novell.com>
X-Mailer: git-send-email 1.7.7
Cc: lczerner@redhat.com, konrad.wilk@oracle.com
Subject: [Xen-devel] [PATCH V1] xen-blkback: convert hole punching to
	discard request on loop devices
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

As of dfaa2ef68e80c378e610e3c8c536f1c239e8d3ef, loop devices support
discard request now. We could just issue a discard request, and
the loop driver will punch the hole for us, so we don't need to touch
the internals of loop device and punch the hole ourselves, Thanks.

V0->V1: rebased on Konrand's devel/for-jens-3.3

Signed-off-by: Li Dongyang <lidongyang@novell.com>
---
 drivers/block/xen-blkback/blkback.c |   19 ++-----------------
 1 files changed, 2 insertions(+), 17 deletions(-)

diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
index 3283801..b75d4a9 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -39,9 +39,6 @@
 #include <linux/list.h>
 #include <linux/delay.h>
 #include <linux/freezer.h>
-#include <linux/loop.h>
-#include <linux/falloc.h>
-#include <linux/fs.h>
 
 #include <xen/events.h>
 #include <xen/page.h>
@@ -426,27 +423,15 @@ static int dispatch_discard_io(struct xen_blkif *blkif,
 	blkif->st_ds_req++;
 
 	xen_blkif_get(blkif);
-	if (blkif->blk_backend_type == BLKIF_BACKEND_PHY) {
+	if (blkif->blk_backend_type == BLKIF_BACKEND_PHY ||
+	    blkif->blk_backend_type == BLKIF_BACKEND_FILE) {
 		unsigned long secure = (blkif->vbd.discard_secure &&
 			(req->u.discard.flag & BLKIF_DISCARD_SECURE)) ?
 			BLKDEV_DISCARD_SECURE : 0;
-		/* just forward the discard request */
 		err = blkdev_issue_discard(bdev,
 				req->u.discard.sector_number,
 				req->u.discard.nr_sectors,
 				GFP_KERNEL, secure);
-	} else if (blkif->blk_backend_type == BLKIF_BACKEND_FILE) {
-		/* punch a hole in the backing file */
-		struct loop_device *lo = bdev->bd_disk->private_data;
-		struct file *file = lo->lo_backing_file;
-
-		if (file->f_op->fallocate)
-			err = file->f_op->fallocate(file,
-				FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE,
-				req->u.discard.sector_number << 9,
-				req->u.discard.nr_sectors << 9);
-		else
-			err = -EOPNOTSUPP;
 	} else
 		err = -EOPNOTSUPP;
 
-- 
1.7.7


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 00:00:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 00:00:22 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROPYa-0006BN-J9; Thu, 10 Nov 2011 00:00:21 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROPWE-0005rS-A4
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 23:57:55 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1320911870!3524566!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23596 invoked from network); 10 Nov 2011 07:57:51 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-9.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 07:57:51 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315195200"; d="scan'208";a="170066811"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 02:57:49 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 02:57:49 -0500
Received: from cosworth.uk.xensource.com (cosworth.uk.xensource.com
	[10.80.16.52])	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	pAA7vlh8021655;	Wed, 9 Nov 2011 23:57:48 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 3c6eaf62996dd26d7d0a055955d30bc6c7067f91
Message-ID: <3c6eaf62996dd26d7d0a.1320911866@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 10 Nov 2011 07:57:46 +0000
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Jean Guyader <jean.guyader@eu.citrix.com>, Jan Beulich <JBeulich@suse.com>
Subject: [Xen-devel] [PATCH] xen: add a comment for
	hypercall_xlat_continuation
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1320911800 0
# Node ID 3c6eaf62996dd26d7d0a055955d30bc6c7067f91
# Parent  e6af32ecb4483457d5ad9a7b674c18aaf20cc085
xen: add a comment for hypercall_xlat_continuation

The interface of this function is really rather complex and having reverse
engineered it for the N'th time I think it is time to write things down.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r e6af32ecb448 -r 3c6eaf62996d xen/include/xen/compat.h
--- a/xen/include/xen/compat.h	Tue Oct 18 14:15:09 2011 +0100
+++ b/xen/include/xen/compat.h	Thu Nov 10 07:56:40 2011 +0000
@@ -185,6 +185,34 @@ static inline int name(k xen_ ## n *x, k
     CHECK_FIELD_COMMON_(k, CHECK_NAME_(k, n ## __ ## f1 ## __ ## f2 ## __ ## \
                                        f3, F2), n, f1.f2.f3)
 
+/*
+ * Translate a native continuation into a compat guest continuation.
+ *
+ * id: If non-NULL then points to an integer N between 0-5. Will be updated
+ * with the value of the N'th argument to the hypercall. The N'th argument must
+ * not be subject to translation (i.e. cannot be referenced by @mask below).
+ * This option is useful for extracting the "op" argument or similar from the
+ * hypercall to enable further xlat processing.
+ *
+ * mask: Specifies which of the hypercall arguments require compat translation.
+ * bit 0 indicates that the 0'th argument requires translation, bit 1 indicates
+ * that the first argument requires translation and so on. Native and compat
+ * values for each translated argument are provided as @varargs (see below).
+ *
+ * varargs: For each bit which is set in @mask the varargs contain a native
+ * value (unsigned long) and a compat value (unsigned int). If the native value
+ * and compat value differ and the N'th argument is equal to the native value
+ * then that argument is replaced by the compat value. If the native and compat
+ * values are equal then no translation takes place. If the N'th argument does
+ * not equal the native value then no translation takes place.
+ *
+ * Any untranslated argument (whether due to not being requested in @mask,
+ * native and compat values being equal or N'th argument not equalling native
+ * value) must be equal in both native and compat representations (i.e. the
+ * native version cannot have any bits > 32 set)
+ *
+ * Return: Number of arguments which were actually translated.
+ */
 int hypercall_xlat_continuation(unsigned int *id, unsigned int mask, ...);
 
 /* In-place translation functons: */

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 00:09:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 00:09:07 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROPh4-0006fG-NI; Thu, 10 Nov 2011 00:09:06 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROPbC-0006Nf-Gc
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 00:03:31 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1320912177!2543983!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3239 invoked from network); 10 Nov 2011 08:02:58 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 08:02:58 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8853888"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 08:02:57 +0000
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Thu, 10 Nov 2011 08:02:57 +0000
Subject: Re: [Xen-devel] Grant a partial page
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel Castro <evil.dani@gmail.com>
In-Reply-To: <CAP2B85-NrwhELRMpndhq3vzxqEuZRjsZi3C6bJ6ze3q=Dfu=aA@mail.gmail.com>
References: <CAP2B85-NrwhELRMpndhq3vzxqEuZRjsZi3C6bJ6ze3q=Dfu=aA@mail.gmail.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Thu, 10 Nov 2011 08:02:57 +0000
Message-ID: <1320912177.16747.107.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-11-10 at 05:46 +0000, Daniel Castro wrote:
> Hello,
> I to issue a grant on a page, but only partially.
> I have a pointer to somewhere in memory and need to issue the grant
> for such a pointer but not to the entire page.
> I know FLAG GTF_sub_page is used for that purpose but grant_entry_v1
> apparently has no fields for sub_page, should I change the code to use
> Version 2 grant table entries?

sub page grants are a feature of v2 grant tables only, they also require
you to make copy only grants (since you cannot enforce the subpage
aspect for a mapped grant).

Using v2 grant tables here has a few issues.

Firstly it is hard (if not impossible) to go back to v1 after switching
to v2 which presents a problem for the eventual guest OS (this could
probably be solved by suitable hypervisor modifications).

Secondly the otherend needs to be using copy grants and not mapping
grants. This generally would require some sort of protocol negotiation
via xenstore (i.e. netback would generally use mapping by default for
guest-TX pages).

I think you are better off either copying your subpage data into an
isolated page of its own (or maybe you can arrange for this to be true
of the original data) or deciding that you are happy to expose the rest
of the original page to the backend domain. Whether this second option
is safe or not depends on what is there, a read-only grant might provide
some more assurances here, depending on what the data actually is etc.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 00:12:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 00:12:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROPkT-00074H-Sg; Thu, 10 Nov 2011 00:12:37 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROPcF-0006Oa-HZ
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 00:05:09 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320912210!45329189!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15437 invoked from network); 10 Nov 2011 08:03:30 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 08:03:30 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8853909"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 08:04:03 +0000
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Thu, 10 Nov 2011 08:04:03 +0000
Subject: Re: [Xen-devel] [PATCH 3 of 7] docs: add a document describing the
	xl cfg file syntax
From: Ian Campbell <Ian.Campbell@citrix.com>
To: ZhouPeng <zpengxen@gmail.com>
In-Reply-To: <CAAh7U5NSdSbhkvFqMGpy+UFBRngsxdxdGf8M+T7cNe_3TJa-pQ@mail.gmail.com>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
	<291f6cb0d03e56e4edbe.1320678792@cosworth.uk.xensource.com>
	<1320850830.955.171.camel@zakaz.uk.xensource.com>
	<CAAh7U5NSdSbhkvFqMGpy+UFBRngsxdxdGf8M+T7cNe_3TJa-pQ@mail.gmail.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Thu, 10 Nov 2011 08:04:02 +0000
Message-ID: <1320912242.16747.108.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>, Zhou
	Peng <zhoupeng@nfs.iscas.ac.cn>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-11-10 at 05:18 +0000, ZhouPeng wrote:
> On Wed, Nov 9, 2011 at 11:00 PM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > It seems that you added most of these commands to xl. Can I trouble you
> > to write a few words about what they do?
> Hi Ian,
> This is the doc in line below.
> Sorry not sent in a diff patch. I checked but It seems your doc patch has
> not been committed into the unstable.
> 
> Signed-off-by: Zhou Peng <zhoupeng@nfs.iscas.ac.cn>

Thanks Zhou, I'll add this to the end of my series and repost it.

Ian.

> 
> ### Spice Graphics Support
> 
> The following options control the features of SPICE.
> 
>  * `spice=BOOLEAN`: Allow access to the display via the SPICE protocol.
>     This enables the other SPICE-related settings.
> 
>  * `spicehost="ADDRESS"`: Specify the interface address to listen on if
>     given, otherwise any interface.
> 
>  * `spiceport=NUMBER`: Specify the port to listen on by the SPICE server
>     if the SPICE is enabled.
> 
>  * `spicetls_port=NUMBER`: Specify the secure port to listen on
>     by the SPICE server if the SPICE is enabled. At least one of the
>     spiceport or spicetls_port must be given if SPICE is enabled.
>     NB. the options depending on spicetls_port have not been supported.
> 
>  * `spicedisable_ticketing=BOOLEAN`: Enable client connection
>     without password. The default is false. If it's false (set to 0),
>     spicepasswd must be set.
> 
>  * `spicepasswd="PASSWORD"`: Specify the ticket password which is used by
>     a client for connection.
> 
>  * `spiceagent_mouse=BOOLEAN`: Whether SPICE agent is used
>     for client mouse mode. The default is true (turn on)
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 00:16:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 00:16:03 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROPnn-00089E-7x; Thu, 10 Nov 2011 00:16:03 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROPf9-0006RN-QH
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 00:07:16 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1320912423!977250!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13708 invoked from network); 10 Nov 2011 08:07:04 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 08:07:04 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315195200"; d="scan'208";a="170067526"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 03:07:00 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 03:07:00 -0500
Received: from cosworth.uk.xensource.com (cosworth.uk.xensource.com
	[10.80.16.52])	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	pAA86waV021706;	Thu, 10 Nov 2011 00:06:59 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: ceebf46a339d6c5e1bb2f91abe8a7ed0cc0178bf
Message-ID: <ceebf46a339d6c5e1bb2.1320912418@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1320678789@cosworth.uk.xensource.com>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 10 Nov 2011 08:06:58 +0000
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ZhouPeng <zpengxen@gmail.com>, Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH] docs: add spice options to xl domain cfg
	document
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1320912366 0
# Node ID ceebf46a339d6c5e1bb2f91abe8a7ed0cc0178bf
# Parent  30c6d81d3509a35365ac4bd68bdfdc035f768ff3
docs: add spice options to xl domain cfg document

Signed-off-by: Zhou Peng <zhoupeng@nfs.iscas.ac.cn>
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 30c6d81d3509 -r ceebf46a339d docs/user/xl-domain-config.markdown
--- a/docs/user/xl-domain-config.markdown	Mon Nov 07 16:04:06 2011 +0000
+++ b/docs/user/xl-domain-config.markdown	Thu Nov 10 08:06:06 2011 +0000
@@ -471,17 +471,31 @@ in the `VFB_SPEC_STRING` for configuring
 
 ### Spice Graphics Support
 
- * `spice=BOOLEAN`: XXX
+The following options control the features of SPICE.
 
- * `spiceport=XXX`: XXX
+ * `spice=BOOLEAN`: Allow access to the display via the SPICE protocol.
+    This enables the other SPICE-related settings.
 
- * `spicetls_port=XXX`: XXX
+ * `spicehost="ADDRESS"`: Specify the interface address to listen on if
+    given, otherwise any interface.
 
- * `spicehost=XXX`: XXX
+ * `spiceport=NUMBER`: Specify the port to listen on by the SPICE server
+    if the SPICE is enabled.
 
- * `spicedisable_ticketing=XXX`: XXX
+ * `spicetls_port=NUMBER`: Specify the secure port to listen on
+    by the SPICE server if the SPICE is enabled. At least one of the
+    spiceport or spicetls_port must be given if SPICE is enabled.
+    NB. the options depending on spicetls_port have not been supported.
 
- * `spiceagent_mouse=XXX`: XXX
+ * `spicedisable_ticketing=BOOLEAN`: Enable client connection
+    without password. The default is false. If it's false (set to 0),
+    spicepasswd must be set.
+
+ * `spicepasswd="PASSWORD"`: Specify the ticket password which is used by
+    a client for connection.
+
+ * `spiceagent_mouse=BOOLEAN`: Whether SPICE agent is used
+    for client mouse mode. The default is true (turn on)
 
 ### Miscellaneous Emulated Hardware
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 00:16:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 00:16:52 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROPoa-0008Vq-Iq; Thu, 10 Nov 2011 00:16:52 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROPib-0006qp-RP
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 00:10:43 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1320912609!56642989!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31720 invoked from network); 10 Nov 2011 08:10:09 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 08:10:09 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8854025"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 08:10:08 +0000
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Thu, 10 Nov 2011 08:10:04 +0000
Subject: Re: [Xen-devel] [PATCH 3 of 7] docs: add a document describing the
	xl cfg file syntax
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
In-Reply-To: <291f6cb0d03e56e4edbe.1320678792@cosworth.uk.xensource.com>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
	<291f6cb0d03e56e4edbe.1320678792@cosworth.uk.xensource.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Thu, 10 Nov 2011 08:10:04 +0000
Message-ID: <1320912604.16747.110.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: Dunlap <George.Dunlap@eu.citrix.com>, Tim Deegan <tim@xen.org>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>, George
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Tim, George:

Is this broadly accurate? In particular the bit about why one would use
the shadow_memory option and the suggestion that it also controls the
space used by the HAP overhead.

Cheers,
Ian.

On Mon, 2011-11-07 at 15:13 +0000, Ian Campbell wrote:
> 
> +### Paging
> +
> +The following options control the mechanisms used to virtualise guest
> +memory.  The defaults are selected to give the best results for the
> +common case and so you should normally leave these options
> +unspecified.
> +
> + * `hap=BOOLEAN`: Turns "hardware assisted paging" (the use of the
> +   hardware' nested page table feature) on or off.  Affects HVM
> guests
> +   only.  If turned off, Xen will run the guest in "shadow page
> table"
> +   mode where the guest's page table updates and/or TLB flushes
> +   etc. will be emulated.  Use of HAP is the default when available.
> +
> + * `oos=BOOLEAN`: Turns "out of sync pagetables" on or off.  When
> +   running in shadow page table mode, the guest's page table updates
> +   may be deferred as specified in the Intel/AMD architecture
> manuals.
> +   However this may expose unexpected bugs in the guest, or find bugs
> +   in Xen, so it is possible to disable this feature.  Use of out of
> +   sync page tables, when Xen thinks it appropriate, is the default.
> +
> + * `shadow_memory=MBYTES`: Number of megabytes to set aside for
> +   shadowing guest pagetable pages (effectively acting as a cache of
> +   translated pages) or to use for HAP state. By default this is 1MB
> +   per guest vcpu plus 8KB per MB of guest RAM. You should not
> +   normally need to adjust this value. However if you are not using
> +   hardware assisted paging (i.e. you are using shadow mode) and your
> +   guest workload consists of a large number of processes which do
> not
> +   share address space then increasing this value may improve
> +   performance. 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 00:20:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 00:20:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROPrm-0001B3-RR; Thu, 10 Nov 2011 00:20:10 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROPpl-0000Xo-1f
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 00:18:05 -0800
X-Env-Sender: evil.dani@gmail.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1320913081!981988!1
X-Originating-IP: [209.85.161.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18975 invoked from network); 10 Nov 2011 08:18:02 -0000
Received: from mail-fx0-f43.google.com (HELO mail-fx0-f43.google.com)
	(209.85.161.43)
	by server-14.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 08:18:02 -0000
Received: by fabs1 with SMTP id s1so1810773fab.30
	for <xen-devel@lists.xensource.com>;
	Thu, 10 Nov 2011 00:18:01 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type:content-transfer-encoding;
	bh=IVYbYFyDUhfHT2Y3dlYyYfhJ2nwWiHtRWBbaueEIIMM=;
	b=bugVVeOdPPNn4666fgZ34bEn0eqLWtnMMBIWZVkqUeZY6AEu22aHFijF2olLhioa0L
	V/eZfNIxkbMEmv1fqorjWBve9HD8n7ZLViTLyjH6vGlRBY20Kz6T/rCBvVKiS3SM+vC6
	3Wq5IyP6eCpCVtK26Ufizs4zLgLbMSEThDMII=
MIME-Version: 1.0
Received: by 10.223.91.82 with SMTP id l18mr10825216fam.30.1320913081815; Thu,
	10 Nov 2011 00:18:01 -0800 (PST)
Received: by 10.223.96.75 with HTTP; Thu, 10 Nov 2011 00:18:01 -0800 (PST)
In-Reply-To: <1320912177.16747.107.camel@dagon.hellion.org.uk>
References: <CAP2B85-NrwhELRMpndhq3vzxqEuZRjsZi3C6bJ6ze3q=Dfu=aA@mail.gmail.com>
	<1320912177.16747.107.camel@dagon.hellion.org.uk>
Date: Thu, 10 Nov 2011 17:18:01 +0900
Message-ID: <CAP2B858a3isfrZMyZMMxfpSpXv-8quF7O75UxuSMGvxJDr6V-g@mail.gmail.com>
Subject: Re: [Xen-devel] Grant a partial page
From: Daniel Castro <evil.dani@gmail.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Nov 10, 2011 at 5:02 PM, Ian Campbell <Ian.Campbell@citrix.com> wro=
te:
> On Thu, 2011-11-10 at 05:46 +0000, Daniel Castro wrote:
>> Hello,
>> I to issue a grant on a page, but only partially.
>> I have a pointer to somewhere in memory and need to issue the grant
>> for such a pointer but not to the entire page.
>> I know FLAG GTF_sub_page is used for that purpose but grant_entry_v1
>> apparently has no fields for sub_page, should I change the code to use
>> Version 2 grant table entries?
>
> sub page grants are a feature of v2 grant tables only, they also require
> you to make copy only grants (since you cannot enforce the subpage
> aspect for a mapped grant).
>
> Using v2 grant tables here has a few issues.
>
> Firstly it is hard (if not impossible) to go back to v1 after switching
> to v2 which presents a problem for the eventual guest OS (this could
> probably be solved by suitable hypervisor modifications).
>
> Secondly the otherend needs to be using copy grants and not mapping
> grants. This generally would require some sort of protocol negotiation
> via xenstore (i.e. netback would generally use mapping by default for
> guest-TX pages).
>
> I think you are better off either copying your subpage data into an
> isolated page of its own (or maybe you can arrange for this to be true
> of the original data) or deciding that you are happy to expose the rest
> of the original page to the backend domain. Whether this second option
> is safe or not depends on what is there, a read-only grant might provide
> some more assurances here, depending on what the data actually is etc.
Ian, the problems I see are:
1. I have no idea what the size of the transfer will be, it could be
several pages.
2. I do not know where the pointer that indicates the buffer points
at, meaning that I have no idea what else will be there.
3. I do not know id the buffer pointer is page aligned.
If I stick to the current code, where I do not use DMA directly,
instead the backend does the DMA to my private buffer and I manually
copy to the guest buffer. Does that extra copy is worth the trouble to
do v2 grants?

Daniel
>
> Ian.
>
>



--=20
+-=3D=3D=3D=3D=3D---------------------------+
| +---------------------------------+ | This space intentionally blank
for notetaking.
| |=A0=A0 | Daniel Castro,=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 |
| |=A0=A0 | Consultant/Programmer.|
| |=A0=A0 | U Andes=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=A0 |
+-------------------------------------+

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 00:27:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 00:27:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROPyX-0002Jo-S8; Thu, 10 Nov 2011 00:27:09 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROPy5-00027Q-Ep
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 00:26:41 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1320913598!2974143!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5298 invoked from network); 10 Nov 2011 08:26:38 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 08:26:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8854421"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 08:26:38 +0000
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Thu, 10 Nov 2011 08:26:37 +0000
Subject: Re: [Xen-devel] Grant a partial page
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel Castro <evil.dani@gmail.com>
In-Reply-To: <CAP2B858a3isfrZMyZMMxfpSpXv-8quF7O75UxuSMGvxJDr6V-g@mail.gmail.com>
References: <CAP2B85-NrwhELRMpndhq3vzxqEuZRjsZi3C6bJ6ze3q=Dfu=aA@mail.gmail.com>
	<1320912177.16747.107.camel@dagon.hellion.org.uk>
	<CAP2B858a3isfrZMyZMMxfpSpXv-8quF7O75UxuSMGvxJDr6V-g@mail.gmail.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Thu, 10 Nov 2011 08:26:37 +0000
Message-ID: <1320913597.16747.112.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-11-10 at 08:18 +0000, Daniel Castro wrote:
> On Thu, Nov 10, 2011 at 5:02 PM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > On Thu, 2011-11-10 at 05:46 +0000, Daniel Castro wrote:
> >> Hello,
> >> I to issue a grant on a page, but only partially.
> >> I have a pointer to somewhere in memory and need to issue the grant
> >> for such a pointer but not to the entire page.
> >> I know FLAG GTF_sub_page is used for that purpose but grant_entry_v1
> >> apparently has no fields for sub_page, should I change the code to use
> >> Version 2 grant table entries?
> >
> > sub page grants are a feature of v2 grant tables only, they also require
> > you to make copy only grants (since you cannot enforce the subpage
> > aspect for a mapped grant).
> >
> > Using v2 grant tables here has a few issues.
> >
> > Firstly it is hard (if not impossible) to go back to v1 after switching
> > to v2 which presents a problem for the eventual guest OS (this could
> > probably be solved by suitable hypervisor modifications).
> >
> > Secondly the otherend needs to be using copy grants and not mapping
> > grants. This generally would require some sort of protocol negotiation
> > via xenstore (i.e. netback would generally use mapping by default for
> > guest-TX pages).
> >
> > I think you are better off either copying your subpage data into an
> > isolated page of its own (or maybe you can arrange for this to be true
> > of the original data) or deciding that you are happy to expose the rest
> > of the original page to the backend domain. Whether this second option
> > is safe or not depends on what is there, a read-only grant might provide
> > some more assurances here, depending on what the data actually is etc.
> Ian, the problems I see are:
> 1. I have no idea what the size of the transfer will be, it could be
> several pages.
> 2. I do not know where the pointer that indicates the buffer points
> at, meaning that I have no idea what else will be there.
> 3. I do not know id the buffer pointer is page aligned.
> If I stick to the current code, where I do not use DMA directly,
> instead the backend does the DMA to my private buffer and I manually
> copy to the guest buffer. Does that extra copy is worth the trouble to
> do v2 grants?

In the context of SeaBIOS I don't think the copy matters too much.
Unless/until benchmarking shows otherwise I'd be inclined not to worry
about it.

Ian.

> 
> Daniel
> >
> > Ian.
> >
> >
> 
> 
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 00:34:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 00:34:30 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROQ5e-0002yi-EW; Thu, 10 Nov 2011 00:34:30 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROQ4B-0002jZ-PX
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 00:33:00 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1320913976!2877722!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16806 invoked from network); 10 Nov 2011 08:32:56 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-10.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 08:32:56 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 10 Nov 2011 08:32:56 +0000
Message-Id: <4EBB9A4602000078000600A1@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 10 Nov 2011 08:32:54 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Laszlo Ersek" <lersek@redhat.com>
Subject: Re: [Xen-devel] [PATCH] remove blocked time accounting from
	xen "clockchip"
References: <1318970579-6282-1-git-send-email-lersek@redhat.com>
	<4EBA8FAA020000780005FD5F@nat28.tlf.novell.com>
	<4EBABCAE.40704@redhat.com>
In-Reply-To: <4EBABCAE.40704@redhat.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Jeremy Fitzhardinge <jeremy@goop.org>, xen-devel@lists.xensource.com,
	Joe Jin <joe.jin@oracle.com>, Zhenzhong Duan <zhenzhong.duan@oracle.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 09.11.11 at 18:47, Laszlo Ersek <lersek@redhat.com> wrote:
> On 11/09/11 14:35, Jan Beulich wrote:
>> That is, on an overcommitted system (and without your patch) I
>> would expect you to not see the (full) double idle increment for a not
>> fully idle and not fully loaded vCPU.
>=20
> I tried to verify this with an experiment. Please examine if the=20
> experiment is bogus or not.
>=20
> On a four-PCPU host (hyperthreading off, RHEL-5.7+ hypervisor & dom0) =
I=20
> started three virtual machines:
>=20
> VM1: four VCPUs, four processes running a busy loop each, independently.
> VM2: ditto
> VM3: single VCPU running the attached program (which otherwise puts =
1/2=20
> load on a single CPU, virtual or physical.) OS is RHEL-6.1.
>=20
> In VM3, I also ran this script:
>=20
> $ grep cpu0 /proc/stat; sleep 20; grep cpu0 /proc/stat
> cpu0 10421 0 510 119943 608 0 1 122 0
> cpu0 11420 0 510 121942 608 0 1 126 0
>=20
> The difference in the fourth numerical column is still 1999, even =
though=20
> only 10 seconds of those 20 were spent idly.
>=20
> Does the experiment miss the point (or do I), or does this disprove =
the=20
> idea?

For one, my expectation may be wrong (while I think the consideration
of the accounting still being wrong even with the patch is correct).

Second, the amount of stolen time (presumably the second to last
column; not sure what kernel version RHEL-6.1 uses, so I can't
immediately verify) being just 4 is certainly too small to be relevant
(meaning that VM3's only vCPU got scheduled almost instantly in too
many cases, which I think is the intended behavior of the credit
scheduler in a contrived environment like this).

To get the amount of stolen time up, I think one would have to
penalize VM3 (so that it doesn't benefit from not having been
scheduled for 100ms each time). I don't, however, know how to
achieve that in practice.

One question certainly possible to answer is whether, with your patch
and across different (over-)load scenarios, process, system, idle and
steal times add up to wall time, which I don't think would be the case.
Which isn't to say that they do without your patch, just that it
addresses only part of a wider issue.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 00:36:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 00:36:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROQ7X-0003MP-Ra; Thu, 10 Nov 2011 00:36:27 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1ROQ4P-0002m4-2Z
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 00:33:15 -0800
X-Env-Sender: stefan.bader@canonical.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320913960!52515146!1
X-Originating-IP: [91.189.89.112]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8043 invoked from network); 10 Nov 2011 08:32:40 -0000
Received: from youngberry.canonical.com (HELO youngberry.canonical.com)
	(91.189.89.112) by server-5.tower-27.messagelabs.com with SMTP;
	10 Nov 2011 08:32:40 -0000
Received: from p5b2e4849.dip.t-dialin.net ([91.46.72.73] helo=[192.168.2.5])
	by youngberry.canonical.com with esmtpsa
	(TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71)
	(envelope-from <stefan.bader@canonical.com>)
	id 1ROQ4J-0005qg-IV; Thu, 10 Nov 2011 08:33:07 +0000
Message-ID: <4EBB8C42.8080604@canonical.com>
Date: Thu, 10 Nov 2011 09:33:06 +0100
From: Stefan Bader <stefan.bader@canonical.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20111031 Thunderbird/7.0.1
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Re: Regression in 3.1 causes Xen to use wrong idle
	routine
References: <4EA7DFD1.9060608@canonical.com>
	<20111026133003.GA6654@phenom.dumpdata.com>
	<4EA80CF2.5040309@canonical.com>
	<20111026134843.GA31609@phenom.dumpdata.com>
	<4EA811BB.6010005@canonical.com>
	<20111109175853.GA16318@phenom.dumpdata.com>
In-Reply-To: <20111109175853.GA16318@phenom.dumpdata.com>
X-Enigmail-Version: 1.4a1pre
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: len.brown@intel.com,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 09.11.2011 18:58, Konrad Rzeszutek Wilk wrote:
> On Wed, Oct 26, 2011 at 03:57:15PM +0200, Stefan Bader wrote:
>> On 26.10.2011 15:48, Konrad Rzeszutek Wilk wrote:
>>>>> What about using the cpuidle_disabled() functionality and adhere to that?
>>>>> As so:
>>>>>
>>> .. snip..
>>>>
>>>> >From reading over it, this should work. Though I would be interested to hear
>>>> from the linux-acpi folks. Also to double check that calling pm_idle when
>>>> cpuidle.off was specified really is what is intended.
>>>
>>> Oh yeah, definitly need the input from linux-acpi folks. And also to be actually
>>> tested :-)
>>
>> I can volunteer to do the testing. But I am lazy enough to hold back a bit as
>> someone may tell us this is completely the wrong way to fix it. :)
> 
> So the other option is to use 'idle=halt' on the Linux command line. That should
> provide the workaround for the folks reporting this (is there a BZ for it?).
> 
Believe upstream bz is still down. Got the issue reported here, though:

http://bugs.launchpad.net/bugs/881076

Hm, as a workaround probably. I guess it could be added when the test images are
done. Unfortunately, when running your image in the cloud it is kind of hard to
recover. Even more as you could have tested on an AMD based host.

Wonder whether it would be an option to automatically mask the mwait capability
off when running in paravirt mode...

-Stefan

> At least until a good solution is hammered out.
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 00:44:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 00:44:47 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROQFb-0005DO-Hy; Thu, 10 Nov 2011 00:44:47 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROQF8-000517-NM
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 00:44:19 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320914626!52517056!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12440 invoked from network); 10 Nov 2011 08:43:46 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 08:43:46 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8854804"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 08:44:15 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 08:44:15 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROQF5-00081S-6A;
	Thu, 10 Nov 2011 08:44:15 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROQEw-00018n-2x;
	Thu, 10 Nov 2011 08:44:06 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 08:43:58 +0000
Message-ID: <1320914644-4357-1-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 0/6] IOMMU, vtd and iotlb flush rework (v5) 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit

In one of my previous email I detailed a bug I was seeing when passing
through a Intel GPU on a guest that has more that 4G or RAM.

Allen suggested that I go for the Plan B but after a discussion with Tim
we agreed that Plan B was way to disruptive in term of code change.

This patch series implements Plan A.

http://xen.1045712.n5.nabble.com/VTD-Intel-iommu-IOTLB-flush-really-slow-td4952866.html

changes between v4 and v5:
        - Fix hypercall continuation for add_to_physmap in compat mode.

Changes between v3 and v4:
       - Move the loop for gmfn_range from arch_memory_op to xenmem_add_to_physmap.
       - Add a comment to comment to explain the purpose of iommu_dont_flush_iotlb.

Changes between v2 and v3:
      - Check for the presence iotlb_flush_all callback before calling it.

Changes between v1 and v2:
     - Move size in struct xen_add_to_physmap in padding between .domid and .space.
     - Store iommu_dont_flush per cpu
     - Change the code in hvmloader to relocate by batch of 64K, .size is now 16 bits.

Jean Guyader (6):
  vtd: Refactor iotlb flush code
  iommu: Introduce iommu_flush and iommu_flush_all.
  add_to_physmap: Move the code for XENMEM_add_to_physmap.
  mm: New XENMEM space, XENMAPSPACE_gmfn_range
  hvmloader: Change memory relocation loop when overlap with PCI hole.
  Introduce per cpu flag (iommu_dont_flush_iotlb) to avoid unnecessary
    iotlb flush

 tools/firmware/hvmloader/pci.c      |   20 +++++--
 xen/arch/x86/mm.c                   |   82 ++++++++++++++++++++++------
 xen/arch/x86/x86_64/compat/mm.c     |   10 ++++
 xen/drivers/passthrough/iommu.c     |   25 +++++++++
 xen/drivers/passthrough/vtd/iommu.c |  100 ++++++++++++++++++++---------------
 xen/include/public/memory.h         |    4 ++
 xen/include/xen/iommu.h             |   17 ++++++
 7 files changed, 192 insertions(+), 66 deletions(-)


--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 00:45:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 00:45:35 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROQGN-0005bZ-Ef; Thu, 10 Nov 2011 00:45:35 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROQF9-000518-0V
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 00:44:19 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320914626!52517056!2
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12444 invoked from network); 10 Nov 2011 08:43:46 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 08:43:46 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8854805"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 08:44:15 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 08:44:15 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROQF5-00081V-AU;
	Thu, 10 Nov 2011 08:44:15 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROQEw-00018p-6X;
	Thu, 10 Nov 2011 08:44:06 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 08:43:59 +0000
Message-ID: <1320914644-4357-2-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320914644-4357-1-git-send-email-jean.guyader@eu.citrix.com>
References: <1320914644-4357-1-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 1/6] vtd: Refactor iotlb flush code
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Factorize the iotlb flush code from map_page and unmap_page into
it's own function.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
Acked-by: Allen M Kay <allen.m.kay@intel.com>
---
 xen/drivers/passthrough/vtd/iommu.c |   86 +++++++++++++++++-----------------
 1 files changed, 43 insertions(+), 43 deletions(-)


--------------true
Content-Type: text/x-patch; name="0001-vtd-Refactor-iotlb-flush-code.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0001-vtd-Refactor-iotlb-flush-code.patch"

diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 7717ab4..5a5b6be 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -578,16 +578,53 @@ static void iommu_flush_all(void)
     }
 }
 
+static void __intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn,
+        int dma_old_pte_present, unsigned int page_count)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+    struct acpi_drhd_unit *drhd;
+    struct iommu *iommu;
+    int flush_dev_iotlb;
+    int iommu_domid;
+
+    /*
+     * No need pcideves_lock here because we have flush
+     * when assign/deassign device
+     */
+    for_each_drhd_unit ( drhd )
+    {
+        iommu = drhd->iommu;
+
+        if ( !test_bit(iommu->index, &hd->iommu_bitmap) )
+            continue;
+
+        flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
+        iommu_domid= domain_iommu_domid(d, iommu);
+        if ( iommu_domid == -1 )
+            continue;
+
+        if ( page_count > 1 || gfn == -1 )
+        {
+            if ( iommu_flush_iotlb_dsi(iommu, iommu_domid,
+                        0, flush_dev_iotlb) )
+                iommu_flush_write_buffer(iommu);
+        }
+        else
+        {
+            if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
+                        (paddr_t)gfn << PAGE_SHIFT_4K, 0,
+                        !dma_old_pte_present, flush_dev_iotlb) )
+                iommu_flush_write_buffer(iommu);
+        }
+    }
+}
+
 /* clear one page's page table */
 static void dma_pte_clear_one(struct domain *domain, u64 addr)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(domain);
-    struct acpi_drhd_unit *drhd;
-    struct iommu *iommu;
     struct dma_pte *page = NULL, *pte = NULL;
     u64 pg_maddr;
-    int flush_dev_iotlb;
-    int iommu_domid;
     struct mapped_rmrr *mrmrr;
 
     spin_lock(&hd->mapping_lock);
@@ -613,21 +650,7 @@ static void dma_pte_clear_one(struct domain *domain, u64 addr)
     spin_unlock(&hd->mapping_lock);
     iommu_flush_cache_entry(pte, sizeof(struct dma_pte));
 
-    /* No need pcidevs_lock here since do that on assign/deassign device*/
-    for_each_drhd_unit ( drhd )
-    {
-        iommu = drhd->iommu;
-        if ( test_bit(iommu->index, &hd->iommu_bitmap) )
-        {
-            flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
-            iommu_domid= domain_iommu_domid(domain, iommu);
-            if ( iommu_domid == -1 )
-                continue;
-            if ( iommu_flush_iotlb_psi(iommu, iommu_domid, addr,
-                                       0, 0, flush_dev_iotlb) )
-                iommu_flush_write_buffer(iommu);
-        }
-    }
+    __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
 
     unmap_vtd_domain_page(page);
 
@@ -1677,12 +1700,8 @@ static int intel_iommu_map_page(
     unsigned int flags)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(d);
-    struct acpi_drhd_unit *drhd;
-    struct iommu *iommu;
     struct dma_pte *page = NULL, *pte = NULL, old, new = { 0 };
     u64 pg_maddr;
-    int flush_dev_iotlb;
-    int iommu_domid;
 
     /* Do nothing if VT-d shares EPT page table */
     if ( iommu_use_hap_pt(d) )
@@ -1724,26 +1743,7 @@ static int intel_iommu_map_page(
     spin_unlock(&hd->mapping_lock);
     unmap_vtd_domain_page(page);
 
-    /*
-     * No need pcideves_lock here because we have flush
-     * when assign/deassign device
-     */
-    for_each_drhd_unit ( drhd )
-    {
-        iommu = drhd->iommu;
-
-        if ( !test_bit(iommu->index, &hd->iommu_bitmap) )
-            continue;
-
-        flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
-        iommu_domid= domain_iommu_domid(d, iommu);
-        if ( iommu_domid == -1 )
-            continue;
-        if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
-                                   (paddr_t)gfn << PAGE_SHIFT_4K, 0,
-                                   !dma_pte_present(old), flush_dev_iotlb) )
-            iommu_flush_write_buffer(iommu);
-    }
+    __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
 
     return 0;
 }

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 00:46:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 00:46:29 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROQHE-0005zB-U3; Thu, 10 Nov 2011 00:46:28 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROQF9-000519-8Z
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 00:44:19 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320914626!52517056!3
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12456 invoked from network); 10 Nov 2011 08:43:46 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 08:43:46 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8854806"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 08:44:15 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 08:44:15 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROQF5-00081W-Db;
	Thu, 10 Nov 2011 08:44:15 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROQEw-00018s-Au;
	Thu, 10 Nov 2011 08:44:06 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 08:44:00 +0000
Message-ID: <1320914644-4357-3-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320914644-4357-2-git-send-email-jean.guyader@eu.citrix.com>
References: <1320914644-4357-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-2-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 2/6] iommu: Introduce iommu_flush and
	iommu_flush_all.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
Acked-by: Allen M Kay <allen.m.kay@intel.com>
---
 xen/drivers/passthrough/iommu.c     |   20 ++++++++++++++++++++
 xen/drivers/passthrough/vtd/iommu.c |   12 ++++++++++++
 xen/include/xen/iommu.h             |    5 +++++
 3 files changed, 37 insertions(+), 0 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0002-iommu-Introduce-iommu_flush-and-iommu_flush_all.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0002-iommu-Introduce-iommu_flush-and-iommu_flush_all.patch"

diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index cd6174d..ca7b37b 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -301,6 +301,26 @@ int iommu_unmap_page(struct domain *d, unsigned long gfn)
     return hd->platform_ops->unmap_page(d, gfn);
 }
 
+void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+    if ( !iommu_enabled || !hd->platform_ops || !hd->platform_ops->iotlb_flush )
+        return;
+
+    hd->platform_ops->iotlb_flush(d, gfn, page_count);
+}
+
+void iommu_iotlb_flush_all(struct domain *d)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+    if ( !iommu_enabled || !hd->platform_ops || !hd->platform_ops->iotlb_flush_all )
+        return;
+
+    hd->platform_ops->iotlb_flush_all(d);
+}
+
 /* caller should hold the pcidevs_lock */
 int deassign_device(struct domain *d, u16 seg, u8 bus, u8 devfn)
 {
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 5a5b6be..7ec9541 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -619,6 +619,16 @@ static void __intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn,
     }
 }
 
+static void intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count)
+{
+    __intel_iommu_iotlb_flush(d, gfn, 1, page_count);
+}
+
+static void intel_iommu_iotlb_flush_all(struct domain *d)
+{
+    __intel_iommu_iotlb_flush(d, 0, 0, 0);
+}
+
 /* clear one page's page table */
 static void dma_pte_clear_one(struct domain *domain, u64 addr)
 {
@@ -2329,6 +2339,8 @@ const struct iommu_ops intel_iommu_ops = {
     .resume = vtd_resume,
     .share_p2m = iommu_set_pgd,
     .crash_shutdown = vtd_crash_shutdown,
+    .iotlb_flush = intel_iommu_iotlb_flush,
+    .iotlb_flush_all = intel_iommu_iotlb_flush_all,
 };
 
 /*
diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
index 837e60d..a1034df 100644
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -139,6 +139,8 @@ struct iommu_ops {
     void (*resume)(void);
     void (*share_p2m)(struct domain *d);
     void (*crash_shutdown)(void);
+    void (*iotlb_flush)(struct domain *d, unsigned long gfn, unsigned int page_count);
+    void (*iotlb_flush_all)(struct domain *d);
 };
 
 void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value);
@@ -155,4 +157,7 @@ void iommu_share_p2m_table(struct domain *d);
 
 int iommu_do_domctl(struct xen_domctl *, XEN_GUEST_HANDLE(xen_domctl_t));
 
+void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count);
+void iommu_iotlb_flush_all(struct domain *d);
+
 #endif /* _IOMMU_H_ */

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 00:47:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 00:47:47 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROQIV-0006Mw-Qz; Thu, 10 Nov 2011 00:47:47 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROQF9-00051D-Kc
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 00:44:19 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320914626!52517056!7
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12515 invoked from network); 10 Nov 2011 08:43:47 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 08:43:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8854810"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 08:44:16 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 08:44:16 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROQF5-00081g-Si;
	Thu, 10 Nov 2011 08:44:15 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROQEw-000191-Oe;
	Thu, 10 Nov 2011 08:44:06 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 08:44:03 +0000
Message-ID: <1320914644-4357-6-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320914644-4357-5-git-send-email-jean.guyader@eu.citrix.com>
References: <1320914644-4357-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-5-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 5/6] hvmloader: Change memory relocation loop
	when overlap with PCI hole.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Change the way we relocate the memory page if they overlap with pci hole.
Use new map space (XENMAPSPACE_gmfn_range) to move the loop into xen.

This code usually get triggered when a device is pass through to a guest
and the PCI hole has to be extended to have enough room to map the device BARs.
The PCI hole will starts lower and it might overlap with some RAM that has been
alocated for the guest. That usually happen if the guest has more than 4G of RAM.
We have to relocate those pages in high mem otherwise they won't be accessible.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 tools/firmware/hvmloader/pci.c |   20 ++++++++++++++------
 1 files changed, 14 insertions(+), 6 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0005-hvmloader-Change-memory-relocation-loop-when-overlap.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0005-hvmloader-Change-memory-relocation-loop-when-overlap.patch"

diff --git a/tools/firmware/hvmloader/pci.c b/tools/firmware/hvmloader/pci.c
index 29ec011..3bd6ac5 100644
--- a/tools/firmware/hvmloader/pci.c
+++ b/tools/firmware/hvmloader/pci.c
@@ -50,6 +50,7 @@ void pci_setup(void)
         uint32_t devfn, bar_reg, bar_sz;
     } *bars = (struct bars *)scratch_start;
     unsigned int i, nr_bars = 0;
+    unsigned long pci_mem_start_pg;
 
     /* Program PCI-ISA bridge with appropriate link routes. */
     isa_irq = 0;
@@ -185,17 +186,24 @@ void pci_setup(void)
             ((pci_mem_start << 1) != 0) )
         pci_mem_start <<= 1;
 
-    while ( (pci_mem_start >> PAGE_SHIFT) < hvm_info->low_mem_pgend )
+    /* Relocate RAM that overlaps (in 64K chunks) */
+    pci_mem_start_pg = (pci_mem_start >> PAGE_SHIFT);
+    while (pci_mem_start_pg < hvm_info->low_mem_pgend)
     {
         struct xen_add_to_physmap xatp;
-        if ( hvm_info->high_mem_pgend == 0 )
-            hvm_info->high_mem_pgend = 1ull << (32 - PAGE_SHIFT);
+        unsigned int size = hvm_info->low_mem_pgend - pci_mem_start_pg;
         xatp.domid = DOMID_SELF;
-        xatp.space = XENMAPSPACE_gmfn;
-        xatp.idx   = --hvm_info->low_mem_pgend;
-        xatp.gpfn  = hvm_info->high_mem_pgend++;
+        xatp.space = XENMAPSPACE_gmfn_range;
+        xatp.idx = pci_mem_start_pg;
+        xatp.gpfn = hvm_info->high_mem_pgend;
+        size = size > ((1 << 16) - 1) ? ((1 << 16) - 1) : size;
+        xatp.size = size;
+
         if ( hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0 )
             BUG();
+        pci_mem_start_pg += size;
+        hvm_info->high_mem_pgend += size;
+        hvm_info->low_mem_pgend = pci_mem_start_pg;
     }
 
     mem_resource.base = pci_mem_start;

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 00:49:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 00:49:17 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROQJx-0006ky-7B; Thu, 10 Nov 2011 00:49:17 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROQF9-00051B-Gr
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 00:44:19 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320914626!52517056!5
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12489 invoked from network); 10 Nov 2011 08:43:47 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 08:43:46 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8854808"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 08:44:16 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 08:44:15 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROQF5-00081b-KD;
	Thu, 10 Nov 2011 08:44:15 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROQEw-00018v-Di;
	Thu, 10 Nov 2011 08:44:06 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 08:44:01 +0000
Message-ID: <1320914644-4357-4-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320914644-4357-3-git-send-email-jean.guyader@eu.citrix.com>
References: <1320914644-4357-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-3-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 3/6] add_to_physmap: Move the code for
	XENMEM_add_to_physmap.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Move the code for the XENMEM_add_to_physmap case into it's own
function (xenmem_add_to_physmap).

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
Acked-by: Tim Deegan <tim@xen.org>
---
 xen/arch/x86/mm.c |  188 ++++++++++++++++++++++++++++-------------------------
 1 files changed, 99 insertions(+), 89 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0003-add_to_physmap-Move-the-code-for-XENMEM_add_to_physm.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0003-add_to_physmap-Move-the-code-for-XENMEM_add_to_physm.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index acc1f34..f75011e 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4592,119 +4592,129 @@ static int handle_iomem_range(unsigned long s, unsigned long e, void *p)
     return 0;
 }
 
-long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
+static int xenmem_add_to_physmap(struct domain *d, struct xen_add_to_physmap xatp)
 {
     struct page_info *page = NULL;
+    unsigned long prev_mfn, mfn = 0, gpfn;
     int rc;
 
-    switch ( op )
-    {
-    case XENMEM_add_to_physmap:
+    switch ( xatp.space )
     {
-        struct xen_add_to_physmap xatp;
-        unsigned long prev_mfn, mfn = 0, gpfn;
-        struct domain *d;
-
-        if ( copy_from_guest(&xatp, arg, 1) )
-            return -EFAULT;
+    case XENMAPSPACE_shared_info:
+        if ( xatp.idx == 0 )
+            mfn = virt_to_mfn(d->shared_info);
+        break;
+    case XENMAPSPACE_grant_table:
+        spin_lock(&d->grant_table->lock);
 
-        rc = rcu_lock_target_domain_by_id(xatp.domid, &d);
-        if ( rc != 0 )
-            return rc;
+        if ( d->grant_table->gt_version == 0 )
+            d->grant_table->gt_version = 1;
 
-        if ( xsm_add_to_physmap(current->domain, d) )
+        if ( d->grant_table->gt_version == 2 &&
+             (xatp.idx & XENMAPIDX_grant_table_status) )
         {
-            rcu_unlock_domain(d);
-            return -EPERM;
+            xatp.idx &= ~XENMAPIDX_grant_table_status;
+            if ( xatp.idx < nr_status_frames(d->grant_table) )
+                mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
+        }
+        else
+        {
+            if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
+                 (xatp.idx < max_nr_grant_frames) )
+                gnttab_grow_table(d, xatp.idx + 1);
+
+            if ( xatp.idx < nr_grant_frames(d->grant_table) )
+                mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
         }
 
-        switch ( xatp.space )
+        spin_unlock(&d->grant_table->lock);
+        break;
+    case XENMAPSPACE_gmfn:
+    {
+        p2m_type_t p2mt;
+
+        xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
+        /* If the page is still shared, exit early */
+        if ( p2m_is_shared(p2mt) )
         {
-        case XENMAPSPACE_shared_info:
-            if ( xatp.idx == 0 )
-                mfn = virt_to_mfn(d->shared_info);
+            rcu_unlock_domain(d);
+            return -ENOMEM;
+        }
+        if ( !get_page_from_pagenr(xatp.idx, d) )
             break;
-        case XENMAPSPACE_grant_table:
-            spin_lock(&d->grant_table->lock);
+        mfn = xatp.idx;
+        page = mfn_to_page(mfn);
+        break;
+    }
+    default:
+        break;
+    }
 
-            if ( d->grant_table->gt_version == 0 )
-                d->grant_table->gt_version = 1;
+    if ( !paging_mode_translate(d) || (mfn == 0) )
+    {
+        if ( page )
+            put_page(page);
+        rcu_unlock_domain(d);
+        return -EINVAL;
+    }
 
-            if ( d->grant_table->gt_version == 2 &&
-                 (xatp.idx & XENMAPIDX_grant_table_status) )
-            {
-                xatp.idx &= ~XENMAPIDX_grant_table_status;
-                if ( xatp.idx < nr_status_frames(d->grant_table) )
-                    mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
-            }
-            else
-            {
-                if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
-                     (xatp.idx < max_nr_grant_frames) )
-                    gnttab_grow_table(d, xatp.idx + 1);
+    domain_lock(d);
 
-                if ( xatp.idx < nr_grant_frames(d->grant_table) )
-                    mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
-            }
+    if ( page )
+        put_page(page);
 
-            spin_unlock(&d->grant_table->lock);
-            break;
-        case XENMAPSPACE_gmfn:
-        {
-            p2m_type_t p2mt;
+    /* Remove previously mapped page if it was present. */
+    prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
+    if ( mfn_valid(prev_mfn) )
+    {
+        if ( is_xen_heap_mfn(prev_mfn) )
+            /* Xen heap frames are simply unhooked from this phys slot. */
+            guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
+        else
+            /* Normal domain memory is freed, to avoid leaking memory. */
+            guest_remove_page(d, xatp.gpfn);
+    }
 
-            xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
-            /* If the page is still shared, exit early */
-            if ( p2m_is_shared(p2mt) )
-            {
-                rcu_unlock_domain(d);
-                return -ENOMEM;
-            }
-            if ( !get_page_from_pagenr(xatp.idx, d) )
-                break;
-            mfn = xatp.idx;
-            page = mfn_to_page(mfn);
-            break;
-        }
-        default:
-            break;
-        }
+    /* Unmap from old location, if any. */
+    gpfn = get_gpfn_from_mfn(mfn);
+    ASSERT( gpfn != SHARED_M2P_ENTRY );
+    if ( gpfn != INVALID_M2P_ENTRY )
+        guest_physmap_remove_page(d, gpfn, mfn, 0);
 
-        if ( !paging_mode_translate(d) || (mfn == 0) )
-        {
-            if ( page )
-                put_page(page);
-            rcu_unlock_domain(d);
-            return -EINVAL;
-        }
+    /* Map at new location. */
+    rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
 
-        domain_lock(d);
+    domain_unlock(d);
 
-        if ( page )
-            put_page(page);
+    return rc;
+}
 
-        /* Remove previously mapped page if it was present. */
-        prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
-        if ( mfn_valid(prev_mfn) )
-        {
-            if ( is_xen_heap_mfn(prev_mfn) )
-                /* Xen heap frames are simply unhooked from this phys slot. */
-                guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
-            else
-                /* Normal domain memory is freed, to avoid leaking memory. */
-                guest_remove_page(d, xatp.gpfn);
-        }
 
-        /* Unmap from old location, if any. */
-        gpfn = get_gpfn_from_mfn(mfn);
-        ASSERT( gpfn != SHARED_M2P_ENTRY );
-        if ( gpfn != INVALID_M2P_ENTRY )
-            guest_physmap_remove_page(d, gpfn, mfn, 0);
+long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
+{
+    int rc;
+
+    switch ( op )
+    {
+    case XENMEM_add_to_physmap:
+    {
+        struct xen_add_to_physmap xatp;
+        struct domain *d;
 
-        /* Map at new location. */
-        rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
+        if ( copy_from_guest(&xatp, arg, 1) )
+            return -EFAULT;
+
+        rc = rcu_lock_target_domain_by_id(xatp.domid, &d);
+        if ( rc != 0 )
+            return rc;
+
+        if ( xsm_add_to_physmap(current->domain, d) )
+        {
+            rcu_unlock_domain(d);
+            return -EPERM;
+        }
 
-        domain_unlock(d);
+        xenmem_add_to_physmap(d, xatp);
 
         rcu_unlock_domain(d);
 

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 00:50:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 00:50:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROQL6-00078P-JH; Thu, 10 Nov 2011 00:50:28 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROQF9-00051C-KA
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 00:44:20 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320914626!52517056!6
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12499 invoked from network); 10 Nov 2011 08:43:47 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 08:43:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8854809"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 08:44:16 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 08:44:16 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROQF5-00081i-Vy;
	Thu, 10 Nov 2011 08:44:16 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROQEw-000194-T5;
	Thu, 10 Nov 2011 08:44:06 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 08:44:04 +0000
Message-ID: <1320914644-4357-7-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320914644-4357-6-git-send-email-jean.guyader@eu.citrix.com>
References: <1320914644-4357-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-5-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-6-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 6/6] Introduce per cpu flag
	(iommu_dont_flush_iotlb) to avoid unnecessary iotlb flush
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Add cpu flag that will be checked by the iommu low level code
to skip iotlb flushes. iommu_iotlb_flush shall be called explicitly.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
Acked-by: Allen M Kay <allen.m.kay@intel.com>
---
 xen/arch/x86/mm.c                   |   14 ++++++++++++++
 xen/drivers/passthrough/iommu.c     |    5 +++++
 xen/drivers/passthrough/vtd/iommu.c |    6 ++++--
 xen/include/xen/iommu.h             |   12 ++++++++++++
 4 files changed, 35 insertions(+), 2 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0006-Introduce-per-cpu-flag-iommu_dont_flush_iotlb-to-avo.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0006-Introduce-per-cpu-flag-iommu_dont_flush_iotlb-to-avo.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 2417fe9..17a8504 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4594,13 +4594,20 @@ static int handle_iomem_range(unsigned long s, unsigned long e, void *p)
 
 static int xenmem_add_to_physmap(struct domain *d, struct xen_add_to_physmap xatp)
 {
+    struct xen_add_to_physmap start_xatp;
     struct page_info *page = NULL;
     unsigned long prev_mfn, mfn = 0, gpfn;
     int rc;
 
     if ( xatp.space != XENMAPSPACE_gmfn_range )
         xatp.size = 1;
+    else
+    {
+        if ( need_iommu(d) )
+            this_cpu(iommu_dont_flush_iotlb) = 1;
+    }
 
+    start_xatp = xatp;
     while ( xatp.size > 0 )
     {
         if ( hypercall_preempt_check() )
@@ -4705,6 +4712,13 @@ static int xenmem_add_to_physmap(struct domain *d, struct xen_add_to_physmap xat
             break;
     }
 
+    if ( xatp.space == XENMAPSPACE_gmfn_range && need_iommu(d) )
+    {
+        this_cpu(iommu_dont_flush_iotlb) = 0;
+        iommu_iotlb_flush(d, start_xatp.idx, start_xatp.size - xatp.size);
+        iommu_iotlb_flush(d, start_xatp.gpfn, start_xatp.size - xatp.size);
+    }
+
     return rc;
 }
 
diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index ca7b37b..bacca11 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -52,6 +52,8 @@ bool_t __read_mostly iommu_hap_pt_share = 1;
 bool_t __read_mostly iommu_debug;
 bool_t __read_mostly amd_iommu_perdev_intremap;
 
+DEFINE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
+
 static void __init parse_iommu_param(char *s)
 {
     char *ss;
@@ -227,6 +229,7 @@ static int iommu_populate_page_table(struct domain *d)
 
     spin_lock(&d->page_alloc_lock);
 
+    this_cpu(iommu_dont_flush_iotlb) = 1;
     page_list_for_each ( page, &d->page_list )
     {
         if ( is_hvm_domain(d) ||
@@ -244,6 +247,8 @@ static int iommu_populate_page_table(struct domain *d)
             }
         }
     }
+    this_cpu(iommu_dont_flush_iotlb) = 0;
+    iommu_iotlb_flush_all(d);
     spin_unlock(&d->page_alloc_lock);
     return 0;
 }
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 7ec9541..a3dd018 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -660,7 +660,8 @@ static void dma_pte_clear_one(struct domain *domain, u64 addr)
     spin_unlock(&hd->mapping_lock);
     iommu_flush_cache_entry(pte, sizeof(struct dma_pte));
 
-    __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
+    if ( !this_cpu(iommu_dont_flush_iotlb) )
+        __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
 
     unmap_vtd_domain_page(page);
 
@@ -1753,7 +1754,8 @@ static int intel_iommu_map_page(
     spin_unlock(&hd->mapping_lock);
     unmap_vtd_domain_page(page);
 
-    __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
+    if ( !this_cpu(iommu_dont_flush_iotlb) )
+        __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
 
     return 0;
 }
diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
index a1034df..6f7fbf7 100644
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -160,4 +160,16 @@ int iommu_do_domctl(struct xen_domctl *, XEN_GUEST_HANDLE(xen_domctl_t));
 void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count);
 void iommu_iotlb_flush_all(struct domain *d);
 
+/*
+ * The purpose of the iommu_dont_flush_iotlb optional cpu flag is to
+ * avoid unecessary iotlb_flush in the low level IOMMU code.
+ *
+ * iommu_map_page/iommu_unmap_page must flush the iotlb but somethimes
+ * this operation can be really expensive. This flag will be set by the
+ * caller to notify the low level IOMMU code to avoid the iotlb flushes.
+ * iommu_iotlb_flush/iommu_iotlb_flush_all will be explicitly called by
+ * the caller.
+ */
+DECLARE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
+
 #endif /* _IOMMU_H_ */

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 00:51:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 00:51:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROQMU-0007WH-2C; Thu, 10 Nov 2011 00:51:54 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROQF9-00051A-FS
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 00:44:20 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320914626!52517056!4
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12476 invoked from network); 10 Nov 2011 08:43:46 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 08:43:46 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8854807"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 08:44:15 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 08:44:16 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROQF5-00081c-OE;
	Thu, 10 Nov 2011 08:44:15 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROQEw-00018y-KY;
	Thu, 10 Nov 2011 08:44:06 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 08:44:02 +0000
Message-ID: <1320914644-4357-5-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320914644-4357-4-git-send-email-jean.guyader@eu.citrix.com>
References: <1320914644-4357-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-4-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] 
	[PATCH 4/6] mm: New XENMEM space, XENMAPSPACE_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


XENMAPSPACE_gmfn_range is like XENMAPSPACE_gmfn but it runs on
a range of pages. The size of the range is defined in a new field.

This new field .size is located in the 16 bits padding between .domid
and .space in struct xen_add_to_physmap to stay compatible with older
versions.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c               |  164 ++++++++++++++++++++++-----------------
 xen/arch/x86/x86_64/compat/mm.c |   10 +++
 xen/include/public/memory.h     |    4 +
 3 files changed, 108 insertions(+), 70 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0004-mm-New-XENMEM-space-XENMAPSPACE_gmfn_range.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0004-mm-New-XENMEM-space-XENMAPSPACE_gmfn_range.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index f75011e..2417fe9 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4598,93 +4598,112 @@ static int xenmem_add_to_physmap(struct domain *d, struct xen_add_to_physmap xat
     unsigned long prev_mfn, mfn = 0, gpfn;
     int rc;
 
-    switch ( xatp.space )
-    {
-    case XENMAPSPACE_shared_info:
-        if ( xatp.idx == 0 )
-            mfn = virt_to_mfn(d->shared_info);
-        break;
-    case XENMAPSPACE_grant_table:
-        spin_lock(&d->grant_table->lock);
+    if ( xatp.space != XENMAPSPACE_gmfn_range )
+        xatp.size = 1;
 
-        if ( d->grant_table->gt_version == 0 )
-            d->grant_table->gt_version = 1;
-
-        if ( d->grant_table->gt_version == 2 &&
-             (xatp.idx & XENMAPIDX_grant_table_status) )
+    while ( xatp.size > 0 )
+    {
+        if ( hypercall_preempt_check() )
         {
-            xatp.idx &= ~XENMAPIDX_grant_table_status;
-            if ( xatp.idx < nr_status_frames(d->grant_table) )
-                mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
+            rc = -EAGAIN;
+            break;
         }
-        else
+
+        switch ( xatp.space )
         {
-            if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
-                 (xatp.idx < max_nr_grant_frames) )
-                gnttab_grow_table(d, xatp.idx + 1);
+        case XENMAPSPACE_shared_info:
+            if ( xatp.idx == 0 )
+                mfn = virt_to_mfn(d->shared_info);
+            break;
+        case XENMAPSPACE_grant_table:
+            spin_lock(&d->grant_table->lock);
 
-            if ( xatp.idx < nr_grant_frames(d->grant_table) )
-                mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
-        }
+            if ( d->grant_table->gt_version == 0 )
+                d->grant_table->gt_version = 1;
 
-        spin_unlock(&d->grant_table->lock);
-        break;
-    case XENMAPSPACE_gmfn:
-    {
-        p2m_type_t p2mt;
+            if ( d->grant_table->gt_version == 2 &&
+                 (xatp.idx & XENMAPIDX_grant_table_status) )
+            {
+                xatp.idx &= ~XENMAPIDX_grant_table_status;
+                if ( xatp.idx < nr_status_frames(d->grant_table) )
+                    mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
+            }
+            else
+            {
+                if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
+                     (xatp.idx < max_nr_grant_frames) )
+                    gnttab_grow_table(d, xatp.idx + 1);
+
+                if ( xatp.idx < nr_grant_frames(d->grant_table) )
+                    mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
+            }
 
-        xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
-        /* If the page is still shared, exit early */
-        if ( p2m_is_shared(p2mt) )
+            spin_unlock(&d->grant_table->lock);
+            break;
+        case XENMAPSPACE_gmfn:
         {
-            rcu_unlock_domain(d);
-            return -ENOMEM;
+            p2m_type_t p2mt;
+
+            xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
+            /* If the page is still shared, exit early */
+            if ( p2m_is_shared(p2mt) )
+            {
+                rcu_unlock_domain(d);
+                return -ENOMEM;
+            }
+            if ( !get_page_from_pagenr(xatp.idx, d) )
+                break;
+            mfn = xatp.idx;
+            page = mfn_to_page(mfn);
+            break;
         }
-        if ( !get_page_from_pagenr(xatp.idx, d) )
+        default:
             break;
-        mfn = xatp.idx;
-        page = mfn_to_page(mfn);
-        break;
-    }
-    default:
-        break;
-    }
+        }
+
+        if ( !paging_mode_translate(d) || (mfn == 0) )
+        {
+            if ( page )
+                put_page(page);
+            rcu_unlock_domain(d);
+            return -EINVAL;
+        }
+
+        domain_lock(d);
 
-    if ( !paging_mode_translate(d) || (mfn == 0) )
-    {
         if ( page )
             put_page(page);
-        rcu_unlock_domain(d);
-        return -EINVAL;
-    }
 
-    domain_lock(d);
+        /* Remove previously mapped page if it was present. */
+        prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
+        if ( mfn_valid(prev_mfn) )
+        {
+            if ( is_xen_heap_mfn(prev_mfn) )
+                /* Xen heap frames are simply unhooked from this phys slot. */
+                guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
+            else
+                /* Normal domain memory is freed, to avoid leaking memory. */
+                guest_remove_page(d, xatp.gpfn);
+        }
 
-    if ( page )
-        put_page(page);
+        /* Unmap from old location, if any. */
+        gpfn = get_gpfn_from_mfn(mfn);
+        ASSERT( gpfn != SHARED_M2P_ENTRY );
+        if ( gpfn != INVALID_M2P_ENTRY )
+            guest_physmap_remove_page(d, gpfn, mfn, 0);
 
-    /* Remove previously mapped page if it was present. */
-    prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
-    if ( mfn_valid(prev_mfn) )
-    {
-        if ( is_xen_heap_mfn(prev_mfn) )
-            /* Xen heap frames are simply unhooked from this phys slot. */
-            guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
-        else
-            /* Normal domain memory is freed, to avoid leaking memory. */
-            guest_remove_page(d, xatp.gpfn);
-    }
+        /* Map at new location. */
+        rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
 
-    /* Unmap from old location, if any. */
-    gpfn = get_gpfn_from_mfn(mfn);
-    ASSERT( gpfn != SHARED_M2P_ENTRY );
-    if ( gpfn != INVALID_M2P_ENTRY )
-        guest_physmap_remove_page(d, gpfn, mfn, 0);
+        domain_unlock(d);
 
-    /* Map at new location. */
-    rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
+        xatp.idx++;
+        xatp.gpfn++;
+        xatp.size--;
 
-    domain_unlock(d);
+        if ( rc != 0 )
+            break;
+    }
 
     return rc;
 }
@@ -4714,10 +4733,15 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
             return -EPERM;
         }
 
-        xenmem_add_to_physmap(d, xatp);
-
+        rc = xenmem_add_to_physmap(d, xatp);
         rcu_unlock_domain(d);
 
+        if ( rc == -EAGAIN )
+        {
+            rc = hypercall_create_continuation(
+                    __HYPERVISOR_memory_op, "ih", op, arg);
+        }
+
         return rc;
     }
 
diff --git a/xen/arch/x86/x86_64/compat/mm.c b/xen/arch/x86/x86_64/compat/mm.c
index 2c05099..45035cf 100644
--- a/xen/arch/x86/x86_64/compat/mm.c
+++ b/xen/arch/x86/x86_64/compat/mm.c
@@ -63,6 +63,16 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
 
         XLAT_add_to_physmap(nat, &cmp);
         rc = arch_memory_op(op, guest_handle_from_ptr(nat, void));
+        if ( rc < 0 )
+            return rc;
+
+        if ( rc == __HYPERVISOR_memory_op )
+            hypercall_xlat_continuation(NULL, 0x2, nat, arg);
+
+        XLAT_add_to_physmap(&cmp, nat);
+
+        if ( copy_to_guest(arg, &cmp, 1) )
+            return -EFAULT;
 
         break;
     }
diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h
index 08355e3..c5b78a8 100644
--- a/xen/include/public/memory.h
+++ b/xen/include/public/memory.h
@@ -208,10 +208,14 @@ struct xen_add_to_physmap {
     /* Which domain to change the mapping for. */
     domid_t domid;
 
+    /* Number of pages to go through for gmfn_range */
+    uint16_t    size;
+
     /* Source mapping space. */
 #define XENMAPSPACE_shared_info 0 /* shared info page */
 #define XENMAPSPACE_grant_table 1 /* grant table page */
 #define XENMAPSPACE_gmfn        2 /* GMFN */
+#define XENMAPSPACE_gmfn_range  3 /* GMFN range */
     unsigned int space;
 
 #define XENMAPIDX_grant_table_status 0x80000000

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 01:04:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 01:04:48 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROQYv-0000S7-S6; Thu, 10 Nov 2011 01:04:47 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROQTC-0000AP-U1
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 00:59:28 -0800
X-Env-Sender: dkiper@net-space.pl
X-Msg-Ref: server-11.tower-182.messagelabs.com!1320915502!2551977!1
X-Originating-IP: [89.174.63.77]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2237 invoked from network); 10 Nov 2011 08:58:23 -0000
Received: from router-fw.net-space.pl (HELO router-fw.net-space.pl)
	(89.174.63.77)
	by server-11.tower-182.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 10 Nov 2011 08:58:23 -0000
Received: (from localhost user: 'dkiper' uid#4000 fake: STDIN
	(dkiper@router-fw.net-space.pl)) by router-fw-old.local.net-space.pl
	id S896649Ab1KJI6V (ORCPT <rfc822;xen-devel@lists.xensource.com>);
	Thu, 10 Nov 2011 09:58:21 +0100
Date: Thu, 10 Nov 2011 09:58:21 +0100
From: Daniel Kiper <dkiper@net-space.pl>
To: jbeulich@suse.com
Message-ID: <20111110085821.GA15751@router-fw-old.local.net-space.pl>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.3.28i
Cc: xen-devel@lists.xensource.com, konrad.wilk@oracle.com
Subject: [Xen-devel] An issue in xen_limit_pages_to_max_mfn() in Xenlinux
	Ver. 2.6.18
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi Jan,

During work on kexec/kdump for Xen domU I found that
xen_limit_pages_to_max_mfn() registers undo_limit_pages()
destructor which breaks __free_pages(). When __free_pages()
is called then at beginning of this function put_page_testzero()
is called which decrements page count for given page. Later
undo_limit_pages() destructor is called which once again
calls __free_pages() and in consequence put_page_testzero()
fails (BUG_ON() is called) because page count is 0. It could
be easily fixed, however, after reviewing xen_limit_pages_to_max_mfn()
I could not find any good reason for which undo_limit_pages()
destructor is registered. Maybe it could be removed at all because
all pages are freed when __free_pages() is called and in this
case we do not care where they live. However, maybe I missed
something important. Could you explain for which cases
undo_limit_pages() destructor was prepared ???

Daniel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 01:12:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 01:12:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROQgk-0001ha-Mq; Thu, 10 Nov 2011 01:12:50 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROQfK-0001Qh-LJ
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 01:11:23 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1320916279!2555701!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5329 invoked from network); 10 Nov 2011 09:11:19 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-12.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 09:11:19 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 10 Nov 2011 09:11:19 +0000
Message-Id: <4EBBA3430200007800060122@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 10 Nov 2011 09:11:15 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Ian Campbell" <ian.campbell@citrix.com>
References: <3c6eaf62996dd26d7d0a.1320911866@cosworth.uk.xensource.com>
In-Reply-To: <3c6eaf62996dd26d7d0a.1320911866@cosworth.uk.xensource.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com, Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH] xen: add a comment for
	hypercall_xlat_continuation
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 08:57, Ian Campbell <ian.campbell@citrix.com> wrote:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@citrix.com>
> # Date 1320911800 0
> # Node ID 3c6eaf62996dd26d7d0a055955d30bc6c7067f91
> # Parent  e6af32ecb4483457d5ad9a7b674c18aaf20cc085
> xen: add a comment for hypercall_xlat_continuation
>=20
> The interface of this function is really rather complex and having =
reverse
> engineered it for the N'th time I think it is time to write things down.
>=20
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

Thanks for doing this!
Acked-by: Jan Beulich <jbeulich@suse.com>

> diff -r e6af32ecb448 -r 3c6eaf62996d xen/include/xen/compat.h
> --- a/xen/include/xen/compat.h	Tue Oct 18 14:15:09 2011 +0100
> +++ b/xen/include/xen/compat.h	Thu Nov 10 07:56:40 2011 +0000
> @@ -185,6 +185,34 @@ static inline int name(k xen_ ## n *x, k
>      CHECK_FIELD_COMMON_(k, CHECK_NAME_(k, n ## __ ## f1 ## __ ## f2 ## =
__=20
> ## \
>                                         f3, F2), n, f1.f2.f3)
> =20
> +/*
> + * Translate a native continuation into a compat guest continuation.
> + *
> + * id: If non-NULL then points to an integer N between 0-5. Will be =
updated
> + * with the value of the N'th argument to the hypercall. The N'th =
argument=20
> must
> + * not be subject to translation (i.e. cannot be referenced by @mask=20
> below).
> + * This option is useful for extracting the "op" argument or similar =
from=20
> the
> + * hypercall to enable further xlat processing.
> + *
> + * mask: Specifies which of the hypercall arguments require compat=20
> translation.
> + * bit 0 indicates that the 0'th argument requires translation, bit =
1=20
> indicates
> + * that the first argument requires translation and so on. Native =
and=20
> compat
> + * values for each translated argument are provided as @varargs (see=20
> below).
> + *
> + * varargs: For each bit which is set in @mask the varargs contain a =
native
> + * value (unsigned long) and a compat value (unsigned int). If the =
native=20
> value
> + * and compat value differ and the N'th argument is equal to the =
native=20
> value
> + * then that argument is replaced by the compat value. If the native =
and=20
> compat
> + * values are equal then no translation takes place. If the N'th =
argument=20
> does
> + * not equal the native value then no translation takes place.
> + *
> + * Any untranslated argument (whether due to not being requested in =
@mask,
> + * native and compat values being equal or N'th argument not =
equalling=20
> native
> + * value) must be equal in both native and compat representations (i.e. =
the
> + * native version cannot have any bits > 32 set)
> + *
> + * Return: Number of arguments which were actually translated.
> + */
>  int hypercall_xlat_continuation(unsigned int *id, unsigned int mask, =
...);
> =20
>  /* In-place translation functons: */




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 01:14:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 01:14:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROQih-00026M-Dz; Thu, 10 Nov 2011 01:14:51 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROQgA-0001a6-0H
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 01:12:14 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1320916331!3661363!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3934 invoked from network); 10 Nov 2011 09:12:11 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 09:12:11 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8855755"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 09:12:10 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Thu, 10 Nov 2011 09:12:10 +0000
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jan Beulich <JBeulich@suse.com>
Date: Thu, 10 Nov 2011 09:12:10 +0000
In-Reply-To: <4EBBA3430200007800060122@nat28.tlf.novell.com>
References: <3c6eaf62996dd26d7d0a.1320911866@cosworth.uk.xensource.com>
	<4EBBA3430200007800060122@nat28.tlf.novell.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320916330.955.191.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Jean Guyader <Jean.Guyader@citrix.com>
Subject: [Xen-devel] Re: [PATCH] xen: add a comment for
	hypercall_xlat_continuation
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-11-10 at 09:11 +0000, Jan Beulich wrote:
> >>> On 10.11.11 at 08:57, Ian Campbell <ian.campbell@citrix.com> wrote:
> > # HG changeset patch
> > # User Ian Campbell <ian.campbell@citrix.com>
> > # Date 1320911800 0
> > # Node ID 3c6eaf62996dd26d7d0a055955d30bc6c7067f91
> > # Parent  e6af32ecb4483457d5ad9a7b674c18aaf20cc085
> > xen: add a comment for hypercall_xlat_continuation
> > 
> > The interface of this function is really rather complex and having reverse
> > engineered it for the N'th time I think it is time to write things down.
> > 
> > Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
> 
> Thanks for doing this!

No problem.

> Acked-by: Jan Beulich <jbeulich@suse.com>

Will you commit too?

> 
> > diff -r e6af32ecb448 -r 3c6eaf62996d xen/include/xen/compat.h
> > --- a/xen/include/xen/compat.h	Tue Oct 18 14:15:09 2011 +0100
> > +++ b/xen/include/xen/compat.h	Thu Nov 10 07:56:40 2011 +0000
> > @@ -185,6 +185,34 @@ static inline int name(k xen_ ## n *x, k
> >      CHECK_FIELD_COMMON_(k, CHECK_NAME_(k, n ## __ ## f1 ## __ ## f2 ## __ 
> > ## \
> >                                         f3, F2), n, f1.f2.f3)
> >  
> > +/*
> > + * Translate a native continuation into a compat guest continuation.
> > + *
> > + * id: If non-NULL then points to an integer N between 0-5. Will be updated
> > + * with the value of the N'th argument to the hypercall. The N'th argument 
> > must
> > + * not be subject to translation (i.e. cannot be referenced by @mask 
> > below).
> > + * This option is useful for extracting the "op" argument or similar from 
> > the
> > + * hypercall to enable further xlat processing.
> > + *
> > + * mask: Specifies which of the hypercall arguments require compat 
> > translation.
> > + * bit 0 indicates that the 0'th argument requires translation, bit 1 
> > indicates
> > + * that the first argument requires translation and so on. Native and 
> > compat
> > + * values for each translated argument are provided as @varargs (see 
> > below).
> > + *
> > + * varargs: For each bit which is set in @mask the varargs contain a native
> > + * value (unsigned long) and a compat value (unsigned int). If the native 
> > value
> > + * and compat value differ and the N'th argument is equal to the native 
> > value
> > + * then that argument is replaced by the compat value. If the native and 
> > compat
> > + * values are equal then no translation takes place. If the N'th argument 
> > does
> > + * not equal the native value then no translation takes place.
> > + *
> > + * Any untranslated argument (whether due to not being requested in @mask,
> > + * native and compat values being equal or N'th argument not equalling 
> > native
> > + * value) must be equal in both native and compat representations (i.e. the
> > + * native version cannot have any bits > 32 set)
> > + *
> > + * Return: Number of arguments which were actually translated.
> > + */
> >  int hypercall_xlat_continuation(unsigned int *id, unsigned int mask, ...);
> >  
> >  /* In-place translation functons: */
> 
> 
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 01:22:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 01:22:56 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROQqV-0002ai-BE; Thu, 10 Nov 2011 01:22:55 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROQoL-0002NB-8j
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 01:20:52 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1320916837!2556975!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 738 invoked from network); 10 Nov 2011 09:20:37 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-12.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 09:20:37 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 10 Nov 2011 09:20:36 +0000
Message-Id: <4EBBA5730200007800060139@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 10 Nov 2011 09:20:35 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Olaf Hering" <olaf@aepfle.de>,
	"Andres Lagar-Cavilla" <andres@lagarcavilla.org>
Subject: [Xen-devel] Re: Need help with fixing the Xen waitqueue
	 feature
References: <20111108224414.83985CF73A@homiemail-mx7.g.dreamhost.com>
	<3c097da8e49a42af1210e4ffcd39fd48.squirrel@webmail.lagarcavilla.org>
	<20111109070927.GB26154@aepfle.de>
	<0bb01a4d216a68c4ae8441b037927f61.squirrel@webmail.lagarcavilla.org>
	<20111109221148.GA17166@aepfle.de>
	<5d7d38b18271fcc7aa750604eeb52bbd.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <5d7d38b18271fcc7aa750604eeb52bbd.squirrel@webmail.lagarcavilla.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: keir.xen@gmail.com, xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 05:29, "Andres Lagar-Cavilla" <andres@lagarcavilla.org> =
wrote:
> The tools retry as long as IOCTL_PRIVCMD_MMAPBATCH_V2 is supported. =
Which
> it isn't on mainline linux 3.0, 3.1, etc.

Seems like nobody cared to port over the code from the old 2.6.18 tree
(or the forward ports thereof).

> Which dom0 kernel are you using?

Certainly one of our forward port kernels.

> And for backend drivers implemented in the kernel (netback, etc), there =
is
> no retrying.

As above, seems like nobody cared to forward port those bits either.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 01:25:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 01:25:46 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROQtF-000303-P7; Thu, 10 Nov 2011 01:25:45 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROQrc-0002mR-9V
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 01:24:05 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1320917041!989143!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23901 invoked from network); 10 Nov 2011 09:24:01 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 09:24:01 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8856075"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 09:24:01 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Thu, 10 Nov 2011 09:24:00 +0000
Subject: Re: [Xen-devel] why do I get bad disk write performance in the
	kernel 3.1?
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Thu, 10 Nov 2011 09:24:00 +0000
In-Reply-To: <20111110034237.GA3156@phenom.dumpdata.com>
References: <CAOdhoheOhKGWp3f-tvXDX5SuGMXmsyY4fP==EXL-CWfiF52NzQ@mail.gmail.com>
	<20111109151838.GA26277@phenom.dumpdata.com>
	<CAOdhohc+UoicOGTW2W_rzdf7d4RR48QyOb4dr=f2g-LAWKB-dA@mail.gmail.com>
	<20111110034237.GA3156@phenom.dumpdata.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320917040.955.197.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Roberto Scudeller <beto.rvs@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-11-10 at 03:42 +0000, Konrad Rzeszutek Wilk wrote:

> 
> 
> OK, so looks like you are using qdisk. [...]

That depends on whether Roberto is using xm/xend or xl, I think.
Roberto?

I'm not sure what xend does for 'tap2:aio' if blktap isn't available. I
suspect it doesn't fallback to qdisk. Roberto can you report the content
of xenstore under /local/domain/0/backend/ (use xenstore-ls <path>).

> You could also try the 'file:/local-disk' which will setup a loopback device
> and use that. Try that as well.

This is true with xm/xend but with xl you will need to manually setup
the looback and use phy:/dev/loop in order to perform this experiment.
For xl file: turns into qdisk unless blktap is available.

Ian.

> 
> > 
> > My windows.cfg is:
> > name='benchCM-windows-2003-64b-std-test'
> > kernel='/usr/lib/xen/boot/hvmloader'
> > builder='hvm'
> > memory=512
> > vcpus=2
> > pae=1
> > acpi=1
> > apic=1
> > disk=[ 'tap2:aio:/local-disk/benchCM-windows-2003-64b-std/xvda,xvda,w' ]
> > device_model='/usr/lib/xen/bin/qemu-dm'
> > boot='c'
> > sdl=0
> > vnc=1
> > vncunused=1
> > vnclisten='0.0.0.0'
> > vncpasswd=''
> > stdvga=0
> > extra=''
> > on_reboot='restart'
> > on_shutdown='destroy'
> > ramdisk=''
> > image_name=''
> > on_crash='destroy'
> > bootloader=''
> > root=''
> > platform='xen'
> > network_mode='tap'
> > usb = 1
> > usbdevice = 'tablet'
> > 
> > The xvda disk is a raw disk, created with dd.
> > I use the windows.cfg in both kernel.
> > 
> > 
> > 
> > 2011/11/9 Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > 
> > > On Wed, Nov 09, 2011 at 12:58:27PM -0200, Roberto Scudeller wrote:
> > > > Hi all,
> > > >
> > > > I'm testing the new kernel 3.1 from kernel.org, and xen 4.1.2-rc1-pre.
> > > > I execute a CrystalMark IO Benchmark, in windows 2003 VM with gplpv
> > > > drivers, and receive an amazing result for reading, but the write numbers
> > > > are very disappointing.
> > > >
> > > > I run the VM in local disk, and receive these numbers:
> > > > Seq read: 244 MB/s
> > > > 512K read: 239 MB/s
> > > > 4K read: 27 MB/s
> > > > 4K QD 32: 90 MB/s
> > > >
> > > > Seq write: 20 MB/s
> > > > 512K: 20 MB/s
> > > > 4K: 8 MB/s
> > > > 4K QD 32: 12MB/s
> > > >
> > > > In older kernel, 2.6.32.x:
> > > > Seq read: 189 MB/s
> > > > 512K read: 169 MB/s
> > > > 4K read: 11 MB/s
> > > > 4K QD 32: 34 MB/s
> > > >
> > > > Seq write: 177 MB/s
> > > > 512K: 166 MB/s
> > > > 4K: 12 MB/s
> > > > 4K QD 32: 36 MB/s
> > > >
> > > > Could anyone help me. Why is the new kernel faster in reading, but too
> > > slow
> > > > writing ?
> > >
> > > It would help if you gave an idea of what the guest configuration is and
> > > what is the backend. It might be that the backend you are using in 3.1 is
> > > QEMU qdisk, not xen-blkback.
> > >
> > 
> > 
> > 
> > -- 
> > Roberto Scudeller
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 01:27:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 01:27:41 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROQv7-0003OF-0d; Thu, 10 Nov 2011 01:27:41 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROQty-000389-1T
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 01:26:31 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1320917187!3655854!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29302 invoked from network); 10 Nov 2011 09:26:27 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-7.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 09:26:27 -0000
Received: by wwp14 with SMTP id 14so31754wwp.24
	for <xen-devel@lists.xensource.com>;
	Thu, 10 Nov 2011 01:26:27 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=/k+3f2Er22ZzC80Rwou/Rq4e+HHHVFlzfKn9CDqoaZ0=;
	b=jkFUn6/qdyJJ5CkKVsWR8mI68RAzm8iToE9VKbflQpVvWiEmzev/jSciyHakxwSjjg
	5FPBzNQFRzXb/prheieOEp+bZXPDlL3m2qGVI8pIwWjVbPDcK4eXU9Fl6xsqIG+ztfrU
	TUvm7MUPhAJUxOG8SumNqZBu/tQn6WlPa2FEA=
Received: by 10.180.81.163 with SMTP id b3mr7536959wiy.20.1320917186873;
	Thu, 10 Nov 2011 01:26:26 -0800 (PST)
Received: from [192.168.1.71]
	(host86-129-249-120.range86-129.btcentralplus.com. [86.129.249.120])
	by mx.google.com with ESMTPS id k5sm4462395wiz.9.2011.11.10.01.26.23
	(version=SSLv3 cipher=OTHER); Thu, 10 Nov 2011 01:26:25 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Thu, 10 Nov 2011 09:26:19 +0000
From: Keir Fraser <keir.xen@gmail.com>
To: <andres@lagarcavilla.org>,
	Olaf Hering <olaf@aepfle.de>
Message-ID: <CAE1493B.246DE%keir.xen@gmail.com>
Thread-Topic: Need help with fixing the Xen waitqueue feature
Thread-Index: Acyfis2QLetISbGmLEW2x83tA3Jwgg==
In-Reply-To: <5d7d38b18271fcc7aa750604eeb52bbd.squirrel@webmail.lagarcavilla.org>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: Need help with fixing the Xen waitqueue feature
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 10/11/2011 04:29, "Andres Lagar-Cavilla" <andres@lagarcavilla.org> wrote:

>> The tools are supposed to catch ENOENT and try again.
>> linux_privcmd_map_foreign_bulk() does that. linux_gnttab_grant_map()
>> appears to do that as well. What code path uses qemu that leads to a
>> crash?
> 
> The tools retry as long as IOCTL_PRIVCMD_MMAPBATCH_V2 is supported. Which
> it isn't on mainline linux 3.0, 3.1, etc. Which dom0 kernel are you using?
> 
> And for backend drivers implemented in the kernel (netback, etc), there is
> no retrying.

Getting this working without a new Linux kernel -- and with
as-yet-to-be-written new stuff in it -- is unlikely to be on the cards is
it?

I think you suggested an in-kernel mechanism to wait for page-in and then
retry mapping. If that could be used by the in-kernel drivers and exposed
via our privcmd interface for qemu and rest of userspace too, that may be
the best single solution. Perhaps it could be largely hidden behind the
existing privcmd-mmap ioctls.

 -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 01:55:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 01:55:32 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RORM4-0004GT-1G; Thu, 10 Nov 2011 01:55:32 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RORL9-000446-TL
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 01:54:36 -0800
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-10.tower-27.messagelabs.com!1320918842!43365568!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16134 invoked from network); 10 Nov 2011 09:54:02 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-10.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 09:54:02 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RORL3-000GH9-UZ; Thu, 10 Nov 2011 09:54:30 +0000
Date: Thu, 10 Nov 2011 09:54:28 +0000
From: Tim Deegan <tim@xen.org>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 3 of 7] docs: add a document describing the xl
	cfg file syntax\
Message-ID: <20111110095428.GA62117@ocelot.phlegethon.org>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
	<291f6cb0d03e56e4edbe.1320678792@cosworth.uk.xensource.com>
	<1320912604.16747.110.camel@dagon.hellion.org.uk>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <1320912604.16747.110.camel@dagon.hellion.org.uk>
User-Agent: Mutt/1.4.2.1i
Cc: George Dunlap <George.Dunlap@eu.citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 08:10 +0000 on 10 Nov (1320912604), Ian Campbell wrote:
> Tim, George:
> 
> Is this broadly accurate? In particular the bit about why one would use
> the shadow_memory option and the suggestion that it also controls the
> space used by the HAP overhead.
> 
> Cheers,
> Ian.
> 
> On Mon, 2011-11-07 at 15:13 +0000, Ian Campbell wrote:
> > 
> > +### Paging
> > +
> > +The following options control the mechanisms used to virtualise guest
> > +memory.  The defaults are selected to give the best results for the
> > +common case and so you should normally leave these options
> > +unspecified.
> > +
> > + * `hap=BOOLEAN`: Turns "hardware assisted paging" (the use of the
> > +   hardware' nested page table feature) on or off.  Affects HVM
> > guests
> > +   only.  If turned off, Xen will run the guest in "shadow page
> > table"
> > +   mode where the guest's page table updates and/or TLB flushes
> > +   etc. will be emulated.  Use of HAP is the default when available.

Yep.  Might be worth mentioning that HAP is called EPT and NPT (or RVI)
by the hardware vendors.

> > + * `oos=BOOLEAN`: Turns "out of sync pagetables" on or off.  When
> > +   running in shadow page table mode, the guest's page table updates
> > +   may be deferred as specified in the Intel/AMD architecture
> > manuals.
> > +   However this may expose unexpected bugs in the guest, or find bugs
> > +   in Xen, so it is possible to disable this feature.  Use of out of
> > +   sync page tables, when Xen thinks it appropriate, is the default.

Yep. 

> > + * `shadow_memory=MBYTES`: Number of megabytes to set aside for
> > +   shadowing guest pagetable pages (effectively acting as a cache of
> > +   translated pages) or to use for HAP state. By default this is 1MB
> > +   per guest vcpu plus 8KB per MB of guest RAM. You should not
> > +   normally need to adjust this value. However if you are not using
> > +   hardware assisted paging (i.e. you are using shadow mode) and your
> > +   guest workload consists of a large number of processes which do
> > not
> > +   share address space then increasing this value may improve
> > +   performance. 

Actually in the bad case the processes _do_ share address space
(otherwise the guest would be thrashing for RAM before it rnus out of
shadow memory).  Maybe 'a very large number of similar processes'?

Cheers,

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 01:56:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 01:56:50 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RORNK-0004e6-RC; Thu, 10 Nov 2011 01:56:50 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RORLQ-00047O-Vl
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 01:54:53 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1320918889!2562994!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1975 invoked from network); 10 Nov 2011 09:54:49 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-12.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 09:54:49 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 10 Nov 2011 09:54:49 +0000
Message-Id: <4EBBAD770200007800060155@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 10 Nov 2011 09:54:47 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jean Guyader" <jean.guyader@eu.citrix.com>
References: <1320914644-4357-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-5-git-send-email-jean.guyader@eu.citrix.com>
In-Reply-To: <1320914644-4357-5-git-send-email-jean.guyader@eu.citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: keir@xen.org, xen-devel@lists.xensource.com, allen.m.kay@intel.com,
	tim@xen.org
Subject: [Xen-devel] Re: [PATCH 4/6] mm: New XENMEM space,
	XENMAPSPACE_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 09:44, Jean Guyader <jean.guyader@eu.citrix.com> wrote:

In the native implementation I neither see the XENMAPSPACE_gmfn_range
case getting actually handled in the main switch (did you mean to change
xatp.space to XENMAPSPACE_gmfn in that case?), nor do I see how you
communicate back how many of the pages were successfully processed in
the event of an error in the middle of the processing or when a
continuation is required.

But with the patch being pretty hard to read, maybe I'm simply
overlooking something?

Further (I realize I should have commented on this earlier) I think that
in order to allow forward progress you should not check for preemption
on the very first iteration of each (re-)invocation. That would also
guarantee no behavioral change to the original single-page variants.

>--- a/xen/arch/x86/x86_64/compat/mm.c
>+++ b/xen/arch/x86/x86_64/compat/mm.c
>@@ -63,6 +63,16 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void=
) arg)
>=20
>         XLAT_add_to_physmap(nat, &cmp);
>         rc =3D arch_memory_op(op, guest_handle_from_ptr(nat, void));
>+        if ( rc < 0 )
>+            return rc;
>+
>+        if ( rc =3D=3D __HYPERVISOR_memory_op )
>+            hypercall_xlat_continuation(NULL, 0x2, nat, arg);
>+
>+        XLAT_add_to_physmap(&cmp, nat);
>+
>+        if ( copy_to_guest(arg, &cmp, 1) )
>+            return -EFAULT;

Other than in the XENMEM_[gs]et_pod_target you (so far, subject to the
above comment resulting in a behavioral change) don't have any real
outputs here, and hence there's no need to always to the outbound
translation - i.e. all of this could be moved into the if ()'s body.

Jan

>=20
>         break;
>     }


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 02:00:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 02:00:06 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RORQQ-0005Aq-RY; Thu, 10 Nov 2011 02:00:04 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROROh-0004xZ-Ox
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 01:58:16 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1320919092!2971835!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16913 invoked from network); 10 Nov 2011 09:58:12 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 09:58:12 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8857065"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 09:58:11 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Thu, 10 Nov 2011 09:58:11 +0000
Subject: Re: [Xen-devel] [PATCH 3 of 7] docs: add a document describing the
	xl cfg file syntax\
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Tim Deegan <tim@xen.org>
Date: Thu, 10 Nov 2011 09:58:11 +0000
In-Reply-To: <20111110095428.GA62117@ocelot.phlegethon.org>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
	<291f6cb0d03e56e4edbe.1320678792@cosworth.uk.xensource.com>
	<1320912604.16747.110.camel@dagon.hellion.org.uk>
	<20111110095428.GA62117@ocelot.phlegethon.org>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320919091.955.204.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: George Dunlap <George.Dunlap@eu.citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, Ian
	Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-11-10 at 09:54 +0000, Tim Deegan wrote:
> At 08:10 +0000 on 10 Nov (1320912604), Ian Campbell wrote:
> > Tim, George:
> > 
> > Is this broadly accurate? In particular the bit about why one would use
> > the shadow_memory option and the suggestion that it also controls the
> > space used by the HAP overhead.
> > 
> > Cheers,
> > Ian.
> > 
> > On Mon, 2011-11-07 at 15:13 +0000, Ian Campbell wrote:
> > > 
> > > +### Paging
> > > +
> > > +The following options control the mechanisms used to virtualise guest
> > > +memory.  The defaults are selected to give the best results for the
> > > +common case and so you should normally leave these options
> > > +unspecified.
> > > +
> > > + * `hap=BOOLEAN`: Turns "hardware assisted paging" (the use of the
> > > +   hardware' nested page table feature) on or off.  Affects HVM
> > > guests
> > > +   only.  If turned off, Xen will run the guest in "shadow page
> > > table"
> > > +   mode where the guest's page table updates and/or TLB flushes
> > > +   etc. will be emulated.  Use of HAP is the default when available.
> 
> Yep.  Might be worth mentioning that HAP is called EPT and NPT (or RVI)
> by the hardware vendors.

Good idea. Since I had to look them up:
EPT -- Extended Page Tables (Intel)
NPT -- Nested Page Tables (AMD)
RVI -- Rapid Virtualisation Indexing (vmware's name, I think?)

> 
> > > + * `oos=BOOLEAN`: Turns "out of sync pagetables" on or off.  When
> > > +   running in shadow page table mode, the guest's page table updates
> > > +   may be deferred as specified in the Intel/AMD architecture
> > > manuals.
> > > +   However this may expose unexpected bugs in the guest, or find bugs
> > > +   in Xen, so it is possible to disable this feature.  Use of out of
> > > +   sync page tables, when Xen thinks it appropriate, is the default.
> 
> Yep. 
> 
> > > + * `shadow_memory=MBYTES`: Number of megabytes to set aside for
> > > +   shadowing guest pagetable pages (effectively acting as a cache of
> > > +   translated pages) or to use for HAP state. By default this is 1MB
> > > +   per guest vcpu plus 8KB per MB of guest RAM. You should not
> > > +   normally need to adjust this value. However if you are not using
> > > +   hardware assisted paging (i.e. you are using shadow mode) and your
> > > +   guest workload consists of a large number of processes which do
> > > not
> > > +   share address space then increasing this value may improve
> > > +   performance. 
> 
> Actually in the bad case the processes _do_ share address space
> (otherwise the guest would be thrashing for RAM before it rnus out of
> shadow memory).  Maybe 'a very large number of similar processes'?

Sounds fine, thanks!

> 
> Cheers,
> 
> Tim.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 02:12:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 02:12:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RORcD-0005hu-Sg; Thu, 10 Nov 2011 02:12:14 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RORak-0005UV-Uh
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 02:10:43 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320919810!52532065!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21480 invoked from network); 10 Nov 2011 10:10:10 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 10:10:10 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8857455"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 10:10:12 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 10:10:13 +0000
Date: Thu, 10 Nov 2011 10:10:46 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Re: Linux Stubdom Problem
In-Reply-To: <20111109170538.GA987@phenom.dumpdata.com>
Message-ID: <alpine.DEB.2.00.1111101005140.3519@kaball-desktop>
References: <alpine.DEB.2.00.1109021401000.12963@kaball-desktop>
	<CA8694A1.20379%keir.xen@gmail.com>
	<CAJ0pt17eoZbEnmziLaSd1Cxi+sU90rJ-c8TSgt+ikE3wZj1jhA@mail.gmail.com>
	<alpine.DEB.2.00.1109151110020.12963@kaball-desktop>
	<CAJ0pt15daSuXGi_8T3NS53E2Xv0bYV90b94100Wi6ajt99gedQ@mail.gmail.com>
	<alpine.DEB.2.00.1111081412270.3519@kaball-desktop>
	<20111109170538.GA987@phenom.dumpdata.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: Ian, Jeremy Fitzhardinge <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Campbell <Ian.Campbell@citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	"Tim \(Xen.org\)" <tim@xen.org>, Anthony PERARD <anthony.perard@gmail.com>,
	Keir Fraser <keir.xen@gmail.com>, Jiageng Yu <yujiageng734@gmail.com>,
	"Samuel@rcsinet13.oracle.com" <Samuel@rcsinet13.oracle.com>,
	Thibault <samuel.thibault@ens-lyon.org>,
	"Konrad@rcsinet13.oracle.com" <Konrad@rcsinet13.oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 9 Nov 2011, Konrad Rzeszutek Wilk wrote:
> > The real fix should something along these lines:
> > 
> > 
> > 
> > diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
> > index 3dd53f9..f2fadfc 100644
> > --- a/arch/x86/xen/mmu.c
> > +++ b/arch/x86/xen/mmu.c
> > @@ -422,7 +422,7 @@ static pteval_t xen_pte_val(pte_t pte)
> >  		pteval = (pteval & ~_PAGE_PAT) | _PAGE_PWT;
> >  	}
> >  
> > -	if (xen_initial_domain() && (pteval & _PAGE_IOMAP))
> > +	if (pteval & _PAGE_IOMAP)
> >  		return pteval;
> >  
> >  	return pte_mfn_to_pfn(pteval);
> > @@ -483,8 +483,7 @@ static pte_t xen_make_pte(pteval_t pte)
> >  	 * mappings are just dummy local mappings to keep other
> >  	 * parts of the kernel happy.
> >  	 */
> > -	if (unlikely(pte & _PAGE_IOMAP) &&
> > -	    (xen_initial_domain() || addr >= ISA_END_ADDRESS)) {
> > +	if (unlikely(pte & _PAGE_IOMAP)) {
> >  		pte = iomap_pte(pte);
> >  	} else {
> >  		pte &= ~_PAGE_IOMAP;
> > ---
> > 
> > Could you please confirm whether this patch fixes your problem?
> > 
> > Konrad, do you know if this could have any unintended consequences?
> > I don't think it can be a problem security wise because Xen is going to
> > do all the permission checks anyway.
> > The only problem I can see is if a domU is going to call xen_make_pte
> > with _PAGE_IOMAP and a pfn->mfn translation is supposed to happen.
> 
> I am not sure. I think I tried this at some point but ran in some problems, but
> I can't recall which ones. Let me stick this in my #testing branch and see how it
> fares with Dom0/DomU/DomU PCI/ etc.


Actually the patch above caused troubles at boot time because when the
guest tries to map memory below ISA_END_ADDRESS pfns don't get converted
to mfns anymore.
I ended up suggesting to modify remap_area_mfn_pte_fn instead, see patch
below.

---

Use native_make_pte in remap_area_mfn_pte_fn because
remap_area_mfn_pte_fn gets always called with _PAGE_IOMAP set so no
pfn->mfn translations are necessary. At the same time
xen_initial_domain() returns false in stubdoms so if we are trying to
remap memory < ISA_END_ADDRESS from another guest xen_make_pte would
force a pfn->mfn translation.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
index 3dd53f9..f628441 100644
--- a/arch/x86/xen/mmu.c
+++ b/arch/x86/xen/mmu.c
@@ -2350,10 +2350,19 @@ static int remap_area_mfn_pte_fn(pte_t *ptep, pgtable_t token,
 				 unsigned long addr, void *data)
 {
 	struct remap_data *rmd = data;
-	pte_t pte = pte_mkspecial(pfn_pte(rmd->mfn++, rmd->prot));
-
+	/* Use the native_make_pte function because we are sure we don't
+	 * have to do any pfn->mfn translations but at the same time we
+	 * could in a stubdom so xen_initial_domain() would return false. */
+	pte_t pte = pte_mkspecial(native_make_pte(((phys_addr_t)(rmd->mfn++)
+					<< PAGE_SHIFT) | massage_pgprot(rmd->prot)));
+	pteval_t val = pte_val_ma(pte);
+
+	if (pat_enabled && !WARN_ON(val & _PAGE_PAT)) {
+		if ((val & (_PAGE_PCD | _PAGE_PWT)) == _PAGE_PWT)
+			val = (val & ~(_PAGE_PCD | _PAGE_PWT)) | _PAGE_PAT;
+	}
 	rmd->mmu_update->ptr = virt_to_machine(ptep).maddr;
-	rmd->mmu_update->val = pte_val_ma(pte);
+	rmd->mmu_update->val = val;
 	rmd->mmu_update++;
 
 	return 0;


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 02:13:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 02:13:30 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RORdS-00065j-9R; Thu, 10 Nov 2011 02:13:30 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RORbe-0005aX-Vw
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 02:11:39 -0800
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-14.tower-216.messagelabs.com!1320919895!2989329!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19970 invoked from network); 10 Nov 2011 10:11:36 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-14.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 10:11:36 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RORbb-000GNG-Ij; Thu, 10 Nov 2011 10:11:35 +0000
Date: Thu, 10 Nov 2011 10:11:35 +0000
From: Tim Deegan <tim@xen.org>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 3 of 7] docs: add a document describing the xl
	cfg file syntax\
Message-ID: <20111110101135.GB62117@ocelot.phlegethon.org>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
	<291f6cb0d03e56e4edbe.1320678792@cosworth.uk.xensource.com>
	<1320912604.16747.110.camel@dagon.hellion.org.uk>
	<20111110095428.GA62117@ocelot.phlegethon.org>
	<1320919091.955.204.camel@zakaz.uk.xensource.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <1320919091.955.204.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.4.2.1i
Cc: George Dunlap <George.Dunlap@eu.citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 09:58 +0000 on 10 Nov (1320919091), Ian Campbell wrote:
> > Yep.  Might be worth mentioning that HAP is called EPT and NPT (or RVI)
> > by the hardware vendors.
> 
> Good idea. Since I had to look them up:
> EPT -- Extended Page Tables (Intel)
> NPT -- Nested Page Tables (AMD)
> RVI -- Rapid Virtualisation Indexing (vmware's name, I think?)

RVI is AMD's marketing name for NPT, I think, but it never made it into
the technical manuals.  

VMware doesn't really have a generic name for HAP; they call it
'hardware MMU' in some docs but EPT/RVI in their UI.  Microsoft calls it
SLAT (?!) for Second-Level Address Translation.

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 02:14:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 02:14:29 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROReO-0006TW-FU; Thu, 10 Nov 2011 02:14:28 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RORdD-0005zA-B7
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 02:13:16 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1320919990!999332!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6618 invoked from network); 10 Nov 2011 10:13:12 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-9.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 10:13:12 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315195200"; d="scan'208";a="18981361"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 05:12:56 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.65) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 05:12:55 -0500
Received: from cosworth.uk.xensource.com (cosworth.uk.xensource.com
	[10.80.16.52])	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	pAAACrjI021920;	Thu, 10 Nov 2011 02:12:54 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: ecf11c010610c30e8be0f3f567e417680c51e527
Message-ID: <ecf11c010610c30e8be0.1320919973@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 10 Nov 2011 10:12:53 +0000
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: waldi@debian.org, ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH] tools: use system installed libaio by default
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1320919937 0
# Node ID ecf11c010610c30e8be0f3f567e417680c51e527
# Parent  31eee4e06a2010c16750fc51f74459542a0b12a4
tools: use system installed libaio by default.

I could have sworn I did this years ago.

IIRC the need for our own copy was due to the use of io_set_eventfd which is
not present in version 0.3.106. However it is in 0.3.107 the first version of
which was uploaded to Debian in June 2008 (I can't find a better reference for
the release date).

The necessary version is available in Debian Lenny onwards and is in at least
RHEL 6, Fedora 13 and OpenSuSE 11.3. The necessary version appears to not be
available in RHEL 5 or SLES 11 which is why I haven't simply nuked the in tree
version.

This is based on tools-system-libaio.diff from the Debian packaging although I
have made it optional (but default on).

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 31eee4e06a20 -r ecf11c010610 Config.mk
--- a/Config.mk	Thu Nov 10 08:04:16 2011 +0000
+++ b/Config.mk	Thu Nov 10 10:12:17 2011 +0000
@@ -225,6 +225,7 @@ PYTHON_TOOLS       ?= y
 OCAML_TOOLS        ?= y
 CONFIG_MINITERM    ?= n
 CONFIG_LOMOUNT     ?= n
+CONFIG_SYSTEM_LIBAIO ?= y
 
 ifeq ($(OCAML_TOOLS),y)
 OCAML_TOOLS := $(shell ocamlopt -v > /dev/null 2>&1 && echo "y" || echo "n")
diff -r 31eee4e06a20 -r ecf11c010610 README
--- a/README	Thu Nov 10 08:04:16 2011 +0000
+++ b/README	Thu Nov 10 10:12:17 2011 +0000
@@ -48,6 +48,8 @@ provided by your OS distributor:
     * Development install of x11 (e.g. xorg-x11-dev)
     * Development install of uuid (e.g. uuid-dev)
     * Development install of yajl (e.g. libyajl-dev)
+    * Development install of libaio (e.g. libaio-dev) version 0.3.107 or
+      greater. Set CONFIG_SYSTEM_LIBAIO in .config if this is not available.
     * bridge-utils package (/sbin/brctl)
     * iproute package (/sbin/ip)
     * hotplug or udev
diff -r 31eee4e06a20 -r ecf11c010610 tools/Makefile
--- a/tools/Makefile	Thu Nov 10 08:04:16 2011 +0000
+++ b/tools/Makefile	Thu Nov 10 10:12:17 2011 +0000
@@ -1,6 +1,10 @@
 XEN_ROOT = $(CURDIR)/..
 include $(XEN_ROOT)/tools/Rules.mk
 
+ifneq ($(CONFIG_SYSTEM_LIBAIO),y)
+SUBDIRS-libaio := libaio
+endif
+
 SUBDIRS-y :=
 SUBDIRS-y += check
 SUBDIRS-y += include
@@ -18,11 +22,11 @@ SUBDIRS-y += xenmon
 SUBDIRS-$(VTPM_TOOLS) += vtpm_manager
 SUBDIRS-$(VTPM_TOOLS) += vtpm
 SUBDIRS-y += xenstat
-SUBDIRS-$(CONFIG_Linux) += libaio
+SUBDIRS-$(CONFIG_Linux) += $(SUBDIRS-libaio)
 SUBDIRS-$(CONFIG_Linux) += memshr 
 SUBDIRS-$(CONFIG_Linux) += blktap
 SUBDIRS-$(CONFIG_Linux) += blktap2
-SUBDIRS-$(CONFIG_NetBSD) += libaio
+SUBDIRS-$(CONFIG_NetBSD) += $(SUBDIRS-libaio)
 SUBDIRS-$(CONFIG_NetBSD) += blktap2
 SUBDIRS-$(CONFIG_NetBSD) += xenbackendd
 SUBDIRS-y += libfsimage
diff -r 31eee4e06a20 -r ecf11c010610 tools/blktap2/drivers/Makefile
--- a/tools/blktap2/drivers/Makefile	Thu Nov 10 08:04:16 2011 +0000
+++ b/tools/blktap2/drivers/Makefile	Thu Nov 10 10:12:17 2011 +0000
@@ -14,7 +14,6 @@ CFLAGS    += -Wno-unused
 CFLAGS    += -fno-strict-aliasing
 CFLAGS    += -I$(BLKTAP_ROOT)/include -I$(BLKTAP_ROOT)/drivers
 CFLAGS    += $(CFLAGS_libxenctrl)
-CFLAGS    += -I $(LIBAIO_DIR)
 CFLAGS    += -I $(MEMSHR_DIR)
 CFLAGS    += -D_GNU_SOURCE
 CFLAGS    += -DUSE_NFS_LOCKS
@@ -30,7 +29,15 @@ REMUS-OBJS  += hashtable.o
 REMUS-OBJS  += hashtable_itr.o
 REMUS-OBJS  += hashtable_utility.o
 
+ifneq ($(CONFIG_SYSTEM_LIBAIO),y)
+CFLAGS    += -I $(LIBAIO_DIR)
 LIBAIO_DIR = $(XEN_ROOT)/tools/libaio/src
+tapdisk2 tapdisk-stream tapdisk-diff $(QCOW_UTIL): AIOLIBS := $(LIBAIO_DIR)/libaio.a 
+tapdisk-client tapdisk-stream tapdisk-diff $(QCOW_UTIL): CFLAGS  += -I$(LIBAIO_DIR)
+else
+tapdisk2 tapdisk-stream tapdisk-diff $(QCOW_UTIL): AIOLIBS := -laio
+endif
+
 MEMSHR_DIR = $(XEN_ROOT)/tools/memshr
 
 MEMSHRLIBS :=
@@ -39,9 +46,6 @@ CFLAGS += -DMEMSHR
 MEMSHRLIBS += $(MEMSHR_DIR)/libmemshr.a
 endif
 
-tapdisk2 tapdisk-stream tapdisk-diff $(QCOW_UTIL): AIOLIBS := $(LIBAIO_DIR)/libaio.a 
-tapdisk-client tapdisk-stream tapdisk-diff $(QCOW_UTIL): CFLAGS  += -I$(LIBAIO_DIR)
-
 ifeq ($(VHD_STATIC),y)
 td-util: CFLAGS += -static
 endif

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 02:15:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 02:15:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RORfL-0006qo-8S; Thu, 10 Nov 2011 02:15:27 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RORdd-00068N-QZ
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 02:13:42 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1320920018!2989742!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27948 invoked from network); 10 Nov 2011 10:13:38 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 10:13:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8857594"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 10:13:38 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Thu, 10 Nov 2011 10:13:38 +0000
Subject: Re: [Xen-devel] [PATCH 3 of 7] docs: add a document describing the
	xl cfg file syntax\
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Tim Deegan <tim@xen.org>
Date: Thu, 10 Nov 2011 10:13:38 +0000
In-Reply-To: <20111110101135.GB62117@ocelot.phlegethon.org>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
	<291f6cb0d03e56e4edbe.1320678792@cosworth.uk.xensource.com>
	<1320912604.16747.110.camel@dagon.hellion.org.uk>
	<20111110095428.GA62117@ocelot.phlegethon.org>
	<1320919091.955.204.camel@zakaz.uk.xensource.com>
	<20111110101135.GB62117@ocelot.phlegethon.org>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320920018.955.205.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: George Dunlap <George.Dunlap@eu.citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, Ian
	Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-11-10 at 10:11 +0000, Tim Deegan wrote:
> At 09:58 +0000 on 10 Nov (1320919091), Ian Campbell wrote:
> > > Yep.  Might be worth mentioning that HAP is called EPT and NPT (or RVI)
> > > by the hardware vendors.
> > 
> > Good idea. Since I had to look them up:
> > EPT -- Extended Page Tables (Intel)
> > NPT -- Nested Page Tables (AMD)
> > RVI -- Rapid Virtualisation Indexing (vmware's name, I think?)
> 
> RVI is AMD's marketing name for NPT, I think, but it never made it into
> the technical manuals.  

Thanks, Google spat out some vmware docs as the first hit. I'll include
both names.

> VMware doesn't really have a generic name for HAP; they call it
> 'hardware MMU' in some docs but EPT/RVI in their UI.  Microsoft calls it
> SLAT (?!) for Second-Level Address Translation.

Nice.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 02:19:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 02:19:45 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RORjV-0007Ha-IX; Thu, 10 Nov 2011 02:19:45 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RORiU-00074S-Fl
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 02:18:42 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1320920202!43787605!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16617 invoked from network); 10 Nov 2011 10:16:42 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 10:16:42 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8857806"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 10:18:38 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 10:18:38 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RORiQ-0008Tt-18;
	Thu, 10 Nov 2011 10:18:38 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RORiG-0005w7-TQ;
	Thu, 10 Nov 2011 10:18:28 +0000
Date: Thu, 10 Nov 2011 10:18:28 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <20111110101828.GA22792@spongy.cam.xci-test.com>
References: <1320914644-4357-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-5-git-send-email-jean.guyader@eu.citrix.com>
	<4EBBAD770200007800060155@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
In-Reply-To: <4EBBAD770200007800060155@nat28.tlf.novell.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: "Keir \(Xen.org\)" <keir@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"allen.m.kay@intel.com" <allen.m.kay@intel.com>,
	Jean Guyader <Jean.Guyader@citrix.com>, "Tim \(Xen.org\)" <tim@xen.org>
Subject: [Xen-devel] Re: [PATCH 4/6] mm: New XENMEM space,
	XENMAPSPACE_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 10/11 09:54, Jan Beulich wrote:
> >>> On 10.11.11 at 09:44, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> 
> In the native implementation I neither see the XENMAPSPACE_gmfn_range
> case getting actually handled in the main switch (did you mean to change
> xatp.space to XENMAPSPACE_gmfn in that case?), nor do I see how you
> communicate back how many of the pages were successfully processed in
> the event of an error in the middle of the processing or when a
> continuation is required.
> 

Yes, that is true. 

> But with the patch being pretty hard to read, maybe I'm simply
> overlooking something?
> 

Sorry about that, moving code arround doesn't really look code
on patches.

I now changed xenmem_add_to_physmap to take a pointer
on xatp so I can modify the argument directly (decrementing size and
incrementing gpfn and idx).
Then if xenmem_add_to_physmap return EGAIN I'll copy xtap back to
the guest handler and create the native continuation.
Also a case was missing for XENMAPSPACE_gmfn_range in xenmem_add_to_physmap.

> Further (I realize I should have commented on this earlier) I think that
> in order to allow forward progress you should not check for preemption
> on the very first iteration of each (re-)invocation. That would also
> guarantee no behavioral change to the original single-page variants.
> 

Agreed, I now only check for preemption in the case of new space
(XENMAPSPACE_gmfn_range), so the original behavior should be preserved.

> >--- a/xen/arch/x86/x86_64/compat/mm.c
> >+++ b/xen/arch/x86/x86_64/compat/mm.c
> >@@ -63,6 +63,16 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
> > 
> >         XLAT_add_to_physmap(nat, &cmp);
> >         rc = arch_memory_op(op, guest_handle_from_ptr(nat, void));
> >+        if ( rc < 0 )
> >+            return rc;
> >+
> >+        if ( rc == __HYPERVISOR_memory_op )
> >+            hypercall_xlat_continuation(NULL, 0x2, nat, arg);
> >+
> >+        XLAT_add_to_physmap(&cmp, nat);
> >+
> >+        if ( copy_to_guest(arg, &cmp, 1) )
> >+            return -EFAULT;
> 
> Other than in the XENMEM_[gs]et_pod_target you (so far, subject to the
> above comment resulting in a behavioral change) don't have any real
> outputs here, and hence there's no need to always to the outbound
> translation - i.e. all of this could be moved into the if ()'s body.
> 

Done.

Thanks for the review,
Jean

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 02:21:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 02:21:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RORkv-0007fY-W2; Thu, 10 Nov 2011 02:21:14 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RORic-000752-Er
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 02:18:50 -0800
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-10.tower-27.messagelabs.com!1320920297!43370433!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15567 invoked from network); 10 Nov 2011 10:18:17 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-10.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 10 Nov 2011 10:18:17 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320920326; l=1634;
	s=domk; d=aepfle.de;
	h=In-Reply-To:Content-Type:MIME-Version:References:Subject:Cc:To:From:
	Date:X-RZG-CLASS-ID:X-RZG-AUTH;
	bh=MjFXFvCXKDKfavzefS4AR3TbjSg=;
	b=YNpm1d0EUKqoVhpBh7Srq5W2b54+myZR8VGzga8ywBGWMMVxW1jLk9+I24qnfsTTxFe
	MLUnlZRXnCtxzs4CSzXs6IxjLiaZjYYZuB+zZO4teqAmozairWMPL7+6quUcdEySolUOf
	2BU4QkFeT/fl7rjmfhrfypyGLpAd9Tr1kxA=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV454=
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-9.vodafone-net.de [80.226.24.9])
	by smtp.strato.de (klopstock mo47) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id K05114nAA8U47w ;
	Thu, 10 Nov 2011 11:18:30 +0100 (MET)
Received: by probook.site (Postfix, from userid 1000)
	id 4CE5918638; Thu, 10 Nov 2011 11:18:28 +0100 (CET)
Date: Thu, 10 Nov 2011 11:18:28 +0100
From: Olaf Hering <olaf@aepfle.de>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Message-ID: <20111110101828.GA31293@aepfle.de>
References: <20111108224414.83985CF73A@homiemail-mx7.g.dreamhost.com>
	<3c097da8e49a42af1210e4ffcd39fd48.squirrel@webmail.lagarcavilla.org>
	<20111109070927.GB26154@aepfle.de>
	<0bb01a4d216a68c4ae8441b037927f61.squirrel@webmail.lagarcavilla.org>
	<20111109221148.GA17166@aepfle.de>
	<5d7d38b18271fcc7aa750604eeb52bbd.squirrel@webmail.lagarcavilla.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <5d7d38b18271fcc7aa750604eeb52bbd.squirrel@webmail.lagarcavilla.org>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
Cc: keir.xen@gmail.com, xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: Need help with fixing the Xen waitqueue feature
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Nov 09, Andres Lagar-Cavilla wrote:

> Olaf,
> > On Wed, Nov 09, Andres Lagar-Cavilla wrote:
> >
> >> After a bit of thinking, things are far more complicated. I don't think
> >> this is a "race." If the pager removed a page that later gets scheduled
> >> by
> >> the guest OS for IO, qemu will want to foreign-map that. With the
> >> hypervisor returning ENOENT, the foreign map will fail, and there goes
> >> qemu.
> >
> > The tools are supposed to catch ENOENT and try again.
> > linux_privcmd_map_foreign_bulk() does that. linux_gnttab_grant_map()
> > appears to do that as well. What code path uses qemu that leads to a
> > crash?
> 
> The tools retry as long as IOCTL_PRIVCMD_MMAPBATCH_V2 is supported. Which
> it isn't on mainline linux 3.0, 3.1, etc. Which dom0 kernel are you using?

I'm running SLES11 as dom0. Now thats really odd that there is no ENOENT
handling in mainline, I will go and check the code.

> And for backend drivers implemented in the kernel (netback, etc), there is
> no retrying.

A while ago I fixed the grant status handling, perhaps that change was
never forwarded to pvops, at least I didnt do it at that time.

> I'm using 24066:54a5e994a241. I start windows 7, make xenpaging try to
> evict 90% of the RAM, qemu lasts for about two seconds. Linux fights
> harder, but qemu also dies. No pv drivers. I haven't been able to trace
> back the qemu crash (segfault on a NULL ide_if field for a dma callback)
> to the exact paging action yet, but no crashes without paging.

If the kernel is pvops it may need some audit to check the ENOENT
handling.

Olaf

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 02:23:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 02:23:24 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RORn2-00089v-QG; Thu, 10 Nov 2011 02:23:24 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RORik-00076d-7x
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 02:18:58 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1320920334!999121!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9697 invoked from network); 10 Nov 2011 10:18:55 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-12.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 10:18:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8857814"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 10:18:54 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 10:18:54 +0000
Date: Thu, 10 Nov 2011 10:19:27 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Jiageng Yu <yujiageng734@gmail.com>
Subject: Re: [Xen-devel] Re: Linux Stubdom Problem
In-Reply-To: <CAJ0pt15HEYGkXXR00tkyc6FXwt7eGKi-0yGo67y=UeWEuNrbTg@mail.gmail.com>
Message-ID: <alpine.DEB.2.00.1111091656060.3519@kaball-desktop>
References: <alpine.DEB.2.00.1109021401000.12963@kaball-desktop>
	<CA8694A1.20379%keir.xen@gmail.com>
	<CAJ0pt17eoZbEnmziLaSd1Cxi+sU90rJ-c8TSgt+ikE3wZj1jhA@mail.gmail.com>
	<alpine.DEB.2.00.1109151110020.12963@kaball-desktop>
	<CAJ0pt15daSuXGi_8T3NS53E2Xv0bYV90b94100Wi6ajt99gedQ@mail.gmail.com>
	<alpine.DEB.2.00.1111081412270.3519@kaball-desktop>
	<CAJ0pt154u9GY-6x6ZJA2UDyfgE135hZkr27XHnJ2ooaaNtTEmw@mail.gmail.com>
	<alpine.DEB.2.00.1111091340110.3519@kaball-desktop>
	<CAJ0pt15HEYGkXXR00tkyc6FXwt7eGKi-0yGo67y=UeWEuNrbTg@mail.gmail.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Content-ID: <alpine.DEB.2.00.1111091710451.3519@kaball-desktop>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Keir Fraser <keir.xen@gmail.com>, Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	"Tim \(Xen.org\)" <tim@xen.org>, Konrad, Samuel,
	Anthony PERARD <anthony.perard@gmail.com>,
	Thibault <samuel.thibault@ens-lyon.org>,
	Ian Campbell <Ian.Campbell@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 9 Nov 2011, Jiageng Yu wrote:
> The keyboard driver is OK now. I am working on network device. In
> linux stubdom, I have udev, ifconfig and brctl tools. After udevd
> started, stubdom executes "ifconfig eth0 IPadderss netmask netgate up"
> to setup the network. When qemu in stubdom creates a tapxx interface
> for hvm guest,  the script should be executed to build a net bridge.
> 
>       /sbin/brctl addbr eth0
>       /sbin/brctl addif eth0 tapXX
> 
> Therefore, the hvm guest has the network device. Is this plan
> reasonable? Or have better one?

The bridge should be called xenbr0, the stubdom's network interface
(that should probably called eth0) should be added to the bridge at boot
time.

Like you said, when qemu starts is going to create a tap interface, on
Linux usually we rely on a udev script to add the tap interface to the
bridge. The script is tools/hotplug/Linux/vif-setup, that calls
tools/hotplug/Linux/vif-bridge.

So at the end you have:

xenbr0 (bridge)
||
|+-------------------------------+
|                                |
eth0                             |
(stubdom network interface)      tapXX
                                 (qemu's tap interface)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 02:24:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 02:24:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RORnz-00005Y-KB; Thu, 10 Nov 2011 02:24:23 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RORkY-0007XL-EL
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 02:20:51 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1320920446!2990573!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14935 invoked from network); 10 Nov 2011 10:20:47 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 10:20:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8857877"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 10:20:29 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 10:20:29 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RORkC-0008UX-MM;
	Thu, 10 Nov 2011 10:20:28 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RORk3-0005wO-IW;
	Thu, 10 Nov 2011 10:20:19 +0000
Date: Thu, 10 Nov 2011 10:20:19 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: Tim Deegan <tim@xen.org>
Message-ID: <20111110102019.GB22792@spongy.cam.xci-test.com>
References: <1320914644-4357-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-5-git-send-email-jean.guyader@eu.citrix.com>
	<4EBBAD770200007800060155@nat28.tlf.novell.com>
	<20111110101518.GC62117@ocelot.phlegethon.org>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
In-Reply-To: <20111110101518.GC62117@ocelot.phlegethon.org>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: "Keir \(Xen.org\)" <keir@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"allen.m.kay@intel.com" <allen.m.kay@intel.com>,
	Jean Guyader <Jean.Guyader@citrix.com>, Jan Beulich <JBeulich@suse.com>
Subject: [Xen-devel] Re: [PATCH 4/6] mm: New XENMEM space,
	XENMAPSPACE_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 10/11 10:15, Tim Deegan wrote:
> At 09:54 +0000 on 10 Nov (1320918887), Jan Beulich wrote:
> > >>> On 10.11.11 at 09:44, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> > 
> > In the native implementation I neither see the XENMAPSPACE_gmfn_range
> > case getting actually handled in the main switch (did you mean to change
> > xatp.space to XENMAPSPACE_gmfn in that case?), nor do I see how you
> > communicate back how many of the pages were successfully processed in
> > the event of an error in the middle of the processing or when a
> > continuation is required.
> > 
> > But with the patch being pretty hard to read, maybe I'm simply
> > overlooking something?
> 
> The patch changes the (compat-translated) hypercall arguments in place to
> reflect what's been done.  Agreed that it's particularly hard to read,
> though. 
> 

Actually no, because I'm not using the pointer in xenmem_add_to_physmap.

That will be part of the next series, and that will make the patch even
harder to read :(...

Jean

> Tim.
> 
> > Further (I realize I should have commented on this earlier) I think that
> > in order to allow forward progress you should not check for preemption
> > on the very first iteration of each (re-)invocation. That would also
> > guarantee no behavioral change to the original single-page variants.
> > 
> > >--- a/xen/arch/x86/x86_64/compat/mm.c
> > >+++ b/xen/arch/x86/x86_64/compat/mm.c
> > >@@ -63,6 +63,16 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
> > > 
> > >         XLAT_add_to_physmap(nat, &cmp);
> > >         rc = arch_memory_op(op, guest_handle_from_ptr(nat, void));
> > >+        if ( rc < 0 )
> > >+            return rc;
> > >+
> > >+        if ( rc == __HYPERVISOR_memory_op )
> > >+            hypercall_xlat_continuation(NULL, 0x2, nat, arg);
> > >+
> > >+        XLAT_add_to_physmap(&cmp, nat);
> > >+
> > >+        if ( copy_to_guest(arg, &cmp, 1) )
> > >+            return -EFAULT;
> > 
> > Other than in the XENMEM_[gs]et_pod_target you (so far, subject to the
> > above comment resulting in a behavioral change) don't have any real
> > outputs here, and hence there's no need to always to the outbound
> > translation - i.e. all of this could be moved into the if ()'s body.
> > 
> > Jan
> > 
> > > 
> > >         break;
> > >     }
> > 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 02:25:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 02:25:24 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RORox-0000TX-W6; Thu, 10 Nov 2011 02:25:24 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RORlL-0007lE-8B
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 02:21:39 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1320920496!2572937!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18331 invoked from network); 10 Nov 2011 10:21:36 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-9.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 10:21:36 -0000
Received: by wyh11 with SMTP id 11so3228784wyh.30
	for <xen-devel@lists.xensource.com>;
	Thu, 10 Nov 2011 02:21:36 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=G9E/nvy4Xkp9XZBHQAjsIm4vn8xh5X6SALdqm3HWKoE=;
	b=kBcAkJSjzIR8tBcgdVhqDV/Q6lARSf819bpTmq9wk6egyvs2AvIjht4FP/IhjWT+Zl
	3St2GTYlIsYcQ8HGW6eS5p5CkHXCwAijbwRZ1i4JLY2q7t++E+PpKMQBO/cNDiaDObwO
	M7fCotHQgBD0ro5FKKCoJAFl1kM8VHmkoszY0=
Received: by 10.180.76.175 with SMTP id l15mr7612102wiw.67.1320920496092;
	Thu, 10 Nov 2011 02:21:36 -0800 (PST)
Received: from [192.168.1.3] (host86-129-249-120.range86-129.btcentralplus.com.
	[86.129.249.120])
	by mx.google.com with ESMTPS id z5sm4555114wix.5.2011.11.10.02.21.34
	(version=SSLv3 cipher=OTHER); Thu, 10 Nov 2011 02:21:35 -0800 (PST)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 10 Nov 2011 10:21:31 +0000
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>, Jean Guyader <jean.guyader@eu.citrix.com>
Message-ID: <CAE1562B.33DB1%keir@xen.org>
Thread-Topic: [PATCH 4/6] mm: New XENMEM space, XENMAPSPACE_gmfn_range
Thread-Index: AcyfkoOr/QpFdSasKU+nwa+XQIwEqg==
In-Reply-To: <4EBBAD770200007800060155@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: tim@xen.org, xen-devel@lists.xensource.com, allen.m.kay@intel.com
Subject: [Xen-devel] Re: [PATCH 4/6] mm: New XENMEM space,
	XENMAPSPACE_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 10/11/2011 09:54, "Jan Beulich" <JBeulich@suse.com> wrote:

>>>> On 10.11.11 at 09:44, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> 
> In the native implementation I neither see the XENMAPSPACE_gmfn_range
> case getting actually handled in the main switch (did you mean to change
> xatp.space to XENMAPSPACE_gmfn in that case?), nor do I see how you
> communicate back how many of the pages were successfully processed in
> the event of an error in the middle of the processing or when a
> continuation is required.
> 
> But with the patch being pretty hard to read, maybe I'm simply
> overlooking something?
> 
> Further (I realize I should have commented on this earlier) I think that
> in order to allow forward progress you should not check for preemption
> on the very first iteration of each (re-)invocation. That would also
> guarantee no behavioral change to the original single-page variants.

There are plenty of other examples where we check for preemption before
doing any real work (eg. do_mmuext_op, do_mmu_update). I guess checking at
the end of the loop is a little bit better maybe. I'm not very bothered
either way.

 -- Keir

>> --- a/xen/arch/x86/x86_64/compat/mm.c
>> +++ b/xen/arch/x86/x86_64/compat/mm.c
>> @@ -63,6 +63,16 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void)
>> arg)
>> 
>>         XLAT_add_to_physmap(nat, &cmp);
>>         rc = arch_memory_op(op, guest_handle_from_ptr(nat, void));
>> +        if ( rc < 0 )
>> +            return rc;
>> +
>> +        if ( rc == __HYPERVISOR_memory_op )
>> +            hypercall_xlat_continuation(NULL, 0x2, nat, arg);
>> +
>> +        XLAT_add_to_physmap(&cmp, nat);
>> +
>> +        if ( copy_to_guest(arg, &cmp, 1) )
>> +            return -EFAULT;
> 
> Other than in the XENMEM_[gs]et_pod_target you (so far, subject to the
> above comment resulting in a behavioral change) don't have any real
> outputs here, and hence there's no need to always to the outbound
> translation - i.e. all of this could be moved into the if ()'s body.
> 
> Jan
> 
>> 
>>         break;
>>     }
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 02:27:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 02:27:16 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RORql-0000s2-TI; Thu, 10 Nov 2011 02:27:15 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RORqG-0000ff-VB
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 02:26:45 -0800
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-16.tower-216.messagelabs.com!1320920122!2966961!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7327 invoked from network); 10 Nov 2011 10:15:23 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-16.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 10:15:23 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RORfC-000GP0-I2; Thu, 10 Nov 2011 10:15:18 +0000
Date: Thu, 10 Nov 2011 10:15:18 +0000
From: Tim Deegan <tim@xen.org>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <20111110101518.GC62117@ocelot.phlegethon.org>
References: <1320914644-4357-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320914644-4357-5-git-send-email-jean.guyader@eu.citrix.com>
	<4EBBAD770200007800060155@nat28.tlf.novell.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4EBBAD770200007800060155@nat28.tlf.novell.com>
User-Agent: Mutt/1.4.2.1i
Cc: keir@xen.org, xen-devel@lists.xensource.com, allen.m.kay@intel.com,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH 4/6] mm: New XENMEM space,
	XENMAPSPACE_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 09:54 +0000 on 10 Nov (1320918887), Jan Beulich wrote:
> >>> On 10.11.11 at 09:44, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> 
> In the native implementation I neither see the XENMAPSPACE_gmfn_range
> case getting actually handled in the main switch (did you mean to change
> xatp.space to XENMAPSPACE_gmfn in that case?), nor do I see how you
> communicate back how many of the pages were successfully processed in
> the event of an error in the middle of the processing or when a
> continuation is required.
> 
> But with the patch being pretty hard to read, maybe I'm simply
> overlooking something?

The patch changes the (compat-translated) hypercall arguments in place to
reflect what's been done.  Agreed that it's particularly hard to read,
though. 

Tim.

> Further (I realize I should have commented on this earlier) I think that
> in order to allow forward progress you should not check for preemption
> on the very first iteration of each (re-)invocation. That would also
> guarantee no behavioral change to the original single-page variants.
> 
> >--- a/xen/arch/x86/x86_64/compat/mm.c
> >+++ b/xen/arch/x86/x86_64/compat/mm.c
> >@@ -63,6 +63,16 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
> > 
> >         XLAT_add_to_physmap(nat, &cmp);
> >         rc = arch_memory_op(op, guest_handle_from_ptr(nat, void));
> >+        if ( rc < 0 )
> >+            return rc;
> >+
> >+        if ( rc == __HYPERVISOR_memory_op )
> >+            hypercall_xlat_continuation(NULL, 0x2, nat, arg);
> >+
> >+        XLAT_add_to_physmap(&cmp, nat);
> >+
> >+        if ( copy_to_guest(arg, &cmp, 1) )
> >+            return -EFAULT;
> 
> Other than in the XENMEM_[gs]et_pod_target you (so far, subject to the
> above comment resulting in a behavioral change) don't have any real
> outputs here, and hence there's no need to always to the outbound
> translation - i.e. all of this could be moved into the if ()'s body.
> 
> Jan
> 
> > 
> >         break;
> >     }
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 02:28:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 02:28:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RORrv-0001FV-Hd; Thu, 10 Nov 2011 02:28:27 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RORrW-00012x-AC
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 02:28:02 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1320920879!1653198!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29969 invoked from network); 10 Nov 2011 10:27:59 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-13.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 10:27:59 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 10 Nov 2011 10:27:59 +0000
Message-Id: <4EBBB53D020000780006019D@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 10 Nov 2011 10:27:57 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Daniel Kiper" <dkiper@net-space.pl>
References: <20111110085821.GA15751@router-fw-old.local.net-space.pl>
In-Reply-To: <20111110085821.GA15751@router-fw-old.local.net-space.pl>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com, konrad.wilk@oracle.com
Subject: [Xen-devel] Re: An issue in xen_limit_pages_to_max_mfn() in
	Xenlinux Ver. 2.6.18
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 09:58, Daniel Kiper <dkiper@net-space.pl> wrote:
> Hi Jan,
>=20
> During work on kexec/kdump for Xen domU I found that
> xen_limit_pages_to_max_mfn() registers undo_limit_pages()
> destructor which breaks __free_pages(). When __free_pages()
> is called then at beginning of this function put_page_testzero()
> is called which decrements page count for given page. Later
> undo_limit_pages() destructor is called which once again
> calls __free_pages() and in consequence put_page_testzero()
> fails (BUG_ON() is called) because page count is 0.

Seems like (on newer kernels, where this is a VM_BUG_ON()) this was
never hit on a configuration with CONFIG_DEBUG_VM, and on the older
kernels the function was never used for memory that would get freed
later (only kexec uses it there).

> It could
> be easily fixed, however, after reviewing xen_limit_pages_to_max_mfn()
> I could not find any good reason for which undo_limit_pages()
> destructor is registered. Maybe it could be removed at all because
> all pages are freed when __free_pages() is called and in this
> case we do not care where they live. However, maybe I missed
> something important.

It does matter - otherwise, over time, we could exhaust memory
below a certain boundary in Xen. So I think we need to add an
init_page_count() call to undo_limit_pages().

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 02:36:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 02:36:58 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROS09-0001oV-CG; Thu, 10 Nov 2011 02:36:57 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RORzO-0001cG-S2
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 02:36:11 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1320921367!3632971!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19146 invoked from network); 10 Nov 2011 10:36:07 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 10:36:07 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8858483"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 10:36:06 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 10:36:06 +0000
Date: Thu, 10 Nov 2011 10:36:40 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Dan Magenheimer <dan.magenheimer@oracle.com>
Subject: RE: [Xen-devel] [PATCH 01/18] xl.pod.1: add a barebone description
	of tmem commands
In-Reply-To: <4eceba6c-dd2d-48a9-8f2d-646b150a24e6@default>
Message-ID: <alpine.DEB.2.00.1111101035590.3519@kaball-desktop>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
	<4eceba6c-dd2d-48a9-8f2d-646b150a24e6@default>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 9 Nov 2011, Dan Magenheimer wrote:
> > From: stefano.stabellini@eu.citrix.com [mailto:stefano.stabellini@eu.citrix.com]
> > Sent: Wednesday, November 09, 2011 9:51 AM
> > To: xen-devel@lists.xensource.com
> > Cc: Ian.Campbell@citrix.com; stefano.stabellini@eu.citrix.com
> > Subject: [Xen-devel] [PATCH 01/18] xl.pod.1: add a barebone description of tmem commands
> 
> Oops, sorry, I saw the request for this awhile ago but it got buried.
> 
> Should I wait until this is committed into xen-unstable
> and provide a patch with more description (in pod)?  Or
> do you want me to write some raw words that you can roll in
> to this patchset?
 
An incremental patch on top of this one would be fine

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 02:49:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 02:49:37 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROSCO-0002Nr-O3; Thu, 10 Nov 2011 02:49:37 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROSBd-0002B1-Mc
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 02:48:50 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1320922126!1004831!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5555 invoked from network); 10 Nov 2011 10:48:46 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-12.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 10:48:46 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 10 Nov 2011 10:48:46 +0000
Message-Id: <4EBBBA1B02000078000601C5@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 10 Nov 2011 10:48:43 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Keir Fraser" <keir@xen.org>
References: <4EBBAD770200007800060155@nat28.tlf.novell.com>
	<CAE1562B.33DB1%keir@xen.org>
In-Reply-To: <CAE1562B.33DB1%keir@xen.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: tim@xen.org, xen-devel@lists.xensource.com, allen.m.kay@intel.com,
	Jean Guyader <jean.guyader@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH 4/6] mm: New XENMEM space,
	XENMAPSPACE_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 11:21, Keir Fraser <keir@xen.org> wrote:
> On 10/11/2011 09:54, "Jan Beulich" <JBeulich@suse.com> wrote:
>> Further (I realize I should have commented on this earlier) I think =
that
>> in order to allow forward progress you should not check for preemption
>> on the very first iteration of each (re-)invocation. That would also
>> guarantee no behavioral change to the original single-page variants.
>=20
> There are plenty of other examples where we check for preemption before
> doing any real work (eg. do_mmuext_op, do_mmu_update).

And I never really liked that, because of the very potential to live lock.

> I guess checking at
> the end of the loop is a little bit better maybe. I'm not very bothered
> either way.

Yes, and then only if further iterations are needed.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 02:56:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 02:56:06 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROSIg-0002qX-9x; Thu, 10 Nov 2011 02:56:06 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROSI2-0002e4-RW
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 02:55:27 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1320922521!1009612!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4159 invoked from network); 10 Nov 2011 10:55:23 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-15.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 10:55:23 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315195200"; d="scan'208";a="170081979"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 05:55:21 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 05:55:21 -0500
Received: from cosworth.uk.xensource.com (cosworth.uk.xensource.com
	[10.80.16.52])	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	pAAAtJRt022018;	Thu, 10 Nov 2011 02:55:20 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: bc79b560aafa1e4dc42af00e6a326dc651b5636a
Message-ID: <bc79b560aafa1e4dc42a.1320922519@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 10 Nov 2011 10:55:19 +0000
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH] libxl: use named options for tsc_mode
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1320922479 0
# Node ID bc79b560aafa1e4dc42af00e6a326dc651b5636a
# Parent  460b507e15f864dd6712f5040e36538d6e076ae4
libxl: use named options for tsc_mode.

It seems that this knob is expoerted from the hypervisor as a raw
integer (no symbolic names) documented in xen/include/asm-x86. Propagating that
all the way to the end user is hardly friendly (it's bad enough in the
hypercall interface).

Add an enum at the libxl level with a hopefully descriptive set of names.
Deprecate the use of an integer in xl cfg files.

Signed-off-by: Ian Campbell

diff -r 460b507e15f8 -r bc79b560aafa docs/user/xl-domain-config.markdown
--- a/docs/user/xl-domain-config.markdown	Thu Nov 10 10:18:29 2011 +0000
+++ b/docs/user/xl-domain-config.markdown	Thu Nov 10 10:54:39 2011 +0000
@@ -1,4 +1,4 @@
- # xl Domain Configuration
+# xl Domain Configuration
 
 To create a VM (a domain in Xen terminology, sometimes called a guest)
 with xl requires the provision of a domain config file.  Typically
@@ -338,6 +338,29 @@ accept the defaults for these options wh
    extensions (e.g. Windows XP compatibility mode on more modern
    Windows OS).
 
+### Guest Virtual Time Controls
+
+ * `tsc_mode="MODE"`: Specifies how the TSC (Time Stamp Counter)
+   should be provided to the guest (X86 only). Specifying this option as a number
+   is deprecated. Options are:
+
+   * `"default"`: guest rdtsc/p executed natively when monotonicity
+     can be guaranteed and emulated otherwise (with frequency scaled
+     if necessary).
+
+   * `"always_emulate"`: guest rdtsc/p always emulated at 1GHz (kernel
+     and user).
+
+   * `"native"`: guest rdtsc always executed natively (no
+     monotonicity/frequency guarantees); guest rdtscp emulated at
+     native frequency if unsupported by h/w, else executed natively.
+
+   * `"native_paravirt"`: same as `native`, except xen manages TSC_AUX
+      register so guest can determine when a restore/migration has
+      occurred and assumes guest obtains/uses pvclock-like mechanism
+      to adjust for monotonicity and frequency changes.
+
+
 ### Support for Paravirtualisation of HVM Guests
 
 The following options allow Paravirtualised features (such as devices)
@@ -546,9 +569,6 @@ certainly belong in a more appropriate s
    enables certain other features which are incompatible with
    migration (currently certain TSC modes XXX ?).
 
- * `tsc_mode=VALUE`: Specifies how the TSC (Time Stamp Counter) should
-   be provided to the guest.  XXX ???
-
  * `pci_msitranslate=BOOLEAN`: XXX
 
  * `pci_power_mgmt=BOOLEAN`: XXX
diff -r 460b507e15f8 -r bc79b560aafa tools/libxl/libxl_dom.c
--- a/tools/libxl/libxl_dom.c	Thu Nov 10 10:18:29 2011 +0000
+++ b/tools/libxl/libxl_dom.c	Thu Nov 10 10:54:39 2011 +0000
@@ -73,12 +73,29 @@ int libxl__build_pre(libxl__gc *gc, uint
               libxl_domain_build_info *info, libxl__domain_build_state *state)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
+    int tsc_mode;
     xc_domain_max_vcpus(ctx->xch, domid, info->max_vcpus);
     xc_domain_setmaxmem(ctx->xch, domid, info->target_memkb + LIBXL_MAXMEM_CONSTANT);
     if (info->type == LIBXL_DOMAIN_TYPE_PV)
         xc_domain_set_memmap_limit(ctx->xch, domid,
                 (info->max_memkb + info->u.pv.slack_memkb));
-    xc_domain_set_tsc_info(ctx->xch, domid, info->tsc_mode, 0, 0, 0);
+    switch (info->tsc_mode) {
+    case LIBXL_TSC_MODE_DEFAULT:
+        tsc_mode = 0;
+        break;
+    case LIBXL_TSC_MODE_ALWAYS_EMULATE:
+        tsc_mode = 1;
+        break;
+    case LIBXL_TSC_MODE_NATIVE:
+        tsc_mode = 2;
+        break;
+    case LIBXL_TSC_MODE_NATIVE_PARAVIRT:
+        tsc_mode = 3;
+        break;
+    default:
+        abort();
+    }
+    xc_domain_set_tsc_info(ctx->xch, domid, tsc_mode, 0, 0, 0);
     if ( info->disable_migrate )
         xc_domain_disable_migrate(ctx->xch, domid);
 
diff -r 460b507e15f8 -r bc79b560aafa tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl	Thu Nov 10 10:18:29 2011 +0000
+++ b/tools/libxl/libxl_types.idl	Thu Nov 10 10:54:39 2011 +0000
@@ -85,6 +85,13 @@ libxl_button = Enumeration("button", [
     (2, "SLEEP"),
     ])
 
+libxl_tsc_mode = Enumeration("tsc_mode", [
+    (0, "default"),
+    (1, "always_emulate"),
+    (2, "native"),
+    (3, "native_paravirt"),
+    ])
+
 #
 # Complex libxl types
 #
@@ -154,7 +161,7 @@ libxl_domain_create_info = Struct("domai
 libxl_domain_build_info = Struct("domain_build_info",[
     ("max_vcpus",       integer),
     ("cur_vcpus",       integer),
-    ("tsc_mode",        integer),
+    ("tsc_mode",        libxl_tsc_mode),
     ("max_memkb",       uint32),
     ("target_memkb",    uint32),
     ("video_memkb",     uint32),
diff -r 460b507e15f8 -r bc79b560aafa tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Thu Nov 10 10:18:29 2011 +0000
+++ b/tools/libxl/xl_cmdimpl.c	Thu Nov 10 10:54:39 2011 +0000
@@ -328,7 +328,7 @@ static void printf_info(int domid,
 
     printf("\t(build_info)\n");
     printf("\t(max_vcpus %d)\n", b_info->max_vcpus);
-    printf("\t(tsc_mode %d)\n", b_info->tsc_mode);
+    printf("\t(tsc_mode %s)\n", libxl_tsc_mode_to_string(b_info->tsc_mode));
     printf("\t(max_memkb %d)\n", b_info->max_memkb);
     printf("\t(target_memkb %d)\n", b_info->target_memkb);
     printf("\t(nomigrate %d)\n", b_info->disable_migrate);
@@ -662,8 +662,23 @@ static void parse_config_data(const char
     if (!xlu_cfg_get_long (config, "nomigrate", &l, 0))
         b_info->disable_migrate = l;
 
-    if (!xlu_cfg_get_long(config, "tsc_mode", &l, 0))
+    if (!xlu_cfg_get_long(config, "tsc_mode", &l, 1)) {
+        fprintf(stderr, "WARNING: specifying \"tsc_mode\" as an integer is deprecated. "
+                "Please use the named parameter variant.\n");
+        if (l < LIBXL_TSC_MODE_DEFAULT ||
+            l > LIBXL_TSC_MODE_NATIVE_PARAVIRT) {
+            fprintf(stderr, "ERROR: invalid value %ld for \"tsc_mode\"\n", l);
+            exit (1);
+        }
         b_info->tsc_mode = l;
+    } else if (!xlu_cfg_get_string(config, "tsc_mode", &buf, 0)) {
+        fprintf(stderr, "got a tsc mode string: \"%s\"\n", buf);
+        if (libxl_tsc_mode_from_string(buf, &b_info->tsc_mode)) {
+            fprintf(stderr, "ERROR: invalid value \"%s\" for \"tsc_mode\"\n",
+                    buf);
+            exit (1);
+        }
+    }
 
     if (!xlu_cfg_get_long (config, "videoram", &l, 0))
         b_info->video_memkb = l * 1024;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:20:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:20:01 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROSfo-00051v-Sg; Thu, 10 Nov 2011 03:20:00 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROSRg-0003jC-Q1
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:05:41 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1320923120!2999212!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5729 invoked from network); 10 Nov 2011 11:05:21 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-5.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 11:05:21 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 10 Nov 2011 11:05:20 +0000
Message-Id: <4EBBBDFF02000078000601E3@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 10 Nov 2011 11:05:19 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__PartCDE235FF.0__="
Cc: Daniel Kiper <dkiper@net-space.pl>
Subject: [Xen-devel] [PATCH] linux-2.6.18/x86: undo_limit_pages() must reset
	page count
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__PartCDE235FF.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

... before calling __free_pages() as it is already being called in the
context of that or similar function (which used put_page_test_zero()
first or otherwise assumes the page count is zero).

Reported-by: Daniel Kiper <dkiper@net-space.pl>
Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/arch/i386/mm/hypervisor.c
+++ b/arch/i386/mm/hypervisor.c
@@ -437,6 +437,7 @@ static void undo_limit_pages(struct page
 	BUG_ON(order > max_contig_order);
 	xen_limit_pages_to_max_mfn(pages, order, 0);
 	ClearPageForeign(pages);
+	init_page_count(pages);
 	__free_pages(pages, order);
 }
=20




--=__PartCDE235FF.0__=
Content-Type: text/plain; name="xen-x86-undo-limit-pages.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="xen-x86-undo-limit-pages.patch"

x86: undo_limit_pages() must reset page count=0A=0A... before calling =
__free_pages() as it is already being called in the=0Acontext of that or =
similar function (which used put_page_test_zero()=0Afirst or otherwise =
assumes the page count is zero).=0A=0AReported-by: Daniel Kiper <dkiper@net=
-space.pl>=0ASigned-off-by: Jan Beulich <jbeulich@suse.com>=0A=0A--- =
a/arch/i386/mm/hypervisor.c=0A+++ b/arch/i386/mm/hypervisor.c=0A@@ -437,6 =
+437,7 @@ static void undo_limit_pages(struct page=0A 	BUG_ON(order > =
max_contig_order);=0A 	xen_limit_pages_to_max_mfn(pages, order, 0);=0A 	=
ClearPageForeign(pages);=0A+	init_page_count(pages);=0A 	__free_page=
s(pages, order);=0A }=0A =0A
--=__PartCDE235FF.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__PartCDE235FF.0__=--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:26:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:26:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROSll-0006B4-Mf; Thu, 10 Nov 2011 03:26:09 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROSjh-0005hn-7c
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:24:03 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1320924237!1012302!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32715 invoked from network); 10 Nov 2011 11:23:58 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-12.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 11:23:58 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 10 Nov 2011 11:23:57 +0000
Message-Id: <4EBBC25B02000078000601F1@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 10 Nov 2011 11:23:55 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Stefano Stabellini" <stefano.stabellini@eu.citrix.com>,
	<glguida@gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Tim Deegan <tim@xen.org>
Subject: [Xen-devel] performance regression from c/s 21647:cfba1560054a
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Stefano, Gianluca,

in this c/s you did, besides the main purpose of the change, an
adjustment to check_for_early_unshadow() in that L2...L4 entries
would no longer be attempted to get unshadowed. Neither the
patch description nor the added comment really make clear why
this was done, and we now got a customer report regarding this
causing considerable slowdown in process creation/destruction
intensive workloads (e.g. shell scripts).

Would you explain that change, and whether it is reasonable to
revert that part of said c/s?

Thanks, Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:36:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:36:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROSvd-0006li-B4; Thu, 10 Nov 2011 03:36:21 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROSv5-0006Yg-0C
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:35:47 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1320924943!2584299!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9403 invoked from network); 10 Nov 2011 11:35:43 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:35:43 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8860524"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 11:35:43 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 11:35:43 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROSv1-0000Sj-0C;
	Thu, 10 Nov 2011 11:35:43 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROSur-0001nf-Ri;
	Thu, 10 Nov 2011 11:35:33 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 11:35:24 +0000
Message-ID: <1320924931-6891-1-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: keir@xen.org, allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 0/7] IOMMU, vtd and iotlb flush rework (v6)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit

In one of my previous email I detailed a bug I was seeing when passing
through a Intel GPU on a guest that has more that 4G or RAM.

Allen suggested that I go for the Plan B but after a discussion with Tim
we agreed that Plan B was way to disruptive in term of code change.

This patch series implements Plan A.

http://xen.1045712.n5.nabble.com/VTD-Intel-iommu-IOTLB-flush-really-slow-td4952866.html

Changes between v5 and v6:
        - Rework the patch queue to make it more readable.
        - Modify xatp in place in xenmem_add_to_physmap
        - Only check for preemption if we are not at the last iteration
        - Copy xatp guest handler back to the guest only in case of continuation
        - Add continuation only when dealing with the new xenmem space
          (XENMAPSPACE_gmfn_range).

Changes between v4 and v5:
        - Fix hypercall continuation for add_to_physmap in compat mode.

Changes between v3 and v4:
        - Move the loop for gmfn_range from arch_memory_op to xenmem_add_to_physmap.
        - Add a comment to comment to explain the purpose of iommu_dont_flush_iotlb.

Changes between v2 and v3:
        - Check for the presence iotlb_flush_all callback before calling it.

Changes between v1 and v2:
        - Move size in struct xen_add_to_physmap in padding between .domid and .space.
        - Store iommu_dont_flush per cpu
        - Change the code in hvmloader to relocate by batch of 64K, .size is now 16 bits.


Jean Guyader (7):
  vtd: Refactor iotlb flush code
  iommu: Introduce iommu_flush and iommu_flush_all.
  add_to_physmap: Move the code for XENMEM_add_to_physmap
  mm: xenmem_add_to_physmap now takes a pointer on xatp
  mm: New XENMEM space, XENMAPSPACE_gmfn_range
  hvmloader: Change memory relocation loop when overlap with PCI hole
  Introduce per cpu flag (iommu_dont_flush_iotlb) to avoid unnecessary
    iotlb flush

 tools/firmware/hvmloader/pci.c      |   20 ++-
 xen/arch/x86/mm.c                   |  232 ++++++++++++++++++++++-------------
 xen/arch/x86/x86_64/compat/mm.c     |   12 ++
 xen/drivers/passthrough/iommu.c     |   25 ++++
 xen/drivers/passthrough/vtd/iommu.c |  100 +++++++++-------
 xen/include/public/memory.h         |    4 +
 xen/include/xen/iommu.h             |   17 +++
 7 files changed, 278 insertions(+), 132 deletions(-)


--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:37:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:37:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROSwU-00079H-Ao; Thu, 10 Nov 2011 03:37:14 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROSv5-0006Yh-Bc
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:35:47 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1320924943!2584299!2
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9410 invoked from network); 10 Nov 2011 11:35:44 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:35:44 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8860525"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 11:35:43 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 11:35:43 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROSv1-0000Sm-6m;
	Thu, 10 Nov 2011 11:35:43 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROSur-0001nh-Va;
	Thu, 10 Nov 2011 11:35:34 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 11:35:25 +0000
Message-ID: <1320924931-6891-2-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320924931-6891-1-git-send-email-jean.guyader@eu.citrix.com>
References: <1320924931-6891-1-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: keir@xen.org, allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 1/7] vtd: Refactor iotlb flush code
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Factorize the iotlb flush code from map_page and unmap_page into
it's own function.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
Acked-by: Allen M Kay <allen.m.kay@intel.com>
---
 xen/drivers/passthrough/vtd/iommu.c |   86 +++++++++++++++++-----------------
 1 files changed, 43 insertions(+), 43 deletions(-)


--------------true
Content-Type: text/x-patch; name="0001-vtd-Refactor-iotlb-flush-code.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0001-vtd-Refactor-iotlb-flush-code.patch"

diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 7717ab4..5a5b6be 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -578,16 +578,53 @@ static void iommu_flush_all(void)
     }
 }
 
+static void __intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn,
+        int dma_old_pte_present, unsigned int page_count)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+    struct acpi_drhd_unit *drhd;
+    struct iommu *iommu;
+    int flush_dev_iotlb;
+    int iommu_domid;
+
+    /*
+     * No need pcideves_lock here because we have flush
+     * when assign/deassign device
+     */
+    for_each_drhd_unit ( drhd )
+    {
+        iommu = drhd->iommu;
+
+        if ( !test_bit(iommu->index, &hd->iommu_bitmap) )
+            continue;
+
+        flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
+        iommu_domid= domain_iommu_domid(d, iommu);
+        if ( iommu_domid == -1 )
+            continue;
+
+        if ( page_count > 1 || gfn == -1 )
+        {
+            if ( iommu_flush_iotlb_dsi(iommu, iommu_domid,
+                        0, flush_dev_iotlb) )
+                iommu_flush_write_buffer(iommu);
+        }
+        else
+        {
+            if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
+                        (paddr_t)gfn << PAGE_SHIFT_4K, 0,
+                        !dma_old_pte_present, flush_dev_iotlb) )
+                iommu_flush_write_buffer(iommu);
+        }
+    }
+}
+
 /* clear one page's page table */
 static void dma_pte_clear_one(struct domain *domain, u64 addr)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(domain);
-    struct acpi_drhd_unit *drhd;
-    struct iommu *iommu;
     struct dma_pte *page = NULL, *pte = NULL;
     u64 pg_maddr;
-    int flush_dev_iotlb;
-    int iommu_domid;
     struct mapped_rmrr *mrmrr;
 
     spin_lock(&hd->mapping_lock);
@@ -613,21 +650,7 @@ static void dma_pte_clear_one(struct domain *domain, u64 addr)
     spin_unlock(&hd->mapping_lock);
     iommu_flush_cache_entry(pte, sizeof(struct dma_pte));
 
-    /* No need pcidevs_lock here since do that on assign/deassign device*/
-    for_each_drhd_unit ( drhd )
-    {
-        iommu = drhd->iommu;
-        if ( test_bit(iommu->index, &hd->iommu_bitmap) )
-        {
-            flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
-            iommu_domid= domain_iommu_domid(domain, iommu);
-            if ( iommu_domid == -1 )
-                continue;
-            if ( iommu_flush_iotlb_psi(iommu, iommu_domid, addr,
-                                       0, 0, flush_dev_iotlb) )
-                iommu_flush_write_buffer(iommu);
-        }
-    }
+    __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
 
     unmap_vtd_domain_page(page);
 
@@ -1677,12 +1700,8 @@ static int intel_iommu_map_page(
     unsigned int flags)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(d);
-    struct acpi_drhd_unit *drhd;
-    struct iommu *iommu;
     struct dma_pte *page = NULL, *pte = NULL, old, new = { 0 };
     u64 pg_maddr;
-    int flush_dev_iotlb;
-    int iommu_domid;
 
     /* Do nothing if VT-d shares EPT page table */
     if ( iommu_use_hap_pt(d) )
@@ -1724,26 +1743,7 @@ static int intel_iommu_map_page(
     spin_unlock(&hd->mapping_lock);
     unmap_vtd_domain_page(page);
 
-    /*
-     * No need pcideves_lock here because we have flush
-     * when assign/deassign device
-     */
-    for_each_drhd_unit ( drhd )
-    {
-        iommu = drhd->iommu;
-
-        if ( !test_bit(iommu->index, &hd->iommu_bitmap) )
-            continue;
-
-        flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
-        iommu_domid= domain_iommu_domid(d, iommu);
-        if ( iommu_domid == -1 )
-            continue;
-        if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
-                                   (paddr_t)gfn << PAGE_SHIFT_4K, 0,
-                                   !dma_pte_present(old), flush_dev_iotlb) )
-            iommu_flush_write_buffer(iommu);
-    }
+    __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
 
     return 0;
 }

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:38:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:38:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROSxN-0007Wm-Sw; Thu, 10 Nov 2011 03:38:09 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROSv5-0006Yi-GV
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:35:47 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1320924943!2584299!3
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9426 invoked from network); 10 Nov 2011 11:35:44 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:35:44 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8860526"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 11:35:43 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 11:35:43 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROSv1-0000Sp-9U;
	Thu, 10 Nov 2011 11:35:43 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROSus-0001nk-5t;
	Thu, 10 Nov 2011 11:35:34 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 11:35:26 +0000
Message-ID: <1320924931-6891-3-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320924931-6891-2-git-send-email-jean.guyader@eu.citrix.com>
References: <1320924931-6891-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-2-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: keir@xen.org, allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 2/7] iommu: Introduce iommu_flush and
	iommu_flush_all.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
Acked-by: Allen M Kay <allen.m.kay@intel.com>
---
 xen/drivers/passthrough/iommu.c     |   20 ++++++++++++++++++++
 xen/drivers/passthrough/vtd/iommu.c |   12 ++++++++++++
 xen/include/xen/iommu.h             |    5 +++++
 3 files changed, 37 insertions(+), 0 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0002-iommu-Introduce-iommu_flush-and-iommu_flush_all.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0002-iommu-Introduce-iommu_flush-and-iommu_flush_all.patch"

diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index cd6174d..ca7b37b 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -301,6 +301,26 @@ int iommu_unmap_page(struct domain *d, unsigned long gfn)
     return hd->platform_ops->unmap_page(d, gfn);
 }
 
+void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+    if ( !iommu_enabled || !hd->platform_ops || !hd->platform_ops->iotlb_flush )
+        return;
+
+    hd->platform_ops->iotlb_flush(d, gfn, page_count);
+}
+
+void iommu_iotlb_flush_all(struct domain *d)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+    if ( !iommu_enabled || !hd->platform_ops || !hd->platform_ops->iotlb_flush_all )
+        return;
+
+    hd->platform_ops->iotlb_flush_all(d);
+}
+
 /* caller should hold the pcidevs_lock */
 int deassign_device(struct domain *d, u16 seg, u8 bus, u8 devfn)
 {
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 5a5b6be..7ec9541 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -619,6 +619,16 @@ static void __intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn,
     }
 }
 
+static void intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count)
+{
+    __intel_iommu_iotlb_flush(d, gfn, 1, page_count);
+}
+
+static void intel_iommu_iotlb_flush_all(struct domain *d)
+{
+    __intel_iommu_iotlb_flush(d, 0, 0, 0);
+}
+
 /* clear one page's page table */
 static void dma_pte_clear_one(struct domain *domain, u64 addr)
 {
@@ -2329,6 +2339,8 @@ const struct iommu_ops intel_iommu_ops = {
     .resume = vtd_resume,
     .share_p2m = iommu_set_pgd,
     .crash_shutdown = vtd_crash_shutdown,
+    .iotlb_flush = intel_iommu_iotlb_flush,
+    .iotlb_flush_all = intel_iommu_iotlb_flush_all,
 };
 
 /*
diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
index 837e60d..a1034df 100644
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -139,6 +139,8 @@ struct iommu_ops {
     void (*resume)(void);
     void (*share_p2m)(struct domain *d);
     void (*crash_shutdown)(void);
+    void (*iotlb_flush)(struct domain *d, unsigned long gfn, unsigned int page_count);
+    void (*iotlb_flush_all)(struct domain *d);
 };
 
 void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value);
@@ -155,4 +157,7 @@ void iommu_share_p2m_table(struct domain *d);
 
 int iommu_do_domctl(struct xen_domctl *, XEN_GUEST_HANDLE(xen_domctl_t));
 
+void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count);
+void iommu_iotlb_flush_all(struct domain *d);
+
 #endif /* _IOMMU_H_ */

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:39:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:39:01 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROSyD-0007uR-MR; Thu, 10 Nov 2011 03:39:01 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROSv5-0006Yj-Hp
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:35:48 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1320924943!2584299!4
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9441 invoked from network); 10 Nov 2011 11:35:44 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:35:44 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8860527"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 11:35:43 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 11:35:44 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROSv1-0000Sv-IP;
	Thu, 10 Nov 2011 11:35:43 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROSus-0001nq-EO;
	Thu, 10 Nov 2011 11:35:34 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 11:35:28 +0000
Message-ID: <1320924931-6891-5-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320924931-6891-4-git-send-email-jean.guyader@eu.citrix.com>
References: <1320924931-6891-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-4-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: keir@xen.org, allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 4/7] mm: xenmem_add_to_physmap now takes a
	pointer on xatp
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c |   40 ++++++++++++++++++++--------------------
 1 files changed, 20 insertions(+), 20 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0004-mm-xenmem_add_to_physmap-now-takes-a-pointer-on-xatp.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0004-mm-xenmem_add_to_physmap-now-takes-a-pointer-on-xatp.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 66a07bd..c0da115 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4593,17 +4593,17 @@ static int handle_iomem_range(unsigned long s, unsigned long e, void *p)
 }
 
 int xenmem_add_to_physmap(struct domain *d,
-                          struct xen_add_to_physmap xatp)
+                          struct xen_add_to_physmap *xatp)
 {
     struct page_info* page = NULL;
     unsigned long mfn = 0;
     unsigned long prev_mfn, gpfn;
     int rc;
 
-    switch ( xatp.space )
+    switch ( xatp->space )
     {
     case XENMAPSPACE_shared_info:
-        if ( xatp.idx == 0 )
+        if ( xatp->idx == 0 )
             mfn = virt_to_mfn(d->shared_info);
         break;
     case XENMAPSPACE_grant_table:
@@ -4613,20 +4613,20 @@ int xenmem_add_to_physmap(struct domain *d,
             d->grant_table->gt_version = 1;
 
         if ( d->grant_table->gt_version == 2 &&
-             (xatp.idx & XENMAPIDX_grant_table_status) )
+             (xatp->idx & XENMAPIDX_grant_table_status) )
         {
-            xatp.idx &= ~XENMAPIDX_grant_table_status;
-            if ( xatp.idx < nr_status_frames(d->grant_table) )
-                mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
+            xatp->idx &= ~XENMAPIDX_grant_table_status;
+            if ( xatp->idx < nr_status_frames(d->grant_table) )
+                mfn = virt_to_mfn(d->grant_table->status[xatp->idx]);
         }
         else
         {
-            if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
-                 (xatp.idx < max_nr_grant_frames) )
-                gnttab_grow_table(d, xatp.idx + 1);
+            if ( (xatp->idx >= nr_grant_frames(d->grant_table)) &&
+                 (xatp->idx < max_nr_grant_frames) )
+                gnttab_grow_table(d, xatp->idx + 1);
 
-            if ( xatp.idx < nr_grant_frames(d->grant_table) )
-                mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
+            if ( xatp->idx < nr_grant_frames(d->grant_table) )
+                mfn = virt_to_mfn(d->grant_table->shared_raw[xatp->idx]);
         }
 
         spin_unlock(&d->grant_table->lock);
@@ -4635,16 +4635,16 @@ int xenmem_add_to_physmap(struct domain *d,
     {
         p2m_type_t p2mt;
 
-        xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
+        xatp->idx = mfn_x(gfn_to_mfn_unshare(d, xatp->idx, &p2mt));
         /* If the page is still shared, exit early */
         if ( p2m_is_shared(p2mt) )
         {
             rcu_unlock_domain(d);
             return -ENOMEM;
         }
-        if ( !get_page_from_pagenr(xatp.idx, d) )
+        if ( !get_page_from_pagenr(xatp->idx, d) )
             break;
-        mfn = xatp.idx;
+        mfn = xatp->idx;
         page = mfn_to_page(mfn);
         break;
     }
@@ -4666,15 +4666,15 @@ int xenmem_add_to_physmap(struct domain *d,
         put_page(page);
 
     /* Remove previously mapped page if it was present. */
-    prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
+    prev_mfn = gmfn_to_mfn(d, xatp->gpfn);
     if ( mfn_valid(prev_mfn) )
     {
         if ( is_xen_heap_mfn(prev_mfn) )
             /* Xen heap frames are simply unhooked from this phys slot. */
-            guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
+            guest_physmap_remove_page(d, xatp->gpfn, prev_mfn, 0);
         else
             /* Normal domain memory is freed, to avoid leaking memory. */
-            guest_remove_page(d, xatp.gpfn);
+            guest_remove_page(d, xatp->gpfn);
     }
 
     /* Unmap from old location, if any. */
@@ -4684,7 +4684,7 @@ int xenmem_add_to_physmap(struct domain *d,
         guest_physmap_remove_page(d, gpfn, mfn, 0);
 
     /* Map at new location. */
-    rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
+    rc = guest_physmap_add_page(d, xatp->gpfn, mfn, 0);
 
     domain_unlock(d);
 
@@ -4715,7 +4715,7 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
             return -EPERM;
         }
 
-        rc = xenmem_add_to_physmap(d, xatp);
+        rc = xenmem_add_to_physmap(d, &xatp);
 
         rcu_unlock_domain(d);
 

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:39:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:39:49 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROSyz-0008Gr-Ed; Thu, 10 Nov 2011 03:39:49 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROSv6-0006Yn-0n
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:35:48 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1320924943!2584299!8
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9507 invoked from network); 10 Nov 2011 11:35:44 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:35:44 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8860531"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 11:35:44 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 11:35:44 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROSv1-0000T4-W2;
	Thu, 10 Nov 2011 11:35:44 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROSus-0001nz-Pw;
	Thu, 10 Nov 2011 11:35:34 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 11:35:31 +0000
Message-ID: <1320924931-6891-8-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320924931-6891-7-git-send-email-jean.guyader@eu.citrix.com>
References: <1320924931-6891-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-5-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-6-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-7-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: keir@xen.org, allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 7/7] Introduce per cpu flag
	(iommu_dont_flush_iotlb) to avoid unnecessary iotlb flush
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Add cpu flag that will be checked by the iommu low level code
to skip iotlb flushes. iommu_iotlb_flush shall be called explicitly.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c                   |   12 ++++++++++++
 xen/drivers/passthrough/iommu.c     |    5 +++++
 xen/drivers/passthrough/vtd/iommu.c |    6 ++++--
 xen/include/xen/iommu.h             |   12 ++++++++++++
 4 files changed, 33 insertions(+), 2 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0007-Introduce-per-cpu-flag-iommu_dont_flush_iotlb-to-avo.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0007-Introduce-per-cpu-flag-iommu_dont_flush_iotlb-to-avo.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 19d301b..186b0c7 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4695,10 +4695,15 @@ int xenmem_add_to_physmap_once(struct domain *d,
 int xenmem_add_to_physmap(struct domain *d,
                           struct xen_add_to_physmap *xatp)
 {
+    struct xen_add_to_physmap start_xatp;
     int rc = 0;
 
     if ( xatp->space == XENMAPSPACE_gmfn_range )
     {
+        if ( need_iommu(d) )
+            this_cpu(iommu_dont_flush_iotlb) = 1;
+
+        start_xatp = *xatp;
         while ( xatp->size > 0 )
         {
             rc = xenmem_add_to_physmap_once(d, xatp);
@@ -4717,6 +4722,13 @@ int xenmem_add_to_physmap(struct domain *d,
             }
         }
 
+        if ( need_iommu(d) )
+        {
+            this_cpu(iommu_dont_flush_iotlb) = 0;
+            iommu_iotlb_flush(d, start_xatp.idx, start_xatp.size - xatp->size);
+            iommu_iotlb_flush(d, start_xatp.gpfn, start_xatp.size - xatp->size);
+        }
+
         return rc;
     }
 
diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index ca7b37b..bacca11 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -52,6 +52,8 @@ bool_t __read_mostly iommu_hap_pt_share = 1;
 bool_t __read_mostly iommu_debug;
 bool_t __read_mostly amd_iommu_perdev_intremap;
 
+DEFINE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
+
 static void __init parse_iommu_param(char *s)
 {
     char *ss;
@@ -227,6 +229,7 @@ static int iommu_populate_page_table(struct domain *d)
 
     spin_lock(&d->page_alloc_lock);
 
+    this_cpu(iommu_dont_flush_iotlb) = 1;
     page_list_for_each ( page, &d->page_list )
     {
         if ( is_hvm_domain(d) ||
@@ -244,6 +247,8 @@ static int iommu_populate_page_table(struct domain *d)
             }
         }
     }
+    this_cpu(iommu_dont_flush_iotlb) = 0;
+    iommu_iotlb_flush_all(d);
     spin_unlock(&d->page_alloc_lock);
     return 0;
 }
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 7ec9541..a3dd018 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -660,7 +660,8 @@ static void dma_pte_clear_one(struct domain *domain, u64 addr)
     spin_unlock(&hd->mapping_lock);
     iommu_flush_cache_entry(pte, sizeof(struct dma_pte));
 
-    __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
+    if ( !this_cpu(iommu_dont_flush_iotlb) )
+        __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
 
     unmap_vtd_domain_page(page);
 
@@ -1753,7 +1754,8 @@ static int intel_iommu_map_page(
     spin_unlock(&hd->mapping_lock);
     unmap_vtd_domain_page(page);
 
-    __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
+    if ( !this_cpu(iommu_dont_flush_iotlb) )
+        __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
 
     return 0;
 }
diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
index a1034df..6f7fbf7 100644
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -160,4 +160,16 @@ int iommu_do_domctl(struct xen_domctl *, XEN_GUEST_HANDLE(xen_domctl_t));
 void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count);
 void iommu_iotlb_flush_all(struct domain *d);
 
+/*
+ * The purpose of the iommu_dont_flush_iotlb optional cpu flag is to
+ * avoid unecessary iotlb_flush in the low level IOMMU code.
+ *
+ * iommu_map_page/iommu_unmap_page must flush the iotlb but somethimes
+ * this operation can be really expensive. This flag will be set by the
+ * caller to notify the low level IOMMU code to avoid the iotlb flushes.
+ * iommu_iotlb_flush/iommu_iotlb_flush_all will be explicitly called by
+ * the caller.
+ */
+DECLARE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
+
 #endif /* _IOMMU_H_ */

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:40:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:40:40 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROSzo-0000DU-AS; Thu, 10 Nov 2011 03:40:40 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROSv5-0006Yl-Nw
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:35:48 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1320924943!2584299!6
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9469 invoked from network); 10 Nov 2011 11:35:44 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:35:44 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8860529"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 11:35:44 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 11:35:44 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROSv1-0000Sy-Nj;
	Thu, 10 Nov 2011 11:35:43 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROSus-0001nt-HP;
	Thu, 10 Nov 2011 11:35:34 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 11:35:29 +0000
Message-ID: <1320924931-6891-6-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320924931-6891-5-git-send-email-jean.guyader@eu.citrix.com>
References: <1320924931-6891-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-5-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: keir@xen.org, allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] 
	[PATCH 5/7] mm: New XENMEM space, XENMAPSPACE_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


XENMAPSPACE_gmfn_range is like XENMAPSPACE_gmfn but it runs on
a range of pages. The size of the range is defined in a new field.

This new field .size is located in the 16 bits padding between .domid
and .space in struct xen_add_to_physmap to stay compatible with older
versions.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c               |   47 +++++++++++++++++++++++++++++++++++++-
 xen/arch/x86/x86_64/compat/mm.c |   12 ++++++++++
 xen/include/public/memory.h     |    4 +++
 3 files changed, 61 insertions(+), 2 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0005-mm-New-XENMEM-space-XENMAPSPACE_gmfn_range.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0005-mm-New-XENMEM-space-XENMAPSPACE_gmfn_range.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index c0da115..19d301b 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4592,8 +4592,8 @@ static int handle_iomem_range(unsigned long s, unsigned long e, void *p)
     return 0;
 }
 
-int xenmem_add_to_physmap(struct domain *d,
-                          struct xen_add_to_physmap *xatp)
+int xenmem_add_to_physmap_once(struct domain *d,
+                               struct xen_add_to_physmap *xatp)
 {
     struct page_info* page = NULL;
     unsigned long mfn = 0;
@@ -4631,6 +4631,7 @@ int xenmem_add_to_physmap(struct domain *d,
 
         spin_unlock(&d->grant_table->lock);
         break;
+    case XENMAPSPACE_gmfn_range:
     case XENMAPSPACE_gmfn:
     {
         p2m_type_t p2mt;
@@ -4691,6 +4692,37 @@ int xenmem_add_to_physmap(struct domain *d,
     return rc;
 }
 
+int xenmem_add_to_physmap(struct domain *d,
+                          struct xen_add_to_physmap *xatp)
+{
+    int rc = 0;
+
+    if ( xatp->space == XENMAPSPACE_gmfn_range )
+    {
+        while ( xatp->size > 0 )
+        {
+            rc = xenmem_add_to_physmap_once(d, xatp);
+            if ( rc < 0 )
+                return rc;
+
+            xatp->idx++;
+            xatp->gpfn++;
+            xatp->size--;
+
+            /* Check for continuation if it's not the last interation */
+            if ( xatp->size > 0 && hypercall_preempt_check() )
+            {
+                rc = -EAGAIN;
+                break;
+            }
+        }
+
+        return rc;
+    }
+
+    return xenmem_add_to_physmap_once(d, xatp);
+}
+
 long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
 {
     int rc;
@@ -4716,6 +4748,17 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
         }
 
         rc = xenmem_add_to_physmap(d, &xatp);
+        if ( rc == -EAGAIN )
+        {
+            if ( copy_to_guest(arg, &xatp, 1) )
+            {
+                rcu_unlock_domain(d);
+                return -EFAULT;
+            }
+
+            rc = hypercall_create_continuation(
+                    __HYPERVISOR_memory_op, "ih", op, arg);
+        }
 
         rcu_unlock_domain(d);
 
diff --git a/xen/arch/x86/x86_64/compat/mm.c b/xen/arch/x86/x86_64/compat/mm.c
index 2c05099..8f4be25 100644
--- a/xen/arch/x86/x86_64/compat/mm.c
+++ b/xen/arch/x86/x86_64/compat/mm.c
@@ -63,6 +63,18 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
 
         XLAT_add_to_physmap(nat, &cmp);
         rc = arch_memory_op(op, guest_handle_from_ptr(nat, void));
+        if ( rc < 0 )
+            break;
+
+        if ( rc == __HYPERVISOR_memory_op )
+        {
+            hypercall_xlat_continuation(NULL, 0x2, nat, arg);
+
+            XLAT_add_to_physmap(&cmp, nat);
+
+            if ( copy_to_guest(arg, &cmp, 1) )
+                return -EFAULT;
+        }
 
         break;
     }
diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h
index 08355e3..c5b78a8 100644
--- a/xen/include/public/memory.h
+++ b/xen/include/public/memory.h
@@ -208,10 +208,14 @@ struct xen_add_to_physmap {
     /* Which domain to change the mapping for. */
     domid_t domid;
 
+    /* Number of pages to go through for gmfn_range */
+    uint16_t    size;
+
     /* Source mapping space. */
 #define XENMAPSPACE_shared_info 0 /* shared info page */
 #define XENMAPSPACE_grant_table 1 /* grant table page */
 #define XENMAPSPACE_gmfn        2 /* GMFN */
+#define XENMAPSPACE_gmfn_range  3 /* GMFN range */
     unsigned int space;
 
 #define XENMAPIDX_grant_table_status 0x80000000

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:41:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:41:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROT10-0000dB-2V; Thu, 10 Nov 2011 03:41:54 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROSv5-0006Ym-SJ
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:35:48 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1320924943!2584299!7
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9493 invoked from network); 10 Nov 2011 11:35:44 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:35:44 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8860530"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 11:35:44 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 11:35:44 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROSv1-0000T1-Qp;
	Thu, 10 Nov 2011 11:35:43 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROSus-0001nw-Ms;
	Thu, 10 Nov 2011 11:35:34 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 11:35:30 +0000
Message-ID: <1320924931-6891-7-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320924931-6891-6-git-send-email-jean.guyader@eu.citrix.com>
References: <1320924931-6891-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-5-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-6-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: keir@xen.org, allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 6/7] hvmloader: Change memory relocation loop
	when overlap with PCI hole
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Change the way we relocate the memory page if they overlap with pci hole.
Use new map space (XENMAPSPACE_gmfn_range) to move the loop into xen.

This code usually get triggered when a device is pass through to a guest
and the PCI hole has to be extended to have enough room to map the device BARs.
The PCI hole will starts lower and it might overlap with some RAM that has been
alocated for the guest. That usually happen if the guest has more than 4G of RAM.
We have to relocate those pages in high mem otherwise they won't be accessible.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 tools/firmware/hvmloader/pci.c |   20 ++++++++++++++------
 1 files changed, 14 insertions(+), 6 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0006-hvmloader-Change-memory-relocation-loop-when-overlap.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0006-hvmloader-Change-memory-relocation-loop-when-overlap.patch"

diff --git a/tools/firmware/hvmloader/pci.c b/tools/firmware/hvmloader/pci.c
index 29ec011..3bd6ac5 100644
--- a/tools/firmware/hvmloader/pci.c
+++ b/tools/firmware/hvmloader/pci.c
@@ -50,6 +50,7 @@ void pci_setup(void)
         uint32_t devfn, bar_reg, bar_sz;
     } *bars = (struct bars *)scratch_start;
     unsigned int i, nr_bars = 0;
+    unsigned long pci_mem_start_pg;
 
     /* Program PCI-ISA bridge with appropriate link routes. */
     isa_irq = 0;
@@ -185,17 +186,24 @@ void pci_setup(void)
             ((pci_mem_start << 1) != 0) )
         pci_mem_start <<= 1;
 
-    while ( (pci_mem_start >> PAGE_SHIFT) < hvm_info->low_mem_pgend )
+    /* Relocate RAM that overlaps (in 64K chunks) */
+    pci_mem_start_pg = (pci_mem_start >> PAGE_SHIFT);
+    while (pci_mem_start_pg < hvm_info->low_mem_pgend)
     {
         struct xen_add_to_physmap xatp;
-        if ( hvm_info->high_mem_pgend == 0 )
-            hvm_info->high_mem_pgend = 1ull << (32 - PAGE_SHIFT);
+        unsigned int size = hvm_info->low_mem_pgend - pci_mem_start_pg;
         xatp.domid = DOMID_SELF;
-        xatp.space = XENMAPSPACE_gmfn;
-        xatp.idx   = --hvm_info->low_mem_pgend;
-        xatp.gpfn  = hvm_info->high_mem_pgend++;
+        xatp.space = XENMAPSPACE_gmfn_range;
+        xatp.idx = pci_mem_start_pg;
+        xatp.gpfn = hvm_info->high_mem_pgend;
+        size = size > ((1 << 16) - 1) ? ((1 << 16) - 1) : size;
+        xatp.size = size;
+
         if ( hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0 )
             BUG();
+        pci_mem_start_pg += size;
+        hvm_info->high_mem_pgend += size;
+        hvm_info->low_mem_pgend = pci_mem_start_pg;
     }
 
     mem_resource.base = pci_mem_start;

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:43:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:43:17 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROT2L-00011i-8r; Thu, 10 Nov 2011 03:43:17 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROSv5-0006Yk-Ki
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:35:48 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1320924943!2584299!5
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9453 invoked from network); 10 Nov 2011 11:35:44 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:35:44 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8860528"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 11:35:43 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 11:35:43 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROSv1-0000Ss-FG;
	Thu, 10 Nov 2011 11:35:43 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROSus-0001nn-8a;
	Thu, 10 Nov 2011 11:35:34 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 11:35:27 +0000
Message-ID: <1320924931-6891-4-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1320924931-6891-3-git-send-email-jean.guyader@eu.citrix.com>
References: <1320924931-6891-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-3-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: keir@xen.org, allen.m.kay@intel.com, tim@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 3/7] add_to_physmap: Move the code for
	XENMEM_add_to_physmap
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Move the code for the XENMEM_add_to_physmap case into it's own
function (xenmem_add_to_physmap).

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c |  189 ++++++++++++++++++++++++++++-------------------------
 1 files changed, 100 insertions(+), 89 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0003-add_to_physmap-Move-the-code-for-XENMEM_add_to_physm.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0003-add_to_physmap-Move-the-code-for-XENMEM_add_to_physm.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index acc1f34..66a07bd 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4592,9 +4592,107 @@ static int handle_iomem_range(unsigned long s, unsigned long e, void *p)
     return 0;
 }
 
+int xenmem_add_to_physmap(struct domain *d,
+                          struct xen_add_to_physmap xatp)
+{
+    struct page_info* page = NULL;
+    unsigned long mfn = 0;
+    unsigned long prev_mfn, gpfn;
+    int rc;
+
+    switch ( xatp.space )
+    {
+    case XENMAPSPACE_shared_info:
+        if ( xatp.idx == 0 )
+            mfn = virt_to_mfn(d->shared_info);
+        break;
+    case XENMAPSPACE_grant_table:
+        spin_lock(&d->grant_table->lock);
+
+        if ( d->grant_table->gt_version == 0 )
+            d->grant_table->gt_version = 1;
+
+        if ( d->grant_table->gt_version == 2 &&
+             (xatp.idx & XENMAPIDX_grant_table_status) )
+        {
+            xatp.idx &= ~XENMAPIDX_grant_table_status;
+            if ( xatp.idx < nr_status_frames(d->grant_table) )
+                mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
+        }
+        else
+        {
+            if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
+                 (xatp.idx < max_nr_grant_frames) )
+                gnttab_grow_table(d, xatp.idx + 1);
+
+            if ( xatp.idx < nr_grant_frames(d->grant_table) )
+                mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
+        }
+
+        spin_unlock(&d->grant_table->lock);
+        break;
+    case XENMAPSPACE_gmfn:
+    {
+        p2m_type_t p2mt;
+
+        xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
+        /* If the page is still shared, exit early */
+        if ( p2m_is_shared(p2mt) )
+        {
+            rcu_unlock_domain(d);
+            return -ENOMEM;
+        }
+        if ( !get_page_from_pagenr(xatp.idx, d) )
+            break;
+        mfn = xatp.idx;
+        page = mfn_to_page(mfn);
+        break;
+    }
+    default:
+        break;
+    }
+
+    if ( !paging_mode_translate(d) || (mfn == 0) )
+    {
+        if ( page )
+            put_page(page);
+        rcu_unlock_domain(d);
+        return -EINVAL;
+    }
+
+    domain_lock(d);
+
+    if ( page )
+        put_page(page);
+
+    /* Remove previously mapped page if it was present. */
+    prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
+    if ( mfn_valid(prev_mfn) )
+    {
+        if ( is_xen_heap_mfn(prev_mfn) )
+            /* Xen heap frames are simply unhooked from this phys slot. */
+            guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
+        else
+            /* Normal domain memory is freed, to avoid leaking memory. */
+            guest_remove_page(d, xatp.gpfn);
+    }
+
+    /* Unmap from old location, if any. */
+    gpfn = get_gpfn_from_mfn(mfn);
+    ASSERT( gpfn != SHARED_M2P_ENTRY );
+    if ( gpfn != INVALID_M2P_ENTRY )
+        guest_physmap_remove_page(d, gpfn, mfn, 0);
+
+    /* Map at new location. */
+    rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
+
+    domain_unlock(d);
+
+    return rc;
+}
+
 long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
 {
-    struct page_info *page = NULL;
     int rc;
 
     switch ( op )
@@ -4602,7 +4700,6 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
     case XENMEM_add_to_physmap:
     {
         struct xen_add_to_physmap xatp;
-        unsigned long prev_mfn, mfn = 0, gpfn;
         struct domain *d;
 
         if ( copy_from_guest(&xatp, arg, 1) )
@@ -4618,93 +4715,7 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
             return -EPERM;
         }
 
-        switch ( xatp.space )
-        {
-        case XENMAPSPACE_shared_info:
-            if ( xatp.idx == 0 )
-                mfn = virt_to_mfn(d->shared_info);
-            break;
-        case XENMAPSPACE_grant_table:
-            spin_lock(&d->grant_table->lock);
-
-            if ( d->grant_table->gt_version == 0 )
-                d->grant_table->gt_version = 1;
-
-            if ( d->grant_table->gt_version == 2 &&
-                 (xatp.idx & XENMAPIDX_grant_table_status) )
-            {
-                xatp.idx &= ~XENMAPIDX_grant_table_status;
-                if ( xatp.idx < nr_status_frames(d->grant_table) )
-                    mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
-            }
-            else
-            {
-                if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
-                     (xatp.idx < max_nr_grant_frames) )
-                    gnttab_grow_table(d, xatp.idx + 1);
-
-                if ( xatp.idx < nr_grant_frames(d->grant_table) )
-                    mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
-            }
-
-            spin_unlock(&d->grant_table->lock);
-            break;
-        case XENMAPSPACE_gmfn:
-        {
-            p2m_type_t p2mt;
-
-            xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
-            /* If the page is still shared, exit early */
-            if ( p2m_is_shared(p2mt) )
-            {
-                rcu_unlock_domain(d);
-                return -ENOMEM;
-            }
-            if ( !get_page_from_pagenr(xatp.idx, d) )
-                break;
-            mfn = xatp.idx;
-            page = mfn_to_page(mfn);
-            break;
-        }
-        default:
-            break;
-        }
-
-        if ( !paging_mode_translate(d) || (mfn == 0) )
-        {
-            if ( page )
-                put_page(page);
-            rcu_unlock_domain(d);
-            return -EINVAL;
-        }
-
-        domain_lock(d);
-
-        if ( page )
-            put_page(page);
-
-        /* Remove previously mapped page if it was present. */
-        prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
-        if ( mfn_valid(prev_mfn) )
-        {
-            if ( is_xen_heap_mfn(prev_mfn) )
-                /* Xen heap frames are simply unhooked from this phys slot. */
-                guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
-            else
-                /* Normal domain memory is freed, to avoid leaking memory. */
-                guest_remove_page(d, xatp.gpfn);
-        }
-
-        /* Unmap from old location, if any. */
-        gpfn = get_gpfn_from_mfn(mfn);
-        ASSERT( gpfn != SHARED_M2P_ENTRY );
-        if ( gpfn != INVALID_M2P_ENTRY )
-            guest_physmap_remove_page(d, gpfn, mfn, 0);
-
-        /* Map at new location. */
-        rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
-
-        domain_unlock(d);
+        rc = xenmem_add_to_physmap(d, xatp);
 
         rcu_unlock_domain(d);
 

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:45:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:45:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROT4c-0001d5-GU; Thu, 10 Nov 2011 03:45:38 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROSwC-0006zz-Vk
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:36:57 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1320924987!47926060!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27993 invoked from network); 10 Nov 2011 11:36:27 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:36:27 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8860573"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 11:36:53 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 11:36:53 +0000
Date: Thu, 10 Nov 2011 11:37:37 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 3 of 7] docs: add a document describing the
	xl cfg file syntax
In-Reply-To: <291f6cb0d03e56e4edbe.1320678792@cosworth.uk.xensource.com>
Message-ID: <alpine.DEB.2.00.1111101128020.3519@kaball-desktop>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
	<291f6cb0d03e56e4edbe.1320678792@cosworth.uk.xensource.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: Ian, "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, 7 Nov 2011, Ian Campbell wrote:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@citrix.com>
> # Date 1320678758 0
> # Node ID 291f6cb0d03e56e4edbe53c640c96dff85d9bf08
> # Parent  705b2e659ff885379fb8b1c4aefbecfb3b8cc1eb
> docs: add a document describing the xl cfg file syntax
> 
> Based on an initial version by Ian Jackson.
> 
> I believe that all keys are now present in the document although there are are
> various omissions in the actual documentation of them. Hopefully however this
> covers the majority of the most interesting keys.

I think it would be very useful as a manpage.
If we really want to keep it in markdown rather than pod, we could still
find a way to convert it into a manpage (using ronn, pandoc, etc.).


> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
> 
> diff -r 705b2e659ff8 -r 291f6cb0d03e docs/Makefile
> --- a/docs/Makefile     Mon Nov 07 15:12:08 2011 +0000
> +++ b/docs/Makefile     Mon Nov 07 15:12:38 2011 +0000
> @@ -11,7 +11,7 @@ DOC_MAN1SRC   := $(wildcard man/*.pod.1)
>  DOC_MAN1       := $(patsubst man/%.pod.1,man1/%.1,$(DOC_MAN1SRC))
>  DOC_MAN5       := $(patsubst man/%.pod.5,man5/%.5,$(DOC_MAN5SRC))
>  DOC_TEX                := src/user.tex src/interface.tex
> -DOC_MARKDOWN   := $(wildcard misc/*.markdown)
> +DOC_MARKDOWN   := $(wildcard misc/*.markdown) $(wildcard user/*.markdown)
>  DOC_PS         := $(patsubst src/%.tex,ps/%.ps,$(DOC_TEX))
>  DOC_PDF                := $(patsubst src/%.tex,pdf/%.pdf,$(DOC_TEX))
>  DOC_HTML       := $(patsubst src/%.tex,html/%/index.html,$(DOC_TEX)) \
> diff -r 705b2e659ff8 -r 291f6cb0d03e docs/user/xl-domain-config.markdown
> --- /dev/null   Thu Jan 01 00:00:00 1970 +0000
> +++ b/docs/user/xl-domain-config.markdown       Mon Nov 07 15:12:38 2011 +0000
> @@ -0,0 +1,554 @@
> + # xl Domain Configuration
> +
> +To create a VM (a domain in Xen terminology, sometimes called a guest)
> +with xl requires the provision of a domain config file.  Typically
> +these live in `/etc/xen/DOMAIN.cfg` where DOMAIN is the name of the
> +domain.
> +
> +## Work In Progress
> +
> +This document is a work in progress and contains items which require
> +further documentation and which are generally incomplete (marked with
> +XXX).  However all options are included here whether or not they are
> +fully documented.
> +
> +Patches to improve incomplete items (or any other item) would be
> +greatfully received on the [xen-devel][] mailing list. Please see
> +[SubmittingXenPatches][] wiki page for information on how to submit a
> +patch to Xen.
> +
> +[xen-devel]: mailto:xen-devel@lists.xensource.com
> +[SubmittingXenPatches]: http://wiki.xen.org/xenwiki/SubmittingXenPatches
> +
> +----------------------------------------
> +
> +## Syntax
> +
> +A domain config file consists of a series of `KEY=VALUE` pairs.
> +
> +Some `KEY`s are mandatory, others are global options which apply to
> +any guest type while others relate only to specific guest types
> +(e.g. PV or HVM guests).
> +
> +A value `VALUE` is one of:
> +
> + * `"STRING"`: A string, surrounded by either single or double quotes.
> + * `NUMBER`: A number, in either decimal, octal (using a `0 prefix`)
> +   or hexadecimal (using an `0x` prefix`).
> + * `BOOLEAN`: A `NUMBER` interpreted as `False` (`0`) or `True` (any
> +   other value).
> + * `[ VALUE, VALUE, ... ]`: A list of `VALUES` of the above
> +   types. Lists are homogeneous and are not nested.
> +
> +The semantics of each `KEY` defines which form of `VALUE` is required.
> +
> +----------------------------------------
> +
> +## Mandatory Configuration Items
> +
> +The following key is mandatory for any guest type:
> +
> + * `name="NAME"`: Specifies the name of the domain.  Names of domains
> +   existing on a single host must be unique.
> +
> +## Selecting Guest Type
> +
> + * `builder=hvm`: Specifies that this is to be an HVM domain.  That
> +   is, a fully virtualised computer with emulated BIOS, disk and
> +   network peripherals, etc.  The default is a PV domain, suitable for
> +   hosting Xen-aware guest operating systems.

I think builder=[hvm|pv] would make it clearer what the options are. I
know that the idea is that a pv guest doesn't need this key pair but I
think that as it is can be confusing.

[...]

> +
> +## Devices
> +
> +The following options define the paravirtual, emulated and physical
> +devices which the guest will contain.
> +
> + * `disk=[ "DISK_SPEC_STRING", "DISK_SPEC_STRING", ...]`: Specifies
> +   the disks (both emulated disks and Xen virtual block devices) which
> +   are to be provided to the guest, and what objects on the they
> +   should map to.  See `docs/misc/xl-disk-configuration.txt`.
> +
> + * `vif=[ "NET_SPEC_STRING", "NET_SPEC_STRING", ...]`: Specifies the
> +   networking provision (both emulated network adapters, and Xen
> +   virtual interfaces) to provided to the guest.  See
> +   `docs/misc/xl-network-configuration.markdown`.
> +
> + * `vfb=[ "VFB_SPEC_STRING", "VFB_SPEC_STRING", ...]`: Specifies the
> +   paravirtual framebuffer devices which should be supplied to the domain.
> +
> +   This options does not control the emulated graphics card presented
> +   to an HVM guest. See "Emulated VGA Graphics Device" below for how
> +   to configure the emulated device.

and it is only relevant for PV guests.

[...]

> + * `tsc_mode=VALUE`: Specifies how the TSC (Time Stamp Counter) should
> +   be provided to the guest.  XXX ???

see docs/misc/tscmode.txt


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:46:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:46:34 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROT5W-00020K-BK; Thu, 10 Nov 2011 03:46:34 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROT0v-0000bf-Hg
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:41:50 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1320925303!2981061!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23389 invoked from network); 10 Nov 2011 11:41:44 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:41:44 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8860758"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 11:41:43 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 11:41:43 +0000
Date: Thu, 10 Nov 2011 11:42:27 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Ian Campbell <Ian.Campbell@citrix.com>
In-Reply-To: <1320859014.955.186.camel@zakaz.uk.xensource.com>
Message-ID: <alpine.DEB.2.00.1111101140270.3519@kaball-desktop>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
	<1320857460-18088-16-git-send-email-stefano.stabellini@eu.citrix.com>
	<1320859014.955.186.camel@zakaz.uk.xensource.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH 16/18] xl.pod.1: improve description of
 virtual device subcommands
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 9 Nov 2011, Ian Campbell wrote:
> On Wed, 2011-11-09 at 16:50 +0000, stefano.stabellini@eu.citrix.com
> wrote:
> > @@ -918,8 +919,15 @@ Xen Flask security module.
> >  
> >  =head1 SEE ALSO
> >  
> > +The following man pages:
> > +
> >  B<xldomain.cfg>(5), B<xlcpupool.cfg>(5), B<xentop>(1)
> >  
> > +And the following documents available in the Xen source tree:
> > +
> > +B<docs/misc/xl-network-configuration.markdown>
> > +B<docs/misc/xl-disk-configuration.txt>
> > +
> >  =head1 AUTHOR 
> 
> I sent out a patch (yesterday, I think) which modified this section to
> reference xl-domain-config.markdown rather than xldomain.cfg so this
> will conflict, but otherwise this looks nice.
 
I have just replied to that patch: I think that it is important that the
domain config doc is available as a manpage too.
Given that is currently written in markdown we could use a tool to
generate a manpage or convert the source into pod.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:47:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:47:20 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROT6G-0002Nb-OY; Thu, 10 Nov 2011 03:47:20 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROT1A-0000g7-UJ
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:42:05 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1320925321!3665846!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23652 invoked from network); 10 Nov 2011 11:42:02 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:42:02 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8860769"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 11:42:01 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 11:42:01 +0000
Date: Thu, 10 Nov 2011 11:42:45 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Ian Campbell <Ian.Campbell@citrix.com>
In-Reply-To: <1320859103.955.187.camel@zakaz.uk.xensource.com>
Message-ID: <alpine.DEB.2.00.1111101124120.3519@kaball-desktop>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
	<1320857460-18088-2-git-send-email-stefano.stabellini@eu.citrix.com>
	<1320859103.955.187.camel@zakaz.uk.xensource.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH 02/18] xl.pod.1: add a description of
	console options
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 9 Nov 2011, Ian Campbell wrote:
> > +Connect to a PV console or connect to an emulated serial console.
> > +PV consoles are the only consoles available for PV domains while HVM
> > +domains can have both. If this option is not specified it defaults to
> > +emulated serial for HVM guests.
> 
> I know it can be inferred from the previous sentence (and is pretty
> obvious) but
>         If this option is not specified it defaults to emulated serial
>         for HVM guests and PV console for PV guests.
> is clearer.

You are right, I'll change it

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:48:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:48:09 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROT73-0002ki-AD; Thu, 10 Nov 2011 03:48:09 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROT1J-0000id-D8
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:42:13 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1320925330!2099657!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15252 invoked from network); 10 Nov 2011 11:42:10 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:42:10 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8860777"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 11:42:09 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 11:42:10 +0000
Date: Thu, 10 Nov 2011 11:42:53 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Ian Campbell <Ian.Campbell@citrix.com>
In-Reply-To: <1320859277.955.189.camel@zakaz.uk.xensource.com>
Message-ID: <alpine.DEB.2.00.1111101124590.3519@kaball-desktop>
References: <1320857460-18088-1-git-send-email-stefano.stabellini@eu.citrix.com>
	<1320857460-18088-4-git-send-email-stefano.stabellini@eu.citrix.com>
	<1320859277.955.189.camel@zakaz.uk.xensource.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH 04/18] xl.pod.1: add a description of the
 global options
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 9 Nov 2011, Ian Campbell wrote:
> On Wed, 2011-11-09 at 16:50 +0000, stefano.stabellini@eu.citrix.com
> wrote:
> > From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> > 
> > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> > ---
> >  docs/man/xl.pod.1 |   16 ++++++++++++++++
> >  1 files changed, 16 insertions(+), 0 deletions(-)
> > 
> > diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
> > index 127a607..c3c6afd 100644
> > --- a/docs/man/xl.pod.1
> > +++ b/docs/man/xl.pod.1
> > @@ -45,6 +45,22 @@ Most B<xl> commands require root privileges to run due to the
> >  communications channels used to talk to the hypervisor.  Running as
> >  non root will return an error.
> >  
> > +=head1 GLOBAL OPTIONS
> > +
> > +Few global options are always available:
> 
> "A few..." or "Some...". "Few..." means that of the many global options
> only some of them are always available, or something like that.

OK, I'll change it

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:48:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:48:59 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROT7r-000390-F9; Thu, 10 Nov 2011 03:48:59 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROT1R-0000kh-Ih
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:42:22 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1320925338!2910220!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15471 invoked from network); 10 Nov 2011 11:42:18 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:42:18 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8860782"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 11:42:18 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Thu, 10 Nov 2011 11:42:18 +0000
Subject: Re: [Xen-devel] [PATCH 3 of 7] docs: add a document describing the
	xl cfg file syntax
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Thu, 10 Nov 2011 11:42:18 +0000
In-Reply-To: <alpine.DEB.2.00.1111101128020.3519@kaball-desktop>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
	<291f6cb0d03e56e4edbe.1320678792@cosworth.uk.xensource.com>
	<alpine.DEB.2.00.1111101128020.3519@kaball-desktop>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320925338.955.211.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, Ian
	Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-11-10 at 11:37 +0000, Stefano Stabellini wrote:
> On Mon, 7 Nov 2011, Ian Campbell wrote:
> > # HG changeset patch
> > # User Ian Campbell <ian.campbell@citrix.com>
> > # Date 1320678758 0
> > # Node ID 291f6cb0d03e56e4edbe53c640c96dff85d9bf08
> > # Parent  705b2e659ff885379fb8b1c4aefbecfb3b8cc1eb
> > docs: add a document describing the xl cfg file syntax
> > 
> > Based on an initial version by Ian Jackson.
> > 
> > I believe that all keys are now present in the document although there are are
> > various omissions in the actual documentation of them. Hopefully however this
> > covers the majority of the most interesting keys.
> 
> I think it would be very useful as a manpage.
> If we really want to keep it in markdown rather than pod, we could still
> find a way to convert it into a manpage (using ronn, pandoc, etc.).

If there is a good markdown->man converter I'm all for using it.


> > +## Selecting Guest Type
> > +
> > + * `builder=hvm`: Specifies that this is to be an HVM domain.  That
> > +   is, a fully virtualised computer with emulated BIOS, disk and
> > +   network peripherals, etc.  The default is a PV domain, suitable for
> > +   hosting Xen-aware guest operating systems.
> 
> I think builder=[hvm|pv] would make it clearer what the options are. I
> know that the idea is that a pv guest doesn't need this key pair but I
> think that as it is can be confusing.

I remember thinking that too, I wonder why I didn't actually make the
change. I will do so now.

> 
> [...]
> 
> > +
> > +## Devices
> > +
> > +The following options define the paravirtual, emulated and physical
> > +devices which the guest will contain.
> > +
> > + * `disk=[ "DISK_SPEC_STRING", "DISK_SPEC_STRING", ...]`: Specifies
> > +   the disks (both emulated disks and Xen virtual block devices) which
> > +   are to be provided to the guest, and what objects on the they
> > +   should map to.  See `docs/misc/xl-disk-configuration.txt`.
> > +
> > + * `vif=[ "NET_SPEC_STRING", "NET_SPEC_STRING", ...]`: Specifies the
> > +   networking provision (both emulated network adapters, and Xen
> > +   virtual interfaces) to provided to the guest.  See
> > +   `docs/misc/xl-network-configuration.markdown`.
> > +
> > + * `vfb=[ "VFB_SPEC_STRING", "VFB_SPEC_STRING", ...]`: Specifies the
> > +   paravirtual framebuffer devices which should be supplied to the domain.
> > +
> > +   This options does not control the emulated graphics card presented
> > +   to an HVM guest. See "Emulated VGA Graphics Device" below for how
> > +   to configure the emulated device.
> 
> and it is only relevant for PV guests.

Really, I thought that it was possible for a PVHVM to have a PV FB too?
Perhaps only in theory?

> 
> [...]
> 
> > + * `tsc_mode=VALUE`: Specifies how the TSC (Time Stamp Counter) should
> > +   be provided to the guest.  XXX ???
> 
> see docs/misc/tscmode.txt

I just posted a patch to update this section. I hadn't noticed this doc
so the snarky comment in that patch now seems a little unwarranted...

Ian.

> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:49:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:49:43 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROT8Z-0003WV-2z; Thu, 10 Nov 2011 03:49:43 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROT2X-00015Z-0Y
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:43:29 -0800
X-Env-Sender: david.vrabel@citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1320925404!3626612!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12787 invoked from network); 10 Nov 2011 11:43:25 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:43:25 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315195200"; d="scan'208";a="170086087"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 06:43:23 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.65) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 06:43:23 -0500
Received: from qabil.uk.xensource.com (qabil.uk.xensource.com [10.80.2.76])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pAABhLkw022128;
	Thu, 10 Nov 2011 03:43:22 -0800
From: David Vrabel <david.vrabel@citrix.com>
To: xen-devel@lists.xensource.com
Date: Thu, 10 Nov 2011 11:43:02 +0000
Message-ID: <1320925384-325-1-git-send-email-david.vrabel@citrix.com>
X-Mailer: git-send-email 1.7.2.5
MIME-Version: 1.0
Content-Type: text/plain
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 0/2] xen: document sysfs files (#2)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This two patches add ABI documentation for balloon driver and backend
sysfs files.

Changes in v2:
- corrections to balloon driver docs follow review by Daniel Kiper.

David


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:50:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:50:37 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROT9R-0003tn-B4; Thu, 10 Nov 2011 03:50:37 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROT2X-00015s-Dl
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:43:29 -0800
X-Env-Sender: david.vrabel@citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1320925404!3626612!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12816 invoked from network); 10 Nov 2011 11:43:26 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:43:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315195200"; d="scan'208";a="170086090"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 06:43:25 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.65) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 06:43:25 -0500
Received: from qabil.uk.xensource.com (qabil.uk.xensource.com [10.80.2.76])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pAABhLl0022128;
	Thu, 10 Nov 2011 03:43:24 -0800
From: David Vrabel <david.vrabel@citrix.com>
To: xen-devel@lists.xensource.com
Date: Thu, 10 Nov 2011 11:43:04 +0000
Message-ID: <1320925384-325-3-git-send-email-david.vrabel@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1320925384-325-1-git-send-email-david.vrabel@citrix.com>
References: <1320925384-325-1-git-send-email-david.vrabel@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: David Vrabel <david.vrabel@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 2/2] xen: document backend sysfs files
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: David Vrabel <david.vrabel@citrix.com>

Add ABI documentation for the /sys/bus/xen-backend sysfs files,
including those specific to blkback devices.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
---
 Documentation/ABI/stable/sysfs-bus-xen-backend |   75 ++++++++++++++++++++++++
 1 files changed, 75 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/ABI/stable/sysfs-bus-xen-backend

diff --git a/Documentation/ABI/stable/sysfs-bus-xen-backend b/Documentation/ABI/stable/sysfs-bus-xen-backend
new file mode 100644
index 0000000..3d5951c
--- /dev/null
+++ b/Documentation/ABI/stable/sysfs-bus-xen-backend
@@ -0,0 +1,75 @@
+What:		/sys/bus/xen-backend/devices/*/devtype
+Date:		Feb 2009
+KernelVersion:	2.6.38
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+                The type of the device.  e.g., one of: 'vbd' (block),
+                'vif' (network), or 'vfb' (framebuffer).
+
+What:		/sys/bus/xen-backend/devices/*/nodename
+Date:		Feb 2009
+KernelVersion:	2.6.38
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+                XenStore node (under /local/domain/NNN/) for this
+                backend device.
+
+What:		/sys/bus/xen-backend/devices/vbd-*/physical_device
+Date:		April 2011
+KernelVersion:	3.0
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+                The major:minor number (in hexidecimal) of the
+                physical device providing the storage for this backend
+                block device.
+
+What:		/sys/bus/xen-backend/devices/vbd-*/mode
+Date:		April 2011
+KernelVersion:	3.0
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+                Whether the block device is read-only ('r') or
+                read-write ('w').
+
+What:		/sys/bus/xen-backend/devices/vbd-*/statistics/f_req
+Date:		April 2011
+KernelVersion:	3.0
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+                Number of flush requests from the frontend.
+
+What:		/sys/bus/xen-backend/devices/vbd-*/statistics/oo_req
+Date:		April 2011
+KernelVersion:	3.0
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+                Number of requests delayed because the backend was too
+                busy processing previous requests.
+
+What:		/sys/bus/xen-backend/devices/vbd-*/statistics/rd_req
+Date:		April 2011
+KernelVersion:	3.0
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+                Number of read requests from the frontend.
+
+What:		/sys/bus/xen-backend/devices/vbd-*/statistics/rd_sect
+Date:		April 2011
+KernelVersion:	3.0
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+                Number of sectors read by the frontend.
+
+What:		/sys/bus/xen-backend/devices/vbd-*/statistics/wr_req
+Date:		April 2011
+KernelVersion:	3.0
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+                Number of write requests from the frontend.
+
+What:		/sys/bus/xen-backend/devices/vbd-*/statistics/wr_sect
+Date:		April 2011
+KernelVersion:	3.0
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+                Number of sectors written by the frontend.
-- 
1.7.2.5


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:51:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:51:20 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROTA8-0004Gm-7q; Thu, 10 Nov 2011 03:51:20 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROT2X-000161-N6
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:43:30 -0800
X-Env-Sender: david.vrabel@citrix.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1320925405!2972797!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28620 invoked from network); 10 Nov 2011 11:43:26 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-3.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:43:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315195200"; d="scan'208";a="18982893"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 06:43:24 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.65) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 06:43:24 -0500
Received: from qabil.uk.xensource.com (qabil.uk.xensource.com [10.80.2.76])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pAABhLkx022128;
	Thu, 10 Nov 2011 03:43:23 -0800
From: David Vrabel <david.vrabel@citrix.com>
To: xen-devel@lists.xensource.com
Date: Thu, 10 Nov 2011 11:43:03 +0000
Message-ID: <1320925384-325-2-git-send-email-david.vrabel@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1320925384-325-1-git-send-email-david.vrabel@citrix.com>
References: <1320925384-325-1-git-send-email-david.vrabel@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: David Vrabel <david.vrabel@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 1/2] xen: document balloon driver sysfs files
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: David Vrabel <david.vrabel@citrix.com>

Add ABI documentation for the balloon driver's sysfs files.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Reviewed-by: Daniel Kiper <dkiper@net-space.pl>
---
 .../ABI/stable/sysfs-devices-system-xen_memory     |   77 ++++++++++++++++++++
 1 files changed, 77 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/ABI/stable/sysfs-devices-system-xen_memory

diff --git a/Documentation/ABI/stable/sysfs-devices-system-xen_memory b/Documentation/ABI/stable/sysfs-devices-system-xen_memory
new file mode 100644
index 0000000..f458c50
--- /dev/null
+++ b/Documentation/ABI/stable/sysfs-devices-system-xen_memory
@@ -0,0 +1,77 @@
+What:		/sys/devices/system/xen_memory/xen_memory0/max_retry_count
+Date:		May 2011
+KernelVersion:	2.6.39
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+		The maximum number of times the balloon driver will
+		attempt to increase the balloon before giving up.  See
+		also 'retry_count' below.
+		A value of zero means retry forever and is the default one.
+
+What:		/sys/devices/system/xen_memory/xen_memory0/max_schedule_delay
+Date:		May 2011
+KernelVersion:	2.6.39
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+		The limit that 'schedule_delay' (see below) will be
+		increased to. The default value is 32 seconds.
+
+What:		/sys/devices/system/xen_memory/xen_memory0/retry_count
+Date:		May 2011
+KernelVersion:	2.6.39
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+		The current number of times that the balloon driver
+		has attempted to increase the size of the balloon.
+		The default value is one. With max_retry_count being
+		zero (unlimited), this means that the driver will attempt
+		to retry with a 'schedule_delay' delay.
+
+What:		/sys/devices/system/xen_memory/xen_memory0/schedule_delay
+Date:		May 2011
+KernelVersion:	2.6.39
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+		The time (in seconds) to wait between attempts to
+		increase the balloon.  Each time the balloon cannot be
+		increased, 'schedule_delay' is increased (until
+		'max_schedule_delay' is reached at which point it will
+		use that value).
+
+What:		/sys/devices/system/xen_memory/xen_memory0/target
+Date:		April 2008
+KernelVersion:	2.6.26
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+		The target number of pages to adjust this domain's
+		memory reservation to.
+
+What:		/sys/devices/system/xen_memory/xen_memory0/target_kb
+Date:		April 2008
+KernelVersion:	2.6.26
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+		As target above, except the value is in KiB.
+
+What:		/sys/devices/system/xen_memory/xen_memory0/info/current_kb
+Date:		April 2008
+KernelVersion:	2.6.26
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+		Current size (in KiB) of this domain's memory
+		reservation.
+
+What:		/sys/devices/system/xen_memory/xen_memory0/info/high_kb
+Date:		April 2008
+KernelVersion:	2.6.26
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+		Amount (in KiB) of high memory in the balloon.
+
+What:		/sys/devices/system/xen_memory/xen_memory0/info/low_kb
+Date:		April 2008
+KernelVersion:	2.6.26
+Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Description:
+		Amount (in KiB) of low (or normal) memory in the
+		balloon.
-- 
1.7.2.5


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:52:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:52:44 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROTBU-0004ki-P3; Thu, 10 Nov 2011 03:52:44 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROT3M-0001P2-H1
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:44:21 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1320925427!43386794!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12780 invoked from network); 10 Nov 2011 11:43:47 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:43:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8860841"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 11:44:17 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Thu, 10 Nov 2011 11:44:17 +0000
Subject: Re: [Xen-devel] [PATCH] libxl: use named options for tsc_mode
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 11:44:16 +0000
In-Reply-To: <bc79b560aafa1e4dc42a.1320922519@cosworth.uk.xensource.com>
References: <bc79b560aafa1e4dc42a.1320922519@cosworth.uk.xensource.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320925456.955.213.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Ian Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-11-10 at 10:55 +0000, Ian Campbell wrote:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@citrix.com>
> # Date 1320922479 0
> # Node ID bc79b560aafa1e4dc42af00e6a326dc651b5636a
> # Parent  460b507e15f864dd6712f5040e36538d6e076ae4
> libxl: use named options for tsc_mode.
> 
> It seems that this knob is expoerted from the hypervisor as a raw
> integer (no symbolic names) documented in xen/include/asm-x86. Propagating that
> all the way to the end user is hardly friendly (it's bad enough in the
> hypercall interface).

I've just seen docs/misc/tscmode.txt which is actually a pretty
comprehensive explanation of what's going on so the above is
unwarranted. I'll update this patch to include a reference in the
xl-domain-config.

> 
> Add an enum at the libxl level with a hopefully descriptive set of names.
> Deprecate the use of an integer in xl cfg files.

I think the naming at the libxl level is still useful even if the values
are documented.

Ian.

> 
> Signed-off-by: Ian Campbell
> 
> diff -r 460b507e15f8 -r bc79b560aafa docs/user/xl-domain-config.markdown
> --- a/docs/user/xl-domain-config.markdown	Thu Nov 10 10:18:29 2011 +0000
> +++ b/docs/user/xl-domain-config.markdown	Thu Nov 10 10:54:39 2011 +0000
> @@ -1,4 +1,4 @@
> - # xl Domain Configuration
> +# xl Domain Configuration
>  
>  To create a VM (a domain in Xen terminology, sometimes called a guest)
>  with xl requires the provision of a domain config file.  Typically
> @@ -338,6 +338,29 @@ accept the defaults for these options wh
>     extensions (e.g. Windows XP compatibility mode on more modern
>     Windows OS).
>  
> +### Guest Virtual Time Controls
> +
> + * `tsc_mode="MODE"`: Specifies how the TSC (Time Stamp Counter)
> +   should be provided to the guest (X86 only). Specifying this option as a number
> +   is deprecated. Options are:
> +
> +   * `"default"`: guest rdtsc/p executed natively when monotonicity
> +     can be guaranteed and emulated otherwise (with frequency scaled
> +     if necessary).
> +
> +   * `"always_emulate"`: guest rdtsc/p always emulated at 1GHz (kernel
> +     and user).
> +
> +   * `"native"`: guest rdtsc always executed natively (no
> +     monotonicity/frequency guarantees); guest rdtscp emulated at
> +     native frequency if unsupported by h/w, else executed natively.
> +
> +   * `"native_paravirt"`: same as `native`, except xen manages TSC_AUX
> +      register so guest can determine when a restore/migration has
> +      occurred and assumes guest obtains/uses pvclock-like mechanism
> +      to adjust for monotonicity and frequency changes.
> +
> +
>  ### Support for Paravirtualisation of HVM Guests
>  
>  The following options allow Paravirtualised features (such as devices)
> @@ -546,9 +569,6 @@ certainly belong in a more appropriate s
>     enables certain other features which are incompatible with
>     migration (currently certain TSC modes XXX ?).
>  
> - * `tsc_mode=VALUE`: Specifies how the TSC (Time Stamp Counter) should
> -   be provided to the guest.  XXX ???
> -
>   * `pci_msitranslate=BOOLEAN`: XXX
>  
>   * `pci_power_mgmt=BOOLEAN`: XXX
> diff -r 460b507e15f8 -r bc79b560aafa tools/libxl/libxl_dom.c
> --- a/tools/libxl/libxl_dom.c	Thu Nov 10 10:18:29 2011 +0000
> +++ b/tools/libxl/libxl_dom.c	Thu Nov 10 10:54:39 2011 +0000
> @@ -73,12 +73,29 @@ int libxl__build_pre(libxl__gc *gc, uint
>                libxl_domain_build_info *info, libxl__domain_build_state *state)
>  {
>      libxl_ctx *ctx = libxl__gc_owner(gc);
> +    int tsc_mode;
>      xc_domain_max_vcpus(ctx->xch, domid, info->max_vcpus);
>      xc_domain_setmaxmem(ctx->xch, domid, info->target_memkb + LIBXL_MAXMEM_CONSTANT);
>      if (info->type == LIBXL_DOMAIN_TYPE_PV)
>          xc_domain_set_memmap_limit(ctx->xch, domid,
>                  (info->max_memkb + info->u.pv.slack_memkb));
> -    xc_domain_set_tsc_info(ctx->xch, domid, info->tsc_mode, 0, 0, 0);
> +    switch (info->tsc_mode) {
> +    case LIBXL_TSC_MODE_DEFAULT:
> +        tsc_mode = 0;
> +        break;
> +    case LIBXL_TSC_MODE_ALWAYS_EMULATE:
> +        tsc_mode = 1;
> +        break;
> +    case LIBXL_TSC_MODE_NATIVE:
> +        tsc_mode = 2;
> +        break;
> +    case LIBXL_TSC_MODE_NATIVE_PARAVIRT:
> +        tsc_mode = 3;
> +        break;
> +    default:
> +        abort();
> +    }
> +    xc_domain_set_tsc_info(ctx->xch, domid, tsc_mode, 0, 0, 0);
>      if ( info->disable_migrate )
>          xc_domain_disable_migrate(ctx->xch, domid);
>  
> diff -r 460b507e15f8 -r bc79b560aafa tools/libxl/libxl_types.idl
> --- a/tools/libxl/libxl_types.idl	Thu Nov 10 10:18:29 2011 +0000
> +++ b/tools/libxl/libxl_types.idl	Thu Nov 10 10:54:39 2011 +0000
> @@ -85,6 +85,13 @@ libxl_button = Enumeration("button", [
>      (2, "SLEEP"),
>      ])
>  
> +libxl_tsc_mode = Enumeration("tsc_mode", [
> +    (0, "default"),
> +    (1, "always_emulate"),
> +    (2, "native"),
> +    (3, "native_paravirt"),
> +    ])
> +
>  #
>  # Complex libxl types
>  #
> @@ -154,7 +161,7 @@ libxl_domain_create_info = Struct("domai
>  libxl_domain_build_info = Struct("domain_build_info",[
>      ("max_vcpus",       integer),
>      ("cur_vcpus",       integer),
> -    ("tsc_mode",        integer),
> +    ("tsc_mode",        libxl_tsc_mode),
>      ("max_memkb",       uint32),
>      ("target_memkb",    uint32),
>      ("video_memkb",     uint32),
> diff -r 460b507e15f8 -r bc79b560aafa tools/libxl/xl_cmdimpl.c
> --- a/tools/libxl/xl_cmdimpl.c	Thu Nov 10 10:18:29 2011 +0000
> +++ b/tools/libxl/xl_cmdimpl.c	Thu Nov 10 10:54:39 2011 +0000
> @@ -328,7 +328,7 @@ static void printf_info(int domid,
>  
>      printf("\t(build_info)\n");
>      printf("\t(max_vcpus %d)\n", b_info->max_vcpus);
> -    printf("\t(tsc_mode %d)\n", b_info->tsc_mode);
> +    printf("\t(tsc_mode %s)\n", libxl_tsc_mode_to_string(b_info->tsc_mode));
>      printf("\t(max_memkb %d)\n", b_info->max_memkb);
>      printf("\t(target_memkb %d)\n", b_info->target_memkb);
>      printf("\t(nomigrate %d)\n", b_info->disable_migrate);
> @@ -662,8 +662,23 @@ static void parse_config_data(const char
>      if (!xlu_cfg_get_long (config, "nomigrate", &l, 0))
>          b_info->disable_migrate = l;
>  
> -    if (!xlu_cfg_get_long(config, "tsc_mode", &l, 0))
> +    if (!xlu_cfg_get_long(config, "tsc_mode", &l, 1)) {
> +        fprintf(stderr, "WARNING: specifying \"tsc_mode\" as an integer is deprecated. "
> +                "Please use the named parameter variant.\n");
> +        if (l < LIBXL_TSC_MODE_DEFAULT ||
> +            l > LIBXL_TSC_MODE_NATIVE_PARAVIRT) {
> +            fprintf(stderr, "ERROR: invalid value %ld for \"tsc_mode\"\n", l);
> +            exit (1);
> +        }
>          b_info->tsc_mode = l;
> +    } else if (!xlu_cfg_get_string(config, "tsc_mode", &buf, 0)) {
> +        fprintf(stderr, "got a tsc mode string: \"%s\"\n", buf);
> +        if (libxl_tsc_mode_from_string(buf, &b_info->tsc_mode)) {
> +            fprintf(stderr, "ERROR: invalid value \"%s\" for \"tsc_mode\"\n",
> +                    buf);
> +            exit (1);
> +        }
> +    }
>  
>      if (!xlu_cfg_get_long (config, "videoram", &l, 0))
>          b_info->video_memkb = l * 1024;
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:53:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:53:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROTCZ-00058Q-JB; Thu, 10 Nov 2011 03:53:51 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROT4W-0001ba-KC
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:45:32 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1320925516!45098166!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8542 invoked from network); 10 Nov 2011 11:45:16 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:45:16 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8860867"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 11:45:16 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 11:45:16 +0000
Date: Thu, 10 Nov 2011 11:46:00 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 3 of 7] docs: add a document describing the
	xl cfg file syntax
In-Reply-To: <1320925338.955.211.camel@zakaz.uk.xensource.com>
Message-ID: <alpine.DEB.2.00.1111101143440.3519@kaball-desktop>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
	<291f6cb0d03e56e4edbe.1320678792@cosworth.uk.xensource.com>
	<alpine.DEB.2.00.1111101128020.3519@kaball-desktop>
	<1320925338.955.211.camel@zakaz.uk.xensource.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 10 Nov 2011, Ian Campbell wrote:
> > I think it would be very useful as a manpage.
> > If we really want to keep it in markdown rather than pod, we could still
> > find a way to convert it into a manpage (using ronn, pandoc, etc.).
> 
> If there is a good markdown->man converter I'm all for using it.

well, I am not sure if any of them are good, but a badly formatted
manpage is still better than no manpage at all


> > > +
> > > +## Devices
> > > +
> > > +The following options define the paravirtual, emulated and physical
> > > +devices which the guest will contain.
> > > +
> > > + * `disk=[ "DISK_SPEC_STRING", "DISK_SPEC_STRING", ...]`: Specifies
> > > +   the disks (both emulated disks and Xen virtual block devices) which
> > > +   are to be provided to the guest, and what objects on the they
> > > +   should map to.  See `docs/misc/xl-disk-configuration.txt`.
> > > +
> > > + * `vif=[ "NET_SPEC_STRING", "NET_SPEC_STRING", ...]`: Specifies the
> > > +   networking provision (both emulated network adapters, and Xen
> > > +   virtual interfaces) to provided to the guest.  See
> > > +   `docs/misc/xl-network-configuration.markdown`.
> > > +
> > > + * `vfb=[ "VFB_SPEC_STRING", "VFB_SPEC_STRING", ...]`: Specifies the
> > > +   paravirtual framebuffer devices which should be supplied to the domain.
> > > +
> > > +   This options does not control the emulated graphics card presented
> > > +   to an HVM guest. See "Emulated VGA Graphics Device" below for how
> > > +   to configure the emulated device.
> > 
> > and it is only relevant for PV guests.
> 
> Really, I thought that it was possible for a PVHVM to have a PV FB too?
> Perhaps only in theory?

Only in theory, there is no support for it at the moment and I don't
think there will be anytime soon.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:55:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:55:03 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROTDj-0005ZF-PL; Thu, 10 Nov 2011 03:55:03 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROT6S-0002SG-Fv
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:47:32 -0800
X-Env-Sender: david.vrabel@citrix.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1320925647!2590818!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13471 invoked from network); 10 Nov 2011 11:47:29 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-7.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:47:29 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315195200"; d="scan'208";a="170086337"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 06:47:17 -0500
Received: from [10.80.2.76] (10.80.2.76) by FTLPMAILMX01.citrite.net
	(10.13.107.65) with Microsoft SMTP Server id 8.3.137.0; Thu, 10 Nov 2011
	06:45:47 -0500
Message-ID: <4EBBB96A.9010400@citrix.com>
Date: Thu, 10 Nov 2011 11:45:46 +0000
From: David Vrabel <david.vrabel@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.1.16) Gecko/20110818 Icedove/3.0.11
MIME-Version: 1.0
To: Daniel Kiper <dkiper@net-space.pl>
Subject: Re: [Xen-devel] [PATCH] xen: document balloon driver sysfs files
References: <1319626664-28225-1-git-send-email-david.vrabel@citrix.com>	<20111026191212.GA17424@router-fw-old.local.net-space.pl>	<20111108165915.GB30802@phenom.dumpdata.com>
	<20111108201043.GB6539@router-fw-old.local.net-space.pl>
In-Reply-To: <20111108201043.GB6539@router-fw-old.local.net-space.pl>
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: xen-devel@lists.xensource.com, David Vrabel <david.vrabel@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 08/11/11 20:10, Daniel Kiper wrote:
> On Tue, Nov 08, 2011 at 11:59:15AM -0500, Konrad Rzeszutek Wilk wrote:
>> Daniel, how does this look ? I added your Reviewed-by, but if you want
>> to make some more modifications I can certainly do so.

Thanks for this Konrad, I've been swamped by customer issues lately.

>> +What:		/sys/devices/system/xen_memory/xen_memory0/schedule_delay
>> +Date:		May 2011
>> +KernelVersion:	2.6.39
>> +Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
>> +Description:
>> +		The time (in jiffies) to wait between attempts to
> 
> It is in seconds. Please look at the end of balloon_process() funtion.
> This value is multiplicated by HZ constant (which indeed is scaled in
> jiffies, however, I think in this case second is better unit).

I've posted a new version with this correction.

David

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 03:55:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 03:55:59 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROTEd-0005w1-Ma; Thu, 10 Nov 2011 03:55:59 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROTBz-0004ye-LK
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 03:53:16 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1320925992!3007703!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25114 invoked from network); 10 Nov 2011 11:53:12 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 11:53:12 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8861134"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 11:53:12 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 11:53:12 +0000
Date: Thu, 10 Nov 2011 11:53:45 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: NaizhengTAN <njudroid@gmail.com>
Subject: Re: [Xen-devel] Question about unplug a pass-through device
In-Reply-To: <CAOPAWnZZV6VYK+-QPpqDhEsMz+8ASJktS6tCiHLeVARP+OMriA@mail.gmail.com>
Message-ID: <alpine.DEB.2.00.1111101152470.3519@kaball-desktop>
References: <CAOPAWnZZV6VYK+-QPpqDhEsMz+8ASJktS6tCiHLeVARP+OMriA@mail.gmail.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 10 Nov 2011, NaizhengTAN wrote:
> Hi,
>    Are there any tools in XEN to unplug a pass-through device and
> immediately introduce another emulate device?

The tool to unplug a pass-through is device is "xl pci-detach", there is
no way to hotplug an emulated device.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 04:07:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 04:07:02 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROTPJ-0006Yh-MK; Thu, 10 Nov 2011 04:07:01 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROTNc-0006LF-MC
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 04:05:17 -0800
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-6.tower-21.messagelabs.com!1320926712!3685839!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9162 invoked from network); 10 Nov 2011 12:05:13 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-6.tower-21.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 10 Nov 2011 12:05:13 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1320926712; l=763;
	s=domk; d=aepfle.de;
	h=In-Reply-To:Content-Type:MIME-Version:References:Subject:Cc:To:From:
	Date:X-RZG-CLASS-ID:X-RZG-AUTH;
	bh=bTe6ReVthYs1kbpkZzpTTSb/hZQ=;
	b=bdlctieg6RJBjcQQUG5pEo6XS3gjdbW6oiBUn1DfO8zyrQZRsqecNQ2ewpqEr99C83X
	iV1XsndGWu1MCi+OH6KRPmSyAErZy8F/NxqzMrha5SH7B0e3HkubjoOZyZXJFyAloJ9+h
	JVAw5Ewmcyx913o8JxL1LhJ9zUZSXMiBLfs=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV454=
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-9.vodafone-net.de [80.226.24.9])
	by post.strato.de (mrclete mo7) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id 6036ccnAABiofo ;
	Thu, 10 Nov 2011 13:05:04 +0100 (MET)
Received: by probook.site (Postfix, from userid 1000)
	id 046BE18638; Thu, 10 Nov 2011 13:05:01 +0100 (CET)
Date: Thu, 10 Nov 2011 13:05:01 +0100
From: Olaf Hering <olaf@aepfle.de>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Message-ID: <20111110120501.GA594@aepfle.de>
References: <20111108224414.83985CF73A@homiemail-mx7.g.dreamhost.com>
	<3c097da8e49a42af1210e4ffcd39fd48.squirrel@webmail.lagarcavilla.org>
	<20111109070927.GB26154@aepfle.de>
	<0bb01a4d216a68c4ae8441b037927f61.squirrel@webmail.lagarcavilla.org>
	<20111109221148.GA17166@aepfle.de>
	<5d7d38b18271fcc7aa750604eeb52bbd.squirrel@webmail.lagarcavilla.org>
	<20111110101828.GA31293@aepfle.de>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <20111110101828.GA31293@aepfle.de>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
Cc: keir.xen@gmail.com, xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: Need help with fixing the Xen waitqueue feature
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Nov 10, Olaf Hering wrote:

> On Wed, Nov 09, Andres Lagar-Cavilla wrote:
> > The tools retry as long as IOCTL_PRIVCMD_MMAPBATCH_V2 is supported. Which
> > it isn't on mainline linux 3.0, 3.1, etc. Which dom0 kernel are you using?
> I'm running SLES11 as dom0. Now thats really odd that there is no ENOENT
> handling in mainline, I will go and check the code.

xen_remap_domain_mfn_range() has to catch -ENOENT returned from
HYPERVISOR_mmu_update() and return it to its callers. Then
drivers/xen/xenfs/privcmd.c:traverse_pages() will do the right thing.
See
http://xenbits.xen.org/hg/linux-2.6.18-xen.hg/rev/0051d294bb60

The granttable part needs more changes, see
http://xenbits.xen.org/hg/linux-2.6.18-xen.hg/rev/7c7efaea8b54


Olaf

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 04:19:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 04:19:36 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROTbU-0007DG-AM; Thu, 10 Nov 2011 04:19:36 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROTal-00070Y-GE
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 04:18:51 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1320927502!47932975!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10320 invoked from network); 10 Nov 2011 12:18:22 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-4.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 12:18:22 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 10 Nov 2011 12:18:47 +0000
Message-Id: <4EBBCF3602000078000602C0@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 10 Nov 2011 12:18:46 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jean Guyader" <jean.guyader@eu.citrix.com>
References: <1320924931-6891-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-5-git-send-email-jean.guyader@eu.citrix.com>
In-Reply-To: <1320924931-6891-5-git-send-email-jean.guyader@eu.citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: keir@xen.org, xen-devel@lists.xensource.com, allen.m.kay@intel.com,
	tim@xen.org
Subject: [Xen-devel] Re: [PATCH 4/7] mm: xenmem_add_to_physmap now takes a
	pointer on xatp
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 12:35, Jean Guyader <jean.guyader@eu.citrix.com> wrote:

Any reason why this can't be done right away in patch 3?

> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> ---
>  xen/arch/x86/mm.c |   40 ++++++++++++++++++++--------------------
>  1 files changed, 20 insertions(+), 20 deletions(-)




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 04:21:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 04:21:31 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROTdL-0007hQ-K5; Thu, 10 Nov 2011 04:21:31 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROTcd-0007UW-RD
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 04:20:48 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320927617!52210806!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27846 invoked from network); 10 Nov 2011 12:20:18 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 12:20:18 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315195200"; d="scan'208";a="170089835"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 07:20:43 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.65) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 07:20:42 -0500
Received: from cosworth.uk.xensource.com (cosworth.uk.xensource.com
	[10.80.16.52])	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	pAACKfkV022662;	Thu, 10 Nov 2011 04:20:42 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: dcc3fc454c9995608c42b33c47c858746183806e
Message-ID: <dcc3fc454c9995608c42.1320927640@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 10 Nov 2011 12:20:40 +0000
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH V2] libxl: use named options for tsc_mode
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1320927597 0
# Node ID dcc3fc454c9995608c42b33c47c858746183806e
# Parent  460b507e15f864dd6712f5040e36538d6e076ae4
libxl: use named options for tsc_mode.

Add an enum at the libxl level with a hopefully descriptive set of names.
Deprecate the use of an integer in xl cfg files.

Signed-off-by: Ian Campbell

diff -r 460b507e15f8 -r dcc3fc454c99 docs/user/xl-domain-config.markdown
--- a/docs/user/xl-domain-config.markdown	Thu Nov 10 10:18:29 2011 +0000
+++ b/docs/user/xl-domain-config.markdown	Thu Nov 10 12:19:57 2011 +0000
@@ -1,4 +1,4 @@
- # xl Domain Configuration
+# xl Domain Configuration
 
 To create a VM (a domain in Xen terminology, sometimes called a guest)
 with xl requires the provision of a domain config file.  Typically
@@ -338,6 +338,30 @@ accept the defaults for these options wh
    extensions (e.g. Windows XP compatibility mode on more modern
    Windows OS).
 
+### Guest Virtual Time Controls
+
+ * `tsc_mode="MODE"`: Specifies how the TSC (Time Stamp Counter)
+   should be provided to the guest (X86 only). Specifying this option as a number
+   is deprecated. Options are:
+
+   * `"default"`: guest rdtsc/p executed natively when monotonicity
+     can be guaranteed and emulated otherwise (with frequency scaled
+     if necessary).
+
+   * `"always_emulate"`: guest rdtsc/p always emulated at 1GHz (kernel
+     and user).
+
+   * `"native"`: guest rdtsc always executed natively (no
+     monotonicity/frequency guarantees); guest rdtscp emulated at
+     native frequency if unsupported by h/w, else executed natively.
+
+   * `"native_paravirt"`: same as `native`, except xen manages TSC_AUX
+      register so guest can determine when a restore/migration has
+      occurred and assumes guest obtains/uses pvclock-like mechanism
+      to adjust for monotonicity and frequency changes.
+
+   Please see [docs/misc/tscmode.txt] for more information on this option.
+
 ### Support for Paravirtualisation of HVM Guests
 
 The following options allow Paravirtualised features (such as devices)
@@ -546,9 +570,6 @@ certainly belong in a more appropriate s
    enables certain other features which are incompatible with
    migration (currently certain TSC modes XXX ?).
 
- * `tsc_mode=VALUE`: Specifies how the TSC (Time Stamp Counter) should
-   be provided to the guest.  XXX ???
-
  * `pci_msitranslate=BOOLEAN`: XXX
 
  * `pci_power_mgmt=BOOLEAN`: XXX
diff -r 460b507e15f8 -r dcc3fc454c99 tools/libxl/libxl_dom.c
--- a/tools/libxl/libxl_dom.c	Thu Nov 10 10:18:29 2011 +0000
+++ b/tools/libxl/libxl_dom.c	Thu Nov 10 12:19:57 2011 +0000
@@ -73,12 +73,29 @@ int libxl__build_pre(libxl__gc *gc, uint
               libxl_domain_build_info *info, libxl__domain_build_state *state)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
+    int tsc_mode;
     xc_domain_max_vcpus(ctx->xch, domid, info->max_vcpus);
     xc_domain_setmaxmem(ctx->xch, domid, info->target_memkb + LIBXL_MAXMEM_CONSTANT);
     if (info->type == LIBXL_DOMAIN_TYPE_PV)
         xc_domain_set_memmap_limit(ctx->xch, domid,
                 (info->max_memkb + info->u.pv.slack_memkb));
-    xc_domain_set_tsc_info(ctx->xch, domid, info->tsc_mode, 0, 0, 0);
+    switch (info->tsc_mode) {
+    case LIBXL_TSC_MODE_DEFAULT:
+        tsc_mode = 0;
+        break;
+    case LIBXL_TSC_MODE_ALWAYS_EMULATE:
+        tsc_mode = 1;
+        break;
+    case LIBXL_TSC_MODE_NATIVE:
+        tsc_mode = 2;
+        break;
+    case LIBXL_TSC_MODE_NATIVE_PARAVIRT:
+        tsc_mode = 3;
+        break;
+    default:
+        abort();
+    }
+    xc_domain_set_tsc_info(ctx->xch, domid, tsc_mode, 0, 0, 0);
     if ( info->disable_migrate )
         xc_domain_disable_migrate(ctx->xch, domid);
 
diff -r 460b507e15f8 -r dcc3fc454c99 tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl	Thu Nov 10 10:18:29 2011 +0000
+++ b/tools/libxl/libxl_types.idl	Thu Nov 10 12:19:57 2011 +0000
@@ -85,6 +85,13 @@ libxl_button = Enumeration("button", [
     (2, "SLEEP"),
     ])
 
+libxl_tsc_mode = Enumeration("tsc_mode", [
+    (0, "default"),
+    (1, "always_emulate"),
+    (2, "native"),
+    (3, "native_paravirt"),
+    ])
+
 #
 # Complex libxl types
 #
@@ -154,7 +161,7 @@ libxl_domain_create_info = Struct("domai
 libxl_domain_build_info = Struct("domain_build_info",[
     ("max_vcpus",       integer),
     ("cur_vcpus",       integer),
-    ("tsc_mode",        integer),
+    ("tsc_mode",        libxl_tsc_mode),
     ("max_memkb",       uint32),
     ("target_memkb",    uint32),
     ("video_memkb",     uint32),
diff -r 460b507e15f8 -r dcc3fc454c99 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Thu Nov 10 10:18:29 2011 +0000
+++ b/tools/libxl/xl_cmdimpl.c	Thu Nov 10 12:19:57 2011 +0000
@@ -328,7 +328,7 @@ static void printf_info(int domid,
 
     printf("\t(build_info)\n");
     printf("\t(max_vcpus %d)\n", b_info->max_vcpus);
-    printf("\t(tsc_mode %d)\n", b_info->tsc_mode);
+    printf("\t(tsc_mode %s)\n", libxl_tsc_mode_to_string(b_info->tsc_mode));
     printf("\t(max_memkb %d)\n", b_info->max_memkb);
     printf("\t(target_memkb %d)\n", b_info->target_memkb);
     printf("\t(nomigrate %d)\n", b_info->disable_migrate);
@@ -662,8 +662,23 @@ static void parse_config_data(const char
     if (!xlu_cfg_get_long (config, "nomigrate", &l, 0))
         b_info->disable_migrate = l;
 
-    if (!xlu_cfg_get_long(config, "tsc_mode", &l, 0))
+    if (!xlu_cfg_get_long(config, "tsc_mode", &l, 1)) {
+        fprintf(stderr, "WARNING: specifying \"tsc_mode\" as an integer is deprecated. "
+                "Please use the named parameter variant.\n");
+        if (l < LIBXL_TSC_MODE_DEFAULT ||
+            l > LIBXL_TSC_MODE_NATIVE_PARAVIRT) {
+            fprintf(stderr, "ERROR: invalid value %ld for \"tsc_mode\"\n", l);
+            exit (1);
+        }
         b_info->tsc_mode = l;
+    } else if (!xlu_cfg_get_string(config, "tsc_mode", &buf, 0)) {
+        fprintf(stderr, "got a tsc mode string: \"%s\"\n", buf);
+        if (libxl_tsc_mode_from_string(buf, &b_info->tsc_mode)) {
+            fprintf(stderr, "ERROR: invalid value \"%s\" for \"tsc_mode\"\n",
+                    buf);
+            exit (1);
+        }
+    }
 
     if (!xlu_cfg_get_long (config, "videoram", &l, 0))
         b_info->video_memkb = l * 1024;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 04:24:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 04:24:04 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROTfo-000871-DA; Thu, 10 Nov 2011 04:24:04 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROTet-0007uH-KD
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 04:23:08 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1320927784!3651740!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10767 invoked from network); 10 Nov 2011 12:23:04 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 12:23:04 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8861948"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 12:23:04 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 12:23:04 +0000
Date: Thu, 10 Nov 2011 12:23:48 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 3 of 7] docs: add a document describing the
	xl cfg file syntax
In-Reply-To: <alpine.DEB.2.00.1111101143440.3519@kaball-desktop>
Message-ID: <alpine.DEB.2.00.1111101210430.3519@kaball-desktop>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
	<291f6cb0d03e56e4edbe.1320678792@cosworth.uk.xensource.com>
	<alpine.DEB.2.00.1111101128020.3519@kaball-desktop>
	<1320925338.955.211.camel@zakaz.uk.xensource.com>
	<alpine.DEB.2.00.1111101143440.3519@kaball-desktop>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Ian Campbell <Ian.Campbell@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 10 Nov 2011, Stefano Stabellini wrote:
> On Thu, 10 Nov 2011, Ian Campbell wrote:
> > > I think it would be very useful as a manpage.
> > > If we really want to keep it in markdown rather than pod, we could still
> > > find a way to convert it into a manpage (using ronn, pandoc, etc.).
> > 
> > If there is a good markdown->man converter I'm all for using it.
> 
> well, I am not sure if any of them are good, but a badly formatted
> manpage is still better than no manpage at all

I take it back: manpages generated by pandoc are unreadble but ronn
seems to work pretty well

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 04:27:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 04:27:11 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROTip-00004z-ME; Thu, 10 Nov 2011 04:27:11 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROTiL-0008KR-Ph
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 04:26:42 -0800
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320927998!3659604!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26411 invoked from network); 10 Nov 2011 12:26:38 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-14.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 12:26:38 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1ROTiE-000H0R-33; Thu, 10 Nov 2011 12:26:34 +0000
Date: Thu, 10 Nov 2011 12:26:34 +0000
From: Tim Deegan <tim@xen.org>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Subject: Re: [Xen-devel] [PATCH 5 of 5] Modify naming of queries into the p2m
Message-ID: <20111110122634.GD62117@ocelot.phlegethon.org>
References: <patchbomb.1320722908@xdev.gridcentric.ca>
	<e9fd07479f684f558a92.1320722913@xdev.gridcentric.ca>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <e9fd07479f684f558a92.1320722913@xdev.gridcentric.ca>
User-Agent: Mutt/1.4.2.1i
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, George.Dunlap@eu.citrix.com,
	andres@gridcentric.ca, keir.xen@gmail.com, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi, 

This mostly looks good; I have a few comments on the detail below. 
If those are addressed I hope I can apply the next version.

Any other maintainers want to object to this renaming?  

At 22:28 -0500 on 07 Nov (1320704913), Andres Lagar-Cavilla wrote:
> @@ -1182,6 +1195,7 @@ int hvm_hap_nested_page_fault(unsigned l
>      mfn_t mfn;
>      struct vcpu *v = current;
>      struct p2m_domain *p2m;
> +    int rc;
>  
>      /* On Nested Virtualization, walk the guest page table.
>       * If this succeeds, all is fine.
> @@ -1255,8 +1269,8 @@ int hvm_hap_nested_page_fault(unsigned l
>          if ( violation )
>          {
>              p2m_mem_access_check(gpa, gla_valid, gla, access_r, access_w, access_x);
> -
> -            return 1;
> +            rc = 1;
> +            goto out_put_gfn;

Shouldn't this patch be changing the call to gfn_to_mfn_type_p2m() just
above here to a get_gfn_*() call too?

> -void hvm_unmap_guest_frame(void *p)
> +void hvm_unmap_guest_frame(void *p, unsigned long addr, int is_va)
>  {
> +    /* We enter this function with a map obtained in __hvm_map_guest_frame.
> +     * This map performed a p2m query that locked the gfn entry and got
> +     * a ref on the mfn. Must undo */
>      if ( p )
> +    {
> +        unsigned long gfn = INVALID_GFN;
> +
> +        if ( is_va )
> +        {
> +            if ( addr )
> +            {
> +                uint32_t pfec = PFEC_page_present;
> +                gfn = paging_gva_to_gfn(current, addr, &pfec);
> +            } else {
> +                gfn = INVALID_GFN;
> +            }
> +        } else {
> +            gfn = addr;
> +        }
> +
> +        if ( gfn != INVALID_GFN )
> +            put_gfn(current->domain, gfn);
> +
>          unmap_domain_page(p);
> +    }
>  }

This is a pretty wierd-looking function now - I think it would be better
just to make all callers have to remember the GFN.  In fact, since a
guest VCPU can change its pagetables at any time, it's not safe to use 
paging_gva_to_gfn() to regenerate the GFN from a VA. 

Also, IIRC the nested-SVM code keeps the hvm_map mapping around for
quite a long time so in fact this unmap-and-put-gfn may not be the right
interface.  Maybe the caller should put_gfn() explicitly.

> diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/hvm/svm/svm.c
> --- a/xen/arch/x86/hvm/svm/svm.c
> +++ b/xen/arch/x86/hvm/svm/svm.c
> @@ -244,9 +244,10 @@ static int svm_vmcb_restore(struct vcpu 
>      {
>          if ( c->cr0 & X86_CR0_PG )
>          {
> -            mfn = mfn_x(gfn_to_mfn(v->domain, c->cr3 >> PAGE_SHIFT, &p2mt));
> +            mfn = mfn_x(get_gfn(v->domain, c->cr3 >> PAGE_SHIFT, &p2mt));
>              if ( !p2m_is_ram(p2mt) || !get_page(mfn_to_page(mfn), v->domain) )
>              {
> +                put_gfn(v->domain, c->cr3 >> PAGE_SHIFT);
>                  gdprintk(XENLOG_ERR, "Invalid CR3 value=0x%"PRIx64"\n",
>                           c->cr3);
>                  return -EINVAL;
> @@ -257,6 +258,8 @@ static int svm_vmcb_restore(struct vcpu 
>              put_page(pagetable_get_page(v->arch.guest_table));
>  
>          v->arch.guest_table = pagetable_from_pfn(mfn);
> +        if ( c->cr0 & X86_CR0_PG )
> +            put_gfn(v->domain, c->cr3 >> PAGE_SHIFT);
>      }
>  
>      v->arch.hvm_vcpu.guest_cr[0] = c->cr0 | X86_CR0_ET;
> @@ -1144,7 +1147,6 @@ static void svm_do_nested_pgfault(struct
>      unsigned long gfn = gpa >> PAGE_SHIFT;
>      mfn_t mfn;
>      p2m_type_t p2mt;
> -    p2m_access_t p2ma;
>      struct p2m_domain *p2m = NULL;
>  
>      ret = hvm_hap_nested_page_fault(gpa, 0, ~0ul, 0, 0, 0, 0);
> @@ -1161,7 +1163,8 @@ static void svm_do_nested_pgfault(struct
>          p2m = p2m_get_p2m(v);
>          _d.gpa = gpa;
>          _d.qualification = 0;
> -        _d.mfn = mfn_x(gfn_to_mfn_type_p2m(p2m, gfn, &_d.p2mt, &p2ma, p2m_query, NULL));
> +        mfn = get_gfn_query_unlocked(p2m->domain, gfn, &_d.p2mt);
> +        _d.mfn = mfn_x(mfn);

Ah - this is not quite the same thing.  This lookup uses a specific p2m
table (possibly a nested-p2m table reflecting the fact the guest is
running in nested SVM mode) so it can't be replaced by a call that just
takes the domain pointer (and will internally use the domain's master
p2m table). 

The naming of 'p2m_get_p2m()' is particularly unhelpful here, I realise.
It fetches the running p2m, i.e. the one that hardware sees as an NPT
table; almost everywhere else uses p2m_get_hostp2m(), which
fetches the master p2m.  But in general when you see the
gfn_to_mfn_*_p2m() functions, that take an explicit p2m pointer, you
need to be careful.

>          
>          __trace_var(TRC_HVM_NPF, 0, sizeof(_d), &_d);
>      }
> @@ -1181,7 +1184,7 @@ static void svm_do_nested_pgfault(struct
>      if ( p2m == NULL )
>          p2m = p2m_get_p2m(v);
>      /* Everything else is an error. */
> -    mfn = gfn_to_mfn_type_p2m(p2m, gfn, &p2mt, &p2ma, p2m_guest, NULL);
> +    mfn = get_gfn_guest_unlocked(p2m->domain, gfn, &p2mt);

Likewise here. 

> diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/mm/guest_walk.c
> --- a/xen/arch/x86/mm/guest_walk.c
> +++ b/xen/arch/x86/mm/guest_walk.c
> @@ -86,30 +86,33 @@ static uint32_t set_ad_bits(void *guest_
>      return 0;
>  }
>  
> +/* If the map is non-NULL, we leave this function having 
> + * called get_gfn, you need to call put_gfn. */
>  static inline void *map_domain_gfn(struct p2m_domain *p2m,
>                                     gfn_t gfn, 
>                                     mfn_t *mfn,
>                                     p2m_type_t *p2mt,
>                                     uint32_t *rc) 
>  {
> -    p2m_access_t a;
> -
>      /* Translate the gfn, unsharing if shared */
> -    *mfn = gfn_to_mfn_type_p2m(p2m, gfn_x(gfn), p2mt, &a, p2m_unshare, NULL);
> +    *mfn = get_gfn_unshare(p2m->domain, gfn_x(gfn), p2mt);

Here's another case where we need to handle the nested-hap path; the p2m
pointer here must be propagated into the lookup function. 

>      if ( p2m_is_paging(*p2mt) )
>      {
>          ASSERT(!p2m_is_nestedp2m(p2m));
>          p2m_mem_paging_populate(p2m->domain, gfn_x(gfn));
> +        put_gfn(p2m->domain, gfn_x(gfn));
>          *rc = _PAGE_PAGED;
>          return NULL;
>      }
>      if ( p2m_is_shared(*p2mt) )
>      {
> +        put_gfn(p2m->domain, gfn_x(gfn));
>          *rc = _PAGE_SHARED;
>          return NULL;
>      }
>      if ( !p2m_is_ram(*p2mt) ) 
>      {
> +        put_gfn(p2m->domain, gfn_x(gfn));
>          *rc |= _PAGE_PRESENT;
>          return NULL;
>      }
> @@ -120,6 +123,9 @@ static inline void *map_domain_gfn(struc
>  
>  
>  /* Walk the guest pagetables, after the manner of a hardware walker. */
> +/* Because the walk is essentially random, it can cause a deadlock 
> + * warning in the p2m locking code. Highly unlikely this is an actual
> + * deadlock, because who would walk page table in the opposite order? */

Linear pagetables make this sort of thing more likely, especially if
they're used by one process to update another process's mappings.

If this is a problem, maybe we'll need to avoid the deadlock either by
allowing multiple lock-holders in the p2m or by rearranging the a/d
writeback soit does another p2m lookup  -- I'd rather not do that,
though, since even on 64-bit it will add a lot of memory accesses.

I'm happy to take a version of this big switchover patch that doesn't
solve this problem, though.  It can be sorted out in a separate patch.

> diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/mm/hap/nested_hap.c
> --- a/xen/arch/x86/mm/hap/nested_hap.c
> +++ b/xen/arch/x86/mm/hap/nested_hap.c
> @@ -146,22 +146,29 @@ nestedhap_walk_L0_p2m(struct p2m_domain 
>      mfn_t mfn;
>      p2m_type_t p2mt;
>      p2m_access_t p2ma;
> +    int rc;
>  
>      /* walk L0 P2M table */
>      mfn = gfn_to_mfn_type_p2m(p2m, L1_gpa >> PAGE_SHIFT, &p2mt, &p2ma, 
>                                p2m_query, page_order);

Again, are we not changing this function's name?


Cheers,

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 04:27:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 04:27:58 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROTja-0000SL-SE; Thu, 10 Nov 2011 04:27:58 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROTiv-00006T-Ia
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 04:27:17 -0800
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-2.tower-216.messagelabs.com!1320928034!4344143!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13598 invoked from network); 10 Nov 2011 12:27:14 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-2.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 12:27:14 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1ROTis-000H0q-1b; Thu, 10 Nov 2011 12:27:14 +0000
Date: Thu, 10 Nov 2011 12:27:13 +0000
From: Tim Deegan <tim@xen.org>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Subject: Re: [Xen-devel] [PATCH 0 of 5] p2m synchronization groundwork
Message-ID: <20111110122713.GE62117@ocelot.phlegethon.org>
References: <patchbomb.1320722908@xdev.gridcentric.ca>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <patchbomb.1320722908@xdev.gridcentric.ca>
User-Agent: Mutt/1.4.2.1i
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, George.Dunlap@eu.citrix.com,
	andres@gridcentric.ca, keir.xen@gmail.com, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 22:28 -0500 on 07 Nov (1320704908), Andres Lagar-Cavilla wrote:
> This patch series lays the groundwork for improving the synchronization
> of primitives accessing the p2m.
> 
> This is a partial repost of the patches emailed previously as a RFC. 
> These patches are now intended for committing to the tree.
> 
> We change the API for accessing the p2m to a family of functions
> get_gfn/put_gfn. The name intends to reflect the fact that even lookups
> are meant to obtain exclusive access to a p2m entry, and that said access
> should be relinquished (put_gfn) when done.
> 
> The patches, however, alter little functionality. The API name change 
> does not involve yet additional locking or ref-counting. They will, however,
> throw a "barrier" that will force any new commits to conform to the new API.
> 
> Patches are based off 24066:54a5e994a241. Should the new XENMEM calls be 
> accepted before this, the series needs to be updated to also change the API
> there.
> 
> Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.

Patches 0-4 applied, thanks.  I've reviewed patch 5 separately. 

Cheers,

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 04:41:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 04:41:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROTwM-00017J-OF; Thu, 10 Nov 2011 04:41:10 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROTvj-0000um-Gd
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 04:40:31 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1320928826!2990101!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17074 invoked from network); 10 Nov 2011 12:40:26 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 12:40:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,488,1315180800"; 
   d="scan'208";a="8862369"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 12:40:02 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Thu, 10 Nov 2011 12:40:02 +0000
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Thu, 10 Nov 2011 12:40:02 +0000
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320928802.955.219.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] double free in xlu configuration parser
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ian,

I'm seeing this and struggling to figure out what is going on, any
ideas?

# touch empty
# xl -N cr empty bootloader_args='1,2,3' 
Parsing config file empty
empty:2: config parsing error near `,': syntax error, unexpected ',', expecting NEWLINE or ';'
*** glibc detected *** xl: double free or corruption (fasttop): 0x080625f0 ***

gdb reports the backtrace as:
#0  0xff7fe424 in __kernel_vsyscall ()
#1  0xb7e5c751 in *__GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
#2  0xb7e5fb82 in *__GI_abort () at abort.c:92
#3  0xb7e9318d in __libc_message (do_abort=2, fmt=0xb7f57738 "*** glibc detected *** %s: %s: 0x%s ***\n") at ../sysdeps/unix/sysv/linux/libc_fatal.c:189
#4  0xb7e9d281 in malloc_printerr (action=<value optimized out>, str=0x6 <Address 0x6 out of bounds>, ptr=0x80625f0) at malloc.c:6267
#5  0xb7e9ead8 in _int_free (av=<value optimized out>, p=<value optimized out>) at malloc.c:4795
#6  0xb7ea1bbd in *__GI___libc_free (mem=0x80625f0) at malloc.c:3739
#7  0xb7fce47d in yydestruct (yymsg=<value optimized out>, yytype=<value optimized out>, yyvaluep=0xbfffed84, yylocationp=0xbfffe11c, ctx=0xbffff31c) at libxlu_cfg_y.y:40
#8  0xb7fced40 in xlu__cfg_yyparse (ctx=0xbffff31c) at libxlu_cfg_y.c:1615
#9  0xb7fd127d in parse (ctx=0xbffff31c) at libxlu_cfg.c:68
#10 0xb7fd1391 in xlu_cfg_readdata (cfg=0x80626e8, data=0x80626c8 "\nbootloader_args=1,2,3\n\n", length=24) at libxlu_cfg.c:123
#11 0x0804d529 in parse_config_data (configfile_filename_report=<value optimized out>, configfile_data=0x80626c8 "\nbootloader_args=1,2,3\n\n", configfile_len=24, d_config=0xbffff5e0, dm_info=0xbffff670) at xl_cmdimpl.c:590
#12 0x08051268 in create_domain (dom_info=<value optimized out>) at xl_cmdimpl.c:1545
#13 0x08059abb in main_create (argc=3, argv=0xbffffd1c) at xl_cmdimpl.c:3284
#14 0x0804c3eb in main (argc=5, argv=0xbffffd14) at xl.c:151

The inexplicable thing is that this appears to be somehow specific to
bootloader_args, which I cannot understand because the cfg parser
doesn't know that sort of thing. However:

# xl -N cr empty foo='1,2,3' 
Parsing config file empty
empty:2: config parsing error near `,': syntax error, unexpected ',',
expecting NEWLINE or ';'
Failed to parse config file: Invalid argument
<exits cleanly>

# xl -N cr empty kernel='1,2,3' 
Parsing config file empty
empty:2: config parsing error near `,': syntax error, unexpected ',',
expecting NEWLINE or ';'
Failed to parse config file: Invalid argument
<exits cleanly>

The behaviour is the same if I put the option in a file:

# echo bootloader_args=1,2,3 > full
# xl -N cr full 
Parsing config file full
full:1: config parsing error near `,': syntax error, unexpected ',',
expecting NEWLINE or ';'
*** glibc detected *** xl: double free or corruption (fasttop):
0x08062620 ***

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 04:48:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 04:48:09 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROU37-0001bb-SI; Thu, 10 Nov 2011 04:48:09 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROU2c-0001Ow-0b
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 04:47:38 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1320929254!3005742!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2669 invoked from network); 10 Nov 2011 12:47:35 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-6.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 12:47:35 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 10 Nov 2011 12:47:34 +0000
Message-Id: <4EBBD5F602000078000602EE@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 10 Nov 2011 12:47:34 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jean Guyader" <jean.guyader@eu.citrix.com>
References: <1320924931-6891-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-5-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-6-git-send-email-jean.guyader@eu.citrix.com>
In-Reply-To: <1320924931-6891-6-git-send-email-jean.guyader@eu.citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: George Dunlap <George.Dunlap@eu.citrix.com>, keir@xen.org,
	xen-devel@lists.xensource.com, allen.m.kay@intel.com, tim@xen.org
Subject: [Xen-devel] Re: [PATCH 5/7] mm: New XENMEM space,
	XENMAPSPACE_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 12:35, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
>@@ -4716,6 +4748,17 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) =
arg)
>         }
>=20
>         rc =3D xenmem_add_to_physmap(d, &xatp);
>+        if ( rc =3D=3D -EAGAIN )

        if ( rc )

>+        {
>+            if ( copy_to_guest(arg, &xatp, 1) )
>+            {
>+                rcu_unlock_domain(d);
>+                return -EFAULT;
>+            }

        }
        if ( rc =3D=3D -EAGAIN )

(with some room for further simplification). Without that (or the minimal
alternative of copying back just .size or yet some other mechanism), as
pointed out before, the caller won't have a way to know how far into
the batch things succeeded.

>+
>+            rc =3D hypercall_create_continuation(
>+                    __HYPERVISOR_memory_op, "ih", op, arg);
>+        }
>=20
>         rcu_unlock_domain(d);

Also, the whole block above can be move past this rcu_unlock_domain(),
eliminating the need to do it separately in the above error path(s).

>=20
>--- a/xen/arch/x86/x86_64/compat/mm.c
>+++ b/xen/arch/x86/x86_64/compat/mm.c
>@@ -63,6 +63,18 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void=
) arg)
>=20
>         XLAT_add_to_physmap(nat, &cmp);
>         rc =3D arch_memory_op(op, guest_handle_from_ptr(nat, void));
>+        if ( rc < 0 )
>+            break;
>+

With the way the code below is currently this is superfluous. But just
as above you will need to provide some indication to the caller
*where* the failure occurred.

>+        if ( rc =3D=3D __HYPERVISOR_memory_op )
>+        {
>+            hypercall_xlat_continuation(NULL, 0x2, nat, arg);
>+
>+            XLAT_add_to_physmap(&cmp, nat);
>+
>+            if ( copy_to_guest(arg, &cmp, 1) )
>+                return -EFAULT;

I realize that this is the same way in the code handling
XENMEM_[gs]et_pod_target, but unfortunately that's wrong (that's
why I'm copying you, George): Once a continuation was set up, you
mustn't change the return value anymore, since the continuation was
established by adjusting the guest's rIP.

As for other memory ops, the continuation can be encoded in "op" (see
xen/common/memory.c and xen/common/compat/memory.c). However,
while suitable here I don't think that's usable for the PoD variant. The
alternative is to cancel the continuation (would require quite a bit of
new code I think) or to adjust the low level hypercall handler code (at
least the compat mode one) to special case rAX values in the negative
errno range, leaving rAX unchanged instead of returning -ENOSYS.
Keir?

Jan

>+        }
>=20
>         break;
>     }



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 04:51:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 04:51:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROU65-0002o2-GX; Thu, 10 Nov 2011 04:51:13 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROU3P-0001hD-Cm
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 04:48:28 -0800
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-6.tower-27.messagelabs.com!1320929274!56695575!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32461 invoked from network); 10 Nov 2011 12:47:54 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-6.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 12:47:54 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1ROU3J-000H5A-Uw; Thu, 10 Nov 2011 12:48:21 +0000
Date: Thu, 10 Nov 2011 12:48:21 +0000
From: Tim Deegan <tim@xen.org>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Subject: Re: [Xen-devel] [PATCH 1 of 3] Improvements over API change for p2m
	lookups
Message-ID: <20111110124821.GF62117@ocelot.phlegethon.org>
References: <patchbomb.1320788543@xdev.gridcentric.ca>
	<a0c55cc5d696294a899c.1320788544@xdev.gridcentric.ca>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <a0c55cc5d696294a899c.1320788544@xdev.gridcentric.ca>
User-Agent: Mutt/1.4.2.1i
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, George.Dunlap@eu.citrix.com,
	andres@gridcentric.ca, keir.xen@gmail.com, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 16:42 -0500 on 08 Nov (1320770544), Andres Lagar-Cavilla wrote:
>  xen/arch/x86/hvm/hvm.c   |  3 +--
>  xen/arch/x86/mm/p2m.c    |  8 ++++----
>  xen/common/grant_table.c |  2 +-
>  xen/common/memory.c      |  6 +++++-
>  4 files changed, 11 insertions(+), 8 deletions(-)
> 
> 
> Ranging from the cosmetic to actual bug fixing.
> 
> Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

These look fine.  Please fold them into the next version of the API
change patch.

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 04:54:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 04:54:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROU90-0003FH-MI; Thu, 10 Nov 2011 04:54:14 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROU8Y-000334-GM
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 04:53:47 -0800
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-10.tower-174.messagelabs.com!1320929623!1031612!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15976 invoked from network); 10 Nov 2011 12:53:43 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-10.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 12:53:43 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1ROU8U-000H6F-Aw; Thu, 10 Nov 2011 12:53:42 +0000
Date: Thu, 10 Nov 2011 12:53:42 +0000
From: Tim Deegan <tim@xen.org>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Subject: Re: [Xen-devel] [PATCH 2 of 3] Make p2m lookups fully synchronized
	wrt modifications
Message-ID: <20111110125342.GG62117@ocelot.phlegethon.org>
References: <patchbomb.1320788543@xdev.gridcentric.ca>
	<6203a0549d8a1a21753b.1320788545@xdev.gridcentric.ca>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <6203a0549d8a1a21753b.1320788545@xdev.gridcentric.ca>
User-Agent: Mutt/1.4.2.1i
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, George.Dunlap@eu.citrix.com,
	andres@gridcentric.ca, keir.xen@gmail.com, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 16:42 -0500 on 08 Nov (1320770545), Andres Lagar-Cavilla wrote:
>  xen/arch/x86/mm/mm-locks.h |  13 +++++++------
>  xen/arch/x86/mm/p2m.c      |  18 +++++++++++++++++-
>  xen/include/asm-x86/p2m.h  |  39 ++++++++++++++++++++++++---------------
>  3 files changed, 48 insertions(+), 22 deletions(-)
> 
> 
> We achieve this by locking/unlocking the global p2m_lock in get/put_gfn.
> This brings about a few consequences for the p2m_lock:
> 
>  - not ordered anymore in mm-locks.h: unshare does get_gfn -> shr_lock,
>    there are code paths that do paging_lock -> get_gfn. All of these
>    would cause mm-locks.h to panic.

In that case there's a potential deadlock in the sharing code, and
turning off the safety catches is not an acceptable response to that. :)

ISTR you had a plan to get rid of the shr_lock entirely, or am
I misremembering?

Tim.

>  - the lock is always taken recursively, as there are many paths that
>    do get_gfn -> p2m_lock
> 
> Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
> 
> diff -r a0c55cc5d696 -r 6203a0549d8a xen/arch/x86/mm/mm-locks.h
> --- a/xen/arch/x86/mm/mm-locks.h
> +++ b/xen/arch/x86/mm/mm-locks.h
> @@ -165,14 +165,15 @@ declare_mm_lock(nestedp2m)
>  
>  /* P2M lock (per-p2m-table)
>   * 
> - * This protects all updates to the p2m table.  Updates are expected to
> - * be safe against concurrent reads, which do *not* require the lock. */
> + * This protects all queries and updates to the p2m table. Because queries
> + * can happen interleaved with other locks in here, we do not enforce
> + * ordering, and make all locking recursive. */
>  
> -declare_mm_lock(p2m)
> -#define p2m_lock(p)           mm_lock(p2m, &(p)->lock)
> -#define p2m_lock_recursive(p) mm_lock_recursive(p2m, &(p)->lock)
> -#define p2m_unlock(p)         mm_unlock(&(p)->lock)
> +#define p2m_lock(p)           spin_lock_recursive(&(p)->lock.lock)
> +#define p2m_lock_recursive(p) spin_lock_recursive(&(p)->lock.lock)
> +#define p2m_unlock(p)         spin_unlock_recursive(&(p)->lock.lock)
>  #define p2m_locked_by_me(p)   mm_locked_by_me(&(p)->lock)
> +#define gfn_locked_by_me(p,g) mm_locked_by_me(&(p)->lock)
>  
>  /* Page alloc lock (per-domain)
>   *
> diff -r a0c55cc5d696 -r 6203a0549d8a xen/arch/x86/mm/p2m.c
> --- a/xen/arch/x86/mm/p2m.c
> +++ b/xen/arch/x86/mm/p2m.c
> @@ -158,6 +158,9 @@ mfn_t gfn_to_mfn_type_p2m(struct p2m_dom
>          return _mfn(gfn);
>      }
>  
> +    /* Grab the lock here, don't release until put_gfn */
> +    p2m_lock(p2m);
> +
>      mfn = p2m->get_entry(p2m, gfn, t, a, q, page_order);
>  
>  #ifdef __x86_64__
> @@ -182,6 +185,19 @@ mfn_t gfn_to_mfn_type_p2m(struct p2m_dom
>      return mfn;
>  }
>  
> +void put_gfn(struct domain *d, unsigned long gfn)
> +{
> +    struct p2m_domain *p2m = p2m_get_hostp2m(d);
> +
> +    if ( !p2m || !paging_mode_translate(d) )
> +        /* Nothing to do in this case */
> +        return;
> +
> +    ASSERT(p2m_locked_by_me(p2m));
> +
> +    p2m_unlock(p2m);
> +}
> +
>  int set_p2m_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn, 
>                    unsigned int page_order, p2m_type_t p2mt, p2m_access_t p2ma)
>  {
> @@ -190,7 +206,7 @@ int set_p2m_entry(struct p2m_domain *p2m
>      unsigned int order;
>      int rc = 1;
>  
> -    ASSERT(p2m_locked_by_me(p2m));
> +    ASSERT(gfn_locked_by_me(p2m, gfn));
>  
>      while ( todo )
>      {
> diff -r a0c55cc5d696 -r 6203a0549d8a xen/include/asm-x86/p2m.h
> --- a/xen/include/asm-x86/p2m.h
> +++ b/xen/include/asm-x86/p2m.h
> @@ -305,9 +305,10 @@ struct p2m_domain *p2m_get_p2m(struct vc
>  
>  #define p2m_get_pagetable(p2m)  ((p2m)->phys_table)
>  
> -/**** p2m query accessors. After calling any of the variants below, you
> - * need to call put_gfn(domain, gfn). If you don't, you'll lock the
> - * hypervisor. ****/
> +/**** p2m query accessors. They lock p2m_lock, and thus serialize
> + * lookups wrt modifications. They _do not_ release the lock on exit.
> + * After calling any of the variants below, caller needs to use
> + * put_gfn. ****/
>  
>  /* Read a particular P2M table, mapping pages as we go.  Most callers
>   * should _not_ call this directly; use the other get_gfn* functions
> @@ -349,19 +350,27 @@ static inline unsigned long get_gfn_unty
>      return INVALID_MFN;
>  }
>  
> -/* This is a noop for now. */
> -static inline void put_gfn(struct domain *d, unsigned long gfn)
> -{
> -}
> +/* Will release the p2m_lock and put the page behind this mapping. */
> +void put_gfn(struct domain *d, unsigned long gfn);
>  
> -/* These are identical for now. The intent is to have the caller not worry 
> - * about put_gfn. To only be used in printk's, crash situations, or to 
> - * peek at a type. You're not holding the p2m entry exclsively after calling
> - * this. */
> -#define get_gfn_unlocked(d, g, t)         get_gfn_type((d), (g), (t), p2m_alloc)
> -#define get_gfn_query_unlocked(d, g, t)   get_gfn_type((d), (g), (t), p2m_query)
> -#define get_gfn_guest_unlocked(d, g, t)   get_gfn_type((d), (g), (t), p2m_guest)
> -#define get_gfn_unshare_unlocked(d, g, t) get_gfn_type((d), (g), (t), p2m_unshare)
> +/* The intent is to have the caller not worry about put_gfn. They apply to 
> + * very specific situations: debug printk's, dumps during a domain crash,
> + * or to peek at a p2m entry/type. Caller is not holding the p2m entry 
> + * exclusively after calling this. */
> +#define build_unlocked_accessor(name)                                   \
> +    static inline mfn_t get_gfn ## name ## _unlocked(struct domain *d,  \
> +                                                unsigned long gfn,      \
> +                                                p2m_type_t *t)          \
> +    {                                                                   \
> +        mfn_t mfn = get_gfn ##name (d, gfn, t);                         \
> +        put_gfn(d, gfn);                                                \
> +        return mfn;                                                     \
> +    }
> +
> +build_unlocked_accessor()
> +build_unlocked_accessor(_query)
> +build_unlocked_accessor(_guest)
> +build_unlocked_accessor(_unshare)
>  
>  /* General conversion function from mfn to gfn */
>  static inline unsigned long mfn_to_gfn(struct domain *d, mfn_t mfn)
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 05:17:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 05:17:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROUVt-0004fH-7T; Thu, 10 Nov 2011 05:17:53 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROUVG-0004TF-Li
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 05:17:15 -0800
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-12.tower-182.messagelabs.com!1320931031!2599461!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29682 invoked from network); 10 Nov 2011 13:17:11 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-12.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 13:17:11 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1ROUVB-000H9z-G5; Thu, 10 Nov 2011 13:17:09 +0000
Date: Thu, 10 Nov 2011 13:17:09 +0000
From: Tim Deegan <tim@xen.org>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Subject: Re: [Xen-devel] [PATCH 3 of 3] Make p2m critical sections hold a ref
	on the underlying mfn
Message-ID: <20111110131709.GH62117@ocelot.phlegethon.org>
References: <patchbomb.1320788543@xdev.gridcentric.ca>
	<4b684fa7463630e061b0.1320788546@xdev.gridcentric.ca>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4b684fa7463630e061b0.1320788546@xdev.gridcentric.ca>
User-Agent: Mutt/1.4.2.1i
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, George.Dunlap@eu.citrix.com,
	andres@gridcentric.ca, keir.xen@gmail.com, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi, 

At 16:42 -0500 on 08 Nov (1320770546), Andres Lagar-Cavilla wrote:
> For translated domains, critical sections demarcated by a
> get_gfn/put_gfn pair will hold an additional ref on the
> underlying mfn.

Remind me what this gets us again?  Is it just belt-and-braces on top of
the locking at the p2m layer?

It should be possible to do this without the extra argument - for
example, the bottom-level function that actually changes a p2m entry
must hold the p2m exclusion lock for that entry, or the master p2m lock,
right?  In either case it knows whether it has a ref on the mfn.

I suppose having these locks be recursive makes that a problem, but in
that case you have another problem -- how many mfn refs need to be
moved?

Cheers,

Tim (confused).

> This requires keeping tabs on special manipulations that
> change said mfn:
>  - physmap remove page
>  - sharing
>  - steal page
> 
> Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
> 
> diff -r 6203a0549d8a -r 4b684fa74636 xen/arch/x86/mm.c
> --- a/xen/arch/x86/mm.c
> +++ b/xen/arch/x86/mm.c
> @@ -4128,7 +4128,7 @@ static int replace_grant_p2m_mapping(
>                   type, mfn_x(old_mfn), frame);
>          return GNTST_general_error;
>      }
> -    guest_physmap_remove_page(d, gfn, frame, 0);
> +    guest_physmap_remove_page(d, gfn, frame, 0, HOLDING_GFN);
>  
>      put_gfn(d, gfn);
>      return GNTST_okay;
> @@ -4248,8 +4248,10 @@ int donate_page(
>  }
>  
>  int steal_page(
> -    struct domain *d, struct page_info *page, unsigned int memflags)
> +    struct domain *d, struct page_info *page, unsigned int memflags,
> +    int holding_gfn)
>  {
> +    unsigned count;
>      unsigned long x, y;
>      bool_t drop_dom_ref = 0;
>  
> @@ -4261,11 +4263,14 @@ int steal_page(
>      /*
>       * We require there is just one reference (PGC_allocated). We temporarily
>       * drop this reference now so that we can safely swizzle the owner.
> +     * If, however, this is invoked by a caller holding the p2m entry, there
> +     * will be another reference.
>       */
> +    count = (holding_gfn) ? 1 : 2;
>      y = page->count_info;
>      do {
>          x = y;
> -        if ( (x & (PGC_count_mask|PGC_allocated)) != (1 | PGC_allocated) )
> +        if ( (x & (PGC_count_mask|PGC_allocated)) != (count | PGC_allocated) )
>              goto fail;
>          y = cmpxchg(&page->count_info, x, x & ~PGC_count_mask);
>      } while ( y != x );
> @@ -4276,7 +4281,7 @@ int steal_page(
>      do {
>          x = y;
>          BUG_ON((x & (PGC_count_mask|PGC_allocated)) != PGC_allocated);
> -    } while ( (y = cmpxchg(&page->count_info, x, x | 1)) != x );
> +    } while ( (y = cmpxchg(&page->count_info, x, x | count)) != x );
>  
>      /* Unlink from original owner. */
>      if ( !(memflags & MEMF_no_refcount) && !--d->tot_pages )
> @@ -4779,7 +4784,8 @@ long arch_memory_op(int op, XEN_GUEST_HA
>          {
>              if ( is_xen_heap_mfn(prev_mfn) )
>                  /* Xen heap frames are simply unhooked from this phys slot. */
> -                guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
> +                guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0, 
> +                                            HOLDING_GFN);
>              else
>                  /* Normal domain memory is freed, to avoid leaking memory. */
>                  guest_remove_page(d, xatp.gpfn);
> @@ -4791,7 +4797,7 @@ long arch_memory_op(int op, XEN_GUEST_HA
>          gpfn = get_gpfn_from_mfn(mfn);
>          ASSERT( gpfn != SHARED_M2P_ENTRY );
>          if ( gpfn != INVALID_M2P_ENTRY )
> -            guest_physmap_remove_page(d, gpfn, mfn, 0);
> +            guest_physmap_remove_page(d, gpfn, mfn, 0, (gpfn == gfn));
>  
>          /* Map at new location. */
>          rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
> diff -r 6203a0549d8a -r 4b684fa74636 xen/arch/x86/mm/mem_sharing.c
> --- a/xen/arch/x86/mm/mem_sharing.c
> +++ b/xen/arch/x86/mm/mem_sharing.c
> @@ -561,7 +561,7 @@ int mem_sharing_share_pages(shr_handle_t
>          list_del(&gfn->list);
>          d = get_domain_by_id(gfn->domain);
>          BUG_ON(!d);
> -        BUG_ON(set_shared_p2m_entry(d, gfn->gfn, se->mfn) == 0);
> +        BUG_ON(set_shared_p2m_entry(d, gfn->gfn, se->mfn, 0) == 0);
>          put_domain(d);
>          list_add(&gfn->list, &se->gfns);
>          put_page_and_type(cpage);
> @@ -670,14 +670,9 @@ gfn_found:
>      unmap_domain_page(s);
>      unmap_domain_page(t);
>  
> -    /* NOTE: set_shared_p2m_entry will switch the underlying mfn. If
> -     * we do get_page withing get_gfn, the correct sequence here
> -     * should be
> -       get_page(page);
> -       put_page(old_page);
> -     * so that the ref to the old page is dropped, and a ref to
> -     * the new page is obtained to later be dropped in put_gfn */
> -    BUG_ON(set_shared_p2m_entry(d, gfn, page_to_mfn(page)) == 0);
> +    /* NOTE: set_shared_p2m_entry will swap the underlying mfn and the refs. 
> +     * It is safe to call put_gfn as usual after this. */
> +    BUG_ON(set_shared_p2m_entry(d, gfn, page_to_mfn(page), HOLDING_GFN) == 0);
>      put_page_and_type(old_page);
>  
>  private_page_found:    
> diff -r 6203a0549d8a -r 4b684fa74636 xen/arch/x86/mm/p2m.c
> --- a/xen/arch/x86/mm/p2m.c
> +++ b/xen/arch/x86/mm/p2m.c
> @@ -182,6 +182,13 @@ mfn_t gfn_to_mfn_type_p2m(struct p2m_dom
>      }
>  #endif
>  
> +    /* Do a get page to get one additional ref on the mfn */
> +    if ( mfn_valid(mfn) )
> +    {
> +        struct page_info *pg = mfn_to_page(mfn);
> +        BUG_ON( !page_get_owner_and_reference(pg) );
> +    }
> +
>      return mfn;
>  }
>  
> @@ -195,6 +202,21 @@ void put_gfn(struct domain *d, unsigned 
>  
>      ASSERT(p2m_locked_by_me(p2m));
>  
> +    {
> +        p2m_access_t a;
> +        p2m_type_t t;
> +        mfn_t mfn = p2m->get_entry(p2m, gfn, &t, &a, 
> +                                    p2m_query, NULL);
> +
> +        if ( mfn_valid(mfn) )
> +        {
> +#ifdef __x86_64__
> +            if (likely( !(p2m_is_broken(t)) ))
> +#endif
> +                put_page(mfn_to_page(mfn));
> +        }
> +    }    
> +
>      p2m_unlock(p2m);
>  }
>  
> @@ -416,6 +438,28 @@ void p2m_final_teardown(struct domain *d
>      p2m_teardown_nestedp2m(d);
>  }
>  
> +/* If the caller has done get_gfn on this entry, then it has a ref on the
> + * old mfn. Swap the refs so put_gfn puts the appropriate ref */
> +static inline void __p2m_swap_entry_refs(struct p2m_domain *p2m, 
> +                                         unsigned long gfn, mfn_t mfn)
> +{
> +    p2m_type_t t;
> +    p2m_access_t a;
> +    mfn_t omfn;
> +
> +    if ( !paging_mode_translate(p2m->domain) )
> +        return;
> +
> +    ASSERT(gfn_locked_by_me(p2m, gfn));
> +
> +    omfn = p2m->get_entry(p2m, gfn, &t, &a, p2m_query, NULL);
> +
> +    if ( mfn_valid(mfn) )
> +        BUG_ON( !page_get_owner_and_reference(mfn_to_page(mfn)) );
> +
> +    if ( mfn_valid(omfn) )
> +        put_page(mfn_to_page(omfn));
> +}
>  
>  static void
>  p2m_remove_page(struct p2m_domain *p2m, unsigned long gfn, unsigned long mfn,
> @@ -451,11 +495,14 @@ p2m_remove_page(struct p2m_domain *p2m, 
>  
>  void
>  guest_physmap_remove_page(struct domain *d, unsigned long gfn,
> -                          unsigned long mfn, unsigned int page_order)
> +                          unsigned long mfn, unsigned int page_order,
> +                          int holding_gfn)
>  {
>      struct p2m_domain *p2m = p2m_get_hostp2m(d);
>      p2m_lock(p2m);
>      audit_p2m(p2m, 1);
> +    if (holding_gfn)
> +        __p2m_swap_entry_refs(p2m, gfn, _mfn(INVALID_MFN));
>      p2m_remove_page(p2m, gfn, mfn, page_order);
>      audit_p2m(p2m, 1);
>      p2m_unlock(p2m);
> @@ -713,7 +760,8 @@ out:
>  }
>  
>  int
> -set_shared_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn)
> +set_shared_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn, 
> +                        int holding_gfn)
>  {
>      struct p2m_domain *p2m = p2m_get_hostp2m(d);
>      int rc = 0;
> @@ -730,6 +778,10 @@ set_shared_p2m_entry(struct domain *d, u
>       * sharable first */
>      ASSERT(p2m_is_shared(ot));
>      ASSERT(mfn_valid(omfn));
> +
> +    if ( holding_gfn )
> +        __p2m_swap_entry_refs(p2m, gfn, mfn);
> +
>      /* XXX: M2P translations have to be handled properly for shared pages */
>      set_gpfn_from_mfn(mfn_x(omfn), INVALID_M2P_ENTRY);
>  
> diff -r 6203a0549d8a -r 4b684fa74636 xen/common/grant_table.c
> --- a/xen/common/grant_table.c
> +++ b/xen/common/grant_table.c
> @@ -1497,7 +1497,7 @@ gnttab_transfer(
>              goto copyback;
>          }
>  
> -        if ( steal_page(d, page, 0) < 0 )
> +        if ( steal_page(d, page, 0, HOLDING_GFN) < 0 )
>          {
>              put_gfn(d, gop.mfn);
>              gop.status = GNTST_bad_page;
> @@ -1505,7 +1505,7 @@ gnttab_transfer(
>          }
>  
>  #ifndef __ia64__ /* IA64 implicitly replaces the old page in steal_page(). */
> -        guest_physmap_remove_page(d, gop.mfn, mfn, 0);
> +        guest_physmap_remove_page(d, gop.mfn, mfn, 0, HOLDING_GFN);
>  #endif
>          flush_tlb_mask(d->domain_dirty_cpumask);
>  
> diff -r 6203a0549d8a -r 4b684fa74636 xen/common/memory.c
> --- a/xen/common/memory.c
> +++ b/xen/common/memory.c
> @@ -165,7 +165,7 @@ int guest_remove_page(struct domain *d, 
>      mfn = mfn_x(get_gfn(d, gmfn, &p2mt)); 
>      if ( unlikely(p2m_is_paging(p2mt)) )
>      {
> -        guest_physmap_remove_page(d, gmfn, mfn, 0);
> +        guest_physmap_remove_page(d, gmfn, mfn, 0, HOLDING_GFN);
>          p2m_mem_paging_drop_page(d, gmfn);
>          put_gfn(d, gmfn);
>          return 1;
> @@ -188,7 +188,7 @@ int guest_remove_page(struct domain *d, 
>      if(p2m_is_shared(p2mt))
>      {
>          put_page_and_type(page);
> -        guest_physmap_remove_page(d, gmfn, mfn, 0);
> +        guest_physmap_remove_page(d, gmfn, mfn, 0, HOLDING_GFN);
>          put_gfn(d, gmfn);
>          return 1;
>      }
> @@ -207,7 +207,7 @@ int guest_remove_page(struct domain *d, 
>      if ( test_and_clear_bit(_PGC_allocated, &page->count_info) )
>          put_page(page);
>  
> -    guest_physmap_remove_page(d, gmfn, mfn, 0);
> +    guest_physmap_remove_page(d, gmfn, mfn, 0, HOLDING_GFN);
>      put_gfn(d, gmfn);
>  
>      put_page(page);
> @@ -387,7 +387,7 @@ static long memory_exchange(XEN_GUEST_HA
>  
>                  page = mfn_to_page(mfn);
>  
> -                if ( unlikely(steal_page(d, page, MEMF_no_refcount)) )
> +                if ( unlikely(steal_page(d, page, MEMF_no_refcount, HOLDING_GFN)) )
>                  {
>                      put_gfn(d, gmfn + k);
>                      rc = -EINVAL;
> @@ -427,7 +427,7 @@ static long memory_exchange(XEN_GUEST_HA
>              gfn = mfn_to_gmfn(d, mfn);
>              /* Pages were unshared above */
>              BUG_ON(SHARED_M2P(gfn));
> -            guest_physmap_remove_page(d, gfn, mfn, 0);
> +            guest_physmap_remove_page(d, gfn, mfn, 0, 0);
>              put_page(page);
>          }
>  
> diff -r 6203a0549d8a -r 4b684fa74636 xen/include/asm-x86/mm.h
> --- a/xen/include/asm-x86/mm.h
> +++ b/xen/include/asm-x86/mm.h
> @@ -578,7 +578,8 @@ int compat_arch_memory_op(int op, XEN_GU
>  int compat_subarch_memory_op(int op, XEN_GUEST_HANDLE(void));
>  
>  int steal_page(
> -    struct domain *d, struct page_info *page, unsigned int memflags);
> +    struct domain *d, struct page_info *page, unsigned int memflags,
> +    int holding_gfn);
>  int donate_page(
>      struct domain *d, struct page_info *page, unsigned int memflags);
>  int page_make_sharable(struct domain *d, 
> diff -r 6203a0549d8a -r 4b684fa74636 xen/include/asm-x86/p2m.h
> --- a/xen/include/asm-x86/p2m.h
> +++ b/xen/include/asm-x86/p2m.h
> @@ -353,6 +353,10 @@ static inline unsigned long get_gfn_unty
>  /* Will release the p2m_lock and put the page behind this mapping. */
>  void put_gfn(struct domain *d, unsigned long gfn);
>  
> +/* Operations that change the underlying mfn in a p2m entry need to be 
> + * told whether the caller is holding the current gfn */
> +#define HOLDING_GFN 1
> +
>  /* The intent is to have the caller not worry about put_gfn. They apply to 
>   * very specific situations: debug printk's, dumps during a domain crash,
>   * or to peek at a p2m entry/type. Caller is not holding the p2m entry 
> @@ -410,7 +414,8 @@ static inline int guest_physmap_add_page
>  /* Remove a page from a domain's p2m table */
>  void guest_physmap_remove_page(struct domain *d,
>                                 unsigned long gfn,
> -                               unsigned long mfn, unsigned int page_order);
> +                               unsigned long mfn, unsigned int page_order,
> +                               int holding_gfn);
>  
>  /* Set a p2m range as populate-on-demand */
>  int guest_physmap_mark_populate_on_demand(struct domain *d, unsigned long gfn,
> @@ -471,7 +476,8 @@ p2m_pod_offline_or_broken_replace(struct
>  
>  #ifdef __x86_64__
>  /* Modify p2m table for shared gfn */
> -int set_shared_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn);
> +int set_shared_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn,
> +                            int holding_gfn);
>  
>  /* Check if a nominated gfn is valid to be paged out */
>  int p2m_mem_paging_nominate(struct domain *d, unsigned long gfn);
> diff -r 6203a0549d8a -r 4b684fa74636 xen/include/xen/paging.h
> --- a/xen/include/xen/paging.h
> +++ b/xen/include/xen/paging.h
> @@ -21,7 +21,7 @@
>  #define paging_mode_translate(d)              (0)
>  #define paging_mode_external(d)               (0)
>  #define guest_physmap_add_page(d, p, m, o)    (0)
> -#define guest_physmap_remove_page(d, p, m, o) ((void)0)
> +#define guest_physmap_remove_page(d, p, m, o, h)    ((void)0)
>  
>  #endif
>  
> diff -r 6203a0549d8a -r 4b684fa74636 xen/include/xen/tmem_xen.h
> --- a/xen/include/xen/tmem_xen.h
> +++ b/xen/include/xen/tmem_xen.h
> @@ -198,7 +198,7 @@ static inline void _tmh_free_page_thispo
>      struct domain *d = page_get_owner(pi);
>  
>      ASSERT(IS_VALID_PAGE(pi));
> -    if ( (d == NULL) || steal_page(d,pi,0) == 0 )
> +    if ( (d == NULL) || steal_page(d,pi,0,0) == 0 )
>          tmh_page_list_put(pi);
>      else
>      {
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 05:49:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 05:49:39 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROV0d-0007yp-2H; Thu, 10 Nov 2011 05:49:39 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROUww-0006sg-6c
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 05:45:50 -0800
X-Env-Sender: glguida@gmail.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1320932746!3708541!1
X-Originating-IP: [209.85.213.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9151 invoked from network); 10 Nov 2011 13:45:47 -0000
Received: from mail-yx0-f171.google.com (HELO mail-yx0-f171.google.com)
	(209.85.213.171)
	by server-8.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 13:45:47 -0000
Received: by yenl6 with SMTP id l6so2676822yen.30
	for <xen-devel@lists.xensource.com>;
	Thu, 10 Nov 2011 05:45:46 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type:content-transfer-encoding;
	bh=dFZ6D9SN0CjZiKLmOelFU777MpxQ9drOtuLWzklFkEw=;
	b=EcGTRkJV7Ah8XzaXRbm/V/ioAi2iCC+ABtL1v4vhjY5UZjRsgM5ghopXHWJQy1A5h3
	6PF3J2otShFnpwaRyEyZn8g2yRRFEF8QF8UcJSSdfV6XC1sGrNrl79KXZ/GugYutS8ZZ
	2xAZNLBCs3OOTqHRlleJfPjn0VKb9s6rqJcEU=
MIME-Version: 1.0
Received: by 10.50.197.167 with SMTP id iv7mr7794620igc.46.1320932745676; Thu,
	10 Nov 2011 05:45:45 -0800 (PST)
Received: by 10.50.189.234 with HTTP; Thu, 10 Nov 2011 05:45:45 -0800 (PST)
In-Reply-To: <4EBBC25B02000078000601F1@nat28.tlf.novell.com>
References: <4EBBC25B02000078000601F1@nat28.tlf.novell.com>
Date: Thu, 10 Nov 2011 05:45:45 -0800
Message-ID: <CAKpvNa3DmeQyXBb7obc_PbsNaEUBLjTFc_eLkTKH8RwYs4WQYw@mail.gmail.com>
From: Gianluca Guida <glguida@gmail.com>
To: Jan Beulich <JBeulich@suse.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: Gianluca Guida <gianluca.guida@citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Tim Deegan <tim@xen.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: performance regression from c/s 21647:cfba1560054a
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi Jan,

On a personal note, thanks for asking me about shadow pagetables, I've
been missing this kind of fun and it's a good way to celebrate my
return to Xen (and Citrix) after exactly two years... :-)
Stefano imported an old patch of mine, so I am the culprit for this.

On Thu, Nov 10, 2011 at 3:23 AM, Jan Beulich <JBeulich@suse.com> wrote:
> in this c/s you did, besides the main purpose of the change, an
> adjustment to check_for_early_unshadow() in that L2...L4 entries
> would no longer be attempted to get unshadowed. Neither the
> patch description nor the added comment really make clear why
> this was done, and we now got a customer report regarding this
> causing considerable slowdown in process creation/destruction
> intensive workloads (e.g. shell scripts).

Unfortunately, I can't clearly remember the reason for this. I assume
that your mentioning of shell scripts implies that this is running
under a Linux guest. Back in the day, this patch was tailored very
strictly against Windows guests, and that probably meant that doing so
had a performance improvement over the way Windows handled pagetables
and process distructions.

Perhaps (I need some time to catch up) the PV-HVM thing has made this
patch affect Linux as well, at the point that this has became a
problem.

Can you tell me in what guest OS this is experiencing a slow down?
What is the order of magnitude of the performance decrease?

I have no problem in reverting that part of the change, if it makes you hap=
py.

Thanks,
Gianluca

--=20
It was a type of people I did not know, I found them very strange and
they did not inspire confidence at all. Later I learned that I had been
introduced to electronic engineers.
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 =A0 =A0 =A0 =A0 E. W. Dijkstra

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 05:50:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 05:50:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROV1q-0008Sz-6K; Thu, 10 Nov 2011 05:50:54 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROUxQ-00071L-Kn
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 05:46:20 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1320932777!3024633!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10571 invoked from network); 10 Nov 2011 13:46:17 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 13:46:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,489,1315180800"; 
   d="scan'208";a="8864099"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 13:46:10 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 13:46:10 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROUxF-0001CJ-Qz;
	Thu, 10 Nov 2011 13:46:09 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROUx6-00024A-J2;
	Thu, 10 Nov 2011 13:46:00 +0000
Date: Thu, 10 Nov 2011 13:46:00 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <20111110134600.GJ22224@spongy.cam.xci-test.com>
References: <1320924931-6891-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-5-git-send-email-jean.guyader@eu.citrix.com>
	<4EBBCF3602000078000602C0@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
In-Reply-To: <4EBBCF3602000078000602C0@nat28.tlf.novell.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: "Keir \(Xen.org\)" <keir@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"allen.m.kay@intel.com" <allen.m.kay@intel.com>,
	Jean Guyader <Jean.Guyader@citrix.com>, "Tim \(Xen.org\)" <tim@xen.org>
Subject: [Xen-devel] Re: [PATCH 4/7] mm: xenmem_add_to_physmap now takes a
 pointer	 on xatp
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


On 10/11 12:18, Jan Beulich wrote:
> >>> On 10.11.11 at 12:35, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> 
> Any reason why this can't be done right away in patch 3?
> 

I think that moving and changing code at the same time make
it headers to read.

The preview patch didn't change anything any code at all,
just moved some code around.

Jean

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 05:51:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 05:51:41 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROV2b-0000PB-N6; Thu, 10 Nov 2011 05:51:41 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROV1A-0008BF-HD
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 05:50:12 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1320933009!3585092!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32652 invoked from network); 10 Nov 2011 13:50:09 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 13:50:09 -0000
X-IronPort-AV: E=Sophos;i="4.69,489,1315180800"; 
   d="scan'208";a="8864339"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 13:50:08 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 13:50:09 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROV16-0001DX-Eo;
	Thu, 10 Nov 2011 13:50:08 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROV0x-00026b-9t;
	Thu, 10 Nov 2011 13:49:59 +0000
Date: Thu, 10 Nov 2011 13:49:59 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <20111110134959.GK22224@spongy.cam.xci-test.com>
References: <1320924931-6891-1-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-2-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-3-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-4-git-send-email-jean.guyader@eu.citrix.com>
	<1320924931-6891-5-git-send-email-jean.guyader@eu.citrix.com>
	<4EBBCF3602000078000602C0@nat28.tlf.novell.com>
	<20111110134600.GJ22224@spongy.cam.xci-test.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
In-Reply-To: <20111110134600.GJ22224@spongy.cam.xci-test.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: "Keir \(Xen.org\)" <keir@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"allen.m.kay@intel.com" <allen.m.kay@intel.com>,
	Jean Guyader <Jean.Guyader@citrix.com>, "Tim \(Xen.org\)" <tim@xen.org>
Subject: [Xen-devel] Re: [PATCH 4/7] mm: xenmem_add_to_physmap now takes a
 pointer	 on xatp
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 10/11 01:46, Jean Guyader wrote:
> 
> On 10/11 12:18, Jan Beulich wrote:
> > >>> On 10.11.11 at 12:35, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> > 
> > Any reason why this can't be done right away in patch 3?
> > 
> 
> I think that moving and changing code at the same time make
> it headers to read.
     harder...

> 
> The preview patch didn't change anything any code at all,
> just moved some code around.
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 05:54:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 05:54:49 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROV5d-0000p5-5M; Thu, 10 Nov 2011 05:54:49 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1ROV5C-0000dJ-E0
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 05:54:22 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-3.tower-182.messagelabs.com!1320933258!2610346!1
X-Originating-IP: [208.97.132.74]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7424 invoked from network); 10 Nov 2011 13:54:18 -0000
Received: from caiajhbdcahe.dreamhost.com (HELO homiemail-a21.g.dreamhost.com)
	(208.97.132.74) by server-3.tower-182.messagelabs.com with SMTP;
	10 Nov 2011 13:54:18 -0000
Received: from homiemail-a21.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a21.g.dreamhost.com (Postfix) with ESMTP id BE74030006C;
	Thu, 10 Nov 2011 05:54:17 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:reply-to
	:mime-version:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.org; b=kwOcivF6cZu2ZlwtlcpQGH2V2FlgvMWXEEcqtEqeAomb
	Yc3kGuTGx7SAChE9gNg9yTJHWbkkuNyQOlRo9HjWYYjz6AW6R6lS70gXLVO8WpNx
	BR4qr2a+L5NZB+beq7ViSOEfXBQ8ANP9j7orDZx/ABm1HCN7GgQZAS64oUFRALw=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:reply-to:mime-version:content-type:content-transfer-encoding;
	s=lagarcavilla.org; bh=+WksUG6Zj0xt4rFRJ0so1pj/scY=; b=Yap/zpNh
	E+6aPCCEFATqCLzP7U0J0zd13xc5VDnv5RwRSRd24IzUBkhWKNT7hB455Jq3xDSu
	uyMKrpjOvZ+RV8mAa5SXzCm0XE2rDrRlmBk5YAL/7n6b8TfNpSGMuWfCvuNnm6kB
	+f7sVGcaUB15YccGKF7+3I8TyGsveN1jILU=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a21.g.dreamhost.com (Postfix) with ESMTPA id EB92E300079; 
	Thu, 10 Nov 2011 05:54:16 -0800 (PST)
Received: from 99.255.91.65 (proxying for 99.255.91.65)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP;
	Thu, 10 Nov 2011 05:54:17 -0800
Message-ID: <01145e4ac36df9ce5b0134108f658bf9.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <20111110122634.GD62117@ocelot.phlegethon.org>
References: <patchbomb.1320722908@xdev.gridcentric.ca>
	<e9fd07479f684f558a92.1320722913@xdev.gridcentric.ca>
	<20111110122634.GD62117@ocelot.phlegethon.org>
Date: Thu, 10 Nov 2011 05:54:17 -0800
Subject: Re: [Xen-devel] [PATCH 5 of 5] Modify naming of queries into the p2m
From: "Andres Lagar-Cavilla" <andres@lagarcavilla.org>
To: "Tim Deegan" <tim@xen.org>
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, george.dunlap@eu.citrix.com,
	andres@gridcentric.ca, keir.xen@gmail.com, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: andres@lagarcavilla.org
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ok, thanks. I'll try to address those comments asap in a new version.

Off-the-bat:
- sharing deadlock: I can arrange it so that shr_lock is always taken
after get_gfn. That would still require either disabling deadlock
detection or moving shr_lock down the deadlock order. Which one is
preferable?

The real solution that I have queued is removing the global hash table,
and locking each shared page individually using PGT_locked.

- get_mfn: the goal is additional belts-and-braces. It doesn't require an
extra argument. Put_gfn will put the mfn that sits in the p2m entry at th=
e
 time of put. A few tricks are needed to handle remove_page, sharing, etc=
.
Works for me with windows and linux hvm guests (so far)

- I can rename gfn_to_mfn_type_p2m to get_gfn_type_access (since that's
what the remaining uses are for)

Thanks for your feedback on the nested p2m functions, which I quite don't
get yet.

Andres
> Hi,
>
> This mostly looks good; I have a few comments on the detail below.
> If those are addressed I hope I can apply the next version.
>
> Any other maintainers want to object to this renaming?
>
> At 22:28 -0500 on 07 Nov (1320704913), Andres Lagar-Cavilla wrote:
>> @@ -1182,6 +1195,7 @@ int hvm_hap_nested_page_fault(unsigned l
>>      mfn_t mfn;
>>      struct vcpu *v =3D current;
>>      struct p2m_domain *p2m;
>> +    int rc;
>>
>>      /* On Nested Virtualization, walk the guest page table.
>>       * If this succeeds, all is fine.
>> @@ -1255,8 +1269,8 @@ int hvm_hap_nested_page_fault(unsigned l
>>          if ( violation )
>>          {
>>              p2m_mem_access_check(gpa, gla_valid, gla, access_r,
>> access_w, access_x);
>> -
>> -            return 1;
>> +            rc =3D 1;
>> +            goto out_put_gfn;
>
> Shouldn't this patch be changing the call to gfn_to_mfn_type_p2m() just
> above here to a get_gfn_*() call too?
>
>> -void hvm_unmap_guest_frame(void *p)
>> +void hvm_unmap_guest_frame(void *p, unsigned long addr, int is_va)
>>  {
>> +    /* We enter this function with a map obtained in
>> __hvm_map_guest_frame.
>> +     * This map performed a p2m query that locked the gfn entry and g=
ot
>> +     * a ref on the mfn. Must undo */
>>      if ( p )
>> +    {
>> +        unsigned long gfn =3D INVALID_GFN;
>> +
>> +        if ( is_va )
>> +        {
>> +            if ( addr )
>> +            {
>> +                uint32_t pfec =3D PFEC_page_present;
>> +                gfn =3D paging_gva_to_gfn(current, addr, &pfec);
>> +            } else {
>> +                gfn =3D INVALID_GFN;
>> +            }
>> +        } else {
>> +            gfn =3D addr;
>> +        }
>> +
>> +        if ( gfn !=3D INVALID_GFN )
>> +            put_gfn(current->domain, gfn);
>> +
>>          unmap_domain_page(p);
>> +    }
>>  }
>
> This is a pretty wierd-looking function now - I think it would be bette=
r
> just to make all callers have to remember the GFN.  In fact, since a
> guest VCPU can change its pagetables at any time, it's not safe to use
> paging_gva_to_gfn() to regenerate the GFN from a VA.
>
> Also, IIRC the nested-SVM code keeps the hvm_map mapping around for
> quite a long time so in fact this unmap-and-put-gfn may not be the righ=
t
> interface.  Maybe the caller should put_gfn() explicitly.
>
>> diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/hvm/svm/svm.c
>> --- a/xen/arch/x86/hvm/svm/svm.c
>> +++ b/xen/arch/x86/hvm/svm/svm.c
>> @@ -244,9 +244,10 @@ static int svm_vmcb_restore(struct vcpu
>>      {
>>          if ( c->cr0 & X86_CR0_PG )
>>          {
>> -            mfn =3D mfn_x(gfn_to_mfn(v->domain, c->cr3 >> PAGE_SHIFT,
>> &p2mt));
>> +            mfn =3D mfn_x(get_gfn(v->domain, c->cr3 >> PAGE_SHIFT,
>> &p2mt));
>>              if ( !p2m_is_ram(p2mt) || !get_page(mfn_to_page(mfn),
>> v->domain) )
>>              {
>> +                put_gfn(v->domain, c->cr3 >> PAGE_SHIFT);
>>                  gdprintk(XENLOG_ERR, "Invalid CR3 value=3D0x%"PRIx64"=
\n",
>>                           c->cr3);
>>                  return -EINVAL;
>> @@ -257,6 +258,8 @@ static int svm_vmcb_restore(struct vcpu
>>              put_page(pagetable_get_page(v->arch.guest_table));
>>
>>          v->arch.guest_table =3D pagetable_from_pfn(mfn);
>> +        if ( c->cr0 & X86_CR0_PG )
>> +            put_gfn(v->domain, c->cr3 >> PAGE_SHIFT);
>>      }
>>
>>      v->arch.hvm_vcpu.guest_cr[0] =3D c->cr0 | X86_CR0_ET;
>> @@ -1144,7 +1147,6 @@ static void svm_do_nested_pgfault(struct
>>      unsigned long gfn =3D gpa >> PAGE_SHIFT;
>>      mfn_t mfn;
>>      p2m_type_t p2mt;
>> -    p2m_access_t p2ma;
>>      struct p2m_domain *p2m =3D NULL;
>>
>>      ret =3D hvm_hap_nested_page_fault(gpa, 0, ~0ul, 0, 0, 0, 0);
>> @@ -1161,7 +1163,8 @@ static void svm_do_nested_pgfault(struct
>>          p2m =3D p2m_get_p2m(v);
>>          _d.gpa =3D gpa;
>>          _d.qualification =3D 0;
>> -        _d.mfn =3D mfn_x(gfn_to_mfn_type_p2m(p2m, gfn, &_d.p2mt, &p2m=
a,
>> p2m_query, NULL));
>> +        mfn =3D get_gfn_query_unlocked(p2m->domain, gfn, &_d.p2mt);
>> +        _d.mfn =3D mfn_x(mfn);
>
> Ah - this is not quite the same thing.  This lookup uses a specific p2m
> table (possibly a nested-p2m table reflecting the fact the guest is
> running in nested SVM mode) so it can't be replaced by a call that just
> takes the domain pointer (and will internally use the domain's master
> p2m table).
>
> The naming of 'p2m_get_p2m()' is particularly unhelpful here, I realise=
.
> It fetches the running p2m, i.e. the one that hardware sees as an NPT
> table; almost everywhere else uses p2m_get_hostp2m(), which
> fetches the master p2m.  But in general when you see the
> gfn_to_mfn_*_p2m() functions, that take an explicit p2m pointer, you
> need to be careful.
>
>>
>>          __trace_var(TRC_HVM_NPF, 0, sizeof(_d), &_d);
>>      }
>> @@ -1181,7 +1184,7 @@ static void svm_do_nested_pgfault(struct
>>      if ( p2m =3D=3D NULL )
>>          p2m =3D p2m_get_p2m(v);
>>      /* Everything else is an error. */
>> -    mfn =3D gfn_to_mfn_type_p2m(p2m, gfn, &p2mt, &p2ma, p2m_guest, NU=
LL);
>> +    mfn =3D get_gfn_guest_unlocked(p2m->domain, gfn, &p2mt);
>
> Likewise here.
>
>> diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/mm/guest_walk.c
>> --- a/xen/arch/x86/mm/guest_walk.c
>> +++ b/xen/arch/x86/mm/guest_walk.c
>> @@ -86,30 +86,33 @@ static uint32_t set_ad_bits(void *guest_
>>      return 0;
>>  }
>>
>> +/* If the map is non-NULL, we leave this function having
>> + * called get_gfn, you need to call put_gfn. */
>>  static inline void *map_domain_gfn(struct p2m_domain *p2m,
>>                                     gfn_t gfn,
>>                                     mfn_t *mfn,
>>                                     p2m_type_t *p2mt,
>>                                     uint32_t *rc)
>>  {
>> -    p2m_access_t a;
>> -
>>      /* Translate the gfn, unsharing if shared */
>> -    *mfn =3D gfn_to_mfn_type_p2m(p2m, gfn_x(gfn), p2mt, &a, p2m_unsha=
re,
>> NULL);
>> +    *mfn =3D get_gfn_unshare(p2m->domain, gfn_x(gfn), p2mt);
>
> Here's another case where we need to handle the nested-hap path; the p2=
m
> pointer here must be propagated into the lookup function.
>
>>      if ( p2m_is_paging(*p2mt) )
>>      {
>>          ASSERT(!p2m_is_nestedp2m(p2m));
>>          p2m_mem_paging_populate(p2m->domain, gfn_x(gfn));
>> +        put_gfn(p2m->domain, gfn_x(gfn));
>>          *rc =3D _PAGE_PAGED;
>>          return NULL;
>>      }
>>      if ( p2m_is_shared(*p2mt) )
>>      {
>> +        put_gfn(p2m->domain, gfn_x(gfn));
>>          *rc =3D _PAGE_SHARED;
>>          return NULL;
>>      }
>>      if ( !p2m_is_ram(*p2mt) )
>>      {
>> +        put_gfn(p2m->domain, gfn_x(gfn));
>>          *rc |=3D _PAGE_PRESENT;
>>          return NULL;
>>      }
>> @@ -120,6 +123,9 @@ static inline void *map_domain_gfn(struc
>>
>>
>>  /* Walk the guest pagetables, after the manner of a hardware walker. =
*/
>> +/* Because the walk is essentially random, it can cause a deadlock
>> + * warning in the p2m locking code. Highly unlikely this is an actual
>> + * deadlock, because who would walk page table in the opposite order?
>> */
>
> Linear pagetables make this sort of thing more likely, especially if
> they're used by one process to update another process's mappings.
>
> If this is a problem, maybe we'll need to avoid the deadlock either by
> allowing multiple lock-holders in the p2m or by rearranging the a/d
> writeback soit does another p2m lookup  -- I'd rather not do that,
> though, since even on 64-bit it will add a lot of memory accesses.
>
> I'm happy to take a version of this big switchover patch that doesn't
> solve this problem, though.  It can be sorted out in a separate patch.
>
>> diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/mm/hap/nested_hap.c
>> --- a/xen/arch/x86/mm/hap/nested_hap.c
>> +++ b/xen/arch/x86/mm/hap/nested_hap.c
>> @@ -146,22 +146,29 @@ nestedhap_walk_L0_p2m(struct p2m_domain
>>      mfn_t mfn;
>>      p2m_type_t p2mt;
>>      p2m_access_t p2ma;
>> +    int rc;
>>
>>      /* walk L0 P2M table */
>>      mfn =3D gfn_to_mfn_type_p2m(p2m, L1_gpa >> PAGE_SHIFT, &p2mt, &p2=
ma,
>>                                p2m_query, page_order);
>
> Again, are we not changing this function's name?
>
>
> Cheers,
>
> Tim.
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 05:59:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 05:59:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROV9p-0001JN-3u; Thu, 10 Nov 2011 05:59:09 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1ROV86-00015e-3e
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 05:57:22 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-13.tower-174.messagelabs.com!1320933438!1031207!1
X-Originating-IP: [208.97.132.5]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 424 invoked from network); 10 Nov 2011 13:57:18 -0000
Received: from mailbigip.dreamhost.com (HELO homiemail-a21.g.dreamhost.com)
	(208.97.132.5) by server-13.tower-174.messagelabs.com with SMTP;
	10 Nov 2011 13:57:18 -0000
Received: from homiemail-a21.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a21.g.dreamhost.com (Postfix) with ESMTP id 2B97F30006C;
	Thu, 10 Nov 2011 05:57:18 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:reply-to
	:mime-version:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.org; b=vPcEaPMej3ott1AxyMGbUJ1AE0GjC6VIGXQejAnwf8So
	DrketAJSyaE+M0UuBMZBydHxNroEvVCx4ZSn5pXWhv3wgmKJNfVp97R/juh/GTD9
	NGiq6og1Q07di7bZeE+bZH8wdyY0LPDoQQrfsu7qHQTsbL/cUIMFwq6kzN5iVS0=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:reply-to:mime-version:content-type:content-transfer-encoding;
	s=lagarcavilla.org; bh=7l/d7FuZay8lopNST8cCuiLxzRM=; b=FgeF1pGM
	r/NBLTirC/CZiSQCSnILoM3L/w1hkOTz73SX8EUMY20d6f33XIH1qArmFXK6AMge
	jnHGGfaMPAmqGjM6cGKeXpeGVjbbGsCelUgXuXyODpAXR1zq/wMVMYeZCRpj0HfI
	CwYUdMZvhW8Y5eOmmb+lJQPHwjFAsQ6rJ0M=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a21.g.dreamhost.com (Postfix) with ESMTPA id D0A3B300079; 
	Thu, 10 Nov 2011 05:57:17 -0800 (PST)
Received: from 99.255.91.65 (proxying for 99.255.91.65)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP;
	Thu, 10 Nov 2011 05:57:18 -0800
Message-ID: <616d337af40641509cf694a13c681d01.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <4EBBA5730200007800060139@nat28.tlf.novell.com>
References: <20111108224414.83985CF73A@homiemail-mx7.g.dreamhost.com>
	<3c097da8e49a42af1210e4ffcd39fd48.squirrel@webmail.lagarcavilla.org>
	<20111109070927.GB26154@aepfle.de>
	<0bb01a4d216a68c4ae8441b037927f61.squirrel@webmail.lagarcavilla.org>
	<20111109221148.GA17166@aepfle.de>
	<5d7d38b18271fcc7aa750604eeb52bbd.squirrel@webmail.lagarcavilla.org>
	<4EBBA5730200007800060139@nat28.tlf.novell.com>
Date: Thu, 10 Nov 2011 05:57:18 -0800
Subject: Re: [Xen-devel] Re: Need help with fixing the Xen waitqueue feature
From: "Andres Lagar-Cavilla" <andres@lagarcavilla.org>
To: "Jan Beulich" <JBeulich@suse.com>
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: Olaf Hering <olaf@aepfle.de>, keir.xen@gmail.com,
	xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: andres@lagarcavilla.org
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Thanks Jan, and thanks Olaf for the pointers to specific patches. I'll tr=
y
to cherry pick those into my dom0 (debian mainline 3.0). Somebody else
should get those in mainline though. Soonish :)

Andres
>>>> On 10.11.11 at 05:29, "Andres Lagar-Cavilla" <andres@lagarcavilla.or=
g>
>>>> wrote:
>> The tools retry as long as IOCTL_PRIVCMD_MMAPBATCH_V2 is supported.
>> Which
>> it isn't on mainline linux 3.0, 3.1, etc.
>
> Seems like nobody cared to port over the code from the old 2.6.18 tree
> (or the forward ports thereof).
>
>> Which dom0 kernel are you using?
>
> Certainly one of our forward port kernels.
>
>> And for backend drivers implemented in the kernel (netback, etc), ther=
e
>> is
>> no retrying.
>
> As above, seems like nobody cared to forward port those bits either.
>
> Jan
>
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 06:27:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 06:27:43 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROVbS-0004lA-Tk; Thu, 10 Nov 2011 06:27:42 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROVYx-00041G-I7
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 06:25:12 -0800
X-Env-Sender: beto.rvs@gmail.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1320935103!3603390!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16146 invoked from network); 10 Nov 2011 14:25:04 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-10.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 14:25:04 -0000
Received: by vcbfk13 with SMTP id fk13so3320142vcb.30
	for <xen-devel@lists.xensource.com>;
	Thu, 10 Nov 2011 06:25:02 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type;
	bh=lIXCYlJ+VXt+xdMhVLA/AjeztqVRy7TuHwCdVt3oIdI=;
	b=D0BmHZX0ZENzkBYf4MvSWnG/0vT+DA6Wn/vRjl3RPwkRuGs3iMMqtUm5Rk+yTOx7BH
	r8b1iDc7Vp0tvoySdnkRvSkewNt988QBM/q0fQnkRNlYB0jp4t/1DftYSf1HFQ7q6fsw
	41tOKtFCvdi9LevHBj5JIZq5QDmE+k0c945rM=
MIME-Version: 1.0
Received: by 10.220.153.204 with SMTP id l12mr879896vcw.212.1320935102823;
	Thu, 10 Nov 2011 06:25:02 -0800 (PST)
Received: by 10.220.5.72 with HTTP; Thu, 10 Nov 2011 06:25:02 -0800 (PST)
In-Reply-To: <1320917040.955.197.camel@zakaz.uk.xensource.com>
References: <CAOdhoheOhKGWp3f-tvXDX5SuGMXmsyY4fP==EXL-CWfiF52NzQ@mail.gmail.com>
	<20111109151838.GA26277@phenom.dumpdata.com>
	<CAOdhohc+UoicOGTW2W_rzdf7d4RR48QyOb4dr=f2g-LAWKB-dA@mail.gmail.com>
	<20111110034237.GA3156@phenom.dumpdata.com>
	<1320917040.955.197.camel@zakaz.uk.xensource.com>
Date: Thu, 10 Nov 2011 12:25:02 -0200
Message-ID: <CAOdhohedp1izdA4BYNWh1TkA=aNgrobCPuwMDfDGUnr1ZcxPMw@mail.gmail.com>
Subject: Re: [Xen-devel] why do I get bad disk write performance in the kernel
	3.1?
From: Roberto Scudeller <beto.rvs@gmail.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0984637014=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0984637014==
Content-Type: multipart/alternative; boundary=f46d04308bde933b7604b1622b66

--f46d04308bde933b7604b1622b66
Content-Type: text/plain; charset=ISO-8859-1

Ian,


> That depends on whether Roberto is using xm/xend or xl, I think.
> Roberto?
>

I'm using "xl create windows.cfg"


>
> I'm not sure what xend does for 'tap2:aio' if blktap isn't available. I
> suspect it doesn't fallback to qdisk. Roberto can you report the content
> of xenstore under /local/domain/0/backend/ (use xenstore-ls <path>).
>
> # xenstore-ls /local/domain/0/backend
qdisk = ""
 10 = ""
  51712 = ""
   frontend = "/local/domain/10/device/vbd/51712"
   params = "aio:/local-disk/benchCM-windows-2003-64b-std/xvda"
   frontend-id = "10"
   online = "1"
   removable = "0"
   bootable = "1"
   state = "4"
   dev = "xvda"
   type = "tap"
   mode = "w"
   feature-barrier = "1"
   info = "0"
   sector-size = "512"
   sectors = "67108864"
   hotplug-status = "connected"
  51728 = ""
   frontend = "/local/domain/10/device/vbd/51728"
   params = "aio:/local-disk/benchCM-windows-2003-64b-std/xvdb"
   frontend-id = "10"
   online = "1"
   removable = "0"
   bootable = "1"
   state = "4"
   dev = "xvdb"
   type = "tap"
   mode = "w"
   feature-barrier = "1"
   info = "0"
   sector-size = "512"
   sectors = "614400"
   hotplug-status = "connected"
console = ""
 10 = ""
  0 = ""
   frontend = "/local/domain/10/console"
   frontend-id = "10"
   online = "1"
   state = "1"
   domain = "benchCM-windows-2003-64b-std-test"
   protocol = "vt100"




>  > You could also try the 'file:/local-disk' which will setup a loopback
> device
> > and use that. Try that as well.
>
> This is true with xm/xend but with xl you will need to manually setup
> the looback and use phy:/dev/loop in order to perform this experiment.
> For xl file: turns into qdisk unless blktap is available.
>
> I'm execute with file:/, but in xenstore-list, continue with qdisk. Look:
device = ""
 suspend = ""
  event-channel = "6"
 vbd = ""
  51712 = ""
   backend = "/local/domain/0/backend/qdisk/10/51712"
   backend-id = "0"
   state = "4"
   virtual-device = "51712"
   device-type = "disk"
   ring-ref = "16383"
   event-channel = "7"
  51728 = ""
   backend = "/local/domain/0/backend/qdisk/10/51728"
   backend-id = "0"
   state = "4"
   virtual-device = "51728"
   device-type = "disk"
   ring-ref = "16371"
   event-channel = "8"

Konrad,
I try with "file://" and result was qdisk again. Do you think is LVM test
need?

I testing my windows.cfg in xen 4.1.2-rc1-pre with kernel 2.6.32.43, the
result of xenstore-ls:
# xenstore-ls /local/domain/0/backend
vbd = ""
 2 = ""
  51712 = ""
   frontend = "/local/domain/2/device/vbd/51712"
   tapdisk-params = "aio:/disk-local/benchCM-windows-2003-64b-std/xvda"
   params = "/dev/xen/blktap-2/tapdev2"
   physical-device = "fd:2"
   frontend-id = "2"
   online = "1"
   removable = "0"
   bootable = "1"
   state = "4"
   dev = "xvda"
   type = "phy"
   mode = "w"
   feature-barrier = "1"
   sectors = "67108864"
   info = "0"
   sector-size = "512"
  51728 = ""
   frontend = "/local/domain/2/device/vbd/51728"
   tapdisk-params = "aio:/local-disk/benchCM-windows-2003-64b-std/xvdb"
   params = "/dev/xen/blktap-2/tapdev3"
   physical-device = "fd:3"
   frontend-id = "2"
   online = "1"
   removable = "0"
   bootable = "1"
   state = "4"
   dev = "xvdb"
   type = "phy"
   mode = "w"
   feature-barrier = "1"
   sectors = "614400"
   info = "0"
   sector-size = "512"
console = ""
 2 = ""
  0 = ""
   frontend = "/local/domain/2/console"
   frontend-id = "2"
   online = "1"
   state = "1"
   domain = "benchCM-windows-2003-64b-std-test"
   protocol = "vt100"

Why did kernel 3.1 use the qdisk? I want to use blktap backend
('tap2:aio:/disk-local/xvda,xvda,w').


Thanks for help.

-- 
Roberto Scudeller

--f46d04308bde933b7604b1622b66
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Ian,<br><br><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" st=
yle=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
That depends on whether Roberto is using xm/xend or xl, I think.<br>
Roberto?<br></blockquote><div><br>I&#39;m using &quot;xl create windows.cfg=
&quot;<br>=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0pt 0p=
t 0pt 0.8ex;border-left:1px solid rgb(204, 204, 204);padding-left:1ex">

<br>
I&#39;m not sure what xend does for &#39;tap2:aio&#39; if blktap isn&#39;t =
available. I<br>
suspect it doesn&#39;t fallback to qdisk. Roberto can you report the conten=
t<br>
of xenstore under /local/domain/0/backend/ (use xenstore-ls &lt;path&gt;).<=
br>
<div><br></div></blockquote><div># xenstore-ls /local/domain/0/backend<br>q=
disk =3D &quot;&quot;<br>=A010 =3D &quot;&quot;<br>=A0 51712 =3D &quot;&quo=
t;<br>=A0=A0 frontend =3D &quot;/local/domain/10/device/vbd/51712&quot;<br>
=A0=A0 params =3D &quot;aio:/local-disk/benchCM-windows-2003-64b-std/xvda&q=
uot;<br>=A0=A0 frontend-id =3D &quot;10&quot;<br>=A0=A0 online =3D &quot;1&=
quot;<br>=A0=A0 removable =3D &quot;0&quot;<br>=A0=A0 bootable =3D &quot;1&=
quot;<br>=A0=A0 state =3D &quot;4&quot;<br>


=A0=A0 dev =3D &quot;xvda&quot;<br>=A0=A0 type =3D &quot;tap&quot;<br>=A0=
=A0 mode =3D &quot;w&quot;<br>=A0=A0 feature-barrier =3D &quot;1&quot;<br>=
=A0=A0 info =3D &quot;0&quot;<br>=A0=A0 sector-size =3D &quot;512&quot;<br>=
=A0=A0 sectors =3D &quot;67108864&quot;<br>


=A0=A0 hotplug-status =3D &quot;connected&quot;<br>=A0 51728 =3D &quot;&quo=
t;<br>=A0=A0 frontend =3D &quot;/local/domain/10/device/vbd/51728&quot;<br>=
=A0=A0 params =3D &quot;aio:/local-disk/benchCM-windows-2003-64b-std/xvdb&q=
uot;<br>=A0=A0 frontend-id =3D &quot;10&quot;<br>


=A0=A0 online =3D &quot;1&quot;<br>=A0=A0 removable =3D &quot;0&quot;<br>=
=A0=A0 bootable =3D &quot;1&quot;<br>=A0=A0 state =3D &quot;4&quot;<br>=A0=
=A0 dev =3D &quot;xvdb&quot;<br>=A0=A0 type =3D &quot;tap&quot;<br>=A0=A0 m=
ode =3D &quot;w&quot;<br>=A0=A0 feature-barrier =3D &quot;1&quot;<br>


=A0=A0 info =3D &quot;0&quot;<br>=A0=A0 sector-size =3D &quot;512&quot;<br>=
=A0=A0 sectors =3D &quot;614400&quot;<br>=A0=A0 hotplug-status =3D &quot;co=
nnected&quot;<br>console =3D &quot;&quot;<br>=A010 =3D &quot;&quot;<br>=A0 =
0 =3D &quot;&quot;<br>=A0=A0 frontend =3D &quot;/local/domain/10/console&qu=
ot;<br>


=A0=A0 frontend-id =3D &quot;10&quot;<br>=A0=A0 online =3D &quot;1&quot;<br=
>=A0=A0 state =3D &quot;1&quot;<br>=A0=A0 domain =3D &quot;benchCM-windows-=
2003-64b-std-test&quot;<br>=A0=A0 protocol =3D &quot;vt100&quot;<br><br><br=
>=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0pt 0pt 0pt 0.8=
ex;border-left:1px solid rgb(204, 204, 204);padding-left:1ex">


<div>
&gt; You could also try the &#39;file:/local-disk&#39; which will setup a l=
oopback device<br>
&gt; and use that. Try that as well.<br>
<br>
</div>This is true with xm/xend but with xl you will need to manually setup=
<br>
the looback and use phy:/dev/loop in order to perform this experiment.<br>
For xl file: turns into qdisk unless blktap is available.<br>
<br></blockquote><div>I&#39;m execute with file:/, but in xenstore-list, co=
ntinue with qdisk. Look:<br>device =3D &quot;&quot;<br>=A0suspend =3D &quot=
;&quot;<br>=A0 event-channel =3D &quot;6&quot;<br>=A0vbd =3D &quot;&quot;<b=
r>=A0 51712 =3D &quot;&quot;<br>


=A0=A0 backend =3D &quot;/local/domain/0/backend/qdisk/10/51712&quot;<br>=
=A0=A0 backend-id =3D &quot;0&quot;<br>=A0=A0 state =3D &quot;4&quot;<br>=
=A0=A0 virtual-device =3D &quot;51712&quot;<br>=A0=A0 device-type =3D &quot=
;disk&quot;<br>=A0=A0 ring-ref =3D &quot;16383&quot;<br>


=A0=A0 event-channel =3D &quot;7&quot;<br>=A0 51728 =3D &quot;&quot;<br>=A0=
=A0 backend =3D &quot;/local/domain/0/backend/qdisk/10/51728&quot;<br>=A0=
=A0 backend-id =3D &quot;0&quot;<br>=A0=A0 state =3D &quot;4&quot;<br>=A0=
=A0 virtual-device =3D &quot;51728&quot;<br>


=A0=A0 device-type =3D &quot;disk&quot;<br>=A0=A0 ring-ref =3D &quot;16371&=
quot;<br>=A0=A0 event-channel =3D &quot;8&quot;<br><br>Konrad, <br>I try wi=
th &quot;file://&quot; and result was qdisk again. Do you think is LVM test=
 need?<br><br>


I testing my windows.cfg in xen 4.1.2-rc1-pre with kernel 2.6.32.43, the re=
sult of xenstore-ls:<br># xenstore-ls /local/domain/0/backend<br>vbd =3D &q=
uot;&quot;<br>=A02 =3D &quot;&quot;<br>=A0 51712 =3D &quot;&quot;<br>=A0=A0=
 frontend =3D &quot;/local/domain/2/device/vbd/51712&quot;<br>

=A0=A0 tapdisk-params =3D &quot;aio:/disk-local/benchCM-windows-2003-64b-st=
d/xvda&quot;<br>=A0=A0 params =3D &quot;/dev/xen/blktap-2/tapdev2&quot;<br>=
=A0=A0 physical-device =3D &quot;fd:2&quot;<br>=A0=A0 frontend-id =3D &quot=
;2&quot;<br>=A0=A0 online =3D &quot;1&quot;<br>

=A0=A0 removable =3D &quot;0&quot;<br>=A0=A0 bootable =3D &quot;1&quot;<br>=
=A0=A0 state =3D &quot;4&quot;<br>=A0=A0 dev =3D &quot;xvda&quot;<br>=A0=A0=
 type =3D &quot;phy&quot;<br>=A0=A0 mode =3D &quot;w&quot;<br>=A0=A0 featur=
e-barrier =3D &quot;1&quot;<br>=A0=A0 sectors =3D &quot;67108864&quot;<br>

=A0=A0 info =3D &quot;0&quot;<br>=A0=A0 sector-size =3D &quot;512&quot;<br>=
=A0 51728 =3D &quot;&quot;<br>=A0=A0 frontend =3D &quot;/local/domain/2/dev=
ice/vbd/51728&quot;<br>=A0=A0 tapdisk-params =3D &quot;aio:/local-disk/benc=
hCM-windows-2003-64b-std/xvdb&quot;<br>

=A0=A0 params =3D &quot;/dev/xen/blktap-2/tapdev3&quot;<br>=A0=A0 physical-=
device =3D &quot;fd:3&quot;<br>=A0=A0 frontend-id =3D &quot;2&quot;<br>=A0=
=A0 online =3D &quot;1&quot;<br>=A0=A0 removable =3D &quot;0&quot;<br>=A0=
=A0 bootable =3D &quot;1&quot;<br>
=A0=A0 state =3D &quot;4&quot;<br>
=A0=A0 dev =3D &quot;xvdb&quot;<br>=A0=A0 type =3D &quot;phy&quot;<br>=A0=
=A0 mode =3D &quot;w&quot;<br>=A0=A0 feature-barrier =3D &quot;1&quot;<br>=
=A0=A0 sectors =3D &quot;614400&quot;<br>=A0=A0 info =3D &quot;0&quot;<br>=
=A0=A0 sector-size =3D &quot;512&quot;<br>

console =3D &quot;&quot;<br>=A02 =3D &quot;&quot;<br>=A0 0 =3D &quot;&quot;=
<br>=A0=A0 frontend =3D &quot;/local/domain/2/console&quot;<br>=A0=A0 front=
end-id =3D &quot;2&quot;<br>=A0=A0 online =3D &quot;1&quot;<br>=A0=A0 state=
 =3D &quot;1&quot;<br>=A0=A0 domain =3D &quot;benchCM-windows-2003-64b-std-=
test&quot;<br>

=A0=A0 protocol =3D &quot;vt100&quot;<br><br>Why did kernel 3.1 use the qdi=
sk? I want to use blktap backend (&#39;tap2:aio:/disk-local/xvda,xvda,w&#39=
;).<br><br><br></div></div>Thanks for help.<br clear=3D"all"><br>-- <br>Rob=
erto Scudeller<br>
<br><br>

--f46d04308bde933b7604b1622b66--


--===============0984637014==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0984637014==--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 06:32:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 06:32:30 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROVg6-0005yJ-0a; Thu, 10 Nov 2011 06:32:30 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROVdb-000541-JU
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 06:29:55 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1320935392!3660651!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30606 invoked from network); 10 Nov 2011 14:29:52 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-12.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 14:29:52 -0000
X-IronPort-AV: E=Sophos;i="4.69,489,1315180800"; 
   d="scan'208";a="8865540"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 14:29:52 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Thu, 10 Nov 2011 14:29:52 +0000
Subject: Re: [Xen-devel] why do I get bad disk write performance in the
	kernel 3.1?
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roberto Scudeller <beto.rvs@gmail.com>
Date: Thu, 10 Nov 2011 14:29:52 +0000
In-Reply-To: <CAOdhohedp1izdA4BYNWh1TkA=aNgrobCPuwMDfDGUnr1ZcxPMw@mail.gmail.com>
References: <CAOdhoheOhKGWp3f-tvXDX5SuGMXmsyY4fP==EXL-CWfiF52NzQ@mail.gmail.com>
	<20111109151838.GA26277@phenom.dumpdata.com>
	<CAOdhohc+UoicOGTW2W_rzdf7d4RR48QyOb4dr=f2g-LAWKB-dA@mail.gmail.com>
	<20111110034237.GA3156@phenom.dumpdata.com>
	<1320917040.955.197.camel@zakaz.uk.xensource.com>
	<CAOdhohedp1izdA4BYNWh1TkA=aNgrobCPuwMDfDGUnr1ZcxPMw@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320935392.955.227.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-11-10 at 14:25 +0000, Roberto Scudeller wrote:
> Ian,
> 
>         
>         That depends on whether Roberto is using xm/xend or xl, I
>         think.
>         Roberto?
> 
> I'm using "xl create windows.cfg"

OK, so you will be getting qdisk (and your logs confirm this).
>  
>         > You could also try the 'file:/local-disk' which will setup a
>         loopback device
>         > and use that. Try that as well.
>         
>         
>         This is true with xm/xend but with xl you will need to
>         manually setup
>         the looback and use phy:/dev/loop in order to perform this
>         experiment.
>         For xl file: turns into qdisk unless blktap is available.
>         
> I'm execute with file:/, but in xenstore-list, continue with qdisk.

Please try using losetup to bind your file to /dev/loopN and specifying
phy:/dev/loopN in your config. That should get you blkback.

[...]
> I try with "file://" and result was qdisk again. Do you think is LVM
> test need?

That would also be interesting.

> Why did kernel 3.1 use the qdisk? I want to use blktap backend
> ('tap2:aio:/disk-local/xvda,xvda,w').

blktap is not available in 3.1. Unfortunately it is not upstreamable so
it is unlikely to become available until someone does a pile of work to
make it a userspace only thing (see the list archives for various
explanations of this).

Since you are using a raw image (rather than e.g. vhd or qcow) there is
no benefit to blktap.

Ian.

> 
> 
> 
> Thanks for help.
> 
> -- 
> Roberto Scudeller
> 
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 06:42:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 06:42:19 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROVpb-0006cK-Bs; Thu, 10 Nov 2011 06:42:19 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROVoy-0006Pd-4O
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 06:41:40 -0800
X-Env-Sender: dkiper@net-space.pl
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320936059!62683917!1
X-Originating-IP: [89.174.63.77]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22129 invoked from network); 10 Nov 2011 14:41:00 -0000
Received: from router-fw.net-space.pl (HELO router-fw.net-space.pl)
	(89.174.63.77)
	by server-2.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 10 Nov 2011 14:41:00 -0000
Received: (from localhost user: 'dkiper' uid#4000 fake: STDIN
	(dkiper@router-fw.net-space.pl)) by router-fw-old.local.net-space.pl
	id S896913Ab1KJOlb (ORCPT <rfc822;xen-devel@lists.xensource.com>);
	Thu, 10 Nov 2011 15:41:31 +0100
Date: Thu, 10 Nov 2011 15:41:31 +0100
From: Daniel Kiper <dkiper@net-space.pl>
To: David Vrabel <david.vrabel@citrix.com>
Subject: Re: [Xen-devel] [PATCH] xen: document balloon driver sysfs files
Message-ID: <20111110144131.GA20293@router-fw-old.local.net-space.pl>
References: <1319626664-28225-1-git-send-email-david.vrabel@citrix.com>
	<20111026191212.GA17424@router-fw-old.local.net-space.pl>
	<20111108165915.GB30802@phenom.dumpdata.com>
	<20111108201043.GB6539@router-fw-old.local.net-space.pl>
	<4EBBB96A.9010400@citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EBBB96A.9010400@citrix.com>
User-Agent: Mutt/1.3.28i
Cc: xen-devel@lists.xensource.com, Daniel Kiper <dkiper@net-space.pl>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Nov 10, 2011 at 11:45:46AM +0000, David Vrabel wrote:
> On 08/11/11 20:10, Daniel Kiper wrote:
> > On Tue, Nov 08, 2011 at 11:59:15AM -0500, Konrad Rzeszutek Wilk wrote:
> >> Daniel, how does this look ? I added your Reviewed-by, but if you want
> >> to make some more modifications I can certainly do so.
>
> Thanks for this Konrad, I've been swamped by customer issues lately.
>
> >> +What:		/sys/devices/system/xen_memory/xen_memory0/schedule_delay
> >> +Date:		May 2011
> >> +KernelVersion:	2.6.39
> >> +Contact:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> >> +Description:
> >> +		The time (in jiffies) to wait between attempts to
> >
> > It is in seconds. Please look at the end of balloon_process() funtion.
> > This value is multiplicated by HZ constant (which indeed is scaled in
> > jiffies, however, I think in this case second is better unit).
>
> I've posted a new version with this correction.

Thanks. Now it is OK.

Daniel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 06:54:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 06:54:43 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROW1b-0000ue-Dv; Thu, 10 Nov 2011 06:54:43 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROW0J-0000SH-Uz
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 06:53:24 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1320936800!2619506!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29634 invoked from network); 10 Nov 2011 14:53:20 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-3.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 14:53:20 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 10 Nov 2011 14:53:21 +0000
Message-Id: <4EBBF36A0200007800060375@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 10 Nov 2011 14:53:14 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Gianluca Guida" <glguida@gmail.com>
References: <4EBBC25B02000078000601F1@nat28.tlf.novell.com>
	<CAKpvNa3DmeQyXBb7obc_PbsNaEUBLjTFc_eLkTKH8RwYs4WQYw@mail.gmail.com>
In-Reply-To: <CAKpvNa3DmeQyXBb7obc_PbsNaEUBLjTFc_eLkTKH8RwYs4WQYw@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Tim Deegan <tim@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Gianluca Guida <gianluca.guida@citrix.com>
Subject: [Xen-devel] Re: performance regression from c/s 21647:cfba1560054a
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 14:45, Gianluca Guida <glguida@gmail.com> wrote:
> On a personal note, thanks for asking me about shadow pagetables, I've
> been missing this kind of fun and it's a good way to celebrate my
> return to Xen (and Citrix) after exactly two years... :-)
> Stefano imported an old patch of mine, so I am the culprit for this.

So welcome back, Gianluca! And thanks for the fast response.

> On Thu, Nov 10, 2011 at 3:23 AM, Jan Beulich <JBeulich@suse.com> wrote:
>> in this c/s you did, besides the main purpose of the change, an
>> adjustment to check_for_early_unshadow() in that L2...L4 entries
>> would no longer be attempted to get unshadowed. Neither the
>> patch description nor the added comment really make clear why
>> this was done, and we now got a customer report regarding this
>> causing considerable slowdown in process creation/destruction
>> intensive workloads (e.g. shell scripts).
>=20
> Unfortunately, I can't clearly remember the reason for this. I assume
> that your mentioning of shell scripts implies that this is running
> under a Linux guest. Back in the day, this patch was tailored very
> strictly against Windows guests, and that probably meant that doing so
> had a performance improvement over the way Windows handled pagetables
> and process distructions.
>=20
> Perhaps (I need some time to catch up) the PV-HVM thing has made this
> patch affect Linux as well, at the point that this has became a
> problem.
>=20
> Can you tell me in what guest OS this is experiencing a slow down?

It's SLE11 SP1 guests that suffered a regression after a maintenance
update (originally shipped with 4.0.0, while that patch got backported
later into 4.0.x).

> What is the order of magnitude of the performance decrease?

Factor 7...8 in their measurements.

> I have no problem in reverting that part of the change, if it makes =
you=20
> happy.

It's not so much about making me feel good, but about understanding
what the reasons for the change were (and hence whether perhaps
some heuristic would better be used to determine whether higher
level page tables are worth getting unshadowed earlier). After all I
also don't want reverting this to result in a performance regression in
Windows guests.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 06:56:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 06:56:42 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROW3W-0001Ie-Eo; Thu, 10 Nov 2011 06:56:42 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROW33-00016j-OI
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 06:56:14 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1320936931!56300420!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24059 invoked from network); 10 Nov 2011 14:55:32 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-7.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 14:55:32 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAAEu5Ix002484
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 10 Nov 2011 14:56:06 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAAEu4KL002813
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 10 Nov 2011 14:56:05 GMT
Received: from abhmt107.oracle.com (abhmt107.oracle.com [141.146.116.59])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAAEtxlA006189; Thu, 10 Nov 2011 08:55:59 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 10 Nov 2011 06:55:59 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 345C3819E6; Thu, 10 Nov 2011 09:55:58 -0500 (EST)
Date: Thu, 10 Nov 2011 09:55:58 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Stefan Bader <stefan.bader@canonical.com>
Subject: Re: [Xen-devel] Re: Regression in 3.1 causes Xen to use wrong idle
	routine
Message-ID: <20111110145558.GB7540@phenom.dumpdata.com>
References: <4EA7DFD1.9060608@canonical.com>
	<20111026133003.GA6654@phenom.dumpdata.com>
	<4EA80CF2.5040309@canonical.com>
	<20111026134843.GA31609@phenom.dumpdata.com>
	<4EA811BB.6010005@canonical.com>
	<20111109175853.GA16318@phenom.dumpdata.com>
	<4EBB8C42.8080604@canonical.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EBB8C42.8080604@canonical.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090204.4EBBE607.0048,ss=1,re=0.000,fgs=0
Cc: len.brown@intel.com,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Nov 10, 2011 at 09:33:06AM +0100, Stefan Bader wrote:
> On 09.11.2011 18:58, Konrad Rzeszutek Wilk wrote:
> > On Wed, Oct 26, 2011 at 03:57:15PM +0200, Stefan Bader wrote:
> >> On 26.10.2011 15:48, Konrad Rzeszutek Wilk wrote:
> >>>>> What about using the cpuidle_disabled() functionality and adhere to that?
> >>>>> As so:
> >>>>>
> >>> .. snip..
> >>>>
> >>>> >From reading over it, this should work. Though I would be interested to hear
> >>>> from the linux-acpi folks. Also to double check that calling pm_idle when
> >>>> cpuidle.off was specified really is what is intended.
> >>>
> >>> Oh yeah, definitly need the input from linux-acpi folks. And also to be actually
> >>> tested :-)
> >>
> >> I can volunteer to do the testing. But I am lazy enough to hold back a bit as
> >> someone may tell us this is completely the wrong way to fix it. :)
> > 
> > So the other option is to use 'idle=halt' on the Linux command line. That should
> > provide the workaround for the folks reporting this (is there a BZ for it?).
> > 
> Believe upstream bz is still down. Got the issue reported here, though:
> 
> http://bugs.launchpad.net/bugs/881076

Ok, added that to the patch description.
> 
> Hm, as a workaround probably. I guess it could be added when the test images are
> done. Unfortunately, when running your image in the cloud it is kind of hard to
> recover. Even more as you could have tested on an AMD based host.

Sadly my AMD boxes did not explode when I tested Len's patches :-(.
> 
> Wonder whether it would be an option to automatically mask the mwait capability
> off when running in paravirt mode...

We could, but why not strive to do it correctly first.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 07:06:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 07:06:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROWD7-0002Wk-W1; Thu, 10 Nov 2011 07:06:38 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROW53-0001hV-L6
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 06:58:18 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1320937094!2610874!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12054 invoked from network); 10 Nov 2011 14:58:14 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 14:58:14 -0000
X-IronPort-AV: E=Sophos;i="4.69,489,1315180800"; 
   d="scan'208";a="8866393"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 14:58:14 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 14:58:14 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1ROW4z-0001Zv-Pa;
	Thu, 10 Nov 2011 14:58:13 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1ROW4z-0004k3-9W;
	Thu, 10 Nov 2011 14:58:13 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9741-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 10 Nov 2011 14:58:13 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9741: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9741 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9741/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl          18 leak-check/check           fail REGR. vs. 9661
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl           18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-credit2   18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-multivcpu 18 leak-check/check           fail REGR. vs. 9661

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-amd64-xl-sedf     18 leak-check/check          fail blocked in 9661
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  d0bbe0622d1d
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  "Shan, Haitao" <haitao.shan@intel.com>
  Andres Lagar-Cavilla <andres@lagarcavilla.org>
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Jean Guyader <jean.guyader@eu.citrix.com>
  Juergen Gross <juergen.gross@ts.fujitsu.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  Tim Deegan <tim@xen.org>
  Wei Wang <wei.wang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

(No revision log; it would be 656 lines long.)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 07:08:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 07:08:53 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROWFI-0002ua-AE; Thu, 10 Nov 2011 07:08:52 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROW5d-0001lK-1Y
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 06:58:53 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1320937129!3697537!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3931 invoked from network); 10 Nov 2011 14:58:49 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 14:58:49 -0000
X-IronPort-AV: E=Sophos;i="4.69,489,1315180800"; 
   d="scan'208";a="8866413"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 14:58:49 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 14:58:49 +0000
Date: Thu, 10 Nov 2011 14:59:20 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Jan Beulich <JBeulich@suse.com>
In-Reply-To: <4EBBF36A0200007800060375@nat28.tlf.novell.com>
Message-ID: <alpine.DEB.2.00.1111101457380.3519@kaball-desktop>
References: <4EBBC25B02000078000601F1@nat28.tlf.novell.com>
	<CAKpvNa3DmeQyXBb7obc_PbsNaEUBLjTFc_eLkTKH8RwYs4WQYw@mail.gmail.com>
	<4EBBF36A0200007800060375@nat28.tlf.novell.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: Gianluca Guida <glguida@gmail.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	"Tim \(Xen.org\)" <tim@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Gianluca Guida <gianluca.guida@citrix.com>
Subject: [Xen-devel] Re: performance regression from c/s 21647:cfba1560054a
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 10 Nov 2011, Jan Beulich wrote:
> It's SLE11 SP1 guests that suffered a regression after a maintenance
> update (originally shipped with 4.0.0, while that patch got backported
> later into 4.0.x).

Is SLES11 SP1 using HVMOP_pagetable_dying (see
arch/x86/xen/mmu.c:xen_hvm_init_mmu_ops)?

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 07:21:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 07:21:43 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROWRi-0004o6-3S; Thu, 10 Nov 2011 07:21:43 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROW7Z-0001vc-LZ
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 07:01:01 -0800
X-Env-Sender: glguida@gmail.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1320937248!3665804!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18382 invoked from network); 10 Nov 2011 15:00:49 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-12.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 15:00:49 -0000
Received: by ywn1 with SMTP id 1so779082ywn.30
	for <xen-devel@lists.xensource.com>;
	Thu, 10 Nov 2011 07:00:48 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type:content-transfer-encoding;
	bh=y9ax8GD+YXzWrbAQYKlzH0D2woKhcOmL8elKxCXZFNk=;
	b=iws/IJmGHLGMC3P4vFK5+beYX/LU+5e/9lpLQLNCLtofcY8ZWascgMfZYxv6mndNTx
	Z5lmCIvaE6/E6GoKormsf1anPSr8z61hr382RPlp9EBo/vnXu08lVvM9YEjF748U+uRI
	zDQPdAtQVknew1BYSR2e4OkkYYW2RA7AE2Nuw=
MIME-Version: 1.0
Received: by 10.50.185.232 with SMTP id ff8mr8401424igc.32.1320937248239; Thu,
	10 Nov 2011 07:00:48 -0800 (PST)
Received: by 10.50.189.234 with HTTP; Thu, 10 Nov 2011 07:00:48 -0800 (PST)
In-Reply-To: <alpine.DEB.2.00.1111101457380.3519@kaball-desktop>
References: <4EBBC25B02000078000601F1@nat28.tlf.novell.com>
	<CAKpvNa3DmeQyXBb7obc_PbsNaEUBLjTFc_eLkTKH8RwYs4WQYw@mail.gmail.com>
	<4EBBF36A0200007800060375@nat28.tlf.novell.com>
	<alpine.DEB.2.00.1111101457380.3519@kaball-desktop>
Date: Thu, 10 Nov 2011 07:00:48 -0800
Message-ID: <CAKpvNa1sPPjVyzPWbrdBhEe5i1ji6fwg6CDSx-QPyz5LjywpnQ@mail.gmail.com>
From: Gianluca Guida <glguida@gmail.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Tim \(Xen.org\)" <tim@xen.org>, Jan Beulich <JBeulich@suse.com>,
	Gianluca Guida <gianluca.guida@citrix.com>
Subject: [Xen-devel] Re: performance regression from c/s 21647:cfba1560054a
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Nov 10, 2011 at 6:59 AM, Stefano Stabellini
<stefano.stabellini@eu.citrix.com> wrote:
> On Thu, 10 Nov 2011, Jan Beulich wrote:
>> It's SLE11 SP1 guests that suffered a regression after a maintenance
>> update (originally shipped with 4.0.0, while that patch got backported
>> later into 4.0.x).
>
> Is SLES11 SP1 using HVMOP_pagetable_dying (see
> arch/x86/xen/mmu.c:xen_hvm_init_mmu_ops)?

Good question. In case it does not, just changing the ">l1" check to
work only in case we used the hypercall might do the trick.

Gianluca

--=20
It was a type of people I did not know, I found them very strange and
they did not inspire confidence at all. Later I learned that I had been
introduced to electronic engineers.
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 =A0 =A0 =A0 =A0 E. W. Dijkstra

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 07:29:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 07:29:22 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROWZ7-0005xN-5o; Thu, 10 Nov 2011 07:29:21 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROWAt-0002Io-43
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 07:04:29 -0800
X-Env-Sender: glguida@gmail.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1320937455!3020255!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32198 invoked from network); 10 Nov 2011 15:04:16 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-4.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 15:04:16 -0000
Received: by ywn1 with SMTP id 1so785028ywn.30
	for <xen-devel@lists.xensource.com>;
	Thu, 10 Nov 2011 07:04:14 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type:content-transfer-encoding;
	bh=j9N2/XzQdqkHx/5FQ+8Hk/w/KJAVjhQ8hNCjlYEWW5M=;
	b=XTLlfZe3IQNz8EJ8c1uPxB+y5bDtv9Lv3YWcd4aE5+uU6znGp1mpSjenbb8Nzc90UD
	BNRdiospip3GmsWJT6Wn5VdTybjx0RLlCEt1BZt0DFr1Yr3s1peOy4oOSNFK7eX5JToS
	WptrK3ftRa/ewzoUBVwNuBHRsnhv8t6ADbWys=
MIME-Version: 1.0
Received: by 10.50.173.74 with SMTP id bi10mr8769111igc.4.1320937454734; Thu,
	10 Nov 2011 07:04:14 -0800 (PST)
Received: by 10.50.189.234 with HTTP; Thu, 10 Nov 2011 07:04:14 -0800 (PST)
In-Reply-To: <4EBBF36A0200007800060375@nat28.tlf.novell.com>
References: <4EBBC25B02000078000601F1@nat28.tlf.novell.com>
	<CAKpvNa3DmeQyXBb7obc_PbsNaEUBLjTFc_eLkTKH8RwYs4WQYw@mail.gmail.com>
	<4EBBF36A0200007800060375@nat28.tlf.novell.com>
Date: Thu, 10 Nov 2011 07:04:14 -0800
Message-ID: <CAKpvNa09J1WFrp_uYi8Swi_=ezXDdW4bVR_FUDxdzyQZnYS9hA@mail.gmail.com>
From: Gianluca Guida <glguida@gmail.com>
To: Jan Beulich <JBeulich@suse.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Tim Deegan <tim@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Gianluca Guida <gianluca.guida@citrix.com>
Subject: [Xen-devel] Re: performance regression from c/s 21647:cfba1560054a
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Nov 10, 2011 at 6:53 AM, Jan Beulich <JBeulich@suse.com> wrote:
> It's not so much about making me feel good, but about understanding
> what the reasons for the change were (and hence whether perhaps
> some heuristic would better be used to determine whether higher
> level page tables are worth getting unshadowed earlier). After all I
> also don't want reverting this to result in a performance regression in
> Windows guests.

I will try to set up an environment to test the effects on Windows
guest. Unfortunately I forgot the details and lost the notes I took
when developing that patch. Sorry about this.

Gianluca

--=20
It was a type of people I did not know, I found them very strange and
they did not inspire confidence at all. Later I learned that I had been
introduced to electronic engineers.
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 =A0 =A0 =A0 =A0 E. W. Dijkstra

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 07:34:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 07:34:58 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROWeX-0007qO-Tv; Thu, 10 Nov 2011 07:34:57 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROWHn-0003Cm-4t
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 07:11:28 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1320937883!3038676!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5083 invoked from network); 10 Nov 2011 15:11:24 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-7.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 15:11:24 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 10 Nov 2011 15:11:28 +0000
Message-Id: <4EBBF7A9020000780006039E@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 10 Nov 2011 15:11:21 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Stefano Stabellini" <stefano.stabellini@eu.citrix.com>
References: <4EBBC25B02000078000601F1@nat28.tlf.novell.com>
	<CAKpvNa3DmeQyXBb7obc_PbsNaEUBLjTFc_eLkTKH8RwYs4WQYw@mail.gmail.com>
	<4EBBF36A0200007800060375@nat28.tlf.novell.com>
	<alpine.DEB.2.00.1111101457380.3519@kaball-desktop>
In-Reply-To: <alpine.DEB.2.00.1111101457380.3519@kaball-desktop>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Gianluca Guida <glguida@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Tim \(Xen.org\)" <tim@xen.org>, Gianluca Guida <gianluca.guida@citrix.com>
Subject: [Xen-devel] Re: performance regression from c/s 21647:cfba1560054a
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 15:59, Stefano Stabellini <stefano.stabellini@eu.citrix.=
com>
wrote:
> On Thu, 10 Nov 2011, Jan Beulich wrote:
>> It's SLE11 SP1 guests that suffered a regression after a maintenance
>> update (originally shipped with 4.0.0, while that patch got backported
>> later into 4.0.x).
>=20
> Is SLES11 SP1 using HVMOP_pagetable_dying (see
> arch/x86/xen/mmu.c:xen_hvm_init_mmu_ops)?

No, it's not.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 07:35:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 07:35:50 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROWfN-0008E3-UU; Thu, 10 Nov 2011 07:35:49 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROWL1-0003q5-Js
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 07:14:48 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1320938084!3025801!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28593 invoked from network); 10 Nov 2011 15:14:44 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-15.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 15:14:44 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 10 Nov 2011 15:14:49 +0000
Message-Id: <4EBBF87102000078000603A1@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 10 Nov 2011 15:14:41 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Stefano Stabellini" <stefano.stabellini@eu.citrix.com>,
	"Gianluca Guida" <glguida@gmail.com>
References: <4EBBC25B02000078000601F1@nat28.tlf.novell.com>
	<CAKpvNa3DmeQyXBb7obc_PbsNaEUBLjTFc_eLkTKH8RwYs4WQYw@mail.gmail.com>
	<4EBBF36A0200007800060375@nat28.tlf.novell.com>
	<alpine.DEB.2.00.1111101457380.3519@kaball-desktop>
	<CAKpvNa1sPPjVyzPWbrdBhEe5i1ji6fwg6CDSx-QPyz5LjywpnQ@mail.gmail.com>
In-Reply-To: <CAKpvNa1sPPjVyzPWbrdBhEe5i1ji6fwg6CDSx-QPyz5LjywpnQ@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Tim \(Xen.org\)" <tim@xen.org>, Gianluca Guida <gianluca.guida@citrix.com>
Subject: [Xen-devel] Re: performance regression from c/s 21647:cfba1560054a
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 16:00, Gianluca Guida <glguida@gmail.com> wrote:
> On Thu, Nov 10, 2011 at 6:59 AM, Stefano Stabellini
> <stefano.stabellini@eu.citrix.com> wrote:
>> On Thu, 10 Nov 2011, Jan Beulich wrote:
>>> It's SLE11 SP1 guests that suffered a regression after a maintenance
>>> update (originally shipped with 4.0.0, while that patch got backported
>>> later into 4.0.x).
>>
>> Is SLES11 SP1 using HVMOP_pagetable_dying (see
>> arch/x86/xen/mmu.c:xen_hvm_init_mmu_ops)?
>=20
> Good question. In case it does not, just changing the ">l1" check to
> work only in case we used the hypercall might do the trick.

Possibly, though I would argue that the difference between Linuxes
shouldn't be that big (i.e. I would rather expect that pv-on-hvm
guests also see a performance penalty here).

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 07:37:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 07:37:20 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROWgq-0000B9-Ad; Thu, 10 Nov 2011 07:37:20 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROWMV-00047Y-6B
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 07:16:21 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1320938176!3680419!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3192 invoked from network); 10 Nov 2011 15:16:16 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 15:16:16 -0000
X-IronPort-AV: E=Sophos;i="4.69,489,1315180800"; 
   d="scan'208";a="8866898"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 15:16:15 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 15:16:16 +0000
Date: Thu, 10 Nov 2011 15:16:49 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Jan Beulich <JBeulich@suse.com>
In-Reply-To: <4EBBF7A9020000780006039E@nat28.tlf.novell.com>
Message-ID: <alpine.DEB.2.00.1111101516060.3519@kaball-desktop>
References: <4EBBC25B02000078000601F1@nat28.tlf.novell.com>
	<CAKpvNa3DmeQyXBb7obc_PbsNaEUBLjTFc_eLkTKH8RwYs4WQYw@mail.gmail.com>
	<4EBBF36A0200007800060375@nat28.tlf.novell.com>
	<alpine.DEB.2.00.1111101457380.3519@kaball-desktop>
	<4EBBF7A9020000780006039E@nat28.tlf.novell.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: Gianluca Guida <glguida@gmail.com>,
	Gianluca Guida <gianluca.guida@citrix.com>, "Tim
	\(Xen.org\)" <tim@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: performance regression from c/s 21647:cfba1560054a
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 10 Nov 2011, Jan Beulich wrote:
> >>> On 10.11.11 at 15:59, Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> wrote:
> > On Thu, 10 Nov 2011, Jan Beulich wrote:
> >> It's SLE11 SP1 guests that suffered a regression after a maintenance
> >> update (originally shipped with 4.0.0, while that patch got backported
> >> later into 4.0.x).
> > 
> > Is SLES11 SP1 using HVMOP_pagetable_dying (see
> > arch/x86/xen/mmu.c:xen_hvm_init_mmu_ops)?
> 
> No, it's not.
 
well, it should, not to fix this problem but because it is a significant
performance improvement when running on shadow

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 07:40:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 07:40:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROWkG-0001Hr-Um; Thu, 10 Nov 2011 07:40:53 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROWOt-0004WN-Ea
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 07:18:49 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1320938324!3662798!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17884 invoked from network); 10 Nov 2011 15:18:44 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-2.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 15:18:44 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 10 Nov 2011 15:18:50 +0000
Message-Id: <4EBBF96102000078000603B6@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 10 Nov 2011 15:18:41 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Stefano Stabellini" <stefano.stabellini@eu.citrix.com>
References: <4EBBC25B02000078000601F1@nat28.tlf.novell.com>
	<CAKpvNa3DmeQyXBb7obc_PbsNaEUBLjTFc_eLkTKH8RwYs4WQYw@mail.gmail.com>
	<4EBBF36A0200007800060375@nat28.tlf.novell.com>
	<alpine.DEB.2.00.1111101457380.3519@kaball-desktop>
	<4EBBF7A9020000780006039E@nat28.tlf.novell.com>
	<alpine.DEB.2.00.1111101516060.3519@kaball-desktop>
In-Reply-To: <alpine.DEB.2.00.1111101516060.3519@kaball-desktop>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Gianluca Guida <glguida@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Tim\(Xen.org\)" <tim@xen.org>, Gianluca Guida <gianluca.guida@citrix.com>
Subject: [Xen-devel] Re: performance regression from c/s 21647:cfba1560054a
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 16:16, Stefano Stabellini <stefano.stabellini@eu.citrix.=
com>
wrote:
> On Thu, 10 Nov 2011, Jan Beulich wrote:
>> >>> On 10.11.11 at 15:59, Stefano Stabellini <stefano.stabellini@eu.citr=
ix.com>
>> wrote:
>> > On Thu, 10 Nov 2011, Jan Beulich wrote:
>> >> It's SLE11 SP1 guests that suffered a regression after a maintenance
>> >> update (originally shipped with 4.0.0, while that patch got =
backported
>> >> later into 4.0.x).
>> >=20
>> > Is SLES11 SP1 using HVMOP_pagetable_dying (see
>> > arch/x86/xen/mmu.c:xen_hvm_init_mmu_ops)?
>>=20
>> No, it's not.
> =20
> well, it should, not to fix this problem but because it is a significant
> performance improvement when running on shadow

Well - if you have suggestions on how to do this (a) in 2.6.32.x, (b)
without turning on CONFIG_XEN, and (c) without massive patching,
them I'm all for it.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 07:43:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 07:43:48 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROWn5-0002Rn-VZ; Thu, 10 Nov 2011 07:43:48 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROWRx-0004q3-70
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 07:21:58 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1320938513!1054121!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1806 invoked from network); 10 Nov 2011 15:21:54 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 15:21:54 -0000
X-IronPort-AV: E=Sophos;i="4.69,489,1315180800"; 
   d="scan'208";a="8867063"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 15:21:53 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 15:21:54 +0000
Date: Thu, 10 Nov 2011 15:22:27 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Jan Beulich <JBeulich@suse.com>
In-Reply-To: <4EBBF96102000078000603B6@nat28.tlf.novell.com>
Message-ID: <alpine.DEB.2.00.1111101521120.3519@kaball-desktop>
References: <4EBBC25B02000078000601F1@nat28.tlf.novell.com>
	<CAKpvNa3DmeQyXBb7obc_PbsNaEUBLjTFc_eLkTKH8RwYs4WQYw@mail.gmail.com>
	<4EBBF36A0200007800060375@nat28.tlf.novell.com>
	<alpine.DEB.2.00.1111101457380.3519@kaball-desktop>
	<4EBBF7A9020000780006039E@nat28.tlf.novell.com>
	<alpine.DEB.2.00.1111101516060.3519@kaball-desktop>
	<4EBBF96102000078000603B6@nat28.tlf.novell.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: Gianluca Guida <glguida@gmail.com>,
	Gianluca Guida <gianluca.guida@citrix.com>, "Tim
	\(Xen.org\)" <tim@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: performance regression from c/s 21647:cfba1560054a
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 10 Nov 2011, Jan Beulich wrote:
> >>> On 10.11.11 at 16:16, Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> wrote:
> > On Thu, 10 Nov 2011, Jan Beulich wrote:
> >> >>> On 10.11.11 at 15:59, Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> >> wrote:
> >> > On Thu, 10 Nov 2011, Jan Beulich wrote:
> >> >> It's SLE11 SP1 guests that suffered a regression after a maintenance
> >> >> update (originally shipped with 4.0.0, while that patch got backported
> >> >> later into 4.0.x).
> >> > 
> >> > Is SLES11 SP1 using HVMOP_pagetable_dying (see
> >> > arch/x86/xen/mmu.c:xen_hvm_init_mmu_ops)?
> >> 
> >> No, it's not.
> >  
> > well, it should, not to fix this problem but because it is a significant
> > performance improvement when running on shadow
> 
> Well - if you have suggestions on how to do this (a) in 2.6.32.x, (b)
> without turning on CONFIG_XEN, and (c) without massive patching,
> them I'm all for it.

Can you issue hypercalls?
If so, it is just a matter of backporting:

commit 5915100106b8f14a38053ad6c03a664d208aeaa2
Author: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date:   Thu Jun 17 14:22:52 2010 +0100

    x86: Call HVMOP_pagetable_dying on exit_mmap.
    
    When a pagetable is about to be destroyed, we notify Xen so that the
    hypervisor can clear the related shadow pagetable.
    
    Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
    Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 07:44:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 07:44:52 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROWo7-0002pS-Ml; Thu, 10 Nov 2011 07:44:51 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROWXH-0005id-VD
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 07:27:28 -0800
X-Env-Sender: glguida@gmail.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1320938843!3679106!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28086 invoked from network); 10 Nov 2011 15:27:25 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-16.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 15:27:25 -0000
Received: by ggnr5 with SMTP id r5so4276946ggn.30
	for <xen-devel@lists.xensource.com>;
	Thu, 10 Nov 2011 07:27:23 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type:content-transfer-encoding;
	bh=pMH3HX3RPHZ6kVOxibRMMfv1YEcx7blHntq5Zq5semw=;
	b=npHv7VXMFUOMQFSyKibHWzLfYlExP8LtlhtO5BZaVwEmn1tCcTlpg5xqRnWOrqdiuB
	FobwaN8Ayy8ZRTIv+lo5sNjakQ6o2e8c+rQpS2FZZP2kDtIsoE3ztfkgum66aagrexRK
	4/qRu0lIoqE6ZDU0wV4cH40ynhqxBH0mCO/WY=
MIME-Version: 1.0
Received: by 10.50.169.33 with SMTP id ab1mr8626479igc.0.1320938843251; Thu,
	10 Nov 2011 07:27:23 -0800 (PST)
Received: by 10.50.189.234 with HTTP; Thu, 10 Nov 2011 07:27:22 -0800 (PST)
In-Reply-To: <4EBBF87102000078000603A1@nat28.tlf.novell.com>
References: <4EBBC25B02000078000601F1@nat28.tlf.novell.com>
	<CAKpvNa3DmeQyXBb7obc_PbsNaEUBLjTFc_eLkTKH8RwYs4WQYw@mail.gmail.com>
	<4EBBF36A0200007800060375@nat28.tlf.novell.com>
	<alpine.DEB.2.00.1111101457380.3519@kaball-desktop>
	<CAKpvNa1sPPjVyzPWbrdBhEe5i1ji6fwg6CDSx-QPyz5LjywpnQ@mail.gmail.com>
	<4EBBF87102000078000603A1@nat28.tlf.novell.com>
Date: Thu, 10 Nov 2011 07:27:22 -0800
Message-ID: <CAKpvNa0caFq8kPe+BgHYZf1-YEedBw-Pt4r00RWU48BGHuzetQ@mail.gmail.com>
From: Gianluca Guida <glguida@gmail.com>
To: Jan Beulich <JBeulich@suse.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: Gianluca Guida <gianluca.guida@citrix.com>, "Tim \(Xen.org\)" <tim@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: performance regression from c/s 21647:cfba1560054a
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Nov 10, 2011 at 7:14 AM, Jan Beulich <JBeulich@suse.com> wrote:
>>>> On 10.11.11 at 16:00, Gianluca Guida <glguida@gmail.com> wrote:
>> On Thu, Nov 10, 2011 at 6:59 AM, Stefano Stabellini
>> <stefano.stabellini@eu.citrix.com> wrote:
>>> On Thu, 10 Nov 2011, Jan Beulich wrote:
>>>> It's SLE11 SP1 guests that suffered a regression after a maintenance
>>>> update (originally shipped with 4.0.0, while that patch got backported
>>>> later into 4.0.x).
>>>
>>> Is SLES11 SP1 using HVMOP_pagetable_dying (see
>>> arch/x86/xen/mmu.c:xen_hvm_init_mmu_ops)?
>>
>> Good question. In case it does not, just changing the ">l1" check to
>> work only in case we used the hypercall might do the trick.
>
> Possibly, though I would argue that the difference between Linuxes
> shouldn't be that big (i.e. I would rather expect that pv-on-hvm
> guests also see a performance penalty here).

No, because what the patch does is to unshadow the user pagetables
(all levels) as soon as the hypercall is made (when the kernel is
destroying the process). check_for_early_unshadow(), when the
hypercall is used, is for removing the pagetables that maps some
process-specific non-user mappings.

Importing the hypercall is a good idea, but fixing the logic would
help linux guests not using the hypercall.

Gianluca

--=20
It was a type of people I did not know, I found them very strange and
they did not inspire confidence at all. Later I learned that I had been
introduced to electronic engineers.
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 =A0 =A0 =A0 =A0 E. W. Dijkstra

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 07:45:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 07:45:45 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROWoz-0003Ef-OK; Thu, 10 Nov 2011 07:45:45 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROWck-00070G-3L
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 07:33:06 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320939155!52244354!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15059 invoked from network); 10 Nov 2011 15:32:37 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-9.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 15:32:37 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAAFWvvH019994
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 10 Nov 2011 15:32:57 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAAFWtHD029132
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 10 Nov 2011 15:32:56 GMT
Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAAFWoFm006116; Thu, 10 Nov 2011 09:32:50 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 10 Nov 2011 07:32:50 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 60D58819F2; Thu, 10 Nov 2011 10:32:49 -0500 (EST)
Date: Thu, 10 Nov 2011 10:32:49 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Subject: Re: [Xen-devel] Re: Need help with fixing the Xen waitqueue feature
Message-ID: <20111110153249.GF7540@phenom.dumpdata.com>
References: <20111108224414.83985CF73A@homiemail-mx7.g.dreamhost.com>
	<3c097da8e49a42af1210e4ffcd39fd48.squirrel@webmail.lagarcavilla.org>
	<20111109070927.GB26154@aepfle.de>
	<0bb01a4d216a68c4ae8441b037927f61.squirrel@webmail.lagarcavilla.org>
	<20111109221148.GA17166@aepfle.de>
	<5d7d38b18271fcc7aa750604eeb52bbd.squirrel@webmail.lagarcavilla.org>
	<4EBBA5730200007800060139@nat28.tlf.novell.com>
	<616d337af40641509cf694a13c681d01.squirrel@webmail.lagarcavilla.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <616d337af40641509cf694a13c681d01.squirrel@webmail.lagarcavilla.org>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090209.4EBBEEAA.0044,ss=1,re=0.000,fgs=0
Cc: Olaf Hering <olaf@aepfle.de>, keir.xen@gmail.com,
	xen-devel@lists.xensource.com, Jan Beulich <JBeulich@suse.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Nov 10, 2011 at 05:57:18AM -0800, Andres Lagar-Cavilla wrote:
> Thanks Jan, and thanks Olaf for the pointers to specific patches. I'll try
> to cherry pick those into my dom0 (debian mainline 3.0). Somebody else
> should get those in mainline though. Soonish :)

Well, could you post them once you have cherry-picked them?

Thanks.
> 
> Andres
> >>>> On 10.11.11 at 05:29, "Andres Lagar-Cavilla" <andres@lagarcavilla.org>
> >>>> wrote:
> >> The tools retry as long as IOCTL_PRIVCMD_MMAPBATCH_V2 is supported.
> >> Which
> >> it isn't on mainline linux 3.0, 3.1, etc.
> >
> > Seems like nobody cared to port over the code from the old 2.6.18 tree
> > (or the forward ports thereof).
> >
> >> Which dom0 kernel are you using?
> >
> > Certainly one of our forward port kernels.
> >
> >> And for backend drivers implemented in the kernel (netback, etc), there
> >> is
> >> no retrying.
> >
> > As above, seems like nobody cared to forward port those bits either.
> >
> > Jan
> >
> >
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 07:46:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 07:46:35 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROWpn-0003dm-1J; Thu, 10 Nov 2011 07:46:35 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1ROWey-00081E-AO
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 07:35:24 -0800
X-Env-Sender: stefan.bader@canonical.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1320939319!2089910!1
X-Originating-IP: [91.189.89.112]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20086 invoked from network); 10 Nov 2011 15:35:20 -0000
Received: from youngberry.canonical.com (HELO youngberry.canonical.com)
	(91.189.89.112) by server-13.tower-182.messagelabs.com with SMTP;
	10 Nov 2011 15:35:20 -0000
Received: from p5b2e4849.dip.t-dialin.net ([91.46.72.73] helo=[192.168.2.5])
	by youngberry.canonical.com with esmtpsa
	(TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71)
	(envelope-from <stefan.bader@canonical.com>)
	id 1ROWer-0007xH-Ir; Thu, 10 Nov 2011 15:35:17 +0000
Message-ID: <4EBBEF33.5060608@canonical.com>
Date: Thu, 10 Nov 2011 16:35:15 +0100
From: Stefan Bader <stefan.bader@canonical.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20111031 Thunderbird/7.0.1
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Re: Regression in 3.1 causes Xen to use wrong idle
	routine
References: <4EA7DFD1.9060608@canonical.com>
	<20111026133003.GA6654@phenom.dumpdata.com>
	<4EA80CF2.5040309@canonical.com>
	<20111026134843.GA31609@phenom.dumpdata.com>
	<4EA811BB.6010005@canonical.com>
	<20111109175853.GA16318@phenom.dumpdata.com>
	<4EBB8C42.8080604@canonical.com>
	<20111110145558.GB7540@phenom.dumpdata.com>
In-Reply-To: <20111110145558.GB7540@phenom.dumpdata.com>
X-Enigmail-Version: 1.4a1pre
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: len.brown@intel.com,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 10.11.2011 15:55, Konrad Rzeszutek Wilk wrote:
> On Thu, Nov 10, 2011 at 09:33:06AM +0100, Stefan Bader wrote:
>> On 09.11.2011 18:58, Konrad Rzeszutek Wilk wrote:
>>> On Wed, Oct 26, 2011 at 03:57:15PM +0200, Stefan Bader wrote:
>>>> On 26.10.2011 15:48, Konrad Rzeszutek Wilk wrote:
>>>>>>> What about using the cpuidle_disabled() functionality and adhere to that?
>>>>>>> As so:
>>>>>>>
>>>>> .. snip..
>>>>>>
>>>>>> >From reading over it, this should work. Though I would be interested to hear
>>>>>> from the linux-acpi folks. Also to double check that calling pm_idle when
>>>>>> cpuidle.off was specified really is what is intended.
>>>>>
>>>>> Oh yeah, definitly need the input from linux-acpi folks. And also to be actually
>>>>> tested :-)
>>>>
>>>> I can volunteer to do the testing. But I am lazy enough to hold back a bit as
>>>> someone may tell us this is completely the wrong way to fix it. :)
>>>
>>> So the other option is to use 'idle=halt' on the Linux command line. That should
>>> provide the workaround for the folks reporting this (is there a BZ for it?).
>>>
>> Believe upstream bz is still down. Got the issue reported here, though:
>>
>> http://bugs.launchpad.net/bugs/881076
> 
> Ok, added that to the patch description.
>>
>> Hm, as a workaround probably. I guess it could be added when the test images are
>> done. Unfortunately, when running your image in the cloud it is kind of hard to
>> recover. Even more as you could have tested on an AMD based host.
> 

> Sadly my AMD boxes did not explode when I tested Len's patches :-(.

No, to my knowledge AMD CPUs do not have mwait. So the only alternate idle to
happen would be the e400 aware one (which is basically default_idle with
conditionally programming a broadcast timer interrupt to get out of c1e). I saw
this happen on my box, too. And there was no visible badness caused by it.

>>
>> Wonder whether it would be an option to automatically mask the mwait capability
>> off when running in paravirt mode...
> 

> We could, but why not strive to do it correctly first.

Just seemed (from looking at those replies about wanting mwait idle even when
cpuidle is disabled) that there is a slight controversy about what correctly is.
I personally would also think that a state of cpuidle disabled means no special
idle function. But that does not have to be the correct interpretation.

So I was reasoning that if the mwait function gets selected because the caps say
its available, but it does not work in paravirt, then maybe claiming its
availability is wrong as well.

Of course there is also the initial question about calling a generic function
and if that fails call the idle function hook directly. Which, because having
cpuidle disabled is returned as an error, ended up calling the hook directly
again. I really have trouble understanding the reasoning there...

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 07:52:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 07:52:24 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROWvP-0005w6-Vv; Thu, 10 Nov 2011 07:52:24 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROWnh-0002f2-8U
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 07:44:25 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1320939860!1047963!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8115 invoked from network); 10 Nov 2011 15:44:21 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 15:44:21 -0000
X-IronPort-AV: E=Sophos;i="4.69,489,1315180800"; 
   d="scan'208";a="8868365"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 15:44:20 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 15:44:20 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROWnb-0001tV-UA;
	Thu, 10 Nov 2011 15:44:19 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROWnS-0007dy-OR;
	Thu, 10 Nov 2011 15:44:10 +0000
Date: Thu, 10 Nov 2011 15:44:10 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <20111110154410.GN22224@spongy.cam.xci-test.com>
References: <4EBBD5F602000078000602EE@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="raC6veAxrt5nqIoY"
Content-Disposition: inline
In-Reply-To: <4EBBD5F602000078000602EE@nat28.tlf.novell.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Keir \(Xen.org\)" <keir@xen.org>,
	George Dunlap <George.Dunlap@eu.citrix.com>, "Tim
	\(Xen.org\)" <tim@xen.org>,
	"allen.m.kay@intel.com" <allen.m.kay@intel.com>,
	Jean Guyader <Jean.Guyader@citrix.com>
Subject: [Xen-devel] Re: [PATCH 5/7] mm: New XENMEM space,
	XENMAPSPACE_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--raC6veAxrt5nqIoY
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline

On 10/11 12:47, Jan Beulich wrote:
> >>> On 10.11.11 at 12:35, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> >@@ -4716,6 +4748,17 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
> >         }
> > 
> >         rc = xenmem_add_to_physmap(d, &xatp);
> >+        if ( rc == -EAGAIN )
> 
>         if ( rc )
> 
> >+        {
> >+            if ( copy_to_guest(arg, &xatp, 1) )
> >+            {
> >+                rcu_unlock_domain(d);
> >+                return -EFAULT;
> >+            }
> 
>         }
>         if ( rc == -EAGAIN )
> 
> (with some room for further simplification). Without that (or the minimal
> alternative of copying back just .size or yet some other mechanism), as
> pointed out before, the caller won't have a way to know how far into
> the batch things succeeded.
> 
> >+
> >+            rc = hypercall_create_continuation(
> >+                    __HYPERVISOR_memory_op, "ih", op, arg);
> >+        }
> > 
> >         rcu_unlock_domain(d);
> 
> Also, the whole block above can be move past this rcu_unlock_domain(),
> eliminating the need to do it separately in the above error path(s).
> 
> > 
> >--- a/xen/arch/x86/x86_64/compat/mm.c
> >+++ b/xen/arch/x86/x86_64/compat/mm.c
> >@@ -63,6 +63,18 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
> > 
> >         XLAT_add_to_physmap(nat, &cmp);
> >         rc = arch_memory_op(op, guest_handle_from_ptr(nat, void));
> >+        if ( rc < 0 )
> >+            break;
> >+
> 
> With the way the code below is currently this is superfluous. But just
> as above you will need to provide some indication to the caller
> *where* the failure occurred.
> 
> >+        if ( rc == __HYPERVISOR_memory_op )
> >+        {
> >+            hypercall_xlat_continuation(NULL, 0x2, nat, arg);
> >+
> >+            XLAT_add_to_physmap(&cmp, nat);
> >+
> >+            if ( copy_to_guest(arg, &cmp, 1) )
> >+                return -EFAULT;
> 
> I realize that this is the same way in the code handling
> XENMEM_[gs]et_pod_target, but unfortunately that's wrong (that's
> why I'm copying you, George): Once a continuation was set up, you
> mustn't change the return value anymore, since the continuation was
> established by adjusting the guest's rIP.
> 
> As for other memory ops, the continuation can be encoded in "op" (see
> xen/common/memory.c and xen/common/compat/memory.c). However,
> while suitable here I don't think that's usable for the PoD variant. The
> alternative is to cancel the continuation (would require quite a bit of
> new code I think) or to adjust the low level hypercall handler code (at
> least the compat mode one) to special case rAX values in the negative
> errno range, leaving rAX unchanged instead of returning -ENOSYS.
> Keir?
> 

Jan, did you have something like the attached patch in mind?

We will return EFAULT to the hypercall without touching the guest memory
because the copy_to_guest failed.

For the example I ignored the multicalls.

Jean

--raC6veAxrt5nqIoY
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: attachment; filename="hypercall-cancel-continuation.patch"

diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index 52c7f37..6b3620b 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -1723,6 +1723,16 @@ void sync_vcpu_execstate(struct vcpu *v)
     __arg;                                                                  \
 })
 
+void hypercall_cancel_continuation(void)
+{
+    struct cpu_user_regs *regs = guest_cpu_user_regs();
+
+    if ( !is_hvm_vcpu(current) )
+        regs->eip += 2; /* skip re-execute 'syscall' / 'int $xx' */
+    else
+        current->arch.hvm_vcpu.hcall_preempted = 0;
+}
+
 unsigned long hypercall_create_continuation(
     unsigned int op, const char *format, ...)
 {
diff --git a/xen/arch/x86/x86_64/compat/mm.c b/xen/arch/x86/x86_64/compat/mm.c
index 2c05099..577da6a 100644
--- a/xen/arch/x86/x86_64/compat/mm.c
+++ b/xen/arch/x86/x86_64/compat/mm.c
@@ -133,7 +133,10 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
         XLAT_pod_target(&cmp, nat);
 
         if ( copy_to_guest(arg, &cmp, 1) )
+        {
+            hypercall_cancel_continuation();
             rc = -EFAULT;
+        }
 
         break;
     }
diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
index 3ba5495..80d5c4b 100644
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -554,6 +554,7 @@ extern void (*dead_idle) (void);
  */
 unsigned long hypercall_create_continuation(
     unsigned int op, const char *format, ...);
+void hypercall_cancel_continuation(void);
 
 #define hypercall_preempt_check() (unlikely(    \
         softirq_pending(smp_processor_id()) |   \

--raC6veAxrt5nqIoY
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--raC6veAxrt5nqIoY--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 07:55:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 07:55:04 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROWy0-0006N3-Iu; Thu, 10 Nov 2011 07:55:04 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROWxR-0006Ab-To
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 07:54:30 -0800
X-Env-Sender: jxinpku@gmail.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1320940463!3032560!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17575 invoked from network); 10 Nov 2011 15:54:25 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-15.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 15:54:25 -0000
Received: by pzk5 with SMTP id 5so2742364pzk.8
	for <xen-devel@lists.xensource.com>;
	Thu, 10 Nov 2011 07:54:23 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type;
	bh=+2w3SC2QLiEwGbSLoIwt+ATI7iuHg16EHmijwiACoTU=;
	b=ep9+7uugnWBOP3Tq9vgJXKNoNJqWvnyWCWmmGmpQsmuHLZrWQHoVshDkCOoiQwok6m
	UkTXjRHECiH6mRHLs/eHSMOmX9xwuYGIW5n2Xt9pWiVfef0a4tddFYye7+u4Mxhshjoc
	ga77rCM4+rUXLKGstUjz0ALalaEOszFaeLQAo=
MIME-Version: 1.0
Received: by 10.68.25.170 with SMTP id d10mr15727749pbg.7.1320940463174; Thu,
	10 Nov 2011 07:54:23 -0800 (PST)
Received: by 10.143.39.7 with HTTP; Thu, 10 Nov 2011 07:54:23 -0800 (PST)
In-Reply-To: <CAP2B858Uiic4+ZOKBcTNChf+Nt++G4pwktyrE=U+CLn2sCdwjg@mail.gmail.com>
References: <CAKpDeakqB2eRMbGLZwuY9Dyka+BFJSwNO+1g=9WmyJ6uF+b61A@mail.gmail.com>
	<CAP2B858Uiic4+ZOKBcTNChf+Nt++G4pwktyrE=U+CLn2sCdwjg@mail.gmail.com>
Date: Thu, 10 Nov 2011 10:54:23 -0500
Message-ID: <CAKpDeamBEHAnpUo5mqLZrAa3=DwLsAdSgzbj9YEfS8o6JK9gKQ@mail.gmail.com>
Subject: Re: [Xen-devel] Cannot get shared page in domU
From: Xin Jin <jxinpku@gmail.com>
To: Daniel Castro <evil.dani@gmail.com>
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0398774530=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0398774530==
Content-Type: multipart/alternative; boundary=bcaec520e87513b41904b1636bb3

--bcaec520e87513b41904b1636bb3
Content-Type: text/plain; charset=ISO-8859-1

In

share_mem->gref =
gnttab_grant_foreign_access(domid_remote, virt_to_mfn(share_mem), 0);

I have explicitly specified the domid that can use the gref as
"domid_remote".

What else can be wrong?

On Thu, Nov 10, 2011 at 12:09 AM, Daniel Castro <evil.dani@gmail.com> wrote:

> On Thu, Nov 10, 2011 at 1:15 PM, Xin Jin <jxinpku@gmail.com> wrote:
> > Hi, I cannot get a shared page in domU.
> > In a domU, I used the folloing code to grant a page to another domU.
> > share_mem = (share_mem_desp *) __get_free_page(GFP_KERNEL);
> > share_mem->gref = gnttab_grant_foreign_access(domid_remote,
> > virt_to_mfn(share_mem), 0);
> > In another domU, I used the folloing code to get the shared page.
> > share_vmarea = alloc_vm_area(PAGE_SIZE);
> > gnttab_set_map_op( &map_op, (unsigned long)share_vmarea->addr,
> > GNTMAP_host_map, gref, domid_remote );
> > HYPERVISOR_grant_table_op( GNTTABOP_map_grant_ref, &map_op, 1 );
> > While using the exactly same code to get the shared page in dom0, it woks
> > all well. But it cannot work in domU.
> > I use Xen 4.1.1 and fedora 14 ( linux 3.1.0 both for dom0 and domU ).
> > Can anyone help me?
> On the interface struct when you issue the hypercall you need to
> specify the domid that can use the gref. Maybe the default is domid 0.
> The struct grant_entry_v1 has member domid for the foreign guest,
> check that value.
>
> > Thanks!
> > -- Xin
> >
> >
> > _______________________________________________
> > Xen-devel mailing list
> > Xen-devel@lists.xensource.com
> > http://lists.xensource.com/xen-devel
> >
> >
>
>
>
> --
> +-=====---------------------------+
> | +---------------------------------+ | This space intentionally blank
> for notetaking.
> | |   | Daniel Castro,                |
> | |   | Consultant/Programmer.|
> | |   | U Andes                         |
> +-------------------------------------+
>



-- 
Xin JIN
PhD student
Department of Computer Science
Princeton University

--bcaec520e87513b41904b1636bb3
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

In<div><br></div><div>share_mem-&gt;gref =3D gnttab_grant_foreign_access(do=
mid_remote,=A0virt_to_mfn(share_mem), 0);</div><div><br></div><div>I have=
=A0explicitly specified the domid that can use the gref as &quot;domid_remo=
te&quot;.</div>
<div><br></div><div>What else can be wrong?</div><div><br><div class=3D"gma=
il_quote">On Thu, Nov 10, 2011 at 12:09 AM, Daniel Castro <span dir=3D"ltr"=
>&lt;<a href=3D"mailto:evil.dani@gmail.com">evil.dani@gmail.com</a>&gt;</sp=
an> wrote:<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex;"><div class=3D"HOEnZb"><div class=3D"h5">On =
Thu, Nov 10, 2011 at 1:15 PM, Xin Jin &lt;<a href=3D"mailto:jxinpku@gmail.c=
om">jxinpku@gmail.com</a>&gt; wrote:<br>

&gt; Hi, I cannot get a shared page in domU.<br>
&gt; In a domU, I used the folloing code to grant a page to another domU.<b=
r>
&gt; share_mem =3D (share_mem_desp *) __get_free_page(GFP_KERNEL);<br>
&gt; share_mem-&gt;gref =3D gnttab_grant_foreign_access(domid_remote,<br>
&gt; virt_to_mfn(share_mem), 0);<br>
&gt; In another domU, I used the folloing code to get the shared page.<br>
&gt; share_vmarea =3D alloc_vm_area(PAGE_SIZE);<br>
&gt; gnttab_set_map_op( &amp;map_op, (unsigned long)share_vmarea-&gt;addr,<=
br>
&gt; GNTMAP_host_map, gref, domid_remote );<br>
&gt; HYPERVISOR_grant_table_op( GNTTABOP_map_grant_ref, &amp;map_op, 1 );<b=
r>
&gt; While using the exactly same code to get the shared page in dom0, it w=
oks<br>
&gt; all well. But it cannot work in domU.<br>
&gt; I use Xen 4.1.1 and fedora 14 ( linux 3.1.0 both for dom0 and domU ).<=
br>
&gt; Can anyone help me?<br>
</div></div>On the interface struct when you issue the hypercall you need t=
o<br>
specify the domid that can use the gref. Maybe the default is domid 0.<br>
The struct grant_entry_v1 has member domid for the foreign guest,<br>
check that value.<br>
<br>
&gt; Thanks!<br>
&gt; -- Xin<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; Xen-devel mailing list<br>
&gt; <a href=3D"mailto:Xen-devel@lists.xensource.com">Xen-devel@lists.xenso=
urce.com</a><br>
&gt; <a href=3D"http://lists.xensource.com/xen-devel" target=3D"_blank">htt=
p://lists.xensource.com/xen-devel</a><br>
&gt;<br>
&gt;<br>
<span class=3D"HOEnZb"><font color=3D"#888888"><br>
<br>
<br>
--<br>
+-=3D=3D=3D=3D=3D---------------------------+<br>
| +---------------------------------+ | This space intentionally blank<br>
for notetaking.<br>
| |=A0=A0 | Daniel Castro,=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 |<br>
| |=A0=A0 | Consultant/Programmer.|<br>
| |=A0=A0 | U Andes=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=A0 |<br>
+-------------------------------------+<br>
</font></span></blockquote></div><br><br clear=3D"all"><div><br></div>-- <b=
r>Xin JIN<div>PhD student<br>Department of Computer Science<div>Princeton U=
niversity</div></div><br>
</div>

--bcaec520e87513b41904b1636bb3--


--===============0398774530==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0398774530==--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 07:55:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 07:55:59 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROWyt-0006jr-9q; Thu, 10 Nov 2011 07:55:59 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROWyH-0006T1-Py
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 07:55:22 -0800
X-Env-Sender: glguida@gmail.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1320940517!3046225!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3439 invoked from network); 10 Nov 2011 15:55:18 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-7.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 15:55:18 -0000
Received: by ggnr5 with SMTP id r5so4322061ggn.30
	for <xen-devel@lists.xensource.com>;
	Thu, 10 Nov 2011 07:55:16 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type:content-transfer-encoding;
	bh=y0rMxABjGg2lXYtCsPPc0X327hgCJvWJiIUXWQKGLyU=;
	b=qHn7z+M3lLD0ES64LQ1fPrPKsgqkAFT6tLP6AMqat30dCCz9S/CxUKFkZnjxlASAnV
	PkA5vmX/YzoEinkTfIZcLSWfzMS9xVs5Hqh8SIHUw9Rro6jxRKb7NAobPHtYs6suUDJk
	7DrZthkrSUjHsyObhgX8FayVrBbOoW+6sCC6U=
MIME-Version: 1.0
Received: by 10.50.169.33 with SMTP id ab1mr8795945igc.0.1320940516749; Thu,
	10 Nov 2011 07:55:16 -0800 (PST)
Received: by 10.50.189.234 with HTTP; Thu, 10 Nov 2011 07:55:16 -0800 (PST)
In-Reply-To: <4EBBF7A9020000780006039E@nat28.tlf.novell.com>
References: <4EBBC25B02000078000601F1@nat28.tlf.novell.com>
	<CAKpvNa3DmeQyXBb7obc_PbsNaEUBLjTFc_eLkTKH8RwYs4WQYw@mail.gmail.com>
	<4EBBF36A0200007800060375@nat28.tlf.novell.com>
	<alpine.DEB.2.00.1111101457380.3519@kaball-desktop>
	<4EBBF7A9020000780006039E@nat28.tlf.novell.com>
Date: Thu, 10 Nov 2011 07:55:16 -0800
Message-ID: <CAKpvNa14y7d3J3r_rXjQhV6hTzS6+2G5ZQgdwLpbsVSt1ptLKA@mail.gmail.com>
From: Gianluca Guida <glguida@gmail.com>
To: Jan Beulich <JBeulich@suse.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: Gianluca Guida <gianluca.guida@citrix.com>, "Tim \(Xen.org\)" <tim@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: performance regression from c/s 21647:cfba1560054a
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Jan,

On Thu, Nov 10, 2011 at 7:11 AM, Jan Beulich <JBeulich@suse.com> wrote:
>>>> On 10.11.11 at 15:59, Stefano Stabellini <stefano.stabellini@eu.citrix=
.com>
> wrote:
>> On Thu, 10 Nov 2011, Jan Beulich wrote:
>>> It's SLE11 SP1 guests that suffered a regression after a maintenance
>>> update (originally shipped with 4.0.0, while that patch got backported
>>> later into 4.0.x).
>>
>> Is SLES11 SP1 using HVMOP_pagetable_dying (see
>> arch/x86/xen/mmu.c:xen_hvm_init_mmu_ops)?
>
> No, it's not.

Can you please try the inline patch? Unfortunately I have no unstable
test machine or infrastructure at the moment, so I can;t really test
it.

I finally recalled a bit of details about this patch, so this check is
clearly a bug as-it-is: it was written with the assumption that all
the HVM guests would have been Windows guests with particular
PV-drivers, so I wasn't particularly nice with the checks.

Thank you,
Gianluca

diff -r 068d3d55ce6e xen/arch/x86/mm/shadow/multi.c
--- a/xen/arch/x86/mm/shadow/multi.c    Tue Nov 01 19:03:38 2011 +0000
+++ b/xen/arch/x86/mm/shadow/multi.c    Thu Nov 10 16:46:50 2011 -0800
@@ -2723,8 +2723,9 @@
            || ( !v->domain->arch.paging.shadow.pagetable_dying_op
                 &&
v->arch.paging.shadow.last_emulated_mfn_for_unshadow =3D=3D mfn_x(gmfn) )
)
          && sh_mfn_is_a_page_table(gmfn)
-         && !(mfn_to_page(gmfn)->shadow_flags
-              & (SHF_L2_32|SHF_L2_PAE|SHF_L2H_PAE|SHF_L4_64)) )
+         && (!v->domain->arch.paging.shadow.pagetable_dying_op ||
+             !(mfn_to_page(gmfn)->shadow_flags
+               & (SHF_L2_32|SHF_L2_PAE|SHF_L2H_PAE|SHF_L4_64))) )
     {
         perfc_incr(shadow_early_unshadow);
         sh_remove_shadows(v, gmfn, 1, 0 /* Fast, can fail to unshadow */ )=
;

--=20
It was a type of people I did not know, I found them very strange and
they did not inspire confidence at all. Later I learned that I had been
introduced to electronic engineers.
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 =A0 =A0 =A0 =A0 E. W. Dijkstra

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 08:14:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 08:14:20 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROXGd-0008Ba-IY; Thu, 10 Nov 2011 08:14:19 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROXDQ-0007m0-TT
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 08:11:03 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1320941457!2617124!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19352 invoked from network); 10 Nov 2011 16:10:57 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-14.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 16:10:57 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 10 Nov 2011 16:12:13 +0000
Message-Id: <4EBC059F0200007800060414@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 10 Nov 2011 16:10:55 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Stefano Stabellini" <stefano.stabellini@eu.citrix.com>
References: <4EBBC25B02000078000601F1@nat28.tlf.novell.com>
	<CAKpvNa3DmeQyXBb7obc_PbsNaEUBLjTFc_eLkTKH8RwYs4WQYw@mail.gmail.com>
	<4EBBF36A0200007800060375@nat28.tlf.novell.com>
	<alpine.DEB.2.00.1111101457380.3519@kaball-desktop>
	<4EBBF7A9020000780006039E@nat28.tlf.novell.com>
	<alpine.DEB.2.00.1111101516060.3519@kaball-desktop>
	<4EBBF96102000078000603B6@nat28.tlf.novell.com>
	<alpine.DEB.2.00.1111101521120.3519@kaball-desktop>
In-Reply-To: <alpine.DEB.2.00.1111101521120.3519@kaball-desktop>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Gianluca Guida <glguida@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Tim\(Xen.org\)" <tim@xen.org>, Gianluca Guida <gianluca.guida@citrix.com>
Subject: [Xen-devel] Re: performance regression from c/s 21647:cfba1560054a
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 16:22, Stefano Stabellini <stefano.stabellini@eu.citrix.=
com>
wrote:
> On Thu, 10 Nov 2011, Jan Beulich wrote:
>> >>> On 10.11.11 at 16:16, Stefano Stabellini <stefano.stabellini@eu.citr=
ix.com>
>> wrote:
>> > On Thu, 10 Nov 2011, Jan Beulich wrote:
>> >> >>> On 10.11.11 at 15:59, Stefano Stabellini <stefano.stabellini@eu.c=
itrix.com>
>> >> wrote:
>> >> > On Thu, 10 Nov 2011, Jan Beulich wrote:
>> >> >> It's SLE11 SP1 guests that suffered a regression after a =
maintenance
>> >> >> update (originally shipped with 4.0.0, while that patch got =
backported
>> >> >> later into 4.0.x).
>> >> >=20
>> >> > Is SLES11 SP1 using HVMOP_pagetable_dying (see
>> >> > arch/x86/xen/mmu.c:xen_hvm_init_mmu_ops)?
>> >>=20
>> >> No, it's not.
>> > =20
>> > well, it should, not to fix this problem but because it is a =
significant
>> > performance improvement when running on shadow
>>=20
>> Well - if you have suggestions on how to do this (a) in 2.6.32.x, (b)
>> without turning on CONFIG_XEN, and (c) without massive patching,
>> them I'm all for it.
>=20
> Can you issue hypercalls?

>From the pv drivers yes, from the rest of the kernel not easily. But
installing a hook from the pv drivers is pointless afaik, since the
paravirt patching would likely have eliminated the call site by that
time.

> If so, it is just a matter of backporting:
>=20
> commit 5915100106b8f14a38053ad6c03a664d208aeaa2
> Author: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> Date:   Thu Jun 17 14:22:52 2010 +0100
>=20
>     x86: Call HVMOP_pagetable_dying on exit_mmap.
>    =20
>     When a pagetable is about to be destroyed, we notify Xen so that the
>     hypervisor can clear the related shadow pagetable.
>    =20
>     Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
>     Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Hmm, I should have been saying CONFIG_PARAVIRT_MMU (we have
an extra patch that splits CONFIG_PARATVIRT into sub-pieces) rather
than CONFIG_XEN above - the patch relies on pv_mmu_ops, which our
SP1 non-Xen kernels don't have enabled (in SP2 we don't have the
splitting patch anymore, and we do have CONFIG_PARAVIRT, but as
per the above doing this when the pv drivers load is likely too late).

Which leaves utilizing mmu_notifier_release() as long as
CONFIG_MMU_NOTIFIER is enabled, which fortunately KVM
selects for us.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 08:27:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 08:27:35 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROXTT-0001g1-3M; Thu, 10 Nov 2011 08:27:35 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROXSf-0001TX-1Q
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 08:26:45 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1320942401!3051200!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12358 invoked from network); 10 Nov 2011 16:26:42 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-7.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 16:26:42 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 10 Nov 2011 16:27:57 +0000
Message-Id: <4EBC094F020000780006042E@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 10 Nov 2011 16:26:39 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: <Jean.Guyader@citrix.com>,
	 "Jean Guyader" <jean.guyader@eu.citrix.com>
References: <4EBBD5F602000078000602EE@nat28.tlf.novell.com>
	<20111110154410.GN22224@spongy.cam.xci-test.com>
In-Reply-To: <20111110154410.GN22224@spongy.cam.xci-test.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: George Dunlap <George.Dunlap@eu.citrix.com>,
	"Keir \(Xen.org\)" <keir@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"allen.m.kay@intel.com" <allen.m.kay@intel.com>,
	"Tim\(Xen.org\)" <tim@xen.org>
Subject: [Xen-devel] Re: [PATCH 5/7] mm: New XENMEM space,
	XENMAPSPACE_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 16:44, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> On 10/11 12:47, Jan Beulich wrote:
>> >>> On 10.11.11 at 12:35, Jean Guyader <jean.guyader@eu.citrix.com> =
wrote:
>> >@@ -4716,6 +4748,17 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(voi=
d)=20
> arg)
>> >         }
>> >=20
>> >         rc =3D xenmem_add_to_physmap(d, &xatp);
>> >+        if ( rc =3D=3D -EAGAIN )
>>=20
>>         if ( rc )
>>=20
>> >+        {
>> >+            if ( copy_to_guest(arg, &xatp, 1) )
>> >+            {
>> >+                rcu_unlock_domain(d);
>> >+                return -EFAULT;
>> >+            }
>>=20
>>         }
>>         if ( rc =3D=3D -EAGAIN )
>>=20
>> (with some room for further simplification). Without that (or the =
minimal
>> alternative of copying back just .size or yet some other mechanism), as
>> pointed out before, the caller won't have a way to know how far into
>> the batch things succeeded.
>>=20
>> >+
>> >+            rc =3D hypercall_create_continuation(
>> >+                    __HYPERVISOR_memory_op, "ih", op, arg);
>> >+        }
>> >=20
>> >         rcu_unlock_domain(d);
>>=20
>> Also, the whole block above can be move past this rcu_unlock_domain(),
>> eliminating the need to do it separately in the above error path(s).
>>=20
>> >=20
>> >--- a/xen/arch/x86/x86_64/compat/mm.c
>> >+++ b/xen/arch/x86/x86_64/compat/mm.c
>> >@@ -63,6 +63,18 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(v=
oid)=20
> arg)
>> >=20
>> >         XLAT_add_to_physmap(nat, &cmp);
>> >         rc =3D arch_memory_op(op, guest_handle_from_ptr(nat, void));
>> >+        if ( rc < 0 )
>> >+            break;
>> >+
>>=20
>> With the way the code below is currently this is superfluous. But just
>> as above you will need to provide some indication to the caller
>> *where* the failure occurred.
>>=20
>> >+        if ( rc =3D=3D __HYPERVISOR_memory_op )
>> >+        {
>> >+            hypercall_xlat_continuation(NULL, 0x2, nat, arg);
>> >+
>> >+            XLAT_add_to_physmap(&cmp, nat);
>> >+
>> >+            if ( copy_to_guest(arg, &cmp, 1) )
>> >+                return -EFAULT;
>>=20
>> I realize that this is the same way in the code handling
>> XENMEM_[gs]et_pod_target, but unfortunately that's wrong (that's
>> why I'm copying you, George): Once a continuation was set up, you
>> mustn't change the return value anymore, since the continuation was
>> established by adjusting the guest's rIP.
>>=20
>> As for other memory ops, the continuation can be encoded in "op" (see
>> xen/common/memory.c and xen/common/compat/memory.c). However,
>> while suitable here I don't think that's usable for the PoD variant. =
The
>> alternative is to cancel the continuation (would require quite a bit of
>> new code I think) or to adjust the low level hypercall handler code (at
>> least the compat mode one) to special case rAX values in the negative
>> errno range, leaving rAX unchanged instead of returning -ENOSYS.
>> Keir?
>>=20
>=20
> Jan, did you have something like the attached patch in mind?

Indeed, and it's fortunately much simpler than I would have thought.

> We will return EFAULT to the hypercall without touching the guest memory
> because the copy_to_guest failed.
>=20
> For the example I ignored the multicalls.

Adding the support for that would seem to be strait forward too.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 08:37:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 08:37:45 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROXdJ-0002KW-69; Thu, 10 Nov 2011 08:37:45 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROXcj-00028h-8z
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 08:37:09 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1320943024!3741592!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28217 invoked from network); 10 Nov 2011 16:37:05 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 16:37:05 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAAGb2DZ016570
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 10 Nov 2011 16:37:03 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAAGb1jG023646
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 10 Nov 2011 16:37:01 GMT
Received: from abhmt102.oracle.com (abhmt102.oracle.com [141.146.116.54])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAAGateo023762; Thu, 10 Nov 2011 10:36:55 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 10 Nov 2011 08:36:55 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id A995F819F1; Thu, 10 Nov 2011 11:36:54 -0500 (EST)
Date: Thu, 10 Nov 2011 11:36:54 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Tobias Heinlein <heinlein@okit.de>
Subject: Re: [Xen-devel] Re: Xen dom0 linux kernel 3.1 boot failure
	ptwr_emulate: could not get_page_from_l1e
Message-ID: <20111110163654.GA2811@phenom.dumpdata.com>
References: <05c3da5dc6158197e28d62e853ac2f04@tjhsst.edu>
	<loom.20111031T140651-901@post.gmane.org>
	<20111031140836.GA9245@phenom.dumpdata.com>
	<4EAFEA53.7070009@okit.de>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EAFEA53.7070009@okit.de>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090201.4EBBFDAF.016B,ss=1,re=0.000,fgs=0
Cc: 2013pfoley@tjhsst.edu, xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 01, 2011 at 01:47:15PM +0100, Tobias Heinlein wrote:
> I'm not sure if it was obvious, but yesterday I noticed that setting the
> "MPS table mode" to 'Disabled' actually made SMP stop working, i.e. the
> kernel only recognized a single CPU. This is of course not an option, so
> I enabled (set to 'Full Table APIC') the setting again and played around
> with my kernel config a bit. The kernel that crashed had
> CONFIG_X86_MPPARSE=y, and if I disable that, it boots fine (with SMP,
> and with the BIOS setting set to 'Full Table APIC').

Hm, that is good to know.
> 
> So, I for one am quite happy now as I finally found a working
> configuration. But I'd still like to know if this is a hardware-specific
> issue, and/or a bug in Xen.

Well,.. I think it just that we hadn't touched any machines that
have MP tables instead of ACPI. Or that have fully populated MP tables.
I presume that there are some ACPI tables, but perhaps not the _PRT ones
(which are the ones we need to parse the IRQ data).

But more importantly - how recent is this machine? 
> 
> Konrad Rzeszutek Wilk wrote, on 10/31/2011 03:08 PM:
> > Oh nice. What does you /proc/interrupts look like compared to
> > baremetal?
> 
> While I was performing all my kernel tests, I saved the outputs of
> `dmesg` and `cat /proc/interrupts`. Sorry for attaching a tarball, but
> I'd like to give you as much information as possible. You'll probably
> only need the latest tests (#5 to #7), but just in case, I also included
> the others.
> 
> Contents of the tarball:
> 
> Baremetal tests:
> xen-hp/1/: MPS mode 'Full Table APIC', CONFIG_X86_MPPARSE=y, SMP working
> xen-hp/2/: MPS mode 'Full Table APIC', CONFIG_X86_MPPARSE=n, SMP working
> xen-hp/3/: MPS mode 'Disabled', CONFIG_X86_MPPARSE=y, SMP not working
> xen-hp/4/: MPS mode 'Disabled', CONFIG_X86_MPPARSE=n, SMP not working
> 
> Xen tests:
> xen-hp/5/: MPS mode 'Disabled', CONFIG_X86_MPPARSE=n, SMP not working
> xen-hp/6/: MPS mode 'Full Table APIC', CONFIG_X86_MPPARSE=n, SMP working
> xen-hp/7/: MPS mode 'Full Table APIC', CONFIG_X86_MPPARSE=y, CRASHES
> 
> (Therefore, #6 is the best working solution; #7 is what originally
> triggered the crash.)
> 
> Thanks.
> 


> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 08:38:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 08:38:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROXeP-0002hh-RY; Thu, 10 Nov 2011 08:38:53 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROXcl-00028i-27
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 08:37:11 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1320943027!1055857!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4564 invoked from network); 10 Nov 2011 16:37:07 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-2.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 16:37:07 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 10 Nov 2011 16:38:21 +0000
Message-Id: <4EBC0BC00200007800060444@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 10 Nov 2011 16:37:04 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Gianluca Guida" <glguida@gmail.com>
References: <4EBBC25B02000078000601F1@nat28.tlf.novell.com>
	<CAKpvNa3DmeQyXBb7obc_PbsNaEUBLjTFc_eLkTKH8RwYs4WQYw@mail.gmail.com>
	<4EBBF36A0200007800060375@nat28.tlf.novell.com>
	<alpine.DEB.2.00.1111101457380.3519@kaball-desktop>
	<4EBBF7A9020000780006039E@nat28.tlf.novell.com>
	<CAKpvNa14y7d3J3r_rXjQhV6hTzS6+2G5ZQgdwLpbsVSt1ptLKA@mail.gmail.com>
In-Reply-To: <CAKpvNa14y7d3J3r_rXjQhV6hTzS6+2G5ZQgdwLpbsVSt1ptLKA@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	"Tim \(Xen.org\)" <tim@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Gianluca Guida <gianluca.guida@citrix.com>
Subject: [Xen-devel] Re: performance regression from c/s 21647:cfba1560054a
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 16:55, Gianluca Guida <glguida@gmail.com> wrote:
> Jan,
>=20
> On Thu, Nov 10, 2011 at 7:11 AM, Jan Beulich <JBeulich@suse.com> wrote:
>>>>> On 10.11.11 at 15:59, Stefano Stabellini <stefano.stabellini@eu.citri=
x.com>
>> wrote:
>>> On Thu, 10 Nov 2011, Jan Beulich wrote:
>>>> It's SLE11 SP1 guests that suffered a regression after a maintenance
>>>> update (originally shipped with 4.0.0, while that patch got backported=

>>>> later into 4.0.x).
>>>
>>> Is SLES11 SP1 using HVMOP_pagetable_dying (see
>>> arch/x86/xen/mmu.c:xen_hvm_init_mmu_ops)?
>>
>> No, it's not.
>=20
> Can you please try the inline patch? Unfortunately I have no unstable
> test machine or infrastructure at the moment, so I can;t really test
> it.

I'll have it tested, but on 4.0.x (where the problem was reported and
is reproducible by those who observed it). I'll let you know as soon as
I know the outcome, but from the debugging we did so far (which
narrowed it to this part of the condition) it is pretty clear that it is
going to do the trick.

Jan

> I finally recalled a bit of details about this patch, so this check is
> clearly a bug as-it-is: it was written with the assumption that all
> the HVM guests would have been Windows guests with particular
> PV-drivers, so I wasn't particularly nice with the checks.
>=20
> Thank you,
> Gianluca
>=20
> diff -r 068d3d55ce6e xen/arch/x86/mm/shadow/multi.c
> --- a/xen/arch/x86/mm/shadow/multi.c    Tue Nov 01 19:03:38 2011 +0000
> +++ b/xen/arch/x86/mm/shadow/multi.c    Thu Nov 10 16:46:50 2011 -0800
> @@ -2723,8 +2723,9 @@
>             || ( !v->domain->arch.paging.shadow.pagetable_dying_op
>                  &&
> v->arch.paging.shadow.last_emulated_mfn_for_unshadow =3D=3D mfn_x(gmfn) =
)
> )
>           && sh_mfn_is_a_page_table(gmfn)
> -         && !(mfn_to_page(gmfn)->shadow_flags
> -              & (SHF_L2_32|SHF_L2_PAE|SHF_L2H_PAE|SHF_L4_64)) )
> +         && (!v->domain->arch.paging.shadow.pagetable_dying_op ||
> +             !(mfn_to_page(gmfn)->shadow_flags
> +               & (SHF_L2_32|SHF_L2_PAE|SHF_L2H_PAE|SHF_L4_64))) )
>      {
>          perfc_incr(shadow_early_unshadow);
>          sh_remove_shadows(v, gmfn, 1, 0 /* Fast, can fail to unshadow =
*/ );





_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 08:43:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 08:43:19 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROXih-0003Ax-Hl; Thu, 10 Nov 2011 08:43:19 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROXi3-0002xa-F2
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 08:42:39 -0800
X-Env-Sender: rshriram@gmail.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1320943332!44101957!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17249 invoked from network); 10 Nov 2011 16:42:13 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 16:42:13 -0000
Received: by qadb12 with SMTP id b12so1018195qad.9
	for <xen-devel@lists.xensource.com>;
	Thu, 10 Nov 2011 08:42:35 -0800 (PST)
Received: by 10.224.199.134 with SMTP id es6mr6502524qab.2.1320942989018;
	Thu, 10 Nov 2011 08:36:29 -0800 (PST)
Received: from [25.68.85.63] ([74.198.150.191])
	by mx.google.com with ESMTPS id v6sm8546425qaz.7.2011.11.10.08.36.26
	(version=TLSv1/SSLv3 cipher=OTHER);
	Thu, 10 Nov 2011 08:36:27 -0800 (PST)
References: <patchbomb.1320791985@athos.nss.cs.ubc.ca>
	<58a24a7d4b8754069236.1320791986@athos.nss.cs.ubc.ca>
	<1320822437.16747.90.camel@dagon.hellion.org.uk>
In-Reply-To: <1320822437.16747.90.camel@dagon.hellion.org.uk>
Mime-Version: 1.0 (1.0)
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=us-ascii
Message-Id: <A294BBA9-1D90-48E2-B2D7-3AAE75A02531@cs.ubc.ca>
X-Mailer: iPhone Mail (9A334)
From: Shriram Rajagopalan <rshriram@cs.ubc.ca>
Date: Thu, 10 Nov 2011 08:36:13 -0800
To: Ian Campbell <Ian.Campbell@citrix.com>
Cc: "brendan@cs.ubc.ca" <brendan@cs.ubc.ca>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	IanJackson <Ian.Jackson@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH 1 of 3 V6] tools/libxc: introduce
	page_aligned_alloc in xc_{minios, linux, solaris, netbsd}.c
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 2011-11-08, at 11:07 PM, Ian Campbell <Ian.Campbell@citrix.com> wrote:

> On Tue, 2011-11-08 at 22:39 +0000, rshriram@cs.ubc.ca wrote:
>> diff -r 54a5e994a241 -r 58a24a7d4b87 tools/libxc/xc_linux_osdep.c
>> --- a/tools/libxc/xc_linux_osdep.c    Wed Nov 02 17:09:09 2011 +0000
>> +++ b/tools/libxc/xc_linux_osdep.c    Tue Nov 08 14:26:02 2011 -0800
>> @@ -36,9 +36,17 @@
>> #include <xen/sys/gntdev.h>
>> #include <xen/sys/gntalloc.h>
>>=20
>> +#include "xc_private.h"
>=20
> I'd like to avoid including xc_private from this file. Although it's in
> tree it is a plugin and avoiding internal APIs serves to help ensure
> that external plugins can actually be written using the public APIs.
>=20
> I think you can make this function public, as long as you name it
> xc_blah.
>=20
> Ian.
>=20

The reason I declared the function in xc_private.h was to maintain consisten=
cy, like discard_file_cache().
But I see your point.

Just to make sure I get it right this time.
Are you suggesting that I declare a=20
public function xc_page_aligned_alloc in a header like xenctrl.h and have re=
spective platform specific implementations in xc_{minios,linux,netbsd}.c ?=20=

That way I won't have to include xc_private.h in linux_osdep.c (it already i=
ncludes xenctrl.h).

And are you okay with other modifications in these files (like abstracting o=
ut memaligns from privcmd_hypercall_alloc() )..?

Shriram

>=20

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 08:45:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 08:45:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROXkm-0003aQ-5l; Thu, 10 Nov 2011 08:45:28 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROXjj-0003NE-9e
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 08:44:24 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1320943430!56737327!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5568 invoked from network); 10 Nov 2011 16:43:50 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 16:43:50 -0000
X-IronPort-AV: E=Sophos;i="4.69,489,1315180800"; 
   d="scan'208";a="8870299"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 16:44:19 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Thu, 10 Nov 2011 16:44:19 +0000
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Shriram Rajagopalan <rshriram@cs.ubc.ca>
Date: Thu, 10 Nov 2011 16:44:19 +0000
In-Reply-To: <A294BBA9-1D90-48E2-B2D7-3AAE75A02531@cs.ubc.ca>
References: <patchbomb.1320791985@athos.nss.cs.ubc.ca>
	<58a24a7d4b8754069236.1320791986@athos.nss.cs.ubc.ca>
	<1320822437.16747.90.camel@dagon.hellion.org.uk>
	<A294BBA9-1D90-48E2-B2D7-3AAE75A02531@cs.ubc.ca>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320943459.955.230.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "brendan@cs.ubc.ca" <brendan@cs.ubc.ca>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, Ian
	Jackson <Ian.Jackson@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH 1 of 3 V6] tools/libxc: introduce
 page_aligned_alloc in xc_{minios, linux, solaris, netbsd}.c
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-11-10 at 16:36 +0000, Shriram Rajagopalan wrote:
> On 2011-11-08, at 11:07 PM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> 
> > On Tue, 2011-11-08 at 22:39 +0000, rshriram@cs.ubc.ca wrote:
> >> diff -r 54a5e994a241 -r 58a24a7d4b87 tools/libxc/xc_linux_osdep.c
> >> --- a/tools/libxc/xc_linux_osdep.c    Wed Nov 02 17:09:09 2011 +0000
> >> +++ b/tools/libxc/xc_linux_osdep.c    Tue Nov 08 14:26:02 2011 -0800
> >> @@ -36,9 +36,17 @@
> >> #include <xen/sys/gntdev.h>
> >> #include <xen/sys/gntalloc.h>
> >> 
> >> +#include "xc_private.h"
> > 
> > I'd like to avoid including xc_private from this file. Although it's in
> > tree it is a plugin and avoiding internal APIs serves to help ensure
> > that external plugins can actually be written using the public APIs.
> > 
> > I think you can make this function public, as long as you name it
> > xc_blah.
> > 
> > Ian.
> > 
> 
> The reason I declared the function in xc_private.h was to maintain consistency, like discard_file_cache().
> But I see your point.
> 
> Just to make sure I get it right this time.
> Are you suggesting that I declare a 
> public function xc_page_aligned_alloc in a header like xenctrl.h and have respective platform specific implementations in xc_{minios,linux,netbsd}.c ? 
> That way I won't have to include xc_private.h in linux_osdep.c (it already includes xenctrl.h).

That sounds about right. You could just export a xc_memalign rather than
xc_page_aligned_alloc, your name is a bit of a mouthful and xc_memalign
is a bit more general I guess?

I'd expect a function called xc_page_aligned_alloc to take a number of
pages rather than bytes. Either way is fine though.

> And are you okay with other modifications in these files (like abstracting out memaligns from privcmd_hypercall_alloc() )..?

Looks fine.

Ian.

> 
> Shriram
> 
> > 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 08:48:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 08:48:53 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROXo5-00045Y-ME; Thu, 10 Nov 2011 08:48:53 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1ROXnE-0003qG-81
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 08:48:00 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-9.tower-182.messagelabs.com!1320943676!2639862!1
X-Originating-IP: [208.97.132.74]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14756 invoked from network); 10 Nov 2011 16:47:57 -0000
Received: from caiajhbdcahe.dreamhost.com (HELO homiemail-a21.g.dreamhost.com)
	(208.97.132.74) by server-9.tower-182.messagelabs.com with SMTP;
	10 Nov 2011 16:47:57 -0000
Received: from homiemail-a21.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a21.g.dreamhost.com (Postfix) with ESMTP id E2A39300064;
	Thu, 10 Nov 2011 08:47:55 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:reply-to
	:mime-version:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.org; b=n/oG/poSK38NUNVaCPAKvwxRCJUrKI5Aj5OyMsxTSDCc
	30sTiOnKrjWoeR+Bl/73zf58JLZFD9IEsL9CxekytF7hklaGOCEzL+kZdeKOfEBn
	Ozow5/JZwvAkH9qQTbkksOWfnSmoD79/heRhJbawAJh/i+G0FT4G8lFTrQaMu+g=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:reply-to:mime-version:content-type:content-transfer-encoding;
	s=lagarcavilla.org; bh=0433hQS9AiG2kkpx8AIgjbxb4YA=; b=R4Mi25sP
	4tvJoXTVPG7AQOa0jkruMoFXcXYeo6MFLRGi4pK2PQ4VmHK7K0lHJcRYPG2Fib4b
	AzNIc74+JnLKVaz3q2elIhXGV2vcWi5wIS8P7E8+gaJhXFjMvvoAEpvXYcV52l3w
	lq7/u2fTVidoWSulFOoVGvHYB4Ve+ak221U=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a21.g.dreamhost.com (Postfix) with ESMTPA id 4653E300061; 
	Thu, 10 Nov 2011 08:47:55 -0800 (PST)
Received: from 206.223.182.18 (proxying for 206.223.182.18)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP;
	Thu, 10 Nov 2011 08:47:55 -0800
Message-ID: <ffe766c114162579f662285cee437ddb.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <20111110122634.GD62117@ocelot.phlegethon.org>
References: <patchbomb.1320722908@xdev.gridcentric.ca>
	<e9fd07479f684f558a92.1320722913@xdev.gridcentric.ca>
	<20111110122634.GD62117@ocelot.phlegethon.org>
Date: Thu, 10 Nov 2011 08:47:55 -0800
Subject: Re: [Xen-devel] [PATCH 5 of 5] Modify naming of queries into the p2m
From: "Andres Lagar-Cavilla" <andres@lagarcavilla.org>
To: "Tim Deegan" <tim@xen.org>
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, george.dunlap@eu.citrix.com,
	andres@gridcentric.ca, keir.xen@gmail.com,
	Andres Lagar-Cavilla <andres@lagarcavilla.org>, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: andres@lagarcavilla.org
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Tim, see below re nested-SVM code:
> Hi,
>
> This mostly looks good; I have a few comments on the detail below.
> If those are addressed I hope I can apply the next version.
>
> Any other maintainers want to object to this renaming?
>
> At 22:28 -0500 on 07 Nov (1320704913), Andres Lagar-Cavilla wrote:
>> @@ -1182,6 +1195,7 @@ int hvm_hap_nested_page_fault(unsigned l
>>      mfn_t mfn;
>>      struct vcpu *v =3D current;
>>      struct p2m_domain *p2m;
>> +    int rc;
>>
>>      /* On Nested Virtualization, walk the guest page table.
>>       * If this succeeds, all is fine.
>> @@ -1255,8 +1269,8 @@ int hvm_hap_nested_page_fault(unsigned l
>>          if ( violation )
>>          {
>>              p2m_mem_access_check(gpa, gla_valid, gla, access_r,
>> access_w, access_x);
>> -
>> -            return 1;
>> +            rc =3D 1;
>> +            goto out_put_gfn;
>
> Shouldn't this patch be changing the call to gfn_to_mfn_type_p2m() just
> above here to a get_gfn_*() call too?
>
>> -void hvm_unmap_guest_frame(void *p)
>> +void hvm_unmap_guest_frame(void *p, unsigned long addr, int is_va)
>>  {
>> +    /* We enter this function with a map obtained in
>> __hvm_map_guest_frame.
>> +     * This map performed a p2m query that locked the gfn entry and g=
ot
>> +     * a ref on the mfn. Must undo */
>>      if ( p )
>> +    {
>> +        unsigned long gfn =3D INVALID_GFN;
>> +
>> +        if ( is_va )
>> +        {
>> +            if ( addr )
>> +            {
>> +                uint32_t pfec =3D PFEC_page_present;
>> +                gfn =3D paging_gva_to_gfn(current, addr, &pfec);
>> +            } else {
>> +                gfn =3D INVALID_GFN;
>> +            }
>> +        } else {
>> +            gfn =3D addr;
>> +        }
>> +
>> +        if ( gfn !=3D INVALID_GFN )
>> +            put_gfn(current->domain, gfn);
>> +
>>          unmap_domain_page(p);
>> +    }
>>  }
>
> This is a pretty wierd-looking function now - I think it would be bette=
r
> just to make all callers have to remember the GFN.  In fact, since a
> guest VCPU can change its pagetables at any time, it's not safe to use
> paging_gva_to_gfn() to regenerate the GFN from a VA.
>
> Also, IIRC the nested-SVM code keeps the hvm_map mapping around for
> quite a long time so in fact this unmap-and-put-gfn may not be the righ=
t
> interface.  Maybe the caller should put_gfn() explicitly.

I just looked into nestedsvm_vmcb_map. It would seem that the map it
stores in nv_vvmcx survives beyond the vmexit. So, if we don't put_gfn we
would be entering the scheduler in an atomic context.

The shorthand solution is to put_gfn, but that would render the map
potentially unsafe on re-entry. I don't think so, so I'll push forward
with that.

Is it possible to teardown and re-establish the maps on each hypervisor
entry/exit? That would seem like the ultimate solution.

Andres
>
>> diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/hvm/svm/svm.c
>> --- a/xen/arch/x86/hvm/svm/svm.c
>> +++ b/xen/arch/x86/hvm/svm/svm.c
>> @@ -244,9 +244,10 @@ static int svm_vmcb_restore(struct vcpu
>>      {
>>          if ( c->cr0 & X86_CR0_PG )
>>          {
>> -            mfn =3D mfn_x(gfn_to_mfn(v->domain, c->cr3 >> PAGE_SHIFT,
>> &p2mt));
>> +            mfn =3D mfn_x(get_gfn(v->domain, c->cr3 >> PAGE_SHIFT,
>> &p2mt));
>>              if ( !p2m_is_ram(p2mt) || !get_page(mfn_to_page(mfn),
>> v->domain) )
>>              {
>> +                put_gfn(v->domain, c->cr3 >> PAGE_SHIFT);
>>                  gdprintk(XENLOG_ERR, "Invalid CR3 value=3D0x%"PRIx64"=
\n",
>>                           c->cr3);
>>                  return -EINVAL;
>> @@ -257,6 +258,8 @@ static int svm_vmcb_restore(struct vcpu
>>              put_page(pagetable_get_page(v->arch.guest_table));
>>
>>          v->arch.guest_table =3D pagetable_from_pfn(mfn);
>> +        if ( c->cr0 & X86_CR0_PG )
>> +            put_gfn(v->domain, c->cr3 >> PAGE_SHIFT);
>>      }
>>
>>      v->arch.hvm_vcpu.guest_cr[0] =3D c->cr0 | X86_CR0_ET;
>> @@ -1144,7 +1147,6 @@ static void svm_do_nested_pgfault(struct
>>      unsigned long gfn =3D gpa >> PAGE_SHIFT;
>>      mfn_t mfn;
>>      p2m_type_t p2mt;
>> -    p2m_access_t p2ma;
>>      struct p2m_domain *p2m =3D NULL;
>>
>>      ret =3D hvm_hap_nested_page_fault(gpa, 0, ~0ul, 0, 0, 0, 0);
>> @@ -1161,7 +1163,8 @@ static void svm_do_nested_pgfault(struct
>>          p2m =3D p2m_get_p2m(v);
>>          _d.gpa =3D gpa;
>>          _d.qualification =3D 0;
>> -        _d.mfn =3D mfn_x(gfn_to_mfn_type_p2m(p2m, gfn, &_d.p2mt, &p2m=
a,
>> p2m_query, NULL));
>> +        mfn =3D get_gfn_query_unlocked(p2m->domain, gfn, &_d.p2mt);
>> +        _d.mfn =3D mfn_x(mfn);
>
> Ah - this is not quite the same thing.  This lookup uses a specific p2m
> table (possibly a nested-p2m table reflecting the fact the guest is
> running in nested SVM mode) so it can't be replaced by a call that just
> takes the domain pointer (and will internally use the domain's master
> p2m table).
>
> The naming of 'p2m_get_p2m()' is particularly unhelpful here, I realise=
.
> It fetches the running p2m, i.e. the one that hardware sees as an NPT
> table; almost everywhere else uses p2m_get_hostp2m(), which
> fetches the master p2m.  But in general when you see the
> gfn_to_mfn_*_p2m() functions, that take an explicit p2m pointer, you
> need to be careful.
>
>>
>>          __trace_var(TRC_HVM_NPF, 0, sizeof(_d), &_d);
>>      }
>> @@ -1181,7 +1184,7 @@ static void svm_do_nested_pgfault(struct
>>      if ( p2m =3D=3D NULL )
>>          p2m =3D p2m_get_p2m(v);
>>      /* Everything else is an error. */
>> -    mfn =3D gfn_to_mfn_type_p2m(p2m, gfn, &p2mt, &p2ma, p2m_guest, NU=
LL);
>> +    mfn =3D get_gfn_guest_unlocked(p2m->domain, gfn, &p2mt);
>
> Likewise here.
>
>> diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/mm/guest_walk.c
>> --- a/xen/arch/x86/mm/guest_walk.c
>> +++ b/xen/arch/x86/mm/guest_walk.c
>> @@ -86,30 +86,33 @@ static uint32_t set_ad_bits(void *guest_
>>      return 0;
>>  }
>>
>> +/* If the map is non-NULL, we leave this function having
>> + * called get_gfn, you need to call put_gfn. */
>>  static inline void *map_domain_gfn(struct p2m_domain *p2m,
>>                                     gfn_t gfn,
>>                                     mfn_t *mfn,
>>                                     p2m_type_t *p2mt,
>>                                     uint32_t *rc)
>>  {
>> -    p2m_access_t a;
>> -
>>      /* Translate the gfn, unsharing if shared */
>> -    *mfn =3D gfn_to_mfn_type_p2m(p2m, gfn_x(gfn), p2mt, &a, p2m_unsha=
re,
>> NULL);
>> +    *mfn =3D get_gfn_unshare(p2m->domain, gfn_x(gfn), p2mt);
>
> Here's another case where we need to handle the nested-hap path; the p2=
m
> pointer here must be propagated into the lookup function.
>
>>      if ( p2m_is_paging(*p2mt) )
>>      {
>>          ASSERT(!p2m_is_nestedp2m(p2m));
>>          p2m_mem_paging_populate(p2m->domain, gfn_x(gfn));
>> +        put_gfn(p2m->domain, gfn_x(gfn));
>>          *rc =3D _PAGE_PAGED;
>>          return NULL;
>>      }
>>      if ( p2m_is_shared(*p2mt) )
>>      {
>> +        put_gfn(p2m->domain, gfn_x(gfn));
>>          *rc =3D _PAGE_SHARED;
>>          return NULL;
>>      }
>>      if ( !p2m_is_ram(*p2mt) )
>>      {
>> +        put_gfn(p2m->domain, gfn_x(gfn));
>>          *rc |=3D _PAGE_PRESENT;
>>          return NULL;
>>      }
>> @@ -120,6 +123,9 @@ static inline void *map_domain_gfn(struc
>>
>>
>>  /* Walk the guest pagetables, after the manner of a hardware walker. =
*/
>> +/* Because the walk is essentially random, it can cause a deadlock
>> + * warning in the p2m locking code. Highly unlikely this is an actual
>> + * deadlock, because who would walk page table in the opposite order?
>> */
>
> Linear pagetables make this sort of thing more likely, especially if
> they're used by one process to update another process's mappings.
>
> If this is a problem, maybe we'll need to avoid the deadlock either by
> allowing multiple lock-holders in the p2m or by rearranging the a/d
> writeback soit does another p2m lookup  -- I'd rather not do that,
> though, since even on 64-bit it will add a lot of memory accesses.
>
> I'm happy to take a version of this big switchover patch that doesn't
> solve this problem, though.  It can be sorted out in a separate patch.
>
>> diff -r f07d4ebe5248 -r e9fd07479f68 xen/arch/x86/mm/hap/nested_hap.c
>> --- a/xen/arch/x86/mm/hap/nested_hap.c
>> +++ b/xen/arch/x86/mm/hap/nested_hap.c
>> @@ -146,22 +146,29 @@ nestedhap_walk_L0_p2m(struct p2m_domain
>>      mfn_t mfn;
>>      p2m_type_t p2mt;
>>      p2m_access_t p2ma;
>> +    int rc;
>>
>>      /* walk L0 P2M table */
>>      mfn =3D gfn_to_mfn_type_p2m(p2m, L1_gpa >> PAGE_SHIFT, &p2mt, &p2=
ma,
>>                                p2m_query, page_order);
>
> Again, are we not changing this function's name?
>
>
> Cheers,
>
> Tim.
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 09:07:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 09:07:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROY6Q-0005Ac-MU; Thu, 10 Nov 2011 09:07:50 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROY1S-0004oy-Gi; Thu, 10 Nov 2011 09:02:49 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1320944557!2995668!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6839 invoked from network); 10 Nov 2011 17:02:39 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-11.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Nov 2011 17:02:39 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAAH2Vgd019652
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 10 Nov 2011 17:02:32 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAAH2Ugn021549
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 10 Nov 2011 17:02:30 GMT
Received: from abhmt104.oracle.com (abhmt104.oracle.com [141.146.116.56])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAAH2PKI012784; Thu, 10 Nov 2011 11:02:25 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 10 Nov 2011 09:02:24 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id E694B819F1; Thu, 10 Nov 2011 12:02:23 -0500 (EST)
Date: Thu, 10 Nov 2011 12:02:23 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: Is: Xen 4.1.1, xend, HVM, 3.1 kernel; Was:Re: [Xen-devel] xen
	4.2 unstable; HVM; 2.6.39.3; HD/Network card error
Message-ID: <20111110170223.GC2811@phenom.dumpdata.com>
References: <alpine.DEB.2.00.1107201238440.12963@kaball-desktop>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAIMchHuG/6dIqtJ7GgPrsOEBAAAAAA==@gmail.com>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAAKIP0TTIelKl7OMHw7/aSQBAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107251142270.12963@kaball-desktop>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAICr5HMuz3FOpEbmgui+XxgBAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107251748160.12963@kaball-desktop>
	<20111103173837.GA21554@phenom.dumpdata.com>
	<alpine.DEB.2.00.1111071646210.3519@kaball-desktop>
	<20111107212619.GA24889@phenom.dumpdata.com>
	<alpine.DEB.2.00.1111081058060.3519@kaball-desktop>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <alpine.DEB.2.00.1111081058060.3519@kaball-desktop>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090202.4EBC03A8.0131,ss=1,re=0.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Walter Robert Ditzler <ditwal001@gmail.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 08, 2011 at 11:09:11AM +0000, Stefano Stabellini wrote:
> On Mon, 7 Nov 2011, Konrad Rzeszutek Wilk wrote:
> > > > XENBUS: Timeout connecting to device: device/vkbd/0 (local state 3, remote state 1)
> > > > [which seems odds as the vkb from VNC looks to be working]
> > > 
> > > Thanks for pointing this out: I enabled vkbd in upstream qemu but I
> > > forgot to do the same in qemu-xen so as a result you would get failures
> > > of this kind.
> > 
> > Oh boy. Seems that there are a couple of issues here. It might be that the
> > timeout I had experienced was _only_ related to this and the other were red-herrings.
> > 
> > You might want to make sure M A Young and Stefan Bader are CC-ed on your Xen 4.1.1
> > patch so they can pull it in.
> 
> Actually I have just realized that the vkbd feature couldn't possibly
> have been backported to xen 4.1.1. In fact I didn't even add any vkbd
> devices for HVM guests in XL in xen-unstable yet.
> Of course this was to avoid situations like this one.
> 
> So my guess is that when you use "vfb" in an HVM guest config file
> you cause xend to create a vkbd device that is without backend.
> A PV on HVM guest would try to connect to it but it wouldn't get any
> response back so it would timeout.
> 
> The solution to this problem is to avoid using vfb in the config file. I
> strongly hope that the config file you showed us before is not generated
> by libvirt somehow. If it is we need to file a bug against libvirt.

It looks like it is:

[root@phenom Mail]# virsh dumpxml f16_64 > /tmp/a
[root@phenom Mail]# virsh  domxml-to-native xen-xm /tmp/a
name = "f16_64"
uuid = "587ea6cf-8296-a4d3-86e2-d8afa991bd4b"
maxmem = 1024
memory = 1024
vcpus = 1
builder = "hvm"
kernel = "/usr/lib/xen/boot/hvmloader"
boot = "c"
pae = 1
acpi = 1
apic = 1
hap = 0
viridian = 0
localtime = 0
hpet = 0
on_poweroff = "destroy"
on_reboot = "destroy"
on_crash = "destroy"
device_model = "/usr/lib64/xen/bin/qemu-dm"
vfb = [ "type=vnc,vncunused=1,keymap=en-us" ]
disk = [ "phy:/dev/vg_guest/f16_64,hda,w", "file:/mnt/iso/Fedora-16-x86_64-DVD.iso,hdc:cdrom,r" ]
vif = [ "mac=00:16:3e:44:07:4b,bridge=switch,script=vif-bridge,vifname=vif7.0" ]
parallel = "none"
serial = "pty"


> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 09:16:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 09:16:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROYEm-0006Te-0D; Thu, 10 Nov 2011 09:16:28 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROYDE-0006G1-Ls; Thu, 10 Nov 2011 09:14:53 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1320945170!43859899!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8759 invoked from network); 10 Nov 2011 17:12:52 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-14.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 17:12:52 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAAHEhHS004287
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 10 Nov 2011 17:14:43 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAAHEgx6000536
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 10 Nov 2011 17:14:42 GMT
Received: from abhmt113.oracle.com (abhmt113.oracle.com [141.146.116.65])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAAHEbRY022551; Thu, 10 Nov 2011 11:14:37 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 10 Nov 2011 09:14:36 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 9E29D819F1; Thu, 10 Nov 2011 12:14:35 -0500 (EST)
Date: Thu, 10 Nov 2011 12:14:35 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: Is: Xen 4.1.1, xend, HVM, 3.1 kernel; Was:Re: [Xen-devel] xen
	4.2 unstable; HVM; 2.6.39.3; HD/Network card error
Message-ID: <20111110171435.GA6616@phenom.dumpdata.com>
References: <alpine.DEB.2.00.1107201238440.12963@kaball-desktop>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAIMchHuG/6dIqtJ7GgPrsOEBAAAAAA==@gmail.com>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAAKIP0TTIelKl7OMHw7/aSQBAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107251142270.12963@kaball-desktop>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAICr5HMuz3FOpEbmgui+XxgBAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107251748160.12963@kaball-desktop>
	<20111103173837.GA21554@phenom.dumpdata.com>
	<alpine.DEB.2.00.1111071646210.3519@kaball-desktop>
	<20111107212619.GA24889@phenom.dumpdata.com>
	<alpine.DEB.2.00.1111081058060.3519@kaball-desktop>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <alpine.DEB.2.00.1111081058060.3519@kaball-desktop>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090201.4EBC0684.00AE,ss=1,re=0.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Walter Robert Ditzler <ditwal001@gmail.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 08, 2011 at 11:09:11AM +0000, Stefano Stabellini wrote:
> On Mon, 7 Nov 2011, Konrad Rzeszutek Wilk wrote:
> > > > XENBUS: Timeout connecting to device: device/vkbd/0 (local state 3, remote state 1)
> > > > [which seems odds as the vkb from VNC looks to be working]
> > > 
> > > Thanks for pointing this out: I enabled vkbd in upstream qemu but I
> > > forgot to do the same in qemu-xen so as a result you would get failures
> > > of this kind.
> > 
> > Oh boy. Seems that there are a couple of issues here. It might be that the
> > timeout I had experienced was _only_ related to this and the other were red-herrings.
> > 
> > You might want to make sure M A Young and Stefan Bader are CC-ed on your Xen 4.1.1
> > patch so they can pull it in.
> 
> Actually I have just realized that the vkbd feature couldn't possibly
> have been backported to xen 4.1.1. In fact I didn't even add any vkbd
> devices for HVM guests in XL in xen-unstable yet.
> Of course this was to avoid situations like this one.
> 
> So my guess is that when you use "vfb" in an HVM guest config file
> you cause xend to create a vkbd device that is without backend.
> A PV on HVM guest would try to connect to it but it wouldn't get any
> response back so it would timeout.
> 
> The solution to this problem is to avoid using vfb in the config file. I
> strongly hope that the config file you showed us before is not generated
> by libvirt somehow. If it is we need to file a bug against libvirt.

And sure enough, if I modify the xm file libvirt creates to be:

[root@phenom ~]# diff /tmp/b.autogenerated /tmp/b
8c8
< boot = "c"
---
> boot = "dc"
20c20,21
< vfb = [ "type=vnc,vncunused=1" ]
---
> #vfb = [ "type=vnc,vncunused=1,keymap=en-us" ]
> vnc=1


It bootes right up. Is this a new behavior with xend? I would think
not - it just seems that the 'vfb' for HVM guests worked in the past -
as Windows boots just fine? And I think the accelerated drivers
for Windows take advantage of that?

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 09:24:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 09:24:02 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROYM6-0007ez-RI; Thu, 10 Nov 2011 09:24:02 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROYIt-00074p-Hu; Thu, 10 Nov 2011 09:20:44 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1320945640!3681583!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13867 invoked from network); 10 Nov 2011 17:20:40 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 17:20:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,489,1315180800"; 
   d="scan'208";a="8871450"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 17:20:19 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 17:20:19 +0000
Date: Thu, 10 Nov 2011 17:20:52 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: Is: Xen 4.1.1, xend, HVM, 3.1 kernel; Was:Re: [Xen-devel] xen
	4.2 unstable; HVM; 2.6.39.3; HD/Network card error
In-Reply-To: <20111110171435.GA6616@phenom.dumpdata.com>
Message-ID: <alpine.DEB.2.00.1111101718070.3519@kaball-desktop>
References: <alpine.DEB.2.00.1107201238440.12963@kaball-desktop>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAIMchHuG/6dIqtJ7GgPrsOEBAAAAAA==@gmail.com>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAAKIP0TTIelKl7OMHw7/aSQBAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107251142270.12963@kaball-desktop>
	<!&!AAAAAAAAAAAYAAAAAAAAAOJK0u4CH31Kl5v1RPAzyrZCgQAAEAAAAICr5HMuz3FOpEbmgui+XxgBAAAAAA==@gmail.com>
	<alpine.DEB.2.00.1107251748160.12963@kaball-desktop>
	<20111103173837.GA21554@phenom.dumpdata.com>
	<alpine.DEB.2.00.1111071646210.3519@kaball-desktop>
	<20111107212619.GA24889@phenom.dumpdata.com>
	<alpine.DEB.2.00.1111081058060.3519@kaball-desktop>
	<20111110171435.GA6616@phenom.dumpdata.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Walter Robert Ditzler <ditwal001@gmail.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 10 Nov 2011, Konrad Rzeszutek Wilk wrote:
> On Tue, Nov 08, 2011 at 11:09:11AM +0000, Stefano Stabellini wrote:
> > On Mon, 7 Nov 2011, Konrad Rzeszutek Wilk wrote:
> > > > > XENBUS: Timeout connecting to device: device/vkbd/0 (local state 3, remote state 1)
> > > > > [which seems odds as the vkb from VNC looks to be working]
> > > > 
> > > > Thanks for pointing this out: I enabled vkbd in upstream qemu but I
> > > > forgot to do the same in qemu-xen so as a result you would get failures
> > > > of this kind.
> > > 
> > > Oh boy. Seems that there are a couple of issues here. It might be that the
> > > timeout I had experienced was _only_ related to this and the other were red-herrings.
> > > 
> > > You might want to make sure M A Young and Stefan Bader are CC-ed on your Xen 4.1.1
> > > patch so they can pull it in.
> > 
> > Actually I have just realized that the vkbd feature couldn't possibly
> > have been backported to xen 4.1.1. In fact I didn't even add any vkbd
> > devices for HVM guests in XL in xen-unstable yet.
> > Of course this was to avoid situations like this one.
> > 
> > So my guess is that when you use "vfb" in an HVM guest config file
> > you cause xend to create a vkbd device that is without backend.
> > A PV on HVM guest would try to connect to it but it wouldn't get any
> > response back so it would timeout.
> > 
> > The solution to this problem is to avoid using vfb in the config file. I
> > strongly hope that the config file you showed us before is not generated
> > by libvirt somehow. If it is we need to file a bug against libvirt.
> 
> And sure enough, if I modify the xm file libvirt creates to be:
> 
> [root@phenom ~]# diff /tmp/b.autogenerated /tmp/b
> 8c8
> < boot = "c"
> ---
> > boot = "dc"
> 20c20,21
> < vfb = [ "type=vnc,vncunused=1" ]
> ---
> > #vfb = [ "type=vnc,vncunused=1,keymap=en-us" ]
> > vnc=1
> 
> 
> It bootes right up. Is this a new behavior with xend? I would think
> not - it just seems that the 'vfb' for HVM guests worked in the past -
> as Windows boots just fine? And I think the accelerated drivers
> for Windows take advantage of that?
> 

Have you noticed that the vnc parameters inside vfb look very similar to
the normal vnc parameters outside vfb?
Xend happens to store both set of vnc parameters the same way, using
the same internal variables. That is why it happened to work in the
past. It was working by pure chance, I have no idea what changed.
Windows doesn't take advance of vfb or vkbd at all.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 09:29:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 09:29:25 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROYRJ-0000MC-5l; Thu, 10 Nov 2011 09:29:25 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROYOJ-00086b-Po
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 09:26:20 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1320945976!3027291!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3164 invoked from network); 10 Nov 2011 17:26:16 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 17:26:16 -0000
X-IronPort-AV: E=Sophos;i="4.69,489,1315180800"; 
   d="scan'208";a="8871591"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 17:26:13 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 17:26:13 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROYG9-0002QE-J3;
	Thu, 10 Nov 2011 17:17:53 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROYG0-0003br-Cl;
	Thu, 10 Nov 2011 17:17:44 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 17:17:43 +0000
Message-ID: <1320945463-13844-1-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH] Hypercall continuation cancelation in compat
	mode for XENMEM_get/set_pod_target.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


If copy_to_guest failed in the compat code after a continuation as been
done in the native code we need to cancel it so we won't reexecute the
hypercall but return from the hypercall with the appropriate error.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/domain.c           |   18 ++++++++++++++++++
 xen/arch/x86/x86_64/compat/mm.c |    4 ++++
 xen/include/xen/sched.h         |    1 +
 3 files changed, 23 insertions(+), 0 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0001-Hypercall-continuation-cancelation-in-compat-mode-fo.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0001-Hypercall-continuation-cancelation-in-compat-mode-fo.patch"

diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index 52c7f37..acc3241 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -1723,6 +1723,24 @@ void sync_vcpu_execstate(struct vcpu *v)
     __arg;                                                                  \
 })
 
+void hypercall_cancel_continuation(void)
+{
+    struct cpu_user_regs *regs = guest_cpu_user_regs();
+    struct mc_state *mcs = &current->mc_state;
+
+    if ( test_bit(_MCSF_in_multicall, &mcs->flags) )
+    {
+        __clear_bit(_MCSF_call_preempted, &mcs->flags);
+    }
+    else
+    {
+        if ( !is_hvm_vcpu(current) )
+            regs->eip += 2; /* skip re-execute 'syscall' / 'int $xx' */
+        else
+            current->arch.hvm_vcpu.hcall_preempted = 0;
+    }
+}
+
 unsigned long hypercall_create_continuation(
     unsigned int op, const char *format, ...)
 {
diff --git a/xen/arch/x86/x86_64/compat/mm.c b/xen/arch/x86/x86_64/compat/mm.c
index 2c05099..3ef08a5 100644
--- a/xen/arch/x86/x86_64/compat/mm.c
+++ b/xen/arch/x86/x86_64/compat/mm.c
@@ -133,7 +133,11 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
         XLAT_pod_target(&cmp, nat);
 
         if ( copy_to_guest(arg, &cmp, 1) )
+        {
+            if ( rc == __HYPERVISOR_memory_op )
+                hypercall_cancel_continuation();
             rc = -EFAULT;
+        }
 
         break;
     }
diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
index 3ba5495..80d5c4b 100644
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -554,6 +554,7 @@ extern void (*dead_idle) (void);
  */
 unsigned long hypercall_create_continuation(
     unsigned int op, const char *format, ...);
+void hypercall_cancel_continuation(void);
 
 #define hypercall_preempt_check() (unlikely(    \
         softirq_pending(smp_processor_id()) |   \

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 09:31:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 09:31:53 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROYTg-0000l4-W2; Thu, 10 Nov 2011 09:31:53 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROYRd-0000Pn-VL
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 09:29:46 -0800
X-Env-Sender: dan.magenheimer@oracle.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1320946157!51754972!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29698 invoked from network); 10 Nov 2011 17:29:18 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-8.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 17:29:18 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAAHTcb6023683
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 10 Nov 2011 17:29:39 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAAHTcpU011118
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 10 Nov 2011 17:29:38 GMT
Received: from abhmt105.oracle.com (abhmt105.oracle.com [141.146.116.57])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAAHTWAh001477; Thu, 10 Nov 2011 11:29:32 -0600
MIME-Version: 1.0
Message-ID: <4a3e0776-6598-48d5-949d-d54b8ff5bdbe@default>
Date: Thu, 10 Nov 2011 09:29:35 -0800 (PST)
From: Dan Magenheimer <dan.magenheimer@oracle.com>
To: Ian Campbell <ian.campbell@citrix.com>, xen-devel@lists.xensource.com
Subject: RE: [Xen-devel] [PATCH] libxl: use named options for tsc_mode
References: <bc79b560aafa1e4dc42a.1320922519@cosworth.uk.xensource.com>
In-Reply-To: <bc79b560aafa1e4dc42a.1320922519@cosworth.uk.xensource.com>
X-Priority: 3
X-Mailer: Oracle Beehive Extensions for Outlook 2.0.1.4.1.0  (410211) [OL
	12.0.6562.5003]
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090201.4EBC0A04.001B,ss=1,re=0.000,fgs=0
Cc: ian.jackson@citrix.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> From: Ian Campbell [mailto:ian.campbell@citrix.com]
> Subject: [Xen-devel] [PATCH] libxl: use named options for tsc_mode
>=20
> # HG changeset patch
> # User Ian Campbell <ian.campbell@citrix.com>
> # Date 1320922479 0
> # Node ID bc79b560aafa1e4dc42af00e6a326dc651b5636a
> # Parent  460b507e15f864dd6712f5040e36538d6e076ae4
> libxl: use named options for tsc_mode.
>=20
> It seems that this knob is expoerted from the hypervisor as a raw
> integer (no symbolic names) documented in xen/include/asm-x86. Propagatin=
g that
> all the way to the end user is hardly friendly (it's bad enough in the
> hypercall interface).

Thanks for looking at this!

> Add an enum at the libxl level with a hopefully descriptive set of names.
> Deprecate the use of an integer in xl cfg files.

We (Oracle) already have shipped cfg files that use the integer
so would prefer that the deprecation message be removed.  IMHO, to
the vast majority of users, the symbolic names will be gibberish
anyway and are likely to be misspelled.  For knowledgeable folk,
they are nice though, so maybe just support both?
=20
> +   * `"always_emulate"`: guest rdtsc/p always emulated at 1GHz (kernel
> +     and user).

Many guests will "appear" to run at a slower "bogomips" so a word
or two more here may keep some from panicking.  Maybe:

guest rdtsc/p always emulated and the virtual TSC will appear to
increment (kernel and user) at a fixed 1GHz rate, regardless of
the PCPU HZ rate or power state; this will NOT affect underlying
CPU performance

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 09:39:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 09:39:02 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROYaa-0001R8-KR; Thu, 10 Nov 2011 09:39:00 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROYZC-0001BZ-MX
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 09:37:35 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1320946651!1071944!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26549 invoked from network); 10 Nov 2011 17:37:31 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 17:37:31 -0000
X-IronPort-AV: E=Sophos;i="4.69,489,1315180800"; 
   d="scan'208";a="8871985"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 17:37:30 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 17:37:30 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROYZ8-0002Xw-8w;
	Thu, 10 Nov 2011 17:37:30 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROYYz-0003sb-2l;
	Thu, 10 Nov 2011 17:37:21 +0000
Date: Thu, 10 Nov 2011 17:37:21 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <20111110173720.GA29605@spongy.cam.xci-test.com>
References: <4EBBD5F602000078000602EE@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
In-Reply-To: <4EBBD5F602000078000602EE@nat28.tlf.novell.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Keir \(Xen.org\)" <keir@xen.org>,
	George Dunlap <George.Dunlap@eu.citrix.com>, "Tim
	\(Xen.org\)" <tim@xen.org>,
	"allen.m.kay@intel.com" <allen.m.kay@intel.com>,
	Jean Guyader <Jean.Guyader@citrix.com>
Subject: [Xen-devel] Re: [PATCH 5/7] mm: New XENMEM space,
	XENMAPSPACE_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 10/11 12:47, Jan Beulich wrote:
> >>> On 10.11.11 at 12:35, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> >@@ -4716,6 +4748,17 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
> >         }
> > 
> >         rc = xenmem_add_to_physmap(d, &xatp);
> >+        if ( rc == -EAGAIN )
> 
>         if ( rc )
> 
> >+        {
> >+            if ( copy_to_guest(arg, &xatp, 1) )
> >+            {
> >+                rcu_unlock_domain(d);
> >+                return -EFAULT;
> >+            }
> 
>         }
>         if ( rc == -EAGAIN )
> 
> (with some room for further simplification). Without that (or the minimal
> alternative of copying back just .size or yet some other mechanism), as
> pointed out before, the caller won't have a way to know how far into
> the batch things succeeded.
> 

In xenmem_add_to_physmap I modify xatp in place so when I exit this
function xatp will contain the updated value (new start value in
.gpfn and .idx, how far do I need to go in .size).

The idea here was to call the copy_to_guest only when we got preempted.
If I copy xatp back to the guest I should get the updated value
in xatp from the copy_from_guest when I'll be called by the continuation.

> >+
> >+            rc = hypercall_create_continuation(
> >+                    __HYPERVISOR_memory_op, "ih", op, arg);
> >+        }
> > 
> >         rcu_unlock_domain(d);
> 
> Also, the whole block above can be move past this rcu_unlock_domain(),
> eliminating the need to do it separately in the above error path(s).
> 

Ok.

Jean

> > 
> >--- a/xen/arch/x86/x86_64/compat/mm.c
> >+++ b/xen/arch/x86/x86_64/compat/mm.c
> >@@ -63,6 +63,18 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
> > 
> >         XLAT_add_to_physmap(nat, &cmp);
> >         rc = arch_memory_op(op, guest_handle_from_ptr(nat, void));
> >+        if ( rc < 0 )
> >+            break;
> >+
> 
> With the way the code below is currently this is superfluous. But just
> as above you will need to provide some indication to the caller
> *where* the failure occurred.
> 
> >+        if ( rc == __HYPERVISOR_memory_op )
> >+        {
> >+            hypercall_xlat_continuation(NULL, 0x2, nat, arg);
> >+
> >+            XLAT_add_to_physmap(&cmp, nat);
> >+
> >+            if ( copy_to_guest(arg, &cmp, 1) )
> >+                return -EFAULT;
> 
> I realize that this is the same way in the code handling
> XENMEM_[gs]et_pod_target, but unfortunately that's wrong (that's
> why I'm copying you, George): Once a continuation was set up, you
> mustn't change the return value anymore, since the continuation was
> established by adjusting the guest's rIP.
> 
> As for other memory ops, the continuation can be encoded in "op" (see
> xen/common/memory.c and xen/common/compat/memory.c). However,
> while suitable here I don't think that's usable for the PoD variant. The
> alternative is to cancel the continuation (would require quite a bit of
> new code I think) or to adjust the low level hypercall handler code (at
> least the compat mode one) to special case rAX values in the negative
> errno range, leaving rAX unchanged instead of returning -ENOSYS.
> Keir?
> 
> Jan
> 
> >+        }
> > 
> >         break;
> >     }
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 10:10:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 10:10:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROZ51-0002T0-Oy; Thu, 10 Nov 2011 10:10:27 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROZ09-0002BY-1t
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 10:06:03 -0800
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-2.tower-174.messagelabs.com!1320948319!1065893!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7423 invoked from network); 10 Nov 2011 18:05:21 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-2.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 18:05:21 -0000
Received: from saboo.goop.org (adsl-75-61-65-188.dsl.pltn13.sbcglobal.net
	[75.61.65.188]) (Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 9265690AC;
	Thu, 10 Nov 2011 10:05:18 -0800 (PST)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 81E1920254;
	Thu, 10 Nov 2011 10:05:14 -0800 (PST)
Message-ID: <4EBC125A.70300@goop.org>
Date: Thu, 10 Nov 2011 10:05:14 -0800
From: Jeremy Fitzhardinge <jeremy@goop.org>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH] remove blocked time accounting from xen
	"clockchip"
References: <1318970579-6282-1-git-send-email-lersek@redhat.com>
	<4EBA8FAA020000780005FD5F@nat28.tlf.novell.com>
In-Reply-To: <4EBA8FAA020000780005FD5F@nat28.tlf.novell.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: Joe Jin <joe.jin@oracle.com>, xen-devel@lists.xensource.com,
	Laszlo Ersek <lersek@redhat.com>,
	Zhenzhong Duan <zhenzhong.duan@oracle.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/09/2011 05:35 AM, Jan Beulich wrote:
>>>> On 18.10.11 at 22:42, Laszlo Ersek <lersek@redhat.com> wrote:
>> ... because the "clock_event_device framework" already accounts for idle
>> time through the "event_handler" function pointer in
>> xen_timer_interrupt().
>>
>> The patch is intended as the completion of [1]. It should fix the double
>> idle times seen in PV guests' /proc/stat [2]. It should be orthogonal to
>> stolen time accounting (the removed code seems to be isolated).
> After some more looking around I still think it's incorrect, albeit for
> a different reason: What tick_nohz_restart_sched_tick() accounts
> as idle time is *all* time that passed while in cpu_idle(). What gets
> accounted in do_stolen_accounting() (without your patch) is
> different:
> - time the vCPU was in RUNSTATE_blocked gets accounted as idle
> - time the vCPU was in RUNSTATE_runnable and RUNSTATE_offline
>   gets accounted as stolen.
>
> That is, on an overcommitted system (and without your patch) I
> would expect you to not see the (full) double idle increment for a not
> fully idle and not fully loaded vCPU.
>
> Now we can of course say that for most purposes it's fine to
> ignore the difference between idle and steal time, but there must
> be a reason these have been getting accounted separately in Linux
> without regard to Xen.
>
> So I really think that what needs to be suppressed to address this
> is tick_nohz_restart_sched_tick()'s call to account_idle_ticks(). But
> simply forcing CONFIG_VIRT_CPU_ACCOUNTING is not an immediate
> option (not even when considering a Xen-only kernel), as that has
> further implications. Instead I wonder whether under Xen we should
> e.g. update per_cpu(tick_cpu_sched, cpu).idle_jiffies prior to calling
> tick_nohz_restart_sched_tick() (possibly implicitly by doing the
> update in do_stolen_accounting(), though that wouldn't work when
> the wakeup is due to an interrupt other than the timer one).
>
> The alternative of accounting the negative of the steal time as
> idle time in do_stolen_accounting() doesn't look correct either,
> since not all stolen time was necessarily accounted as idle (some
> would have got - also incorrectly - accounted as process or system
> time).
>
> So my conclusion is that only the full implementation of what
> CONFIG_VIRT_CPU_ACCOUNTING expects would actually get
> things sorted out properly (but that would imply Xen *and* native
> are willing to pay the performance price, or the enabling of this
> can be made dynamic so that at least native could remain
> unaffected).
>
> Or the negative stolen time should be accounted to the current
> process, the system, or as idle, depending on the context which
> do_stolen_accounting() runs in (just like timer_interrupt() did in
> the XenoLinux kernels for positive accounting).

I was always suspicious of the timer-interrupt-based stolen time
accounting code.  It's really a hold-over from when ticks were the main
timekeeping mechanism, but with highres timers its massive overkill and
probably a source of performance degradation.

Overall, the stolen time accounting isn't really very important.  The
kernel doesn't use it at all internally - it doesn't affect scheduling
decisions, for example.  It's only exported in /proc/stat, and some
tools like top will display it if its non-zero.  It could be useful for
diagnosing performance problems on a heavily loaded host system, but
other tools like "xentop" would give you as much information.

So really, all this code is nice to have, but I'm not sure its worth a
lot of time to fix, especially if it makes idle accounting hard (which
*is* important).

However, that said, PeterZ recently added some code to the scheduler so
that time "stolen" by interrupt handling isn't accounted against the
task running at the time, and the design is specifically intended to
also be useful for virtualization stolen time as well.  There are some
KVM patches floating around to implement this, and we should look at
doing a Xen implementation.  That would be much more practically useful,
since (I think) it allows the scheduler to be aware of stolen time and
not penalize tasks for time they never got to use.  Or at the very least
it could give you per-task stolen stats (maybe?) which would be useful.

    J

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 10:40:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 10:40:35 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROZYA-00053N-Mp; Thu, 10 Nov 2011 10:40:34 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROZTt-0004KC-Te
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 10:36:10 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1320950166!2650986!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 858 invoked from network); 10 Nov 2011 18:36:06 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 18:36:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,489,1315180800"; 
   d="scan'208";a="8872682"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 18:36:05 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 18:36:05 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1ROZTp-0002s1-Cn;
	Thu, 10 Nov 2011 18:36:05 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1ROZTp-000520-7p;
	Thu, 10 Nov 2011 18:36:05 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9742-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 10 Nov 2011 18:36:05 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9742: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9742 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9742/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl          18 leak-check/check           fail REGR. vs. 9661
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl           18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-credit2   18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-multivcpu 18 leak-check/check           fail REGR. vs. 9661

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10       fail    like 9659
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  d0bbe0622d1d
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  "Shan, Haitao" <haitao.shan@intel.com>
  Andres Lagar-Cavilla <andres@lagarcavilla.org>
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Jean Guyader <jean.guyader@eu.citrix.com>
  Juergen Gross <juergen.gross@ts.fujitsu.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  Tim Deegan <tim@xen.org>
  Wei Wang <wei.wang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

(No revision log; it would be 656 lines long.)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 11:06:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 11:06:09 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROZwv-0005qf-HZ; Thu, 10 Nov 2011 11:06:09 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROZsN-0005Zv-Pl
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 11:01:29 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1320951684!2162252!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11341 invoked from network); 10 Nov 2011 19:01:24 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 19:01:24 -0000
X-IronPort-AV: E=Sophos;i="4.69,489,1315180800"; 
   d="scan'208";a="8873049"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 19:01:23 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 19:01:23 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1ROZsJ-00030c-FP	for xen-devel@lists.xensource.com;
	Thu, 10 Nov 2011 19:01:23 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1ROZsJ-0000JS-CJ	for
	xen-devel@lists.xensource.com; Thu, 10 Nov 2011 19:01:23 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20156.8067.301501.320896@mariner.uk.xensource.com>
Date: Thu, 10 Nov 2011 19:01:23 +0000
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
In-Reply-To: <osstest-9742-mainreport@xen.org>
References: <osstest-9742-mainreport@xen.org>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Subject: [Xen-devel] Re: [xen-unstable test] 9742: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

xen.org writes ("[xen-unstable test] 9742: regressions - FAIL"):
> flight 9742 xen-unstable real [real]
> http://www.chiark.greenend.org.uk/~xensrcts/logs/9742/
> 
> Regressions :-(
> 
> Tests which did not succeed and are blocking:
>  test-amd64-amd64-xl          18 leak-check/check       fail REGR. vs. 9661
>  test-i386-i386-xl            18 leak-check/check       fail REGR. vs. 9661
>  test-amd64-i386-xl           18 leak-check/check       fail REGR. vs. 9661
>  test-amd64-i386-xl-credit2   18 leak-check/check       fail REGR. vs. 9661
>  test-amd64-i386-xl-multivcpu 18 leak-check/check       fail REGR. vs. 9661

This is the tester complaining that the xenstore path "/libxl" was
leaked.  I have made a version of the tester which doesn't mind that,
adding /libxl to the list of ok-to-be-leaked paths, and this will
hopefully make it through the meta-push-gate soon and thus get us a
push of xen-unstable.

Please ignore any emails from the bisector complaining about this and
fingering the changeset which introduced the /libxl xenstore path.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 11:52:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 11:52:40 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROafw-0000Zk-Gl; Thu, 10 Nov 2011 11:52:40 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROafG-0000Mk-82
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 11:51:58 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1320954714!1074090!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4352 invoked from network); 10 Nov 2011 19:51:54 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 19:51:54 -0000
X-IronPort-AV: E=Sophos;i="4.69,490,1315180800"; 
   d="scan'208";a="8874186"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 19:51:54 +0000
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Thu, 10 Nov 2011 19:51:54 +0000
Subject: Re: [Xen-devel] [PATCH 2/2] xenstat: Use local domain names
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
In-Reply-To: <1320862287-11787-2-git-send-email-dgdegra@tycho.nsa.gov>
References: <1320862287-11787-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1320862287-11787-2-git-send-email-dgdegra@tycho.nsa.gov>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Thu, 10 Nov 2011 19:51:53 +0000
Message-ID: <1320954713.16747.117.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-09 at 18:11 +0000, Daniel De Graaf wrote:
> The domain name stored in /local/domain/$domid/name is simpler to
> access and is the only domain name modified by "xl rename". Use this
> domain name in libxenstat's reporting.

As it happens I noticed this today too since it causes dom0 not to show
up in xentop. My workaround was to add to my initscripts:

xenstore-write /vm/00000000-0000-0000-0000-000000000000/name "Domain-0"
xenstore-write /local/domain/0/vm /vm/00000000-0000-0000-0000-000000000000

I wondered what xend does and it seems that it also creates
both /local/domain/N/name and /vm/UUID/name but only updates the latter
on "xm rename". So it seems that xend and xl behave exactly opposite wrt
which one they change on rename. Leaving aside that it seems buggy to a)
record the name twice and b) only update one copy on rename I think "xl
rename" should either do the same thing as "xm rename" or it should
update both names in xenstore (or maybe we should drop one).

Ian.

> 
> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> ---
>  tools/xenstat/libxenstat/src/xenstat.c |   12 ++----------
>  1 files changed, 2 insertions(+), 10 deletions(-)
> 
> diff --git a/tools/xenstat/libxenstat/src/xenstat.c b/tools/xenstat/libxenstat/src/xenstat.c
> index 2791cc1..104655d 100644
> --- a/tools/xenstat/libxenstat/src/xenstat.c
> +++ b/tools/xenstat/libxenstat/src/xenstat.c
> @@ -739,17 +739,9 @@ unsigned long long xenstat_tmem_succ_pers_gets(xenstat_tmem *tmem)
>  
>  static char *xenstat_get_domain_name(xenstat_handle *handle, unsigned int domain_id)
>  {
> -	char path[80], *vmpath;
> +	char path[80];
>  
> -	snprintf(path, sizeof(path),"/local/domain/%i/vm", domain_id);
> -
> -	vmpath = xs_read(handle->xshandle, XBT_NULL, path, NULL);
> -
> -	if (vmpath == NULL)
> -		return NULL;
> -
> -	snprintf(path, sizeof(path),"%s/name", vmpath);
> -	free(vmpath);
> +	snprintf(path, sizeof(path),"/local/domain/%i/name", domain_id);
>  
>  	return xs_read(handle->xshandle, XBT_NULL, path, NULL);
>  }



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 13:29:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 13:29:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROcC5-0005dV-Bh; Thu, 10 Nov 2011 13:29:57 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROcBC-0005Qt-Fm
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 13:29:03 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1320960524!45172365!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16736 invoked from network); 10 Nov 2011 21:28:45 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-11.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 21:28:45 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAALSoJO025085
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 10 Nov 2011 21:28:51 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAALSmpR022270
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 10 Nov 2011 21:28:49 GMT
Received: from abhmt118.oracle.com (abhmt118.oracle.com [141.146.116.70])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAALSgfq015236; Thu, 10 Nov 2011 15:28:42 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 10 Nov 2011 13:28:41 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id C68E5819F2; Thu, 10 Nov 2011 16:28:40 -0500 (EST)
Date: Thu, 10 Nov 2011 16:28:40 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Subject: Re: [Xen-devel] [PATCH V3 07/10] Introduce Xen PCI Passthrough,
	qdevice (1/3)
Message-ID: <20111110212840.GA23643@phenom.dumpdata.com>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-8-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319814456-8158-8-git-send-email-anthony.perard@citrix.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090206.4EBC4214.00A6,ss=1,re=-2.300,fgs=0
Cc: Guy Zana <guy@neocleus.com>, Xen Devel <xen-devel@lists.xensource.com>,
	Allen Kay <allen.m.kay@intel.com>, QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, Oct 28, 2011 at 04:07:33PM +0100, Anthony PERARD wrote:
> From: Allen Kay <allen.m.kay@intel.com>
> 

This is going to be a bit lame review..

> +static uint32_t pt_pci_read_config(PCIDevice *d, uint32_t address, int len)
> +{
> +    XenPCIPassthroughState *s = DO_UPCAST(XenPCIPassthroughState, dev, d);
> +    uint32_t val = 0;
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    int rc = 0;
> +    int emul_len = 0;
> +    uint32_t find_addr = address;
> +
> +    if (pt_pci_config_access_check(d, address, len)) {
> +        goto exit;
> +    }
> +
> +    /* check power state transition flags */
> +    if (s->pm_state != NULL && s->pm_state->flags & PT_FLAG_TRANSITING) {
> +        /* can't accept until previous power state transition is completed.
> +         * so finished previous request here.
> +         */
> +        PT_LOG("Warning: guest want to write durring power state transition\n");

during
> +        goto exit;
> +    }
> +
> +    /* find register group entry */
> +    reg_grp_entry = pt_find_reg_grp(s, address);
> +    if (reg_grp_entry) {
> +        /* check 0 Hardwired register group */
> +        if (reg_grp_entry->reg_grp->grp_type == GRP_TYPE_HARDWIRED) {
> +            /* no need to emulate, just return 0 */
> +            val = 0;
> +            goto exit;
> +        }
> +    }
> +
> +    /* read I/O device register value */
> +    rc = host_pci_get_block(s->real_device, address, (uint8_t *)&val, len);
> +    if (!rc) {
> +        PT_LOG("Error: pci_read_block failed. return value[%d].\n", rc);
> +        memset(&val, 0xff, len);
> +    }
> +
> +    /* just return the I/O device register value for
> +     * passthrough type register group */
> +    if (reg_grp_entry == NULL) {
> +        goto exit;
> +    }
> +
> +    /* adjust the read value to appropriate CFC-CFF window */
> +    val <<= (address & 3) << 3;
> +    emul_len = len;
> +
> +    /* loop Guest request size */

Perhaps 'loop around the guest request size' ?

> +    while (emul_len > 0) {
> +        /* find register entry to be emulated */
> +        reg_entry = pt_find_reg(reg_grp_entry, find_addr);
> +        if (reg_entry) {
> +            XenPTRegInfo *reg = reg_entry->reg;
> +            uint32_t real_offset = reg_grp_entry->base_offset + reg->offset;
> +            uint32_t valid_mask = 0xFFFFFFFF >> ((4 - emul_len) << 3);
> +            uint8_t *ptr_val = NULL;
> +
> +            valid_mask <<= (find_addr - real_offset) << 3;
> +            ptr_val = (uint8_t *)&val + (real_offset & 3);
> +
> +            /* do emulation depend on register size */

based on register size

> +            switch (reg->size) {
> +            case 1:
> +                if (reg->u.b.read) {
> +                    rc = reg->u.b.read(s, reg_entry, ptr_val, valid_mask);
> +                }
> +                break;
> +            case 2:
> +                if (reg->u.w.read) {
> +                    rc = reg->u.w.read(s, reg_entry,
> +                                       (uint16_t *)ptr_val, valid_mask);
> +                }
> +                break;
> +            case 4:
> +                if (reg->u.dw.read) {
> +                    rc = reg->u.dw.read(s, reg_entry,
> +                                        (uint32_t *)ptr_val, valid_mask);
> +                }
> +                break;
> +            }
> +
> +            if (rc < 0) {
> +                hw_error("Internal error: Invalid read emulation "
> +                         "return value[%d]. I/O emulator exit.\n", rc);
> +            }
> +
> +            /* calculate next address to find */
> +            emul_len -= reg->size;
> +            if (emul_len > 0) {
> +                find_addr = real_offset + reg->size;
> +            }
> +        } else {
> +            /* nothing to do with passthrough type register,
> +             * continue to find next byte */
> +            emul_len--;
> +            find_addr++;
> +        }
> +    }
> +
> +    /* need to shift back before returning them to pci bus emulator */
> +    val >>= ((address & 3) << 3);
> +
> +exit:
> +    PT_LOG_CONFIG("[%02x:%02x.%x]: address=%04x val=0x%08x len=%d\n",
> +                  pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> +                  address, val, len);
> +    return val;
> +}
> +
> +static void pt_pci_write_config(PCIDevice *d, uint32_t address,
> +                                uint32_t val, int len)
> +{
> +    XenPCIPassthroughState *s = DO_UPCAST(XenPCIPassthroughState, dev, d);
> +    int index = 0;
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    int rc = 0;
> +    uint32_t read_val = 0;
> +    int emul_len = 0;
> +    XenPTReg *reg_entry = NULL;
> +    uint32_t find_addr = address;
> +    XenPTRegInfo *reg = NULL;
> +
> +    if (pt_pci_config_access_check(d, address, len)) {
> +        return;
> +    }
> +
> +    PT_LOG_CONFIG("[%02x:%02x.%x]: address=%04x val=0x%08x len=%d\n",
> +                  pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> +                  address, val, len);
> +
> +    /* check unused BAR register */
> +    index = pt_bar_offset_to_index(address);
> +    if ((index >= 0) && (val > 0 && val < PT_BAR_ALLF) &&
> +        (s->bases[index].bar_flag == PT_BAR_FLAG_UNUSED)) {
> +        PT_LOG("Warning: Guest attempt to set address to unused Base Address "

So.. it is called PT_LOG, but the first thing it says is Warning. So should it be
PT_WARN?

> +               "Register. [%02x:%02x.%x][Offset:%02xh][Length:%d]\n",
> +               pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> +               address, len);
> +    }
> +
> +    /* check power state transition flags */
> +    if (s->pm_state != NULL && s->pm_state->flags & PT_FLAG_TRANSITING) {
> +        /* can't accept untill previous power state transition is completed.

until
> +         * so finished previous request here.

finish
> +         */
> +        PT_LOG("Warning: guest want to write durring power state transition\n");

during
> +        return;
> +    }
> +
> +    /* find register group entry */
> +    reg_grp_entry = pt_find_reg_grp(s, address);
> +    if (reg_grp_entry) {
> +        /* check 0 Hardwired register group */
> +        if (reg_grp_entry->reg_grp->grp_type == GRP_TYPE_HARDWIRED) {
> +            /* ignore silently */
> +            PT_LOG("Warning: Access to 0 Hardwired register. "
> +                   "[%02x:%02x.%x][Offset:%02xh][Length:%d]\n",
> +                   pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> +                   address, len);
> +            return;
> +        }
> +    }
> +
> +    /* read I/O device register value */
> +    rc = host_pci_get_block(s->real_device, address,
> +                             (uint8_t *)&read_val, len);
> +    if (!rc) {
> +        PT_LOG("Error: pci_read_block failed. return value[%d].\n", rc);

There isn't a PT_ERR? Hm, looking at the code there is only PT_LOG. Perhaps
declearing PT_ERR and PT_WARN might be a good idea? In case in the future
one wants different levels of this? Or do we really not care much about that?

> +        memset(&read_val, 0xff, len);
> +    }
> +
> +    /* pass directly to libpci for passthrough type register group */

Um, is the libpci requirement a certain thing?

> +    if (reg_grp_entry == NULL) {
> +        goto out;
> +    }
> +
> +    /* adjust the read and write value to appropriate CFC-CFF window */
> +    read_val <<= (address & 3) << 3;
> +    val <<= (address & 3) << 3;
> +    emul_len = len;
> +
> +    /* loop Guest request size */

loop around what the guest requested..

> +    while (emul_len > 0) {
> +        /* find register entry to be emulated */
> +        reg_entry = pt_find_reg(reg_grp_entry, find_addr);
> +        if (reg_entry) {
> +            reg = reg_entry->reg;
> +            uint32_t real_offset = reg_grp_entry->base_offset + reg->offset;
> +            uint32_t valid_mask = 0xFFFFFFFF >> ((4 - emul_len) << 3);
> +            uint8_t *ptr_val = NULL;
> +
> +            valid_mask <<= (find_addr - real_offset) << 3;
> +            ptr_val = (uint8_t *)&val + (real_offset & 3);
> +
> +            /* do emulation depend on register size */

based 
> +            switch (reg->size) {
> +            case 1:
> +                if (reg->u.b.write) {
> +                    rc = reg->u.b.write(s, reg_entry, ptr_val,
> +                                        read_val >> ((real_offset & 3) << 3),
> +                                        valid_mask);
> +                }
> +                break;
> +            case 2:
> +                if (reg->u.w.write) {
> +                    rc = reg->u.w.write(s, reg_entry, (uint16_t *)ptr_val,
> +                                        (read_val >> ((real_offset & 3) << 3)),
> +                                        valid_mask);
> +                }
> +                break;
> +            case 4:
> +                if (reg->u.dw.write) {
> +                    rc = reg->u.dw.write(s, reg_entry, (uint32_t *)ptr_val,
> +                                         (read_val >> ((real_offset & 3) << 3)),
> +                                         valid_mask);
> +                }
> +                break;
> +            }
> +
> +            if (rc < 0) {
> +                hw_error("Internal error: Invalid write emulation "
> +                         "return value[%d]. I/O emulator exit.\n", rc);

Oh. I hadn't realized this, but you are using hw_error. Which is
calling 'abort'! Yikes. Is there no way to recover from this? Say return 0xfffff?

> +            }
> +
> +            /* calculate next address to find */
> +            emul_len -= reg->size;
> +            if (emul_len > 0) {
> +                find_addr = real_offset + reg->size;
> +            }
> +        } else {
> +            /* nothing to do with passthrough type register,
> +             * continue to find next byte */
> +            emul_len--;
> +            find_addr++;
> +        }
> +    }
> +
> +    /* need to shift back before passing them to libpci */
> +    val >>= (address & 3) << 3;
> +
> +out:
> +    if (!(reg && reg->no_wb)) {
> +        /* unknown regs are passed through */
> +        rc = host_pci_set_block(s->real_device, address, (uint8_t *)&val, len);
> +
> +        if (!rc) {
> +            PT_LOG("Error: pci_write_block failed. return value[%d].\n", rc);
> +        }
> +    }
> +
> +    if (s->pm_state != NULL && s->pm_state->flags & PT_FLAG_TRANSITING) {
> +        qemu_mod_timer(s->pm_state->pm_timer,
> +                       qemu_get_clock_ms(rt_clock) + s->pm_state->pm_delay);
> +    }
> +}
> +
> +/* ioport/iomem space*/
> +static void pt_iomem_map(XenPCIPassthroughState *s, int i,
> +                         pcibus_t e_phys, pcibus_t e_size, int type)
> +{
> +    uint32_t old_ebase = s->bases[i].e_physbase;
> +    bool first_map = s->bases[i].e_size == 0;
> +    int ret = 0;
> +
> +    s->bases[i].e_physbase = e_phys;
> +    s->bases[i].e_size = e_size;
> +
> +    PT_LOG("e_phys=%#"PRIx64" maddr=%#"PRIx64" type=%%d"
> +           " len=%#"PRIx64" index=%d first_map=%d\n",
> +           e_phys, s->bases[i].access.maddr, /*type,*/
> +           e_size, i, first_map);
> +
> +    if (e_size == 0) {
> +        return;
> +    }
> +
> +    if (!first_map && old_ebase != -1) {

old_ebase != PCI_BAR_UNMAPPED ?

> +        /* Remove old mapping */
> +        ret = xc_domain_memory_mapping(xen_xc, xen_domid,
> +                               old_ebase >> XC_PAGE_SHIFT,
> +                               s->bases[i].access.maddr >> XC_PAGE_SHIFT,
> +                               (e_size + XC_PAGE_SIZE - 1) >> XC_PAGE_SHIFT,
> +                               DPCI_REMOVE_MAPPING);
> +        if (ret != 0) {
> +            PT_LOG("Error: remove old mapping failed!\n");
> +            return;
> +        }
> +    }
> +
> +    /* map only valid guest address */
> +    if (e_phys != -1) {

PCI_BAR_UNMAPPED

> +        /* Create new mapping */
> +        ret = xc_domain_memory_mapping(xen_xc, xen_domid,
> +                                   s->bases[i].e_physbase >> XC_PAGE_SHIFT,
> +                                   s->bases[i].access.maddr >> XC_PAGE_SHIFT,
> +                                   (e_size+XC_PAGE_SIZE-1) >> XC_PAGE_SHIFT,
> +                                   DPCI_ADD_MAPPING);
> +
> +        if (ret != 0) {
> +            PT_LOG("Error: create new mapping failed!\n");
> +        }
> +    }
> +}
> +
> +static void pt_ioport_map(XenPCIPassthroughState *s, int i,
> +                          pcibus_t e_phys, pcibus_t e_size, int type)
> +{
> +    uint32_t old_ebase = s->bases[i].e_physbase;
> +    bool first_map = s->bases[i].e_size == 0;
> +    int ret = 0;
> +
> +    s->bases[i].e_physbase = e_phys;
> +    s->bases[i].e_size = e_size;
> +
> +    PT_LOG("e_phys=%#04"PRIx64" pio_base=%#04"PRIx64" len=%"PRId64" index=%d"
> +           " first_map=%d\n",
> +           e_phys, s->bases[i].access.pio_base, e_size, i, first_map);
> +
> +    if (e_size == 0) {
> +        return;
> +    }
> +
> +    if (!first_map && old_ebase != -1) {

PCI_BAR_UNMAPPED
> +        /* Remove old mapping */
> +        ret = xc_domain_ioport_mapping(xen_xc, xen_domid, old_ebase,
> +                                       s->bases[i].access.pio_base, e_size,
> +                                       DPCI_REMOVE_MAPPING);
> +        if (ret != 0) {
> +            PT_LOG("Error: remove old mapping failed!\n");
> +            return;
> +        }
> +    }
> +
> +    /* map only valid guest address (include 0) */
> +    if (e_phys != -1) {
> +        /* Create new mapping */
> +        ret = xc_domain_ioport_mapping(xen_xc, xen_domid, e_phys,
> +                                       s->bases[i].access.pio_base, e_size,
> +                                       DPCI_ADD_MAPPING);
> +        if (ret != 0) {
> +            PT_LOG("Error: create new mapping failed!\n");
> +        }
> +    }
> +
> +}
> +
> +
> +/* mapping BAR */
> +
> +void pt_bar_mapping_one(XenPCIPassthroughState *s, int bar,
> +                        int io_enable, int mem_enable)
> +{
> +    PCIDevice *dev = &s->dev;
> +    PCIIORegion *r;
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    XenPTRegion *base = NULL;
> +    pcibus_t r_size = 0, r_addr = -1;

PCI_BAR_UNMAPPED

> +    int rc = 0;
> +
> +    r = &dev->io_regions[bar];
> +
> +    /* check valid region */
> +    if (!r->size) {
> +        return;
> +    }
> +
> +    base = &s->bases[bar];
> +    /* skip unused BAR or upper 64bit BAR */
> +    if ((base->bar_flag == PT_BAR_FLAG_UNUSED)
> +        || (base->bar_flag == PT_BAR_FLAG_UPPER)) {
> +           return;
> +    }
> +
> +    /* copy region address to temporary */
> +    r_addr = r->addr;
> +
> +    /* need unmapping in case I/O Space or Memory Space disable */
> +    if (((base->bar_flag == PT_BAR_FLAG_IO) && !io_enable) ||
> +        ((base->bar_flag == PT_BAR_FLAG_MEM) && !mem_enable)) {
> +        r_addr = -1;
> +    }
> +    if ((bar == PCI_ROM_SLOT) && (r_addr != -1)) {
> +        reg_grp_entry = pt_find_reg_grp(s, PCI_ROM_ADDRESS);
> +        if (reg_grp_entry) {
> +            reg_entry = pt_find_reg(reg_grp_entry, PCI_ROM_ADDRESS);
> +            if (reg_entry && !(reg_entry->data & PCI_ROM_ADDRESS_ENABLE)) {
> +                r_addr = -1;

PCI_BAR_UNMAPPED

> +            }
> +        }
> +    }
> +
> +    /* prevent guest software mapping memory resource to 00000000h */
> +    if ((base->bar_flag == PT_BAR_FLAG_MEM) && (r_addr == 0)) {
> +        r_addr = -1;
> +    }
> +
> +    r_size = pt_get_emul_size(base->bar_flag, r->size);
> +
> +    rc = pci_check_bar_overlap(dev, r_addr, r_size, r->type);
> +    if (rc > 0) {
> +        PT_LOG("Warning: s[%02x:%02x.%x][Region:%d][Address:%"FMT_PCIBUS"h]"
> +               "[Size:%"FMT_PCIBUS"h] is overlapped.\n", pci_bus_num(dev->bus),
> +               PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn), bar,
> +               r_addr, r_size);
> +    }
> +
> +    /* check whether we need to update the mapping or not */
> +    if (r_addr != s->bases[bar].e_physbase) {
> +        /* mapping BAR */
> +        if (base->bar_flag == PT_BAR_FLAG_IO) {
> +            pt_ioport_map(s, bar, r_addr, r_size, r->type);
> +        } else {
> +            pt_iomem_map(s, bar, r_addr, r_size, r->type);
> +        }
> +    }
> +}
> +
> +void pt_bar_mapping(XenPCIPassthroughState *s, int io_enable, int mem_enable)
> +{
> +    int i;
> +
> +    for (i = 0; i < PCI_NUM_REGIONS; i++) {
> +        pt_bar_mapping_one(s, i, io_enable, mem_enable);
> +    }
> +}
> +
> +/* register regions */
> +static int pt_register_regions(XenPCIPassthroughState *s)
> +{
> +    int i = 0;
> +    uint32_t bar_data = 0;
> +    HostPCIDevice *d = s->real_device;
> +
> +    /* Register PIO/MMIO BARs */
> +    for (i = 0; i < PCI_BAR_ENTRIES; i++) {
> +        HostPCIIORegion *r = &d->io_regions[i];
> +
> +        if (r->base_addr) {

So should you check for PCI_BAR_UNMAPPED or is that not really
required here as the pci_register_bar would do it?

> +            s->bases[i].e_physbase = r->base_addr;
> +            s->bases[i].access.u = r->base_addr;
> +
> +            /* Register current region */
> +            if (r->flags & IORESOURCE_IO) {
> +                memory_region_init_io(&s->bar[i], NULL, NULL,
> +                                      "xen-pci-pt-bar", r->size);

You can make the "xen_pci-pt-bar" be a #define somewhere and reuse that.

> +                pci_register_bar(&s->dev, i, PCI_BASE_ADDRESS_SPACE_IO,
> +                                 &s->bar[i]);
> +            } else if (r->flags & IORESOURCE_PREFETCH) {
> +                memory_region_init_io(&s->bar[i], NULL, NULL,
> +                                      "xen-pci-pt-bar", r->size);
> +                pci_register_bar(&s->dev, i, PCI_BASE_ADDRESS_MEM_PREFETCH,
> +                                 &s->bar[i]);
> +            } else {
> +                memory_region_init_io(&s->bar[i], NULL, NULL,
> +                                      "xen-pci-pt-bar", r->size);
> +                pci_register_bar(&s->dev, i, PCI_BASE_ADDRESS_SPACE_MEMORY,
> +                                 &s->bar[i]);
> +            }
> +
> +            PT_LOG("IO region registered (size=0x%08"PRIx64
> +                   " base_addr=0x%08"PRIx64")\n",
> +                   r->size, r->base_addr);
> +        }
> +    }
> +
> +    /* Register expansion ROM address */
> +    if (d->rom.base_addr && d->rom.size) {
> +        /* Re-set BAR reported by OS, otherwise ROM can't be read. */
> +        bar_data = host_pci_get_long(d, PCI_ROM_ADDRESS);
> +        if ((bar_data & PCI_ROM_ADDRESS_MASK) == 0) {
> +            bar_data |= d->rom.base_addr & PCI_ROM_ADDRESS_MASK;
> +            host_pci_set_long(d, PCI_ROM_ADDRESS, bar_data);
> +        }
> +
> +        s->bases[PCI_ROM_SLOT].e_physbase = d->rom.base_addr;
> +        s->bases[PCI_ROM_SLOT].access.maddr = d->rom.base_addr;
> +
> +        memory_region_init_rom_device(&s->rom, NULL, NULL, &s->dev.qdev,
> +                                      "xen-pci-pt-rom", d->rom.size);
> +        pci_register_bar(&s->dev, PCI_ROM_SLOT, PCI_BASE_ADDRESS_MEM_PREFETCH,
> +                         &s->rom);
> +
> +        PT_LOG("Expansion ROM registered (size=0x%08"PRIx64
> +               " base_addr=0x%08"PRIx64")\n",
> +               d->rom.size, d->rom.base_addr);
> +    }
> +
> +    return 0;
> +}
> +
> +static void pt_unregister_regions(XenPCIPassthroughState *s)
> +{
> +    int i, type, rc;
> +    uint32_t e_size;
> +    PCIDevice *d = &s->dev;
> +
> +    for (i = 0; i < PCI_NUM_REGIONS; i++) {
> +        e_size = s->bases[i].e_size;
> +        if ((e_size == 0) || (s->bases[i].e_physbase == -1)) {
> +            continue;
> +        }
> +
> +        type = d->io_regions[i].type;
> +
> +        if (type == PCI_BASE_ADDRESS_SPACE_MEMORY
> +            || type == PCI_BASE_ADDRESS_MEM_PREFETCH) {
> +            rc = xc_domain_memory_mapping(xen_xc, xen_domid,
> +                    s->bases[i].e_physbase >> XC_PAGE_SHIFT,
> +                    s->bases[i].access.maddr >> XC_PAGE_SHIFT,
> +                    (e_size+XC_PAGE_SIZE-1) >> XC_PAGE_SHIFT,
> +                    DPCI_REMOVE_MAPPING);
> +            if (rc != 0) {
> +                PT_LOG("Error: remove old mem mapping failed!\n");
> +                continue;
> +            }
> +
> +        } else if (type == PCI_BASE_ADDRESS_SPACE_IO) {
> +            rc = xc_domain_ioport_mapping(xen_xc, xen_domid,
> +                        s->bases[i].e_physbase,
> +                        s->bases[i].access.pio_base,
> +                        e_size,
> +                        DPCI_REMOVE_MAPPING);
> +            if (rc != 0) {
> +                PT_LOG("Error: remove old io mapping failed!\n");
> +                continue;
> +            }
> +        }
> +    }
> +}
> +
> +static int pt_initfn(PCIDevice *pcidev)
> +{
> +    XenPCIPassthroughState *s = DO_UPCAST(XenPCIPassthroughState, dev, pcidev);
> +    int dom, bus;
> +    unsigned slot, func;
> +    int rc = 0;
> +    uint32_t machine_irq;
> +    int pirq = -1;
> +
> +    if (pci_parse_devaddr(s->hostaddr, &dom, &bus, &slot, &func) < 0) {
> +        fprintf(stderr, "error parse bdf: %s\n", s->hostaddr);
> +        return -1;
> +    }
> +
> +    /* register real device */
> +    PT_LOG("Assigning real physical device %02x:%02x.%x to devfn %i ...\n",
> +           bus, slot, func, s->dev.devfn);
> +
> +    s->real_device = host_pci_device_get(bus, slot, func);
> +    if (!s->real_device) {
> +        return -1;
> +    }
> +
> +    s->is_virtfn = s->real_device->is_virtfn;
> +    if (s->is_virtfn) {
> +        PT_LOG("%04x:%02x:%02x.%x is a SR-IOV Virtual Function\n",
> +               s->real_device->domain, bus, slot, func);
> +    }
> +
> +    /* Initialize virtualized PCI configuration (Extended 256 Bytes) */
> +    if (host_pci_get_block(s->real_device, 0, pcidev->config,
> +                           PCI_CONFIG_SPACE_SIZE) == -1) {
> +        return -1;
> +    }
> +
> +    /* Handle real device's MMIO/PIO BARs */
> +    pt_register_regions(s);
> +
> +    /* reinitialize each config register to be emulated */
> +    pt_config_init(s);
> +
> +    /* Bind interrupt */
> +    if (!s->dev.config[PCI_INTERRUPT_PIN]) {
> +        PT_LOG("no pin interrupt\n");

Perhaps include some details of which device failed?

> +        goto out;
> +    }
> +
> +    machine_irq = host_pci_get_byte(s->real_device, PCI_INTERRUPT_LINE);
> +    rc = xc_physdev_map_pirq(xen_xc, xen_domid, machine_irq, &pirq);
> +
> +    if (rc) {
> +        PT_LOG("Error: Mapping irq failed, rc = %d\n", rc);

Can you also include the IRQ it tried to map (both machine and pirq).

> +
> +        /* Disable PCI intx assertion (turn on bit10 of devctl) */
> +        host_pci_set_word(s->real_device,
> +                          PCI_COMMAND,
> +                          pci_get_word(s->dev.config + PCI_COMMAND)
> +                          | PCI_COMMAND_INTX_DISABLE);
> +        machine_irq = 0;
> +        s->machine_irq = 0;
> +    } else {
> +        machine_irq = pirq;
> +        s->machine_irq = pirq;
> +        mapped_machine_irq[machine_irq]++;
> +    }
> +
> +    /* bind machine_irq to device */
> +    if (rc < 0 && machine_irq != 0) {
> +        uint8_t e_device = PCI_SLOT(s->dev.devfn);
> +        uint8_t e_intx = pci_intx(s);
> +
> +        rc = xc_domain_bind_pt_pci_irq(xen_xc, xen_domid, machine_irq, 0,
> +                                       e_device, e_intx);
> +        if (rc < 0) {
> +            PT_LOG("Error: Binding of interrupt failed! rc=%d\n", rc);

A bit details - name of the device, the IRQ,..

> +
> +            /* Disable PCI intx assertion (turn on bit10 of devctl) */
> +            host_pci_set_word(s->real_device, PCI_COMMAND,
> +                              *(uint16_t *)(&s->dev.config[PCI_COMMAND])
> +                              | PCI_COMMAND_INTX_DISABLE);
> +            mapped_machine_irq[machine_irq]--;
> +
> +            if (mapped_machine_irq[machine_irq] == 0) {
> +                if (xc_physdev_unmap_pirq(xen_xc, xen_domid, machine_irq)) {
> +                    PT_LOG("Error: Unmapping of interrupt failed! rc=%d\n",
> +                           rc);

And here too. It would be beneficial to have on the error paths lots of 
nice details so that in the field it will be easier to find out what
went wrong (and match up PIRQ with the GSI).


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 13:55:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 13:55:15 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROcaZ-0006Wr-7v; Thu, 10 Nov 2011 13:55:15 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROcZb-0006KO-IG
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 13:54:16 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1320962026!51774784!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32438 invoked from network); 10 Nov 2011 21:53:47 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-8.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 21:53:47 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAALs2Rm020937
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 10 Nov 2011 21:54:03 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAALs0BA027501
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 10 Nov 2011 21:54:01 GMT
Received: from abhmt113.oracle.com (abhmt113.oracle.com [141.146.116.65])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAALrtwB026456; Thu, 10 Nov 2011 15:53:55 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 10 Nov 2011 13:53:54 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 9B277819F2; Thu, 10 Nov 2011 16:53:53 -0500 (EST)
Date: Thu, 10 Nov 2011 16:53:53 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Subject: Re: [Xen-devel] [PATCH V3 08/10] Introduce Xen PCI Passthrough, PCI
	config space helpers (2/3)
Message-ID: <20111110215353.GA23837@phenom.dumpdata.com>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-9-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319814456-8158-9-git-send-email-anthony.perard@citrix.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090201.4EBC47FC.007A,ss=1,re=-6.500,fgs=0
Cc: Guy Zana <guy@neocleus.com>, Xen Devel <xen-devel@lists.xensource.com>,
	Allen Kay <allen.m.kay@intel.com>, QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, Oct 28, 2011 at 04:07:34PM +0100, Anthony PERARD wrote:
> From: Allen Kay <allen.m.kay@intel.com>
> 
> Signed-off-by: Allen Kay <allen.m.kay@intel.com>
> Signed-off-by: Guy Zana <guy@neocleus.com>
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  Makefile.target                      |    1 +
>  hw/xen_pci_passthrough.h             |    2 +
>  hw/xen_pci_passthrough_config_init.c | 2068 ++++++++++++++++++++++++++++++++++
>  3 files changed, 2071 insertions(+), 0 deletions(-)
>  create mode 100644 hw/xen_pci_passthrough_config_init.c
> 
> diff --git a/Makefile.target b/Makefile.target
> index 36ea47d..c32c688 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -219,6 +219,7 @@ obj-i386-$(CONFIG_XEN) += xen_platform.o
>  obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += host-pci-device.o
>  obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pci_passthrough.o
>  obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pci_passthrough_helpers.o
> +obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pci_passthrough_config_init.o
>  
>  # Inter-VM PCI shared memory
>  CONFIG_IVSHMEM =
> diff --git a/hw/xen_pci_passthrough.h b/hw/xen_pci_passthrough.h
> index 2d1979d..ebc04fd 100644
> --- a/hw/xen_pci_passthrough.h
> +++ b/hw/xen_pci_passthrough.h
> @@ -61,6 +61,8 @@ typedef int (*conf_byte_restore)
>  /* power state transition */
>  #define PT_FLAG_TRANSITING 0x0001
>  
> +#define PT_BAR_ALLF        0xFFFFFFFF  /* BAR ALLF value */
> +
>  
>  typedef enum {
>      GRP_TYPE_HARDWIRED = 0,                     /* 0 Hardwired reg group */
> diff --git a/hw/xen_pci_passthrough_config_init.c b/hw/xen_pci_passthrough_config_init.c
> new file mode 100644
> index 0000000..4103b59
> --- /dev/null
> +++ b/hw/xen_pci_passthrough_config_init.c
> @@ -0,0 +1,2068 @@
> +/*
> + * Copyright (c) 2007, Neocleus Corporation.
> + * Copyright (c) 2007, Intel Corporation.
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2.  See
> + * the COPYING file in the top-level directory.
> + *
> + * Alex Novik <alex@neocleus.com>
> + * Allen Kay <allen.m.kay@intel.com>
> + * Guy Zana <guy@neocleus.com>
> + *
> + * This file implements direct PCI assignment to a HVM guest
> + */
> +
> +#include "qemu-timer.h"
> +#include "xen_backend.h"
> +#include "xen_pci_passthrough.h"
> +
> +#define PT_MERGE_VALUE(value, data, val_mask) \
> +    (((value) & (val_mask)) | ((data) & ~(val_mask)))
> +
> +#define PT_INVALID_REG          0xFFFFFFFF      /* invalid register value */
> +
> +/* prototype */
> +
> +static uint32_t pt_ptr_reg_init(XenPCIPassthroughState *s, XenPTRegInfo *reg,
> +                                uint32_t real_offset);
> +static int pt_init_pci_config(XenPCIPassthroughState *s);
> +
> +
> +/* helper */
> +
> +/* A return value of 1 means the capability should NOT be exposed to guest. */
> +static int pt_hide_dev_cap(const HostPCIDevice *d, uint8_t grp_id)
> +{
> +    switch (grp_id) {
> +    case PCI_CAP_ID_EXP:
> +        /* The PCI Express Capability Structure of the VF of Intel 82599 10GbE
> +         * Controller looks trivial, e.g., the PCI Express Capabilities
> +         * Register is 0. We should not try to expose it to guest.

Why not?
> +         */
> +        if (d->vendor_id == PCI_VENDOR_ID_INTEL &&
> +                d->device_id == PCI_DEVICE_ID_INTEL_82599_VF) {
> +            return 1;
> +        }
> +        break;
> +    }
> +    return 0;
> +}
> +
> +/*   find emulate register group entry */
> +XenPTRegGroup *pt_find_reg_grp(XenPCIPassthroughState *s, uint32_t address)
> +{
> +    XenPTRegGroup *entry = NULL;
> +
> +    /* find register group entry */
> +    QLIST_FOREACH(entry, &s->reg_grp_tbl, entries) {
> +        /* check address */
> +        if ((entry->base_offset <= address)
> +            && ((entry->base_offset + entry->size) > address)) {
> +            return entry;
> +        }
> +    }
> +
> +    /* group entry not found */
> +    return NULL;
> +}
> +
> +/* find emulate register entry */
> +XenPTReg *pt_find_reg(XenPTRegGroup *reg_grp, uint32_t address)
> +{
> +    XenPTReg *reg_entry = NULL;
> +    XenPTRegInfo *reg = NULL;
> +    uint32_t real_offset = 0;
> +
> +    /* find register entry */
> +    QLIST_FOREACH(reg_entry, &reg_grp->reg_tbl_list, entries) {
> +        reg = reg_entry->reg;
> +        real_offset = reg_grp->base_offset + reg->offset;
> +        /* check address */
> +        if ((real_offset <= address)
> +            && ((real_offset + reg->size) > address)) {
> +            return reg_entry;
> +        }
> +    }
> +
> +    return NULL;
> +}
> +
> +/* parse BAR */
> +static PTBarFlag pt_bar_reg_parse(XenPCIPassthroughState *s, XenPTRegInfo *reg)
> +{
> +    PCIDevice *d = &s->dev;
> +    XenPTRegion *region = NULL;
> +    PCIIORegion *r;
> +    int index = 0;
> +
> +    /* check 64bit BAR */
> +    index = pt_bar_offset_to_index(reg->offset);
> +    if ((0 < index) && (index < PCI_ROM_SLOT)) {

This is  a bit confusing. Can you make the index be on the same
side, like

if ((0 < index) && (PCI_ROM_SLOT > index)

or better:

if ((index < 0) && (index < PCI_ROM_SLOT))

um, which looks wrong. Should it be 'index > 0' ?

> +        int flags = s->real_device->io_regions[index - 1].flags;

Do we want to check the index - 1 to make sure it is not negative?

> +
> +        if ((flags & IORESOURCE_MEM) && (flags & IORESOURCE_MEM_64)) {
> +            region = &s->bases[index - 1];
> +            if (region->bar_flag != PT_BAR_FLAG_UPPER) {
> +                return PT_BAR_FLAG_UPPER;
> +            }
> +        }
> +    }
> +
> +    /* check unused BAR */
> +    r = &d->io_regions[index];
> +    if (r->size == 0) {
> +        return PT_BAR_FLAG_UNUSED;
> +    }
> +
> +    /* for ExpROM BAR */
> +    if (index == PCI_ROM_SLOT) {
> +        return PT_BAR_FLAG_MEM;
> +    }
> +
> +    /* check BAR I/O indicator */
> +    if (s->real_device->io_regions[index].flags & IORESOURCE_IO) {
> +        return PT_BAR_FLAG_IO;
> +    } else {
> +        return PT_BAR_FLAG_MEM;
> +    }
> +}
> +
> +
> +/****************
> + * general register functions
> + */
> +
> +/* register initialization function */
> +
> +static uint32_t pt_common_reg_init(XenPCIPassthroughState *s,
> +                                   XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    return reg->init_val;
> +}
> +
> +/* Read register functions */
> +
> +static int pt_byte_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                            uint8_t *value, uint8_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint8_t valid_emu_mask = 0;
> +
> +    /* emulate byte register */
> +    valid_emu_mask = reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);
> +
> +    return 0;
> +}
> +static int pt_word_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                            uint16_t *value, uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint16_t valid_emu_mask = 0;
> +
> +    /* emulate word register */
> +    valid_emu_mask = reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);
> +
> +    return 0;
> +}
> +static int pt_long_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                            uint32_t *value, uint32_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint32_t valid_emu_mask = 0;
> +
> +    /* emulate long register */
> +    valid_emu_mask = reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);
> +
> +   return 0;
> +}
> +
> +/* Write register functions */
> +
> +static int pt_byte_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                             uint8_t *value, uint8_t dev_value,
> +                             uint8_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint8_t writable_mask = 0;
> +    uint8_t throughable_mask = 0;
> +
> +    /* modify emulate register */
> +    writable_mask = reg->emu_mask & ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    return 0;
> +}
> +static int pt_word_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                             uint16_t *value, uint16_t dev_value,
> +                             uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint16_t writable_mask = 0;
> +    uint16_t throughable_mask = 0;
> +
> +    /* modify emulate register */
> +    writable_mask = reg->emu_mask & ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    return 0;
> +}
> +static int pt_long_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                             uint32_t *value, uint32_t dev_value,
> +                             uint32_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint32_t writable_mask = 0;
> +    uint32_t throughable_mask = 0;
> +
> +    /* modify emulate register */
> +    writable_mask = reg->emu_mask & ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    return 0;
> +}
> +
> +/* common restore register fonctions */
> +static int pt_byte_reg_restore(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                               uint32_t real_offset, uint8_t dev_value,
> +                               uint8_t *value)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    PCIDevice *d = &s->dev;
> +
> +    /* use I/O device register's value as restore value */
> +    *value = pci_get_byte(d->config + real_offset);
> +
> +    /* create value for restoring to I/O device register */
> +    *value = PT_MERGE_VALUE(*value, dev_value, reg->emu_mask);
> +
> +    return 0;
> +}
> +static int pt_word_reg_restore(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                               uint32_t real_offset, uint16_t dev_value,
> +                               uint16_t *value)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    PCIDevice *d = &s->dev;
> +
> +    /* use I/O device register's value as restore value */
> +    *value = pci_get_word(d->config + real_offset);
> +
> +    /* create value for restoring to I/O device register */
> +    *value = PT_MERGE_VALUE(*value, dev_value, reg->emu_mask);
> +
> +    return 0;
> +}
> +
> +
> +/* XenPTRegInfo declaration
> + * - only for emulated register (either a part or whole bit).
> + * - for passthrough register that need special behavior (like interacting with
> + *   other component), set emu_mask to all 0 and specify r/w func properly.
> + * - do NOT use ALL F for init_val, otherwise the tbl will not be registered.
> + */
> +
> +/********************
> + * Header Type0
> + */
> +
> +static uint32_t pt_vendor_reg_init(XenPCIPassthroughState *s,
> +                                   XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    return s->real_device->vendor_id;
> +}
> +static uint32_t pt_device_reg_init(XenPCIPassthroughState *s,
> +                                   XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    return s->real_device->device_id;
> +}
> +static uint32_t pt_status_reg_init(XenPCIPassthroughState *s,
> +                                   XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    int reg_field = 0;
> +
> +    /* find Header register group */
> +    reg_grp_entry = pt_find_reg_grp(s, PCI_CAPABILITY_LIST);
> +    if (reg_grp_entry) {
> +        /* find Capabilities Pointer register */
> +        reg_entry = pt_find_reg(reg_grp_entry, PCI_CAPABILITY_LIST);
> +        if (reg_entry) {
> +            /* check Capabilities Pointer register */
> +            if (reg_entry->data) {
> +                reg_field |= PCI_STATUS_CAP_LIST;
> +            } else {
> +                reg_field &= ~PCI_STATUS_CAP_LIST;
> +            }
> +        } else {
> +            hw_error("Internal error: Couldn't find pt_reg_tbl for "
> +                     "Capabilities Pointer register. I/O emulator exit.\n");

Yikes. abort here? Um, can we just return a fault code instead?

> +        }
> +    } else {
> +        hw_error("Internal error: Couldn't find pt_reg_grp_tbl for Header. "
> +                 "I/O emulator exit.\n");
> +    }
> +
> +    return reg_field;
> +}
> +static uint32_t pt_header_type_reg_init(XenPCIPassthroughState *s,
> +                                        XenPTRegInfo *reg,
> +                                        uint32_t real_offset)
> +{
> +    /* read PCI_HEADER_TYPE */
> +    return reg->init_val | 0x80;
> +}
> +
> +/* initialize Interrupt Pin register */
> +static uint32_t pt_irqpin_reg_init(XenPCIPassthroughState *s,
> +                                   XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    return pci_read_intx(s);
> +}
> +
> +/* Command register */
> +static int pt_cmd_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                           uint16_t *value, uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint16_t valid_emu_mask = 0;
> +    uint16_t emu_mask = reg->emu_mask;
> +
> +    if (s->is_virtfn) {
> +        emu_mask |= PCI_COMMAND_MEMORY;
> +    }
> +
> +    /* emulate word register */
> +    valid_emu_mask = emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);
> +
> +    return 0;
> +}
> +static int pt_cmd_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                            uint16_t *value, uint16_t dev_value,
> +                            uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint16_t writable_mask = 0;
> +    uint16_t throughable_mask = 0;
> +    uint16_t wr_value = *value;
> +    uint16_t emu_mask = reg->emu_mask;
> +
> +    if (s->is_virtfn) {
> +        emu_mask |= PCI_COMMAND_MEMORY;
> +    }
> +
> +    /* modify emulate register */
> +    writable_mask = ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~emu_mask & valid_mask;
> +
> +    if (*value & PCI_COMMAND_INTX_DISABLE) {
> +        throughable_mask |= PCI_COMMAND_INTX_DISABLE;
> +    } else {
> +        if (s->machine_irq) {
> +            throughable_mask |= PCI_COMMAND_INTX_DISABLE;
> +        }
> +    }
> +
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    /* mapping BAR */
> +    pt_bar_mapping(s, wr_value & PCI_COMMAND_IO,
> +                   wr_value & PCI_COMMAND_MEMORY);
> +
> +    return 0;
> +}
> +static int pt_cmd_reg_restore(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                              uint32_t real_offset, uint16_t dev_value,
> +                              uint16_t *value)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    PCIDevice *d = &s->dev;
> +    uint16_t restorable_mask = 0;
> +
> +    /* use I/O device register's value as restore value */
> +    *value = pci_get_word(d->config + real_offset);
> +
> +    /* create value for restoring to I/O device register
> +     * but do not include Fast Back-to-Back Enable bit.
> +     */
> +    restorable_mask = reg->emu_mask & ~PCI_COMMAND_FAST_BACK;
> +    *value = PT_MERGE_VALUE(*value, dev_value, restorable_mask);
> +
> +    if (!s->machine_irq) {
> +        *value |= PCI_COMMAND_INTX_DISABLE;
> +    } else {
> +        *value &= ~PCI_COMMAND_INTX_DISABLE;
> +    }
> +
> +    return 0;
> +}
> +
> +/* BAR */
> +#define PT_BAR_MEM_RO_MASK      0x0000000F      /* BAR ReadOnly mask(Memory) */
> +#define PT_BAR_MEM_EMU_MASK     0xFFFFFFF0      /* BAR emul mask(Memory) */
> +#define PT_BAR_IO_RO_MASK       0x00000003      /* BAR ReadOnly mask(I/O) */
> +#define PT_BAR_IO_EMU_MASK      0xFFFFFFFC      /* BAR emul mask(I/O) */
> +
> +static inline uint32_t base_address_with_flags(HostPCIIORegion *hr)
> +{
> +    if ((hr->flags & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) {
> +        return hr->base_addr | (hr->flags & ~PCI_BASE_ADDRESS_IO_MASK);
> +    } else {
> +        return hr->base_addr | (hr->flags & ~PCI_BASE_ADDRESS_MEM_MASK);
> +    }
> +}
> +
> +static uint32_t pt_bar_reg_init(XenPCIPassthroughState *s, XenPTRegInfo *reg,
> +                                uint32_t real_offset)
> +{
> +    int reg_field = 0;
> +    int index;
> +
> +    /* get BAR index */
> +    index = pt_bar_offset_to_index(reg->offset);
> +    if (index < 0) {
> +        hw_error("Internal error: Invalid BAR index[%d]. "
> +                 "I/O emulator exit.\n", index);
> +    }
> +
> +    /* set initial guest physical base address to -1 */
> +    s->bases[index].e_physbase = -1;

Um, use that define PCI_.. something macro.
> +
> +    /* set BAR flag */
> +    s->bases[index].bar_flag = pt_bar_reg_parse(s, reg);
> +    if (s->bases[index].bar_flag == PT_BAR_FLAG_UNUSED) {
> +        reg_field = PT_INVALID_REG;
> +    }
> +
> +    return reg_field;
> +}
> +static int pt_bar_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                           uint32_t *value, uint32_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint32_t valid_emu_mask = 0;
> +    uint32_t bar_emu_mask = 0;
> +    int index;
> +
> +    /* get BAR index */
> +    index = pt_bar_offset_to_index(reg->offset);
> +    if (index < 0) {
> +        hw_error("Internal error: Invalid BAR index[%d]. "
> +                 "I/O emulator exit.\n", index);
> +    }
> +
> +    /* use fixed-up value from kernel sysfs */
> +    *value = base_address_with_flags(&s->real_device->io_regions[index]);
> +
> +    /* set emulate mask depend on BAR flag */
> +    switch (s->bases[index].bar_flag) {
> +    case PT_BAR_FLAG_MEM:
> +        bar_emu_mask = PT_BAR_MEM_EMU_MASK;
> +        break;
> +    case PT_BAR_FLAG_IO:
> +        bar_emu_mask = PT_BAR_IO_EMU_MASK;
> +        break;
> +    case PT_BAR_FLAG_UPPER:
> +        bar_emu_mask = PT_BAR_ALLF;
> +        break;
> +    default:
> +        break;
> +    }
> +
> +    /* emulate BAR */
> +    valid_emu_mask = bar_emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);
> +
> +   return 0;
> +}
> +static int pt_bar_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                            uint32_t *value, uint32_t dev_value,
> +                            uint32_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    XenPTRegion *base = NULL;
> +    PCIDevice *d = &s->dev;
> +    PCIIORegion *r;
> +    uint32_t writable_mask = 0;
> +    uint32_t throughable_mask = 0;
> +    uint32_t bar_emu_mask = 0;
> +    uint32_t bar_ro_mask = 0;
> +    uint32_t new_addr, last_addr;
> +    uint32_t prev_offset;
> +    uint32_t r_size = 0;
> +    int index = 0;
> +
> +    /* get BAR index */
> +    index = pt_bar_offset_to_index(reg->offset);
> +    if (index < 0) {
> +        hw_error("Internal error: Invalid BAR index[%d]. "
> +                 "I/O emulator exit.\n", index);
> +    }
> +
> +    r = &d->io_regions[index];
> +    base = &s->bases[index];
> +    r_size = pt_get_emul_size(base->bar_flag, r->size);
> +
> +    /* set emulate mask and read-only mask depend on BAR flag */
> +    switch (s->bases[index].bar_flag) {
> +    case PT_BAR_FLAG_MEM:
> +        bar_emu_mask = PT_BAR_MEM_EMU_MASK;
> +        bar_ro_mask = PT_BAR_MEM_RO_MASK | (r_size - 1);
> +        break;
> +    case PT_BAR_FLAG_IO:
> +        bar_emu_mask = PT_BAR_IO_EMU_MASK;
> +        bar_ro_mask = PT_BAR_IO_RO_MASK | (r_size - 1);
> +        break;
> +    case PT_BAR_FLAG_UPPER:
> +        bar_emu_mask = PT_BAR_ALLF;
> +        bar_ro_mask = 0;    /* all upper 32bit are R/W */
> +        break;
> +    default:
> +        break;
> +    }
> +
> +    /* modify emulate register */
> +    writable_mask = bar_emu_mask & ~bar_ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* check whether we need to update the virtual region address or not */
> +    switch (s->bases[index].bar_flag) {
> +    case PT_BAR_FLAG_MEM:
> +        /* nothing to do */
> +        break;
> +    case PT_BAR_FLAG_IO:
> +        new_addr = cfg_entry->data;
> +        last_addr = new_addr + r_size - 1;
> +        /* check invalid address */
> +        if (last_addr <= new_addr || !new_addr || last_addr >= 0x10000) {

Make a #define for 0x10000.. 

> +            /* check 64K range */
> +            if ((last_addr >= 0x10000) &&
> +                (cfg_entry->data != (PT_BAR_ALLF & ~bar_ro_mask))) {
> +                PT_LOG("Warning: Guest attempt to set Base Address "
> +                       "over the 64KB. [%02x:%02x.%x][Offset:%02xh]"
> +                       "[Address:%08xh][Size:%08xh]\n",
> +                       pci_bus_num(d->bus), PCI_SLOT(d->devfn),
> +                       PCI_FUNC(d->devfn),
> +                       reg->offset, new_addr, r_size);
> +            }
> +            /* just remove mapping */
> +            r->addr = -1;
> +            goto exit;
> +        }
> +        break;
> +    case PT_BAR_FLAG_UPPER:
> +        if (cfg_entry->data) {
> +            if (cfg_entry->data != (PT_BAR_ALLF & ~bar_ro_mask)) {
> +                PT_LOG("Warning: Guest attempt to set high MMIO Base Address. "
> +                       "Ignore mapping. "
> +                       "[%02x:%02x.%x][Offset:%02xh][High Address:%08xh]\n",
> +                       pci_bus_num(d->bus), PCI_SLOT(d->devfn),
> +                       PCI_FUNC(d->devfn), reg->offset, cfg_entry->data);
> +            }
> +            /* clear lower address */
> +            d->io_regions[index-1].addr = -1;
> +        } else {
> +            /* find lower 32bit BAR */
> +            prev_offset = (reg->offset - 4);
> +            reg_grp_entry = pt_find_reg_grp(s, prev_offset);
> +            if (reg_grp_entry) {
> +                reg_entry = pt_find_reg(reg_grp_entry, prev_offset);
> +                if (reg_entry) {
> +                    /* restore lower address */
> +                    d->io_regions[index-1].addr = reg_entry->data;
> +                } else {
> +                    return -1;
> +                }
> +            } else {
> +                return -1;
> +            }
> +        }
> +
> +        /* never mapping the 'empty' upper region,
> +         * because we'll do it enough for the lower region.
> +         */
> +        r->addr = -1;
> +        goto exit;
> +    default:
> +        break;
> +    }
> +
> +    /* update the corresponding virtual region address */
> +    /*
> +     * When guest code tries to get block size of mmio, it will write all "1"s
> +     * into pci bar register. In this case, cfg_entry->data == writable_mask.
> +     * Especially for devices with large mmio, the value of writable_mask
> +     * is likely to be a guest physical address that has been mapped to ram
> +     * rather than mmio. Remapping this value to mmio should be prevented.
> +     */
> +
> +    if (cfg_entry->data != writable_mask) {
> +        r->addr = cfg_entry->data;
> +    }
> +
> +exit:
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~bar_emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    /* After BAR reg update, we need to remap BAR */
> +    reg_grp_entry = pt_find_reg_grp(s, PCI_COMMAND);
> +    if (reg_grp_entry) {
> +        reg_entry = pt_find_reg(reg_grp_entry, PCI_COMMAND);
> +        if (reg_entry) {
> +            pt_bar_mapping_one(s, index, reg_entry->data & PCI_COMMAND_IO,
> +                               reg_entry->data & PCI_COMMAND_MEMORY);
> +        }
> +    }
> +
> +    return 0;
> +}
> +static int pt_bar_reg_restore(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                              uint32_t real_offset, uint32_t dev_value,
> +                              uint32_t *value)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint32_t bar_emu_mask = 0;
> +    int index = 0;
> +
> +    /* get BAR index */
> +    index = pt_bar_offset_to_index(reg->offset);
> +    if (index < 0) {
> +        hw_error("Internal error: Invalid BAR index[%d]. "
> +                 "I/O emulator exit.\n", index);
> +    }
> +
> +    /* use value from kernel sysfs */
> +    if (s->bases[index].bar_flag == PT_BAR_FLAG_UPPER) {
> +        *value = s->real_device->io_regions[index - 1].base_addr >> 32;
> +    } else {
> +        *value = base_address_with_flags(&s->real_device->io_regions[index]);
> +    }
> +
> +    /* set emulate mask depend on BAR flag */
> +    switch (s->bases[index].bar_flag) {
> +    case PT_BAR_FLAG_MEM:
> +        bar_emu_mask = PT_BAR_MEM_EMU_MASK;
> +        break;
> +    case PT_BAR_FLAG_IO:
> +        bar_emu_mask = PT_BAR_IO_EMU_MASK;
> +        break;
> +    case PT_BAR_FLAG_UPPER:
> +        bar_emu_mask = PT_BAR_ALLF;
> +        break;
> +    default:
> +        break;
> +    }
> +
> +    /* create value for restoring to I/O device register */
> +    *value = PT_MERGE_VALUE(*value, dev_value, bar_emu_mask);
> +
> +    return 0;
> +}
> +
> +/* write Exp ROM BAR */
> +static int pt_exp_rom_bar_reg_write(XenPCIPassthroughState *s,
> +                                    XenPTReg *cfg_entry, uint32_t *value,
> +                                    uint32_t dev_value, uint32_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    XenPTRegion *base = NULL;
> +    PCIDevice *d = (PCIDevice *)&s->dev;
> +    PCIIORegion *r;
> +    uint32_t writable_mask = 0;
> +    uint32_t throughable_mask = 0;
> +    pcibus_t r_size = 0;
> +    uint32_t bar_emu_mask = 0;
> +    uint32_t bar_ro_mask = 0;
> +
> +    r = &d->io_regions[PCI_ROM_SLOT];
> +    r_size = r->size;
> +    base = &s->bases[PCI_ROM_SLOT];
> +    /* align memory type resource size */
> +    pt_get_emul_size(base->bar_flag, r_size);
> +
> +    /* set emulate mask and read-only mask */
> +    bar_emu_mask = reg->emu_mask;
> +    bar_ro_mask = (reg->ro_mask | (r_size - 1)) & ~PCI_ROM_ADDRESS_ENABLE;
> +
> +    /* modify emulate register */
> +    writable_mask = ~bar_ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* update the corresponding virtual region address */
> +    /*
> +     * When guest code tries to get block size of mmio, it will write all "1"s
> +     * into pci bar register. In this case, cfg_entry->data == writable_mask.
> +     * Especially for devices with large mmio, the value of writable_mask
> +     * is likely to be a guest physical address that has been mapped to ram
> +     * rather than mmio. Remapping this value to mmio should be prevented.
> +     */
> +
> +    if (cfg_entry->data != writable_mask) {
> +        r->addr = cfg_entry->data;
> +    }
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~bar_emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    /* After BAR reg update, we need to remap BAR*/
> +    reg_grp_entry = pt_find_reg_grp(s, PCI_COMMAND);
> +    if (reg_grp_entry) {
> +        reg_entry = pt_find_reg(reg_grp_entry, PCI_COMMAND);
> +        if (reg_entry) {
> +            pt_bar_mapping_one(s, PCI_ROM_SLOT,
> +                               reg_entry->data & PCI_COMMAND_IO,
> +                               reg_entry->data & PCI_COMMAND_MEMORY);
> +        }
> +    }
> +
> +    return 0;
> +}
> +/* restore ROM BAR */
> +static int pt_exp_rom_bar_reg_restore(XenPCIPassthroughState *s,
> +                                      XenPTReg *cfg_entry,
> +                                      uint32_t real_offset,
> +                                      uint32_t dev_value, uint32_t *value)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +
> +    /* use value from kernel sysfs */
> +    *value =
> +        PT_MERGE_VALUE(host_pci_get_long(s->real_device, PCI_ROM_ADDRESS),
> +                       dev_value, reg->emu_mask);
> +    return 0;
> +}
> +
> +/* Header Type0 reg static infomation table */
> +static XenPTRegInfo pt_emu_reg_header0_tbl[] = {
> +    /* Vendor ID reg */
> +    {
> +        .offset     = PCI_VENDOR_ID,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xFFFF,
> +        .emu_mask   = 0xFFFF,
> +        .init       = pt_vendor_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = NULL,
> +    },
> +    /* Device ID reg */
> +    {
> +        .offset     = PCI_DEVICE_ID,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xFFFF,
> +        .emu_mask   = 0xFFFF,
> +        .init       = pt_device_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = NULL,
> +    },
> +    /* Command reg */
> +    {
> +        .offset     = PCI_COMMAND,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xF880,
> +        .emu_mask   = 0x0740,
> +        .init       = pt_common_reg_init,
> +        .u.w.read   = pt_cmd_reg_read,
> +        .u.w.write  = pt_cmd_reg_write,
> +        .u.w.restore  = pt_cmd_reg_restore,
> +    },
> +    /* Capabilities Pointer reg */
> +    {
> +        .offset     = PCI_CAPABILITY_LIST,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_ptr_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* Status reg */
> +    /* use emulated Cap Ptr value to initialize,
> +     * so need to be declared after Cap Ptr reg
> +     */
> +    {
> +        .offset     = PCI_STATUS,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0x06FF,
> +        .emu_mask   = 0x0010,
> +        .init       = pt_status_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = NULL,
> +    },
> +    /* Cache Line Size reg */
> +    {
> +        .offset     = PCI_CACHE_LINE_SIZE,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0x00,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_common_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = pt_byte_reg_restore,
> +    },
> +    /* Latency Timer reg */
> +    {
> +        .offset     = PCI_LATENCY_TIMER,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0x00,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_common_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = pt_byte_reg_restore,
> +    },
> +    /* Header Type reg */
> +    {
> +        .offset     = PCI_HEADER_TYPE,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0x00,
> +        .init       = pt_header_type_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* Interrupt Line reg */
> +    {
> +        .offset     = PCI_INTERRUPT_LINE,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0x00,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_common_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* Interrupt Pin reg */
> +    {
> +        .offset     = PCI_INTERRUPT_PIN,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_irqpin_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* BAR 0 reg */
> +    /* mask of BAR need to be decided later, depends on IO/MEM type */
> +    {
> +        .offset     = PCI_BASE_ADDRESS_0,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_bar_reg_read,
> +        .u.dw.write = pt_bar_reg_write,
> +        .u.dw.restore = pt_bar_reg_restore,
> +    },
> +    /* BAR 1 reg */
> +    {
> +        .offset     = PCI_BASE_ADDRESS_1,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_bar_reg_read,
> +        .u.dw.write = pt_bar_reg_write,
> +        .u.dw.restore = pt_bar_reg_restore,
> +    },
> +    /* BAR 2 reg */
> +    {
> +        .offset     = PCI_BASE_ADDRESS_2,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_bar_reg_read,
> +        .u.dw.write = pt_bar_reg_write,
> +        .u.dw.restore = pt_bar_reg_restore,
> +    },
> +    /* BAR 3 reg */
> +    {
> +        .offset     = PCI_BASE_ADDRESS_3,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_bar_reg_read,
> +        .u.dw.write = pt_bar_reg_write,
> +        .u.dw.restore = pt_bar_reg_restore,
> +    },
> +    /* BAR 4 reg */
> +    {
> +        .offset     = PCI_BASE_ADDRESS_4,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_bar_reg_read,
> +        .u.dw.write = pt_bar_reg_write,
> +        .u.dw.restore = pt_bar_reg_restore,
> +    },
> +    /* BAR 5 reg */
> +    {
> +        .offset     = PCI_BASE_ADDRESS_5,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_bar_reg_read,
> +        .u.dw.write = pt_bar_reg_write,
> +        .u.dw.restore = pt_bar_reg_restore,
> +    },
> +    /* Expansion ROM BAR reg */
> +    {
> +        .offset     = PCI_ROM_ADDRESS,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .ro_mask    = 0x000007FE,
> +        .emu_mask   = 0xFFFFF800,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_long_reg_read,
> +        .u.dw.write = pt_exp_rom_bar_reg_write,
> +        .u.dw.restore = pt_exp_rom_bar_reg_restore,
> +    },
> +    {
> +        .size = 0,
> +    },
> +};
> +
> +
> +/*********************************
> + * Vital Product Data Capability
> + */
> +
> +/* Vital Product Data Capability Structure reg static infomation table */
> +static XenPTRegInfo pt_emu_reg_vpd_tbl[] = {
> +    {
> +        .offset     = PCI_CAP_LIST_NEXT,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_ptr_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    {
> +        .size = 0,
> +    },
> +};
> +
> +
> +/**************************************
> + * Vendor Specific Capability
> + */
> +
> +/* Vendor Specific Capability Structure reg static infomation table */
> +static XenPTRegInfo pt_emu_reg_vendor_tbl[] = {
> +    {
> +        .offset     = PCI_CAP_LIST_NEXT,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_ptr_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    {
> +        .size = 0,
> +    },
> +};
> +
> +
> +/*****************************
> + * PCI Express Capability
> + */
> +
> +/* initialize Link Control register */
> +static uint32_t pt_linkctrl_reg_init(XenPCIPassthroughState *s,
> +                                     XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    uint8_t cap_ver = 0;
> +    uint8_t dev_type = 0;
> +
> +    /* TODO maybe better to use fonction from hw/pcie.c */

function
> +    cap_ver = pci_get_byte(s->dev.config + real_offset - reg->offset
> +                           + PCI_EXP_FLAGS)
> +        & PCI_EXP_FLAGS_VERS;
> +    dev_type = (pci_get_byte(s->dev.config + real_offset - reg->offset
> +                             + PCI_EXP_FLAGS)
> +                & PCI_EXP_FLAGS_TYPE) >> 4;
> +
> +    /* no need to initialize in case of Root Complex Integrated Endpoint
> +     * with cap_ver 1.x

Why?

> +     */
> +    if ((dev_type == PCI_EXP_TYPE_RC_END) && (cap_ver == 1)) {
> +        return PT_INVALID_REG;
> +    }
> +
> +    return reg->init_val;
> +}
> +/* initialize Device Control 2 register */
> +static uint32_t pt_devctrl2_reg_init(XenPCIPassthroughState *s,
> +                                     XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    uint8_t cap_ver = 0;
> +
> +    cap_ver = pci_get_byte(s->dev.config + real_offset - reg->offset
> +                           + PCI_EXP_FLAGS)
> +        & PCI_EXP_FLAGS_VERS;
> +
> +    /* no need to initialize in case of cap_ver 1.x */
> +    if (cap_ver == 1) {
> +        return PT_INVALID_REG;
> +    }
> +
> +    return reg->init_val;
> +}
> +/* initialize Link Control 2 register */
> +static uint32_t pt_linkctrl2_reg_init(XenPCIPassthroughState *s,
> +                                      XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    int reg_field = 0;
> +    uint8_t cap_ver = 0;
> +
> +    cap_ver = pci_get_byte(s->dev.config + real_offset - reg->offset
> +                           + PCI_EXP_FLAGS)
> +        & PCI_EXP_FLAGS_VERS;

This looks like a weird tab issue, but it might be just my mailer.

> +
> +    /* no need to initialize in case of cap_ver 1.x */
> +    if (cap_ver == 1) {
> +        return PT_INVALID_REG;
> +    }
> +
> +    /* set Supported Link Speed */
> +    reg_field |= PCI_EXP_LNKCAP_SLS &
> +        pci_get_byte(s->dev.config + real_offset - reg->offset
> +                     + PCI_EXP_LNKCAP);
> +
> +    return reg_field;
> +}
> +
> +/* PCI Express Capability Structure reg static infomation table */
> +static XenPTRegInfo pt_emu_reg_pcie_tbl[] = {
> +    /* Next Pointer reg */
> +    {
> +        .offset     = PCI_CAP_LIST_NEXT,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_ptr_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* Device Capabilities reg */
> +    {
> +        .offset     = PCI_EXP_DEVCAP,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .ro_mask    = 0x1FFCFFFF,
> +        .emu_mask   = 0x10000000,
> +        .init       = pt_common_reg_init,
> +        .u.dw.read  = pt_long_reg_read,
> +        .u.dw.write = pt_long_reg_write,
> +        .u.dw.restore = NULL,
> +    },
> +    /* Device Control reg */
> +    {
> +        .offset     = PCI_EXP_DEVCTL,
> +        .size       = 2,
> +        .init_val   = 0x2810,
> +        .ro_mask    = 0x8400,
> +        .emu_mask   = 0xFFFF,
> +        .init       = pt_common_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = pt_word_reg_restore,
> +    },
> +    /* Link Control reg */
> +    {
> +        .offset     = PCI_EXP_LNKCTL,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xFC34,
> +        .emu_mask   = 0xFFFF,
> +        .init       = pt_linkctrl_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = pt_word_reg_restore,
> +    },
> +    /* Device Control 2 reg */
> +    {
> +        .offset     = 0x28,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xFFE0,
> +        .emu_mask   = 0xFFFF,
> +        .init       = pt_devctrl2_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = pt_word_reg_restore,
> +    },
> +    /* Link Control 2 reg */
> +    {
> +        .offset     = 0x30,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xE040,
> +        .emu_mask   = 0xFFFF,
> +        .init       = pt_linkctrl2_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = pt_word_reg_restore,
> +    },
> +    {
> +        .size = 0,
> +    },
> +};
> +
> +
> +/*********************************
> + * Power Management Capability
> + */
> +
> +/* initialize Power Management Capabilities register */
> +static uint32_t pt_pmc_reg_init(XenPCIPassthroughState *s,
> +                                XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    PCIDevice *d = &s->dev;
> +
> +    if (!s->power_mgmt) {
> +        return reg->init_val;
> +    }
> +
> +    /* set Power Management Capabilities register */
> +    s->pm_state->pmc_field = pci_get_word(d->config + real_offset);
> +
> +    return reg->init_val;
> +}
> +/* initialize PCI Power Management Control/Status register */
> +static uint32_t pt_pmcsr_reg_init(XenPCIPassthroughState *s,
> +                                  XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    PCIDevice *d = &s->dev;
> +    uint16_t cap_ver  = 0;
> +
> +    if (!s->power_mgmt) {
> +        return reg->init_val;
> +    }
> +
> +    /* check PCI Power Management support version */
> +    cap_ver = s->pm_state->pmc_field & PCI_PM_CAP_VER_MASK;
> +
> +    if (cap_ver > 2) {
> +        /* set No Soft Reset */
> +        s->pm_state->no_soft_reset =
> +            pci_get_byte(d->config + real_offset) & PCI_PM_CTRL_NO_SOFT_RESET;
> +    }
> +
> +    /* wake up real physical device */
> +    switch (host_pci_get_word(s->real_device, real_offset)
> +            & PCI_PM_CTRL_STATE_MASK) {
> +    case 0:
> +        break;
> +    case 1:
> +        PT_LOG("Power state transition D1 -> D0active\n");
> +        host_pci_set_word(s->real_device, real_offset, 0);
> +        break;
> +    case 2:
> +        PT_LOG("Power state transition D2 -> D0active\n");
> +        host_pci_set_word(s->real_device, real_offset, 0);
> +        usleep(200);

Heheh..
> +        break;
> +    case 3:
> +        PT_LOG("Power state transition D3hot -> D0active\n");
> +        host_pci_set_word(s->real_device, real_offset, 0);
> +        usleep(10 * 1000);
> +        pt_init_pci_config(s);
> +        break;
> +    }
> +
> +    return reg->init_val;
> +}
> +/* read Power Management Control/Status register */
> +static int pt_pmcsr_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                             uint16_t *value, uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint16_t valid_emu_mask = reg->emu_mask;
> +
> +    if (!s->power_mgmt) {
> +        valid_emu_mask |= PCI_PM_CTRL_STATE_MASK | PCI_PM_CTRL_NO_SOFT_RESET;
> +    }
> +
> +    valid_emu_mask = valid_emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);
> +
> +    return 0;
> +}
> +/* reset Interrupt and I/O resource  */
> +static void pt_reset_interrupt_and_io_mapping(XenPCIPassthroughState *s)
> +{
> +    PCIDevice *d = &s->dev;
> +    PCIIORegion *r;
> +    int i = 0;
> +    uint8_t e_device = 0;
> +    uint8_t e_intx = 0;
> +
> +    /* unbind INTx */
> +    e_device = PCI_SLOT(s->dev.devfn);
> +    e_intx = pci_intx(s);
> +
> +    if (s->machine_irq) {
> +        if (xc_domain_unbind_pt_irq(xen_xc, xen_domid, s->machine_irq,
> +                                    PT_IRQ_TYPE_PCI, 0, e_device, e_intx, 0)) {
> +            PT_LOG("Error: Unbinding of interrupt failed!\n");
> +        }
> +    }
> +
> +    /* clear all virtual region address */
> +    for (i = 0; i < PCI_NUM_REGIONS; i++) {
> +        r = &d->io_regions[i];
> +        r->addr = -1;
> +    }
> +
> +    /* unmapping BAR */
> +    pt_bar_mapping(s, 0, 0);
> +}
> +/* check power state transition */
> +static int check_power_state(XenPCIPassthroughState *s)
> +{
> +    XenPTPM *pm_state = s->pm_state;
> +    PCIDevice *d = &s->dev;
> +    uint16_t read_val = 0;
> +    uint16_t cur_state = 0;
> +
> +    /* get current power state */
> +    read_val = host_pci_get_word(s->real_device,
> +                                 pm_state->pm_base + PCI_PM_CTRL);
> +    cur_state = read_val & PCI_PM_CTRL_STATE_MASK;
> +
> +    if (pm_state->req_state != cur_state) {
> +        PT_LOG("Error: Failed to change power state. "
> +               "[%02x:%02x.%x][requested state:%d][current state:%d]\n",
> +               pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> +               pm_state->req_state, cur_state);
> +        return -1;
> +    }
> +    return 0;
> +}
> +/* write Power Management Control/Status register */
> +static void pt_from_d3hot_to_d0_with_reset(void *opaque)
> +{
> +    XenPCIPassthroughState *s = opaque;
> +    XenPTPM *pm_state = s->pm_state;
> +    int ret = 0;
> +
> +    /* check power state */
> +    ret = check_power_state(s);
> +
> +    if (ret < 0) {
> +        goto out;
> +    }
> +
> +    pt_init_pci_config(s);
> +
> +out:
> +    /* power state transition flags off */
> +    pm_state->flags &= ~PT_FLAG_TRANSITING;
> +
> +    qemu_free_timer(pm_state->pm_timer);
> +    pm_state->pm_timer = NULL;
> +}
> +static void pt_default_power_transition(void *opaque)
> +{
> +    XenPCIPassthroughState *ptdev = opaque;
> +    XenPTPM *pm_state = ptdev->pm_state;
> +
> +    /* check power state */
> +    check_power_state(ptdev);
> +
> +    /* power state transition flags off */
> +    pm_state->flags &= ~PT_FLAG_TRANSITING;
> +
> +    qemu_free_timer(pm_state->pm_timer);
> +    pm_state->pm_timer = NULL;
> +}
> +static int pt_pmcsr_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                              uint16_t *value, uint16_t dev_value,
> +                              uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    PCIDevice *d = &s->dev;
> +    uint16_t emu_mask = reg->emu_mask;
> +    uint16_t writable_mask = 0;
> +    uint16_t throughable_mask = 0;
> +    XenPTPM *pm_state = s->pm_state;
> +
> +    if (!s->power_mgmt) {
> +        emu_mask |= PCI_PM_CTRL_STATE_MASK | PCI_PM_CTRL_NO_SOFT_RESET;
> +    }
> +
> +    /* modify emulate register */
> +    writable_mask = emu_mask & ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    if (!s->power_mgmt) {
> +        return 0;
> +    }
> +
> +    /* set I/O device power state */
> +    pm_state->cur_state = dev_value & PCI_PM_CTRL_STATE_MASK;
> +
> +    /* set Guest requested PowerState */
> +    pm_state->req_state = *value & PCI_PM_CTRL_STATE_MASK;
> +
> +    /* check power state transition or not */
> +    if (pm_state->cur_state == pm_state->req_state) {
> +        /* not power state transition */
> +        return 0;
> +    }
> +
> +    /* check enable power state transition */
> +    if ((pm_state->req_state != 0) &&
> +        (pm_state->cur_state > pm_state->req_state)) {
> +        PT_LOG("Error: Invalid power transition. "
> +               "[%02x:%02x.%x][requested state:%d][current state:%d]\n",
> +               pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> +               pm_state->req_state, pm_state->cur_state);
> +
> +        return 0;
> +    }
> +
> +    /* check if this device supports the requested power state */
> +    if (((pm_state->req_state == 1) && !(pm_state->pmc_field & PCI_PM_CAP_D1))
> +        || ((pm_state->req_state == 2) &&
> +            !(pm_state->pmc_field & PCI_PM_CAP_D2))) {
> +        PT_LOG("Error: Invalid power transition. "
> +               "[%02x:%02x.%x][requested state:%d][current state:%d]\n",
> +               pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> +               pm_state->req_state, pm_state->cur_state);
> +
> +        return 0;
> +    }
> +
> +    /* in case of transition related to D3hot, it's necessary to wait 10 ms.
> +     * But because writing to register will be performed later on actually,
> +     * don't start QEMUTimer right now, just alloc and init QEMUTimer here.
> +     */
> +    if ((pm_state->cur_state == 3) || (pm_state->req_state == 3)) {
> +        if (pm_state->req_state == 0) {
> +            /* alloc and init QEMUTimer */
> +            if (!pm_state->no_soft_reset) {
> +                pm_state->pm_timer = qemu_new_timer_ms(rt_clock,
> +                    pt_from_d3hot_to_d0_with_reset, s);
> +
> +                /* reset Interrupt and I/O resource mapping */
> +                pt_reset_interrupt_and_io_mapping(s);
> +            } else {
> +                pm_state->pm_timer = qemu_new_timer_ms(rt_clock,
> +                                        pt_default_power_transition, s);
> +            }
> +        } else {
> +            /* alloc and init QEMUTimer */
> +            pm_state->pm_timer = qemu_new_timer_ms(rt_clock,
> +                pt_default_power_transition, s);
> +        }
> +
> +        /* set power state transition delay */
> +        pm_state->pm_delay = 10;
> +
> +        /* power state transition flags on */
> +        pm_state->flags |= PT_FLAG_TRANSITING;
> +    }
> +    /* in case of transition related to D0, D1 and D2,
> +     * no need to use QEMUTimer.
> +     * So, we perfom writing to register here and then read it back.
> +     */
> +    else {
> +        /* write power state to I/O device register */
> +        host_pci_set_word(s->real_device, pm_state->pm_base + PCI_PM_CTRL,
> +                          *value);
> +
> +        /* in case of transition related to D2,
> +         * it's necessary to wait 200 usec.
> +         * But because QEMUTimer do not support microsec unit right now,
> +         * so we do wait ourself here.
> +         */
> +        if ((pm_state->cur_state == 2) || (pm_state->req_state == 2)) {
> +            usleep(200);
> +        }
> +
> +        /* check power state */
> +        check_power_state(s);
> +
> +        /* recreate value for writing to I/O device register */
> +        *value = host_pci_get_word(s->real_device,
> +                                   pm_state->pm_base + PCI_PM_CTRL);
> +    }
> +
> +    return 0;
> +}
> +
> +/* restore Power Management Control/Status register */
> +static int pt_pmcsr_reg_restore(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                                uint32_t real_offset, uint16_t dev_value,
> +                                uint16_t *value)
> +{
> +    /* create value for restoring to I/O device register
> +     * No need to restore, just clear PME Enable and PME Status bit
> +     * Note: register type of PME Status bit is RW1C, so clear by writing 1b
> +     */
> +    *value = (dev_value & ~PCI_PM_CTRL_PME_ENABLE) | PCI_PM_CTRL_PME_STATUS;
> +
> +    return 0;
> +}
> +
> +
> +/* Power Management Capability reg static infomation table */
> +static XenPTRegInfo pt_emu_reg_pm_tbl[] = {
> +    /* Next Pointer reg */
> +    {
> +        .offset     = PCI_CAP_LIST_NEXT,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_ptr_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* Power Management Capabilities reg */
> +    {
> +        .offset     = PCI_CAP_FLAGS,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xFFFF,
> +        .emu_mask   = 0xF9C8,
> +        .init       = pt_pmc_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = NULL,
> +    },
> +    /* PCI Power Management Control/Status reg */
> +    {
> +        .offset     = PCI_PM_CTRL,
> +        .size       = 2,
> +        .init_val   = 0x0008,
> +        .ro_mask    = 0xE1FC,
> +        .emu_mask   = 0x8100,
> +        .init       = pt_pmcsr_reg_init,
> +        .u.w.read   = pt_pmcsr_reg_read,
> +        .u.w.write  = pt_pmcsr_reg_write,
> +        .u.w.restore  = pt_pmcsr_reg_restore,
> +    },
> +    {
> +        .size = 0,
> +    },
> +};
> +
> +
> +/****************************
> + * Capabilities
> + */
> +
> +/* AER register operations */
> +
> +static void aer_save_one_register(XenPCIPassthroughState *s, int offset)
> +{
> +    PCIDevice *d = &s->dev;
> +    uint32_t aer_base = s->pm_state->aer_base;
> +    uint32_t val = 0;
> +
> +    val = host_pci_get_long(s->real_device, aer_base + offset);
> +    pci_set_long(d->config + aer_base + offset, val);
> +}
> +static void pt_aer_reg_save(XenPCIPassthroughState *s)
> +{
> +    /* after reset, following register values should be restored.
> +     * So, save them.
> +     */
> +    aer_save_one_register(s, PCI_ERR_UNCOR_MASK);
> +    aer_save_one_register(s, PCI_ERR_UNCOR_SEVER);
> +    aer_save_one_register(s, PCI_ERR_COR_MASK);
> +    aer_save_one_register(s, PCI_ERR_CAP);
> +}
> +static void aer_restore_one_register(XenPCIPassthroughState *s, int offset)
> +{
> +    PCIDevice *d = &s->dev;
> +    uint32_t aer_base = s->pm_state->aer_base;
> +    uint32_t config = 0;
> +
> +    config = pci_get_long(d->config + aer_base + offset);
> +    host_pci_set_long(s->real_device, aer_base + offset, config);
> +}
> +static void pt_aer_reg_restore(XenPCIPassthroughState *s)
> +{
> +    /* the following registers should be reconfigured to correct values
> +     * after reset. restore them.
> +     * other registers should not be reconfigured after reset
> +     * if there is no reason
> +     */
> +    aer_restore_one_register(s, PCI_ERR_UNCOR_MASK);
> +    aer_restore_one_register(s, PCI_ERR_UNCOR_SEVER);
> +    aer_restore_one_register(s, PCI_ERR_COR_MASK);
> +    aer_restore_one_register(s, PCI_ERR_CAP);
> +}
> +
> +/* capability structure register group size functions */
> +
> +static uint8_t pt_reg_grp_size_init(XenPCIPassthroughState *s,
> +                                    const XenPTRegGroupInfo *grp_reg,
> +                                    uint32_t base_offset)
> +{
> +    return grp_reg->grp_size;
> +}
> +/* get Power Management Capability Structure register group size */
> +static uint8_t pt_pm_size_init(XenPCIPassthroughState *s,
> +                               const XenPTRegGroupInfo *grp_reg,
> +                               uint32_t base_offset)
> +{
> +    if (!s->power_mgmt) {
> +        return grp_reg->grp_size;
> +    }
> +
> +    s->pm_state = g_malloc0(sizeof (XenPTPM));
> +
> +    /* set Power Management Capability base offset */
> +    s->pm_state->pm_base = base_offset;
> +
> +    /* find AER register and set AER Capability base offset */
> +    s->pm_state->aer_base = host_pci_find_ext_cap_offset(s->real_device,
> +                                                         PCI_EXT_CAP_ID_ERR);
> +
> +    /* save AER register */
> +    if (s->pm_state->aer_base) {
> +        pt_aer_reg_save(s);
> +    }
> +
> +    return grp_reg->grp_size;
> +}
> +/* get Vendor Specific Capability Structure register group size */
> +static uint8_t pt_vendor_size_init(XenPCIPassthroughState *s,
> +                                   const XenPTRegGroupInfo *grp_reg,
> +                                   uint32_t base_offset)
> +{
> +    return pci_get_byte(s->dev.config + base_offset + 0x02);
> +}
> +/* get PCI Express Capability Structure register group size */
> +static uint8_t pt_pcie_size_init(XenPCIPassthroughState *s,
> +                                 const XenPTRegGroupInfo *grp_reg,
> +                                 uint32_t base_offset)
> +{
> +    PCIDevice *d = &s->dev;
> +    uint16_t exp_flag = 0;
> +    uint16_t type = 0;
> +    uint16_t version = 0;
> +    uint8_t pcie_size = 0;
> +
> +    exp_flag = pci_get_word(d->config + base_offset + PCI_EXP_FLAGS);
> +    type = (exp_flag & PCI_EXP_FLAGS_TYPE) >> 4;
> +    version = exp_flag & PCI_EXP_FLAGS_VERS;
> +
> +    /* calculate size depend on capability version and device/port type */
> +    /* in case of PCI Express Base Specification Rev 1.x */
> +    if (version == 1) {
> +        /* The PCI Express Capabilities, Device Capabilities, and Device
> +         * Status/Control registers are required for all PCI Express devices.
> +         * The Link Capabilities and Link Status/Control are required for all
> +         * Endpoints that are not Root Complex Integrated Endpoints. Endpoints
> +         * are not required to implement registers other than those listed
> +         * above and terminate the capability structure.
> +         */
> +        switch (type) {
> +        case PCI_EXP_TYPE_ENDPOINT:
> +        case PCI_EXP_TYPE_LEG_END:
> +            pcie_size = 0x14;
> +            break;
> +        case PCI_EXP_TYPE_RC_END:
> +            /* has no link */
> +            pcie_size = 0x0C;
> +            break;
> +        /* only EndPoint passthrough is supported */
> +        case PCI_EXP_TYPE_ROOT_PORT:
> +        case PCI_EXP_TYPE_UPSTREAM:
> +        case PCI_EXP_TYPE_DOWNSTREAM:
> +        case PCI_EXP_TYPE_PCI_BRIDGE:
> +        case PCI_EXP_TYPE_PCIE_BRIDGE:
> +        case PCI_EXP_TYPE_RC_EC:
> +        default:
> +            hw_error("Internal error: Unsupported device/port type[%d]. "
> +                     "I/O emulator exit.\n", type);
> +        }
> +    }
> +    /* in case of PCI Express Base Specification Rev 2.0 */
> +    else if (version == 2) {
> +        switch (type) {
> +        case PCI_EXP_TYPE_ENDPOINT:
> +        case PCI_EXP_TYPE_LEG_END:
> +        case PCI_EXP_TYPE_RC_END:
> +            /* For Functions that do not implement the registers,
> +             * these spaces must be hardwired to 0b.
> +             */
> +            pcie_size = 0x3C;
> +            break;
> +        /* only EndPoint passthrough is supported */
> +        case PCI_EXP_TYPE_ROOT_PORT:
> +        case PCI_EXP_TYPE_UPSTREAM:
> +        case PCI_EXP_TYPE_DOWNSTREAM:
> +        case PCI_EXP_TYPE_PCI_BRIDGE:
> +        case PCI_EXP_TYPE_PCIE_BRIDGE:
> +        case PCI_EXP_TYPE_RC_EC:
> +        default:
> +            hw_error("Internal error: Unsupported device/port type[%d]. "
> +                     "I/O emulator exit.\n", type);
> +        }
> +    } else {
> +        hw_error("Internal error: Unsupported capability version[%d]. "
> +                 "I/O emulator exit.\n", version);
> +    }
> +
> +    return pcie_size;
> +}
> +
> +static const XenPTRegGroupInfo pt_emu_reg_grp_tbl[] = {
> +    /* Header Type0 reg group */
> +    {
> +        .grp_id      = 0xFF,
> +        .grp_type    = GRP_TYPE_EMU,
> +        .grp_size    = 0x40,
> +        .size_init   = pt_reg_grp_size_init,
> +        .emu_reg_tbl = pt_emu_reg_header0_tbl,
> +    },
> +    /* PCI PowerManagement Capability reg group */
> +    {
> +        .grp_id      = PCI_CAP_ID_PM,
> +        .grp_type    = GRP_TYPE_EMU,
> +        .grp_size    = PCI_PM_SIZEOF,
> +        .size_init   = pt_pm_size_init,
> +        .emu_reg_tbl = pt_emu_reg_pm_tbl,
> +    },
> +    /* AGP Capability Structure reg group */
> +    {
> +        .grp_id     = PCI_CAP_ID_AGP,
> +        .grp_type   = GRP_TYPE_HARDWIRED,
> +        .grp_size   = 0x30,
> +        .size_init  = pt_reg_grp_size_init,
> +    },
> +    /* Vital Product Data Capability Structure reg group */
> +    {
> +        .grp_id      = PCI_CAP_ID_VPD,
> +        .grp_type    = GRP_TYPE_EMU,
> +        .grp_size    = 0x08,
> +        .size_init   = pt_reg_grp_size_init,
> +        .emu_reg_tbl = pt_emu_reg_vpd_tbl,
> +    },
> +    /* Slot Identification reg group */
> +    {
> +        .grp_id     = PCI_CAP_ID_SLOTID,
> +        .grp_type   = GRP_TYPE_HARDWIRED,
> +        .grp_size   = 0x04,
> +        .size_init  = pt_reg_grp_size_init,
> +    },
> +    /* PCI-X Capabilities List Item reg group */
> +    {
> +        .grp_id     = PCI_CAP_ID_PCIX,
> +        .grp_type   = GRP_TYPE_HARDWIRED,
> +        .grp_size   = 0x18,
> +        .size_init  = pt_reg_grp_size_init,
> +    },
> +    /* Vendor Specific Capability Structure reg group */
> +    {
> +        .grp_id      = PCI_CAP_ID_VNDR,
> +        .grp_type    = GRP_TYPE_EMU,
> +        .grp_size    = 0xFF,
> +        .size_init   = pt_vendor_size_init,
> +        .emu_reg_tbl = pt_emu_reg_vendor_tbl,
> +    },
> +    /* SHPC Capability List Item reg group */
> +    {
> +        .grp_id     = PCI_CAP_ID_SHPC,
> +        .grp_type   = GRP_TYPE_HARDWIRED,
> +        .grp_size   = 0x08,
> +        .size_init  = pt_reg_grp_size_init,
> +    },
> +    /* Subsystem ID and Subsystem Vendor ID Capability List Item reg group */
> +    {
> +        .grp_id     = PCI_CAP_ID_SSVID,
> +        .grp_type   = GRP_TYPE_HARDWIRED,
> +        .grp_size   = 0x08,
> +        .size_init  = pt_reg_grp_size_init,
> +    },
> +    /* AGP 8x Capability Structure reg group */
> +    {
> +        .grp_id     = PCI_CAP_ID_AGP3,
> +        .grp_type   = GRP_TYPE_HARDWIRED,
> +        .grp_size   = 0x30,
> +        .size_init  = pt_reg_grp_size_init,
> +    },
> +    /* PCI Express Capability Structure reg group */
> +    {
> +        .grp_id      = PCI_CAP_ID_EXP,
> +        .grp_type    = GRP_TYPE_EMU,
> +        .grp_size    = 0xFF,
> +        .size_init   = pt_pcie_size_init,
> +        .emu_reg_tbl = pt_emu_reg_pcie_tbl,
> +    },
> +    {
> +        .grp_size = 0,
> +    },
> +};
> +
> +/* initialize Capabilities Pointer or Next Pointer register */
> +static uint32_t pt_ptr_reg_init(XenPCIPassthroughState *s,
> +                                XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    /* uint32_t reg_field = (uint32_t)s->dev.config[real_offset]; */
> +    uint32_t reg_field = pci_get_byte(s->dev.config + real_offset);
> +    int i;
> +
> +    /* find capability offset */
> +    while (reg_field) {
> +        for (i = 0; pt_emu_reg_grp_tbl[i].grp_size != 0; i++) {
> +            if (pt_hide_dev_cap(s->real_device,
> +                                pt_emu_reg_grp_tbl[i].grp_id)) {
> +                continue;
> +            }
> +            if (pt_emu_reg_grp_tbl[i].grp_id == s->dev.config[reg_field]) {
> +                if (pt_emu_reg_grp_tbl[i].grp_type == GRP_TYPE_EMU) {
> +                    goto out;
> +                }
> +                /* ignore the 0 hardwired capability, find next one */
> +                break;
> +            }
> +        }
> +        /* next capability */
> +        /* reg_field = (uint32_t)s->dev.config[reg_field + 1]; */
> +        reg_field = pci_get_byte(s->dev.config + reg_field + 1);
> +    }
> +
> +out:
> +    return reg_field;
> +}
> +
> +
> +/*************
> + * Main
> + */
> +
> +/* restore a part of I/O device register */
> +static void pt_config_restore(XenPCIPassthroughState *s)
> +{
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    XenPTRegInfo *reg = NULL;
> +    uint32_t real_offset = 0;
> +    uint32_t read_val = 0;
> +    uint32_t val = 0;
> +    int ret = 0;
> +
> +    /* find emulate register group entry */
> +    QLIST_FOREACH(reg_grp_entry, &s->reg_grp_tbl, entries) {
> +        /* find emulate register entry */
> +        QLIST_FOREACH(reg_entry, &reg_grp_entry->reg_tbl_list, entries) {
> +            reg = reg_entry->reg;
> +
> +            /* check whether restoring is needed */
> +            if (!reg->u.b.restore) {
> +                continue;
> +            }
> +
> +            real_offset = reg_grp_entry->base_offset + reg->offset;
> +
> +            /* read I/O device register value */
> +            ret = host_pci_get_block(s->real_device, real_offset,
> +                                     (uint8_t *)&read_val, reg->size);
> +
> +            if (!ret) {
> +                PT_LOG("Error: pci_read_block failed. "
> +                       "return value[%d].\n", ret);
> +                memset(&read_val, 0xff, reg->size);
> +            }
> +
> +            val = 0;
> +
> +            /* restore based on register size */
> +            switch (reg->size) {
> +            case 1:
> +                /* byte register */
> +                ret = reg->u.b.restore(s, reg_entry, real_offset,
> +                                       (uint8_t)read_val, (uint8_t *)&val);
> +                break;
> +            case 2:
> +                /* word register */
> +                ret = reg->u.w.restore(s, reg_entry, real_offset,
> +                                       (uint16_t)read_val, (uint16_t *)&val);
> +                break;
> +            case 4:
> +                /* double word register */
> +                ret = reg->u.dw.restore(s, reg_entry, real_offset,
> +                                        (uint32_t)read_val, (uint32_t *)&val);
> +                break;
> +            }
> +
> +            /* restoring error */
> +            if (ret < 0) {
> +                hw_error("Internal error: Invalid restoring "
> +                         "return value[%d]. I/O emulator exit.\n", ret);
> +            }
> +
> +            PT_LOG_CONFIG("[%02x:%02x.%x]: address=%04x val=0x%08x len=%d\n",
> +                          pci_bus_num(s->dev.bus), PCI_SLOT(s->dev.devfn),
> +                          PCI_FUNC(s->dev.devfn),
> +                          real_offset, val, reg->size);
> +
> +            ret = host_pci_set_block(s->real_device, real_offset,
> +                                     (uint8_t *)&val, reg->size);
> +
> +            if (!ret) {
> +                PT_LOG("Error: pci_write_block failed. "
> +                       "return value[%d].\n", ret);
> +            }
> +        }
> +    }
> +
> +    /* if AER supported, restore it */
> +    if (s->pm_state->aer_base) {
> +        pt_aer_reg_restore(s);
> +    }
> +}
> +/* reinitialize all emulate registers */
> +static void pt_config_reinit(XenPCIPassthroughState *s)
> +{
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    XenPTRegInfo *reg = NULL;
> +
> +    /* find emulate register group entry */
> +    QLIST_FOREACH(reg_grp_entry, &s->reg_grp_tbl, entries) {
> +        /* find emulate register entry */
> +        QLIST_FOREACH(reg_entry, &reg_grp_entry->reg_tbl_list, entries) {
> +            reg = reg_entry->reg;
> +            if (reg->init) {
> +                /* initialize emulate register */
> +                reg_entry->data =
> +                    reg->init(s, reg_entry->reg,
> +                              reg_grp_entry->base_offset + reg->offset);
> +            }
> +        }
> +    }
> +}
> +
> +static int pt_init_pci_config(XenPCIPassthroughState *s)
> +{
> +    PCIDevice *d = &s->dev;
> +    int ret = 0;
> +
> +    PT_LOG("Reinitialize PCI configuration registers due to power state"
> +           " transition with internal reset. [%02x:%02x.%x]\n",
> +           pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn));
> +
> +    /* restore a part of I/O device register */
> +    pt_config_restore(s);
> +
> +    /* reinitialize all emulate register */
> +    pt_config_reinit(s);
> +
> +    /* rebind machine_irq to device */
> +    if (s->machine_irq != 0) {
> +        uint8_t e_device = PCI_SLOT(s->dev.devfn);
> +        uint8_t e_intx = pci_intx(s);
> +
> +        ret = xc_domain_bind_pt_pci_irq(xen_xc, xen_domid, s->machine_irq, 0,
> +                                        e_device, e_intx);
> +        if (ret < 0) {
> +            PT_LOG("Error: Rebinding of interrupt failed! ret=%d\n", ret);
> +        }
> +    }
> +
> +    return ret;
> +}
> +
> +static uint8_t find_cap_offset(XenPCIPassthroughState *s, uint8_t cap)
> +{
> +    int id;
> +    int max_cap = 48;
> +    int pos = PCI_CAPABILITY_LIST;
> +    int status;
> +
> +    status = host_pci_get_byte(s->real_device, PCI_STATUS);
> +    if ((status & PCI_STATUS_CAP_LIST) == 0) {
> +        return 0;
> +    }
> +
> +    while (max_cap--) {
> +        pos = host_pci_get_byte(s->real_device, pos);
> +        if (pos < 0x40) {
> +            break;
> +        }
> +
> +        pos &= ~3;
> +        id = host_pci_get_byte(s->real_device, pos + PCI_CAP_LIST_ID);
> +
> +        if (id == 0xff) {
> +            break;
> +        }
> +        if (id == cap) {
> +            return pos;
> +        }
> +
> +        pos += PCI_CAP_LIST_NEXT;
> +    }
> +    return 0;
> +}
> +
> +static void pt_config_reg_init(XenPCIPassthroughState *s,
> +                               XenPTRegGroup *reg_grp, XenPTRegInfo *reg)
> +{
> +    XenPTReg *reg_entry;
> +    uint32_t data = 0;
> +
> +    reg_entry = g_malloc0(sizeof (XenPTReg));
> +
> +    reg_entry->reg = reg;
> +    reg_entry->data = 0;
> +
> +    if (reg->init) {
> +        /* initialize emulate register */
> +        data = reg->init(s, reg_entry->reg,
> +                         reg_grp->base_offset + reg->offset);
> +        if (data == PT_INVALID_REG) {
> +            /* free unused BAR register entry */
> +            free(reg_entry);
> +            return;
> +        }
> +        /* set register value */
> +        reg_entry->data = data;
> +    }
> +    /* list add register entry */
> +    QLIST_INSERT_HEAD(&reg_grp->reg_tbl_list, reg_entry, entries);
> +
> +    return;
> +}
> +
> +void pt_config_init(XenPCIPassthroughState *s)
> +{
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    uint32_t reg_grp_offset = 0;
> +    XenPTRegInfo *reg_tbl = NULL;
> +    int i, j;
> +
> +    QLIST_INIT(&s->reg_grp_tbl);
> +
> +    for (i = 0; pt_emu_reg_grp_tbl[i].grp_size != 0; i++) {
> +        if (pt_emu_reg_grp_tbl[i].grp_id != 0xFF) {
> +            if (pt_hide_dev_cap(s->real_device,
> +                                pt_emu_reg_grp_tbl[i].grp_id)) {
> +                continue;
> +            }
> +
> +            reg_grp_offset = find_cap_offset(s, pt_emu_reg_grp_tbl[i].grp_id);
> +
> +            if (!reg_grp_offset) {
> +                continue;
> +            }
> +        }
> +
> +        reg_grp_entry = g_malloc0(sizeof (XenPTRegGroup));
> +        QLIST_INIT(&reg_grp_entry->reg_tbl_list);
> +        QLIST_INSERT_HEAD(&s->reg_grp_tbl, reg_grp_entry, entries);
> +
> +        reg_grp_entry->base_offset = reg_grp_offset;
> +        reg_grp_entry->reg_grp = pt_emu_reg_grp_tbl + i;
> +        if (pt_emu_reg_grp_tbl[i].size_init) {
> +            /* get register group size */
> +            reg_grp_entry->size =
> +                pt_emu_reg_grp_tbl[i].size_init(s, reg_grp_entry->reg_grp,
> +                                                reg_grp_offset);
> +        }
> +
> +        if (pt_emu_reg_grp_tbl[i].grp_type == GRP_TYPE_EMU) {
> +            if (pt_emu_reg_grp_tbl[i].emu_reg_tbl) {
> +                reg_tbl = pt_emu_reg_grp_tbl[i].emu_reg_tbl;
> +                /* initialize capability register */
> +                for (j = 0; reg_tbl->size != 0; j++, reg_tbl++) {
> +                    /* initialize capability register */
> +                    pt_config_reg_init(s, reg_grp_entry, reg_tbl);
> +                }
> +            }
> +        }
> +        reg_grp_offset = 0;
> +    }
> +
> +    return;
> +}
> +
> +/* delete all emulate register */
> +void pt_config_delete(XenPCIPassthroughState *s)
> +{
> +    struct XenPTRegGroup *reg_group, *next_grp;
> +    struct XenPTReg *reg, *next_reg;
> +
> +    /* free Power Management info table */
> +    if (s->pm_state) {
> +        if (s->pm_state->pm_timer) {
> +            qemu_del_timer(s->pm_state->pm_timer);
> +            qemu_free_timer(s->pm_state->pm_timer);
> +            s->pm_state->pm_timer = NULL;
> +        }
> +
> +        g_free(s->pm_state);
> +    }
> +
> +    /* free all register group entry */
> +    QLIST_FOREACH_SAFE(reg_group, &s->reg_grp_tbl, entries, next_grp) {
> +        /* free all register entry */
> +        QLIST_FOREACH_SAFE(reg, &reg_group->reg_tbl_list, entries, next_reg) {
> +            QLIST_REMOVE(reg, entries);
> +            g_free(reg);
> +        }
> +
> +        QLIST_REMOVE(reg_group, entries);
> +        g_free(reg_group);
> +    }
> +}
> -- 
> Anthony PERARD
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 14:09:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 14:09:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROcoD-0007EH-1H; Thu, 10 Nov 2011 14:09:21 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROclN-0006zB-3E
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 14:06:27 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1320962781!3077508!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1767 invoked from network); 10 Nov 2011 22:06:22 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Nov 2011 22:06:22 -0000
X-IronPort-AV: E=Sophos;i="4.69,490,1315180800"; 
   d="scan'208";a="8875624"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Nov 2011 22:06:21 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 10 Nov 2011 22:06:21 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1ROclJ-00041d-2b;
	Thu, 10 Nov 2011 22:06:21 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1ROclI-0002cR-TP;
	Thu, 10 Nov 2011 22:06:20 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9743-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 10 Nov 2011 22:06:20 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9743: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9743 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9743/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl          18 leak-check/check           fail REGR. vs. 9661
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl           18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-credit2   18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-multivcpu 18 leak-check/check           fail REGR. vs. 9661

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf      7 debian-install               fail pass in 9742

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10  fail in 9742 like 9659

version targeted for testing:
 xen                  d0bbe0622d1d
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  "Shan, Haitao" <haitao.shan@intel.com>
  Andres Lagar-Cavilla <andres@lagarcavilla.org>
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Jean Guyader <jean.guyader@eu.citrix.com>
  Juergen Gross <juergen.gross@ts.fujitsu.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  Tim Deegan <tim@xen.org>
  Wei Wang <wei.wang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

(No revision log; it would be 656 lines long.)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 14:12:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 14:12:26 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROcrB-0007eT-Db; Thu, 10 Nov 2011 14:12:25 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROcpd-0007Qm-PK
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 14:10:51 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1320963044!1098413!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21887 invoked from network); 10 Nov 2011 22:10:45 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-5.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 22:10:45 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAAMAZgj003729
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 10 Nov 2011 22:10:36 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAAMAYt3022668
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 10 Nov 2011 22:10:34 GMT
Received: from abhmt109.oracle.com (abhmt109.oracle.com [141.146.116.61])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAAMASU7004373; Thu, 10 Nov 2011 16:10:28 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 10 Nov 2011 14:10:28 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 60F3D819F2; Thu, 10 Nov 2011 17:10:27 -0500 (EST)
Date: Thu, 10 Nov 2011 17:10:27 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Subject: Re: [Xen-devel] [PATCH V3 10/10] Introduce Xen PCI Passthrough, MSI
	(3/3)
Message-ID: <20111110221027.GB23837@phenom.dumpdata.com>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-11-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319814456-8158-11-git-send-email-anthony.perard@citrix.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090202.4EBC4BDD.000B,ss=1,re=-6.500,fgs=0
Cc: Jiang Yunhong <yunhong.jiang@intel.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Shan Haitao <haitao.shan@intel.com>, QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, Oct 28, 2011 at 04:07:36PM +0100, Anthony PERARD wrote:
> From: Jiang Yunhong <yunhong.jiang@intel.com>
> 
> Signed-off-by: Jiang Yunhong <yunhong.jiang@intel.com>
> Signed-off-by: Shan Haitao <haitao.shan@intel.com>
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  Makefile.target                      |    1 +
>  hw/apic-msidef.h                     |    2 +
>  hw/xen_pci_passthrough.c             |   27 ++-
>  hw/xen_pci_passthrough.h             |   55 +++
>  hw/xen_pci_passthrough_config_init.c |  495 +++++++++++++++++++++++++-
>  hw/xen_pci_passthrough_msi.c         |  667 ++++++++++++++++++++++++++++++++++
>  6 files changed, 1240 insertions(+), 7 deletions(-)
>  create mode 100644 hw/xen_pci_passthrough_msi.c
> 
> diff --git a/Makefile.target b/Makefile.target
> index c32c688..17b8857 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -220,6 +220,7 @@ obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += host-pci-device.o
>  obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pci_passthrough.o
>  obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pci_passthrough_helpers.o
>  obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pci_passthrough_config_init.o
> +obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pci_passthrough_msi.o
>  
>  # Inter-VM PCI shared memory
>  CONFIG_IVSHMEM =
> diff --git a/hw/apic-msidef.h b/hw/apic-msidef.h
> index 3182f0b..6e2eb71 100644
> --- a/hw/apic-msidef.h
> +++ b/hw/apic-msidef.h
> @@ -22,6 +22,8 @@
>  
>  #define MSI_ADDR_DEST_MODE_SHIFT        2
>  
> +#define MSI_ADDR_REDIRECTION_SHIFT      3
> +
>  #define MSI_ADDR_DEST_ID_SHIFT          12
>  #define  MSI_ADDR_DEST_ID_MASK          0x00ffff0
>  
> diff --git a/hw/xen_pci_passthrough.c b/hw/xen_pci_passthrough.c
> index b97c5b6..4b9eb74 100644
> --- a/hw/xen_pci_passthrough.c
> +++ b/hw/xen_pci_passthrough.c
> @@ -417,6 +417,7 @@ static void pt_iomem_map(XenPCIPassthroughState *s, int i,
>      }
>  
>      if (!first_map && old_ebase != -1) {
> +        pt_add_msix_mapping(s, i);
>          /* Remove old mapping */
>          ret = xc_domain_memory_mapping(xen_xc, xen_domid,
>                                 old_ebase >> XC_PAGE_SHIFT,
> @@ -441,6 +442,15 @@ static void pt_iomem_map(XenPCIPassthroughState *s, int i,
>          if (ret != 0) {
>              PT_LOG("Error: create new mapping failed!\n");
>          }
> +
> +        ret = pt_remove_msix_mapping(s, i);
> +        if (ret != 0) {
> +            PT_LOG("Error: remove MSI-X mmio mapping failed!\n");
> +        }
> +
> +        if (old_ebase != e_phys && old_ebase != -1) {
> +            pt_msix_update_remap(s, i);
> +        }
>      }
>  }
>  
> @@ -737,6 +747,9 @@ static int pt_initfn(PCIDevice *pcidev)
>          mapped_machine_irq[machine_irq]++;
>      }
>  
> +    /* setup MSI-INTx translation if support */
> +    rc = pt_enable_msi_translate(s);
> +
>      /* bind machine_irq to device */
>      if (rc < 0 && machine_irq != 0) {
>          uint8_t e_device = PCI_SLOT(s->dev.devfn);
> @@ -765,7 +778,8 @@ static int pt_initfn(PCIDevice *pcidev)
>  
>  out:
>      PT_LOG("Real physical device %02x:%02x.%x registered successfuly!\n"
> -           "IRQ type = %s\n", bus, slot, func, "INTx");
> +           "IRQ type = %s\n", bus, slot, func,
> +           s->msi_trans_en ? "MSI-INTx" : "INTx");
>  
>      return 0;
>  }
> @@ -782,7 +796,7 @@ static int pt_unregister_device(PCIDevice *pcidev)
>      e_intx = pci_intx(s);
>      machine_irq = s->machine_irq;
>  
> -    if (machine_irq) {
> +    if (s->msi_trans_en == 0 && machine_irq) {
>          rc = xc_domain_unbind_pt_irq(xen_xc, xen_domid, machine_irq,
>                                       PT_IRQ_TYPE_PCI, 0, e_device, e_intx, 0);
>          if (rc < 0) {
> @@ -790,6 +804,13 @@ static int pt_unregister_device(PCIDevice *pcidev)
>          }
>      }
>  
> +    if (s->msi) {
> +        pt_msi_disable(s);
> +    }
> +    if (s->msix) {
> +        pt_msix_disable(s);
> +    }
> +
>      if (machine_irq) {
>          mapped_machine_irq[machine_irq]--;
>  
> @@ -824,6 +845,8 @@ static PCIDeviceInfo xen_pci_passthrough = {
>      .is_express = 0,
>      .qdev.props = (Property[]) {
>          DEFINE_PROP_STRING("hostaddr", XenPCIPassthroughState, hostaddr),
> +        DEFINE_PROP_BIT("msitranslate", XenPCIPassthroughState, msi_trans_cap,
> +                        0, true),
>          DEFINE_PROP_BIT("power-mgmt", XenPCIPassthroughState, power_mgmt,
>                          0, false),
>          DEFINE_PROP_END_OF_LIST(),
> diff --git a/hw/xen_pci_passthrough.h b/hw/xen_pci_passthrough.h
> index ebc04fd..5f404b0 100644
> --- a/hw/xen_pci_passthrough.h
> +++ b/hw/xen_pci_passthrough.h
> @@ -63,6 +63,10 @@ typedef int (*conf_byte_restore)
>  
>  #define PT_BAR_ALLF        0xFFFFFFFF  /* BAR ALLF value */
>  
> +/* MSI-X */
> +#define PT_MSI_FLAG_UNINIT 0x1000
> +#define PT_MSI_FLAG_MAPPED 0x2000
> +
>  
>  typedef enum {
>      GRP_TYPE_HARDWIRED = 0,                     /* 0 Hardwired reg group */
> @@ -166,6 +170,34 @@ typedef struct XenPTRegGroup {
>  } XenPTRegGroup;
>  
>  
> +typedef struct XenPTMSI {
> +    uint32_t flags;
> +    uint32_t ctrl_offset; /* saved control offset */
> +    int pirq;          /* guest pirq corresponding */
> +    uint32_t addr_lo;  /* guest message address */
> +    uint32_t addr_hi;  /* guest message upper address */
> +    uint16_t data;     /* guest message data */
> +} XenPTMSI;
> +
> +typedef struct XenMSIXEntry {
> +    int pirq;        /* -1 means unmapped */
> +    int flags;       /* flags indicting whether MSI ADDR or DATA is updated */
> +    uint32_t io_mem[4];
> +} XenMSIXEntry;
> +typedef struct XenPTMSIX {
> +    uint32_t ctrl_offset;
> +    int enabled;
> +    int total_entries;
> +    int bar_index;
> +    uint64_t table_base;
> +    uint32_t table_off;
> +    uint32_t table_offset_adjust; /* page align mmap */
> +    uint64_t mmio_base_addr;
> +    int mmio_index;
> +    void *phys_iomem_base;
> +    XenMSIXEntry msix_entry[0];
> +} XenPTMSIX;
> +
>  typedef struct XenPTPM {
>      QEMUTimer *pm_timer;  /* QEMUTimer struct */
>      int no_soft_reset;    /* No Soft Reset flags */
> @@ -189,6 +221,13 @@ struct XenPCIPassthroughState {
>  
>      uint32_t machine_irq;
>  
> +    XenPTMSI *msi;
> +    XenPTMSIX *msix;
> +
> +    /* Physical MSI to guest INTx translation when possible */
> +    uint32_t msi_trans_cap;
> +    bool msi_trans_en;
> +
>      uint32_t power_mgmt;
>      XenPTPM *pm_state;
>  
> @@ -222,4 +261,20 @@ static inline uint8_t pci_read_intx(XenPCIPassthroughState *s)
>  }
>  uint8_t pci_intx(XenPCIPassthroughState *ptdev);
>  
> +/* MSI/MSI-X */
> +void pt_msi_set_enable(XenPCIPassthroughState *s, int en);
> +int pt_msi_setup(XenPCIPassthroughState *s);
> +int pt_msi_update(XenPCIPassthroughState *d);
> +void pt_msi_disable(XenPCIPassthroughState *s);
> +int pt_enable_msi_translate(XenPCIPassthroughState *s);
> +void pt_disable_msi_translate(XenPCIPassthroughState *s);
> +
> +int pt_msix_init(XenPCIPassthroughState *s, int pos);
> +void pt_msix_delete(XenPCIPassthroughState *s);
> +int pt_msix_update(XenPCIPassthroughState *s);
> +int pt_msix_update_remap(XenPCIPassthroughState *s, int bar_index);
> +void pt_msix_disable(XenPCIPassthroughState *s);
> +int pt_add_msix_mapping(XenPCIPassthroughState *s, int bar_index);
> +int pt_remove_msix_mapping(XenPCIPassthroughState *s, int bar_index);
> +
>  #endif /* !QEMU_HW_XEN_PCI_PASSTHROUGH_H */
> diff --git a/hw/xen_pci_passthrough_config_init.c b/hw/xen_pci_passthrough_config_init.c
> index 4103b59..b4238ee 100644
> --- a/hw/xen_pci_passthrough_config_init.c
> +++ b/hw/xen_pci_passthrough_config_init.c
> @@ -375,11 +375,19 @@ static int pt_cmd_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
>      throughable_mask = ~emu_mask & valid_mask;
>  
>      if (*value & PCI_COMMAND_INTX_DISABLE) {
> -        throughable_mask |= PCI_COMMAND_INTX_DISABLE;
> -    } else {
> -        if (s->machine_irq) {
> +        if (s->msi_trans_en) {
> +            pt_msi_set_enable(s, 0);
> +        } else {
>              throughable_mask |= PCI_COMMAND_INTX_DISABLE;
>          }
> +    } else {
> +        if (s->msi_trans_en) {
> +            pt_msi_set_enable(s, 1);
> +        } else {
> +            if (s->machine_irq) {
> +                throughable_mask |= PCI_COMMAND_INTX_DISABLE;
> +            }
> +        }
>      }
>  
>      *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> @@ -1248,13 +1256,21 @@ static void pt_reset_interrupt_and_io_mapping(XenPCIPassthroughState *s)
>      e_device = PCI_SLOT(s->dev.devfn);
>      e_intx = pci_intx(s);
>  
> -    if (s->machine_irq) {
> +    if (s->msi_trans_en == 0 && s->machine_irq) {
>          if (xc_domain_unbind_pt_irq(xen_xc, xen_domid, s->machine_irq,
>                                      PT_IRQ_TYPE_PCI, 0, e_device, e_intx, 0)) {
>              PT_LOG("Error: Unbinding of interrupt failed!\n");
>          }
>      }
>  
> +    /* disable MSI/MSI-X and MSI-INTx translation */
> +    if (s->msi) {
> +        pt_msi_disable(s);
> +    }
> +    if (s->msix) {
> +        pt_msix_disable(s);
> +    }
> +
>      /* clear all virtual region address */
>      for (i = 0; i < PCI_NUM_REGIONS; i++) {
>          r = &d->io_regions[i];
> @@ -1501,6 +1517,406 @@ static XenPTRegInfo pt_emu_reg_pm_tbl[] = {
>      },
>  };
>  
> +/********************************
> + * MSI Capability
> + */
> +
> +/* Message Control register */
> +static uint32_t pt_msgctrl_reg_init(XenPCIPassthroughState *s,
> +                                    XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    PCIDevice *d = &s->dev;
> +    uint16_t reg_field = 0;
> +
> +    /* use I/O device register's value as initial value */
> +    reg_field = pci_get_word(d->config + real_offset);
> +
> +    if (reg_field & PCI_MSI_FLAGS_ENABLE) {
> +        PT_LOG("MSI enabled already, disable first\n");
> +        host_pci_set_word(s->real_device, real_offset,
> +                          reg_field & ~PCI_MSI_FLAGS_ENABLE);
> +    }
> +    s->msi->flags |= reg_field | PT_MSI_FLAG_UNINIT;
> +    s->msi->ctrl_offset = real_offset;
> +
> +    return reg->init_val;
> +}
> +static int pt_msgctrl_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                                uint16_t *value, uint16_t dev_value,
> +                                uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint16_t writable_mask = 0;
> +    uint16_t throughable_mask = 0;
> +    PCIDevice *pd = (PCIDevice *)s;
> +    uint16_t val;
> +
> +    /* Currently no support for multi-vector */
> +    if (*value & PCI_MSI_FLAGS_QSIZE) {
> +        PT_LOG("Warning: try to set more than 1 vector ctrl %x\n", *value);
> +    }
> +
> +    /* modify emulate register */
> +    writable_mask = reg->emu_mask & ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +    /* update the msi_info too */
> +    s->msi->flags |= cfg_entry->data &
> +        ~(PT_MSI_FLAG_UNINIT | PT_MSI_FLAG_MAPPED | PCI_MSI_FLAGS_ENABLE);
> +
> +    /* create value for writing to I/O device register */
> +    val = *value;
> +    throughable_mask = ~reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    /* update MSI */
> +    if (val & PCI_MSI_FLAGS_ENABLE) {
> +        /* setup MSI pirq for the first time */
> +        if (s->msi->flags & PT_MSI_FLAG_UNINIT) {
> +            if (s->msi_trans_en) {
> +                PT_LOG("guest enabling MSI, disable MSI-INTx translation\n");
> +                pt_disable_msi_translate(s);
> +            } else {
> +                /* Init physical one */
> +                PT_LOG("setup msi for dev %x\n", pd->devfn);
> +                if (pt_msi_setup(s)) {
> +                    /* We do not broadcast the error to the framework code, so
> +                     * that MSI errors are contained in MSI emulation code and
> +                     * QEMU can go on running.
> +                     * Guest MSI would be actually not working.
> +                     */
> +                    *value &= ~PCI_MSI_FLAGS_ENABLE;
> +                    PT_LOG("Warning: Can not map MSI for dev %x\n", pd->devfn);
> +                    return 0;
> +                }
> +            }
> +            if (pt_msi_update(s)) {
> +                *value &= ~PCI_MSI_FLAGS_ENABLE;
> +                PT_LOG("Warning: Can not bind MSI for dev %x\n", pd->devfn);
> +                return 0;
> +            }
> +            s->msi->flags &= ~PT_MSI_FLAG_UNINIT;
> +            s->msi->flags |= PT_MSI_FLAG_MAPPED;
> +        }
> +        s->msi->flags |= PCI_MSI_FLAGS_ENABLE;
> +    } else {
> +        s->msi->flags &= ~PCI_MSI_FLAGS_ENABLE;
> +    }
> +
> +    /* pass through MSI_ENABLE bit when no MSI-INTx translation */
> +    if (!s->msi_trans_en) {
> +        *value &= ~PCI_MSI_FLAGS_ENABLE;
> +        *value |= val & PCI_MSI_FLAGS_ENABLE;
> +    }
> +
> +    return 0;
> +}
> +
> +/* initialize Message Upper Address register */
> +static uint32_t pt_msgaddr64_reg_init(XenPCIPassthroughState *ptdev,
> +                                      XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    /* no need to initialize in case of 32 bit type */
> +    if (!(ptdev->msi->flags & PCI_MSI_FLAGS_64BIT)) {
> +        return PT_INVALID_REG;
> +    }
> +
> +    return reg->init_val;
> +}
> +/* this function will be called twice (for 32 bit and 64 bit type) */
> +/* initialize Message Data register */
> +static uint32_t pt_msgdata_reg_init(XenPCIPassthroughState *ptdev,
> +                                    XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    uint32_t flags = ptdev->msi->flags;
> +    uint32_t offset = reg->offset;
> +
> +    /* check the offset whether matches the type or not */
> +    if (((offset == PCI_MSI_DATA_64) &&  (flags & PCI_MSI_FLAGS_64BIT)) ||
> +        ((offset == PCI_MSI_DATA_32) && !(flags & PCI_MSI_FLAGS_64BIT))) {
> +        return reg->init_val;
> +    } else {
> +        return PT_INVALID_REG;
> +    }
> +}
> +
> +/* write Message Address register */
> +static int pt_msgaddr32_reg_write(XenPCIPassthroughState *s,
> +                                  XenPTReg *cfg_entry, uint32_t *value,
> +                                  uint32_t dev_value, uint32_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint32_t writable_mask = 0;
> +    uint32_t throughable_mask = 0;
> +    uint32_t old_addr = cfg_entry->data;
> +
> +    /* modify emulate register */
> +    writable_mask = reg->emu_mask & ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +    /* update the msi_info too */
> +    s->msi->addr_lo = cfg_entry->data;
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    /* update MSI */
> +    if (cfg_entry->data != old_addr) {
> +        if (s->msi->flags & PT_MSI_FLAG_MAPPED) {
> +            pt_msi_update(s);
> +        }
> +    }
> +
> +    return 0;
> +}
> +/* write Message Upper Address register */
> +static int pt_msgaddr64_reg_write(XenPCIPassthroughState *s,
> +                                  XenPTReg *cfg_entry, uint32_t *value,
> +                                  uint32_t dev_value, uint32_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint32_t writable_mask = 0;
> +    uint32_t throughable_mask = 0;
> +    uint32_t old_addr = cfg_entry->data;
> +
> +    /* check whether the type is 64 bit or not */
> +    if (!(s->msi->flags & PCI_MSI_FLAGS_64BIT)) {
> +        /* exit I/O emulator */
> +        PT_LOG("Error: why comes to Upper Address without 64 bit support??\n");

Um, not sure what that means.

> +        return -1;
> +    }
> +
> +    /* modify emulate register */
> +    writable_mask = reg->emu_mask & ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +    /* update the msi_info too */
> +    s->msi->addr_hi = cfg_entry->data;
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    /* update MSI */
> +    if (cfg_entry->data != old_addr) {
> +        if (s->msi->flags & PT_MSI_FLAG_MAPPED) {
> +            pt_msi_update(s);
> +        }
> +    }
> +
> +    return 0;
> +}
> +
> +
> +/* this function will be called twice (for 32 bit and 64 bit type) */
> +/* write Message Data register */
> +static int pt_msgdata_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                                uint16_t *value, uint16_t dev_value,
> +                                uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint16_t writable_mask = 0;
> +    uint16_t throughable_mask = 0;
> +    uint16_t old_data = cfg_entry->data;
> +    uint32_t flags = s->msi->flags;
> +    uint32_t offset = reg->offset;
> +
> +    /* check the offset whether matches the type or not */
> +    if (!((offset == PCI_MSI_DATA_64) &&  (flags & PCI_MSI_FLAGS_64BIT)) &&
> +        !((offset == PCI_MSI_DATA_32) && !(flags & PCI_MSI_FLAGS_64BIT))) {
> +        /* exit I/O emulator */
> +        PT_LOG("Error: the offset is not match with the 32/64 bit type!!\n");

I think it means: "The offset does not match the 32/64 bit type"

> +        return -1;
> +    }
> +
> +    /* modify emulate register */
> +    writable_mask = reg->emu_mask & ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +    /* update the msi_info too */
> +    s->msi->data = cfg_entry->data;
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    /* update MSI */
> +    if (cfg_entry->data != old_data) {
> +        if (flags & PT_MSI_FLAG_MAPPED) {
> +            pt_msi_update(s);
> +        }
> +    }
> +
> +    return 0;
> +}
> +
> +/* MSI Capability Structure reg static infomation table */
> +static XenPTRegInfo pt_emu_reg_msi_tbl[] = {
> +    /* Next Pointer reg */
> +    {
> +        .offset     = PCI_CAP_LIST_NEXT,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_ptr_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* Message Control reg */
> +    {
> +        .offset     = PCI_MSI_FLAGS,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xFF8E,
> +        .emu_mask   = 0x007F,
> +        .init       = pt_msgctrl_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_msgctrl_reg_write,
> +        .u.w.restore  = NULL,
> +    },
> +    /* Message Address reg */
> +    {
> +        .offset     = PCI_MSI_ADDRESS_LO,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .ro_mask    = 0x00000003,
> +        .emu_mask   = 0xFFFFFFFF,
> +        .no_wb      = 1,
> +        .init       = pt_common_reg_init,
> +        .u.dw.read  = pt_long_reg_read,
> +        .u.dw.write = pt_msgaddr32_reg_write,
> +        .u.dw.restore = NULL,
> +    },
> +    /* Message Upper Address reg (if PCI_MSI_FLAGS_64BIT set) */
> +    {
> +        .offset     = PCI_MSI_ADDRESS_HI,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .ro_mask    = 0x00000000,
> +        .emu_mask   = 0xFFFFFFFF,
> +        .no_wb      = 1,
> +        .init       = pt_msgaddr64_reg_init,
> +        .u.dw.read  = pt_long_reg_read,
> +        .u.dw.write = pt_msgaddr64_reg_write,
> +        .u.dw.restore = NULL,
> +    },
> +    /* Message Data reg (16 bits of data for 32-bit devices) */
> +    {
> +        .offset     = PCI_MSI_DATA_32,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0x0000,
> +        .emu_mask   = 0xFFFF,
> +        .no_wb      = 1,
> +        .init       = pt_msgdata_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_msgdata_reg_write,
> +        .u.w.restore  = NULL,
> +    },
> +    /* Message Data reg (16 bits of data for 64-bit devices) */
> +    {
> +        .offset     = PCI_MSI_DATA_64,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0x0000,
> +        .emu_mask   = 0xFFFF,
> +        .no_wb      = 1,
> +        .init       = pt_msgdata_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_msgdata_reg_write,
> +        .u.w.restore  = NULL,
> +    },
> +    {
> +        .size = 0,
> +    },
> +};
> +
> +
> +/**************************************
> + * MSI-X Capability
> + */
> +
> +/* Message Control register for MSI-X */
> +static uint32_t pt_msixctrl_reg_init(XenPCIPassthroughState *s,
> +                                     XenPTRegInfo *reg, uint32_t real_offset)
> +{
> +    PCIDevice *d = &s->dev;
> +    uint16_t reg_field = 0;
> +
> +    /* use I/O device register's value as initial value */
> +    reg_field = pci_get_word(d->config + real_offset);
> +
> +    if (reg_field & PCI_MSIX_FLAGS_ENABLE) {
> +        PT_LOG("MSIX enabled already, disable first\n");
> +        host_pci_set_word(s->real_device, real_offset,
> +                          reg_field & ~PCI_MSIX_FLAGS_ENABLE);
> +    }
> +
> +    s->msix->ctrl_offset = real_offset;
> +
> +    return reg->init_val;
> +}
> +static int pt_msixctrl_reg_write(XenPCIPassthroughState *s,
> +                                 XenPTReg *cfg_entry, uint16_t *value,
> +                                 uint16_t dev_value, uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint16_t writable_mask = 0;
> +    uint16_t throughable_mask = 0;
> +
> +    /* modify emulate register */
> +    writable_mask = reg->emu_mask & ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    /* update MSI-X */
> +    if ((*value & PCI_MSIX_FLAGS_ENABLE)
> +        && !(*value & PCI_MSIX_FLAGS_MASKALL)) {
> +        if (s->msi_trans_en) {
> +            PT_LOG("guest enabling MSI-X, disable MSI-INTx translation\n");
> +            pt_disable_msi_translate(s);
> +        }
> +        pt_msix_update(s);
> +    }
> +
> +    s->msix->enabled = !!(*value & PCI_MSIX_FLAGS_ENABLE);
> +
> +    return 0;
> +}
> +
> +/* MSI-X Capability Structure reg static infomation table */
> +static XenPTRegInfo pt_emu_reg_msix_tbl[] = {
> +    /* Next Pointer reg */
> +    {
> +        .offset     = PCI_CAP_LIST_NEXT,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_ptr_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* Message Control reg */
> +    {
> +        .offset     = PCI_MSI_FLAGS,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0x3FFF,
> +        .emu_mask   = 0x0000,
> +        .init       = pt_msixctrl_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_msixctrl_reg_write,
> +        .u.w.restore  = NULL,
> +    },
> +    {
> +        .size = 0,
> +    },
> +};
> +
>  
>  /****************************
>   * Capabilities
> @@ -1664,6 +2080,48 @@ static uint8_t pt_pcie_size_init(XenPCIPassthroughState *s,
>  
>      return pcie_size;
>  }
> +/* get MSI Capability Structure register group size */
> +static uint8_t pt_msi_size_init(XenPCIPassthroughState *s,
> +                                const XenPTRegGroupInfo *grp_reg,
> +                                uint32_t base_offset)
> +{
> +    PCIDevice *d = &s->dev;
> +    uint16_t msg_ctrl = 0;
> +    uint8_t msi_size = 0xa;
> +
> +    msg_ctrl = pci_get_word(d->config + (base_offset + PCI_MSI_FLAGS));
> +
> +    /* check 64 bit address capable & Per-vector masking capable */

ehh?


> +    if (msg_ctrl & PCI_MSI_FLAGS_64BIT) {
> +        msi_size += 4;
> +    }
> +    if (msg_ctrl & PCI_MSI_FLAGS_MASKBIT) {
> +        msi_size += 10;
> +    }
> +
> +    s->msi = g_malloc0(sizeof (XenPTMSI));
> +    s->msi->pirq = -1;

Is there a define for this -1?

> +    PT_LOG("done\n");
> +
> +    return msi_size;
> +}
> +/* get MSI-X Capability Structure register group size */
> +static uint8_t pt_msix_size_init(XenPCIPassthroughState *s,
> +                                 const XenPTRegGroupInfo *grp_reg,
> +                                 uint32_t base_offset)
> +{
> +    int ret = 0;
> +
> +    ret = pt_msix_init(s, base_offset);
> +
> +    if (ret == -1) {
> +        hw_error("Internal error: Invalid pt_msix_init return value[%d]. "
> +                 "I/O emulator exit.\n", ret);
> +    }
> +
> +    return grp_reg->grp_size;
> +}
> +
>  
>  static const XenPTRegGroupInfo pt_emu_reg_grp_tbl[] = {
>      /* Header Type0 reg group */
> @@ -1704,6 +2162,14 @@ static const XenPTRegGroupInfo pt_emu_reg_grp_tbl[] = {
>          .grp_size   = 0x04,
>          .size_init  = pt_reg_grp_size_init,
>      },
> +    /* MSI Capability Structure reg group */
> +    {
> +        .grp_id      = PCI_CAP_ID_MSI,
> +        .grp_type    = GRP_TYPE_EMU,
> +        .grp_size    = 0xFF,
> +        .size_init   = pt_msi_size_init,
> +        .emu_reg_tbl = pt_emu_reg_msi_tbl,
> +    },
>      /* PCI-X Capabilities List Item reg group */
>      {
>          .grp_id     = PCI_CAP_ID_PCIX,
> @@ -1748,6 +2214,14 @@ static const XenPTRegGroupInfo pt_emu_reg_grp_tbl[] = {
>          .size_init   = pt_pcie_size_init,
>          .emu_reg_tbl = pt_emu_reg_pcie_tbl,
>      },
> +    /* MSI-X Capability Structure reg group */
> +    {
> +        .grp_id      = PCI_CAP_ID_MSIX,
> +        .grp_type    = GRP_TYPE_EMU,
> +        .grp_size    = 0x0C,
> +        .size_init   = pt_msix_size_init,
> +        .emu_reg_tbl = pt_emu_reg_msix_tbl,
> +    },
>      {
>          .grp_size = 0,
>      },
> @@ -1908,8 +2382,11 @@ static int pt_init_pci_config(XenPCIPassthroughState *s)
>      /* reinitialize all emulate register */
>      pt_config_reinit(s);
>  
> +    /* setup MSI-INTx translation if support */
> +    ret = pt_enable_msi_translate(s);
> +
>      /* rebind machine_irq to device */
> -    if (s->machine_irq != 0) {
> +    if (ret < 0 && s->machine_irq != 0) {

So can machine_irq be -1? Or is it only pirq that can be -1?


>          uint8_t e_device = PCI_SLOT(s->dev.devfn);
>          uint8_t e_intx = pci_intx(s);
>  
> @@ -2043,6 +2520,14 @@ void pt_config_delete(XenPCIPassthroughState *s)
>      struct XenPTRegGroup *reg_group, *next_grp;
>      struct XenPTReg *reg, *next_reg;
>  
> +    /* free MSI/MSI-X info table */
> +    if (s->msix) {
> +        pt_msix_delete(s);
> +    }
> +    if (s->msi) {
> +        g_free(s->msi);
> +    }
> +
>      /* free Power Management info table */
>      if (s->pm_state) {
>          if (s->pm_state->pm_timer) {
> diff --git a/hw/xen_pci_passthrough_msi.c b/hw/xen_pci_passthrough_msi.c
> new file mode 100644
> index 0000000..533aef4
> --- /dev/null
> +++ b/hw/xen_pci_passthrough_msi.c
> @@ -0,0 +1,667 @@
> +/*
> + * Copyright (c) 2007, Intel Corporation.
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2.  See
> + * the COPYING file in the top-level directory.
> + *
> + * Jiang Yunhong <yunhong.jiang@intel.com>
> + *
> + * This file implements direct PCI assignment to a HVM guest
> + */
> +
> +#include <sys/mman.h>
> +
> +#include "xen_backend.h"
> +#include "xen_pci_passthrough.h"
> +#include "apic-msidef.h"
> +
> +
> +#define AUTO_ASSIGN -1
> +
> +/* shift count for gflags */
> +#define GFLAGS_SHIFT_DEST_ID        0
> +#define GFLAGS_SHIFT_RH             8
> +#define GFLAGS_SHIFT_DM             9
> +#define GLFAGS_SHIFT_DELIV_MODE     12
> +#define GLFAGS_SHIFT_TRG_MODE       15
> +
> +
> +void pt_msi_set_enable(XenPCIPassthroughState *s, int en)
> +{
> +    uint16_t val = 0;
> +    uint32_t address = 0;
> +    PT_LOG("enable: %i\n", en);
> +
> +    if (!s->msi) {
> +        return;
> +    }
> +
> +    address = s->msi->ctrl_offset;
> +    if (!address) {
> +        return;
> +    }
> +
> +    val = host_pci_get_word(s->real_device, address);
> +    val &= ~PCI_MSI_FLAGS_ENABLE;
> +    val |= en & PCI_MSI_FLAGS_ENABLE;
> +    host_pci_set_word(s->real_device, address, val);
> +
> +    PT_LOG("done, address: %#x, val: %#x\n", address, val);
> +}
> +
> +static void msix_set_enable(XenPCIPassthroughState *s, int en)
> +{
> +    uint16_t val = 0;
> +    uint32_t address = 0;
> +
> +    if (!s->msix) {
> +        return;
> +    }
> +
> +    address = s->msix->ctrl_offset;
> +    if (!address) {
> +        return;
> +    }
> +
> +    val = host_pci_get_word(s->real_device, address);
> +    val &= ~PCI_MSIX_FLAGS_ENABLE;
> +    if (en) {
> +        val |= PCI_MSIX_FLAGS_ENABLE;
> +    }
> +    host_pci_set_word(s->real_device, address, val);
> +}
> +
> +/*********************************/
> +/* MSI virtuailization functions */


virtualization
> +
> +/*
> + * setup physical msi, but didn't enable it

but don't

> + */
> +int pt_msi_setup(XenPCIPassthroughState *s)
> +{
> +    int pirq = -1;
> +    uint8_t gvec = 0;
> +
> +    if (!(s->msi->flags & PT_MSI_FLAG_UNINIT)) {
> +        PT_LOG("Error: setup physical after initialized??\n");

I am not sure what that says.

> +        return -1;
> +    }
> +
> +    gvec = s->msi->data & 0xFF;
> +    if (!gvec) {
> +        /* if gvec is 0, the guest is asking for a particular pirq that
> +         * is passed as dest_id */
> +        pirq = (s->msi->addr_hi & 0xffffff00) |
> +               ((s->msi->addr_lo >> MSI_ADDR_DEST_ID_SHIFT) & 0xff);
> +        if (!pirq) {
> +            /* this probably identifies an misconfiguration of the guest,
> +             * try the emulated path */
> +            pirq = -1;
> +        } else {
> +            PT_LOG("pt_msi_setup requested pirq = %d\n", pirq);
> +        }
> +    }
> +
> +    if (xc_physdev_map_pirq_msi(xen_xc, xen_domid, AUTO_ASSIGN, &pirq,
> +                                PCI_DEVFN(s->real_device->dev,
> +                                          s->real_device->func),
> +                                s->real_device->bus, 0, 0)) {
> +        PT_LOG("Error: Mapping of MSI failed.\n");

Give more details. As in what device failed. PErhaps even the return code?

> +        return -1;
> +    }
> +
> +    if (pirq < 0) {
> +        PT_LOG("Error: Invalid pirq number\n");
> +        return -1;
> +    }
> +
> +    s->msi->pirq = pirq;
> +    PT_LOG("msi mapped with pirq %x\n", pirq);
> +
> +    return 0;
> +}
> +
> +static uint32_t __get_msi_gflags(uint32_t data, uint64_t addr)
> +{
> +    uint32_t result = 0;
> +    int rh, dm, dest_id, deliv_mode, trig_mode;
> +
> +    rh = (addr >> MSI_ADDR_REDIRECTION_SHIFT) & 0x1;
> +    dm = (addr >> MSI_ADDR_DEST_MODE_SHIFT) & 0x1;
> +    dest_id = (addr >> MSI_ADDR_DEST_ID_SHIFT) & 0xff;
> +    deliv_mode = (data >> MSI_DATA_DELIVERY_MODE_SHIFT) & 0x7;
> +    trig_mode = (data >> MSI_DATA_TRIGGER_SHIFT) & 0x1;
> +
> +    result = dest_id | (rh << GFLAGS_SHIFT_RH) | (dm << GFLAGS_SHIFT_DM) |
> +             (deliv_mode << GLFAGS_SHIFT_DELIV_MODE) |
> +             (trig_mode << GLFAGS_SHIFT_TRG_MODE);
> +
> +    return result;
> +}
> +
> +int pt_msi_update(XenPCIPassthroughState *s)
> +{
> +    uint8_t gvec = 0;
> +    uint32_t gflags = 0;
> +    uint64_t addr = 0;
> +    int ret = 0;
> +
> +    /* get vector, address, flags info, etc. */
> +    gvec = s->msi->data & 0xFF;
> +    addr = (uint64_t)s->msi->addr_hi << 32 | s->msi->addr_lo;
> +    gflags = __get_msi_gflags(s->msi->data, addr);
> +
> +    PT_LOG("Update msi with pirq %x gvec %x gflags %x\n",
> +           s->msi->pirq, gvec, gflags);

And the details for the device?

> +
> +    ret = xc_domain_update_msi_irq(xen_xc, xen_domid, gvec,
> +                                   s->msi->pirq, gflags, 0);
> +
> +    if (ret) {
> +        PT_LOG("Error: Binding of MSI failed.\n");
> +
> +        if (xc_physdev_unmap_pirq(xen_xc, xen_domid, s->msi->pirq)) {
> +            PT_LOG("Error: Unmapping of MSI failed.\n");
> +        }
> +        s->msi->pirq = -1;
> +        return ret;
> +    }
> +    return 0;
> +}
> +
> +void pt_msi_disable(XenPCIPassthroughState *s)
> +{
> +    PCIDevice *d = &s->dev;
> +    uint8_t gvec = 0;
> +    uint32_t gflags = 0;
> +    uint64_t addr = 0;
> +    uint8_t e_device = 0;
> +    uint8_t e_intx = 0;
> +
> +    pt_msi_set_enable(s, 0);
> +
> +    e_device = PCI_SLOT(d->devfn);
> +    e_intx = pci_intx(s);
> +
> +    if (s->msi_trans_en) {
> +        if (xc_domain_unbind_pt_irq(xen_xc, xen_domid, s->msi->pirq,
> +                                    PT_IRQ_TYPE_MSI_TRANSLATE, 0,
> +                                    e_device, e_intx, 0)) {
> +            PT_LOG("Error: Unbinding pt irq for MSI-INTx failed!\n");
> +            goto out;
> +        }
> +    } else if (!(s->msi->flags & PT_MSI_FLAG_UNINIT)) {
> +        /* get vector, address, flags info, etc. */
> +        gvec = s->msi->data & 0xFF;
> +        addr = (uint64_t)s->msi->addr_hi << 32 | s->msi->addr_lo;
> +        gflags = __get_msi_gflags(s->msi->data, addr);
> +
> +        PT_LOG("Unbind msi with pirq %x, gvec %x\n",
> +                s->msi->pirq, gvec);
> +
> +        if (xc_domain_unbind_msi_irq(xen_xc, xen_domid, gvec,
> +                                        s->msi->pirq, gflags)) {
> +            PT_LOG("Error: Unbinding of MSI failed. [%02x:%02x.%x]\n",
> +                   pci_bus_num(d->bus), PCI_SLOT(d->devfn),
> +                   PCI_FUNC(d->devfn));
> +            goto out;
> +        }
> +    }
> +
> +    if (s->msi->pirq != -1) {
> +        PT_LOG("Unmap msi with pirq %x\n", s->msi->pirq);
> +
> +        if (xc_physdev_unmap_pirq(xen_xc, xen_domid, s->msi->pirq)) {
> +            PT_LOG("Error: Unmapping of MSI failed. [%02x:%02x.%x]\n",
> +                   pci_bus_num(d->bus), PCI_SLOT(d->devfn),
> +                   PCI_FUNC(d->devfn));
> +            goto out;
> +        }
> +    }
> +
> +out:
> +    /* clear msi info */
> +    s->msi->flags = 0;
> +    s->msi->pirq = -1;
> +    s->msi_trans_en = 0;
> +}
> +
> +/* MSI-INTx translation virtulization functions */

virtualization

> +int pt_enable_msi_translate(XenPCIPassthroughState *s)
> +{
> +    uint8_t e_device = 0;
> +    uint8_t e_intx = 0;
> +
> +    if (!(s->msi && s->msi_trans_cap)) {
> +        return -1;
> +    }
> +
> +    pt_msi_set_enable(s, 0);
> +    s->msi_trans_en = 0;
> +
> +    if (pt_msi_setup(s)) {
> +        PT_LOG("Error: MSI-INTx translation MSI setup failed, fallback\n");
> +        return -1;
> +    }
> +
> +    e_device = PCI_SLOT(s->dev.devfn);
> +    /* fix virtual interrupt pin to INTA# */
> +    e_intx = pci_intx(s);
> +
> +    if (xc_domain_bind_pt_irq(xen_xc, xen_domid, s->msi->pirq,
> +                              PT_IRQ_TYPE_MSI_TRANSLATE, 0,
> +                              e_device, e_intx, 0)) {
> +        PT_LOG("Error: MSI-INTx translation bind failed, fallback\n");
> +
> +        if (xc_physdev_unmap_pirq(xen_xc, xen_domid, s->msi->pirq)) {
> +            PT_LOG("Error: Unmapping of MSI failed.\n");
> +        }
> +        s->msi->pirq = -1;
> +        return -1;
> +    }
> +
> +    pt_msi_set_enable(s, 1);
> +    s->msi_trans_en = 1;
> +
> +    return 0;
> +}
> +
> +void pt_disable_msi_translate(XenPCIPassthroughState *s)
> +{
> +    uint8_t e_device = 0;
> +    uint8_t e_intx = 0;
> +
> +    /* MSI_ENABLE bit should be disabed until the new handler is set */
> +    pt_msi_set_enable(s, 0);
> +
> +    e_device = PCI_SLOT(s->dev.devfn);
> +    e_intx = pci_intx(s);
> +
> +    if (xc_domain_unbind_pt_irq(xen_xc, xen_domid, s->msi->pirq,
> +                                 PT_IRQ_TYPE_MSI_TRANSLATE, 0,
> +                                 e_device, e_intx, 0)) {
> +        PT_LOG("Error: Unbinding pt irq for MSI-INTx failed!\n");
> +    }
> +
> +    if (s->machine_irq) {
> +        if (xc_domain_bind_pt_pci_irq(xen_xc, xen_domid, s->machine_irq,
> +                                       0, e_device, e_intx)) {
> +            PT_LOG("Error: Rebinding of interrupt failed!\n");
> +        }
> +    }
> +
> +    s->msi_trans_en = 0;
> +}
> +
> +/*********************************/
> +/* MSI-X virtulization functions */


virtu...

> +
> +static void mask_physical_msix_entry(XenPCIPassthroughState *s,
> +                                     int entry_nr, int mask)
> +{
> +    void *phys_off;
> +
> +    phys_off = s->msix->phys_iomem_base + 16 * entry_nr + 12;
> +    *(uint32_t *)phys_off = mask;
> +}
> +
> +static int pt_msix_update_one(XenPCIPassthroughState *s, int entry_nr)
> +{
> +    XenMSIXEntry *entry = &s->msix->msix_entry[entry_nr];
> +    int pirq = entry->pirq;
> +    int gvec = entry->io_mem[2] & 0xff;
> +    uint64_t gaddr = *(uint64_t *)&entry->io_mem[0];
> +    uint32_t gflags = __get_msi_gflags(entry->io_mem[2], gaddr);
> +    int ret;
> +
> +    if (!entry->flags) {
> +        return 0;
> +    }
> +
> +    if (!gvec) {
> +        /* if gvec is 0, the guest is asking for a particular pirq that
> +         * is passed as dest_id */
> +        pirq = ((gaddr >> 32) & 0xffffff00) |
> +               (((gaddr & 0xffffffff) >> MSI_ADDR_DEST_ID_SHIFT) & 0xff);
> +        if (!pirq) {
> +            /* this probably identifies an misconfiguration of the guest,
> +             * try the emulated path */
> +            pirq = -1;
> +        } else {
> +            PT_LOG("pt_msix_update_one requested pirq = %d\n", pirq);

This is the same code as in the MSI case. Could it be coalesced ?

> +        }
> +    }
> +
> +    /* Check if this entry is already mapped */
> +    if (entry->pirq == -1) {
> +        ret = xc_physdev_map_pirq_msi(xen_xc, xen_domid, AUTO_ASSIGN, &pirq,
> +                                      PCI_DEVFN(s->real_device->dev,
> +                                                s->real_device->func),
> +                                      s->real_device->bus, entry_nr,
> +                                      s->msix->table_base);
> +        if (ret) {
> +            PT_LOG("Error: Mapping msix entry %x\n", entry_nr);

Oh boy. So here the error is %x, but later on it is %d. Should it
be %d or 0x%x?


> +            return ret;
> +        }
> +        entry->pirq = pirq;
> +    }
> +
> +    PT_LOG("Update msix entry %x with pirq %x gvec %x\n",
> +            entry_nr, pirq, gvec);
> +
> +    ret = xc_domain_update_msi_irq(xen_xc, xen_domid, gvec, pirq, gflags,
> +                                   s->msix->mmio_base_addr);
> +    if (ret) {
> +        PT_LOG("Error: Updating msix irq info for entry %d\n", entry_nr);
> +
> +        if (xc_physdev_unmap_pirq(xen_xc, xen_domid, entry->pirq)) {
> +            PT_LOG("Error: Unmapping of MSI-X failed.\n");
> +        }
> +        entry->pirq = -1;
> +        return ret;
> +    }
> +
> +    entry->flags = 0;
> +
> +    return 0;
> +}
> +
> +int pt_msix_update(XenPCIPassthroughState *s)
> +{
> +    XenPTMSIX *msix = s->msix;
> +    int i;
> +
> +    for (i = 0; i < msix->total_entries; i++) {
> +        pt_msix_update_one(s, i);
> +    }
> +
> +    return 0;
> +}
> +
> +void pt_msix_disable(XenPCIPassthroughState *s)
> +{
> +    PCIDevice *d = &s->dev;
> +    uint8_t gvec = 0;
> +    uint32_t gflags = 0;
> +    uint64_t addr = 0;
> +    int i = 0;
> +    XenMSIXEntry *entry = NULL;
> +
> +    msix_set_enable(s, 0);
> +
> +    for (i = 0; i < s->msix->total_entries; i++) {
> +        entry = &s->msix->msix_entry[i];
> +
> +        if (entry->pirq == -1) {
> +            continue;
> +        }
> +
> +        gvec = entry->io_mem[2] & 0xff;
> +        addr = *(uint64_t *)&entry->io_mem[0];
> +        gflags = __get_msi_gflags(entry->io_mem[2], addr);
> +
> +        PT_LOG("Unbind msix with pirq %x, gvec %x\n",
> +                entry->pirq, gvec);
> +
> +        if (xc_domain_unbind_msi_irq(xen_xc, xen_domid, gvec,
> +                                        entry->pirq, gflags)) {
> +            PT_LOG("Error: Unbinding of MSI-X failed. [%02x:%02x.%x]\n",
> +                   pci_bus_num(d->bus), PCI_SLOT(d->devfn),
> +                   PCI_FUNC(d->devfn));
> +        } else {
> +            PT_LOG("Unmap msix with pirq %x\n", entry->pirq);
> +
> +            if (xc_physdev_unmap_pirq(xen_xc, xen_domid, entry->pirq)) {
> +                PT_LOG("Error: Unmapping of MSI-X failed. [%02x:%02x.%x]\n",
> +                       pci_bus_num(d->bus),
> +                       PCI_SLOT(d->devfn), PCI_FUNC(d->devfn));

There is a lot of those error reporting where the pci_bus_num, PCI_SLOT, etc
are used. Perhaps this should be in a function?

> +            }
> +        }
> +        /* clear msi-x info */
> +        entry->pirq = -1;
> +        entry->flags = 0;
> +    }
> +}
> +
> +int pt_msix_update_remap(XenPCIPassthroughState *s, int bar_index)
> +{
> +    XenMSIXEntry *entry;
> +    int i, ret;
> +
> +    if (!(s->msix && s->msix->bar_index == bar_index)) {
> +        return 0;
> +    }
> +
> +    for (i = 0; i < s->msix->total_entries; i++) {
> +        entry = &s->msix->msix_entry[i];
> +        if (entry->pirq != -1) {
> +            ret = xc_domain_unbind_pt_irq(xen_xc, xen_domid, entry->pirq,
> +                                          PT_IRQ_TYPE_MSI, 0, 0, 0, 0);
> +            if (ret) {
> +                PT_LOG("Error: unbind MSI-X entry %d failed\n", entry->pirq);
> +            }
> +            entry->flags = 1;
> +        }
> +    }
> +    pt_msix_update(s);
> +
> +    return 0;
> +}
> +
> +static void pci_msix_invalid_write(void *opaque, target_phys_addr_t addr,
> +                                   uint32_t val)
> +{
> +    PT_LOG("Error: Invalid write to MSI-X table,"
> +           " only dword access is allowed.\n");
> +}
> +
> +static void pci_msix_writel(void *opaque, target_phys_addr_t addr,
> +                            uint32_t val)
> +{
> +    XenPCIPassthroughState *s = (XenPCIPassthroughState *)opaque;
> +    XenPTMSIX *msix = s->msix;
> +    XenMSIXEntry *entry;
> +    int entry_nr, offset;
> +    void *phys_off;
> +    uint32_t vec_ctrl;
> +
> +    if (addr % 4) {
> +        PT_LOG("Error: Unaligned dword access to MSI-X table, "
> +                "addr %016"PRIx64"\n", addr);
> +        return;
> +    }
> +
> +    PT_LOG("addr: "TARGET_FMT_plx", val: %#x\n", addr, val);

Huh?

> +
> +    entry_nr = addr / 16;
> +    entry = &msix->msix_entry[entry_nr];
> +    offset = (addr % 16) / 4;
> +
> +    /*
> +     * If Xen intercepts the mask bit access, io_mem[3] may not be
> +     * up-to-date. Read from hardware directly.
> +     */
> +    phys_off = s->msix->phys_iomem_base + 16 * entry_nr + 12;
> +    vec_ctrl = *(uint32_t *)phys_off;
> +
> +    if (offset != 3 && msix->enabled && !(vec_ctrl & 0x1)) {
> +        PT_LOG("Error: Can't update msix entry %d since MSI-X is already "
> +                "function.\n", entry_nr);

already function? already on? active?


> +        return;
> +    }
> +
> +    if (offset != 3 && entry->io_mem[offset] != val) {
> +        entry->flags = 1;
> +    }
> +    entry->io_mem[offset] = val;
> +
> +    if (offset == 3) {
> +        if (msix->enabled && !(val & 0x1)) {
> +            pt_msix_update_one(s, entry_nr);
> +        }
> +        mask_physical_msix_entry(s, entry_nr, entry->io_mem[3] & 0x1);
> +    }
> +}
> +
> +static CPUWriteMemoryFunc *pci_msix_write[] = {
> +    pci_msix_invalid_write,
> +    pci_msix_invalid_write,
> +    pci_msix_writel
> +};
> +
> +static uint32_t pci_msix_invalid_read(void *opaque, target_phys_addr_t addr)
> +{
> +    PT_LOG("Error: Invalid read to MSI-X table,"
> +           " only dword access is allowed.\n");
> +    return 0;
> +}
> +
> +static uint32_t pci_msix_readl(void *opaque, target_phys_addr_t addr)
> +{
> +    XenPCIPassthroughState *s = (XenPCIPassthroughState *)opaque;
> +    XenPTMSIX *msix = s->msix;
> +    int entry_nr, offset;
> +
> +    if (addr % 4) {
> +        PT_LOG("Error: Unaligned dword access to MSI-X table, "
> +                "addr %016"PRIx64"\n", addr);
> +        return 0;
> +    }
> +
> +    PT_LOG("addr: "TARGET_FMT_plx"\n", addr);
> +
> +    entry_nr = addr / 16;
> +    offset = (addr % 16) / 4;
> +
> +    return msix->msix_entry[entry_nr].io_mem[offset];
> +}
> +
> +static CPUReadMemoryFunc *pci_msix_read[] = {
> +    pci_msix_invalid_read,
> +    pci_msix_invalid_read,
> +    pci_msix_readl
> +};
> +
> +int pt_add_msix_mapping(XenPCIPassthroughState *s, int bar_index)
> +{
> +    if (!(s->msix && s->msix->bar_index == bar_index)) {
> +        return 0;
> +    }
> +
> +    return xc_domain_memory_mapping(xen_xc, xen_domid,
> +         s->msix->mmio_base_addr >> XC_PAGE_SHIFT,
> +         (s->bases[bar_index].access.maddr + s->msix->table_off)
> +             >> XC_PAGE_SHIFT,
> +         (s->msix->total_entries * 16 + XC_PAGE_SIZE - 1) >> XC_PAGE_SHIFT,
> +         DPCI_ADD_MAPPING);
> +}
> +
> +int pt_remove_msix_mapping(XenPCIPassthroughState *s, int bar_index)
> +{
> +    if (!(s->msix && s->msix->bar_index == bar_index)) {
> +        return 0;
> +    }
> +
> +    s->msix->mmio_base_addr = s->bases[bar_index].e_physbase
> +        + s->msix->table_off;
> +
> +    cpu_register_physical_memory(s->msix->mmio_base_addr,
> +                                 s->msix->total_entries * 16,
> +                                 s->msix->mmio_index);
> +
> +    return xc_domain_memory_mapping(xen_xc, xen_domid,
> +         s->msix->mmio_base_addr >> XC_PAGE_SHIFT,
> +         (s->bases[bar_index].access.maddr + s->msix->table_off)
> +             >> XC_PAGE_SHIFT,
> +         (s->msix->total_entries * 16 + XC_PAGE_SIZE - 1) >> XC_PAGE_SHIFT,
> +         DPCI_REMOVE_MAPPING);
> +}
> +
> +int pt_msix_init(XenPCIPassthroughState *s, int base)
> +{
> +    uint8_t id;
> +    uint16_t control;
> +    int i, total_entries, table_off, bar_index;
> +    HostPCIDevice *d = s->real_device;
> +    int fd;
> +
> +    id = host_pci_get_byte(d, base + PCI_CAP_LIST_ID);
> +
> +    if (id != PCI_CAP_ID_MSIX) {
> +        PT_LOG("Error: Invalid id %#x base %#x\n", id, base);
> +        return -1;
> +    }
> +
> +    control = host_pci_get_word(d, base + 2);
> +    total_entries = control & 0x7ff;
> +    total_entries += 1;
> +
> +    s->msix = g_malloc0(sizeof (XenPTMSIX)
> +                        + total_entries * sizeof (XenMSIXEntry));
> +
> +    s->msix->total_entries = total_entries;
> +    for (i = 0; i < total_entries; i++) {
> +        s->msix->msix_entry[i].pirq = -1;
> +    }
> +
> +    s->msix->mmio_index =
> +        cpu_register_io_memory(pci_msix_read, pci_msix_write,
> +                               s, DEVICE_NATIVE_ENDIAN);
> +
> +    table_off = host_pci_get_long(d, base + PCI_MSIX_TABLE);
> +    bar_index = s->msix->bar_index = table_off & PCI_MSIX_FLAGS_BIRMASK;
> +    table_off = s->msix->table_off = table_off & ~PCI_MSIX_FLAGS_BIRMASK;
> +    s->msix->table_base = s->real_device->io_regions[bar_index].base_addr;
> +    PT_LOG("get MSI-X table bar base %#"PRIx64"\n", s->msix->table_base);
> +
> +    fd = open("/dev/mem", O_RDWR);
> +    if (fd == -1) {
> +        PT_LOG("Error: Can't open /dev/mem: %s\n", strerror(errno));
> +        goto error_out;
> +    }
> +    PT_LOG("table_off = %#x, total_entries = %d\n", table_off, total_entries);
> +    s->msix->table_offset_adjust = table_off & 0x0fff;
> +    s->msix->phys_iomem_base =
> +        mmap(0,
> +             total_entries * 16 + s->msix->table_offset_adjust,
> +             PROT_WRITE | PROT_READ,
> +             MAP_SHARED | MAP_LOCKED,
> +             fd,
> +             s->msix->table_base + table_off - s->msix->table_offset_adjust);
> +
> +    if (s->msix->phys_iomem_base == MAP_FAILED) {
> +        PT_LOG("Error: Can't map physical MSI-X table: %s\n", strerror(errno));
> +        close(fd);
> +        goto error_out;
> +    }
> +    s->msix->phys_iomem_base = (char *)s->msix->phys_iomem_base
> +        + s->msix->table_offset_adjust;
> +
> +    close(fd);
> +
> +    PT_LOG("mapping physical MSI-X table to %p\n", s->msix->phys_iomem_base);
> +    return 0;
> +
> +error_out:
> +    g_free(s->msix);
> +    s->msix = NULL;
> +    return -1;
> +}
> +
> +void pt_msix_delete(XenPCIPassthroughState *s)
> +{
> +    /* unmap the MSI-X memory mapped register area */
> +    if (s->msix->phys_iomem_base) {
> +        PT_LOG("unmapping physical MSI-X table from %lx\n",
> +           (unsigned long)s->msix->phys_iomem_base);
> +        munmap(s->msix->phys_iomem_base, s->msix->total_entries * 16 +
> +           s->msix->table_offset_adjust);
> +    }
> +
> +    if (s->msix->mmio_index > 0) {
> +        cpu_unregister_io_memory(s->msix->mmio_index);
> +    }
> +
> +    g_free(s->msix);
> +    s->msix = NULL;
> +}
> -- 
> Anthony PERARD
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 14:22:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 14:22:36 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROd12-0008HR-DB; Thu, 10 Nov 2011 14:22:36 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROd0H-00084c-Cu
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 14:21:49 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1320963675!56763816!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25345 invoked from network); 10 Nov 2011 22:21:16 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-6.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 22:21:16 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAAMLgiE015187
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 10 Nov 2011 22:21:43 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAAMLfkt007530
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 10 Nov 2011 22:21:42 GMT
Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAAMLaQ1016244; Thu, 10 Nov 2011 16:21:36 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 10 Nov 2011 14:21:35 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id E57BC819F2; Thu, 10 Nov 2011 17:21:34 -0500 (EST)
Date: Thu, 10 Nov 2011 17:21:34 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Xin Jin <jxinpku@gmail.com>
Subject: Re: [Xen-devel] Cannot get shared page in domU
Message-ID: <20111110222134.GA24563@phenom.dumpdata.com>
References: <CAKpDeakqB2eRMbGLZwuY9Dyka+BFJSwNO+1g=9WmyJ6uF+b61A@mail.gmail.com>
	<CAP2B858Uiic4+ZOKBcTNChf+Nt++G4pwktyrE=U+CLn2sCdwjg@mail.gmail.com>
	<CAKpDeamBEHAnpUo5mqLZrAa3=DwLsAdSgzbj9YEfS8o6JK9gKQ@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAKpDeamBEHAnpUo5mqLZrAa3=DwLsAdSgzbj9YEfS8o6JK9gKQ@mail.gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090205.4EBC4E77.0074,ss=1,re=0.000,fgs=0
Cc: Daniel Castro <evil.dani@gmail.com>, xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Nov 10, 2011 at 10:54:23AM -0500, Xin Jin wrote:
> In
> 
> share_mem->gref =
> gnttab_grant_foreign_access(domid_remote, virt_to_mfn(share_mem), 0);

Huh? There are four parameters for that function.


When you setup your map_op, are you setting
 GNTMAP_application_map | GNTMAP_contains_pte
?
Or are using GNTMAP_host_map

Did you look in the 3.1 linux kerne in the gntdev.c driver? Or the other drivers?
Can you use grant-alloc for your code (which can setup shared memory
segements between guests) instead of doing this in the kernel?


> 
> I have explicitly specified the domid that can use the gref as
> "domid_remote".
> 
> What else can be wrong?
> 
> On Thu, Nov 10, 2011 at 12:09 AM, Daniel Castro <evil.dani@gmail.com> wrote:
> 
> > On Thu, Nov 10, 2011 at 1:15 PM, Xin Jin <jxinpku@gmail.com> wrote:
> > > Hi, I cannot get a shared page in domU.
> > > In a domU, I used the folloing code to grant a page to another domU.
> > > share_mem = (share_mem_desp *) __get_free_page(GFP_KERNEL);
> > > share_mem->gref = gnttab_grant_foreign_access(domid_remote,
> > > virt_to_mfn(share_mem), 0);
> > > In another domU, I used the folloing code to get the shared page.
> > > share_vmarea = alloc_vm_area(PAGE_SIZE);
> > > gnttab_set_map_op( &map_op, (unsigned long)share_vmarea->addr,
> > > GNTMAP_host_map, gref, domid_remote );
> > > HYPERVISOR_grant_table_op( GNTTABOP_map_grant_ref, &map_op, 1 );
> > > While using the exactly same code to get the shared page in dom0, it woks
> > > all well. But it cannot work in domU.
> > > I use Xen 4.1.1 and fedora 14 ( linux 3.1.0 both for dom0 and domU ).
> > > Can anyone help me?
> > On the interface struct when you issue the hypercall you need to
> > specify the domid that can use the gref. Maybe the default is domid 0.
> > The struct grant_entry_v1 has member domid for the foreign guest,
> > check that value.
> >
> > > Thanks!
> > > -- Xin
> > >
> > >
> > > _______________________________________________
> > > Xen-devel mailing list
> > > Xen-devel@lists.xensource.com
> > > http://lists.xensource.com/xen-devel
> > >
> > >
> >
> >
> >
> > --
> > +-=====---------------------------+
> > | +---------------------------------+ | This space intentionally blank
> > for notetaking.
> > | |   | Daniel Castro,                |
> > | |   | Consultant/Programmer.|
> > | |   | U Andes                         |
> > +-------------------------------------+
> >
> 
> 
> 
> -- 
> Xin JIN
> PhD student
> Department of Computer Science
> Princeton University

> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 14:23:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 14:23:39 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROd23-0000DA-J3; Thu, 10 Nov 2011 14:23:39 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROd0o-0008Ca-34
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 14:22:22 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1320963737!2176185!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17047 invoked from network); 10 Nov 2011 22:22:18 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-5.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 22:22:18 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAAMMFSd016065
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 10 Nov 2011 22:22:16 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAAMMEfo009607
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 10 Nov 2011 22:22:15 GMT
Received: from abhmt105.oracle.com (abhmt105.oracle.com [141.146.116.57])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAAMM968011802; Thu, 10 Nov 2011 16:22:09 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 10 Nov 2011 14:22:09 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id AB686819F2; Thu, 10 Nov 2011 17:22:08 -0500 (EST)
Date: Thu, 10 Nov 2011 17:22:08 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Daniel Castro <evil.dani@gmail.com>
Subject: Re: [Xen-devel] Grant a partial page
Message-ID: <20111110222208.GB24563@phenom.dumpdata.com>
References: <CAP2B85-NrwhELRMpndhq3vzxqEuZRjsZi3C6bJ6ze3q=Dfu=aA@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAP2B85-NrwhELRMpndhq3vzxqEuZRjsZi3C6bJ6ze3q=Dfu=aA@mail.gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090205.4EBC4E98.0063,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Nov 10, 2011 at 02:46:37PM +0900, Daniel Castro wrote:
> Hello,
> I to issue a grant on a page, but only partially.
> I have a pointer to somewhere in memory and need to issue the grant
> for such a pointer but not to the entire page.
> I know FLAG GTF_sub_page is used for that purpose but grant_entry_v1
> apparently has no fields for sub_page, should I change the code to use
> Version 2 grant table entries?

Well, there is no implementation for V2 grants yet. Thought Annie just posted
a version.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 14:53:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 14:53:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROdVL-0001o8-7U; Thu, 10 Nov 2011 14:53:55 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROdUX-0001bp-BI
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 14:53:05 -0800
X-Env-Sender: dkiper@net-space.pl
X-Msg-Ref: server-15.tower-216.messagelabs.com!1320965581!3067843!1
X-Originating-IP: [89.174.63.77]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5322 invoked from network); 10 Nov 2011 22:53:02 -0000
Received: from router-fw.net-space.pl (HELO router-fw.net-space.pl)
	(89.174.63.77)
	by server-15.tower-216.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 10 Nov 2011 22:53:02 -0000
Received: (from localhost user: 'dkiper' uid#4000 fake: STDIN
	(dkiper@router-fw.net-space.pl)) by router-fw-old.local.net-space.pl
	id S1602996Ab1KJWxA (ORCPT <rfc822;xen-devel@lists.xensource.com>);
	Thu, 10 Nov 2011 23:53:00 +0100
Date: Thu, 10 Nov 2011 23:53:00 +0100
From: Daniel Kiper <dkiper@net-space.pl>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <20111110225300.GB20293@router-fw-old.local.net-space.pl>
References: <20111110085821.GA15751@router-fw-old.local.net-space.pl>
	<4EBBB53D020000780006019D@nat28.tlf.novell.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EBBB53D020000780006019D@nat28.tlf.novell.com>
User-Agent: Mutt/1.3.28i
Cc: xen-devel@lists.xensource.com, Daniel Kiper <dkiper@net-space.pl>,
	konrad.wilk@oracle.com
Subject: [Xen-devel] Re: An issue in xen_limit_pages_to_max_mfn() in
	Xenlinux Ver. 2.6.18
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Nov 10, 2011 at 10:27:57AM +0000, Jan Beulich wrote:
> >>> On 10.11.11 at 09:58, Daniel Kiper <dkiper@net-space.pl> wrote:
> > Hi Jan,
> >
> > During work on kexec/kdump for Xen domU I found that
> > xen_limit_pages_to_max_mfn() registers undo_limit_pages()
> > destructor which breaks __free_pages(). When __free_pages()
> > is called then at beginning of this function put_page_testzero()
> > is called which decrements page count for given page. Later
> > undo_limit_pages() destructor is called which once again
> > calls __free_pages() and in consequence put_page_testzero()
> > fails (BUG_ON() is called) because page count is 0.
>
> Seems like (on newer kernels, where this is a VM_BUG_ON()) this was
> never hit on a configuration with CONFIG_DEBUG_VM, and on the older
> kernels the function was never used for memory that would get freed
> later (only kexec uses it there).
>
> > It could
> > be easily fixed, however, after reviewing xen_limit_pages_to_max_mfn()
> > I could not find any good reason for which undo_limit_pages()
> > destructor is registered. Maybe it could be removed at all because
> > all pages are freed when __free_pages() is called and in this
> > case we do not care where they live. However, maybe I missed
> > something important.
>
> It does matter - otherwise, over time, we could exhaust memory
> below a certain boundary in Xen.

Ahhhh... I thought about that once, however, I could not find it
in the code. It is not clear because there is no any comment. As
I understand HYPERVISOR_memory_op(XENMEM_exchange, &exchange) prefers
to allocate pages from Xen which live on higher addresses (at the
end of physical memory) if exchange.out.address_bits is 0. This
behavior leads to situation where pages with higher addresses
are more prefered than with lower addresses. In consequence pages
are moved from lower MFNs to higher MFNs.

Please correct me if I am wrong.

> So I think we need to add an init_page_count() call to undo_limit_pages().

Hmmm... I think it is not good solution in that point. I suppose that you
found this usage in balloon driver, however, here it is not the case.
Balloon driver initializes page structure for pages allocated from Xen
by calling init_page_count() (inter alia). It means that it is used
more or less accordingly to a comment in include/linux/mm.h (Setup the
page count before being freed into the page allocator for the first time
(boot or memory hotplug)). However, I think we should not simply reset
page count in undo_limit_pages(). It could lead to unexpected results.

Now I think about two solutions for that problem:
  1) We could simply remove undo_limit_pages() destructor and move responsibility
     of pages relocation before freeing them to the caller. I prefer that solution,
     because it gives more flexibility to the developer and similar solution
     must/will be used in latest kernels (PageForeign mechanism is not available
     there or I missed something).

  2) We could prepare new function, e.g.

     fastcall void __free_pages_core(struct page *page, unsigned int order) {
             if (order == 0)
                     free_hot_page(page);
             else
                     __free_pages_ok(page, order);
     }

     and call it from undo_limit_pages() destructor instead of __free_pages().

What do you think about that ???

Daniel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 14:59:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 14:59:42 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROdav-0002HT-7G; Thu, 10 Nov 2011 14:59:41 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROdYq-00023W-GA
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 14:57:33 -0800
X-Env-Sender: oor@cs.cmu.edu
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320965822!52283509!1
X-Originating-IP: [128.2.217.197]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23479 invoked from network); 10 Nov 2011 22:57:03 -0000
Received: from smtp02.srv.cs.cmu.edu (HELO smtp02.srv.cs.cmu.edu)
	(128.2.217.197)
	by server-9.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 22:57:03 -0000
Received: from webmail.cs.cmu.edu (TOMENTOSA.SRV.CS.CMU.EDU [128.2.172.30])
	by smtp02.srv.cs.cmu.edu (8.13.6/8.13.6) with ESMTP id pAAMvRct029958
	for <xen-devel@lists.xensource.com>;
	Thu, 10 Nov 2011 17:57:27 -0500 (EST)
Received: from 128.2.134.97
	(SquirrelMail authenticated user oor/mail@CS.CMU.EDU)
	by webmail.cs.cmu.edu with HTTP;
	Thu, 10 Nov 2011 17:57:27 -0500 (EST)
Message-ID: <50891.128.2.134.97.1320965847.squirrel@webmail.cs.cmu.edu>
Date: Thu, 10 Nov 2011 17:57:27 -0500 (EST)
From: "Olatunji Ruwase" <oor@cs.cmu.edu>
To: xen-devel@lists.xensource.com
User-Agent: SquirrelMail/1.5.1
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: 8bit
X-Scanned-By: mimedefang-cmuscs on 128.2.217.197
Subject: [Xen-devel] Trapping I/O accesses of a driver domain
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi,
 I am a graduate student working on dynamic correctness checking of kernel
 mode device drivers. I want to detect/trap accesses from a Linux driver
 to device accessible locations (e.g ioremap'd, dma_* locations), and
 I am exploring the possibility of using Xen for this. I am using x86 PV
 Xen-3.3 with a dom0 and driver domU both running linux-2.6.18-xen. For
 various reasons HVM Xen is not suitable for my work.

 The idea is to use page faults to detect the I/O accesses of the driver
 by marking the affected pages not present in the page tables. For
 ioremap'd pages, this seems pretty straightforward since the ptes are
 marked with _PAGE_IO before they are passed to Xen. And so it seems
 modifying do_mmu_update () to detect and mark such ptes not present should
 work. Is this a reasonable approach ?.

 Detecting accesses to dma mapped (dma_alloc_coherent, dma_map_single)
 locations seems more difficult because, as far as I can tell there is no
 hypercall informing Xen that the locations are used for I/O. I am probably
 misunderstanding how this works and would appreciate clarifications.

 Thank you,

tunji









_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 15:29:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 15:29:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROe3j-00033n-I5; Thu, 10 Nov 2011 15:29:27 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROe27-0002pi-NI
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 15:27:48 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1320967663!3745902!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8625 invoked from network); 10 Nov 2011 23:27:44 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-4.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 23:27:44 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAANRdwp016432
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 10 Nov 2011 23:27:40 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAANRcbu019068
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 10 Nov 2011 23:27:39 GMT
Received: from abhmt101.oracle.com (abhmt101.oracle.com [141.146.116.53])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAANRWlQ022244; Thu, 10 Nov 2011 17:27:32 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 10 Nov 2011 15:27:31 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 1F15481482; Thu, 10 Nov 2011 18:27:31 -0500 (EST)
Date: Thu, 10 Nov 2011 18:27:31 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Olatunji Ruwase <oor@cs.cmu.edu>
Subject: Re: [Xen-devel] Trapping I/O accesses of a driver domain
Message-ID: <20111110232727.GA2412@phenom.dumpdata.com>
References: <50891.128.2.134.97.1320965847.squirrel@webmail.cs.cmu.edu>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <50891.128.2.134.97.1320965847.squirrel@webmail.cs.cmu.edu>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090206.4EBC5DEC.002C,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Nov 10, 2011 at 05:57:27PM -0500, Olatunji Ruwase wrote:
> Hi,
>  I am a graduate student working on dynamic correctness checking of kernel
>  mode device drivers. I want to detect/trap accesses from a Linux driver
>  to device accessible locations (e.g ioremap'd, dma_* locations), and
>  I am exploring the possibility of using Xen for this. I am using x86 PV
>  Xen-3.3 with a dom0 and driver domU both running linux-2.6.18-xen. For
>  various reasons HVM Xen is not suitable for my work.

Um, why not use something more recent. Like Ubuntu or Fedora Core 16?
> 
>  The idea is to use page faults to detect the I/O accesses of the driver
>  by marking the affected pages not present in the page tables. For
>  ioremap'd pages, this seems pretty straightforward since the ptes are
>  marked with _PAGE_IO before they are passed to Xen. And so it seems

Not all the time and it is not a requirement.
>  modifying do_mmu_update () to detect and mark such ptes not present should
>  work. Is this a reasonable approach ?.

What about just checking the MFNs against the ones in the E820 that
are in the PCI gap space?
> 
>  Detecting accesses to dma mapped (dma_alloc_coherent, dma_map_single)
>  locations seems more difficult because, as far as I can tell there is no
>  hypercall informing Xen that the locations are used for I/O. I am probably

Right.
>  misunderstanding how this works and would appreciate clarifications.
> 
>  Thank you,
> 
> tunji
> 
> 
> 
> 
> 
> 
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 17:02:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 17:02:15 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROfVX-0005lQ-Bj; Thu, 10 Nov 2011 17:02:15 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROfUo-0005Z6-UG
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 17:01:31 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1320973287!3088645!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29689 invoked from network); 11 Nov 2011 01:01:27 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 01:01:27 -0000
X-IronPort-AV: E=Sophos;i="4.69,491,1315180800"; 
   d="scan'208";a="8876610"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Nov 2011 01:01:27 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 11 Nov 2011 01:01:27 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1ROfUk-0004z9-TQ;
	Fri, 11 Nov 2011 01:01:26 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1ROfUk-0003PB-Nm;
	Fri, 11 Nov 2011 01:01:26 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9745-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 11 Nov 2011 01:01:26 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9745: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9745 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9745/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl          18 leak-check/check           fail REGR. vs. 9661
 test-i386-i386-xl            18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl           18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-credit2   18 leak-check/check           fail REGR. vs. 9661
 test-amd64-i386-xl-multivcpu 18 leak-check/check           fail REGR. vs. 9661

Tests which are failing intermittently (not blocking):
 test-i386-i386-win           14 guest-start.2                fail pass in 9743
 test-amd64-amd64-xl-sedf      7 debian-install       fail in 9743 pass in 9742

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-amd64-xl-sedf      5 xen-boot                     fail    like 9661
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check       fail in 9743 never pass
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10  fail in 9742 like 9659

version targeted for testing:
 xen                  d0bbe0622d1d
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  "Shan, Haitao" <haitao.shan@intel.com>
  Andres Lagar-Cavilla <andres@lagarcavilla.org>
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Jean Guyader <jean.guyader@eu.citrix.com>
  Juergen Gross <juergen.gross@ts.fujitsu.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  Tim Deegan <tim@xen.org>
  Wei Wang <wei.wang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

(No revision log; it would be 656 lines long.)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 17:03:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 17:03:29 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROfWi-000699-RE; Thu, 10 Nov 2011 17:03:29 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROfVo-0005po-LZ
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 17:02:33 -0800
X-Env-Sender: jxinpku@gmail.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1320973347!3751461!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19459 invoked from network); 11 Nov 2011 01:02:28 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-4.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 01:02:28 -0000
Received: by ywn1 with SMTP id 1so1592140ywn.30
	for <xen-devel@lists.xensource.com>;
	Thu, 10 Nov 2011 17:02:27 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type;
	bh=v/og3pQwAscD8QZiUzNO2S8MgQ+ywbAepjRDoLoKEsA=;
	b=m/s2YkD8Ei+M/MTDhAx0Tes9YsNVBJ0sDKFFgzKO9i731Kwvq046FuDgoLgi4jHHR/
	mQBZJPcPawKoVQ+pZzQ3DZ6BsnYy9dItJxIWDkXoZganzbo3zl4huenSr6Sy9EF6Y0Jz
	+UITxvdtlAfhlieSyoylFDWvNaAw1oLontgzI=
MIME-Version: 1.0
Received: by 10.68.39.34 with SMTP id m2mr19174935pbk.75.1320973345832; Thu,
	10 Nov 2011 17:02:25 -0800 (PST)
Received: by 10.143.39.7 with HTTP; Thu, 10 Nov 2011 17:02:25 -0800 (PST)
In-Reply-To: <20111110222134.GA24563@phenom.dumpdata.com>
References: <CAKpDeakqB2eRMbGLZwuY9Dyka+BFJSwNO+1g=9WmyJ6uF+b61A@mail.gmail.com>
	<CAP2B858Uiic4+ZOKBcTNChf+Nt++G4pwktyrE=U+CLn2sCdwjg@mail.gmail.com>
	<CAKpDeamBEHAnpUo5mqLZrAa3=DwLsAdSgzbj9YEfS8o6JK9gKQ@mail.gmail.com>
	<20111110222134.GA24563@phenom.dumpdata.com>
Date: Thu, 10 Nov 2011 20:02:25 -0500
Message-ID: <CAKpDeaknVXFWMVvt02gHeMniAY9YLv8shNE1KtbvW5eqixLAvw@mail.gmail.com>
Subject: Re: [Xen-devel] Cannot get shared page in domU
From: Xin Jin <jxinpku@gmail.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Daniel Castro <evil.dani@gmail.com>, xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0386954055=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0386954055==
Content-Type: multipart/alternative; boundary=bcaec52161a9093e5a04b16b1316

--bcaec52161a9093e5a04b16b1316
Content-Type: text/plain; charset=ISO-8859-1

On Thu, Nov 10, 2011 at 5:21 PM, Konrad Rzeszutek Wilk <
konrad.wilk@oracle.com> wrote:

> On Thu, Nov 10, 2011 at 10:54:23AM -0500, Xin Jin wrote:
> > In
> >
> > share_mem->gref =
> > gnttab_grant_foreign_access(domid_remote, virt_to_mfn(share_mem), 0);
>
> Huh? There are four parameters for that function.
>
The function I use is
int gnttab_grant_foreign_access(domid_t domid, unsigned long frame, int
readonly);
It only has 3 parameters.

The function
void gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t
domid, unsigned long frame, int readonly);
has 4 papameters.


>
> When you setup your map_op, are you setting
>  GNTMAP_application_map | GNTMAP_contains_pte
> ?
> Or are using GNTMAP_host_map
>
I use GNTMAP_host_map to get the grant page as following.
share_vmarea = alloc_vm_area(PAGE_SIZE);
gnttab_set_map_op( &map_op, (unsigned long)share_vmarea->addr,
GNTMAP_host_map, gref, domid_remote );
HYPERVISOR_grant_table_op( GNTTABOP_map_grant_ref, &map_op, 1 );


> Did you look in the 3.1 linux kerne in the gntdev.c driver? Or the other
> drivers?
> Can you use grant-alloc for your code (which can setup shared memory
> segements between guests) instead of doing this in the kernel?
>
> I'm writing a kernel driver module, which tries to communicate between
domUs through shared memory. I only want to use grant table, and do not
want to involve Xen event channel.

When I did as the code above, the code works well in dom0. It means dom0
can use the following hypercall
"share_vmarea = alloc_vm_area(PAGE_SIZE);
gnttab_set_map_op( &map_op, (unsigned long)share_vmarea->addr,
GNTMAP_host_map, gref, domid_remote );
HYPERVISOR_grant_table_op( GNTTABOP_map_grant_ref, &map_op, 1 );"
to get the grant page successfully.

But when I use the same code in domU, it cause errors in kernel "unable to
request kernel paging request at ffffc900000da00c".

(I used the right remote_domid to specify which domain to grant the page
to.)

Do you know what's wrong? How can I get it right?


> >
> > I have explicitly specified the domid that can use the gref as
> > "domid_remote".
> >
> > What else can be wrong?
> >
> > On Thu, Nov 10, 2011 at 12:09 AM, Daniel Castro <evil.dani@gmail.com>
> wrote:
> >
> > > On Thu, Nov 10, 2011 at 1:15 PM, Xin Jin <jxinpku@gmail.com> wrote:
> > > > Hi, I cannot get a shared page in domU.
> > > > In a domU, I used the folloing code to grant a page to another domU.
> > > > share_mem = (share_mem_desp *) __get_free_page(GFP_KERNEL);
> > > > share_mem->gref = gnttab_grant_foreign_access(domid_remote,
> > > > virt_to_mfn(share_mem), 0);
> > > > In another domU, I used the folloing code to get the shared page.
> > > > share_vmarea = alloc_vm_area(PAGE_SIZE);
> > > > gnttab_set_map_op( &map_op, (unsigned long)share_vmarea->addr,
> > > > GNTMAP_host_map, gref, domid_remote );
> > > > HYPERVISOR_grant_table_op( GNTTABOP_map_grant_ref, &map_op, 1 );
> > > > While using the exactly same code to get the shared page in dom0, it
> woks
> > > > all well. But it cannot work in domU.
> > > > I use Xen 4.1.1 and fedora 14 ( linux 3.1.0 both for dom0 and domU ).
> > > > Can anyone help me?
> > > On the interface struct when you issue the hypercall you need to
> > > specify the domid that can use the gref. Maybe the default is domid 0.
> > > The struct grant_entry_v1 has member domid for the foreign guest,
> > > check that value.
> > >
> > > > Thanks!
> > > > -- Xin
> > > >
> > > >
> > > > _______________________________________________
> > > > Xen-devel mailing list
> > > > Xen-devel@lists.xensource.com
> > > > http://lists.xensource.com/xen-devel
> > > >
> > > >
> > >
> > >
> > >
> > > --
> > > +-=====---------------------------+
> > > | +---------------------------------+ | This space intentionally blank
> > > for notetaking.
> > > | |   | Daniel Castro,                |
> > > | |   | Consultant/Programmer.|
> > > | |   | U Andes                         |
> > > +-------------------------------------+
> > >
> >
> >
> >
> > --
> > Xin JIN
> > PhD student
> > Department of Computer Science
> > Princeton University
>
> > _______________________________________________
> > Xen-devel mailing list
> > Xen-devel@lists.xensource.com
> > http://lists.xensource.com/xen-devel
>
>


-- 
Xin JIN
PhD student
Department of Computer Science
Princeton University

--bcaec52161a9093e5a04b16b1316
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<br><br><div class=3D"gmail_quote">On Thu, Nov 10, 2011 at 5:21 PM, Konrad =
Rzeszutek Wilk <span dir=3D"ltr">&lt;<a href=3D"mailto:konrad.wilk@oracle.c=
om">konrad.wilk@oracle.com</a>&gt;</span> wrote:<br><blockquote class=3D"gm=
ail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-le=
ft:1ex;">
<div class=3D"im">On Thu, Nov 10, 2011 at 10:54:23AM -0500, Xin Jin wrote:<=
br>
&gt; In<br>
&gt;<br>
&gt; share_mem-&gt;gref =3D<br>
&gt; gnttab_grant_foreign_access(domid_remote, virt_to_mfn(share_mem), 0);<=
br>
<br>
</div>Huh? There are four parameters for that function.<br></blockquote><di=
v>The function I use is=A0</div><div>int gnttab_grant_foreign_access(domid_=
t domid, unsigned long frame,=A0int readonly);</div><div>It only has 3 para=
meters.</div>
<div><br></div><div>The function</div><div><div>void gnttab_grant_foreign_a=
ccess_ref(grant_ref_t ref, domid_t domid,=A0unsigned long frame, int readon=
ly);</div></div><div>has 4 papameters.</div><div>=A0</div><blockquote class=
=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padd=
ing-left:1ex;">

<br>
When you setup your map_op, are you setting<br>
=A0GNTMAP_application_map | GNTMAP_contains_pte<br>
?<br>
Or are using GNTMAP_host_map<br></blockquote><div>I use GNTMAP_host_map to =
get the grant page as following.=A0</div><div><div style=3D"color: rgb(34, =
34, 34); font-family: arial, sans-serif; font-size: 16px; background-color:=
 rgba(255, 255, 255, 0.917969); ">
share_vmarea =3D alloc_vm_area(PAGE_SIZE);</div><div style=3D"color: rgb(34=
, 34, 34); font-family: arial, sans-serif; font-size: 16px; background-colo=
r: rgba(255, 255, 255, 0.917969); ">gnttab_set_map_op( &amp;map_op, (unsign=
ed long)share_vmarea-&gt;addr, GNTMAP_host_map, gref, domid_remote );</div>
<div style=3D"color: rgb(34, 34, 34); font-family: arial, sans-serif; font-=
size: 16px; background-color: rgba(255, 255, 255, 0.917969); ">HYPERVISOR_g=
rant_table_op( GNTTABOP_map_grant_ref, &amp;map_op, 1 );</div></div><div>
=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;borde=
r-left:1px #ccc solid;padding-left:1ex;">
Did you look in the 3.1 linux kerne in the gntdev.c driver? Or the other dr=
ivers?<br>
Can you use grant-alloc for your code (which can setup shared memory<br>
segements between guests) instead of doing this in the kernel?<br>
<div class=3D"HOEnZb"><div class=3D"h5"><br></div></div></blockquote><div>I=
&#39;m writing a kernel driver module, which tries to communicate between d=
omUs through shared memory. I only want to use grant table, and do not want=
 to involve Xen event channel.</div>
<div><br></div><div>When I did as the code above, the code works well in do=
m0. It means dom0 can use the following hypercall</div><div>&quot;<span cla=
ss=3D"Apple-style-span" style=3D"color: rgb(34, 34, 34); font-family: arial=
, sans-serif; font-size: 16px; background-color: rgba(255, 255, 255, 0.9179=
69); ">share_vmarea =3D alloc_vm_area(PAGE_SIZE);</span></div>
<div><div><div style=3D"color: rgb(34, 34, 34); font-family: arial, sans-se=
rif; font-size: 16px; background-color: rgba(255, 255, 255, 0.917969); ">gn=
ttab_set_map_op( &amp;map_op, (unsigned long)share_vmarea-&gt;addr, GNTMAP_=
host_map, gref, domid_remote );</div>
<div style=3D"color: rgb(34, 34, 34); font-family: arial, sans-serif; font-=
size: 16px; background-color: rgba(255, 255, 255, 0.917969); ">HYPERVISOR_g=
rant_table_op( GNTTABOP_map_grant_ref, &amp;map_op, 1 );&quot;</div></div>
<div>to get the grant page successfully.</div></div><div><br></div><div>But=
 when I use the same code in domU, it cause errors in kernel &quot;unable t=
o request kernel paging request at ffffc900000da00c&quot;.</div><div><br>
</div><div>(I used the right remote_domid to specify which domain to grant =
the page to.)</div><div><br></div><div>Do you know what&#39;s wrong? How ca=
n I get it right?</div><div><br></div><blockquote class=3D"gmail_quote" sty=
le=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class=3D"HOEnZb"><div class=3D"h5">
<br>
&gt;<br>
&gt; I have explicitly specified the domid that can use the gref as<br>
&gt; &quot;domid_remote&quot;.<br>
&gt;<br>
&gt; What else can be wrong?<br>
&gt;<br>
&gt; On Thu, Nov 10, 2011 at 12:09 AM, Daniel Castro &lt;<a href=3D"mailto:=
evil.dani@gmail.com">evil.dani@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; &gt; On Thu, Nov 10, 2011 at 1:15 PM, Xin Jin &lt;<a href=3D"mailto:jx=
inpku@gmail.com">jxinpku@gmail.com</a>&gt; wrote:<br>
&gt; &gt; &gt; Hi, I cannot get a shared page in domU.<br>
&gt; &gt; &gt; In a domU, I used the folloing code to grant a page to anoth=
er domU.<br>
&gt; &gt; &gt; share_mem =3D (share_mem_desp *) __get_free_page(GFP_KERNEL)=
;<br>
&gt; &gt; &gt; share_mem-&gt;gref =3D gnttab_grant_foreign_access(domid_rem=
ote,<br>
&gt; &gt; &gt; virt_to_mfn(share_mem), 0);<br>
&gt; &gt; &gt; In another domU, I used the folloing code to get the shared =
page.<br>
&gt; &gt; &gt; share_vmarea =3D alloc_vm_area(PAGE_SIZE);<br>
&gt; &gt; &gt; gnttab_set_map_op( &amp;map_op, (unsigned long)share_vmarea-=
&gt;addr,<br>
&gt; &gt; &gt; GNTMAP_host_map, gref, domid_remote );<br>
&gt; &gt; &gt; HYPERVISOR_grant_table_op( GNTTABOP_map_grant_ref, &amp;map_=
op, 1 );<br>
&gt; &gt; &gt; While using the exactly same code to get the shared page in =
dom0, it woks<br>
&gt; &gt; &gt; all well. But it cannot work in domU.<br>
&gt; &gt; &gt; I use Xen 4.1.1 and fedora 14 ( linux 3.1.0 both for dom0 an=
d domU ).<br>
&gt; &gt; &gt; Can anyone help me?<br>
&gt; &gt; On the interface struct when you issue the hypercall you need to<=
br>
&gt; &gt; specify the domid that can use the gref. Maybe the default is dom=
id 0.<br>
&gt; &gt; The struct grant_entry_v1 has member domid for the foreign guest,=
<br>
&gt; &gt; check that value.<br>
&gt; &gt;<br>
&gt; &gt; &gt; Thanks!<br>
&gt; &gt; &gt; -- Xin<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; _______________________________________________<br>
&gt; &gt; &gt; Xen-devel mailing list<br>
&gt; &gt; &gt; <a href=3D"mailto:Xen-devel@lists.xensource.com">Xen-devel@l=
ists.xensource.com</a><br>
&gt; &gt; &gt; <a href=3D"http://lists.xensource.com/xen-devel" target=3D"_=
blank">http://lists.xensource.com/xen-devel</a><br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; --<br>
&gt; &gt; +-=3D=3D=3D=3D=3D---------------------------+<br>
&gt; &gt; | +---------------------------------+ | This space intentionally =
blank<br>
&gt; &gt; for notetaking.<br>
&gt; &gt; | | =A0 | Daniel Castro, =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0|<br>
&gt; &gt; | | =A0 | Consultant/Programmer.|<br>
&gt; &gt; | | =A0 | U Andes =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 |<br>
&gt; &gt; +-------------------------------------+<br>
&gt; &gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Xin JIN<br>
&gt; PhD student<br>
&gt; Department of Computer Science<br>
&gt; Princeton University<br>
<br>
&gt; _______________________________________________<br>
&gt; Xen-devel mailing list<br>
&gt; <a href=3D"mailto:Xen-devel@lists.xensource.com">Xen-devel@lists.xenso=
urce.com</a><br>
&gt; <a href=3D"http://lists.xensource.com/xen-devel" target=3D"_blank">htt=
p://lists.xensource.com/xen-devel</a><br>
<br>
</div></div></blockquote></div><br><br clear=3D"all"><div><br></div>-- <br>=
Xin JIN<div>PhD student<br>Department of Computer Science<div>Princeton Uni=
versity</div></div><br>

--bcaec52161a9093e5a04b16b1316--


--===============0386954055==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0386954055==--


From xen-devel-bounces@lists.xensource.com Thu Nov 10 19:26:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 19:26:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROhlW-0001yi-LG; Thu, 10 Nov 2011 19:26:54 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROhkf-0001mA-D9
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 19:26:01 -0800
X-Env-Sender: oor@cs.cmu.edu
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320981923!45461234!1
X-Originating-IP: [128.2.217.196]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27602 invoked from network); 11 Nov 2011 03:25:24 -0000
Received: from smtp01.srv.cs.cmu.edu (HELO smtp01.srv.cs.cmu.edu)
	(128.2.217.196)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 11 Nov 2011 03:25:24 -0000
Received: from webmail.cs.cmu.edu (TOMENTOSA.SRV.CS.CMU.EDU [128.2.172.30])
	by smtp01.srv.cs.cmu.edu (8.13.6/8.13.6) with ESMTP id pAB3Pt3s019158
	for <xen-devel@lists.xensource.com>;
	Thu, 10 Nov 2011 22:25:56 -0500 (EST)
Received: from 71.199.121.110
	(SquirrelMail authenticated user oor/mail@CS.CMU.EDU)
	by webmail.cs.cmu.edu with HTTP;
	Thu, 10 Nov 2011 22:25:56 -0500 (EST)
Message-ID: <60193.71.199.121.110.1320981956.squirrel@webmail.cs.cmu.edu>
Date: Thu, 10 Nov 2011 22:25:56 -0500 (EST)
Subject: Re: [Xen-devel] Trapping I/O accesses of a driver domain
From: "Olatunji Ruwase" <oor@cs.cmu.edu>
To: xen-devel@lists.xensource.com
User-Agent: SquirrelMail/1.5.1
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: 8bit
References: <50891.128.2.134.97.1320965847.squirrel@webmail.cs.cmu.edu>   
	<20111110232727.GA2412@phenom.dumpdata.com>
In-Reply-To: <20111110232727.GA2412@phenom.dumpdata.com>
X-Scanned-By: mimedefang-cmuscs on 128.2.217.196
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>> Xen-3.3 with a dom0 and driver domU both running linux-2.6.18-xen. For
>> various reasons HVM Xen is not suitable for my work.
>
> Um, why not use something more recent. Like Ubuntu or Fedora Core 16?
>
 My work is based on simulated hardware logging and a significantly
 modified FC5, porting the kernel modifications to FC6 is significantly
 than to more recent kernels like FC16.

>> ioremap'd pages, this seems pretty straightforward since the ptes are
>> marked with _PAGE_IO before they are passed to Xen. And so it seems
>
> Not all the time and it is not a requirement.
>
 I am happy to modify the 2.16.8-xen to cover the outstanding cases,
 except this is a fundamentally flawed approach. Can you elaborate the
 ioremap scenarios for pte are not marked _PAGE_IO. Are the requirements
 documented?

>> modifying do_mmu_update () to detect and mark such ptes not present
>> should work. Is this a reasonable approach ?.
>
> What about just checking the MFNs against the ones in the E820 that
> are in the PCI gap space?
>>
  I m not familiar with E820, but will explore it, thanks.

>>  hypercall informing Xen that the locations are used for I/O. I am
>> probably
>
> Right.
>

 Thanks for the response.

tunji


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 20:28:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 20:28:44 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROijL-0003U5-UJ; Thu, 10 Nov 2011 20:28:43 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROihy-0003H5-CH
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 20:27:20 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1320985634!1115872!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2222 invoked from network); 11 Nov 2011 04:27:14 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 04:27:14 -0000
X-IronPort-AV: E=Sophos;i="4.69,492,1315180800"; 
   d="scan'208";a="8877149"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Nov 2011 04:27:14 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 11 Nov 2011 04:27:14 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1ROiht-000674-Rj;
	Fri, 11 Nov 2011 04:27:13 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1ROiht-0006i9-CC;
	Fri, 11 Nov 2011 04:27:13 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9746-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 11 Nov 2011 04:27:13 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9746: tolerable FAIL - PUSHED
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9746 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9746/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  d0bbe0622d1d
baseline version:
 xen                  54a5e994a241

------------------------------------------------------------
People who touched revisions under test:
  "Shan, Haitao" <haitao.shan@intel.com>
  Andres Lagar-Cavilla <andres@lagarcavilla.org>
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Jean Guyader <jean.guyader@eu.citrix.com>
  Juergen Gross <juergen.gross@ts.fujitsu.com>
  juergen.gross@ts.fujitsu.com
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  Tim Deegan <tim@xen.org>
  Wei Wang <wei.wang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     pass    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Pushing revision :

+ branch=xen-unstable
+ revision=d0bbe0622d1d
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x '!=' x/export/home/osstest/repos/lock ']'
++ OSSTEST_REPOS_LOCK_LOCKED=/export/home/osstest/repos/lock
++ exec with-lock-ex -w /export/home/osstest/repos/lock ./ap-push xen-unstable d0bbe0622d1d
+ branch=xen-unstable
+ revision=d0bbe0622d1d
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x/export/home/osstest/repos/lock '!=' x/export/home/osstest/repos/lock ']'
+ : xen@xenbits.xensource.com
+ : xen@xenbits.xensource.com:git/linux-pvops
+ : master
+ : tested/2.6.39.x
+ case "$branch" in
+ cd /export/home/osstest/repos/xen-unstable.hg
+ hg push -r d0bbe0622d1d ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
pushing to ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 48 changesets with 200 changes to 111 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 20:30:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 20:30:12 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROikl-0003sU-KA; Thu, 10 Nov 2011 20:30:12 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROij5-0003QQ-6V
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 20:28:27 -0800
X-Env-Sender: rusty@ozlabs.org
X-Msg-Ref: server-5.tower-182.messagelabs.com!1320985701!2693678!1
X-Originating-IP: [203.10.76.45]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24726 invoked from network); 11 Nov 2011 04:28:23 -0000
Received: from ozlabs.org (HELO ozlabs.org) (203.10.76.45)
	by server-5.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 11 Nov 2011 04:28:23 -0000
Received: by ozlabs.org (Postfix, from userid 1011)
	id 89FA51007D4; Fri, 11 Nov 2011 15:28:17 +1100 (EST)
From: Rusty Russell <rusty@rustcorp.com.au>
To: Miche Baker-Harvey <miche@google.com>, Greg Kroah-Hartman <gregkh@suse.de>
In-Reply-To: <20111108214458.28884.86759.stgit@miche.sea.corp.google.com>
References: <20111108214452.28884.14840.stgit@miche.sea.corp.google.com>
	<20111108214458.28884.86759.stgit@miche.sea.corp.google.com>
User-Agent: Notmuch/0.6.1-1 (http://notmuchmail.org) Emacs/23.3.1
	(i686-pc-linux-gnu)
Date: Fri, 11 Nov 2011 14:57:20 +1030
Message-ID: <877h37qo5z.fsf@rustcorp.com.au>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Cc: Stephen Rothwell <sfr@canb.auug.org.au>, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org,
	Anton Blanchard <anton@samba.org>, Amit Shah <amit.shah@redhat.com>,
	Mike Waychison <mikew@google.com>, ppc-dev <linuxppc-dev@lists.ozlabs.org>,
	Eric Northrup <digitaleric@google.com>
Subject: [Xen-devel] Re: [PATCH v3 1/3] virtio_console: Fix locking of
	vtermno.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 08 Nov 2011 13:44:58 -0800, Miche Baker-Harvey <miche@google.com> wrote:
> Some modifications of vtermno were not done under the spinlock.
> 
> Moved assignment from vtermno and increment of vtermno together,
> putting both under the spinlock.  Revert vtermno on failure.
> 
> Signed-off-by: Miche Baker-Harvey <miche@google.com>

Does it matter?  It's normal not to lock in a function called
"init_XXX", since it's not exposed yet.

Or is it?

Thanks,
Rusty.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 22:45:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 22:45:15 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROkrS-0002HU-MW; Thu, 10 Nov 2011 22:45:14 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROkqf-00024v-Ps
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 22:44:26 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1320993862!3109213!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32062 invoked from network); 11 Nov 2011 06:44:22 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 06:44:22 -0000
X-IronPort-AV: E=Sophos;i="4.69,493,1315180800"; 
   d="scan'208";a="8878068"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Nov 2011 06:44:21 +0000
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Fri, 11 Nov 2011 06:44:21 +0000
Subject: Re: [Xen-devel] Grant a partial page
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
In-Reply-To: <20111110222208.GB24563@phenom.dumpdata.com>
References: <CAP2B85-NrwhELRMpndhq3vzxqEuZRjsZi3C6bJ6ze3q=Dfu=aA@mail.gmail.com>
	<20111110222208.GB24563@phenom.dumpdata.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Fri, 11 Nov 2011 06:44:21 +0000
Message-ID: <1320993861.16747.122.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: Daniel Castro <evil.dani@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-11-10 at 22:22 +0000, Konrad Rzeszutek Wilk wrote:
> On Thu, Nov 10, 2011 at 02:46:37PM +0900, Daniel Castro wrote:
> > Hello,
> > I to issue a grant on a page, but only partially.
> > I have a pointer to somewhere in memory and need to issue the grant
> > for such a pointer but not to the entire page.
> > I know FLAG GTF_sub_page is used for that purpose but grant_entry_v1
> > apparently has no fields for sub_page, should I change the code to use
> > Version 2 grant table entries?
> 
> Well, there is no implementation for V2 grants yet. Thought Annie just posted
> a version.

Daniel is working on SeaBIOS, not Linux...

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 23:07:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 23:07:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROlCs-0002zx-7s; Thu, 10 Nov 2011 23:07:22 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROl8Z-0002jc-NU
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 23:03:35 -0800
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-2.tower-21.messagelabs.com!1320994971!3734621!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10616 invoked from network); 11 Nov 2011 07:02:52 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-2.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 11 Nov 2011 07:02:52 -0000
X-Originating-Ip: [194.89.68.22]
Received: from ydin.reaktio.net (reaktio.net [194.89.68.22])
	by smtp.tele.fi (Postfix) with ESMTP id 19D9A1DB3;
	Fri, 11 Nov 2011 09:02:50 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id D189520083; Fri, 11 Nov 2011 09:02:50 +0200 (EET)
Date: Fri, 11 Nov 2011 09:02:50 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek nic problems
	(eth0 8139cp transmit queue timed out)
Message-ID: <20111111070250.GZ12984@reaktio.net>
References: <CAD88F26.24242%keir.xen@gmail.com>
	<alpine.DEB.2.00.1111071153230.3519@kaball-desktop>
	<20111108112421.GU12984@reaktio.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <20111108112421.GU12984@reaktio.net>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: "xen@lists.fedoraproject.org" <xen@lists.fedoraproject.org>,
	Keir Fraser <keir.xen@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 08, 2011 at 01:24:21PM +0200, Pasi Kärkkäinen wrote:
> On Mon, Nov 07, 2011 at 12:02:03PM +0000, Stefano Stabellini wrote:
> > On Thu, 3 Nov 2011, Keir Fraser wrote:
> > > On 03/11/2011 18:07, "Pasi KÃ?rkkÃ?inen" <pasik@iki.fi> wrote:
> > > 
> > > > On Tue, Nov 01, 2011 at 10:56:06PM +0200, Pasi KÃ?rkkÃ?inen wrote:
> > > >> On Mon, Oct 31, 2011 at 09:29:24PM +0200, Pasi KÃ?rkkÃ?inen wrote:
> > > >>> On Mon, Oct 31, 2011 at 12:24:14PM -0700, Boris Derzhavets wrote:
> > > >>>>    Seems to related
> > > >>>> 
> > > >>>>    https://bugs.launchpad.net/ubuntu/+source/xen/+bug/854829
> > > >>>> 
> > > >>> 
> > > >>> Thanks, that seems to be the same bug.
> > > >>> 
> > > >>> Is the bugfix patch from xen-unstable going to backported to
> > > >>> xen-4.1-testing.hg ?
> > > >>> (4.1 backported patch available on ubuntu's launchpad above..)
> > > >>> 
> > > >> 
> > > >> So the Ubuntu backport from xen-unstable to Xen 4.1.1 is here:
> > > >> https://launchpadlibrarian.net/81948978/xen-pirq-resubmit-irq.patch
> > > >> 
> > > >> It seems to be shipping in Ubuntu 11.10 xen 4.1.1-2ubuntu4.1 packages.
> > > >> 
> > > >> Does that patch look suitable to be applied to xen-4.1-testing.hg ?
> > > >> This bug should be fixed for Xen 4.1.3.
> > > > 
> > > > Any comments? 
> > > 
> > > This looks like a backport of Stefano's xen-unstable c/s 24007. I would like
> > > him to submit/ack the backport, as it is not a trivial backport of the
> > > xen-unstable patch.
> > 
> > I would rather use the following backport. Compared to the other one it
> > returns EINVAL in PHYSDEVOP_irq_status_query when the arguments are not
> > correct.
> > 
> 
> Thanks! Mayoung added this patch in xen-4.1.2-1.1.fc14.src.rpm,
> and binary rpms are built for Fedora 16 here:
> http://koji.fedoraproject.org/koji/taskinfo?taskID=3495905
> 
> So people should test this patch (or the rpms above) and confirm 
> that it fixes the emulated realtek/ne2k issues.
> 

Konrad confirmed the patch works with Xen 4.1.2 and realtek emulated nics.

So please commit the patch to xen-4.1-testing.hg.

-- Pasi


> 
> 
> > ---
> > 
> > diff -r 8c2d76193eaf xen/arch/x86/physdev.c
> > --- a/xen/arch/x86/physdev.c	Wed Nov 02 15:02:18 2011 +0000
> > +++ b/xen/arch/x86/physdev.c	Mon Nov 07 11:58:28 2011 +0000
> > @@ -261,6 +261,7 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
> >          ret = -EINVAL;
> >          if ( eoi.irq >= v->domain->nr_pirqs )
> >              break;
> > +        spin_lock(&v->domain->event_lock);
> >          if ( v->domain->arch.pirq_eoi_map )
> >              evtchn_unmask(v->domain->pirq_to_evtchn[eoi.irq]);
> >          if ( !is_hvm_domain(v->domain) ||
> > @@ -268,6 +269,19 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
> >              ret = pirq_guest_eoi(v->domain, eoi.irq);
> >          else
> >              ret = 0;
> > +        if ( is_hvm_domain(v->domain) &&
> > +                domain_pirq_to_emuirq(v->domain, eoi.irq) > 0 )
> > +        {
> > +            struct hvm_irq *hvm_irq = &v->domain->arch.hvm_domain.irq;
> > +            int gsi = domain_pirq_to_emuirq(v->domain, eoi.irq);
> > +
> > +            /* if this is a level irq and count > 0, send another
> > +             * notification */ 
> > +            if ( gsi >= NR_ISAIRQS /* ISA irqs are edge triggered */
> > +                    && hvm_irq->gsi_assert_count[gsi] )
> > +                send_guest_pirq(v->domain, eoi.irq);
> > +        }
> > +        spin_unlock(&v->domain->event_lock);
> >          break;
> >      }
> >  
> > @@ -323,9 +337,10 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
> >              break;
> >          irq_status_query.flags = 0;
> >          if ( is_hvm_domain(v->domain) &&
> > -             domain_pirq_to_irq(v->domain, irq) <= 0 )
> > +                domain_pirq_to_irq(v->domain, irq) <= 0 &&
> > +                domain_pirq_to_emuirq(v->domain, irq) == IRQ_UNBOUND )
> >          {
> > -            ret = copy_to_guest(arg, &irq_status_query, 1) ? -EFAULT : 0;
> > +            ret = -EINVAL;
> >              break;
> >          }
> >  
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 10 23:53:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 10 Nov 2011 23:53:48 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROlvo-0005i6-A0; Thu, 10 Nov 2011 23:53:48 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROlvB-0005WC-Cl
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 23:53:09 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1320997972!45207078!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15624 invoked from network); 11 Nov 2011 07:52:52 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-11.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 07:52:52 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 07:53:04 +0000
Message-Id: <4EBCE26E020000780006058E@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 07:53:02 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Stefano Stabellini" <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: performance regression from c/s
	 21647:cfba1560054a
References: <4EBBC25B02000078000601F1@nat28.tlf.novell.com>
	<CAKpvNa3DmeQyXBb7obc_PbsNaEUBLjTFc_eLkTKH8RwYs4WQYw@mail.gmail.com>
	<4EBBF36A0200007800060375@nat28.tlf.novell.com>
	<alpine.DEB.2.00.1111101457380.3519@kaball-desktop>
	<4EBBF7A9020000780006039E@nat28.tlf.novell.com>
	<alpine.DEB.2.00.1111101516060.3519@kaball-desktop>
	<4EBBF96102000078000603B6@nat28.tlf.novell.com>
	<alpine.DEB.2.00.1111101521120.3519@kaball-desktop>
	<4EBC059F0200007800060414@nat28.tlf.novell.com>
In-Reply-To: <4EBC059F0200007800060414@nat28.tlf.novell.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Gianluca Guida <glguida@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Tim\(Xen.org\)" <tim@xen.org>, Gianluca Guida <gianluca.guida@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 17:10, "Jan Beulich" <JBeulich@suse.com> wrote:
> Which leaves utilizing mmu_notifier_release() as long as
> CONFIG_MMU_NOTIFIER is enabled, which fortunately KVM
> selects for us.

Of which I didn't immediately recall that it's per-mm. Making it useless
for this purpose too.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 00:13:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 00:13:04 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROmEP-00071p-PB; Fri, 11 Nov 2011 00:13:01 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROmB8-0006nG-3W
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 00:09:41 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-16.tower-174.messagelabs.com!1320998974!1136407!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25668 invoked from network); 11 Nov 2011 08:09:34 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-16.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 08:09:34 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 08:09:34 +0000
Message-Id: <4EBCE64D020000780006059C@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 08:09:33 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: <Jean.Guyader@citrix.com>,
	 "Jean Guyader" <jean.guyader@eu.citrix.com>
References: <4EBBD5F602000078000602EE@nat28.tlf.novell.com>
	<20111110173720.GA29605@spongy.cam.xci-test.com>
In-Reply-To: <20111110173720.GA29605@spongy.cam.xci-test.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: George Dunlap <George.Dunlap@eu.citrix.com>,
	"Keir \(Xen.org\)" <keir@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"allen.m.kay@intel.com" <allen.m.kay@intel.com>,
	"Tim\(Xen.org\)" <tim@xen.org>
Subject: [Xen-devel] Re: [PATCH 5/7] mm: New XENMEM space,
	XENMAPSPACE_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 18:37, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> On 10/11 12:47, Jan Beulich wrote:
>> >>> On 10.11.11 at 12:35, Jean Guyader <jean.guyader@eu.citrix.com> =
wrote:
>> >@@ -4716,6 +4748,17 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(voi=
d)=20
> arg)
>> >         }
>> >=20
>> >         rc =3D xenmem_add_to_physmap(d, &xatp);
>> >+        if ( rc =3D=3D -EAGAIN )
>>=20
>>         if ( rc )
>>=20
>> >+        {
>> >+            if ( copy_to_guest(arg, &xatp, 1) )
>> >+            {
>> >+                rcu_unlock_domain(d);
>> >+                return -EFAULT;
>> >+            }
>>=20
>>         }
>>         if ( rc =3D=3D -EAGAIN )
>>=20
>> (with some room for further simplification). Without that (or the =
minimal
>> alternative of copying back just .size or yet some other mechanism), as
>> pointed out before, the caller won't have a way to know how far into
>> the batch things succeeded.
>>=20
>=20
> In xenmem_add_to_physmap I modify xatp in place so when I exit this
> function xatp will contain the updated value (new start value in
> .gpfn and .idx, how far do I need to go in .size).
>=20
> The idea here was to call the copy_to_guest only when we got preempted.
> If I copy xatp back to the guest I should get the updated value
> in xatp from the copy_from_guest when I'll be called by the continuation.=


I understand the continuation aspect. But you appear to have not read
my comments completely: I'm asking how your caller, in the event of
failure, would know how much of the batch was processed successfully.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 00:19:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 00:19:36 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROmKm-0007Us-4u; Fri, 11 Nov 2011 00:19:36 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROmKE-0007Ib-TZ
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 00:19:03 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1320999539!3680309!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5949 invoked from network); 11 Nov 2011 08:19:00 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 08:19:00 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 08:18:59 +0000
Message-Id: <4EBCE88102000078000605A9@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 08:18:57 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Daniel Kiper" <dkiper@net-space.pl>
References: <20111110085821.GA15751@router-fw-old.local.net-space.pl>
	<4EBBB53D020000780006019D@nat28.tlf.novell.com>
	<20111110225300.GB20293@router-fw-old.local.net-space.pl>
In-Reply-To: <20111110225300.GB20293@router-fw-old.local.net-space.pl>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com, konrad.wilk@oracle.com
Subject: [Xen-devel] Re: An issue in xen_limit_pages_to_max_mfn() in
	Xenlinux Ver. 2.6.18
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 23:53, Daniel Kiper <dkiper@net-space.pl> wrote:
> On Thu, Nov 10, 2011 at 10:27:57AM +0000, Jan Beulich wrote:
>> >>> On 10.11.11 at 09:58, Daniel Kiper <dkiper@net-space.pl> wrote:
>> > Hi Jan,
>> >
>> > During work on kexec/kdump for Xen domU I found that
>> > xen_limit_pages_to_max_mfn() registers undo_limit_pages()
>> > destructor which breaks __free_pages(). When __free_pages()
>> > is called then at beginning of this function put_page_testzero()
>> > is called which decrements page count for given page. Later
>> > undo_limit_pages() destructor is called which once again
>> > calls __free_pages() and in consequence put_page_testzero()
>> > fails (BUG_ON() is called) because page count is 0.
>>
>> Seems like (on newer kernels, where this is a VM_BUG_ON()) this was
>> never hit on a configuration with CONFIG_DEBUG_VM, and on the older
>> kernels the function was never used for memory that would get freed
>> later (only kexec uses it there).
>>
>> > It could
>> > be easily fixed, however, after reviewing xen_limit_pages_to_max_mfn()=

>> > I could not find any good reason for which undo_limit_pages()
>> > destructor is registered. Maybe it could be removed at all because
>> > all pages are freed when __free_pages() is called and in this
>> > case we do not care where they live. However, maybe I missed
>> > something important.
>>
>> It does matter - otherwise, over time, we could exhaust memory
>> below a certain boundary in Xen.
>=20
> Ahhhh... I thought about that once, however, I could not find it
> in the code. It is not clear because there is no any comment. As

The name of the function is - imo - sufficient to describe its purpose.

> I understand HYPERVISOR_memory_op(XENMEM_exchange, &exchange) prefers
> to allocate pages from Xen which live on higher addresses (at the
> end of physical memory) if exchange.out.address_bits is 0. This
> behavior leads to situation where pages with higher addresses
> are more prefered than with lower addresses. In consequence pages
> are moved from lower MFNs to higher MFNs.
>=20
> Please correct me if I am wrong.

That's correct (with the slight adjustment that higher addresses are
always preferred by Xen's allocator, just that address_bits being non-
zero sets an upper bound).

>> So I think we need to add an init_page_count() call to undo_limit_pages(=
).
>=20
> Hmmm... I think it is not good solution in that point. I suppose that =
you
> found this usage in balloon driver, however, here it is not the case.
> Balloon driver initializes page structure for pages allocated from Xen
> by calling init_page_count() (inter alia). It means that it is used
> more or less accordingly to a comment in include/linux/mm.h (Setup the
> page count before being freed into the page allocator for the first time
> (boot or memory hotplug)). However, I think we should not simply reset
> page count in undo_limit_pages(). It could lead to unexpected results.

Why? The page count *must* be zero at this point (or it would be an
error that this function was reached).

> Now I think about two solutions for that problem:
>   1) We could simply remove undo_limit_pages() destructor and move=20
> responsibility
>      of pages relocation before freeing them to the caller. I prefer =
that=20
> solution,
>      because it gives more flexibility to the developer and similar =
solution
>      must/will be used in latest kernels (PageForeign mechanism is =
not=20
> available
>      there or I missed something).

I don't see what flexibility you have in mind. To me it's just an extra
burden, namely because the caller would have to track for which
pages it may have (successfully) called xen_limit_pages_...(). Just
look at the uses of the function in a recent SLES or openSUSE kernel...

>   2) We could prepare new function, e.g.
>=20
>      fastcall void __free_pages_core(struct page *page, unsigned int =
order)=20
> {
>              if (order =3D=3D 0)
>                      free_hot_page(page);
>              else
>                      __free_pages_ok(page, order);
>      }
>=20
>      and call it from undo_limit_pages() destructor instead of=20
> __free_pages().
>=20
> What do you think about that ???

If you can get upstream to accept such a function - fine. But without
that, adding Xen-specific code in core Xen-unspecific files is generally
only a last resort, even in XenoLinux, and requires a good reason and
no alternative.

Jan

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 00:39:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 00:39:40 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROmeB-0008Ga-GF; Fri, 11 Nov 2011 00:39:39 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROmdE-000840-06
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 00:38:40 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1321000716!3696021!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32279 invoked from network); 11 Nov 2011 08:38:36 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 08:38:36 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 08:38:36 +0000
Message-Id: <4EBCED1A02000078000605BB@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 08:38:34 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jean Guyader" <jean.guyader@eu.citrix.com>, "Keir Fraser" <keir@xen.org>
References: <1320945463-13844-1-git-send-email-jean.guyader@eu.citrix.com>
In-Reply-To: <1320945463-13844-1-git-send-email-jean.guyader@eu.citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: [PATCH] Hypercall continuation cancelation in
	compat mode for XENMEM_get/set_pod_target.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 18:17, Jean Guyader <jean.guyader@eu.citrix.com> wrote:

> If copy_to_guest failed in the compat code after a continuation as been
> done in the native code we need to cancel it so we won't reexecute the
> hypercall but return from the hypercall with the appropriate error.
>=20
> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>

Acked-by: Jan Beulich <jbeulich@suse.com>

(But I'd like to be certain that Keir also took a look at this before
committing, not the least because this also should go into 4.1-testing.)

> ---
>  xen/arch/x86/domain.c           |   18 ++++++++++++++++++
>  xen/arch/x86/x86_64/compat/mm.c |    4 ++++
>  xen/include/xen/sched.h         |    1 +
>  3 files changed, 23 insertions(+), 0 deletions(-)




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 00:55:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 00:55:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROmtq-0000TN-Qo; Fri, 11 Nov 2011 00:55:50 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROmt6-0000Gd-Hn
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 00:55:04 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1321001701!3122978!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6352 invoked from network); 11 Nov 2011 08:55:01 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-7.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 08:55:01 -0000
Received: by wyh11 with SMTP id 11so4678977wyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 11 Nov 2011 00:55:00 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=qI1Qem6cX+yqMPrllDRXvW82uuU5m8M9RYGj+iEUj7s=;
	b=O+XBFO2VeI7PWQ6MlRzaTWINhig0xTohmenTYjgsqgyYtNwt1m4Evzi170bJr4Nlrn
	ZOuKpLPzoa7W3QZB+TmMra4AOfxu5ZYMgJew/0ir2qwjiF01ZkB+O3H9RnUO+A0/2Kq8
	YxjIL0JGbFgeB0KnysVzAWjrKdEjYlhnqHrO4=
Received: by 10.180.19.9 with SMTP id a9mr12850176wie.32.1321001700918;
	Fri, 11 Nov 2011 00:55:00 -0800 (PST)
Received: from [192.168.1.71]
	(host86-129-249-120.range86-129.btcentralplus.com. [86.129.249.120])
	by mx.google.com with ESMTPS id n2sm6413681wiz.16.2011.11.11.00.54.59
	(version=SSLv3 cipher=OTHER); Fri, 11 Nov 2011 00:55:00 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Fri, 11 Nov 2011 08:54:55 +0000
From: Keir Fraser <keir.xen@gmail.com>
To: Jan Beulich <JBeulich@suse.com>, Jean Guyader <jean.guyader@eu.citrix.com>
Message-ID: <CAE2935F.2481A%keir.xen@gmail.com>
Thread-Topic: [PATCH] Hypercall continuation cancelation in compat mode for
	XENMEM_get/set_pod_target.
Thread-Index: AcygT5UGJbb2mqR51E6Shjgl4QTTOA==
In-Reply-To: <4EBCED1A02000078000605BB@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: [PATCH] Hypercall continuation cancelation in
 compat mode for XENMEM_get/set_pod_target.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/11/2011 08:38, "Jan Beulich" <JBeulich@suse.com> wrote:

>>>> On 10.11.11 at 18:17, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> 
>> If copy_to_guest failed in the compat code after a continuation as been
>> done in the native code we need to cancel it so we won't reexecute the
>> hypercall but return from the hypercall with the appropriate error.
>> 
>> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> 
> Acked-by: Jan Beulich <jbeulich@suse.com>
> 
> (But I'd like to be certain that Keir also took a look at this before
> committing, not the least because this also should go into 4.1-testing.)

Looks okay to me.

Acked-by: Keir Fraser <keir@xen.org>

>> ---
>>  xen/arch/x86/domain.c           |   18 ++++++++++++++++++
>>  xen/arch/x86/x86_64/compat/mm.c |    4 ++++
>>  xen/include/xen/sched.h         |    1 +
>>  3 files changed, 23 insertions(+), 0 deletions(-)
> 
> 
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 01:14:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 01:14:52 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROnCF-0001Gn-Il; Fri, 11 Nov 2011 01:14:52 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROnBB-00014C-0R
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 01:13:50 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1321002808!54599245!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25212 invoked from network); 11 Nov 2011 09:13:29 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 09:13:29 -0000
X-IronPort-AV: E=Sophos;i="4.69,494,1315180800"; 
   d="scan'208";a="8880082"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Nov 2011 09:13:41 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Fri, 11 Nov 2011 09:13:42 +0000
Subject: Re: [Xen-devel] Re: [PATCH 5/7] mm: New XENMEM space,
	XENMAPSPACE_gmfn_range
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jan Beulich <JBeulich@suse.com>
Date: Fri, 11 Nov 2011 09:13:41 +0000
In-Reply-To: <4EBCE64D020000780006059C@nat28.tlf.novell.com>
References: <4EBBD5F602000078000602EE@nat28.tlf.novell.com>
	<20111110173720.GA29605@spongy.cam.xci-test.com>
	<4EBCE64D020000780006059C@nat28.tlf.novell.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1321002821.955.245.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Keir \(Xen.org\)" <keir@xen.org>,
	George Dunlap <George.Dunlap@eu.citrix.com>,
	"Tim \(Xen.org\)" <tim@xen.org>,
	"allen.m.kay@intel.com" <allen.m.kay@intel.com>,
	Jean Guyader <Jean.Guyader@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, 2011-11-11 at 08:09 +0000, Jan Beulich wrote:
> >>> On 10.11.11 at 18:37, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> > On 10/11 12:47, Jan Beulich wrote:
> >> >>> On 10.11.11 at 12:35, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> >> >@@ -4716,6 +4748,17 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) 
> > arg)
> >> >         }
> >> > 
> >> >         rc = xenmem_add_to_physmap(d, &xatp);
> >> >+        if ( rc == -EAGAIN )
> >> 
> >>         if ( rc )
> >> 
> >> >+        {
> >> >+            if ( copy_to_guest(arg, &xatp, 1) )
> >> >+            {
> >> >+                rcu_unlock_domain(d);
> >> >+                return -EFAULT;
> >> >+            }
> >> 
> >>         }
> >>         if ( rc == -EAGAIN )
> >> 
> >> (with some room for further simplification). Without that (or the minimal
> >> alternative of copying back just .size or yet some other mechanism), as
> >> pointed out before, the caller won't have a way to know how far into
> >> the batch things succeeded.
> >> 
> > 
> > In xenmem_add_to_physmap I modify xatp in place so when I exit this
> > function xatp will contain the updated value (new start value in
> > .gpfn and .idx, how far do I need to go in .size).
> > 
> > The idea here was to call the copy_to_guest only when we got preempted.
> > If I copy xatp back to the guest I should get the updated value
> > in xatp from the copy_from_guest when I'll be called by the continuation.
> 
> I understand the continuation aspect. But you appear to have not read
> my comments completely: I'm asking how your caller, in the event of
> failure, would know how much of the batch was processed successfully.

For this sort of flush operation can the caller assume that failure
means nothing was flushed, since a flush can always be repeated?

Ian.

> 
> Jan
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 01:16:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 01:16:15 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROnDb-0001eM-3c; Fri, 11 Nov 2011 01:16:15 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROnD9-0001Ro-6o
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 01:15:47 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1321002943!2714859!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10218 invoked from network); 11 Nov 2011 09:15:43 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 09:15:43 -0000
X-IronPort-AV: E=Sophos;i="4.69,494,1315180800"; 
   d="scan'208";a="8880120"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Nov 2011 09:15:06 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Fri, 11 Nov 2011 09:15:07 +0000
Subject: RE: [Xen-devel] [PATCH] libxl: use named options for tsc_mode
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Dan Magenheimer <dan.magenheimer@oracle.com>
Date: Fri, 11 Nov 2011 09:15:06 +0000
In-Reply-To: <4a3e0776-6598-48d5-949d-d54b8ff5bdbe@default>
References: <bc79b560aafa1e4dc42a.1320922519@cosworth.uk.xensource.com>
	<4a3e0776-6598-48d5-949d-d54b8ff5bdbe@default>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1321002906.955.246.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, Ian
	Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-11-10 at 17:29 +0000, Dan Magenheimer wrote:
> > From: Ian Campbell [mailto:ian.campbell@citrix.com]
> > Subject: [Xen-devel] [PATCH] libxl: use named options for tsc_mode
> > 
> > # HG changeset patch
> > # User Ian Campbell <ian.campbell@citrix.com>
> > # Date 1320922479 0
> > # Node ID bc79b560aafa1e4dc42af00e6a326dc651b5636a
> > # Parent  460b507e15f864dd6712f5040e36538d6e076ae4
> > libxl: use named options for tsc_mode.
> > 
> > It seems that this knob is expoerted from the hypervisor as a raw
> > integer (no symbolic names) documented in xen/include/asm-x86. Propagating that
> > all the way to the end user is hardly friendly (it's bad enough in the
> > hypercall interface).
> 
> Thanks for looking at this!
> 
> > Add an enum at the libxl level with a hopefully descriptive set of names.
> > Deprecate the use of an integer in xl cfg files.
> 
> We (Oracle) already have shipped cfg files that use the integer
> so would prefer that the deprecation message be removed.  IMHO, to
> the vast majority of users, the symbolic names will be gibberish
> anyway and are likely to be misspelled.  For knowledgeable folk,
> they are nice though, so maybe just support both?

For my part I can never remember which number is which so I always have
to go look, whereas "always_emulate" etc is generally descriptive of
what I'm looking for. IMHO magic numbers are generally a pretty terrible
interface.

I could change the message to inform the user which specific option
corresponds to the number which they used. Would that help?

More generally we need to have mechanisms by which we can evolve the
functionality provided by xl, guiding users towards new and improved
options for what they are trying to achieve while allowing us to
eventually remove deprecated options and therefore combat the inevitable
growth of compatibility cruft. I don't really mind what that mechanism
is but a message explaining what the new option is seems like a simple
solution. Perhaps it could be dropped to "INFO" rather than "WARNING"?

>  
> > +   * `"always_emulate"`: guest rdtsc/p always emulated at 1GHz (kernel
> > +     and user).
> 
> Many guests will "appear" to run at a slower "bogomips" so a word
> or two more here may keep some from panicking.  Maybe:
> 
> guest rdtsc/p always emulated and the virtual TSC will appear to
> increment (kernel and user) at a fixed 1GHz rate, regardless of
> the PCPU HZ rate or power state; this will NOT affect underlying
> CPU performance

Presumably the actual act of emulation has a performance impact?

How about:

guest rdtsc/p always emulated and the virtual TSC will appear to
increment (kernel and user) at a fixed 1GHz rate, regardless of the PCPU
HZ rate or power state; Although there is an overhead associated with
emulation this will NOT affect underlying CPU performance.

?

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 01:22:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 01:22:32 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROnJf-00026D-0l; Fri, 11 Nov 2011 01:22:31 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROnJB-0001th-MV
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 01:22:02 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1321003318!2713224!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21377 invoked from network); 11 Nov 2011 09:21:58 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 09:21:58 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 09:21:57 +0000
Message-Id: <4EBCF74502000078000605EB@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 09:21:57 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Ian Campbell" <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] Re: [PATCH 5/7] mm: New XENMEM space,
	XENMAPSPACE_gmfn_range
References: <4EBBD5F602000078000602EE@nat28.tlf.novell.com>
	<20111110173720.GA29605@spongy.cam.xci-test.com>
	<4EBCE64D020000780006059C@nat28.tlf.novell.com>
	<1321002821.955.245.camel@zakaz.uk.xensource.com>
In-Reply-To: <1321002821.955.245.camel@zakaz.uk.xensource.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Keir \(Xen.org\)" <keir@xen.org>,
	George Dunlap <George.Dunlap@eu.citrix.com>,
	"Tim \(Xen.org\)" <tim@xen.org>,
	"allen.m.kay@intel.com" <allen.m.kay@intel.com>,
	Jean Guyader <Jean.Guyader@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 11.11.11 at 10:13, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> On Fri, 2011-11-11 at 08:09 +0000, Jan Beulich wrote:
>> >>> On 10.11.11 at 18:37, Jean Guyader <jean.guyader@eu.citrix.com> =
wrote:
>> > On 10/11 12:47, Jan Beulich wrote:
>> >> >>> On 10.11.11 at 12:35, Jean Guyader <jean.guyader@eu.citrix.com> =
wrote:
>> >> >@@ -4716,6 +4748,17 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(=
void)=20
>> > arg)
>> >> >         }
>> >> >=20
>> >> >         rc =3D xenmem_add_to_physmap(d, &xatp);
>> >> >+        if ( rc =3D=3D -EAGAIN )
>> >>=20
>> >>         if ( rc )
>> >>=20
>> >> >+        {
>> >> >+            if ( copy_to_guest(arg, &xatp, 1) )
>> >> >+            {
>> >> >+                rcu_unlock_domain(d);
>> >> >+                return -EFAULT;
>> >> >+            }
>> >>=20
>> >>         }
>> >>         if ( rc =3D=3D -EAGAIN )
>> >>=20
>> >> (with some room for further simplification). Without that (or the =
minimal
>> >> alternative of copying back just .size or yet some other mechanism), =
as
>> >> pointed out before, the caller won't have a way to know how far into
>> >> the batch things succeeded.
>> >>=20
>> >=20
>> > In xenmem_add_to_physmap I modify xatp in place so when I exit this
>> > function xatp will contain the updated value (new start value in
>> > .gpfn and .idx, how far do I need to go in .size).
>> >=20
>> > The idea here was to call the copy_to_guest only when we got =
preempted.
>> > If I copy xatp back to the guest I should get the updated value
>> > in xatp from the copy_from_guest when I'll be called by the continuati=
on.
>>=20
>> I understand the continuation aspect. But you appear to have not read
>> my comments completely: I'm asking how your caller, in the event of
>> failure, would know how much of the batch was processed successfully.
>=20
> For this sort of flush operation can the caller assume that failure
> means nothing was flushed, since a flush can always be repeated?

This is not just a flush - instead, the flush is just a necessary sub-
operation of what is being done here. I don't think the actual add-
to-physmap should be repeated. And even if it can, at least for
diagnostic/debugging purposes knowing where things failed is rather
useful.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 01:31:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 01:31:45 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROnSb-0002bk-SA; Fri, 11 Nov 2011 01:31:45 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROnRq-0002PC-Jm
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 01:30:58 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1321003855!2704882!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23252 invoked from network); 11 Nov 2011 09:30:55 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 09:30:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,494,1315180800"; 
   d="scan'208";a="8880511"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Nov 2011 09:30:54 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 11 Nov 2011 09:30:54 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1ROnRm-0007nb-AY;
	Fri, 11 Nov 2011 09:30:54 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1ROnRc-0004t5-T8;
	Fri, 11 Nov 2011 09:30:44 +0000
Date: Fri, 11 Nov 2011 09:30:44 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] Re: [PATCH 5/7] mm: New XENMEM space,
	XENMAPSPACE_gmfn_range
Message-ID: <20111111093044.GB18606@spongy.cam.xci-test.com>
References: <4EBBD5F602000078000602EE@nat28.tlf.novell.com>
	<20111110173720.GA29605@spongy.cam.xci-test.com>
	<4EBCE64D020000780006059C@nat28.tlf.novell.com>
	<1321002821.955.245.camel@zakaz.uk.xensource.com>
	<4EBCF74502000078000605EB@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
In-Reply-To: <4EBCF74502000078000605EB@nat28.tlf.novell.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, "Keir
	\(Xen.org\)" <keir@xen.org>, Ian Campbell <Ian.Campbell@citrix.com>,
	George Dunlap <George.Dunlap@eu.citrix.com>,
	"Tim \(Xen.org\)" <tim@xen.org>,
	"allen.m.kay@intel.com" <allen.m.kay@intel.com>,
	Jean Guyader <Jean.Guyader@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/11 09:21, Jan Beulich wrote:
> >>> On 11.11.11 at 10:13, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > On Fri, 2011-11-11 at 08:09 +0000, Jan Beulich wrote:
> >> >>> On 10.11.11 at 18:37, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> >> > On 10/11 12:47, Jan Beulich wrote:
> >> >> >>> On 10.11.11 at 12:35, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> >> >> >@@ -4716,6 +4748,17 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) 
> >> > arg)
> >> >> >         }
> >> >> > 
> >> >> >         rc = xenmem_add_to_physmap(d, &xatp);
> >> >> >+        if ( rc == -EAGAIN )
> >> >> 
> >> >>         if ( rc )
> >> >> 
> >> >> >+        {
> >> >> >+            if ( copy_to_guest(arg, &xatp, 1) )
> >> >> >+            {
> >> >> >+                rcu_unlock_domain(d);
> >> >> >+                return -EFAULT;
> >> >> >+            }
> >> >> 
> >> >>         }
> >> >>         if ( rc == -EAGAIN )
> >> >> 
> >> >> (with some room for further simplification). Without that (or the minimal
> >> >> alternative of copying back just .size or yet some other mechanism), as
> >> >> pointed out before, the caller won't have a way to know how far into
> >> >> the batch things succeeded.
> >> >> 
> >> > 
> >> > In xenmem_add_to_physmap I modify xatp in place so when I exit this
> >> > function xatp will contain the updated value (new start value in
> >> > .gpfn and .idx, how far do I need to go in .size).
> >> > 
> >> > The idea here was to call the copy_to_guest only when we got preempted.
> >> > If I copy xatp back to the guest I should get the updated value
> >> > in xatp from the copy_from_guest when I'll be called by the continuation.
> >> 
> >> I understand the continuation aspect. But you appear to have not read
> >> my comments completely: I'm asking how your caller, in the event of
> >> failure, would know how much of the batch was processed successfully.
> > 
> > For this sort of flush operation can the caller assume that failure
> > means nothing was flushed, since a flush can always be repeated?
> 
> This is not just a flush - instead, the flush is just a necessary sub-
> operation of what is being done here. I don't think the actual add-
> to-physmap should be repeated. And even if it can, at least for
> diagnostic/debugging purposes knowing where things failed is rather
> useful.
> 

Ok, I'll do the copy_to_guest if rc isn't 0. Do you think I should do it
for all the spaces or only for gmfn_range?

Jean

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 01:33:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 01:33:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROnUQ-00035C-9R; Fri, 11 Nov 2011 01:33:38 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROnTz-0002tP-Az
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 01:33:11 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1321003988!3704155!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14253 invoked from network); 11 Nov 2011 09:33:08 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 09:33:08 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 09:33:07 +0000
Message-Id: <4EBCF9E30200007800060600@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 09:33:07 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Wang" <wei.wang2@amd.com>
References: <patchbomb.1320853855@gran.amd.com>
	<4b115815bc13e4f2a3a1.1320853857@gran.amd.com>
In-Reply-To: <4b115815bc13e4f2a3a1.1320853857@gran.amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: [PATCH 2 of 6] amd iommu: Cleanup iommu pci
	capabilites detection
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 09.11.11 at 16:50, Wei Wang <wei.wang2@amd.com> wrote:
> # HG changeset patch
> # User Wei Wang <wei.wang2@amd.com>
> # Date 1320851997 -3600
> # Node ID 4b115815bc13e4f2a3a178f3de7477ecf46cb44b
> # Parent  4769713326a876c25bdc0f9d1f90594f90fba9c5
> amd iommu: Cleanup iommu pci capabilites detection.
> * Define new structure to represent capability block.
> * Remove unnecessary read for unused information.
> * Add sanity check into get_iommu_capabilities.
> * iommu capability offset is 16 bit not 8 bit, fix that.

Does this imply that the capability can reside in extended config space?
If so, all code paths using this will need revisiting with regard to
extended config space possibly being inaccessible until early Dom0
initialization.

Jan

> Signed-off-by: Wei Wang <wei.wang2@amd.com>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 02:14:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 02:14:49 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROo8G-0005Sn-Od; Fri, 11 Nov 2011 02:14:49 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROo7A-0005GA-UT
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 02:13:41 -0800
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1321006416!3697391!1
X-Originating-IP: [216.32.181.183]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27583 invoked from network); 11 Nov 2011 10:13:37 -0000
Received: from ch1ehsobe003.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.183)
	by server-9.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	11 Nov 2011 10:13:37 -0000
Received: from mail79-ch1-R.bigfish.com (10.43.68.245) by
	CH1EHSOBE013.bigfish.com (10.43.70.63) with Microsoft SMTP Server id
	14.1.225.22; Fri, 11 Nov 2011 10:13:10 +0000
Received: from mail79-ch1 (localhost.localdomain [127.0.0.1])	by
	mail79-ch1-R.bigfish.com (Postfix) with ESMTP id 17BE7F500D3;
	Fri, 11 Nov 2011 10:13:25 +0000 (UTC)
X-SpamScore: -12
X-BigFish: VPS-12(zz1432N98dK4015Lzz1202hzz8275bhz32i668h839h)
X-Forefront-Antispam-Report: CIP:163.181.249.109; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp02.amd.com; RD:none; EFVD:NLI
X-FB-SS: 13,
Received: from mail79-ch1 (localhost.localdomain [127.0.0.1]) by mail79-ch1
	(MessageSwitch) id 1321006404891863_9889;
	Fri, 11 Nov 2011 10:13:24 +0000 (UTC)
Received: from CH1EHSMHS024.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.240])	by mail79-ch1.bigfish.com (Postfix) with ESMTP id
	D561EE0070; Fri, 11 Nov 2011 10:13:24 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	CH1EHSMHS024.bigfish.com (10.43.70.24) with Microsoft SMTP Server id
	14.1.225.22; Fri, 11 Nov 2011 10:13:38 +0000
X-WSS-ID: 0LUHR2K-02-C5D-02
X-M-MSG: 
Received: from sausexedgep01.amd.com (sausexedgep01-ext.amd.com
	[163.181.249.72])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp02.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 2A57EC8074;	Fri, 11 Nov 2011 04:13:31 -0600 (CST)
Received: from SAUSEXDAG04.amd.com (163.181.55.4) by sausexedgep01.amd.com
	(163.181.36.54) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Fri, 11 Nov 2011 04:14:39 -0600
Received: from storexhtp01.amd.com (172.24.4.3) by sausexdag04.amd.com
	(163.181.55.4) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Fri, 11 Nov 2011 04:13:32 -0600
Received: from gwo.osrc.amd.com (165.204.16.204) by storexhtp01.amd.com
	(172.24.4.3) with Microsoft SMTP Server id 8.3.213.0; Fri, 11 Nov 2011
	05:13:31 -0500
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id B48C149C0F1; Fri, 11 Nov 2011
	10:13:30 +0000 (GMT)
Received: from gran.osrc.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 999645940FF; Fri, 11 Nov 2011
	11:13:30 +0100 (CET)
From: Wei Wang2 <wei.wang2@amd.com>
To: Jan Beulich <JBeulich@suse.com>
Date: Fri, 11 Nov 2011 11:16:27 +0100
User-Agent: KMail/1.9.6 (enterprise 20070904.708012)
References: <patchbomb.1320853855@gran.amd.com>
	<4b115815bc13e4f2a3a1.1320853857@gran.amd.com>
	<4EBCF9E30200007800060600@nat28.tlf.novell.com>
In-Reply-To: <4EBCF9E30200007800060600@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Message-ID: <201111111116.28286.wei.wang2@amd.com>
X-OriginatorOrg: amd.com
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: [PATCH 2 of 6] amd iommu: Cleanup iommu pci
	capabilites detection
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Friday 11 November 2011 10:33:07 Jan Beulich wrote:
> >>> On 09.11.11 at 16:50, Wei Wang <wei.wang2@amd.com> wrote:
> >
> > # HG changeset patch
> > # User Wei Wang <wei.wang2@amd.com>
> > # Date 1320851997 -3600
> > # Node ID 4b115815bc13e4f2a3a178f3de7477ecf46cb44b
> > # Parent  4769713326a876c25bdc0f9d1f90594f90fba9c5
> > amd iommu: Cleanup iommu pci capabilites detection.
> > * Define new structure to represent capability block.
> > * Remove unnecessary read for unused information.
> > * Add sanity check into get_iommu_capabilities.
> > * iommu capability offset is 16 bit not 8 bit, fix that.
>
> Does this imply that the capability can reside in extended config space?
> If so, all code paths using this will need revisiting with regard to
> extended config space possibly being inaccessible until early Dom0
> initialization.

Jan,
This is just an inconsistency issue with iommu specification as in IVHD 
header, it has been defined as 16 bit value. In reality, both current and 
next generation amd iommu will not have this capability in  extended pci 
config space. 

Thanks,
Wei

> Jan
>
> > Signed-off-by: Wei Wang <wei.wang2@amd.com>




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-api-bounces@lists.xensource.com Fri Nov 11 02:50:18 2011
Return-path: <xen-api-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 02:50:18 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROogb-00077v-CW; Fri, 11 Nov 2011 02:50:17 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROof2-0006f9-3b; Fri, 11 Nov 2011 02:48:40 -0800
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1321008516!2735089!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26541 invoked from network); 11 Nov 2011 10:48:36 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-5.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 10:48:36 -0000
Received: by wyh11 with SMTP id 11so4815636wyh.30
	for <multiple recipients>; Fri, 11 Nov 2011 02:48:36 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:message-id:date:from:user-agent:mime-version:to:subject
	:content-type:content-transfer-encoding;
	bh=jnymLJ1l+N6AkoBLZXA335EuALitOJg5bhfSjAxl9K4=;
	b=Q59MUySS/J/wWyQ2HbaD/KPRiR3Ydcg1TqbcU8LJMcL9EIB2qzJSjdJRM9HFoM2IW5
	PiyTYrb2iujcvJUWs1PFEaGr8ei5h8zg5e7Yb6m7TVETz0EvRwRbDBCQiJE4VjrN1xMT
	5bcE+4N4xXUq29pKTIbNnuOWAMinSH9wlo/to=
Received: by 10.216.208.167 with SMTP id q39mr20358weo.79.1321008516109;
	Fri, 11 Nov 2011 02:48:36 -0800 (PST)
Received: from [172.16.26.10] (5e0575b0.bb.sky.com. [94.5.117.176])
	by mx.google.com with ESMTPS id e40sm13036672wbp.3.2011.11.11.02.48.34
	(version=SSLv3 cipher=OTHER); Fri, 11 Nov 2011 02:48:35 -0800 (PST)
Message-ID: <4EBCFD80.5060005@xen.org>
Date: Fri, 11 Nov 2011 10:48:32 +0000
From: Lars Kurth <lars.kurth@xen.org>
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20111105 Thunderbird/8.0
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, 
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	xen-arm@lists.xensource.com, 
	"xen-api@lists.xensource.com" <xen-api@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit
Cc: 
Subject: [Xen-API] Virtualization and Cloud DevRoom at FOSDEM
X-BeenThere: xen-api@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Discussion of API issues surrounding Xen <xen-api.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>,
	<mailto:xen-api-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-api@lists.xensource.com>
List-Help: <mailto:xen-api-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>,
	<mailto:xen-api-request@lists.xensource.com?subject=subscribe>
Sender: xen-api-bounces@lists.xensource.com
Errors-To: xen-api-bounces@lists.xensource.com

Hi,

I wanted to let everybody know that we will be hosting a DevRoom 
together with other projects at FOSDEM. The room is organized by Thierry 
Carrez (Openstack), Renzo Davoli (Universoità di Bologna) and me (Xen) 
and it will be a large room, which we will have for two days instead of 
the usual 4 hours.

More on FOSDEM: see http://fosdem.org/2012, Brussels Feb 4-5
Other DevRooms, see http://fosdem.org/2012/devrooms_for_2012

More details will follow

Regards
Lars

_______________________________________________
xen-api mailing list
xen-api@lists.xensource.com
http://lists.xensource.com/mailman/listinfo/xen-api

From xen-devel-bounces@lists.xensource.com Fri Nov 11 02:59:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 02:59:32 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROopX-0000AP-Mi; Fri, 11 Nov 2011 02:59:31 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROona-0008O2-6m
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 02:57:30 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1321009046!3142506!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31780 invoked from network); 11 Nov 2011 10:57:27 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-7.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 10:57:27 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 10:57:26 +0000
Message-Id: <4EBD0DA6020000780006064A@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 10:57:26 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: <Jean.Guyader@citrix.com>,
	 "Jean Guyader" <jean.guyader@eu.citrix.com>
Subject: Re: [Xen-devel] Re: [PATCH 5/7] mm: New XENMEM space,
	XENMAPSPACE_gmfn_range
References: <4EBBD5F602000078000602EE@nat28.tlf.novell.com>
	<20111110173720.GA29605@spongy.cam.xci-test.com>
	<4EBCE64D020000780006059C@nat28.tlf.novell.com>
	<1321002821.955.245.camel@zakaz.uk.xensource.com>
	<4EBCF74502000078000605EB@nat28.tlf.novell.com>
	<20111111093044.GB18606@spongy.cam.xci-test.com>
In-Reply-To: <20111111093044.GB18606@spongy.cam.xci-test.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Keir\(Xen.org\)" <keir@xen.org>, Ian Campbell <Ian.Campbell@citrix.com>,
	George Dunlap <George.Dunlap@eu.citrix.com>,
	"Tim \(Xen.org\)" <tim@xen.org>,
	"allen.m.kay@intel.com" <allen.m.kay@intel.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 11.11.11 at 10:30, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> On 11/11 09:21, Jan Beulich wrote:
>> >>> On 11.11.11 at 10:13, Ian Campbell <Ian.Campbell@citrix.com> wrote:
>> > On Fri, 2011-11-11 at 08:09 +0000, Jan Beulich wrote:
>> >> >>> On 10.11.11 at 18:37, Jean Guyader <jean.guyader@eu.citrix.com> =
wrote:
>> >> > On 10/11 12:47, Jan Beulich wrote:
>> >> >> >>> On 10.11.11 at 12:35, Jean Guyader <jean.guyader@eu.citrix.com=
> wrote:
>> >> >> >@@ -4716,6 +4748,17 @@ long arch_memory_op(int op, XEN_GUEST_HAND=
LE(void)=20
>> >> > arg)
>> >> >> >         }
>> >> >> >=20
>> >> >> >         rc =3D xenmem_add_to_physmap(d, &xatp);
>> >> >> >+        if ( rc =3D=3D -EAGAIN )
>> >> >>=20
>> >> >>         if ( rc )
>> >> >>=20
>> >> >> >+        {
>> >> >> >+            if ( copy_to_guest(arg, &xatp, 1) )
>> >> >> >+            {
>> >> >> >+                rcu_unlock_domain(d);
>> >> >> >+                return -EFAULT;
>> >> >> >+            }
>> >> >>=20
>> >> >>         }
>> >> >>         if ( rc =3D=3D -EAGAIN )
>> >> >>=20
>> >> >> (with some room for further simplification). Without that (or the =
minimal
>> >> >> alternative of copying back just .size or yet some other =
mechanism), as
>> >> >> pointed out before, the caller won't have a way to know how far =
into
>> >> >> the batch things succeeded.
>> >> >>=20
>> >> >=20
>> >> > In xenmem_add_to_physmap I modify xatp in place so when I exit =
this
>> >> > function xatp will contain the updated value (new start value in
>> >> > .gpfn and .idx, how far do I need to go in .size).
>> >> >=20
>> >> > The idea here was to call the copy_to_guest only when we got =
preempted.
>> >> > If I copy xatp back to the guest I should get the updated value
>> >> > in xatp from the copy_from_guest when I'll be called by the =
continuation.
>> >>=20
>> >> I understand the continuation aspect. But you appear to have not =
read
>> >> my comments completely: I'm asking how your caller, in the event of
>> >> failure, would know how much of the batch was processed successfully.=

>> >=20
>> > For this sort of flush operation can the caller assume that failure
>> > means nothing was flushed, since a flush can always be repeated?
>>=20
>> This is not just a flush - instead, the flush is just a necessary sub-
>> operation of what is being done here. I don't think the actual add-
>> to-physmap should be repeated. And even if it can, at least for
>> diagnostic/debugging purposes knowing where things failed is rather
>> useful.
>>=20
>=20
> Ok, I'll do the copy_to_guest if rc isn't 0. Do you think I should do it
> for all the spaces or only for gmfn_range?

I'd prefer doing it just for the latter - the others have no outputs,
and their input could legitimately (albeit unlikely) live in read-only
memory.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 03:03:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 03:03:56 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROotn-0000l2-S3; Fri, 11 Nov 2011 03:03:55 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROoqo-0000Mv-Ti
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 03:00:51 -0800
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1321009221!48067574!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6315 invoked from network); 11 Nov 2011 11:00:21 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 11:00:21 -0000
Received: by wyh11 with SMTP id 11so4828721wyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 11 Nov 2011 03:00:47 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:message-id:date:from:user-agent:mime-version:to:subject
	:content-type:content-transfer-encoding;
	bh=9F2MSc0ZbkjcOk5/C1Dwf38vk/UFs6i8jrcVc2+JM3I=;
	b=EluNEljZk7DsbIM9Y1atbROhcX/SfgpNOkHfcB7Kdib9u6Gx6J7rxGyqvGZjvEJASn
	TDc7a/HgrhU43YbxuHdPo8Pcy62/yZeUu5XvVKUYL+6VdJaoqJXEoF4N6qCEJXnETdkH
	rbebIvOsGQ2Rgkr1hcDTPY6MJdUYFkdhYRMoY=
Received: by 10.216.132.144 with SMTP id o16mr17968wei.106.1321009247799;
	Fri, 11 Nov 2011 03:00:47 -0800 (PST)
Received: from [172.16.26.10] (5e0575b0.bb.sky.com. [94.5.117.176])
	by mx.google.com with ESMTPS id es5sm13057182wbb.11.2011.11.11.03.00.45
	(version=SSLv3 cipher=OTHER); Fri, 11 Nov 2011 03:00:46 -0800 (PST)
Message-ID: <4EBD005A.6030201@xen.org>
Date: Fri, 11 Nov 2011 11:00:42 +0000
From: Lars Kurth <lars.kurth@xen.org>
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20111105 Thunderbird/8.0
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Subject: [Xen-devel] Xen Pages on new Wiki
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi,

just to let you know that I migrated most high priority Xen pages to the 
new wiki: the pages can be found at
- http://new-wiki.xen.org/wiki/Category:Xen

The rest will follow in due course, but you may want to review some of 
the pages, check categorization or migrate some more pages. I won't be 
able to work on this for the next two weeks.

Regards
Lars

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 03:14:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 03:14:25 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROp3w-0001xm-Iq; Fri, 11 Nov 2011 03:14:24 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROp2B-0001j9-UI
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 03:12:38 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1321009952!3114198!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19124 invoked from network); 11 Nov 2011 11:12:32 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-3.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 11:12:32 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 11:12:33 +0000
Message-Id: <4EBD112F0200007800060664@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 11:12:31 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part97B8690F.0__="
Subject: [Xen-devel] [PATCH] x86: quiesce cpuidle code
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part97B8690F.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

So far these messages got pointlessly (as the code in other places
assumes symmetric configuration) emitted once per CPU. Hide the debug
one behind opt_cpu_info, and issue the info one just once (if the code
gets adjusted to support assymtric configurations, this would need to
be revisited, but ideally without producing per-CPU messages again).

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/acpi/cpu_idle.c
+++ b/xen/arch/x86/acpi/cpu_idle.c
@@ -664,6 +664,8 @@ static int acpi_processor_ffh_cstate_pro
     unsigned int edx_part;
     unsigned int cstate_type; /* C-state type and not ACPI C-state type =
*/
     unsigned int num_cstate_subtype;
+    int ret =3D 0;
+    static unsigned long printed;
=20
     if ( c->cpuid_level < CPUID_MWAIT_LEAF )
     {
@@ -672,8 +674,9 @@ static int acpi_processor_ffh_cstate_pro
     }
=20
     cpuid(CPUID_MWAIT_LEAF, &eax, &ebx, &ecx, &edx);
-    printk(XENLOG_DEBUG "cpuid.MWAIT[.eax=3D%x, .ebx=3D%x, .ecx=3D%x, =
.edx=3D%x]\n",
-           eax, ebx, ecx, edx);
+    if ( opt_cpu_info )
+        printk(XENLOG_DEBUG "cpuid.MWAIT[eax=3D%x ebx=3D%x ecx=3D%x =
edx=3D%x]\n",
+               eax, ebx, ecx, edx);
=20
     /* Check whether this particular cx_type (in CST) is supported or not =
*/
     cstate_type =3D (cx->reg.address >> MWAIT_SUBSTATE_SIZE) + 1;
@@ -681,15 +684,16 @@ static int acpi_processor_ffh_cstate_pro
     num_cstate_subtype =3D edx_part & MWAIT_SUBSTATE_MASK;
=20
     if ( num_cstate_subtype < (cx->reg.address & MWAIT_SUBSTATE_MASK) )
-        return -EFAULT;
-
+        ret =3D -ERANGE;
     /* mwait ecx extensions INTERRUPT_BREAK should be supported for C2/C3 =
*/
-    if ( !(ecx & CPUID5_ECX_EXTENSIONS_SUPPORTED) ||
-         !(ecx & CPUID5_ECX_INTERRUPT_BREAK) )
-        return -EFAULT;
-
-    printk(XENLOG_INFO "Monitor-Mwait will be used to enter C-%d =
state\n", cx->type);
-    return 0;
+    else if ( !(ecx & CPUID5_ECX_EXTENSIONS_SUPPORTED) ||
+              !(ecx & CPUID5_ECX_INTERRUPT_BREAK) )
+        ret =3D -ENODEV;
+    else if ( opt_cpu_info || cx->type >=3D BITS_PER_LONG ||
+              !test_and_set_bit(cx->type, &printed) )
+        printk(XENLOG_INFO "Monitor-Mwait will be used to enter C%d =
state\n",
+               cx->type);
+    return ret;
 }
=20
 /*




--=__Part97B8690F.0__=
Content-Type: text/plain; name="x86-cpuidle-silent.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="x86-cpuidle-silent.patch"

x86: quiesce cpuidle code=0A=0ASo far these messages got pointlessly (as =
the code in other places=0Aassumes symmetric configuration) emitted once =
per CPU. Hide the debug=0Aone behind opt_cpu_info, and issue the info one =
just once (if the code=0Agets adjusted to support assymtric configurations,=
 this would need to=0Abe revisited, but ideally without producing per-CPU =
messages again).=0A=0ASigned-off-by: Jan Beulich <jbeulich@suse.com>=0A=0A-=
-- a/xen/arch/x86/acpi/cpu_idle.c=0A+++ b/xen/arch/x86/acpi/cpu_idle.c=0A@@=
 -664,6 +664,8 @@ static int acpi_processor_ffh_cstate_pro=0A     unsigned =
int edx_part;=0A     unsigned int cstate_type; /* C-state type and not =
ACPI C-state type */=0A     unsigned int num_cstate_subtype;=0A+    int =
ret =3D 0;=0A+    static unsigned long printed;=0A =0A     if ( c->cpuid_le=
vel < CPUID_MWAIT_LEAF )=0A     {=0A@@ -672,8 +674,9 @@ static int =
acpi_processor_ffh_cstate_pro=0A     }=0A =0A     cpuid(CPUID_MWAIT_LEAF, =
&eax, &ebx, &ecx, &edx);=0A-    printk(XENLOG_DEBUG "cpuid.MWAIT[.eax=3D%x,=
 .ebx=3D%x, .ecx=3D%x, .edx=3D%x]\n",=0A-           eax, ebx, ecx, =
edx);=0A+    if ( opt_cpu_info )=0A+        printk(XENLOG_DEBUG "cpuid.MWAI=
T[eax=3D%x ebx=3D%x ecx=3D%x edx=3D%x]\n",=0A+               eax, ebx, =
ecx, edx);=0A =0A     /* Check whether this particular cx_type (in CST) is =
supported or not */=0A     cstate_type =3D (cx->reg.address >> MWAIT_SUBSTA=
TE_SIZE) + 1;=0A@@ -681,15 +684,16 @@ static int acpi_processor_ffh_cstate_=
pro=0A     num_cstate_subtype =3D edx_part & MWAIT_SUBSTATE_MASK;=0A =0A   =
  if ( num_cstate_subtype < (cx->reg.address & MWAIT_SUBSTATE_MASK) )=0A-  =
      return -EFAULT;=0A-=0A+        ret =3D -ERANGE;=0A     /* mwait ecx =
extensions INTERRUPT_BREAK should be supported for C2/C3 */=0A-    if ( =
!(ecx & CPUID5_ECX_EXTENSIONS_SUPPORTED) ||=0A-         !(ecx & CPUID5_ECX_=
INTERRUPT_BREAK) )=0A-        return -EFAULT;=0A-=0A-    printk(XENLOG_INFO=
 "Monitor-Mwait will be used to enter C-%d state\n", cx->type);=0A-    =
return 0;=0A+    else if ( !(ecx & CPUID5_ECX_EXTENSIONS_SUPPORTED) ||=0A+ =
             !(ecx & CPUID5_ECX_INTERRUPT_BREAK) )=0A+        ret =3D =
-ENODEV;=0A+    else if ( opt_cpu_info || cx->type >=3D BITS_PER_LONG =
||=0A+              !test_and_set_bit(cx->type, &printed) )=0A+        =
printk(XENLOG_INFO "Monitor-Mwait will be used to enter C%d state\n",=0A+  =
             cx->type);=0A+    return ret;=0A }=0A =0A /*=0A
--=__Part97B8690F.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part97B8690F.0__=--


From xen-devel-bounces@lists.xensource.com Fri Nov 11 03:16:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 03:16:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROp6L-0002NE-VC; Fri, 11 Nov 2011 03:16:54 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROp3m-0001vp-Hy
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 03:14:16 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1321010051!3127856!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2347 invoked from network); 11 Nov 2011 11:14:11 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-4.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 11:14:11 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 11:14:11 +0000
Message-Id: <4EBD11920200007800060668@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 11:14:10 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part0A25F492.0__="
Subject: [Xen-devel] [PATCH] x86/amd-ucode: further turn down verbosity
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part0A25F492.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Turn up the log level on various (mostly debug-only) messages.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/microcode_amd.c
+++ b/xen/arch/x86/microcode_amd.c
@@ -59,7 +59,7 @@ static int collect_cpu_info(int cpu, str
=20
     rdmsrl(MSR_AMD_PATCHLEVEL, csig->rev);
=20
-    printk(KERN_INFO "microcode: collect_cpu_info: patch_id=3D0x%x\n",
+    printk(KERN_DEBUG "microcode: collect_cpu_info: patch_id=3D0x%x\n",
            csig->rev);
=20
     return 0;
@@ -92,7 +92,7 @@ static int microcode_fits(void *mc, int=20
=20
     if ( (mc_header->processor_rev_id) !=3D equiv_cpu_id )
     {
-        printk(KERN_INFO "microcode: CPU%d patch does not match "
+        printk(KERN_DEBUG "microcode: CPU%d patch does not match "
                "(patch is %x, cpu base id is %x) \n",
                cpu, mc_header->processor_rev_id, equiv_cpu_id);
         return -EINVAL;
@@ -101,7 +101,7 @@ static int microcode_fits(void *mc, int=20
     if ( mc_header->patch_id <=3D uci->cpu_sig.rev )
         return -EINVAL;
=20
-    printk(KERN_INFO "microcode: CPU%d found a matching microcode "
+    printk(KERN_DEBUG "microcode: CPU%d found a matching microcode "
            "update with version 0x%x (current=3D0x%x)\n",
            cpu, mc_header->patch_id, uci->cpu_sig.rev);
=20
@@ -139,8 +139,7 @@ static int apply_microcode(int cpu)
         return -EIO;
     }
=20
-    printk("microcode: CPU%d updated from revision "
-           "0x%x to 0x%x \n",
+    printk(KERN_INFO "microcode: CPU%d updated from revision %#x to =
%#x\n",
            cpu, uci->cpu_sig.rev, mc_amd->hdr.patch_id);
=20
     uci->cpu_sig.rev =3D rev;
@@ -170,7 +169,7 @@ static int get_next_ucode_from_buffer_am
=20
     total_size =3D (unsigned long) (bufp[off+4] + (bufp[off+5] << 8));
=20
-    printk(KERN_INFO "microcode: size %lu, total_size %lu, offset %ld\n",
+    printk(KERN_DEBUG "microcode: size %lu, total_size %lu, offset =
%ld\n",
            (unsigned long)size, total_size, off);
=20
     if ( (off + total_size) > size )




--=__Part0A25F492.0__=
Content-Type: text/plain; name="x86-microcode-amd-verbosity.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="x86-microcode-amd-verbosity.patch"

x86/amd-ucode: further turn down verbosity=0A=0ATurn up the log level on =
various (mostly debug-only) messages.=0A=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- a/xen/arch/x86/microcode_amd.c=0A+++ =
b/xen/arch/x86/microcode_amd.c=0A@@ -59,7 +59,7 @@ static int collect_cpu_i=
nfo(int cpu, str=0A =0A     rdmsrl(MSR_AMD_PATCHLEVEL, csig->rev);=0A =0A- =
   printk(KERN_INFO "microcode: collect_cpu_info: patch_id=3D0x%x\n",=0A+  =
  printk(KERN_DEBUG "microcode: collect_cpu_info: patch_id=3D0x%x\n",=0A   =
         csig->rev);=0A =0A     return 0;=0A@@ -92,7 +92,7 @@ static int =
microcode_fits(void *mc, int =0A =0A     if ( (mc_header->processor_rev_id)=
 !=3D equiv_cpu_id )=0A     {=0A-        printk(KERN_INFO "microcode: =
CPU%d patch does not match "=0A+        printk(KERN_DEBUG "microcode: =
CPU%d patch does not match "=0A                "(patch is %x, cpu base id =
is %x) \n",=0A                cpu, mc_header->processor_rev_id, equiv_cpu_i=
d);=0A         return -EINVAL;=0A@@ -101,7 +101,7 @@ static int microcode_f=
its(void *mc, int =0A     if ( mc_header->patch_id <=3D uci->cpu_sig.rev =
)=0A         return -EINVAL;=0A =0A-    printk(KERN_INFO "microcode: CPU%d =
found a matching microcode "=0A+    printk(KERN_DEBUG "microcode: CPU%d =
found a matching microcode "=0A            "update with version 0x%x =
(current=3D0x%x)\n",=0A            cpu, mc_header->patch_id, uci->cpu_sig.r=
ev);=0A =0A@@ -139,8 +139,7 @@ static int apply_microcode(int cpu)=0A      =
   return -EIO;=0A     }=0A =0A-    printk("microcode: CPU%d updated from =
revision "=0A-           "0x%x to 0x%x \n",=0A+    printk(KERN_INFO =
"microcode: CPU%d updated from revision %#x to %#x\n",=0A            cpu, =
uci->cpu_sig.rev, mc_amd->hdr.patch_id);=0A =0A     uci->cpu_sig.rev =3D =
rev;=0A@@ -170,7 +169,7 @@ static int get_next_ucode_from_buffer_am=0A =0A =
    total_size =3D (unsigned long) (bufp[off+4] + (bufp[off+5] << 8));=0A =
=0A-    printk(KERN_INFO "microcode: size %lu, total_size %lu, offset =
%ld\n",=0A+    printk(KERN_DEBUG "microcode: size %lu, total_size %lu, =
offset %ld\n",=0A            (unsigned long)size, total_size, off);=0A =0A =
    if ( (off + total_size) > size )=0A
--=__Part0A25F492.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part0A25F492.0__=--


From xen-api-bounces@lists.xensource.com Fri Nov 11 03:17:56 2011
Return-path: <xen-api-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 03:17:56 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROp7L-0002bj-OI; Fri, 11 Nov 2011 03:17:55 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROp5V-0002Cs-HZ; Fri, 11 Nov 2011 03:16:04 -0800
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1321010157!3807266!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20231 invoked from network); 11 Nov 2011 11:15:58 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-4.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 11:15:58 -0000
Received: by wyh11 with SMTP id 11so4844870wyh.30
	for <multiple recipients>; Fri, 11 Nov 2011 03:15:57 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:message-id:date:from:user-agent:mime-version:to:subject
	:content-type:content-transfer-encoding;
	bh=Cr3gQW6qqdksEAiX/oMPYjkQnIY+FGJqnrJaHm5lzNI=;
	b=hZ2RZmjdR5XJOx6kY/iXP5uko6qu5SCmFhNn9cNHZruL3gFSr9mjTh8G1K4FbKpqct
	pDnBV74FawuG77sEWpL0250FjbUB+yli7vcnHCJPO47pVHWWQg4qEE/8QMPNd+25/GMi
	XP8UkV4t5jHzv6i9b7H5QpXBR7/HM256lYG1A=
Received: by 10.216.134.209 with SMTP id s59mr46770wei.62.1321010157813;
	Fri, 11 Nov 2011 03:15:57 -0800 (PST)
Received: from [172.16.26.10] (5e0575b0.bb.sky.com. [94.5.117.176])
	by mx.google.com with ESMTPS id x40sm13088370wbn.19.2011.11.11.03.15.55
	(version=SSLv3 cipher=OTHER); Fri, 11 Nov 2011 03:15:56 -0800 (PST)
Message-ID: <4EBD03EA.9070907@xen.org>
Date: Fri, 11 Nov 2011 11:15:54 +0000
From: Lars Kurth <lars.kurth@xen.org>
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20111105 Thunderbird/8.0
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, 
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	"xen-api@lists.xensource.com" <xen-api@lists.xensource.com>, 
	xen-arm@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: 
Subject: [Xen-API] Another Xen Doc Day, Nov 29 or Dec 12
X-BeenThere: xen-api@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Discussion of API issues surrounding Xen <xen-api.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>,
	<mailto:xen-api-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-api@lists.xensource.com>
List-Help: <mailto:xen-api-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>,
	<mailto:xen-api-request@lists.xensource.com?subject=subscribe>
Sender: xen-api-bounces@lists.xensource.com
Errors-To: xen-api-bounces@lists.xensource.com

Hi,

Given that the last Xen Document day was a real success, I wanted to 
propose another Xen Document day. Ideas of what to work on:
- Continue some of the work stared by the dev community (more man pages, 
etc.)
- Clean up pages in the new Wiki
- I am also happy to be on stand-by to help anybody who wants to know 
how to use the new Wiki effectively

Please vote on date preferences by voting
+1 <your preferred date>

Cheers
Lars

_______________________________________________
xen-api mailing list
xen-api@lists.xensource.com
http://lists.xensource.com/mailman/listinfo/xen-api

From xen-devel-bounces@lists.xensource.com Fri Nov 11 03:21:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 03:21:42 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROpB0-0003zY-Ex; Fri, 11 Nov 2011 03:21:42 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROp6I-0002LZ-Fz
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 03:16:51 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1321010206!3144711!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12742 invoked from network); 11 Nov 2011 11:16:47 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-8.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 11:16:47 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 11:16:46 +0000
Message-Id: <4EBD122E0200007800060675@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 11:16:46 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part91BE6F0E.0__="
Subject: [Xen-devel] [PATCH] multicall: don't ignore failure from
	__copy_to_guest() upon preemption
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part91BE6F0E.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

At once adjust perf counter updates to also count calls from here even
if a guest memory access failed.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/common/multicall.c
+++ b/xen/common/multicall.c
@@ -25,6 +25,7 @@ do_multicall(
 {
     struct mc_state *mcs =3D &current->mc_state;
     unsigned int     i;
+    int              rc =3D 0;
=20
     if ( unlikely(__test_and_set_bit(_MCSF_in_multicall, &mcs->flags)) )
     {
@@ -33,15 +34,18 @@ do_multicall(
     }
=20
     if ( unlikely(!guest_handle_okay(call_list, nr_calls)) )
-        goto fault;
+        rc =3D -EFAULT;
=20
-    for ( i =3D 0; i < nr_calls; i++ )
+    for ( i =3D 0; !rc && i < nr_calls; i++ )
     {
         if ( hypercall_preempt_check() )
             goto preempted;
=20
         if ( unlikely(__copy_from_guest(&mcs->call, call_list, 1)) )
-            goto fault;
+        {
+            rc =3D -EFAULT;
+            break;
+        }
=20
         do_multicall_call(&mcs->call);
=20
@@ -58,30 +62,25 @@ do_multicall(
 #endif
=20
         if ( unlikely(__copy_field_to_guest(call_list, &mcs->call, =
result)) )
-            goto fault;
-
-        if ( test_bit(_MCSF_call_preempted, &mcs->flags) )
+            rc =3D -EFAULT;
+        else if ( test_bit(_MCSF_call_preempted, &mcs->flags) )
         {
             /* Translate sub-call continuation to guest layout */
             xlat_multicall_entry(mcs);
=20
             /* Copy the sub-call continuation. */
-            (void)__copy_to_guest(call_list, &mcs->call, 1);
-            goto preempted;
+            if ( likely(!__copy_to_guest(call_list, &mcs->call, 1)) )
+                goto preempted;
+            rc =3D -EFAULT;
         }
-
-        guest_handle_add_offset(call_list, 1);
+        else
+            guest_handle_add_offset(call_list, 1);
     }
=20
     perfc_incr(calls_to_multicall);
-    perfc_add(calls_from_multicall, nr_calls);
-    mcs->flags =3D 0;
-    return 0;
-
- fault:
-    perfc_incr(calls_to_multicall);
+    perfc_add(calls_from_multicall, i);
     mcs->flags =3D 0;
-    return -EFAULT;
+    return rc;
=20
  preempted:
     perfc_add(calls_from_multicall, i);




--=__Part91BE6F0E.0__=
Content-Type: text/plain; name="multicall-honor-fault.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="multicall-honor-fault.patch"

multicall: don't ignore failure from __copy_to_guest() upon preemption=0A=
=0AAt once adjust perf counter updates to also count calls from here =
even=0Aif a guest memory access failed.=0A=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- a/xen/common/multicall.c=0A+++ b/xen/common/mu=
lticall.c=0A@@ -25,6 +25,7 @@ do_multicall(=0A {=0A     struct mc_state =
*mcs =3D &current->mc_state;=0A     unsigned int     i;=0A+    int         =
     rc =3D 0;=0A =0A     if ( unlikely(__test_and_set_bit(_MCSF_in_multica=
ll, &mcs->flags)) )=0A     {=0A@@ -33,15 +34,18 @@ do_multicall(=0A     =
}=0A =0A     if ( unlikely(!guest_handle_okay(call_list, nr_calls)) )=0A-  =
      goto fault;=0A+        rc =3D -EFAULT;=0A =0A-    for ( i =3D 0; i < =
nr_calls; i++ )=0A+    for ( i =3D 0; !rc && i < nr_calls; i++ )=0A     =
{=0A         if ( hypercall_preempt_check() )=0A             goto =
preempted;=0A =0A         if ( unlikely(__copy_from_guest(&mcs->call, =
call_list, 1)) )=0A-            goto fault;=0A+        {=0A+            rc =
=3D -EFAULT;=0A+            break;=0A+        }=0A =0A         do_multicall=
_call(&mcs->call);=0A =0A@@ -58,30 +62,25 @@ do_multicall(=0A #endif=0A =
=0A         if ( unlikely(__copy_field_to_guest(call_list, &mcs->call, =
result)) )=0A-            goto fault;=0A-=0A-        if ( test_bit(_MCSF_ca=
ll_preempted, &mcs->flags) )=0A+            rc =3D -EFAULT;=0A+        =
else if ( test_bit(_MCSF_call_preempted, &mcs->flags) )=0A         {=0A    =
         /* Translate sub-call continuation to guest layout */=0A          =
   xlat_multicall_entry(mcs);=0A =0A             /* Copy the sub-call =
continuation. */=0A-            (void)__copy_to_guest(call_list, &mcs->call=
, 1);=0A-            goto preempted;=0A+            if ( likely(!__copy_to_=
guest(call_list, &mcs->call, 1)) )=0A+                goto preempted;=0A+  =
          rc =3D -EFAULT;=0A         }=0A-=0A-        guest_handle_add_offs=
et(call_list, 1);=0A+        else=0A+            guest_handle_add_offset(ca=
ll_list, 1);=0A     }=0A =0A     perfc_incr(calls_to_multicall);=0A-    =
perfc_add(calls_from_multicall, nr_calls);=0A-    mcs->flags =3D 0;=0A-    =
return 0;=0A-=0A- fault:=0A-    perfc_incr(calls_to_multicall);=0A+    =
perfc_add(calls_from_multicall, i);=0A     mcs->flags =3D 0;=0A-    return =
-EFAULT;=0A+    return rc;=0A =0A  preempted:=0A     perfc_add(calls_from_m=
ulticall, i);=0A
--=__Part91BE6F0E.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part91BE6F0E.0__=--


From xen-devel-bounces@lists.xensource.com Fri Nov 11 03:25:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 03:25:45 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROpEv-0004XT-BP; Fri, 11 Nov 2011 03:25:45 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROpEA-0004Kg-Ev
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 03:24:58 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1321010695!4477500!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25101 invoked from network); 11 Nov 2011 11:24:55 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-2.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 11:24:55 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 11:24:56 +0000
Message-Id: <4EBD1416020000780006068B@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 11:24:54 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Subject: [Xen-devel] [PATCH 0/9] decompressor bug fixes and cleanups
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a collection of patches pulled over from Linux.

1: Decompressors: get rid of set_error_fn() macro
2: bzip2: Add missing checks for malloc returning NULL
3: Decompressors: remove unused function from unlzma.c
4: Decompressors: fix header validation in unlzma.c
5: Decompressors: check for read errors in unlzma.c
6: Decompressors: check for write errors in unlzma.c
7: Decompressors: validate match distance in unlzma.c
8: Decompressors: check for write errors in unlzo.c
9: Decompressors: check input size in unlzo.c

Signed-off-by: Jan Beulich <jbeulich@suse.com>


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 03:27:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 03:27:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROpGa-0004vz-80; Fri, 11 Nov 2011 03:27:28 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROpFe-0004ic-Kk
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 03:26:31 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1321010787!3116159!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5451 invoked from network); 11 Nov 2011 11:26:27 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-3.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 11:26:27 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 11:26:28 +0000
Message-Id: <4EBD1472020000780006068F@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 11:26:26 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__PartEFC01172.0__="
Cc: lasse.collin@tukaani.org
Subject: [Xen-devel] [PATCH 1/9] Decompressors: get rid of set_error_fn()
	macro
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__PartEFC01172.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

From: Lasse Collin <lasse.collin@tukaani.org>

set_error_fn() is a useless complication. Only unlzma.c had some use
for it and that was easy to change too.

This also gets rid of the static function pointer "error".

Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/common/decompress.h
+++ b/xen/common/decompress.h
@@ -10,9 +10,6 @@
 #define INIT __init
 #define INITDATA __initdata
=20
-static void(*__initdata error)(const char *);
-#define set_error_fn(x) error =3D x;
-
 #define malloc xmalloc_bytes
 #define free xfree
=20
--- a/xen/common/bunzip2.c
+++ b/xen/common/bunzip2.c
@@ -666,13 +666,12 @@ STATIC int INIT bunzip2(unsigned char *b
 			int(*flush)(void*, unsigned int),
 			unsigned char *outbuf,
 			unsigned int *pos,
-			void(*error_fn)(const char *x))
+			void(*error)(const char *x))
 {
 	struct bunzip_data *bd;
 	int i =3D -1;
 	unsigned char *inbuf;
=20
-	set_error_fn(error_fn);
 	if (flush)
 		outbuf =3D malloc(BZIP2_IOBUF_SIZE);
=20
--- a/xen/common/unlzma.c
+++ b/xen/common/unlzma.c
@@ -67,6 +67,7 @@ struct rc {
 	uint32_t code;
 	uint32_t range;
 	uint32_t bound;
+	void (*error)(const char *);
 };
=20
=20
@@ -85,7 +86,7 @@ static void INIT rc_read(struct rc *rc)
 {
 	rc->buffer_size =3D rc->fill((char *)rc->buffer, LZMA_IOBUF_SIZE);
 	if (rc->buffer_size <=3D 0)
-		error("unexpected EOF");
+		rc->error("unexpected EOF");
 	rc->ptr =3D rc->buffer;
 	rc->buffer_end =3D rc->buffer + rc->buffer_size;
 }
@@ -529,7 +530,7 @@ STATIC int INIT unlzma(unsigned char *bu
 		       int(*flush)(void*, unsigned int),
 		       unsigned char *output,
 		       unsigned int *posp,
-		       void(*error_fn)(const char *x)
+		       void(*error)(const char *x)
 	)
 {
 	struct lzma_header header;
@@ -545,7 +546,7 @@ STATIC int INIT unlzma(unsigned char *bu
 	unsigned char *inbuf;
 	int ret =3D -1;
=20
-	set_error_fn(error_fn);
+	rc.error =3D error;
=20
 	if (buf)
 		inbuf =3D buf;
--- a/xen/common/unlzo.c
+++ b/xen/common/unlzo.c
@@ -105,7 +105,7 @@ STATIC int INIT unlzo(u8 *input, unsigne
 		      int (*fill) (void *, unsigned int),
 		      int (*flush) (void *, unsigned int),
 		      u8 *output, unsigned int *posp,
-		      void (*error_fn) (const char *x))
+		      void (*error) (const char *x))
 {
 	u8 skip =3D 0, r =3D 0;
 	u32 src_len, dst_len;
@@ -113,8 +113,6 @@ STATIC int INIT unlzo(u8 *input, unsigne
 	u8 *in_buf, *in_buf_save, *out_buf;
 	int ret =3D -1;
=20
-	set_error_fn(error_fn);
-
 	if (output) {
 		out_buf =3D output;
 	} else if (!flush) {
--- a/xen/common/unxz.c
+++ b/xen/common/unxz.c
@@ -161,15 +161,13 @@ STATIC int INIT unxz(unsigned char *in,=20
 		     int (*fill)(void *dest, unsigned int size),
 		     int (*flush)(void *src, unsigned int size),
 		     unsigned char *out, unsigned int *in_used,
-		     void (*error_fn)(const char *x))
+		     void (*error)(const char *x))
 {
 	struct xz_buf b;
 	struct xz_dec *s;
 	enum xz_ret ret;
 	bool_t must_free_in =3D false;
=20
-	set_error_fn(error_fn);
-
 	xz_crc32_init();
=20
 	if (in_used !=3D NULL)




--=__PartEFC01172.0__=
Content-Type: text/plain; name="decompress-no-error-fn.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="decompress-no-error-fn.patch"

Decompressors: get rid of set_error_fn() macro=0A=0AFrom: Lasse Collin =
<lasse.collin@tukaani.org>=0A=0Aset_error_fn() is a useless complication. =
Only unlzma.c had some use=0Afor it and that was easy to change too.=0A=0AT=
his also gets rid of the static function pointer "error".=0A=0ASigned-off-b=
y: Lasse Collin <lasse.collin@tukaani.org>=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- a/xen/common/decompress.h=0A+++ b/xen/common/d=
ecompress.h=0A@@ -10,9 +10,6 @@=0A #define INIT __init=0A #define INITDATA =
__initdata=0A =0A-static void(*__initdata error)(const char *);=0A-#define =
set_error_fn(x) error =3D x;=0A-=0A #define malloc xmalloc_bytes=0A =
#define free xfree=0A =0A--- a/xen/common/bunzip2.c=0A+++ b/xen/common/bunz=
ip2.c=0A@@ -666,13 +666,12 @@ STATIC int INIT bunzip2(unsigned char *b=0A 	=
		int(*flush)(void*, unsigned int),=0A 			=
unsigned char *outbuf,=0A 			unsigned int *pos,=0A-		=
	void(*error_fn)(const char *x))=0A+			void(*error=
)(const char *x))=0A {=0A 	struct bunzip_data *bd;=0A 	int i =3D =
-1;=0A 	unsigned char *inbuf;=0A =0A-	set_error_fn(error_fn);=0A 	if =
(flush)=0A 		outbuf =3D malloc(BZIP2_IOBUF_SIZE);=0A =0A--- =
a/xen/common/unlzma.c=0A+++ b/xen/common/unlzma.c=0A@@ -67,6 +67,7 @@ =
struct rc {=0A 	uint32_t code;=0A 	uint32_t range;=0A 	uint32_t =
bound;=0A+	void (*error)(const char *);=0A };=0A =0A =0A@@ -85,7 =
+86,7 @@ static void INIT rc_read(struct rc *rc)=0A {=0A 	rc->buffer_=
size =3D rc->fill((char *)rc->buffer, LZMA_IOBUF_SIZE);=0A 	if =
(rc->buffer_size <=3D 0)=0A-		error("unexpected EOF");=0A+		=
rc->error("unexpected EOF");=0A 	rc->ptr =3D rc->buffer;=0A 	=
rc->buffer_end =3D rc->buffer + rc->buffer_size;=0A }=0A@@ -529,7 +530,7 =
@@ STATIC int INIT unlzma(unsigned char *bu=0A 		       int(*flush)(=
void*, unsigned int),=0A 		       unsigned char *output,=0A 	=
	       unsigned int *posp,=0A-		       void(*error_fn)(cons=
t char *x)=0A+		       void(*error)(const char *x)=0A 	)=0A {=0A 	=
struct lzma_header header;=0A@@ -545,7 +546,7 @@ STATIC int INIT unlzma(uns=
igned char *bu=0A 	unsigned char *inbuf;=0A 	int ret =3D -1;=0A =
=0A-	set_error_fn(error_fn);=0A+	rc.error =3D error;=0A =0A 	if =
(buf)=0A 		inbuf =3D buf;=0A--- a/xen/common/unlzo.c=0A+++ =
b/xen/common/unlzo.c=0A@@ -105,7 +105,7 @@ STATIC int INIT unlzo(u8 =
*input, unsigne=0A 		      int (*fill) (void *, unsigned =
int),=0A 		      int (*flush) (void *, unsigned int),=0A 		=
      u8 *output, unsigned int *posp,=0A-		      void =
(*error_fn) (const char *x))=0A+		      void (*error) (const =
char *x))=0A {=0A 	u8 skip =3D 0, r =3D 0;=0A 	u32 src_len, =
dst_len;=0A@@ -113,8 +113,6 @@ STATIC int INIT unlzo(u8 *input, unsigne=0A =
	u8 *in_buf, *in_buf_save, *out_buf;=0A 	int ret =3D -1;=0A =0A-	=
set_error_fn(error_fn);=0A-=0A 	if (output) {=0A 		out_buf =
=3D output;=0A 	} else if (!flush) {=0A--- a/xen/common/unxz.c=0A+++ =
b/xen/common/unxz.c=0A@@ -161,15 +161,13 @@ STATIC int INIT unxz(unsigned =
char *in, =0A 		     int (*fill)(void *dest, unsigned int =
size),=0A 		     int (*flush)(void *src, unsigned int =
size),=0A 		     unsigned char *out, unsigned int *in_used,=0A-=
		     void (*error_fn)(const char *x))=0A+		   =
  void (*error)(const char *x))=0A {=0A 	struct xz_buf b;=0A 	=
struct xz_dec *s;=0A 	enum xz_ret ret;=0A 	bool_t must_free_in =3D =
false;=0A =0A-	set_error_fn(error_fn);=0A-=0A 	xz_crc32_init();=0A =0A 	=
if (in_used !=3D NULL)=0A
--=__PartEFC01172.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__PartEFC01172.0__=--


From xen-devel-bounces@lists.xensource.com Fri Nov 11 03:28:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 03:28:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROpHS-0005J6-Uz; Fri, 11 Nov 2011 03:28:23 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROpGh-0004yr-TE
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 03:27:36 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1321010852!3051352!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22564 invoked from network); 11 Nov 2011 11:27:32 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-10.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 11:27:32 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 11:27:33 +0000
Message-Id: <4EBD14B2020000780006069A@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 11:27:30 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: phillip@lougher.demon.co.uk
Subject: [Xen-devel] [PATCH 2/9] bzip2: Add missing checks for malloc
	returning NULL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Phillip Lougher <phillip@lougher.demon.co.uk>

Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/common/bunzip2.c
+++ b/xen/common/bunzip2.c
@@ -629,6 +629,8 @@ static int INIT start_bunzip(struct bunz
=20
 	/* Allocate bunzip_data.  Most fields initialize to zero. */
 	bd =3D *bdp =3D malloc(i);
+	if (!bd)
+		return RETVAL_OUT_OF_MEMORY;
 	memset(bd, 0, sizeof(struct bunzip_data));
 	/* Setup input buffer */
 	bd->inbuf =3D inbuf;
@@ -656,6 +658,8 @@ static int INIT start_bunzip(struct bunz
 	bd->dbufSize =3D 100000*(i-BZh0);
=20
 	bd->dbuf =3D large_malloc(bd->dbufSize * sizeof(int));
+	if (!bd->dbuf)
+		return RETVAL_OUT_OF_MEMORY;
 	return RETVAL_OK;
 }
=20
@@ -677,7 +681,7 @@ STATIC int INIT bunzip2(unsigned char *b
=20
 	if (!outbuf) {
 		error("Could not allocate output bufer");
-		return -1;
+		return RETVAL_OUT_OF_MEMORY;
 	}
 	if (buf)
 		inbuf =3D buf;
@@ -685,6 +689,7 @@ STATIC int INIT bunzip2(unsigned char *b
 		inbuf =3D malloc(BZIP2_IOBUF_SIZE);
 	if (!inbuf) {
 		error("Could not allocate input bufer");
+		i =3D RETVAL_OUT_OF_MEMORY;
 		goto exit_0;
 	}
 	i =3D start_bunzip(&bd, inbuf, len, fill);
@@ -711,11 +716,14 @@ STATIC int INIT bunzip2(unsigned char *b
 	} else if (i =3D=3D RETVAL_UNEXPECTED_OUTPUT_EOF) {
 		error("Compressed file ends unexpectedly");
 	}
+	if (!bd)
+		goto exit_1;
 	if (bd->dbuf)
 		large_free(bd->dbuf);
 	if (pos)
 		*pos =3D bd->inbufPos;
 	free(bd);
+exit_1:
 	if (!buf)
 		free(inbuf);
 exit_0:




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 03:29:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 03:29:26 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROpIU-0005h3-2B; Fri, 11 Nov 2011 03:29:26 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROpHS-0005IB-TS
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 03:28:23 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1321010899!2723740!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11469 invoked from network); 11 Nov 2011 11:28:19 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-4.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 11:28:19 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 11:28:20 +0000
Message-Id: <4EBD14E1020000780006069E@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 11:28:17 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part5C73A2C1.0__="
Cc: lasse.collin@tukaani.org
Subject: [Xen-devel] [PATCH 3/9] Decompressors: remove unused function from
	unlzma.c
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part5C73A2C1.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

From: Lasse Collin <lasse.collin@tukaani.org>

Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/common/unlzma.c
+++ b/xen/common/unlzma.c
@@ -121,12 +121,6 @@ static inline void INIT rc_init_code(str
 }
=20
=20
-/* Called once. TODO: bb_maybe_free() */
-static inline void INIT rc_free(struct rc *rc)
-{
-	free(rc->buffer);
-}
-
 /* Called twice, but one callsite is in inline'd rc_is_bit_0_helper() */
 static void INIT rc_do_normalize(struct rc *rc)
 {




--=__Part5C73A2C1.0__=
Content-Type: text/plain; name="unlzma-dead-function.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="unlzma-dead-function.patch"

Decompressors: remove unused function from unlzma.c=0A=0AFrom: Lasse =
Collin <lasse.collin@tukaani.org>=0A=0ASigned-off-by: Lasse Collin =
<lasse.collin@tukaani.org>=0ASigned-off-by: Jan Beulich <jbeulich@suse.com>=
=0A=0A--- a/xen/common/unlzma.c=0A+++ b/xen/common/unlzma.c=0A@@ -121,12 =
+121,6 @@ static inline void INIT rc_init_code(str=0A }=0A =0A =0A-/* =
Called once. TODO: bb_maybe_free() */=0A-static inline void INIT rc_free(st=
ruct rc *rc)=0A-{=0A-	free(rc->buffer);=0A-}=0A-=0A /* Called twice, but =
one callsite is in inline'd rc_is_bit_0_helper() */=0A static void INIT =
rc_do_normalize(struct rc *rc)=0A {=0A
--=__Part5C73A2C1.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part5C73A2C1.0__=--


From xen-devel-bounces@lists.xensource.com Fri Nov 11 03:30:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 03:30:32 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROpJY-00064R-QU; Fri, 11 Nov 2011 03:30:32 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROpI1-0005U4-UR
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 03:28:58 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1321010934!2722542!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2776 invoked from network); 11 Nov 2011 11:28:54 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-11.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 11:28:54 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 11:28:55 +0000
Message-Id: <4EBD150602000078000606A2@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 11:28:54 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part7B5485E6.0__="
Cc: lasse.collin@tukaani.org
Subject: [Xen-devel] [PATCH 4/9] Decompressors: fix header validation in
	unlzma.c
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part7B5485E6.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

From: Lasse Collin <lasse.collin@tukaani.org>

Validation of header.pos calls error() but doesn't make the function
return to indicate an error to the caller.  Instead the decoding is
attempted with invalid header.pos.  This fixes it.

Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/common/unlzma.c
+++ b/xen/common/unlzma.c
@@ -568,8 +568,10 @@ STATIC int INIT unlzma(unsigned char *bu
 		((unsigned char *)&header)[i] =3D *rc.ptr++;
 	}
=20
-	if (header.pos >=3D (9 * 5 * 5))
+	if (header.pos >=3D (9 * 5 * 5)) {
 		error("bad header");
+		goto exit_1;
+	}
=20
 	mi =3D 0;
 	lc =3D header.pos;




--=__Part7B5485E6.0__=
Content-Type: text/plain; name="unlzma-header-validation.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="unlzma-header-validation.patch"

Decompressors: fix header validation in unlzma.c=0A=0AFrom: Lasse Collin =
<lasse.collin@tukaani.org>=0A=0AValidation of header.pos calls error() but =
doesn't make the function=0Areturn to indicate an error to the caller.  =
Instead the decoding is=0Aattempted with invalid header.pos.  This fixes =
it.=0A=0ASigned-off-by: Lasse Collin <lasse.collin@tukaani.org>=0ASigned-of=
f-by: Jan Beulich <jbeulich@suse.com>=0A=0A--- a/xen/common/unlzma.c=0A+++ =
b/xen/common/unlzma.c=0A@@ -568,8 +568,10 @@ STATIC int INIT unlzma(unsigne=
d char *bu=0A 		((unsigned char *)&header)[i] =3D *rc.ptr++;=0A 	=
}=0A =0A-	if (header.pos >=3D (9 * 5 * 5))=0A+	if (header.pos =
>=3D (9 * 5 * 5)) {=0A 		error("bad header");=0A+		=
goto exit_1;=0A+	}=0A =0A 	mi =3D 0;=0A 	lc =3D header.pos;=
=0A
--=__Part7B5485E6.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part7B5485E6.0__=--


From xen-devel-bounces@lists.xensource.com Fri Nov 11 03:31:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 03:31:35 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROpKZ-0006SO-4e; Fri, 11 Nov 2011 03:31:35 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROpIj-0005mY-9w
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 03:29:41 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1321010977!2718206!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8247 invoked from network); 11 Nov 2011 11:29:38 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-14.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 11:29:38 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 11:29:38 +0000
Message-Id: <4EBD152F02000078000606A6@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 11:29:35 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part93BC6D0F.0__="
Cc: lasse.collin@tukaani.org
Subject: [Xen-devel] [PATCH 5/9] Decompressors: check for read errors in
	unlzma.c
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part93BC6D0F.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

From: Lasse Collin <lasse.collin@tukaani.org>

Return value of rc->fill() is checked in rc_read() and error() is called
when needed, but then the code continues as if nothing had happened.

rc_read() is a void function and it's on the top of performance critical
call stacks, so propagating the error code via return values doesn't sound
like the best fix.  It seems better to check rc->buffer_size (which holds
the return value of rc->fill()) in the main loop.  It does nothing bad
that the code runs a little with unknown data after a failed rc->fill().

This fixes an infinite loop in initramfs decompression if the
LZMA-compressed initramfs image is corrupt.

Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/common/unlzma.c
+++ b/xen/common/unlzma.c
@@ -625,6 +625,8 @@ STATIC int INIT unlzma(unsigned char *bu
 			if (cst.rep0 =3D=3D 0)
 				break;
 		}
+		if (rc.buffer_size <=3D 0)
+			goto exit_3;
 	}
=20
 	if (posp)
@@ -632,6 +634,7 @@ STATIC int INIT unlzma(unsigned char *bu
 	if (wr.flush)
 		wr.flush(wr.buffer, wr.buffer_pos);
 	ret =3D 0;
+exit_3:
 	large_free(p);
 exit_2:
 	if (!output)




--=__Part93BC6D0F.0__=
Content-Type: text/plain; name="unlzma-check-read-errors.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="unlzma-check-read-errors.patch"

Decompressors: check for read errors in unlzma.c=0A=0AFrom: Lasse Collin =
<lasse.collin@tukaani.org>=0A=0AReturn value of rc->fill() is checked in =
rc_read() and error() is called=0Awhen needed, but then the code continues =
as if nothing had happened.=0A=0Arc_read() is a void function and it's on =
the top of performance critical=0Acall stacks, so propagating the error =
code via return values doesn't sound=0Alike the best fix.  It seems better =
to check rc->buffer_size (which holds=0Athe return value of rc->fill()) in =
the main loop.  It does nothing bad=0Athat the code runs a little with =
unknown data after a failed rc->fill().=0A=0AThis fixes an infinite loop =
in initramfs decompression if the=0ALZMA-compressed initramfs image is =
corrupt.=0A=0ASigned-off-by: Lasse Collin <lasse.collin@tukaani.org>=0ASign=
ed-off-by: Jan Beulich <jbeulich@suse.com>=0A=0A--- a/xen/common/unlzma.c=
=0A+++ b/xen/common/unlzma.c=0A@@ -625,6 +625,8 @@ STATIC int INIT =
unlzma(unsigned char *bu=0A 			if (cst.rep0 =3D=3D 0)=0A 	=
			break;=0A 		}=0A+		if =
(rc.buffer_size <=3D 0)=0A+			goto exit_3;=0A 	=
}=0A =0A 	if (posp)=0A@@ -632,6 +634,7 @@ STATIC int INIT unlzma(unsi=
gned char *bu=0A 	if (wr.flush)=0A 		wr.flush(wr.buffer,=
 wr.buffer_pos);=0A 	ret =3D 0;=0A+exit_3:=0A 	large_free(p);=0A =
exit_2:=0A 	if (!output)=0A
--=__Part93BC6D0F.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part93BC6D0F.0__=--


From xen-devel-bounces@lists.xensource.com Fri Nov 11 03:32:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 03:32:41 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROpLd-0006qM-Pu; Fri, 11 Nov 2011 03:32:41 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROpJR-00060f-PA
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 03:30:27 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1321011022!2741524!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15084 invoked from network); 11 Nov 2011 11:30:22 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-5.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 11:30:22 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 11:30:23 +0000
Message-Id: <4EBD155802000078000606AA@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 11:30:16 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__PartC4EB3A58.0__="
Cc: lasse.collin@tukaani.org
Subject: [Xen-devel] [PATCH 6/9] Decompressors: check for write errors in
	unlzma.c
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__PartC4EB3A58.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

From: Lasse Collin <lasse.collin@tukaani.org>

The return value of wr->flush() is not checked in write_byte().  This
means that the decompressor won't stop even if the caller doesn't want
more data.  This can happen e.g.  with corrupt LZMA-compressed initramfs.
Returning the error quickly allows the user to see the error message
quicker.

There is a similar missing check for wr.flush() near the end of unlzma().

Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/common/unlzma.c
+++ b/xen/common/unlzma.c
@@ -307,32 +307,38 @@ static inline uint8_t INIT peek_old_byte
=20
 }
=20
-static inline void INIT write_byte(struct writer *wr, uint8_t byte)
+static inline int INIT write_byte(struct writer *wr, uint8_t byte)
 {
 	wr->buffer[wr->buffer_pos++] =3D wr->previous_byte =3D byte;
 	if (wr->flush && wr->buffer_pos =3D=3D wr->header->dict_size) {
 		wr->buffer_pos =3D 0;
 		wr->global_pos +=3D wr->header->dict_size;
-		wr->flush((char *)wr->buffer, wr->header->dict_size);
+		if (wr->flush((char *)wr->buffer, wr->header->dict_size)
+				!=3D wr->header->dict_size)
+			return -1;
 	}
+	return 0;
 }
=20
=20
-static inline void INIT copy_byte(struct writer *wr, uint32_t offs)
+static inline int INIT copy_byte(struct writer *wr, uint32_t offs)
 {
-	write_byte(wr, peek_old_byte(wr, offs));
+	return write_byte(wr, peek_old_byte(wr, offs));
 }
=20
-static inline void INIT copy_bytes(struct writer *wr,
+static inline int INIT copy_bytes(struct writer *wr,
 					 uint32_t rep0, int len)
 {
 	do {
-		copy_byte(wr, rep0);
+		if (copy_byte(wr, rep0))
+			return -1;
 		len--;
 	} while (len !=3D 0 && wr->buffer_pos < wr->header->dst_size);
+
+	return len;
 }
=20
-static inline void INIT process_bit0(struct writer *wr, struct rc *rc,
+static inline int INIT process_bit0(struct writer *wr, struct rc *rc,
 				     struct cstate *cst, uint16_t *p,
 				     int pos_state, uint16_t *prob,
 				     int lc, uint32_t literal_pos_mask) {
@@ -366,16 +372,17 @@ static inline void INIT process_bit0(str
 		uint16_t *prob_lit =3D prob + mi;
 		rc_get_bit(rc, prob_lit, &mi);
 	}
-	write_byte(wr, mi);
 	if (cst->state < 4)
 		cst->state =3D 0;
 	else if (cst->state < 10)
 		cst->state -=3D 3;
 	else
 		cst->state -=3D 6;
+
+	return write_byte(wr, mi);
 }
=20
-static inline void INIT process_bit1(struct writer *wr, struct rc *rc,
+static inline int INIT process_bit1(struct writer *wr, struct rc *rc,
 					    struct cstate *cst, uint16_t =
*p,
 					    int pos_state, uint16_t *prob) =
{
   int offset;
@@ -406,8 +413,7 @@ static inline void INIT process_bit1(str
=20
 				cst->state =3D cst->state < LZMA_NUM_LIT_ST=
ATES ?
 					9 : 11;
-				copy_byte(wr, cst->rep0);
-				return;
+				return copy_byte(wr, cst->rep0);
 			} else {
 				rc_update_bit_1(rc, prob);
 			}
@@ -509,12 +515,12 @@ static inline void INIT process_bit1(str
 		} else
 			cst->rep0 =3D pos_slot;
 		if (++(cst->rep0) =3D=3D 0)
-			return;
+			return 0;
 	}
=20
 	len +=3D LZMA_MATCH_MIN_LEN;
=20
-	copy_bytes(wr, cst->rep0, len);
+	return copy_bytes(wr, cst->rep0, len);
 }
=20
=20
@@ -617,11 +623,17 @@ STATIC int INIT unlzma(unsigned char *bu
 		int pos_state =3D	get_pos(&wr) & pos_state_mask;
 		uint16_t *prob =3D p + LZMA_IS_MATCH +
 			(cst.state << LZMA_NUM_POS_BITS_MAX) + pos_state;
-		if (rc_is_bit_0(&rc, prob))
-			process_bit0(&wr, &rc, &cst, p, pos_state, prob,
-				     lc, literal_pos_mask);
-		else {
-			process_bit1(&wr, &rc, &cst, p, pos_state, prob);
+		if (rc_is_bit_0(&rc, prob)) {
+			if (process_bit0(&wr, &rc, &cst, p, pos_state, =
prob,
+					lc, literal_pos_mask)) {
+				error("LZMA data is corrupt");
+				goto exit_3;
+			}
+		} else {
+			if (process_bit1(&wr, &rc, &cst, p, pos_state, =
prob)) {
+				error("LZMA data is corrupt");
+				goto exit_3;
+			}
 			if (cst.rep0 =3D=3D 0)
 				break;
 		}
@@ -631,9 +643,8 @@ STATIC int INIT unlzma(unsigned char *bu
=20
 	if (posp)
 		*posp =3D rc.ptr-rc.buffer;
-	if (wr.flush)
-		wr.flush(wr.buffer, wr.buffer_pos);
-	ret =3D 0;
+	if (!wr.flush || wr.flush(wr.buffer, wr.buffer_pos) =3D=3D =
wr.buffer_pos)
+		ret =3D 0;
 exit_3:
 	large_free(p);
 exit_2:



--=__PartC4EB3A58.0__=
Content-Type: text/plain; name="unlzma-check-write-errors.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="unlzma-check-write-errors.patch"

Decompressors: check for write errors in unlzma.c=0A=0AFrom: Lasse Collin =
<lasse.collin@tukaani.org>=0A=0AThe return value of wr->flush() is not =
checked in write_byte().  This=0Ameans that the decompressor won't stop =
even if the caller doesn't want=0Amore data.  This can happen e.g.  with =
corrupt LZMA-compressed initramfs.=0AReturning the error quickly allows =
the user to see the error message=0Aquicker.=0A=0AThere is a similar =
missing check for wr.flush() near the end of unlzma().=0A=0ASigned-off-by: =
Lasse Collin <lasse.collin@tukaani.org>=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- a/xen/common/unlzma.c=0A+++ b/xen/common/unlzm=
a.c=0A@@ -307,32 +307,38 @@ static inline uint8_t INIT peek_old_byte=0A =
=0A }=0A =0A-static inline void INIT write_byte(struct writer *wr, uint8_t =
byte)=0A+static inline int INIT write_byte(struct writer *wr, uint8_t =
byte)=0A {=0A 	wr->buffer[wr->buffer_pos++] =3D wr->previous_byte =3D =
byte;=0A 	if (wr->flush && wr->buffer_pos =3D=3D wr->header->dict_siz=
e) {=0A 		wr->buffer_pos =3D 0;=0A 		wr->global_=
pos +=3D wr->header->dict_size;=0A-		wr->flush((char *)wr->buffe=
r, wr->header->dict_size);=0A+		if (wr->flush((char *)wr->buffer, =
wr->header->dict_size)=0A+				!=3D wr->header->di=
ct_size)=0A+			return -1;=0A 	}=0A+	return 0;=0A }=0A =
=0A =0A-static inline void INIT copy_byte(struct writer *wr, uint32_t =
offs)=0A+static inline int INIT copy_byte(struct writer *wr, uint32_t =
offs)=0A {=0A-	write_byte(wr, peek_old_byte(wr, offs));=0A+	return =
write_byte(wr, peek_old_byte(wr, offs));=0A }=0A =0A-static inline void =
INIT copy_bytes(struct writer *wr,=0A+static inline int INIT copy_bytes(str=
uct writer *wr,=0A 					 uint32_t rep0, =
int len)=0A {=0A 	do {=0A-		copy_byte(wr, rep0);=0A+	=
	if (copy_byte(wr, rep0))=0A+			return -1;=0A 		=
len--;=0A 	} while (len !=3D 0 && wr->buffer_pos < wr->header->dst_siz=
e);=0A+=0A+	return len;=0A }=0A =0A-static inline void INIT process_bit=
0(struct writer *wr, struct rc *rc,=0A+static inline int INIT process_bit0(=
struct writer *wr, struct rc *rc,=0A 				     =
struct cstate *cst, uint16_t *p,=0A 				     int =
pos_state, uint16_t *prob,=0A 				     int lc, =
uint32_t literal_pos_mask) {=0A@@ -366,16 +372,17 @@ static inline void =
INIT process_bit0(str=0A 		uint16_t *prob_lit =3D prob + =
mi;=0A 		rc_get_bit(rc, prob_lit, &mi);=0A 	}=0A-	write_byte(=
wr, mi);=0A 	if (cst->state < 4)=0A 		cst->state =3D 0;=0A 	=
else if (cst->state < 10)=0A 		cst->state -=3D 3;=0A 	else=0A 	=
	cst->state -=3D 6;=0A+=0A+	return write_byte(wr, mi);=0A }=0A =
=0A-static inline void INIT process_bit1(struct writer *wr, struct rc =
*rc,=0A+static inline int INIT process_bit1(struct writer *wr, struct rc =
*rc,=0A 					    struct cstate *cst, =
uint16_t *p,=0A 					    int pos_state, =
uint16_t *prob) {=0A   int offset;=0A@@ -406,8 +413,7 @@ static inline =
void INIT process_bit1(str=0A =0A 				cst->state =
=3D cst->state < LZMA_NUM_LIT_STATES ?=0A 					=
9 : 11;=0A-				copy_byte(wr, cst->rep0);=0A-		=
		return;=0A+				return copy_byte(wr=
, cst->rep0);=0A 			} else {=0A 				=
rc_update_bit_1(rc, prob);=0A 			}=0A@@ -509,12 +515,12 @@ =
static inline void INIT process_bit1(str=0A 		} else=0A 		=
	cst->rep0 =3D pos_slot;=0A 		if (++(cst->rep0) =3D=3D =
0)=0A-			return;=0A+			return 0;=0A 	=
}=0A =0A 	len +=3D LZMA_MATCH_MIN_LEN;=0A =0A-	copy_bytes(wr, =
cst->rep0, len);=0A+	return copy_bytes(wr, cst->rep0, len);=0A }=0A =0A =
=0A@@ -617,11 +623,17 @@ STATIC int INIT unlzma(unsigned char *bu=0A 		=
int pos_state =3D	get_pos(&wr) & pos_state_mask;=0A 		=
uint16_t *prob =3D p + LZMA_IS_MATCH +=0A 			(cst.state =
<< LZMA_NUM_POS_BITS_MAX) + pos_state;=0A-		if (rc_is_bit_0(&rc=
, prob))=0A-			process_bit0(&wr, &rc, &cst, p, pos_state, =
prob,=0A-				     lc, literal_pos_mask);=0A-		=
else {=0A-			process_bit1(&wr, &rc, &cst, p, pos_state, =
prob);=0A+		if (rc_is_bit_0(&rc, prob)) {=0A+			=
if (process_bit0(&wr, &rc, &cst, p, pos_state, prob,=0A+			=
		lc, literal_pos_mask)) {=0A+				=
error("LZMA data is corrupt");=0A+				goto =
exit_3;=0A+			}=0A+		} else {=0A+			=
if (process_bit1(&wr, &rc, &cst, p, pos_state, prob)) {=0A+			=
	error("LZMA data is corrupt");=0A+				=
goto exit_3;=0A+			}=0A 			if =
(cst.rep0 =3D=3D 0)=0A 				break;=0A 		=
}=0A@@ -631,9 +643,8 @@ STATIC int INIT unlzma(unsigned char *bu=0A =0A 	=
if (posp)=0A 		*posp =3D rc.ptr-rc.buffer;=0A-	if (wr.flush)=0A-	=
	wr.flush(wr.buffer, wr.buffer_pos);=0A-	ret =3D 0;=0A+	if =
(!wr.flush || wr.flush(wr.buffer, wr.buffer_pos) =3D=3D wr.buffer_pos)=0A+	=
	ret =3D 0;=0A exit_3:=0A 	large_free(p);=0A exit_2:=0A
--=__PartC4EB3A58.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__PartC4EB3A58.0__=--


From xen-devel-bounces@lists.xensource.com Fri Nov 11 03:34:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 03:34:00 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROpMu-0007Jm-3M; Fri, 11 Nov 2011 03:34:00 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROpK2-0006Fv-Py
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 03:31:04 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1321011059!2733758!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12264 invoked from network); 11 Nov 2011 11:30:59 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-8.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 11:30:59 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 11:31:00 +0000
Message-Id: <4EBD158202000078000606AE@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 11:30:58 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__PartFED10062.0__="
Cc: lasse.collin@tukaani.org
Subject: [Xen-devel] [PATCH 7/9] Decompressors: validate match distance in
	unlzma.c
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__PartFED10062.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

From: Lasse Collin <lasse.collin@tukaani.org>

Validate the newly decoded distance (rep0) in process_bit1().  This is to
detect corrupt LZMA data quickly.  The old code can run for long time
producing garbage until it hits the end of the input.

Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/common/unlzma.c
+++ b/xen/common/unlzma.c
@@ -516,6 +516,9 @@ static inline int INIT process_bit1(stru
 			cst->rep0 =3D pos_slot;
 		if (++(cst->rep0) =3D=3D 0)
 			return 0;
+		if (cst->rep0 > wr->header->dict_size
+				|| cst->rep0 > get_pos(wr))
+			return -1;
 	}
=20
 	len +=3D LZMA_MATCH_MIN_LEN;




--=__PartFED10062.0__=
Content-Type: text/plain; name="unlzma-validate-match-distance.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="unlzma-validate-match-distance.patch"

Decompressors: validate match distance in unlzma.c=0A=0AFrom: Lasse Collin =
<lasse.collin@tukaani.org>=0A=0AValidate the newly decoded distance (rep0) =
in process_bit1().  This is to=0Adetect corrupt LZMA data quickly.  The =
old code can run for long time=0Aproducing garbage until it hits the end =
of the input.=0A=0ASigned-off-by: Lasse Collin <lasse.collin@tukaani.org>=
=0ASigned-off-by: Jan Beulich <jbeulich@suse.com>=0A=0A--- a/xen/common/unl=
zma.c=0A+++ b/xen/common/unlzma.c=0A@@ -516,6 +516,9 @@ static inline int =
INIT process_bit1(stru=0A 			cst->rep0 =3D pos_slot;=0A =
		if (++(cst->rep0) =3D=3D 0)=0A 			return =
0;=0A+		if (cst->rep0 > wr->header->dict_size=0A+			=
	|| cst->rep0 > get_pos(wr))=0A+			return -1;=0A 	=
}=0A =0A 	len +=3D LZMA_MATCH_MIN_LEN;=0A
--=__PartFED10062.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__PartFED10062.0__=--


From xen-devel-bounces@lists.xensource.com Fri Nov 11 03:34:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 03:34:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROpNj-0007hE-5I; Fri, 11 Nov 2011 03:34:51 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROpKl-0006W1-WF
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 03:31:48 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1321011104!2732369!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20939 invoked from network); 11 Nov 2011 11:31:44 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-6.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 11:31:44 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 11:31:45 +0000
Message-Id: <4EBD15AE02000078000606B2@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 11:31:42 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part123DEC8E.0__="
Cc: lasse.collin@tukaani.org
Subject: [Xen-devel] [PATCH 8/9] Decompressors: check for write errors in
	unlzo.c
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part123DEC8E.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

From: Lasse Collin <lasse.collin@tukaani.org>

The return value of flush() is not checked in unlzo().  This means that
the decompressor won't stop even if the caller doesn't want more data.
This can happen e.g.  with a corrupt LZO-compressed initramfs image.

Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/common/unlzo.c
+++ b/xen/common/unlzo.c
@@ -202,8 +202,8 @@ STATIC int INIT unlzo(u8 *input, unsigne
 			}
 		}
=20
-		if (flush)
-			flush(out_buf, dst_len);
+		if (flush && flush(out_buf, dst_len) !=3D dst_len)
+			goto exit_2;
 		if (output)
 			out_buf +=3D dst_len;
 		if (posp)




--=__Part123DEC8E.0__=
Content-Type: text/plain; name="unlzo-check-write-errors.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="unlzo-check-write-errors.patch"

Decompressors: check for write errors in unlzo.c=0A=0AFrom: Lasse Collin =
<lasse.collin@tukaani.org>=0A=0AThe return value of flush() is not checked =
in unlzo().  This means that=0Athe decompressor won't stop even if the =
caller doesn't want more data.=0AThis can happen e.g.  with a corrupt =
LZO-compressed initramfs image.=0A=0ASigned-off-by: Lasse Collin <lasse.col=
lin@tukaani.org>=0ASigned-off-by: Jan Beulich <jbeulich@suse.com>=0A=0A--- =
a/xen/common/unlzo.c=0A+++ b/xen/common/unlzo.c=0A@@ -202,8 +202,8 @@ =
STATIC int INIT unlzo(u8 *input, unsigne=0A 			}=0A 		=
}=0A =0A-		if (flush)=0A-			flush(out_buf, =
dst_len);=0A+		if (flush && flush(out_buf, dst_len) !=3D =
dst_len)=0A+			goto exit_2;=0A 		if =
(output)=0A 			out_buf +=3D dst_len;=0A 		if =
(posp)=0A
--=__Part123DEC8E.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part123DEC8E.0__=--


From xen-devel-bounces@lists.xensource.com Fri Nov 11 03:36:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 03:36:04 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROpOt-000871-7j; Fri, 11 Nov 2011 03:36:03 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROpLL-0006iK-El
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 03:32:23 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1321011139!2723166!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15513 invoked from network); 11 Nov 2011 11:32:20 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-11.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 11:32:20 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 11:32:21 +0000
Message-Id: <4EBD15D202000078000606E5@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 11:32:18 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part4E61B0D2.0__="
Cc: lasse.collin@tukaani.org
Subject: [Xen-devel] [PATCH 9/9] Decompressors: check input size in unlzo.c
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part4E61B0D2.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

From: Lasse Collin <lasse.collin@tukaani.org>

The code assumes that the input is valid and not truncated.  Add checks to
avoid reading past the end of the input buffer.  Change the type of "skip"
from u8 to int to fix a possible integer overflow.

Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/common/unlzo.c
+++ b/xen/common/unlzo.c
@@ -63,14 +63,25 @@ static const unsigned char lzop_magic[]=20
=20
 #define LZO_BLOCK_SIZE        (256*1024l)
 #define HEADER_HAS_FILTER      0x00000800L
+#define HEADER_SIZE_MIN       (9 + 7     + 4 + 8     + 1       + 4)
+#define HEADER_SIZE_MAX       (9 + 7 + 1 + 8 + 8 + 4 + 1 + 255 + 4)
=20
-static int INIT parse_header(u8 *input, u8 *skip)
+static int INIT parse_header(u8 *input, int *skip, int in_len)
 {
 	int l;
 	u8 *parse =3D input;
+	u8 *end =3D input + in_len;
 	u8 level =3D 0;
 	u16 version;
=20
+	/*
+	 * Check that there's enough input to possibly have a valid =
header.
+	 * Then it is possible to parse several fields until the minimum
+	 * size may have been used.
+	 */
+	if (in_len < HEADER_SIZE_MIN)
+		return 0;
+
 	/* read magic: 9 first bits */
 	for (l =3D 0; l < 9; l++) {
 		if (*parse++ !=3D lzop_magic[l])
@@ -88,6 +99,15 @@ static int INIT parse_header(u8 *input,=20
 	else
 		parse +=3D 4; /* flags */
=20
+	/*
+	 * At least mode, mtime_low, filename length, and checksum must
+	 * be left to be parsed. If also mtime_high is present, it's OK
+	 * because the next input buffer check is after reading the
+	 * filename length.
+	 */
+	if (end - parse < 8 + 1 + 4)
+		return 0;
+
 	/* skip mode and mtime_low */
 	parse +=3D 8;
 	if (version >=3D 0x0940)
@@ -95,6 +115,8 @@ static int INIT parse_header(u8 *input,=20
=20
 	l =3D *parse++;
 	/* don't care about the file name, and skip checksum */
+	if (end - parse < l + 4)
+		return 0;
 	parse +=3D l + 4;
=20
 	*skip =3D parse - input;
@@ -107,7 +129,8 @@ STATIC int INIT unlzo(u8 *input, unsigne
 		      u8 *output, unsigned int *posp,
 		      void (*error) (const char *x))
 {
-	u8 skip =3D 0, r =3D 0;
+	u8 r =3D 0;
+	int skip =3D 0;
 	u32 src_len, dst_len;
 	size_t tmp;
 	u8 *in_buf, *in_buf_save, *out_buf;
@@ -149,19 +172,25 @@ STATIC int INIT unlzo(u8 *input, unsigne
 	if (fill)
 		fill(in_buf, lzo1x_worst_compress(LZO_BLOCK_SIZE));
=20
-	if (!parse_header(input, &skip)) {
+	if (!parse_header(input, &skip, in_len)) {
 		error("invalid header");
 		goto exit_2;
 	}
 	in_buf +=3D skip;
+	in_len -=3D skip;
=20
 	if (posp)
 		*posp =3D skip;
=20
 	for (;;) {
 		/* read uncompressed block size */
+		if (in_len < 4) {
+			error("file corrupted");
+			goto exit_2;
+		}
 		dst_len =3D get_unaligned_be32(in_buf);
 		in_buf +=3D 4;
+		in_len -=3D 4;
=20
 		/* exit if last block */
 		if (dst_len =3D=3D 0) {
@@ -176,10 +205,15 @@ STATIC int INIT unlzo(u8 *input, unsigne
 		}
=20
 		/* read compressed block size, and skip block checksum =
info */
+		if (in_len < 8) {
+			error("file corrupted");
+			goto exit_2;
+		}
 		src_len =3D get_unaligned_be32(in_buf);
 		in_buf +=3D 8;
+		in_len -=3D 8;
=20
-		if (src_len <=3D 0 || src_len > dst_len) {
+		if (src_len <=3D 0 || src_len > dst_len || src_len > =
in_len) {
 			error("file corrupted");
 			goto exit_2;
 		}
@@ -211,8 +245,10 @@ STATIC int INIT unlzo(u8 *input, unsigne
 		if (fill) {
 			in_buf =3D in_buf_save;
 			fill(in_buf, lzo1x_worst_compress(LZO_BLOCK_SIZE));=

-		} else
+		} else {
 			in_buf +=3D src_len;
+			in_len -=3D src_len;
+		}
 	}
=20
 	ret =3D 0;




--=__Part4E61B0D2.0__=
Content-Type: text/plain; name="unlzo-check-input-size.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="unlzo-check-input-size.patch"

Decompressors: check input size in unlzo.c=0A=0AFrom: Lasse Collin =
<lasse.collin@tukaani.org>=0A=0AThe code assumes that the input is valid =
and not truncated.  Add checks to=0Aavoid reading past the end of the =
input buffer.  Change the type of "skip"=0Afrom u8 to int to fix a =
possible integer overflow.=0A=0ASigned-off-by: Lasse Collin <lasse.collin@t=
ukaani.org>=0ASigned-off-by: Jan Beulich <jbeulich@suse.com>=0A=0A--- =
a/xen/common/unlzo.c=0A+++ b/xen/common/unlzo.c=0A@@ -63,14 +63,25 @@ =
static const unsigned char lzop_magic[] =0A =0A #define LZO_BLOCK_SIZE     =
   (256*1024l)=0A #define HEADER_HAS_FILTER      0x00000800L=0A+#define =
HEADER_SIZE_MIN       (9 + 7     + 4 + 8     + 1       + 4)=0A+#define =
HEADER_SIZE_MAX       (9 + 7 + 1 + 8 + 8 + 4 + 1 + 255 + 4)=0A =0A-static =
int INIT parse_header(u8 *input, u8 *skip)=0A+static int INIT parse_header(=
u8 *input, int *skip, int in_len)=0A {=0A 	int l;=0A 	u8 *parse =
=3D input;=0A+	u8 *end =3D input + in_len;=0A 	u8 level =3D 0;=0A 	=
u16 version;=0A =0A+	/*=0A+	 * Check that there's enough input to =
possibly have a valid header.=0A+	 * Then it is possible to parse =
several fields until the minimum=0A+	 * size may have been used.=0A+	 =
*/=0A+	if (in_len < HEADER_SIZE_MIN)=0A+		return 0;=0A+=0A 	=
/* read magic: 9 first bits */=0A 	for (l =3D 0; l < 9; l++) {=0A 		=
if (*parse++ !=3D lzop_magic[l])=0A@@ -88,6 +99,15 @@ static int INIT =
parse_header(u8 *input, =0A 	else=0A 		parse +=3D 4; /* =
flags */=0A =0A+	/*=0A+	 * At least mode, mtime_low, filename =
length, and checksum must=0A+	 * be left to be parsed. If also mtime_high=
 is present, it's OK=0A+	 * because the next input buffer check is =
after reading the=0A+	 * filename length.=0A+	 */=0A+	if (end - parse < =
8 + 1 + 4)=0A+		return 0;=0A+=0A 	/* skip mode and mtime_low =
*/=0A 	parse +=3D 8;=0A 	if (version >=3D 0x0940)=0A@@ -95,6 +115,8 =
@@ static int INIT parse_header(u8 *input, =0A =0A 	l =3D *parse++;=0A =
	/* don't care about the file name, and skip checksum */=0A+	if =
(end - parse < l + 4)=0A+		return 0;=0A 	parse +=3D l + =
4;=0A =0A 	*skip =3D parse - input;=0A@@ -107,7 +129,8 @@ STATIC int =
INIT unlzo(u8 *input, unsigne=0A 		      u8 *output, unsigned =
int *posp,=0A 		      void (*error) (const char *x))=0A {=0A-	u8 =
skip =3D 0, r =3D 0;=0A+	u8 r =3D 0;=0A+	int skip =3D 0;=0A 	=
u32 src_len, dst_len;=0A 	size_t tmp;=0A 	u8 *in_buf, *in_buf_save, =
*out_buf;=0A@@ -149,19 +172,25 @@ STATIC int INIT unlzo(u8 *input, =
unsigne=0A 	if (fill)=0A 		fill(in_buf, lzo1x_worst_compress(L=
ZO_BLOCK_SIZE));=0A =0A-	if (!parse_header(input, &skip)) {=0A+	if =
(!parse_header(input, &skip, in_len)) {=0A 		error("invalid =
header");=0A 		goto exit_2;=0A 	}=0A 	in_buf +=3D =
skip;=0A+	in_len -=3D skip;=0A =0A 	if (posp)=0A 		=
*posp =3D skip;=0A =0A 	for (;;) {=0A 		/* read uncompressed block =
size */=0A+		if (in_len < 4) {=0A+			error("file=
 corrupted");=0A+			goto exit_2;=0A+		=
}=0A 		dst_len =3D get_unaligned_be32(in_buf);=0A 		=
in_buf +=3D 4;=0A+		in_len -=3D 4;=0A =0A 		/* exit if =
last block */=0A 		if (dst_len =3D=3D 0) {=0A@@ -176,10 =
+205,15 @@ STATIC int INIT unlzo(u8 *input, unsigne=0A 		}=0A =0A 	=
	/* read compressed block size, and skip block checksum info */=0A+	=
	if (in_len < 8) {=0A+			error("file corrupted");=0A=
+			goto exit_2;=0A+		}=0A 		=
src_len =3D get_unaligned_be32(in_buf);=0A 		in_buf +=3D 8;=0A+	=
	in_len -=3D 8;=0A =0A-		if (src_len <=3D 0 || src_len > =
dst_len) {=0A+		if (src_len <=3D 0 || src_len > dst_len || src_len =
> in_len) {=0A 			error("file corrupted");=0A 			=
goto exit_2;=0A 		}=0A@@ -211,8 +245,10 @@ STATIC int INIT =
unlzo(u8 *input, unsigne=0A 		if (fill) {=0A 			=
in_buf =3D in_buf_save;=0A 			fill(in_buf, lzo1x_worst_co=
mpress(LZO_BLOCK_SIZE));=0A-		} else=0A+		} else =
{=0A 			in_buf +=3D src_len;=0A+			=
in_len -=3D src_len;=0A+		}=0A 	}=0A =0A 	ret =3D =
0;=0A
--=__Part4E61B0D2.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part4E61B0D2.0__=--


From xen-devel-bounces@lists.xensource.com Fri Nov 11 05:07:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 05:07:01 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROqou-0004YU-S6; Fri, 11 Nov 2011 05:07:00 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROqo3-0004MI-H1
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 05:06:07 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1321016763!1166096!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27787 invoked from network); 11 Nov 2011 13:06:04 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 13:06:04 -0000
X-IronPort-AV: E=Sophos;i="4.69,494,1315180800"; 
   d="scan'208";a="8886005"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Nov 2011 13:06:03 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Fri, 11 Nov 2011 13:06:03 +0000
Subject: Re: [Xen-devel] [PATCH 3 of 7] docs: add a document describing the
	xl cfg file syntax
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Fri, 11 Nov 2011 13:06:02 +0000
In-Reply-To: <alpine.DEB.2.00.1111101210430.3519@kaball-desktop>
References: <patchbomb.1320678789@cosworth.uk.xensource.com>
	<291f6cb0d03e56e4edbe.1320678792@cosworth.uk.xensource.com>
	<alpine.DEB.2.00.1111101128020.3519@kaball-desktop>
	<1320925338.955.211.camel@zakaz.uk.xensource.com>
	<alpine.DEB.2.00.1111101143440.3519@kaball-desktop>
	<alpine.DEB.2.00.1111101210430.3519@kaball-desktop>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1321016762.955.252.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, Ian
	Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-11-10 at 12:23 +0000, Stefano Stabellini wrote:
> On Thu, 10 Nov 2011, Stefano Stabellini wrote:
> > On Thu, 10 Nov 2011, Ian Campbell wrote:
> > > > I think it would be very useful as a manpage.
> > > > If we really want to keep it in markdown rather than pod, we could still
> > > > find a way to convert it into a manpage (using ronn, pandoc, etc.).
> > > 
> > > If there is a good markdown->man converter I'm all for using it.
> > 
> > well, I am not sure if any of them are good, but a badly formatted
> > manpage is still better than no manpage at all
> 
> I take it back: manpages generated by pandoc are unreadble but ronn
> seems to work pretty well

Not widely available though :-(

I can reformat as pod but I'd like to hear from IanJ first since this is
based on his first draft which was in markdown.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 05:14:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 05:14:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROqvu-00051n-JP; Fri, 11 Nov 2011 05:14:14 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROqv8-0004p2-BG
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 05:13:26 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1321017202!2750724!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9538 invoked from network); 11 Nov 2011 13:13:22 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-9.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 13:13:22 -0000
Received: by eyb6 with SMTP id 6so4947291eyb.30
	for <xen-devel@lists.xensource.com>;
	Fri, 11 Nov 2011 05:13:22 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=user-agent:date:subject:from:to:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=M50GkyQU3wC/EirKa8J6NfEaAEACJ4gb8xvC/IdfAkA=;
	b=jW4RVinYGXCzjZdJZy9BXPizjdlbyBjkfGrI3Z7PaKxhO93mdHLVNc3e8QpA2uol8y
	CCpZCftVwEntL/kZxZ0TGbl1g8JxULRKe6Z3j67BIqYr49skUTNF8utaUaEyHCKRnaro
	EWjsNWNWk1Osof8aivInlS95X+yIJEdMIwmpo=
Received: by 10.180.90.6 with SMTP id bs6mr14084315wib.63.1321017201900;
	Fri, 11 Nov 2011 05:13:21 -0800 (PST)
Received: from [192.168.1.71]
	(host86-129-245-239.range86-129.btcentralplus.com. [86.129.245.239])
	by mx.google.com with ESMTPS id ca18sm6861456wib.13.2011.11.11.05.13.19
	(version=SSLv3 cipher=OTHER); Fri, 11 Nov 2011 05:13:21 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Fri, 11 Nov 2011 13:13:17 +0000
Subject: Re: [Xen-devel] [PATCH] x86: quiesce cpuidle code
From: Keir Fraser <keir.xen@gmail.com>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CAE2CFED.24859%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH] x86: quiesce cpuidle code
Thread-Index: Acygc6zwEl8sumpCLE+yCcws9462Ig==
In-Reply-To: <4EBD112F0200007800060664@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/11/2011 11:12, "Jan Beulich" <JBeulich@suse.com> wrote:

> So far these messages got pointlessly (as the code in other places
> assumes symmetric configuration) emitted once per CPU. Hide the debug
> one behind opt_cpu_info, and issue the info one just once (if the code
> gets adjusted to support assymtric configurations, this would need to
> be revisited, but ideally without producing per-CPU messages again).
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> --- a/xen/arch/x86/acpi/cpu_idle.c
> +++ b/xen/arch/x86/acpi/cpu_idle.c
> @@ -664,6 +664,8 @@ static int acpi_processor_ffh_cstate_pro
>      unsigned int edx_part;
>      unsigned int cstate_type; /* C-state type and not ACPI C-state type */
>      unsigned int num_cstate_subtype;
> +    int ret = 0;
> +    static unsigned long printed;
>  
>      if ( c->cpuid_level < CPUID_MWAIT_LEAF )
>      {
> @@ -672,8 +674,9 @@ static int acpi_processor_ffh_cstate_pro
>      }
>  
>      cpuid(CPUID_MWAIT_LEAF, &eax, &ebx, &ecx, &edx);
> -    printk(XENLOG_DEBUG "cpuid.MWAIT[.eax=%x, .ebx=%x, .ecx=%x, .edx=%x]\n",
> -           eax, ebx, ecx, edx);
> +    if ( opt_cpu_info )
> +        printk(XENLOG_DEBUG "cpuid.MWAIT[eax=%x ebx=%x ecx=%x edx=%x]\n",
> +               eax, ebx, ecx, edx);
>  
>      /* Check whether this particular cx_type (in CST) is supported or not */
>      cstate_type = (cx->reg.address >> MWAIT_SUBSTATE_SIZE) + 1;
> @@ -681,15 +684,16 @@ static int acpi_processor_ffh_cstate_pro
>      num_cstate_subtype = edx_part & MWAIT_SUBSTATE_MASK;
>  
>      if ( num_cstate_subtype < (cx->reg.address & MWAIT_SUBSTATE_MASK) )
> -        return -EFAULT;
> -
> +        ret = -ERANGE;
>      /* mwait ecx extensions INTERRUPT_BREAK should be supported for C2/C3 */
> -    if ( !(ecx & CPUID5_ECX_EXTENSIONS_SUPPORTED) ||
> -         !(ecx & CPUID5_ECX_INTERRUPT_BREAK) )
> -        return -EFAULT;
> -
> -    printk(XENLOG_INFO "Monitor-Mwait will be used to enter C-%d state\n",
> cx->type);
> -    return 0;
> +    else if ( !(ecx & CPUID5_ECX_EXTENSIONS_SUPPORTED) ||
> +              !(ecx & CPUID5_ECX_INTERRUPT_BREAK) )
> +        ret = -ENODEV;
> +    else if ( opt_cpu_info || cx->type >= BITS_PER_LONG ||
> +              !test_and_set_bit(cx->type, &printed) )
> +        printk(XENLOG_INFO "Monitor-Mwait will be used to enter C%d state\n",
> +               cx->type);
> +    return ret;
>  }
>  
>  /*
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 05:15:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 05:15:17 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROqwu-0005P1-W9; Fri, 11 Nov 2011 05:15:17 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROqvP-0004sC-GX
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 05:13:44 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1321017220!3788512!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15540 invoked from network); 11 Nov 2011 13:13:40 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 13:13:40 -0000
Received: by wwp14 with SMTP id 14so1716159wwp.24
	for <xen-devel@lists.xensource.com>;
	Fri, 11 Nov 2011 05:13:40 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=user-agent:date:subject:from:to:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=o5Rte4plN4kaH1FxpygRthkdb8sJehSMsbD90lNRFrc=;
	b=ZlbFsOfyffKRkYgfG50B+qaNeYGxiVMqb5iM2OAAdU/qx2zwciWCeYxWMN9LsJ/Ar9
	UT6xhzLO1FM1bvgZ2GyvS0KOA8ELAKW1bLjGay9RthFQzL+ODVCM8qToDYeLEwoodBdc
	Xz0zgAI8N+zC845VLjgYbp4XjAMylp4K+5G5w=
Received: by 10.216.132.157 with SMTP id o29mr2226968wei.47.1321017220072;
	Fri, 11 Nov 2011 05:13:40 -0800 (PST)
Received: from [192.168.1.71]
	(host86-129-245-239.range86-129.btcentralplus.com. [86.129.245.239])
	by mx.google.com with ESMTPS id x9sm13484239wbn.2.2011.11.11.05.13.36
	(version=SSLv3 cipher=OTHER); Fri, 11 Nov 2011 05:13:38 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Fri, 11 Nov 2011 13:13:34 +0000
Subject: Re: [Xen-devel] [PATCH] x86/amd-ucode: further turn down verbosity
From: Keir Fraser <keir.xen@gmail.com>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CAE2CFFE.2485A%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH] x86/amd-ucode: further turn down verbosity
Thread-Index: Acygc7cScKvPIeJPokGYS32eVEZ96Q==
In-Reply-To: <4EBD11920200007800060668@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/11/2011 11:14, "Jan Beulich" <JBeulich@suse.com> wrote:

> Turn up the log level on various (mostly debug-only) messages.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> --- a/xen/arch/x86/microcode_amd.c
> +++ b/xen/arch/x86/microcode_amd.c
> @@ -59,7 +59,7 @@ static int collect_cpu_info(int cpu, str
>  
>      rdmsrl(MSR_AMD_PATCHLEVEL, csig->rev);
>  
> -    printk(KERN_INFO "microcode: collect_cpu_info: patch_id=0x%x\n",
> +    printk(KERN_DEBUG "microcode: collect_cpu_info: patch_id=0x%x\n",
>             csig->rev);
>  
>      return 0;
> @@ -92,7 +92,7 @@ static int microcode_fits(void *mc, int
>  
>      if ( (mc_header->processor_rev_id) != equiv_cpu_id )
>      {
> -        printk(KERN_INFO "microcode: CPU%d patch does not match "
> +        printk(KERN_DEBUG "microcode: CPU%d patch does not match "
>                 "(patch is %x, cpu base id is %x) \n",
>                 cpu, mc_header->processor_rev_id, equiv_cpu_id);
>          return -EINVAL;
> @@ -101,7 +101,7 @@ static int microcode_fits(void *mc, int
>      if ( mc_header->patch_id <= uci->cpu_sig.rev )
>          return -EINVAL;
>  
> -    printk(KERN_INFO "microcode: CPU%d found a matching microcode "
> +    printk(KERN_DEBUG "microcode: CPU%d found a matching microcode "
>             "update with version 0x%x (current=0x%x)\n",
>             cpu, mc_header->patch_id, uci->cpu_sig.rev);
>  
> @@ -139,8 +139,7 @@ static int apply_microcode(int cpu)
>          return -EIO;
>      }
>  
> -    printk("microcode: CPU%d updated from revision "
> -           "0x%x to 0x%x \n",
> +    printk(KERN_INFO "microcode: CPU%d updated from revision %#x to %#x\n",
>             cpu, uci->cpu_sig.rev, mc_amd->hdr.patch_id);
>  
>      uci->cpu_sig.rev = rev;
> @@ -170,7 +169,7 @@ static int get_next_ucode_from_buffer_am
>  
>      total_size = (unsigned long) (bufp[off+4] + (bufp[off+5] << 8));
>  
> -    printk(KERN_INFO "microcode: size %lu, total_size %lu, offset %ld\n",
> +    printk(KERN_DEBUG "microcode: size %lu, total_size %lu, offset %ld\n",
>             (unsigned long)size, total_size, off);
>  
>      if ( (off + total_size) > size )
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 05:16:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 05:16:29 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROqy5-0005rn-EP; Fri, 11 Nov 2011 05:16:29 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROqvh-0004wQ-14
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 05:14:02 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1321017220!3788512!2
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16723 invoked from network); 11 Nov 2011 13:13:58 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 13:13:58 -0000
Received: by mail-ww0-f43.google.com with SMTP id 14so1716159wwp.24
	for <xen-devel@lists.xensource.com>;
	Fri, 11 Nov 2011 05:13:58 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=user-agent:date:subject:from:to:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=4q989XuWL9EpO32mKrXZqPY+eto6UtcCKe/3gIj1wxs=;
	b=WKpQ6IL8KyCtlewn0Cm07ihAAxJNvO0HpvQ+rTPyOW+u3LUY2Kd7C9eKC9o3J5aqbp
	FIs04idxvDbUvyqylr2gCO7HUJMFdnFKRhor4sZs57o5uMePUPq79c0d3oLRytG8BeWL
	DhRV21W5pOV5GsTR422sePp51icXK3m+ev7Qo=
Received: by 10.180.4.102 with SMTP id j6mr14082127wij.38.1321017237985;
	Fri, 11 Nov 2011 05:13:57 -0800 (PST)
Received: from [192.168.1.71]
	(host86-129-245-239.range86-129.btcentralplus.com. [86.129.245.239])
	by mx.google.com with ESMTPS id en7sm6870812wib.0.2011.11.11.05.13.54
	(version=SSLv3 cipher=OTHER); Fri, 11 Nov 2011 05:13:57 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Fri, 11 Nov 2011 13:13:51 +0000
Subject: Re: [Xen-devel] [PATCH] multicall: don't ignore failure from
	__copy_to_guest() upon preemption
From: Keir Fraser <keir.xen@gmail.com>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CAE2D00F.2485B%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH] multicall: don't ignore failure from
	__copy_to_guest() upon preemption
Thread-Index: Acygc8E0T/YJ2Cd6ukaElZ5+ZREOjQ==
In-Reply-To: <4EBD122E0200007800060675@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/11/2011 11:16, "Jan Beulich" <JBeulich@suse.com> wrote:

> At once adjust perf counter updates to also count calls from here even
> if a guest memory access failed.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> --- a/xen/common/multicall.c
> +++ b/xen/common/multicall.c
> @@ -25,6 +25,7 @@ do_multicall(
>  {
>      struct mc_state *mcs = &current->mc_state;
>      unsigned int     i;
> +    int              rc = 0;
>  
>      if ( unlikely(__test_and_set_bit(_MCSF_in_multicall, &mcs->flags)) )
>      {
> @@ -33,15 +34,18 @@ do_multicall(
>      }
>  
>      if ( unlikely(!guest_handle_okay(call_list, nr_calls)) )
> -        goto fault;
> +        rc = -EFAULT;
>  
> -    for ( i = 0; i < nr_calls; i++ )
> +    for ( i = 0; !rc && i < nr_calls; i++ )
>      {
>          if ( hypercall_preempt_check() )
>              goto preempted;
>  
>          if ( unlikely(__copy_from_guest(&mcs->call, call_list, 1)) )
> -            goto fault;
> +        {
> +            rc = -EFAULT;
> +            break;
> +        }
>  
>          do_multicall_call(&mcs->call);
>  
> @@ -58,30 +62,25 @@ do_multicall(
>  #endif
>  
>          if ( unlikely(__copy_field_to_guest(call_list, &mcs->call, result)) )
> -            goto fault;
> -
> -        if ( test_bit(_MCSF_call_preempted, &mcs->flags) )
> +            rc = -EFAULT;
> +        else if ( test_bit(_MCSF_call_preempted, &mcs->flags) )
>          {
>              /* Translate sub-call continuation to guest layout */
>              xlat_multicall_entry(mcs);
>  
>              /* Copy the sub-call continuation. */
> -            (void)__copy_to_guest(call_list, &mcs->call, 1);
> -            goto preempted;
> +            if ( likely(!__copy_to_guest(call_list, &mcs->call, 1)) )
> +                goto preempted;
> +            rc = -EFAULT;
>          }
> -
> -        guest_handle_add_offset(call_list, 1);
> +        else
> +            guest_handle_add_offset(call_list, 1);
>      }
>  
>      perfc_incr(calls_to_multicall);
> -    perfc_add(calls_from_multicall, nr_calls);
> -    mcs->flags = 0;
> -    return 0;
> -
> - fault:
> -    perfc_incr(calls_to_multicall);
> +    perfc_add(calls_from_multicall, i);
>      mcs->flags = 0;
> -    return -EFAULT;
> +    return rc;
>  
>   preempted:
>      perfc_add(calls_from_multicall, i);
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 05:17:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 05:17:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROqyx-0006Fk-ED; Fri, 11 Nov 2011 05:17:23 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROqvv-00051R-2K
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 05:14:15 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1321017225!52365752!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19183 invoked from network); 11 Nov 2011 13:13:46 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 13:13:46 -0000
Received: by wyh11 with SMTP id 11so4975215wyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 11 Nov 2011 05:14:11 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=user-agent:date:subject:from:to:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=WwxFF/SRIjG222nrSTyrGzRsSdjU7TFT1GS7xxrrxiw=;
	b=fJiaJx2P0rRFVGFte8J106F483zO+W5fsoGeWKglxf+hyJEM9o8NDHvFSW9Ex/OWkK
	KSdd5VLtSDS8Nq1SKqjPZ2s/TK+6MvsYHLhMlcF9aCDE/IsdkGFvDaMcKuLrLeng/FCD
	2a3MQYkvLbtasN9+/oRv4HeRpfrqXJXYyNPKQ=
Received: by 10.180.95.132 with SMTP id dk4mr14402916wib.30.1321017251699;
	Fri, 11 Nov 2011 05:14:11 -0800 (PST)
Received: from [192.168.1.71]
	(host86-129-245-239.range86-129.btcentralplus.com. [86.129.245.239])
	by mx.google.com with ESMTPS id z5sm6868438wix.5.2011.11.11.05.14.10
	(version=SSLv3 cipher=OTHER); Fri, 11 Nov 2011 05:14:11 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Fri, 11 Nov 2011 13:14:09 +0000
Subject: Re: [Xen-devel] [PATCH 0/9] decompressor bug fixes and cleanups
From: Keir Fraser <keir.xen@gmail.com>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CAE2D021.2485C%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH 0/9] decompressor bug fixes and cleanups
Thread-Index: Acygc8vukEIBgo9mM0CNRxqGpG+7nA==
In-Reply-To: <4EBD1416020000780006068B@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/11/2011 11:24, "Jan Beulich" <JBeulich@suse.com> wrote:

> This is a collection of patches pulled over from Linux.
> 
> 1: Decompressors: get rid of set_error_fn() macro
> 2: bzip2: Add missing checks for malloc returning NULL
> 3: Decompressors: remove unused function from unlzma.c
> 4: Decompressors: fix header validation in unlzma.c
> 5: Decompressors: check for read errors in unlzma.c
> 6: Decompressors: check for write errors in unlzma.c
> 7: Decompressors: validate match distance in unlzma.c
> 8: Decompressors: check for write errors in unlzo.c
> 9: Decompressors: check input size in unlzo.c
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-api-bounces@lists.xensource.com Fri Nov 11 07:00:44 2011
Return-path: <xen-api-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 07:00:44 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROsax-0000pd-EH; Fri, 11 Nov 2011 07:00:43 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROsaj-0000ma-JZ; Fri, 11 Nov 2011 07:00:29 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1321023624!3182009!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30453 invoked from network); 11 Nov 2011 15:00:25 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-14.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 15:00:25 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pABF0MpP019853
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 11 Nov 2011 15:00:22 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pABF0L5A002876
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 11 Nov 2011 15:00:21 GMT
Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pABF0Fl0029787; Fri, 11 Nov 2011 09:00:15 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 11 Nov 2011 07:00:14 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 17FF5814B9; Fri, 11 Nov 2011 10:00:14 -0500 (EST)
Date: Fri, 11 Nov 2011 10:00:14 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Lars Kurth <lars.kurth@xen.org>
Subject: Re: [Xen-API] Another Xen Doc Day, Nov 29 or Dec 12
Message-ID: <20111111150013.GA4712@phenom.dumpdata.com>
References: <4EBD03EA.9070907@xen.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EBD03EA.9070907@xen.org>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090205.4EBD3887.0097,ss=1,re=0.000,fgs=0
Cc: xen-arm@lists.xensource.com,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	"xen-api@lists.xensource.com" <xen-api@lists.xensource.com>
X-BeenThere: xen-api@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Discussion of API issues surrounding Xen <xen-api.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>,
	<mailto:xen-api-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-api@lists.xensource.com>
List-Help: <mailto:xen-api-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>,
	<mailto:xen-api-request@lists.xensource.com?subject=subscribe>
Sender: xen-api-bounces@lists.xensource.com
Errors-To: xen-api-bounces@lists.xensource.com

On Fri, Nov 11, 2011 at 11:15:54AM +0000, Lars Kurth wrote:
> Hi,
> 
> Given that the last Xen Document day was a real success, I wanted to
> propose another Xen Document day. Ideas of what to work on:
> - Continue some of the work stared by the dev community (more man
> pages, etc.)
> - Clean up pages in the new Wiki
> - I am also happy to be on stand-by to help anybody who wants to
> know how to use the new Wiki effectively
> 
> Please vote on date preferences by voting
> +1 <your preferred date>

+1 Nov 29

_______________________________________________
xen-api mailing list
xen-api@lists.xensource.com
http://lists.xensource.com/mailman/listinfo/xen-api

From xen-devel-bounces@lists.xensource.com Fri Nov 11 07:06:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 07:06:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROsgR-0002DN-6P; Fri, 11 Nov 2011 07:06:23 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROsfk-00020S-Qc
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 07:05:41 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1321023919!47915230!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8022 invoked from network); 11 Nov 2011 15:05:20 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 15:05:20 -0000
X-IronPort-AV: E=Sophos;i="4.69,495,1315180800"; 
   d="scan'208";a="8889007"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Nov 2011 15:05:18 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 11 Nov 2011 15:05:18 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1ROsfO-00017p-AQ;
	Fri, 11 Nov 2011 15:05:18 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1ROsfO-0008Fq-73;
	Fri, 11 Nov 2011 15:05:18 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9747-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 11 Nov 2011 15:05:18 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9747: tolerable FAIL - PUSHED
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9747 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9747/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  4699decb8424
baseline version:
 xen                  d0bbe0622d1d

------------------------------------------------------------
People who touched revisions under test:
  Andres Lagar-Cavilla <andres@lagarcavilla.org>
  Andrew Cooper <andrew.cooper3@citrix.com>
  Ian Campbell <ian.campbell@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Jean Guyader <jean.guyader@eu.citrix.com>
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
  Wei Wang <wei.wang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     pass    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Pushing revision :

+ branch=xen-unstable
+ revision=4699decb8424
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x '!=' x/export/home/osstest/repos/lock ']'
++ OSSTEST_REPOS_LOCK_LOCKED=/export/home/osstest/repos/lock
++ exec with-lock-ex -w /export/home/osstest/repos/lock ./ap-push xen-unstable 4699decb8424
+ branch=xen-unstable
+ revision=4699decb8424
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x/export/home/osstest/repos/lock '!=' x/export/home/osstest/repos/lock ']'
+ : xen@xenbits.xensource.com
+ : xen@xenbits.xensource.com:git/linux-pvops
+ : master
+ : tested/2.6.39.x
+ case "$branch" in
+ cd /export/home/osstest/repos/xen-unstable.hg
+ hg push -r 4699decb8424 ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
pushing to ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 8 changesets with 27 changes to 15 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 07:27:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 07:27:24 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROt0m-0003NX-7J; Fri, 11 Nov 2011 07:27:24 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROszz-0003Au-U1
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 07:26:36 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1321025190!1188696!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23385 invoked from network); 11 Nov 2011 15:26:32 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-13.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 15:26:32 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pABFQQL2000418
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 11 Nov 2011 15:26:27 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pABFQPYv018361
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 11 Nov 2011 15:26:26 GMT
Received: from abhmt105.oracle.com (abhmt105.oracle.com [141.146.116.57])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pABFQKBC013481; Fri, 11 Nov 2011 09:26:20 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 11 Nov 2011 07:26:20 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 54262814B5; Fri, 11 Nov 2011 10:26:19 -0500 (EST)
Date: Fri, 11 Nov 2011 10:26:19 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Olatunji Ruwase <oor@cs.cmu.edu>
Subject: Re: [Xen-devel] Trapping I/O accesses of a driver domain
Message-ID: <20111111152619.GB4712@phenom.dumpdata.com>
References: <50891.128.2.134.97.1320965847.squirrel@webmail.cs.cmu.edu>
	<20111110232727.GA2412@phenom.dumpdata.com>
	<60193.71.199.121.110.1320981956.squirrel@webmail.cs.cmu.edu>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <60193.71.199.121.110.1320981956.squirrel@webmail.cs.cmu.edu>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090203.4EBD3EA3.0050,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Nov 10, 2011 at 10:25:56PM -0500, Olatunji Ruwase wrote:
> >> Xen-3.3 with a dom0 and driver domU both running linux-2.6.18-xen. For
> >> various reasons HVM Xen is not suitable for my work.
> >
> > Um, why not use something more recent. Like Ubuntu or Fedora Core 16?
> >
>  My work is based on simulated hardware logging and a significantly
>  modified FC5, porting the kernel modifications to FC6 is significantly
>  than to more recent kernels like FC16.

You could do this on real hardware. Say get an machine with IOMMU
(like a TA890FXE) and use the AMD VI to trap you on all the IOMMU
(so DMA) operations. ..

Thought it might be worth reading first the AMD VI spec whether you can
trap on all DMA operations.
> 
> >> ioremap'd pages, this seems pretty straightforward since the ptes are
> >> marked with _PAGE_IO before they are passed to Xen. And so it seems
> >
> > Not all the time and it is not a requirement.
> >
>  I am happy to modify the 2.16.8-xen to cover the outstanding cases,
>  except this is a fundamentally flawed approach. Can you elaborate the

Huh? What is the flawed approach?

>  ioremap scenarios for pte are not marked _PAGE_IO. Are the requirements
>  documented?

The _PAGE_IO is a Linux kernel concept used to figure if the PTE contains
the MFN or  PFN value. I don't think the hypervisor cares about it.

> 
> >> modifying do_mmu_update () to detect and mark such ptes not present
> >> should work. Is this a reasonable approach ?.
> >
> > What about just checking the MFNs against the ones in the E820 that
> > are in the PCI gap space?
> >>
>   I m not familiar with E820, but will explore it, thanks.

So it sounds like you are concentrating on making this work in the dom0, domU,
not in the hypervisor. In which case you can ignore the E820.

> 
> >>  hypercall informing Xen that the locations are used for I/O. I am
> >> probably
> >
> > Right.
> >
> 
>  Thanks for the response.
> 
> tunji
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 08:08:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 08:08:03 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROte6-0005IH-Gx; Fri, 11 Nov 2011 08:08:02 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROtX9-0004y9-81
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 08:01:47 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1321027206!62840246!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19509 invoked from network); 11 Nov 2011 16:00:06 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-2.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 16:00:06 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 16:00:42 +0000
Message-Id: <4EBD54B80200007800060776@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 16:00:40 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part654A9BB8.1__="
Cc: George Dunlap <George.Dunlap@eu.citrix.com>
Subject: [Xen-devel] [PATCH] x86/IRQ: prevent vector sharing within IO-APICs
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part654A9BB8.1__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Following the prevention of vector sharing for MSIs, this change
enforces the same within IO-APICs: Pin based interrupts use the IO-APIC
as their identifying device under the AMD IOMMU (and just like for
MSIs, only the identifying device is used to remap interrupts here,
with no regard to an interrupt's destination).

Additionally, LAPIC initiated EOIs (for level triggered interrupts) too
use only the vector for identifying which interrupts to end. While this
generally causes no significant problem (at worst an interrupt would be
re-raised without a new interrupt event actually having occurred), it
still seems better to avoid the situation.

For this second aspect, a distinction is being made between the
traditional and the directed-EOI cases: In the former, vectors should
not be shared throughout all IO-APICs in the system, while in the
latter case only individual IO-APICs need to be contrained (or, if the
firmware indicates so, sub- groups of them having the same GSI appear
at multiple pins).

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -395,6 +395,11 @@ static vmask_t *irq_get_used_vector_mask
             }
         }
     }
+    else if ( IO_APIC_IRQ(irq) &&
+              opt_irq_vector_map !=3D OPT_IRQ_VECTOR_MAP_NONE )
+    {
+        ret =3D io_apic_get_used_vector_map(irq);
+    }
=20
     return ret;
 }
--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -72,6 +72,33 @@ int __read_mostly nr_ioapics;
 #define io_apic_eoi_vector(apic, vector) io_apic_eoi((apic), (vector), =
-1)
 #define io_apic_eoi_pin(apic, pin) io_apic_eoi((apic), -1, (pin))
=20
+static int apic_pin_2_gsi_irq(int apic, int pin);
+
+static vmask_t *__read_mostly vector_map[MAX_IO_APICS];
+
+static void share_vector_maps(unsigned int src, unsigned int dst)
+{
+    unsigned int pin;
+
+    if (vector_map[src] =3D=3D vector_map[dst])
+        return;
+
+    bitmap_or(vector_map[src]->_bits, vector_map[src]->_bits,
+              vector_map[dst]->_bits, NR_VECTORS);
+
+    for (pin =3D 0; pin < nr_ioapic_entries[dst]; ++pin) {
+        int irq =3D apic_pin_2_gsi_irq(dst, pin);
+        struct irq_desc *desc;
+
+        if (irq < 0)
+            continue;
+        desc =3D irq_to_desc(irq);
+        if (desc->arch.used_vectors =3D=3D vector_map[dst])
+            desc->arch.used_vectors =3D vector_map[src];
+    }
+
+    vector_map[dst] =3D vector_map[src];
+}
=20
 /*
  * This is performance-critical, we want to do it O(1)
@@ -113,6 +140,7 @@ static void add_pin_to_irq(unsigned int=20
     }
     entry->apic =3D apic;
     entry->pin =3D pin;
+    share_vector_maps(irq_2_pin[irq].apic, apic);
 }
=20
 /*
@@ -128,6 +156,7 @@ static void __init replace_pin_at_irq(un
         if (entry->apic =3D=3D oldapic && entry->pin =3D=3D oldpin) {
             entry->apic =3D newapic;
             entry->pin =3D newpin;
+            share_vector_maps(oldapic, newapic);
         }
         if (!entry->next)
             break;
@@ -135,6 +164,16 @@ static void __init replace_pin_at_irq(un
     }
 }
=20
+vmask_t *io_apic_get_used_vector_map(unsigned int irq)
+{
+    struct irq_pin_list *entry =3D irq_2_pin + irq;
+
+    if (entry->pin =3D=3D -1)
+        return NULL;
+
+    return vector_map[entry->apic];
+}
+
 struct IO_APIC_route_entry **alloc_ioapic_entries(void)
 {
     int apic;
@@ -1244,6 +1283,18 @@ static void __init enable_IO_APIC(void)
     for (i =3D irq_2_pin_free_entry =3D nr_irqs_gsi; i < PIN_MAP_SIZE; =
i++)
         irq_2_pin[i].next =3D i + 1;
=20
+    if (directed_eoi_enabled) {
+        for (apic =3D 0; apic < nr_ioapics; apic++) {
+            vector_map[apic] =3D xzalloc(vmask_t);
+            BUG_ON(!vector_map[apic]);
+        }
+    } else {
+        vector_map[0] =3D xzalloc(vmask_t);
+        BUG_ON(!vector_map[0]);
+        for (apic =3D 1; apic < nr_ioapics; apic++)
+            vector_map[apic] =3D vector_map[0];
+    }
+
     for(apic =3D 0; apic < nr_ioapics; apic++) {
         int pin;
         /* See if any of the pins is in ExtINT mode */
@@ -2345,13 +2396,12 @@ int ioapic_guest_write(unsigned long phy
     }
=20
     if ( desc->arch.vector <=3D 0 || desc->arch.vector > LAST_DYNAMIC_VECT=
OR ) {
+        add_pin_to_irq(irq, apic, pin);
         vector =3D assign_irq_vector(irq);
         if ( vector < 0 )
             return vector;
=20
         printk(XENLOG_INFO "allocated vector %02x for irq %d\n", vector, =
irq);
-
-        add_pin_to_irq(irq, apic, pin);
     }
     spin_lock(&dom0->event_lock);
     ret =3D map_domain_pirq(dom0, pirq, irq,
--- a/xen/include/asm-x86/irq.h
+++ b/xen/include/asm-x86/irq.h
@@ -116,6 +116,7 @@ int i8259A_resume(void);
 void setup_IO_APIC(void);
 void disable_IO_APIC(void);
 void setup_ioapic_dest(void);
+vmask_t *io_apic_get_used_vector_map(unsigned int irq);
=20
 extern unsigned int io_apic_irqs;
=20



--=__Part654A9BB8.1__=
Content-Type: text/plain; name="x86-ioapic-shared-vectors.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="x86-ioapic-shared-vectors.patch"

x86/IRQ: prevent vector sharing within IO-APICs=0A=0AFollowing the =
prevention of vector sharing for MSIs, this change=0Aenforces the same =
within IO-APICs: Pin based interrupts use the IO-APIC=0Aas their identifyin=
g device under the AMD IOMMU (and just like for=0AMSIs, only the identifyin=
g device is used to remap interrupts here,=0Awith no regard to an =
interrupt's destination).=0A=0AAdditionally, LAPIC initiated EOIs (for =
level triggered interrupts) too=0Ause only the vector for identifying =
which interrupts to end. While this=0Agenerally causes no significant =
problem (at worst an interrupt would be=0Are-raised without a new =
interrupt event actually having occurred), it=0Astill seems better to =
avoid the situation.=0A=0AFor this second aspect, a distinction is being =
made between the=0Atraditional and the directed-EOI cases: In the former, =
vectors should=0Anot be shared throughout all IO-APICs in the system, =
while in the=0Alatter case only individual IO-APICs need to be contrained =
(or, if the=0Afirmware indicates so, sub- groups of them having the same =
GSI appear=0Aat multiple pins).=0A=0ASigned-off-by: Jan Beulich <jbeulich@s=
use.com>=0A=0A--- a/xen/arch/x86/irq.c=0A+++ b/xen/arch/x86/irq.c=0A@@ =
-395,6 +395,11 @@ static vmask_t *irq_get_used_vector_mask=0A             =
}=0A         }=0A     }=0A+    else if ( IO_APIC_IRQ(irq) &&=0A+           =
   opt_irq_vector_map !=3D OPT_IRQ_VECTOR_MAP_NONE )=0A+    {=0A+        =
ret =3D io_apic_get_used_vector_map(irq);=0A+    }=0A =0A     return =
ret;=0A }=0A--- a/xen/arch/x86/io_apic.c=0A+++ b/xen/arch/x86/io_apic.c=0A@=
@ -72,6 +72,33 @@ int __read_mostly nr_ioapics;=0A #define io_apic_eoi_vect=
or(apic, vector) io_apic_eoi((apic), (vector), -1)=0A #define io_apic_eoi_p=
in(apic, pin) io_apic_eoi((apic), -1, (pin))=0A =0A+static int apic_pin_2_g=
si_irq(int apic, int pin);=0A+=0A+static vmask_t *__read_mostly vector_map[=
MAX_IO_APICS];=0A+=0A+static void share_vector_maps(unsigned int src, =
unsigned int dst)=0A+{=0A+    unsigned int pin;=0A+=0A+    if (vector_map[s=
rc] =3D=3D vector_map[dst])=0A+        return;=0A+=0A+    bitmap_or(vector_=
map[src]->_bits, vector_map[src]->_bits,=0A+              vector_map[dst]->=
_bits, NR_VECTORS);=0A+=0A+    for (pin =3D 0; pin < nr_ioapic_entries[dst]=
; ++pin) {=0A+        int irq =3D apic_pin_2_gsi_irq(dst, pin);=0A+        =
struct irq_desc *desc;=0A+=0A+        if (irq < 0)=0A+            =
continue;=0A+        desc =3D irq_to_desc(irq);=0A+        if (desc->arch.u=
sed_vectors =3D=3D vector_map[dst])=0A+            desc->arch.used_vectors =
=3D vector_map[src];=0A+    }=0A+=0A+    vector_map[dst] =3D vector_map[src=
];=0A+}=0A =0A /*=0A  * This is performance-critical, we want to do it =
O(1)=0A@@ -113,6 +140,7 @@ static void add_pin_to_irq(unsigned int =0A     =
}=0A     entry->apic =3D apic;=0A     entry->pin =3D pin;=0A+    share_vect=
or_maps(irq_2_pin[irq].apic, apic);=0A }=0A =0A /*=0A@@ -128,6 +156,7 @@ =
static void __init replace_pin_at_irq(un=0A         if (entry->apic =3D=3D =
oldapic && entry->pin =3D=3D oldpin) {=0A             entry->apic =3D =
newapic;=0A             entry->pin =3D newpin;=0A+            share_vector_=
maps(oldapic, newapic);=0A         }=0A         if (!entry->next)=0A       =
      break;=0A@@ -135,6 +164,16 @@ static void __init replace_pin_at_irq(u=
n=0A     }=0A }=0A =0A+vmask_t *io_apic_get_used_vector_map(unsigned int =
irq)=0A+{=0A+    struct irq_pin_list *entry =3D irq_2_pin + irq;=0A+=0A+   =
 if (entry->pin =3D=3D -1)=0A+        return NULL;=0A+=0A+    return =
vector_map[entry->apic];=0A+}=0A+=0A struct IO_APIC_route_entry **alloc_ioa=
pic_entries(void)=0A {=0A     int apic;=0A@@ -1244,6 +1283,18 @@ static =
void __init enable_IO_APIC(void)=0A     for (i =3D irq_2_pin_free_entry =
=3D nr_irqs_gsi; i < PIN_MAP_SIZE; i++)=0A         irq_2_pin[i].next =3D i =
+ 1;=0A =0A+    if (directed_eoi_enabled) {=0A+        for (apic =3D 0; =
apic < nr_ioapics; apic++) {=0A+            vector_map[apic] =3D xzalloc(vm=
ask_t);=0A+            BUG_ON(!vector_map[apic]);=0A+        }=0A+    } =
else {=0A+        vector_map[0] =3D xzalloc(vmask_t);=0A+        BUG_ON(!ve=
ctor_map[0]);=0A+        for (apic =3D 1; apic < nr_ioapics; apic++)=0A+   =
         vector_map[apic] =3D vector_map[0];=0A+    }=0A+=0A     for(apic =
=3D 0; apic < nr_ioapics; apic++) {=0A         int pin;=0A         /* See =
if any of the pins is in ExtINT mode */=0A@@ -2345,13 +2396,12 @@ int =
ioapic_guest_write(unsigned long phy=0A     }=0A =0A     if ( desc->arch.ve=
ctor <=3D 0 || desc->arch.vector > LAST_DYNAMIC_VECTOR ) {=0A+        =
add_pin_to_irq(irq, apic, pin);=0A         vector =3D assign_irq_vector(irq=
);=0A         if ( vector < 0 )=0A             return vector;=0A =0A       =
  printk(XENLOG_INFO "allocated vector %02x for irq %d\n", vector, =
irq);=0A-=0A-        add_pin_to_irq(irq, apic, pin);=0A     }=0A     =
spin_lock(&dom0->event_lock);=0A     ret =3D map_domain_pirq(dom0, pirq, =
irq,=0A--- a/xen/include/asm-x86/irq.h=0A+++ b/xen/include/asm-x86/irq.h=0A=
@@ -116,6 +116,7 @@ int i8259A_resume(void);=0A void setup_IO_APIC(void);=
=0A void disable_IO_APIC(void);=0A void setup_ioapic_dest(void);=0A+vmask_t=
 *io_apic_get_used_vector_map(unsigned int irq);=0A =0A extern unsigned =
int io_apic_irqs;=0A =0A
--=__Part654A9BB8.1__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part654A9BB8.1__=--


From xen-devel-bounces@lists.xensource.com Fri Nov 11 08:12:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 08:12:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROti8-0005pv-HD; Fri, 11 Nov 2011 08:12:12 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROtdF-0005Bc-Mo
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 08:07:11 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1321027600!52392350!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13119 invoked from network); 11 Nov 2011 16:06:40 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 16:06:40 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 16:07:06 +0000
Message-Id: <4EBD5639020000780006077C@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 16:07:05 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__PartEAC51439.0__="
Subject: [Xen-devel] [PATCH] x86: clean up __io_apic_eoi()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__PartEAC51439.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Irrespective of the IO-APIC vector sharing suppression patch just sent
the logic in this function needs to iterate over all RTEs, since
multiple pins within an IO-APIC may still use the same vector. This is
due to the irq_2_pin[] mapping not necessarily being 1:1.

Consequently we should remove the commented out code as well as the
respective comments provisioned for the point in time when vector
sharing between unrelated RTEs would be disabled.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -281,36 +281,15 @@ static void __io_apic_eoi(unsigned int a
         /* If pin is unknown, search for it */
         if ( pin =3D=3D -1 )
         {
-            unsigned int p;
-            for ( p =3D 0; p < nr_ioapic_entries[apic]; ++p )
+            for ( pin =3D 0; pin < nr_ioapic_entries[apic]; ++pin )
             {
-                entry =3D __ioapic_read_entry(apic, p, TRUE);
+                entry =3D __ioapic_read_entry(apic, pin, TRUE);
                 if ( entry.vector =3D=3D vector )
-                {
-                    pin =3D p;
-                    /* break; */
-
-                    /* Here should be a break out of the loop, but at =
the=20
-                     * Xen code doesn't actually prevent multiple IO-APIC
-                     * entries being assigned the same vector, so EOI all
-                     * pins which have the correct vector.
-                     *
-                     * Remove the following code when the above assertion
-                     * is fulfilled. */
-                    __io_apic_eoi(apic, vector, p);
-                }
+                    __io_apic_eoi(apic, vector, pin);
             }
            =20
             /* If search fails, nothing to do */
=20
-            /* if ( pin =3D=3D -1 ) */
-
-            /* Because the loop wasn't broken out of (see comment above),
-             * all relevant pins have been EOI, so we can always return.
-             *=20
-             * Re-instate the if statement above when the Xen logic has =
been
-             * fixed.*/
-
             return;
         }
=20




--=__PartEAC51439.0__=
Content-Type: text/plain; name="x86-ioapic-EOI-cleanup.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="x86-ioapic-EOI-cleanup.patch"

x86: clean up __io_apic_eoi()=0A=0AIrrespective of the IO-APIC vector =
sharing suppression patch just sent=0Athe logic in this function needs to =
iterate over all RTEs, since=0Amultiple pins within an IO-APIC may still =
use the same vector. This is=0Adue to the irq_2_pin[] mapping not =
necessarily being 1:1.=0A=0AConsequently we should remove the commented =
out code as well as the=0Arespective comments provisioned for the point in =
time when vector=0Asharing between unrelated RTEs would be disabled.=0A=0AS=
igned-off-by: Jan Beulich <jbeulich@suse.com>=0A=0A--- a/xen/arch/x86/io_ap=
ic.c=0A+++ b/xen/arch/x86/io_apic.c=0A@@ -281,36 +281,15 @@ static void =
__io_apic_eoi(unsigned int a=0A         /* If pin is unknown, search for =
it */=0A         if ( pin =3D=3D -1 )=0A         {=0A-            unsigned =
int p;=0A-            for ( p =3D 0; p < nr_ioapic_entries[apic]; ++p =
)=0A+            for ( pin =3D 0; pin < nr_ioapic_entries[apic]; ++pin =
)=0A             {=0A-                entry =3D __ioapic_read_entry(apic, =
p, TRUE);=0A+                entry =3D __ioapic_read_entry(apic, pin, =
TRUE);=0A                 if ( entry.vector =3D=3D vector )=0A-            =
    {=0A-                    pin =3D p;=0A-                    /* break; =
*/=0A-=0A-                    /* Here should be a break out of the loop, =
but at the =0A-                     * Xen code doesn't actually prevent =
multiple IO-APIC=0A-                     * entries being assigned the same =
vector, so EOI all=0A-                     * pins which have the correct =
vector.=0A-                     *=0A-                     * Remove the =
following code when the above assertion=0A-                     * is =
fulfilled. */=0A-                    __io_apic_eoi(apic, vector, p);=0A-   =
             }=0A+                    __io_apic_eoi(apic, vector, pin);=0A =
            }=0A             =0A             /* If search fails, nothing =
to do */=0A =0A-            /* if ( pin =3D=3D -1 ) */=0A-=0A-            =
/* Because the loop wasn't broken out of (see comment above),=0A-          =
   * all relevant pins have been EOI, so we can always return.=0A-         =
    * =0A-             * Re-instate the if statement above when the Xen =
logic has been=0A-             * fixed.*/=0A-=0A             return;=0A    =
     }=0A =0A
--=__PartEAC51439.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__PartEAC51439.0__=--


From xen-devel-bounces@lists.xensource.com Fri Nov 11 08:14:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 08:14:00 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROtjs-0006DB-Fl; Fri, 11 Nov 2011 08:14:00 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROtfX-0005UV-Ao; Fri, 11 Nov 2011 08:09:32 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1321027733!45555116!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26685 invoked from network); 11 Nov 2011 16:08:53 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 16:08:53 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 16:09:26 +0000
Message-Id: <4EBD56C50200007800060781@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 16:09:25 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part765988A5.0__="
Cc: xen-ia64-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] ia64: introduce atomic_{read,write}NN()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part765988A5.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

These are required to be able to build certain portions of common code.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/include/asm-ia64/linux-xen/asm/atomic.h
+++ b/xen/include/asm-ia64/linux-xen/asm/atomic.h
@@ -24,12 +24,9 @@ typedef struct { volatile __s32 counter;
 typedef struct { volatile __s64 counter; } atomic64_t;
=20
 #ifndef XEN
+
 #define ATOMIC_INIT(i)		((atomic_t) { (i) })
 #define ATOMIC64_INIT(i)	((atomic64_t) { (i) })
-#else
-#define ATOMIC_INIT(i)		{ (i) }
-#define ATOMIC64_INIT(i)	{ (i) }
-#endif
=20
 #define atomic_read(v)		((v)->counter)
 #define atomic64_read(v)	((v)->counter)
@@ -37,6 +34,55 @@ typedef struct { volatile __s64 counter;
 #define atomic_set(v,i)		(((v)->counter) =3D (i))
 #define atomic64_set(v,i)	(((v)->counter) =3D (i))
=20
+#else
+
+#define ATOMIC_INIT(i)		{ (i) }
+#define ATOMIC64_INIT(i)	{ (i) }
+
+#define build_atomic_read(tag, type) \
+static inline type atomic_read##tag(const volatile type *addr) \
+{ \
+	type ret; \
+	asm volatile("ld%2.acq %0 =3D %1" \
+		     : "=3Dr" (ret) \
+		     : "m" (*addr), "i" (sizeof(type))); \
+	return ret; \
+}
+
+#define build_atomic_write(tag, type) \
+static inline void atomic_write##tag(volatile type *addr, type val) \
+{ \
+	asm volatile("st%2.rel %0 =3D %1" \
+		     : "=3Dm" (*addr) \
+		     : "r" (val), "i" (sizeof(type))); \
+}
+
+build_atomic_read(8, uint8_t)
+build_atomic_read(16, uint16_t)
+build_atomic_read(32, uint32_t)
+build_atomic_read(64, uint64_t)
+build_atomic_read(_int, int)
+build_atomic_read(_long, long)
+
+build_atomic_write(8, uint8_t)
+build_atomic_write(16, uint16_t)
+build_atomic_write(32, uint32_t)
+build_atomic_write(64, uint64_t)
+build_atomic_write(_int, int)
+build_atomic_write(_long, long)
+
+#define _atomic_read(v)		((v).counter)
+#define _atomic64_read(v)	((v).counter)
+#define atomic_read(v)		atomic_read_int(&((v)->counter))
+#define atomic64_read(v)	atomic_read_long(&((v)->counter))
+
+#define _atomic_set(v,i)	(((v).counter) =3D (i))
+#define _atomic64_set(v,i)	(((v).counter) =3D (i))
+#define atomic_set(v,i)		atomic_write_int(&((v)->counter), =
i)
+#define atomic64_set(v,l)	atomic_write_long(&((v)->counter), l)
+
+#endif
+
 static __inline__ int
 ia64_atomic_add (int i, atomic_t *v)
 {
@@ -59,7 +105,7 @@ ia64_atomic64_add (__s64 i, atomic64_t *
=20
 	do {
 		CMPXCHG_BUGCHECK(v);
-		old =3D atomic_read(v);
+		old =3D atomic64_read(v);
 		new =3D old + i;
 	} while (ia64_cmpxchg(acq, v, old, new, sizeof(atomic64_t)) !=3D =
old);
 	return new;
@@ -87,7 +133,7 @@ ia64_atomic64_sub (__s64 i, atomic64_t *
=20
 	do {
 		CMPXCHG_BUGCHECK(v);
-		old =3D atomic_read(v);
+		old =3D atomic64_read(v);
 		new =3D old - i;
 	} while (ia64_cmpxchg(acq, v, old, new, sizeof(atomic64_t)) !=3D =
old);
 	return new;




--=__Part765988A5.0__=
Content-Type: text/plain; name="ia64-atomic-rw.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="ia64-atomic-rw.patch"

ia64: introduce atomic_{read,write}NN()=0A=0AThese are required to be able =
to build certain portions of common code.=0A=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- a/xen/include/asm-ia64/linux-xen/asm/atomic.h=
=0A+++ b/xen/include/asm-ia64/linux-xen/asm/atomic.h=0A@@ -24,12 +24,9 @@ =
typedef struct { volatile __s32 counter;=0A typedef struct { volatile =
__s64 counter; } atomic64_t;=0A =0A #ifndef XEN=0A+=0A #define ATOMIC_INIT(=
i)		((atomic_t) { (i) })=0A #define ATOMIC64_INIT(i)	=
((atomic64_t) { (i) })=0A-#else=0A-#define ATOMIC_INIT(i)		{ =
(i) }=0A-#define ATOMIC64_INIT(i)	{ (i) }=0A-#endif=0A =0A #define =
atomic_read(v)		((v)->counter)=0A #define atomic64_read(v)	=
((v)->counter)=0A@@ -37,6 +34,55 @@ typedef struct { volatile __s64 =
counter;=0A #define atomic_set(v,i)		(((v)->counter) =3D =
(i))=0A #define atomic64_set(v,i)	(((v)->counter) =3D (i))=0A =
=0A+#else=0A+=0A+#define ATOMIC_INIT(i)		{ (i) }=0A+#define =
ATOMIC64_INIT(i)	{ (i) }=0A+=0A+#define build_atomic_read(tag, =
type) \=0A+static inline type atomic_read##tag(const volatile type *addr) =
\=0A+{ \=0A+	type ret; \=0A+	asm volatile("ld%2.acq %0 =3D %1" \=0A+		=
     : "=3Dr" (ret) \=0A+		     : "m" (*addr), "i" (sizeof(typ=
e))); \=0A+	return ret; \=0A+}=0A+=0A+#define build_atomic_write(tag, =
type) \=0A+static inline void atomic_write##tag(volatile type *addr, type =
val) \=0A+{ \=0A+	asm volatile("st%2.rel %0 =3D %1" \=0A+		   =
  : "=3Dm" (*addr) \=0A+		     : "r" (val), "i" (sizeof(type)=
)); \=0A+}=0A+=0A+build_atomic_read(8, uint8_t)=0A+build_atomic_read(16, =
uint16_t)=0A+build_atomic_read(32, uint32_t)=0A+build_atomic_read(64, =
uint64_t)=0A+build_atomic_read(_int, int)=0A+build_atomic_read(_long, =
long)=0A+=0A+build_atomic_write(8, uint8_t)=0A+build_atomic_write(16, =
uint16_t)=0A+build_atomic_write(32, uint32_t)=0A+build_atomic_write(64, =
uint64_t)=0A+build_atomic_write(_int, int)=0A+build_atomic_write(_long, =
long)=0A+=0A+#define _atomic_read(v)		((v).counter)=0A+#define =
_atomic64_read(v)	((v).counter)=0A+#define atomic_read(v)		=
atomic_read_int(&((v)->counter))=0A+#define atomic64_read(v)	atomic_read=
_long(&((v)->counter))=0A+=0A+#define _atomic_set(v,i)	(((v).counter) =3D =
(i))=0A+#define _atomic64_set(v,i)	(((v).counter) =3D (i))=0A+#define =
atomic_set(v,i)		atomic_write_int(&((v)->counter), i)=0A+#define =
atomic64_set(v,l)	atomic_write_long(&((v)->counter), l)=0A+=0A+#endif=
=0A+=0A static __inline__ int=0A ia64_atomic_add (int i, atomic_t *v)=0A =
{=0A@@ -59,7 +105,7 @@ ia64_atomic64_add (__s64 i, atomic64_t *=0A =0A 	do =
{=0A 		CMPXCHG_BUGCHECK(v);=0A-		old =3D atomic_read=
(v);=0A+		old =3D atomic64_read(v);=0A 		new =3D =
old + i;=0A 	} while (ia64_cmpxchg(acq, v, old, new, sizeof(atomic64_t))=
 !=3D old);=0A 	return new;=0A@@ -87,7 +133,7 @@ ia64_atomic64_sub (__s64 =
i, atomic64_t *=0A =0A 	do {=0A 		CMPXCHG_BUGCHECK(v);=0A-	=
	old =3D atomic_read(v);=0A+		old =3D atomic64_read(v);=
=0A 		new =3D old - i;=0A 	} while (ia64_cmpxchg(acq, v, old, =
new, sizeof(atomic64_t)) !=3D old);=0A 	return new;=0A
--=__Part765988A5.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part765988A5.0__=--


From xen-devel-bounces@lists.xensource.com Fri Nov 11 08:16:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 08:16:15 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROtm2-0006ch-MG; Fri, 11 Nov 2011 08:16:14 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROtka-0006NB-FG
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 08:14:45 -0800
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-13.tower-27.messagelabs.com!1321028063!47925270!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1572 invoked from network); 11 Nov 2011 16:14:24 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-13.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 16:14:24 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1ROtkT-000PNK-Uc; Fri, 11 Nov 2011 16:14:37 +0000
Date: Fri, 11 Nov 2011 16:14:37 +0000
From: Tim Deegan <tim@xen.org>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Trapping I/O accesses of a driver domain
Message-ID: <20111111161437.GB92917@ocelot.phlegethon.org>
References: <50891.128.2.134.97.1320965847.squirrel@webmail.cs.cmu.edu>
	<20111110232727.GA2412@phenom.dumpdata.com>
	<60193.71.199.121.110.1320981956.squirrel@webmail.cs.cmu.edu>
	<20111111152619.GB4712@phenom.dumpdata.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <20111111152619.GB4712@phenom.dumpdata.com>
User-Agent: Mutt/1.4.2.1i
Cc: Olatunji Ruwase <oor@cs.cmu.edu>, xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 10:26 -0500 on 11 Nov (1321007179), Konrad Rzeszutek Wilk wrote:
> On Thu, Nov 10, 2011 at 10:25:56PM -0500, Olatunji Ruwase wrote:
> > >> Xen-3.3 with a dom0 and driver domU both running linux-2.6.18-xen. For
> > >> various reasons HVM Xen is not suitable for my work.
> > >
> > > Um, why not use something more recent. Like Ubuntu or Fedora Core 16?
> > >
> >  My work is based on simulated hardware logging and a significantly
> >  modified FC5, porting the kernel modifications to FC6 is significantly
> >  than to more recent kernels like FC16.
> 
> You could do this on real hardware. Say get an machine with IOMMU
> (like a TA890FXE) and use the AMD VI to trap you on all the IOMMU
> (so DMA) operations. ..
> 
> Thought it might be worth reading first the AMD VI spec whether you can
> trap on all DMA operations.

Unfortunately, AFAIK you can't currently restart operations that the
IOMMU has disallowed, so actually capturing the DMA and having the
peripheral keep working would be tricky.

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 08:18:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 08:18:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROtnx-00070t-Nk; Fri, 11 Nov 2011 08:18:13 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROtld-0006Wu-PO; Fri, 11 Nov 2011 08:15:51 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1321028145!1210994!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25386 invoked from network); 11 Nov 2011 16:15:46 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-5.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 16:15:46 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 11 Nov 2011 16:15:45 +0000
Message-Id: <4EBD583E0200007800060794@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 11 Nov 2011 16:15:42 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__PartEFC0113E.0__="
Cc: xen-ia64-devel@lists.xensource.com
Subject: [Xen-devel] ia64: fix the build
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__PartEFC0113E.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

This addresses all remaining build problems introduced over the last
several months.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/ia64/linux-xen/iosapic.c
+++ b/xen/arch/ia64/linux-xen/iosapic.c
@@ -275,12 +275,6 @@ set_rte (unsigned int gsi, unsigned int=20
 	iosapic_intr_info[vector].dest =3D dest;
 }
=20
-static void
-nop (struct irq_desc *desc)
-{
-	/* do nothing... */
-}
-
 void
 kexec_disable_iosapic(void)
 {
@@ -428,7 +422,7 @@ iosapic_end_level_irq (struct irq_desc *
 #define iosapic_shutdown_level_irq	mask_irq
 #define iosapic_enable_level_irq	unmask_irq
 #define iosapic_disable_level_irq	mask_irq
-#define iosapic_ack_level_irq		nop
+#define iosapic_ack_level_irq		irq_actor_none
=20
 static hw_irq_controller irq_type_iosapic_level =3D {
 	.typename =3D	"IO-SAPIC-level",
@@ -446,9 +440,9 @@ static hw_irq_controller irq_type_iosapi
  */
=20
 static unsigned int
-iosapic_startup_edge_irq (unsigned int irq)
+iosapic_startup_edge_irq (struct irq_desc *desc)
 {
-	unmask_irq(irq);
+	unmask_irq(desc);
 	/*
 	 * IOSAPIC simply drops interrupts pended while the
 	 * corresponding pin was masked, so we can't know if an
@@ -458,23 +452,21 @@ iosapic_startup_edge_irq (unsigned int i
 }
=20
 static void
-iosapic_ack_edge_irq (unsigned int irq)
+iosapic_ack_edge_irq (struct irq_desc *desc)
 {
-	irq_desc_t *idesc =3D irq_descp(irq);
-
-	move_irq(irq);
+	move_irq(idesc->irq);
 	/*
 	 * Once we have recorded IRQ_PENDING already, we can mask the
 	 * interrupt for real. This prevents IRQ storms from unhandled
 	 * devices.
 	 */
-	if ((idesc->status & (IRQ_PENDING|IRQ_DISABLED)) =3D=3D (IRQ_PENDIN=
G|IRQ_DISABLED))
-		mask_irq(irq);
+	if ((desc->status & (IRQ_PENDING|IRQ_DISABLED)) =3D=3D (IRQ_PENDING=
|IRQ_DISABLED))
+		mask_irq(desc);
 }
=20
 #define iosapic_enable_edge_irq		unmask_irq
-#define iosapic_disable_edge_irq	nop
-#define iosapic_end_edge_irq		nop
+#define iosapic_disable_edge_irq	irq_disable_none
+#define iosapic_end_edge_irq		irq_actor_none
=20
 static hw_irq_controller irq_type_iosapic_edge =3D {
 	.typename =3D	"IO-SAPIC-edge",
--- a/xen/arch/ia64/linux-xen/irq_ia64.c
+++ b/xen/arch/ia64/linux-xen/irq_ia64.c
@@ -242,6 +242,16 @@ static struct irqaction __read_mostly ip
 };
 #endif
=20
+static hw_irq_controller irq_type_ia64_lsapic =3D {
+	.typename =3D	"LSAPIC",
+	.startup =3D	irq_startup_none,
+	.shutdown =3D	irq_shutdown_none,
+	.enable =3D	irq_enable_none,
+	.disable =3D	irq_disable_none,
+	.ack =3D		irq_actor_none,
+	.end =3D		irq_actor_none
+};
+
 void
 register_percpu_irq (ia64_vector vec, struct irqaction *action)
 {
--- a/xen/arch/ia64/linux-xen/mca.c
+++ b/xen/arch/ia64/linux-xen/mca.c
@@ -428,9 +428,9 @@ void disable_irq_nosync(unsigned int irq
 		return;
=20
 	spin_lock_irqsave(&desc->lock, flags);
-	if (!desc->depth++) {
+	if (!desc->arch.depth++) {
 		desc->status |=3D IRQ_DISABLED;
-		desc->handler->disable(irq);
+		desc->handler->disable(desc);
 	}
 	spin_unlock_irqrestore(&desc->lock, flags);
 }
@@ -456,7 +456,7 @@ void enable_irq(unsigned int irq)
 		return;
=20
 	spin_lock_irqsave(&desc->lock, flags);
-	switch (desc->depth) {
+	switch (desc->arch.depth) {
 	case 0:
 		WARN_ON(1);
 		break;
@@ -468,11 +468,11 @@ void enable_irq(unsigned int irq)
 			desc->status =3D status | IRQ_REPLAY;
 			hw_resend_irq(desc->handler,irq);
 		}
-		desc->handler->enable(irq);
+		desc->handler->enable(desc);
 		/* fall-through */
 	}
 	default:
-		desc->depth--;
+		desc->arch.depth--;
 	}
 	spin_unlock_irqrestore(&desc->lock, flags);
 }
--- a/xen/arch/ia64/linux-xen/sn/kernel/irq.c
+++ b/xen/arch/ia64/linux-xen/sn/kernel/irq.c
@@ -72,6 +72,7 @@ void sn_intr_free(nasid_t local_nasid, i
 			(u64) sn_irq_info->irq_cookie, 0, 0);
 }
=20
+#ifndef XEN
 static unsigned int sn_startup_irq(unsigned int irq)
 {
 	return 0;
@@ -88,9 +89,16 @@ static void sn_disable_irq(unsigned int=20
 static void sn_enable_irq(unsigned int irq)
 {
 }
+#endif
=20
+#ifdef XEN
+static void sn_ack_irq(struct irq_desc *desc)
+{
+	unsigned int irq =3D desc->irq;
+#else
 static void sn_ack_irq(unsigned int irq)
 {
+#endif
 	u64 event_occurred, mask;
=20
 	irq =3D irq & 0xff;
@@ -102,8 +110,14 @@ static void sn_ack_irq(unsigned int irq)
 	move_native_irq(irq);
 }
=20
+#ifdef XEN
+static void sn_end_irq(struct irq_desc *desc)
+{
+	unsigned int irq =3D desc->irq;
+#else
 static void sn_end_irq(unsigned int irq)
 {
+#endif
 	int ivec;
 	u64 event_occurred;
=20
@@ -224,13 +238,17 @@ static void sn_set_affinity_irq(unsigned
 static hw_irq_controller irq_type_sn =3D {
 #ifndef XEN
 	.name		=3D "SN hub",
-#else
-	.typename	=3D "SN hub",
-#endif
 	.startup	=3D sn_startup_irq,
 	.shutdown	=3D sn_shutdown_irq,
 	.enable		=3D sn_enable_irq,
 	.disable	=3D sn_disable_irq,
+#else
+	.typename	=3D "SN hub",
+	.startup	=3D irq_startup_none,
+	.shutdown	=3D irq_shutdown_none,
+	.enable		=3D irq_enable_none,
+	.disable	=3D irq_disable_none,
+#endif
 	.ack		=3D sn_ack_irq,
 	.end		=3D sn_end_irq,
 #ifndef XEN
--- a/xen/arch/ia64/linux/Makefile
+++ b/xen/arch/ia64/linux/Makefile
@@ -9,7 +9,6 @@ obj-y +=3D efi_stub.o
 obj-y +=3D extable.o
 obj-y +=3D flush.o
 obj-y +=3D hpsim.o
-obj-y +=3D irq_lsapic.o
 obj-y +=3D linuxextable.o
 obj-y +=3D machvec.o
 obj-y +=3D memcpy_mck.o
--- a/xen/arch/ia64/linux/README.origin
+++ b/xen/arch/ia64/linux/README.origin
@@ -7,7 +7,6 @@ the instructions in the README there.
 efi_stub.S		-> linux/arch/ia64/kernel/efi_stub.S
 extable.c		-> linux/arch/ia64/mm/extable.c
 hpsim.S			-> linux/arch/ia64/hp/sim/hpsim.S
-irq_lsapic.c		-> linux/arch/ia64/kernel/irq_lsapic.c
 linuxextable.c		-> linux/kernel/extable.c
 machvec.c		-> linux/arch/ia64/kernel/machvec.c
 numa.c			-> linux/arch/ia64/mm/numa.c
--- a/xen/arch/ia64/linux/irq_lsapic.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * LSAPIC Interrupt Controller
- *
- * This takes care of interrupts that are generated by the CPU's
- * internal Streamlined Advanced Programmable Interrupt Controller
- * (LSAPIC), such as the ITC and IPI interrupts.
-    *
- * Copyright (C) 1999 VA Linux Systems
- * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
- * Copyright (C) 2000 Hewlett-Packard Co
- * Copyright (C) 2000 David Mosberger-Tang <davidm@hpl.hp.com>
- */
-
-#include <linux/sched.h>
-#include <linux/irq.h>
-
-static unsigned int
-lsapic_noop_startup (unsigned int irq)
-{
-	return 0;
-}
-
-static void
-lsapic_noop (unsigned int irq)
-{
-	/* nuthing to do... */
-}
-
-hw_irq_controller irq_type_ia64_lsapic =3D {
-	.typename =3D	"LSAPIC",
-	.startup =3D	lsapic_noop_startup,
-	.shutdown =3D	lsapic_noop,
-	.enable =3D	lsapic_noop,
-	.disable =3D	lsapic_noop,
-	.ack =3D		lsapic_noop,
-	.end =3D		lsapic_noop
-};
--- a/xen/arch/ia64/xen/dom0_ops.c
+++ b/xen/arch/ia64/xen/dom0_ops.c
@@ -17,6 +17,7 @@
 #include <asm/pdb.h>
 #include <xen/trace.h>
 #include <xen/console.h>
+#include <xen/grant_table.h>
 #include <xen/guest_access.h>
 #include <xen/pci.h>
 #include <asm/vmx.h>
--- a/xen/arch/ia64/xen/domain.c
+++ b/xen/arch/ia64/xen/domain.c
@@ -23,6 +23,7 @@
 #include <xen/delay.h>
 #include <xen/softirq.h>
 #include <xen/mm.h>
+#include <xen/grant_table.h>
 #include <xen/iocap.h>
 #include <asm/asm-xsi-offsets.h>
 #include <asm/system.h>
--- a/xen/arch/ia64/xen/fw_emul.c
+++ b/xen/arch/ia64/xen/fw_emul.c
@@ -31,7 +31,7 @@
 #include <asm/vcpu.h>
 #include <asm/vmx_vcpu.h>
 #include <asm/dom_fw.h>
-#include <asm/uaccess.h>
+#include <xen/guest_access.h>
 #include <xen/console.h>
 #include <xen/hypercall.h>
 #include <xen/softirq.h>
--- a/xen/arch/ia64/xen/hypercall.c
+++ b/xen/arch/ia64/xen/hypercall.c
@@ -70,7 +70,8 @@ static long __do_pirq_guest_eoi(struct d
 		evtchn_unmask(pirq_to_evtchn(d, pirq));
 		spin_unlock(&d->event_lock);
 	}
-	return pirq_guest_eoi(pirq);
+	pirq_guest_eoi(pirq_info(d, pirq));
+	return 0;
 }
=20
 long do_pirq_guest_eoi(int pirq)
--- a/xen/arch/ia64/xen/irq.c
+++ b/xen/arch/ia64/xen/irq.c
@@ -95,8 +95,11 @@ int __init init_irq_data(void)
 		struct irq_desc *desc =3D irq_to_desc(irq);
=20
 		desc->irq =3D irq;
-		init_one_irq_desc(desc);
+		if (init_one_irq_desc(desc))
+			BUG();
 	}
+
+	return 0;
 }
=20
 void __do_IRQ_guest(int irq);
@@ -105,14 +108,14 @@ void __do_IRQ_guest(int irq);
  * Special irq handlers.
  */
=20
-static void ack_none(unsigned int irq)
+static void ack_none(struct irq_desc *desc)
 {
 /*
  * 'what should we do if we get a hw irq event on an illegal vector'.
  * each architecture has to answer this themselves, it doesn't deserve
  * a generic callback i think.
  */
-	printk(KERN_ERR "Unexpected irq vector 0x%x on CPU %u!\n", irq, =
smp_processor_id());
+	printk(KERN_ERR "Unexpected irq vector 0x%x on CPU %u!\n", =
desc->irq, smp_processor_id());
 }
=20
 hw_irq_controller no_irq_type =3D {
@@ -147,11 +150,11 @@ fastcall unsigned int __do_IRQ(unsigned=20
 		/*
 		 * No locking required for CPU-local interrupts:
 		 */
-		desc->handler->ack(irq);
+		desc->handler->ack(desc);
 		local_irq_enable();
 		desc->action->handler(irq, desc->action->dev_id, regs);
 		local_irq_disable();
-		desc->handler->end(irq);
+		desc->handler->end(desc);
 		return 1;
 	}
=20
@@ -163,7 +166,7 @@ fastcall unsigned int __do_IRQ(unsigned=20
 		return 1;
 	}
=20
-	desc->handler->ack(irq);
+	desc->handler->ack(desc);
 	status =3D desc->status & ~IRQ_REPLAY;
 	status |=3D IRQ_PENDING; /* we _want_ to handle it */
=20
@@ -215,7 +218,7 @@ out:
 	 * The ->end() handler has to deal with interrupts which got
 	 * disabled while the handler was running.
 	 */
-	desc->handler->end(irq);
+	desc->handler->end(desc);
 	spin_unlock(&desc->lock);
=20
 	return 1;
@@ -248,10 +251,10 @@ int setup_vector(unsigned int vector, st
=20
 	*p =3D new;
=20
-	desc->depth =3D 0;
+	desc->arch.depth =3D 0;
 	desc->status &=3D ~(IRQ_DISABLED | IRQ_INPROGRESS | IRQ_GUEST);
-	desc->handler->startup(vector);
-	desc->handler->enable(vector);
+	desc->handler->startup(desc);
+	desc->handler->enable(desc);
 	desc->arch.vector =3D vector;
 	spin_unlock_irqrestore(&desc->lock,flags);
=20
@@ -287,9 +290,9 @@ void __init release_irq_vector(unsigned=20
 	spin_lock_irqsave(&desc->lock, flags);
 	clear_bit(vec, ia64_xen_vector);
 	desc->action =3D NULL;
-	desc->depth =3D 1;
+	desc->arch.depth =3D 1;
 	desc->status |=3D IRQ_DISABLED;
-	desc->handler->shutdown(vec);
+	desc->handler->shutdown(desc);
 	desc->arch.vector =3D -1;
 	spin_unlock_irqrestore(&desc->lock, flags);
=20
@@ -336,7 +339,7 @@ static void _irq_guest_eoi(irq_desc_t *d
         clear_pirq_eoi(action->guest[i], vector);
=20
     desc->status &=3D ~(IRQ_INPROGRESS|IRQ_GUEST_EOI_PENDING);
-    desc->handler->enable(vector);
+    desc->handler->enable(desc);
 }
=20
 static struct timer irq_guest_eoi_timer[NR_IRQS];
@@ -383,7 +386,7 @@ void __do_IRQ_guest(int irq)
 	if ( already_pending =3D=3D action->nr_guests )
 	{
 		stop_timer(&irq_guest_eoi_timer[irq]);
-		desc->handler->disable(irq);
+		desc->handler->disable(desc);
         desc->status |=3D IRQ_GUEST_EOI_PENDING;
         for ( i =3D 0; i < already_pending; ++i )
         {
@@ -417,31 +420,28 @@ static int pirq_acktype(int irq)
     return ACKTYPE_NONE;
 }
=20
-int pirq_guest_eoi(struct pirq *pirq)
+void pirq_guest_eoi(struct pirq *pirq)
 {
     irq_desc_t *desc;
     irq_guest_action_t *action;
=20
-    desc =3D &irq_desc[irq];
+    desc =3D &irq_desc[pirq->pirq];
     spin_lock_irq(&desc->lock);
     action =3D (irq_guest_action_t *)desc->action;
=20
     if ( action->ack_type =3D=3D ACKTYPE_NONE )
     {
         ASSERT(!pirq->masked);
-        stop_timer(&irq_guest_eoi_timer[irq]);
+        stop_timer(&irq_guest_eoi_timer[pirq->pirq]);
         _irq_guest_eoi(desc);
     }
=20
     if ( test_and_clear_bool(pirq->masked) && (--action->in_flight =3D=3D =
0) )
     {
         ASSERT(action->ack_type =3D=3D ACKTYPE_UNMASK);
-        desc->handler->end(irq);
+        desc->handler->end(desc);
     }
     spin_unlock_irq(&desc->lock);
-
-    return 0;
-
 }
=20
 int pirq_guest_unmask(struct domain *d)
@@ -505,12 +505,12 @@ int pirq_guest_bind(struct vcpu *v, stru
         action->nr_guests =3D 0;
         action->in_flight =3D 0;
         action->shareable =3D will_share;
-        action->ack_type  =3D pirq_acktype(irq);
+        action->ack_type  =3D pirq_acktype(pirq->pirq);
        =20
-        desc->depth =3D 0;
+        desc->arch.depth =3D 0;
         desc->status |=3D IRQ_GUEST;
         desc->status &=3D ~IRQ_DISABLED;
-        desc->handler->startup(pirq->pirq);
+        desc->handler->startup(desc);
=20
         /* Attempt to bind the interrupt target to the correct CPU. */
 #if 0 /* FIXME CONFIG_SMP ??? */
@@ -549,9 +549,9 @@ int pirq_guest_bind(struct vcpu *v, stru
     return rc;
 }
=20
-void pirq_guest_unbind(struct domain *d, int irq, struct pirq *pirq)
+void pirq_guest_unbind(struct domain *d, struct pirq *pirq)
 {
-    irq_desc_t         *desc =3D &irq_desc[irq];
+    irq_desc_t         *desc =3D &irq_desc[pirq->pirq];
     irq_guest_action_t *action;
     unsigned long       flags;
     int                 i;
@@ -569,17 +569,17 @@ void pirq_guest_unbind(struct domain *d,
     if ( action->ack_type =3D=3D ACKTYPE_UNMASK )
         if ( test_and_clear_bool(pirq->masked) &&
              (--action->in_flight =3D=3D 0) )
-            desc->handler->end(irq);
+            desc->handler->end(desc);
=20
     if ( !action->nr_guests )
     {
         BUG_ON(action->in_flight !=3D 0);
         desc->action =3D NULL;
         xfree(action);
-        desc->depth   =3D 1;
+        desc->arch.depth   =3D 1;
         desc->status |=3D IRQ_DISABLED;
         desc->status &=3D ~IRQ_GUEST;
-        desc->handler->shutdown(irq);
+        desc->handler->shutdown(desc);
     }
=20
     spin_unlock_irqrestore(&desc->lock, flags);   =20
@@ -610,10 +610,24 @@ void pirq_set_affinity(struct domain *d,
 	/* FIXME */
 }
=20
+void (pirq_cleanup_check)(struct pirq *pirq, struct domain *d)
+{
+    /*
+     * Check whether all fields have their default values, and delete
+     * the entry from the tree if so.
+     *
+     * NB: Common parts were already checked.
+     */
+    if ( !pt_pirq_cleanup_check(&pirq->arch.dpci) )
+        return;
+
+    if ( radix_tree_delete(&d->pirq_tree, pirq->pirq) !=3D pirq )
+        BUG();
+}
 /*
  * Exit an interrupt context. Process softirqs if needed and possible:
  */
 void irq_exit(void)
 {
-	sub_preempt_count(IRQ_EXIT_OFFSET);
+	preempt_count() -=3D IRQ_EXIT_OFFSET;/* sub_preempt_count(IRQ_EXIT_=
OFFSET); */
 }
--- a/xen/arch/ia64/xen/mm.c
+++ b/xen/arch/ia64/xen/mm.c
@@ -176,6 +176,7 @@
 #include <asm/tlb_track.h>
 #include <linux/efi.h>
 #include <linux/sort.h>
+#include <xen/grant_table.h>
 #include <xen/guest_access.h>
 #include <asm/page.h>
 #include <asm/dom_fw_common.h>
--- a/xen/arch/ia64/xen/pci.c
+++ b/xen/arch/ia64/xen/pci.c
@@ -83,54 +83,57 @@ pci_sal_write (unsigned int seg, unsigne
=20
=20
 uint8_t pci_conf_read8(
-    unsigned int bus, unsigned int dev, unsigned int func, unsigned int =
reg)
+    unsigned int seg, unsigned int bus, unsigned int dev, unsigned int =
func,
+    unsigned int reg)
 {
     uint32_t value;
-    BUG_ON((bus > 255) || (dev > 31) || (func > 7) || (reg > 255));
-    pci_sal_read(0, bus, (dev<<3)|func, reg, 1, &value);
+    BUG_ON((seg > 65535) || (bus > 255) || (dev > 31) || (func > 7) || =
(reg > 255));
+    pci_sal_read(seg, bus, (dev<<3)|func, reg, 1, &value);
     return (uint8_t)value;
 }
=20
 uint16_t pci_conf_read16(
-    unsigned int bus, unsigned int dev, unsigned int func, unsigned int =
reg)
+    unsigned int seg, unsigned int bus, unsigned int dev, unsigned int =
func,
+    unsigned int reg)
 {
     uint32_t value;
-    BUG_ON((bus > 255) || (dev > 31) || (func > 7) || (reg > 255));
-    pci_sal_read(0, bus, (dev<<3)|func, reg, 2, &value);
+    BUG_ON((seg > 65535) || (bus > 255) || (dev > 31) || (func > 7) || =
(reg > 255));
+    pci_sal_read(seg, bus, (dev<<3)|func, reg, 2, &value);
     return (uint16_t)value;
 }
=20
 uint32_t pci_conf_read32(
-    unsigned int bus, unsigned int dev, unsigned int func, unsigned int =
reg)
+    unsigned int seg, unsigned int bus, unsigned int dev, unsigned int =
func,
+    unsigned int reg)
 {
     uint32_t value;
-    BUG_ON((bus > 255) || (dev > 31) || (func > 7) || (reg > 255));
-    pci_sal_read(0, bus, (dev<<3)|func, reg, 4, &value);
+    BUG_ON((seg > 65535) || (bus > 255) || (dev > 31) || (func > 7) || =
(reg > 255));
+    pci_sal_read(seg, bus, (dev<<3)|func, reg, 4, &value);
     return (uint32_t)value;
 }
=20
 void pci_conf_write8(
-    unsigned int bus, unsigned int dev, unsigned int func, unsigned int =
reg,
-    uint8_t data)
+    unsigned int seg, unsigned int bus, unsigned int dev, unsigned int =
func,
+    unsigned int reg, uint8_t data)
 {
-    BUG_ON((bus > 255) || (dev > 31) || (func > 7) || (reg > 255));
-    pci_sal_write(0, bus, (dev<<3)|func, reg, 1, data);
+    BUG_ON((seg > 65535) || (bus > 255) || (dev > 31) || (func > 7) || =
(reg > 255));
+    pci_sal_write(seg, bus, (dev<<3)|func, reg, 1, data);
 }
=20
 void pci_conf_write16(
-    unsigned int bus, unsigned int dev, unsigned int func, unsigned int =
reg,
-    uint16_t data)
+    unsigned int seg, unsigned int bus, unsigned int dev, unsigned int =
func,
+    unsigned int reg, uint16_t data)
 {
-    BUG_ON((bus > 255) || (dev > 31) || (func > 7) || (reg > 255));
-    pci_sal_write(0, bus, (dev<<3)|func, reg, 2, data);
+    BUG_ON((seg > 65535) || (bus > 255) || (dev > 31) || (func > 7) || =
(reg > 255));
+    pci_sal_write(seg, bus, (dev<<3)|func, reg, 2, data);
 }
=20
 void pci_conf_write32(
-    unsigned int bus, unsigned int dev, unsigned int func, unsigned int =
reg,
-    uint32_t data)
+    unsigned int seg, unsigned int bus, unsigned int dev, unsigned int =
func,
+    unsigned int reg, uint32_t data)
 {
-    BUG_ON((bus > 255) || (dev > 31) || (func > 7) || (reg > 255));
-    pci_sal_write(0, bus, (dev<<3)|func, reg, 4, data);
+    BUG_ON((seg > 65535) || (bus > 255) || (dev > 31) || (func > 7) || =
(reg > 255));
+    pci_sal_write(seg, bus, (dev<<3)|func, reg, 4, data);
 }
=20
 int pci_find_ext_capability(int seg, int bus, int devfn, int cap)
--- a/xen/arch/ia64/xen/tlb_track.c
+++ b/xen/arch/ia64/xen/tlb_track.c
@@ -22,6 +22,7 @@
=20
 #include <asm/tlb_track.h>
 #include <asm/p2m_entry.h>
+#include <xen/grant_table.h>
 #include <asm/vmx_mm_def.h>  /* for IA64_RR_SHIFT */
 #include <asm/vmx_vcpu.h>    /* for VRN7 */
 #include <asm/vcpu.h>        /* for PSCB() */
--- a/xen/arch/ia64/xen/vhpt.c
+++ b/xen/arch/ia64/xen/vhpt.c
@@ -516,7 +516,7 @@ void domain_flush_tlb_vhpt(struct domain
 		on_each_cpu((void (*)(void *))local_flush_tlb_all, NULL, =
1);
 	else
 		on_each_cpu((void (*)(void *))flush_tlb_vhpt_all, d, 1);
-	cpumask_clear_cpu(d->domain_dirty_cpumask);
+	cpumask_clear(d->domain_dirty_cpumask);
 }
=20
 void flush_tlb_for_log_dirty(struct domain *d)
@@ -545,7 +545,7 @@ void flush_tlb_for_log_dirty(struct doma
 	} else {
 		on_each_cpu((void (*)(void *))flush_tlb_vhpt_all, d, 1);
 	}
-	cpumask_clear_cpu(d->domain_dirty_cpumask);
+	cpumask_clear(d->domain_dirty_cpumask);
 }
=20
 void flush_tlb_mask(const cpumask_t *mask)
--- a/xen/arch/x86/domctl.c
+++ b/xen/arch/x86/domctl.c
@@ -27,7 +27,7 @@
 #include <asm/hvm/cacheattr.h>
 #include <asm/processor.h>
 #include <asm/acpi.h> /* for hvm_acpi_power_button */
-#include <asm/hypercall.h> /* for arch_do_domctl */
+#include <xen/hypercall.h> /* for arch_do_domctl */
 #include <xsm/xsm.h>
 #include <xen/iommu.h>
 #include <asm/mem_event.h>
--- a/xen/common/event_channel.c
+++ b/xen/common/event_channel.c
@@ -365,8 +365,10 @@ static long evtchn_bind_pirq(evtchn_bind
=20
     bind->port =3D port;
=20
+#ifdef CONFIG_X86
     if ( is_hvm_domain(d) && domain_pirq_to_irq(d, pirq) > 0 )
         map_domain_emuirq_pirq(d, pirq, IRQ_PT);
+#endif
=20
  out:
     spin_unlock(&d->event_lock);
@@ -421,8 +423,10 @@ static long __evtchn_close(struct domain
         pirq->evtchn =3D 0;
         pirq_cleanup_check(pirq, d1);
         unlink_pirq_port(chn1, d1->vcpu[chn1->notify_vcpu_id]);
+#ifdef CONFIG_X86
         if ( is_hvm_domain(d1) && domain_pirq_to_irq(d1, pirq->pirq) > 0 =
)
             unmap_domain_pirq_emuirq(d1, pirq->pirq);
+#endif
         break;
     }
=20
--- a/xen/common/page_alloc.c
+++ b/xen/common/page_alloc.c
@@ -42,7 +42,12 @@
 #include <asm/page.h>
 #include <asm/numa.h>
 #include <asm/flushtlb.h>
+#ifdef CONFIG_X86
 #include <asm/p2m.h>
+#else
+#define p2m_pod_offline_or_broken_hit(pg) 0
+#define p2m_pod_offline_or_broken_replace(pg) BUG_ON(pg !=3D NULL)
+#endif
=20
 /*
  * Comma-separated list of hexadecimal page numbers containing bad bytes.
--- a/xen/drivers/passthrough/vtd/dmar.c
+++ b/xen/drivers/passthrough/vtd/dmar.c
@@ -809,6 +809,7 @@ int platform_supports_intremap(void)
     return ((dmar_flags & flags) =3D=3D DMAR_INTR_REMAP);
 }
=20
+#ifdef CONFIG_X86
 int platform_supports_x2apic(void)
 {
     unsigned int flags =3D 0;
@@ -819,3 +820,4 @@ int platform_supports_x2apic(void)
     flags =3D DMAR_INTR_REMAP | DMAR_X2APIC_OPT_OUT;
     return ((dmar_flags & flags) =3D=3D DMAR_INTR_REMAP);
 }
+#endif
--- a/xen/drivers/passthrough/vtd/intremap.c
+++ b/xen/drivers/passthrough/vtd/intremap.c
@@ -47,8 +47,8 @@
 })
 #define __ioapic_write_entry(apic, pin, raw, ent) ({ \
     ASSERT(raw); \
-    __io_apic_write(apic, 0x10 + 2 * (pin), ((u32 *)&_e_)[0]); \
-    __io_apic_write(apic, 0x11 + 2 * (pin), ((u32 *)&_e_)[1]); \
+    __io_apic_write(apic, 0x10 + 2 * (pin), ((u32 *)&(ent))[0]); \
+    __io_apic_write(apic, 0x11 + 2 * (pin), ((u32 *)&(ent))[1]); \
 })
 #else
 #include <asm/apic.h>
@@ -392,7 +392,7 @@ unsigned int io_apic_read_remap_rte(
         ( (index =3D apic_pin_2_ir_idx[apic][ioapic_pin]) < 0 ) )
         return __io_apic_read(apic, reg);
=20
-    old_rte =3D __ioapic_read_entry(apic, ioapic_pin, TRUE);
+    old_rte =3D __ioapic_read_entry(apic, ioapic_pin, 1);
=20
     if ( remap_entry_to_ioapic_rte(iommu, index, &old_rte) )
         return __io_apic_read(apic, reg);
@@ -420,7 +420,7 @@ void io_apic_write_remap_rte(
         return;
     }
=20
-    old_rte =3D __ioapic_read_entry(apic, ioapic_pin, TRUE);
+    old_rte =3D __ioapic_read_entry(apic, ioapic_pin, 1);
=20
     remap_rte =3D (struct IO_APIC_route_remap_entry *) &old_rte;
=20
@@ -440,7 +440,7 @@ void io_apic_write_remap_rte(
             __io_apic_write(apic, reg & ~1, *(u32 *)&old_rte);
     }
     else
-        __ioapic_write_entry(apic, ioapic_pin, TRUE, old_rte);
+        __ioapic_write_entry(apic, ioapic_pin, 1, old_rte);
 }
=20
 #if defined(__i386__) || defined(__x86_64__)
@@ -838,6 +838,8 @@ out:
     spin_unlock_irqrestore(&iommu->register_lock, flags);
 }
=20
+#ifndef __ia64__
+
 /*
  * This function is used to enable Interrupt remapping when
  * enable x2apic
@@ -912,3 +914,5 @@ void iommu_disable_x2apic_IR(void)
     for_each_drhd_unit ( drhd )
         disable_qinval(drhd->iommu);
 }
+
+#endif /* !__ia64__ */
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -33,9 +33,11 @@
 #include <xen/keyhandler.h>
 #include <asm/msi.h>
 #include <asm/irq.h>
+#ifndef __ia64__
 #include <asm/hvm/vmx/vmx.h>
 #include <asm/p2m.h>
 #include <mach_apic.h>
+#endif
 #include "iommu.h"
 #include "dmar.h"
 #include "extern.h"
@@ -990,7 +992,11 @@ static unsigned int dma_msi_startup(stru
     return 0;
 }
=20
+#ifndef __ia64__
 static void dma_msi_end(struct irq_desc *desc, u8 vector)
+#else
+static void dma_msi_end(struct irq_desc *desc)
+#endif
 {
     dma_msi_unmask(desc);
     ack_APIC_irq();
@@ -1790,6 +1796,7 @@ void iommu_pte_flush(struct domain *d, u
=20
 static int vtd_ept_page_compatible(struct iommu *iommu)
 {
+#ifndef __ia64__
     u64 ept_cap, vtd_cap =3D iommu->cap;
=20
     /* EPT is not initialised yet, so we must check the capability in
@@ -1799,6 +1806,9 @@ static int vtd_ept_page_compatible(struc
=20
     return ( ept_has_2mb(ept_cap) =3D=3D cap_sps_2mb(vtd_cap)=20
              && ept_has_1gb(ept_cap) =3D=3D cap_sps_1gb(vtd_cap) );
+#else
+    return 0;
+#endif
 }
=20
 /*
@@ -1806,6 +1816,7 @@ static int vtd_ept_page_compatible(struc
  */
 void iommu_set_pgd(struct domain *d)
 {
+#ifndef __ia64__
     struct hvm_iommu *hd  =3D domain_hvm_iommu(d);
     mfn_t pgd_mfn;
=20
@@ -1816,6 +1827,7 @@ void iommu_set_pgd(struct domain *d)
=20
     pgd_mfn =3D pagetable_get_mfn(p2m_get_pagetable(p2m_get_hostp2m(d)));
     hd->pgd_maddr =3D pagetable_get_paddr(pagetable_from_mfn(pgd_mfn));
+#endif
 }
=20
 static int rmrr_identity_mapping(struct domain *d,
@@ -2107,7 +2119,7 @@ int __init intel_vtd_setup(void)
             iommu_intremap =3D 0;
=20
         if ( !vtd_ept_page_compatible(iommu) )
-            iommu_hap_pt_share =3D FALSE;
+            iommu_hap_pt_share =3D 0;
=20
         ret =3D iommu_set_interrupt(iommu);
         if ( ret < 0 )
--- a/xen/include/asm-ia64/config.h
+++ b/xen/include/asm-ia64/config.h
@@ -211,10 +211,6 @@ void sort_main_extable(void);
 // see common/keyhandler.c
 #define	nop()	asm volatile ("nop 0")
=20
-// from include/linux/preempt.h (needs including from interrupt.h or =
smp.h)
-#define preempt_enable()	do { } while (0)
-#define preempt_disable()	do { } while (0)
-
 // needed for include/xen/linuxtime.h
 typedef s64 time_t;
 typedef s64 suseconds_t;
--- a/xen/include/asm-ia64/domain.h
+++ b/xen/include/asm-ia64/domain.h
@@ -317,12 +317,8 @@ struct arch_vcpu {
     cpumask_t cache_coherent_map;
 };
=20
-struct arch_pirq {
-    struct hvm_pirq_dpci dpci;
-};
-
 #define pirq_dpci(pirq) ((pirq) ? &(pirq)->arch.dpci : NULL)
-#define dpci_pirq(dpci) container_of(dpci, struct pirq, arch.dpci)
+#define dpci_pirq(dp) container_of(dp, struct pirq, arch.dpci)
=20
 #define alloc_pirq_struct(d) ({ \
     struct pirq *pirq =3D xmalloc(struct pirq); \
--- a/xen/include/asm-ia64/hvm/irq.h
+++ b/xen/include/asm-ia64/hvm/irq.h
@@ -22,7 +22,7 @@
 #ifndef __ASM_IA64_HVM_IRQ_H__
 #define __ASM_IA64_HVM_IRQ_H__
=20
-#include <xen/irq.h>
+#include <asm/irq.h>
=20
 #define VIOAPIC_NUM_PINS  48
=20
--- a/xen/include/asm-ia64/linux-xen/asm/hw_irq.h
+++ b/xen/include/asm-ia64/linux-xen/asm/hw_irq.h
@@ -79,8 +79,6 @@ enum {
 extern __u8 isa_irq_to_vector_map[16];
 #define isa_irq_to_vector(x)	isa_irq_to_vector_map[(x)]
=20
-extern hw_irq_controller irq_type_ia64_lsapic;	/* CPU-internal interrupt =
controller */
-
 extern int assign_irq_vector (int irq);	/* allocate a free vector =
*/
 extern void free_irq_vector (int vector);
 extern void ia64_send_ipi (int cpu, int vector, int delivery_mode, int =
redirect);
--- a/xen/include/asm-ia64/linux-xen/asm/irq.h
+++ b/xen/include/asm-ia64/linux-xen/asm/irq.h
@@ -15,11 +15,18 @@
 #define NR_IRQS		256
=20
 #ifdef XEN
+#include <xen/hvm/irq.h>
+
 struct arch_irq_desc {
         int  vector;
+	unsigned int depth;
         cpumask_var_t cpu_mask;
 };
=20
+struct arch_pirq {
+	struct hvm_pirq_dpci dpci;
+};
+
 int init_irq_data(void);
 #endif
=20
@@ -66,6 +73,8 @@ extern int request_irq_vector(unsigned i
     while(!x)
=20
 #define domain_pirq_to_irq(d, irq) domain_irq_to_vector(d, irq)
+
+#define hvm_domain_use_pirq(d, info) 0
 #endif
=20
 #endif /* _ASM_IA64_IRQ_H */
--- a/xen/include/asm-ia64/linux-xen/asm/spinlock.h
+++ b/xen/include/asm-ia64/linux-xen/asm/spinlock.h
@@ -35,6 +35,17 @@ typedef struct {
 } raw_rwlock_t;
 #define _RAW_RW_LOCK_UNLOCKED /*(raw_rwlock_t)*/ { 0, 0 }
=20
+#define _raw_read_lock(rw)							=
	\
+do {										=
	\
+	raw_rwlock_t *__read_lock_ptr =3D (rw);					=
	\
+										=
	\
+	while (unlikely(ia64_fetchadd(1, (int *) __read_lock_ptr, acq) < =
0)) {		\
+		ia64_fetchadd(-1, (int *) __read_lock_ptr, rel);		=
	\
+		while (*(volatile int *)__read_lock_ptr < 0)			=
	\
+			cpu_relax();						=
	\
+	}									=
	\
+} while (0)
+
 #define _raw_read_unlock(rw)					\
 do {								\
 	raw_rwlock_t *__read_lock_ptr =3D (rw);			\
@@ -68,7 +79,14 @@ do {								=
\
=20
 #endif /* !ASM_SUPPORTED */
=20
-#define _raw_read_trylock(lock) generic_raw_read_trylock(lock)
+#define _raw_read_trylock(rw) ({					\
+	raw_rwlock_t *__read_lock_ptr =3D (rw);				\
+	int orig =3D ia64_fetchadd(1, (int *) __read_lock_ptr, acq);	\
+									\
+	if (unlikely(orig < 0))						\
+		ia64_fetchadd(-1, (int *) __read_lock_ptr, rel);	\
+	(orig >=3D 0);							\
+})
=20
 #define _raw_write_unlock(x)							=
	\
 ({										=
	\
--- a/xen/include/asm-ia64/linux-xen/linux/hardirq.h
+++ b/xen/include/asm-ia64/linux-xen/linux/hardirq.h
@@ -107,7 +107,8 @@ static inline void account_system_vtime(
 #define irq_enter()					\
 	do {						\
 		account_system_vtime(current);		\
-		add_preempt_count(HARDIRQ_OFFSET);	\
+		/*add_preempt_count(HARDIRQ_OFFSET);*/	\
+		preempt_count() +=3D HARDIRQ_OFFSET;	\
 	} while (0)
=20
 extern void irq_exit(void);
--- a/xen/include/asm-ia64/xenoprof.h
+++ b/xen/include/asm-ia64/xenoprof.h
@@ -24,6 +24,8 @@
 #ifndef __ASM_XENOPROF_H__
 #define __ASM_XENOPROF_H__
=20
+#include <xen/grant_table.h>
+
 int xenoprof_arch_init(int *num_events, char *cpu_type);
 int xenoprof_arch_reserve_counters(void);
 int xenoprof_arch_counter(XEN_GUEST_HANDLE(void) arg);
--- a/xen/include/asm-x86/hypercall.h
+++ b/xen/include/asm-x86/hypercall.h
@@ -7,7 +7,6 @@
=20
 #include <public/physdev.h>
 #include <public/arch-x86/xen-mca.h> /* for do_mca */
-#include <public/domctl.h> /* for arch_do_domctl */
 #include <xen/types.h>
=20
 /*
@@ -97,11 +96,6 @@ arch_do_vcpu_op(
     int cmd, struct vcpu *v, XEN_GUEST_HANDLE(void) arg);
=20
 extern long
-arch_do_domctl(
-    struct xen_domctl *domctl,
-    XEN_GUEST_HANDLE(xen_domctl_t) u_domctl);
-
-extern long
 arch_do_sysctl(
     struct xen_sysctl *op,=20
     XEN_GUEST_HANDLE(xen_sysctl_t) u_sysctl);
--- a/xen/include/xen/acpi.h
+++ b/xen/include/xen/acpi.h
@@ -360,7 +360,9 @@ static inline unsigned int acpi_get_csta
 static inline void acpi_set_cstate_limit(unsigned int new_limit) { =
return; }
 #endif
=20
+#ifdef XEN_GUEST_HANDLE
 int acpi_set_pdc_bits(u32 acpi_id, XEN_GUEST_HANDLE(uint32));
+#endif
 int arch_acpi_set_pdc_bits(u32 acpi_id, u32 *, u32 mask);
=20
 #ifdef CONFIG_ACPI_NUMA
--- a/xen/include/xen/efi.h
+++ b/xen/include/xen/efi.h
@@ -1,10 +1,12 @@
 #ifndef __XEN_EFI_H__
 #define __XEN_EFI_H__
=20
+#ifndef __ASSEMBLY__
 #include <xen/types.h>
+#endif
=20
 #if defined(__ia64__)
-# #include <linux/efi.h>
+# include_next <linux/efi.h>
 #else
=20
 # if defined(__i386__)
@@ -27,6 +29,8 @@ extern struct efi efi;
=20
 #endif
=20
+#ifndef __ASSEMBLY__
+
 union xenpf_efi_info;
 union compat_pf_efi_info;
=20
@@ -44,4 +48,6 @@ int efi_runtime_call(struct xenpf_efi_ru
 int efi_compat_get_info(uint32_t idx, union compat_pf_efi_info *);
 int efi_compat_runtime_call(struct compat_pf_efi_runtime_call *);
=20
+#endif /* !__ASSEMBLY__ */
+
 #endif /* __XEN_EFI_H__ */
--- a/xen/include/xen/hypercall.h
+++ b/xen/include/xen/hypercall.h
@@ -36,6 +36,11 @@ do_domctl(
     XEN_GUEST_HANDLE(xen_domctl_t) u_domctl);
=20
 extern long
+arch_do_domctl(
+    struct xen_domctl *domctl,
+    XEN_GUEST_HANDLE(xen_domctl_t) u_domctl);
+
+extern long
 do_sysctl(
     XEN_GUEST_HANDLE(xen_sysctl_t) u_sysctl);
=20
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -35,7 +35,11 @@ extern bool_t iommu_debug;
 extern bool_t amd_iommu_perdev_intremap;
=20
 /* Does this domain have a P2M table we can use as its IOMMU pagetable? =
*/
+#ifndef __ia64__
 #define iommu_use_hap_pt(d) (hap_enabled(d) && iommu_hap_pt_share)
+#else
+#define iommu_use_hap_pt(d) 0
+#endif
=20
 extern struct rangeset *mmio_ro_ranges;
=20
--- a/xen/include/xen/irq.h
+++ b/xen/include/xen/irq.h
@@ -27,6 +27,7 @@ struct irqaction {
 #define IRQ_GUEST         (1u<<4) /* IRQ is handled by guest OS(es) */
 #define IRQ_MOVE_PENDING  (1u<<5) /* IRQ is migrating to another CPUs */
 #define IRQ_PER_CPU       (1u<<6) /* IRQ is per CPU */
+#define IRQ_GUEST_EOI_PENDING (1u<<7) /* IRQ was disabled, pending a =
guest EOI */
=20
 /* Special IRQ numbers. */
 #define AUTO_ASSIGN_IRQ         (-1)
@@ -46,7 +47,11 @@ struct hw_interrupt_type {
     void (*enable)(struct irq_desc *);
     void (*disable)(struct irq_desc *);
     void (*ack)(struct irq_desc *);
+#ifdef CONFIG_X86
     void (*end)(struct irq_desc *, u8 vector);
+#else
+    void (*end)(struct irq_desc *);
+#endif
     void (*set_affinity)(struct irq_desc *, const cpumask_t *);
 };
=20
--- a/xen/include/xen/pci.h
+++ b/xen/include/xen/pci.h
@@ -39,7 +39,9 @@ struct pci_dev_info {
         u8 bus;
         u8 devfn;
     } physfn;
-   vmask_t used_vectors;=20
+#ifdef CONFIG_X86
+    vmask_t used_vectors;
+#endif
 };
=20
 struct pci_dev {
--- a/xen/include/xsm/xsm.h
+++ b/xen/include/xsm/xsm.h
@@ -109,6 +109,10 @@ struct xsm_operations {
     int (*add_range) (struct domain *d, char *name, unsigned long s, =
unsigned long e);
     int (*remove_range) (struct domain *d, char *name, unsigned long s, =
unsigned long e);
=20
+    int (*test_assign_device) (uint32_t machine_bdf);
+    int (*assign_device) (struct domain *d, uint32_t machine_bdf);
+    int (*deassign_device) (struct domain *d, uint32_t machine_bdf);
+
     long (*__do_xsm_op) (XEN_GUEST_HANDLE(xsm_op_t) op);
=20
 #ifdef CONFIG_X86
@@ -146,9 +150,6 @@ struct xsm_operations {
 			      struct page_info *page);
     int (*add_to_physmap) (struct domain *d1, struct domain *d2);
     int (*sendtrigger) (struct domain *d);
-    int (*test_assign_device) (uint32_t machine_bdf);
-    int (*assign_device) (struct domain *d, uint32_t machine_bdf);
-    int (*deassign_device) (struct domain *d, uint32_t machine_bdf);
     int (*bind_pt_irq) (struct domain *d, struct xen_domctl_bind_pt_irq =
*bind);
     int (*pin_mem_cacheattr) (struct domain *d);
     int (*ext_vcpucontext) (struct domain *d, uint32_t cmd);
@@ -428,6 +429,21 @@ static inline int xsm_remove_range (stru
     return xsm_call(remove_range(d, name, s, e));
 }
=20
+static inline int xsm_test_assign_device(uint32_t machine_bdf)
+{
+    return xsm_call(test_assign_device(machine_bdf));
+}
+
+static inline int xsm_assign_device(struct domain *d, uint32_t machine_bdf=
)
+{
+    return xsm_call(assign_device(d, machine_bdf));
+}
+
+static inline int xsm_deassign_device(struct domain *d, uint32_t =
machine_bdf)
+{
+    return xsm_call(deassign_device(d, machine_bdf));
+}
+
 static inline long __do_xsm_op (XEN_GUEST_HANDLE(xsm_op_t) op)
 {
 #ifdef XSM_ENABLE
@@ -612,21 +628,6 @@ static inline int xsm_sendtrigger(struct
     return xsm_call(sendtrigger(d));
 }
=20
-static inline int xsm_test_assign_device(uint32_t machine_bdf)
-{
-    return xsm_call(test_assign_device(machine_bdf));
-}
-
-static inline int xsm_assign_device(struct domain *d, uint32_t machine_bdf=
)
-{
-    return xsm_call(assign_device(d, machine_bdf));
-}
-
-static inline int xsm_deassign_device(struct domain *d, uint32_t =
machine_bdf)
-{
-    return xsm_call(deassign_device(d, machine_bdf));
-}
-
 static inline int xsm_bind_pt_irq(struct domain *d,=20
                                                 struct xen_domctl_bind_pt_=
irq *bind)
 {



--=__PartEFC0113E.0__=
Content-Type: text/plain; name="ia64-build.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="ia64-build.patch"

ia64: fix the build=0A=0AThis addresses all remaining build problems =
introduced over the last=0Aseveral months.=0A=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- a/xen/arch/ia64/linux-xen/iosapic.c=0A+++ =
b/xen/arch/ia64/linux-xen/iosapic.c=0A@@ -275,12 +275,6 @@ set_rte =
(unsigned int gsi, unsigned int =0A 	iosapic_intr_info[vector].dest =3D =
dest;=0A }=0A =0A-static void=0A-nop (struct irq_desc *desc)=0A-{=0A-	/* =
do nothing... */=0A-}=0A-=0A void=0A kexec_disable_iosapic(void)=0A {=0A@@ =
-428,7 +422,7 @@ iosapic_end_level_irq (struct irq_desc *=0A #define =
iosapic_shutdown_level_irq	mask_irq=0A #define iosapic_enable_level_ir=
q	unmask_irq=0A #define iosapic_disable_level_irq	mask_irq=0A-#define=
 iosapic_ack_level_irq		nop=0A+#define iosapic_ack_level_irq		=
irq_actor_none=0A =0A static hw_irq_controller irq_type_iosapic_level =3D =
{=0A 	.typename =3D	"IO-SAPIC-level",=0A@@ -446,9 +440,9 @@ static =
hw_irq_controller irq_type_iosapi=0A  */=0A =0A static unsigned int=0A-iosa=
pic_startup_edge_irq (unsigned int irq)=0A+iosapic_startup_edge_irq =
(struct irq_desc *desc)=0A {=0A-	unmask_irq(irq);=0A+	unmask_irq(=
desc);=0A 	/*=0A 	 * IOSAPIC simply drops interrupts pended while =
the=0A 	 * corresponding pin was masked, so we can't know if an=0A@@ =
-458,23 +452,21 @@ iosapic_startup_edge_irq (unsigned int i=0A }=0A =0A =
static void=0A-iosapic_ack_edge_irq (unsigned int irq)=0A+iosapic_ack_edge_=
irq (struct irq_desc *desc)=0A {=0A-	irq_desc_t *idesc =3D irq_descp(irq=
);=0A-=0A-	move_irq(irq);=0A+	move_irq(idesc->irq);=0A 	=
/*=0A 	 * Once we have recorded IRQ_PENDING already, we can mask the=0A 	=
 * interrupt for real. This prevents IRQ storms from unhandled=0A 	 * =
devices.=0A 	 */=0A-	if ((idesc->status & (IRQ_PENDING|IRQ_DISABLED)) =
=3D=3D (IRQ_PENDING|IRQ_DISABLED))=0A-		mask_irq(irq);=0A+	if =
((desc->status & (IRQ_PENDING|IRQ_DISABLED)) =3D=3D (IRQ_PENDING|IRQ_DISABL=
ED))=0A+		mask_irq(desc);=0A }=0A =0A #define iosapic_enable_=
edge_irq		unmask_irq=0A-#define iosapic_disable_edge_irq	=
nop=0A-#define iosapic_end_edge_irq		nop=0A+#define iosapic_disa=
ble_edge_irq	irq_disable_none=0A+#define iosapic_end_edge_irq		=
irq_actor_none=0A =0A static hw_irq_controller irq_type_iosapic_edge =3D =
{=0A 	.typename =3D	"IO-SAPIC-edge",=0A--- a/xen/arch/ia64/linux-xen/ir=
q_ia64.c=0A+++ b/xen/arch/ia64/linux-xen/irq_ia64.c=0A@@ -242,6 +242,16 @@ =
static struct irqaction __read_mostly ip=0A };=0A #endif=0A =0A+static =
hw_irq_controller irq_type_ia64_lsapic =3D {=0A+	.typename =3D	=
"LSAPIC",=0A+	.startup =3D	irq_startup_none,=0A+	.shutdown =3D	=
irq_shutdown_none,=0A+	.enable =3D	irq_enable_none,=0A+	.disable =
=3D	irq_disable_none,=0A+	.ack =3D		irq_actor_none,=0A+=
	.end =3D		irq_actor_none=0A+};=0A+=0A void=0A =
register_percpu_irq (ia64_vector vec, struct irqaction *action)=0A {=0A--- =
a/xen/arch/ia64/linux-xen/mca.c=0A+++ b/xen/arch/ia64/linux-xen/mca.c=0A@@ =
-428,9 +428,9 @@ void disable_irq_nosync(unsigned int irq=0A 		=
return;=0A =0A 	spin_lock_irqsave(&desc->lock, flags);=0A-	if =
(!desc->depth++) {=0A+	if (!desc->arch.depth++) {=0A 		desc->statu=
s |=3D IRQ_DISABLED;=0A-		desc->handler->disable(irq);=0A+	=
	desc->handler->disable(desc);=0A 	}=0A 	spin_unlock_irqrest=
ore(&desc->lock, flags);=0A }=0A@@ -456,7 +456,7 @@ void enable_irq(unsigne=
d int irq)=0A 		return;=0A =0A 	spin_lock_irqsave(&desc->lock, =
flags);=0A-	switch (desc->depth) {=0A+	switch (desc->arch.depth) =
{=0A 	case 0:=0A 		WARN_ON(1);=0A 		break;=0A@@ =
-468,11 +468,11 @@ void enable_irq(unsigned int irq)=0A 			=
desc->status =3D status | IRQ_REPLAY;=0A 			hw_resend_i=
rq(desc->handler,irq);=0A 		}=0A-		desc->handler->enab=
le(irq);=0A+		desc->handler->enable(desc);=0A 		/* =
fall-through */=0A 	}=0A 	default:=0A-		desc->depth--;=0A+	=
	desc->arch.depth--;=0A 	}=0A 	spin_unlock_irqrestore(&desc->lock,=
 flags);=0A }=0A--- a/xen/arch/ia64/linux-xen/sn/kernel/irq.c=0A+++ =
b/xen/arch/ia64/linux-xen/sn/kernel/irq.c=0A@@ -72,6 +72,7 @@ void =
sn_intr_free(nasid_t local_nasid, i=0A 			(u64) sn_irq_info->=
irq_cookie, 0, 0);=0A }=0A =0A+#ifndef XEN=0A static unsigned int =
sn_startup_irq(unsigned int irq)=0A {=0A 	return 0;=0A@@ -88,9 =
+89,16 @@ static void sn_disable_irq(unsigned int =0A static void =
sn_enable_irq(unsigned int irq)=0A {=0A }=0A+#endif=0A =0A+#ifdef =
XEN=0A+static void sn_ack_irq(struct irq_desc *desc)=0A+{=0A+	unsigned =
int irq =3D desc->irq;=0A+#else=0A static void sn_ack_irq(unsigned int =
irq)=0A {=0A+#endif=0A 	u64 event_occurred, mask;=0A =0A 	irq =3D =
irq & 0xff;=0A@@ -102,8 +110,14 @@ static void sn_ack_irq(unsigned int =
irq)=0A 	move_native_irq(irq);=0A }=0A =0A+#ifdef XEN=0A+static =
void sn_end_irq(struct irq_desc *desc)=0A+{=0A+	unsigned int irq =3D =
desc->irq;=0A+#else=0A static void sn_end_irq(unsigned int irq)=0A =
{=0A+#endif=0A 	int ivec;=0A 	u64 event_occurred;=0A =0A@@ -224,13 =
+238,17 @@ static void sn_set_affinity_irq(unsigned=0A static hw_irq_contro=
ller irq_type_sn =3D {=0A #ifndef XEN=0A 	.name		=3D "SN =
hub",=0A-#else=0A-	.typename	=3D "SN hub",=0A-#endif=0A 	=
.startup	=3D sn_startup_irq,=0A 	.shutdown	=3D sn_shutdown_irq=
,=0A 	.enable		=3D sn_enable_irq,=0A 	.disable	=3D =
sn_disable_irq,=0A+#else=0A+	.typename	=3D "SN hub",=0A+	=
.startup	=3D irq_startup_none,=0A+	.shutdown	=3D =
irq_shutdown_none,=0A+	.enable		=3D irq_enable_none,=0A+	=
.disable	=3D irq_disable_none,=0A+#endif=0A 	.ack		=
=3D sn_ack_irq,=0A 	.end		=3D sn_end_irq,=0A #ifndef =
XEN=0A--- a/xen/arch/ia64/linux/Makefile=0A+++ b/xen/arch/ia64/linux/Makefi=
le=0A@@ -9,7 +9,6 @@ obj-y +=3D efi_stub.o=0A obj-y +=3D extable.o=0A =
obj-y +=3D flush.o=0A obj-y +=3D hpsim.o=0A-obj-y +=3D irq_lsapic.o=0A =
obj-y +=3D linuxextable.o=0A obj-y +=3D machvec.o=0A obj-y +=3D memcpy_mck.=
o=0A--- a/xen/arch/ia64/linux/README.origin=0A+++ b/xen/arch/ia64/linux/REA=
DME.origin=0A@@ -7,7 +7,6 @@ the instructions in the README there.=0A =
efi_stub.S		-> linux/arch/ia64/kernel/efi_stub.S=0A extable.c	=
	-> linux/arch/ia64/mm/extable.c=0A hpsim.S			-> =
linux/arch/ia64/hp/sim/hpsim.S=0A-irq_lsapic.c		-> linux/arch/ia64/=
kernel/irq_lsapic.c=0A linuxextable.c		-> linux/kernel/extable.c=
=0A machvec.c		-> linux/arch/ia64/kernel/machvec.c=0A numa.c		=
	-> linux/arch/ia64/mm/numa.c=0A--- a/xen/arch/ia64/linux/irq_lsapic=
.c=0A+++ /dev/null=0A@@ -1,37 +0,0 @@=0A-/*=0A- * LSAPIC Interrupt =
Controller=0A- *=0A- * This takes care of interrupts that are generated by =
the CPU's=0A- * internal Streamlined Advanced Programmable Interrupt =
Controller=0A- * (LSAPIC), such as the ITC and IPI interrupts.=0A-    =
*=0A- * Copyright (C) 1999 VA Linux Systems=0A- * Copyright (C) 1999 Walt =
Drummond <drummond@valinux.com>=0A- * Copyright (C) 2000 Hewlett-Packard =
Co=0A- * Copyright (C) 2000 David Mosberger-Tang <davidm@hpl.hp.com>=0A- =
*/=0A-=0A-#include <linux/sched.h>=0A-#include <linux/irq.h>=0A-=0A-static =
unsigned int=0A-lsapic_noop_startup (unsigned int irq)=0A-{=0A-	return =
0;=0A-}=0A-=0A-static void=0A-lsapic_noop (unsigned int irq)=0A-{=0A-	/* =
nuthing to do... */=0A-}=0A-=0A-hw_irq_controller irq_type_ia64_lsapic =3D =
{=0A-	.typename =3D	"LSAPIC",=0A-	.startup =3D	lsapic_noop_startup=
,=0A-	.shutdown =3D	lsapic_noop,=0A-	.enable =3D	lsapic_noop=
,=0A-	.disable =3D	lsapic_noop,=0A-	.ack =3D		=
lsapic_noop,=0A-	.end =3D		lsapic_noop=0A-};=0A--- =
a/xen/arch/ia64/xen/dom0_ops.c=0A+++ b/xen/arch/ia64/xen/dom0_ops.c=0A@@ =
-17,6 +17,7 @@=0A #include <asm/pdb.h>=0A #include <xen/trace.h>=0A =
#include <xen/console.h>=0A+#include <xen/grant_table.h>=0A #include =
<xen/guest_access.h>=0A #include <xen/pci.h>=0A #include <asm/vmx.h>=0A--- =
a/xen/arch/ia64/xen/domain.c=0A+++ b/xen/arch/ia64/xen/domain.c=0A@@ -23,6 =
+23,7 @@=0A #include <xen/delay.h>=0A #include <xen/softirq.h>=0A #include =
<xen/mm.h>=0A+#include <xen/grant_table.h>=0A #include <xen/iocap.h>=0A =
#include <asm/asm-xsi-offsets.h>=0A #include <asm/system.h>=0A--- =
a/xen/arch/ia64/xen/fw_emul.c=0A+++ b/xen/arch/ia64/xen/fw_emul.c=0A@@ =
-31,7 +31,7 @@=0A #include <asm/vcpu.h>=0A #include <asm/vmx_vcpu.h>=0A =
#include <asm/dom_fw.h>=0A-#include <asm/uaccess.h>=0A+#include <xen/guest_=
access.h>=0A #include <xen/console.h>=0A #include <xen/hypercall.h>=0A =
#include <xen/softirq.h>=0A--- a/xen/arch/ia64/xen/hypercall.c=0A+++ =
b/xen/arch/ia64/xen/hypercall.c=0A@@ -70,7 +70,8 @@ static long __do_pirq_g=
uest_eoi(struct d=0A 		evtchn_unmask(pirq_to_evtchn(d, pirq));=0A =
		spin_unlock(&d->event_lock);=0A 	}=0A-	return =
pirq_guest_eoi(pirq);=0A+	pirq_guest_eoi(pirq_info(d, pirq));=0A+	=
return 0;=0A }=0A =0A long do_pirq_guest_eoi(int pirq)=0A--- a/xen/arch/ia6=
4/xen/irq.c=0A+++ b/xen/arch/ia64/xen/irq.c=0A@@ -95,8 +95,11 @@ int =
__init init_irq_data(void)=0A 		struct irq_desc *desc =3D =
irq_to_desc(irq);=0A =0A 		desc->irq =3D irq;=0A-		=
init_one_irq_desc(desc);=0A+		if (init_one_irq_desc(desc))=0A+	=
		BUG();=0A 	}=0A+=0A+	return 0;=0A }=0A =0A void =
__do_IRQ_guest(int irq);=0A@@ -105,14 +108,14 @@ void __do_IRQ_guest(int =
irq);=0A  * Special irq handlers.=0A  */=0A =0A-static void ack_none(unsign=
ed int irq)=0A+static void ack_none(struct irq_desc *desc)=0A {=0A /*=0A  =
* 'what should we do if we get a hw irq event on an illegal vector'.=0A  * =
each architecture has to answer this themselves, it doesn't deserve=0A  * =
a generic callback i think.=0A  */=0A-	printk(KERN_ERR "Unexpected irq =
vector 0x%x on CPU %u!\n", irq, smp_processor_id());=0A+	printk(KERN=
_ERR "Unexpected irq vector 0x%x on CPU %u!\n", desc->irq, smp_processor_id=
());=0A }=0A =0A hw_irq_controller no_irq_type =3D {=0A@@ -147,11 +150,11 =
@@ fastcall unsigned int __do_IRQ(unsigned =0A 		/*=0A 		 * =
No locking required for CPU-local interrupts:=0A 		 */=0A-		=
desc->handler->ack(irq);=0A+		desc->handler->ack(desc);=0A 		=
local_irq_enable();=0A 		desc->action->handler(irq, desc->action->de=
v_id, regs);=0A 		local_irq_disable();=0A-		=
desc->handler->end(irq);=0A+		desc->handler->end(desc);=0A 		=
return 1;=0A 	}=0A =0A@@ -163,7 +166,7 @@ fastcall unsigned int =
__do_IRQ(unsigned =0A 		return 1;=0A 	}=0A =0A-	desc->handl=
er->ack(irq);=0A+	desc->handler->ack(desc);=0A 	status =3D =
desc->status & ~IRQ_REPLAY;=0A 	status |=3D IRQ_PENDING; /* we _want_ to =
handle it */=0A =0A@@ -215,7 +218,7 @@ out:=0A 	 * The ->end() handler has =
to deal with interrupts which got=0A 	 * disabled while the handler was =
running.=0A 	 */=0A-	desc->handler->end(irq);=0A+	desc->handler->end(=
desc);=0A 	spin_unlock(&desc->lock);=0A =0A 	return 1;=0A@@ =
-248,10 +251,10 @@ int setup_vector(unsigned int vector, st=0A =0A 	*p =
=3D new;=0A =0A-	desc->depth =3D 0;=0A+	desc->arch.depth =3D 0;=0A =
	desc->status &=3D ~(IRQ_DISABLED | IRQ_INPROGRESS | IRQ_GUEST);=0A-=
	desc->handler->startup(vector);=0A-	desc->handler->enable(vecto=
r);=0A+	desc->handler->startup(desc);=0A+	desc->handler->enable(desc)=
;=0A 	desc->arch.vector =3D vector;=0A 	spin_unlock_irqrestore(&des=
c->lock,flags);=0A =0A@@ -287,9 +290,9 @@ void __init release_irq_vector(un=
signed =0A 	spin_lock_irqsave(&desc->lock, flags);=0A 	clear_bit(v=
ec, ia64_xen_vector);=0A 	desc->action =3D NULL;=0A-	desc->depth=
 =3D 1;=0A+	desc->arch.depth =3D 1;=0A 	desc->status |=3D =
IRQ_DISABLED;=0A-	desc->handler->shutdown(vec);=0A+	desc->handl=
er->shutdown(desc);=0A 	desc->arch.vector =3D -1;=0A 	spin_unlock_irqrest=
ore(&desc->lock, flags);=0A =0A@@ -336,7 +339,7 @@ static void _irq_guest_e=
oi(irq_desc_t *d=0A         clear_pirq_eoi(action->guest[i], vector);=0A =
=0A     desc->status &=3D ~(IRQ_INPROGRESS|IRQ_GUEST_EOI_PENDING);=0A-    =
desc->handler->enable(vector);=0A+    desc->handler->enable(desc);=0A }=0A =
=0A static struct timer irq_guest_eoi_timer[NR_IRQS];=0A@@ -383,7 +386,7 =
@@ void __do_IRQ_guest(int irq)=0A 	if ( already_pending =3D=3D =
action->nr_guests )=0A 	{=0A 		stop_timer(&irq_guest_eoi_timer[irq=
]);=0A-		desc->handler->disable(irq);=0A+		desc->handl=
er->disable(desc);=0A         desc->status |=3D IRQ_GUEST_EOI_PENDING;=0A  =
       for ( i =3D 0; i < already_pending; ++i )=0A         {=0A@@ -417,31 =
+420,28 @@ static int pirq_acktype(int irq)=0A     return ACKTYPE_NONE;=0A =
}=0A =0A-int pirq_guest_eoi(struct pirq *pirq)=0A+void pirq_guest_eoi(struc=
t pirq *pirq)=0A {=0A     irq_desc_t *desc;=0A     irq_guest_action_t =
*action;=0A =0A-    desc =3D &irq_desc[irq];=0A+    desc =3D &irq_desc[pirq=
->pirq];=0A     spin_lock_irq(&desc->lock);=0A     action =3D (irq_guest_ac=
tion_t *)desc->action;=0A =0A     if ( action->ack_type =3D=3D ACKTYPE_NONE=
 )=0A     {=0A         ASSERT(!pirq->masked);=0A-        stop_timer(&irq_gu=
est_eoi_timer[irq]);=0A+        stop_timer(&irq_guest_eoi_timer[pirq->pirq]=
);=0A         _irq_guest_eoi(desc);=0A     }=0A =0A     if ( test_and_clear=
_bool(pirq->masked) && (--action->in_flight =3D=3D 0) )=0A     {=0A        =
 ASSERT(action->ack_type =3D=3D ACKTYPE_UNMASK);=0A-        desc->handler->=
end(irq);=0A+        desc->handler->end(desc);=0A     }=0A     spin_unlock_=
irq(&desc->lock);=0A-=0A-    return 0;=0A-=0A }=0A =0A int pirq_guest_unmas=
k(struct domain *d)=0A@@ -505,12 +505,12 @@ int pirq_guest_bind(struct =
vcpu *v, stru=0A         action->nr_guests =3D 0;=0A         action->in_fli=
ght =3D 0;=0A         action->shareable =3D will_share;=0A-        =
action->ack_type  =3D pirq_acktype(irq);=0A+        action->ack_type  =3D =
pirq_acktype(pirq->pirq);=0A         =0A-        desc->depth =3D 0;=0A+    =
    desc->arch.depth =3D 0;=0A         desc->status |=3D IRQ_GUEST;=0A     =
    desc->status &=3D ~IRQ_DISABLED;=0A-        desc->handler->startup(pirq=
->pirq);=0A+        desc->handler->startup(desc);=0A =0A         /* =
Attempt to bind the interrupt target to the correct CPU. */=0A #if 0 /* =
FIXME CONFIG_SMP ??? */=0A@@ -549,9 +549,9 @@ int pirq_guest_bind(struct =
vcpu *v, stru=0A     return rc;=0A }=0A =0A-void pirq_guest_unbind(struct =
domain *d, int irq, struct pirq *pirq)=0A+void pirq_guest_unbind(struct =
domain *d, struct pirq *pirq)=0A {=0A-    irq_desc_t         *desc =3D =
&irq_desc[irq];=0A+    irq_desc_t         *desc =3D &irq_desc[pirq->pirq];=
=0A     irq_guest_action_t *action;=0A     unsigned long       flags;=0A   =
  int                 i;=0A@@ -569,17 +569,17 @@ void pirq_guest_unbind(str=
uct domain *d,=0A     if ( action->ack_type =3D=3D ACKTYPE_UNMASK )=0A     =
    if ( test_and_clear_bool(pirq->masked) &&=0A              (--action->in=
_flight =3D=3D 0) )=0A-            desc->handler->end(irq);=0A+            =
desc->handler->end(desc);=0A =0A     if ( !action->nr_guests )=0A     {=0A =
        BUG_ON(action->in_flight !=3D 0);=0A         desc->action =3D =
NULL;=0A         xfree(action);=0A-        desc->depth   =3D 1;=0A+        =
desc->arch.depth   =3D 1;=0A         desc->status |=3D IRQ_DISABLED;=0A    =
     desc->status &=3D ~IRQ_GUEST;=0A-        desc->handler->shutdown(irq);=
=0A+        desc->handler->shutdown(desc);=0A     }=0A =0A     spin_unlock_=
irqrestore(&desc->lock, flags);    =0A@@ -610,10 +610,24 @@ void pirq_set_a=
ffinity(struct domain *d,=0A 	/* FIXME */=0A }=0A =0A+void (pirq_cleanup_=
check)(struct pirq *pirq, struct domain *d)=0A+{=0A+    /*=0A+     * Check =
whether all fields have their default values, and delete=0A+     * the =
entry from the tree if so.=0A+     *=0A+     * NB: Common parts were =
already checked.=0A+     */=0A+    if ( !pt_pirq_cleanup_check(&pirq->arch.=
dpci) )=0A+        return;=0A+=0A+    if ( radix_tree_delete(&d->pirq_tree,=
 pirq->pirq) !=3D pirq )=0A+        BUG();=0A+}=0A /*=0A  * Exit an =
interrupt context. Process softirqs if needed and possible:=0A  */=0A void =
irq_exit(void)=0A {=0A-	sub_preempt_count(IRQ_EXIT_OFFSET);=0A+	preempt_cou=
nt() -=3D IRQ_EXIT_OFFSET;/* sub_preempt_count(IRQ_EXIT_OFFSET); */=0A =
}=0A--- a/xen/arch/ia64/xen/mm.c=0A+++ b/xen/arch/ia64/xen/mm.c=0A@@ =
-176,6 +176,7 @@=0A #include <asm/tlb_track.h>=0A #include <linux/efi.h>=0A=
 #include <linux/sort.h>=0A+#include <xen/grant_table.h>=0A #include =
<xen/guest_access.h>=0A #include <asm/page.h>=0A #include <asm/dom_fw_commo=
n.h>=0A--- a/xen/arch/ia64/xen/pci.c=0A+++ b/xen/arch/ia64/xen/pci.c=0A@@ =
-83,54 +83,57 @@ pci_sal_write (unsigned int seg, unsigne=0A =0A =0A =
uint8_t pci_conf_read8(=0A-    unsigned int bus, unsigned int dev, =
unsigned int func, unsigned int reg)=0A+    unsigned int seg, unsigned int =
bus, unsigned int dev, unsigned int func,=0A+    unsigned int reg)=0A {=0A =
    uint32_t value;=0A-    BUG_ON((bus > 255) || (dev > 31) || (func > 7) =
|| (reg > 255));=0A-    pci_sal_read(0, bus, (dev<<3)|func, reg, 1, =
&value);=0A+    BUG_ON((seg > 65535) || (bus > 255) || (dev > 31) || (func =
> 7) || (reg > 255));=0A+    pci_sal_read(seg, bus, (dev<<3)|func, reg, 1, =
&value);=0A     return (uint8_t)value;=0A }=0A =0A uint16_t pci_conf_read16=
(=0A-    unsigned int bus, unsigned int dev, unsigned int func, unsigned =
int reg)=0A+    unsigned int seg, unsigned int bus, unsigned int dev, =
unsigned int func,=0A+    unsigned int reg)=0A {=0A     uint32_t value;=0A-=
    BUG_ON((bus > 255) || (dev > 31) || (func > 7) || (reg > 255));=0A-    =
pci_sal_read(0, bus, (dev<<3)|func, reg, 2, &value);=0A+    BUG_ON((seg > =
65535) || (bus > 255) || (dev > 31) || (func > 7) || (reg > 255));=0A+    =
pci_sal_read(seg, bus, (dev<<3)|func, reg, 2, &value);=0A     return =
(uint16_t)value;=0A }=0A =0A uint32_t pci_conf_read32(=0A-    unsigned int =
bus, unsigned int dev, unsigned int func, unsigned int reg)=0A+    =
unsigned int seg, unsigned int bus, unsigned int dev, unsigned int =
func,=0A+    unsigned int reg)=0A {=0A     uint32_t value;=0A-    =
BUG_ON((bus > 255) || (dev > 31) || (func > 7) || (reg > 255));=0A-    =
pci_sal_read(0, bus, (dev<<3)|func, reg, 4, &value);=0A+    BUG_ON((seg > =
65535) || (bus > 255) || (dev > 31) || (func > 7) || (reg > 255));=0A+    =
pci_sal_read(seg, bus, (dev<<3)|func, reg, 4, &value);=0A     return =
(uint32_t)value;=0A }=0A =0A void pci_conf_write8(=0A-    unsigned int =
bus, unsigned int dev, unsigned int func, unsigned int reg,=0A-    uint8_t =
data)=0A+    unsigned int seg, unsigned int bus, unsigned int dev, =
unsigned int func,=0A+    unsigned int reg, uint8_t data)=0A {=0A-    =
BUG_ON((bus > 255) || (dev > 31) || (func > 7) || (reg > 255));=0A-    =
pci_sal_write(0, bus, (dev<<3)|func, reg, 1, data);=0A+    BUG_ON((seg > =
65535) || (bus > 255) || (dev > 31) || (func > 7) || (reg > 255));=0A+    =
pci_sal_write(seg, bus, (dev<<3)|func, reg, 1, data);=0A }=0A =0A void =
pci_conf_write16(=0A-    unsigned int bus, unsigned int dev, unsigned int =
func, unsigned int reg,=0A-    uint16_t data)=0A+    unsigned int seg, =
unsigned int bus, unsigned int dev, unsigned int func,=0A+    unsigned int =
reg, uint16_t data)=0A {=0A-    BUG_ON((bus > 255) || (dev > 31) || (func =
> 7) || (reg > 255));=0A-    pci_sal_write(0, bus, (dev<<3)|func, reg, 2, =
data);=0A+    BUG_ON((seg > 65535) || (bus > 255) || (dev > 31) || (func > =
7) || (reg > 255));=0A+    pci_sal_write(seg, bus, (dev<<3)|func, reg, 2, =
data);=0A }=0A =0A void pci_conf_write32(=0A-    unsigned int bus, =
unsigned int dev, unsigned int func, unsigned int reg,=0A-    uint32_t =
data)=0A+    unsigned int seg, unsigned int bus, unsigned int dev, =
unsigned int func,=0A+    unsigned int reg, uint32_t data)=0A {=0A-    =
BUG_ON((bus > 255) || (dev > 31) || (func > 7) || (reg > 255));=0A-    =
pci_sal_write(0, bus, (dev<<3)|func, reg, 4, data);=0A+    BUG_ON((seg > =
65535) || (bus > 255) || (dev > 31) || (func > 7) || (reg > 255));=0A+    =
pci_sal_write(seg, bus, (dev<<3)|func, reg, 4, data);=0A }=0A =0A int =
pci_find_ext_capability(int seg, int bus, int devfn, int cap)=0A--- =
a/xen/arch/ia64/xen/tlb_track.c=0A+++ b/xen/arch/ia64/xen/tlb_track.c=0A@@ =
-22,6 +22,7 @@=0A =0A #include <asm/tlb_track.h>=0A #include <asm/p2m_entry=
.h>=0A+#include <xen/grant_table.h>=0A #include <asm/vmx_mm_def.h>  /* for =
IA64_RR_SHIFT */=0A #include <asm/vmx_vcpu.h>    /* for VRN7 */=0A =
#include <asm/vcpu.h>        /* for PSCB() */=0A--- a/xen/arch/ia64/xen/vhp=
t.c=0A+++ b/xen/arch/ia64/xen/vhpt.c=0A@@ -516,7 +516,7 @@ void domain_flus=
h_tlb_vhpt(struct domain=0A 		on_each_cpu((void (*)(void =
*))local_flush_tlb_all, NULL, 1);=0A 	else=0A 		on_each_cpu=
((void (*)(void *))flush_tlb_vhpt_all, d, 1);=0A-	cpumask_clear_cpu(d=
->domain_dirty_cpumask);=0A+	cpumask_clear(d->domain_dirty_cpumask);=0A =
}=0A =0A void flush_tlb_for_log_dirty(struct domain *d)=0A@@ -545,7 +545,7 =
@@ void flush_tlb_for_log_dirty(struct doma=0A 	} else {=0A 		=
on_each_cpu((void (*)(void *))flush_tlb_vhpt_all, d, 1);=0A 	}=0A-	=
cpumask_clear_cpu(d->domain_dirty_cpumask);=0A+	cpumask_clear(d->domain_dir=
ty_cpumask);=0A }=0A =0A void flush_tlb_mask(const cpumask_t *mask)=0A--- =
a/xen/arch/x86/domctl.c=0A+++ b/xen/arch/x86/domctl.c=0A@@ -27,7 +27,7 =
@@=0A #include <asm/hvm/cacheattr.h>=0A #include <asm/processor.h>=0A =
#include <asm/acpi.h> /* for hvm_acpi_power_button */=0A-#include =
<asm/hypercall.h> /* for arch_do_domctl */=0A+#include <xen/hypercall.h> =
/* for arch_do_domctl */=0A #include <xsm/xsm.h>=0A #include <xen/iommu.h>=
=0A #include <asm/mem_event.h>=0A--- a/xen/common/event_channel.c=0A+++ =
b/xen/common/event_channel.c=0A@@ -365,8 +365,10 @@ static long evtchn_bind=
_pirq(evtchn_bind=0A =0A     bind->port =3D port;=0A =0A+#ifdef CONFIG_X86=
=0A     if ( is_hvm_domain(d) && domain_pirq_to_irq(d, pirq) > 0 )=0A      =
   map_domain_emuirq_pirq(d, pirq, IRQ_PT);=0A+#endif=0A =0A  out:=0A     =
spin_unlock(&d->event_lock);=0A@@ -421,8 +423,10 @@ static long __evtchn_cl=
ose(struct domain=0A         pirq->evtchn =3D 0;=0A         pirq_cleanup_ch=
eck(pirq, d1);=0A         unlink_pirq_port(chn1, d1->vcpu[chn1->notify_vcpu=
_id]);=0A+#ifdef CONFIG_X86=0A         if ( is_hvm_domain(d1) && domain_pir=
q_to_irq(d1, pirq->pirq) > 0 )=0A             unmap_domain_pirq_emuirq(d1, =
pirq->pirq);=0A+#endif=0A         break;=0A     }=0A =0A--- a/xen/common/pa=
ge_alloc.c=0A+++ b/xen/common/page_alloc.c=0A@@ -42,7 +42,12 @@=0A =
#include <asm/page.h>=0A #include <asm/numa.h>=0A #include <asm/flushtlb.h>=
=0A+#ifdef CONFIG_X86=0A #include <asm/p2m.h>=0A+#else=0A+#define =
p2m_pod_offline_or_broken_hit(pg) 0=0A+#define p2m_pod_offline_or_broken_re=
place(pg) BUG_ON(pg !=3D NULL)=0A+#endif=0A =0A /*=0A  * Comma-separated =
list of hexadecimal page numbers containing bad bytes.=0A--- a/xen/drivers/=
passthrough/vtd/dmar.c=0A+++ b/xen/drivers/passthrough/vtd/dmar.c=0A@@ =
-809,6 +809,7 @@ int platform_supports_intremap(void)=0A     return =
((dmar_flags & flags) =3D=3D DMAR_INTR_REMAP);=0A }=0A =0A+#ifdef =
CONFIG_X86=0A int platform_supports_x2apic(void)=0A {=0A     unsigned int =
flags =3D 0;=0A@@ -819,3 +820,4 @@ int platform_supports_x2apic(void)=0A   =
  flags =3D DMAR_INTR_REMAP | DMAR_X2APIC_OPT_OUT;=0A     return ((dmar_fla=
gs & flags) =3D=3D DMAR_INTR_REMAP);=0A }=0A+#endif=0A--- a/xen/drivers/pas=
sthrough/vtd/intremap.c=0A+++ b/xen/drivers/passthrough/vtd/intremap.c=0A@@=
 -47,8 +47,8 @@=0A })=0A #define __ioapic_write_entry(apic, pin, raw, ent) =
({ \=0A     ASSERT(raw); \=0A-    __io_apic_write(apic, 0x10 + 2 * (pin), =
((u32 *)&_e_)[0]); \=0A-    __io_apic_write(apic, 0x11 + 2 * (pin), ((u32 =
*)&_e_)[1]); \=0A+    __io_apic_write(apic, 0x10 + 2 * (pin), ((u32 =
*)&(ent))[0]); \=0A+    __io_apic_write(apic, 0x11 + 2 * (pin), ((u32 =
*)&(ent))[1]); \=0A })=0A #else=0A #include <asm/apic.h>=0A@@ -392,7 =
+392,7 @@ unsigned int io_apic_read_remap_rte(=0A         ( (index =3D =
apic_pin_2_ir_idx[apic][ioapic_pin]) < 0 ) )=0A         return __io_apic_re=
ad(apic, reg);=0A =0A-    old_rte =3D __ioapic_read_entry(apic, ioapic_pin,=
 TRUE);=0A+    old_rte =3D __ioapic_read_entry(apic, ioapic_pin, 1);=0A =
=0A     if ( remap_entry_to_ioapic_rte(iommu, index, &old_rte) )=0A        =
 return __io_apic_read(apic, reg);=0A@@ -420,7 +420,7 @@ void io_apic_write=
_remap_rte(=0A         return;=0A     }=0A =0A-    old_rte =3D __ioapic_rea=
d_entry(apic, ioapic_pin, TRUE);=0A+    old_rte =3D __ioapic_read_entry(api=
c, ioapic_pin, 1);=0A =0A     remap_rte =3D (struct IO_APIC_route_remap_ent=
ry *) &old_rte;=0A =0A@@ -440,7 +440,7 @@ void io_apic_write_remap_rte(=0A =
            __io_apic_write(apic, reg & ~1, *(u32 *)&old_rte);=0A     }=0A =
    else=0A-        __ioapic_write_entry(apic, ioapic_pin, TRUE, =
old_rte);=0A+        __ioapic_write_entry(apic, ioapic_pin, 1, old_rte);=0A=
 }=0A =0A #if defined(__i386__) || defined(__x86_64__)=0A@@ -838,6 +838,8 =
@@ out:=0A     spin_unlock_irqrestore(&iommu->register_lock, flags);=0A =
}=0A =0A+#ifndef __ia64__=0A+=0A /*=0A  * This function is used to enable =
Interrupt remapping when=0A  * enable x2apic=0A@@ -912,3 +914,5 @@ void =
iommu_disable_x2apic_IR(void)=0A     for_each_drhd_unit ( drhd )=0A        =
 disable_qinval(drhd->iommu);=0A }=0A+=0A+#endif /* !__ia64__ */=0A--- =
a/xen/drivers/passthrough/vtd/iommu.c=0A+++ b/xen/drivers/passthrough/vtd/i=
ommu.c=0A@@ -33,9 +33,11 @@=0A #include <xen/keyhandler.h>=0A #include =
<asm/msi.h>=0A #include <asm/irq.h>=0A+#ifndef __ia64__=0A #include =
<asm/hvm/vmx/vmx.h>=0A #include <asm/p2m.h>=0A #include <mach_apic.h>=0A+#e=
ndif=0A #include "iommu.h"=0A #include "dmar.h"=0A #include "extern.h"=0A@@=
 -990,7 +992,11 @@ static unsigned int dma_msi_startup(stru=0A     return =
0;=0A }=0A =0A+#ifndef __ia64__=0A static void dma_msi_end(struct irq_desc =
*desc, u8 vector)=0A+#else=0A+static void dma_msi_end(struct irq_desc =
*desc)=0A+#endif=0A {=0A     dma_msi_unmask(desc);=0A     ack_APIC_irq();=
=0A@@ -1790,6 +1796,7 @@ void iommu_pte_flush(struct domain *d, u=0A =0A =
static int vtd_ept_page_compatible(struct iommu *iommu)=0A {=0A+#ifndef =
__ia64__=0A     u64 ept_cap, vtd_cap =3D iommu->cap;=0A =0A     /* EPT is =
not initialised yet, so we must check the capability in=0A@@ -1799,6 =
+1806,9 @@ static int vtd_ept_page_compatible(struc=0A =0A     return ( =
ept_has_2mb(ept_cap) =3D=3D cap_sps_2mb(vtd_cap) =0A              && =
ept_has_1gb(ept_cap) =3D=3D cap_sps_1gb(vtd_cap) );=0A+#else=0A+    return =
0;=0A+#endif=0A }=0A =0A /*=0A@@ -1806,6 +1816,7 @@ static int vtd_ept_page=
_compatible(struc=0A  */=0A void iommu_set_pgd(struct domain *d)=0A =
{=0A+#ifndef __ia64__=0A     struct hvm_iommu *hd  =3D domain_hvm_iommu(d);=
=0A     mfn_t pgd_mfn;=0A =0A@@ -1816,6 +1827,7 @@ void iommu_set_pgd(struc=
t domain *d)=0A =0A     pgd_mfn =3D pagetable_get_mfn(p2m_get_pagetable(p2m=
_get_hostp2m(d)));=0A     hd->pgd_maddr =3D pagetable_get_paddr(pagetable_f=
rom_mfn(pgd_mfn));=0A+#endif=0A }=0A =0A static int rmrr_identity_mapping(s=
truct domain *d,=0A@@ -2107,7 +2119,7 @@ int __init intel_vtd_setup(void)=
=0A             iommu_intremap =3D 0;=0A =0A         if ( !vtd_ept_page_com=
patible(iommu) )=0A-            iommu_hap_pt_share =3D FALSE;=0A+          =
  iommu_hap_pt_share =3D 0;=0A =0A         ret =3D iommu_set_interrupt(iomm=
u);=0A         if ( ret < 0 )=0A--- a/xen/include/asm-ia64/config.h=0A+++ =
b/xen/include/asm-ia64/config.h=0A@@ -211,10 +211,6 @@ void sort_main_extab=
le(void);=0A // see common/keyhandler.c=0A #define	nop()	asm =
volatile ("nop 0")=0A =0A-// from include/linux/preempt.h (needs including =
from interrupt.h or smp.h)=0A-#define preempt_enable()	do { } while =
(0)=0A-#define preempt_disable()	do { } while (0)=0A-=0A // needed =
for include/xen/linuxtime.h=0A typedef s64 time_t;=0A typedef s64 =
suseconds_t;=0A--- a/xen/include/asm-ia64/domain.h=0A+++ b/xen/include/asm-=
ia64/domain.h=0A@@ -317,12 +317,8 @@ struct arch_vcpu {=0A     cpumask_t =
cache_coherent_map;=0A };=0A =0A-struct arch_pirq {=0A-    struct =
hvm_pirq_dpci dpci;=0A-};=0A-=0A #define pirq_dpci(pirq) ((pirq) ? =
&(pirq)->arch.dpci : NULL)=0A-#define dpci_pirq(dpci) container_of(dpci, =
struct pirq, arch.dpci)=0A+#define dpci_pirq(dp) container_of(dp, struct =
pirq, arch.dpci)=0A =0A #define alloc_pirq_struct(d) ({ \=0A     struct =
pirq *pirq =3D xmalloc(struct pirq); \=0A--- a/xen/include/asm-ia64/hvm/irq=
.h=0A+++ b/xen/include/asm-ia64/hvm/irq.h=0A@@ -22,7 +22,7 @@=0A #ifndef =
__ASM_IA64_HVM_IRQ_H__=0A #define __ASM_IA64_HVM_IRQ_H__=0A =0A-#include =
<xen/irq.h>=0A+#include <asm/irq.h>=0A =0A #define VIOAPIC_NUM_PINS  48=0A =
=0A--- a/xen/include/asm-ia64/linux-xen/asm/hw_irq.h=0A+++ b/xen/include/as=
m-ia64/linux-xen/asm/hw_irq.h=0A@@ -79,8 +79,6 @@ enum {=0A extern __u8 =
isa_irq_to_vector_map[16];=0A #define isa_irq_to_vector(x)	isa_irq_to_=
vector_map[(x)]=0A =0A-extern hw_irq_controller irq_type_ia64_lsapic;	/* =
CPU-internal interrupt controller */=0A-=0A extern int assign_irq_vector =
(int irq);	/* allocate a free vector */=0A extern void free_irq_vector=
 (int vector);=0A extern void ia64_send_ipi (int cpu, int vector, int =
delivery_mode, int redirect);=0A--- a/xen/include/asm-ia64/linux-xen/asm/ir=
q.h=0A+++ b/xen/include/asm-ia64/linux-xen/asm/irq.h=0A@@ -15,11 +15,18 =
@@=0A #define NR_IRQS		256=0A =0A #ifdef XEN=0A+#include =
<xen/hvm/irq.h>=0A+=0A struct arch_irq_desc {=0A         int  vector;=0A+	=
unsigned int depth;=0A         cpumask_var_t cpu_mask;=0A };=0A =0A+struct =
arch_pirq {=0A+	struct hvm_pirq_dpci dpci;=0A+};=0A+=0A int init_irq_data(v=
oid);=0A #endif=0A =0A@@ -66,6 +73,8 @@ extern int request_irq_vector(unsig=
ned i=0A     while(!x)=0A =0A #define domain_pirq_to_irq(d, irq) domain_irq=
_to_vector(d, irq)=0A+=0A+#define hvm_domain_use_pirq(d, info) 0=0A =
#endif=0A =0A #endif /* _ASM_IA64_IRQ_H */=0A--- a/xen/include/asm-ia64/lin=
ux-xen/asm/spinlock.h=0A+++ b/xen/include/asm-ia64/linux-xen/asm/spinlock.h=
=0A@@ -35,6 +35,17 @@ typedef struct {=0A } raw_rwlock_t;=0A #define =
_RAW_RW_LOCK_UNLOCKED /*(raw_rwlock_t)*/ { 0, 0 }=0A =0A+#define _raw_read_=
lock(rw)								=
\=0A+do {									=
		\=0A+	raw_rwlock_t *__read_lock_ptr =3D (rw);			=
			\=0A+							=
				\=0A+	while (unlikely(ia64_fetchadd(1, =
(int *) __read_lock_ptr, acq) < 0)) {		\=0A+		ia64_fetcha=
dd(-1, (int *) __read_lock_ptr, rel);			\=0A+		=
while (*(volatile int *)__read_lock_ptr < 0)				=
\=0A+			cpu_relax();						=
	\=0A+	}								=
		\=0A+} while (0)=0A+=0A #define _raw_read_unlock(rw)		=
			\=0A do {						=
		\=0A 	raw_rwlock_t *__read_lock_ptr =3D (rw);			=
\=0A@@ -68,7 +79,14 @@ do {							=
	\=0A =0A #endif /* !ASM_SUPPORTED */=0A =0A-#define _raw_read_trylo=
ck(lock) generic_raw_read_trylock(lock)=0A+#define _raw_read_trylock(rw) =
({					\=0A+	raw_rwlock_t *__read_lock_p=
tr =3D (rw);				\=0A+	int orig =3D ia64_fetchadd(=
1, (int *) __read_lock_ptr, acq);	\=0A+					=
				\=0A+	if (unlikely(orig < 0))			=
			\=0A+		ia64_fetchadd(-1, (int *) =
__read_lock_ptr, rel);	\=0A+	(orig >=3D 0);					=
		\=0A+})=0A =0A #define _raw_write_unlock(x)			=
					\=0A ({					=
						\=0A--- a/xen/include/asm-i=
a64/linux-xen/linux/hardirq.h=0A+++ b/xen/include/asm-ia64/linux-xen/linux/=
hardirq.h=0A@@ -107,7 +107,8 @@ static inline void account_system_vtime(=0A=
 #define irq_enter()					\=0A 	do {		=
				\=0A 		account_system_vtime(curren=
t);		\=0A-		add_preempt_count(HARDIRQ_OFFSET);	=
\=0A+		/*add_preempt_count(HARDIRQ_OFFSET);*/	\=0A+		=
preempt_count() +=3D HARDIRQ_OFFSET;	\=0A 	} while (0)=0A =0A extern =
void irq_exit(void);=0A--- a/xen/include/asm-ia64/xenoprof.h=0A+++ =
b/xen/include/asm-ia64/xenoprof.h=0A@@ -24,6 +24,8 @@=0A #ifndef __ASM_XENO=
PROF_H__=0A #define __ASM_XENOPROF_H__=0A =0A+#include <xen/grant_table.h>=
=0A+=0A int xenoprof_arch_init(int *num_events, char *cpu_type);=0A int =
xenoprof_arch_reserve_counters(void);=0A int xenoprof_arch_counter(XEN_GUES=
T_HANDLE(void) arg);=0A--- a/xen/include/asm-x86/hypercall.h=0A+++ =
b/xen/include/asm-x86/hypercall.h=0A@@ -7,7 +7,6 @@=0A =0A #include =
<public/physdev.h>=0A #include <public/arch-x86/xen-mca.h> /* for do_mca =
*/=0A-#include <public/domctl.h> /* for arch_do_domctl */=0A #include =
<xen/types.h>=0A =0A /*=0A@@ -97,11 +96,6 @@ arch_do_vcpu_op(=0A     int =
cmd, struct vcpu *v, XEN_GUEST_HANDLE(void) arg);=0A =0A extern long=0A-arc=
h_do_domctl(=0A-    struct xen_domctl *domctl,=0A-    XEN_GUEST_HANDLE(xen_=
domctl_t) u_domctl);=0A-=0A-extern long=0A arch_do_sysctl(=0A     struct =
xen_sysctl *op, =0A     XEN_GUEST_HANDLE(xen_sysctl_t) u_sysctl);=0A--- =
a/xen/include/xen/acpi.h=0A+++ b/xen/include/xen/acpi.h=0A@@ -360,7 +360,9 =
@@ static inline unsigned int acpi_get_csta=0A static inline void =
acpi_set_cstate_limit(unsigned int new_limit) { return; }=0A #endif=0A =
=0A+#ifdef XEN_GUEST_HANDLE=0A int acpi_set_pdc_bits(u32 acpi_id, =
XEN_GUEST_HANDLE(uint32));=0A+#endif=0A int arch_acpi_set_pdc_bits(u32 =
acpi_id, u32 *, u32 mask);=0A =0A #ifdef CONFIG_ACPI_NUMA=0A--- a/xen/inclu=
de/xen/efi.h=0A+++ b/xen/include/xen/efi.h=0A@@ -1,10 +1,12 @@=0A #ifndef =
__XEN_EFI_H__=0A #define __XEN_EFI_H__=0A =0A+#ifndef __ASSEMBLY__=0A =
#include <xen/types.h>=0A+#endif=0A =0A #if defined(__ia64__)=0A-# =
#include <linux/efi.h>=0A+# include_next <linux/efi.h>=0A #else=0A =0A # =
if defined(__i386__)=0A@@ -27,6 +29,8 @@ extern struct efi efi;=0A =0A =
#endif=0A =0A+#ifndef __ASSEMBLY__=0A+=0A union xenpf_efi_info;=0A union =
compat_pf_efi_info;=0A =0A@@ -44,4 +48,6 @@ int efi_runtime_call(struct =
xenpf_efi_ru=0A int efi_compat_get_info(uint32_t idx, union compat_pf_efi_i=
nfo *);=0A int efi_compat_runtime_call(struct compat_pf_efi_runtime_call =
*);=0A =0A+#endif /* !__ASSEMBLY__ */=0A+=0A #endif /* __XEN_EFI_H__ =
*/=0A--- a/xen/include/xen/hypercall.h=0A+++ b/xen/include/xen/hypercall.h=
=0A@@ -36,6 +36,11 @@ do_domctl(=0A     XEN_GUEST_HANDLE(xen_domctl_t) =
u_domctl);=0A =0A extern long=0A+arch_do_domctl(=0A+    struct xen_domctl =
*domctl,=0A+    XEN_GUEST_HANDLE(xen_domctl_t) u_domctl);=0A+=0A+extern =
long=0A do_sysctl(=0A     XEN_GUEST_HANDLE(xen_sysctl_t) u_sysctl);=0A =
=0A--- a/xen/include/xen/iommu.h=0A+++ b/xen/include/xen/iommu.h=0A@@ =
-35,7 +35,11 @@ extern bool_t iommu_debug;=0A extern bool_t amd_iommu_perde=
v_intremap;=0A =0A /* Does this domain have a P2M table we can use as its =
IOMMU pagetable? */=0A+#ifndef __ia64__=0A #define iommu_use_hap_pt(d) =
(hap_enabled(d) && iommu_hap_pt_share)=0A+#else=0A+#define iommu_use_hap_pt=
(d) 0=0A+#endif=0A =0A extern struct rangeset *mmio_ro_ranges;=0A =0A--- =
a/xen/include/xen/irq.h=0A+++ b/xen/include/xen/irq.h=0A@@ -27,6 +27,7 @@ =
struct irqaction {=0A #define IRQ_GUEST         (1u<<4) /* IRQ is handled =
by guest OS(es) */=0A #define IRQ_MOVE_PENDING  (1u<<5) /* IRQ is =
migrating to another CPUs */=0A #define IRQ_PER_CPU       (1u<<6) /* IRQ =
is per CPU */=0A+#define IRQ_GUEST_EOI_PENDING (1u<<7) /* IRQ was =
disabled, pending a guest EOI */=0A =0A /* Special IRQ numbers. */=0A =
#define AUTO_ASSIGN_IRQ         (-1)=0A@@ -46,7 +47,11 @@ struct hw_interru=
pt_type {=0A     void (*enable)(struct irq_desc *);=0A     void (*disable)(=
struct irq_desc *);=0A     void (*ack)(struct irq_desc *);=0A+#ifdef =
CONFIG_X86=0A     void (*end)(struct irq_desc *, u8 vector);=0A+#else=0A+  =
  void (*end)(struct irq_desc *);=0A+#endif=0A     void (*set_affinity)(str=
uct irq_desc *, const cpumask_t *);=0A };=0A =0A--- a/xen/include/xen/pci.h=
=0A+++ b/xen/include/xen/pci.h=0A@@ -39,7 +39,9 @@ struct pci_dev_info =
{=0A         u8 bus;=0A         u8 devfn;=0A     } physfn;=0A-   vmask_t =
used_vectors; =0A+#ifdef CONFIG_X86=0A+    vmask_t used_vectors;=0A+#endif=
=0A };=0A =0A struct pci_dev {=0A--- a/xen/include/xsm/xsm.h=0A+++ =
b/xen/include/xsm/xsm.h=0A@@ -109,6 +109,10 @@ struct xsm_operations {=0A  =
   int (*add_range) (struct domain *d, char *name, unsigned long s, =
unsigned long e);=0A     int (*remove_range) (struct domain *d, char =
*name, unsigned long s, unsigned long e);=0A =0A+    int (*test_assign_devi=
ce) (uint32_t machine_bdf);=0A+    int (*assign_device) (struct domain *d, =
uint32_t machine_bdf);=0A+    int (*deassign_device) (struct domain *d, =
uint32_t machine_bdf);=0A+=0A     long (*__do_xsm_op) (XEN_GUEST_HANDLE(xsm=
_op_t) op);=0A =0A #ifdef CONFIG_X86=0A@@ -146,9 +150,6 @@ struct =
xsm_operations {=0A 			      struct page_info *page);=0A  =
   int (*add_to_physmap) (struct domain *d1, struct domain *d2);=0A     =
int (*sendtrigger) (struct domain *d);=0A-    int (*test_assign_device) =
(uint32_t machine_bdf);=0A-    int (*assign_device) (struct domain *d, =
uint32_t machine_bdf);=0A-    int (*deassign_device) (struct domain *d, =
uint32_t machine_bdf);=0A     int (*bind_pt_irq) (struct domain *d, struct =
xen_domctl_bind_pt_irq *bind);=0A     int (*pin_mem_cacheattr) (struct =
domain *d);=0A     int (*ext_vcpucontext) (struct domain *d, uint32_t =
cmd);=0A@@ -428,6 +429,21 @@ static inline int xsm_remove_range (stru=0A   =
  return xsm_call(remove_range(d, name, s, e));=0A }=0A =0A+static inline =
int xsm_test_assign_device(uint32_t machine_bdf)=0A+{=0A+    return =
xsm_call(test_assign_device(machine_bdf));=0A+}=0A+=0A+static inline int =
xsm_assign_device(struct domain *d, uint32_t machine_bdf)=0A+{=0A+    =
return xsm_call(assign_device(d, machine_bdf));=0A+}=0A+=0A+static inline =
int xsm_deassign_device(struct domain *d, uint32_t machine_bdf)=0A+{=0A+   =
 return xsm_call(deassign_device(d, machine_bdf));=0A+}=0A+=0A static =
inline long __do_xsm_op (XEN_GUEST_HANDLE(xsm_op_t) op)=0A {=0A #ifdef =
XSM_ENABLE=0A@@ -612,21 +628,6 @@ static inline int xsm_sendtrigger(struct=
=0A     return xsm_call(sendtrigger(d));=0A }=0A =0A-static inline int =
xsm_test_assign_device(uint32_t machine_bdf)=0A-{=0A-    return xsm_call(te=
st_assign_device(machine_bdf));=0A-}=0A-=0A-static inline int xsm_assign_de=
vice(struct domain *d, uint32_t machine_bdf)=0A-{=0A-    return xsm_call(as=
sign_device(d, machine_bdf));=0A-}=0A-=0A-static inline int xsm_deassign_de=
vice(struct domain *d, uint32_t machine_bdf)=0A-{=0A-    return xsm_call(de=
assign_device(d, machine_bdf));=0A-}=0A-=0A static inline int xsm_bind_pt_i=
rq(struct domain *d, =0A                                                 =
struct xen_domctl_bind_pt_irq *bind)=0A {=0A
--=__PartEFC0113E.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__PartEFC0113E.0__=--


From xen-devel-bounces@lists.xensource.com Fri Nov 11 08:30:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 08:30:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROtzh-0007fC-7M; Fri, 11 Nov 2011 08:30:21 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROtxi-0007Qk-93
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 08:28:22 -0800
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1321028895!3175395!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32385 invoked from network); 11 Nov 2011 16:28:15 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 16:28:15 -0000
X-IronPort-AV: E=Sophos;i="4.69,495,1315180800"; 
   d="scan'208";a="8890912"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Nov 2011 16:28:14 +0000
Received: from dhcp-3-28.uk.xensource.com (10.80.3.28) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 11 Nov 2011 16:28:14 +0000
Date: Fri, 11 Nov 2011 16:27:55 +0000
From: Anthony PERARD <anthony.perard@citrix.com>
X-X-Sender: anthony@perard.uk.xensource.com
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] [PATCH V3 07/10] Introduce Xen PCI Passthrough,
	qdevice (1/3)
In-Reply-To: <20111110212840.GA23643@phenom.dumpdata.com>
Message-ID: <alpine.DEB.2.00.1111111627430.8085@perard.uk.xensource.com>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-8-git-send-email-anthony.perard@citrix.com>
	<20111110212840.GA23643@phenom.dumpdata.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: Guy Zana <guy@neocleus.com>, Xen Devel <xen-devel@lists.xensource.com>,
	Allen Kay <allen.m.kay@intel.com>, QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 10 Nov 2011, Konrad Rzeszutek Wilk wrote:

> On Fri, Oct 28, 2011 at 04:07:33PM +0100, Anthony PERARD wrote:
> > From: Allen Kay <allen.m.kay@intel.com>
> >
>
> This is going to be a bit lame review..
>

[...]

> > +        return;
> > +    }
> > +
> > +    /* find register group entry */
> > +    reg_grp_entry = pt_find_reg_grp(s, address);
> > +    if (reg_grp_entry) {
> > +        /* check 0 Hardwired register group */
> > +        if (reg_grp_entry->reg_grp->grp_type == GRP_TYPE_HARDWIRED) {
> > +            /* ignore silently */
> > +            PT_LOG("Warning: Access to 0 Hardwired register. "
> > +                   "[%02x:%02x.%x][Offset:%02xh][Length:%d]\n",
> > +                   pci_bus_num(d->bus), PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
> > +                   address, len);
> > +            return;
> > +        }
> > +    }
> > +
> > +    /* read I/O device register value */
> > +    rc = host_pci_get_block(s->real_device, address,
> > +                             (uint8_t *)&read_val, len);
> > +    if (!rc) {
> > +        PT_LOG("Error: pci_read_block failed. return value[%d].\n", rc);
>
> There isn't a PT_ERR? Hm, looking at the code there is only PT_LOG. Perhaps
> declearing PT_ERR and PT_WARN might be a good idea? In case in the future
> one wants different levels of this? Or do we really not care much about that?

I will add this two macros.

> > +        memset(&read_val, 0xff, len);
> > +    }
> > +
> > +    /* pass directly to libpci for passthrough type register group */
>
> Um, is the libpci requirement a certain thing?

:(, it's just an old comment. libpci is not used anymore and have been
replaced by host-pci-device. I will replace libpci in the comment by
"the real device".


[...]

> > +            switch (reg->size) {
> > +            case 1:
> > +                if (reg->u.b.write) {
> > +                    rc = reg->u.b.write(s, reg_entry, ptr_val,
> > +                                        read_val >> ((real_offset & 3) << 3),
> > +                                        valid_mask);
> > +                }
> > +                break;
> > +            case 2:
> > +                if (reg->u.w.write) {
> > +                    rc = reg->u.w.write(s, reg_entry, (uint16_t *)ptr_val,
> > +                                        (read_val >> ((real_offset & 3) << 3)),
> > +                                        valid_mask);
> > +                }
> > +                break;
> > +            case 4:
> > +                if (reg->u.dw.write) {
> > +                    rc = reg->u.dw.write(s, reg_entry, (uint32_t *)ptr_val,
> > +                                         (read_val >> ((real_offset & 3) << 3)),
> > +                                         valid_mask);
> > +                }
> > +                break;
> > +            }
> > +
> > +            if (rc < 0) {
> > +                hw_error("Internal error: Invalid write emulation "
> > +                         "return value[%d]. I/O emulator exit.\n", rc);
>
> Oh. I hadn't realized this, but you are using hw_error. Which is
> calling 'abort'! Yikes. Is there no way to recover from this? Say return 0xfffff?

In qemu-xen-traditionnal, it was an exit(1). I do not know the
consequence of a bad write, and I can not return anythings. So I suppose
that the guest would know that somethings wrong only on the next read.

Instead of abort();, I can just do nothing and return. Or we could unplug
the device from QEMU.

Any preference?

> > +            }
> > +
> > +            /* calculate next address to find */
> > +            emul_len -= reg->size;
> > +            if (emul_len > 0) {
> > +                find_addr = real_offset + reg->size;
> > +            }
> > +        } else {
> > +            /* nothing to do with passthrough type register,
> > +             * continue to find next byte */
> > +            emul_len--;
> > +            find_addr++;
> > +        }
> > +    }
> > +
> > +    /* need to shift back before passing them to libpci */
> > +    val >>= (address & 3) << 3;
> > +
> > +out:
> > +    if (!(reg && reg->no_wb)) {
> > +        /* unknown regs are passed through */
> > +        rc = host_pci_set_block(s->real_device, address, (uint8_t *)&val, len);
> > +
> > +        if (!rc) {
> > +            PT_LOG("Error: pci_write_block failed. return value[%d].\n", rc);
> > +        }
> > +    }
> > +
> > +    if (s->pm_state != NULL && s->pm_state->flags & PT_FLAG_TRANSITING) {
> > +        qemu_mod_timer(s->pm_state->pm_timer,
> > +                       qemu_get_clock_ms(rt_clock) + s->pm_state->pm_delay);
> > +    }
> > +}
> > +
> > +/* ioport/iomem space*/
> > +static void pt_iomem_map(XenPCIPassthroughState *s, int i,
> > +                         pcibus_t e_phys, pcibus_t e_size, int type)
> > +{
> > +    uint32_t old_ebase = s->bases[i].e_physbase;
> > +    bool first_map = s->bases[i].e_size == 0;
> > +    int ret = 0;
> > +
> > +    s->bases[i].e_physbase = e_phys;
> > +    s->bases[i].e_size = e_size;
> > +
> > +    PT_LOG("e_phys=%#"PRIx64" maddr=%#"PRIx64" type=%%d"
> > +           " len=%#"PRIx64" index=%d first_map=%d\n",
> > +           e_phys, s->bases[i].access.maddr, /*type,*/
> > +           e_size, i, first_map);
> > +
> > +    if (e_size == 0) {
> > +        return;
> > +    }
> > +
> > +    if (!first_map && old_ebase != -1) {
>
> old_ebase != PCI_BAR_UNMAPPED ?

:(, no. Because old_ebase is a uint32_t and PCI_BAR_UNMAPPED is
pcibus_t (uint64_t in Xen case).

I'm not sure that a good idee to change the type of old_ebase as
xc_domain_memory_mapping bellow takes only uint32_t.

But, if I can replace a -1 by PCI_BAR_UNMAPPED, I will.

> > +        /* Remove old mapping */
> > +        ret = xc_domain_memory_mapping(xen_xc, xen_domid,
> > +                               old_ebase >> XC_PAGE_SHIFT,
> > +                               s->bases[i].access.maddr >> XC_PAGE_SHIFT,
> > +                               (e_size + XC_PAGE_SIZE - 1) >> XC_PAGE_SHIFT,
> > +                               DPCI_REMOVE_MAPPING);
> > +        if (ret != 0) {
> > +            PT_LOG("Error: remove old mapping failed!\n");
> > +            return;
> > +        }
> > +    }
> > +
> > +    /* map only valid guest address */
> > +    if (e_phys != -1) {
>
> PCI_BAR_UNMAPPED
>
> > +        /* Create new mapping */
> > +        ret = xc_domain_memory_mapping(xen_xc, xen_domid,
> > +                                   s->bases[i].e_physbase >> XC_PAGE_SHIFT,
> > +                                   s->bases[i].access.maddr >> XC_PAGE_SHIFT,
> > +                                   (e_size+XC_PAGE_SIZE-1) >> XC_PAGE_SHIFT,
> > +                                   DPCI_ADD_MAPPING);
> > +
> > +        if (ret != 0) {
> > +            PT_LOG("Error: create new mapping failed!\n");
> > +        }
> > +    }
> > +}

[...]

> > +void pt_bar_mapping(XenPCIPassthroughState *s, int io_enable, int mem_enable)
> > +{
> > +    int i;
> > +
> > +    for (i = 0; i < PCI_NUM_REGIONS; i++) {
> > +        pt_bar_mapping_one(s, i, io_enable, mem_enable);
> > +    }
> > +}
> > +
> > +/* register regions */
> > +static int pt_register_regions(XenPCIPassthroughState *s)
> > +{
> > +    int i = 0;
> > +    uint32_t bar_data = 0;
> > +    HostPCIDevice *d = s->real_device;
> > +
> > +    /* Register PIO/MMIO BARs */
> > +    for (i = 0; i < PCI_BAR_ENTRIES; i++) {
> > +        HostPCIIORegion *r = &d->io_regions[i];
> > +
> > +        if (r->base_addr) {
>
> So should you check for PCI_BAR_UNMAPPED or is that not really
> required here as the pci_register_bar would do it?

Actually, this value come from the real device (the value in
sysfs/resource). So, I think it's just 0 if it's not mapped.

Here, it's probably better to check for the size instead, to know if
there is actually a BAR.

> > +            s->bases[i].e_physbase = r->base_addr;
> > +            s->bases[i].access.u = r->base_addr;
> > +
> > +            /* Register current region */
> > +            if (r->flags & IORESOURCE_IO) {
> > +                memory_region_init_io(&s->bar[i], NULL, NULL,
> > +                                      "xen-pci-pt-bar", r->size);
>
> You can make the "xen_pci-pt-bar" be a #define somewhere and reuse that.
>
> > +                pci_register_bar(&s->dev, i, PCI_BASE_ADDRESS_SPACE_IO,
> > +                                 &s->bar[i]);
> > +            } else if (r->flags & IORESOURCE_PREFETCH) {
> > +                memory_region_init_io(&s->bar[i], NULL, NULL,
> > +                                      "xen-pci-pt-bar", r->size);
> > +                pci_register_bar(&s->dev, i, PCI_BASE_ADDRESS_MEM_PREFETCH,
> > +                                 &s->bar[i]);
> > +            } else {
> > +                memory_region_init_io(&s->bar[i], NULL, NULL,
> > +                                      "xen-pci-pt-bar", r->size);
> > +                pci_register_bar(&s->dev, i, PCI_BASE_ADDRESS_SPACE_MEMORY,
> > +                                 &s->bar[i]);
> > +            }
> > +
> > +            PT_LOG("IO region registered (size=0x%08"PRIx64
> > +                   " base_addr=0x%08"PRIx64")\n",
> > +                   r->size, r->base_addr);
> > +        }
> > +    }
> > +
> > +    /* Register expansion ROM address */
> > +    if (d->rom.base_addr && d->rom.size) {
> > +        /* Re-set BAR reported by OS, otherwise ROM can't be read. */
> > +        bar_data = host_pci_get_long(d, PCI_ROM_ADDRESS);
> > +        if ((bar_data & PCI_ROM_ADDRESS_MASK) == 0) {
> > +            bar_data |= d->rom.base_addr & PCI_ROM_ADDRESS_MASK;
> > +            host_pci_set_long(d, PCI_ROM_ADDRESS, bar_data);
> > +        }
> > +
> > +        s->bases[PCI_ROM_SLOT].e_physbase = d->rom.base_addr;
> > +        s->bases[PCI_ROM_SLOT].access.maddr = d->rom.base_addr;
> > +
> > +        memory_region_init_rom_device(&s->rom, NULL, NULL, &s->dev.qdev,
> > +                                      "xen-pci-pt-rom", d->rom.size);
> > +        pci_register_bar(&s->dev, PCI_ROM_SLOT, PCI_BASE_ADDRESS_MEM_PREFETCH,
> > +                         &s->rom);
> > +
> > +        PT_LOG("Expansion ROM registered (size=0x%08"PRIx64
> > +               " base_addr=0x%08"PRIx64")\n",
> > +               d->rom.size, d->rom.base_addr);
> > +    }
> > +
> > +    return 0;
> > +}
> > +

[...]

> > +static int pt_initfn(PCIDevice *pcidev)
> > +{
> > +    XenPCIPassthroughState *s = DO_UPCAST(XenPCIPassthroughState, dev, pcidev);
> > +    int dom, bus;
> > +    unsigned slot, func;
> > +    int rc = 0;
> > +    uint32_t machine_irq;
> > +    int pirq = -1;
> > +
> > +    if (pci_parse_devaddr(s->hostaddr, &dom, &bus, &slot, &func) < 0) {
> > +        fprintf(stderr, "error parse bdf: %s\n", s->hostaddr);
> > +        return -1;
> > +    }
> > +
> > +    /* register real device */
> > +    PT_LOG("Assigning real physical device %02x:%02x.%x to devfn %i ...\n",
> > +           bus, slot, func, s->dev.devfn);
> > +
> > +    s->real_device = host_pci_device_get(bus, slot, func);
> > +    if (!s->real_device) {
> > +        return -1;
> > +    }
> > +
> > +    s->is_virtfn = s->real_device->is_virtfn;
> > +    if (s->is_virtfn) {
> > +        PT_LOG("%04x:%02x:%02x.%x is a SR-IOV Virtual Function\n",
> > +               s->real_device->domain, bus, slot, func);
> > +    }
> > +
> > +    /* Initialize virtualized PCI configuration (Extended 256 Bytes) */
> > +    if (host_pci_get_block(s->real_device, 0, pcidev->config,
> > +                           PCI_CONFIG_SPACE_SIZE) == -1) {
> > +        return -1;
> > +    }
> > +
> > +    /* Handle real device's MMIO/PIO BARs */
> > +    pt_register_regions(s);
> > +
> > +    /* reinitialize each config register to be emulated */
> > +    pt_config_init(s);
> > +
> > +    /* Bind interrupt */
> > +    if (!s->dev.config[PCI_INTERRUPT_PIN]) {
> > +        PT_LOG("no pin interrupt\n");
>
> Perhaps include some details of which device failed?

There is already detailed about the device at the beginning of the
function. Is it not enough?

> > +        goto out;
> > +    }
> > +
> > +    machine_irq = host_pci_get_byte(s->real_device, PCI_INTERRUPT_LINE);
> > +    rc = xc_physdev_map_pirq(xen_xc, xen_domid, machine_irq, &pirq);
> > +
> > +    if (rc) {
> > +        PT_LOG("Error: Mapping irq failed, rc = %d\n", rc);
>
> Can you also include the IRQ it tried to map (both machine and pirq).

Yep.

> > +
> > +        /* Disable PCI intx assertion (turn on bit10 of devctl) */
> > +        host_pci_set_word(s->real_device,
> > +                          PCI_COMMAND,
> > +                          pci_get_word(s->dev.config + PCI_COMMAND)
> > +                          | PCI_COMMAND_INTX_DISABLE);
> > +        machine_irq = 0;
> > +        s->machine_irq = 0;
> > +    } else {
> > +        machine_irq = pirq;
> > +        s->machine_irq = pirq;
> > +        mapped_machine_irq[machine_irq]++;
> > +    }
> > +
> > +    /* bind machine_irq to device */
> > +    if (rc < 0 && machine_irq != 0) {
> > +        uint8_t e_device = PCI_SLOT(s->dev.devfn);
> > +        uint8_t e_intx = pci_intx(s);
> > +
> > +        rc = xc_domain_bind_pt_pci_irq(xen_xc, xen_domid, machine_irq, 0,
> > +                                       e_device, e_intx);
> > +        if (rc < 0) {
> > +            PT_LOG("Error: Binding of interrupt failed! rc=%d\n", rc);
>
> A bit details - name of the device, the IRQ,..
>
> > +
> > +            /* Disable PCI intx assertion (turn on bit10 of devctl) */
> > +            host_pci_set_word(s->real_device, PCI_COMMAND,
> > +                              *(uint16_t *)(&s->dev.config[PCI_COMMAND])
> > +                              | PCI_COMMAND_INTX_DISABLE);
> > +            mapped_machine_irq[machine_irq]--;
> > +
> > +            if (mapped_machine_irq[machine_irq] == 0) {
> > +                if (xc_physdev_unmap_pirq(xen_xc, xen_domid, machine_irq)) {
> > +                    PT_LOG("Error: Unmapping of interrupt failed! rc=%d\n",
> > +                           rc);
>
> And here too. It would be beneficial to have on the error paths lots of
> nice details so that in the field it will be easier to find out what
> went wrong (and match up PIRQ with the GSI).

Yes, I will try to improve the messages.

It's also probably good to always print the errors.


Thanks,

-- 
Anthony PERARD

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 08:40:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 08:40:53 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROu9t-0008Lb-Nz; Fri, 11 Nov 2011 08:40:53 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROu9B-00089i-AK; Fri, 11 Nov 2011 08:40:09 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1321029605!2788729!1
X-Originating-IP: [74.125.82.41]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12941 invoked from network); 11 Nov 2011 16:40:05 -0000
Received: from mail-ww0-f41.google.com (HELO mail-ww0-f41.google.com)
	(74.125.82.41)
	by server-5.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 16:40:05 -0000
Received: by wwf25 with SMTP id 25so2246422wwf.0
	for <multiple recipients>; Fri, 11 Nov 2011 08:40:05 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=5ANNAIopHbV2febwipn34tfZmYGG8Qp4GIycp9oXRLY=;
	b=kSS6epxMwn6DuYGxu0gcA6So3iK2nAk0qnBGnXpzdPT7E0unqvrj7YAk/dxWhIMK0i
	F0YgCEnzP5w/ptX+7ZROtSlmuP6zxnt4CSuchH6tD3a8zfKgtYwTw929CwHMbORsZ4e+
	6VqG1vTK9fJSLvUCxn/s/BvM4fRlSMZ3KllMw=
Received: by 10.180.3.33 with SMTP id 1mr15100904wiz.54.1321029605092;
	Fri, 11 Nov 2011 08:40:05 -0800 (PST)
Received: from [192.168.1.3] (host86-129-245-239.range86-129.btcentralplus.com.
	[86.129.245.239])
	by mx.google.com with ESMTPS id x8sm7228238wix.17.2011.11.11.08.40.03
	(version=SSLv3 cipher=OTHER); Fri, 11 Nov 2011 08:40:03 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Fri, 11 Nov 2011 16:40:00 +0000
Subject: Re: [Xen-devel] [PATCH] ia64: introduce atomic_{read,write}NN()
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CAE30060.33E6D%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] ia64: introduce atomic_{read,write}NN()
Thread-Index: AcygkI2zldpmezpHLE6ZR2Nl2Kpzyw==
In-Reply-To: <4EBD56C50200007800060781@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: xen-ia64-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/11/2011 16:09, "Jan Beulich" <JBeulich@suse.com> wrote:

> These are required to be able to build certain portions of common code.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> --- a/xen/include/asm-ia64/linux-xen/asm/atomic.h
> +++ b/xen/include/asm-ia64/linux-xen/asm/atomic.h
> @@ -24,12 +24,9 @@ typedef struct { volatile __s32 counter;
>  typedef struct { volatile __s64 counter; } atomic64_t;
>  
>  #ifndef XEN
> +
>  #define ATOMIC_INIT(i)  ((atomic_t) { (i) })
>  #define ATOMIC64_INIT(i) ((atomic64_t) { (i) })
> -#else
> -#define ATOMIC_INIT(i)  { (i) }
> -#define ATOMIC64_INIT(i) { (i) }
> -#endif
>  
>  #define atomic_read(v)  ((v)->counter)
>  #define atomic64_read(v) ((v)->counter)
> @@ -37,6 +34,55 @@ typedef struct { volatile __s64 counter;
>  #define atomic_set(v,i)  (((v)->counter) = (i))
>  #define atomic64_set(v,i) (((v)->counter) = (i))
>  
> +#else
> +
> +#define ATOMIC_INIT(i)  { (i) }
> +#define ATOMIC64_INIT(i) { (i) }
> +
> +#define build_atomic_read(tag, type) \
> +static inline type atomic_read##tag(const volatile type *addr) \
> +{ \
> + type ret; \
> + asm volatile("ld%2.acq %0 = %1" \
> +       : "=r" (ret) \
> +       : "m" (*addr), "i" (sizeof(type))); \
> + return ret; \
> +}
> +
> +#define build_atomic_write(tag, type) \
> +static inline void atomic_write##tag(volatile type *addr, type val) \
> +{ \
> + asm volatile("st%2.rel %0 = %1" \
> +       : "=m" (*addr) \
> +       : "r" (val), "i" (sizeof(type))); \
> +}
> +
> +build_atomic_read(8, uint8_t)
> +build_atomic_read(16, uint16_t)
> +build_atomic_read(32, uint32_t)
> +build_atomic_read(64, uint64_t)
> +build_atomic_read(_int, int)
> +build_atomic_read(_long, long)
> +
> +build_atomic_write(8, uint8_t)
> +build_atomic_write(16, uint16_t)
> +build_atomic_write(32, uint32_t)
> +build_atomic_write(64, uint64_t)
> +build_atomic_write(_int, int)
> +build_atomic_write(_long, long)
> +
> +#define _atomic_read(v)  ((v).counter)
> +#define _atomic64_read(v) ((v).counter)
> +#define atomic_read(v)  atomic_read_int(&((v)->counter))
> +#define atomic64_read(v) atomic_read_long(&((v)->counter))
> +
> +#define _atomic_set(v,i) (((v).counter) = (i))
> +#define _atomic64_set(v,i) (((v).counter) = (i))
> +#define atomic_set(v,i)  atomic_write_int(&((v)->counter), i)
> +#define atomic64_set(v,l) atomic_write_long(&((v)->counter), l)
> +
> +#endif
> +
>  static __inline__ int
>  ia64_atomic_add (int i, atomic_t *v)
>  {
> @@ -59,7 +105,7 @@ ia64_atomic64_add (__s64 i, atomic64_t *
>  
> do {
> CMPXCHG_BUGCHECK(v);
> -  old = atomic_read(v);
> +  old = atomic64_read(v);
> new = old + i;
> } while (ia64_cmpxchg(acq, v, old, new, sizeof(atomic64_t)) != old);
> return new;
> @@ -87,7 +133,7 @@ ia64_atomic64_sub (__s64 i, atomic64_t *
>  
> do {
> CMPXCHG_BUGCHECK(v);
> -  old = atomic_read(v);
> +  old = atomic64_read(v);
> new = old - i;
> } while (ia64_cmpxchg(acq, v, old, new, sizeof(atomic64_t)) != old);
> return new;
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 08:50:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 08:50:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROuJ5-0000Qd-PG; Fri, 11 Nov 2011 08:50:23 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROuID-0000DW-Js
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 08:49:29 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1321030165!2242871!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17688 invoked from network); 11 Nov 2011 16:49:26 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-13.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 16:49:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,496,1315195200"; d="scan'208";a="19028994"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Nov 2011 11:49:24 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX02.citrite.net
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Fri, 11 Nov 2011
	11:49:24 -0500
Message-ID: <4EBD5213.3030407@citrix.com>
Date: Fri, 11 Nov 2011 16:49:23 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: <xen-devel@lists.xensource.com>, Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH] x86: clean up __io_apic_eoi()
References: <4EBD5639020000780006077C@nat28.tlf.novell.com>
In-Reply-To: <4EBD5639020000780006077C@nat28.tlf.novell.com>
X-Enigmail-Version: 1.1.2
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/11/11 16:07, Jan Beulich wrote:
> Irrespective of the IO-APIC vector sharing suppression patch just sent
> the logic in this function needs to iterate over all RTEs, since
> multiple pins within an IO-APIC may still use the same vector.

Why?  The whole point of preventing vector sharing for IO-APICs is to
prevent two or more RTEs referencing the same vector.

~Andrew

>  This is
> due to the irq_2_pin[] mapping not necessarily being 1:1.
>
> Consequently we should remove the commented out code as well as the
> respective comments provisioned for the point in time when vector
> sharing between unrelated RTEs would be disabled.
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>
> --- a/xen/arch/x86/io_apic.c
> +++ b/xen/arch/x86/io_apic.c
> @@ -281,36 +281,15 @@ static void __io_apic_eoi(unsigned int a
>          /* If pin is unknown, search for it */
>          if ( pin == -1 )
>          {
> -            unsigned int p;
> -            for ( p = 0; p < nr_ioapic_entries[apic]; ++p )
> +            for ( pin = 0; pin < nr_ioapic_entries[apic]; ++pin )
>              {
> -                entry = __ioapic_read_entry(apic, p, TRUE);
> +                entry = __ioapic_read_entry(apic, pin, TRUE);
>                  if ( entry.vector == vector )
> -                {
> -                    pin = p;
> -                    /* break; */
> -
> -                    /* Here should be a break out of the loop, but at the 
> -                     * Xen code doesn't actually prevent multiple IO-APIC
> -                     * entries being assigned the same vector, so EOI all
> -                     * pins which have the correct vector.
> -                     *
> -                     * Remove the following code when the above assertion
> -                     * is fulfilled. */
> -                    __io_apic_eoi(apic, vector, p);
> -                }
> +                    __io_apic_eoi(apic, vector, pin);
>              }
>              
>              /* If search fails, nothing to do */
>  
> -            /* if ( pin == -1 ) */
> -
> -            /* Because the loop wasn't broken out of (see comment above),
> -             * all relevant pins have been EOI, so we can always return.
> -             * 
> -             * Re-instate the if statement above when the Xen logic has been
> -             * fixed.*/
> -
>              return;
>          }
>  
>
>
>

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 08:56:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 08:56:45 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROuPF-0000uS-9W; Fri, 11 Nov 2011 08:56:45 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1ROuOA-0000hi-OW
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 08:55:40 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-10.tower-27.messagelabs.com!1321030504!43585680!1
X-Originating-IP: [208.97.132.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2067 invoked from network); 11 Nov 2011 16:55:04 -0000
Received: from caiajhbdcbhh.dreamhost.com (HELO homiemail-a75.g.dreamhost.com)
	(208.97.132.177) by server-10.tower-27.messagelabs.com with SMTP;
	11 Nov 2011 16:55:04 -0000
Received: from homiemail-a75.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a75.g.dreamhost.com (Postfix) with ESMTP id 733615EC07C;
	Fri, 11 Nov 2011 08:55:33 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id:date
	:from:to:cc; q=dns; s=lagarcavilla.org; b=ca1+DuOoeI+ZThgiC5PQrg
	0gft3GIr7/0NlYusidRyvAOvxuebC3POQGvFVuxY8nfwR+zvJv2kvYhs/QlyFttz
	2+GS3g62l2H+mSgaYe+ynaje1B/CkY58Xfc969kKYkX+QdhKupUo35wxB/rZpi3D
	aD3KbeHnleH2fGvnBK+uE=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:date:from:to:cc; s=lagarcavilla.org; bh=h/RCMVUQs2AD
	n4q9qJxZBsNLQHU=; b=aBF/OcHqtnrPoz6c6pPivKaBgQ5pGyCqqIYayjGe69+j
	INigkdY11xubciAHkkT8bGSMpDS3vPimoBWj2rGm5jtWLW9TWzbumMTOEwgCoO+t
	M0RIawJX0nwcze73eQ0RUefvdYAWP9y6gRgPVJN3J/xuG6n2/gR7p/6PNQ14Ago=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a75.g.dreamhost.com (Postfix) with ESMTPSA id 03C665EC080; 
	Fri, 11 Nov 2011 08:55:30 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 7461834954c89706d84fbc8d5b783023aae678a8
Message-Id: <7461834954c89706d84f.1321030521@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Fri, 11 Nov 2011 11:55:21 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: olaf@aepfle.de, George.Dunlap@eu.citrix.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, JBeulich@suse.com, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH] Modify naming of queries into the p2m
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 xen/arch/x86/cpu/mcheck/vmce.c   |    9 +-
 xen/arch/x86/debug.c             |   17 ++-
 xen/arch/x86/domain.c            |   27 +++++-
 xen/arch/x86/domctl.c            |   15 ++-
 xen/arch/x86/hvm/emulate.c       |   29 ++++++-
 xen/arch/x86/hvm/hvm.c           |  113 ++++++++++++++++++++-------
 xen/arch/x86/hvm/mtrr.c          |    2 +-
 xen/arch/x86/hvm/stdvga.c        |    4 +-
 xen/arch/x86/hvm/svm/nestedsvm.c |   13 ++-
 xen/arch/x86/hvm/svm/svm.c       |   12 ++-
 xen/arch/x86/hvm/viridian.c      |    8 +-
 xen/arch/x86/hvm/vmx/vmx.c       |   15 ++-
 xen/arch/x86/hvm/vmx/vvmx.c      |   13 ++-
 xen/arch/x86/mm.c                |  153 +++++++++++++++++++++++++++++++-------
 xen/arch/x86/mm/guest_walk.c     |   31 ++++++-
 xen/arch/x86/mm/hap/guest_walk.c |   15 +++-
 xen/arch/x86/mm/hap/nested_hap.c |   17 +++-
 xen/arch/x86/mm/mem_event.c      |   23 ++++-
 xen/arch/x86/mm/mem_sharing.c    |   27 +++++-
 xen/arch/x86/mm/p2m-pod.c        |   19 +++-
 xen/arch/x86/mm/p2m.c            |   40 +++++----
 xen/arch/x86/mm/shadow/common.c  |    6 +-
 xen/arch/x86/mm/shadow/multi.c   |   85 +++++++++++++++------
 xen/arch/x86/mm/shadow/types.h   |   10 +-
 xen/arch/x86/physdev.c           |    8 +-
 xen/arch/x86/traps.c             |   19 +++-
 xen/common/grant_table.c         |   30 ++++++-
 xen/common/memory.c              |   19 ++++-
 xen/common/tmem_xen.c            |   21 +++-
 xen/include/asm-ia64/mm.h        |    2 +
 xen/include/asm-x86/guest_pt.h   |    6 +-
 xen/include/asm-x86/p2m.h        |   45 ++++++++---
 32 files changed, 636 insertions(+), 217 deletions(-)


Callers of lookups into the p2m code are now variants of get_gfn. All
callers need to call put_gfn. The code behind it is a no-op at the
moment, but will change to proper locking in a later patch.

This patch does not change functionality. Only naming, and adds
put_gfn's.

set_p2m_entry retains its name because it is always called with
p2m_lock held.

This patch is humongous, unfortunately, given the dozens of call sites
involved.

After this patch, anyone using old style gfn_to_mfn will not succeed
in compiling their code. This is on purpose: adapt to the new API.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Acked-by: Tim Deegan <tim@xen.org>

diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/cpu/mcheck/vmce.c
--- a/xen/arch/x86/cpu/mcheck/vmce.c
+++ b/xen/arch/x86/cpu/mcheck/vmce.c
@@ -574,6 +574,7 @@ int unmmap_broken_page(struct domain *d,
 {
     mfn_t r_mfn;
     p2m_type_t pt;
+    int rc;
 
     /* Always trust dom0's MCE handler will prevent future access */
     if ( d == dom0 )
@@ -585,14 +586,16 @@ int unmmap_broken_page(struct domain *d,
     if ( !is_hvm_domain(d) || !paging_mode_hap(d) )
         return -ENOSYS;
 
-    r_mfn = gfn_to_mfn_query(d, gfn, &pt);
+    rc = -1;
+    r_mfn = get_gfn_query(d, gfn, &pt);
     if ( p2m_to_mask(pt) & P2M_UNMAP_TYPES)
     {
         ASSERT(mfn_x(r_mfn) == mfn_x(mfn));
         p2m_change_type(d, gfn, pt, p2m_ram_broken);
-        return 0;
+        rc = 0;
     }
+    put_gfn(d, gfn);
 
-    return -1;
+    return rc;
 }
 
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/debug.c
--- a/xen/arch/x86/debug.c
+++ b/xen/arch/x86/debug.c
@@ -43,22 +43,23 @@
 
 /* Returns: mfn for the given (hvm guest) vaddr */
 static unsigned long 
-dbg_hvm_va2mfn(dbgva_t vaddr, struct domain *dp, int toaddr)
+dbg_hvm_va2mfn(dbgva_t vaddr, struct domain *dp, int toaddr,
+                unsigned long *gfn)
 {
-    unsigned long mfn, gfn;
+    unsigned long mfn;
     uint32_t pfec = PFEC_page_present;
     p2m_type_t gfntype;
 
     DBGP2("vaddr:%lx domid:%d\n", vaddr, dp->domain_id);
 
-    gfn = paging_gva_to_gfn(dp->vcpu[0], vaddr, &pfec);
-    if ( gfn == INVALID_GFN )
+    *gfn = paging_gva_to_gfn(dp->vcpu[0], vaddr, &pfec);
+    if ( *gfn == INVALID_GFN )
     {
         DBGP2("kdb:bad gfn from gva_to_gfn\n");
         return INVALID_MFN;
     }
 
-    mfn = mfn_x(gfn_to_mfn(dp, gfn, &gfntype)); 
+    mfn = mfn_x(get_gfn(dp, *gfn, &gfntype)); 
     if ( p2m_is_readonly(gfntype) && toaddr )
     {
         DBGP2("kdb:p2m_is_readonly: gfntype:%x\n", gfntype);
@@ -193,12 +194,12 @@ dbg_rw_guest_mem(dbgva_t addr, dbgbyte_t
     while ( len > 0 )
     {
         char *va;
-        unsigned long mfn, pagecnt;
+        unsigned long mfn, gfn = INVALID_GFN, pagecnt;
 
         pagecnt = min_t(long, PAGE_SIZE - (addr & ~PAGE_MASK), len);
 
         mfn = (dp->is_hvm
-               ? dbg_hvm_va2mfn(addr, dp, toaddr)
+               ? dbg_hvm_va2mfn(addr, dp, toaddr, &gfn)
                : dbg_pv_va2mfn(addr, dp, pgd3));
         if ( mfn == INVALID_MFN ) 
             break;
@@ -217,6 +218,8 @@ dbg_rw_guest_mem(dbgva_t addr, dbgbyte_t
         }
 
         unmap_domain_page(va);
+        if ( gfn != INVALID_GFN )
+            put_gfn(dp, gfn);
 
         addr += pagecnt;
         buf += pagecnt;
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -720,6 +720,7 @@ int arch_set_info_guest(
     struct vcpu *v, vcpu_guest_context_u c)
 {
     struct domain *d = v->domain;
+    unsigned long cr3_gfn;
     unsigned long cr3_pfn = INVALID_MFN;
     unsigned long flags, cr4;
     unsigned int i;
@@ -931,7 +932,8 @@ int arch_set_info_guest(
 
     if ( !compat )
     {
-        cr3_pfn = gmfn_to_mfn(d, xen_cr3_to_pfn(c.nat->ctrlreg[3]));
+        cr3_gfn = xen_cr3_to_pfn(c.nat->ctrlreg[3]);
+        cr3_pfn = get_gfn_untyped(d, cr3_gfn);
 
         if ( !mfn_valid(cr3_pfn) ||
              (paging_mode_refcounts(d)
@@ -939,16 +941,18 @@ int arch_set_info_guest(
               : !get_page_and_type(mfn_to_page(cr3_pfn), d,
                                    PGT_base_page_table)) )
         {
+            put_gfn(d, cr3_gfn);
             destroy_gdt(v);
             return -EINVAL;
         }
 
         v->arch.guest_table = pagetable_from_pfn(cr3_pfn);
-
+        put_gfn(d, cr3_gfn);
 #ifdef __x86_64__
         if ( c.nat->ctrlreg[1] )
         {
-            cr3_pfn = gmfn_to_mfn(d, xen_cr3_to_pfn(c.nat->ctrlreg[1]));
+            cr3_gfn = xen_cr3_to_pfn(c.nat->ctrlreg[1]);
+            cr3_pfn = get_gfn_untyped(d, cr3_gfn);
 
             if ( !mfn_valid(cr3_pfn) ||
                  (paging_mode_refcounts(d)
@@ -962,11 +966,13 @@ int arch_set_info_guest(
                     put_page(mfn_to_page(cr3_pfn));
                 else
                     put_page_and_type(mfn_to_page(cr3_pfn));
+                put_gfn(d, cr3_gfn); 
                 destroy_gdt(v);
                 return -EINVAL;
             }
 
             v->arch.guest_table_user = pagetable_from_pfn(cr3_pfn);
+            put_gfn(d, cr3_gfn); 
         }
         else if ( !(flags & VGCF_in_kernel) )
         {
@@ -978,7 +984,8 @@ int arch_set_info_guest(
     {
         l4_pgentry_t *l4tab;
 
-        cr3_pfn = gmfn_to_mfn(d, compat_cr3_to_pfn(c.cmp->ctrlreg[3]));
+        cr3_gfn = compat_cr3_to_pfn(c.cmp->ctrlreg[3]);
+        cr3_pfn = get_gfn_untyped(d, cr3_gfn);
 
         if ( !mfn_valid(cr3_pfn) ||
              (paging_mode_refcounts(d)
@@ -986,6 +993,7 @@ int arch_set_info_guest(
               : !get_page_and_type(mfn_to_page(cr3_pfn), d,
                                    PGT_l3_page_table)) )
         {
+            put_gfn(d, cr3_gfn); 
             destroy_gdt(v);
             return -EINVAL;
         }
@@ -993,6 +1001,7 @@ int arch_set_info_guest(
         l4tab = __va(pagetable_get_paddr(v->arch.guest_table));
         *l4tab = l4e_from_pfn(
             cr3_pfn, _PAGE_PRESENT|_PAGE_RW|_PAGE_USER|_PAGE_ACCESSED);
+        put_gfn(d, cr3_gfn); 
 #endif
     }
 
@@ -1058,11 +1067,12 @@ unmap_vcpu_info(struct vcpu *v)
  * event doesn't get missed.
  */
 static int
-map_vcpu_info(struct vcpu *v, unsigned long mfn, unsigned offset)
+map_vcpu_info(struct vcpu *v, unsigned long gfn, unsigned offset)
 {
     struct domain *d = v->domain;
     void *mapping;
     vcpu_info_t *new_info;
+    unsigned long mfn;
     int i;
 
     if ( offset > (PAGE_SIZE - sizeof(vcpu_info_t)) )
@@ -1075,15 +1085,19 @@ map_vcpu_info(struct vcpu *v, unsigned l
     if ( (v != current) && !test_bit(_VPF_down, &v->pause_flags) )
         return -EINVAL;
 
-    mfn = gmfn_to_mfn(d, mfn);
+    mfn = get_gfn_untyped(d, gfn);
     if ( !mfn_valid(mfn) ||
          !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
+    {
+        put_gfn(d, gfn); 
         return -EINVAL;
+    }
 
     mapping = map_domain_page_global(mfn);
     if ( mapping == NULL )
     {
         put_page_and_type(mfn_to_page(mfn));
+        put_gfn(d, gfn); 
         return -ENOMEM;
     }
 
@@ -1113,6 +1127,7 @@ map_vcpu_info(struct vcpu *v, unsigned l
     for ( i = 0; i < BITS_PER_EVTCHN_WORD(d); i++ )
         set_bit(i, &vcpu_info(v, evtchn_pending_sel));
 
+    put_gfn(d, gfn); 
     return 0;
 }
 
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/domctl.c
--- a/xen/arch/x86/domctl.c
+++ b/xen/arch/x86/domctl.c
@@ -199,7 +199,7 @@ long arch_do_domctl(
 
                 for ( j = 0; j < k; j++ )
                 {
-                    unsigned long type = 0, mfn = gmfn_to_mfn(d, arr[j]);
+                    unsigned long type = 0, mfn = get_gfn_untyped(d, arr[j]);
 
                     page = mfn_to_page(mfn);
 
@@ -235,6 +235,7 @@ long arch_do_domctl(
                         type = XEN_DOMCTL_PFINFO_XTAB;
 
                     arr[j] = type;
+                    put_gfn(d, arr[j]);
                 }
 
                 if ( copy_to_guest_offset(domctl->u.getpageframeinfo3.array,
@@ -299,7 +300,8 @@ long arch_do_domctl(
             for ( j = 0; j < k; j++ )
             {      
                 struct page_info *page;
-                unsigned long mfn = gmfn_to_mfn(d, arr32[j]);
+                unsigned long gfn = arr32[j];
+                unsigned long mfn = get_gfn_untyped(d, gfn);
 
                 page = mfn_to_page(mfn);
 
@@ -310,8 +312,10 @@ long arch_do_domctl(
                      unlikely(is_xen_heap_mfn(mfn)) )
                     arr32[j] |= XEN_DOMCTL_PFINFO_XTAB;
                 else if ( xsm_getpageframeinfo(page) != 0 )
+                {
+                    put_gfn(d, gfn); 
                     continue;
-                else if ( likely(get_page(page, d)) )
+                } else if ( likely(get_page(page, d)) )
                 {
                     unsigned long type = 0;
 
@@ -339,6 +343,7 @@ long arch_do_domctl(
                 else
                     arr32[j] |= XEN_DOMCTL_PFINFO_XTAB;
 
+                put_gfn(d, gfn); 
             }
 
             if ( copy_to_guest_offset(domctl->u.getpageframeinfo2.array,
@@ -425,12 +430,13 @@ long arch_do_domctl(
             break;
         }
 
-        mfn = gmfn_to_mfn(d, gmfn);
+        mfn = get_gfn_untyped(d, gmfn);
 
         ret = -EACCES;
         if ( !mfn_valid(mfn) ||
              !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
         {
+            put_gfn(d, gmfn); 
             rcu_unlock_domain(d);
             break;
         }
@@ -443,6 +449,7 @@ long arch_do_domctl(
 
         put_page_and_type(mfn_to_page(mfn));
 
+        put_gfn(d, gmfn); 
         rcu_unlock_domain(d);
     }
     break;
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/hvm/emulate.c
--- a/xen/arch/x86/hvm/emulate.c
+++ b/xen/arch/x86/hvm/emulate.c
@@ -63,14 +63,18 @@ static int hvmemul_do_io(
     int rc;
 
     /* Check for paged out page */
-    ram_mfn = gfn_to_mfn_unshare(curr->domain, ram_gfn, &p2mt);
+    ram_mfn = get_gfn_unshare(curr->domain, ram_gfn, &p2mt);
     if ( p2m_is_paging(p2mt) )
     {
         p2m_mem_paging_populate(curr->domain, ram_gfn);
+        put_gfn(curr->domain, ram_gfn); 
         return X86EMUL_RETRY;
     }
     if ( p2m_is_shared(p2mt) )
+    {
+        put_gfn(curr->domain, ram_gfn); 
         return X86EMUL_RETRY;
+    }
 
     /*
      * Weird-sized accesses have undefined behaviour: we discard writes
@@ -82,6 +86,7 @@ static int hvmemul_do_io(
         ASSERT(p_data != NULL); /* cannot happen with a REP prefix */
         if ( dir == IOREQ_READ )
             memset(p_data, ~0, size);
+        put_gfn(curr->domain, ram_gfn); 
         return X86EMUL_UNHANDLEABLE;
     }
 
@@ -101,7 +106,10 @@ static int hvmemul_do_io(
             paddr_t pa = vio->mmio_large_write_pa;
             unsigned int bytes = vio->mmio_large_write_bytes;
             if ( (addr >= pa) && ((addr + size) <= (pa + bytes)) )
+            {
+                put_gfn(curr->domain, ram_gfn); 
                 return X86EMUL_OKAY;
+            }
         }
         else
         {
@@ -111,6 +119,7 @@ static int hvmemul_do_io(
             {
                 memcpy(p_data, &vio->mmio_large_read[addr - pa],
                        size);
+                put_gfn(curr->domain, ram_gfn); 
                 return X86EMUL_OKAY;
             }
         }
@@ -123,15 +132,22 @@ static int hvmemul_do_io(
     case HVMIO_completed:
         vio->io_state = HVMIO_none;
         if ( p_data == NULL )
+        {
+            put_gfn(curr->domain, ram_gfn);
             return X86EMUL_UNHANDLEABLE;
+        }
         goto finish_access;
     case HVMIO_dispatched:
         /* May have to wait for previous cycle of a multi-write to complete. */
         if ( is_mmio && !value_is_ptr && (dir == IOREQ_WRITE) &&
              (addr == (vio->mmio_large_write_pa +
                        vio->mmio_large_write_bytes)) )
+        {
+            put_gfn(curr->domain, ram_gfn);
             return X86EMUL_RETRY;
+        }
     default:
+        put_gfn(curr->domain, ram_gfn);
         return X86EMUL_UNHANDLEABLE;
     }
 
@@ -139,6 +155,7 @@ static int hvmemul_do_io(
     {
         gdprintk(XENLOG_WARNING, "WARNING: io already pending (%d)?\n",
                  p->state);
+        put_gfn(curr->domain, ram_gfn); 
         return X86EMUL_UNHANDLEABLE;
     }
 
@@ -189,7 +206,10 @@ static int hvmemul_do_io(
     }
 
     if ( rc != X86EMUL_OKAY )
+    {
+        put_gfn(curr->domain, ram_gfn); 
         return rc;
+    }
 
  finish_access:
     if ( p_data != NULL )
@@ -223,6 +243,7 @@ static int hvmemul_do_io(
         }
     }
 
+    put_gfn(curr->domain, ram_gfn); 
     return X86EMUL_OKAY;
 }
 
@@ -671,12 +692,14 @@ static int hvmemul_rep_movs(
     if ( rc != X86EMUL_OKAY )
         return rc;
 
-    (void)gfn_to_mfn(current->domain, sgpa >> PAGE_SHIFT, &p2mt);
+    /* Unlocked works here because we get_gfn for real in whatever
+     * we call later. */
+    (void)get_gfn_unlocked(current->domain, sgpa >> PAGE_SHIFT, &p2mt);
     if ( !p2m_is_ram(p2mt) && !p2m_is_grant(p2mt) )
         return hvmemul_do_mmio(
             sgpa, reps, bytes_per_rep, dgpa, IOREQ_READ, df, NULL);
 
-    (void)gfn_to_mfn(current->domain, dgpa >> PAGE_SHIFT, &p2mt);
+    (void)get_gfn_unlocked(current->domain, dgpa >> PAGE_SHIFT, &p2mt);
     if ( !p2m_is_ram(p2mt) && !p2m_is_grant(p2mt) )
         return hvmemul_do_mmio(
             dgpa, reps, bytes_per_rep, sgpa, IOREQ_WRITE, df, NULL);
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -355,26 +355,37 @@ static int hvm_set_ioreq_page(
     unsigned long mfn;
     void *va;
 
-    mfn = mfn_x(gfn_to_mfn_unshare(d, gmfn, &p2mt));
+    mfn = mfn_x(get_gfn_unshare(d, gmfn, &p2mt));
     if ( !p2m_is_ram(p2mt) )
+    {
+        put_gfn(d, gmfn);
         return -EINVAL;
+    }
     if ( p2m_is_paging(p2mt) )
     {
         p2m_mem_paging_populate(d, gmfn);
+        put_gfn(d, gmfn);
         return -ENOENT;
     }
     if ( p2m_is_shared(p2mt) )
+    {
+        put_gfn(d, gmfn);
         return -ENOENT;
+    }
     ASSERT(mfn_valid(mfn));
 
     page = mfn_to_page(mfn);
     if ( !get_page_and_type(page, d, PGT_writable_page) )
+    {
+        put_gfn(d, gmfn);
         return -EINVAL;
+    }
 
     va = map_domain_page_global(mfn);
     if ( va == NULL )
     {
         put_page_and_type(page);
+        put_gfn(d, gmfn);
         return -ENOMEM;
     }
 
@@ -385,6 +396,7 @@ static int hvm_set_ioreq_page(
         spin_unlock(&iorp->lock);
         unmap_domain_page_global(va);
         put_page_and_type(mfn_to_page(mfn));
+        put_gfn(d, gmfn);
         return -EINVAL;
     }
 
@@ -392,6 +404,7 @@ static int hvm_set_ioreq_page(
     iorp->page = page;
 
     spin_unlock(&iorp->lock);
+    put_gfn(d, gmfn);
 
     domain_unpause(d);
 
@@ -1182,6 +1195,7 @@ int hvm_hap_nested_page_fault(unsigned l
     mfn_t mfn;
     struct vcpu *v = current;
     struct p2m_domain *p2m;
+    int rc;
 
     /* On Nested Virtualization, walk the guest page table.
      * If this succeeds, all is fine.
@@ -1216,7 +1230,7 @@ int hvm_hap_nested_page_fault(unsigned l
     }
 
     p2m = p2m_get_hostp2m(v->domain);
-    mfn = gfn_to_mfn_type_p2m(p2m, gfn, &p2mt, &p2ma, p2m_guest, NULL);
+    mfn = get_gfn_type_access(p2m, gfn, &p2mt, &p2ma, p2m_guest, NULL);
 
     /* Check access permissions first, then handle faults */
     if ( access_valid && (mfn_x(mfn) != INVALID_MFN) )
@@ -1255,8 +1269,8 @@ int hvm_hap_nested_page_fault(unsigned l
         if ( violation )
         {
             p2m_mem_access_check(gpa, gla_valid, gla, access_r, access_w, access_x);
-
-            return 1;
+            rc = 1;
+            goto out_put_gfn;
         }
     }
 
@@ -1268,7 +1282,8 @@ int hvm_hap_nested_page_fault(unsigned l
     {
         if ( !handle_mmio() )
             hvm_inject_exception(TRAP_gp_fault, 0, 0);
-        return 1;
+        rc = 1;
+        goto out_put_gfn;
     }
 
 #ifdef __x86_64__
@@ -1281,7 +1296,8 @@ int hvm_hap_nested_page_fault(unsigned l
     {
         ASSERT(!p2m_is_nestedp2m(p2m));
         mem_sharing_unshare_page(p2m->domain, gfn, 0);
-        return 1;
+        rc = 1;
+        goto out_put_gfn;
     }
 #endif
  
@@ -1295,7 +1311,8 @@ int hvm_hap_nested_page_fault(unsigned l
          */
         paging_mark_dirty(v->domain, mfn_x(mfn));
         p2m_change_type(v->domain, gfn, p2m_ram_logdirty, p2m_ram_rw);
-        return 1;
+        rc = 1;
+        goto out_put_gfn;
     }
 
     /* Shouldn't happen: Maybe the guest was writing to a r/o grant mapping? */
@@ -1304,10 +1321,14 @@ int hvm_hap_nested_page_fault(unsigned l
         gdprintk(XENLOG_WARNING,
                  "trying to write to read-only grant mapping\n");
         hvm_inject_exception(TRAP_gp_fault, 0, 0);
-        return 1;
+        rc = 1;
+        goto out_put_gfn;
     }
 
-    return 0;
+    rc = 0;
+out_put_gfn:
+    put_gfn(p2m->domain, gfn);
+    return rc;
 }
 
 int hvm_handle_xsetbv(u64 new_bv)
@@ -1530,10 +1551,11 @@ int hvm_set_cr0(unsigned long value)
         {
             /* The guest CR3 must be pointing to the guest physical. */
             gfn = v->arch.hvm_vcpu.guest_cr[3]>>PAGE_SHIFT;
-            mfn = mfn_x(gfn_to_mfn(v->domain, gfn, &p2mt));
+            mfn = mfn_x(get_gfn(v->domain, gfn, &p2mt));
             if ( !p2m_is_ram(p2mt) || !mfn_valid(mfn) ||
                  !get_page(mfn_to_page(mfn), v->domain))
             {
+                put_gfn(v->domain, gfn);
                 gdprintk(XENLOG_ERR, "Invalid CR3 value = %lx (mfn=%lx)\n",
                          v->arch.hvm_vcpu.guest_cr[3], mfn);
                 domain_crash(v->domain);
@@ -1545,6 +1567,7 @@ int hvm_set_cr0(unsigned long value)
 
             HVM_DBG_LOG(DBG_LEVEL_VMMU, "Update CR3 value = %lx, mfn = %lx",
                         v->arch.hvm_vcpu.guest_cr[3], mfn);
+            put_gfn(v->domain, gfn);
         }
     }
     else if ( !(value & X86_CR0_PG) && (old_value & X86_CR0_PG) )
@@ -1621,13 +1644,17 @@ int hvm_set_cr3(unsigned long value)
     {
         /* Shadow-mode CR3 change. Check PDBR and update refcounts. */
         HVM_DBG_LOG(DBG_LEVEL_VMMU, "CR3 value = %lx", value);
-        mfn = mfn_x(gfn_to_mfn(v->domain, value >> PAGE_SHIFT, &p2mt));
+        mfn = mfn_x(get_gfn(v->domain, value >> PAGE_SHIFT, &p2mt));
         if ( !p2m_is_ram(p2mt) || !mfn_valid(mfn) ||
              !get_page(mfn_to_page(mfn), v->domain) )
+        {
+              put_gfn(v->domain, value >> PAGE_SHIFT);
               goto bad_cr3;
+        }
 
         put_page(pagetable_get_page(v->arch.guest_table));
         v->arch.guest_table = pagetable_from_pfn(mfn);
+        put_gfn(v->domain, value >> PAGE_SHIFT);
 
         HVM_DBG_LOG(DBG_LEVEL_VMMU, "Update CR3 value = %lx", value);
     }
@@ -1764,6 +1791,7 @@ int hvm_virtual_to_linear_addr(
     return 0;
 }
 
+/* We leave this function holding a lock on the p2m entry */
 static void *__hvm_map_guest_frame(unsigned long gfn, bool_t writable)
 {
     unsigned long mfn;
@@ -1771,13 +1799,17 @@ static void *__hvm_map_guest_frame(unsig
     struct domain *d = current->domain;
 
     mfn = mfn_x(writable
-                ? gfn_to_mfn_unshare(d, gfn, &p2mt)
-                : gfn_to_mfn(d, gfn, &p2mt));
+                ? get_gfn_unshare(d, gfn, &p2mt)
+                : get_gfn(d, gfn, &p2mt));
     if ( (p2m_is_shared(p2mt) && writable) || !p2m_is_ram(p2mt) )
+    {
+        put_gfn(d, gfn);
         return NULL;
+    }
     if ( p2m_is_paging(p2mt) )
     {
         p2m_mem_paging_populate(d, gfn);
+        put_gfn(d, gfn);
         return NULL;
     }
 
@@ -1805,9 +1837,8 @@ void hvm_unmap_guest_frame(void *p)
         unmap_domain_page(p);
 }
 
-static void *hvm_map_entry(unsigned long va)
+static void *hvm_map_entry(unsigned long va, unsigned long *gfn)
 {
-    unsigned long gfn;
     uint32_t pfec;
     char *v;
 
@@ -1824,11 +1855,11 @@ static void *hvm_map_entry(unsigned long
      * treat it as a kernel-mode read (i.e. no access checks).
      */
     pfec = PFEC_page_present;
-    gfn = paging_gva_to_gfn(current, va, &pfec);
+    *gfn = paging_gva_to_gfn(current, va, &pfec);
     if ( (pfec == PFEC_page_paged) || (pfec == PFEC_page_shared) )
         goto fail;
 
-    v = hvm_map_guest_frame_rw(gfn);
+    v = hvm_map_guest_frame_rw(*gfn);
     if ( v == NULL )
         goto fail;
 
@@ -1839,9 +1870,11 @@ static void *hvm_map_entry(unsigned long
     return NULL;
 }
 
-static void hvm_unmap_entry(void *p)
+static void hvm_unmap_entry(void *p, unsigned long gfn)
 {
     hvm_unmap_guest_frame(p);
+    if ( p && (gfn != INVALID_GFN) )
+        put_gfn(current->domain, gfn);
 }
 
 static int hvm_load_segment_selector(
@@ -1853,6 +1886,7 @@ static int hvm_load_segment_selector(
     int fault_type = TRAP_invalid_tss;
     struct cpu_user_regs *regs = guest_cpu_user_regs();
     struct vcpu *v = current;
+    unsigned long pdesc_gfn = INVALID_GFN;
 
     if ( regs->eflags & X86_EFLAGS_VM )
     {
@@ -1886,7 +1920,7 @@ static int hvm_load_segment_selector(
     if ( ((sel & 0xfff8) + 7) > desctab.limit )
         goto fail;
 
-    pdesc = hvm_map_entry(desctab.base + (sel & 0xfff8));
+    pdesc = hvm_map_entry(desctab.base + (sel & 0xfff8), &pdesc_gfn);
     if ( pdesc == NULL )
         goto hvm_map_fail;
 
@@ -1946,7 +1980,7 @@ static int hvm_load_segment_selector(
     desc.b |= 0x100;
 
  skip_accessed_flag:
-    hvm_unmap_entry(pdesc);
+    hvm_unmap_entry(pdesc, pdesc_gfn);
 
     segr.base = (((desc.b <<  0) & 0xff000000u) |
                  ((desc.b << 16) & 0x00ff0000u) |
@@ -1962,7 +1996,7 @@ static int hvm_load_segment_selector(
     return 0;
 
  unmap_and_fail:
-    hvm_unmap_entry(pdesc);
+    hvm_unmap_entry(pdesc, pdesc_gfn);
  fail:
     hvm_inject_exception(fault_type, sel & 0xfffc, 0);
  hvm_map_fail:
@@ -1977,7 +2011,7 @@ void hvm_task_switch(
     struct cpu_user_regs *regs = guest_cpu_user_regs();
     struct segment_register gdt, tr, prev_tr, segr;
     struct desc_struct *optss_desc = NULL, *nptss_desc = NULL, tss_desc;
-    unsigned long eflags;
+    unsigned long eflags, optss_gfn = INVALID_GFN, nptss_gfn = INVALID_GFN;
     int exn_raised, rc;
     struct {
         u16 back_link,__blh;
@@ -2003,11 +2037,11 @@ void hvm_task_switch(
         goto out;
     }
 
-    optss_desc = hvm_map_entry(gdt.base + (prev_tr.sel & 0xfff8));
+    optss_desc = hvm_map_entry(gdt.base + (prev_tr.sel & 0xfff8), &optss_gfn);
     if ( optss_desc == NULL )
         goto out;
 
-    nptss_desc = hvm_map_entry(gdt.base + (tss_sel & 0xfff8));
+    nptss_desc = hvm_map_entry(gdt.base + (tss_sel & 0xfff8), &nptss_gfn);
     if ( nptss_desc == NULL )
         goto out;
 
@@ -2172,8 +2206,8 @@ void hvm_task_switch(
     }
 
  out:
-    hvm_unmap_entry(optss_desc);
-    hvm_unmap_entry(nptss_desc);
+    hvm_unmap_entry(optss_desc, optss_gfn);
+    hvm_unmap_entry(nptss_desc, nptss_gfn);
 }
 
 #define HVMCOPY_from_guest (0u<<0)
@@ -2230,19 +2264,29 @@ static enum hvm_copy_result __hvm_copy(
             gfn = addr >> PAGE_SHIFT;
         }
 
-        mfn = mfn_x(gfn_to_mfn_unshare(curr->domain, gfn, &p2mt));
+        mfn = mfn_x(get_gfn_unshare(curr->domain, gfn, &p2mt));
 
         if ( p2m_is_paging(p2mt) )
         {
             p2m_mem_paging_populate(curr->domain, gfn);
+            put_gfn(curr->domain, gfn);
             return HVMCOPY_gfn_paged_out;
         }
         if ( p2m_is_shared(p2mt) )
+        {
+            put_gfn(curr->domain, gfn);
             return HVMCOPY_gfn_shared;
+        }
         if ( p2m_is_grant(p2mt) )
+        {
+            put_gfn(curr->domain, gfn);
             return HVMCOPY_unhandleable;
+        }
         if ( !p2m_is_ram(p2mt) )
+        {
+            put_gfn(curr->domain, gfn);
             return HVMCOPY_bad_gfn_to_mfn;
+        }
         ASSERT(mfn_valid(mfn));
 
         p = (char *)map_domain_page(mfn) + (addr & ~PAGE_MASK);
@@ -2273,6 +2317,7 @@ static enum hvm_copy_result __hvm_copy(
         addr += count;
         buf  += count;
         todo -= count;
+        put_gfn(curr->domain, gfn);
     }
 
     return HVMCOPY_okay;
@@ -3697,11 +3742,11 @@ long do_hvm_op(unsigned long op, XEN_GUE
         for ( pfn = a.first_pfn; pfn < a.first_pfn + a.nr; pfn++ )
         {
             p2m_type_t t;
-            mfn_t mfn = gfn_to_mfn(d, pfn, &t);
+            mfn_t mfn = get_gfn(d, pfn, &t);
             if ( p2m_is_paging(t) )
             {
                 p2m_mem_paging_populate(d, pfn);
-
+                put_gfn(d, pfn);
                 rc = -EINVAL;
                 goto param_fail3;
             }
@@ -3716,6 +3761,7 @@ long do_hvm_op(unsigned long op, XEN_GUE
                 /* don't take a long time and don't die either */
                 sh_remove_shadows(d->vcpu[0], mfn, 1, 0);
             }
+            put_gfn(d, pfn);
         }
 
     param_fail3:
@@ -3739,7 +3785,7 @@ long do_hvm_op(unsigned long op, XEN_GUE
         rc = -EINVAL;
         if ( is_hvm_domain(d) )
         {
-            gfn_to_mfn_unshare(d, a.pfn, &t);
+            get_gfn_unshare_unlocked(d, a.pfn, &t);
             if ( p2m_is_mmio(t) )
                 a.mem_type =  HVMMEM_mmio_dm;
             else if ( p2m_is_readonly(t) )
@@ -3792,20 +3838,23 @@ long do_hvm_op(unsigned long op, XEN_GUE
             p2m_type_t t;
             p2m_type_t nt;
             mfn_t mfn;
-            mfn = gfn_to_mfn_unshare(d, pfn, &t);
+            mfn = get_gfn_unshare(d, pfn, &t);
             if ( p2m_is_paging(t) )
             {
                 p2m_mem_paging_populate(d, pfn);
+                put_gfn(d, pfn);
                 rc = -EINVAL;
                 goto param_fail4;
             }
             if ( p2m_is_shared(t) )
             {
+                put_gfn(d, pfn);
                 rc = -EINVAL;
                 goto param_fail4;
             } 
             if ( p2m_is_grant(t) )
             {
+                put_gfn(d, pfn);
                 gdprintk(XENLOG_WARNING,
                          "type for pfn 0x%lx changed to grant while "
                          "we were working?\n", pfn);
@@ -3816,6 +3865,7 @@ long do_hvm_op(unsigned long op, XEN_GUE
                 nt = p2m_change_type(d, pfn, t, memtype[a.hvmmem_type]);
                 if ( nt != t )
                 {
+                    put_gfn(d, pfn);
                     gdprintk(XENLOG_WARNING,
                              "type of pfn 0x%lx changed from %d to %d while "
                              "we were trying to change it to %d\n",
@@ -3823,6 +3873,7 @@ long do_hvm_op(unsigned long op, XEN_GUE
                     goto param_fail4;
                 }
             }
+            put_gfn(d, pfn);
         }
 
         rc = 0;
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/hvm/mtrr.c
--- a/xen/arch/x86/hvm/mtrr.c
+++ b/xen/arch/x86/hvm/mtrr.c
@@ -389,7 +389,7 @@ uint32_t get_pat_flags(struct vcpu *v,
     {
         struct domain *d = v->domain;
         p2m_type_t p2mt;
-        gfn_to_mfn_query(d, paddr_to_pfn(gpaddr), &p2mt);
+        get_gfn_query_unlocked(d, paddr_to_pfn(gpaddr), &p2mt);
         if (p2m_is_ram(p2mt))
             gdprintk(XENLOG_WARNING,
                     "Conflict occurs for a given guest l1e flags:%x "
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/hvm/stdvga.c
--- a/xen/arch/x86/hvm/stdvga.c
+++ b/xen/arch/x86/hvm/stdvga.c
@@ -482,7 +482,7 @@ static int mmio_move(struct hvm_hw_stdvg
                 if ( hvm_copy_to_guest_phys(data, &tmp, p->size) !=
                      HVMCOPY_okay )
                 {
-                    (void)gfn_to_mfn(d, data >> PAGE_SHIFT, &p2mt);
+                    (void)get_gfn_unlocked(d, data >> PAGE_SHIFT, &p2mt);
                     /*
                      * The only case we handle is vga_mem <-> vga_mem.
                      * Anything else disables caching and leaves it to qemu-dm.
@@ -504,7 +504,7 @@ static int mmio_move(struct hvm_hw_stdvg
                 if ( hvm_copy_from_guest_phys(&tmp, data, p->size) !=
                      HVMCOPY_okay )
                 {
-                    (void)gfn_to_mfn(d, data >> PAGE_SHIFT, &p2mt);
+                    (void)get_gfn_unlocked(d, data >> PAGE_SHIFT, &p2mt);
                     if ( (p2mt != p2m_mmio_dm) || (data < VGA_MEM_BASE) ||
                          ((data + p->size) > (VGA_MEM_BASE + VGA_MEM_SIZE)) )
                         return 0;
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/hvm/svm/nestedsvm.c
--- a/xen/arch/x86/hvm/svm/nestedsvm.c
+++ b/xen/arch/x86/hvm/svm/nestedsvm.c
@@ -81,6 +81,10 @@ int nestedsvm_vmcb_map(struct vcpu *v, u
         if (nv->nv_vvmcx == NULL)
             return 0;
         nv->nv_vvmcxaddr = vmcbaddr;
+        /* put_gfn here even though the map survives beyond this caller.
+         * The map can likely survive beyond a hypervisor exit, thus we
+         * need to put the gfn */
+        put_gfn(current->domain, vmcbaddr >> PAGE_SHIFT);
     }
 
     return 1;
@@ -354,6 +358,7 @@ static int nsvm_vmrun_permissionmap(stru
     ioport_80 = test_bit(0x80, ns_viomap);
     ioport_ed = test_bit(0xed, ns_viomap);
     hvm_unmap_guest_frame(ns_viomap);
+    put_gfn(current->domain, svm->ns_iomap_pa >> PAGE_SHIFT);
 
     svm->ns_iomap = nestedhvm_vcpu_iomap_get(ioport_80, ioport_ed);
 
@@ -857,23 +862,25 @@ nsvm_vmcb_guest_intercepts_ioio(paddr_t 
     ioio_info_t ioinfo;
     uint16_t port;
     bool_t enabled;
+    unsigned long gfn = 0; /* gcc ... */
 
     ioinfo.bytes = exitinfo1;
     port = ioinfo.fields.port;
 
     switch (port) {
     case 0 ... 32767: /* first 4KB page */
-        io_bitmap = hvm_map_guest_frame_ro(iopm_gfn);
+        gfn = iopm_gfn;
         break;
     case 32768 ... 65535: /* second 4KB page */
         port -= 32768;
-        io_bitmap = hvm_map_guest_frame_ro(iopm_gfn+1);
+        gfn = iopm_gfn + 1;
         break;
     default:
         BUG();
         break;
     }
 
+    io_bitmap = hvm_map_guest_frame_ro(gfn);
     if (io_bitmap == NULL) {
         gdprintk(XENLOG_ERR,
             "IOIO intercept: mapping of permission map failed\n");
@@ -882,6 +889,8 @@ nsvm_vmcb_guest_intercepts_ioio(paddr_t 
 
     enabled = test_bit(port, io_bitmap);
     hvm_unmap_guest_frame(io_bitmap);
+    put_gfn(current->domain, gfn);
+
     if (!enabled)
         return NESTEDHVM_VMEXIT_HOST;
 
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -244,9 +244,10 @@ static int svm_vmcb_restore(struct vcpu 
     {
         if ( c->cr0 & X86_CR0_PG )
         {
-            mfn = mfn_x(gfn_to_mfn(v->domain, c->cr3 >> PAGE_SHIFT, &p2mt));
+            mfn = mfn_x(get_gfn(v->domain, c->cr3 >> PAGE_SHIFT, &p2mt));
             if ( !p2m_is_ram(p2mt) || !get_page(mfn_to_page(mfn), v->domain) )
             {
+                put_gfn(v->domain, c->cr3 >> PAGE_SHIFT);
                 gdprintk(XENLOG_ERR, "Invalid CR3 value=0x%"PRIx64"\n",
                          c->cr3);
                 return -EINVAL;
@@ -257,6 +258,8 @@ static int svm_vmcb_restore(struct vcpu 
             put_page(pagetable_get_page(v->arch.guest_table));
 
         v->arch.guest_table = pagetable_from_pfn(mfn);
+        if ( c->cr0 & X86_CR0_PG )
+            put_gfn(v->domain, c->cr3 >> PAGE_SHIFT);
     }
 
     v->arch.hvm_vcpu.guest_cr[0] = c->cr0 | X86_CR0_ET;
@@ -1161,7 +1164,9 @@ static void svm_do_nested_pgfault(struct
         p2m = p2m_get_p2m(v);
         _d.gpa = gpa;
         _d.qualification = 0;
-        _d.mfn = mfn_x(gfn_to_mfn_type_p2m(p2m, gfn, &_d.p2mt, &p2ma, p2m_query, NULL));
+        mfn = get_gfn_type_access(p2m, gfn, &_d.p2mt, &p2ma, p2m_query, NULL);
+        __put_gfn(p2m, gfn);
+        _d.mfn = mfn_x(mfn);
         
         __trace_var(TRC_HVM_NPF, 0, sizeof(_d), &_d);
     }
@@ -1181,7 +1186,8 @@ static void svm_do_nested_pgfault(struct
     if ( p2m == NULL )
         p2m = p2m_get_p2m(v);
     /* Everything else is an error. */
-    mfn = gfn_to_mfn_type_p2m(p2m, gfn, &p2mt, &p2ma, p2m_guest, NULL);
+    mfn = get_gfn_type_access(p2m, gfn, &p2mt, &p2ma, p2m_guest, NULL);
+    __put_gfn(p2m, gfn);
     gdprintk(XENLOG_ERR,
          "SVM violation gpa %#"PRIpaddr", mfn %#lx, type %i\n",
          gpa, mfn_x(mfn), p2mt);
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/hvm/viridian.c
--- a/xen/arch/x86/hvm/viridian.c
+++ b/xen/arch/x86/hvm/viridian.c
@@ -134,12 +134,13 @@ void dump_apic_assist(struct vcpu *v)
 static void enable_hypercall_page(struct domain *d)
 {
     unsigned long gmfn = d->arch.hvm_domain.viridian.hypercall_gpa.fields.pfn;
-    unsigned long mfn = gmfn_to_mfn(d, gmfn);
+    unsigned long mfn = get_gfn_untyped(d, gmfn);
     uint8_t *p;
 
     if ( !mfn_valid(mfn) ||
          !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
     {
+        put_gfn(d, gmfn); 
         gdprintk(XENLOG_WARNING, "Bad GMFN %lx (MFN %lx)\n", gmfn, mfn);
         return;
     }
@@ -162,13 +163,14 @@ static void enable_hypercall_page(struct
     unmap_domain_page(p);
 
     put_page_and_type(mfn_to_page(mfn));
+    put_gfn(d, gmfn); 
 }
 
 void initialize_apic_assist(struct vcpu *v)
 {
     struct domain *d = v->domain;
     unsigned long gmfn = v->arch.hvm_vcpu.viridian.apic_assist.fields.pfn;
-    unsigned long mfn = gmfn_to_mfn(d, gmfn);
+    unsigned long mfn = get_gfn_untyped(d, gmfn);
     uint8_t *p;
 
     /*
@@ -184,6 +186,7 @@ void initialize_apic_assist(struct vcpu 
     if ( !mfn_valid(mfn) ||
          !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
     {
+        put_gfn(d, gmfn); 
         gdprintk(XENLOG_WARNING, "Bad GMFN %lx (MFN %lx)\n", gmfn, mfn);
         return;
     }
@@ -195,6 +198,7 @@ void initialize_apic_assist(struct vcpu 
     unmap_domain_page(p);
 
     put_page_and_type(mfn_to_page(mfn));
+    put_gfn(d, gmfn); 
 }
 
 int wrmsr_viridian_regs(uint32_t idx, uint64_t val)
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -487,9 +487,10 @@ static int vmx_restore_cr0_cr3(
     {
         if ( cr0 & X86_CR0_PG )
         {
-            mfn = mfn_x(gfn_to_mfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt));
+            mfn = mfn_x(get_gfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt));
             if ( !p2m_is_ram(p2mt) || !get_page(mfn_to_page(mfn), v->domain) )
             {
+                put_gfn(v->domain, cr3 >> PAGE_SHIFT);
                 gdprintk(XENLOG_ERR, "Invalid CR3 value=0x%lx\n", cr3);
                 return -EINVAL;
             }
@@ -499,6 +500,8 @@ static int vmx_restore_cr0_cr3(
             put_page(pagetable_get_page(v->arch.guest_table));
 
         v->arch.guest_table = pagetable_from_pfn(mfn);
+        if ( cr0 & X86_CR0_PG )
+            put_gfn(v->domain, cr3 >> PAGE_SHIFT);
     }
 
     v->arch.hvm_vcpu.guest_cr[0] = cr0 | X86_CR0_ET;
@@ -1007,9 +1010,12 @@ static void vmx_load_pdptrs(struct vcpu 
     if ( cr3 & 0x1fUL )
         goto crash;
 
-    mfn = mfn_x(gfn_to_mfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt));
+    mfn = mfn_x(get_gfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt));
     if ( !p2m_is_ram(p2mt) )
+    {
+        put_gfn(v->domain, cr3 >> PAGE_SHIFT);
         goto crash;
+    }
 
     p = map_domain_page(mfn);
 
@@ -1037,6 +1043,7 @@ static void vmx_load_pdptrs(struct vcpu 
     vmx_vmcs_exit(v);
 
     unmap_domain_page(p);
+    put_gfn(v->domain, cr3 >> PAGE_SHIFT);
     return;
 
  crash:
@@ -2090,7 +2097,7 @@ static void ept_handle_violation(unsigne
 
         _d.gpa = gpa;
         _d.qualification = qualification;
-        _d.mfn = mfn_x(gfn_to_mfn_query(d, gfn, &_d.p2mt));
+        _d.mfn = mfn_x(get_gfn_query_unlocked(d, gfn, &_d.p2mt));
         
         __trace_var(TRC_HVM_NPF, 0, sizeof(_d), &_d);
     }
@@ -2106,7 +2113,7 @@ static void ept_handle_violation(unsigne
         return;
 
     /* Everything else is an error. */
-    mfn = gfn_to_mfn_guest(d, gfn, &p2mt);
+    mfn = get_gfn_guest_unlocked(d, gfn, &p2mt);
     gdprintk(XENLOG_ERR, "EPT violation %#lx (%c%c%c/%c%c%c), "
              "gpa %#"PRIpaddr", mfn %#lx, type %i.\n", 
              qualification, 
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/hvm/vmx/vvmx.c
--- a/xen/arch/x86/hvm/vmx/vvmx.c
+++ b/xen/arch/x86/hvm/vmx/vvmx.c
@@ -558,9 +558,12 @@ static void __map_io_bitmap(struct vcpu 
 
     index = vmcs_reg == IO_BITMAP_A ? 0 : 1;
     if (nvmx->iobitmap[index])
-        hvm_unmap_guest_frame (nvmx->iobitmap[index]);
+        hvm_unmap_guest_frame (nvmx->iobitmap[index]); 
     gpa = __get_vvmcs(vcpu_nestedhvm(v).nv_vvmcx, vmcs_reg);
     nvmx->iobitmap[index] = hvm_map_guest_frame_ro (gpa >> PAGE_SHIFT);
+    /* See comment in nestedsvm_vmcb_map re putting this gfn and 
+     * liveness of the map it backs */
+    put_gfn(current->domain, gpa >> PAGE_SHIFT);
 }
 
 static inline void map_io_bitmap_all(struct vcpu *v)
@@ -577,12 +580,12 @@ static void nvmx_purge_vvmcs(struct vcpu
 
     __clear_current_vvmcs(v);
     if ( nvcpu->nv_vvmcxaddr != VMCX_EADDR )
-        hvm_unmap_guest_frame (nvcpu->nv_vvmcx);
+        hvm_unmap_guest_frame(nvcpu->nv_vvmcx);
     nvcpu->nv_vvmcx == NULL;
     nvcpu->nv_vvmcxaddr = VMCX_EADDR;
     for (i=0; i<2; i++) {
         if ( nvmx->iobitmap[i] ) {
-            hvm_unmap_guest_frame (nvmx->iobitmap[i]);
+            hvm_unmap_guest_frame(nvmx->iobitmap[i]); 
             nvmx->iobitmap[i] = NULL;
         }
     }
@@ -1138,6 +1141,9 @@ int nvmx_handle_vmptrld(struct cpu_user_
         nvcpu->nv_vvmcx = hvm_map_guest_frame_rw (gpa >> PAGE_SHIFT);
         nvcpu->nv_vvmcxaddr = gpa;
         map_io_bitmap_all (v);
+        /* See comment in nestedsvm_vmcb_map regarding putting this 
+         * gfn and liveness of the map that uses it */
+        put_gfn(current->domain, gpa >> PAGE_SHIFT);
     }
 
     vmreturn(regs, VMSUCCEED);
@@ -1199,6 +1205,7 @@ int nvmx_handle_vmclear(struct cpu_user_
         if ( vvmcs ) 
             __set_vvmcs(vvmcs, NVMX_LAUNCH_STATE, 0);
         hvm_unmap_guest_frame(vvmcs);
+        put_gfn(current->domain, gpa >> PAGE_SHIFT);
     }
 
     vmreturn(regs, VMSUCCEED);
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -663,13 +663,19 @@ int map_ldt_shadow_page(unsigned int off
         return 0;
 
     gmfn = l1e_get_pfn(l1e);
-    mfn = gmfn_to_mfn(d, gmfn);
+    mfn = get_gfn_untyped(d, gmfn);
     if ( unlikely(!mfn_valid(mfn)) )
+    {
+        put_gfn(d, gmfn); 
         return 0;
+    }
 
     okay = get_page_and_type(mfn_to_page(mfn), d, PGT_seg_desc_page);
     if ( unlikely(!okay) )
+    {
+        put_gfn(d, gmfn); 
         return 0;
+    }
 
     nl1e = l1e_from_pfn(mfn, l1e_get_flags(l1e) | _PAGE_RW);
 
@@ -678,6 +684,7 @@ int map_ldt_shadow_page(unsigned int off
     v->arch.pv_vcpu.shadow_ldt_mapcnt++;
     spin_unlock(&v->arch.pv_vcpu.shadow_ldt_lock);
 
+    put_gfn(d, gmfn); 
     return 1;
 }
 
@@ -1798,7 +1805,6 @@ static int mod_l1_entry(l1_pgentry_t *pl
 {
     l1_pgentry_t ol1e;
     struct domain *pt_dom = pt_vcpu->domain;
-    unsigned long mfn;
     p2m_type_t p2mt;
     int rc = 0;
 
@@ -1815,9 +1821,14 @@ static int mod_l1_entry(l1_pgentry_t *pl
     if ( l1e_get_flags(nl1e) & _PAGE_PRESENT )
     {
         /* Translate foreign guest addresses. */
-        mfn = mfn_x(gfn_to_mfn(pg_dom, l1e_get_pfn(nl1e), &p2mt));
+        unsigned long mfn, gfn;
+        gfn = l1e_get_pfn(nl1e);
+        mfn = mfn_x(get_gfn(pg_dom, gfn, &p2mt));
         if ( !p2m_is_ram(p2mt) || unlikely(mfn == INVALID_MFN) )
+        {
+            put_gfn(pg_dom, gfn);
             return -EINVAL;
+        }
         ASSERT((mfn & ~(PADDR_MASK >> PAGE_SHIFT)) == 0);
         nl1e = l1e_from_pfn(mfn, l1e_get_flags(nl1e));
 
@@ -1825,6 +1836,7 @@ static int mod_l1_entry(l1_pgentry_t *pl
         {
             MEM_LOG("Bad L1 flags %x",
                     l1e_get_flags(nl1e) & l1_disallow_mask(pt_dom));
+            put_gfn(pg_dom, gfn);
             return -EINVAL;
         }
 
@@ -1835,12 +1847,14 @@ static int mod_l1_entry(l1_pgentry_t *pl
             if ( UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, pt_vcpu,
                               preserve_ad) )
                 return 0;
+            put_gfn(pg_dom, gfn);
             return -EBUSY;
         }
 
         switch ( rc = get_page_from_l1e(nl1e, pt_dom, pg_dom) )
         {
         default:
+            put_gfn(pg_dom, gfn);
             return rc;
         case 0:
             break;
@@ -1856,6 +1870,7 @@ static int mod_l1_entry(l1_pgentry_t *pl
             ol1e = nl1e;
             rc = -EBUSY;
         }
+        put_gfn(pg_dom, gfn);
     }
     else if ( unlikely(!UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, pt_vcpu,
                                      preserve_ad)) )
@@ -3023,7 +3038,7 @@ int do_mmuext_op(
             if ( paging_mode_refcounts(pg_owner) )
                 break;
 
-            mfn = gmfn_to_mfn(pg_owner, op.arg1.mfn);
+            mfn = get_gfn_untyped(pg_owner, op.arg1.mfn);
             rc = get_page_and_type_from_pagenr(mfn, type, pg_owner, 0, 1);
             okay = !rc;
             if ( unlikely(!okay) )
@@ -3032,6 +3047,7 @@ int do_mmuext_op(
                     rc = -EAGAIN;
                 else if ( rc != -EAGAIN )
                     MEM_LOG("Error while pinning mfn %lx", mfn);
+                put_gfn(pg_owner, op.arg1.mfn);
                 break;
             }
 
@@ -3040,6 +3056,7 @@ int do_mmuext_op(
             if ( (rc = xsm_memory_pin_page(d, page)) != 0 )
             {
                 put_page_and_type(page);
+                put_gfn(pg_owner, op.arg1.mfn);
                 okay = 0;
                 break;
             }
@@ -3049,6 +3066,7 @@ int do_mmuext_op(
             {
                 MEM_LOG("Mfn %lx already pinned", mfn);
                 put_page_and_type(page);
+                put_gfn(pg_owner, op.arg1.mfn);
                 okay = 0;
                 break;
             }
@@ -3067,6 +3085,7 @@ int do_mmuext_op(
                 spin_unlock(&pg_owner->page_alloc_lock);
                 if ( drop_ref )
                     put_page_and_type(page);
+                put_gfn(pg_owner, op.arg1.mfn);
             }
 
             break;
@@ -3079,9 +3098,10 @@ int do_mmuext_op(
             if ( paging_mode_refcounts(pg_owner) )
                 break;
 
-            mfn = gmfn_to_mfn(pg_owner, op.arg1.mfn);
+            mfn = get_gfn_untyped(pg_owner, op.arg1.mfn);
             if ( unlikely(!(okay = get_page_from_pagenr(mfn, pg_owner))) )
             {
+                put_gfn(pg_owner, op.arg1.mfn);
                 MEM_LOG("Mfn %lx bad domain", mfn);
                 break;
             }
@@ -3092,6 +3112,7 @@ int do_mmuext_op(
             {
                 okay = 0;
                 put_page(page);
+                put_gfn(pg_owner, op.arg1.mfn);
                 MEM_LOG("Mfn %lx not pinned", mfn);
                 break;
             }
@@ -3102,18 +3123,20 @@ int do_mmuext_op(
             /* A page is dirtied when its pin status is cleared. */
             paging_mark_dirty(pg_owner, mfn);
 
+            put_gfn(pg_owner, op.arg1.mfn);
             break;
         }
 
         case MMUEXT_NEW_BASEPTR:
-            okay = new_guest_cr3(gmfn_to_mfn(d, op.arg1.mfn));
+            okay = new_guest_cr3(get_gfn_untyped(d, op.arg1.mfn));
+            put_gfn(d, op.arg1.mfn);
             break;
         
 #ifdef __x86_64__
         case MMUEXT_NEW_USER_BASEPTR: {
             unsigned long old_mfn, mfn;
 
-            mfn = gmfn_to_mfn(d, op.arg1.mfn);
+            mfn = get_gfn_untyped(d, op.arg1.mfn);
             if ( mfn != 0 )
             {
                 if ( paging_mode_refcounts(d) )
@@ -3123,6 +3146,7 @@ int do_mmuext_op(
                         mfn, PGT_root_page_table, d, 0, 0);
                 if ( unlikely(!okay) )
                 {
+                    put_gfn(d, op.arg1.mfn);
                     MEM_LOG("Error while installing new mfn %lx", mfn);
                     break;
                 }
@@ -3130,6 +3154,7 @@ int do_mmuext_op(
 
             old_mfn = pagetable_get_pfn(curr->arch.guest_table_user);
             curr->arch.guest_table_user = pagetable_from_pfn(mfn);
+            put_gfn(d, op.arg1.mfn);
 
             if ( old_mfn != 0 )
             {
@@ -3247,11 +3272,12 @@ int do_mmuext_op(
             unsigned long mfn;
             unsigned char *ptr;
 
-            mfn = gmfn_to_mfn(d, op.arg1.mfn);
+            mfn = get_gfn_untyped(d, op.arg1.mfn);
             okay = !get_page_and_type_from_pagenr(
                 mfn, PGT_writable_page, d, 0, 0);
             if ( unlikely(!okay) )
             {
+                put_gfn(d, op.arg1.mfn);
                 MEM_LOG("Error while clearing mfn %lx", mfn);
                 break;
             }
@@ -3264,6 +3290,7 @@ int do_mmuext_op(
             fixunmap_domain_page(ptr);
 
             put_page_and_type(mfn_to_page(mfn));
+            put_gfn(d, op.arg1.mfn);
             break;
         }
 
@@ -3273,20 +3300,23 @@ int do_mmuext_op(
             unsigned char *dst;
             unsigned long src_mfn, mfn;
 
-            src_mfn = gmfn_to_mfn(d, op.arg2.src_mfn);
+            src_mfn = get_gfn_untyped(d, op.arg2.src_mfn);
             okay = get_page_from_pagenr(src_mfn, d);
             if ( unlikely(!okay) )
             {
+                put_gfn(d, op.arg2.src_mfn);
                 MEM_LOG("Error while copying from mfn %lx", src_mfn);
                 break;
             }
 
-            mfn = gmfn_to_mfn(d, op.arg1.mfn);
+            mfn = get_gfn_untyped(d, op.arg1.mfn);
             okay = !get_page_and_type_from_pagenr(
                 mfn, PGT_writable_page, d, 0, 0);
             if ( unlikely(!okay) )
             {
+                put_gfn(d, op.arg1.mfn);
                 put_page(mfn_to_page(src_mfn));
+                put_gfn(d, op.arg2.src_mfn);
                 MEM_LOG("Error while copying to mfn %lx", mfn);
                 break;
             }
@@ -3301,7 +3331,9 @@ int do_mmuext_op(
             unmap_domain_page(src);
 
             put_page_and_type(mfn_to_page(mfn));
+            put_gfn(d, op.arg1.mfn);
             put_page(mfn_to_page(src_mfn));
+            put_gfn(d, op.arg2.src_mfn);
             break;
         }
 
@@ -3489,14 +3521,14 @@ int do_mmu_update(
 
             req.ptr -= cmd;
             gmfn = req.ptr >> PAGE_SHIFT;
-            mfn = mfn_x(gfn_to_mfn(pt_owner, gmfn, &p2mt));
+            mfn = mfn_x(get_gfn(pt_owner, gmfn, &p2mt));
             if ( !p2m_is_valid(p2mt) )
-              mfn = INVALID_MFN;
+                mfn = INVALID_MFN;
 
             if ( p2m_is_paged(p2mt) )
             {
                 p2m_mem_paging_populate(pg_owner, gmfn);
-
+                put_gfn(pt_owner, gmfn);
                 rc = -ENOENT;
                 break;
             }
@@ -3504,6 +3536,7 @@ int do_mmu_update(
             if ( unlikely(!get_page_from_pagenr(mfn, pt_owner)) )
             {
                 MEM_LOG("Could not get page for normal update");
+                put_gfn(pt_owner, gmfn);
                 break;
             }
 
@@ -3516,6 +3549,7 @@ int do_mmu_update(
             if ( rc ) {
                 unmap_domain_page_with_cache(va, &mapcache);
                 put_page(page);
+                put_gfn(pt_owner, gmfn);
                 break;
             }
 
@@ -3527,16 +3561,20 @@ int do_mmu_update(
                 {
                     l1_pgentry_t l1e = l1e_from_intpte(req.val);
                     p2m_type_t l1e_p2mt;
-                    gfn_to_mfn(pg_owner, l1e_get_pfn(l1e), &l1e_p2mt);
+                    unsigned long l1egfn = l1e_get_pfn(l1e), l1emfn;
+    
+                    l1emfn = mfn_x(get_gfn(pg_owner, l1egfn, &l1e_p2mt));
 
                     if ( p2m_is_paged(l1e_p2mt) )
                     {
                         p2m_mem_paging_populate(pg_owner, l1e_get_pfn(l1e));
+                        put_gfn(pg_owner, l1egfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_paging_in_start == l1e_p2mt && !mfn_valid(mfn) )
                     {
+                        put_gfn(pg_owner, l1egfn);
                         rc = -ENOENT;
                         break;
                     }
@@ -3553,7 +3591,10 @@ int do_mmu_update(
                                                           l1e_get_pfn(l1e), 
                                                           0);
                             if ( rc )
+                            {
+                                put_gfn(pg_owner, l1egfn);
                                 break; 
+                            }
                         }
                     } 
 #endif
@@ -3561,27 +3602,33 @@ int do_mmu_update(
                     rc = mod_l1_entry(va, l1e, mfn,
                                       cmd == MMU_PT_UPDATE_PRESERVE_AD, v,
                                       pg_owner);
+                    put_gfn(pg_owner, l1egfn);
                 }
                 break;
                 case PGT_l2_page_table:
                 {
                     l2_pgentry_t l2e = l2e_from_intpte(req.val);
                     p2m_type_t l2e_p2mt;
-                    gfn_to_mfn(pg_owner, l2e_get_pfn(l2e), &l2e_p2mt);
+                    unsigned long l2egfn = l2e_get_pfn(l2e), l2emfn;
+
+                    l2emfn = mfn_x(get_gfn(pg_owner, l2egfn, &l2e_p2mt));
 
                     if ( p2m_is_paged(l2e_p2mt) )
                     {
-                        p2m_mem_paging_populate(pg_owner, l2e_get_pfn(l2e));
+                        p2m_mem_paging_populate(pg_owner, l2egfn);
+                        put_gfn(pg_owner, l2egfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_paging_in_start == l2e_p2mt && !mfn_valid(mfn) )
                     {
+                        put_gfn(pg_owner, l2egfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_shared == l2e_p2mt )
                     {
+                        put_gfn(pg_owner, l2egfn);
                         MEM_LOG("Unexpected attempt to map shared page.\n");
                         break;
                     }
@@ -3589,33 +3636,40 @@ int do_mmu_update(
 
                     rc = mod_l2_entry(va, l2e, mfn,
                                       cmd == MMU_PT_UPDATE_PRESERVE_AD, v);
+                    put_gfn(pg_owner, l2egfn);
                 }
                 break;
                 case PGT_l3_page_table:
                 {
                     l3_pgentry_t l3e = l3e_from_intpte(req.val);
                     p2m_type_t l3e_p2mt;
-                    gfn_to_mfn(pg_owner, l3e_get_pfn(l3e), &l3e_p2mt);
+                    unsigned long l3egfn = l3e_get_pfn(l3e), l3emfn;
+
+                    l3emfn = mfn_x(get_gfn(pg_owner, l3egfn, &l3e_p2mt));
 
                     if ( p2m_is_paged(l3e_p2mt) )
                     {
-                        p2m_mem_paging_populate(pg_owner, l3e_get_pfn(l3e));
+                        p2m_mem_paging_populate(pg_owner, l3egfn);
+                        put_gfn(pg_owner, l3egfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_paging_in_start == l3e_p2mt && !mfn_valid(mfn) )
                     {
+                        put_gfn(pg_owner, l3egfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_shared == l3e_p2mt )
                     {
+                        put_gfn(pg_owner, l3egfn);
                         MEM_LOG("Unexpected attempt to map shared page.\n");
                         break;
                     }
 
                     rc = mod_l3_entry(va, l3e, mfn,
                                       cmd == MMU_PT_UPDATE_PRESERVE_AD, 1, v);
+                    put_gfn(pg_owner, l3egfn);
                 }
                 break;
 #if CONFIG_PAGING_LEVELS >= 4
@@ -3623,27 +3677,33 @@ int do_mmu_update(
                 {
                     l4_pgentry_t l4e = l4e_from_intpte(req.val);
                     p2m_type_t l4e_p2mt;
-                    gfn_to_mfn(pg_owner, l4e_get_pfn(l4e), &l4e_p2mt);
+                    unsigned long l4egfn = l4e_get_pfn(l4e), l4emfn;
+
+                    l4emfn = mfn_x(get_gfn(pg_owner, l4egfn, &l4e_p2mt));
 
                     if ( p2m_is_paged(l4e_p2mt) )
                     {
-                        p2m_mem_paging_populate(pg_owner, l4e_get_pfn(l4e));
+                        p2m_mem_paging_populate(pg_owner, l4egfn);
+                        put_gfn(pg_owner, l4egfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_paging_in_start == l4e_p2mt && !mfn_valid(mfn) )
                     {
+                        put_gfn(pg_owner, l4egfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_shared == l4e_p2mt )
                     {
+                        put_gfn(pg_owner, l4egfn);
                         MEM_LOG("Unexpected attempt to map shared page.\n");
                         break;
                     }
 
                     rc = mod_l4_entry(va, l4e, mfn,
                                       cmd == MMU_PT_UPDATE_PRESERVE_AD, 1, v);
+                    put_gfn(pg_owner, l4egfn);
                 }
                 break;
 #endif
@@ -3667,6 +3727,7 @@ int do_mmu_update(
 
             unmap_domain_page_with_cache(va, &mapcache);
             put_page(page);
+            put_gfn(pt_owner, gmfn);
         }
         break;
 
@@ -3753,10 +3814,11 @@ static int create_grant_pte_mapping(
     adjust_guest_l1e(nl1e, d);
 
     gmfn = pte_addr >> PAGE_SHIFT;
-    mfn = gmfn_to_mfn(d, gmfn);
+    mfn = get_gfn_untyped(d, gmfn);
 
     if ( unlikely(!get_page_from_pagenr(mfn, current->domain)) )
     {
+        put_gfn(d, gmfn);
         MEM_LOG("Could not get page for normal update");
         return GNTST_general_error;
     }
@@ -3794,6 +3856,7 @@ static int create_grant_pte_mapping(
  failed:
     unmap_domain_page(va);
     put_page(page);
+    put_gfn(d, gmfn);
 
     return rc;
 }
@@ -3808,10 +3871,11 @@ static int destroy_grant_pte_mapping(
     l1_pgentry_t ol1e;
 
     gmfn = addr >> PAGE_SHIFT;
-    mfn = gmfn_to_mfn(d, gmfn);
+    mfn = get_gfn_untyped(d, gmfn);
 
     if ( unlikely(!get_page_from_pagenr(mfn, current->domain)) )
     {
+        put_gfn(d, gmfn);
         MEM_LOG("Could not get page for normal update");
         return GNTST_general_error;
     }
@@ -3863,6 +3927,7 @@ static int destroy_grant_pte_mapping(
  failed:
     unmap_domain_page(va);
     put_page(page);
+    put_gfn(d, gmfn);
     return rc;
 }
 
@@ -4054,9 +4119,10 @@ static int replace_grant_p2m_mapping(
     if ( new_addr != 0 || (flags & GNTMAP_contains_pte) )
         return GNTST_general_error;
 
-    old_mfn = gfn_to_mfn(d, gfn, &type);
+    old_mfn = get_gfn(d, gfn, &type);
     if ( !p2m_is_grant(type) || mfn_x(old_mfn) != frame )
     {
+        put_gfn(d, gfn);
         gdprintk(XENLOG_WARNING,
                  "replace_grant_p2m_mapping: old mapping invalid (type %d, mfn %lx, frame %lx)\n",
                  type, mfn_x(old_mfn), frame);
@@ -4064,6 +4130,7 @@ static int replace_grant_p2m_mapping(
     }
     guest_physmap_remove_page(d, gfn, frame, PAGE_ORDER_4K);
 
+    put_gfn(d, gfn);
     return GNTST_okay;
 }
 
@@ -4444,15 +4511,20 @@ long set_gdt(struct vcpu *v,
     struct domain *d = v->domain;
     /* NB. There are 512 8-byte entries per GDT page. */
     int i, nr_pages = (entries + 511) / 512;
-    unsigned long mfn;
+    unsigned long mfn, *pfns;
 
     if ( entries > FIRST_RESERVED_GDT_ENTRY )
         return -EINVAL;
 
+    pfns = xmalloc_array(unsigned long, nr_pages);
+    if ( !pfns )
+        return -ENOMEM;
+
     /* Check the pages in the new GDT. */
     for ( i = 0; i < nr_pages; i++ )
     {
-        mfn = frames[i] = gmfn_to_mfn(d, frames[i]);
+        pfns[i] = frames[i];
+        mfn = frames[i] = get_gfn_untyped(d, frames[i]);
         if ( !mfn_valid(mfn) ||
              !get_page_and_type(mfn_to_page(mfn), d, PGT_seg_desc_page) )
             goto fail;
@@ -4468,13 +4540,19 @@ long set_gdt(struct vcpu *v,
         v->arch.pv_vcpu.gdt_frames[i] = frames[i];
         l1e_write(&v->arch.perdomain_ptes[i],
                   l1e_from_pfn(frames[i], __PAGE_HYPERVISOR));
+        put_gfn(d, pfns[i]);
     }
 
+    xfree(pfns);
     return 0;
 
  fail:
     while ( i-- > 0 )
+    {
         put_page_and_type(mfn_to_page(frames[i]));
+        put_gfn(d, pfns[i]);
+    }
+    xfree(pfns);
     return -EINVAL;
 }
 
@@ -4518,15 +4596,21 @@ long do_update_descriptor(u64 pa, u64 de
 
     *(u64 *)&d = desc;
 
-    mfn = gmfn_to_mfn(dom, gmfn);
+    mfn = get_gfn_untyped(dom, gmfn);
     if ( (((unsigned int)pa % sizeof(struct desc_struct)) != 0) ||
          !mfn_valid(mfn) ||
          !check_descriptor(dom, &d) )
+    {
+        put_gfn(dom, gmfn);
         return -EINVAL;
+    }
 
     page = mfn_to_page(mfn);
     if ( unlikely(!get_page(page, dom)) )
+    {
+        put_gfn(dom, gmfn);
         return -EINVAL;
+    }
 
     /* Check if the given frame is in use in an unsafe context. */
     switch ( page->u.inuse.type_info & PGT_type_mask )
@@ -4554,6 +4638,7 @@ long do_update_descriptor(u64 pa, u64 de
 
  out:
     put_page(page);
+    put_gfn(dom, gmfn);
 
     return ret;
 }
@@ -4595,6 +4680,7 @@ static int handle_iomem_range(unsigned l
 long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
 {
     struct page_info *page = NULL;
+    unsigned long gfn = 0; /* gcc ... */
     int rc;
 
     switch ( op )
@@ -4652,11 +4738,13 @@ long arch_memory_op(int op, XEN_GUEST_HA
         case XENMAPSPACE_gmfn:
         {
             p2m_type_t p2mt;
-
-            xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
+            gfn = xatp.idx;
+
+            xatp.idx = mfn_x(get_gfn_unshare(d, xatp.idx, &p2mt));
             /* If the page is still shared, exit early */
             if ( p2m_is_shared(p2mt) )
             {
+                put_gfn(d, gfn);
                 rcu_unlock_domain(d);
                 return -ENOMEM;
             }
@@ -4674,6 +4762,8 @@ long arch_memory_op(int op, XEN_GUEST_HA
         {
             if ( page )
                 put_page(page);
+            if ( xatp.space == XENMAPSPACE_gmfn )
+                put_gfn(d, gfn);
             rcu_unlock_domain(d);
             return -EINVAL;
         }
@@ -4684,7 +4774,7 @@ long arch_memory_op(int op, XEN_GUEST_HA
             put_page(page);
 
         /* Remove previously mapped page if it was present. */
-        prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
+        prev_mfn = get_gfn_untyped(d, xatp.gpfn);
         if ( mfn_valid(prev_mfn) )
         {
             if ( is_xen_heap_mfn(prev_mfn) )
@@ -4694,6 +4784,8 @@ long arch_memory_op(int op, XEN_GUEST_HA
                 /* Normal domain memory is freed, to avoid leaking memory. */
                 guest_remove_page(d, xatp.gpfn);
         }
+        /* In the XENMAPSPACE_gmfn case we still hold a ref on the old page. */
+        put_gfn(d, xatp.gpfn);
 
         /* Unmap from old location, if any. */
         gpfn = get_gpfn_from_mfn(mfn);
@@ -4704,6 +4796,9 @@ long arch_memory_op(int op, XEN_GUEST_HA
         /* Map at new location. */
         rc = guest_physmap_add_page(d, xatp.gpfn, mfn, PAGE_ORDER_4K);
 
+        /* In the XENMAPSPACE_gmfn, we took a ref and locked the p2m at the top */
+        if ( xatp.space == XENMAPSPACE_gmfn )
+            put_gfn(d, gfn);
         domain_unlock(d);
 
         rcu_unlock_domain(d);
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/mm/guest_walk.c
--- a/xen/arch/x86/mm/guest_walk.c
+++ b/xen/arch/x86/mm/guest_walk.c
@@ -86,30 +86,35 @@ static uint32_t set_ad_bits(void *guest_
     return 0;
 }
 
+/* If the map is non-NULL, we leave this function having 
+ * called get_gfn, you need to call put_gfn. */
 static inline void *map_domain_gfn(struct p2m_domain *p2m,
                                    gfn_t gfn, 
                                    mfn_t *mfn,
                                    p2m_type_t *p2mt,
                                    uint32_t *rc) 
 {
-    p2m_access_t a;
+    p2m_access_t p2ma;
 
     /* Translate the gfn, unsharing if shared */
-    *mfn = gfn_to_mfn_type_p2m(p2m, gfn_x(gfn), p2mt, &a, p2m_unshare, NULL);
+    *mfn = get_gfn_type_access(p2m, gfn_x(gfn), p2mt, &p2ma, p2m_unshare, NULL);
     if ( p2m_is_paging(*p2mt) )
     {
         ASSERT(!p2m_is_nestedp2m(p2m));
         p2m_mem_paging_populate(p2m->domain, gfn_x(gfn));
+        __put_gfn(p2m, gfn_x(gfn));
         *rc = _PAGE_PAGED;
         return NULL;
     }
     if ( p2m_is_shared(*p2mt) )
     {
+        __put_gfn(p2m, gfn_x(gfn));
         *rc = _PAGE_SHARED;
         return NULL;
     }
     if ( !p2m_is_ram(*p2mt) ) 
     {
+        __put_gfn(p2m, gfn_x(gfn));
         *rc |= _PAGE_PRESENT;
         return NULL;
     }
@@ -120,6 +125,9 @@ static inline void *map_domain_gfn(struc
 
 
 /* Walk the guest pagetables, after the manner of a hardware walker. */
+/* Because the walk is essentially random, it can cause a deadlock 
+ * warning in the p2m locking code. Highly unlikely this is an actual
+ * deadlock, because who would walk page table in the opposite order? */
 uint32_t
 guest_walk_tables(struct vcpu *v, struct p2m_domain *p2m,
                   unsigned long va, walk_t *gw, 
@@ -288,7 +296,6 @@ guest_walk_tables(struct vcpu *v, struct
 #endif
             rc |= _PAGE_INVALID_BITS;
         }
-
         /* Increment the pfn by the right number of 4k pages.  
          * Mask out PAT and invalid bits. */
         start = _gfn((gfn_x(start) & ~GUEST_L2_GFN_MASK) +
@@ -347,12 +354,24 @@ set_ad:
 
  out:
 #if GUEST_PAGING_LEVELS == 4
-    if ( l3p ) unmap_domain_page(l3p);
+    if ( l3p ) 
+    {
+        unmap_domain_page(l3p);
+        __put_gfn(p2m, gfn_x(guest_l4e_get_gfn(gw->l4e)));
+    }
 #endif
 #if GUEST_PAGING_LEVELS >= 3
-    if ( l2p ) unmap_domain_page(l2p);
+    if ( l2p ) 
+    {
+        unmap_domain_page(l2p);
+        __put_gfn(p2m, gfn_x(guest_l3e_get_gfn(gw->l3e))); 
+    }
 #endif
-    if ( l1p ) unmap_domain_page(l1p);
+    if ( l1p ) 
+    {
+        unmap_domain_page(l1p);
+        __put_gfn(p2m, gfn_x(guest_l2e_get_gfn(gw->l2e)));
+    }
 
     return rc;
 }
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/mm/hap/guest_walk.c
--- a/xen/arch/x86/mm/hap/guest_walk.c
+++ b/xen/arch/x86/mm/hap/guest_walk.c
@@ -56,26 +56,30 @@ unsigned long hap_p2m_ga_to_gfn(GUEST_PA
     p2m_type_t p2mt;
     p2m_access_t p2ma;
     walk_t gw;
+    unsigned long top_gfn;
 
     /* Get the top-level table's MFN */
-    top_mfn = gfn_to_mfn_type_p2m(p2m, cr3 >> PAGE_SHIFT, 
-                                  &p2mt, &p2ma, p2m_unshare, NULL);
+    top_gfn = cr3 >> PAGE_SHIFT;
+    top_mfn = get_gfn_type_access(p2m, top_gfn, &p2mt, &p2ma, p2m_unshare, NULL);
     if ( p2m_is_paging(p2mt) )
     {
         ASSERT(!p2m_is_nestedp2m(p2m));
         p2m_mem_paging_populate(p2m->domain, cr3 >> PAGE_SHIFT);
 
         pfec[0] = PFEC_page_paged;
+        __put_gfn(p2m, top_gfn);
         return INVALID_GFN;
     }
     if ( p2m_is_shared(p2mt) )
     {
         pfec[0] = PFEC_page_shared;
+        __put_gfn(p2m, top_gfn);
         return INVALID_GFN;
     }
     if ( !p2m_is_ram(p2mt) )
     {
         pfec[0] &= ~PFEC_page_present;
+        __put_gfn(p2m, top_gfn);
         return INVALID_GFN;
     }
 
@@ -87,26 +91,31 @@ unsigned long hap_p2m_ga_to_gfn(GUEST_PA
 #endif
     missing = guest_walk_tables(v, p2m, ga, &gw, pfec[0], top_mfn, top_map);
     unmap_domain_page(top_map);
+    __put_gfn(p2m, top_gfn);
 
     /* Interpret the answer */
     if ( missing == 0 )
     {
         gfn_t gfn = guest_l1e_get_gfn(gw.l1e);
-        gfn_to_mfn_type_p2m(p2m, gfn_x(gfn), &p2mt, &p2ma, p2m_unshare, NULL);
+        (void)get_gfn_type_access(p2m, gfn_x(gfn), &p2mt, &p2ma, p2m_unshare, NULL); 
         if ( p2m_is_paging(p2mt) )
         {
             ASSERT(!p2m_is_nestedp2m(p2m));
             p2m_mem_paging_populate(p2m->domain, gfn_x(gfn));
 
             pfec[0] = PFEC_page_paged;
+            __put_gfn(p2m, gfn_x(gfn));
             return INVALID_GFN;
         }
         if ( p2m_is_shared(p2mt) )
         {
             pfec[0] = PFEC_page_shared;
+            __put_gfn(p2m, gfn_x(gfn));
             return INVALID_GFN;
         }
 
+        __put_gfn(p2m, gfn_x(gfn));
+
         if ( page_order )
             *page_order = guest_walk_to_page_order(&gw);
 
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/mm/hap/nested_hap.c
--- a/xen/arch/x86/mm/hap/nested_hap.c
+++ b/xen/arch/x86/mm/hap/nested_hap.c
@@ -146,22 +146,29 @@ nestedhap_walk_L0_p2m(struct p2m_domain 
     mfn_t mfn;
     p2m_type_t p2mt;
     p2m_access_t p2ma;
+    int rc;
 
     /* walk L0 P2M table */
-    mfn = gfn_to_mfn_type_p2m(p2m, L1_gpa >> PAGE_SHIFT, &p2mt, &p2ma, 
+    mfn = get_gfn_type_access(p2m, L1_gpa >> PAGE_SHIFT, &p2mt, &p2ma, 
                               p2m_query, page_order);
 
+    rc = NESTEDHVM_PAGEFAULT_MMIO;
     if ( p2m_is_mmio(p2mt) )
-        return NESTEDHVM_PAGEFAULT_MMIO;
+        goto out;
 
+    rc = NESTEDHVM_PAGEFAULT_ERROR;
     if ( p2m_is_paging(p2mt) || p2m_is_shared(p2mt) || !p2m_is_ram(p2mt) )
-        return NESTEDHVM_PAGEFAULT_ERROR;
+        goto out;
 
+    rc = NESTEDHVM_PAGEFAULT_ERROR;
     if ( !mfn_valid(mfn) )
-        return NESTEDHVM_PAGEFAULT_ERROR;
+        goto out;
 
     *L0_gpa = (mfn_x(mfn) << PAGE_SHIFT) + (L1_gpa & ~PAGE_MASK);
-    return NESTEDHVM_PAGEFAULT_DONE;
+    rc = NESTEDHVM_PAGEFAULT_DONE;
+out:
+    __put_gfn(p2m, L1_gpa >> PAGE_SHIFT);
+    return rc;
 }
 
 /* This function uses L2_gpa to walk the P2M page table in L1. If the 
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/mm/mem_event.c
--- a/xen/arch/x86/mm/mem_event.c
+++ b/xen/arch/x86/mm/mem_event.c
@@ -47,7 +47,7 @@ static int mem_event_enable(struct domai
     unsigned long ring_addr = mec->ring_addr;
     unsigned long shared_addr = mec->shared_addr;
     l1_pgentry_t l1e;
-    unsigned long gfn;
+    unsigned long shared_gfn = 0, ring_gfn = 0; /* gcc ... */
     p2m_type_t p2mt;
     mfn_t ring_mfn;
     mfn_t shared_mfn;
@@ -60,23 +60,36 @@ static int mem_event_enable(struct domai
 
     /* Get MFN of ring page */
     guest_get_eff_l1e(v, ring_addr, &l1e);
-    gfn = l1e_get_pfn(l1e);
-    ring_mfn = gfn_to_mfn(dom_mem_event, gfn, &p2mt);
+    ring_gfn = l1e_get_pfn(l1e);
+    /* We're grabbing these two in an order that could deadlock
+     * dom0 if 1. it were an hvm 2. there were two concurrent
+     * enables 3. the two gfn's in each enable criss-crossed
+     * 2MB regions. Duly noted.... */
+    ring_mfn = get_gfn(dom_mem_event, ring_gfn, &p2mt);
 
     if ( unlikely(!mfn_valid(mfn_x(ring_mfn))) )
+    {
+        put_gfn(dom_mem_event, ring_gfn);
         return -EINVAL;
+    }
 
     /* Get MFN of shared page */
     guest_get_eff_l1e(v, shared_addr, &l1e);
-    gfn = l1e_get_pfn(l1e);
-    shared_mfn = gfn_to_mfn(dom_mem_event, gfn, &p2mt);
+    shared_gfn = l1e_get_pfn(l1e);
+    shared_mfn = get_gfn(dom_mem_event, shared_gfn, &p2mt);
 
     if ( unlikely(!mfn_valid(mfn_x(shared_mfn))) )
+    {
+        put_gfn(dom_mem_event, ring_gfn);
+        put_gfn(dom_mem_event, shared_gfn);
         return -EINVAL;
+    }
 
     /* Map ring and shared pages */
     med->ring_page = map_domain_page(mfn_x(ring_mfn));
     med->shared_page = map_domain_page(mfn_x(shared_mfn));
+    put_gfn(dom_mem_event, ring_gfn);
+    put_gfn(dom_mem_event, shared_gfn); 
 
     /* Allocate event channel */
     rc = alloc_unbound_xen_event_channel(d->vcpu[0],
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/mm/mem_sharing.c
--- a/xen/arch/x86/mm/mem_sharing.c
+++ b/xen/arch/x86/mm/mem_sharing.c
@@ -227,7 +227,7 @@ static void mem_sharing_audit(void)
                             g->domain, g->gfn, mfn_x(e->mfn));
                     continue;
                 }
-                mfn = gfn_to_mfn(d, g->gfn, &t); 
+                mfn = get_gfn_unlocked(d, g->gfn, &t); 
                 if(mfn_x(mfn) != mfn_x(e->mfn))
                     MEM_SHARING_DEBUG("Incorrect P2M for d=%d, PFN=%lx."
                                       "Expecting MFN=%ld, got %ld\n",
@@ -335,7 +335,7 @@ int mem_sharing_debug_gfn(struct domain 
     p2m_type_t p2mt;
     mfn_t mfn;
 
-    mfn = gfn_to_mfn(d, gfn, &p2mt);
+    mfn = get_gfn_unlocked(d, gfn, &p2mt);
 
     printk("Debug for domain=%d, gfn=%lx, ", 
             d->domain_id, 
@@ -460,7 +460,7 @@ int mem_sharing_nominate_page(struct dom
     *phandle = 0UL;
 
     shr_lock(); 
-    mfn = gfn_to_mfn(d, gfn, &p2mt);
+    mfn = get_gfn(d, gfn, &p2mt);
 
     /* Check if mfn is valid */
     ret = -EINVAL;
@@ -524,6 +524,7 @@ int mem_sharing_nominate_page(struct dom
     ret = 0;
 
 out:
+    put_gfn(d, gfn);
     shr_unlock();
     return ret;
 }
@@ -593,14 +594,18 @@ int mem_sharing_unshare_page(struct doma
     shr_handle_t handle;
     struct list_head *le;
 
+    /* Remove the gfn_info from the list */
+   
+    /* This is one of the reasons why we can't enforce ordering
+     * between shr_lock and p2m fine-grained locks in mm-lock. 
+     * Callers may walk in here already holding the lock for this gfn */
     shr_lock();
     mem_sharing_audit();
-    
-    /* Remove the gfn_info from the list */
-    mfn = gfn_to_mfn(d, gfn, &p2mt);
+    mfn = get_gfn(d, gfn, &p2mt);
     
     /* Has someone already unshared it? */
     if (!p2m_is_shared(p2mt)) {
+        put_gfn(d, gfn);
         shr_unlock();
         return 0;
     }
@@ -634,6 +639,7 @@ gfn_found:
             /* Even though we don't allocate a private page, we have to account
              * for the MFN that originally backed this PFN. */
             atomic_dec(&nr_saved_mfns);
+        put_gfn(d, gfn);
         shr_unlock();
         put_page_and_type(page);
         if(last_gfn && 
@@ -653,6 +659,7 @@ gfn_found:
         /* We've failed to obtain memory for private page. Need to re-add the
          * gfn_info to relevant list */
         list_add(&gfn_info->list, &hash_entry->gfns);
+        put_gfn(d, gfn);
         shr_unlock();
         return -ENOMEM;
     }
@@ -663,6 +670,13 @@ gfn_found:
     unmap_domain_page(s);
     unmap_domain_page(t);
 
+    /* NOTE: set_shared_p2m_entry will switch the underlying mfn. If
+     * we do get_page withing get_gfn, the correct sequence here
+     * should be
+       get_page(page);
+       put_page(old_page);
+     * so that the ref to the old page is dropped, and a ref to
+     * the new page is obtained to later be dropped in put_gfn */
     BUG_ON(set_shared_p2m_entry(d, gfn, page_to_mfn(page)) == 0);
     put_page_and_type(old_page);
 
@@ -683,6 +697,7 @@ private_page_found:
     /* Update m2p entry */
     set_gpfn_from_mfn(mfn_x(page_to_mfn(page)), gfn);
 
+    put_gfn(d, gfn);
     shr_unlock();
     return 0;
 }
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/mm/p2m-pod.c
--- a/xen/arch/x86/mm/p2m-pod.c
+++ b/xen/arch/x86/mm/p2m-pod.c
@@ -531,9 +531,10 @@ p2m_pod_decrease_reservation(struct doma
     /* FIXME: Add contiguous; query for PSE entries? */
     for ( i=0; i<(1<<order); i++)
     {
+        p2m_access_t a;
         p2m_type_t t;
 
-        gfn_to_mfn_query(d, gpfn + i, &t);
+        (void)p2m->get_entry(p2m, gpfn + i, &t, &a, p2m_query, NULL);
 
         if ( t == p2m_populate_on_demand )
             pod++;
@@ -572,8 +573,9 @@ p2m_pod_decrease_reservation(struct doma
     {
         mfn_t mfn;
         p2m_type_t t;
+        p2m_access_t a;
 
-        mfn = gfn_to_mfn_query(d, gpfn + i, &t);
+        mfn = p2m->get_entry(p2m, gpfn + i, &t, &a, p2m_query, NULL);
         if ( t == p2m_populate_on_demand )
         {
             set_p2m_entry(p2m, gpfn + i, _mfn(INVALID_MFN), 0, p2m_invalid, p2m->default_access);
@@ -653,8 +655,8 @@ p2m_pod_zero_check_superpage(struct p2m_
      * and aligned, and mapping them. */
     for ( i=0; i<SUPERPAGE_PAGES; i++ )
     {
-        
-        mfn = gfn_to_mfn_query(d, gfn + i, &type);
+        p2m_access_t a; 
+        mfn = p2m->get_entry(p2m, gfn + i, &type, &a, p2m_query, NULL);
 
         if ( i == 0 )
         {
@@ -782,7 +784,8 @@ p2m_pod_zero_check(struct p2m_domain *p2
     /* First, get the gfn list, translate to mfns, and map the pages. */
     for ( i=0; i<count; i++ )
     {
-        mfns[i] = gfn_to_mfn_query(d, gfns[i], types + i);
+        p2m_access_t a;
+        mfns[i] = p2m->get_entry(p2m, gfns[i], types + i, &a, p2m_query, NULL);
         /* If this is ram, and not a pagetable or from the xen heap, and probably not mapped
            elsewhere, map it; otherwise, skip. */
         if ( p2m_is_ram(types[i])
@@ -923,7 +926,8 @@ p2m_pod_emergency_sweep(struct p2m_domai
     /* FIXME: Figure out how to avoid superpages */
     for ( i=p2m->pod.reclaim_single; i > 0 ; i-- )
     {
-        gfn_to_mfn_query(p2m->domain, i, &t );
+        p2m_access_t a;
+        (void)p2m->get_entry(p2m, i, &t, &a, p2m_query, NULL);
         if ( p2m_is_ram(t) )
         {
             gfns[j] = i;
@@ -1112,7 +1116,8 @@ guest_physmap_mark_populate_on_demand(st
     /* Make sure all gpfns are unused */
     for ( i = 0; i < (1UL << order); i++ )
     {
-        omfn = gfn_to_mfn_query(d, gfn + i, &ot);
+        p2m_access_t a;
+        omfn = p2m->get_entry(p2m, gfn + i, &ot, &a, p2m_query, NULL);
         if ( p2m_is_ram(ot) )
         {
             printk("%s: gfn_to_mfn returned type %d!\n",
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -144,7 +144,7 @@ void p2m_change_entry_type_global(struct
     p2m_unlock(p2m);
 }
 
-mfn_t gfn_to_mfn_type_p2m(struct p2m_domain *p2m, unsigned long gfn,
+mfn_t get_gfn_type_access(struct p2m_domain *p2m, unsigned long gfn,
                     p2m_type_t *t, p2m_access_t *a, p2m_query_t q,
                     unsigned int *page_order)
 {
@@ -343,28 +343,27 @@ void p2m_teardown(struct p2m_domain *p2m
 #ifdef __x86_64__
     unsigned long gfn;
     p2m_type_t t;
-    p2m_access_t a;
     mfn_t mfn;
 #endif
 
     if (p2m == NULL)
         return;
 
+    p2m_lock(p2m);
+
 #ifdef __x86_64__
     for ( gfn=0; gfn < p2m->max_mapped_pfn; gfn++ )
     {
-        mfn = gfn_to_mfn_type_p2m(p2m, gfn, &t, &a, p2m_query, NULL);
+        p2m_access_t a;
+        mfn = p2m->get_entry(p2m, gfn, &t, &a, p2m_query, NULL);
         if ( mfn_valid(mfn) && (t == p2m_ram_shared) )
         {
             ASSERT(!p2m_is_nestedp2m(p2m));
             BUG_ON(mem_sharing_unshare_page(d, gfn, MEM_SHARING_DESTROY_GFN));
         }
-
     }
 #endif
 
-    p2m_lock(p2m);
-
     p2m->phys_table = pagetable_null();
 
     while ( (pg = page_list_remove_head(&p2m->pages)) )
@@ -454,6 +453,7 @@ guest_physmap_add_entry(struct domain *d
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
     unsigned long i, ogfn;
     p2m_type_t ot;
+    p2m_access_t a;
     mfn_t omfn;
     int pod_count = 0;
     int rc = 0;
@@ -489,12 +489,13 @@ guest_physmap_add_entry(struct domain *d
     /* First, remove m->p mappings for existing p->m mappings */
     for ( i = 0; i < (1UL << page_order); i++ )
     {
-        omfn = gfn_to_mfn_query(d, gfn + i, &ot);
+        omfn = p2m->get_entry(p2m, gfn + i, &ot, &a, p2m_query, NULL);
         if ( p2m_is_grant(ot) )
         {
             /* Really shouldn't be unmapping grant maps this way */
             domain_crash(d);
             p2m_unlock(p2m);
+            
             return -EINVAL;
         }
         else if ( p2m_is_ram(ot) )
@@ -528,7 +529,7 @@ guest_physmap_add_entry(struct domain *d
              * address */
             P2M_DEBUG("aliased! mfn=%#lx, old gfn=%#lx, new gfn=%#lx\n",
                       mfn + i, ogfn, gfn + i);
-            omfn = gfn_to_mfn_query(d, ogfn, &ot);
+            omfn = p2m->get_entry(p2m, ogfn, &ot, &a, p2m_query, NULL);
             if ( p2m_is_ram(ot) )
             {
                 ASSERT(mfn_valid(omfn));
@@ -577,6 +578,7 @@ guest_physmap_add_entry(struct domain *d
 p2m_type_t p2m_change_type(struct domain *d, unsigned long gfn, 
                            p2m_type_t ot, p2m_type_t nt)
 {
+    p2m_access_t a;
     p2m_type_t pt;
     mfn_t mfn;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
@@ -585,7 +587,7 @@ p2m_type_t p2m_change_type(struct domain
 
     p2m_lock(p2m);
 
-    mfn = gfn_to_mfn_query(d, gfn, &pt);
+    mfn = p2m->get_entry(p2m, gfn, &pt, &a, p2m_query, NULL);
     if ( pt == ot )
         set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, nt, p2m->default_access);
 
@@ -600,6 +602,7 @@ void p2m_change_type_range(struct domain
                            unsigned long start, unsigned long end,
                            p2m_type_t ot, p2m_type_t nt)
 {
+    p2m_access_t a;
     p2m_type_t pt;
     unsigned long gfn;
     mfn_t mfn;
@@ -612,7 +615,7 @@ void p2m_change_type_range(struct domain
 
     for ( gfn = start; gfn < end; gfn++ )
     {
-        mfn = gfn_to_mfn_query(d, gfn, &pt);
+        mfn = p2m->get_entry(p2m, gfn, &pt, &a, p2m_query, NULL);
         if ( pt == ot )
             set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, nt, p2m->default_access);
     }
@@ -629,6 +632,7 @@ int
 set_mmio_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn)
 {
     int rc = 0;
+    p2m_access_t a;
     p2m_type_t ot;
     mfn_t omfn;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
@@ -637,7 +641,7 @@ set_mmio_p2m_entry(struct domain *d, uns
         return 0;
 
     p2m_lock(p2m);
-    omfn = gfn_to_mfn_query(d, gfn, &ot);
+    omfn = p2m->get_entry(p2m, gfn, &ot, &a, p2m_query, NULL);
     if ( p2m_is_grant(ot) )
     {
         p2m_unlock(p2m);
@@ -657,7 +661,7 @@ set_mmio_p2m_entry(struct domain *d, uns
     if ( 0 == rc )
         gdprintk(XENLOG_ERR,
             "set_mmio_p2m_entry: set_p2m_entry failed! mfn=%08lx\n",
-            mfn_x(gfn_to_mfn_query(d, gfn, &ot)));
+            mfn_x(get_gfn_query_unlocked(p2m->domain, gfn, &ot)));
     return rc;
 }
 
@@ -666,6 +670,7 @@ clear_mmio_p2m_entry(struct domain *d, u
 {
     int rc = 0;
     mfn_t mfn;
+    p2m_access_t a;
     p2m_type_t t;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
 
@@ -673,7 +678,7 @@ clear_mmio_p2m_entry(struct domain *d, u
         return 0;
 
     p2m_lock(p2m);
-    mfn = gfn_to_mfn_query(d, gfn, &t);
+    mfn = p2m->get_entry(p2m, gfn, &t, &a, p2m_query, NULL);
 
     /* Do not use mfn_valid() here as it will usually fail for MMIO pages. */
     if ( (INVALID_MFN == mfn_x(mfn)) || (t != p2m_mmio_direct) )
@@ -696,6 +701,7 @@ set_shared_p2m_entry(struct domain *d, u
 {
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
     int rc = 0;
+    p2m_access_t a;
     p2m_type_t ot;
     mfn_t omfn;
 
@@ -703,7 +709,7 @@ set_shared_p2m_entry(struct domain *d, u
         return 0;
 
     p2m_lock(p2m);
-    omfn = gfn_to_mfn_query(p2m->domain, gfn, &ot);
+    omfn = p2m->get_entry(p2m, gfn, &ot, &a, p2m_query, NULL);
     /* At the moment we only allow p2m change if gfn has already been made
      * sharable first */
     ASSERT(p2m_is_shared(ot));
@@ -717,7 +723,7 @@ set_shared_p2m_entry(struct domain *d, u
     if ( 0 == rc )
         gdprintk(XENLOG_ERR,
             "set_shared_p2m_entry: set_p2m_entry failed! mfn=%08lx\n",
-            mfn_x(gfn_to_mfn_query(d, gfn, &ot)));
+            mfn_x(get_gfn_query_unlocked(p2m->domain, gfn, &ot)));
     return rc;
 }
 
@@ -1168,7 +1174,7 @@ int p2m_set_mem_access(struct domain *d,
 {
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
     unsigned long pfn;
-    p2m_access_t a;
+    p2m_access_t a, _a;
     p2m_type_t t;
     mfn_t mfn;
     int rc = 0;
@@ -1202,7 +1208,7 @@ int p2m_set_mem_access(struct domain *d,
     p2m_lock(p2m);
     for ( pfn = start_pfn; pfn < start_pfn + nr; pfn++ )
     {
-        mfn = gfn_to_mfn_query(d, pfn, &t);
+        mfn = p2m->get_entry(p2m, pfn, &t, &_a, p2m_query, NULL);
         if ( p2m->set_entry(p2m, pfn, mfn, PAGE_ORDER_4K, t, a) == 0 )
         {
             rc = -ENOMEM;
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/mm/shadow/common.c
--- a/xen/arch/x86/mm/shadow/common.c
+++ b/xen/arch/x86/mm/shadow/common.c
@@ -3676,7 +3676,7 @@ int shadow_track_dirty_vram(struct domai
 
         /* Iterate over VRAM to track dirty bits. */
         for ( i = 0; i < nr; i++ ) {
-            mfn_t mfn = gfn_to_mfn_query(d, begin_pfn + i, &t);
+            mfn_t mfn = get_gfn_query(d, begin_pfn + i, &t);
             struct page_info *page;
             int dirty = 0;
             paddr_t sl1ma = dirty_vram->sl1ma[i];
@@ -3741,6 +3741,8 @@ int shadow_track_dirty_vram(struct domai
                 }
             }
 
+            put_gfn(d, begin_pfn + i);
+
             if ( dirty )
             {
                 dirty_vram->dirty_bitmap[i / 8] |= 1 << (i % 8);
@@ -3761,7 +3763,7 @@ int shadow_track_dirty_vram(struct domai
                 /* was clean for more than two seconds, try to disable guest
                  * write access */
                 for ( i = begin_pfn; i < end_pfn; i++ ) {
-                    mfn_t mfn = gfn_to_mfn_query(d, i, &t);
+                    mfn_t mfn = get_gfn_query_unlocked(d, i, &t);
                     if (mfn_x(mfn) != INVALID_MFN)
                         flush_tlb |= sh_remove_write_access(d->vcpu[0], mfn, 1, 0);
                 }
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/mm/shadow/multi.c
--- a/xen/arch/x86/mm/shadow/multi.c
+++ b/xen/arch/x86/mm/shadow/multi.c
@@ -2265,7 +2265,7 @@ static int validate_gl4e(struct vcpu *v,
     if ( guest_l4e_get_flags(new_gl4e) & _PAGE_PRESENT )
     {
         gfn_t gl3gfn = guest_l4e_get_gfn(new_gl4e);
-        mfn_t gl3mfn = gfn_to_mfn_query(d, gl3gfn, &p2mt);
+        mfn_t gl3mfn = get_gfn_query(d, gl3gfn, &p2mt);
         if ( p2m_is_ram(p2mt) )
             sl3mfn = get_shadow_status(v, gl3mfn, SH_type_l3_shadow);
         else if ( p2mt != p2m_populate_on_demand )
@@ -2275,6 +2275,7 @@ static int validate_gl4e(struct vcpu *v,
         if ( mfn_valid(sl3mfn) )
             shadow_resync_all(v);
 #endif
+        put_gfn(d, gfn_x(gl3gfn));
     }
     l4e_propagate_from_guest(v, new_gl4e, sl3mfn, &new_sl4e, ft_prefetch);
 
@@ -2322,7 +2323,7 @@ static int validate_gl3e(struct vcpu *v,
     if ( guest_l3e_get_flags(new_gl3e) & _PAGE_PRESENT )
     {
         gfn_t gl2gfn = guest_l3e_get_gfn(new_gl3e);
-        mfn_t gl2mfn = gfn_to_mfn_query(v->domain, gl2gfn, &p2mt);
+        mfn_t gl2mfn = get_gfn_query(v->domain, gl2gfn, &p2mt);
         if ( p2m_is_ram(p2mt) )
             sl2mfn = get_shadow_status(v, gl2mfn, SH_type_l2_shadow);
         else if ( p2mt != p2m_populate_on_demand )
@@ -2332,6 +2333,7 @@ static int validate_gl3e(struct vcpu *v,
         if ( mfn_valid(sl2mfn) )
             shadow_resync_all(v);
 #endif
+        put_gfn(v->domain, gfn_x(gl2gfn));
     }
     l3e_propagate_from_guest(v, new_gl3e, sl2mfn, &new_sl3e, ft_prefetch);
     result |= shadow_set_l3e(v, sl3p, new_sl3e, sl3mfn);
@@ -2371,11 +2373,12 @@ static int validate_gl2e(struct vcpu *v,
         }
         else
         {
-            mfn_t gl1mfn = gfn_to_mfn_query(v->domain, gl1gfn, &p2mt);
+            mfn_t gl1mfn = get_gfn_query(v->domain, gl1gfn, &p2mt);
             if ( p2m_is_ram(p2mt) )
                 sl1mfn = get_shadow_status(v, gl1mfn, SH_type_l1_shadow); 
             else if ( p2mt != p2m_populate_on_demand )
                 result |= SHADOW_SET_ERROR;
+            put_gfn(v->domain, gfn_x(gl1gfn));
         }
     }
     l2e_propagate_from_guest(v, new_gl2e, sl1mfn, &new_sl2e, ft_prefetch);
@@ -2441,7 +2444,7 @@ static int validate_gl1e(struct vcpu *v,
     perfc_incr(shadow_validate_gl1e_calls);
 
     gfn = guest_l1e_get_gfn(new_gl1e);
-    gmfn = gfn_to_mfn_query(v->domain, gfn, &p2mt);
+    gmfn = get_gfn_query(v->domain, gfn, &p2mt);
 
     l1e_propagate_from_guest(v, new_gl1e, gmfn, &new_sl1e, ft_prefetch, p2mt);
     result |= shadow_set_l1e(v, sl1p, new_sl1e, p2mt, sl1mfn);
@@ -2463,6 +2466,7 @@ static int validate_gl1e(struct vcpu *v,
     }
 #endif /* OOS */
 
+    put_gfn(v->domain, gfn_x(gfn));
     return result;
 }
 
@@ -2501,10 +2505,11 @@ void sh_resync_l1(struct vcpu *v, mfn_t 
             shadow_l1e_t nsl1e;
 
             gfn = guest_l1e_get_gfn(gl1e);
-            gmfn = gfn_to_mfn_query(v->domain, gfn, &p2mt);
+            gmfn = get_gfn_query(v->domain, gfn, &p2mt);
             l1e_propagate_from_guest(v, gl1e, gmfn, &nsl1e, ft_prefetch, p2mt);
             rc |= shadow_set_l1e(v, sl1p, nsl1e, p2mt, sl1mfn);
 
+            put_gfn(v->domain, gfn_x(gfn));
             *snpl1p = gl1e;
         }
     });
@@ -2824,7 +2829,7 @@ static void sh_prefetch(struct vcpu *v, 
 
         /* Look at the gfn that the l1e is pointing at */
         gfn = guest_l1e_get_gfn(gl1e);
-        gmfn = gfn_to_mfn_query(v->domain, gfn, &p2mt);
+        gmfn = get_gfn_query(v->domain, gfn, &p2mt);
 
         /* Propagate the entry.  */
         l1e_propagate_from_guest(v, gl1e, gmfn, &sl1e, ft_prefetch, p2mt);
@@ -2834,6 +2839,8 @@ static void sh_prefetch(struct vcpu *v, 
         if ( snpl1p != NULL )
             snpl1p[i] = gl1e;
 #endif /* OOS */
+
+        put_gfn(v->domain, gfn_x(gfn));
     }
     if ( gl1p != NULL )
         sh_unmap_domain_page(gl1p);
@@ -3182,7 +3189,7 @@ static int sh_page_fault(struct vcpu *v,
 
     /* What mfn is the guest trying to access? */
     gfn = guest_l1e_get_gfn(gw.l1e);
-    gmfn = gfn_to_mfn_guest(d, gfn, &p2mt);
+    gmfn = get_gfn_guest(d, gfn, &p2mt);
 
     if ( shadow_mode_refcounts(d) && 
          ((!p2m_is_valid(p2mt) && !p2m_is_grant(p2mt)) ||
@@ -3192,6 +3199,7 @@ static int sh_page_fault(struct vcpu *v,
         SHADOW_PRINTK("BAD gfn=%"SH_PRI_gfn" gmfn=%"PRI_mfn"\n", 
                       gfn_x(gfn), mfn_x(gmfn));
         reset_early_unshadow(v);
+        put_gfn(d, gfn_x(gfn));
         goto propagate;
     }
 
@@ -3236,6 +3244,7 @@ static int sh_page_fault(struct vcpu *v,
     if ( rc & GW_RMWR_REWALK )
     {
         paging_unlock(d);
+        put_gfn(d, gfn_x(gfn));
         goto rewalk;
     }
 #endif /* OOS */
@@ -3244,6 +3253,7 @@ static int sh_page_fault(struct vcpu *v,
     {
         perfc_incr(shadow_inconsistent_gwalk);
         paging_unlock(d);
+        put_gfn(d, gfn_x(gfn));
         goto rewalk;
     }
 
@@ -3270,6 +3280,7 @@ static int sh_page_fault(struct vcpu *v,
         ASSERT(d->is_shutting_down);
 #endif
         paging_unlock(d);
+        put_gfn(d, gfn_x(gfn));
         trace_shadow_gen(TRC_SHADOW_DOMF_DYING, va);
         return 0;
     }
@@ -3287,6 +3298,7 @@ static int sh_page_fault(struct vcpu *v,
          * failed. We cannot safely continue since some page is still
          * OOS but not in the hash table anymore. */
         paging_unlock(d);
+        put_gfn(d, gfn_x(gfn));
         return 0;
     }
 
@@ -3296,6 +3308,7 @@ static int sh_page_fault(struct vcpu *v,
     {
         perfc_incr(shadow_inconsistent_gwalk);
         paging_unlock(d);
+        put_gfn(d, gfn_x(gfn));
         goto rewalk;
     }
 #endif /* OOS */
@@ -3389,6 +3402,7 @@ static int sh_page_fault(struct vcpu *v,
     SHADOW_PRINTK("fixed\n");
     shadow_audit_tables(v);
     paging_unlock(d);
+    put_gfn(d, gfn_x(gfn));
     return EXCRET_fault_fixed;
 
  emulate:
@@ -3457,6 +3471,7 @@ static int sh_page_fault(struct vcpu *v,
     sh_audit_gw(v, &gw);
     shadow_audit_tables(v);
     paging_unlock(d);
+    put_gfn(d, gfn_x(gfn));
 
     this_cpu(trace_emulate_write_val) = 0;
 
@@ -3595,6 +3610,7 @@ static int sh_page_fault(struct vcpu *v,
     shadow_audit_tables(v);
     reset_early_unshadow(v);
     paging_unlock(d);
+    put_gfn(d, gfn_x(gfn));
     trace_shadow_gen(TRC_SHADOW_MMIO, va);
     return (handle_mmio_with_translation(va, gpa >> PAGE_SHIFT)
             ? EXCRET_fault_fixed : 0);
@@ -3605,6 +3621,7 @@ static int sh_page_fault(struct vcpu *v,
     shadow_audit_tables(v);
     reset_early_unshadow(v);
     paging_unlock(d);
+    put_gfn(d, gfn_x(gfn));
 
 propagate:
     trace_not_shadow_fault(gw.l1e, va);
@@ -4292,7 +4309,7 @@ sh_update_cr3(struct vcpu *v, int do_loc
             if ( guest_l3e_get_flags(gl3e[i]) & _PAGE_PRESENT )
             {
                 gl2gfn = guest_l3e_get_gfn(gl3e[i]);
-                gl2mfn = gfn_to_mfn_query(d, gl2gfn, &p2mt);
+                gl2mfn = get_gfn_query_unlocked(d, gfn_x(gl2gfn), &p2mt);
                 if ( p2m_is_ram(p2mt) )
                     flush |= sh_remove_write_access(v, gl2mfn, 2, 0);
             }
@@ -4305,13 +4322,14 @@ sh_update_cr3(struct vcpu *v, int do_loc
             if ( guest_l3e_get_flags(gl3e[i]) & _PAGE_PRESENT )
             {
                 gl2gfn = guest_l3e_get_gfn(gl3e[i]);
-                gl2mfn = gfn_to_mfn_query(d, gl2gfn, &p2mt);
+                gl2mfn = get_gfn_query(d, gl2gfn, &p2mt);
                 if ( p2m_is_ram(p2mt) )
                     sh_set_toplevel_shadow(v, i, gl2mfn, (i == 3) 
                                            ? SH_type_l2h_shadow 
                                            : SH_type_l2_shadow);
                 else
                     sh_set_toplevel_shadow(v, i, _mfn(INVALID_MFN), 0); 
+                put_gfn(d, gfn_x(gl2gfn));
             }
             else
                 sh_set_toplevel_shadow(v, i, _mfn(INVALID_MFN), 0); 
@@ -4689,11 +4707,12 @@ static void sh_pagetable_dying(struct vc
     int flush = 0;
     int fast_path = 0;
     paddr_t gcr3 = 0;
-    mfn_t smfn, gmfn;
     p2m_type_t p2mt;
     char *gl3pa = NULL;
     guest_l3e_t *gl3e = NULL;
     paddr_t gl2a = 0;
+    unsigned long l3gfn;
+    mfn_t l3mfn;
 
     paging_lock(v->domain);
 
@@ -4702,8 +4721,9 @@ static void sh_pagetable_dying(struct vc
     if ( gcr3 == gpa )
         fast_path = 1;
 
-    gmfn = gfn_to_mfn_query(v->domain, _gfn(gpa >> PAGE_SHIFT), &p2mt);
-    if ( !mfn_valid(gmfn) || !p2m_is_ram(p2mt) )
+    l3gfn = gpa >> PAGE_SHIFT;
+    l3mfn = get_gfn_query(v->domain, _gfn(l3gfn), &p2mt);
+    if ( !mfn_valid(l3mfn) || !p2m_is_ram(p2mt) )
     {
         printk(XENLOG_DEBUG "sh_pagetable_dying: gpa not valid %"PRIpaddr"\n",
                gpa);
@@ -4711,19 +4731,24 @@ static void sh_pagetable_dying(struct vc
     }
     if ( !fast_path )
     {
-        gl3pa = sh_map_domain_page(gmfn);
+        gl3pa = sh_map_domain_page(l3mfn);
         gl3e = (guest_l3e_t *)(gl3pa + ((unsigned long)gpa & ~PAGE_MASK));
     }
     for ( i = 0; i < 4; i++ )
     {
+        unsigned long gfn;
+        mfn_t smfn, gmfn;
+
         if ( fast_path )
             smfn = _mfn(pagetable_get_pfn(v->arch.shadow_table[i]));
         else
         {
             /* retrieving the l2s */
             gl2a = guest_l3e_get_paddr(gl3e[i]);
-            gmfn = gfn_to_mfn_query(v->domain, _gfn(gl2a >> PAGE_SHIFT), &p2mt);
+            gfn = gl2a >> PAGE_SHIFT;
+            gmfn = get_gfn_query(v->domain, _gfn(gfn), &p2mt);
             smfn = shadow_hash_lookup(v, mfn_x(gmfn), SH_type_l2_pae_shadow);
+            put_gfn(v->domain, gfn);
         }
 
         if ( mfn_valid(smfn) )
@@ -4747,6 +4772,7 @@ static void sh_pagetable_dying(struct vc
 out:
     if ( !fast_path )
         unmap_domain_page(gl3pa);
+    put_gfn(v->domain, l3gfn);
     paging_unlock(v->domain);
 }
 #else
@@ -4757,12 +4783,14 @@ static void sh_pagetable_dying(struct vc
 
     paging_lock(v->domain);
 
-    gmfn = gfn_to_mfn_query(v->domain, _gfn(gpa >> PAGE_SHIFT), &p2mt);
+    gmfn = get_gfn_query(v->domain, _gfn(gpa >> PAGE_SHIFT), &p2mt);
 #if GUEST_PAGING_LEVELS == 2
     smfn = shadow_hash_lookup(v, mfn_x(gmfn), SH_type_l2_32_shadow);
 #else
     smfn = shadow_hash_lookup(v, mfn_x(gmfn), SH_type_l4_64_shadow);
 #endif
+    put_gfn(v->domain, gpa >> PAGE_SHIFT);
+    
     if ( mfn_valid(smfn) )
     {
         mfn_to_page(gmfn)->shadow_flags |= SHF_pagetable_dying;
@@ -4811,15 +4839,22 @@ static mfn_t emulate_gva_to_mfn(struct v
 
     /* Translate the GFN to an MFN */
     ASSERT(!paging_locked_by_me(v->domain));
-    mfn = gfn_to_mfn_guest(v->domain, _gfn(gfn), &p2mt);
+    mfn = get_gfn_guest(v->domain, _gfn(gfn), &p2mt);
         
     if ( p2m_is_readonly(p2mt) )
+    {
+        put_gfn(v->domain, gfn);
         return _mfn(READONLY_GFN);
+    }
     if ( !p2m_is_ram(p2mt) )
+    {
+        put_gfn(v->domain, gfn);
         return _mfn(BAD_GFN_TO_MFN);
+    }
 
     ASSERT(mfn_valid(mfn));
     v->arch.paging.last_write_was_pt = !!sh_mfn_is_a_page_table(mfn);
+    put_gfn(v->domain, gfn);
     return mfn;
 }
 
@@ -5220,7 +5255,7 @@ int sh_audit_l1_table(struct vcpu *v, mf
             {
                 gfn = guest_l1e_get_gfn(*gl1e);
                 mfn = shadow_l1e_get_mfn(*sl1e);
-                gmfn = gfn_to_mfn_query(v->domain, gfn, &p2mt);
+                gmfn = get_gfn_query_unlocked(v->domain, gfn_x(gfn), &p2mt);
                 if ( !p2m_is_grant(p2mt) && mfn_x(gmfn) != mfn_x(mfn) )
                     AUDIT_FAIL(1, "bad translation: gfn %" SH_PRI_gfn
                                " --> %" PRI_mfn " != mfn %" PRI_mfn,
@@ -5291,16 +5326,17 @@ int sh_audit_l2_table(struct vcpu *v, mf
             mfn = shadow_l2e_get_mfn(*sl2e);
             gmfn = (guest_l2e_get_flags(*gl2e) & _PAGE_PSE)  
                 ? get_fl1_shadow_status(v, gfn)
-                : get_shadow_status(v, gfn_to_mfn_query(v->domain, gfn, &p2mt),
-                                    SH_type_l1_shadow);
+                : get_shadow_status(v, 
+                    get_gfn_query_unlocked(v->domain, gfn_x(gfn), 
+                                        &p2mt), SH_type_l1_shadow);
             if ( mfn_x(gmfn) != mfn_x(mfn) )
                 AUDIT_FAIL(2, "bad translation: gfn %" SH_PRI_gfn
                            " (--> %" PRI_mfn ")"
                            " --> %" PRI_mfn " != mfn %" PRI_mfn,
                            gfn_x(gfn), 
                            (guest_l2e_get_flags(*gl2e) & _PAGE_PSE) ? 0
-                           : mfn_x(gfn_to_mfn_query(v->domain,
-                                   gfn, &p2mt)), mfn_x(gmfn), mfn_x(mfn));
+                           : mfn_x(get_gfn_query_unlocked(v->domain,
+                                   gfn_x(gfn), &p2mt)), mfn_x(gmfn), mfn_x(mfn));
         }
     });
     sh_unmap_domain_page(gp);
@@ -5339,7 +5375,8 @@ int sh_audit_l3_table(struct vcpu *v, mf
         {
             gfn = guest_l3e_get_gfn(*gl3e);
             mfn = shadow_l3e_get_mfn(*sl3e);
-            gmfn = get_shadow_status(v, gfn_to_mfn_query(v->domain, gfn, &p2mt),
+            gmfn = get_shadow_status(v, get_gfn_query_unlocked(
+                                        v->domain, gfn_x(gfn), &p2mt),
                                      ((GUEST_PAGING_LEVELS == 3 ||
                                        is_pv_32on64_vcpu(v))
                                       && !shadow_mode_external(v->domain)
@@ -5387,8 +5424,8 @@ int sh_audit_l4_table(struct vcpu *v, mf
         {
             gfn = guest_l4e_get_gfn(*gl4e);
             mfn = shadow_l4e_get_mfn(*sl4e);
-            gmfn = get_shadow_status(v, gfn_to_mfn_query(v->domain,
-                                     gfn, &p2mt), 
+            gmfn = get_shadow_status(v, get_gfn_query_unlocked(
+                                     v->domain, gfn_x(gfn), &p2mt), 
                                      SH_type_l3_shadow);
             if ( mfn_x(gmfn) != mfn_x(mfn) )
                 AUDIT_FAIL(4, "bad translation: gfn %" SH_PRI_gfn
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/mm/shadow/types.h
--- a/xen/arch/x86/mm/shadow/types.h
+++ b/xen/arch/x86/mm/shadow/types.h
@@ -191,11 +191,11 @@ static inline shadow_l4e_t shadow_l4e_fr
 })
 #endif
 
- /* Override gfn_to_mfn to work with gfn_t */
-#undef gfn_to_mfn_query
-#define gfn_to_mfn_query(d, g, t) gfn_to_mfn_type((d), gfn_x(g), (t), p2m_query)
-#undef gfn_to_mfn_guest
-#define gfn_to_mfn_guest(d, g, t) gfn_to_mfn_type((d), gfn_x(g), (t), p2m_guest)
+ /* Override get_gfn to work with gfn_t */
+#undef get_gfn_query
+#define get_gfn_query(d, g, t) get_gfn_type((d), gfn_x(g), (t), p2m_query)
+#undef get_gfn_guest
+#define get_gfn_guest(d, g, t) get_gfn_type((d), gfn_x(g), (t), p2m_guest)
 
 /* The shadow types needed for the various levels. */
 
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/physdev.c
--- a/xen/arch/x86/physdev.c
+++ b/xen/arch/x86/physdev.c
@@ -297,16 +297,20 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
             break;
 
         ret = -EINVAL;
-        mfn = gmfn_to_mfn(current->domain, info.gmfn);
+        mfn = get_gfn_untyped(current->domain, info.gmfn);
         if ( !mfn_valid(mfn) ||
              !get_page_and_type(mfn_to_page(mfn), v->domain,
                                 PGT_writable_page) )
+        {
+            put_gfn(current->domain, info.gmfn);
             break;
+        }
 
         if ( cmpxchg(&v->domain->arch.pv_domain.pirq_eoi_map_mfn,
                      0, mfn) != 0 )
         {
             put_page_and_type(mfn_to_page(mfn));
+            put_gfn(current->domain, info.gmfn);
             ret = -EBUSY;
             break;
         }
@@ -316,10 +320,12 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
         {
             v->domain->arch.pv_domain.pirq_eoi_map_mfn = 0;
             put_page_and_type(mfn_to_page(mfn));
+            put_gfn(current->domain, info.gmfn);
             ret = -ENOSPC;
             break;
         }
 
+        put_gfn(current->domain, info.gmfn);
         ret = 0;
         break;
     }
diff -r 4699decb8424 -r 7461834954c8 xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -673,11 +673,12 @@ int wrmsr_hypervisor_regs(uint32_t idx, 
             return 0;
         }
 
-        mfn = gmfn_to_mfn(d, gmfn);
+        mfn = get_gfn_untyped(d, gmfn);
 
         if ( !mfn_valid(mfn) ||
              !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
         {
+            put_gfn(d, gmfn);
             gdprintk(XENLOG_WARNING,
                      "Bad GMFN %lx (MFN %lx) to MSR %08x\n",
                      gmfn, mfn, base + idx);
@@ -689,6 +690,7 @@ int wrmsr_hypervisor_regs(uint32_t idx, 
         unmap_domain_page(hypercall_page);
 
         put_page_and_type(mfn_to_page(mfn));
+        put_gfn(d, gmfn);
         break;
     }
 
@@ -2347,18 +2349,25 @@ static int emulate_privileged_op(struct 
             arch_set_cr2(v, *reg);
             break;
 
-        case 3: /* Write CR3 */
+        case 3: {/* Write CR3 */
+            unsigned long mfn, gfn;
             domain_lock(v->domain);
             if ( !is_pv_32on64_vcpu(v) )
-                rc = new_guest_cr3(gmfn_to_mfn(v->domain, xen_cr3_to_pfn(*reg)));
+            {
+                gfn = xen_cr3_to_pfn(*reg);
 #ifdef CONFIG_COMPAT
-            else
-                rc = new_guest_cr3(gmfn_to_mfn(v->domain, compat_cr3_to_pfn(*reg)));
+            } else {
+                gfn = compat_cr3_to_pfn(*reg);
 #endif
+            }
+            mfn = get_gfn_untyped(v->domain, gfn);
+            rc = new_guest_cr3(mfn);
+            put_gfn(v->domain, gfn);
             domain_unlock(v->domain);
             if ( rc == 0 ) /* not okay */
                 goto fail;
             break;
+        }
 
         case 4: /* Write CR4 */
             v->arch.pv_vcpu.ctrlreg[4] = pv_guest_cr4_fixup(v, *reg);
diff -r 4699decb8424 -r 7461834954c8 xen/common/grant_table.c
--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
@@ -110,7 +110,7 @@ static unsigned inline int max_nr_maptra
 #define gfn_to_mfn_private(_d, _gfn) ({                     \
     p2m_type_t __p2mt;                                      \
     unsigned long __x;                                      \
-    __x = mfn_x(gfn_to_mfn_unshare((_d), (_gfn), &__p2mt)); \
+    __x = mfn_x(get_gfn_unshare((_d), (_gfn), &__p2mt));    \
     BUG_ON(p2m_is_shared(__p2mt)); /* XXX fixme */          \
     if ( !p2m_is_valid(__p2mt) )                            \
         __x = INVALID_MFN;                                  \
@@ -150,10 +150,10 @@ static int __get_paged_frame(unsigned lo
     mfn_t mfn;
 
     if ( readonly )
-        mfn = gfn_to_mfn(rd, gfn, &p2mt);
+        mfn = get_gfn(rd, gfn, &p2mt);
     else
     {
-        mfn = gfn_to_mfn_unshare(rd, gfn, &p2mt);
+        mfn = get_gfn_unshare(rd, gfn, &p2mt);
         BUG_ON(p2m_is_shared(p2mt));
         /* XXX Here, and above in gfn_to_mfn_private, need to handle
          * XXX failure to unshare. */
@@ -164,14 +164,16 @@ static int __get_paged_frame(unsigned lo
         if ( p2m_is_paging(p2mt) )
         {
             p2m_mem_paging_populate(rd, gfn);
+            put_gfn(rd, gfn);
             rc = GNTST_eagain;
         }
     } else {
+       put_gfn(rd, gfn);
        *frame = INVALID_MFN;
        rc = GNTST_bad_page;
     }
 #else
-    *frame = readonly ? gmfn_to_mfn(rd, gfn) : gfn_to_mfn_private(rd, gfn);
+    *frame = readonly ? get_gfn_untyped(rd, gfn) : gfn_to_mfn_private(rd, gfn);
 #endif
 
     return rc;
@@ -468,13 +470,14 @@ __gnttab_map_grant_ref(
     struct domain *ld, *rd, *owner;
     struct vcpu   *led;
     int            handle;
+    unsigned long  gfn = INVALID_GFN;
     unsigned long  frame = 0, nr_gets = 0;
     struct page_info *pg;
     int            rc = GNTST_okay;
     u32            old_pin;
     u32            act_pin;
     unsigned int   cache_flags;
-    struct active_grant_entry *act;
+    struct active_grant_entry *act = NULL;
     struct grant_mapping *mt;
     grant_entry_v1_t *sha1;
     grant_entry_v2_t *sha2;
@@ -565,7 +568,6 @@ __gnttab_map_grant_ref(
 
         if ( !act->pin )
         {
-            unsigned long gfn;
             unsigned long frame;
 
             gfn = sha1 ? sha1->frame : sha2->full_page.frame;
@@ -698,6 +700,7 @@ __gnttab_map_grant_ref(
     op->handle       = handle;
     op->status       = GNTST_okay;
 
+    put_gfn(rd, gfn);
     rcu_unlock_domain(rd);
     return;
 
@@ -735,6 +738,8 @@ __gnttab_map_grant_ref(
         gnttab_clear_flag(_GTF_reading, status);
 
  unlock_out:
+    if ( gfn != INVALID_GFN )
+        put_gfn(rd, gfn);
     spin_unlock(&rd->grant_table->lock);
     op->status = rc;
     put_maptrack_handle(ld->grant_table, handle);
@@ -1475,6 +1480,7 @@ gnttab_transfer(
         /* Check the passed page frame for basic validity. */
         if ( unlikely(!mfn_valid(mfn)) )
         { 
+            put_gfn(d, gop.mfn);
             gdprintk(XENLOG_INFO, "gnttab_transfer: out-of-range %lx\n",
                     (unsigned long)gop.mfn);
             gop.status = GNTST_bad_page;
@@ -1484,6 +1490,7 @@ gnttab_transfer(
         page = mfn_to_page(mfn);
         if ( unlikely(is_xen_heap_page(page)) )
         { 
+            put_gfn(d, gop.mfn);
             gdprintk(XENLOG_INFO, "gnttab_transfer: xen frame %lx\n",
                     (unsigned long)gop.mfn);
             gop.status = GNTST_bad_page;
@@ -1492,6 +1499,7 @@ gnttab_transfer(
 
         if ( steal_page(d, page, 0) < 0 )
         {
+            put_gfn(d, gop.mfn);
             gop.status = GNTST_bad_page;
             goto copyback;
         }
@@ -1504,6 +1512,7 @@ gnttab_transfer(
         /* Find the target domain. */
         if ( unlikely((e = rcu_lock_domain_by_id(gop.domid)) == NULL) )
         {
+            put_gfn(d, gop.mfn);
             gdprintk(XENLOG_INFO, "gnttab_transfer: can't find domain %d\n",
                     gop.domid);
             page->count_info &= ~(PGC_count_mask|PGC_allocated);
@@ -1514,6 +1523,7 @@ gnttab_transfer(
 
         if ( xsm_grant_transfer(d, e) )
         {
+            put_gfn(d, gop.mfn);
             gop.status = GNTST_permission_denied;
         unlock_and_copyback:
             rcu_unlock_domain(e);
@@ -1566,6 +1576,7 @@ gnttab_transfer(
                         e->tot_pages, e->max_pages, gop.ref, e->is_dying);
             spin_unlock(&e->page_alloc_lock);
             rcu_unlock_domain(e);
+            put_gfn(d, gop.mfn);
             page->count_info &= ~(PGC_count_mask|PGC_allocated);
             free_domheap_page(page);
             gop.status = GNTST_general_error;
@@ -1579,6 +1590,7 @@ gnttab_transfer(
         page_set_owner(page, e);
 
         spin_unlock(&e->page_alloc_lock);
+        put_gfn(d, gop.mfn);
 
         TRACE_1D(TRC_MEM_PAGE_GRANT_TRANSFER, e->domain_id);
 
@@ -1850,6 +1862,8 @@ __acquire_grant_for_copy(
         {
             gfn = sha1->frame;
             rc = __get_paged_frame(gfn, &grant_frame, readonly, rd);
+            /* We drop this immediately per the comments at the top */
+            put_gfn(rd, gfn);
             if ( rc != GNTST_okay )
                 goto unlock_out;
             act->gfn = gfn;
@@ -1862,6 +1876,7 @@ __acquire_grant_for_copy(
         {
             gfn = sha2->full_page.frame;
             rc = __get_paged_frame(gfn, &grant_frame, readonly, rd);
+            put_gfn(rd, gfn);
             if ( rc != GNTST_okay )
                 goto unlock_out;
             act->gfn = gfn;
@@ -1874,6 +1889,7 @@ __acquire_grant_for_copy(
         {
             gfn = sha2->sub_page.frame;
             rc = __get_paged_frame(gfn, &grant_frame, readonly, rd);
+            put_gfn(rd, gfn);
             if ( rc != GNTST_okay )
                 goto unlock_out;
             act->gfn = gfn;
@@ -1973,6 +1989,7 @@ __gnttab_copy(
     {
 #ifdef CONFIG_X86
         rc = __get_paged_frame(op->source.u.gmfn, &s_frame, 1, sd);
+        put_gfn(sd, op->source.u.gmfn);
         if ( rc != GNTST_okay )
             goto error_out;
 #else
@@ -2012,6 +2029,7 @@ __gnttab_copy(
     {
 #ifdef CONFIG_X86
         rc = __get_paged_frame(op->dest.u.gmfn, &d_frame, 0, dd);
+        put_gfn(dd, op->dest.u.gmfn);
         if ( rc != GNTST_okay )
             goto error_out;
 #else
diff -r 4699decb8424 -r 7461834954c8 xen/common/memory.c
--- a/xen/common/memory.c
+++ b/xen/common/memory.c
@@ -162,11 +162,12 @@ int guest_remove_page(struct domain *d, 
     unsigned long mfn;
 
 #ifdef CONFIG_X86
-    mfn = mfn_x(gfn_to_mfn(d, gmfn, &p2mt)); 
+    mfn = mfn_x(get_gfn(d, gmfn, &p2mt)); 
     if ( unlikely(p2m_is_paging(p2mt)) )
     {
         guest_physmap_remove_page(d, gmfn, mfn, PAGE_ORDER_4K);
         p2m_mem_paging_drop_page(d, gmfn);
+        put_gfn(d, gmfn);
         return 1;
     }
 #else
@@ -174,6 +175,7 @@ int guest_remove_page(struct domain *d, 
 #endif
     if ( unlikely(!mfn_valid(mfn)) )
     {
+        put_gfn(d, gmfn);
         gdprintk(XENLOG_INFO, "Domain %u page number %lx invalid\n",
                 d->domain_id, gmfn);
         return 0;
@@ -187,12 +189,14 @@ int guest_remove_page(struct domain *d, 
     {
         put_page_and_type(page);
         guest_physmap_remove_page(d, gmfn, mfn, PAGE_ORDER_4K);
+        put_gfn(d, gmfn);
         return 1;
     }
 
 #endif /* CONFIG_X86 */
     if ( unlikely(!get_page(page, d)) )
     {
+        put_gfn(d, gmfn);
         gdprintk(XENLOG_INFO, "Bad page free for domain %u\n", d->domain_id);
         return 0;
     }
@@ -206,6 +210,7 @@ int guest_remove_page(struct domain *d, 
     guest_physmap_remove_page(d, gmfn, mfn, PAGE_ORDER_4K);
 
     put_page(page);
+    put_gfn(d, gmfn);
 
     return 1;
 }
@@ -265,7 +270,7 @@ static long memory_exchange(XEN_GUEST_HA
     PAGE_LIST_HEAD(out_chunk_list);
     unsigned long in_chunk_order, out_chunk_order;
     xen_pfn_t     gpfn, gmfn, mfn;
-    unsigned long i, j, k;
+    unsigned long i, j, k = 0; /* gcc ... */
     unsigned int  memflags = 0;
     long          rc = 0;
     struct domain *d;
@@ -363,9 +368,10 @@ static long memory_exchange(XEN_GUEST_HA
                 p2m_type_t p2mt;
 
                 /* Shared pages cannot be exchanged */
-                mfn = mfn_x(gfn_to_mfn_unshare(d, gmfn + k, &p2mt));
+                mfn = mfn_x(get_gfn_unshare(d, gmfn + k, &p2mt));
                 if ( p2m_is_shared(p2mt) )
                 {
+                    put_gfn(d, gmfn + k);
                     rc = -ENOMEM;
                     goto fail; 
                 }
@@ -374,6 +380,7 @@ static long memory_exchange(XEN_GUEST_HA
 #endif
                 if ( unlikely(!mfn_valid(mfn)) )
                 {
+                    put_gfn(d, gmfn + k);
                     rc = -EINVAL;
                     goto fail;
                 }
@@ -382,11 +389,13 @@ static long memory_exchange(XEN_GUEST_HA
 
                 if ( unlikely(steal_page(d, page, MEMF_no_refcount)) )
                 {
+                    put_gfn(d, gmfn + k);
                     rc = -EINVAL;
                     goto fail;
                 }
 
                 page_list_add(page, &in_chunk_list);
+                put_gfn(d, gmfn + k);
             }
         }
 
@@ -487,8 +496,12 @@ static long memory_exchange(XEN_GUEST_HA
  fail:
     /* Reassign any input pages we managed to steal. */
     while ( (page = page_list_remove_head(&in_chunk_list)) )
+    {
+        put_gfn(d, gmfn + k--);
         if ( assign_pages(d, page, 0, MEMF_no_refcount) )
             BUG();
+    }
+
  dying:
     rcu_unlock_domain(d);
     /* Free any output pages we managed to allocate. */
diff -r 4699decb8424 -r 7461834954c8 xen/common/tmem_xen.c
--- a/xen/common/tmem_xen.c
+++ b/xen/common/tmem_xen.c
@@ -109,22 +109,28 @@ static inline void *cli_get_page(tmem_cl
     struct page_info *page;
     int ret;
 
-    cli_mfn = mfn_x(gfn_to_mfn(current->domain, cmfn, &t));
+    cli_mfn = mfn_x(get_gfn(current->domain, cmfn, &t));
     if ( t != p2m_ram_rw || !mfn_valid(cli_mfn) )
+    {
+            put_gfn(current->domain, (unsigned long) cmfn);
             return NULL;
+    }
     page = mfn_to_page(cli_mfn);
     if ( cli_write )
         ret = get_page_and_type(page, current->domain, PGT_writable_page);
     else
         ret = get_page(page, current->domain);
     if ( !ret )
+    {
+        put_gfn(current->domain, (unsigned long) cmfn);
         return NULL;
+    }
     *pcli_mfn = cli_mfn;
     *pcli_pfp = (pfp_t *)page;
     return map_domain_page(cli_mfn);
 }
 
-static inline void cli_put_page(void *cli_va, pfp_t *cli_pfp,
+static inline void cli_put_page(tmem_cli_mfn_t cmfn, void *cli_va, pfp_t *cli_pfp,
                                 unsigned long cli_mfn, bool_t mark_dirty)
 {
     if ( mark_dirty )
@@ -135,6 +141,7 @@ static inline void cli_put_page(void *cl
     else
         put_page((struct page_info *)cli_pfp);
     unmap_domain_page(cli_va);
+    put_gfn(current->domain, (unsigned long) cmfn);
 }
 #endif
 
@@ -169,7 +176,7 @@ EXPORT int tmh_copy_from_client(pfp_t *p
               (pfn_offset+len <= PAGE_SIZE) )
         memcpy((char *)tmem_va+tmem_offset,(char *)cli_va+pfn_offset,len);
     if ( !tmemc )
-        cli_put_page(cli_va, cli_pfp, cli_mfn, 0);
+        cli_put_page(cmfn, cli_va, cli_pfp, cli_mfn, 0);
     unmap_domain_page(tmem_va);
     return 1;
 }
@@ -197,7 +204,7 @@ EXPORT int tmh_compress_from_client(tmem
     ASSERT(ret == LZO_E_OK);
     *out_va = dmem;
     if ( !tmemc )
-        cli_put_page(cli_va, cli_pfp, cli_mfn, 0);
+        cli_put_page(cmfn, cli_va, cli_pfp, cli_mfn, 0);
     unmap_domain_page(cli_va);
     return 1;
 }
@@ -225,7 +232,7 @@ EXPORT int tmh_copy_to_client(tmem_cli_m
         memcpy((char *)cli_va+pfn_offset,(char *)tmem_va+tmem_offset,len);
     unmap_domain_page(tmem_va);
     if ( !tmemc )
-        cli_put_page(cli_va, cli_pfp, cli_mfn, 1);
+        cli_put_page(cmfn, cli_va, cli_pfp, cli_mfn, 1);
     mb();
     return 1;
 }
@@ -249,7 +256,7 @@ EXPORT int tmh_decompress_to_client(tmem
     ASSERT(ret == LZO_E_OK);
     ASSERT(out_len == PAGE_SIZE);
     if ( !tmemc )
-        cli_put_page(cli_va, cli_pfp, cli_mfn, 1);
+        cli_put_page(cmfn, cli_va, cli_pfp, cli_mfn, 1);
     mb();
     return 1;
 }
@@ -271,7 +278,7 @@ EXPORT int tmh_copy_tze_to_client(tmem_c
         memcpy((char *)cli_va,(char *)tmem_va,len);
     if ( len < PAGE_SIZE )
         memset((char *)cli_va+len,0,PAGE_SIZE-len);
-    cli_put_page(cli_va, cli_pfp, cli_mfn, 1);
+    cli_put_page(cmfn, cli_va, cli_pfp, cli_mfn, 1);
     mb();
     return 1;
 }
diff -r 4699decb8424 -r 7461834954c8 xen/include/asm-ia64/mm.h
--- a/xen/include/asm-ia64/mm.h
+++ b/xen/include/asm-ia64/mm.h
@@ -549,6 +549,8 @@ extern u64 translate_domain_pte(u64 ptev
 #define gmfn_to_mfn(_d, gpfn)			\
     gmfn_to_mfn_foreign((_d), (gpfn))
 
+#define put_gfn(d, g)   ((void)0)
+
 #define __gpfn_invalid(_d, gpfn)			\
 	(lookup_domain_mpa((_d), ((gpfn)<<PAGE_SHIFT), NULL) == INVALID_MFN)
 
diff -r 4699decb8424 -r 7461834954c8 xen/include/asm-x86/guest_pt.h
--- a/xen/include/asm-x86/guest_pt.h
+++ b/xen/include/asm-x86/guest_pt.h
@@ -51,9 +51,9 @@ gfn_to_paddr(gfn_t gfn)
     return ((paddr_t)gfn_x(gfn)) << PAGE_SHIFT;
 }
 
-/* Override gfn_to_mfn to work with gfn_t */
-#undef gfn_to_mfn
-#define gfn_to_mfn(d, g, t) gfn_to_mfn_type((d), gfn_x(g), (t), p2m_alloc)
+/* Override get_gfn to work with gfn_t */
+#undef get_gfn
+#define get_gfn(d, g, t) get_gfn_type((d), gfn_x(g), (t), p2m_alloc)
 
 
 /* Types of the guest's page tables and access functions for them */
diff -r 4699decb8424 -r 7461834954c8 xen/include/asm-x86/p2m.h
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -3,6 +3,7 @@
  *
  * physical-to-machine mappings for automatically-translated domains.
  *
+ * Copyright (c) 2011 GridCentric Inc. (Andres Lagar-Cavilla)
  * Copyright (c) 2007 Advanced Micro Devices (Wei Huang)
  * Parts of this code are Copyright (c) 2006-2007 by XenSource Inc.
  * Parts of this code are Copyright (c) 2006 by Michael A Fetterman
@@ -305,47 +306,66 @@ struct p2m_domain *p2m_get_p2m(struct vc
 
 #define p2m_get_pagetable(p2m)  ((p2m)->phys_table)
 
+/**** p2m query accessors. After calling any of the variants below, you
+ * need to call put_gfn(domain, gfn). If you don't, you'll lock the
+ * hypervisor. ****/
 
 /* Read a particular P2M table, mapping pages as we go.  Most callers
- * should _not_ call this directly; use the other gfn_to_mfn_* functions
+ * should _not_ call this directly; use the other get_gfn* functions
  * below unless you know you want to walk a p2m that isn't a domain's
  * main one.
  * If the lookup succeeds, the return value is != INVALID_MFN and 
  * *page_order is filled in with the order of the superpage (if any) that
  * the entry was found in.  */
-mfn_t gfn_to_mfn_type_p2m(struct p2m_domain *p2m, unsigned long gfn,
+mfn_t get_gfn_type_access(struct p2m_domain *p2m, unsigned long gfn,
                     p2m_type_t *t, p2m_access_t *a, p2m_query_t q,
                     unsigned int *page_order);
 
 /* General conversion function from gfn to mfn */
-static inline mfn_t gfn_to_mfn_type(struct domain *d,
+static inline mfn_t get_gfn_type(struct domain *d,
                                     unsigned long gfn, p2m_type_t *t,
                                     p2m_query_t q)
 {
     p2m_access_t a;
-    return gfn_to_mfn_type_p2m(p2m_get_hostp2m(d), gfn, t, &a, q, NULL);
+    return get_gfn_type_access(p2m_get_hostp2m(d), gfn, t, &a, q, NULL);
 }
 
 /* Syntactic sugar: most callers will use one of these. 
- * N.B. gfn_to_mfn_query() is the _only_ one guaranteed not to take the
+ * N.B. get_gfn_query() is the _only_ one guaranteed not to take the
  * p2m lock; none of the others can be called with the p2m or paging
  * lock held. */
-#define gfn_to_mfn(d, g, t)         gfn_to_mfn_type((d), (g), (t), p2m_alloc)
-#define gfn_to_mfn_query(d, g, t)   gfn_to_mfn_type((d), (g), (t), p2m_query)
-#define gfn_to_mfn_guest(d, g, t)   gfn_to_mfn_type((d), (g), (t), p2m_guest)
-#define gfn_to_mfn_unshare(d, g, t) gfn_to_mfn_type((d), (g), (t), p2m_unshare)
+#define get_gfn(d, g, t)         get_gfn_type((d), (g), (t), p2m_alloc)
+#define get_gfn_query(d, g, t)   get_gfn_type((d), (g), (t), p2m_query)
+#define get_gfn_guest(d, g, t)   get_gfn_type((d), (g), (t), p2m_guest)
+#define get_gfn_unshare(d, g, t) get_gfn_type((d), (g), (t), p2m_unshare)
 
 /* Compatibility function exporting the old untyped interface */
-static inline unsigned long gmfn_to_mfn(struct domain *d, unsigned long gpfn)
+static inline unsigned long get_gfn_untyped(struct domain *d, unsigned long gpfn)
 {
     mfn_t mfn;
     p2m_type_t t;
-    mfn = gfn_to_mfn(d, gpfn, &t);
+    mfn = get_gfn(d, gpfn, &t);
     if ( p2m_is_valid(t) )
         return mfn_x(mfn);
     return INVALID_MFN;
 }
 
+/* This is a noop for now. */
+static inline void __put_gfn(struct p2m_domain *p2m, unsigned long gfn)
+{
+}
+
+#define put_gfn(d, gfn) __put_gfn(p2m_get_hostp2m((d)), (gfn))
+
+/* These are identical for now. The intent is to have the caller not worry 
+ * about put_gfn. To only be used in printk's, crash situations, or to 
+ * peek at a type. You're not holding the p2m entry exclsively after calling
+ * this. */
+#define get_gfn_unlocked(d, g, t)         get_gfn_type((d), (g), (t), p2m_alloc)
+#define get_gfn_query_unlocked(d, g, t)   get_gfn_type((d), (g), (t), p2m_query)
+#define get_gfn_guest_unlocked(d, g, t)   get_gfn_type((d), (g), (t), p2m_guest)
+#define get_gfn_unshare_unlocked(d, g, t) get_gfn_type((d), (g), (t), p2m_unshare)
+
 /* General conversion function from mfn to gfn */
 static inline unsigned long mfn_to_gfn(struct domain *d, mfn_t mfn)
 {
@@ -529,7 +549,8 @@ static inline int p2m_gfn_check_limit(
 #define p2m_gfn_check_limit(d, g, o) 0
 #endif
 
-/* Directly set a p2m entry: only for use by p2m code */
+/* Directly set a p2m entry: only for use by p2m code. Does not need
+ * a call to put_gfn afterwards/ */
 int set_p2m_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn, 
                   unsigned int page_order, p2m_type_t p2mt, p2m_access_t p2ma);
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 09:14:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 09:14:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROug9-0001eF-81; Fri, 11 Nov 2011 09:14:13 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROudh-0001QB-22
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 09:11:42 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1321031497!1215267!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5142 invoked from network); 11 Nov 2011 17:11:38 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 17:11:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,496,1315180800"; 
   d="scan'208";a="8891625"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Nov 2011 17:11:37 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 11 Nov 2011 17:11:37 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1ROudd-0001p2-1J	for xen-devel@lists.xensource.com;
	Fri, 11 Nov 2011 17:11:37 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1ROudc-0001HR-VK	for
	xen-devel@lists.xensource.com; Fri, 11 Nov 2011 17:11:36 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20157.22344.959076.649413@mariner.uk.xensource.com>
Date: Fri, 11 Nov 2011 17:11:36 +0000
To: xen-devel@lists.xensource.com
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Subject: [Xen-devel] xenbits downtime
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

As you may know we are migrating our services out of our existing
colo, which is being decommissioned.  (Rackspace have very kindly
provided us with complimentary hosting.)

As part of this we will be moving xenbits.xen.org aka
xenbits.xensource.com to new hosting.  The visible effect should be
that it will be down for an hour or so, hopefully on Monday afternoon
UK time.  I'll post a more specific announcement when I take the old
service down and when I bring the new one up.

Thanks,
Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 09:15:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 09:15:39 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROuhX-000227-As; Fri, 11 Nov 2011 09:15:39 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROufK-0001Se-LF
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 09:13:33 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1321031597!2785608!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30325 invoked from network); 11 Nov 2011 17:13:19 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-9.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 17:13:19 -0000
X-IronPort-AV: E=Sophos;i="4.69,496,1315195200"; d="scan'208,217";a="19029708"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Nov 2011 12:13:04 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX01.citrite.net
	(10.13.107.65) with Microsoft SMTP Server id 8.3.137.0; Fri, 11 Nov 2011
	12:13:04 -0500
Message-ID: <4EBD579F.70901@citrix.com>
Date: Fri, 11 Nov 2011 17:13:03 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: <xen-devel@lists.xensource.com>, Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: prevent vector sharing within
	IO-APICs
References: <4EBD54B80200007800060776@nat28.tlf.novell.com>
In-Reply-To: <4EBD54B80200007800060776@nat28.tlf.novell.com>
X-Enigmail-Version: 1.1.2
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1754865765=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1754865765==
Content-Type: multipart/alternative;
	boundary="------------070409010709080202040304"

--------------070409010709080202040304
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit

On 11/11/11 16:00, Jan Beulich wrote:
> Following the prevention of vector sharing for MSIs, this change
> enforces the same within IO-APICs: Pin based interrupts use the IO-APIC
> as their identifying device under the AMD IOMMU (and just like for
> MSIs, only the identifying device is used to remap interrupts here,
> with no regard to an interrupt's destination).
>
> Additionally, LAPIC initiated EOIs (for level triggered interrupts) too
> use only the vector for identifying which interrupts to end. While this
> generally causes no significant problem (at worst an interrupt would be
> re-raised without a new interrupt event actually having occurred)

At worst, hardware asserts a line interrupt, deasserts it later, and an
EOI broadcast gets rid of any record that the IRQ was ever raised. 
While I would classify this as buggy behavior, I believe I have seen
some hardware doing this when investigating the line level IRQ migration
bug, as clearing the IRR did not immediately cause another interrupt to
be generated.

> , it
> still seems better to avoid the situation.
>
> For this second aspect, a distinction is being made between the
> traditional and the directed-EOI cases: In the former, vectors should
> not be shared throughout all IO-APICs in the system, while in the
> latter case only individual IO-APICs need to be contrained (or, if the
> firmware indicates so, sub- groups of them having the same GSI appear
> at multiple pins).
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Provisional nack because it is my understanding that under all
circumstances, you must maintain a vector exclusivity map across all
IO-APICs because of the broadcast problem.  Or have I made a mistake in
my reasoning?

> --- a/xen/arch/x86/irq.c
> +++ b/xen/arch/x86/irq.c
> @@ -395,6 +395,11 @@ static vmask_t *irq_get_used_vector_mask
>              }
>          }
>      }
> +    else if ( IO_APIC_IRQ(irq) &&
> +              opt_irq_vector_map != OPT_IRQ_VECTOR_MAP_NONE )
> +    {
> +        ret = io_apic_get_used_vector_map(irq);
> +    }
>  
>      return ret;
>  }
> --- a/xen/arch/x86/io_apic.c
> +++ b/xen/arch/x86/io_apic.c
> @@ -72,6 +72,33 @@ int __read_mostly nr_ioapics;
>  #define io_apic_eoi_vector(apic, vector) io_apic_eoi((apic), (vector), -1)
>  #define io_apic_eoi_pin(apic, pin) io_apic_eoi((apic), -1, (pin))
>  
> +static int apic_pin_2_gsi_irq(int apic, int pin);
> +
> +static vmask_t *__read_mostly vector_map[MAX_IO_APICS];
> +
> +static void share_vector_maps(unsigned int src, unsigned int dst)
> +{
> +    unsigned int pin;
> +
> +    if (vector_map[src] == vector_map[dst])
> +        return;
> +
> +    bitmap_or(vector_map[src]->_bits, vector_map[src]->_bits,
> +              vector_map[dst]->_bits, NR_VECTORS);
> +
> +    for (pin = 0; pin < nr_ioapic_entries[dst]; ++pin) {
> +        int irq = apic_pin_2_gsi_irq(dst, pin);
> +        struct irq_desc *desc;
> +
> +        if (irq < 0)
> +            continue;
> +        desc = irq_to_desc(irq);
> +        if (desc->arch.used_vectors == vector_map[dst])
> +            desc->arch.used_vectors = vector_map[src];
> +    }
> +
> +    vector_map[dst] = vector_map[src];
> +}
>  
>  /*
>   * This is performance-critical, we want to do it O(1)
> @@ -113,6 +140,7 @@ static void add_pin_to_irq(unsigned int 
>      }
>      entry->apic = apic;
>      entry->pin = pin;
> +    share_vector_maps(irq_2_pin[irq].apic, apic);
>  }
>  
>  /*
> @@ -128,6 +156,7 @@ static void __init replace_pin_at_irq(un
>          if (entry->apic == oldapic && entry->pin == oldpin) {
>              entry->apic = newapic;
>              entry->pin = newpin;
> +            share_vector_maps(oldapic, newapic);
>          }
>          if (!entry->next)
>              break;
> @@ -135,6 +164,16 @@ static void __init replace_pin_at_irq(un
>      }
>  }
>  
> +vmask_t *io_apic_get_used_vector_map(unsigned int irq)
> +{
> +    struct irq_pin_list *entry = irq_2_pin + irq;
> +
> +    if (entry->pin == -1)
> +        return NULL;
> +
> +    return vector_map[entry->apic];
> +}
> +
>  struct IO_APIC_route_entry **alloc_ioapic_entries(void)
>  {
>      int apic;
> @@ -1244,6 +1283,18 @@ static void __init enable_IO_APIC(void)
>      for (i = irq_2_pin_free_entry = nr_irqs_gsi; i < PIN_MAP_SIZE; i++)
>          irq_2_pin[i].next = i + 1;
>  
> +    if (directed_eoi_enabled) {
> +        for (apic = 0; apic < nr_ioapics; apic++) {
> +            vector_map[apic] = xzalloc(vmask_t);
> +            BUG_ON(!vector_map[apic]);
> +        }
> +    } else {
> +        vector_map[0] = xzalloc(vmask_t);
> +        BUG_ON(!vector_map[0]);
> +        for (apic = 1; apic < nr_ioapics; apic++)
> +            vector_map[apic] = vector_map[0];
> +    }
> +
>      for(apic = 0; apic < nr_ioapics; apic++) {
>          int pin;
>          /* See if any of the pins is in ExtINT mode */
> @@ -2345,13 +2396,12 @@ int ioapic_guest_write(unsigned long phy
>      }
>  
>      if ( desc->arch.vector <= 0 || desc->arch.vector > LAST_DYNAMIC_VECTOR ) {
> +        add_pin_to_irq(irq, apic, pin);
>          vector = assign_irq_vector(irq);
>          if ( vector < 0 )
>              return vector;
>  
>          printk(XENLOG_INFO "allocated vector %02x for irq %d\n", vector, irq);
> -
> -        add_pin_to_irq(irq, apic, pin);
>      }
>      spin_lock(&dom0->event_lock);
>      ret = map_domain_pirq(dom0, pirq, irq,
> --- a/xen/include/asm-x86/irq.h
> +++ b/xen/include/asm-x86/irq.h
> @@ -116,6 +116,7 @@ int i8259A_resume(void);
>  void setup_IO_APIC(void);
>  void disable_IO_APIC(void);
>  void setup_ioapic_dest(void);
> +vmask_t *io_apic_get_used_vector_map(unsigned int irq);
>  
>  extern unsigned int io_apic_irqs;
>  
>
>

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


--------------070409010709080202040304
Content-Type: text/html; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#ffffff" text="#000000">
    On 11/11/11 16:00, Jan Beulich wrote:
    <blockquote cite="mid:4EBD54B80200007800060776@nat28.tlf.novell.com"
      type="cite">
      <pre wrap="">Following the prevention of vector sharing for MSIs, this change
enforces the same within IO-APICs: Pin based interrupts use the IO-APIC
as their identifying device under the AMD IOMMU (and just like for
MSIs, only the identifying device is used to remap interrupts here,
with no regard to an interrupt's destination).

Additionally, LAPIC initiated EOIs (for level triggered interrupts) too
use only the vector for identifying which interrupts to end. While this
generally causes no significant problem (at worst an interrupt would be
re-raised without a new interrupt event actually having occurred)</pre>
    </blockquote>
    <br>
    At worst, hardware asserts a line interrupt, deasserts it later, and
    an EOI broadcast gets rid of any record that the IRQ was ever
    raised.&nbsp; While I would classify this as buggy behavior, I believe I
    have seen some hardware doing this when investigating the line level
    IRQ migration bug, as clearing the IRR did not immediately cause
    another interrupt to be generated.<br>
    <br>
    <blockquote cite="mid:4EBD54B80200007800060776@nat28.tlf.novell.com"
      type="cite">
      <pre wrap="">, it
still seems better to avoid the situation.

For this second aspect, a distinction is being made between the
traditional and the directed-EOI cases: In the former, vectors should
not be shared throughout all IO-APICs in the system, while in the
latter case only individual IO-APICs need to be contrained (or, if the
firmware indicates so, sub- groups of them having the same GSI appear
at multiple pins).

Signed-off-by: Jan Beulich <a class="moz-txt-link-rfc2396E" href="mailto:jbeulich@suse.com">&lt;jbeulich@suse.com&gt;</a><small></small>
</pre>
    </blockquote>
    <br>
    Provisional nack because it is my understanding that under all
    circumstances, you must maintain a vector exclusivity map across all
    IO-APICs because of the broadcast problem.&nbsp; Or have I made a mistake
    in my reasoning?<br>
    <br>
    <blockquote cite="mid:4EBD54B80200007800060776@nat28.tlf.novell.com"
      type="cite">
      <pre wrap="">
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -395,6 +395,11 @@ static vmask_t *irq_get_used_vector_mask
             }
         }
     }
+    else if ( IO_APIC_IRQ(irq) &amp;&amp;
+              opt_irq_vector_map != OPT_IRQ_VECTOR_MAP_NONE )
+    {
+        ret = io_apic_get_used_vector_map(irq);
+    }
 
     return ret;
 }
--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -72,6 +72,33 @@ int __read_mostly nr_ioapics;
 #define io_apic_eoi_vector(apic, vector) io_apic_eoi((apic), (vector), -1)
 #define io_apic_eoi_pin(apic, pin) io_apic_eoi((apic), -1, (pin))
 
+static int apic_pin_2_gsi_irq(int apic, int pin);
+
+static vmask_t *__read_mostly vector_map[MAX_IO_APICS];
+
+static void share_vector_maps(unsigned int src, unsigned int dst)
+{
+    unsigned int pin;
+
+    if (vector_map[src] == vector_map[dst])
+        return;
+
+    bitmap_or(vector_map[src]-&gt;_bits, vector_map[src]-&gt;_bits,
+              vector_map[dst]-&gt;_bits, NR_VECTORS);
+
+    for (pin = 0; pin &lt; nr_ioapic_entries[dst]; ++pin) {
+        int irq = apic_pin_2_gsi_irq(dst, pin);
+        struct irq_desc *desc;
+
+        if (irq &lt; 0)
+            continue;
+        desc = irq_to_desc(irq);
+        if (desc-&gt;arch.used_vectors == vector_map[dst])
+            desc-&gt;arch.used_vectors = vector_map[src];
+    }
+
+    vector_map[dst] = vector_map[src];
+}
 
 /*
  * This is performance-critical, we want to do it O(1)
@@ -113,6 +140,7 @@ static void add_pin_to_irq(unsigned int 
     }
     entry-&gt;apic = apic;
     entry-&gt;pin = pin;
+    share_vector_maps(irq_2_pin[irq].apic, apic);
 }
 
 /*
@@ -128,6 +156,7 @@ static void __init replace_pin_at_irq(un
         if (entry-&gt;apic == oldapic &amp;&amp; entry-&gt;pin == oldpin) {
             entry-&gt;apic = newapic;
             entry-&gt;pin = newpin;
+            share_vector_maps(oldapic, newapic);
         }
         if (!entry-&gt;next)
             break;
@@ -135,6 +164,16 @@ static void __init replace_pin_at_irq(un
     }
 }
 
+vmask_t *io_apic_get_used_vector_map(unsigned int irq)
+{
+    struct irq_pin_list *entry = irq_2_pin + irq;
+
+    if (entry-&gt;pin == -1)
+        return NULL;
+
+    return vector_map[entry-&gt;apic];
+}
+
 struct IO_APIC_route_entry **alloc_ioapic_entries(void)
 {
     int apic;
@@ -1244,6 +1283,18 @@ static void __init enable_IO_APIC(void)
     for (i = irq_2_pin_free_entry = nr_irqs_gsi; i &lt; PIN_MAP_SIZE; i++)
         irq_2_pin[i].next = i + 1;
 
+    if (directed_eoi_enabled) {
+        for (apic = 0; apic &lt; nr_ioapics; apic++) {
+            vector_map[apic] = xzalloc(vmask_t);
+            BUG_ON(!vector_map[apic]);
+        }
+    } else {
+        vector_map[0] = xzalloc(vmask_t);
+        BUG_ON(!vector_map[0]);
+        for (apic = 1; apic &lt; nr_ioapics; apic++)
+            vector_map[apic] = vector_map[0];
+    }
+
     for(apic = 0; apic &lt; nr_ioapics; apic++) {
         int pin;
         /* See if any of the pins is in ExtINT mode */
@@ -2345,13 +2396,12 @@ int ioapic_guest_write(unsigned long phy
     }
 
     if ( desc-&gt;arch.vector &lt;= 0 || desc-&gt;arch.vector &gt; LAST_DYNAMIC_VECTOR ) {
+        add_pin_to_irq(irq, apic, pin);
         vector = assign_irq_vector(irq);
         if ( vector &lt; 0 )
             return vector;
 
         printk(XENLOG_INFO "allocated vector %02x for irq %d\n", vector, irq);
-
-        add_pin_to_irq(irq, apic, pin);
     }
     spin_lock(&amp;dom0-&gt;event_lock);
     ret = map_domain_pirq(dom0, pirq, irq,
--- a/xen/include/asm-x86/irq.h
+++ b/xen/include/asm-x86/irq.h
@@ -116,6 +116,7 @@ int i8259A_resume(void);
 void setup_IO_APIC(void);
 void disable_IO_APIC(void);
 void setup_ioapic_dest(void);
+vmask_t *io_apic_get_used_vector_map(unsigned int irq);
 
 extern unsigned int io_apic_irqs;
 


</pre>
    </blockquote>
    <br>
    <pre class="moz-signature" cols="72">-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, <a class="moz-txt-link-freetext" href="http://www.citrix.com">http://www.citrix.com</a></pre>
  </body>
</html>

--------------070409010709080202040304--


--===============1754865765==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1754865765==--


From xen-devel-bounces@lists.xensource.com Fri Nov 11 09:26:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 09:26:37 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROus9-0002Ys-9q; Fri, 11 Nov 2011 09:26:37 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1ROurS-0002MM-9p
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 09:25:54 -0800
X-Env-Sender: niall.fleming@webanywhere.co.uk
X-Msg-Ref: server-12.tower-174.messagelabs.com!1321032350!1211333!1
X-Originating-IP: [212.227.17.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19541 invoked from network); 11 Nov 2011 17:25:50 -0000
Received: from moutng.kundenserver.de (HELO moutng.kundenserver.de)
	(212.227.17.10) by server-12.tower-174.messagelabs.com with SMTP;
	11 Nov 2011 17:25:50 -0000
Received: from [192.168.80.60] (host81-130-25-5.in-addr.btopenworld.com
	[81.130.25.5])
	by mrelayeu.kundenserver.de (node=mrbap4) with ESMTP (Nemesis)
	id 0MJU0R-1RMyut1zbf-002rUo; Fri, 11 Nov 2011 18:25:49 +0100
Message-ID: <4EBD5AA0.3090906@webanywhere.co.uk>
Date: Fri, 11 Nov 2011 17:25:52 +0000
From: Niall Fleming <niall.fleming@webanywhere.co.uk>
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20111105 Thunderbird/8.0
MIME-Version: 1.0
To: xen-devel@lists.xensource.com
X-Provags-ID: V02:K0:lFV/Y5NzkQW3umd3oQNB5nc2rk/wSkCks92PBaOQBYF
	a5NDS89FLANH4lL2yas0Wsxe/gsmrxLrw/agEs2WnkH072Paar
	OhAqqVMiF7ezXg9o9LPzeXlAvH87sA0BeLpCbbfbEQnsM/ehIl
	bguYNOMmG/Wcc0e3x+C0UTiXY0qGChNYCIzVKIWoI81Dkb8LQM
	dYp49N0J+99rPD5+fhfjidvRPmv0Gdb0Cuwg2RfLhJsVmkT4pV
	TPoHCAkOkOKwdwxui7f4Fz/+SCoeR0fIW5EVpaz1ymzonmS1za
	ab07eRShNt7tGHACdaasB+JNH2uewUryb5CYLVL4YAUsz8k1bd
	OGyHNEou4i45Lqt+FY4UhyV4s5tj/dJohczVd10tZ
Cc: keir.xen@gmail.com, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Time Change Issue Xen 4.1
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1220959790=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============1220959790==
Content-Type: multipart/alternative;
	boundary="------------070203050809000508010702"

This is a multi-part message in MIME format.
--------------070203050809000508010702
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hi all,

Already posted this over in xen-users and Konrad confirms it as a bug 
and suggested to repost
it over here!

Issue is that changing the time in dom0 doesn't take effect on the VMs 
until a reboot of dom0.
The testing example below illustrates what I mean....

Synopsis of testing:

Booted the physical machine, date tells me it's 17:15:45. Hwclock agrees.
Booted a VM (using xl as xm seems to be labouring under the impression 
that blockdev is missing - it isn't)
The login prompt displays the time as 17:17, which is the expected 
behaviour.
Changed the time in dom0 - (date +%T -s 12:00:00), synced to hwclock.
Check that date and hwclock match - they do.
Destroy the VM and recreate.
The login prompt displays the time as 17:22. Unexpected!


Kernel: I git cloned tag v3.1 from the kernel.org linux.git, and applied 
xen-settime patches
Also tested with jeremy-git-xen-next-2.6.32 (.41/.46) without patch, 
they wouldn't apply.
Xen: 4.1.1/4.1.2
Distribution: Gentoo

It still doesn't work.

I've tested that the issue also exists in Debian Squeeze (with 
linux-image-3.0.0 from testing as 2.6.32-5 is broken
on my hardware).
-- 

*Niall Fleming BSc. (Hons)*
Systems Administrator
Webanywhere Limited

Phone: 0800 862 0131 Ext: 203
Web: http://www.webanywhere.co.uk

Aire Valley Business Centre, Lawkholme Lane, Keighley, BD21 3BB
Registered in England with company number 4881346

--------------070203050809000508010702
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Hi all, <br>
    <br>
    Already posted this over in xen-users and Konrad confirms it as a
    bug and suggested to repost<br>
    it over here!<br>
    <br>
    Issue is that changing the time in dom0 doesn't take effect on the
    VMs until a reboot of dom0.<br>
    The testing example below illustrates what I mean....<br>
    <br>
    Synopsis of testing:<br>
    <br>
    Booted the physical machine, date tells me it's 17:15:45. Hwclock
    agrees.<br>
    Booted a VM (using xl as xm seems to be labouring under the
    impression that blockdev is missing - it isn't)<br>
    The login prompt displays the time as 17:17, which is the expected
    behaviour.<br>
    Changed the time in dom0 - (date +%T -s 12:00:00), synced to
    hwclock.<br>
    Check that date and hwclock match - they do.<br>
    Destroy the VM and recreate.<br>
    The login prompt displays the time as 17:22. Unexpected!<br>
    <br>
    <br>
    Kernel: I git cloned tag v3.1 from the kernel.org linux.git, and
    applied xen-settime patches<br>
    Also tested with jeremy-git-xen-next-2.6.32 (.41/.46) without patch,
    they wouldn't apply.<br>
    Xen: 4.1.1/4.1.2<br>
    Distribution: Gentoo<br>
    <br>
    It still doesn't work.<br>
    <br>
    I've tested that the issue also exists in Debian Squeeze (with
    linux-image-3.0.0 from testing as 2.6.32-5 is broken<br>
    on my hardware).<br>
    <div class="moz-signature">-- <br>
      <br>
      <b>Niall Fleming BSc. (Hons)</b><br>
      Systems Administrator<br>
      Webanywhere Limited<br>
      <br>
      Phone: 0800 862 0131 Ext: 203<br>
      Web: <a class="moz-txt-link-freetext" href="http://www.webanywhere.co.uk">http://www.webanywhere.co.uk</a><br>
      <br>
      Aire Valley Business Centre, Lawkholme Lane, Keighley, BD21 3BB<br>
      Registered in England with company number 4881346</div>
  </body>
</html>

--------------070203050809000508010702--


--===============1220959790==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1220959790==--


From xen-devel-bounces@lists.xensource.com Fri Nov 11 09:41:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 09:41:39 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROv6h-0003EC-KR; Fri, 11 Nov 2011 09:41:39 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROv5q-00031S-SN
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 09:40:47 -0800
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1321033206!62853273!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32196 invoked from network); 11 Nov 2011 17:40:07 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 17:40:07 -0000
X-IronPort-AV: E=Sophos;i="4.69,496,1315180800"; 
   d="scan'208";a="8891987"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Nov 2011 17:40:43 +0000
Received: from dhcp-3-28.uk.xensource.com (10.80.3.28) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 11 Nov 2011 17:40:43 +0000
Date: Fri, 11 Nov 2011 17:40:27 +0000
From: Anthony PERARD <anthony.perard@citrix.com>
X-X-Sender: anthony@perard.uk.xensource.com
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] [PATCH V3 08/10] Introduce Xen PCI Passthrough, PCI
	config space helpers (2/3)
In-Reply-To: <20111110215353.GA23837@phenom.dumpdata.com>
Message-ID: <alpine.DEB.2.00.1111111631070.8085@perard.uk.xensource.com>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-9-git-send-email-anthony.perard@citrix.com>
	<20111110215353.GA23837@phenom.dumpdata.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: Guy Zana <guy@neocleus.com>, Xen Devel <xen-devel@lists.xensource.com>,
	Allen Kay <allen.m.kay@intel.com>, QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 10 Nov 2011, Konrad Rzeszutek Wilk wrote:

> On Fri, Oct 28, 2011 at 04:07:34PM +0100, Anthony PERARD wrote:
> > From: Allen Kay <allen.m.kay@intel.com>
> >
> > Signed-off-by: Allen Kay <allen.m.kay@intel.com>
> > Signed-off-by: Guy Zana <guy@neocleus.com>
> > Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> > ---
> >  Makefile.target                      |    1 +
> >  hw/xen_pci_passthrough.h             |    2 +
> >  hw/xen_pci_passthrough_config_init.c | 2068 ++++++++++++++++++++++++++++++++++
> >  3 files changed, 2071 insertions(+), 0 deletions(-)
> >  create mode 100644 hw/xen_pci_passthrough_config_init.c
> >

[...]

> > +/* A return value of 1 means the capability should NOT be exposed to guest. */
> > +static int pt_hide_dev_cap(const HostPCIDevice *d, uint8_t grp_id)
> > +{
> > +    switch (grp_id) {
> > +    case PCI_CAP_ID_EXP:
> > +        /* The PCI Express Capability Structure of the VF of Intel 82599 10GbE
> > +         * Controller looks trivial, e.g., the PCI Express Capabilities
> > +         * Register is 0. We should not try to expose it to guest.
>
> Why not?

Because (an old commit):

passthrough: support the assignment of the VF of Intel 82599 10GbE Controller

The datasheet is available at
http://download.intel.com/design/network/datashts/82599_datasheet.pdf

See 'Table 9.7. VF PCIe Configuration Space' of the datasheet, the PCI
Express Capability Structure of the VF of Intel 82599 10GbE Controller looks
trivial, e.g., the PCI Express Capabilities Register is 0, so the Capability
Version is 0 and pt_pcie_size_init() would fail.

We should not try to expose the PCIe cap of the device to guest.

a patch from Dexuan Cui <dexuan.cui@intel.com>

> > +         */
> > +        if (d->vendor_id == PCI_VENDOR_ID_INTEL &&
> > +                d->device_id == PCI_DEVICE_ID_INTEL_82599_VF) {
> > +            return 1;
> > +        }
> > +        break;
> > +    }
> > +    return 0;
> > +}
> > +
> > +/*   find emulate register group entry */
> > +XenPTRegGroup *pt_find_reg_grp(XenPCIPassthroughState *s, uint32_t address)
> > +{
> > +    XenPTRegGroup *entry = NULL;
> > +
> > +    /* find register group entry */
> > +    QLIST_FOREACH(entry, &s->reg_grp_tbl, entries) {
> > +        /* check address */
> > +        if ((entry->base_offset <= address)
> > +            && ((entry->base_offset + entry->size) > address)) {
> > +            return entry;
> > +        }
> > +    }
> > +
> > +    /* group entry not found */
> > +    return NULL;
> > +}
> > +
> > +/* find emulate register entry */
> > +XenPTReg *pt_find_reg(XenPTRegGroup *reg_grp, uint32_t address)
> > +{
> > +    XenPTReg *reg_entry = NULL;
> > +    XenPTRegInfo *reg = NULL;
> > +    uint32_t real_offset = 0;
> > +
> > +    /* find register entry */
> > +    QLIST_FOREACH(reg_entry, &reg_grp->reg_tbl_list, entries) {
> > +        reg = reg_entry->reg;
> > +        real_offset = reg_grp->base_offset + reg->offset;
> > +        /* check address */
> > +        if ((real_offset <= address)
> > +            && ((real_offset + reg->size) > address)) {
> > +            return reg_entry;
> > +        }
> > +    }
> > +
> > +    return NULL;
> > +}
> > +
> > +/* parse BAR */
> > +static PTBarFlag pt_bar_reg_parse(XenPCIPassthroughState *s, XenPTRegInfo *reg)
> > +{
> > +    PCIDevice *d = &s->dev;
> > +    XenPTRegion *region = NULL;
> > +    PCIIORegion *r;
> > +    int index = 0;
> > +
> > +    /* check 64bit BAR */
> > +    index = pt_bar_offset_to_index(reg->offset);
> > +    if ((0 < index) && (index < PCI_ROM_SLOT)) {
>
> This is  a bit confusing. Can you make the index be on the same
> side, like
>
> if ((0 < index) && (PCI_ROM_SLOT > index)
>
> or better:
>
> if ((index < 0) && (index < PCI_ROM_SLOT))
>
> um, which looks wrong. Should it be 'index > 0' ?

Every other form is a bit confusing to me. I'd like to write
0 < index < ROM_SLOT, so I know that index is between 0 and ROM_SLOT.
But, it's C and not math, so I wrote the closest way I can.

> > +        int flags = s->real_device->io_regions[index - 1].flags;
>
> Do we want to check the index - 1 to make sure it is not negative?

We have:
  0 < index < ROM_SLOT
so (index - 1) give us:
  0 <= index - 1 < ROM_SLOT - 1

So (index - 1) can be 0, but under 0.
;)


[...]

> > +/********************
> > + * Header Type0
> > + */
> > +
> > +static uint32_t pt_vendor_reg_init(XenPCIPassthroughState *s,
> > +                                   XenPTRegInfo *reg, uint32_t real_offset)
> > +{
> > +    return s->real_device->vendor_id;
> > +}
> > +static uint32_t pt_device_reg_init(XenPCIPassthroughState *s,
> > +                                   XenPTRegInfo *reg, uint32_t real_offset)
> > +{
> > +    return s->real_device->device_id;
> > +}
> > +static uint32_t pt_status_reg_init(XenPCIPassthroughState *s,
> > +                                   XenPTRegInfo *reg, uint32_t real_offset)
> > +{
> > +    XenPTRegGroup *reg_grp_entry = NULL;
> > +    XenPTReg *reg_entry = NULL;
> > +    int reg_field = 0;
> > +
> > +    /* find Header register group */
> > +    reg_grp_entry = pt_find_reg_grp(s, PCI_CAPABILITY_LIST);
> > +    if (reg_grp_entry) {
> > +        /* find Capabilities Pointer register */
> > +        reg_entry = pt_find_reg(reg_grp_entry, PCI_CAPABILITY_LIST);
> > +        if (reg_entry) {
> > +            /* check Capabilities Pointer register */
> > +            if (reg_entry->data) {
> > +                reg_field |= PCI_STATUS_CAP_LIST;
> > +            } else {
> > +                reg_field &= ~PCI_STATUS_CAP_LIST;
> > +            }
> > +        } else {
> > +            hw_error("Internal error: Couldn't find pt_reg_tbl for "
> > +                     "Capabilities Pointer register. I/O emulator exit.\n");
>
> Yikes. abort here? Um, can we just return a fault code instead?

This should probably not happend, I suppose.

> > +        }
> > +    } else {
> > +        hw_error("Internal error: Couldn't find pt_reg_grp_tbl for Header. "
> > +                 "I/O emulator exit.\n");
> > +    }
> > +
> > +    return reg_field;
> > +}

[...]

> > +static uint32_t pt_bar_reg_init(XenPCIPassthroughState *s, XenPTRegInfo *reg,
> > +                                uint32_t real_offset)
> > +{
> > +    int reg_field = 0;
> > +    int index;
> > +
> > +    /* get BAR index */
> > +    index = pt_bar_offset_to_index(reg->offset);
> > +    if (index < 0) {
> > +        hw_error("Internal error: Invalid BAR index[%d]. "
> > +                 "I/O emulator exit.\n", index);
> > +    }
> > +
> > +    /* set initial guest physical base address to -1 */
> > +    s->bases[index].e_physbase = -1;
>
> Um, use that define PCI_.. something macro.

:(, e_physbase is uint32, and PCI_BAR_UNMAPPED is uint64.

> > +
> > +    /* set BAR flag */
> > +    s->bases[index].bar_flag = pt_bar_reg_parse(s, reg);
> > +    if (s->bases[index].bar_flag == PT_BAR_FLAG_UNUSED) {
> > +        reg_field = PT_INVALID_REG;
> > +    }
> > +
> > +    return reg_field;
> > +}

[...]

> > +
> > +
> > +/*****************************
> > + * PCI Express Capability
> > + */
> > +
> > +/* initialize Link Control register */
> > +static uint32_t pt_linkctrl_reg_init(XenPCIPassthroughState *s,
> > +                                     XenPTRegInfo *reg, uint32_t real_offset)
> > +{
> > +    uint8_t cap_ver = 0;
> > +    uint8_t dev_type = 0;
> > +
> > +    /* TODO maybe better to use fonction from hw/pcie.c */
>
> function
> > +    cap_ver = pci_get_byte(s->dev.config + real_offset - reg->offset
> > +                           + PCI_EXP_FLAGS)
> > +        & PCI_EXP_FLAGS_VERS;
> > +    dev_type = (pci_get_byte(s->dev.config + real_offset - reg->offset
> > +                             + PCI_EXP_FLAGS)
> > +                & PCI_EXP_FLAGS_TYPE) >> 4;
> > +
> > +    /* no need to initialize in case of Root Complex Integrated Endpoint
> > +     * with cap_ver 1.x
>
> Why?

Who knows? I don't. And `git log` does not give me more information.

> > +     */
> > +    if ((dev_type == PCI_EXP_TYPE_RC_END) && (cap_ver == 1)) {
> > +        return PT_INVALID_REG;
> > +    }
> > +
> > +    return reg->init_val;
> > +}
> > +/* initialize Device Control 2 register */
> > +static uint32_t pt_devctrl2_reg_init(XenPCIPassthroughState *s,
> > +                                     XenPTRegInfo *reg, uint32_t real_offset)
> > +{
> > +    uint8_t cap_ver = 0;
> > +
> > +    cap_ver = pci_get_byte(s->dev.config + real_offset - reg->offset
> > +                           + PCI_EXP_FLAGS)
> > +        & PCI_EXP_FLAGS_VERS;
> > +
> > +    /* no need to initialize in case of cap_ver 1.x */
> > +    if (cap_ver == 1) {
> > +        return PT_INVALID_REG;
> > +    }
> > +
> > +    return reg->init_val;
> > +}
> > +/* initialize Link Control 2 register */
> > +static uint32_t pt_linkctrl2_reg_init(XenPCIPassthroughState *s,
> > +                                      XenPTRegInfo *reg, uint32_t real_offset)
> > +{
> > +    int reg_field = 0;
> > +    uint8_t cap_ver = 0;
> > +
> > +    cap_ver = pci_get_byte(s->dev.config + real_offset - reg->offset
> > +                           + PCI_EXP_FLAGS)
> > +        & PCI_EXP_FLAGS_VERS;
>
> This looks like a weird tab issue, but it might be just my mailer.

Nop, there is no tab.

Maybe writing it like that:
> cap_ver = pci_get_byte(s->dev.config + real_offset - reg->offset
>                        + PCI_EXP_FLAGS);
> cap_ver &= PCI_EXP_FLAGS_VERS;
would be better.

> > +
> > +    /* no need to initialize in case of cap_ver 1.x */
> > +    if (cap_ver == 1) {
> > +        return PT_INVALID_REG;
> > +    }
> > +
> > +    /* set Supported Link Speed */
> > +    reg_field |= PCI_EXP_LNKCAP_SLS &
> > +        pci_get_byte(s->dev.config + real_offset - reg->offset
> > +                     + PCI_EXP_LNKCAP);
> > +
> > +    return reg_field;
> > +}
> > +

[...]

> > +/*********************************
> > + * Power Management Capability
> > + */
> > +
> > +/* initialize Power Management Capabilities register */
> > +static uint32_t pt_pmc_reg_init(XenPCIPassthroughState *s,
> > +                                XenPTRegInfo *reg, uint32_t real_offset)
> > +{
> > +    PCIDevice *d = &s->dev;
> > +
> > +    if (!s->power_mgmt) {
> > +        return reg->init_val;
> > +    }
> > +
> > +    /* set Power Management Capabilities register */
> > +    s->pm_state->pmc_field = pci_get_word(d->config + real_offset);
> > +
> > +    return reg->init_val;
> > +}
> > +/* initialize PCI Power Management Control/Status register */
> > +static uint32_t pt_pmcsr_reg_init(XenPCIPassthroughState *s,
> > +                                  XenPTRegInfo *reg, uint32_t real_offset)
> > +{
> > +    PCIDevice *d = &s->dev;
> > +    uint16_t cap_ver  = 0;
> > +
> > +    if (!s->power_mgmt) {
> > +        return reg->init_val;
> > +    }
> > +
> > +    /* check PCI Power Management support version */
> > +    cap_ver = s->pm_state->pmc_field & PCI_PM_CAP_VER_MASK;
> > +
> > +    if (cap_ver > 2) {
> > +        /* set No Soft Reset */
> > +        s->pm_state->no_soft_reset =
> > +            pci_get_byte(d->config + real_offset) & PCI_PM_CTRL_NO_SOFT_RESET;
> > +    }
> > +
> > +    /* wake up real physical device */
> > +    switch (host_pci_get_word(s->real_device, real_offset)
> > +            & PCI_PM_CTRL_STATE_MASK) {
> > +    case 0:
> > +        break;
> > +    case 1:
> > +        PT_LOG("Power state transition D1 -> D0active\n");
> > +        host_pci_set_word(s->real_device, real_offset, 0);
> > +        break;
> > +    case 2:
> > +        PT_LOG("Power state transition D2 -> D0active\n");
> > +        host_pci_set_word(s->real_device, real_offset, 0);
> > +        usleep(200);
>
> Heheh..

I don't know if I can remove it safely, or not.

> > +        break;
> > +    case 3:
> > +        PT_LOG("Power state transition D3hot -> D0active\n");
> > +        host_pci_set_word(s->real_device, real_offset, 0);
> > +        usleep(10 * 1000);

Same for this one.

> > +        pt_init_pci_config(s);
> > +        break;
> > +    }
> > +
> > +    return reg->init_val;
> > +}

-- 
Anthony PERARD

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 09:54:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 09:54:07 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROvIl-0003v3-EL; Fri, 11 Nov 2011 09:54:07 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROvIK-0003im-C7
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 09:53:40 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-16.tower-174.messagelabs.com!1321034015!1220249!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30809 invoked from network); 11 Nov 2011 17:53:37 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-16.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 17:53:37 -0000
X-IronPort-AV: E=Sophos;i="4.69,496,1315195200"; d="scan'208";a="170294073"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Nov 2011 12:53:35 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX02.citrite.net
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Fri, 11 Nov 2011
	12:53:35 -0500
Message-ID: <4EBD611E.7000209@citrix.com>
Date: Fri, 11 Nov 2011 17:53:34 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-Enigmail-Version: 1.1.2
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Subject: [Xen-devel] Revert c/s 23666:b96f8bdcaa15 KEXEC: disconnect all PCI
 devices from the PCI bus on crash
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

It turns out that this causes all mannor of problems on certain
motherboards (so far with no pattern I can discern)

Problems include:
* Hanging forever checking hlt instruction.
* Panics when trying to change switch root device
* Drivers hanging when trying to check for interrupts.

This changeset needs removing from testing trees as well.

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 10:02:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 10:02:47 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROvR9-0004Qk-7D; Fri, 11 Nov 2011 10:02:47 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROvNS-0004Be-Jc
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 09:59:02 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1321034335!3201201!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17443 invoked from network); 11 Nov 2011 17:58:55 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-12.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 17:58:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,496,1315180800"; 
   d="scan'208";a="8892197"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Nov 2011 17:58:48 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 11 Nov 2011 17:58:48 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1ROvNI-00024u-7S;
	Fri, 11 Nov 2011 17:58:48 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1ROvNI-0002gh-42;
	Fri, 11 Nov 2011 17:58:48 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9748-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 11 Nov 2011 17:58:48 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9748: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9748 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9748/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-i386-win          15 guest-destroy              fail REGR. vs. 9747

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  44d925615ac6
baseline version:
 xen                  4699decb8424

------------------------------------------------------------
People who touched revisions under test:
  Ian Campbell <ian.campbell@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Lasse Collin <lasse.collin@tukaani.org>
  Phillip Lougher <phillip@lougher.demon.co.uk>
  Wei Wang <wei.wang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     pass    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24134:44d925615ac6
tag:         tip
user:        Lasse Collin <lasse.collin@tukaani.org>
date:        Fri Nov 11 14:35:51 2011 +0100
    
    Decompressors: check input size in unlzo.c
    
    From: Lasse Collin <lasse.collin@tukaani.org>
    
    The code assumes that the input is valid and not truncated.  Add checks to
    avoid reading past the end of the input buffer.  Change the type of "skip"
    from u8 to int to fix a possible integer overflow.
    
    Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Committed-by: Jan Beulich <jbeulich@suse.com>
    
    
changeset:   24133:276db7ceeb5d
user:        Lasse Collin <lasse.collin@tukaani.org>
date:        Fri Nov 11 14:35:05 2011 +0100
    
    Decompressors: check for write errors in unlzo.c
    
    From: Lasse Collin <lasse.collin@tukaani.org>
    
    The return value of flush() is not checked in unlzo().  This means that
    the decompressor won't stop even if the caller doesn't want more data.
    This can happen e.g.  with a corrupt LZO-compressed initramfs image.
    
    Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Committed-by: Jan Beulich <jbeulich@suse.com>
    
    
changeset:   24132:88347644935e
user:        Lasse Collin <lasse.collin@tukaani.org>
date:        Fri Nov 11 14:34:24 2011 +0100
    
    Decompressors: validate match distance in unlzma.c
    
    From: Lasse Collin <lasse.collin@tukaani.org>
    
    Validate the newly decoded distance (rep0) in process_bit1().  This is to
    detect corrupt LZMA data quickly.  The old code can run for long time
    producing garbage until it hits the end of the input.
    
    Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Committed-by: Jan Beulich <jbeulich@suse.com>
    
    
changeset:   24131:2ffeeb28e9be
user:        Lasse Collin <lasse.collin@tukaani.org>
date:        Fri Nov 11 14:33:30 2011 +0100
    
    Decompressors: check for write errors in unlzma.c
    
    From: Lasse Collin <lasse.collin@tukaani.org>
    
    The return value of wr->flush() is not checked in write_byte().  This
    means that the decompressor won't stop even if the caller doesn't want
    more data.  This can happen e.g.  with corrupt LZMA-compressed initramfs.
    Returning the error quickly allows the user to see the error message
    quicker.
    
    There is a similar missing check for wr.flush() near the end of unlzma().
    
    Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Committed-by: Jan Beulich <jbeulich@suse.com>
    
    
changeset:   24130:fe9a59ff8475
user:        Lasse Collin <lasse.collin@tukaani.org>
date:        Fri Nov 11 14:32:57 2011 +0100
    
    Decompressors: check for read errors in unlzma.c
    
    From: Lasse Collin <lasse.collin@tukaani.org>
    
    Return value of rc->fill() is checked in rc_read() and error() is called
    when needed, but then the code continues as if nothing had happened.
    
    rc_read() is a void function and it's on the top of performance critical
    call stacks, so propagating the error code via return values doesn't sound
    like the best fix.  It seems better to check rc->buffer_size (which holds
    the return value of rc->fill()) in the main loop.  It does nothing bad
    that the code runs a little with unknown data after a failed rc->fill().
    
    This fixes an infinite loop in initramfs decompression if the
    LZMA-compressed initramfs image is corrupt.
    
    Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Committed-by: Jan Beulich <jbeulich@suse.com>
    
    
changeset:   24129:71abe73298b3
user:        Lasse Collin <lasse.collin@tukaani.org>
date:        Fri Nov 11 14:32:03 2011 +0100
    
    Decompressors: fix header validation in unlzma.c
    
    From: Lasse Collin <lasse.collin@tukaani.org>
    
    Validation of header.pos calls error() but doesn't make the function
    return to indicate an error to the caller.  Instead the decoding is
    attempted with invalid header.pos.  This fixes it.
    
    Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Committed-by: Jan Beulich <jbeulich@suse.com>
    
    
changeset:   24128:7c5eb2265fba
user:        Lasse Collin <lasse.collin@tukaani.org>
date:        Fri Nov 11 14:31:38 2011 +0100
    
    Decompressors: remove unused function from unlzma.c
    
    From: Lasse Collin <lasse.collin@tukaani.org>
    
    Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Committed-by: Jan Beulich <jbeulich@suse.com>
    
    
changeset:   24127:57db49cf1188
user:        Phillip Lougher <phillip@lougher.demon.co.uk>
date:        Fri Nov 11 14:30:36 2011 +0100
    
    bzip2: Add missing checks for malloc returning NULL
    
    From: Phillip Lougher <phillip@lougher.demon.co.uk>
    
    Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Committed-by: Jan Beulich <jbeulich@suse.com>
    
    
changeset:   24126:b2891cecc676
user:        Lasse Collin <lasse.collin@tukaani.org>
date:        Fri Nov 11 14:29:21 2011 +0100
    
    Decompressors: get rid of set_error_fn() macro
    
    From: Lasse Collin <lasse.collin@tukaani.org>
    
    set_error_fn() is a useless complication. Only unlzma.c had some use
    for it and that was easy to change too.
    
    This also gets rid of the static function pointer "error".
    
    Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    Committed-by: Jan Beulich <jbeulich@suse.com>
    
    
changeset:   24125:b44278816b72
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Nov 11 14:27:41 2011 +0100
    
    multicall: don't ignore failure from __copy_to_guest() upon preemption
    
    At once adjust perf counter updates to also count calls from here even
    if a guest memory access failed.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24124:69f8b6f4c29c
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Nov 11 14:26:48 2011 +0100
    
    x86/amd-ucode: further turn down verbosity
    
    Turn up the log level on various (mostly debug-only) messages.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24123:8b08b2166aa8
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Nov 11 14:25:16 2011 +0100
    
    x86: quiesce cpuidle code
    
    So far these messages got pointlessly (as the code in other places
    assumes symmetric configuration) emitted once per CPU. Hide the debug
    one behind opt_cpu_info, and issue the info one just once (if the code
    gets adjusted to support assymtric configurations, this would need to
    be revisited, but ideally without producing per-CPU messages again).
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24122:4699decb8424
user:        Wei Wang <wei.wang2@amd.com>
date:        Fri Nov 11 12:06:01 2011 +0100
    
    amd iommu: Introduce iommu_has_cap() function
    
    Signed-off-by: Wei Wang <wei.wang2@amd.com>
    Committed-by: Jan Beulich <jbeulich@suse.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 10:11:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 10:11:30 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROvZZ-0004vU-TC; Fri, 11 Nov 2011 10:11:29 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROvUI-0004eG-MM
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 10:06:12 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1321034755!1220156!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2470 invoked from network); 11 Nov 2011 18:05:56 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-10.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 18:05:56 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pABI5nU7003628
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 11 Nov 2011 18:05:50 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pABI5nGj001039
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 11 Nov 2011 18:05:49 GMT
Received: from abhmt103.oracle.com (abhmt103.oracle.com [141.146.116.55])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pABI5hQo001153; Fri, 11 Nov 2011 12:05:43 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 11 Nov 2011 10:05:43 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 9072A814BB; Fri, 11 Nov 2011 13:05:42 -0500 (EST)
Date: Fri, 11 Nov 2011 13:05:42 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Subject: Re: [Xen-devel] [PATCH V3 07/10] Introduce Xen PCI Passthrough,
	qdevice (1/3)
Message-ID: <20111111180542.GA6408@phenom.dumpdata.com>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-8-git-send-email-anthony.perard@citrix.com>
	<20111110212840.GA23643@phenom.dumpdata.com>
	<alpine.DEB.2.00.1111111627430.8085@perard.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <alpine.DEB.2.00.1111111627430.8085@perard.uk.xensource.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A020203.4EBD63FE.016C,ss=1,re=0.000,fgs=0
Cc: Guy Zana <guy@neocleus.com>, Xen Devel <xen-devel@lists.xensource.com>,
	Allen Kay <allen.m.kay@intel.com>, QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> > > +                hw_error("Internal error: Invalid write emulation "
> > > +                         "return value[%d]. I/O emulator exit.\n", rc);
> >
> > Oh. I hadn't realized this, but you are using hw_error. Which is
> > calling 'abort'! Yikes. Is there no way to recover from this? Say return 0xfffff?
> 
> In qemu-xen-traditionnal, it was an exit(1). I do not know the
> consequence of a bad write, and I can not return anythings. So I suppose
> that the guest would know that somethings wrong only on the next read.
> 
> Instead of abort();, I can just do nothing and return. Or we could unplug
> the device from QEMU.
> 
> Any preference?

I think this calls for an experiment. If Linux still functions if you completly
unplug the device, then I would say unplug it (b/c in most likelyhood the reason
you can't write is b/c the host has unplugged the device).

> 
> > > +            }
> > > +
> > > +            /* calculate next address to find */
> > > +            emul_len -= reg->size;
> > > +            if (emul_len > 0) {
> > > +                find_addr = real_offset + reg->size;
> > > +            }
> > > +        } else {
> > > +            /* nothing to do with passthrough type register,
> > > +             * continue to find next byte */
> > > +            emul_len--;
> > > +            find_addr++;
> > > +        }
> > > +    }
> > > +
> > > +    /* need to shift back before passing them to libpci */
> > > +    val >>= (address & 3) << 3;
> > > +
> > > +out:
> > > +    if (!(reg && reg->no_wb)) {
> > > +        /* unknown regs are passed through */
> > > +        rc = host_pci_set_block(s->real_device, address, (uint8_t *)&val, len);
> > > +
> > > +        if (!rc) {
> > > +            PT_LOG("Error: pci_write_block failed. return value[%d].\n", rc);
> > > +        }
> > > +    }
> > > +
> > > +    if (s->pm_state != NULL && s->pm_state->flags & PT_FLAG_TRANSITING) {
> > > +        qemu_mod_timer(s->pm_state->pm_timer,
> > > +                       qemu_get_clock_ms(rt_clock) + s->pm_state->pm_delay);
> > > +    }
> > > +}
> > > +
> > > +/* ioport/iomem space*/
> > > +static void pt_iomem_map(XenPCIPassthroughState *s, int i,
> > > +                         pcibus_t e_phys, pcibus_t e_size, int type)
> > > +{
> > > +    uint32_t old_ebase = s->bases[i].e_physbase;
> > > +    bool first_map = s->bases[i].e_size == 0;
> > > +    int ret = 0;
> > > +
> > > +    s->bases[i].e_physbase = e_phys;
> > > +    s->bases[i].e_size = e_size;
> > > +
> > > +    PT_LOG("e_phys=%#"PRIx64" maddr=%#"PRIx64" type=%%d"
> > > +           " len=%#"PRIx64" index=%d first_map=%d\n",
> > > +           e_phys, s->bases[i].access.maddr, /*type,*/
> > > +           e_size, i, first_map);
> > > +
> > > +    if (e_size == 0) {
> > > +        return;
> > > +    }
> > > +
> > > +    if (!first_map && old_ebase != -1) {
> >
> > old_ebase != PCI_BAR_UNMAPPED ?
> 
> :(, no. Because old_ebase is a uint32_t and PCI_BAR_UNMAPPED is
> pcibus_t (uint64_t in Xen case).

I somehow thought it was defined as -1.. but 
> 
> I'm not sure that a good idee to change the type of old_ebase as
> xc_domain_memory_mapping bellow takes only uint32_t.
> 
> But, if I can replace a -1 by PCI_BAR_UNMAPPED, I will.

.. or something close to it. _PCI_BAR_UNMAPPED?
.. snip..

> > > +    /* Register PIO/MMIO BARs */
> > > +    for (i = 0; i < PCI_BAR_ENTRIES; i++) {
> > > +        HostPCIIORegion *r = &d->io_regions[i];
> > > +
> > > +        if (r->base_addr) {
> >
> > So should you check for PCI_BAR_UNMAPPED or is that not really
> > required here as the pci_register_bar would do it?
> 
> Actually, this value come from the real device (the value in
> sysfs/resource). So, I think it's just 0 if it's not mapped.

Ah! Right.
> 
> Here, it's probably better to check for the size instead, to know if
> there is actually a BAR.

<nods>
> 
> > > +            s->bases[i].e_physbase = r->base_addr;
> > > +            s->bases[i].access.u = r->base_addr;
> > > +
> > > +            /* Register current region */
> > > +            if (r->flags & IORESOURCE_IO) {
> > > +                memory_region_init_io(&s->bar[i], NULL, NULL,
> > > +                                      "xen-pci-pt-bar", r->size);
> >
> > You can make the "xen_pci-pt-bar" be a #define somewhere and reuse that.

.. snip ..
> > > +    if (!s->dev.config[PCI_INTERRUPT_PIN]) {
> > > +        PT_LOG("no pin interrupt\n");
> >
> > Perhaps include some details of which device failed?
> 
> There is already detailed about the device at the beginning of the
> function. Is it not enough?

I was thinking parallel operations. So it could be there are multiple
PCI requests and you might not know which device's pin is wrong.

> 
> > > +        goto out;
> > > +    }
> > > +
> > > +    machine_irq = host_pci_get_byte(s->real_device, PCI_INTERRUPT_LINE);
> > > +    rc = xc_physdev_map_pirq(xen_xc, xen_domid, machine_irq, &pirq);
> > > +
> > > +    if (rc) {
> > > +        PT_LOG("Error: Mapping irq failed, rc = %d\n", rc);
> >
> > Can you also include the IRQ it tried to map (both machine and pirq).
> 
> Yep.
> 
> > > +
> > > +        /* Disable PCI intx assertion (turn on bit10 of devctl) */
> > > +        host_pci_set_word(s->real_device,
> > > +                          PCI_COMMAND,
> > > +                          pci_get_word(s->dev.config + PCI_COMMAND)
> > > +                          | PCI_COMMAND_INTX_DISABLE);
> > > +        machine_irq = 0;
> > > +        s->machine_irq = 0;
> > > +    } else {
> > > +        machine_irq = pirq;
> > > +        s->machine_irq = pirq;
> > > +        mapped_machine_irq[machine_irq]++;
> > > +    }
> > > +
> > > +    /* bind machine_irq to device */
> > > +    if (rc < 0 && machine_irq != 0) {
> > > +        uint8_t e_device = PCI_SLOT(s->dev.devfn);
> > > +        uint8_t e_intx = pci_intx(s);
> > > +
> > > +        rc = xc_domain_bind_pt_pci_irq(xen_xc, xen_domid, machine_irq, 0,
> > > +                                       e_device, e_intx);
> > > +        if (rc < 0) {
> > > +            PT_LOG("Error: Binding of interrupt failed! rc=%d\n", rc);
> >
> > A bit details - name of the device, the IRQ,..
> >
> > > +
> > > +            /* Disable PCI intx assertion (turn on bit10 of devctl) */
> > > +            host_pci_set_word(s->real_device, PCI_COMMAND,
> > > +                              *(uint16_t *)(&s->dev.config[PCI_COMMAND])
> > > +                              | PCI_COMMAND_INTX_DISABLE);
> > > +            mapped_machine_irq[machine_irq]--;
> > > +
> > > +            if (mapped_machine_irq[machine_irq] == 0) {
> > > +                if (xc_physdev_unmap_pirq(xen_xc, xen_domid, machine_irq)) {
> > > +                    PT_LOG("Error: Unmapping of interrupt failed! rc=%d\n",
> > > +                           rc);
> >
> > And here too. It would be beneficial to have on the error paths lots of
> > nice details so that in the field it will be easier to find out what
> > went wrong (and match up PIRQ with the GSI).
> 
> Yes, I will try to improve the messages.
> 
> It's also probably good to always print the errors.

<nods> Thanks.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 10:14:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 10:14:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROvcL-0005Kc-0o; Fri, 11 Nov 2011 10:14:21 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROvZr-0004yH-Bg
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 10:11:48 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1321035102!3210978!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15685 invoked from network); 11 Nov 2011 18:11:44 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-9.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 11 Nov 2011 18:11:44 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pABIBcfh010804
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 11 Nov 2011 18:11:39 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pABIBbPE013811
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 11 Nov 2011 18:11:38 GMT
Received: from abhmt109.oracle.com (abhmt109.oracle.com [141.146.116.61])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pABIBVu2005066; Fri, 11 Nov 2011 12:11:31 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 11 Nov 2011 10:11:31 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id BDE7A814BB; Fri, 11 Nov 2011 13:11:30 -0500 (EST)
Date: Fri, 11 Nov 2011 13:11:30 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Subject: Re: [Xen-devel] [PATCH V3 08/10] Introduce Xen PCI Passthrough, PCI
	config space helpers (2/3)
Message-ID: <20111111181130.GB6408@phenom.dumpdata.com>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-9-git-send-email-anthony.perard@citrix.com>
	<20111110215353.GA23837@phenom.dumpdata.com>
	<alpine.DEB.2.00.1111111631070.8085@perard.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <alpine.DEB.2.00.1111111631070.8085@perard.uk.xensource.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090206.4EBD655B.00CE,ss=1,re=0.000,fgs=0
Cc: Guy Zana <guy@neocleus.com>, Xen Devel <xen-devel@lists.xensource.com>,
	Allen Kay <allen.m.kay@intel.com>, QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> > > +    case PCI_CAP_ID_EXP:
> > > +        /* The PCI Express Capability Structure of the VF of Intel 82599 10GbE
> > > +         * Controller looks trivial, e.g., the PCI Express Capabilities
> > > +         * Register is 0. We should not try to expose it to guest.
> >
> > Why not?
> 
> Because (an old commit):
> 
> passthrough: support the assignment of the VF of Intel 82599 10GbE Controller
> 
> The datasheet is available at
> http://download.intel.com/design/network/datashts/82599_datasheet.pdf
> 
> See 'Table 9.7. VF PCIe Configuration Space' of the datasheet, the PCI
> Express Capability Structure of the VF of Intel 82599 10GbE Controller looks
> trivial, e.g., the PCI Express Capabilities Register is 0, so the Capability
> Version is 0 and pt_pcie_size_init() would fail.
> 
> We should not try to expose the PCIe cap of the device to guest.
> 
> a patch from Dexuan Cui <dexuan.cui@intel.com>

Lets inlude that in the description here..
> 
> > > +         */
> > > +        if (d->vendor_id == PCI_VENDOR_ID_INTEL &&
> > > +                d->device_id == PCI_DEVICE_ID_INTEL_82599_VF) {
> > > +            return 1;
> > > +        }
> > > +        break;
> > > +    }
> > > +    return 0;
> > > +}
> > > +
> > > +/*   find emulate register group entry */
> > > +XenPTRegGroup *pt_find_reg_grp(XenPCIPassthroughState *s, uint32_t address)
> > > +{
> > > +    XenPTRegGroup *entry = NULL;
> > > +
> > > +    /* find register group entry */
> > > +    QLIST_FOREACH(entry, &s->reg_grp_tbl, entries) {
> > > +        /* check address */
> > > +        if ((entry->base_offset <= address)
> > > +            && ((entry->base_offset + entry->size) > address)) {
> > > +            return entry;
> > > +        }
> > > +    }
> > > +
> > > +    /* group entry not found */
> > > +    return NULL;
> > > +}
> > > +
> > > +/* find emulate register entry */
> > > +XenPTReg *pt_find_reg(XenPTRegGroup *reg_grp, uint32_t address)
> > > +{
> > > +    XenPTReg *reg_entry = NULL;
> > > +    XenPTRegInfo *reg = NULL;
> > > +    uint32_t real_offset = 0;
> > > +
> > > +    /* find register entry */
> > > +    QLIST_FOREACH(reg_entry, &reg_grp->reg_tbl_list, entries) {
> > > +        reg = reg_entry->reg;
> > > +        real_offset = reg_grp->base_offset + reg->offset;
> > > +        /* check address */
> > > +        if ((real_offset <= address)
> > > +            && ((real_offset + reg->size) > address)) {
> > > +            return reg_entry;
> > > +        }
> > > +    }
> > > +
> > > +    return NULL;
> > > +}
> > > +
> > > +/* parse BAR */
> > > +static PTBarFlag pt_bar_reg_parse(XenPCIPassthroughState *s, XenPTRegInfo *reg)
> > > +{
> > > +    PCIDevice *d = &s->dev;
> > > +    XenPTRegion *region = NULL;
> > > +    PCIIORegion *r;
> > > +    int index = 0;
> > > +
> > > +    /* check 64bit BAR */
> > > +    index = pt_bar_offset_to_index(reg->offset);
> > > +    if ((0 < index) && (index < PCI_ROM_SLOT)) {
> >
> > This is  a bit confusing. Can you make the index be on the same
> > side, like
> >
> > if ((0 < index) && (PCI_ROM_SLOT > index)
> >
> > or better:
> >
> > if ((index < 0) && (index < PCI_ROM_SLOT))
> >
> > um, which looks wrong. Should it be 'index > 0' ?
> 
> Every other form is a bit confusing to me. I'd like to write
> 0 < index < ROM_SLOT, so I know that index is between 0 and ROM_SLOT.
> But, it's C and not math, so I wrote the closest way I can.
> 
> > > +        int flags = s->real_device->io_regions[index - 1].flags;
> >
> > Do we want to check the index - 1 to make sure it is not negative?
> 
> We have:
>   0 < index < ROM_SLOT
> so (index - 1) give us:
>   0 <= index - 1 < ROM_SLOT - 1
> 
> So (index - 1) can be 0, but under 0.
> ;)

Right! Ok, then please ignore my comment.

.. snip..
> > > +    cap_ver = pci_get_byte(s->dev.config + real_offset - reg->offset
> > > +                           + PCI_EXP_FLAGS)
> > > +        & PCI_EXP_FLAGS_VERS;
> > > +    dev_type = (pci_get_byte(s->dev.config + real_offset - reg->offset
> > > +                             + PCI_EXP_FLAGS)
> > > +                & PCI_EXP_FLAGS_TYPE) >> 4;
> > > +
> > > +    /* no need to initialize in case of Root Complex Integrated Endpoint
> > > +     * with cap_ver 1.x
> >
> > Why?
> 
> Who knows? I don't. And `git log` does not give me more information.

<laughs> OK, could the earlier author provide some ideas? Or perhaps
there is something akin in the Linux code.

.. snip..
> > > +    cap_ver = pci_get_byte(s->dev.config + real_offset - reg->offset
> > > +                           + PCI_EXP_FLAGS)
> > > +        & PCI_EXP_FLAGS_VERS;
> >
> > This looks like a weird tab issue, but it might be just my mailer.
> 
> Nop, there is no tab.
> 
> Maybe writing it like that:
> > cap_ver = pci_get_byte(s->dev.config + real_offset - reg->offset
> >                        + PCI_EXP_FLAGS);
> > cap_ver &= PCI_EXP_FLAGS_VERS;
> would be better.

OK.
> 
> > > +
> > > +    /* no need to initialize in case of cap_ver 1.x */
> > > +    if (cap_ver == 1) {
> > > +        return PT_INVALID_REG;

.. snip..
> > > +    case 2:
> > > +        PT_LOG("Power state transition D2 -> D0active\n");
> > > +        host_pci_set_word(s->real_device, real_offset, 0);
> > > +        usleep(200);
> >
> > Heheh..
> 
> I don't know if I can remove it safely, or not.

Probably not. One of my machines reguarly gets confused when the SSD disk
returns VPD information way to fast and it ends up using the name of a
previous disk.. So the usleep is probably very much required (and in
all likehood defined in the PCI spec).

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 10:40:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 10:40:26 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROw1a-0006Kf-L7; Fri, 11 Nov 2011 10:40:26 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROw0g-00067u-0I
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 10:39:30 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1321036752!54683263!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26772 invoked from network); 11 Nov 2011 18:39:13 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-15.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 11 Nov 2011 18:39:13 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pABIdMRG019414
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 11 Nov 2011 18:39:23 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pABIdL10004792
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 11 Nov 2011 18:39:21 GMT
Received: from abhmt120.oracle.com (abhmt120.oracle.com [141.146.116.72])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pABIdFj4028329; Fri, 11 Nov 2011 12:39:15 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 11 Nov 2011 10:39:14 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 9F918814BC; Fri, 11 Nov 2011 13:39:13 -0500 (EST)
Date: Fri, 11 Nov 2011 13:39:13 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Niall Fleming <niall.fleming@webanywhere.co.uk>, lersek@redhat.com,
	pbonzini@redhat.com, JBeulich@suse.com
Subject: Re: [Xen-devel] Time Change Issue Xen 4.1
Message-ID: <20111111183913.GA9283@phenom.dumpdata.com>
References: <4EBD5AA0.3090906@webanywhere.co.uk>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EBD5AA0.3090906@webanywhere.co.uk>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090202.4EBD6BDC.0027,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, keir.xen@gmail.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, Nov 11, 2011 at 05:25:52PM +0000, Niall Fleming wrote:
> Hi all,
> 
> Already posted this over in xen-users and Konrad confirms it as a
> bug and suggested to repost
> it over here!

Laszlo, Paolo, Jan, you guys haven't seen domething like this? It looks
like a hypervisor issue where the wallclock time is not really dispursed
in the shared_info.

> 
> Issue is that changing the time in dom0 doesn't take effect on the
> VMs until a reboot of dom0.
> The testing example below illustrates what I mean....
> 
> Synopsis of testing:
> 
> Booted the physical machine, date tells me it's 17:15:45. Hwclock agrees.
> Booted a VM (using xl as xm seems to be labouring under the
> impression that blockdev is missing - it isn't)
> The login prompt displays the time as 17:17, which is the expected
> behaviour.
> Changed the time in dom0 - (date +%T -s 12:00:00), synced to hwclock.
> Check that date and hwclock match - they do.
> Destroy the VM and recreate.
> The login prompt displays the time as 17:22. Unexpected!
> 
> 
> Kernel: I git cloned tag v3.1 from the kernel.org linux.git, and
> applied xen-settime patches
> Also tested with jeremy-git-xen-next-2.6.32 (.41/.46) without patch,
> they wouldn't apply.
> Xen: 4.1.1/4.1.2
> Distribution: Gentoo
> 
> It still doesn't work.
> 
> I've tested that the issue also exists in Debian Squeeze (with
> linux-image-3.0.0 from testing as 2.6.32-5 is broken
> on my hardware).
> -- 
> 
> *Niall Fleming BSc. (Hons)*
> Systems Administrator
> Webanywhere Limited
> 
> Phone: 0800 862 0131 Ext: 203
> Web: http://www.webanywhere.co.uk
> 
> Aire Valley Business Centre, Lawkholme Lane, Keighley, BD21 3BB
> Registered in England with company number 4881346

> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 11:07:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 11:07:25 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROwRg-00077G-T5; Fri, 11 Nov 2011 11:07:24 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROwPF-0006sd-Nr
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 11:05:20 -0800
X-Env-Sender: ksrujandas@gmail.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1321038260!56894644!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23072 invoked from network); 11 Nov 2011 19:04:20 -0000
Received: from mail-bw0-f43.google.com (HELO mail-bw0-f43.google.com)
	(209.85.214.43)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 19:04:20 -0000
Received: by bkbzt12 with SMTP id zt12so5113037bkb.30
	for <xen-devel@lists.xensource.com>;
	Fri, 11 Nov 2011 11:04:50 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type;
	bh=uoGJaHF+XaugGSVQqp0SW6qR0awF+LzLshN0REgh0tI=;
	b=Sz5pIMy+AbFVcXR9Z/jF1RLJkqWHlJ7Xm5NidNc1nqm55LoHMgVSUjk+BbIfw2zZIz
	86zWmZwoqKa610J+8NwTDVMyJ/UszB8UFzAdPr/rIOwUQDH2e3DDrRm67KaDMXCE7CEj
	z0wR1F8tS3qFhTukj7cFlYBNr+3yZzF2wCWvU=
MIME-Version: 1.0
Received: by 10.204.152.196 with SMTP id h4mr9367578bkw.1.1321038289879; Fri,
	11 Nov 2011 11:04:49 -0800 (PST)
Received: by 10.205.116.197 with HTTP; Fri, 11 Nov 2011 11:04:49 -0800 (PST)
In-Reply-To: <20111027104323.GE59656@ocelot.phlegethon.org>
References: <CAKLFbfyTc-Q4ao44suwBC_XQi7KLaGpfS0=kH=iL2CoQzjQXbQ@mail.gmail.com>
	<20111027104323.GE59656@ocelot.phlegethon.org>
Date: Fri, 11 Nov 2011 13:04:49 -0600
Message-ID: <CAKLFbfw9Q6-WdqU6T21WuhzXTzwz_bXxxO2m-mX2Os-+NcVuvQ@mail.gmail.com>
Subject: Re: [Xen-devel] Hypercall by DomU Application
From: Srujan Kotikela <ksrujandas@gmail.com>
To: xen-devel@lists.xensource.com
Cc: Tim Deegan <tim@xen.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0913122345=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0913122345==
Content-Type: multipart/alternative; boundary=0015175cbab200c37e04b17a3275

--0015175cbab200c37e04b17a3275
Content-Type: text/plain; charset=ISO-8859-1

On Thu, Oct 27, 2011 at 5:43 AM, Tim Deegan <tim@xen.org> wrote:

> At 20:16 -0500 on 25 Oct (1319573807), Srujan Kotikela wrote:
> > Hi,
> >
> > I am working on a security architecture. In this architecture, the
> > application in DomU has to communicate directly with the hypervisor. But
> as
> > I can see, the xen architecture allows only DomU kernel to raise a
> > hypercall. I am planning to enable application to communicate with xen
> > directly. I am assuming, setting up a trap gate with Ring-3 access
> should do
> > the trick. I have few questions regarding this.
> >
> > Is my idea feasible? ==> (  _set_gate(idt_table+HYPERCALL_VECTOR, 15, 3,
> > &hypercall); )
>
> Seems like it would be easy to find out. :)
>
> > Are there any security/performance/functional implications with this
> > approach?
>
> Well, it totally undermines the security of the kernel if the
> application can get the hypervisor to alter memory (since the
> hypervisor doesn't know about the kernel's datastructures or policies)
> but if you're very restrictive about what hypercalls can be called frum
> user-mode, it should be OK.
>
> One thing to look out for is making sure that the hypercall arguments
> are actually mapped properly when the call happens (since the kernel
> controls paging).
>
> Tim.
>

Hi,

I am able to successfuly invoke a hypercall from user level just by using *int
$0x82 *from the user level.
I need this only for specific (custom) hypercalls. I was wondering how
could I filter which hypercalls to be invoked from ring-3.

Filtering at the user level is straight forward but have to trust the user
(poor design).

I was wondering if I can somehow check the DPL of the caller before the
control goes to the hypercall handler from the hypercall_vector?

~ SDK

--0015175cbab200c37e04b17a3275
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<br><br><div class=3D"gmail_quote">On Thu, Oct 27, 2011 at 5:43 AM, Tim Dee=
gan <span dir=3D"ltr">&lt;<a href=3D"mailto:tim@xen.org" target=3D"_blank">=
tim@xen.org</a>&gt;</span> wrote:<br><blockquote class=3D"gmail_quote" styl=
e=3D"margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); =
padding-left: 1ex;">

<div>At 20:16 -0500 on 25 Oct (1319573807), Srujan Kotikela wrote:<br>
&gt; Hi,<br>
&gt;<br>
&gt; I am working on a security architecture. In this architecture, the<br>
&gt; application in DomU has to communicate directly with the hypervisor. B=
ut as<br>
&gt; I can see, the xen architecture allows only DomU kernel to raise a<br>
&gt; hypercall. I am planning to enable application to communicate with xen=
<br>
&gt; directly. I am assuming, setting up a trap gate with Ring-3 access sho=
uld do<br>
&gt; the trick. I have few questions regarding this.<br>
&gt;<br>
&gt; Is my idea feasible? =3D=3D&gt; ( =A0_set_gate(idt_table+HYPERCALL_VEC=
TOR, 15, 3,<br>
&gt; &amp;hypercall); )<br>
<br>
</div>Seems like it would be easy to find out. :)<br>
<div><br>
&gt; Are there any security/performance/functional implications with this<b=
r>
&gt; approach?<br>
<br>
</div>Well, it totally undermines the security of the kernel if the<br>
application can get the hypervisor to alter memory (since the<br>
hypervisor doesn&#39;t know about the kernel&#39;s datastructures or polici=
es)<br>
but if you&#39;re very restrictive about what hypercalls can be called frum=
<br>
user-mode, it should be OK.<br>
<br>
One thing to look out for is making sure that the hypercall arguments<br>
are actually mapped properly when the call happens (since the kernel<br>
controls paging).<br>
<font color=3D"#888888"><br>
Tim.<br>
</font></blockquote></div><div><br></div>Hi,<div><br></div><div>I am able t=
o successfuly invoke a hypercall from user level just by using <b>int $0x82=
 </b>from the user level.=A0</div><div>I need this only for specific (custo=
m) hypercalls. I was wondering how could I filter which hypercalls to be in=
voked from ring-3.</div>

<div><br></div><div>Filtering at the user level is straight forward but hav=
e to trust the user (poor design).=A0</div><div><br></div><div>I was wonder=
ing if I can somehow check the DPL of the caller before the control goes to=
 the hypercall handler from the hypercall_vector?</div>

<div><div><br clear=3D"all">~ SDK<br><br></div></div>

--0015175cbab200c37e04b17a3275--


--===============0913122345==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0913122345==--


From xen-devel-bounces@lists.xensource.com Fri Nov 11 11:19:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 11:19:45 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROwdd-0007ez-72; Fri, 11 Nov 2011 11:19:45 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROwcv-0007Sc-Vt
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 11:19:02 -0800
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1321039115!44256505!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22428 invoked from network); 11 Nov 2011 19:18:35 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 19:18:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,496,1315180800"; 
   d="scan'208";a="8892884"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Nov 2011 19:18:58 +0000
Received: from dhcp-3-28.uk.xensource.com (10.80.3.28) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 11 Nov 2011 19:18:58 +0000
Date: Fri, 11 Nov 2011 19:18:42 +0000
From: Anthony PERARD <anthony.perard@citrix.com>
X-X-Sender: anthony@perard.uk.xensource.com
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] [PATCH V3 10/10] Introduce Xen PCI Passthrough, MSI
	(3/3)
In-Reply-To: <20111110221027.GB23837@phenom.dumpdata.com>
Message-ID: <alpine.DEB.2.00.1111111745300.8085@perard.uk.xensource.com>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-11-git-send-email-anthony.perard@citrix.com>
	<20111110221027.GB23837@phenom.dumpdata.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: Xen Devel <xen-devel@lists.xensource.com>, Jiang,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Yunhong <yunhong.jiang@intel.com>, Shan Haitao <haitao.shan@intel.com>,
	QEMU-devel <qemu-devel@nongnu.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 10 Nov 2011, Konrad Rzeszutek Wilk wrote:

> On Fri, Oct 28, 2011 at 04:07:36PM +0100, Anthony PERARD wrote:
> > From: Jiang Yunhong <yunhong.jiang@intel.com>
> >
> > Signed-off-by: Jiang Yunhong <yunhong.jiang@intel.com>
> > Signed-off-by: Shan Haitao <haitao.shan@intel.com>
> > Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> > ---
> >  Makefile.target                      |    1 +
> >  hw/apic-msidef.h                     |    2 +
> >  hw/xen_pci_passthrough.c             |   27 ++-
> >  hw/xen_pci_passthrough.h             |   55 +++
> >  hw/xen_pci_passthrough_config_init.c |  495 +++++++++++++++++++++++++-
> >  hw/xen_pci_passthrough_msi.c         |  667 ++++++++++++++++++++++++++++++++++
> >  6 files changed, 1240 insertions(+), 7 deletions(-)
> >  create mode 100644 hw/xen_pci_passthrough_msi.c
> >

[...]

> > +/* write Message Upper Address register */
> > +static int pt_msgaddr64_reg_write(XenPCIPassthroughState *s,
> > +                                  XenPTReg *cfg_entry, uint32_t *value,
> > +                                  uint32_t dev_value, uint32_t valid_mask)
> > +{
> > +    XenPTRegInfo *reg = cfg_entry->reg;
> > +    uint32_t writable_mask = 0;
> > +    uint32_t throughable_mask = 0;
> > +    uint32_t old_addr = cfg_entry->data;
> > +
> > +    /* check whether the type is 64 bit or not */
> > +    if (!(s->msi->flags & PCI_MSI_FLAGS_64BIT)) {
> > +        /* exit I/O emulator */
> > +        PT_LOG("Error: why comes to Upper Address without 64 bit support??\n");
>
> Um, not sure what that means.

This is probably unprobable.

I'll change the comment for "write to the Upper Address without 64 bit
support"

> > +        return -1;
> > +    }
> > +
> > +    /* modify emulate register */
> > +    writable_mask = reg->emu_mask & ~reg->ro_mask & valid_mask;
> > +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> > +    /* update the msi_info too */
> > +    s->msi->addr_hi = cfg_entry->data;
> > +
> > +    /* create value for writing to I/O device register */
> > +    throughable_mask = ~reg->emu_mask & valid_mask;
> > +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> > +
> > +    /* update MSI */
> > +    if (cfg_entry->data != old_addr) {
> > +        if (s->msi->flags & PT_MSI_FLAG_MAPPED) {
> > +            pt_msi_update(s);
> > +        }
> > +    }
> > +
> > +    return 0;
> > +}
> > +
> > +
> > +/* this function will be called twice (for 32 bit and 64 bit type) */
> > +/* write Message Data register */
> > +static int pt_msgdata_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> > +                                uint16_t *value, uint16_t dev_value,
> > +                                uint16_t valid_mask)
> > +{
> > +    XenPTRegInfo *reg = cfg_entry->reg;
> > +    uint16_t writable_mask = 0;
> > +    uint16_t throughable_mask = 0;
> > +    uint16_t old_data = cfg_entry->data;
> > +    uint32_t flags = s->msi->flags;
> > +    uint32_t offset = reg->offset;
> > +
> > +    /* check the offset whether matches the type or not */
> > +    if (!((offset == PCI_MSI_DATA_64) &&  (flags & PCI_MSI_FLAGS_64BIT)) &&
> > +        !((offset == PCI_MSI_DATA_32) && !(flags & PCI_MSI_FLAGS_64BIT))) {
> > +        /* exit I/O emulator */
> > +        PT_LOG("Error: the offset is not match with the 32/64 bit type!!\n");
>
> I think it means: "The offset does not match the 32/64 bit type"
>
> > +        return -1;
> > +    }
> > +
> > +    /* modify emulate register */
> > +    writable_mask = reg->emu_mask & ~reg->ro_mask & valid_mask;
> > +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> > +    /* update the msi_info too */
> > +    s->msi->data = cfg_entry->data;
> > +
> > +    /* create value for writing to I/O device register */
> > +    throughable_mask = ~reg->emu_mask & valid_mask;
> > +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> > +
> > +    /* update MSI */
> > +    if (cfg_entry->data != old_data) {
> > +        if (flags & PT_MSI_FLAG_MAPPED) {
> > +            pt_msi_update(s);
> > +        }
> > +    }
> > +
> > +    return 0;
> > +}

[...]

> >  /****************************
> >   * Capabilities
> > @@ -1664,6 +2080,48 @@ static uint8_t pt_pcie_size_init(XenPCIPassthroughState *s,
> >
> >      return pcie_size;
> >  }
> > +/* get MSI Capability Structure register group size */
> > +static uint8_t pt_msi_size_init(XenPCIPassthroughState *s,
> > +                                const XenPTRegGroupInfo *grp_reg,
> > +                                uint32_t base_offset)
> > +{
> > +    PCIDevice *d = &s->dev;
> > +    uint16_t msg_ctrl = 0;
> > +    uint8_t msi_size = 0xa;
> > +
> > +    msg_ctrl = pci_get_word(d->config + (base_offset + PCI_MSI_FLAGS));
> > +
> > +    /* check 64 bit address capable & Per-vector masking capable */
>
> ehh?

Precisely!

> > +    if (msg_ctrl & PCI_MSI_FLAGS_64BIT) {
> > +        msi_size += 4;
> > +    }
> > +    if (msg_ctrl & PCI_MSI_FLAGS_MASKBIT) {
> > +        msi_size += 10;
> > +    }
> > +
> > +    s->msi = g_malloc0(sizeof (XenPTMSI));
> > +    s->msi->pirq = -1;
>
> Is there a define for this -1?

Probably not.

What about PT_UNASSIGNED_MSI_PIRQ ?

> > +    PT_LOG("done\n");
> > +
> > +    return msi_size;
> > +}

[...]

> > @@ -1908,8 +2382,11 @@ static int pt_init_pci_config(XenPCIPassthroughState *s)
> >      /* reinitialize all emulate register */
> >      pt_config_reinit(s);
> >
> > +    /* setup MSI-INTx translation if support */
> > +    ret = pt_enable_msi_translate(s);
> > +
> >      /* rebind machine_irq to device */
> > -    if (s->machine_irq != 0) {
> > +    if (ret < 0 && s->machine_irq != 0) {
>
> So can machine_irq be -1? Or is it only pirq that can be -1?

I think only pirq can be -1. And the default value of machine_irq is 0.

At least, the comment on top of xen_pci_passthrough.c says the same
thing.

>
> >          uint8_t e_device = PCI_SLOT(s->dev.devfn);
> >          uint8_t e_intx = pci_intx(s);
> >
> > @@ -2043,6 +2520,14 @@ void pt_config_delete(XenPCIPassthroughState *s)
> >      struct XenPTRegGroup *reg_group, *next_grp;
> >      struct XenPTReg *reg, *next_reg;
> >
> > +    /* free MSI/MSI-X info table */
> > +    if (s->msix) {
> > +        pt_msix_delete(s);
> > +    }
> > +    if (s->msi) {
> > +        g_free(s->msi);
> > +    }
> > +
> >      /* free Power Management info table */
> >      if (s->pm_state) {
> >          if (s->pm_state->pm_timer) {

[...]

> > +/*********************************/
> > +/* MSI virtuailization functions */
>
>
> virtualization
> > +
> > +/*
> > + * setup physical msi, but didn't enable it
>
> but don't
>
> > + */
> > +int pt_msi_setup(XenPCIPassthroughState *s)
> > +{
> > +    int pirq = -1;
> > +    uint8_t gvec = 0;
> > +
> > +    if (!(s->msi->flags & PT_MSI_FLAG_UNINIT)) {
> > +        PT_LOG("Error: setup physical after initialized??\n");
>
> I am not sure what that says.

Someone eats some words :(.

I thinks the comment come from this function: pt_msgctrl_reg_write.
pt_msgctrl_reg_write do the setup on the emulation side, and call
pt_msi_setup, and unset PT_MSI_FLAG_UNINIT. (this flags is only internal
to emulator)

I supose this prevent the function to been called to many times
(probably by the guest).

So, maybe "setup physical MSI when it's already initialized" would be a
better log.

> > +        return -1;
> > +    }
> > +
> > +    gvec = s->msi->data & 0xFF;
> > +    if (!gvec) {
> > +        /* if gvec is 0, the guest is asking for a particular pirq that
> > +         * is passed as dest_id */
> > +        pirq = (s->msi->addr_hi & 0xffffff00) |
> > +               ((s->msi->addr_lo >> MSI_ADDR_DEST_ID_SHIFT) & 0xff);
> > +        if (!pirq) {
> > +            /* this probably identifies an misconfiguration of the guest,
> > +             * try the emulated path */
> > +            pirq = -1;
> > +        } else {
> > +            PT_LOG("pt_msi_setup requested pirq = %d\n", pirq);
> > +        }
> > +    }
> > +
> > +    if (xc_physdev_map_pirq_msi(xen_xc, xen_domid, AUTO_ASSIGN, &pirq,
> > +                                PCI_DEVFN(s->real_device->dev,
> > +                                          s->real_device->func),
> > +                                s->real_device->bus, 0, 0)) {
> > +        PT_LOG("Error: Mapping of MSI failed.\n");
>
> Give more details. As in what device failed. PErhaps even the return code?

Ok.

> > +        return -1;
> > +    }
> > +
> > +    if (pirq < 0) {
> > +        PT_LOG("Error: Invalid pirq number\n");
> > +        return -1;
> > +    }
> > +
> > +    s->msi->pirq = pirq;
> > +    PT_LOG("msi mapped with pirq %x\n", pirq);
> > +
> > +    return 0;
> > +}
> > +

[...]

> > +/*********************************/
> > +/* MSI-X virtulization functions */
>
>
> virtu...
>
> > +
> > +static void mask_physical_msix_entry(XenPCIPassthroughState *s,
> > +                                     int entry_nr, int mask)
> > +{
> > +    void *phys_off;
> > +
> > +    phys_off = s->msix->phys_iomem_base + 16 * entry_nr + 12;
> > +    *(uint32_t *)phys_off = mask;
> > +}
> > +
> > +static int pt_msix_update_one(XenPCIPassthroughState *s, int entry_nr)
> > +{
> > +    XenMSIXEntry *entry = &s->msix->msix_entry[entry_nr];
> > +    int pirq = entry->pirq;
> > +    int gvec = entry->io_mem[2] & 0xff;
> > +    uint64_t gaddr = *(uint64_t *)&entry->io_mem[0];
> > +    uint32_t gflags = __get_msi_gflags(entry->io_mem[2], gaddr);
> > +    int ret;
> > +
> > +    if (!entry->flags) {
> > +        return 0;
> > +    }
> > +
> > +    if (!gvec) {
> > +        /* if gvec is 0, the guest is asking for a particular pirq that
> > +         * is passed as dest_id */
> > +        pirq = ((gaddr >> 32) & 0xffffff00) |
> > +               (((gaddr & 0xffffffff) >> MSI_ADDR_DEST_ID_SHIFT) & 0xff);
> > +        if (!pirq) {
> > +            /* this probably identifies an misconfiguration of the guest,
> > +             * try the emulated path */
> > +            pirq = -1;
> > +        } else {
> > +            PT_LOG("pt_msix_update_one requested pirq = %d\n", pirq);
>
> This is the same code as in the MSI case. Could it be coalesced ?

I can try.


[...]

> > +void pt_msix_disable(XenPCIPassthroughState *s)
> > +{
> > +    PCIDevice *d = &s->dev;
> > +    uint8_t gvec = 0;
> > +    uint32_t gflags = 0;
> > +    uint64_t addr = 0;
> > +    int i = 0;
> > +    XenMSIXEntry *entry = NULL;
> > +
> > +    msix_set_enable(s, 0);
> > +
> > +    for (i = 0; i < s->msix->total_entries; i++) {
> > +        entry = &s->msix->msix_entry[i];
> > +
> > +        if (entry->pirq == -1) {
> > +            continue;
> > +        }
> > +
> > +        gvec = entry->io_mem[2] & 0xff;
> > +        addr = *(uint64_t *)&entry->io_mem[0];
> > +        gflags = __get_msi_gflags(entry->io_mem[2], addr);
> > +
> > +        PT_LOG("Unbind msix with pirq %x, gvec %x\n",
> > +                entry->pirq, gvec);
> > +
> > +        if (xc_domain_unbind_msi_irq(xen_xc, xen_domid, gvec,
> > +                                        entry->pirq, gflags)) {
> > +            PT_LOG("Error: Unbinding of MSI-X failed. [%02x:%02x.%x]\n",
> > +                   pci_bus_num(d->bus), PCI_SLOT(d->devfn),
> > +                   PCI_FUNC(d->devfn));
> > +        } else {
> > +            PT_LOG("Unmap msix with pirq %x\n", entry->pirq);
> > +
> > +            if (xc_physdev_unmap_pirq(xen_xc, xen_domid, entry->pirq)) {
> > +                PT_LOG("Error: Unmapping of MSI-X failed. [%02x:%02x.%x]\n",
> > +                       pci_bus_num(d->bus),
> > +                       PCI_SLOT(d->devfn), PCI_FUNC(d->devfn));
>
> There is a lot of those error reporting where the pci_bus_num, PCI_SLOT, etc
> are used. Perhaps this should be in a function?

Yes, that will help to have a better reporting.

> > +            }
> > +        }
> > +        /* clear msi-x info */
> > +        entry->pirq = -1;
> > +        entry->flags = 0;
> > +    }
> > +}
> > +
> > +int pt_msix_update_remap(XenPCIPassthroughState *s, int bar_index)
> > +{
> > +    XenMSIXEntry *entry;
> > +    int i, ret;
> > +
> > +    if (!(s->msix && s->msix->bar_index == bar_index)) {
> > +        return 0;
> > +    }
> > +
> > +    for (i = 0; i < s->msix->total_entries; i++) {
> > +        entry = &s->msix->msix_entry[i];
> > +        if (entry->pirq != -1) {
> > +            ret = xc_domain_unbind_pt_irq(xen_xc, xen_domid, entry->pirq,
> > +                                          PT_IRQ_TYPE_MSI, 0, 0, 0, 0);
> > +            if (ret) {
> > +                PT_LOG("Error: unbind MSI-X entry %d failed\n", entry->pirq);
> > +            }
> > +            entry->flags = 1;
> > +        }
> > +    }
> > +    pt_msix_update(s);
> > +
> > +    return 0;
> > +}
> > +
> > +static void pci_msix_invalid_write(void *opaque, target_phys_addr_t addr,
> > +                                   uint32_t val)
> > +{
> > +    PT_LOG("Error: Invalid write to MSI-X table,"
> > +           " only dword access is allowed.\n");
> > +}
> > +
> > +static void pci_msix_writel(void *opaque, target_phys_addr_t addr,
> > +                            uint32_t val)
> > +{
> > +    XenPCIPassthroughState *s = (XenPCIPassthroughState *)opaque;
> > +    XenPTMSIX *msix = s->msix;
> > +    XenMSIXEntry *entry;
> > +    int entry_nr, offset;
> > +    void *phys_off;
> > +    uint32_t vec_ctrl;
> > +
> > +    if (addr % 4) {
> > +        PT_LOG("Error: Unaligned dword access to MSI-X table, "
> > +                "addr %016"PRIx64"\n", addr);
> > +        return;
> > +    }
> > +
> > +    PT_LOG("addr: "TARGET_FMT_plx", val: %#x\n", addr, val);
>
> Huh?

I will remove this one.

> > +
> > +    entry_nr = addr / 16;
> > +    entry = &msix->msix_entry[entry_nr];
> > +    offset = (addr % 16) / 4;
> > +
> > +    /*
> > +     * If Xen intercepts the mask bit access, io_mem[3] may not be
> > +     * up-to-date. Read from hardware directly.
> > +     */
> > +    phys_off = s->msix->phys_iomem_base + 16 * entry_nr + 12;
> > +    vec_ctrl = *(uint32_t *)phys_off;
> > +
> > +    if (offset != 3 && msix->enabled && !(vec_ctrl & 0x1)) {
> > +        PT_LOG("Error: Can't update msix entry %d since MSI-X is already "
> > +                "function.\n", entry_nr);
>
> already function? already on? active?

Probably.

But I don't know what it is check here.

> > +        return;
> > +    }
> > +
> > +    if (offset != 3 && entry->io_mem[offset] != val) {
> > +        entry->flags = 1;
> > +    }
> > +    entry->io_mem[offset] = val;
> > +
> > +    if (offset == 3) {
> > +        if (msix->enabled && !(val & 0x1)) {
> > +            pt_msix_update_one(s, entry_nr);
> > +        }
> > +        mask_physical_msix_entry(s, entry_nr, entry->io_mem[3] & 0x1);
> > +    }
> > +}

Thanks,

-- 
Anthony PERARD

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 11:28:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 11:28:11 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROwln-0008Cx-Nu; Fri, 11 Nov 2011 11:28:11 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROwl2-00080G-O3
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 11:27:25 -0800
X-Env-Sender: oor@cs.cmu.edu
X-Msg-Ref: server-2.tower-27.messagelabs.com!1321039603!62860353!1
X-Originating-IP: [128.2.217.197]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15730 invoked from network); 11 Nov 2011 19:26:44 -0000
Received: from smtp02.srv.cs.cmu.edu (HELO smtp02.srv.cs.cmu.edu)
	(128.2.217.197)
	by server-2.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 11 Nov 2011 19:26:44 -0000
Received: from webmail.cs.cmu.edu (TOMENTOSA.SRV.CS.CMU.EDU [128.2.172.30])
	by smtp02.srv.cs.cmu.edu (8.13.6/8.13.6) with ESMTP id pABJRIfB015130
	for <xen-devel@lists.xensource.com>;
	Fri, 11 Nov 2011 14:27:19 -0500 (EST)
Received: from 71.199.121.110
	(SquirrelMail authenticated user oor/mail@CS.CMU.EDU)
	by webmail.cs.cmu.edu with HTTP;
	Fri, 11 Nov 2011 14:27:19 -0500 (EST)
Message-ID: <61494.71.199.121.110.1321039639.squirrel@webmail.cs.cmu.edu>
Date: Fri, 11 Nov 2011 14:27:19 -0500 (EST)
Subject: Re: [Xen-devel] Trapping I/O accesses of a driver domain
From: "Olatunji Ruwase" <oor@cs.cmu.edu>
To: xen-devel@lists.xensource.com
User-Agent: SquirrelMail/1.5.1
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: 8bit
References: <50891.128.2.134.97.1320965847.squirrel@webmail.cs.cmu.edu> 
	<20111110232727.GA2412@phenom.dumpdata.com>         
	<60193.71.199.121.110.1320981956.squirrel@webmail.cs.cmu.edu> 
	<20111111152619.GB4712@phenom.dumpdata.com>
In-Reply-To: <20111111152619.GB4712@phenom.dumpdata.com>
X-Scanned-By: mimedefang-cmuscs on 128.2.217.197
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>> I am happy to modify the 2.16.8-xen to cover the outstanding cases,
>> except this is a fundamentally flawed approach. Can you elaborate the
>
> Huh? What is the flawed approach?
>
Pardon the typo, that was meant to ask if the following idea was flawed.
Enable trapping on accesses to ioremap'd pages by (1) mark their PTEs with
_PAGE_IO before they are passed to HYPERVISOR_mmu_update(), (2) in xen
(do_mmu_update()) mark pages for which _PAGE_IO is set not present.
It seemed to me that 2.6.18-xen always does (1), but you clarified that it
was not the case.

So I wanted to know in which scenarios could an ioremap'd PTE be passed to
xen without having _PAGE_IO set. And conversely, in which scenarios could
a non-ioremap'd page PTE be passed to xen with _PAGE_IO set. However,
given your comment about xen being unware of _PAGE_IO, the converse case
probably does not matter. With knowledge of these scenerios, then perhaps
I could modify both 2.6.18-xen and xen and use _PAGE_IO markings to
achieve my goal of causing traps on ioremap'd page accesses.

> So it sounds like you are concentrating on making this work in the dom0,
> domU, not in the hypervisor. In which case you can ignore the E820.
>
I would prefer modifying only the hypervisor if possible, so your
suggestion of checking against the PCI gap space in E820 sounds relevant.
In fact it seems that the machine address(mfn) argument passed to
ioremap*() should fall into the PCI gap space. I will investigate this
assumption.




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 12:09:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 12:09:59 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROxQE-0001I4-6e; Fri, 11 Nov 2011 12:09:58 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROxKb-0000mi-Vd
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 12:04:21 -0800
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-13.tower-216.messagelabs.com!1321041844!3215324!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14159 invoked from network); 11 Nov 2011 20:04:06 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-13.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 20:04:06 -0000
Received: from saboo.goop.org (c-50-131-57-2.hsd1.ca.comcast.net [50.131.57.2])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id B3DD58F8D;
	Fri, 11 Nov 2011 12:04:03 -0800 (PST)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 7A80D202E9;
	Fri, 11 Nov 2011 12:03:57 -0800 (PST)
Message-ID: <4EBD7FAD.6050304@goop.org>
Date: Fri, 11 Nov 2011 12:03:57 -0800
From: Jeremy Fitzhardinge <jeremy@goop.org>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: "H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>
References: <4EB9D48F.5010201@goop.org>
In-Reply-To: <4EB9D48F.5010201@goop.org>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [GIT PULL] More cleanups for atomic memory
	operations/spinlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ping?

On 11/08/2011 05:17 PM, Jeremy Fitzhardinge wrote:
> I forgot to push these for the just-closed merge window, but they're
> fine for the next one.  Could you find them a home in tip.git?
>
> Thanks,
>     J
>
> The following changes since commit 1ea6b8f48918282bdca0b32a34095504ee65bab5:
>
>   Linux 3.2-rc1 (2011-11-07 16:16:02 -0800)
>
> are available in the git repository at:
>   git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen.git upstream/ticketlock-cleanup
>
> Jeremy Fitzhardinge (2):
>       x86/cmpxchg: add a locked add() helper
>       x86: consolidate xchg and xadd macros
>
>  arch/x86/include/asm/cmpxchg.h  |  140 +++++++++++++++++++-------------------
>  arch/x86/include/asm/spinlock.h |   15 +----
>  2 files changed, 71 insertions(+), 84 deletions(-)
>
> diff --git a/arch/x86/include/asm/cmpxchg.h b/arch/x86/include/asm/cmpxchg.h
> index 5d3acdf..5488e10 100644
> --- a/arch/x86/include/asm/cmpxchg.h
> +++ b/arch/x86/include/asm/cmpxchg.h
> @@ -14,6 +14,8 @@ extern void __cmpxchg_wrong_size(void)
>  	__compiletime_error("Bad argument size for cmpxchg");
>  extern void __xadd_wrong_size(void)
>  	__compiletime_error("Bad argument size for xadd");
> +extern void __add_wrong_size(void)
> +	__compiletime_error("Bad argument size for add");
>  
>  /*
>   * Constants for operation sizes. On 32-bit, the 64-bit size it set to
> @@ -31,60 +33,47 @@ extern void __xadd_wrong_size(void)
>  #define	__X86_CASE_Q	-1		/* sizeof will never return -1 */
>  #endif
>  
> +/* 
> + * An exchange-type operation, which takes a value and a pointer, and
> + * returns a the old value.
> + */
> +#define __xchg_op(ptr, arg, op, lock)					\
> +	({								\
> +	        __typeof__ (*(ptr)) __ret = (arg);			\
> +		switch (sizeof(*(ptr))) {				\
> +		case __X86_CASE_B:					\
> +			asm volatile (lock #op "b %b0, %1\n"		\
> +				      : "+r" (__ret), "+m" (*(ptr))	\
> +				      : : "memory", "cc");		\
> +			break;						\
> +		case __X86_CASE_W:					\
> +			asm volatile (lock #op "w %w0, %1\n"		\
> +				      : "+r" (__ret), "+m" (*(ptr))	\
> +				      : : "memory", "cc");		\
> +			break;						\
> +		case __X86_CASE_L:					\
> +			asm volatile (lock #op "l %0, %1\n"		\
> +				      : "+r" (__ret), "+m" (*(ptr))	\
> +				      : : "memory", "cc");		\
> +			break;						\
> +		case __X86_CASE_Q:					\
> +			asm volatile (lock #op "q %q0, %1\n"		\
> +				      : "+r" (__ret), "+m" (*(ptr))	\
> +				      : : "memory", "cc");		\
> +			break;						\
> +		default:						\
> +			__ ## op ## _wrong_size();			\
> +		}							\
> +		__ret;							\
> +	})
> +
>  /*
>   * Note: no "lock" prefix even on SMP: xchg always implies lock anyway.
>   * Since this is generally used to protect other memory information, we
>   * use "asm volatile" and "memory" clobbers to prevent gcc from moving
>   * information around.
>   */
> -#define __xchg(x, ptr, size)						\
> -({									\
> -	__typeof(*(ptr)) __x = (x);					\
> -	switch (size) {							\
> -	case __X86_CASE_B:						\
> -	{								\
> -		volatile u8 *__ptr = (volatile u8 *)(ptr);		\
> -		asm volatile("xchgb %0,%1"				\
> -			     : "=q" (__x), "+m" (*__ptr)		\
> -			     : "0" (__x)				\
> -			     : "memory");				\
> -		break;							\
> -	}								\
> -	case __X86_CASE_W:						\
> -	{								\
> -		volatile u16 *__ptr = (volatile u16 *)(ptr);		\
> -		asm volatile("xchgw %0,%1"				\
> -			     : "=r" (__x), "+m" (*__ptr)		\
> -			     : "0" (__x)				\
> -			     : "memory");				\
> -		break;							\
> -	}								\
> -	case __X86_CASE_L:						\
> -	{								\
> -		volatile u32 *__ptr = (volatile u32 *)(ptr);		\
> -		asm volatile("xchgl %0,%1"				\
> -			     : "=r" (__x), "+m" (*__ptr)		\
> -			     : "0" (__x)				\
> -			     : "memory");				\
> -		break;							\
> -	}								\
> -	case __X86_CASE_Q:						\
> -	{								\
> -		volatile u64 *__ptr = (volatile u64 *)(ptr);		\
> -		asm volatile("xchgq %0,%1"				\
> -			     : "=r" (__x), "+m" (*__ptr)		\
> -			     : "0" (__x)				\
> -			     : "memory");				\
> -		break;							\
> -	}								\
> -	default:							\
> -		__xchg_wrong_size();					\
> -	}								\
> -	__x;								\
> -})
> -
> -#define xchg(ptr, v)							\
> -	__xchg((v), (ptr), sizeof(*ptr))
> +#define xchg(ptr, v)	__xchg_op((ptr), (v), xchg, "")
>  
>  /*
>   * Atomic compare and exchange.  Compare OLD with MEM, if identical,
> @@ -165,46 +154,57 @@ extern void __xadd_wrong_size(void)
>  	__cmpxchg_local((ptr), (old), (new), sizeof(*ptr))
>  #endif
>  
> -#define __xadd(ptr, inc, lock)						\
> +/*
> + * xadd() adds "inc" to "*ptr" and atomically returns the previous
> + * value of "*ptr".
> + *
> + * xadd() is locked when multiple CPUs are online
> + * xadd_sync() is always locked
> + * xadd_local() is never locked
> + */
> +#define __xadd(ptr, inc, lock)	__xchg_op((ptr), (inc), xadd, lock)
> +#define xadd(ptr, inc)		__xadd((ptr), (inc), LOCK_PREFIX)
> +#define xadd_sync(ptr, inc)	__xadd((ptr), (inc), "lock; ")
> +#define xadd_local(ptr, inc)	__xadd((ptr), (inc), "")
> +
> +#define __add(ptr, inc, lock)						\
>  	({								\
>  	        __typeof__ (*(ptr)) __ret = (inc);			\
>  		switch (sizeof(*(ptr))) {				\
>  		case __X86_CASE_B:					\
> -			asm volatile (lock "xaddb %b0, %1\n"		\
> -				      : "+r" (__ret), "+m" (*(ptr))	\
> -				      : : "memory", "cc");		\
> +			asm volatile (lock "addb %b1, %0\n"		\
> +				      : "+m" (*(ptr)) : "ri" (inc)	\
> +				      : "memory", "cc");		\
>  			break;						\
>  		case __X86_CASE_W:					\
> -			asm volatile (lock "xaddw %w0, %1\n"		\
> -				      : "+r" (__ret), "+m" (*(ptr))	\
> -				      : : "memory", "cc");		\
> +			asm volatile (lock "addw %w1, %0\n"		\
> +				      : "+m" (*(ptr)) : "ri" (inc)	\
> +				      : "memory", "cc");		\
>  			break;						\
>  		case __X86_CASE_L:					\
> -			asm volatile (lock "xaddl %0, %1\n"		\
> -				      : "+r" (__ret), "+m" (*(ptr))	\
> -				      : : "memory", "cc");		\
> +			asm volatile (lock "addl %1, %0\n"		\
> +				      : "+m" (*(ptr)) : "ri" (inc)	\
> +				      : "memory", "cc");		\
>  			break;						\
>  		case __X86_CASE_Q:					\
> -			asm volatile (lock "xaddq %q0, %1\n"		\
> -				      : "+r" (__ret), "+m" (*(ptr))	\
> -				      : : "memory", "cc");		\
> +			asm volatile (lock "addq %1, %0\n"		\
> +				      : "+m" (*(ptr)) : "ri" (inc)	\
> +				      : "memory", "cc");		\
>  			break;						\
>  		default:						\
> -			__xadd_wrong_size();				\
> +			__add_wrong_size();				\
>  		}							\
>  		__ret;							\
>  	})
>  
>  /*
> - * xadd() adds "inc" to "*ptr" and atomically returns the previous
> - * value of "*ptr".
> + * add_*() adds "inc" to "*ptr"
>   *
> - * xadd() is locked when multiple CPUs are online
> - * xadd_sync() is always locked
> - * xadd_local() is never locked
> + * __add() takes a lock prefix
> + * add_smp() is locked when multiple CPUs are online
> + * add_sync() is always locked
>   */
> -#define xadd(ptr, inc)		__xadd((ptr), (inc), LOCK_PREFIX)
> -#define xadd_sync(ptr, inc)	__xadd((ptr), (inc), "lock; ")
> -#define xadd_local(ptr, inc)	__xadd((ptr), (inc), "")
> +#define add_smp(ptr, inc)	__add((ptr), (inc), LOCK_PREFIX)
> +#define add_sync(ptr, inc)	__add((ptr), (inc), "lock; ")
>  
>  #endif	/* ASM_X86_CMPXCHG_H */
> diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h
> index 972c260..a82c2bf 100644
> --- a/arch/x86/include/asm/spinlock.h
> +++ b/arch/x86/include/asm/spinlock.h
> @@ -79,23 +79,10 @@ static __always_inline int __ticket_spin_trylock(arch_spinlock_t *lock)
>  	return cmpxchg(&lock->head_tail, old.head_tail, new.head_tail) == old.head_tail;
>  }
>  
> -#if (NR_CPUS < 256)
>  static __always_inline void __ticket_spin_unlock(arch_spinlock_t *lock)
>  {
> -	asm volatile(UNLOCK_LOCK_PREFIX "incb %0"
> -		     : "+m" (lock->head_tail)
> -		     :
> -		     : "memory", "cc");
> +	__add(&lock->tickets.head, 1, UNLOCK_LOCK_PREFIX);
>  }
> -#else
> -static __always_inline void __ticket_spin_unlock(arch_spinlock_t *lock)
> -{
> -	asm volatile(UNLOCK_LOCK_PREFIX "incw %0"
> -		     : "+m" (lock->head_tail)
> -		     :
> -		     : "memory", "cc");
> -}
> -#endif
>  
>  static inline int __ticket_spin_is_locked(arch_spinlock_t *lock)
>  {
>
>


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 12:34:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 12:34:55 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROxoN-0002kE-Ez; Fri, 11 Nov 2011 12:34:55 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROxnM-0002XO-JG
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 12:33:52 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1321043627!1217268!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22065 invoked from network); 11 Nov 2011 20:33:49 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-13.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Nov 2011 20:33:49 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pABKXeAk013720
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 11 Nov 2011 20:33:41 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pABKXc2b011256
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 11 Nov 2011 20:33:39 GMT
Received: from abhmt115.oracle.com (abhmt115.oracle.com [141.146.116.67])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pABKXVpl002777; Fri, 11 Nov 2011 14:33:31 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 11 Nov 2011 12:33:31 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 6AA66814C2; Fri, 11 Nov 2011 15:33:30 -0500 (EST)
Date: Fri, 11 Nov 2011 15:33:30 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Message-ID: <20111111203330.GA9618@phenom.dumpdata.com>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319752729-13990-1-git-send-email-dgdegra@tycho.nsa.gov>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319752729-13990-1-git-send-email-dgdegra@tycho.nsa.gov>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090209.4EBD86A6.003A,ss=1,re=0.000,fgs=0
Cc: keir@xen.org, jeremy@goop.org, xen-devel@lists.xensource.com,
	Ian.Jackson@eu.citrix.com, Ian.Campbell@citrix.com
Subject: [Xen-devel] Re: [PATCH v4 0/3] Add reference counting to grant
	notify ioctls
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Oct 27, 2011 at 05:58:46PM -0400, Daniel De Graaf wrote:
> > The current notify ioctls assume that an event channel will not be
> > closed prior to the page being unmapped. If the mappings are associated
> > with an open file descriptor and the application crashes, the
> > notification behavior depends on the close ordering of the file
> > descriptors. To avoid this, event channels now have a reference count
> > that is used by the grant notify ioctls to postpone the close operation
> > until the notification is fired.

OK, it all looks sensible to me. Sticking on my 3.3 queue.
Thx!
> 
> Changes since v3:
> 	Avoid race between evtchn_get and evtchn_put
> 	(reference count changed to an integer protected by mutex)
> 
> Changes since v2:
> 	Avoid possible sleep under spinlock
> 	Decrease refcount mismatch errors from BUG to WARN
> 	Use reference count to identify userspace-visible event channels
>  
> Changes since v1:
>  	Rename evtchn_get/put to match kernel naming conventions
> 	Use atomic_t for refcount
> 
> [PATCH 1/3] xen/event: Add reference counting to event channels
> [PATCH 2/3] xen/gntalloc: Change gref_lock to a mutex
> [PATCH 3/3] xen/gnt{dev,alloc}: reserve event channels for notify

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 12:38:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 12:38:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROxri-0003CO-Rq; Fri, 11 Nov 2011 12:38:22 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROxr6-0002zp-8L
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 12:37:44 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1321043860!1225883!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29309 invoked from network); 11 Nov 2011 20:37:41 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 20:37:41 -0000
X-IronPort-AV: E=Sophos;i="4.69,496,1315180800"; 
   d="scan'208";a="8893486"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Nov 2011 20:37:40 +0000
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Fri, 11 Nov 2011 20:37:40 +0000
Subject: Re: [Xen-devel] [PATCH V3 08/10] Introduce Xen PCI Passthrough,
	PCI config space helpers (2/3)
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Anthony PERARD <anthony.perard@citrix.com>
In-Reply-To: <alpine.DEB.2.00.1111111631070.8085@perard.uk.xensource.com>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-9-git-send-email-anthony.perard@citrix.com>
	<20111110215353.GA23837@phenom.dumpdata.com>
	<alpine.DEB.2.00.1111111631070.8085@perard.uk.xensource.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Fri, 11 Nov 2011 20:37:39 +0000
Message-ID: <1321043859.16747.131.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: Xen Devel <xen-devel@lists.xensource.com>, Stefano
	Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Allen Kay <allen.m.kay@intel.com>,
	QEMU-devel <qemu-devel@nongnu.org>, Guy Zana <guy@neocleus.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, 2011-11-11 at 17:40 +0000, Anthony PERARD wrote:
> 
> > if ((index < 0) && (index < PCI_ROM_SLOT))
> >
> > um, which looks wrong. Should it be 'index > 0' ?
> 
> Every other form is a bit confusing to me. I'd like to write
> 0 < index < ROM_SLOT, so I know that index is between 0 and ROM_SLOT.
> But, it's C and not math, so I wrote the closest way I can.

"0 < index < ROM_SLOT" ==> "0 < index && index < ROM_SLOT"
but you have "index < 0 && ..." which is backwards.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 13:09:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 13:09:16 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROyLb-00043t-5O; Fri, 11 Nov 2011 13:09:15 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROyH5-0003nm-6x
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 13:04:39 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1321045431!62865139!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27257 invoked from network); 11 Nov 2011 21:03:52 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Nov 2011 21:03:52 -0000
X-IronPort-AV: E=Sophos;i="4.69,496,1315180800"; 
   d="scan'208";a="8893612"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Nov 2011 21:04:28 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Fri, 11 Nov 2011 21:04:27 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1ROyGx-00036D-Ms;
	Fri, 11 Nov 2011 21:04:27 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1ROyGx-0004wn-FP;
	Fri, 11 Nov 2011 21:04:27 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9749-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 11 Nov 2011 21:04:27 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9749: tolerable FAIL - PUSHED
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9749 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9749/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  9af6829a9273
baseline version:
 xen                  4699decb8424

------------------------------------------------------------
People who touched revisions under test:
  Ian Campbell <ian.campbell@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Lasse Collin <lasse.collin@tukaani.org>
  Phillip Lougher <phillip@lougher.demon.co.uk>
  Wei Wang <wei.wang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     pass    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Pushing revision :

+ branch=xen-unstable
+ revision=9af6829a9273
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x '!=' x/export/home/osstest/repos/lock ']'
++ OSSTEST_REPOS_LOCK_LOCKED=/export/home/osstest/repos/lock
++ exec with-lock-ex -w /export/home/osstest/repos/lock ./ap-push xen-unstable 9af6829a9273
+ branch=xen-unstable
+ revision=9af6829a9273
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x/export/home/osstest/repos/lock '!=' x/export/home/osstest/repos/lock ']'
+ : xen@xenbits.xensource.com
+ : xen@xenbits.xensource.com:git/linux-pvops
+ : master
+ : tested/2.6.39.x
+ case "$branch" in
+ cd /export/home/osstest/repos/xen-unstable.hg
+ hg push -r 9af6829a9273 ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
pushing to ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 13 changesets with 17 changes to 9 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 13:19:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 13:19:02 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROyV3-0005Ed-Rp; Fri, 11 Nov 2011 13:19:01 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1ROyUA-00052S-RM
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 13:18:10 -0800
X-Env-Sender: andrewpitman@comcast.net
X-Msg-Ref: server-14.tower-21.messagelabs.com!1321046283!3865646!1
X-Originating-IP: [76.96.62.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3397 invoked from network); 11 Nov 2011 21:18:03 -0000
Received: from qmta04.westchester.pa.mail.comcast.net (HELO
	qmta04.westchester.pa.mail.comcast.net) (76.96.62.40)
	by server-14.tower-21.messagelabs.com with SMTP;
	11 Nov 2011 21:18:03 -0000
Received: from omta06.westchester.pa.mail.comcast.net ([76.96.62.51])
	by qmta04.westchester.pa.mail.comcast.net with comcast
	id vxDd1h00616LCl054xJ3UW; Fri, 11 Nov 2011 21:18:03 +0000
Received: from sz0032.wc.mail.comcast.net ([76.96.58.82])
	by omta06.westchester.pa.mail.comcast.net with comcast
	id vxJ31h01P1mSqQC3SxJ35u; Fri, 11 Nov 2011 21:18:03 +0000
Date: Fri, 11 Nov 2011 21:18:03 +0000 (UTC)
From: andrewpitman@comcast.net
To: Juergen Gross <juergen.gross@ts.fujitsu.com>
Message-ID: <553832861.1721802.1321046283027.JavaMail.root@sz0032a.westchester.pa.mail.comcast.net>
In-Reply-To: <4EBA4E1D.6040306@ts.fujitsu.com>
Subject: Re: [Xen-devel] Re: [Xen-users] Xen 4.1.1 crash when manipulating
	cpupools.
MIME-Version: 1.0
X-Originating-IP: [216.178.70.114]
X-Mailer: Zimbra 6.0.13_GA_2934 (ZimbraWebClient - FF3.0 (Win)/6.0.13_GA_2934)
Cc: George Dunlap <george.dunlap@eu.citrix.com>, xen-devel@lists.xensource.com,
	xen-users@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1066116027=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1066116027==
Content-Type: multipart/alternative; 
	boundary="----=_Part_1721801_193109552.1321046283026"

------=_Part_1721801_193109552.1321046283026
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 7bit

Juergen, 

It doesn't look like this has been fixed. I managed to get my 4.1.2 server to crash when setting the weight of Domain-0 (running in Pool-0 using credit2) and again when moving some cpus into a new cpupool which was set up to use the credit2 scheduler. 

Andy 

----- Original Message -----
From: "Juergen Gross" <juergen.gross@ts.fujitsu.com> 
To: andrewpitman@comcast.net 
Cc: "George Dunlap" <george.dunlap@eu.citrix.com>, xen-devel@lists.xensource.com, xen-users@lists.xensource.com 
Sent: Wednesday, November 9, 2011 4:55:41 AM 
Subject: Re: [Xen-devel] Re: [Xen-users] Xen 4.1.1 crash when manipulating cpupools. 

Andy, 

the last problem with credit2 and cpupools I'm aware of was fixed with 
cs 23156 in xen 4.1, which is included in 4.1.2. I think this addressed 
your original problem. 


Juergen 

------=_Part_1721801_193109552.1321046283026
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 7bit

<html><head><style type='text/css'>p { margin: 0; }</style></head><body><div style='font-family: Arial; font-size: 12pt; color: #000000'>Juergen,<br><br>It doesn't look like this has been fixed.&nbsp; I managed to get my 4.1.2 server to crash when setting the weight of Domain-0 (running in Pool-0 using credit2) and again when moving some cpus into a new cpupool which was set up to use the credit2 scheduler.<br><br>Andy<br><br><hr id="zwchr"><b>From: </b>"Juergen Gross" &lt;juergen.gross@ts.fujitsu.com&gt;<br><b>To: </b>andrewpitman@comcast.net<br><b>Cc: </b>"George Dunlap" &lt;george.dunlap@eu.citrix.com&gt;, xen-devel@lists.xensource.com, xen-users@lists.xensource.com<br><b>Sent: </b>Wednesday, November 9, 2011 4:55:41 AM<br><b>Subject: </b>Re: [Xen-devel] Re: [Xen-users] Xen 4.1.1 crash when manipulating cpupools.<br><br>

  
    
    <title></title>
  
  
    Andy,<br>
    <br>
    the last problem with credit2 and cpupools I'm aware of was fixed
    with<br>
    cs 23156 in xen 4.1, which is included in 4.1.2. I think this
    addressed<br>
    your original problem.<br>
    <br>
    <br>
    Juergen<br>
    

  

</div></body></html>
------=_Part_1721801_193109552.1321046283026--


--===============1066116027==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1066116027==--


From xen-devel-bounces@lists.xensource.com Fri Nov 11 13:59:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 13:59:48 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1ROz8V-00075s-Np; Fri, 11 Nov 2011 13:59:47 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROz6l-0006sJ-Ii
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 13:58:00 -0800
X-Env-Sender: dkiper@net-space.pl
X-Msg-Ref: server-8.tower-216.messagelabs.com!1321048674!3215281!1
X-Originating-IP: [89.174.63.77]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14726 invoked from network); 11 Nov 2011 21:57:56 -0000
Received: from router-fw.net-space.pl (HELO router-fw.net-space.pl)
	(89.174.63.77)
	by server-8.tower-216.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 11 Nov 2011 21:57:56 -0000
Received: (from localhost user: 'dkiper' uid#4000 fake: STDIN
	(dkiper@router-fw.net-space.pl)) by router-fw-old.local.net-space.pl
	id S1602184Ab1KKV5y (ORCPT <rfc822;xen-devel@lists.xensource.com>);
	Fri, 11 Nov 2011 22:57:54 +0100
Date: Fri, 11 Nov 2011 22:57:54 +0100
From: Daniel Kiper <dkiper@net-space.pl>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <20111111215754.GA2431@router-fw-old.local.net-space.pl>
References: <20111110085821.GA15751@router-fw-old.local.net-space.pl>
	<4EBBB53D020000780006019D@nat28.tlf.novell.com>
	<20111110225300.GB20293@router-fw-old.local.net-space.pl>
	<4EBCE88102000078000605A9@nat28.tlf.novell.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EBCE88102000078000605A9@nat28.tlf.novell.com>
User-Agent: Mutt/1.3.28i
Cc: xen-devel@lists.xensource.com, Daniel Kiper <dkiper@net-space.pl>,
	konrad.wilk@oracle.com
Subject: [Xen-devel] Re: An issue in xen_limit_pages_to_max_mfn() in
	Xenlinux Ver. 2.6.18
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, Nov 11, 2011 at 08:18:57AM +0000, Jan Beulich wrote:
> >>> On 10.11.11 at 23:53, Daniel Kiper <dkiper@net-space.pl> wrote:
> > On Thu, Nov 10, 2011 at 10:27:57AM +0000, Jan Beulich wrote:
> >> >>> On 10.11.11 at 09:58, Daniel Kiper <dkiper@net-space.pl> wrote:
> >> > Hi Jan,
> >> >
> >> > During work on kexec/kdump for Xen domU I found that
> >> > xen_limit_pages_to_max_mfn() registers undo_limit_pages()
> >> > destructor which breaks __free_pages(). When __free_pages()
> >> > is called then at beginning of this function put_page_testzero()
> >> > is called which decrements page count for given page. Later
> >> > undo_limit_pages() destructor is called which once again
> >> > calls __free_pages() and in consequence put_page_testzero()
> >> > fails (BUG_ON() is called) because page count is 0.
> >>
> >> Seems like (on newer kernels, where this is a VM_BUG_ON()) this was
> >> never hit on a configuration with CONFIG_DEBUG_VM, and on the older
> >> kernels the function was never used for memory that would get freed
> >> later (only kexec uses it there).
> >>
> >> > It could
> >> > be easily fixed, however, after reviewing xen_limit_pages_to_max_mfn()
> >> > I could not find any good reason for which undo_limit_pages()
> >> > destructor is registered. Maybe it could be removed at all because
> >> > all pages are freed when __free_pages() is called and in this
> >> > case we do not care where they live. However, maybe I missed
> >> > something important.
> >>
> >> It does matter - otherwise, over time, we could exhaust memory
> >> below a certain boundary in Xen.
> >
> > Ahhhh... I thought about that once, however, I could not find it
> > in the code. It is not clear because there is no any comment. As
>
> The name of the function is - imo - sufficient to describe its purpose.

Yes, it is. However, if you do not know Xen's allocator behavior
it is quite difficult find out where exactly it is going on.

> > I understand HYPERVISOR_memory_op(XENMEM_exchange, &exchange) prefers
> > to allocate pages from Xen which live on higher addresses (at the
> > end of physical memory) if exchange.out.address_bits is 0. This
> > behavior leads to situation where pages with higher addresses
> > are more prefered than with lower addresses. In consequence pages
> > are moved from lower MFNs to higher MFNs.
> >
> > Please correct me if I am wrong.
>
> That's correct (with the slight adjustment that higher addresses are
> always preferred by Xen's allocator, just that address_bits being non-
> zero sets an upper bound).

Thanks for that explanation.

> >> So I think we need to add an init_page_count() call to undo_limit_pages().
> >
> > Hmmm... I think it is not good solution in that point. I suppose that you
> > found this usage in balloon driver, however, here it is not the case.
> > Balloon driver initializes page structure for pages allocated from Xen
> > by calling init_page_count() (inter alia). It means that it is used
> > more or less accordingly to a comment in include/linux/mm.h (Setup the
> > page count before being freed into the page allocator for the first time
> > (boot or memory hotplug)). However, I think we should not simply reset
> > page count in undo_limit_pages(). It could lead to unexpected results.
>
> Why? The page count *must* be zero at this point (or it would be an
> error that this function was reached).

Yes, it is. If page count != 0 then undo_limit_pages() function is not reached.
I missed one thing in put_page_testzero().

> > Now I think about two solutions for that problem:
> >   1) We could simply remove undo_limit_pages() destructor and move responsibility
> >      of pages relocation before freeing them to the caller. I prefer that solution,
> >      because it gives more flexibility to the developer and similar solution
> >      must/will be used in latest kernels (PageForeign mechanism is not available
> >      there or I missed something).
>
> I don't see what flexibility you have in mind. To me it's just an extra
> burden, namely because the caller would have to track for which
> pages it may have (successfully) called xen_limit_pages_...(). Just
> look at the uses of the function in a recent SLES or openSUSE kernel...

I would like to compare xen_limit_pages_to_max_mfn() calls to relevant
SetPageReserved()/ClearPageReserved(). They set some properties of given
page. If you would like to reserve page after allocation you could call
SetPageReserved(). Later you could release it by calling ClearPageReserved()
(e.g. before freeing). The same idea should be used in case of xen_limit_pages_to_max_mfn().
If it is required user could move pages to lower MFNs by calling
xen_limit_pages_to_max_mfn(). Later if it is needed he/she could move
back relevant pages to higher MFNs before freeing them. I think this
should not be done automagically like it is done now. Reserved bit is
not cleared by __free_pages() function. If it was set by user it is
role of user to unset it before freeing relevant pages. You could find
good example in kernel/kexec.c:kimage_alloc_pages() and
kernel/kexec.c:kimage_free_pages().

Additionally, if we do that in way which I described above it will
be inline with things which should be done in that case in upstream
kernels. Please look below for more details.

> >   2) We could prepare new function, e.g.
> >
> >      fastcall void __free_pages_core(struct page *page, unsigned int order)
> > {
> >              if (order == 0)
> >                      free_hot_page(page);
> >              else
> >                      __free_pages_ok(page, order);
> >      }
> >
> >      and call it from undo_limit_pages() destructor instead of
> > __free_pages().
> >
> > What do you think about that ???
>
> If you can get upstream to accept such a function - fine. But without
> that, adding Xen-specific code in core Xen-unspecific files is generally
> only a last resort, even in XenoLinux, and requires a good reason and
> no alternative.

This function is not needed in upstream because
PageForeign mechanism is not available. It means
that user must call xen_destroy_contiguous_region()
(xen_limit_pages_to_max_mfn() is not available yet)
if he/she wants moves its pages to higher MFNs
(e.g. before freeing them).

Daniel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 14:58:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 14:58:52 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RP03g-0000DY-6m; Fri, 11 Nov 2011 14:58:52 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RP01w-0008R0-IJ
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 14:57:05 -0800
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-15.tower-21.messagelabs.com!1321052221!3864203!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3117 invoked from network); 11 Nov 2011 22:57:01 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-15.tower-21.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 11 Nov 2011 22:57:01 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1321052221; l=4634;
	s=domk; d=aepfle.de;
	h=In-Reply-To:Content-Type:MIME-Version:References:Subject:Cc:To:From:
	Date:X-RZG-CLASS-ID:X-RZG-AUTH;
	bh=RHgZsRKeQbrnM+FHWeAA+Nf5Gpc=;
	b=YMZwyjoJkuAXgI85i2OR6Pqy4OqD19P2J2V6FITLnXbd/hEnQ/5ASv1lXma3EWevrhG
	mB89PzvEMtvdx4ISIixF0keIjgp257+5WXpa8EQ4mD1hM+cAGL/9rbO8QkikpnD7CnKWM
	+88xTRFuxujt2omeF6W4bAh5hUdJPVpszZY=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmxtMZ80VwmRNV6KE=
X-RZG-CLASS-ID: mo00
Received: from probook.site (ip-80-226-24-2.vodafone-net.de [80.226.24.2])
	by post.strato.de (mrclete mo41) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id i028bbnABJsakL ;
	Fri, 11 Nov 2011 23:56:48 +0100 (MET)
Received: by probook.site (Postfix, from userid 1000)
	id C1E8F18638; Fri, 11 Nov 2011 23:56:46 +0100 (CET)
Date: Fri, 11 Nov 2011 23:56:46 +0100
From: Olaf Hering <olaf@aepfle.de>
To: Keir Fraser <keir.xen@gmail.com>
Subject: Re: [Xen-devel] Need help with fixing the Xen waitqueue feature
Message-ID: <20111111225646.GA9332@aepfle.de>
References: <20111108222011.GA23969@aepfle.de>
	<CADF63BC.2460E%keir.xen@gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <CADF63BC.2460E%keir.xen@gmail.com>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Keir,

just do dump my findings to the list:

On Tue, Nov 08, Keir Fraser wrote:

> Tbh I wonder anyway whether stale hypercall context would be likely to cause
> a silent machine reboot. Booting with max_cpus=1 would eliminate moving
> between CPUs as a cause of inconsistencies, or pin the guest under test.
> Another problem could be sleeping with locks held, but we do test for that
> (in debug builds at least) and I'd expect crash/hang rather than silent
> reboot. Another problem could be if the vcpu has its own state in an
> inconsistent/invalid state temporarily (e.g., its pagetable base pointers)
> which then is attempted to be restored during a waitqueue wakeup. That could
> certainly cause a reboot, but I don't know of an example where this might
> happen.

The crashes also happen with maxcpus=1 and a single guest cpu.
Today I added wait_event to ept_get_entry and this works.

But at some point the codepath below is executed, after that wake_up the
host hangs hard. I will trace it further next week, maybe the backtrace
gives a glue what the cause could be.

Also, the 3K stacksize is still too small, this path uses 3096.

(XEN) prep 127a 30 0
(XEN) wake 127a 30
(XEN) prep 1cf71 30 0
(XEN) wake 1cf71 30
(XEN) prep 1cf72 30 0
(XEN) wake 1cf72 30
(XEN) prep 1cee9 30 0
(XEN) wake 1cee9 30
(XEN) prep 121a 30 0
(XEN) wake 121a 30

(This means 'gfn  (p2m_unshare << 4) in_atomic)'

(XEN) prep 1ee61 20 0
(XEN) max stacksize c18
(XEN) Xen WARN at wait.c:126
(XEN) ----[ Xen-4.2.24114-20111111.221356  x86_64  debug=y  Tainted:    C ]----
(XEN) CPU:    0
(XEN) RIP:    e008:[<ffff82c48012b85e>] prepare_to_wait+0x178/0x1b2
(XEN) RFLAGS: 0000000000010286   CONTEXT: hypervisor
(XEN) rax: 0000000000000000   rbx: ffff830201f76000   rcx: 0000000000000000
(XEN) rdx: ffff82c4802b7f18   rsi: 000000000000000a   rdi: ffff82c4802673f0
(XEN) rbp: ffff82c4802b73a8   rsp: ffff82c4802b7378   r8:  0000000000000000
(XEN) r9:  ffff82c480221da0   r10: 00000000fffffffa   r11: 0000000000000003
(XEN) r12: ffff82c4802b7f18   r13: ffff830201f76000   r14: ffff83003ea5c000
(XEN) r15: 000000000001ee61   cr0: 000000008005003b   cr4: 00000000000026f0
(XEN) cr3: 000000020336d000   cr2: 00007fa88ac42000
(XEN) ds: 0000   es: 0000   fs: 0000   gs: 0000   ss: 0000   cs: e008
(XEN) Xen stack trace from rsp=ffff82c4802b7378:
(XEN)    0000000000000020 000000000001ee61 0000000000000002 ffff830201aa9e90
(XEN)    ffff830201aa9f60 0000000000000020 ffff82c4802b7428 ffff82c4801e02f9
(XEN)    ffff830000000002 0000000000000000 ffff82c4802b73f8 ffff82c4802b73f4
(XEN)    0000000000000000 ffff82c4802b74e0 ffff82c4802b74e4 0000000101aa9e90
(XEN)    000000ffffffffff ffff830201aa9e90 000000000001ee61 ffff82c4802b74e4
(XEN)    0000000000000002 0000000000000000 ffff82c4802b7468 ffff82c4801d810f
(XEN)    ffff82c4802b74e0 000000000001ee61 ffff830201aa9e90 ffff82c4802b75bc
(XEN)    00000000002167f5 ffff88001ee61900 ffff82c4802b7518 ffff82c480211b80
(XEN)    ffff8302167f5000 ffff82c4801c168c 0000000000000000 ffff83003ea5c000
(XEN)    ffff88001ee61900 0000000001805063 0000000001809063 000000001ee001e3
(XEN)    000000001ee61067 00000000002167f5 000000000022ee70 000000000022ed10
(XEN)    ffffffffffffffff 0000000a00000007 0000000000000004 ffff82c48025db80
(XEN)    ffff83003ea5c000 ffff82c4802b75bc ffff88001ee61900 ffff830201aa9e90
(XEN)    ffff82c4802b7528 ffff82c480211cb1 ffff82c4802b7568 ffff82c4801da97f
(XEN)    ffff82c4801be053 0000000000000008 ffff82c4802b7b58 ffff88001ee61900
(XEN)    0000000000000000 ffff82c4802b78b0 ffff82c4802b75f8 ffff82c4801aaec8
(XEN)    0000000000000003 ffff88001ee61900 ffff82c4802b78b0 ffff82c4802b7640
(XEN)    ffff83003ea5c000 00000000000000a0 0000000000000900 0000000000000008
(XEN)    00000003802b7650 0000000000000004 00000003802b7668 0000000000000000
(XEN)    ffff82c4802b7b58 0000000000000001 0000000000000003 ffff82c4802b78b0
(XEN) Xen call trace:
(XEN)    [<ffff82c48012b85e>] prepare_to_wait+0x178/0x1b2
(XEN)    [<ffff82c4801e02f9>] ept_get_entry+0x81/0xd8
(XEN)    [<ffff82c4801d810f>] gfn_to_mfn_type_p2m+0x55/0x114
(XEN)    [<ffff82c480211b80>] hap_p2m_ga_to_gfn_4_levels+0x1c4/0x2d6
(XEN)    [<ffff82c480211cb1>] hap_gva_to_gfn_4_levels+0x1f/0x2e
(XEN)    [<ffff82c4801da97f>] paging_gva_to_gfn+0xae/0xc4
(XEN)    [<ffff82c4801aaec8>] hvmemul_linear_to_phys+0xf1/0x25c
(XEN)    [<ffff82c4801ab762>] hvmemul_rep_movs+0xe8/0x31a
(XEN)    [<ffff82c48018de07>] x86_emulate+0x4e01/0x10fde
(XEN)    [<ffff82c4801aab3c>] hvm_emulate_one+0x12d/0x1c5
(XEN)    [<ffff82c4801b68a9>] handle_mmio+0x4e/0x1d8
(XEN)    [<ffff82c4801b3a1e>] hvm_hap_nested_page_fault+0x1e7/0x302
(XEN)    [<ffff82c4801d1ff6>] vmx_vmexit_handler+0x12cf/0x1594
(XEN)
(XEN) wake 1ee61 20




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 16:14:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 16:14:08 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RP1EW-0001ye-7z; Fri, 11 Nov 2011 16:14:08 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RP1Dc-0001kx-CF
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 16:13:12 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1321056789!2819985!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27219 invoked from network); 12 Nov 2011 00:13:09 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Nov 2011 00:13:09 -0000
X-IronPort-AV: E=Sophos;i="4.69,497,1315180800"; 
   d="scan'208";a="8894373"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Nov 2011 00:13:08 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sat, 12 Nov 2011 00:13:08 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RP1DX-000474-Rc;
	Sat, 12 Nov 2011 00:13:07 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RP1DX-0006dp-Ql;
	Sat, 12 Nov 2011 00:13:07 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9752-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sat, 12 Nov 2011 00:13:07 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9752: tolerable FAIL - PUSHED
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9752 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9752/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  0844b17df7a9
baseline version:
 xen                  9af6829a9273

------------------------------------------------------------
People who touched revisions under test:
  Andres Lagar-Cavilla <andres@lagarcavilla.org>
  Andrew Cooper <andrew.cooper3@citrix.com>
  Ian Campbell <ian.campbell@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     pass    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Pushing revision :

+ branch=xen-unstable
+ revision=0844b17df7a9
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x '!=' x/export/home/osstest/repos/lock ']'
++ OSSTEST_REPOS_LOCK_LOCKED=/export/home/osstest/repos/lock
++ exec with-lock-ex -w /export/home/osstest/repos/lock ./ap-push xen-unstable 0844b17df7a9
+ branch=xen-unstable
+ revision=0844b17df7a9
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x/export/home/osstest/repos/lock '!=' x/export/home/osstest/repos/lock ']'
+ : xen@xenbits.xensource.com
+ : xen@xenbits.xensource.com:git/linux-pvops
+ : master
+ : tested/2.6.39.x
+ case "$branch" in
+ cd /export/home/osstest/repos/xen-unstable.hg
+ hg push -r 0844b17df7a9 ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
pushing to ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 2 changesets with 35 changes to 35 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 20:29:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 20:29:05 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RP5DF-0007GQ-BF; Fri, 11 Nov 2011 20:29:05 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RP5CK-00073O-CW
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 20:28:08 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1321072085!3172061!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27648 invoked from network); 12 Nov 2011 04:28:05 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Nov 2011 04:28:05 -0000
X-IronPort-AV: E=Sophos;i="4.69,498,1315180800"; 
   d="scan'208";a="8895095"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Nov 2011 04:28:04 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sat, 12 Nov 2011 04:28:04 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RP5CG-0005Uz-FI;
	Sat, 12 Nov 2011 04:28:04 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RP5CG-0006KH-As;
	Sat, 12 Nov 2011 04:28:04 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9753-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sat, 12 Nov 2011 04:28:04 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9753: tolerable FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9753 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9753/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf      5 xen-boot                     fail pass in 9752

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  0844b17df7a9
baseline version:
 xen                  0844b17df7a9

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Published tested tree is already up to date.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Nov 11 23:01:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 11 Nov 2011 23:01:52 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RP7b6-0001cp-7j; Fri, 11 Nov 2011 23:01:52 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RP7aB-0001Q3-7x
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 23:00:56 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1321081251!3239505!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26511 invoked from network); 12 Nov 2011 07:00:52 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Nov 2011 07:00:52 -0000
Received: by wwp14 with SMTP id 14so2473944wwp.24
	for <xen-devel@lists.xensource.com>;
	Fri, 11 Nov 2011 23:00:51 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=7X4i+Yu12tCLwhf8Rtiwy2T5mmFFg+NRkRrrU2OHtf8=;
	b=pVFi0a5uX3dWCG62djnCpnTsbl/BX20DKbocHQp8XEwNDUzitj7EywTrJcWliDmvAb
	yy/uXZWUqkf8wd9j/xwONJjgshjPvSz2ecHRshTmvib5gZK5I1sxuX725j47zyCt/m2T
	xLLl8nIkwesGMh4XRmZD1ZAuhVDACU2k2VAPs=
Received: by 10.227.205.132 with SMTP id fq4mr9852967wbb.5.1321081251547;
	Fri, 11 Nov 2011 23:00:51 -0800 (PST)
Received: from [192.168.1.71]
	(host86-129-245-239.range86-129.btcentralplus.com. [86.129.245.239])
	by mx.google.com with ESMTPS id
	fy13sm16319340wbb.18.2011.11.11.23.00.47
	(version=SSLv3 cipher=OTHER); Fri, 11 Nov 2011 23:00:49 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Sat, 12 Nov 2011 07:00:43 +0000
Subject: Re: [Xen-devel] Need help with fixing the Xen waitqueue feature
From: Keir Fraser <keir.xen@gmail.com>
To: Olaf Hering <olaf@aepfle.de>
Message-ID: <CAE3CA1B.24BD2%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] Need help with fixing the Xen waitqueue feature
Thread-Index: AcyhCMtUcLY/v8/y0kqO+2Gg/4wVWw==
In-Reply-To: <20111111225646.GA9332@aepfle.de>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/11/2011 22:56, "Olaf Hering" <olaf@aepfle.de> wrote:

> Keir,
> 
> just do dump my findings to the list:
> 
> On Tue, Nov 08, Keir Fraser wrote:
> 
>> Tbh I wonder anyway whether stale hypercall context would be likely to cause
>> a silent machine reboot. Booting with max_cpus=1 would eliminate moving
>> between CPUs as a cause of inconsistencies, or pin the guest under test.
>> Another problem could be sleeping with locks held, but we do test for that
>> (in debug builds at least) and I'd expect crash/hang rather than silent
>> reboot. Another problem could be if the vcpu has its own state in an
>> inconsistent/invalid state temporarily (e.g., its pagetable base pointers)
>> which then is attempted to be restored during a waitqueue wakeup. That could
>> certainly cause a reboot, but I don't know of an example where this might
>> happen.
> 
> The crashes also happen with maxcpus=1 and a single guest cpu.
> Today I added wait_event to ept_get_entry and this works.
> 
> But at some point the codepath below is executed, after that wake_up the
> host hangs hard. I will trace it further next week, maybe the backtrace
> gives a glue what the cause could be.

So you run with a single CPU, and with wait_event() in one location, and
that works for a while (actually doing full waitqueue work: executing wait()
and wake_up()), but then hangs? That's weird, but pretty interesting if I've
understood correctly.

> Also, the 3K stacksize is still too small, this path uses 3096.

I'll allocate a whole page for the stack then.

 -- Keir

> (XEN) prep 127a 30 0
> (XEN) wake 127a 30
> (XEN) prep 1cf71 30 0
> (XEN) wake 1cf71 30
> (XEN) prep 1cf72 30 0
> (XEN) wake 1cf72 30
> (XEN) prep 1cee9 30 0
> (XEN) wake 1cee9 30
> (XEN) prep 121a 30 0
> (XEN) wake 121a 30
> 
> (This means 'gfn  (p2m_unshare << 4) in_atomic)'
> 
> (XEN) prep 1ee61 20 0
> (XEN) max stacksize c18
> (XEN) Xen WARN at wait.c:126
> (XEN) ----[ Xen-4.2.24114-20111111.221356  x86_64  debug=y  Tainted:    C
> ]----
> (XEN) CPU:    0
> (XEN) RIP:    e008:[<ffff82c48012b85e>] prepare_to_wait+0x178/0x1b2
> (XEN) RFLAGS: 0000000000010286   CONTEXT: hypervisor
> (XEN) rax: 0000000000000000   rbx: ffff830201f76000   rcx: 0000000000000000
> (XEN) rdx: ffff82c4802b7f18   rsi: 000000000000000a   rdi: ffff82c4802673f0
> (XEN) rbp: ffff82c4802b73a8   rsp: ffff82c4802b7378   r8:  0000000000000000
> (XEN) r9:  ffff82c480221da0   r10: 00000000fffffffa   r11: 0000000000000003
> (XEN) r12: ffff82c4802b7f18   r13: ffff830201f76000   r14: ffff83003ea5c000
> (XEN) r15: 000000000001ee61   cr0: 000000008005003b   cr4: 00000000000026f0
> (XEN) cr3: 000000020336d000   cr2: 00007fa88ac42000
> (XEN) ds: 0000   es: 0000   fs: 0000   gs: 0000   ss: 0000   cs: e008
> (XEN) Xen stack trace from rsp=ffff82c4802b7378:
> (XEN)    0000000000000020 000000000001ee61 0000000000000002 ffff830201aa9e90
> (XEN)    ffff830201aa9f60 0000000000000020 ffff82c4802b7428 ffff82c4801e02f9
> (XEN)    ffff830000000002 0000000000000000 ffff82c4802b73f8 ffff82c4802b73f4
> (XEN)    0000000000000000 ffff82c4802b74e0 ffff82c4802b74e4 0000000101aa9e90
> (XEN)    000000ffffffffff ffff830201aa9e90 000000000001ee61 ffff82c4802b74e4
> (XEN)    0000000000000002 0000000000000000 ffff82c4802b7468 ffff82c4801d810f
> (XEN)    ffff82c4802b74e0 000000000001ee61 ffff830201aa9e90 ffff82c4802b75bc
> (XEN)    00000000002167f5 ffff88001ee61900 ffff82c4802b7518 ffff82c480211b80
> (XEN)    ffff8302167f5000 ffff82c4801c168c 0000000000000000 ffff83003ea5c000
> (XEN)    ffff88001ee61900 0000000001805063 0000000001809063 000000001ee001e3
> (XEN)    000000001ee61067 00000000002167f5 000000000022ee70 000000000022ed10
> (XEN)    ffffffffffffffff 0000000a00000007 0000000000000004 ffff82c48025db80
> (XEN)    ffff83003ea5c000 ffff82c4802b75bc ffff88001ee61900 ffff830201aa9e90
> (XEN)    ffff82c4802b7528 ffff82c480211cb1 ffff82c4802b7568 ffff82c4801da97f
> (XEN)    ffff82c4801be053 0000000000000008 ffff82c4802b7b58 ffff88001ee61900
> (XEN)    0000000000000000 ffff82c4802b78b0 ffff82c4802b75f8 ffff82c4801aaec8
> (XEN)    0000000000000003 ffff88001ee61900 ffff82c4802b78b0 ffff82c4802b7640
> (XEN)    ffff83003ea5c000 00000000000000a0 0000000000000900 0000000000000008
> (XEN)    00000003802b7650 0000000000000004 00000003802b7668 0000000000000000
> (XEN)    ffff82c4802b7b58 0000000000000001 0000000000000003 ffff82c4802b78b0
> (XEN) Xen call trace:
> (XEN)    [<ffff82c48012b85e>] prepare_to_wait+0x178/0x1b2
> (XEN)    [<ffff82c4801e02f9>] ept_get_entry+0x81/0xd8
> (XEN)    [<ffff82c4801d810f>] gfn_to_mfn_type_p2m+0x55/0x114
> (XEN)    [<ffff82c480211b80>] hap_p2m_ga_to_gfn_4_levels+0x1c4/0x2d6
> (XEN)    [<ffff82c480211cb1>] hap_gva_to_gfn_4_levels+0x1f/0x2e
> (XEN)    [<ffff82c4801da97f>] paging_gva_to_gfn+0xae/0xc4
> (XEN)    [<ffff82c4801aaec8>] hvmemul_linear_to_phys+0xf1/0x25c
> (XEN)    [<ffff82c4801ab762>] hvmemul_rep_movs+0xe8/0x31a
> (XEN)    [<ffff82c48018de07>] x86_emulate+0x4e01/0x10fde
> (XEN)    [<ffff82c4801aab3c>] hvm_emulate_one+0x12d/0x1c5
> (XEN)    [<ffff82c4801b68a9>] handle_mmio+0x4e/0x1d8
> (XEN)    [<ffff82c4801b3a1e>] hvm_hap_nested_page_fault+0x1e7/0x302
> (XEN)    [<ffff82c4801d1ff6>] vmx_vmexit_handler+0x12cf/0x1594
> (XEN)
> (XEN) wake 1ee61 20
> 
> 
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Nov 12 07:09:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 12 Nov 2011 07:09:17 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPFCn-0002lQ-Jt; Sat, 12 Nov 2011 07:09:17 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPFC3-0002Z4-Ag
	for xen-devel@lists.xensource.com; Sat, 12 Nov 2011 07:08:31 -0800
X-Env-Sender: Wei.Huang2@amd.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1321110506!2860693!1
X-Originating-IP: [216.32.181.183]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8846 invoked from network); 12 Nov 2011 15:08:28 -0000
Received: from ch1ehsobe003.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.183)
	by server-6.tower-182.messagelabs.com with AES128-SHA encrypted SMTP;
	12 Nov 2011 15:08:28 -0000
Received: from mail84-ch1-R.bigfish.com (10.43.68.247) by
	CH1EHSOBE012.bigfish.com (10.43.70.62) with Microsoft SMTP Server id
	14.1.225.22; Sat, 12 Nov 2011 15:07:58 +0000
Received: from mail84-ch1 (localhost.localdomain [127.0.0.1])	by
	mail84-ch1-R.bigfish.com (Postfix) with ESMTP id BEE341550613;
	Sat, 12 Nov 2011 15:08:12 +0000 (UTC)
X-SpamScore: -3
X-BigFish: VPS-3(zzc85fh4015Lzz1202hzz8275bhz32i668h839h34h)
X-Forefront-Antispam-Report: CIP:163.181.249.108; KIP:(null); UIP:(null);
	IPVD:NLI; H:ausb3twp01.amd.com; RD:none; EFVD:NLI
Received: from mail84-ch1 (localhost.localdomain [127.0.0.1]) by mail84-ch1
	(MessageSwitch) id 1321110490557425_26306;
	Sat, 12 Nov 2011 15:08:10 +0000 (UTC)
Received: from CH1EHSMHS011.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.244])	by mail84-ch1.bigfish.com (Postfix) with ESMTP id
	83257166004C;	Sat, 12 Nov 2011 15:08:10 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	CH1EHSMHS011.bigfish.com (10.43.70.11) with Microsoft SMTP Server id
	14.1.225.22; Sat, 12 Nov 2011 15:08:21 +0000
X-WSS-ID: 0LUJZDX-01-9K3-02
X-M-MSG: 
Received: from sausexedgep02.amd.com (sausexedgep02-ext.amd.com
	[163.181.249.73])	(using TLSv1 with cipher AES128-SHA (128/128
	bits))	(No
	client certificate requested)	by ausb3twp01.amd.com (Axway MailGate
	3.8.1)
	with ESMTP id 29D9C1028058;	Sat, 12 Nov 2011 09:08:21 -0600 (CST)
Received: from SAUSEXDAG03.amd.com (163.181.55.3) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Sat, 12 Nov 2011 09:09:32 -0600
Received: from SAUSEXDAG02.amd.com ([fe80::ed3c:9786:3083:dd99]) by
	sausexdag03.amd.com ([fe80::85b5:3838:d8b4:20ba%25]) with mapi id
	14.01.0289.001; Sat, 12 Nov 2011 09:08:22 -0600
From: "Huang2, Wei" <Wei.Huang2@amd.com>
To: Keir Fraser <keir@xen.org>, "xen-devel@lists.xensource.com"
	<xen-devel@lists.xensource.com>
Thread-Topic: [PATCH] Avoid cache flush for AMD Cpus when entering C3 state
Thread-Index: AQHMoUzrMP1dX5+MA0SJd/OqgvjiZQ==
Date: Sat, 12 Nov 2011 15:08:22 +0000
Message-ID: <4400B41FB768044EA720935D0808176C01F119@sausexdag02.amd.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: yes
X-MS-TNEF-Correlator: 
x-originating-ip: [10.224.14.153]
Content-Type: multipart/mixed;
	boundary="_002_4400B41FB768044EA720935D0808176C01F119sausexdag02amdcom_"
MIME-Version: 1.0
X-OriginatorOrg: amd.com
Cc: 
Subject: [Xen-devel] [PATCH] Avoid cache flush for AMD Cpus when entering C3
	state
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--_002_4400B41FB768044EA720935D0808176C01F119sausexdag02amdcom_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

Hi Keir,=0A=
=0A=
Could you apply the patch to Xen-4.1 tree? This patch was back-ported from =
xen-unstable tree and is required to boost performance on new CPUs.=0A=
=0A=
Link: http://xenbits.xensource.com/hg/xen-unstable.hg/rev/450f1d198e1e=0A=
=0A=
Thanks,=0A=
-Wei=

--_002_4400B41FB768044EA720935D0808176C01F119sausexdag02amdcom_
Content-Type: application/octet-stream; name="amd-c3-cache-flush"
Content-Description: amd-c3-cache-flush
Content-Disposition: attachment; filename="amd-c3-cache-flush"; size=1121;
	creation-date="Sat, 12 Nov 2011 15:07:54 GMT";
	modification-date="Sat, 12 Nov 2011 15:07:54 GMT"
Content-ID: <6e67a4b6-e8f0-452a-91fe-08ddeada3077>
Content-Transfer-Encoding: base64

IyBIRyBjaGFuZ2VzZXQgcGF0Y2gKIyBVc2VyIFdlaSBIdWFuZyA8d2VpLmh1YW5nMkBhbWQuY29t
PgojIERhdGUgMTMyMTA5MDM2MyAyMTYwMAojIE5vZGUgSUQgN2NiZTllMWIxYjM3ZWNhMGNmOWY3
NDI0MmE2OGRlZDQ1YjBhMjFkMgojIFBhcmVudCAgOGMyZDc2MTkzZWFmZTc4YzJlODQ2NDYyZmI0
MWYxMzA4ZGYwOTA4OAp4ODYvYW1kOiBFbGltaW5hdGUgY2FjaGUgZmx1c2hpbmcgd2hlbiBlbnRl
cmluZyBDMyBvbiBzZWxlY3QgQU1EIHByb2Nlc3NvcnMKCkFNRCBGYW0xNWggcHJvY2Vzc29ycyBo
YXZlIGEgc2hhcmVkIGNhY2hlLiBJdCBkb2VzIG5vdCBuZWVkIHRvCmJlIGJlIGZsdXNoZWQgd2hl
biBlbnRlcmluZyBDMyBhbmQgZG9pbmcgc28gY2F1c2VzIHJlZHVjZXMKcGVyZm9ybWFuY2UuIE1v
ZGlmeSBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X2JtX2NoZWNrIHRvCnByZXZlbnQgdGhlc2Ug
cHJvY2Vzc29ycyBmcm9tIGZsdXNoaW5nIHdoZW4gZW50ZXJpbmcgQzMuCgpTaWduZWQtb2ZmLWJ5
OiBNYXJrIExhbmdzZG9yZiA8bWFyay5sYW5nc2RvcmZAYW1kLmNvbT4KCmRpZmYgLXIgOGMyZDc2
MTkzZWFmIC1yIDdjYmU5ZTFiMWIzNyB4ZW4vYXJjaC94ODYvYWNwaS9jcHVfaWRsZS5jCi0tLSBh
L3hlbi9hcmNoL3g4Ni9hY3BpL2NwdV9pZGxlLmMJV2VkIE5vdiAwMiAxNTowMjoxOCAyMDExICsw
MDAwCisrKyBiL3hlbi9hcmNoL3g4Ni9hY3BpL2NwdV9pZGxlLmMJU2F0IE5vdiAxMiAwMzozMjo0
MyAyMDExIC0wNjAwCkBAIC03MTAsNyArNzEwLDggQEAKICAgICBmbGFncy0+Ym1fY2hlY2sgPSAw
OwogICAgIGlmICggbnVtX29ubGluZV9jcHVzKCkgPT0gMSApCiAgICAgICAgIGZsYWdzLT5ibV9j
aGVjayA9IDE7Ci0gICAgZWxzZSBpZiAoIGMtPng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRF
TCApCisgICAgZWxzZSBpZiAoIChjLT54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpIHx8
CisgICAgICAgICAgICAgICgoYy0+eDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCkgJiYgKGMt
Png4NiA9PSAweDE1KSkgKQogICAgIHsKICAgICAgICAgLyoKICAgICAgICAgICogVG9kYXkgYWxs
IE1QIENQVXMgdGhhdCBzdXBwb3J0IEMzIHNoYXJlIGNhY2hlLgo=

--_002_4400B41FB768044EA720935D0808176C01F119sausexdag02amdcom_
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--_002_4400B41FB768044EA720935D0808176C01F119sausexdag02amdcom_--


From xen-devel-bounces@lists.xensource.com Sat Nov 12 08:16:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 12 Nov 2011 08:16:32 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPGFq-0004ZD-NT; Sat, 12 Nov 2011 08:16:31 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPGBa-0004JH-SJ
	for xen-devel@lists.xensource.com; Sat, 12 Nov 2011 08:12:10 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1321114322!1281794!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7614 invoked from network); 12 Nov 2011 16:12:02 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Nov 2011 16:12:02 -0000
Received: by wyh11 with SMTP id 11so6090417wyh.30
	for <xen-devel@lists.xensource.com>;
	Sat, 12 Nov 2011 08:12:02 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=EtThkBFMJXfcwGPrJrZIYtLLY9q7LlM0c+jsczD8vsw=;
	b=V+R3i0kHqEcyZX49n2Ydl+qfSpjXlloM5N1hiHk4b6wJiIY2oOjlr99wIfzGp811HX
	LTqwj8fhF1jAUm8ROsqT9oLF1KMCjYT4icMMgIVI2UnNrTzqbW9XEDfl3npD7bb15Vc2
	fhcpXQC2/nieAQfq0Y//HQM/WZJhsyEktztWU=
Received: by 10.216.229.34 with SMTP id g34mr119951weq.37.1321114322519;
	Sat, 12 Nov 2011 08:12:02 -0800 (PST)
Received: from [192.168.1.71]
	(host86-129-245-239.range86-129.btcentralplus.com. [86.129.245.239])
	by mx.google.com with ESMTPS id n2sm8934192wiz.16.2011.11.12.08.11.57
	(version=SSLv3 cipher=OTHER); Sat, 12 Nov 2011 08:12:00 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Sat, 12 Nov 2011 16:11:55 +0000
From: Keir Fraser <keir.xen@gmail.com>
To: "Huang2, Wei" <Wei.Huang2@amd.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CAE44B4B.24BF3%keir.xen@gmail.com>
Thread-Topic: [PATCH] Avoid cache flush for AMD Cpus when entering C3 state
Thread-Index: AQHMoUzrMP1dX5+MA0SJd/OqgvjiZZWpaP3s
In-Reply-To: <4400B41FB768044EA720935D0808176C01F119@sausexdag02.amd.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: Andrew Cooper <andrew.cooper3@citrix.com>
Subject: [Xen-devel] Re: [PATCH] Avoid cache flush for AMD Cpus when
	entering C3 state
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 12/11/2011 15:08, "Huang2, Wei" <Wei.Huang2@amd.com> wrote:

> Hi Keir,
> 
> Could you apply the patch to Xen-4.1 tree? This patch was back-ported from
> xen-unstable tree and is required to boost performance on new CPUs.

Done.

 -- Keir

> Link: http://xenbits.xensource.com/hg/xen-unstable.hg/rev/450f1d198e1e
> 
> Thanks,
> -Wei



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Nov 12 13:04:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 12 Nov 2011 13:04:06 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPKkA-0002A6-Mu; Sat, 12 Nov 2011 13:04:06 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPKj7-0001wh-BU
	for xen-devel@lists.xensource.com; Sat, 12 Nov 2011 13:03:01 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1321131741!62938222!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23061 invoked from network); 12 Nov 2011 21:02:21 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Nov 2011 21:02:21 -0000
X-IronPort-AV: E=Sophos;i="4.69,500,1315180800"; 
   d="scan'208";a="8898522"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Nov 2011 21:02:57 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sat, 12 Nov 2011 21:02:57 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RPKj3-0002OC-8s;
	Sat, 12 Nov 2011 21:02:57 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RPKj3-0000tc-1j;
	Sat, 12 Nov 2011 21:02:57 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9755-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sat, 12 Nov 2011 21:02:57 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9755: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9755 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9755/

Regressions :-(

Tests which did not succeed and are blocking:
 build-amd64                   4 xen-build                  fail REGR. vs. 9658
 build-amd64-oldkern           4 xen-build                  fail REGR. vs. 9658
 build-amd64-pvops             4 kernel-build               fail REGR. vs. 9658

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pair          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pv            1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win           1 xen-build-check(1)           blocked  n/a
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  9702967e89dd
baseline version:
 xen                  8c2d76193eaf

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Keir Fraser <keir@xen.org>
  Mark Langsdorf <mark.langsdorf@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  fail    
 build-i386                                                   pass    
 build-amd64-oldkern                                          fail    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            fail    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           blocked 
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 blocked 
 test-amd64-i386-xl-credit2                                   blocked 
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               blocked 
 test-amd64-i386-xl-multivcpu                                 blocked 
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         blocked 
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           blocked 
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   blocked 
 test-amd64-i386-xl-win-vcpus1                                blocked 
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          blocked 
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   23182:9702967e89dd
tag:         tip
user:        Andrew Cooper <andrew.cooper3@citrix.com>
date:        Sat Nov 12 16:14:02 2011 +0000
    
    Revert c/s 23666:b96f8bdcaa15 KEXEC: disconnect all PCI devices from the PCI bus on crash
    
    It turns out that this causes all mannor of problems on certain
    motherboards (so far with no pattern I can discern)
    
    Problems include:
    * Hanging forever checking hlt instruction.
    * Panics when trying to change switch root device
    * Drivers hanging when trying to check for interrupts.
    
    From: Andrew Cooper <andrew.cooper3@citrix.com>
    Signed-off-by: Keir Fraser <keir@xen.org>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   24137:0844b17df7a9
    xen-unstable date:        Fri Nov 11 18:14:35 2011 +0000
    
    
changeset:   23181:55879870fc8f
user:        Mark Langsdorf <mark.langsdorf@amd.com>
date:        Sat Nov 12 16:11:21 2011 +0000
    
    x86/amd: Eliminate cache flushing when entering C3 on select AMD processors
    
    AMD Fam15h processors have a shared cache. It does not need
    to be be flushed when entering C3 and doing so causes reduces
    performance. Modify acpi_processor_power_init_bm_check to
    prevent these processors from flushing when entering C3.
    
    Signed-off-by: Mark Langsdorf <mark.langsdorf@amd.com>
    xen-unstable changeset:   23511:450f1d198e1e
    xen-unstable date:        Tue Jun 14 12:46:29 2011 +0100
    Committed-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23180:8c2d76193eaf
user:        Ian Jackson <Ian.Jackson@eu.citrix.com>
date:        Wed Nov 02 15:02:18 2011 +0000
    
    tools/ocaml: unify build process
    
    Unify ocaml build process for different platforms.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    [ Backport had a conflict; fixed up in the obvious way. -iwj ]
    
    xen-unstable.hg changeset: 24050:068d3d55ce6e
    Backport-requested-by: Christoph Egger <Christoph.Egger@amd.com>
    Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
(qemu changes not included)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Nov 12 13:05:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 12 Nov 2011 13:05:12 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPKlE-0002X9-Kj; Sat, 12 Nov 2011 13:05:12 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPKjz-00026K-KI
	for xen-devel@lists.xensource.com; Sat, 12 Nov 2011 13:03:56 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1321131797!45648743!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31699 invoked from network); 12 Nov 2011 21:03:17 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Nov 2011 21:03:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,500,1315180800"; 
   d="scan'208";a="8898527"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Nov 2011 21:03:51 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sat, 12 Nov 2011 21:03:51 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RPKju-0002OT-QS;
	Sat, 12 Nov 2011 21:03:50 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RPKju-00012V-PP;
	Sat, 12 Nov 2011 21:03:50 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9754-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sat, 12 Nov 2011 21:03:50 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.0-testing test] 9754: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9754 xen-4.0-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9754/

Regressions :-(

Tests which did not succeed and are blocking:
 build-amd64                   4 xen-build                  fail REGR. vs. 9612
 build-amd64-oldkern           4 xen-build                  fail REGR. vs. 9612
 build-amd64-pvops             4 kernel-build               fail REGR. vs. 9612

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-i386-i386-xl            15 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win         7 windows-install              fail   never pass
 test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pv            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pair          1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a

version targeted for testing:
 xen                  cdff7052bad8
baseline version:
 xen                  a5cc3b953ed9

------------------------------------------------------------
People who touched revisions under test:
  Keir Fraser <keir@xen.org>
  Mark Langsdorf <mark.langsdorf@amd.com>
  Wei Huang <wei.huang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  fail    
 build-i386                                                   pass    
 build-amd64-oldkern                                          fail    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            fail    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           blocked 
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 blocked 
 test-amd64-i386-xl-credit2                                   blocked 
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               blocked 
 test-amd64-i386-xl-multivcpu                                 blocked 
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         blocked 
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           blocked 
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   blocked 
 test-amd64-i386-xl-win-vcpus1                                blocked 
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          blocked 
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   21552:cdff7052bad8
tag:         tip
user:        Mark Langsdorf <mark.langsdorf@amd.com>
date:        Sat Nov 12 16:15:19 2011 +0000
    
    x86/amd: Eliminate cache flushing when entering C3 on select AMD processors
    
    AMD Fam15h processors have a shared cache. It does not need=
    to be be flushed when entering C3 and doing so causes reduces
    performance. Modify acpi_processor_power_init_bm_check to
    prevent these processors from flushing when entering C3.
    
    Signed-off-by: Mark Langsdorf <mark.langsdorf@amd.com>
    xen-unstable changeset:   23511:450f1d198e1e
    xen-unstable date:        Tue Jun 14 12:46:29 2011 +0100
    Committed-by: Keir Fraser <keir@xen.org>
    
    
changeset:   21551:a5cc3b953ed9
user:        Wei Huang <wei.huang2@amd.com>
date:        Tue Oct 25 16:44:40 2011 +0100
    
    amd xsave: Move xsave initialization code to a common place
    
    This patch moves xsave/xrstor code to CPU common file. First of all,
    it prepares xsave/xrstor support for AMD CPUs. Secondly, Xen would
    crash on __context_switch() without this patch on xsave-capable AMD
    CPUs. The crash was due to cpu_has_xsave reports true in domain.c
    while xsave space wasn't initialized.
    
    Signed-off-by: Wei Huang <wei.huang2@amd.com>
    xen-unstable changeset:   22462:98eb4a334b77
    xen-unstable date:        Tue Dec 07 18:26:38 2010 +0000
    
    
(qemu changes not included)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Nov 12 13:13:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 12 Nov 2011 13:13:43 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPKtT-00030x-76; Sat, 12 Nov 2011 13:13:43 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RPKt2-0002pD-5c
	for xen-devel@lists.xensource.com; Sat, 12 Nov 2011 13:13:16 -0800
X-Env-Sender: heinlein@okit.de
X-Msg-Ref: server-10.tower-182.messagelabs.com!1321132393!2882874!1
X-Originating-IP: [87.234.195.223]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18465 invoked from network); 12 Nov 2011 21:13:13 -0000
Received: from yin.okit.de (HELO yin.okit.de) (87.234.195.223)
	by server-10.tower-182.messagelabs.com with SMTP;
	12 Nov 2011 21:13:13 -0000
Received: from [192.168.10.102] (p579C85D7.dip.t-dialin.net [87.156.133.215])
	(using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits))
	(No client certificate requested)
	by pollux.okit.de (Postfix) with ESMTP id 6E78F13A101;
	Sat, 12 Nov 2011 22:13:12 +0100 (CET)
Message-ID: <4EBEE163.50300@okit.de>
Date: Sat, 12 Nov 2011 22:13:07 +0100
From: Tobias Heinlein <heinlein@okit.de>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:8.0) Gecko/20111105 Thunderbird/8.0
MIME-Version: 1.0
To: xen-devel@lists.xensource.com
Subject: Re: [Xen-devel] Re: Xen dom0 linux kernel 3.1 boot failure
	ptwr_emulate: could not get_page_from_l1e
References: <05c3da5dc6158197e28d62e853ac2f04@tjhsst.edu>
	<loom.20111031T140651-901@post.gmane.org>
	<20111031140836.GA9245@phenom.dumpdata.com>
	<4EAFEA53.7070009@okit.de>
	<20111110163654.GA2811@phenom.dumpdata.com>
In-Reply-To: <20111110163654.GA2811@phenom.dumpdata.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: 2013pfoley@tjhsst.edu
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> Well,.. I think it just that we hadn't touched any machines that
> have MP tables instead of ACPI. Or that have fully populated MP tables.
> I presume that there are some ACPI tables, but perhaps not the _PRT ones
> (which are the ones we need to parse the IRQ data).
>
> But more importantly - how recent is this machine?

It's a HP ProLiant G6; they were introduced in March 2009.
http://www.hp.com/hpinfo/newsroom/press/2009/090330xb.html


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Nov 12 16:03:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 12 Nov 2011 16:03:32 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPNXo-0006tp-HZ; Sat, 12 Nov 2011 16:03:32 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPNX1-0006hG-Jv
	for xen-devel@lists.xensource.com; Sat, 12 Nov 2011 16:02:44 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1321142559!1311482!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18076 invoked from network); 13 Nov 2011 00:02:40 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 00:02:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,501,1315180800"; 
   d="scan'208";a="8898918"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Nov 2011 00:02:38 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 13 Nov 2011 00:02:38 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RPNWw-0003NW-7j;
	Sun, 13 Nov 2011 00:02:38 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RPNWw-0007ZV-78;
	Sun, 13 Nov 2011 00:02:38 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9756-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sun, 13 Nov 2011 00:02:38 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9756: tolerable FAIL - PUSHED
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9756 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9756/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  9702967e89dd
baseline version:
 xen                  8c2d76193eaf

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Keir Fraser <keir@xen.org>
  Mark Langsdorf <mark.langsdorf@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     pass    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Pushing revision :

+ branch=xen-4.1-testing
+ revision=9702967e89dd
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x '!=' x/export/home/osstest/repos/lock ']'
++ OSSTEST_REPOS_LOCK_LOCKED=/export/home/osstest/repos/lock
++ exec with-lock-ex -w /export/home/osstest/repos/lock ./ap-push xen-4.1-testing 9702967e89dd
+ branch=xen-4.1-testing
+ revision=9702967e89dd
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x/export/home/osstest/repos/lock '!=' x/export/home/osstest/repos/lock ']'
+ : xen@xenbits.xensource.com
+ : xen@xenbits.xensource.com:git/linux-pvops
+ : master
+ : tested/2.6.39.x
+ case "$branch" in
+ cd /export/home/osstest/repos/xen-4.1-testing.hg
+ hg push -r 9702967e89dd ssh://xen@xenbits.xensource.com/HG/xen-4.1-testing.hg
pushing to ssh://xen@xenbits.xensource.com/HG/xen-4.1-testing.hg
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 2 changesets with 4 changes to 4 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Nov 12 18:48:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 12 Nov 2011 18:48:37 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPQ7Z-0004wz-4E; Sat, 12 Nov 2011 18:48:37 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPQ6b-0004kG-Ln
	for xen-devel@lists.xensource.com; Sat, 12 Nov 2011 18:47:38 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1321152453!1323391!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4760 invoked from network); 13 Nov 2011 02:47:34 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 02:47:34 -0000
X-IronPort-AV: E=Sophos;i="4.69,501,1315180800"; 
   d="scan'208";a="8899332"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Nov 2011 02:47:33 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 13 Nov 2011 02:47:33 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RPQ6X-0004Hd-9V;
	Sun, 13 Nov 2011 02:47:33 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RPQ6X-0003fj-8m;
	Sun, 13 Nov 2011 02:47:33 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9757-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sun, 13 Nov 2011 02:47:33 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.0-testing test] 9757: tolerable FAIL - PUSHED
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9757 xen-4.0-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9757/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  8 debian-fixup                fail never pass
 test-amd64-i386-xl-multivcpu 15 guest-stop                   fail   never pass
 test-amd64-i386-xl           15 guest-stop                   fail   never pass
 test-amd64-amd64-xl-sedf     15 guest-stop                   fail   never pass
 test-amd64-i386-xl-credit2    5 xen-boot                   fail REGR. vs. 9610
 test-amd64-amd64-xl          15 guest-stop                   fail   never pass
 test-i386-i386-xl            15 guest-stop                   fail   never pass
 test-amd64-i386-rhel6hvm-amd  7 redhat-install               fail   never pass
 test-amd64-i386-rhel6hvm-intel  7 redhat-install               fail never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1  7 windows-install              fail  never pass
 test-i386-i386-xl-win         7 windows-install              fail   never pass
 test-amd64-amd64-xl-win       7 windows-install              fail   never pass

version targeted for testing:
 xen                  cdff7052bad8
baseline version:
 xen                  a5cc3b953ed9

------------------------------------------------------------
People who touched revisions under test:
  Keir Fraser <keir@xen.org>
  Mark Langsdorf <mark.langsdorf@amd.com>
  Wei Huang <wei.huang2@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Pushing revision :

+ branch=xen-4.0-testing
+ revision=cdff7052bad8
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x '!=' x/export/home/osstest/repos/lock ']'
++ OSSTEST_REPOS_LOCK_LOCKED=/export/home/osstest/repos/lock
++ exec with-lock-ex -w /export/home/osstest/repos/lock ./ap-push xen-4.0-testing cdff7052bad8
+ branch=xen-4.0-testing
+ revision=cdff7052bad8
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x/export/home/osstest/repos/lock '!=' x/export/home/osstest/repos/lock ']'
+ : xen@xenbits.xensource.com
+ : xen@xenbits.xensource.com:git/linux-pvops
+ : master
+ : tested/2.6.39.x
+ case "$branch" in
+ cd /export/home/osstest/repos/xen-4.0-testing.hg
+ hg push -r cdff7052bad8 ssh://xen@xenbits.xensource.com/HG/xen-4.0-testing.hg
pushing to ssh://xen@xenbits.xensource.com/HG/xen-4.0-testing.hg
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Nov 12 19:32:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 12 Nov 2011 19:32:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPQoP-0007Tf-LD; Sat, 12 Nov 2011 19:32:53 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPQnY-0007H0-Jc
	for xen-devel@lists.xensource.com; Sat, 12 Nov 2011 19:32:01 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1321155117!2893615!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9108 invoked from network); 13 Nov 2011 03:31:57 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 03:31:57 -0000
X-IronPort-AV: E=Sophos;i="4.69,501,1315180800"; 
   d="scan'208";a="8899430"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Nov 2011 03:31:57 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 13 Nov 2011 03:31:57 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RPQnU-0004X8-Vo;
	Sun, 13 Nov 2011 03:31:57 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RPQnU-0006Af-VD;
	Sun, 13 Nov 2011 03:31:56 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9764-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sun, 13 Nov 2011 03:31:56 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9764: tolerable FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9764 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9764/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 build-amd64-oldkern           4 xen-build                    fail pass in 9753
 build-amd64-pvops             4 kernel-build                 fail pass in 9753
 build-amd64                   4 xen-build                    fail pass in 9753
 test-amd64-amd64-xl-sedf      5 xen-boot             fail in 9753 pass in 9752

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pv            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-pair          1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win          1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-amd64-xl-pcipt-intel  9 guest-start         fail in 9753 never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2        fail in 9753 never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2          fail in 9753 never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check       fail in 9753 never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop            fail in 9753 never pass
 test-amd64-i386-win          16 leak-check/check       fail in 9753 never pass
 test-amd64-amd64-win         16 leak-check/check       fail in 9753 never pass
 test-amd64-amd64-xl-win      13 guest-stop             fail in 9753 never pass

version targeted for testing:
 xen                  0844b17df7a9
baseline version:
 xen                  0844b17df7a9

jobs:
 build-amd64                                                  fail    
 build-i386                                                   pass    
 build-amd64-oldkern                                          fail    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            fail    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 test-amd64-i386-xl                                           blocked 
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 blocked 
 test-amd64-i386-xl-credit2                                   blocked 
 test-amd64-amd64-xl-pcipt-intel                              blocked 
 test-amd64-i386-rhel6hvm-intel                               blocked 
 test-amd64-i386-xl-multivcpu                                 blocked 
 test-amd64-amd64-pair                                        blocked 
 test-amd64-i386-pair                                         blocked 
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          blocked 
 test-amd64-i386-pv                                           blocked 
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     blocked 
 test-amd64-i386-win-vcpus1                                   blocked 
 test-amd64-i386-xl-win-vcpus1                                blocked 
 test-amd64-amd64-win                                         blocked 
 test-amd64-i386-win                                          blocked 
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      blocked 
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Published tested tree is already up to date.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Nov 12 19:47:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 12 Nov 2011 19:47:31 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPR2Z-00088U-PF; Sat, 12 Nov 2011 19:47:31 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPR1l-0007vY-9L
	for xen-devel@lists.xensource.com; Sat, 12 Nov 2011 19:46:41 -0800
X-Env-Sender: lenb417@gmail.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1321155997!3211344!1
X-Originating-IP: [209.85.214.65]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19159 invoked from network); 13 Nov 2011 03:46:37 -0000
Received: from mail-bw0-f65.google.com (HELO mail-bw0-f65.google.com)
	(209.85.214.65)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 03:46:37 -0000
Received: by bkbzu17 with SMTP id zu17so1154990bkb.0
	for <xen-devel@lists.xensource.com>;
	Sat, 12 Nov 2011 19:46:36 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:cc:content-type
	:content-transfer-encoding;
	bh=H/gqNgKfXP04eBqrfoZULha8XJomlT6BzJ4cg7JKLKA=;
	b=Ey0J2gWm4T7nxQWoRRmvnzGX2CQCPb/I7HZQGFyqv/7foeKFI2WF1X7Y3E8TCiSvrR
	8bn4FO8W2apES3O594Qg2oQ76UNs9ufSCZAi9WuseiRBKJq1pPzMlBIGz66llWd5EiM7
	kTvGaY4s4e3GlIeUxRhOvElmEBoJuqWnoXiQ4=
MIME-Version: 1.0
Received: by 10.204.9.216 with SMTP id m24mr13848951bkm.98.1321155996833; Sat,
	12 Nov 2011 19:46:36 -0800 (PST)
Received: by 10.204.152.214 with HTTP; Sat, 12 Nov 2011 19:46:36 -0800 (PST)
In-Reply-To: <4EA7DFD1.9060608@canonical.com>
References: <4EA7DFD1.9060608@canonical.com>
Date: Sat, 12 Nov 2011 22:46:36 -0500
X-Google-Sender-Auth: JtEM4PFBj0t9FLmk2owWTtvDodA
Message-ID: <CAJvTdK=yAek4sJFXUp=kQSmnuE=HpgefN5Q-GLWhMXo=LhJ-2A@mail.gmail.com>
From: Len Brown <lenb@kernel.org>
To: Stefan Bader <stefan.bader@canonical.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: "linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: Regression in 3.1 causes Xen to use wrong idle
	routine
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Oct 26, 2011 at 6:24 AM, Stefan Bader
<stefan.bader@canonical.com> wrote:
> The following commit changes calls to pm_idle into first trying
> cpuidle_call_idle() and if that returns non-zero to fall back to
> call pm_idle().
>
> commit a0bfa1373859e9d11dc92561a8667588803e42d8
> Author: Len Brown <len.brown@intel.com>
> Date: =A0 Fri Apr 1 19:34:59 2011 -0400
>
> =A0 =A0cpuidle: stop depending on pm_idle
>
> However cpuidle_call_idle() will return -ENODEV if it is supposed to be d=
isabled
> by cpuidle.off. Which then causes pm_idle() to be called.
>
> This has some bad interaction with the following change that tries to
> make use of disabling cpuidle in Xen to fall back to hlt.
>
> commit d91ee5863b71e8c90eaf6035bff3078a85e2e7b5
> Author: Len Brown <len.brown@intel.com>
> Date: =A0 Fri Apr 1 18:28:35 2011 -0400
>
> =A0 =A0cpuidle: replace xen access to x86 pm_idle and default_idle
>
> The problem I see is that select_idle_routine() is called from
> arch/x86/kernel/cpu/common.c and since Xen setup does not set pm_idle
> anymore, it can cause mwait_idle or amd_e400_idle functions to be selecte=
d.
> In testing it seem amd_e400_idle in PVM domU at least does not immediatel=
y cause
> problems, but mwait_idle just causes crashes. From the reports I have
> this may be related to older hypervisors (3.1 and older) not clearing the=
 mwait
> capability. But overall there seems something wrong in the interaction.

Why is Xen advertising X86_FEATURE_MWAIT and then crashing
when the dom0 (or other guests) use what it advertises?

What versions of Xen have this bug?

> I am not really sure whether the logic of calling pm_idle() on all errors=
 from
> cpuidle_call_idle() is already flawed or the assumption in the Xen patch =
about
> being able to prevent the wrong idle function by turning cpuidle off is i=
ncorrect.

The patches above appear to be operating as intended.
What wasn't expected, was that some version of Xen is deployed that
advertises the MWAIT feature, but crashes when it is used.

> One quick fix could be to add some Xen case into select_idle_routine() wh=
ich
> picks default_idle...

No.

Working around this Xen bug for a newly compiled Dom0 is insufficient.

All guests that also look for MWAIT support w/o asking ACPI
(ie. all versions of Linux that use intel_idle, such as the last few
Fedora's, RHEL, SLES etc.)
will trip over the same Xen bug, even if Dom0 doesn't.

Xen must not advertises MWAIT support if it doesn't have MWAIT support.

thanks,
Len Brown, Intel Open Source Technology Center

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Nov 12 22:01:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 12 Nov 2011 22:01:08 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPT7s-0003iP-2C; Sat, 12 Nov 2011 22:01:08 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPT75-0003Vy-9Z
	for xen-devel@lists.xensource.com; Sat, 12 Nov 2011 22:00:20 -0800
X-Env-Sender: lenb417@gmail.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1321163989!52508478!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19664 invoked from network); 13 Nov 2011 05:59:49 -0000
Received: from mail-bw0-f43.google.com (HELO mail-bw0-f43.google.com)
	(209.85.214.43)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 05:59:49 -0000
Received: by bkbzt12 with SMTP id zt12so6805455bkb.30
	for <xen-devel@lists.xensource.com>;
	Sat, 12 Nov 2011 22:00:15 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:cc:content-type;
	bh=5Xk+xDbhHJH+M16yG1EgVzfeykM8PUM8OJEJCJHdymc=;
	b=FgnOwCTTpiKA33mo/WcPUuQ9g4R8sTb2T8i3ChAHi1bNM6fcn1ye+PMUZjku23E1n+
	bRZ2h6gGLzFJnQK+dqjGDRAQRqSkzdhNRa6PalUhXjuARuy3Qijkhiah10b8M7O6090E
	16E9JpPJEI2+e6qj3iIQ3YA6QcDzLgH3Dek0k=
MIME-Version: 1.0
Received: by 10.205.127.142 with SMTP id ha14mr6431259bkc.116.1321164015294;
	Sat, 12 Nov 2011 22:00:15 -0800 (PST)
Received: by 10.204.152.214 with HTTP; Sat, 12 Nov 2011 22:00:15 -0800 (PST)
In-Reply-To: <20111110040644.GA5434@phenom.dumpdata.com>
References: <1320786914-10541-1-git-send-email-konrad.wilk@oracle.com>
	<1320786914-10541-2-git-send-email-konrad.wilk@oracle.com>
	<20111110040644.GA5434@phenom.dumpdata.com>
Date: Sun, 13 Nov 2011 01:00:15 -0500
X-Google-Sender-Auth: yqpJBOE1mnaBVytpzfbzrhCAN4o
Message-ID: <CAJvTdKnSLD8q3QqcFVY7u-eyhTnN=2rQ3rTmd1qeJ7nGz4y5Bg@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 1/3] cpuidle: If disable_cpuidle() is called, 
	set pm_idle to default_idle.
From: Len Brown <lenb@kernel.org>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Content-Type: text/plain; charset=ISO-8859-1
Cc: len.brown@intel.com, jeremy@goop.org, xen-devel@lists.xensource.com,
	x86@kernel.org, linux-kernel@vger.kernel.org, stable@kernel.org,
	mingo@redhat.com, bp@alien8.de, hpa@zytor.com, tj@kernel.org,
	tglx@linutronix.de, trenn@suse.de
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> And just found that there is a BZ for this as well:
> https://bugzilla.redhat.com/show_bug.cgi?id=739499
>
> And this patch fixes the Linux kernel to boot under Amazon EC2.

doesn't matter.

Working around an Amazon EC2 bug in a newly compiled upstream kernel
isn't going to help with any of the kernels that don't include that workaround.

Amazon EC2 should not advertise MWAIT support that it does not have,
and all kernels should run on it w/o any workaround.

Len Brown, Intel Open Source Technology Center

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 13 08:03:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 08:03:59 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPcXG-0004q7-OI; Sun, 13 Nov 2011 08:03:58 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPcWR-0004e0-22; Sun, 13 Nov 2011 08:03:07 -0800
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-9.tower-182.messagelabs.com!1321200183!2936010!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25395 invoked from network); 13 Nov 2011 16:03:03 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-9.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Nov 2011 16:03:03 -0000
X-Originating-Ip: [194.89.68.22]
Received: from ydin.reaktio.net (reaktio.net [194.89.68.22])
	by smtp.tele.fi (Postfix) with ESMTP id B5EDD21FB;
	Sun, 13 Nov 2011 18:03:01 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 86A7820058; Sun, 13 Nov 2011 18:03:01 +0200 (EET)
Date: Sun, 13 Nov 2011 18:03:01 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Kristian Hagsted Rasmussen <kristian@hagsted.dk>
Message-ID: <20111113160301.GE12984@reaktio.net>
References: <56EBEBACEA93434C80F27BB249CB677601924EB9F001@hagsted-aserver>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <56EBEBACEA93434C80F27BB249CB677601924EB9F001@hagsted-aserver>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: xen-devel@lists.xensource.com,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>
Subject: [Xen-devel] Re: [Xen-users] xen-pciback.passthrough=1 doesn't
	perserve the pci topology in domU
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Sun, Oct 30, 2011 at 01:52:24PM +0100, Kristian Hagsted Rasmussen wrote:
>    Hi
> 

Hello,

I added xen-devel as CC.

> 
> 
>    I am trying to passthrough a graphic card and some other devices to a
>    Windows 7 domU, and am hence trying to preserve the pci topology, but it
>    is not working.
> 
> 
> 
>    Some info about the setup:
> 
> 
> 
>    I have compiled a 3.1 kernel from the main tree, with all xen releated
>    options except, some debug features, compiled into the kernel (no
>    modules). I have also compiled xen from the xen-unstable branch it is
>    version 4.2 with changeSet: Thu Oct 20 15:36:01 2011 +0100
>    23981:6c583d35d76d.
> 
> 
> 
>    I boot the kernel with parameter xen-pciback.passthrough=1 to keep the pci
>    topology in the domU, and when calling
> 
>    Dmesg | grep passthrough I get:
> 
> 
> 
>    xen-pciback: backend is passthrough
> 
> 
> 
>    indicating that the right passthrough mode is selected. But my graphic
>    card is 01:00.0 and when checking it in device manager in windows it is
>    found as 00:08.0.
> 
> 
> 
>    Can someone please tell me what I am doing wrong?
> 

Hmm.. so in dom0 the graphics card shows as 01:00.0 ? 
Please paste your whole grub configuration.

Is xen-pciback built-in to the kernel, or is it a module? 

-- Pasi


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 13 09:02:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 09:02:22 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPdRk-0006wi-5V; Sun, 13 Nov 2011 09:02:20 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPdOu-0006hk-Fi
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 08:59:28 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1321203534!48270744!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27158 invoked from network); 13 Nov 2011 16:58:54 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 16:58:54 -0000
Received: by wyh11 with SMTP id 11so6829913wyh.30
	for <xen-devel@lists.xensource.com>;
	Sun, 13 Nov 2011 08:59:21 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=OzkCfwAJztZliX/g+PuNeH2zn9wslr9rKMYZ1Xj8qsM=;
	b=rLWb5dSNBlnbtsz08MCSfBFiRE+FXj3Bk8/MLxMrM6hFZa2PX9ZOLSC1CSkyNpIxyc
	mKVsUAWHKjD1vjjaUlGfJ+u4xuTH9+U7I9NYYEuMiMtKiZBF390mHGkhgt9axhE3REqf
	0xLsXtBoZeMxwH1qikW/O+F6NVuktvJmamS18=
Received: by 10.180.14.129 with SMTP id p1mr21704793wic.8.1321203560895;
	Sun, 13 Nov 2011 08:59:20 -0800 (PST)
Received: from [192.168.1.71]
	(host86-129-245-239.range86-129.btcentralplus.com. [86.129.245.239])
	by mx.google.com with ESMTPS id z5sm10700497wix.5.2011.11.13.08.59.14
	(version=SSLv3 cipher=OTHER); Sun, 13 Nov 2011 08:59:18 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Sun, 13 Nov 2011 16:59:10 +0000
Subject: Re: [Xen-devel] Re: Regression in 3.1 causes Xen to use wrong idle
	routine
From: Keir Fraser <keir.xen@gmail.com>
To: Len Brown <lenb@kernel.org>,
	Stefan Bader <stefan.bader@canonical.com>
Message-ID: <CAE5A7DE.24C94%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] Re: Regression in 3.1 causes Xen to use wrong idle
	routine
Thread-Index: AcyiJY/78+PJplAC2Ua9c65D8jBbSg==
In-Reply-To: <CAJvTdK=yAek4sJFXUp=kQSmnuE=HpgefN5Q-GLWhMXo=LhJ-2A@mail.gmail.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: "linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 13/11/2011 03:46, "Len Brown" <lenb@kernel.org> wrote:

>> The problem I see is that select_idle_routine() is called from
>> arch/x86/kernel/cpu/common.c and since Xen setup does not set pm_idle
>> anymore, it can cause mwait_idle or amd_e400_idle functions to be selected.
>> In testing it seem amd_e400_idle in PVM domU at least does not immediately
>> cause
>> problems, but mwait_idle just causes crashes. From the reports I have
>> this may be related to older hypervisors (3.1 and older) not clearing the
>> mwait
>> capability. But overall there seems something wrong in the interaction.
> 
> Why is Xen advertising X86_FEATURE_MWAIT and then crashing
> when the dom0 (or other guests) use what it advertises?
> 
> What versions of Xen have this bug?

Xen doesn't advertise MWAIT. Possibly Xen-pv_ops is lying to the rest of the
kernel via the cpuid pv_ops hook. This would probably be because Xen is
relying on the OSPM in dom0 kernel to parse out Cx/Px info which Xen itself
*can* use.

 -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 13 09:42:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 09:42:18 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPe4P-0002DX-Og; Sun, 13 Nov 2011 09:42:17 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPe3I-0001zw-O3
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 09:41:09 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1321206065!3353584!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27753 invoked from network); 13 Nov 2011 17:41:05 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 17:41:05 -0000
X-IronPort-AV: E=Sophos;i="4.69,503,1315180800"; 
   d="scan'208";a="8901869"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Nov 2011 17:41:05 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 13 Nov 2011 17:41:05 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RPe3F-0000d0-0n;
	Sun, 13 Nov 2011 17:41:05 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RPe34-0004uM-Bz;
	Sun, 13 Nov 2011 17:40:54 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Sun, 13 Nov 2011 17:40:46 +0000
Message-ID: <1321206052-18833-1-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 0/6] IOMMU, vtd and iotlb flush rework (v7)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit

In one of my previous email I detailed a bug I was seeing when passing
through a Intel GPU on a guest that has more that 4G or RAM.

Allen suggested that I go for the Plan B but after a discussion with Tim
we agreed that Plan B was way to disruptive in term of code change.

This patch series implements Plan A.

http://xen.1045712.n5.nabble.com/VTD-Intel-iommu-IOTLB-flush-really-slow-td4952866.html

Changes between v6 and v7:
        - xenmem_add_to_physmap_once can't take a pointer on xatp because
          it modifies .idx and .gpfn.
        - Cancel hypercall continuation in the compat layer if the copy_to_guest
          failed.

Changes between v5 and v6:
       - Rework the patch queue to make it more readable.
       - Modify xatp in place in xenmem_add_to_physmap
       - Only check for preemption if we are not at the last iteration
       - Copy xatp guest handler back to the guest only in case of continuation
       - Add continuation only when dealing with the new xenmem space
         (XENMAPSPACE_gmfn_range).

Changes between v4 and v5:
       - Fix hypercall continuation for add_to_physmap in compat mode.

Changes between v3 and v4:
       - Move the loop for gmfn_range from arch_memory_op to xenmem_add_to_physmap.
       - Add a comment to comment to explain the purpose of iommu_dont_flush_iotlb.

Changes between v2 and v3:
       - Check for the presence iotlb_flush_all callback before calling it.

Changes between v1 and v2:
       - Move size in struct xen_add_to_physmap in padding between .domid and .space.
       - Store iommu_dont_flush per cpu
       - Change the code in hvmloader to relocate by batch of 64K, .size is now 16 bits.

Jean Guyader (6):
  vtd: Refactor iotlb flush code
  iommu: Introduce iommu_flush and iommu_flush_all.
  add_to_physmap: Move the code for XENMEM_add_to_physmap
  mm: New XENMEM space, XENMAPSPACE_gmfn_range
  hvmloader: Change memory relocation loop when overlap with PCI hole
  Introduce per cpu flag (iommu_dont_flush_iotlb) to avoid unnecessary
    iotlb flush

 tools/firmware/hvmloader/pci.c      |   20 ++-
 xen/arch/x86/mm.c                   |  231 ++++++++++++++++++++++-------------
 xen/arch/x86/x86_64/compat/mm.c     |   14 ++
 xen/drivers/passthrough/iommu.c     |   25 ++++
 xen/drivers/passthrough/vtd/iommu.c |  100 +++++++++-------
 xen/include/public/memory.h         |    4 +
 xen/include/xen/iommu.h             |   17 +++
 7 files changed, 279 insertions(+), 132 deletions(-)


--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Sun Nov 13 09:43:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 09:43:43 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPe5n-0002bB-Kd; Sun, 13 Nov 2011 09:43:43 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPe3J-0001zx-3A
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 09:41:09 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1321206065!3353584!2
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27756 invoked from network); 13 Nov 2011 17:41:05 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 17:41:05 -0000
X-IronPort-AV: E=Sophos;i="4.69,503,1315180800"; 
   d="scan'208";a="8901868"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Nov 2011 17:41:05 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 13 Nov 2011 17:41:05 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RPe3F-0000d2-2b;
	Sun, 13 Nov 2011 17:41:05 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RPe34-0004uQ-Nc;
	Sun, 13 Nov 2011 17:40:54 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Sun, 13 Nov 2011 17:40:48 +0000
Message-ID: <1321206052-18833-3-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1321206052-18833-2-git-send-email-jean.guyader@eu.citrix.com>
References: <1321206052-18833-1-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-2-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 2/6] iommu: Introduce iommu_flush and
	iommu_flush_all.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
Acked-by: Allen M Kay <allen.m.kay@intel.com>
---
 xen/drivers/passthrough/iommu.c     |   20 ++++++++++++++++++++
 xen/drivers/passthrough/vtd/iommu.c |   12 ++++++++++++
 xen/include/xen/iommu.h             |    5 +++++
 3 files changed, 37 insertions(+), 0 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0002-iommu-Introduce-iommu_flush-and-iommu_flush_all.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0002-iommu-Introduce-iommu_flush-and-iommu_flush_all.patch"

diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index cd6174d..ca7b37b 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -301,6 +301,26 @@ int iommu_unmap_page(struct domain *d, unsigned long gfn)
     return hd->platform_ops->unmap_page(d, gfn);
 }
 
+void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+    if ( !iommu_enabled || !hd->platform_ops || !hd->platform_ops->iotlb_flush )
+        return;
+
+    hd->platform_ops->iotlb_flush(d, gfn, page_count);
+}
+
+void iommu_iotlb_flush_all(struct domain *d)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+    if ( !iommu_enabled || !hd->platform_ops || !hd->platform_ops->iotlb_flush_all )
+        return;
+
+    hd->platform_ops->iotlb_flush_all(d);
+}
+
 /* caller should hold the pcidevs_lock */
 int deassign_device(struct domain *d, u16 seg, u8 bus, u8 devfn)
 {
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 5a5b6be..7ec9541 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -619,6 +619,16 @@ static void __intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn,
     }
 }
 
+static void intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count)
+{
+    __intel_iommu_iotlb_flush(d, gfn, 1, page_count);
+}
+
+static void intel_iommu_iotlb_flush_all(struct domain *d)
+{
+    __intel_iommu_iotlb_flush(d, 0, 0, 0);
+}
+
 /* clear one page's page table */
 static void dma_pte_clear_one(struct domain *domain, u64 addr)
 {
@@ -2329,6 +2339,8 @@ const struct iommu_ops intel_iommu_ops = {
     .resume = vtd_resume,
     .share_p2m = iommu_set_pgd,
     .crash_shutdown = vtd_crash_shutdown,
+    .iotlb_flush = intel_iommu_iotlb_flush,
+    .iotlb_flush_all = intel_iommu_iotlb_flush_all,
 };
 
 /*
diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
index 837e60d..a1034df 100644
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -139,6 +139,8 @@ struct iommu_ops {
     void (*resume)(void);
     void (*share_p2m)(struct domain *d);
     void (*crash_shutdown)(void);
+    void (*iotlb_flush)(struct domain *d, unsigned long gfn, unsigned int page_count);
+    void (*iotlb_flush_all)(struct domain *d);
 };
 
 void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value);
@@ -155,4 +157,7 @@ void iommu_share_p2m_table(struct domain *d);
 
 int iommu_do_domctl(struct xen_domctl *, XEN_GUEST_HANDLE(xen_domctl_t));
 
+void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count);
+void iommu_iotlb_flush_all(struct domain *d);
+
 #endif /* _IOMMU_H_ */

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Sun Nov 13 09:44:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 09:44:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPe6w-0002yV-J0; Sun, 13 Nov 2011 09:44:54 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPe3J-0001zy-7G
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 09:41:10 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1321206065!3353584!3
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27766 invoked from network); 13 Nov 2011 17:41:06 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 17:41:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,503,1315180800"; 
   d="scan'208";a="8901870"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Nov 2011 17:41:05 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 13 Nov 2011 17:41:05 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RPe3F-0000d1-0t;
	Sun, 13 Nov 2011 17:41:05 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RPe34-0004uO-GY;
	Sun, 13 Nov 2011 17:40:54 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Sun, 13 Nov 2011 17:40:47 +0000
Message-ID: <1321206052-18833-2-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1321206052-18833-1-git-send-email-jean.guyader@eu.citrix.com>
References: <1321206052-18833-1-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 1/6] vtd: Refactor iotlb flush code
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Factorize the iotlb flush code from map_page and unmap_page into
it's own function.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
Acked-by: Allen M Kay <allen.m.kay@intel.com>

---
 xen/drivers/passthrough/vtd/iommu.c |   86 +++++++++++++++++-----------------
 1 files changed, 43 insertions(+), 43 deletions(-)


--------------true
Content-Type: text/x-patch; name="0001-vtd-Refactor-iotlb-flush-code.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0001-vtd-Refactor-iotlb-flush-code.patch"

diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 7717ab4..5a5b6be 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -578,16 +578,53 @@ static void iommu_flush_all(void)
     }
 }
 
+static void __intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn,
+        int dma_old_pte_present, unsigned int page_count)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+    struct acpi_drhd_unit *drhd;
+    struct iommu *iommu;
+    int flush_dev_iotlb;
+    int iommu_domid;
+
+    /*
+     * No need pcideves_lock here because we have flush
+     * when assign/deassign device
+     */
+    for_each_drhd_unit ( drhd )
+    {
+        iommu = drhd->iommu;
+
+        if ( !test_bit(iommu->index, &hd->iommu_bitmap) )
+            continue;
+
+        flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
+        iommu_domid= domain_iommu_domid(d, iommu);
+        if ( iommu_domid == -1 )
+            continue;
+
+        if ( page_count > 1 || gfn == -1 )
+        {
+            if ( iommu_flush_iotlb_dsi(iommu, iommu_domid,
+                        0, flush_dev_iotlb) )
+                iommu_flush_write_buffer(iommu);
+        }
+        else
+        {
+            if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
+                        (paddr_t)gfn << PAGE_SHIFT_4K, 0,
+                        !dma_old_pte_present, flush_dev_iotlb) )
+                iommu_flush_write_buffer(iommu);
+        }
+    }
+}
+
 /* clear one page's page table */
 static void dma_pte_clear_one(struct domain *domain, u64 addr)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(domain);
-    struct acpi_drhd_unit *drhd;
-    struct iommu *iommu;
     struct dma_pte *page = NULL, *pte = NULL;
     u64 pg_maddr;
-    int flush_dev_iotlb;
-    int iommu_domid;
     struct mapped_rmrr *mrmrr;
 
     spin_lock(&hd->mapping_lock);
@@ -613,21 +650,7 @@ static void dma_pte_clear_one(struct domain *domain, u64 addr)
     spin_unlock(&hd->mapping_lock);
     iommu_flush_cache_entry(pte, sizeof(struct dma_pte));
 
-    /* No need pcidevs_lock here since do that on assign/deassign device*/
-    for_each_drhd_unit ( drhd )
-    {
-        iommu = drhd->iommu;
-        if ( test_bit(iommu->index, &hd->iommu_bitmap) )
-        {
-            flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
-            iommu_domid= domain_iommu_domid(domain, iommu);
-            if ( iommu_domid == -1 )
-                continue;
-            if ( iommu_flush_iotlb_psi(iommu, iommu_domid, addr,
-                                       0, 0, flush_dev_iotlb) )
-                iommu_flush_write_buffer(iommu);
-        }
-    }
+    __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
 
     unmap_vtd_domain_page(page);
 
@@ -1677,12 +1700,8 @@ static int intel_iommu_map_page(
     unsigned int flags)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(d);
-    struct acpi_drhd_unit *drhd;
-    struct iommu *iommu;
     struct dma_pte *page = NULL, *pte = NULL, old, new = { 0 };
     u64 pg_maddr;
-    int flush_dev_iotlb;
-    int iommu_domid;
 
     /* Do nothing if VT-d shares EPT page table */
     if ( iommu_use_hap_pt(d) )
@@ -1724,26 +1743,7 @@ static int intel_iommu_map_page(
     spin_unlock(&hd->mapping_lock);
     unmap_vtd_domain_page(page);
 
-    /*
-     * No need pcideves_lock here because we have flush
-     * when assign/deassign device
-     */
-    for_each_drhd_unit ( drhd )
-    {
-        iommu = drhd->iommu;
-
-        if ( !test_bit(iommu->index, &hd->iommu_bitmap) )
-            continue;
-
-        flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
-        iommu_domid= domain_iommu_domid(d, iommu);
-        if ( iommu_domid == -1 )
-            continue;
-        if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
-                                   (paddr_t)gfn << PAGE_SHIFT_4K, 0,
-                                   !dma_pte_present(old), flush_dev_iotlb) )
-            iommu_flush_write_buffer(iommu);
-    }
+    __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
 
     return 0;
 }

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Sun Nov 13 09:46:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 09:46:07 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPe87-0003MP-Gb; Sun, 13 Nov 2011 09:46:07 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPe3J-000202-Q4
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 09:41:10 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1321206065!3353584!7
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27819 invoked from network); 13 Nov 2011 17:41:06 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 17:41:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,503,1315180800"; 
   d="scan'208";a="8901874"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Nov 2011 17:41:06 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 13 Nov 2011 17:41:05 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RPe3F-0000dF-Kf;
	Sun, 13 Nov 2011 17:41:05 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RPe35-0004ub-BI;
	Sun, 13 Nov 2011 17:40:55 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Sun, 13 Nov 2011 17:40:51 +0000
Message-ID: <1321206052-18833-6-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1321206052-18833-5-git-send-email-jean.guyader@eu.citrix.com>
References: <1321206052-18833-1-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-2-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-3-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-4-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-5-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 5/6] hvmloader: Change memory relocation loop
	when overlap with PCI hole
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Change the way we relocate the memory page if they overlap with pci hole.
Use new map space (XENMAPSPACE_gmfn_range) to move the loop into xen.

This code usually get triggered when a device is pass through to a guest
and the PCI hole has to be extended to have enough room to map the device BARs.
The PCI hole will starts lower and it might overlap with some RAM that has been
alocated for the guest. That usually happen if the guest has more than 4G of RAM.
We have to relocate those pages in high mem otherwise they won't be accessible.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 tools/firmware/hvmloader/pci.c |   20 ++++++++++++++------
 1 files changed, 14 insertions(+), 6 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0005-hvmloader-Change-memory-relocation-loop-when-overlap.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0005-hvmloader-Change-memory-relocation-loop-when-overlap.patch"

diff --git a/tools/firmware/hvmloader/pci.c b/tools/firmware/hvmloader/pci.c
index 29ec011..62aeff2 100644
--- a/tools/firmware/hvmloader/pci.c
+++ b/tools/firmware/hvmloader/pci.c
@@ -50,6 +50,7 @@ void pci_setup(void)
         uint32_t devfn, bar_reg, bar_sz;
     } *bars = (struct bars *)scratch_start;
     unsigned int i, nr_bars = 0;
+    unsigned long pci_mem_reloc_pg;
 
     /* Program PCI-ISA bridge with appropriate link routes. */
     isa_irq = 0;
@@ -185,18 +186,25 @@ void pci_setup(void)
             ((pci_mem_start << 1) != 0) )
         pci_mem_start <<= 1;
 
-    while ( (pci_mem_start >> PAGE_SHIFT) < hvm_info->low_mem_pgend )
+    /* Relocate RAM that overlaps (in 64K chunks) */
+    pci_mem_reloc_pg = (pci_mem_start >> PAGE_SHIFT);
+    while (pci_mem_reloc_pg < hvm_info->low_mem_pgend)
     {
         struct xen_add_to_physmap xatp;
-        if ( hvm_info->high_mem_pgend == 0 )
-            hvm_info->high_mem_pgend = 1ull << (32 - PAGE_SHIFT);
+        unsigned int size = hvm_info->low_mem_pgend - pci_mem_reloc_pg;
         xatp.domid = DOMID_SELF;
-        xatp.space = XENMAPSPACE_gmfn;
-        xatp.idx   = --hvm_info->low_mem_pgend;
-        xatp.gpfn  = hvm_info->high_mem_pgend++;
+        xatp.space = XENMAPSPACE_gmfn_range;
+        xatp.idx = pci_mem_reloc_pg;
+        xatp.gpfn = hvm_info->high_mem_pgend;
+        size = size > ((1 << 16) - 1) ? ((1 << 16) - 1) : size;
+        xatp.size = size;
+
         if ( hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0 )
             BUG();
+        pci_mem_reloc_pg += size;
+        hvm_info->high_mem_pgend += size;
     }
+    hvm_info->low_mem_pgend = pci_mem_start >> PAGE_SHIFT;
 
     mem_resource.base = pci_mem_start;
     mem_resource.max = pci_mem_end;

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Sun Nov 13 09:47:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 09:47:08 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPe95-0003jq-W6; Sun, 13 Nov 2011 09:47:08 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPe3J-000201-Oh
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 09:41:10 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1321206065!3353584!6
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27808 invoked from network); 13 Nov 2011 17:41:06 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 17:41:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,503,1315180800"; 
   d="scan'208";a="8901873"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Nov 2011 17:41:06 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 13 Nov 2011 17:41:05 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RPe3F-0000dI-Og;
	Sun, 13 Nov 2011 17:41:05 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RPe35-0004ue-Hx;
	Sun, 13 Nov 2011 17:40:55 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Sun, 13 Nov 2011 17:40:52 +0000
Message-ID: <1321206052-18833-7-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1321206052-18833-6-git-send-email-jean.guyader@eu.citrix.com>
References: <1321206052-18833-1-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-2-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-3-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-4-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-5-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-6-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 6/6] Introduce per cpu flag
	(iommu_dont_flush_iotlb) to avoid unnecessary iotlb flush
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Add cpu flag that will be checked by the iommu low level code
to skip iotlb flushes. iommu_iotlb_flush shall be called explicitly.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c                   |   12 ++++++++++++
 xen/drivers/passthrough/iommu.c     |    5 +++++
 xen/drivers/passthrough/vtd/iommu.c |    6 ++++--
 xen/include/xen/iommu.h             |   12 ++++++++++++
 4 files changed, 33 insertions(+), 2 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0006-Introduce-per-cpu-flag-iommu_dont_flush_iotlb-to-avo.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0006-Introduce-per-cpu-flag-iommu_dont_flush_iotlb-to-avo.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 126f5b6..08529a2 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4695,10 +4695,15 @@ static int xenmem_add_to_physmap_once(struct domain *d,
 static int xenmem_add_to_physmap(struct domain *d,
                                  struct xen_add_to_physmap *xatp)
 {
+    struct xen_add_to_physmap start_xatp;
     int rc = 0;
 
     if ( xatp->space == XENMAPSPACE_gmfn_range )
     {
+        if ( need_iommu(d) )
+            this_cpu(iommu_dont_flush_iotlb) = 1;
+
+        start_xatp = *xatp;
         while ( xatp->size > 0 )
         {
             rc = xenmem_add_to_physmap_once(d, *xatp);
@@ -4717,6 +4722,13 @@ static int xenmem_add_to_physmap(struct domain *d,
             }
         }
 
+        if ( need_iommu(d) )
+        {
+            this_cpu(iommu_dont_flush_iotlb) = 0;
+            iommu_iotlb_flush(d, start_xatp.idx, start_xatp.size - xatp->size);
+            iommu_iotlb_flush(d, start_xatp.gpfn, start_xatp.size - xatp->size);
+        }
+
         return rc;
     }
 
diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index ca7b37b..bacca11 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -52,6 +52,8 @@ bool_t __read_mostly iommu_hap_pt_share = 1;
 bool_t __read_mostly iommu_debug;
 bool_t __read_mostly amd_iommu_perdev_intremap;
 
+DEFINE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
+
 static void __init parse_iommu_param(char *s)
 {
     char *ss;
@@ -227,6 +229,7 @@ static int iommu_populate_page_table(struct domain *d)
 
     spin_lock(&d->page_alloc_lock);
 
+    this_cpu(iommu_dont_flush_iotlb) = 1;
     page_list_for_each ( page, &d->page_list )
     {
         if ( is_hvm_domain(d) ||
@@ -244,6 +247,8 @@ static int iommu_populate_page_table(struct domain *d)
             }
         }
     }
+    this_cpu(iommu_dont_flush_iotlb) = 0;
+    iommu_iotlb_flush_all(d);
     spin_unlock(&d->page_alloc_lock);
     return 0;
 }
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 7ec9541..a3dd018 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -660,7 +660,8 @@ static void dma_pte_clear_one(struct domain *domain, u64 addr)
     spin_unlock(&hd->mapping_lock);
     iommu_flush_cache_entry(pte, sizeof(struct dma_pte));
 
-    __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
+    if ( !this_cpu(iommu_dont_flush_iotlb) )
+        __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
 
     unmap_vtd_domain_page(page);
 
@@ -1753,7 +1754,8 @@ static int intel_iommu_map_page(
     spin_unlock(&hd->mapping_lock);
     unmap_vtd_domain_page(page);
 
-    __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
+    if ( !this_cpu(iommu_dont_flush_iotlb) )
+        __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
 
     return 0;
 }
diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
index a1034df..6f7fbf7 100644
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -160,4 +160,16 @@ int iommu_do_domctl(struct xen_domctl *, XEN_GUEST_HANDLE(xen_domctl_t));
 void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count);
 void iommu_iotlb_flush_all(struct domain *d);
 
+/*
+ * The purpose of the iommu_dont_flush_iotlb optional cpu flag is to
+ * avoid unecessary iotlb_flush in the low level IOMMU code.
+ *
+ * iommu_map_page/iommu_unmap_page must flush the iotlb but somethimes
+ * this operation can be really expensive. This flag will be set by the
+ * caller to notify the low level IOMMU code to avoid the iotlb flushes.
+ * iommu_iotlb_flush/iommu_iotlb_flush_all will be explicitly called by
+ * the caller.
+ */
+DECLARE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
+
 #endif /* _IOMMU_H_ */

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Sun Nov 13 09:48:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 09:48:12 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPeA8-00047K-0N; Sun, 13 Nov 2011 09:48:12 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPe3J-000200-Ju
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 09:41:10 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1321206065!3353584!5
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27799 invoked from network); 13 Nov 2011 17:41:06 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 17:41:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,503,1315180800"; 
   d="scan'208";a="8901872"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Nov 2011 17:41:05 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 13 Nov 2011 17:41:05 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RPe3F-0000dC-Dz;
	Sun, 13 Nov 2011 17:41:05 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RPe35-0004uY-7i;
	Sun, 13 Nov 2011 17:40:55 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Sun, 13 Nov 2011 17:40:50 +0000
Message-ID: <1321206052-18833-5-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1321206052-18833-4-git-send-email-jean.guyader@eu.citrix.com>
References: <1321206052-18833-1-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-2-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-3-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-4-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] 
	[PATCH 4/6] mm: New XENMEM space, XENMAPSPACE_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


XENMAPSPACE_gmfn_range is like XENMAPSPACE_gmfn but it runs on
a range of pages. The size of the range is defined in a new field.

This new field .size is located in the 16 bits padding between .domid
and .space in struct xen_add_to_physmap to stay compatible with older
versions.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c               |   48 ++++++++++++++++++++++++++++++++++++--
 xen/arch/x86/x86_64/compat/mm.c |   14 +++++++++++
 xen/include/public/memory.h     |    4 +++
 3 files changed, 63 insertions(+), 3 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0004-mm-New-XENMEM-space-XENMAPSPACE_gmfn_range.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0004-mm-New-XENMEM-space-XENMAPSPACE_gmfn_range.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 7cbbb07..126f5b6 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4592,8 +4592,8 @@ static int handle_iomem_range(unsigned long s, unsigned long e, void *p)
     return 0;
 }
 
-static int xenmem_add_to_physmap(struct domain *d,
-                                 struct xen_add_to_physmap xatp)
+static int xenmem_add_to_physmap_once(struct domain *d,
+                                      struct xen_add_to_physmap xatp)
 {
     struct page_info* page = NULL;
     unsigned long mfn = 0;
@@ -4631,6 +4631,7 @@ static int xenmem_add_to_physmap(struct domain *d,
 
         spin_unlock(&d->grant_table->lock);
         break;
+    case XENMAPSPACE_gmfn_range:
     case XENMAPSPACE_gmfn:
     {
         p2m_type_t p2mt;
@@ -4691,6 +4692,37 @@ static int xenmem_add_to_physmap(struct domain *d,
     return rc;
 }
 
+static int xenmem_add_to_physmap(struct domain *d,
+                                 struct xen_add_to_physmap *xatp)
+{
+    int rc = 0;
+
+    if ( xatp->space == XENMAPSPACE_gmfn_range )
+    {
+        while ( xatp->size > 0 )
+        {
+            rc = xenmem_add_to_physmap_once(d, *xatp);
+            if ( rc < 0 )
+                return rc;
+
+            xatp->idx++;
+            xatp->gpfn++;
+            xatp->size--;
+
+            /* Check for continuation if it's not the last interation */
+            if ( xatp->size > 0 && hypercall_preempt_check() )
+            {
+                rc = -EAGAIN;
+                break;
+            }
+        }
+
+        return rc;
+    }
+
+    return xenmem_add_to_physmap_once(d, *xatp);
+}
+
 long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
 {
     int rc;
@@ -4715,10 +4747,20 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
             return -EPERM;
         }
 
-        rc = xenmem_add_to_physmap(d, xatp);
+        rc = xenmem_add_to_physmap(d, &xatp);
 
         rcu_unlock_domain(d);
 
+        if ( rc )
+        {
+            if ( copy_to_guest(arg, &xatp, 1) )
+                return -EFAULT;
+        }
+
+        if ( rc == -EAGAIN )
+            rc = hypercall_create_continuation(
+                    __HYPERVISOR_memory_op, "ih", op, arg);
+
         return rc;
     }
 
diff --git a/xen/arch/x86/x86_64/compat/mm.c b/xen/arch/x86/x86_64/compat/mm.c
index 3ef08a5..2644770 100644
--- a/xen/arch/x86/x86_64/compat/mm.c
+++ b/xen/arch/x86/x86_64/compat/mm.c
@@ -63,6 +63,20 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
 
         XLAT_add_to_physmap(nat, &cmp);
         rc = arch_memory_op(op, guest_handle_from_ptr(nat, void));
+        if ( rc )
+        {
+            XLAT_add_to_physmap(&cmp, nat);
+            if ( copy_to_guest(arg, &cmp, 1) )
+            {
+                hypercall_cancel_continuation();
+                return -EFAULT;
+            }
+        }
+        if ( rc < 0 )
+            break;
+
+        if ( rc == __HYPERVISOR_memory_op )
+            hypercall_xlat_continuation(NULL, 0x2, nat, arg);
 
         break;
     }
diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h
index 08355e3..c5b78a8 100644
--- a/xen/include/public/memory.h
+++ b/xen/include/public/memory.h
@@ -208,10 +208,14 @@ struct xen_add_to_physmap {
     /* Which domain to change the mapping for. */
     domid_t domid;
 
+    /* Number of pages to go through for gmfn_range */
+    uint16_t    size;
+
     /* Source mapping space. */
 #define XENMAPSPACE_shared_info 0 /* shared info page */
 #define XENMAPSPACE_grant_table 1 /* grant table page */
 #define XENMAPSPACE_gmfn        2 /* GMFN */
+#define XENMAPSPACE_gmfn_range  3 /* GMFN range */
     unsigned int space;
 
 #define XENMAPIDX_grant_table_status 0x80000000

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Sun Nov 13 09:49:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 09:49:08 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPeB2-0004U5-0n; Sun, 13 Nov 2011 09:49:08 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPe3J-0001zz-Gh
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 09:41:10 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1321206065!3353584!4
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27789 invoked from network); 13 Nov 2011 17:41:06 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 17:41:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,503,1315180800"; 
   d="scan'208";a="8901871"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Nov 2011 17:41:05 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 13 Nov 2011 17:41:05 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RPe3F-0000d9-AP;
	Sun, 13 Nov 2011 17:41:05 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RPe34-0004uU-WA;
	Sun, 13 Nov 2011 17:40:55 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Sun, 13 Nov 2011 17:40:49 +0000
Message-ID: <1321206052-18833-4-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1321206052-18833-3-git-send-email-jean.guyader@eu.citrix.com>
References: <1321206052-18833-1-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-2-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-3-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 3/6] add_to_physmap: Move the code for
	XENMEM_add_to_physmap
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Move the code for the XENMEM_add_to_physmap case into it's own
function (xenmem_add_to_physmap).

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c |  189 ++++++++++++++++++++++++++++-------------------------
 1 files changed, 100 insertions(+), 89 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0003-add_to_physmap-Move-the-code-for-XENMEM_add_to_physm.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0003-add_to_physmap-Move-the-code-for-XENMEM_add_to_physm.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index acc1f34..7cbbb07 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4592,9 +4592,107 @@ static int handle_iomem_range(unsigned long s, unsigned long e, void *p)
     return 0;
 }
 
+static int xenmem_add_to_physmap(struct domain *d,
+                                 struct xen_add_to_physmap xatp)
+{
+    struct page_info* page = NULL;
+    unsigned long mfn = 0;
+    unsigned long prev_mfn, gpfn;
+    int rc;
+
+    switch ( xatp.space )
+    {
+    case XENMAPSPACE_shared_info:
+        if ( xatp.idx == 0 )
+            mfn = virt_to_mfn(d->shared_info);
+        break;
+    case XENMAPSPACE_grant_table:
+        spin_lock(&d->grant_table->lock);
+
+        if ( d->grant_table->gt_version == 0 )
+            d->grant_table->gt_version = 1;
+
+        if ( d->grant_table->gt_version == 2 &&
+             (xatp.idx & XENMAPIDX_grant_table_status) )
+        {
+            xatp.idx &= ~XENMAPIDX_grant_table_status;
+            if ( xatp.idx < nr_status_frames(d->grant_table) )
+                mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
+        }
+        else
+        {
+            if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
+                 (xatp.idx < max_nr_grant_frames) )
+                gnttab_grow_table(d, xatp.idx + 1);
+
+            if ( xatp.idx < nr_grant_frames(d->grant_table) )
+                mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
+        }
+
+        spin_unlock(&d->grant_table->lock);
+        break;
+    case XENMAPSPACE_gmfn:
+    {
+        p2m_type_t p2mt;
+
+        xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
+        /* If the page is still shared, exit early */
+        if ( p2m_is_shared(p2mt) )
+        {
+            rcu_unlock_domain(d);
+            return -ENOMEM;
+        }
+        if ( !get_page_from_pagenr(xatp.idx, d) )
+            break;
+        mfn = xatp.idx;
+        page = mfn_to_page(mfn);
+        break;
+    }
+    default:
+        break;
+    }
+
+    if ( !paging_mode_translate(d) || (mfn == 0) )
+    {
+        if ( page )
+            put_page(page);
+        rcu_unlock_domain(d);
+        return -EINVAL;
+    }
+
+    domain_lock(d);
+
+    if ( page )
+        put_page(page);
+
+    /* Remove previously mapped page if it was present. */
+    prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
+    if ( mfn_valid(prev_mfn) )
+    {
+        if ( is_xen_heap_mfn(prev_mfn) )
+            /* Xen heap frames are simply unhooked from this phys slot. */
+            guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
+        else
+            /* Normal domain memory is freed, to avoid leaking memory. */
+            guest_remove_page(d, xatp.gpfn);
+    }
+
+    /* Unmap from old location, if any. */
+    gpfn = get_gpfn_from_mfn(mfn);
+    ASSERT( gpfn != SHARED_M2P_ENTRY );
+    if ( gpfn != INVALID_M2P_ENTRY )
+        guest_physmap_remove_page(d, gpfn, mfn, 0);
+
+    /* Map at new location. */
+    rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
+
+    domain_unlock(d);
+
+    return rc;
+}
+
 long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
 {
-    struct page_info *page = NULL;
     int rc;
 
     switch ( op )
@@ -4602,7 +4700,6 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
     case XENMEM_add_to_physmap:
     {
         struct xen_add_to_physmap xatp;
-        unsigned long prev_mfn, mfn = 0, gpfn;
         struct domain *d;
 
         if ( copy_from_guest(&xatp, arg, 1) )
@@ -4618,93 +4715,7 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
             return -EPERM;
         }
 
-        switch ( xatp.space )
-        {
-        case XENMAPSPACE_shared_info:
-            if ( xatp.idx == 0 )
-                mfn = virt_to_mfn(d->shared_info);
-            break;
-        case XENMAPSPACE_grant_table:
-            spin_lock(&d->grant_table->lock);
-
-            if ( d->grant_table->gt_version == 0 )
-                d->grant_table->gt_version = 1;
-
-            if ( d->grant_table->gt_version == 2 &&
-                 (xatp.idx & XENMAPIDX_grant_table_status) )
-            {
-                xatp.idx &= ~XENMAPIDX_grant_table_status;
-                if ( xatp.idx < nr_status_frames(d->grant_table) )
-                    mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
-            }
-            else
-            {
-                if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
-                     (xatp.idx < max_nr_grant_frames) )
-                    gnttab_grow_table(d, xatp.idx + 1);
-
-                if ( xatp.idx < nr_grant_frames(d->grant_table) )
-                    mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
-            }
-
-            spin_unlock(&d->grant_table->lock);
-            break;
-        case XENMAPSPACE_gmfn:
-        {
-            p2m_type_t p2mt;
-
-            xatp.idx = mfn_x(gfn_to_mfn_unshare(d, xatp.idx, &p2mt));
-            /* If the page is still shared, exit early */
-            if ( p2m_is_shared(p2mt) )
-            {
-                rcu_unlock_domain(d);
-                return -ENOMEM;
-            }
-            if ( !get_page_from_pagenr(xatp.idx, d) )
-                break;
-            mfn = xatp.idx;
-            page = mfn_to_page(mfn);
-            break;
-        }
-        default:
-            break;
-        }
-
-        if ( !paging_mode_translate(d) || (mfn == 0) )
-        {
-            if ( page )
-                put_page(page);
-            rcu_unlock_domain(d);
-            return -EINVAL;
-        }
-
-        domain_lock(d);
-
-        if ( page )
-            put_page(page);
-
-        /* Remove previously mapped page if it was present. */
-        prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
-        if ( mfn_valid(prev_mfn) )
-        {
-            if ( is_xen_heap_mfn(prev_mfn) )
-                /* Xen heap frames are simply unhooked from this phys slot. */
-                guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
-            else
-                /* Normal domain memory is freed, to avoid leaking memory. */
-                guest_remove_page(d, xatp.gpfn);
-        }
-
-        /* Unmap from old location, if any. */
-        gpfn = get_gpfn_from_mfn(mfn);
-        ASSERT( gpfn != SHARED_M2P_ENTRY );
-        if ( gpfn != INVALID_M2P_ENTRY )
-            guest_physmap_remove_page(d, gpfn, mfn, 0);
-
-        /* Map at new location. */
-        rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
-
-        domain_unlock(d);
+        rc = xenmem_add_to_physmap(d, xatp);
 
         rcu_unlock_domain(d);
 

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Sun Nov 13 10:48:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 10:48:17 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPf6G-0006jG-R9; Sun, 13 Nov 2011 10:48:16 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPf5L-0006Wj-4z
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 10:47:19 -0800
X-Env-Sender: jonathanjstevens@gmail.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1321210035!1373851!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19589 invoked from network); 13 Nov 2011 18:47:16 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-7.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 18:47:16 -0000
Received: by vcbfk13 with SMTP id fk13so6871881vcb.30
	for <xen-devel@lists.xensource.com>;
	Sun, 13 Nov 2011 10:47:14 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:content-type:content-transfer-encoding;
	bh=OVW2frFrAIxRv4WSvA0LzZ1Ml6GjE2rHwH+cdJaCd8Q=;
	b=rlZOw+NWklPS294BmmOKlo7jqGNm5D09CLhopXavswlGfGQ0InFuTb1NgUXEdqL/i7
	209B3S+PdNTONsM9ANo6dBk7Hhq1cAAYlUpXiVhiyOM3reo2F444RxJsIYhOWQwzHfWk
	PePnFrAgT+yqDN7OQbNNm0EW6LJQi24WCk8vo=
MIME-Version: 1.0
Received: by 10.52.89.3 with SMTP id bk3mr4779052vdb.92.1321210034688; Sun, 13
	Nov 2011 10:47:14 -0800 (PST)
Received: by 10.220.187.13 with HTTP; Sun, 13 Nov 2011 10:47:14 -0800 (PST)
In-Reply-To: <CAA7M+FD1mis7C1+cU0eCYZHhu96-B-g7_73FjC430fo4CHohvQ@mail.gmail.com>
References: <CAA7M+FD1mis7C1+cU0eCYZHhu96-B-g7_73FjC430fo4CHohvQ@mail.gmail.com>
Date: Sun, 13 Nov 2011 18:47:14 +0000
Message-ID: <CAA7M+FBP1SAa2cn9Rfsdcde=ruKekq+tVP1Jnj17RK6qrgvfNw@mail.gmail.com>
From: "jonathanjstevens@gmail.com" <jonathanjstevens@gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Subject: [Xen-devel] HVR-4000 DVB can't scan or tune (properly) with Xen
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

I've come across and issue and I think it may be Xen related. Hoping
you can help.

I'm trying to use a couple of HVR-4000 with my Xen server.

I'm running Fedora 16:

Linux mythtvtuner.home 3.1.0-7.fc16.x86_64 #1 SMP Tue Nov 1 21:10:48
UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

and the current packaged Xen is:

(XEN) Xen version 4.1.2 (mockbuild@phx2.fedoraproject.org) (gcc
version 4.6.1 20111003 (Red Hat 4.6.1-10) (GCC) ) Fri Oct 21 21:56:01
UTC 2011

When I boot without Xen the DVB PCI cards can tune and scan perfectly.
I also have a USB DVB unit, which can tune and scan regardless of
whether Xen is running. However when I try to scan and tune with the
PCI DVB cards it fails.

>From what I can tell the symptoms are exactly the same as in:

http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=3D1786

I get the same "filter timeout" messages, and I also see similar
messages in dmesg

[ =A0 26.572693] cx88[1]/1: IRQ loop detected, disabling interrupts
[ =A0 26.574810] cx88[1]: irq aud [0x1001] dn_risci1* dn_sync*

I'm running a higher kernel than in the bug resolution though.

Any help appreciated!

Regards,
Jon

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 13 11:03:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 11:03:08 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPfKe-0007NW-8H; Sun, 13 Nov 2011 11:03:08 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPfHx-00078i-C3
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 11:00:37 -0800
X-Env-Sender: giamteckchoon@gmail.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1321210816!2939415!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8392 invoked from network); 13 Nov 2011 19:00:17 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 19:00:17 -0000
Received: by pzk6 with SMTP id 6so9193543pzk.8
	for <xen-devel@lists.xensource.com>;
	Sun, 13 Nov 2011 11:00:15 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=zGqpiGdVXNHacYsUUX1fSmF4iDqKUulO+BAdIvAPg4o=;
	b=c2Zxh1AuBlGdVokGmzhQLKcP9gegcLGy/VQsQ7hAnicNWE67wOM5sXQW7zl8YdhG6+
	hp3/M5ek5YqVGAfVrs4l539Me7sKcSwcr1OHMAw4snQs2eI+2Pplq0nLsOfoWoiYqAzl
	1u+pVd5CeURKjJNG5fLhsGBEMnmo7id79b/kc=
MIME-Version: 1.0
Received: by 10.68.5.136 with SMTP id s8mr33287320pbs.10.1321210815264; Sun,
	13 Nov 2011 11:00:15 -0800 (PST)
Received: by 10.68.58.233 with HTTP; Sun, 13 Nov 2011 11:00:15 -0800 (PST)
Date: Mon, 14 Nov 2011 03:00:15 +0800
Message-ID: <CAEwRVpOHeBXnjDQ8KSXeGxOTyFNh+kD_001KkRqOEszkuBt_TA@mail.gmail.com>
From: Teck Choon Giam <giamteckchoon@gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1
Subject: [Xen-devel] kernel messages: alignment check: 0000 [#1] SMP
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi,

This is just to report about the "alignment check: 0000 [#1] SMP"
kernel messages in one of my build system (domU) running Scientific
Linux 6.1.

I am compiling/rpm package for sbcl (http://sbcl.sourceforge.net/) in
my build system (domU) and hit the following kernel messages although
the domU in question still running and compilation still in progress.
I have done some searching about this and it is all related to domU
kernels 2.6.32 such as:

http://kerneltrap.org/mailarchive/reiserfs-devel/2010/12/18/6881520
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=633535
http://xen.1045712.n5.nabble.com/Alignment-check-on-domU-2-6-32-td2549903.html
http://xen.1045712.n5.nabble.com/Kernel-panic-with-2-6-32-30-under-network-activity-td3423149.html

Kernel messages:

derefnull[15862]: segfault at 0 ip 000000000804c2eb sp
00000000ffb4dfac error 4 in derefnull[8048000+57000]
divbyzero[15899] trap divide error ip:804d0be sp:ff849e9c error:0 in
divbyzero[8048000+56000]
derefnull[7328]: segfault at 0 ip 0000000000407701 sp 00007fff943b1c60
error 4 in derefnull[400000+77000]
divbyzero[7345] trap divide error ip:408d05 sp:7fff35784750 error:0 in
divbyzero[400000+76000]
derefnull[32738]: segfault at 0 ip 000000000804c2eb sp
00000000ffbdbebc error 4 in derefnull[8048000+57000]
divbyzero[32755] trap divide error ip:804d0be sp:ffc0f53c error:0 in
divbyzero[8048000+56000]
derefnull[18732]: segfault at 0 ip 0000000000407701 sp
00007fffec69eb30 error 4 in derefnull[400000+77000]
divbyzero[18841] trap divide error ip:408d05 sp:7fffed159ae0 error:0
in divbyzero[400000+76000]
derefnull[10813]: segfault at 0 ip 000000000804c2eb sp
00000000ffc17dec error 4 in derefnull[8048000+57000]
divbyzero[10827] trap divide error ip:804d0be sp:ffdb347c error:0 in
divbyzero[8048000+56000]
derefnull[27073]: segfault at 0 ip 0000000000407701 sp
00007fff37c6ba00 error 4 in derefnull[400000+77000]
divbyzero[27087] trap divide error ip:408d05 sp:7fffc93d8ab0 error:0
in divbyzero[400000+76000]
derefnull[11819]: segfault at 0 ip 000000000804c2eb sp
00000000ffbb9edc error 4 in derefnull[8048000+57000]
divbyzero[11833] trap divide error ip:804d0be sp:ff9c5a1c error:0 in
divbyzero[8048000+56000]
derefnull[28080]: segfault at 0 ip 0000000000407701 sp
00007fff5d3045d0 error 4 in derefnull[400000+77000]
divbyzero[28094] trap divide error ip:408d05 sp:7fff6369ca90 error:0
in divbyzero[400000+76000]
derefnull[22199]: segfault at 0 ip 000000000804c2eb sp
00000000ffa5f64c error 4 in derefnull[8048000+57000]
divbyzero[22213] trap divide error ip:804d0be sp:ffb2c92c error:0 in
divbyzero[8048000+56000]
derefnull[11755]: segfault at 0 ip 0000000000407701 sp
00007fffe0a4a070 error 4 in derefnull[400000+77000]
divbyzero[11768] trap divide error ip:408d05 sp:7fffaac47410 error:0
in divbyzero[400000+76000]
derefnull[3492]: segfault at 0 ip 000000000804c2eb sp 00000000ff9b0a9c
error 4 in derefnull[8048000+57000]
divbyzero[3506] trap divide error ip:804d0be sp:ffb387ac error:0 in
divbyzero[8048000+56000]
derefnull[25591]: segfault at 0 ip 0000000000407701 sp
00007fffc5e82060 error 4 in derefnull[400000+77000]
divbyzero[25607] trap divide error ip:408d05 sp:7ffff3882660 error:0
in divbyzero[400000+76000]
alignment check: 0000 [#1] SMP
last sysfs file: /sys/devices/system/cpu/cpu7/cache/index2/shared_cpu_map
CPU 7
Modules linked in: ipv6 dm_mirror dm_region_hash dm_log microcode
rtc_core rtc_lib pcspkr ext3 jbd dm_mod [last unloaded:
scsi_wait_scan]
Pid: 4002, comm: sbcl Not tainted 2.6.32.47-0.choon.sl6 #1
RIP: e030:[<ffffffff810179ff>]  [<ffffffff810179ff>]
convert_from_fxsr+0x11f/0x13d
RSP: e02b:ffff8800a8301cb8  EFLAGS: 00050246
RAX: ffff8800a8301d44 RBX: ffff8800a8301cf4 RCX: 0000000000000010
RDX: 0000000000000000 RSI: ffff8800a85c0300 RDI: ffff8800a8301cd8
RBP: ffff8800a8301cc8 R08: 000000000000c000 R09: 00000000ffffffff
R10: 0000000000000000 R11: ffff8801fdd31620 R12: ffff8801fdd31600
R13: ffff8800a8301cd8 R14: ffff8800a8301e48 R15: 0000000000000000
FS:  00007f4726298700(000f) GS:ffff880028113000(0063) knlGS:0000000000000000
CS:  e033 DS: 002b ES: 002b CR0: 000000008005003b
CR2: 00000000f7f15160 CR3: 00000000034d8000 CR4: 0000000000002660
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Process sbcl (pid: 4002, threadinfo ffff8800a8300000, task ffff8800a85c0300)
Stack:
 00000000f78b0224 ffff8801fdd31600 ffff8800a8301d68 ffffffff81017a4c
<0> ffff4020ffff0372 0af373e9ffffffff 0af951cc0000e033 000000000000002b
<0> ffff8800a8301f58 000000008005023b 0000000000000001 ffff88002811e0a0
Call Trace:
 [<ffffffff81017a4c>] save_i387_fxsave+0x2f/0x97
 [<ffffffff8100e57f>] ? xen_restore_fl_direct_end+0x0/0x1
 [<ffffffff8100b6cf>] ? xen_write_cr0+0x81/0x88
 [<ffffffff81017bf2>] save_i387_xstate_ia32+0x13e/0x147
 [<ffffffff81035e3b>] get_sigframe+0x8c/0xc4
 [<ffffffff81035eb0>] ia32_setup_rt_frame+0x3d/0x240
 [<ffffffff810100a7>] do_signal+0x16c/0x6b1
 [<ffffffff81034e8b>] ? sys32_clone+0x21/0x23
 [<ffffffff81034cf5>] ? ia32_ptregs_common+0x25/0x4c
 [<ffffffff81010613>] do_notify_resume+0x27/0x5f
 [<ffffffff81043e36>] ? schedule_tail+0x25/0x9c
 [<ffffffff81010d4e>] int_signal+0x12/0x17
Code: 89 47 18 8c c8 eb 1a 0f b7 86 aa 04 00 00 48 8b 96 90 04 00 00
0d 00 00 ff ff 89 47 18 48 8b 42 e0 89 47 10 48 8d 43 50 49 8b 13 <48>
89 13 66 41 8b 53 08 49 83 c3 10 66 89 53 08 48 83 c3 0a 48
RIP  [<ffffffff810179ff>] convert_from_fxsr+0x11f/0x13d
 RSP <ffff8800a8301cb8>
---[ end trace e838aa5ff4269c0b ]---

Another one happened while I am composing this email report:

alignment check: 0000 [#2] SMP
last sysfs file: /sys/devices/system/cpu/cpu7/cache/index2/shared_cpu_map
CPU 3
Modules linked in: ipv6 dm_mirror dm_region_hash dm_log microcode
rtc_core rtc_lib pcspkr ext3 jbd dm_mod [last unloaded:
scsi_wait_scan]
Pid: 23364, comm: sbcl Tainted: G      D    2.6.32.47-0.choon.sl6 #1
RIP: e030:[<ffffffff810179ff>]  [<ffffffff810179ff>]
convert_from_fxsr+0x11f/0x13d
RSP: e02b:ffff880003741cb8  EFLAGS: 00050246
RAX: ffff880003741d44 RBX: ffff880003741cf4 RCX: 0000000000000010
RDX: 0000000000000000 RSI: ffff8800a81dc600 RDI: ffff880003741cd8
RBP: ffff880003741cc8 R08: 000000000000c000 R09: 00000000ffffffff
R10: 0000000000000000 R11: ffff8801a6b77820 R12: ffff8801a6b77800
R13: ffff880003741cd8 R14: ffff880003741e48 R15: 0000000000000000
FS:  00007f944b6997a0(000f) GS:ffff8800280a3000(0063) knlGS:0000000000000000
CS:  e033 DS: 002b ES: 002b CR0: 000000008005003b
CR2: 00000000f7f1a380 CR3: 00000001d0d1f000 CR4: 0000000000002660
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Process sbcl (pid: 23364, threadinfo ffff880003740000, task ffff8800a81dc600)
Stack:
 00000000f78b4224 ffff8801a6b77800 ffff880003741d68 ffffffff81017a4c
<0> ffff4020ffff0372 0af373e9ffffffff 0af951cc0000e033 000000000000002b
<0> ffff880003741f58 000000008005023b 0000000000000001 ffff8800280ae0a0
Call Trace:
 [<ffffffff81017a4c>] save_i387_fxsave+0x2f/0x97
 [<ffffffff8100e57f>] ? xen_restore_fl_direct_end+0x0/0x1
 [<ffffffff8100b6cf>] ? xen_write_cr0+0x81/0x88
 [<ffffffff81017bf2>] save_i387_xstate_ia32+0x13e/0x147
 [<ffffffff81035e3b>] get_sigframe+0x8c/0xc4
 [<ffffffff81035eb0>] ia32_setup_rt_frame+0x3d/0x240
 [<ffffffff810100a7>] do_signal+0x16c/0x6b1
 [<ffffffff81034e8b>] ? sys32_clone+0x21/0x23
 [<ffffffff81034cf5>] ? ia32_ptregs_common+0x25/0x4c
 [<ffffffff81010613>] do_notify_resume+0x27/0x5f
 [<ffffffff81043e36>] ? schedule_tail+0x25/0x9c
 [<ffffffff81010d4e>] int_signal+0x12/0x17
Code: 89 47 18 8c c8 eb 1a 0f b7 86 aa 04 00 00 48 8b 96 90 04 00 00
0d 00 00 ff ff 89 47 18 48 8b 42 e0 89 47 10 48 8d 43 50 49 8b 13 <48>
89 13 66 41 8b 53 08 49 83 c3 10 66 89 53 08 48 83 c3 0a 48
RIP  [<ffffffff810179ff>] convert_from_fxsr+0x11f/0x13d
 RSP <ffff880003741cb8>
---[ end trace e838aa5ff4269c0c ]---

Information about the running kernel in domU:

kernel: compiled from kernel.org source 2.6.32.47 with
self-patched/update ibg driver


dom0 information:

System OS: Scientific Linux 6.1

Partial related grub.conf entry:
title Scientific Linux (2.6.32.47-0.xen.pvops.choon.sl6)
	root (hd0,0)
	kernel /xen.gz dom0_mem=1024M loglvl=all guest_loglvl=all cpuidle=0
cpufreq=none
	module /vmlinuz-2.6.32.47-0.xen.pvops.choon.sl6 ro
root=UUID=1742ce45-0f9e-45da-b396-18b7e83d910e
rd_MD_UUID=8ad6e5a7:efdec690:cc2723ac:8a807302 rd_NO_LUKS rd_NO_LVM
rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc
KEYTABLE=us crashkernel=auto panic=5 panic_timeout=10
	module /initramfs-2.6.32.47-0.xen.pvops.choon.sl6.img


kernel: compiled from jeremy xen/next-2.6.32 latest commit as it is
merged with 2.6.32.47 kernel.org longterm stable branch

git url = git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen.git
git branch = xen/next-2.6.32
git commit = faa0ece5eb2f2bc4d9b149bc46b677b1df05d332

With the following self patched or ported into the kernel:

iscsi-target 1.4.20.2
aufs 2.1-32
igb 3.2.10

Xen information in dom0:

hg_root = http://xenbits.xensource.com/staging/xen-4.1-testing.hg
hg_changeset = 23180


# cat /proc/cpuinfo
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 42
model name	: Intel(R) Xeon(R) CPU E31230 @ 3.20GHz
stepping	: 7
cpu MHz		: 3192.778
cache size	: 8192 KB
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu de tsc msr pae mce cx8 apic sep mtrr mca cmov pat clflush
acpi mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good
nonstop_tsc aperfmperf pni pclmulqdq est ssse3 cx16 sse4_1 sse4_2
x2apic popcnt hypervisor lahf_lm ida arat
bogomips	: 6385.55
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 1
vendor_id	: GenuineIntel
cpu family	: 6
model		: 42
model name	: Intel(R) Xeon(R) CPU E31230 @ 3.20GHz
stepping	: 7
cpu MHz		: 3192.778
cache size	: 8192 KB
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu de tsc msr pae mce cx8 apic sep mtrr mca cmov pat clflush
acpi mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good
nonstop_tsc aperfmperf pni pclmulqdq est ssse3 cx16 sse4_1 sse4_2
x2apic popcnt hypervisor lahf_lm ida arat
bogomips	: 6385.55
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 2
vendor_id	: GenuineIntel
cpu family	: 6
model		: 42
model name	: Intel(R) Xeon(R) CPU E31230 @ 3.20GHz
stepping	: 7
cpu MHz		: 3192.778
cache size	: 8192 KB
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu de tsc msr pae mce cx8 apic sep mtrr mca cmov pat clflush
acpi mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good
nonstop_tsc aperfmperf pni pclmulqdq est ssse3 cx16 sse4_1 sse4_2
x2apic popcnt hypervisor lahf_lm ida arat
bogomips	: 6385.55
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 3
vendor_id	: GenuineIntel
cpu family	: 6
model		: 42
model name	: Intel(R) Xeon(R) CPU E31230 @ 3.20GHz
stepping	: 7
cpu MHz		: 3192.778
cache size	: 8192 KB
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu de tsc msr pae mce cx8 apic sep mtrr mca cmov pat clflush
acpi mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good
nonstop_tsc aperfmperf pni pclmulqdq est ssse3 cx16 sse4_1 sse4_2
x2apic popcnt hypervisor lahf_lm ida arat
bogomips	: 6385.55
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 4
vendor_id	: GenuineIntel
cpu family	: 6
model		: 42
model name	: Intel(R) Xeon(R) CPU E31230 @ 3.20GHz
stepping	: 7
cpu MHz		: 3192.778
cache size	: 8192 KB
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu de tsc msr pae mce cx8 apic sep mtrr mca cmov pat clflush
acpi mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good
nonstop_tsc aperfmperf pni pclmulqdq est ssse3 cx16 sse4_1 sse4_2
x2apic popcnt hypervisor lahf_lm ida arat
bogomips	: 6385.55
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 5
vendor_id	: GenuineIntel
cpu family	: 6
model		: 42
model name	: Intel(R) Xeon(R) CPU E31230 @ 3.20GHz
stepping	: 7
cpu MHz		: 3192.778
cache size	: 8192 KB
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu de tsc msr pae mce cx8 apic sep mtrr mca cmov pat clflush
acpi mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good
nonstop_tsc aperfmperf pni pclmulqdq est ssse3 cx16 sse4_1 sse4_2
x2apic popcnt hypervisor lahf_lm ida arat
bogomips	: 6385.55
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 6
vendor_id	: GenuineIntel
cpu family	: 6
model		: 42
model name	: Intel(R) Xeon(R) CPU E31230 @ 3.20GHz
stepping	: 7
cpu MHz		: 3192.778
cache size	: 8192 KB
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu de tsc msr pae mce cx8 apic sep mtrr mca cmov pat clflush
acpi mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good
nonstop_tsc aperfmperf pni pclmulqdq est ssse3 cx16 sse4_1 sse4_2
x2apic popcnt hypervisor lahf_lm ida arat
bogomips	: 6385.55
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 7
vendor_id	: GenuineIntel
cpu family	: 6
model		: 42
model name	: Intel(R) Xeon(R) CPU E31230 @ 3.20GHz
stepping	: 7
cpu MHz		: 3192.778
cache size	: 8192 KB
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu de tsc msr pae mce cx8 apic sep mtrr mca cmov pat clflush
acpi mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good
nonstop_tsc aperfmperf pni pclmulqdq est ssse3 cx16 sse4_1 sse4_2
x2apic popcnt hypervisor lahf_lm ida arat
bogomips	: 6385.55
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

Any idea to track this down?  This is my very first time to hit this
though.  I hope I can find a way to reproduce this easily... ...

Thanks.

Kindest regards,
Giam Teck Choon

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 13 11:22:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 11:22:07 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPfcz-00082a-FL; Sun, 13 Nov 2011 11:22:05 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPfc8-0007pQ-QV
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 11:21:13 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1321212069!1376048!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7521 invoked from network); 13 Nov 2011 19:21:09 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 19:21:09 -0000
X-IronPort-AV: E=Sophos;i="4.69,503,1315180800"; 
   d="scan'208";a="8902508"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Nov 2011 19:21:08 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 13 Nov 2011 19:21:08 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RPfc4-0001A7-Hw; Sun, 13 Nov 2011 19:21:08 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RPfc4-0002mN-GM;
	Sun, 13 Nov 2011 19:21:08 +0000
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Sun, 13 Nov 2011 19:21:02 +0000
Message-ID: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
MIME-Version: 1.0
Content-Type: text/plain
Subject: [Xen-devel] [PATCH 0/4] docs/html/hcall: Hypercall docs headers
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is my proposed approach to providing hypercall documentation: we
provide an htmlified copy of the xen public headers, with a contents
page and cross-reference hyperlinks added.

This is done by a 350-line Perl script to which we can add features as
we think of them.

An example of the output can be found here:
 http://www.chiark.greenend.org.uk/~ijackson/volatile/2011/xen/hcall/


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 13 11:23:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 11:23:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPfeF-0008QK-7Y; Sun, 13 Nov 2011 11:23:23 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPfcK-0007rJ-QE
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 11:21:25 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1321212081!2944181!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16151 invoked from network); 13 Nov 2011 19:21:21 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 19:21:21 -0000
X-IronPort-AV: E=Sophos;i="4.69,503,1315180800"; 
   d="scan'208";a="8902509"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Nov 2011 19:21:21 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 13 Nov 2011 19:21:21 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RPfcG-0001AE-O1; Sun, 13 Nov 2011 19:21:20 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RPfcG-0002mc-Me;
	Sun, 13 Nov 2011 19:21:20 +0000
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Sun, 13 Nov 2011 19:21:03 +0000
Message-ID: <1321212066-10648-2-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
References: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH 1/4] docs/html/hcall: Initial cut of header
	documentation massager
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

"xen-headers" generates HTML from header files.  So far this generates
just some type cross-references, if you say
   make -C docs html/hcall/stamp

An index page, proper wiring into the build system, and a few more
annotations in the headers, and will be forthcoming.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
---
 docs/Makefile    |    8 ++
 docs/xen-headers |  281 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 289 insertions(+), 0 deletions(-)
 create mode 100755 docs/xen-headers

diff --git a/docs/Makefile b/docs/Makefile
index 2054541..fc42859 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -129,6 +129,14 @@ html/%.html: %.markdown
 	$(MARKDOWN) $< > $@.tmp ; \
 	$(call move-if-changed,$@.tmp,$@) ; fi
 
+html/hcall/stamp:
+	@$(INSTALL_DIR) $(@D)
+	./xen-headers -O $(@D) \
+		-T 'arch-x86_64 - Xen public headers' \
+		-X arch-ia64 -X arch-x86_32 -X xen-x86_32 \
+		../xen include/public
+	touch $@
+
 txt/%.txt: %.txt
 	$(INSTALL_DIR) $(@D)
 	cp $< $@.tmp
diff --git a/docs/xen-headers b/docs/xen-headers
new file mode 100755
index 0000000..6918380
--- /dev/null
+++ b/docs/xen-headers
@@ -0,0 +1,281 @@
+#!/usr/bin/perl -w
+# usage: xen-headers [ -X GLOB -I GLOB ... [-D...] ] \
+#                    -O HTML-DIR PUBLIC-INCLUDE-DIR
+
+# enum values --> selected function or struct
+# type & function names --> definition
+# function or struct selected by enum ++> ref to enum value
+
+# definitions must start in LH column
+# extra syntax:
+#    /* ` <definition>                          } parse as if <definition>
+#     * ` <definition>                          }  was not commented
+#   enum <name> { // <pattern>* => <func>()     } cross-reference
+#   enum <name> { // <pattern>* => struct <s>   }  enum values
+
+# 1st pass: find where things are defined and what references are wanted
+# 2rd pass: write out output
+
+use strict;
+use warnings;
+
+use Getopt::Long;
+use File::Find;
+use IO::File;
+
+Getopt::Long::Configure('bundling');
+
+our $outdir;
+our $debug=0;
+our $xtitle='';
+our @fglobs;
+
+sub includeexclude {
+    my ($yn, $optobj, $value) = @_;
+    push @fglobs, [ $value, $yn ];
+}
+
+GetOptions("O|output-dir=s" => \$outdir,
+           "D+" => \$debug,
+           "T=s" => \$xtitle,
+	   "I=s" => sub { includeexclude(1, @_); },
+	   "X=s" => sub { includeexclude(0, @_); })
+    or die;
+
+die unless defined $outdir;
+@ARGV>=2 or die;
+
+my ($basedir,@indirs) = @ARGV;
+
+# general globals
+our $pass;
+our %sdef; 
+# $sdef{$type}{$name} => {
+#     DefLocs => { "$leaf_path:$lineno" => $leaf_opath ,... }
+#     Xrefs => { "$leaf_path,$lineno" => "$xref", ... }
+#     Used => 1
+# }
+# $type might be  Func Struct Union Enum EnumVal
+
+# provided by the find() function
+our $leaf;
+our $leaf_opath;
+
+# reset at the start of each file
+our $o;
+our $in_enum;
+our @pending_xrefs;
+
+sub compile_fglobs () {
+    local ($_);
+    my $f = "sub file_wanted (\$) {\n    local (\$_) = \"/\$leaf\";\n";
+    foreach my $fglob (@fglobs) {
+	$_ = $fglob->[0];
+	$_ = "**$_**" unless m/[?*]/;
+	s/\W/\\$&/g;
+	s,\\\*\\\*,.*,g;
+	s,\\\*,[^/]*,g;
+	s,\\\?,[^/],g;
+	$f .= "    return $fglob->[1] if m,$_,o;\n";
+    }
+    $f .= "    return 1;\n}\n1;\n";
+    debug(3, $f);
+    eval $f or die "$@ ";
+}
+
+compile_fglobs();
+
+
+sub warning {
+    print STDERR "$leaf:$.: @_\n";
+}
+
+sub debug {
+    my $msglevel = scalar shift @_;
+    return unless $debug >= $msglevel;
+    print STDERR "DEBUG $pass $msglevel @_\n" or die $!;
+}
+
+sub in_enum ($$$) { $in_enum = [ @_ ]; } # [ $enumvalpfx, RefType, $refnamepfx ]
+
+sub aelem ($$$) {
+    my ($ntext,$ytext,$hparams) = @_;
+    return $ntext unless $hparams =~ m/\S/;
+    return "<a $hparams>$ytext</a>";
+}
+
+sub defn ($$$;$) {
+    my ($text,$type,$name,$hparams) = @_;
+    $hparams='' if !defined $hparams;
+    debug(2,"DEFN $. $type $name $hparams");
+    $sdef{$type}{$name}{DefLocs}{"$leaf:$."} = $leaf_opath;
+    my $xrefs = $sdef{$type}{$name}{Xrefs};
+    push @pending_xrefs, values %$xrefs if $xrefs;
+    $hparams .= " name=\"${type}_$name\"" if $sdef{$type}{$name}{Used};
+    return aelem($text, "<strong>$text</strong>", $hparams);
+}
+
+sub norm ($) {
+    local ($_) = @_;
+    my $no = '';
+    while (length) {
+	if (s/^(?:\s|^\W)+//) {
+	    $no .= $&;
+	} elsif (s/^(struct|union|enum)\s+(\w+)\b//) {
+	    $no .= ahref($&, (ucfirst $1), $2);
+	} elsif (s/^\w+\b//) {
+	    $no .= ahref($&, 'Func', $&);
+	} else {
+	    die "$_ ?";
+	}
+    }
+    return $no;
+}
+
+sub refhref ($$) {
+    my ($type,$name) = @_;
+    $sdef{$type}{$name}{Used} = 1;
+    my $locs = $sdef{$type}{$name}{DefLocs};
+    return '' unless $locs;
+    if ((scalar keys %$locs) != 1 && !$sdef{$type}{$name}{MultiWarned}) {
+	warning("multiple definitions of $type $name: $_")
+	    foreach keys %$locs;
+	$sdef{$type}{$name}{MultiWarned}=1;
+    }
+    my ($loc) = values %$locs;
+    return "href=\"$loc#${type}_$name\"";
+}
+
+sub ahref ($$$) {
+    my ($text,$type,$name) = @_;
+    return aelem($text,$text, refhref($type,$name));
+}
+
+sub defmacro ($) {
+    my ($valname) = @_;
+    if (!$in_enum) {
+	return $valname;
+    } elsif (substr($valname, 0, (length $in_enum->[0])) ne $in_enum->[0]) {
+	warning("in enum expecting $in_enum->[0]* got $valname");
+	return $valname;
+    } else {
+	my $reftype = $in_enum->[1];
+	my $refname = $in_enum->[2].substr($valname, (length $in_enum->[0]));
+	$sdef{$reftype}{$refname}{Xrefs}{$leaf,$.} =
+	    "[see <a href=\"$leaf_opath#EnumVal_$valname\">$valname</a>]";
+	$sdef{EnumVal}{$valname}{Used} = 1;
+	return defn($valname,'EnumVal',$valname, refhref($reftype,$refname));
+    }
+}
+
+sub out_xrefs ($) {
+    my ($linemapfunc) = @_;
+    foreach my $xref (@pending_xrefs) {
+	$o .= $linemapfunc->($xref);
+	$o .= "\n";
+    }
+    @pending_xrefs = ();
+}
+
+sub write_file ($$) {
+    my ($opath, $odata) = @_;
+    my $out = new IO::File "$opath.new", '>' or die "$opath $!";
+    print $out $odata or die $!;
+    rename "$opath.new", "$opath" or die "$opath $!";
+}
+
+sub process_file ($$) {
+    my ($infile, $outfile) = @_;
+    debug(1,"$pass $infile => $outfile");
+    my $in = new IO::File "$infile", '<' or die "$infile $!";
+
+    $o = '';
+    $in_enum = undef;
+    @pending_xrefs = ();
+
+    $o .= "<html><head><title>$leaf - $xtitle</title></head><body><pre>\n";
+    
+    while (<$in>) {
+	s/\&/\&amp;/g;
+	s/\</\&lt;/g;
+	s/\>/\&gt;/g;
+
+	if (m/^(.*\`)[ \t]*$/) {
+	    my $lhs = $1;
+	    out_xrefs(sub { "$1 $_[0]"; });
+	} elsif (m/^\s*$/) {
+	    out_xrefs(sub { sprintf "/* %70s */", $_[0]; });
+	}
+
+	# In case of comments, strip " /* ` " and " * ` ";
+	my $lstripped = s,^ \s* /? \* \s* \` \  ,,x ? $&: '';
+
+	# Strip trailing whitespace and perhaps trailing "*/" or "*"
+	s,(?: \s* \* /? )? \s* $,,x or die;
+	my $rstripped = $&;
+
+	# Now the actual functionality:
+
+	debug(3,"$. $_");
+
+	if (s/^( (?: \w+\  )? ) (\w+[a-z]\w+) ( \( .*)$
+             / $1.defn($2,'Func',$2).norm($3) /xe) {
+	} elsif (s/^((struct|union|enum) \  (\w+)) ( \s+ \{ .* )$
+                  / defn($1,(ucfirst $2),$3).norm($4) /xe) {
+	    if ($2 eq 'enum') {
+		if (m,/[/*] (\w+)\* \=\&gt\; (\w+)\*\(\),) { 
+		    in_enum($1,'Func',$2)
+		} elsif (m,/[/*] (\w+)\* \=\&gt\; (struct) (\w+)\*,) { 
+		    in_enum($1,(ucfirst $2),$3);
+	        }
+	    }
+	} elsif (s/^( \s* \#define \s+ ) (\w+) ( \s+\S )
+                  / $1.defmacro($2).norm($3) /xe) {
+	} else {
+	    if (m/^\s*\}/) {
+		$in_enum = undef;
+	    }
+	    $_ = norm($_);
+	}
+
+	# Write the line out
+
+	if ($pass == 2) {
+	    $o .= $lstripped;
+	    $o .= $_;
+	    $o .= $rstripped;
+	}
+    }
+
+    warning("pending xrefs at end of file") if @pending_xrefs;
+
+    if ($pass == 2) {
+	$o .= "</pre></body></html>";
+	write_file($outfile, $o);
+    }
+}
+
+
+foreach $pass (qw(1 2)) {
+    find({ wanted => 
+	       sub {
+		   return unless m/\.h$/;
+		   lstat $File::Find::name or die "$File::Find::name $!";
+		   -f _ or die "$File::Find::name";
+		   substr($File::Find::name, 0, 1+length $basedir) 
+		       eq "$basedir/"
+		       or die "$File::Find::name $basedir";
+		   $leaf = substr($File::Find::name, 1+length $basedir);
+		   if (!file_wanted()) {
+		       debug(1,"$pass $File::Find::name excluded");
+		       return;
+		   }
+		   $leaf_opath = $leaf;
+		   $leaf_opath =~ s#/#,#g;
+		   $leaf_opath .= ".html";
+		   process_file($File::Find::name, $outdir.'/'.$leaf_opath);
+	   },
+	   no_chdir => 1,
+	 },
+	 map { "$basedir/$_" } @indirs);
+}
-- 
1.7.2.5


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 13 11:24:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 11:24:26 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPffG-0000ME-0X; Sun, 13 Nov 2011 11:24:26 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPfcM-0007rj-Mf
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 11:21:27 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1321212081!2944181!2
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16196 invoked from network); 13 Nov 2011 19:21:23 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 19:21:23 -0000
X-IronPort-AV: E=Sophos;i="4.69,503,1315180800"; 
   d="scan'208";a="8902513"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Nov 2011 19:21:23 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 13 Nov 2011 19:21:23 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RPfcJ-0001AK-8A; Sun, 13 Nov 2011 19:21:23 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RPfcJ-0002mi-7H;
	Sun, 13 Nov 2011 19:21:23 +0000
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Sun, 13 Nov 2011 19:21:04 +0000
Message-ID: <1321212066-10648-3-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
References: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH 2/4] docs/html/hcall: Annotations for two
	hypercalls
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Add annotations for a couple of the hypercalls:
 HYPERVISOR_set_trap_table
 HYPERVISOR_mmu_update

We do this by
 * annotating the list of #defines for hypercall numbers
 * annotating the list of error values
 * providing a function prototype for the systematically-named functions
The header generator does the rest.

This exercise revealed a couple of infelicities:
 * In the actual source code, do_mmu_update is defined to return an int
   and do_set_trap_table a long.  However both functions return either
   -Efoo (on error) or 0 for success.
 * The error numbers are defined only in the private header file
   xen/include/xen/errno.h and then only with names which will
   typically clash with other projects.  It would be nice to include a
   public version of this header which defines XEN_E*.  But for now
   we run xen-headers on errno.h too.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
---
 docs/Makefile                     |    2 +-
 xen/include/public/arch-x86/xen.h |    6 ++++++
 xen/include/public/xen.h          |   11 +++++++++--
 xen/include/xen/errno.h           |    5 +++++
 4 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/docs/Makefile b/docs/Makefile
index fc42859..01e59cb 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -134,7 +134,7 @@ html/hcall/stamp:
 	./xen-headers -O $(@D) \
 		-T 'arch-x86_64 - Xen public headers' \
 		-X arch-ia64 -X arch-x86_32 -X xen-x86_32 \
-		../xen include/public
+		../xen include/public include/xen/errno.h
 	touch $@
 
 txt/%.txt: %.txt
diff --git a/xen/include/public/arch-x86/xen.h b/xen/include/public/arch-x86/xen.h
index 79ec633..d663cef 100644
--- a/xen/include/public/arch-x86/xen.h
+++ b/xen/include/public/arch-x86/xen.h
@@ -82,7 +82,13 @@ typedef unsigned long xen_pfn_t;
 typedef unsigned long xen_ulong_t;
 
 /*
+ * ` enum neg_errnoval
+ * ` HYPERVISOR_set_trap_table(const struct trap_info traps[]);
+ * `
+ */
+/*
  * Send an array of these to HYPERVISOR_set_trap_table().
+ * Terminate the array with a sentinel entry, with traps[].address==0.
  * The privilege level specifies which modes may enter a trap via a software
  * interrupt. On x86/64, since rings 1 and 2 are unavailable, we allocate
  * privilege levels as follows:
diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h
index fde9fa5..f2c9e6f 100644
--- a/xen/include/public/xen.h
+++ b/xen/include/public/xen.h
@@ -55,6 +55,8 @@ DEFINE_XEN_GUEST_HANDLE(xen_pfn_t);
  * HYPERCALLS
  */
 
+/* ` enum hypercall_num { // __HYPERVISOR_* => HYPERVISOR_*() */
+
 #define __HYPERVISOR_set_trap_table        0
 #define __HYPERVISOR_mmu_update            1
 #define __HYPERVISOR_set_gdt               2
@@ -105,6 +107,8 @@ DEFINE_XEN_GUEST_HANDLE(xen_pfn_t);
 #define __HYPERVISOR_arch_6               54
 #define __HYPERVISOR_arch_7               55
 
+/* ` } */
+
 /*
  * HYPERCALL COMPATIBILITY.
  */
@@ -163,8 +167,11 @@ DEFINE_XEN_GUEST_HANDLE(xen_pfn_t);
 #define NR_VIRQS       24
 
 /*
- * HYPERVISOR_mmu_update(reqs, count, pdone, foreigndom)
- * 
+ * ` enum neg_errnoval
+ * ` HYPERVISOR_mmu_update(const struct mmu_update reqs[],
+ * `                       unsigned count, unsigned *done_out,
+ * `                       unsigned foreigndom)
+ * `
  * @reqs is an array of mmu_update_t structures ((ptr, val) pairs).
  * @count is the length of the above array.
  * @pdone is an output parameter indicating number of completed operations
diff --git a/xen/include/xen/errno.h b/xen/include/xen/errno.h
index 7cf599f..c2eb5d3 100644
--- a/xen/include/xen/errno.h
+++ b/xen/include/xen/errno.h
@@ -1,6 +1,9 @@
 #ifndef _I386_ERRNO_H
 #define _I386_ERRNO_H
 
+/* ` enum neg_errnoval { /* -Efoo for each Efoo in the list below } */
+/* ` enum errnoval { */
+
 #define	EPERM		 1	/* Operation not permitted */
 #define	ENOENT		 2	/* No such file or directory */
 #define	ESRCH		 3	/* No such process */
@@ -129,4 +132,6 @@
 #define	ENOMEDIUM	123	/* No medium found */
 #define	EMEDIUMTYPE	124	/* Wrong medium type */
 
+/* } */
+
 #endif
-- 
1.7.2.5


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 13 11:26:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 11:26:20 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPfh6-0000qx-LK; Sun, 13 Nov 2011 11:26:20 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPfcN-0007rm-DO
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 11:21:27 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1321212081!2944181!3
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16210 invoked from network); 13 Nov 2011 19:21:24 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 19:21:24 -0000
X-IronPort-AV: E=Sophos;i="4.69,503,1315180800"; d="scan'208,217";a="8902516"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Nov 2011 19:21:24 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 13 Nov 2011 19:21:24 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RPfcJ-0001AN-RA; Sun, 13 Nov 2011 19:21:23 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RPfcJ-0002mm-QV;
	Sun, 13 Nov 2011 19:21:23 +0000
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Sun, 13 Nov 2011 19:21:05 +0000
Message-ID: <1321212066-10648-4-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
References: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH 3/4] docs/html/hcall: Generate an "index.html"
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Generate an "index.html" containing various useful links.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
---
 docs/xen-headers         |   55 ++++++++++++++++++++++++++++++++++++++++++++++
 xen/include/public/xen.h |    4 ++-
 2 files changed, 58 insertions(+), 1 deletions(-)

diff --git a/docs/xen-headers b/docs/xen-headers
index 6918380..3cc9e40 100755
--- a/docs/xen-headers
+++ b/docs/xen-headers
@@ -50,6 +50,8 @@ my ($basedir,@indirs) = @ARGV;
 # general globals
 our $pass;
 our %sdef; 
+our @incontents;
+our @outfiles;
 # $sdef{$type}{$name} => {
 #     DefLocs => { "$leaf_path:$lineno" => $leaf_opath ,... }
 #     Xrefs => { "$leaf_path,$lineno" => "$xref", ... }
@@ -177,6 +179,19 @@ sub out_xrefs ($) {
     @pending_xrefs = ();
 }
 
+sub incontents ($$$) {
+    my ($text, $seq, $anchor) = @_;
+    $anchor = "incontents_$anchor";
+    if ($pass==2) {
+	push @incontents, { 
+	    Seq => $seq,
+	    Href => "$leaf_opath#$anchor",
+	    Title => $text,
+	};
+    }
+    return "<a name=\"$anchor\"><strong>$text</strong></a>";
+}
+
 sub write_file ($$) {
     my ($opath, $odata) = @_;
     my $out = new IO::File "$opath.new", '>' or die "$opath $!";
@@ -231,6 +246,8 @@ sub process_file ($$) {
 	    }
 	} elsif (s/^( \s* \#define \s+ ) (\w+) ( \s+\S )
                   / $1.defmacro($2).norm($3) /xe) {
+	} elsif (s/( \`incontents \s+ (\d+) \s+ (\w+) \s+ )(\S .* \S)
+                 / norm($1).incontents($4, $2, $3) /xe) {
 	} else {
 	    if (m/^\s*\}/) {
 		$in_enum = undef;
@@ -250,11 +267,47 @@ sub process_file ($$) {
     warning("pending xrefs at end of file") if @pending_xrefs;
 
     if ($pass == 2) {
+	push @outfiles, [ $leaf, $leaf_opath ];
 	$o .= "</pre></body></html>";
 	write_file($outfile, $o);
     }
 }
 
+sub output_index () {
+    my $title = "contents - $xtitle";
+    $o = '';
+    $o .= <<END;
+<html><head><title>$title</title></head>
+<body>
+<h1>$title</h1>
+<h2>Starting points</h2>
+<ul>
+END
+    foreach my $ic (sort { $a->{Seq} <=> $b->{Seq} } @incontents) {
+	$o .= "<li><a href=\"$ic->{Href}\">$ic->{Title}</a></li>\n";
+    }
+    $o .= "</ul>\n";
+    my $forkind = sub {
+	my ($type,$desc,$pfx,$sfx) = @_;
+	$o .= "<h2>$desc</h2><ul>\n";
+	foreach my $name (sort keys %{ $sdef{$type} }) {
+	    my $href = refhref($type,$name);
+	    next unless $href =~ m/\S/;
+	    $o .= "<li><a $href>$pfx$name$sfx</a></li>\n";
+	}
+	$o .= "</ul>\n";
+    };
+    $forkind->('Func','Functions','','()');
+    $forkind->('Struct','Structs','struct ','');
+    $forkind->('Enum','Enums and sets of #defines','','');
+    $forkind->('EnumVal','Enum values and individual #defines','','');
+    $o .= "</ul>\n<h2>Files</h2><ul>\n";
+    foreach my $of (sort { $a->[0] cmp $b->[0] } @outfiles) {
+	$o .= "<li><a href=\"$of->[1]\">$of->[0]</a></li>\n";
+    }
+    $o .= "</ul></body></html>\n";
+    write_file("$outdir/index.html", $o);
+}
 
 foreach $pass (qw(1 2)) {
     find({ wanted => 
@@ -279,3 +332,5 @@ foreach $pass (qw(1 2)) {
 	 },
 	 map { "$basedir/$_" } @indirs);
 }
+
+output_index();
diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h
index f2c9e6f..a5b6ad8 100644
--- a/xen/include/public/xen.h
+++ b/xen/include/public/xen.h
@@ -55,7 +55,9 @@ DEFINE_XEN_GUEST_HANDLE(xen_pfn_t);
  * HYPERCALLS
  */
 
-/* ` enum hypercall_num { // __HYPERVISOR_* => HYPERVISOR_*() */
+/* `incontents 100 hcalls List of hypercalls
+ * ` enum hypercall_num { // __HYPERVISOR_* => HYPERVISOR_*()
+ */
 
 #define __HYPERVISOR_set_trap_table        0
 #define __HYPERVISOR_mmu_update            1
-- 
1.7.2.5


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 13 11:27:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 11:27:48 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPfiW-0001E5-Cz; Sun, 13 Nov 2011 11:27:48 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPfcN-0007s0-NK
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 11:21:28 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1321212081!2944181!4
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16215 invoked from network); 13 Nov 2011 19:21:24 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Nov 2011 19:21:24 -0000
X-IronPort-AV: E=Sophos;i="4.69,503,1315180800"; 
   d="scan'208";a="8902517"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Nov 2011 19:21:24 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Sun, 13 Nov 2011 19:21:24 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RPfcK-0001AQ-BC; Sun, 13 Nov 2011 19:21:24 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RPfcK-0002mq-AW;
	Sun, 13 Nov 2011 19:21:24 +0000
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Sun, 13 Nov 2011 19:21:06 +0000
Message-ID: <1321212066-10648-5-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
References: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH 4/4] docs/html/hcall: Arrange for automatic build
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

- Use index.html rather than a stamp file.
- Automatically generate dependencies.
- Wire into the docs build system

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
---
 docs/Makefile    |    9 ++++++---
 docs/xen-headers |   14 ++++++++++++++
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/docs/Makefile b/docs/Makefile
index 01e59cb..3815170 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -15,7 +15,8 @@ DOC_MARKDOWN	:= $(wildcard misc/*.markdown)
 DOC_PS		:= $(patsubst src/%.tex,ps/%.ps,$(DOC_TEX))
 DOC_PDF		:= $(patsubst src/%.tex,pdf/%.pdf,$(DOC_TEX))
 DOC_HTML	:= $(patsubst src/%.tex,html/%/index.html,$(DOC_TEX)) \
-		   $(patsubst %.markdown,html/%.html,$(DOC_MARKDOWN))
+		   $(patsubst %.markdown,html/%.html,$(DOC_MARKDOWN)) \
+		   html/hcall/index.html
 DOC_TXT         := $(patsubst %.txt,txt/%.txt,$(wildcard misc/*.txt)) \
 		   $(patsubst %.markdown,txt/%.txt,$(DOC_MARKDOWN))
 
@@ -129,13 +130,15 @@ html/%.html: %.markdown
 	$(MARKDOWN) $< > $@.tmp ; \
 	$(call move-if-changed,$@.tmp,$@) ; fi
 
-html/hcall/stamp:
+html/hcall/index.html: ./xen-headers
+	rm -rf $(@D)
 	@$(INSTALL_DIR) $(@D)
 	./xen-headers -O $(@D) \
 		-T 'arch-x86_64 - Xen public headers' \
 		-X arch-ia64 -X arch-x86_32 -X xen-x86_32 \
 		../xen include/public include/xen/errno.h
-	touch $@
+
+-include html/hcall/.deps
 
 txt/%.txt: %.txt
 	$(INSTALL_DIR) $(@D)
diff --git a/docs/xen-headers b/docs/xen-headers
index 3cc9e40..606b824 100755
--- a/docs/xen-headers
+++ b/docs/xen-headers
@@ -310,6 +310,12 @@ END
 }
 
 foreach $pass (qw(1 2)) {
+    my $depspath = "$outdir/.deps";
+    my $depsout;
+    if ($pass==2) {
+	$depsout = new IO::File "$depspath.new", 'w' or die $!;
+    }
+
     find({ wanted => 
 	       sub {
 		   return unless m/\.h$/;
@@ -326,11 +332,19 @@ foreach $pass (qw(1 2)) {
 		   $leaf_opath = $leaf;
 		   $leaf_opath =~ s#/#,#g;
 		   $leaf_opath .= ".html";
+		   print $depsout "$outdir/index.html: $File::Find::name\n"
+		       or die $!
+		       if $pass==2;
 		   process_file($File::Find::name, $outdir.'/'.$leaf_opath);
 	   },
 	   no_chdir => 1,
 	 },
 	 map { "$basedir/$_" } @indirs);
+
+    if ($pass==2) {
+	close $depsout or die $!;
+	rename "$depspath.new", "$depspath" or die $!;
+    }
 }
 
 output_index();
-- 
1.7.2.5


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 13 13:20:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 13:20:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPhTW-0004Xn-MS; Sun, 13 Nov 2011 13:20:26 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RPhSV-0004Kn-06
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 13:19:23 -0800
X-Env-Sender: pavel@netsafe.cz
X-Msg-Ref: server-10.tower-174.messagelabs.com!1321219159!1387327!1
X-Originating-IP: [83.223.49.132]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17533 invoked from network); 13 Nov 2011 21:19:19 -0000
Received: from gate1.netsafe.cz (HELO gate1.netsafe.cz) (83.223.49.132)
	by server-10.tower-174.messagelabs.com with SMTP;
	13 Nov 2011 21:19:19 -0000
Received: (qmail 28693 invoked from network); 13 Nov 2011 22:19:11 +0100
X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on webgate.netsafe.cz
X-Spam-Level: 
X-Spam-Status: No, score=-105.8 required=5.0 tests=AWL,BAYES_00,RDNS_NONE,
	USER_IN_WHITELIST autolearn=no version=3.2.5
Received: from unknown (HELO lemra.localnet) (pavel@195.47.79.16)
	by webgate.netsafe.cz with AES256-SHA encrypted SMTP;
	13 Nov 2011 22:19:11 +0100
From: Pavel =?utf-8?q?Mat=C4=9Bja?= <pavel@netsafe.cz>
Organization: Netsafe Solutions s.r.o.
To: xen-devel@lists.xensource.com
Date: Sun, 13 Nov 2011 22:19:06 +0100
User-Agent: KMail/1.13.7 (Linux/3.0.0-2-amd64; KDE/4.6.5; x86_64; ; )
MIME-Version: 1.0
Content-Type: text/plain;
  charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-Id: <201111132219.07211.pavel@netsafe.cz>
Subject: [Xen-devel] ioperm problem
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi,
I'm trying to port AMD VGA passthru patch to the latest XEN and vanila kernel 
and I got SIGSEGV in

static void ati_hw_out(uint16_t hport, uint32_t data)
{
    ioperm(gfx_info.host_pio_base, gfx_info.pio_size, 1);    
    asm volatile ("out %1, %0"::"Nd"(hport),"a"(data));
    ioperm(gfx_info.host_pio_base, gfx_info.pio_size, 0);
}

I tried old 2.6.32 XEN kernel and there is no such problem.
It looks related to arch/x86/kernel/ioport.c but I'm not sure.
Is anyone here familiar with that code?
-- 
Pavel Mateja

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 13 15:16:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 15:16:37 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPjHx-0000Nd-GU; Sun, 13 Nov 2011 15:16:37 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPjH8-0000Ah-CW
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 15:15:46 -0800
X-Env-Sender: rusty@ozlabs.org
X-Msg-Ref: server-13.tower-182.messagelabs.com!1321226140!2415007!1
X-Originating-IP: [203.10.76.45]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17001 invoked from network); 13 Nov 2011 23:15:43 -0000
Received: from ozlabs.org (HELO ozlabs.org) (203.10.76.45)
	by server-13.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Nov 2011 23:15:43 -0000
Received: by ozlabs.org (Postfix, from userid 1011)
	id 8D6D4B7204; Mon, 14 Nov 2011 10:15:36 +1100 (EST)
From: Rusty Russell <rusty@rustcorp.com.au>
To: Miche Baker-Harvey <miche@google.com>, Greg Kroah-Hartman <gregkh@suse.de>
In-Reply-To: <20111108214504.28884.61814.stgit@miche.sea.corp.google.com>
References: <20111108214452.28884.14840.stgit@miche.sea.corp.google.com>
	<20111108214504.28884.61814.stgit@miche.sea.corp.google.com>
User-Agent: Notmuch/0.6.1-1 (http://notmuchmail.org) Emacs/23.3.1
	(i686-pc-linux-gnu)
Date: Fri, 11 Nov 2011 15:00:31 +1030
Message-ID: <874nybqo0o.fsf@rustcorp.com.au>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Cc: Stephen Rothwell <sfr@canb.auug.org.au>, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org,
	Anton Blanchard <anton@samba.org>, Amit Shah <amit.shah@redhat.com>,
	Mike Waychison <mikew@google.com>, ppc-dev <linuxppc-dev@lists.ozlabs.org>,
	Eric Northrup <digitaleric@google.com>
Subject: [Xen-devel] Re: [PATCH v3 2/3] hvc_init(): Enforce one-time
	initialization.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 08 Nov 2011 13:45:04 -0800, Miche Baker-Harvey <miche@google.com> wrote:
> hvc_init() must only be called once, and no thread should continue with hvc_alloc()
> until after initialization is complete.  The original code does not enforce either
> of these requirements.  A new mutex limits entry to hvc_init() to a single thread,
> and blocks all later comers until it has completed.
> 
> This patch fixes multiple crash symptoms.

No, it doesn't: not now your previous double-hvc_init patch has been
reverted.

It's easy to show this is the case though: replace mutex_lock() with:

        if (!mutex_trylock()) {
                WARN(1, "hvc_console: mutex is stopping us!\n");
                mutex_lock();
        }

If you get that warning, then your mutex is doing something.

Thanks,
Rusty.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 13 16:59:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 16:59:33 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPktZ-0003ka-1T; Sun, 13 Nov 2011 16:59:33 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPks9-0003Xc-0w
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 16:58:06 -0800
X-Env-Sender: julian.pidancet@gmail.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1321232281!2960171!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8544 invoked from network); 14 Nov 2011 00:58:01 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-8.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 00:58:01 -0000
Received: by wyh11 with SMTP id 11so7095082wyh.30
	for <xen-devel@lists.xensource.com>;
	Sun, 13 Nov 2011 16:58:01 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=from:to:cc:subject:date:message-id:x-mailer;
	bh=VqfICWm9vedSbXIovchKUV9GbevEZRDITzYxpwtjDes=;
	b=FLDX2fuu4AGvkz0AVqAk1zCBHmrrLDZmcd6I0LL5FSEO4k3w1/OX9KI0UHOxE1OGyo
	zIjqvtoNp2cnnJDsjPQDDIkYt6YdmTbFBsS60rPoKnCXxY80usQnz5eoQ06H8xfKK3fi
	16j32XL1vU3vQ94JwkKZe8SdqUhWxBldhcMMs=
Received: by 10.180.3.71 with SMTP id a7mr23461255wia.0.1321232281260;
	Sun, 13 Nov 2011 16:58:01 -0800 (PST)
Received: from localhost.localdomain (188-223-88-44.zone14.bethere.co.uk.
	[188.223.88.44])
	by mx.google.com with ESMTPS id co5sm11347960wib.8.2011.11.13.16.57.59
	(version=TLSv1/SSLv3 cipher=OTHER);
	Sun, 13 Nov 2011 16:58:00 -0800 (PST)
From: Julian Pidancet <julian.pidancet@gmail.com>
To: seabios@seabios.org
Date: Mon, 14 Nov 2011 01:50:05 +0000
Message-Id: <71d1cedea5b7f4c303c1b0d2a6e8c1520e843776.1321235039.git.julian.pidancet@gmail.com>
X-Mailer: git-send-email 1.7.3.4
Cc: xen-devel@lists.xensource.com, kevin@koconnor.net, ian.campbell@citrix.com,
	Julian Pidancet <julian.pidancet@gmail.com>
Subject: [Xen-devel] [PATCH] SeaBIOS/Xen: Compute the low RAM memory size in
	the BDA according to the e820
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Some programs or ROMs like iPXE rely on the memory size field present
in the BDA instead of e820 to relocate sections at the end of the low
memory.
Xen's hvmloader places an ACPI info table at 0x9F000 at the end of the
usable RAM in low memory (just before the EBDA). The e820 table gets
altered accordingly to protect the area where the table lives, but a ROM
like iPXE only takes into account the memory size field in the BDA and
consequently corrupts the table when relocating itself.

This patch computes the size of the usable RAM in low memory by walking
the e820 table and updates the BDA accordingly. It defaults to 640KB if
it fails to guess that value.

With Xen, the issue can be reproduced by pxe booting a linux kernel
through iPXE using the pci=use_crs command line option. Without this
patch the last of the following lines doesn't appear:

[    0.326967] PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug
[    0.327999] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
[    0.329028] pci_root PNP0A03:00: host bridge window [io  0x0000-0x0cf7]
[    0.329967] pci_root PNP0A03:00: host bridge window [io  0x0d00-0xffff]
[    0.330966] pci_root PNP0A03:00: host bridge window [mem 0x000a0000-0x000bffff]
[    0.331966] pci_root PNP0A03:00: host bridge window [mem 0xf0000000-0xfbffffff]

Signed-off-by: Julian Pidancet <julian.pidancet@gmail.com>
---
 src/memmap.c |   29 +++++++++++++++++++++++++++++
 src/memmap.h |    1 +
 src/post.c   |    9 ++++++---
 3 files changed, 36 insertions(+), 3 deletions(-)

diff --git a/src/memmap.c b/src/memmap.c
index 20ccae0..36750f5 100644
--- a/src/memmap.c
+++ b/src/memmap.c
@@ -7,6 +7,7 @@
 #include "memmap.h" // struct e820entry
 #include "util.h" // dprintf.h
 #include "biosvar.h" // SET_EBDA
+#include "config.h" // CONFIG_*
 
 
 /****************************************************************
@@ -133,6 +134,34 @@ add_e820(u64 start, u64 size, u32 type)
     //dump_map();
 }
 
+// Try to find the size of the usable RAM memory in the
+// first megabyte of RAM.
+u32
+get_lowram_size(void)
+{
+    u32 lowram_end = 0;
+
+    int i;
+    for (i=0; i<e820_count; i++) {
+        struct e820entry *e = &e820_list[i];
+        u64 e_end = e->start + e->size;
+
+        if (e->type != E820_RAM)
+            continue;
+
+        if (e_end <= 0x100000 && /* 1M */
+            e_end > lowram_end)
+            lowram_end = (u32)e_end;
+    }
+
+    // No RAM entry ending before the first megabyte of memory
+    // found, default to 0xA0000
+    if (!lowram_end)
+        lowram_end = BUILD_LOWRAM_END;
+
+    return lowram_end;
+}
+
 // Report on final memory locations.
 void
 memmap_finalize(void)
diff --git a/src/memmap.h b/src/memmap.h
index 01c7ddb..e65d090 100644
--- a/src/memmap.h
+++ b/src/memmap.h
@@ -18,6 +18,7 @@ struct e820entry {
 
 void add_e820(u64 start, u64 size, u32 type);
 void memmap_finalize(void);
+u32 get_lowram_size(void);
 
 // A typical OS page size
 #define PAGE_SIZE 4096
diff --git a/src/post.c b/src/post.c
index b4ad1fa..9f0cb63 100644
--- a/src/post.c
+++ b/src/post.c
@@ -82,18 +82,21 @@ init_bda(void)
     struct bios_data_area_s *bda = MAKE_FLATPTR(SEG_BDA, 0);
     memset(bda, 0, sizeof(*bda));
 
-    int esize = EBDA_SIZE_START;
-    SET_BDA(mem_size_kb, BUILD_LOWRAM_END/1024 - esize);
     u16 ebda_seg = EBDA_SEGMENT_START;
     SET_BDA(ebda_seg, ebda_seg);
 
     // Init ebda
     struct extended_bios_data_area_s *ebda = get_ebda_ptr();
     memset(ebda, 0, sizeof(*ebda));
-    ebda->size = esize;
+    ebda->size = EBDA_SIZE_START;
 
     add_e820((u32)MAKE_FLATPTR(ebda_seg, 0), GET_EBDA2(ebda_seg, size) * 1024
              , E820_RESERVED);
+
+    u32 lowram_size = get_lowram_size();
+
+    dprintf(8, "End of usable low memory RAM: %08x\n", lowram_size);
+    SET_BDA(mem_size_kb, lowram_size / 1024);
 }
 
 static void
-- 
Julian Pidancet


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 13 17:12:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 17:12:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPl5q-0004I8-8z; Sun, 13 Nov 2011 17:12:14 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPl5M-00045p-Cc
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 17:11:44 -0800
X-Env-Sender: kevin@koconnor.net
X-Msg-Ref: server-11.tower-174.messagelabs.com!1321233099!1392443!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1526 invoked from network); 14 Nov 2011 01:11:40 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-11.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 01:11:40 -0000
Received: by vws13 with SMTP id 13so7148522vws.30
	for <xen-devel@lists.xensource.com>;
	Sun, 13 Nov 2011 17:11:39 -0800 (PST)
Received: by 10.52.34.78 with SMTP id x14mr25540775vdi.122.1321233099294;
	Sun, 13 Nov 2011 17:11:39 -0800 (PST)
Received: from localhost
	(207-172-165-101.c3-0.avec-ubr1.nyr-avec.ny.cable.rcn.com.
	[207.172.165.101])
	by mx.google.com with ESMTPS id eq7sm4085611vdb.7.2011.11.13.17.11.37
	(version=TLSv1/SSLv3 cipher=OTHER);
	Sun, 13 Nov 2011 17:11:38 -0800 (PST)
Date: Sun, 13 Nov 2011 20:11:36 -0500
From: Kevin O'Connor <kevin@koconnor.net>
To: Julian Pidancet <julian.pidancet@gmail.com>
Message-ID: <20111114011136.GA22894@morn.localdomain>
References: <71d1cedea5b7f4c303c1b0d2a6e8c1520e843776.1321235039.git.julian.pidancet@gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <71d1cedea5b7f4c303c1b0d2a6e8c1520e843776.1321235039.git.julian.pidancet@gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: xen-devel@lists.xensource.com, seabios@seabios.org, ian.campbell@citrix.com
Subject: [Xen-devel] Re: [PATCH] SeaBIOS/Xen: Compute the low RAM memory
 size in the BDA according to the e820
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 01:50:05AM +0000, Julian Pidancet wrote:
> Some programs or ROMs like iPXE rely on the memory size field present
> in the BDA instead of e820 to relocate sections at the end of the low
> memory.
> Xen's hvmloader places an ACPI info table at 0x9F000 at the end of the
> usable RAM in low memory (just before the EBDA). The e820 table gets
> altered accordingly to protect the area where the table lives, but a ROM
> like iPXE only takes into account the memory size field in the BDA and
> consequently corrupts the table when relocating itself.

That wont work reliably - SeaBIOS (and option roms) can grow the EBDA.
It's not realistic to put a whole in the middle of the first 640k.

[...]
> diff --git a/src/memmap.c b/src/memmap.c
> index 20ccae0..36750f5 100644
> --- a/src/memmap.c
> +++ b/src/memmap.c
> @@ -7,6 +7,7 @@
>  #include "memmap.h" // struct e820entry
>  #include "util.h" // dprintf.h
>  #include "biosvar.h" // SET_EBDA
> +#include "config.h" // CONFIG_*
>  
>  
>  /****************************************************************
> @@ -133,6 +134,34 @@ add_e820(u64 start, u64 size, u32 type)
>      //dump_map();
>  }
>  
> +// Try to find the size of the usable RAM memory in the
> +// first megabyte of RAM.
> +u32
> +get_lowram_size(void)
> +{
> +    u32 lowram_end = 0;
> +
> +    int i;
> +    for (i=0; i<e820_count; i++) {
> +        struct e820entry *e = &e820_list[i];
> +        u64 e_end = e->start + e->size;
> +
> +        if (e->type != E820_RAM)
> +            continue;
> +
> +        if (e_end <= 0x100000 && /* 1M */
> +            e_end > lowram_end)

Shouldn't this read (e_end <= BUILD_LOWRAM_END)?  Otherwise, if for
some strange reason an e820 entry pointed to ram above 0xa0000 but
below 1meg, it would break things.

[...]
> --- a/src/post.c
> +++ b/src/post.c
> @@ -82,18 +82,21 @@ init_bda(void)
>      struct bios_data_area_s *bda = MAKE_FLATPTR(SEG_BDA, 0);
>      memset(bda, 0, sizeof(*bda));
>  
> -    int esize = EBDA_SIZE_START;
> -    SET_BDA(mem_size_kb, BUILD_LOWRAM_END/1024 - esize);
>      u16 ebda_seg = EBDA_SEGMENT_START;
>      SET_BDA(ebda_seg, ebda_seg);

As above, this doesn't look right - SeaBIOS will still locate the EBDA
at 9fc00 and nothing will stop it from growing it over the 9f000 area.

-Kevin

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 13 18:05:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 18:05:45 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPlvd-0005YJ-7A; Sun, 13 Nov 2011 18:05:45 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPltz-0005Kb-Ij
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 18:04:04 -0800
X-Env-Sender: swaplinker@gmail.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1321236239!1398328!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12465 invoked from network); 14 Nov 2011 02:04:00 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-14.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 02:04:00 -0000
Received: by vws13 with SMTP id 13so7176322vws.30
	for <xen-devel@lists.xensource.com>;
	Sun, 13 Nov 2011 18:03:59 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:from:date
	:x-google-sender-auth:message-id:subject:to:cc:content-type
	:content-transfer-encoding;
	bh=WD1pY/Z7wgk0enQi9uNGc83oc0zCVYqfQSGlC0nW3oA=;
	b=V3kzOqz4I9/Iz6/vJw2BJIuu3TnVNwQI9mxWdTrLtM51xKhsU+aWYJkUkK/DynTks7
	fRcghlernMlFISHqBNDZuNTIGNtrOzEn/zSGM2Xo4JYOvkl8ZYrPpegJpd8B75RlXBFw
	GZ3CCT43KTpYE4loZDOAzd5qJBLX271QrGSUc=
Received: by 10.52.90.80 with SMTP id bu16mr31983377vdb.113.1321236239076;
	Sun, 13 Nov 2011 18:03:59 -0800 (PST)
MIME-Version: 1.0
Received: by 10.52.20.142 with HTTP; Sun, 13 Nov 2011 18:03:38 -0800 (PST)
In-Reply-To: <20111114011136.GA22894@morn.localdomain>
References: <71d1cedea5b7f4c303c1b0d2a6e8c1520e843776.1321235039.git.julian.pidancet@gmail.com>
	<20111114011136.GA22894@morn.localdomain>
From: Julian Pidancet <julian.pidancet@gmail.com>
Date: Mon, 14 Nov 2011 02:03:38 +0000
X-Google-Sender-Auth: FK-q32A_iCLEBSmvrKiAlh_xX40
Message-ID: <CAKZ=5EX7EvWLC=yASOy-Jn+aZoBpp+KwxAiNaEL5vguz86_=YA@mail.gmail.com>
To: "Kevin O'Connor" <kevin@koconnor.net>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: xen-devel@lists.xensource.com, seabios@seabios.org, ian.campbell@citrix.com
Subject: [Xen-devel] Re: [PATCH] SeaBIOS/Xen: Compute the low RAM memory
 size in the BDA according to the e820
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 1:11 AM, Kevin O'Connor <kevin@koconnor.net> wrote:
>
> That wont work reliably - SeaBIOS (and option roms) can grow the EBDA.
> It's not realistic to put a whole in the middle of the first 640k.
>

When you say "grow" do you mean grow downwards ? Because if not, the
ACPI info structure lives in 9F000, so there shouldn't be any problem
reporting the 0-9F000 range as the memory size in the BDA.

> [...]
>> diff --git a/src/memmap.c b/src/memmap.c
>> index 20ccae0..36750f5 100644
>> --- a/src/memmap.c
>> +++ b/src/memmap.c
>> @@ -7,6 +7,7 @@
>> =C2=A0#include "memmap.h" // struct e820entry
>> =C2=A0#include "util.h" // dprintf.h
>> =C2=A0#include "biosvar.h" // SET_EBDA
>> +#include "config.h" // CONFIG_*
>>
>>
>> =C2=A0/****************************************************************
>> @@ -133,6 +134,34 @@ add_e820(u64 start, u64 size, u32 type)
>> =C2=A0 =C2=A0 =C2=A0//dump_map();
>> =C2=A0}
>>
>> +// Try to find the size of the usable RAM memory in the
>> +// first megabyte of RAM.
>> +u32
>> +get_lowram_size(void)
>> +{
>> + =C2=A0 =C2=A0u32 lowram_end =3D 0;
>> +
>> + =C2=A0 =C2=A0int i;
>> + =C2=A0 =C2=A0for (i=3D0; i<e820_count; i++) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0struct e820entry *e =3D &e820_list[i];
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0u64 e_end =3D e->start + e->size;
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (e->type !=3D E820_RAM)
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0continue;
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (e_end <=3D 0x100000 && /* 1M */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0e_end > lowram_end)
>
> Shouldn't this read (e_end <=3D BUILD_LOWRAM_END)? =C2=A0Otherwise, if fo=
r
> some strange reason an e820 entry pointed to ram above 0xa0000 but
> below 1meg, it would break things.
>

My bad, I just realized that. Maybe a more correct (and simpler)
approach would be to look for the range marked as RAM which starts at
0x0 and simply use its size (and check that it doesn't go past
0xA0000). Would that sound right ?

> [...]
>> --- a/src/post.c
>> +++ b/src/post.c
>> @@ -82,18 +82,21 @@ init_bda(void)
>> =C2=A0 =C2=A0 =C2=A0struct bios_data_area_s *bda =3D MAKE_FLATPTR(SEG_BD=
A, 0);
>> =C2=A0 =C2=A0 =C2=A0memset(bda, 0, sizeof(*bda));
>>
>> - =C2=A0 =C2=A0int esize =3D EBDA_SIZE_START;
>> - =C2=A0 =C2=A0SET_BDA(mem_size_kb, BUILD_LOWRAM_END/1024 - esize);
>> =C2=A0 =C2=A0 =C2=A0u16 ebda_seg =3D EBDA_SEGMENT_START;
>> =C2=A0 =C2=A0 =C2=A0SET_BDA(ebda_seg, ebda_seg);
>
> As above, this doesn't look right - SeaBIOS will still locate the EBDA
> at 9fc00 and nothing will stop it from growing it over the 9f000 area.
>

The EBDA is a standard bios structure, can't we safely assume that
it's size will hardly change ? If not, would you suggest that this
ACPI info structure should be placed at a different location ? The
problem with this is that it has to be in a location with a fixed
address, and preferably in a location which is accessible by any AML
interpreter.

--=20
Julian

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 13 18:10:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 18:10:31 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPm0E-0005z7-Vh; Sun, 13 Nov 2011 18:10:31 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPlzf-0005mc-Fy
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 18:09:55 -0800
X-Env-Sender: kevin@koconnor.net
X-Msg-Ref: server-5.tower-216.messagelabs.com!1321236591!3377963!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16033 invoked from network); 14 Nov 2011 02:09:52 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 02:09:52 -0000
Received: by vws13 with SMTP id 13so7179016vws.30
	for <xen-devel@lists.xensource.com>;
	Sun, 13 Nov 2011 18:09:51 -0800 (PST)
Received: by 10.52.72.104 with SMTP id c8mr31959400vdv.105.1321236591261;
	Sun, 13 Nov 2011 18:09:51 -0800 (PST)
Received: from localhost
	(207-172-165-101.c3-0.avec-ubr1.nyr-avec.ny.cable.rcn.com.
	[207.172.165.101])
	by mx.google.com with ESMTPS id dw3sm28581555vdb.16.2011.11.13.18.09.49
	(version=TLSv1/SSLv3 cipher=OTHER);
	Sun, 13 Nov 2011 18:09:50 -0800 (PST)
Date: Sun, 13 Nov 2011 21:09:48 -0500
From: Kevin O'Connor <kevin@koconnor.net>
To: Julian Pidancet <julian.pidancet@gmail.com>
Message-ID: <20111114020948.GA27111@morn.localdomain>
References: <71d1cedea5b7f4c303c1b0d2a6e8c1520e843776.1321235039.git.julian.pidancet@gmail.com>
	<20111114011136.GA22894@morn.localdomain>
	<CAKZ=5EX7EvWLC=yASOy-Jn+aZoBpp+KwxAiNaEL5vguz86_=YA@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAKZ=5EX7EvWLC=yASOy-Jn+aZoBpp+KwxAiNaEL5vguz86_=YA@mail.gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: xen-devel@lists.xensource.com, seabios@seabios.org, ian.campbell@citrix.com
Subject: [Xen-devel] Re: [PATCH] SeaBIOS/Xen: Compute the low RAM memory
 size in the BDA according to the e820
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 02:03:38AM +0000, Julian Pidancet wrote:
> On Mon, Nov 14, 2011 at 1:11 AM, Kevin O'Connor <kevin@koconnor.net> wrote:
> >
> > That wont work reliably - SeaBIOS (and option roms) can grow the EBDA.
> > It's not realistic to put a whole in the middle of the first 640k.
> >
> 
> When you say "grow" do you mean grow downwards ? Because if not, the
> ACPI info structure lives in 9F000, so there shouldn't be any problem
> reporting the 0-9F000 range as the memory size in the BDA.

Yes - the EBDA grows down.  Both SeaBIOS itself can grow the EBDA (see
pmm.c:zonelow_expand) and option roms can grow the EBDA.

> > As above, this doesn't look right - SeaBIOS will still locate the EBDA
> > at 9fc00 and nothing will stop it from growing it over the 9f000 area.
> >
> 
> The EBDA is a standard bios structure, can't we safely assume that
> it's size will hardly change ? If not, would you suggest that this
> ACPI info structure should be placed at a different location ? The
> problem with this is that it has to be in a location with a fixed
> address, and preferably in a location which is accessible by any AML
> interpreter.

Why does it have to be at a fixed location?  What structure is
actually placed at this address?

The AML interpreter should be able to see all of ram, so that doesn't
seem like an issue.

-Kevin

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 13 18:49:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 18:49:22 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPmbq-0007dw-F9; Sun, 13 Nov 2011 18:49:22 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPmbN-0007RM-D2
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 18:48:53 -0800
X-Env-Sender: swaplinker@gmail.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1321238929!2977003!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1964 invoked from network); 14 Nov 2011 02:48:50 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-2.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 02:48:50 -0000
Received: by vcbfk13 with SMTP id fk13so7108699vcb.30
	for <xen-devel@lists.xensource.com>;
	Sun, 13 Nov 2011 18:48:49 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:from:date
	:x-google-sender-auth:message-id:subject:to:cc:content-type
	:content-transfer-encoding;
	bh=TGqc6oo2hDw50kCpWQzqgNJlhAUn5wYqqST5GwnI1Rs=;
	b=Rb5Jn4Th5GXVLsUhWHugEpx2n8yw9C40IokwZBSVKfuiQHs9aarBYX5PbBnc/PCFMb
	JwIkO9huPu9tJBzrcYC5lqRbA3LxUj2GNJk4Qf5WG4A92KYdcw3mqJ5PD46iSmbYn0os
	VnBokdWSL6f7gjvHPsROJ2SiBmTdJEF9BEXqA=
Received: by 10.52.17.43 with SMTP id l11mr33183522vdd.28.1321238929092; Sun,
	13 Nov 2011 18:48:49 -0800 (PST)
MIME-Version: 1.0
Received: by 10.52.20.142 with HTTP; Sun, 13 Nov 2011 18:48:28 -0800 (PST)
In-Reply-To: <20111114020948.GA27111@morn.localdomain>
References: <71d1cedea5b7f4c303c1b0d2a6e8c1520e843776.1321235039.git.julian.pidancet@gmail.com>
	<20111114011136.GA22894@morn.localdomain>
	<CAKZ=5EX7EvWLC=yASOy-Jn+aZoBpp+KwxAiNaEL5vguz86_=YA@mail.gmail.com>
	<20111114020948.GA27111@morn.localdomain>
From: Julian Pidancet <julian.pidancet@gmail.com>
Date: Mon, 14 Nov 2011 02:48:28 +0000
X-Google-Sender-Auth: ret3b6dAzSiAAAp3gtHpyYdKfhw
Message-ID: <CAKZ=5EXTweprSr+e_cDF0BJfs-orBr9h8hoKLiSJNVT4uE_utg@mail.gmail.com>
To: "Kevin O'Connor" <kevin@koconnor.net>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: xen-devel@lists.xensource.com, seabios@seabios.org, ian.campbell@citrix.com
Subject: [Xen-devel] Re: [PATCH] SeaBIOS/Xen: Compute the low RAM memory
 size in the BDA according to the e820
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 2:09 AM, Kevin O'Connor <kevin@koconnor.net> wrote:
>
> Yes - the EBDA grows down. =C2=A0Both SeaBIOS itself can grow the EBDA (s=
ee
> pmm.c:zonelow_expand) and option roms can grow the EBDA.
>

I ignored that. Thanks for the info.

>> > As above, this doesn't look right - SeaBIOS will still locate the EBDA
>> > at 9fc00 and nothing will stop it from growing it over the 9f000 area.
>> >
>>
>> The EBDA is a standard bios structure, can't we safely assume that
>> it's size will hardly change ? If not, would you suggest that this
>> ACPI info structure should be placed at a different location ? The
>> problem with this is that it has to be in a location with a fixed
>> address, and preferably in a location which is accessible by any AML
>> interpreter.
>
> Why does it have to be at a fixed location? =C2=A0What structure is
> actually placed at this address?
>

Xen's hvmloader automatically computes the size of the PCI memory and
stores the PCI memory range adresses in that structure. It also
provide information about wether some devices are present (uart, hpet,
ect...). The ACPI code that we inject in the guest has the address of
this structure hardcoded, and it contains some tricks to make the AML
interpreter go read the values contained in it, and take action to
expose the right information to the guest OS. Like the right PCI root
window for example.

I'm not at all an ACPI expert, I don't know if there's a better way to
expose to the guest the right information.

> The AML interpreter should be able to see all of ram, so that doesn't
> seem like an issue.
>

Like I said, I'm not an ACPI expert. But let say we decide to move
this ACPI info structure to some other area, where there's less risk
for it to be overwritten, like somewhere above 0xFC000000, wouldn't
that prevent some Operating System with limited memory capabilities to
access it ?

Besides, it seems that SeaBIOS manages itself the space between
0xFC000000 and 4G, so it seems difficult to imagine to have a reserved
space with a fixed address in there.

--=20
Julian

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 13 19:37:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 19:37:06 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPnM2-00017d-7e; Sun, 13 Nov 2011 19:37:06 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPnLQ-0000vI-3c
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 19:36:28 -0800
X-Env-Sender: kevin@koconnor.net
X-Msg-Ref: server-9.tower-21.messagelabs.com!1321241781!3955748!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11038 invoked from network); 14 Nov 2011 03:36:22 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-9.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 03:36:22 -0000
Received: by vws13 with SMTP id 13so7220332vws.30
	for <xen-devel@lists.xensource.com>;
	Sun, 13 Nov 2011 19:36:21 -0800 (PST)
Received: by 10.52.178.163 with SMTP id cz3mr32347289vdc.43.1321241781485;
	Sun, 13 Nov 2011 19:36:21 -0800 (PST)
Received: from localhost
	(207-172-165-101.c3-0.avec-ubr1.nyr-avec.ny.cable.rcn.com.
	[207.172.165.101])
	by mx.google.com with ESMTPS id ey9sm28867993vdc.19.2011.11.13.19.36.19
	(version=TLSv1/SSLv3 cipher=OTHER);
	Sun, 13 Nov 2011 19:36:20 -0800 (PST)
Date: Sun, 13 Nov 2011 22:36:18 -0500
From: Kevin O'Connor <kevin@koconnor.net>
To: Julian Pidancet <julian.pidancet@gmail.com>
Message-ID: <20111114033618.GA30104@morn.localdomain>
References: <71d1cedea5b7f4c303c1b0d2a6e8c1520e843776.1321235039.git.julian.pidancet@gmail.com>
	<20111114011136.GA22894@morn.localdomain>
	<CAKZ=5EX7EvWLC=yASOy-Jn+aZoBpp+KwxAiNaEL5vguz86_=YA@mail.gmail.com>
	<20111114020948.GA27111@morn.localdomain>
	<CAKZ=5EXTweprSr+e_cDF0BJfs-orBr9h8hoKLiSJNVT4uE_utg@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <CAKZ=5EXTweprSr+e_cDF0BJfs-orBr9h8hoKLiSJNVT4uE_utg@mail.gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: xen-devel@lists.xensource.com, seabios@seabios.org, ian.campbell@citrix.com
Subject: [Xen-devel] Re: [PATCH] SeaBIOS/Xen: Compute the low RAM memory
 size in the BDA according to the e820
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 02:48:28AM +0000, Julian Pidancet wrote:
> On Mon, Nov 14, 2011 at 2:09 AM, Kevin O'Connor <kevin@koconnor.net> wrote:
> > Why does it have to be at a fixed location?  What structure is
> > actually placed at this address?
> 
> Xen's hvmloader automatically computes the size of the PCI memory and
> stores the PCI memory range adresses in that structure. It also
> provide information about wether some devices are present (uart, hpet,
> ect...). The ACPI code that we inject in the guest has the address of
> this structure hardcoded, and it contains some tricks to make the AML
> interpreter go read the values contained in it, and take action to
> expose the right information to the guest OS. Like the right PCI root
> window for example.
> 
> I'm not at all an ACPI expert, I don't know if there's a better way to
> expose to the guest the right information.

Unfortunately, there aren't very many places to put a hardcoded
address.  The safest thing is probably to dynamically generate an SSDT
with a pointer - then the DSDT can use the pointer instead of a
hardcoded address.  This is more work, however.

> > The AML interpreter should be able to see all of ram, so that doesn't
> > seem like an issue.
> 
> Like I said, I'm not an ACPI expert. But let say we decide to move
> this ACPI info structure to some other area, where there's less risk
> for it to be overwritten, like somewhere above 0xFC000000, wouldn't
> that prevent some Operating System with limited memory capabilities to
> access it ?

If the OS can handle AML it can handle 32bit addresses.

> Besides, it seems that SeaBIOS manages itself the space between
> 0xFC000000 and 4G, so it seems difficult to imagine to have a reserved
> space with a fixed address in there.

On Xen, the PCI init code isn't used, so assuming this struct doesn't
need to live in real "ram", I think it could live just about anywhere
past the end of ram.  Even with pciinit.c, addresses over 0xfc00000
(with the exception of a few bytes for hpet, apic, ioapic, and bios
image) could be used.

-Kevin

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Nov 13 20:29:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 13 Nov 2011 20:29:34 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPoAo-0002Er-Aq; Sun, 13 Nov 2011 20:29:34 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPo9s-00021x-5J
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 20:28:36 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1321244882!57061827!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32169 invoked from network); 14 Nov 2011 04:28:02 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 04:28:02 -0000
X-IronPort-AV: E=Sophos;i="4.69,505,1315180800"; 
   d="scan'208";a="8904812"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 04:28:32 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 14 Nov 2011 04:28:32 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RPo9o-000484-02;
	Mon, 14 Nov 2011 04:28:32 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RPo9n-0005rZ-DV;
	Mon, 14 Nov 2011 04:28:31 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9765-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 14 Nov 2011 04:28:31 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9765: tolerable FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9765 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9765/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10       fail pass in 9752

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  0844b17df7a9
baseline version:
 xen                  0844b17df7a9

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Published tested tree is already up to date.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 00:38:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 00:38:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPs3q-0008Q2-6z; Mon, 14 Nov 2011 00:38:38 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPs3A-0008Dg-KE
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 00:37:56 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1321259873!2994089!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26542 invoked from network); 14 Nov 2011 08:37:53 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Nov 2011 08:37:53 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 14 Nov 2011 08:37:52 +0000
Message-Id: <4EC0E16E0200007800060B0F@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 14 Nov 2011 08:37:50 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Gianluca Guida" <glguida@gmail.com>
References: <4EBBC25B02000078000601F1@nat28.tlf.novell.com>
	<CAKpvNa3DmeQyXBb7obc_PbsNaEUBLjTFc_eLkTKH8RwYs4WQYw@mail.gmail.com>
	<4EBBF36A0200007800060375@nat28.tlf.novell.com>
	<alpine.DEB.2.00.1111101457380.3519@kaball-desktop>
	<4EBBF7A9020000780006039E@nat28.tlf.novell.com>
	<CAKpvNa14y7d3J3r_rXjQhV6hTzS6+2G5ZQgdwLpbsVSt1ptLKA@mail.gmail.com>
In-Reply-To: <CAKpvNa14y7d3J3r_rXjQhV6hTzS6+2G5ZQgdwLpbsVSt1ptLKA@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	"Tim \(Xen.org\)" <tim@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Gianluca Guida <gianluca.guida@citrix.com>
Subject: [Xen-devel] Re: performance regression from c/s 21647:cfba1560054a
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.11.11 at 16:55, Gianluca Guida <glguida@gmail.com> wrote:
> On Thu, Nov 10, 2011 at 7:11 AM, Jan Beulich <JBeulich@suse.com> wrote:
>>>>> On 10.11.11 at 15:59, Stefano Stabellini <stefano.stabellini@eu.citri=
x.com>
>> wrote:
>>> On Thu, 10 Nov 2011, Jan Beulich wrote:
>>>> It's SLE11 SP1 guests that suffered a regression after a maintenance
>>>> update (originally shipped with 4.0.0, while that patch got backported=

>>>> later into 4.0.x).
>>>
>>> Is SLES11 SP1 using HVMOP_pagetable_dying (see
>>> arch/x86/xen/mmu.c:xen_hvm_init_mmu_ops)?
>>
>> No, it's not.
>=20
> Can you please try the inline patch? Unfortunately I have no unstable
> test machine or infrastructure at the moment, so I can;t really test
> it.

The testing on the customer system (4.0.2 based) went fine, so
please formally submit the patch (indicating the need to backport
to 4.0-testing and 4.1-testing).

Thanks, Jan

> I finally recalled a bit of details about this patch, so this check is
> clearly a bug as-it-is: it was written with the assumption that all
> the HVM guests would have been Windows guests with particular
> PV-drivers, so I wasn't particularly nice with the checks.
>=20
> Thank you,
> Gianluca
>=20
> diff -r 068d3d55ce6e xen/arch/x86/mm/shadow/multi.c
> --- a/xen/arch/x86/mm/shadow/multi.c    Tue Nov 01 19:03:38 2011 +0000
> +++ b/xen/arch/x86/mm/shadow/multi.c    Thu Nov 10 16:46:50 2011 -0800
> @@ -2723,8 +2723,9 @@
>             || ( !v->domain->arch.paging.shadow.pagetable_dying_op
>                  &&
> v->arch.paging.shadow.last_emulated_mfn_for_unshadow =3D=3D mfn_x(gmfn) =
)
> )
>           && sh_mfn_is_a_page_table(gmfn)
> -         && !(mfn_to_page(gmfn)->shadow_flags
> -              & (SHF_L2_32|SHF_L2_PAE|SHF_L2H_PAE|SHF_L4_64)) )
> +         && (!v->domain->arch.paging.shadow.pagetable_dying_op ||
> +             !(mfn_to_page(gmfn)->shadow_flags
> +               & (SHF_L2_32|SHF_L2_PAE|SHF_L2H_PAE|SHF_L4_64))) )
>      {
>          perfc_incr(shadow_early_unshadow);
>          sh_remove_shadows(v, gmfn, 1, 0 /* Fast, can fail to unshadow =
*/ );





_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 00:54:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 00:54:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPsJd-0000bQ-67; Mon, 14 Nov 2011 00:54:57 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPsIj-0000OP-Eh
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 00:54:01 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1321260838!1429690!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30922 invoked from network); 14 Nov 2011 08:53:58 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-14.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 08:53:58 -0000
Received: by wwp14 with SMTP id 14so3851102wwp.24
	for <xen-devel@lists.xensource.com>;
	Mon, 14 Nov 2011 00:53:58 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=sSkngAwyByWYP+4hVK64j6r+iViMiCp3K6VaEd0g11Y=;
	b=WoRzxCKW10mnR9uP1Y3e9B6dEg1gKDml8c6P/739jzM1vJ8u7ivpY3xfIW3gfc+ixk
	SCM9HYfmNw6w49Oy09IgOTaySBxttAJZ287ML0QZyP43tomJMDoLPvC2+1SGRv+UGmYI
	+zgaGTVgTf2Tx2weC1eX3etLoNWDYZrGzRAb8=
Received: by 10.180.84.33 with SMTP id v1mr21532245wiy.4.1321260838055;
	Mon, 14 Nov 2011 00:53:58 -0800 (PST)
Received: from [192.168.1.71]
	(host86-129-245-239.range86-129.btcentralplus.com. [86.129.245.239])
	by mx.google.com with ESMTPS id hq5sm11835777wib.7.2011.11.14.00.53.55
	(version=SSLv3 cipher=OTHER); Mon, 14 Nov 2011 00:53:56 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Mon, 14 Nov 2011 08:53:53 +0000
Subject: Re: [Xen-devel] Re: [PATCH] SeaBIOS/Xen: Compute the low RAM memory
	size in the BDA according to the e820
From: Keir Fraser <keir.xen@gmail.com>
To: Kevin O'Connor <kevin@koconnor.net>,
	Julian Pidancet <julian.pidancet@gmail.com>
Message-ID: <CAE687A1.24CDF%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] Re: [PATCH] SeaBIOS/Xen: Compute the low RAM memory
	size in the BDA according to the e820
Thread-Index: Acyiqu9P8I6IreVxm0qt+lGyuae+ig==
In-Reply-To: <20111114033618.GA30104@morn.localdomain>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: xen-devel@lists.xensource.com, seabios@seabios.org, ian.campbell@citrix.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 14/11/2011 03:36, "Kevin O'Connor" <kevin@koconnor.net> wrote:

>> Like I said, I'm not an ACPI expert. But let say we decide to move
>> this ACPI info structure to some other area, where there's less risk
>> for it to be overwritten, like somewhere above 0xFC000000, wouldn't
>> that prevent some Operating System with limited memory capabilities to
>> access it ?
> 
> If the OS can handle AML it can handle 32bit addresses.
> 
>> Besides, it seems that SeaBIOS manages itself the space between
>> 0xFC000000 and 4G, so it seems difficult to imagine to have a reserved
>> space with a fixed address in there.
> 
> On Xen, the PCI init code isn't used, so assuming this struct doesn't
> need to live in real "ram", I think it could live just about anywhere
> past the end of ram.  Even with pciinit.c, addresses over 0xfc00000
> (with the exception of a few bytes for hpet, apic, ioapic, and bios
> image) could be used.

I suggest we stick it at FC000000, and shift hvmloader's mem_alloc()
starting address up by one page to FC001000. The acpi build code will have
to manually mem_hole_populate_ram() that one page before writing to it. This
can then be documented in hvmloader/config.h which contains a description
of, and defines for, the system memory map. This is by far the easiest
solution to this problem; manually crafting an SSDT is a right pain in the
arse, whereas this is maybe a 5-line patch.

 -- Keir

> -Kevin
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 00:59:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 00:59:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPsNy-00014E-Kw; Mon, 14 Nov 2011 00:59:26 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPsM3-0000qS-2l
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 00:57:27 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1321261043!1426176!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18956 invoked from network); 14 Nov 2011 08:57:23 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-12.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Nov 2011 08:57:23 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 14 Nov 2011 08:57:23 +0000
Message-Id: <4EC0E6010200007800060B29@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 14 Nov 2011 08:57:21 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Andrew Cooper" <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: prevent vector sharing within
	IO-APICs
References: <4EBD54B80200007800060776@nat28.tlf.novell.com>
	<4EBD579F.70901@citrix.com>
In-Reply-To: <4EBD579F.70901@citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 11.11.11 at 18:13, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
> On 11/11/11 16:00, Jan Beulich wrote:
>> Following the prevention of vector sharing for MSIs, this change
>> enforces the same within IO-APICs: Pin based interrupts use the IO-APIC
>> as their identifying device under the AMD IOMMU (and just like for
>> MSIs, only the identifying device is used to remap interrupts here,
>> with no regard to an interrupt's destination).
>>
>> Additionally, LAPIC initiated EOIs (for level triggered interrupts) too
>> use only the vector for identifying which interrupts to end. While this
>> generally causes no significant problem (at worst an interrupt would be
>> re-raised without a new interrupt event actually having occurred)
>=20
> At worst, hardware asserts a line interrupt, deasserts it later, and an
> EOI broadcast gets rid of any record that the IRQ was ever raised.=20
> While I would classify this as buggy behavior, I believe I have seen
> some hardware doing this when investigating the line level IRQ migration
> bug, as clearing the IRR did not immediately cause another interrupt to
> be generated.
>=20
>> , it
>> still seems better to avoid the situation.
>>
>> For this second aspect, a distinction is being made between the
>> traditional and the directed-EOI cases: In the former, vectors should
>> not be shared throughout all IO-APICs in the system, while in the
>> latter case only individual IO-APICs need to be contrained (or, if the
>> firmware indicates so, sub- groups of them having the same GSI appear
>> at multiple pins).
>>
>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>=20
> Provisional nack because it is my understanding that under all
> circumstances, you must maintain a vector exclusivity map across all
> IO-APICs because of the broadcast problem.  Or have I made a mistake in
> my reasoning?

With directed EOI there's no broadcasting involved, which is why
global sharing prevention is not necessary.

However, after some more thinking over the weekend I think we need
to also/first adjust end_level_ioapic_irq()'s call to io_apic_eoi_vector():=

It shouldn't really iterate over all IO-APICs, but instead call
eoi_IO_APIC_irq(). Thoughts? (That would also eliminate the need to
look up pin or vector in __io_apic_eoi(), as all remaining call sites pass
both.)

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 01:11:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 01:11:00 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPsZ9-0001bM-TD; Mon, 14 Nov 2011 01:10:59 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPsWc-0001NK-5v
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 01:08:24 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1321261697!4071420!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2502 invoked from network); 14 Nov 2011 09:08:17 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-14.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Nov 2011 09:08:17 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 14 Nov 2011 09:08:16 +0000
Message-Id: <4EC0E88F0200007800060B37@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 14 Nov 2011 09:08:15 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Andrew Cooper" <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] [PATCH] x86: clean up __io_apic_eoi()
References: <4EBD5639020000780006077C@nat28.tlf.novell.com>
	<4EBD5213.3030407@citrix.com>
In-Reply-To: <4EBD5213.3030407@citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 11.11.11 at 17:49, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
> On 11/11/11 16:07, Jan Beulich wrote:
>> Irrespective of the IO-APIC vector sharing suppression patch just sent
>> the logic in this function needs to iterate over all RTEs, since
>> multiple pins within an IO-APIC may still use the same vector.
>=20
> Why?  The whole point of preventing vector sharing for IO-APICs is to
> prevent two or more RTEs referencing the same vector.

If that was really the case on *all* systems, then we wouldn't need
the chains of IRQs hanging off irq_2_pin[] entries. Obviously there are
or have been or could theoretically be systems that do make use of this.

BUT again after some more thinking about this over the weekend
(and after fixing the issue pointed out in the other response regarding
the other patch) I think we can actually convert the function to
behave the way you intended it to after dealing with the vector
sharing issue: The call sites are then only __eoi_IO_APIC_irq() (which
already traverses the chain from irq_2_pin[]) and clear_IO_APIC_pin()
(which explicitly wants to deal with just a single (apic, pin) tuple, the
uses in the timer interrupt related boot time code having been bogus in
this respect even before your original change to the EOI logic, as they
imply that no other (apic, pin) tuple also represents the timer IRQ).

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 01:22:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 01:22:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPsk2-00029T-C9; Mon, 14 Nov 2011 01:22:14 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPsic-0001vy-9K; Mon, 14 Nov 2011 01:20:47 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1321262442!1433751!1
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1295 invoked from network); 14 Nov 2011 09:20:42 -0000
Received: from dgate20.ts.fujitsu.com (HELO dgate20.ts.fujitsu.com)
	(80.70.172.51)
	by server-14.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 09:20:42 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Message-ID:Date:From:Organization:
	User-Agent:MIME-Version:To:CC:Subject:References:
	In-Reply-To:Content-Type;
	b=ix8N6M5GhOkWb74M7f8CXmRyfIdn3pupXrSvJ2Th4LiGhDdv2suGNShZ
	fNxxzqSR/HBy0czMx7yMX9OT1EveshRvDKHybDKASakRryoFYCRSYVH5y
	jWDtlFdA/XKW0bCbifGEEd3vdAdrweQVHyUVNS0TCp0igOc0aV6AUQy51
	S1BouiqXZqNWA/Lihlysb70rOD1or0KqmDvuBHYRmr6s+ZGS9x/ecDSdR
	OHzMnVwjyZTcVNERI78+K3rPiZnnC;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1321262443; x=1352798443;
	h=message-id:date:from:mime-version:to:cc:subject:
	references:in-reply-to;
	bh=NOMWJW/h4f42dZdGuUpb0LpPUI49uE2+Q+RcvkizpZk=;
	b=gZ8/qw2Z5xDmbwRqY75lg2ux5l7sVqrNunMC1HZgtxWb/Uon/z0jDEey
	0qF26f9YGsaq3TNLrls6eUU3ktGIVGNRgcVlRVcfFQD/ekxe2HE56plqo
	5eUgN63u4L5d/v37APnA9roK9z+45Ts5kcpvZsNeOMuy/efT5vt9kMBCl
	oiOrBLdBxjiV26+C3w1W0guomLztob3z3Ea0648U9lMQY7al2ADm+Wc3I
	ftfAKIq9j/V60+y+iNoNTgF06tLsq;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,507,1315173600"; d="scan'208,217";a="78903800"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate20u.abg.fsc.net with ESMTP; 14 Nov 2011 10:20:42 +0100
X-IronPort-AV: E=Sophos;i="4.69,507,1315173600"; 
	d="scan'208,217";a="122991263"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 14 Nov 2011 10:20:42 +0100
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id 4A1FF95AE47;
	Mon, 14 Nov 2011 10:20:42 +0100 (CET)
Message-ID: <4EC0DD6A.7040007@ts.fujitsu.com>
Date: Mon, 14 Nov 2011 10:20:42 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
Organization: Fujitsu Technology Solutions
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20111010 Iceowl/1.0b2 Icedove/3.1.15
MIME-Version: 1.0
To: andrewpitman@comcast.net, George Dunlap <george.dunlap@eu.citrix.com>
Subject: Re: [Xen-devel] Re: [Xen-users] Xen 4.1.1 crash when manipulating
	cpupools.
References: <553832861.1721802.1321046283027.JavaMail.root@sz0032a.westchester.pa.mail.comcast.net>
In-Reply-To: <553832861.1721802.1321046283027.JavaMail.root@sz0032a.westchester.pa.mail.comcast.net>
Cc: xen-devel@lists.xensource.com, xen-users@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0386343292=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============0386343292==
Content-Type: multipart/alternative;
	boundary="------------030808070502030605020900"

This is a multi-part message in MIME format.
--------------030808070502030605020900
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

On 11/11/2011 10:18 PM, andrewpitman@comcast.net wrote:
> Juergen,
>
> It doesn't look like this has been fixed.  I managed to get my 4.1.2 server 
> to crash when setting the weight of Domain-0 (running in Pool-0 using 
> credit2) and again when moving some cpus into a new cpupool which was set up 
> to use the credit2 scheduler.

Yeah, I could reproduce your problems on my machine.

George, I see two problems in credit2:

- when setting the weight of dom0, vcpu_schedule_lock_irq(current) will be
   taken in sched_adjust() of schedule.c and again in csched_dom_cntl() of
   sched_credit2.c resulting in a deadlock.

- removing a cpu from a cpupool seems not to work for credit2. I removed all
   but cpu 0 from Pool-0 and the dom0 vcpus were all active on cpus 1-3. It
   took some time until they moved to cpu 0 (verified via 'r' hotkey on the
   xen console).

I tested on xen-4.1-testing cs 23182.


Juergen

-- 
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: juergen.gross@ts.fujitsu.com
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html


--------------030808070502030605020900
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8bit

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
    <title></title>
  </head>
  <body bgcolor="#ffffff" text="#000000">
    On 11/11/2011 10:18 PM, <a class="moz-txt-link-abbreviated" href="mailto:andrewpitman@comcast.net">andrewpitman@comcast.net</a> wrote:
    <blockquote
cite="mid:553832861.1721802.1321046283027.JavaMail.root@sz0032a.westchester.pa.mail.comcast.net"
      type="cite">
      <style type="text/css">p { margin: 0; }</style>
      <div style="font-family: Arial; font-size: 12pt; color: rgb(0, 0,
        0);">Juergen,<br>
        <br>
        It doesn't look like this has been fixed.Â  I managed to get my
        4.1.2 server to crash when setting the weight of Domain-0
        (running in Pool-0 using credit2) and again when moving some
        cpus into a new cpupool which was set up to use the credit2
        scheduler.<br>
      </div>
    </blockquote>
    <tt><br>
      Yeah, I could reproduce your problems on my machine.<br>
      <br>
      George, I see two problems in credit2:<br>
      <br>
      - when setting the weight of dom0, vcpu_schedule_lock_irq(current)
      will be<br>
      Â  taken in sched_adjust() of schedule.c and again in
      csched_dom_cntl() of<br>
      Â  sched_credit2.c resulting in a deadlock.<br>
      <br>
      - removing a cpu from a cpupool seems not to work for credit2. I
      removed all<br>
      Â  but cpu 0 from Pool-0 and the dom0 vcpus were all active on cpus
      1-3. It<br>
      Â  took some time until they moved to cpu 0 (verified via 'r'
      hotkey on the<br>
      Â  xen console).<br>
      <br>
      I tested on xen-4.1-testing cs 23182.<br>
      <br>
      <br>
      Juergen<br>
    </tt>
    <pre class="moz-signature" cols="78">-- 
Juergen Gross                 Principal Developer Operating Systems
PDG ES&amp;S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: <a class="moz-txt-link-abbreviated" href="mailto:juergen.gross@ts.fujitsu.com">juergen.gross@ts.fujitsu.com</a>
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html
</pre>
  </body>
</html>

--------------030808070502030605020900--


--===============0386343292==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0386343292==--


From xen-devel-bounces@lists.xensource.com Mon Nov 14 01:45:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 01:45:33 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPt6a-0004JR-KA; Mon, 14 Nov 2011 01:45:32 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPt4t-0003j7-7Q
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 01:43:47 -0800
X-Env-Sender: amrish.parikh@gmail.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1321263822!3406121!1
X-Originating-IP: [216.139.236.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23662 invoked from network); 14 Nov 2011 09:43:43 -0000
Received: from sam.nabble.com (HELO sam.nabble.com) (216.139.236.26)
	by server-6.tower-216.messagelabs.com with AES256-SHA encrypted SMTP;
	14 Nov 2011 09:43:43 -0000
Received: from [192.168.236.26] (helo=sam.nabble.com)
	by sam.nabble.com with esmtp (Exim 4.72)
	(envelope-from <amrish.parikh@gmail.com>) id 1RPt4o-00016l-7x
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 01:43:42 -0800
Date: Mon, 14 Nov 2011 01:43:42 -0800 (PST)
From: amrishparikh <amrish.parikh@gmail.com>
To: xen-devel@lists.xensource.com
Message-ID: <1321263822239-4990261.post@n5.nabble.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Subject: [Xen-devel] Getting wierd behaviour of SLES11 SP1 on XenCenter5.6
	FP1
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi,

I am trying to install SLES11 SP1 on XenCenter Virtual image and while
Installation finding that it is showing 4 disks (hda, hdb, sda & sdb)
instead of 2 disks.

Here is my observations:
1. Checked SLES11SP1 OS installation on Xen virtual image (5.6 FP1 -
build38895), seeing 4 disks (hda, hdb, sda, sdb) instead of 2 disks (either
hda, hdb, or sda, sdb).
2. On The same virtual instance, SLES11 GA shows proper 2 disks hda & hdb
3. When upgraded the SLES11GA instance with the SLES11SP1 OS, again during
installation it shows 4 disks and after OS installation completed also it
shows
only 4 disks (hda, hdb, sda, sdb). That is, in SLES11 GA it was only 2 disks
and now after upgrde it shows 4 disks (hda, hdb, sda, sdb).
4. On the same instance, SLES10SP3 is installed successfully and shows only
2
disks hda & hdb
5. Even with the new virtual instance on XenCenter, I am getting the same
behaviour.

here is the output after SLES11 SP1 installation:
**************************************************
***************************
xensles11sp1: # df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 17G 3.9G 13G 25% /
devtmpfs 939M 152K 939M 1% /dev
tmpfs 939M 24K 939M 1% /dev/shm
/dev/sda2 1004M 42M 912M 5% /boot
/dev/sr0 2.9G 2.9G 0 100% /media/SLES-11-SP1-DVD-x86_64.0432..001


xensles11sp1: #
You have new mail in /var/spool/mail/root
xensles11sp1: #
xensles11sp1: #
xensles11sp1: # cat /etc/*release
LSB_VERSION="core-2.0-noarch:core-3.2-noarch:core-4.0-noarch:core-2.0-x86_64:core-3.2-x86_64:core-4.0-x86_64"
SUSE Linux Enterprise Server 11 (x86_64)
VERSION = 11
PATCHLEVEL = 1
xensles11sp1:# fdisk -l

Disk /dev/hdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x86aa86aa

Disk /dev/hdb doesn't contain a valid partition table

Disk /dev/hda: 26.8 GB, 26843545600 bytes
255 heads, 63 sectors/track, 3263 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000b81a5

Device Boot Start End Blocks Id System
/dev/hda1 2 2220 17824117+ 83 Linux
/dev/hda2 * 2221 2350 1044225 83 Linux
/dev/hda3 2351 2872 4192965 82 Linux swap / Solaris

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x86aa86aa

Disk /dev/sdb doesn't contain a valid partition table

Disk /dev/sda: 26.8 GB, 26843545600 bytes
255 heads, 63 sectors/track, 3263 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000b81a5

Device Boot Start End Blocks Id System
/dev/sda1 2 2220 17824117+ 83 Linux
/dev/sda2 * 2221 2350 1044225 83 Linux
/dev/sda3 2351 2872 4192965 82 Linux swap / Solaris
xensles11sp1: # df -h
/dev/sda1 17G 3.9G 12G 25% /
devtmpfs 939M 152K 939M 1% /dev
tmpfs 939M 24K 939M 1% /dev/shm
/dev/sda2 1004M 42M 912M 5% /boot
/dev/sr0 2.9G 2.9G 0 100% /media/SLES-11-SP1-DVD-x86_64.0432..001 

I have attached the screenshot of all above mentioned stuffs: Filesystem
Size Used Avail Use% Mounted on
http://xen.1045712.n5.nabble.com/file/n4990261/SLES11_GA_Installation.doc
SLES11_GA_Installation.doc  

--
View this message in context: http://xen.1045712.n5.nabble.com/Getting-wierd-behaviour-of-SLES11-SP1-on-XenCenter5-6-FP1-tp4990261p4990261.html
Sent from the Xen - Dev mailing list archive at Nabble.com.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 01:49:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 01:49:24 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPtAK-0004kK-Jb; Mon, 14 Nov 2011 01:49:24 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPt9m-0004Xb-Ve
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 01:48:51 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1321264103!52106071!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15547 invoked from network); 14 Nov 2011 09:48:23 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-8.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Nov 2011 09:48:23 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 14 Nov 2011 09:48:47 +0000
Message-Id: <4EC0F20D0200007800060B7D@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 14 Nov 2011 09:48:45 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Konrad Rzeszutek Wilk" <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Time Change Issue Xen 4.1
References: <4EBD5AA0.3090906@webanywhere.co.uk>
	<20111111183913.GA9283@phenom.dumpdata.com>
In-Reply-To: <20111111183913.GA9283@phenom.dumpdata.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Jeremy Fitzhardinge <jeremy@goop.org>, xen-devel@lists.xensource.com,
	keir.xen@gmail.com, Niall Fleming <niall.fleming@webanywhere.co.uk>,
	pbonzini@redhat.com, lersek@redhat.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 11.11.11 at 19:39, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> =
wrote:
> On Fri, Nov 11, 2011 at 05:25:52PM +0000, Niall Fleming wrote:
>> Hi all,
>>=20
>> Already posted this over in xen-users and Konrad confirms it as a
>> bug and suggested to repost
>> it over here!
>=20
> Laszlo, Paolo, Jan, you guys haven't seen domething like this? It looks
> like a hypervisor issue where the wallclock time is not really dispursed
> in the shared_info.

Hypervisor? Upstream up to and including 3.1 just doesn't issue the
necessary hypercalls. This was fixed only recently through patches
from Jeremy. We had a different issue in that respect in the forward
ported Linux trees, but that got fixed a couple of months ago, too.

This not working in Jeremy's 2.6.32 tree is odd though, but I'm not
certain which branches the necessary code would on.

>>=20
>> Issue is that changing the time in dom0 doesn't take effect on the
>> VMs until a reboot of dom0.
>> The testing example below illustrates what I mean....
>>=20
>> Synopsis of testing:
>>=20
>> Booted the physical machine, date tells me it's 17:15:45. Hwclock =
agrees.
>> Booted a VM (using xl as xm seems to be labouring under the
>> impression that blockdev is missing - it isn't)
>> The login prompt displays the time as 17:17, which is the expected
>> behaviour.
>> Changed the time in dom0 - (date +%T -s 12:00:00), synced to hwclock.
>> Check that date and hwclock match - they do.
>> Destroy the VM and recreate.
>> The login prompt displays the time as 17:22. Unexpected!
>>=20
>>=20
>> Kernel: I git cloned tag v3.1 from the kernel.org linux.git, and
>> applied xen-settime patches
>> Also tested with jeremy-git-xen-next-2.6.32 (.41/.46) without patch,
>> they wouldn't apply.
>> Xen: 4.1.1/4.1.2
>> Distribution: Gentoo
>>=20
>> It still doesn't work.
>>=20
>> I've tested that the issue also exists in Debian Squeeze (with
>> linux-image-3.0.0 from testing as 2.6.32-5 is broken
>> on my hardware).
>> --=20
>>=20
>> *Niall Fleming BSc. (Hons)*
>> Systems Administrator
>> Webanywhere Limited
>>=20
>> Phone: 0800 862 0131 Ext: 203
>> Web: http://www.webanywhere.co.uk=20
>>=20
>> Aire Valley Business Centre, Lawkholme Lane, Keighley, BD21 3BB
>> Registered in England with company number 4881346
>=20
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com=20
>> http://lists.xensource.com/xen-devel=20




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 01:51:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 01:51:17 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPtC9-00059B-GP; Mon, 14 Nov 2011 01:51:17 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPtB7-0004vu-0D; Mon, 14 Nov 2011 01:50:13 -0800
X-Env-Sender: amrish.parikh@gmail.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1321264207!3404523!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4204 invoked from network); 14 Nov 2011 09:50:09 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-4.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 09:50:09 -0000
Received: by pzk6 with SMTP id 6so11059740pzk.8
	for <multiple recipients>; Mon, 14 Nov 2011 01:50:07 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=5W8U9RHqlmzREEw8oGcfWMwWhSN8LUYPXw3vOA70Zec=;
	b=iq2SJC9nK0GpXJRxvRG59DnflWYHQQGboEULjJOmvrq/3RUnzyjeRkke56U5LskVvy
	RCnjOLBOdBh/YdVtA+nkx+P/9LOZoniiNNWAP/rVDDEq8xYUNrX8PiCYkWTeUJ0cMzGi
	ScqvsJVF4z/hqL2s57wk4hGYV+mSNwcJPMovQ=
MIME-Version: 1.0
Received: by 10.68.26.193 with SMTP id n1mr47934045pbg.125.1321264207188; Mon,
	14 Nov 2011 01:50:07 -0800 (PST)
Received: by 10.142.43.1 with HTTP; Mon, 14 Nov 2011 01:50:07 -0800 (PST)
Date: Mon, 14 Nov 2011 15:20:07 +0530
Message-ID: <CAB_2i1RAMHa-FR9-L1BwtzjD0zLedxzHCitCmSwCkw7924tC0w@mail.gmail.com>
From: Amrish Parikh <amrish.parikh@gmail.com>
To: xen-devel@lists.xensource.com, xen-users@lists.xensource.com
Cc: 
Subject: [Xen-devel] Showing sda or hda disk as xvhda on Xen Center5.6 FP1
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0205225570=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0205225570==
Content-Type: multipart/alternative; boundary=bcaec521549fb9548e04b1aecbd0

--bcaec521549fb9548e04b1aecbd0
Content-Type: text/plain; charset=ISO-8859-1

Hi,

I am using Xen Center5.6 FP1 since last 8 months and it was working fine
since last few weeks, when i observed that suddenly all new Xen VMs started
showing me sda or hda disks as xvhd.
This is observed when i try to create any new Xen VM on my XenCenter5.6FP1.
All my earlier Xen VMs are still showing hda or sda but when i try to
upgrade the respective VMs say from SLES11GA to SLES11 SP1, it again
started showing me only xvhd.

Can anyone on the forum let me know the reason for that? Is there any
Microsoft updates caused this?

Thanks in advance.

Thanks,
Amrish Parikh

--bcaec521549fb9548e04b1aecbd0
Content-Type: text/html; charset=ISO-8859-1

Hi,<br>
<br>
I am using Xen Center5.6 FP1 since last 8 months and it was working fine
 since last few weeks, when i observed that suddenly all new Xen VMs 
started showing me sda or hda disks as xvhd.<br>
This is observed when i try to create any new Xen VM on my 
XenCenter5.6FP1. All my earlier Xen VMs are still showing hda or sda but
 when i try to upgrade the respective VMs say from SLES11GA to SLES11 
SP1, it again started showing me only xvhd.<br>
<br>
Can anyone on the forum let me know the reason for that? Is there any Microsoft updates caused this?<br>
<br>
Thanks in advance.<br>
<br>
Thanks,<br>
Amrish Parikh
				

--bcaec521549fb9548e04b1aecbd0--


--===============0205225570==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0205225570==--


From xen-devel-bounces@lists.xensource.com Mon Nov 14 02:02:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 02:02:47 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPtNH-0006Ng-4F; Mon, 14 Nov 2011 02:02:47 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPtJC-00067m-Su; Mon, 14 Nov 2011 01:59:01 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1321264699!4052310!1
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29692 invoked from network); 14 Nov 2011 09:58:19 -0000
Received: from dgate20.ts.fujitsu.com (HELO dgate20.ts.fujitsu.com)
	(80.70.172.51)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 09:58:19 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Message-ID:Date:From:Organization:
	User-Agent:MIME-Version:To:CC:Subject:References:
	In-Reply-To:Content-Type;
	b=f3qdoQHXv/p79qQVCqB7c0e/TB4G3MqU3OIgJG76w7Ht8riN5xyxLvr3
	1qcxJjty9ud1YzDgPu+p4BtdOF136YisJNOC/nUBaUvlgpPHQXbA62t9U
	jvFA1STA/RptHizwQ7B4eSK9bXWzZVHrya1J8uawWl/8Gg+nC+1Xs6r70
	a6N+h8FgG5LaJNvXj8VGoCkLV5woGd3R4gJYnlL3Jew8qcSujX5mLqxDc
	5WD8xM7cCCVshEvBM2zsF8dc+UrSN;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1321264699; x=1352800699;
	h=message-id:date:from:mime-version:to:cc:subject:
	references:in-reply-to;
	bh=eXSDlcK7wG5YSrtpWM+0gbugT+fFPGalhUMllN87FNg=;
	b=KUlC50hwEwf5lWKLZltT+FV1bjubDxJcewyq1vqfKZx+AKcfWNoPnOjg
	TH5hNdqAT+ZemZeX3XXROqyDDAfkfYLXFXU99zNUWjZO2g++UcGMs6GZ1
	6wv8cfRNy2Eowg1MkHK8Q30G09awxYB2+99w10pI4TTMiEfslvcsn59xf
	oHesThIeUh7866erWXaDY3+n4lEKfjKC5RWkSsdLeBQVfyRUb1j+TCWT8
	jRt1CMqLbzPGFpsPGB8S5u7HTWcmo;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,507,1315173600"; d="scan'208,217";a="78909400"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate20u.abg.fsc.net with ESMTP; 14 Nov 2011 10:58:19 +0100
X-IronPort-AV: E=Sophos;i="4.69,507,1315173600"; 
	d="scan'208,217";a="122994541"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 14 Nov 2011 10:58:18 +0100
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id A5A8195AE48;
	Mon, 14 Nov 2011 10:58:18 +0100 (CET)
Message-ID: <4EC0E63A.6050707@ts.fujitsu.com>
Date: Mon, 14 Nov 2011 10:58:18 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
Organization: Fujitsu Technology Solutions
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20111010 Iceowl/1.0b2 Icedove/3.1.15
MIME-Version: 1.0
To: andrewpitman@comcast.net, George Dunlap <george.dunlap@eu.citrix.com>
Subject: Re: [Xen-devel] Re: [Xen-users] Xen 4.1.1 crash when manipulating
	cpupools.
References: <553832861.1721802.1321046283027.JavaMail.root@sz0032a.westchester.pa.mail.comcast.net>
	<4EC0DD6A.7040007@ts.fujitsu.com>
In-Reply-To: <4EC0DD6A.7040007@ts.fujitsu.com>
Cc: xen-devel@lists.xensource.com, xen-users@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0032680925=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============0032680925==
Content-Type: multipart/alternative;
	boundary="------------070004070606000608050307"

This is a multi-part message in MIME format.
--------------070004070606000608050307
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

On 11/14/2011 10:20 AM, Juergen Gross wrote:
> On 11/11/2011 10:18 PM, andrewpitman@comcast.net wrote:
>> Juergen,
>>
>> It doesn't look like this has been fixed.  I managed to get my 4.1.2 server 
>> to crash when setting the weight of Domain-0 (running in Pool-0 using 
>> credit2) and again when moving some cpus into a new cpupool which was set 
>> up to use the credit2 scheduler.
>
> Yeah, I could reproduce your problems on my machine.
>
> George, I see two problems in credit2:
>
> - when setting the weight of dom0, vcpu_schedule_lock_irq(current) will be
>   taken in sched_adjust() of schedule.c and again in csched_dom_cntl() of
>   sched_credit2.c resulting in a deadlock.
>
> - removing a cpu from a cpupool seems not to work for credit2. I removed all
>   but cpu 0 from Pool-0 and the dom0 vcpus were all active on cpus 1-3. It
>   took some time until they moved to cpu 0 (verified via 'r' hotkey on the
>   xen console).

IMO the problem is choose_cpu() not using CSCHED_CPUONLINE(). The comment

         /* Leave it where it is for now.  When we actually pay attention
          * to affinity we'll have to figure something out... */

suggests the solution isn't too easy...


Juergen

-- 
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: juergen.gross@ts.fujitsu.com
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html


--------------070004070606000608050307
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8bit

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#ffffff" text="#000000">
    On 11/14/2011 10:20 AM, Juergen Gross wrote:
    <blockquote cite="mid:4EC0DD6A.7040007@ts.fujitsu.com" type="cite">
      <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
      <title></title>
      On 11/11/2011 10:18 PM, <a moz-do-not-send="true"
        class="moz-txt-link-abbreviated"
        href="mailto:andrewpitman@comcast.net">andrewpitman@comcast.net</a>
      wrote:
      <blockquote
cite="mid:553832861.1721802.1321046283027.JavaMail.root@sz0032a.westchester.pa.mail.comcast.net"
        type="cite">
        <style type="text/css">p { margin: 0; }</style>
        <div style="font-family: Arial; font-size: 12pt; color: rgb(0,
          0, 0);">Juergen,<br>
          <br>
          It doesn't look like this has been fixed.Â  I managed to get my
          4.1.2 server to crash when setting the weight of Domain-0
          (running in Pool-0 using credit2) and again when moving some
          cpus into a new cpupool which was set up to use the credit2
          scheduler.<br>
        </div>
      </blockquote>
      <tt><br>
        Yeah, I could reproduce your problems on my machine.<br>
        <br>
        George, I see two problems in credit2:<br>
        <br>
        - when setting the weight of dom0,
        vcpu_schedule_lock_irq(current) will be<br>
        Â  taken in sched_adjust() of schedule.c and again in
        csched_dom_cntl() of<br>
        Â  sched_credit2.c resulting in a deadlock.<br>
        <br>
        - removing a cpu from a cpupool seems not to work for credit2. I
        removed all<br>
        Â  but cpu 0 from Pool-0 and the dom0 vcpus were all active on
        cpus 1-3. It<br>
        Â  took some time until they moved to cpu 0 (verified via 'r'
        hotkey on the<br>
        Â  xen console).<br>
      </tt></blockquote>
    <tt><br>
      IMO the problem is choose_cpu() not using CSCHED_CPUONLINE(). The
      comment<br>
      <br>
      Â Â Â Â Â Â Â  /* Leave it where it is for now.Â  When we actually pay
      attention<br>
      Â Â Â Â Â Â Â Â  * to affinity we'll have to figure something out... */<br>
      <br>
      suggests the solution isn't too easy...<br>
      <br>
      <br>
      Juergen</tt><br>
    <pre class="moz-signature" cols="78">-- 
Juergen Gross                 Principal Developer Operating Systems
PDG ES&amp;S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: <a class="moz-txt-link-abbreviated" href="mailto:juergen.gross@ts.fujitsu.com">juergen.gross@ts.fujitsu.com</a>
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html
</pre>
  </body>
</html>

--------------070004070606000608050307--


--===============0032680925==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0032680925==--


From xen-devel-bounces@lists.xensource.com Mon Nov 14 02:10:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 02:10:58 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPtVB-0007WH-8M; Mon, 14 Nov 2011 02:10:57 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPtJp-00068v-6f
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 01:59:16 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1321264749!3391073!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30221 invoked from network); 14 Nov 2011 09:59:09 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-3.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Nov 2011 09:59:09 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 14 Nov 2011 09:59:09 +0000
Message-Id: <4EC0F47B0200007800060B98@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 14 Nov 2011 09:59:07 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Teck Choon Giam" <giamteckchoon@gmail.com>
Subject: Re: [Xen-devel] kernel messages: alignment check: 0000 [#1]
	 SMP
References: <CAEwRVpOHeBXnjDQ8KSXeGxOTyFNh+kD_001KkRqOEszkuBt_TA@mail.gmail.com>
In-Reply-To: <CAEwRVpOHeBXnjDQ8KSXeGxOTyFNh+kD_001KkRqOEszkuBt_TA@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 13.11.11 at 20:00, Teck Choon Giam <giamteckchoon@gmail.com> wrote:
> derefnull[15862]: segfault at 0 ip 000000000804c2eb sp
> 00000000ffb4dfac error 4 in derefnull[8048000+57000]
> divbyzero[15899] trap divide error ip:804d0be sp:ff849e9c error:0 in
> divbyzero[8048000+56000]
> derefnull[7328]: segfault at 0 ip 0000000000407701 sp 00007fff943b1c60
> error 4 in derefnull[400000+77000]
> divbyzero[7345] trap divide error ip:408d05 sp:7fff35784750 error:0 in
> divbyzero[400000+76000]
> derefnull[32738]: segfault at 0 ip 000000000804c2eb sp
> 00000000ffbdbebc error 4 in derefnull[8048000+57000]
> divbyzero[32755] trap divide error ip:804d0be sp:ffc0f53c error:0 in
> divbyzero[8048000+56000]
> derefnull[18732]: segfault at 0 ip 0000000000407701 sp
> 00007fffec69eb30 error 4 in derefnull[400000+77000]
> divbyzero[18841] trap divide error ip:408d05 sp:7fffed159ae0 error:0
> in divbyzero[400000+76000]
> derefnull[10813]: segfault at 0 ip 000000000804c2eb sp
> 00000000ffc17dec error 4 in derefnull[8048000+57000]
> divbyzero[10827] trap divide error ip:804d0be sp:ffdb347c error:0 in
> divbyzero[8048000+56000]
> derefnull[27073]: segfault at 0 ip 0000000000407701 sp
> 00007fff37c6ba00 error 4 in derefnull[400000+77000]
> divbyzero[27087] trap divide error ip:408d05 sp:7fffc93d8ab0 error:0
> in divbyzero[400000+76000]
> derefnull[11819]: segfault at 0 ip 000000000804c2eb sp
> 00000000ffbb9edc error 4 in derefnull[8048000+57000]
> divbyzero[11833] trap divide error ip:804d0be sp:ff9c5a1c error:0 in
> divbyzero[8048000+56000]
> derefnull[28080]: segfault at 0 ip 0000000000407701 sp
> 00007fff5d3045d0 error 4 in derefnull[400000+77000]
> divbyzero[28094] trap divide error ip:408d05 sp:7fff6369ca90 error:0
> in divbyzero[400000+76000]
> derefnull[22199]: segfault at 0 ip 000000000804c2eb sp
> 00000000ffa5f64c error 4 in derefnull[8048000+57000]
> divbyzero[22213] trap divide error ip:804d0be sp:ffb2c92c error:0 in
> divbyzero[8048000+56000]
> derefnull[11755]: segfault at 0 ip 0000000000407701 sp
> 00007fffe0a4a070 error 4 in derefnull[400000+77000]
> divbyzero[11768] trap divide error ip:408d05 sp:7fffaac47410 error:0
> in divbyzero[400000+76000]
> derefnull[3492]: segfault at 0 ip 000000000804c2eb sp 00000000ff9b0a9c
> error 4 in derefnull[8048000+57000]
> divbyzero[3506] trap divide error ip:804d0be sp:ffb387ac error:0 in
> divbyzero[8048000+56000]
> derefnull[25591]: segfault at 0 ip 0000000000407701 sp
> 00007fffc5e82060 error 4 in derefnull[400000+77000]
> divbyzero[25607] trap divide error ip:408d05 sp:7ffff3882660 error:0
> in divbyzero[400000+76000]

Up to here (you're certainly aware) are only indications of application =
faults.

> alignment check: 0000 [#1] SMP
> last sysfs file: /sys/devices/system/cpu/cpu7/cache/index2/shared_cpu_map=

> CPU 7
> Modules linked in: ipv6 dm_mirror dm_region_hash dm_log microcode
> rtc_core rtc_lib pcspkr ext3 jbd dm_mod [last unloaded:
> scsi_wait_scan]
> Pid: 4002, comm: sbcl Not tainted 2.6.32.47-0.choon.sl6 #1
> RIP: e030:[<ffffffff810179ff>]  [<ffffffff810179ff>]
> convert_from_fxsr+0x11f/0x13d
> RSP: e02b:ffff8800a8301cb8  EFLAGS: 00050246

Something in the kernel has turned on EFLAGS.AC which, in a 64-bit pv
Xen kernel, must never be done (for it is running itself in ring 3). =
Tracking
down where this happens may (unless someone can offer a good guess)
require sprinkling around respective WARN_ON()s or BUG_ON()s.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 02:13:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 02:13:46 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPtXu-0007vS-1e; Mon, 14 Nov 2011 02:13:46 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPtKH-00069B-O6
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 01:59:48 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1321264778!3423686!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5839 invoked from network); 14 Nov 2011 09:59:38 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 09:59:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,508,1315180800"; 
   d="scan'208";a="8909268"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 09:59:38 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Mon, 14 Nov 2011 09:59:38 +0000
Subject: Re: [Xen-devel] [PATCH 1/4] docs/html/hcall: Initial cut of header
	documentation massager
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <ian.jackson@eu.citrix.com>
Date: Mon, 14 Nov 2011 09:59:37 +0000
In-Reply-To: <1321212066-10648-2-git-send-email-ian.jackson@eu.citrix.com>
References: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
	<1321212066-10648-2-git-send-email-ian.jackson@eu.citrix.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1321264778.3664.19.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Sun, 2011-11-13 at 19:21 +0000, Ian Jackson wrote:
> "xen-headers" generates HTML from header files.  So far this generates
> just some type cross-references, if you say
>    make -C docs html/hcall/stamp
> 
> An index page, proper wiring into the build system, and a few more
> annotations in the headers, and will be forthcoming.
> 
> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
> ---
>  docs/Makefile    |    8 ++
>  docs/xen-headers |  281 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 289 insertions(+), 0 deletions(-)
>  create mode 100755 docs/xen-headers
> 
> diff --git a/docs/Makefile b/docs/Makefile
> index 2054541..fc42859 100644
> --- a/docs/Makefile
> +++ b/docs/Makefile
> @@ -129,6 +129,14 @@ html/%.html: %.markdown
>  	$(MARKDOWN) $< > $@.tmp ; \
>  	$(call move-if-changed,$@.tmp,$@) ; fi
>  
> +html/hcall/stamp:
> +	@$(INSTALL_DIR) $(@D)
> +	./xen-headers -O $(@D) \
> +		-T 'arch-x86_64 - Xen public headers' \
> +		-X arch-ia64 -X arch-x86_32 -X xen-x86_32 \
> +		../xen include/public
> +	touch $@
> +
>  txt/%.txt: %.txt
>  	$(INSTALL_DIR) $(@D)
>  	cp $< $@.tmp
> diff --git a/docs/xen-headers b/docs/xen-headers
> new file mode 100755
> index 0000000..6918380
> --- /dev/null
> +++ b/docs/xen-headers
> @@ -0,0 +1,281 @@
> +#!/usr/bin/perl -w
> +# usage: xen-headers [ -X GLOB -I GLOB ... [-D...] ] \
> +#                    -O HTML-DIR PUBLIC-INCLUDE-DIR

No "-T"? Also for PUBLIC-INCLUDE-DIR you appear to pass "../xen
include/public" so my guess is that it is slightly more complicated?
Looks like "BASE-PUBLIC-INCLUDE-DIR PUBLIC-INCLUDE-FILE
[ PUBLIC-INCLUDE-FILE ... ] 

[...]
> +	s/\&/\&amp;/g;
> +	s/\</\&lt;/g;
> +	s/\>/\&gt;/g;

There must be a perl lib for this?

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 02:16:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 02:16:48 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPtan-0008Qo-MM; Mon, 14 Nov 2011 02:16:45 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPtPP-0006ha-Fj
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 02:05:02 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-16.tower-182.messagelabs.com!1321265096!2997702!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14752 invoked from network); 14 Nov 2011 10:04:56 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-16.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Nov 2011 10:04:56 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 14 Nov 2011 10:04:55 +0000
Message-Id: <4EC0F5D50200007800060B9D@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 14 Nov 2011 10:04:53 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jean Guyader" <jean.guyader@eu.citrix.com>
References: <1321206052-18833-1-git-send-email-jean.guyader@eu.citrix.com>
In-Reply-To: <1321206052-18833-1-git-send-email-jean.guyader@eu.citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: keir@xen.org, xen-devel@lists.xensource.com, allen.m.kay@intel.com,
	tim@xen.org
Subject: [Xen-devel] Re: [PATCH 0/6] IOMMU, vtd and iotlb flush rework (v7)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 13.11.11 at 18:40, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> In one of my previous email I detailed a bug I was seeing when passing
> through a Intel GPU on a guest that has more that 4G or RAM.
>=20
> Allen suggested that I go for the Plan B but after a discussion with Tim
> we agreed that Plan B was way to disruptive in term of code change.
>=20
> This patch series implements Plan A.
>=20
> http://xen.1045712.n5.nabble.com/VTD-Intel-iommu-IOTLB-flush-really-slow-=
td4=20
> 952866.html
>=20
> Changes between v6 and v7:
>         - xenmem_add_to_physmap_once can't take a pointer on xatp =
because
>           it modifies .idx and .gpfn.

This is not an excuse for passing a structure by value. Despite the
structure not being huge, I still consider this bad style.

Jan

>         - Cancel hypercall continuation in the compat layer if the =
copy_to_guest
>           failed.
>=20
> Changes between v5 and v6:
>        - Rework the patch queue to make it more readable.
>        - Modify xatp in place in xenmem_add_to_physmap
>        - Only check for preemption if we are not at the last iteration
>        - Copy xatp guest handler back to the guest only in case of=20
> continuation
>        - Add continuation only when dealing with the new xenmem space
>          (XENMAPSPACE_gmfn_range).
>=20
> Changes between v4 and v5:
>        - Fix hypercall continuation for add_to_physmap in compat mode.
>=20
> Changes between v3 and v4:
>        - Move the loop for gmfn_range from arch_memory_op to=20
> xenmem_add_to_physmap.
>        - Add a comment to comment to explain the purpose of=20
> iommu_dont_flush_iotlb.
>=20
> Changes between v2 and v3:
>        - Check for the presence iotlb_flush_all callback before calling =
it.
>=20
> Changes between v1 and v2:
>        - Move size in struct xen_add_to_physmap in padding between =
.domid=20
> and .space.
>        - Store iommu_dont_flush per cpu
>        - Change the code in hvmloader to relocate by batch of 64K, .size =
is=20
> now 16 bits.
>=20
> Jean Guyader (6):
>   vtd: Refactor iotlb flush code
>   iommu: Introduce iommu_flush and iommu_flush_all.
>   add_to_physmap: Move the code for XENMEM_add_to_physmap
>   mm: New XENMEM space, XENMAPSPACE_gmfn_range
>   hvmloader: Change memory relocation loop when overlap with PCI hole
>   Introduce per cpu flag (iommu_dont_flush_iotlb) to avoid unnecessary
>     iotlb flush
>=20
>  tools/firmware/hvmloader/pci.c      |   20 ++-
>  xen/arch/x86/mm.c                   |  231=20
> ++++++++++++++++++++++-------------
>  xen/arch/x86/x86_64/compat/mm.c     |   14 ++
>  xen/drivers/passthrough/iommu.c     |   25 ++++
>  xen/drivers/passthrough/vtd/iommu.c |  100 +++++++++-------
>  xen/include/public/memory.h         |    4 +
>  xen/include/xen/iommu.h             |   17 +++
>  7 files changed, 279 insertions(+), 132 deletions(-)




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 02:19:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 02:19:06 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPtd3-0000OP-7Y; Mon, 14 Nov 2011 02:19:05 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPtVr-0007dJ-Bo
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 02:11:41 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1321265496!4061149!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9339 invoked from network); 14 Nov 2011 10:11:36 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-12.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Nov 2011 10:11:36 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 14 Nov 2011 10:11:35 +0000
Message-Id: <4EC0F7640200007800060BAE@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 14 Nov 2011 10:11:32 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jean Guyader" <jean.guyader@eu.citrix.com>
References: <1321206052-18833-1-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-2-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-3-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-4-git-send-email-jean.guyader@eu.citrix.com>
	<1321206052-18833-5-git-send-email-jean.guyader@eu.citrix.com>
In-Reply-To: <1321206052-18833-5-git-send-email-jean.guyader@eu.citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: keir@xen.org, xen-devel@lists.xensource.com, allen.m.kay@intel.com,
	tim@xen.org
Subject: [Xen-devel] Re: [PATCH 4/6] mm: New XENMEM space,
	XENMAPSPACE_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 13.11.11 at 18:40, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
>@@ -4715,10 +4747,20 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void)=
 arg)
>             return -EPERM;
>         }
>=20
>-        rc =3D xenmem_add_to_physmap(d, xatp);
>+        rc =3D xenmem_add_to_physmap(d, &xatp);
>=20
>         rcu_unlock_domain(d);
>=20
>+        if ( rc )

I thought that we had agreed to do the copying back only for the new
space.

>+        {
>+            if ( copy_to_guest(arg, &xatp, 1) )
>+                return -EFAULT;
>+        }

Also, I personally would prefer avoiding unnecessary extra return
points (as they always bare the risk of being overlooked for
subsequent changes, and when they aren't, the resulting patches
usually are bigger and less readable). Here this is rather simple:

        if ( rc && ... =3D=3D XENMAPSPACE_gmfn_range &&
             copy_to_guest(arg, &xatp, 1) )
            rc =3D -EFAULT;

Jan

>+
>+        if ( rc =3D=3D -EAGAIN )
>+            rc =3D hypercall_create_continuation(
>+                    __HYPERVISOR_memory_op, "ih", op, arg);
>+
>         return rc;
>     }
>=20


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 02:20:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 02:20:16 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPteC-0000lr-D2; Mon, 14 Nov 2011 02:20:16 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPtWp-0007ni-PM
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 02:12:41 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1321265538!48146240!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2961 invoked from network); 14 Nov 2011 10:12:19 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 10:12:19 -0000
X-IronPort-AV: E=Sophos;i="4.69,508,1315180800"; 
   d="scan'208";a="8909645"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 10:12:36 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Mon, 14 Nov 2011 10:12:36 +0000
Subject: Re: [Xen-devel] [PATCH 2/4] docs/html/hcall: Annotations for two
	hypercalls
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <ian.jackson@eu.citrix.com>
Date: Mon, 14 Nov 2011 10:12:36 +0000
In-Reply-To: <1321212066-10648-3-git-send-email-ian.jackson@eu.citrix.com>
References: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
	<1321212066-10648-3-git-send-email-ian.jackson@eu.citrix.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1321265556.3664.25.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Sun, 2011-11-13 at 19:21 +0000, Ian Jackson wrote:
> diff --git a/xen/include/xen/errno.h b/xen/include/xen/errno.h
> index 7cf599f..c2eb5d3 100644
> --- a/xen/include/xen/errno.h
> +++ b/xen/include/xen/errno.h
> @@ -1,6 +1,9 @@
>  #ifndef _I386_ERRNO_H
>  #define _I386_ERRNO_H
>  
> +/* ` enum neg_errnoval { /* -Efoo for each Efoo in the list below } */

Do we pass -Wcomment (or something which includes it)? If so gcc might
warn:
        /home/ianc/t.c:5:26: warning: "/*" within comment
(and we use -Werror, so...).

Is this syntax trying to encode some meaning or was it just a typo?

> +/* ` enum errnoval { */
> +
>  #define	EPERM		 1	/* Operation not permitted */
>  #define	ENOENT		 2	/* No such file or directory */
>  #define	ESRCH		 3	/* No such process */
> @@ -129,4 +132,6 @@
>  #define	ENOMEDIUM	123	/* No medium found */
>  #define	EMEDIUMTYPE	124	/* Wrong medium type */
>  
> +/* } */

Is the ` supposed to be required here or is omitting it fine?

> +
>  #endif



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 02:21:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 02:21:11 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPtf5-00018m-Ef; Mon, 14 Nov 2011 02:21:11 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPtXG-0007pz-GV
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 02:13:07 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1321265582!3016021!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13062 invoked from network); 14 Nov 2011 10:13:03 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 10:13:03 -0000
X-IronPort-AV: E=Sophos;i="4.69,508,1315180800"; 
   d="scan'208";a="8909657"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 10:13:02 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Mon, 14 Nov 2011 10:13:01 +0000
Subject: Re: [Xen-devel] [PATCH 3/4] docs/html/hcall: Generate an "index.html"
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <ian.jackson@eu.citrix.com>
Date: Mon, 14 Nov 2011 10:13:00 +0000
In-Reply-To: <1321212066-10648-4-git-send-email-ian.jackson@eu.citrix.com>
References: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
	<1321212066-10648-4-git-send-email-ian.jackson@eu.citrix.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1321265580.3664.26.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Sun, 2011-11-13 at 19:21 +0000, Ian Jackson wrote:
> @@ -231,6 +246,8 @@ sub process_file ($$) {
>  	    }
>  	} elsif (s/^( \s* \#define \s+ ) (\w+) ( \s+\S )
>                    / $1.defmacro($2).norm($3) /xe) {
> +	} elsif (s/( \`incontents \s+ (\d+) \s+ (\w+) \s+ )(\S .* \S)
> +                 / norm($1).incontents($4, $2, $3) /xe) {

You had a comment describing the syntax which I don't think includes
this bit.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 02:22:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 02:22:03 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPtfv-0001Vl-8E; Mon, 14 Nov 2011 02:22:03 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPtXj-0007to-HL
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 02:13:37 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1321265611!1433088!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1932 invoked from network); 14 Nov 2011 10:13:32 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 10:13:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,508,1315180800"; 
   d="scan'208";a="8909671"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 10:13:30 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Mon, 14 Nov 2011 10:13:30 +0000
Subject: Re: [Xen-devel] [PATCH 0/4] docs/html/hcall: Hypercall docs headers
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <ian.jackson@eu.citrix.com>
Date: Mon, 14 Nov 2011 10:13:30 +0000
In-Reply-To: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
References: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1321265610.3664.27.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Sun, 2011-11-13 at 19:21 +0000, Ian Jackson wrote:
> This is my proposed approach to providing hypercall documentation: we
> provide an htmlified copy of the xen public headers, with a contents
> page and cross-reference hyperlinks added.
> 
> This is done by a 350-line Perl script to which we can add features as
> we think of them.
> 
> An example of the output can be found here:
>  http://www.chiark.greenend.org.uk/~ijackson/volatile/2011/xen/hcall/

Excellent stuff.

It seems to consider
        static struct xsd_errors xsd_errors[]
        #if defined(__GNUC__)
        __attribute__((unused))
as defining a function called __attribute__ which is a bit unfortunate!

I had some nitpicks as I looked over the patches but regardless I think
this is a good start and should go in. All:
Acked-by: Ian Campbell <ian.campbell@citrix.com>

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 02:22:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 02:22:59 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPtgp-0001sZ-6P; Mon, 14 Nov 2011 02:22:59 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RPtYF-0007zN-Cz
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 02:14:08 -0800
X-Env-Sender: lersek@redhat.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1321265643!4083968!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6683 invoked from network); 14 Nov 2011 10:14:03 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-14.tower-21.messagelabs.com with SMTP;
	14 Nov 2011 10:14:03 -0000
Received: from int-mx09.intmail.prod.int.phx2.redhat.com
	(int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id pAEAE1Pk016711
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 14 Nov 2011 05:14:01 -0500
Received: from [10.34.1.169] (dhcp-1-169.brq.redhat.com [10.34.1.169])
	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id pAEADxE3009049; Mon, 14 Nov 2011 05:13:59 -0500
Message-ID: <4EC0EA3F.3070405@redhat.com>
Date: Mon, 14 Nov 2011 11:15:27 +0100
From: Laszlo Ersek <lersek@redhat.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110928 Fedora/3.1.15-1.fc14
	Lightning/1.0b3pre Mnenhy/0.8.4 Thunderbird/3.1.15
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Time Change Issue Xen 4.1
References: <4EBD5AA0.3090906@webanywhere.co.uk>
	<20111111183913.GA9283@phenom.dumpdata.com>
In-Reply-To: <20111111183913.GA9283@phenom.dumpdata.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
Cc: pbonzini@redhat.com, keir.xen@gmail.com, xen-devel@lists.xensource.com,
	JBeulich@suse.com, Niall Fleming <niall.fleming@webanywhere.co.uk>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/11/11 19:39, Konrad Rzeszutek Wilk wrote:
> On Fri, Nov 11, 2011 at 05:25:52PM +0000, Niall Fleming wrote:

>> Booted the physical machine, date tells me it's 17:15:45. Hwclock agrees.
>> Booted a VM (using xl as xm seems to be labouring under the
>> impression that blockdev is missing - it isn't)
>> The login prompt displays the time as 17:17, which is the expected
>> behaviour.
>> Changed the time in dom0 - (date +%T -s 12:00:00), synced to hwclock.
>> Check that date and hwclock match - they do.
>> Destroy the VM and recreate.
>> The login prompt displays the time as 17:22. Unexpected!

I shut the VM down (2.6.32-131.0.15.el6) before the systime/hwclock 
change in dom0 (2.6.18-286.el5xen), and restarted it afterwards. The 
guest entered an infinite loop during this boot :(

Thanks
Laszlo

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 02:24:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 02:24:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPtiB-0002Gk-8c; Mon, 14 Nov 2011 02:24:23 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPtby-0000Am-JK; Mon, 14 Nov 2011 02:17:59 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1321265848!52615856!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22313 invoked from network); 14 Nov 2011 10:17:29 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 10:17:29 -0000
X-IronPort-AV: E=Sophos;i="4.69,508,1315180800"; 
   d="scan'208";a="8909818"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 10:17:55 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Mon, 14 Nov 2011 10:17:55 +0000
Subject: Re: [Xen-devel] Showing sda or hda disk as xvhda on Xen Center5.6 FP1
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Amrish Parikh <amrish.parikh@gmail.com>
Date: Mon, 14 Nov 2011 10:17:55 +0000
In-Reply-To: <CAB_2i1RAMHa-FR9-L1BwtzjD0zLedxzHCitCmSwCkw7924tC0w@mail.gmail.com>
References: <CAB_2i1RAMHa-FR9-L1BwtzjD0zLedxzHCitCmSwCkw7924tC0w@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1321265875.3664.30.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Please don't cross post.

On Mon, 2011-11-14 at 09:50 +0000, Amrish Parikh wrote:
> Hi,
> 
> I am using Xen Center5.6 FP1 since last 8 months and it was working
> fine since last few weeks, when i observed that suddenly all new Xen
> VMs started showing me sda or hda disks as xvhd.
> This is observed when i try to create any new Xen VM on my
> XenCenter5.6FP1. All my earlier Xen VMs are still showing hda or sda
> but when i try to upgrade the respective VMs say from SLES11GA to
> SLES11 SP1, it again started showing me only xvhd.
> 
> Can anyone on the forum let me know the reason for that?

I'm afraid not, neither of these lists are XenServer/XenCenter support
lists. You should contact Citrix support or use the Citrix forums with
your issue. e.g. http://support.citrix.com/ or
http://forums.citrix.com/support etc.

Ian.

> Is there any Microsoft updates caused this?
> 
> Thanks in advance.
> 
> Thanks,
> Amrish Parikh 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 03:07:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 03:07:34 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPuNy-0006Ft-Je; Mon, 14 Nov 2011 03:07:34 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPuMn-000639-JI
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 03:06:25 -0800
X-Env-Sender: Jonathan.Davies@eu.citrix.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1321268776!1457680!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3934 invoked from network); 14 Nov 2011 11:06:17 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-5.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 11:06:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,508,1315195200"; d="scan'208";a="170451606"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 06:06:15 -0500
Received: from ukmail1.uk.xensource.com (10.80.16.128) by smtprelay.citrix.com
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0;
	Mon, 14 Nov 2011 06:06:16 -0500
Received: from dusk.uk.xensource.com ([10.80.2.30]
	helo=localhost6.localdomain6)	by ukmail1.uk.xensource.com with esmtp
	(Exim
	4.69)	(envelope-from <jonathan.davies@citrix.com>)	id 1RPuMh-0003O3-Fl;
	Mon, 14 Nov 2011 11:06:15 +0000
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 10758a9aa01ce39c4075d3df54edf02c20fa25aa
Message-ID: <10758a9aa01ce39c4075.1321268775@localhost6.localdomain6>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 14 Nov 2011 11:06:15 +0000
From: Jonathan Davies <jonathan.davies@citrix.com>
To: xen-devel@lists.xensource.com
Cc: jonathan.davies@citrix.com
Subject: [Xen-devel] [PATCH] [OCaml] Release the global lock during some
	hypercalls
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Since libxc is re-entrant, there is no need for the OCaml bindings to prevent more than one thread from entering libxc concurrently.

Previously, the OCaml bindings had prevented re-entrancy by not using caml_{enter,leave}_blocking_section in the C stubs. The absence of these calls meant that the global lock remained held during hypercalls. This caused multi-threaded applications to completely lock up during long-running hypercalls.

Calls to these functions were present but commented out in the OCaml bindings some years ago when libxc was not fully re-entrant.

Instead, we now do call caml_{enter,leave}_blocking_section in all the places it used to be commented out, meaning that the global lock is released during those hypercalls. We also no longer assert the XC_OPENFLAG_NON_REENTRANT flag when calling xc_interface_open because the caller no longer does re-entrancy prevention at those places.

Signed-off-by: Jonathan Davies <jonathan.davies@citrix.com>

diff -r 0844b17df7a9 -r 10758a9aa01c tools/ocaml/libs/xc/xenctrl_stubs.c
--- a/tools/ocaml/libs/xc/xenctrl_stubs.c	Fri Nov 11 18:14:35 2011 +0000
+++ b/tools/ocaml/libs/xc/xenctrl_stubs.c	Mon Nov 14 11:03:04 2011 +0000
@@ -115,7 +115,10 @@ CAMLprim value stub_xc_interface_open(vo
 {
 	CAMLparam0();
         xc_interface *xch;
-        xch = xc_interface_open(NULL, NULL, XC_OPENFLAG_NON_REENTRANT);
+
+	/* Don't assert XC_OPENFLAG_NON_REENTRANT because these bindings
+	 * do not prevent re-entrancy to libxc */
+        xch = xc_interface_open(NULL, NULL, 0);
         if (xch == NULL)
 		failwith_xc(NULL);
         CAMLreturn((value)xch);
@@ -133,9 +136,9 @@ CAMLprim value stub_xc_interface_close(v
 {
 	CAMLparam1(xch);
 
-	// caml_enter_blocking_section();
+	caml_enter_blocking_section();
 	xc_interface_close(_H(xch));
-	// caml_leave_blocking_section();
+	caml_leave_blocking_section();
 
 	CAMLreturn(Val_unit);
 }
@@ -170,9 +173,9 @@ CAMLprim value stub_xc_domain_create(val
 		c_flags |= domain_create_flag_table[v];
 	}
 
-	// caml_enter_blocking_section();
+	caml_enter_blocking_section();
 	result = xc_domain_create(_H(xch), c_ssidref, h, c_flags, &domid);
-	// caml_leave_blocking_section();
+	caml_leave_blocking_section();
 
 	if (result < 0)
 		failwith_xc(_H(xch));
@@ -217,12 +220,13 @@ value stub_xc_domain_sethandle(value xch
 static value dom_op(value xch, value domid, int (*fn)(xc_interface *, uint32_t))
 {
 	CAMLparam2(xch, domid);
+	int result;
 
 	uint32_t c_domid = _D(domid);
 
-	// caml_enter_blocking_section();
-	int result = fn(_H(xch), c_domid);
-	// caml_leave_blocking_section();
+	caml_enter_blocking_section();
+	result = fn(_H(xch), c_domid);
+	caml_leave_blocking_section();
         if (result)
 		failwith_xc(_H(xch));
 	CAMLreturn(Val_unit);
@@ -247,12 +251,13 @@ CAMLprim value stub_xc_domain_destroy(va
 CAMLprim value stub_xc_domain_resume_fast(value xch, value domid)
 {
 	CAMLparam2(xch, domid);
+	int result;
 
 	uint32_t c_domid = _D(domid);
 
-	// caml_enter_blocking_section();
-	int result = xc_domain_resume(_H(xch), c_domid, 1);
-	// caml_leave_blocking_section();
+	caml_enter_blocking_section();
+	result = xc_domain_resume(_H(xch), c_domid, 1);
+	caml_leave_blocking_section();
         if (result)
 		failwith_xc(_H(xch));
 	CAMLreturn(Val_unit);
@@ -324,10 +329,10 @@ CAMLprim value stub_xc_domain_getinfolis
 
 	c_first_domain = _D(first_domain);
 	c_max_domains = Int_val(nb);
-	// caml_enter_blocking_section();
+	caml_enter_blocking_section();
 	retval = xc_domain_getinfolist(_H(xch), c_first_domain,
 				       c_max_domains, info);
-	// caml_leave_blocking_section();
+	caml_leave_blocking_section();
 
 	if (retval < 0) {
 		free(info);
@@ -372,10 +377,10 @@ CAMLprim value stub_xc_vcpu_getinfo(valu
 
 	uint32_t c_domid = _D(domid);
 	uint32_t c_vcpu = Int_val(vcpu);
-	// caml_enter_blocking_section();
+	caml_enter_blocking_section();
 	retval = xc_vcpu_getinfo(_H(xch), c_domid,
 	                         c_vcpu, &info);
-	// caml_leave_blocking_section();
+	caml_leave_blocking_section();
 	if (retval < 0)
 		failwith_xc(_H(xch));
 
@@ -492,14 +497,15 @@ CAMLprim value stub_xc_evtchn_alloc_unbo
                                             value remote_domid)
 {
 	CAMLparam3(xch, local_domid, remote_domid);
+	int result;
 
 	uint32_t c_local_domid = _D(local_domid);
 	uint32_t c_remote_domid = _D(remote_domid);
 
-	// caml_enter_blocking_section();
-	int result = xc_evtchn_alloc_unbound(_H(xch), c_local_domid,
+	caml_enter_blocking_section();
+	result = xc_evtchn_alloc_unbound(_H(xch), c_local_domid,
 	                                     c_remote_domid);
-	// caml_leave_blocking_section();
+	caml_leave_blocking_section();
 
 	if (result < 0)
 		failwith_xc(_H(xch));
@@ -525,12 +531,13 @@ CAMLprim value stub_xc_readconsolering(v
 {
 	unsigned int size = RING_SIZE - 1;
 	char *ring_ptr = ring;
+	int retval;
 
 	CAMLparam1(xch);
 
-	// caml_enter_blocking_section();
-	int retval = xc_readconsolering(_H(xch), ring_ptr, &size, 0, 0, NULL);
-	// caml_leave_blocking_section();
+	caml_enter_blocking_section();
+	retval = xc_readconsolering(_H(xch), ring_ptr, &size, 0, 0, NULL);
+	caml_leave_blocking_section();
 
 	if (retval)
 		failwith_xc(_H(xch));
@@ -557,9 +564,9 @@ CAMLprim value stub_xc_physinfo(value xc
 	xc_physinfo_t c_physinfo;
 	int r;
 
-	// caml_enter_blocking_section();
+	caml_enter_blocking_section();
 	r = xc_physinfo(_H(xch), &c_physinfo);
-	// caml_leave_blocking_section();
+	caml_leave_blocking_section();
 
 	if (r)
 		failwith_xc(_H(xch));
@@ -603,9 +610,9 @@ CAMLprim value stub_xc_pcpu_info(value x
 	if (!info)
 		caml_raise_out_of_memory();
 
-	// caml_enter_blocking_section();
+	caml_enter_blocking_section();
 	r = xc_getcpuinfo(_H(xch), Int_val(nr_cpus), info, &size);
-	// caml_leave_blocking_section();
+	caml_leave_blocking_section();
 
 	if (r) {
 		free(info);
@@ -629,13 +636,14 @@ CAMLprim value stub_xc_domain_setmaxmem(
                                         value max_memkb)
 {
 	CAMLparam3(xch, domid, max_memkb);
+	int retval;
 
 	uint32_t c_domid = _D(domid);
 	unsigned int c_max_memkb = Int64_val(max_memkb);
-	// caml_enter_blocking_section();
-	int retval = xc_domain_setmaxmem(_H(xch), c_domid,
+	caml_enter_blocking_section();
+	retval = xc_domain_setmaxmem(_H(xch), c_domid,
 	                                 c_max_memkb);
-	// caml_leave_blocking_section();
+	caml_leave_blocking_section();
 	if (retval)
 		failwith_xc(_H(xch));
 	CAMLreturn(Val_unit);
@@ -661,14 +669,15 @@ CAMLprim value stub_xc_domain_memory_inc
                                                           value mem_kb)
 {
 	CAMLparam3(xch, domid, mem_kb);
+	int retval;
 
 	unsigned long nr_extents = ((unsigned long)(Int64_val(mem_kb))) >> (PAGE_SHIFT - 10);
 
 	uint32_t c_domid = _D(domid);
-	// caml_enter_blocking_section();
-	int retval = xc_domain_increase_reservation_exact(_H(xch), c_domid,
+	caml_enter_blocking_section();
+	retval = xc_domain_increase_reservation_exact(_H(xch), c_domid,
 							  nr_extents, 0, 0, NULL);
-	// caml_leave_blocking_section();
+	caml_leave_blocking_section();
 
 	if (retval)
 		failwith_xc(_H(xch));
@@ -796,10 +805,10 @@ CAMLprim value stub_xc_version_version(v
 	long packed;
 	int retval;
 
-	// caml_enter_blocking_section();
+	caml_enter_blocking_section();
 	packed = xc_version(_H(xch), XENVER_version, NULL);
 	retval = xc_version(_H(xch), XENVER_extraversion, &extra);
-	// caml_leave_blocking_section();
+	caml_leave_blocking_section();
 
 	if (retval)
 		failwith_xc(_H(xch));
@@ -821,9 +830,9 @@ CAMLprim value stub_xc_version_compile_i
 	xen_compile_info_t ci;
 	int retval;
 
-	// caml_enter_blocking_section();
+	caml_enter_blocking_section();
 	retval = xc_version(_H(xch), XENVER_compile_info, &ci);
-	// caml_leave_blocking_section();
+	caml_leave_blocking_section();
 
 	if (retval)
 		failwith_xc(_H(xch));
@@ -844,9 +853,9 @@ static value xc_version_single_string(va
 	CAMLparam1(xch);
 	int retval;
 
-	// caml_enter_blocking_section();
+	caml_enter_blocking_section();
 	retval = xc_version(_H(xch), code, info);
-	// caml_leave_blocking_section();
+	caml_leave_blocking_section();
 
 	if (retval)
 		failwith_xc(_H(xch));
@@ -895,11 +904,11 @@ CAMLprim value stub_map_foreign_range(va
 
 	c_dom = _D(dom);
 	c_mfn = Nativeint_val(mfn);
-	// caml_enter_blocking_section();
+	caml_enter_blocking_section();
 	intf->addr = xc_map_foreign_range(_H(xch), c_dom,
 	                                  intf->len, PROT_READ|PROT_WRITE,
 	                                  c_mfn);
-	// caml_leave_blocking_section();
+	caml_leave_blocking_section();
 	if (!intf->addr)
 		caml_failwith("xc_map_foreign_range error");
 	CAMLreturn(result);
@@ -912,9 +921,9 @@ CAMLprim value stub_sched_credit_domain_
 	struct xen_domctl_sched_credit c_sdom;
 	int ret;
 
-	// caml_enter_blocking_section();
+	caml_enter_blocking_section();
 	ret = xc_sched_credit_domain_get(_H(xch), _D(domid), &c_sdom);
-	// caml_leave_blocking_section();
+	caml_leave_blocking_section();
 	if (ret != 0)
 		failwith_xc(_H(xch));
 
@@ -934,9 +943,9 @@ CAMLprim value stub_sched_credit_domain_
 
 	c_sdom.weight = Int_val(Field(sdom, 0));
 	c_sdom.cap = Int_val(Field(sdom, 1));
-	// caml_enter_blocking_section();
+	caml_enter_blocking_section();
 	ret = xc_sched_credit_domain_set(_H(xch), _D(domid), &c_sdom);
-	// caml_leave_blocking_section();
+	caml_leave_blocking_section();
 	if (ret != 0)
 		failwith_xc(_H(xch));
 
@@ -950,11 +959,11 @@ CAMLprim value stub_shadow_allocation_ge
 	unsigned long c_mb;
 	int ret;
 
-	// caml_enter_blocking_section();
+	caml_enter_blocking_section();
 	ret = xc_shadow_control(_H(xch), _D(domid),
 				XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION,
 				NULL, 0, &c_mb, 0, NULL);
-	// caml_leave_blocking_section();
+	caml_leave_blocking_section();
 	if (ret != 0)
 		failwith_xc(_H(xch));
 
@@ -970,11 +979,11 @@ CAMLprim value stub_shadow_allocation_se
 	int ret;
 
 	c_mb = Int_val(mb);
-	// caml_enter_blocking_section();
+	caml_enter_blocking_section();
 	ret = xc_shadow_control(_H(xch), _D(domid),
 				XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION,
 				NULL, 0, &c_mb, 0, NULL);
-	// caml_leave_blocking_section();
+	caml_leave_blocking_section();
 	if (ret != 0)
 		failwith_xc(_H(xch));
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 03:09:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 03:09:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPuPV-0006kA-SX; Mon, 14 Nov 2011 03:09:09 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPuOT-0006Mp-KB; Mon, 14 Nov 2011 03:08:06 -0800
X-Env-Sender: George.Dunlap@eu.citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1321268856!52122515!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30754 invoked from network); 14 Nov 2011 11:07:37 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 11:07:37 -0000
X-IronPort-AV: E=Sophos;i="4.69,508,1315195200"; d="scan'208";a="170451719"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 06:08:00 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.65) with Microsoft SMTP Server id
	8.3.137.0; Mon, 14 Nov 2011 06:08:00 -0500
Received: from [10.80.2.24] (elijah.uk.xensource.com [10.80.2.24])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pAEB7uiZ014645;
	Mon, 14 Nov 2011 03:07:58 -0800
Subject: Re: [Xen-devel] Re: [Xen-users] Xen 4.1.1 crash when manipulating
	cpupools.
From: George Dunlap <george.dunlap@citrix.com>
To: Juergen Gross <juergen.gross@ts.fujitsu.com>
In-Reply-To: <4EC0DD6A.7040007@ts.fujitsu.com>
References: <553832861.1721802.1321046283027.JavaMail.root@sz0032a.westchester.pa.mail.comcast.net>
	<4EC0DD6A.7040007@ts.fujitsu.com>
Content-Type: text/plain; charset="UTF-8"
Date: Mon, 14 Nov 2011 11:13:06 +0000
Message-ID: <1321269186.14063.6.camel@elijah>
MIME-Version: 1.0
X-Mailer: Evolution 2.28.3 
Content-Transfer-Encoding: 7bit
Cc: George Dunlap <George.Dunlap@eu.citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	"andrewpitman@comcast.net" <andrewpitman@comcast.net>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, 2011-11-14 at 09:20 +0000, Juergen Gross wrote:
> On 11/11/2011 10:18 PM, andrewpitman@comcast.net wrote: 
> > Juergen,
> > 
> > It doesn't look like this has been fixed.  I managed to get my 4.1.2
> > server to crash when setting the weight of Domain-0 (running in
> > Pool-0 using credit2) and again when moving some cpus into a new
> > cpupool which was set up to use the credit2 scheduler.
> > 
> 
> Yeah, I could reproduce your problems on my machine.
> 
> George, I see two problems in credit2:
> 
> - when setting the weight of dom0, vcpu_schedule_lock_irq(current)
> will be
>   taken in sched_adjust() of schedule.c and again in csched_dom_cntl()
> of
>   sched_credit2.c resulting in a deadlock.

Yes, this one was recently brought to my attention.  Unfortunately I'm
not sure when I'm going to be able to get to it.  

My big problem is actually testing; I don't have a good way to test
xen-unstable effectively right now.  Juergen, if I were to send you a
prototype patch, could you test it and fix it up if it doesn't work
exactly right?


> 
> - removing a cpu from a cpupool seems not to work for credit2. I
> removed all
>   but cpu 0 from Pool-0 and the dom0 vcpus were all active on cpus
> 1-3. It
>   took some time until they moved to cpu 0 (verified via 'r' hotkey on
> the
>   xen console).
> 
> I tested on xen-4.1-testing cs 23182.
> 
> 
> Juergen
> -- 
> Juergen Gross                 Principal Developer Operating Systems
> PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
> Fujitsu Technology Solutions              e-mail: juergen.gross@ts.fujitsu.com
> Domagkstr. 28                           Internet: ts.fujitsu.com
> D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 03:13:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 03:13:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPuTg-0007rg-Bl; Mon, 14 Nov 2011 03:13:28 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPuPJ-0006do-G6
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 03:08:57 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1321268934!1446109!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27549 invoked from network); 14 Nov 2011 11:08:54 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 11:08:54 -0000
X-IronPort-AV: E=Sophos;i="4.69,508,1315180800"; 
   d="scan'208";a="8911571"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 11:08:53 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 14 Nov 2011 11:08:53 +0000
Date: Mon, 14 Nov 2011 11:09:31 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] [PATCH V3 07/10] Introduce Xen PCI Passthrough,
	qdevice (1/3)
In-Reply-To: <20111111180542.GA6408@phenom.dumpdata.com>
Message-ID: <alpine.DEB.2.00.1111141101570.3519@kaball-desktop>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-8-git-send-email-anthony.perard@citrix.com>
	<20111110212840.GA23643@phenom.dumpdata.com>
	<alpine.DEB.2.00.1111111627430.8085@perard.uk.xensource.com>
	<20111111180542.GA6408@phenom.dumpdata.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Allen Kay <allen.m.kay@intel.com>,
	QEMU-devel <qemu-devel@nongnu.org>, Guy Zana <guy@neocleus.com>,
	Anthony Perard <anthony.perard@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, 11 Nov 2011, Konrad Rzeszutek Wilk wrote:
> > > > +                hw_error("Internal error: Invalid write emulation "
> > > > +                         "return value[%d]. I/O emulator exit.\n", rc);
> > >
> > > Oh. I hadn't realized this, but you are using hw_error. Which is
> > > calling 'abort'! Yikes. Is there no way to recover from this? Say return 0xfffff?
> > 
> > In qemu-xen-traditionnal, it was an exit(1). I do not know the
> > consequence of a bad write, and I can not return anythings. So I suppose
> > that the guest would know that somethings wrong only on the next read.
> > 
> > Instead of abort();, I can just do nothing and return. Or we could unplug
> > the device from QEMU.
> > 
> > Any preference?
> 
> I think this calls for an experiment. If Linux still functions if you completly
> unplug the device, then I would say unplug it (b/c in most likelyhood the reason
> you can't write is b/c the host has unplugged the device).

It would make sense to try to PCI hot-unplug the device, however
considering that it requires guest support, it cannot be used to safely
handle an error like this one. Also it requires some interactions that
might not be possible anymore at this point.
I would destroy the domain instead, using a graceful shutdown if
possible. Something similar to libxl_domain_shutdown.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 03:28:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 03:28:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPuiL-0008TJ-TB; Mon, 14 Nov 2011 03:28:37 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPuhV-0008Gq-8c; Mon, 14 Nov 2011 03:27:45 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1321270061!3424985!1
X-Originating-IP: [80.70.172.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6228 invoked from network); 14 Nov 2011 11:27:42 -0000
Received: from dgate10.ts.fujitsu.com (HELO dgate10.ts.fujitsu.com)
	(80.70.172.49)
	by server-6.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 11:27:42 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Message-ID:Date:From:Organization:
	User-Agent:MIME-Version:To:CC:Subject:References:
	In-Reply-To:Content-Type:Content-Transfer-Encoding;
	b=huGHU5ocQC0Pl+GaIPPAJO+ivh/OCsu1VwXhfDrWamoLYLFgrHShV6Cc
	MVGRg27PRclob7mQr4woLfo6lkwAyeeLviTvdFuPhe/FQ0x2yjfWj8C7P
	hSR/4aib/ZKUudruJapwfPupBYKBvFlkSzpS36wUR8SRwq8GDfyJ13+P/
	y+oLorQx70ygx+FwEg86JZwD+hpBr5rE20lvEJ2hn8B8//oC5o7Zkqb7u
	ZVrWTSyIgHIRIz7OxFbKxp4O3UsjD;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1321270062; x=1352806062;
	h=message-id:date:from:mime-version:to:cc:subject:
	references:in-reply-to:content-transfer-encoding;
	bh=UEC+QJnb204i8f9ZyUYFHHVmsCWrA6Hmv8v1rsatazA=;
	b=gPzpMa1eygIVtUT0Rl5WvyOMCupdCXurHZPZSEMpperO1BLHwbCnXSEY
	yCvQHo+8OXMdo4QVTqluaT7c/tgx66nZONcq3/ZeRmht1nyjv6DN7005U
	RATKkIguvZ2m6XrEF1/QvMflAFRWcJv+bdEHL6agc3O2gL5CDv5P+Pv33
	vLKJgq1JLjOfK+3sqg1+gkDKUR3GMNFIb1fMIDfNVrupK1QDxR6m1zlPC
	rE+ZGPy3iY/nzvE0uYJWF0OZJPOh4;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,508,1315173600"; d="scan'208";a="92970703"
Received: from abgdgate40u.abg.fsc.net ([172.25.138.90])
	by dgate10u.abg.fsc.net with ESMTP; 14 Nov 2011 12:27:41 +0100
X-IronPort-AV: E=Sophos;i="4.69,506,1315173600"; d="scan'208";a="123411441"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate40u.abg.fsc.net with ESMTP; 14 Nov 2011 12:27:41 +0100
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id 3D986A1C20;
	Mon, 14 Nov 2011 12:27:41 +0100 (CET)
Message-ID: <4EC0FB2D.6020905@ts.fujitsu.com>
Date: Mon, 14 Nov 2011 12:27:41 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
Organization: Fujitsu Technology Solutions
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20111010 Iceowl/1.0b2 Icedove/3.1.15
MIME-Version: 1.0
To: George Dunlap <george.dunlap@citrix.com>
Subject: Re: [Xen-devel] Re: [Xen-users] Xen 4.1.1 crash when manipulating
	cpupools.
References: <553832861.1721802.1321046283027.JavaMail.root@sz0032a.westchester.pa.mail.comcast.net>	<4EC0DD6A.7040007@ts.fujitsu.com>
	<1321269186.14063.6.camel@elijah>
In-Reply-To: <1321269186.14063.6.camel@elijah>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Cc: George Dunlap <George.Dunlap@eu.citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	"andrewpitman@comcast.net" <andrewpitman@comcast.net>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/14/2011 12:13 PM, George Dunlap wrote:
> On Mon, 2011-11-14 at 09:20 +0000, Juergen Gross wrote:
>> On 11/11/2011 10:18 PM, andrewpitman@comcast.net wrote:
>>> Juergen,
>>>
>>> It doesn't look like this has been fixed.  I managed to get my 4.1.2
>>> server to crash when setting the weight of Domain-0 (running in
>>> Pool-0 using credit2) and again when moving some cpus into a new
>>> cpupool which was set up to use the credit2 scheduler.
>>>
>> Yeah, I could reproduce your problems on my machine.
>>
>> George, I see two problems in credit2:
>>
>> - when setting the weight of dom0, vcpu_schedule_lock_irq(current)
>> will be
>>    taken in sched_adjust() of schedule.c and again in csched_dom_cntl()
>> of
>>    sched_credit2.c resulting in a deadlock.
> Yes, this one was recently brought to my attention.  Unfortunately I'm
> not sure when I'm going to be able to get to it.
>
> My big problem is actually testing; I don't have a good way to test
> xen-unstable effectively right now.  Juergen, if I were to send you a
> prototype patch, could you test it and fix it up if it doesn't work
> exactly right?

Sure.


Juergen

-- 
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: juergen.gross@ts.fujitsu.com
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 03:35:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 03:35:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPupR-0001CU-7o; Mon, 14 Nov 2011 03:35:57 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPuoZ-0000zb-Bf
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 03:35:04 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1321270497!3031543!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17405 invoked from network); 14 Nov 2011 11:34:58 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 11:34:58 -0000
X-IronPort-AV: E=Sophos;i="4.69,508,1315195200"; d="scan'208";a="19067419"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 06:34:57 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.65) with Microsoft SMTP Server id
	8.3.137.0; Mon, 14 Nov 2011 06:34:56 -0500
Received: from cosworth.uk.xensource.com (cosworth.uk.xensource.com
	[10.80.16.52])	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	pAEBYstn014722;	Mon, 14 Nov 2011 03:34:55 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 0bb3127d015a558026443c3ea890d1025afe2585
Message-ID: <0bb3127d015a55802644.1321270494@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Mon, 14 Nov 2011 11:34:54 +0000
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH] docs: remove some fatally out of date
	documentation
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1321030007 0
# Node ID 0bb3127d015a558026443c3ea890d1025afe2585
# Parent  645fb3ea5652ab7c2b2735fa4118a12f3afa718b
docs: remove some fatally out of date documentation

I think these are better off deleted than remaining to confuse people.

docs/misc/blkif-drivers-explained.txt:

 - Talks about Xen 2.0 beta, talks about the old pre-xenstored IPC mechanism.

docs/misc/cpuid-config-for-guest.txt:

 - Doesn't really say anything, in particular doesn't actually describe how to
   configure CPUID.

docs/misc/hg-cheatsheet.txt:

 - Not out of date per-se wrt mercural but talk about Xen 2.0 and gives URLs
   under www.cl.cam.ac.uk. Talks a lot about bitkeeper. Given that mercurial is
   hardly unusual anymore I think there must be better guides out there so this
   one is not worth resurecting.

docs/misc/network_setup.txt:

 - This is more comprehensively documented on the wiki these days.

docs/misc/VMX_changes.txt:

 - Is basically a changelog from the initial implementation of VMX in 2004.

I'm not sure about some of the other docs, but these ones seemed fairly
obvious.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 645fb3ea5652 -r 0bb3127d015a docs/misc/VMX_changes.txt
--- a/docs/misc/VMX_changes.txt	Fri Nov 11 16:24:59 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-Changes to Xen in support of Intel(R) Vanderpool Technology
--------------------------------------------------------------
-
-Our VT extensions to the Xen hypervisor provide full platform
-virtualization, including CPU(s), memory, and I/O infrastructure. The
-generic code in Xen handles and schedules those virtual machines as it
-does for the existing para-virtualized domains.
-
-Full virtualization required by the OS guests requires full device
-virtualization as well. The device models in BOCHS
-(http://bochs.sourceforge.net/) were decoupled from the CPU
-virtualization, and are used to virtualize the legacy devices (such as
-keyboard, mouse, VGA, IDE) in the PC platform. At this point, the
-device models run in user mode on domain 0, not in the Xen hypervisor.
-
-We would like to thank Ian Pratt and Keir Fraser for reviewing our
-design and code intensively, and for providing numerous useful
-suggestions to improve the architecture and code. 
-
-We have a list of Intel team members who take credit for making this
-release happen: Yunhong Jiang, Nitin Kamble, Chengyuan Li, Xin Li,
-Xiaofeng Ling, Benjamin Liu, Asit Mallick, Jun Nakajima, Sunil Saxena,
-Arun Sharma, Edwin Zhai, Jeff Zheng, and Louis Zhuang. We'll continue
-to add more features to complete full virtualization in Xen using VT.
-
-The notes document the changes to the Xen hypervisor in order to add
-VT support. The changes to other areas, such as Control Panel will be
-added as we deliver the code.
-
-Summary of changes for the first release
-----------------------------------------
-December 15, 2004
-
-    * VT specific event handling and domain management were added. 
-
-    * Shadow mode was extended to support full 32-bit guests
-    
-    * Domain switching code was extended to support VT domain
-    
-    * I/O request handling was added to communicate with the device model
-
-    * Domain builder was extended to provide the environment when the
-      guest enters the protected mode, including E820 memory and VGA
-      info, typically obtained by BIOS calls.
-
-New code:
----------
-    VT (Vanderpool Technology) is based on the new VMX (Virtual
-    Machine Extensions) architecture. The current release of the
-    software supports 32-bit only.
-
-    * arch/x86/vmx.[ch] and arch/x86/vmx_*.[ch]: created to handle
-      VMX-specific events in order to provide virtual machine.
-
-    * arch/x86/x86_32/entry.S: new code path was added to have the
-      first-level handler from VM exits. The first-level handler calls
-      the second-level handler in arch/x86/vmx.c.
-
-    * arch/x86/setup.c: new function start_vmx() to init_intel() to
-      enable VMX mode.
-
-    * include/asm-x86/config.h: #ifdef CONFIG_VMX was added.
-
-    * arch/x86/domain.c: new code patch was added to create a VMX
-      domain given the flag from the control panel.
-
-    * include/public/io/ioreq.h: A new data structure was added to
-      define the I/O requests between the Xen hypervisor and the
-      device models.
-
-Changes to the existing code:
------------------------------
-
-    * arch/x86/shadow.[ch]: new mode SHM_full_32 was added to support
-      full virtualization. The current Xen code assumes that the guest
-      page directory and tables have _machine_ (or host) physical page
-      frame numbers, and the new code allows to support _guest_
-      physical page frame numbers
-
-    * include/asm-x86/processor.h: struct arch_vmx_struct arch_vmx has
-      been added to the thread_struct data structure. The arch_vmx has
-      the additional VMX-related CPU context.
-
-    * arch/x86/io_apic.c: reverse mapping between vector and irq has
-      been added. We will revisit this code when considering MSI
-      support.
-
---- Jun
-
-
diff -r 645fb3ea5652 -r 0bb3127d015a docs/misc/blkif-drivers-explained.txt
--- a/docs/misc/blkif-drivers-explained.txt	Fri Nov 11 16:24:59 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,485 +0,0 @@
-=== How the Blkif Drivers Work ===
-Andrew Warfield
-andrew.warfield@cl.cam.ac.uk
-
-The intent of this is to explain at a fairly detailed level how the
-split device drivers work in Xen 1.3 (aka 2.0beta).  The intended
-audience for this, I suppose, is anyone who intends to work with the
-existing blkif interfaces and wants something to help them get up to
-speed with the code in a hurry.  Secondly though, I hope to break out
-the general mechanisms that are used in the drivers that are likely to
-be necessary to implement other drivers interfaces.
-
-As a point of warning before starting, it is worth mentioning that I
-anticipate much of the specifics described here changing in the near
-future.  There has been talk about making the blkif protocol
-a bit more efficient than it currently is.  Keir's addition of grant
-tables will change the current remapping code that is used when shared
-pages are initially set up.
-
-Also, writing other control interface types will likely need support
-from Xend, which at the moment has a steep learning curve... this
-should be addressed in the future.
-
-For more information on the driver model as a whole, read the
-"Reconstructing I/O" technical report
-(http://www.cl.cam.ac.uk/Research/SRG/netos/papers/2004-xenngio.pdf).
-
-==== High-level structure of a split-driver interface ====
-
-Why would you want to write a split driver in the first place?  As Xen
-is a virtual machine manager and focuses on isolation as an initial
-design principle, it is generally considered unwise to share physical
-access to devices across domains.  The reasons for this are obvious:
-when device resources are shared, misbehaving code or hardware can
-result in the failure of all of the client applications.  Moreover, as
-virtual machines in Xen are entire OSs, standard device drives that
-they might use cannot have multiple instantiations for a single piece
-of hardware.  In light of all this, the general approach in Xen is to
-give a single virtual machine hardware access to a device, and where
-other VMs want to share the device, export a higher-level interface to
-facilitate that sharing.  If you don't want to share, that's fine.
-There are currently Xen users actively exploring running two
-completely isolated X-Servers on a Xen host, each with it's own video
-card, keyboard, and mouse.  In these situations, the guests need only
-be given physical access to the necessary devices and left to go on
-their own.  However, for devices such as disks and network interfaces,
-where sharing is required, the split driver approach is a good
-solution.
-
-The structure is like this:
-
-   +--------------------------+  +--------------------------+
-   | Domain 0 (privileged)    |  | Domain 1 (unprivileged)  |
-   |                          |  |                          |
-   | Xend ( Application )     |  |                          |
-   | Blkif Backend Driver     |  | Blkif Frontend Driver    |
-   | Physical Device Driver   |  |                          |
-   +--------------------------+  +--------------------------+
-   +--------------------------------------------------------+
-   |                X       E       N                       |
-   +--------------------------------------------------------+
-
-
-The Blkif driver is in two parts, which we refer to as frontend (FE)
-and a backend (BE).  Together, they serve to proxy device requests
-between the guest operating system in an unprivileged domain, and the
-physical device driver in the physical domain.  An additional benefit
-to this approach is that the FE driver can provide a single interface
-for a whole class of physical devices.  The blkif interface mounts
-IDE, SCSI, and our own VBD-structured disks, independent of the
-physical driver underneath.  Moreover, supporting additional OSs only
-requires that a new FE driver be written to connect to the existing
-backend.
-
-==== Inter-Domain Communication Mechanisms ====
-
-===== Event Channels =====
-
-Before getting into the specifics of the block interface driver, it is
-worth discussing the mechanisms that are used to communicate between
-domains.  Two mechanisms are used to allow the construction of
-high-performance drivers: event channels and shared-memory rings.
-
-Event channels are an asynchronous interdomain notification
-mechanism.  Xen allows channels to be instantiated between two
-domains, and domains can request that a virtual irq be attached to
-notifications on a given channel.  The result of this is that the
-frontend domain can send a notification on an event channel, resulting
-in an interrupt entry into the backend at a later time.
-
-The event channel between two domains is instantiated in the Xend code
-during driver startup (described later).  Xend's channel.py
-(tools/python/xen/xend/server/channel.py) defines the function
-
-
-def eventChannel(dom1, dom2):
-    return xc.evtchn_bind_interdomain(dom1=dom1, dom2=dom2)
-
-
-which maps to xc_evtchn_bind_interdomain() in tools/libxc/xc_evtchn.c,
-which in turn generates a hypercall to Xen to patch the event channel
-between the domains.  Only a privileged domain can request the
-creation of an event channel.
-
-Once the event channel is created in Xend, its ends are passed to both the
-front and backend domains over the control channel.  The end that is
-passed to a domain is just an integer "port" uniquely identifying the
-event channel's local connection to that domain.  An example of this
-setup code is in linux-2.6.x/drivers/xen/blkfront/blkfront.c in
-blkif_connect(), which receives several status change events as
-the driver starts up.  It is passed an event channel end in a
-BLKIF_INTERFACE_STATUS_CONNECTED message, and patches it in like this:
-
-
-   blkif_evtchn = status->evtchn;
-   blkif_irq    = bind_evtchn_to_irq(blkif_evtchn);
-   if ( (rc = request_irq(blkif_irq, blkif_int, 
-                          SA_SAMPLE_RANDOM, "blkif", NULL)) )
-       printk(KERN_ALERT"blkfront request_irq failed (%ld)\n",rc);
-
-
-This code associates a virtual irq with the event channel, and
-attaches the function blkif_int() as an interrupt handler for that
-irq.  blkif_int() simply handles the notification and returns, it does
-not need to interact with the channel at all.
-
-An example of generating a notification can also be seen in blkfront.c:
-
-
-static inline void flush_requests(void)
-{
-    DISABLE_SCATTERGATHER();
-    wmb(); /* Ensure that the frontend can see the requests. */
-    blk_ring->req_prod = req_prod;
-    notify_via_evtchn(blkif_evtchn);
-}
-}}}
-
-notify_via_evtchn() issues a hypercall to set the event waiting flag on
-the other domain's end of the channel.
-
-===== Communication Rings =====
-
-Event channels are strictly a notification mechanism between domains.
-To move large chunks of data back and forth, Xen allows domains to
-share pages of memory.  We use communication rings as a means of
-managing access to a shared memory page for message passing between
-domains.  These rings are not explicitly a mechanism of Xen, which is
-only concerned with the actual sharing of the page and not how it is
-used, they are however worth discussing as they are used in many
-places in the current code and are a useful model for communicating
-across a shared page.
-
-A shared page is set up by a front end guest first allocating and passing 
-the address of a page in its own address space to the backend driver.  
-
-Consider the following code, also from blkfront.c.  Note:  this code
-is in blkif_disconnect().  The driver transitions from STATE_CLOSED
-to STATE_DISCONNECTED before becoming CONNECTED.  The state automata
-is in blkif_status().
-
-   blk_ring = (blkif_ring_t *)__get_free_page(GFP_KERNEL);
-   blk_ring->req_prod = blk_ring->resp_prod = resp_cons = req_prod = 0;
-   ...
-   /* Construct an interface-CONNECT message for the domain controller. */
-   cmsg.type      = CMSG_BLKIF_FE;
-   cmsg.subtype   = CMSG_BLKIF_FE_INTERFACE_CONNECT;
-   cmsg.length    = sizeof(blkif_fe_interface_connect_t);
-   up.handle      = 0;
-   up.shmem_frame = virt_to_machine(blk_ring) >> PAGE_SHIFT;
-   memcpy(cmsg.msg, &up, sizeof(up));  
-
-
-blk_ring will be the shared page.  The producer and consumer pointers
-are then initialised (these will be discussed soon), and then the
-machine address of the page is send to the backend via a control
-channel to Xend.  This control channel itself uses the notification
-and shared memory mechanisms described here, but is set up for each
-domain automatically at startup.
-
-The backend, which is a privileged domain then takes the page address
-and maps it into its own address space (in
-linux26/drivers/xen/blkback/interface.c:blkif_connect()):
-
-
-void blkif_connect(blkif_be_connect_t *connect)
-
-   ...
-   unsigned long shmem_frame = connect->shmem_frame;
-   ...
-
-   if ( (vma = get_vm_area(PAGE_SIZE, VM_IOREMAP)) == NULL )
-   {
-      connect->status = BLKIF_BE_STATUS_OUT_OF_MEMORY;
-      return;
-   }
-
-   prot = __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED);
-   error = direct_remap_area_pages(&init_mm, VMALLOC_VMADDR(vma->addr),
-                                   shmem_frame<<PAGE_SHIFT, PAGE_SIZE,
-                                   prot, domid);
-
-   ...
-
-   blkif->blk_ring_base = (blkif_ring_t *)vma->addr
-}}}
-
-The machine address of the page is passed in the shmem_frame field of
-the connect message.  This is then mapped into the virtual address
-space of the backend domain, and saved in the blkif structure
-representing this particular backend connection.
-
-NOTE:  New mechanisms will be added very shortly to allow domains to
-explicitly grant access to their pages to other domains.  This "grant
-table" support is in the process of being added to the tree, and will
-change the way a shared page is set up.  In particular, it will remove
-the need of the remapping domain to be privileged.
-
-Sending data across shared rings:
-
-Shared rings avoid the potential for write interference between
-domains in a very cunning way.  A ring is partitioned into a request
-and a response region, and domains only work within their own space.
-This can be thought of as a double producer-consumer ring -- the ring
-is described by four pointers into a circular buffer of fixed-size
-records.  Pointers may only advance, and may not pass one another.
-
-
-                         resp_cons----+
-                                      V
-           +----+----+----+----+----+----+----+
-           |    |    |  free(A)     |RSP1|RSP2|
-           +----+----+----+----+----+----+----+
- req_prod->|    |       -------->        |RSP3|
-           +----+                        +----+
-           |REQ8|                        |    |<-resp_prod
-           +----+                        +----+
-           |REQ7|                        |    |
-           +----+                        +----+
-           |REQ6|       <--------        |    |
-           +----+----+----+----+----+----+----+
-           |REQ5|REQ4|    free(B)   |    |    |
-           +----+----+----+----+----+----+----+
-  req_cons---------^
-
-
-
-By adopting the convention that every request will receive a response,
-not all four pointers need be shared and flow control on the ring
-becomes very easy to manage.  Each domain manages its own
-consumer pointer, and the two producer pointers are visible to both
-(xen/include/public/io/blkif.h):
-
-
-/* NB. Ring size must be small enough for sizeof(blkif_ring_t) <=PAGE_SIZE.*/
-  #define BLKIF_RING_SIZE        64
-
-  ...
-
-/*
- * We use a special capitalised type name because it is _essential_ that all
- * arithmetic on indexes is done on an integer type of the correct size.
- */
-typedef u32 BLKIF_RING_IDX;
-
-/*
- * Ring indexes are 'free running'. That is, they are not stored modulo the
- * size of the ring buffer. The following macro converts a free-running counter
- * into a value that can directly index a ring-buffer array.
- */
-#define MASK_BLKIF_IDX(_i) ((_i)&(BLKIF_RING_SIZE-1))
-
-typedef struct {
-    BLKIF_RING_IDX req_prod;  /*  0: Request producer. Updated by front-end. */
-    BLKIF_RING_IDX resp_prod; /*  4: Response producer. Updated by back-end. */
-    union {                   /*  8 */
-        blkif_request_t  req;
-        blkif_response_t resp;
-    } PACKED ring[BLKIF_RING_SIZE];
-} PACKED blkif_ring_t;
-
-
-
-As shown in the diagram above, the rules for using a shared memory
-ring are simple.  
-
- 1. A ring is full when a domain's producer and consumer pointers are
-    equal (e.g. req_prod == resp_cons).  In this situation, the
-    consumer pointer must be advanced.  Furthermore, if the consumer
-    pointer is equal to the other domain's producer pointer,
-    (e.g. resp_cons = resp_prod), then the other domain has all the
-    buffers.
-
-2. Producer pointers point to the next buffer that will be written to.
-   (So blk_ring[MASK_BLKIF_IDX(req_prod)] should not be consumed.)
-
-3. Consumer pointers point to a valid message, so long as they are not
-   equal to the associated producer pointer.
-
-4. A domain should only ever write to the message pointed
-   to by its producer index, and read from the message at it's
-   consumer.  More generally, the domain may be thought of to have
-   exclusive access to the messages between its consumer and producer,
-   and should absolutely not read or write outside this region.
-
-   Thus the front end has exclusive access to the free(A) region 
-   in the figure above, and the back end driver has exclusive
-   access to the free(B) region.
-
-In general, drivers keep a private copy of their producer pointer and
-then set the shared version when they are ready for the other end to
-process a set of messages.  Additionally, it is worth paying attention
-to the use of memory barriers (rmb/wmb) in the code, to ensure that
-rings that are shared across processors behave as expected.
-
-==== Structure of the Blkif Drivers ====
-
-Now that the communications primitives have been discussed, I'll
-quickly cover the general structure of the blkif driver.  This is
-intended to give a high-level idea of what is going on, in an effort
-to make reading the code a more approachable task.
-
-There are three key software components that are involved in the blkif
-drivers (not counting Xen itself).  The frontend and backend driver,
-and Xend, which coordinates their initial connection.  Xend may also
-be involved in control-channel signalling in some cases after startup,
-for instance to manage reconnection if the backend is restarted.
-
-===== Frontend Driver Structure =====
-
-The frontend domain uses a single event channel and a shared memory
-ring to trade control messages with the backend.  These are both setup
-during domain startup, which will be discussed shortly.  The shared
-memory ring is called blkif_ring, and the private ring indexes are
-resp_cons, and req_prod.  The ring is protected by blkif_io_lock.
-Additionally, the frontend keeps a list of outstanding requests in
-rec_ring[].  These are uniquely identified by a guest-local id number,
-which is associated with each request sent to the backend, and
-returned with the matching responses.  Information about the actual
-disks are stored in major_info[], of which only the first nr_vbds
-entries are valid.  Finally, the global 'recovery' indicates that the
-connection between the backend and frontend drivers has been broken
-(possibly due to a backend driver crash) and that the frontend is in
-recovery mode, in which case it will attempt to reconnect and reissue
-outstanding requests.
-
-The frontend driver is single-threaded and after setup is entered only
-through three points:  (1) read/write requests from the XenLinux guest
-that it is a part of, (2) interrupts from the backend driver on its
-event channel (blkif_int()), and (3) control messages from Xend
-(blkif_ctrlif_rx).
-
-===== Backend Driver Structure =====
-
-The backend driver is slightly more complex as it must manage any
-number of concurrent frontend connections.  For each domain it
-manages, the backend driver maintains a blkif structure, which
-describes all the connection and disk information associated with that
-particular domain.  This structure is associated with the interrupt
-registration, and allows the backend driver to have immediate context
-when it takes a notification from some domain.
-
-All of the blkif structures are stored in a hash table (blkif_hash),
-which is indexed by a hash of the domain id, and a "handle", really a
-per-domain blkif identifier, in case it wants to have multiple connections.
-
-The per-connection blkif structure is of type blkif_t.  It contains
-all of the communication details (event channel, irq, shared memory
-ring and indexes), and blk_ring_lock, which is the backend mutex on
-the shared ring.  The structure also contains vbd_rb, which is a
-red-black tree, containing an entry for each device/partition that is
-assigned to that domain.  This structure is filled by xend passing
-disk information to the backend at startup, and is protected by
-vbd_lock.  Finally, the blkif struct contains a status field, which
-describes the state of the connection.
-
-The backend driver spawns a kernel thread at startup
-(blkio_schedule()), which handles requests to and from the actual disk
-device drivers.  This scheduler thread maintains a list of blkif
-structures that have pending requests, and services them round-robin
-with a maximum per-round request limit.  blkifs are added to the list
-in the interrupt handler (blkif_be_int()) using
-add_to_blkdev_list_tail(), and removed in the scheduler loop after
-calling do_block_io_op(), which processes a batch of requests.  The
-scheduler thread is explicitly activated at several points in the code
-using maybe_trigger_blkio_schedule().
-
-Pending requests between the backend driver and the physical device
-drivers use another ring, pending_ring.  Requests are placed in this
-ring in the scheduler thread and issued to the device.  A completion
-callback, end_block_io_op, indicates that requests have been serviced
-and generates a response on the appropriate blkif ring.  pending
-reqs[] stores a list of outstanding requests with the physical drivers.
-
-So, control entries to the backend are (1) the blkio scheduler thread,
-which sends requests to the real device drivers, (2) end_block_io_op,
-which is called as serviced requests complete, (3) blkif_be_int()
-handles notifications from the frontend drivers in other domains, and
-(4) blkif_ctrlif_rx() handles control messages from xend.
-
-==== Driver Startup ====
-
-Prior to starting a new guest using the frontend driver, the backend
-will have been started in a privileged domain.  The backend
-initialisation code initialises all of its data structures, such as
-the blkif hash table, and starts the scheduler thread as a kernel
-thread. It then sends a driver status up message to let xend know it
-is ready to take frontend connections.
-
-When a new domain that uses the blkif frontend driver is started,
-there are a series of interactions between it, xend, and the specified
-backend driver.  These interactions are as follows:
-
-The domain configuration given to xend will specify the backend domain
-and disks that the new guest is to use.  Prior to actually running the
-domain, xend and the backend driver interact to setup the initial
-blkif record in the backend.
-
-(1) Xend sends a BLKIF_BE_CREATE message to backend.
-
-  Backend does blkif_create(), having been passed FE domid and handle.
-  It creates and initialises a new blkif struct, and puts it in the
-  hash table.
-  It then returns a STATUS_OK response to xend.
-
-(2) Xend sends a BLKIF_BE_VBD_CREATE message to the backend.
- 
-  Backend adds a vbd entry in the red-black tree for the
-  specified (dom, handle) blkif entry.
-  Sends a STATUS_OK response.
-
-(3) Xend sends a BLKIF_BE_VBD_GROW message to the backend.
-
-  Backend takes the physical device information passed in the 
-  message and assigns them to the newly created vbd struct.
-
-(2) and (3) repeat as any additional devices are added to the domain.
-
-At this point, the backend has enough state to allow the frontend
-domain to start.  The domain is run, and eventually gets to the
-frontend driver initialisation code.  After setting up the frontend
-data structures, this code continues the communications with xend and
-the backend to negotiate a connection:
-
-(4) Frontend sends Xend a BLKIF_FE_DRIVER_STATUS_CHANGED message.
-
-  This message tells xend that the driver is up.  The init function
-  now spin-waits until driver setup is complete in order to prevent
-  Linux from attempting to boot before the disks are connected.
-
-(5) Xend sends the frontend an INTERFACE_STATUS_CHANGED message
-
-  This message specifies that the interface is now disconnected
-  (instead of closed).
-  The domain updates it's state, and allocates the shared blk_ring
-  page.  Next, 
-
-(6) Frontend sends Xend a BLKIF_INTERFACE_CONNECT message
-
-  This message specifies the domain and handle, and includes the
-  address of the newly created page.
-
-(7) Xend sends the backend a BLKIF_BE_CONNECT message
-
-  The backend fills in the blkif connection information, maps the
-  shared page, and binds an irq to the event channel.
-  
-(8) Xend sends the frontend an INTERFACE_STATUS_CHANGED message
-
-  This message takes the frontend driver to a CONNECTED state, at
-  which point it binds an irq to the event channel and calls
-  xlvbd_init to initialise the individual block devices.
-
-The frontend Linux is stall spin waiting at this point, until all of
-the disks have been probed.  Messaging now is directly between the
-front and backend domain using the new shared ring and event channel.
-
-(9) The frontend sends a BLKIF_OP_PROBE directly to the backend.
-
-  This message includes a reference to an additional page, that the
-  backend can use for it's reply.  The backend responds with an array
-  of the domains disks (as vdisk_t structs) on the provided page.
-
-The frontend now initialises each disk, calling xlvbd_init_device()
-for each one.
diff -r 645fb3ea5652 -r 0bb3127d015a docs/misc/cpuid-config-for-guest.txt
--- a/docs/misc/cpuid-config-for-guest.txt	Fri Nov 11 16:24:59 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-CPUID emulation for guest
--------------------------
-
-When HVM guest tries to execute CPUID, or PV guest tries to execute XEN_CPUID,
-the xen hypervior traps and emultes them.
-
-For HVM guest and PV DomU guest, xen's CPUID emulation can be adjusted using
-the guest configation file if necessary (e.g., to supply better support for
-guest live migration). The CPUID syntax in guest configration file is
-described in detail in the examples like /etc/xen/xmexample.hvm,
-/etc/xen/xmexample.hvm-stubdom.
-
-However, a user (or an administrator) must be aware that the CPUID in guest
-configuration file can NOT be configured casually. The default CPUID
-configuration should be safe, but illegal configuration can cause unexpected
-behaviors of guest -- even can crash guest.
-
-For example, we should not expose the MONITOR CPUID feature flag (ECX bit 3;
-CPUID executed EAX = 1) to HVM guest, otherwise, on guest's attempt of
-executing MWAIT, the VMExit handler in Xen would inject #UD (Invalid Opcode
-Exception) into the HVM guest, and guest kernel would panic.
-
-/* We can add more unsafe CPUID configuration here in future. */
diff -r 645fb3ea5652 -r 0bb3127d015a docs/misc/hg-cheatsheet.txt
--- a/docs/misc/hg-cheatsheet.txt	Fri Nov 11 16:24:59 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,438 +0,0 @@
-
-Mercurial(hg) Cheatsheet for Xen
-================================
-
-Written by Andrew Warfield, extended by Michael Fetterman and Ian Pratt
-June 29, 2005, extended by Grzegorz Milos 04 July 2005.
-
-Overview
---------
-The Xen project has moved from BitKeeper to Mercurial for source
-control.  This note aims to provide a quick guide to getting up and
-running with the new tools as quickly as possible, and is written from
-the perspective of someone who has been using BK.
-
-For a more detailed exposition, see the mercurial tutorial:
- http://www.serpentine.com/mercurial/index.cgi?Tutorial
-
-The Hg manpage is available at:
- http://www.selenic.com/mercurial/hg.1.html
-
-There's also a very useful FAQ that explains the terminology:
- http://www.selenic.com/mercurial/FAQ.html
-
-There's also a good README:
- http://www.selenic.com/mercurial/README
-
-Necessary software
-------------------
-Mercurial is available at:
-  http://www.selenic.com/mercurial/ 
-
-You will also need a Python version >= 2.3
-
-How Mercurial is different from BK
-----------------------------------
-There are several pertinent differences between hg and bk.  This
-section aims to give an overview of the conceptual differences between
-the two SCMs -- if you just want examples to get going, skip ahead to
-"Getting Xen". The key differences are:
-
-  - No explicit per-file locking.  You do not need to explicitly 
-    check a file out before editing it.
-  - No notion (currently) of file renames.
-  - A repository can have multiple active heads.
-  - Automatic merge support is currently inferior to BK's.
-  - No graphical tools.
-  - No per-file revision history, only per-changeset (we never really used this anyhow)
-  - Hg repositories tend to be rather bigger than Bk ones, but Hg does seem faster.
-
-Mercurial is based on the notion of changesets as complete, immutable,
-versions of the repository.  You make changes to a working version of
-the repository that is based on a particular changeset.  When you
-commit, you will generate a new child changeset with whatever changes
-you choose to apply.
-
-A major difference between Hg and BK is that you aren't forced to
-resolve conflicts immediately: BK forced you to resolve conflicts
-immediately on any merge, and it then immediately created a changeset
-with those conflicts' resolutions.  Frequently, you then had to add
-yet another changeset to fixup the things for which the automatic
-merge yielded bad results. Hg puts the results of the merge into your
-work directory, and remembers what you merged with (so that it can
-later record both of the merge parents, if you decide to make a
-changeset), but it doesn't immediately create a changeset.
-
-A further feature of Hg is that it allows a repository to have
-multiple heads. This means that you can have changesets with no common
-descendent in one repository -- something BK won't allow. This is
-actually pretty neat. For example, it would in principle enable you to
-have both the 2.0-testing and unstable trees in a single
-repository. We shyed away from doing this as we thought the risk of
-committing to the wrong head was too great.
-
-One slightly confusing aspect of Hg is that many of the commands have
-aliases, and hence when looking things up in the man page its not
-always obvious what the underlying command is. For example 'co' is
-actually an alias for the 'update' command, but 'co' seems to make
-more sense, at least to RCS refugees like me.
-
-
-Getting Xen
------------
-
-The URL for the mainline Xen mercurial repository is:
-
-   http://xenbits.xensource.com/xen-unstable.hg
-   (similarly for xen-2.0 and xen-2.0-testing)
-
-You can point a browser and this and use Hg's web interface to view
-revision history, or use it as the nominated source when issuing
-"hg init" or "hg pull" commands. 
-
-However, to avoid taxing the Mercurial server with a complete pull of
-the Xen repository, it is best to download a tarball of a seed
-repository from:
- 
-  http://www.cl.cam.ac.uk/Research/SRG/netos/xen/downloads/xen-unstable.hg.tar.gz
-
-  (or copy from /usr/groups/netos/html/xen/downloads/xen-unstable.hg.tar.gz)
-
-Untar the repository on your disk, cd into it, and then pull the most
-recent changes:
-
-  hg pull -u
-
-By default hg does not automatically checkout ('update') files from
-the repository as used to happen with bk. The above is equivalent to
-"hg pull; hg co"
-
-The repository parent is stored in a repository configuration file, 
-.hg/hgrc, from the repository root.  If you look at this file, you 
-will see:
-
-  |  [paths]
-  |  default = http://xenbits.xensource.com/xen-unstable.hg
-
-"default" specifies the appropriate parent repository for hg to pull 
-from.  Hg allows you to pull additional repositories, for instance if 
-you want to work between unstable and testing concurrently.
-
-The command "hg pull" simply adds changesets to your repository,
-without any merging of any kind.  "hg pull -u" implies merging with
-the current state of your working directory.  If you weren't already
-"updated" to your local repository's tip, you might be surprised to
-find yourself merging the results of the pull with a non-tip node in
-your local repository. 
-
-
-Revision History
-----------------
-
-You can view the repository revision history with:
-
-   hg history
-
-In practice, you'll probably want to use pipe the output through
-'head' or 'more' as it prints the entire history.
-
-Looking at the first few lines of output, you can see the changeset at
-the head of the current branch, known as the 'tip' (the tip is
-automatically given a special tag to make it easy to refer to):
-
-   | changeset:   5599:6cbf9ec05cd9e05c0c46a85df7fc00262633cd3d
-   | tag:         tip
-   | user:        kaf24@firebug.cl.cam.ac.uk
-   | date:        Tue Jun 28 18:47:14 2005
-   | summary:     bitkeeper revision 1.1768 (42c18d2259NPELcGV7ohyZNh72ufSw)
-
-By default, Hg just shows the first line of the changset comments. You
-can find further information with "hg -v history".
-
-The changeset identifier has two parts, a _local_ monotonically
-increasing changeset id, 5599 above, and a _global_ hash, which
-follows the colon on the changeset line.  The hash uniquely identifies
-the changeset and its lineage back to the root of the changeset tree
--- it is useful for distributed management and so on.  However, as it
-is a bit unruly, the local id will allow you to work easily with the
-local repo. Hg commands will take either identifier. Additionally, a
-tags mechanism lets you give common names to specific changesets.
-
-You should always use the global hash when referring to versions of
-the mainline Xen respoitory. With Bk you could often get away with
-using the shortform version, but with Hg the local ids are pretty much
-guaranteed to be different.
-
-
-Creating a child repository from an existing repository
--------------------------------------------------------
-If you wanted to create additional local child repositories,
-
-   hg init [path or url]
-
-is effectively equivalent to bk clone.  The major difference is that 
-it should be run from the root of your new repository.  So:
-
-   bk clone /foo/bar
-
-would be replaced with:
-
-   mkdir bar
-   cd bar
-   hg init /foo/bar
-
-NB: newer version of Hg support a 'clone' command that works in the
-same manner as bk.
-
-Editing files
--------------
-
-Normal edits may be made in place.  File creation needs explicit
-marking, though deletes should be picked up automatically
-
-creation:
-
-   touch a.txt (or otherwise created a file)
-   hg add a.txt
-
-You can see what has changed using:
-
-   hg status
-
-   | C foo/foo.c
-   | R foo/bar.c
-   | ? a.txt
-
-This shows that in the current repo, foo.c has been changed, bar.c has
-been deleted, and a.txt is new, but has not been added.  '?' changes
-to 'A' after "hg add a.txt". There is a .hgignore file which contains
-regexps of files that should be ignored when scanning for new
-files. We try to ensure that all the generated files in a build are
-covered by the regexps.
-
-You can add all the new files in a repository with "hg addremove". If
-you discover that you've added a file you didn't want, you can remove
-it from the list of files to be included in the next commit using
-"hg forget".
-
-Committing changes
------------------
-
-After you've checked that hg knows about any new files you've created,
-you probably want to see a diff of what you're about to commit. You
-can do this with:
-   
-   hg diff
-
-Once you're happy with what you have, invoke:
-
-   hg commit
-
-This will pop up an editor with a list of files to be committed to the
-repository.  It will look vaguely like this:
-
-   | 
-   | HG: manifest hash 6397b04bd5c2a992482d973b685a7e5e498788e7
-   | HG: changed doc/thesis/new.tex
-   | HG: removed doc/2005-hotdep-protection/paper.tex
-
-Your comments can go anywhere in this file.  The first line is the 
-most important, as it will show as the changeset description in 
-non-verbose-mode history listings.
-
-You can do commits without the editor and of partial sets of files 
-using command-line switches. See:
-
-   hg help commit
-
-You can use the -A (--addremove) flag to commit e.g. "hg -A commit" to
-ask mercurial to scan the tree looking for newly created files to add
-in to the changeset. This avoids having to explicitly use "hg add",
-but you probably want to be careful of adding any new generated files
-too.
-
-
-Generating a patch
-------------------
-Generating a patch is easy,
-
-   hg export [changeset]
-
-will generate a patch describing the diff between that changeset and 
-its parent.
-    
-To generate a patch between two specified revisions use:
-   hg diff -r A -r B [files]
-NB: BK syntax -rA..B isn't supported by Hg.   
-
-
-Pushing changesets to a parent repository
------------------------------------------
-
-   hg push
-
-Pushes changes up to a parent. You can't push if you pulled the
-repository off the web interface. In fact, you can currently only push
-to an ssh target -- filesystem directory targets don't work, but this
-will be fixed soon.
-For now it is possible to set up asymmetric pull/push paths. Pulls can
-be done via web interface while pushes via ssh. Example of .hg/hgrc config
-file:
-  | [paths]
-  | default = http://your.server/repository_name
-  | default-push = ssh://[username@]your.server//repository_location
-
-
-Repository history
-------------------
-
-Here are a collection of common commands to get you started:
-
-   hg history | less
-
-shows the history of changesets, starting from the most recent.  You 
-want to pipe it to some sort of pager.  For more complete details,
- 
-   hg -v history | less
-
-will include files modified and full (not just first-line) comments.
-
-Additionally, you can see just the tip (head of the current
-branch) of the repository by typing:
-
-   hg [-v] tip
-
-
-Moving to a specific changeset
-------------------------------
-
-The co command lets you change the working version of the repository
-to a different changeset. 
-
-   hg co [changeset]
-
-NB: 'co' is an alias for 'update'
-
-This command enables you to rewind the working repository to previous
-changesets, for example to isolate the changeset in which a bug is
-introduced.
-
-If you try and do a 'co' but have modified files in your repository Hg
-won't let you unless you ask it explicitly to merge the checked out
-version into the current tree using the "-m" option. The "-C"
-(--clean) option will force overwrite any locally modified files.
-
-Any commits that are made to non-head changesets will obviously fork
-the tree, creating a new head. You can see all the heads in a tree with
-"hg heads".
-
-In general, "hg co" does the right thing, although it doesn't
-currently seem to clean up unused directories that have been created
-by other checked-out versions. This can confuse the Xen build
-system. Hg will probably get fixed soon, but in the meantime you can
-cleanup with "find -depth -type d -print | xargs -r rmdir".
-
-You can return to the tip by omitting an explicit changeset id.
-   
-The manifest command lets you see the contents of the repository for 
-the current changeset.
-
-   hg manifest
-
-This will print a bunch of records of the form: 
-
-   | 98856c45c35a504bc6da06a62b7787ddfdfd1c8b 644 COPYING
-   | f28971eedc5b54e7a9b26dd18d52992955354981 644 Config.mk
-   | a3575cc4db59e50bbac8a039a0c74f081a8dfc4f 644 Makefile
-   | 7fc869aae2945a9f4626fad96552db3103e61cb9 644 README
-   | ...
-
-This lists the hash of each file, its 1-bit 'executable' attribute
-(either file permission mode 644 or 755), and the file name.  So, to
-determine the files that change across two changesets, you would dump
-the respective manifests to files, and use diff.
-
-
-Managing changeset tags
------------------------
-To create a tag to the current changeset:
-
-   hg tag tagname
-
-This will _immediately_ generate a changeset with a change to the file
-.hgtags in the repository root.   The new tag in this file will look
-something like:
-
-   | 35159ed4b30538e7a52c60ad0a63f7e9af156e4c tagname
-
-and may be used to identify that changeset throughout the repo.
-Storing tags in this file and generating changesets immediately 
-forces people to merge and keep tags up to date across the repository.
-
-Note that tags are resolved by searching .hgtags in each of the 
-repository heads, sequentially, and using the first match.  "hg heads"
-lists the current heads.
-
-The "hg tags" command, will lists all the currently valid tags.
-
-
-Hg server and source browser
-----------------------------
-
-   hg serve -p port
-
-Launches a web server on the specified port, serving a source browser 
-for the repository.  This browser may be used to examine the 
-changeset history, view annotated source files, generate diffs.  
-Additionally "hg pull" may be run against it.
-
-Additional useful commands
-(that probably only need one-line descriptions)
------------------------------------------------
-
-(Slightly) more detail on all of these is available with
-
-  hg help [command]
-
-Shows the differences between whatever changeset you most recently
-checked out, and your current working directory:
-
-   hg diff 
-
-View an annotated version of a source file:
-
-   hg annotate
-
-Get a historical version of a file:
-
-   hg cat
-
- NB: Most commands accepting a version number want the changeset's
- version number.  "hg cat" is different in that it wants the
- *file*'s version number.
-
-Unadd a file to the current commit:
-
-   hg forget
-
-List all heads in the current repository:
-
-   hg heads
-
-Undo exactly one (and ONLY one) changeset:
-
-   hg undo
-
-Show the parents of a changeset:
-
-   hg parents
-
- NB: Changesets have either one or two parent changesets. If your
- working directory contains the uncommitted results of a merge, then
- you have two parents.  Otherwise, the single parent is the changeset
- which you most recently checked out.
-
-Show the revision history for a single file
-
-   hg [-v] log <filename>
-
diff -r 645fb3ea5652 -r 0bb3127d015a docs/misc/network_setup.txt
--- a/docs/misc/network_setup.txt	Fri Nov 11 16:24:59 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,196 +0,0 @@
-Native OS bridge configuration
-==============================
-
-The traditional "network-bridge" script attempts to modify existing active
-network interfaces to enable bridging. For non-trivial network configurations
-though this can be error prone, and the temporary disruption to network
-connectivity can upset some applications.  This document outlines how to
-configure bridging using an OS' native network configuration files.
-
-Disabling Xen's network scripts
--------------------------------
-
-The first step is to check XenD's network bridge is disabled by
-editing /etc/xen/xend-config.sxp and changing the line
-
- (network-script network-bridge)
-
-To be
-
- (network-script /bin/true)
-
-
-Fedora/RHEL Bridging
-====================
-
-This outlines how to setup bridging using standard network initscripts
-present in Fedora or RHEL distros and their derivatives
-
-
-Disabling NetworkManager
-------------------------
-
-As of time of writing (Fedora 14) NetworkManager does not support bridging,
-so it is neccessary to disable NetworkManager, and revert to "classic"
-network initscripts
-
- # chkconfig NetworkManager off
- # chkconfig network on
- # service NetworkManager stop
- # service network start
-
-NB, as an alternative to turning off NetworkManager, you can also add a line
-"NM_CONTROLLED=no" to the ifcfg-XXX scripts below
-
-Creating network initscripts
-----------------------------
-
-In the /etc/sysconfig/network-scripts directory it is necccessary to create
-2 config files. The first (ifcfg-eth0) defines your physical network interface,
-and says that it will be part of a bridge:
-
-# cat > ifcfg-eth0 <<EOF
-DEVICE=eth0
-HWADDR=00:16:76:D6:C9:45
-ONBOOT=yes
-BRIDGE=br0
-EOF
-
-Obviously change the HWADDR to match your actual NIC's address. You may also
-wish to configure the device's MTU here using e.g. MTU=9000.
-
-The second config file (ifcfg-br0) defines the bridge device:
-
-# cat > ifcfg-br0 <<EOF
-DEVICE=br0
-TYPE=Bridge
-BOOTPROTO=dhcp
-ONBOOT=yes
-DELAY=0
-EOF
-
-WARNING: The line TYPE=Bridge is case-sensitive - it must have uppercase
-'B' and lower case 'ridge'
-
-After changing this restart networking (or better still reboot)
-
- # service network restart
-
-
-The final step is to configure iptables to allow all traffic to be
-forwarded across the bridge
-
-# echo "-I FORWARD -m physdev --physdev-is-bridged -j ACCEPT" > /etc/sysconfig/iptables-forward-bridged
-# lokkit --custom-rules=ipv4:filter:/etc/sysconfig/iptables-forward-bridged
-# service libvirtd reload
-
-Alternatively, you can prevent bridged traffic getting pushed through
-the host's iptables rules completely. In /etc/sysctl.conf add
-
- # cat >> /etc/sysctl.conf <<EOF
- net.bridge.bridge-nf-call-ip6tables = 0
- net.bridge.bridge-nf-call-iptables = 0
- net.bridge.bridge-nf-call-arptables = 0
- EOF
- # sysctl -p /etc/sysctl.conf
-
-You should now have a "shared physical device", to which guests can be
-attached and have full LAN access
-
- # brctl show
- bridge name     bridge id               STP enabled     interfaces
- br0             8000.000e0cb30550       no              eth0
-
-
-
-Debian/Ubuntu Bridging
-=======================
-
-This outlines how to setup bridging using standard network interface config files
-on Debian / Ubuntu distributions and their derivatives
-
-Disabling NetworkManager
-------------------------
-
-Stop network manager
-
- sudo /etc/dbus-1/event.d/26NetworkManagerDispatcher stop
- sudo /etc/dbus-1/event.d/25NetworkManager stop
-
-Create two files with only the word 'exit' in them. These files are:
-
- /etc/default/NetworkManager
- /etc/default/NetworkManagerDispatcher
-
-
-Altering the interface config
------------------------------
-
-First take down the interface you wish to bridge
-
- ifdown eth0
-
-Edit /etc/network/interfaces and find the config for the physical
-interface, which looks something like
-
- allow-hotplug eth0
- iface eth0 inet static
-        address 192.168.2.4
-        netmask 255.255.255.0
-        network 192.168.2.0
-        broadcast 192.168.2.255
-        gateway 192.168.2.2
-
-Remove the 'allow-hotplug eth0' line, replacing it with 'auto br0',
-and change the next line with iface name to 'br0', so it now starts
-with
-
- auto br0
- iface br0 inet static
-
-And then define the interface as being a bridge and specify its ports
-
-       bridge_ports eth0
-       bridge_stp off
-       bridge_maxwait 5
-
-The complete config should now look like
-
- auto br0
- iface br0 inet static
-         address 192.168.2.4
-         netmask 255.255.255.0
-         network 192.168.2.0
-         broadcast 192.168.2.255
-         gateway 192.168.2.2
-         bridge_ports eth0
-         bridge_stp off
-         bridge_maxwait 5
-
-The interface can now be started with
-
- ifup br0
-
-Finally add the '/etc/sysctl.conf' settings
-
-net.bridge.bridge-nf-call-ip6tables = 0
-net.bridge.bridge-nf-call-iptables = 0
-net.bridge.bridge-nf-call-arptables = 0
-
-And then load the settings with
-
- sysctl -p /etc/sysctl.conf
-
-
-You should now have a "shared physical device", to which guests
-can be attached and have full LAN access
-
- # brctl show
- bridge name     bridge id               STP enabled     interfaces
- br0             8000.000e0cb30550       no              eth0
-
-
-Other operating systems / distributions
-=======================================
-
-[...send patches to this file with instructions....]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 05:24:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 05:24:39 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPwWd-0005cu-2W; Mon, 14 Nov 2011 05:24:39 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPwVs-0005QQ-4y
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 05:23:52 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1321276998!52997971!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12310 invoked from network); 14 Nov 2011 13:23:18 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 13:23:18 -0000
Received: by eyb6 with SMTP id 6so8054917eyb.30
	for <xen-devel@lists.xensource.com>;
	Mon, 14 Nov 2011 05:23:48 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type;
	bh=7awhqFtci8043s4QuVn6oEvfVk39BNFaG2DkJdzCPtw=;
	b=Ac8H4mva525rmW4hBQDzW9LqjA7g2PA3FgPw/W4kzuPTH0ZlDTQaUHYiDO5Kl0St3a
	hd8WvILiVoe/a0TLo3MG9PHSvhW8JVC2frF3L397Ikn9wTaHAdqbRhJmdDN5gKz7X4Xs
	Y8Y5GNlBJktdkJIohvq+zpwqu0XDoYiqNc8XI=
Received: by 10.180.81.73 with SMTP id y9mr25374955wix.37.1321277028447;
	Mon, 14 Nov 2011 05:23:48 -0800 (PST)
Received: from [192.168.1.3] (host86-129-245-239.range86-129.btcentralplus.com.
	[86.129.245.239])
	by mx.google.com with ESMTPS id hq5sm12271746wib.7.2011.11.14.05.23.44
	(version=SSLv3 cipher=OTHER); Mon, 14 Nov 2011 05:23:46 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Mon, 14 Nov 2011 13:23:41 +0000
Subject: Re: [Xen-devel] Re: [PATCH] SeaBIOS/Xen: Compute the low RAM memory
	size in the BDA according to the e820
From: Keir Fraser <keir@xen.org>
To: Kevin O'Connor <kevin@koconnor.net>,
	Julian Pidancet <julian.pidancet@gmail.com>
Message-ID: <CAE6C6DF.34049%keir@xen.org>
Thread-Topic: [Xen-devel] Re: [PATCH] SeaBIOS/Xen: Compute the low RAM memory
	size in the BDA according to the e820
Thread-Index: Acyiqu9P8I6IreVxm0qt+lGyuae+igAJbDM4
In-Reply-To: <CAE687A1.24CDF%keir.xen@gmail.com>
Mime-version: 1.0
Content-type: multipart/mixed;
	boundary="B_3404121826_77154596"
Cc: xen-devel@lists.xensource.com, seabios@seabios.org, ian.campbell@citrix.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.

--B_3404121826_77154596
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit

On 14/11/2011 08:53, "Keir Fraser" <keir.xen@gmail.com> wrote:

> On 14/11/2011 03:36, "Kevin O'Connor" <kevin@koconnor.net> wrote:
> 
>> On Xen, the PCI init code isn't used, so assuming this struct doesn't
>> need to live in real "ram", I think it could live just about anywhere
>> past the end of ram.  Even with pciinit.c, addresses over 0xfc00000
>> (with the exception of a few bytes for hpet, apic, ioapic, and bios
>> image) could be used.
> 
> I suggest we stick it at FC000000, and shift hvmloader's mem_alloc()
> starting address up by one page to FC001000. The acpi build code will have
> to manually mem_hole_populate_ram() that one page before writing to it. This
> can then be documented in hvmloader/config.h which contains a description
> of, and defines for, the system memory map. This is by far the easiest
> solution to this problem; manually crafting an SSDT is a right pain in the
> arse, whereas this is maybe a 5-line patch.

Like the attached patch (untested), which is a bit larger than anticipated,
but actually allows code to be net deleted. :-)

 -- Keir

>  -- Keir
> 
>> -Kevin
>> 
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com
>> http://lists.xensource.com/xen-devel
> 
> 


--B_3404121826_77154596
Content-type: application/octet-stream; name="00-relocate-acpi-info"
Content-disposition: attachment;
	filename="00-relocate-acpi-info"
Content-transfer-encoding: base64


ZGlmZiAtciAwODQ0YjE3ZGY3YTkgdG9vbHMvZmlybXdhcmUvaHZtbG9hZGVyL2FjcGkvYnVp
bGQuYwotLS0gYS90b29scy9maXJtd2FyZS9odm1sb2FkZXIvYWNwaS9idWlsZC5jCUZyaSBO
b3YgMTEgMTg6MTQ6MzUgMjAxMSArMDAwMAorKysgYi90b29scy9maXJtd2FyZS9odm1sb2Fk
ZXIvYWNwaS9idWlsZC5jCU1vbiBOb3YgMTQgMTM6MjA6MjYgMjAxMSArMDAwMApAQCAtMjc2
LDcgKzI3Niw3IEBAIHN0YXRpYyBpbnQgY29uc3RydWN0X3NlY29uZGFyeV90YWJsZXModW4K
IAogdm9pZCBhY3BpX2J1aWxkX3RhYmxlcyhzdHJ1Y3QgYWNwaV9jb25maWcgKmNvbmZpZywg
dW5zaWduZWQgaW50IHBoeXNpY2FsKQogewotICAgIHN0cnVjdCBhY3BpX2luZm8gKmFjcGlf
aW5mbyA9IChzdHJ1Y3QgYWNwaV9pbmZvICopQUNQSV9JTkZPX1BIWVNJQ0FMX0FERFJFU1M7
CisgICAgc3RydWN0IGFjcGlfaW5mbyAqYWNwaV9pbmZvOwogICAgIHN0cnVjdCBhY3BpXzIw
X3JzZHAgKnJzZHA7CiAgICAgc3RydWN0IGFjcGlfMjBfcnNkdCAqcnNkdDsKICAgICBzdHJ1
Y3QgYWNwaV8yMF94c2R0ICp4c2R0OwpAQCAtMjg3LDYgKzI4Nyw5IEBAIHZvaWQgYWNwaV9i
dWlsZF90YWJsZXMoc3RydWN0IGFjcGlfY29uZmkKICAgICB1bnNpZ25lZCBsb25nICAgICAg
ICBzZWNvbmRhcnlfdGFibGVzWzE2XTsKICAgICBpbnQgICAgICAgICAgICAgICAgICBucl9z
ZWNvbmRhcmllcywgaTsKIAorICAgIC8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIHRoZSBh
Y3BpIGluZm8gYXJlYS4gKi8KKyAgICBtZW1faG9sZV9wb3B1bGF0ZV9yYW0oQUNQSV9JTkZP
X1BIWVNJQ0FMX0FERFJFU1MgPj4gUEFHRV9TSElGVCwgMSk7CisgICAgYWNwaV9pbmZvID0g
KHN0cnVjdCBhY3BpX2luZm8gKilBQ1BJX0lORk9fUEhZU0lDQUxfQUREUkVTUzsKICAgICBt
ZW1zZXQoYWNwaV9pbmZvLCAwLCBzaXplb2YoKmFjcGlfaW5mbykpOwogCiAgICAgLyoKZGlm
ZiAtciAwODQ0YjE3ZGY3YTkgdG9vbHMvZmlybXdhcmUvaHZtbG9hZGVyL2FjcGkvZHNkdC5h
c2wKLS0tIGEvdG9vbHMvZmlybXdhcmUvaHZtbG9hZGVyL2FjcGkvZHNkdC5hc2wJRnJpIE5v
diAxMSAxODoxNDozNSAyMDExICswMDAwCisrKyBiL3Rvb2xzL2Zpcm13YXJlL2h2bWxvYWRl
ci9hY3BpL2RzZHQuYXNsCU1vbiBOb3YgMTQgMTM6MjA6MjYgMjAxMSArMDAwMApAQCAtNjEs
OCArNjEsOCBAQCBEZWZpbml0aW9uQmxvY2sgKCJEU0RULmFtbCIsICJEU0RUIiwgMiwgCiAK
ICAgICBTY29wZSAoXF9TQikKICAgICB7Ci0gICAgICAgLyogQUNQSV9JTkZPX1BIWVNJQ0FM
X0FERFJFU1MgPT0gMHg5RjAwMCAqLwotICAgICAgIE9wZXJhdGlvblJlZ2lvbihCSU9TLCBT
eXN0ZW1NZW1vcnksIDB4OUYwMDAsIDI0KQorICAgICAgIC8qIEFDUElfSU5GT19QSFlTSUNB
TF9BRERSRVNTID09IDB4RkMwMDAwMDAgKi8KKyAgICAgICBPcGVyYXRpb25SZWdpb24oQklP
UywgU3lzdGVtTWVtb3J5LCAweEZDMDAwMDAwLCAyNCkKICAgICAgICBGaWVsZChCSU9TLCBC
eXRlQWNjLCBOb0xvY2ssIFByZXNlcnZlKSB7CiAgICAgICAgICAgIFVBUjEsIDEsCiAgICAg
ICAgICAgIFVBUjIsIDEsCmRpZmYgLXIgMDg0NGIxN2RmN2E5IHRvb2xzL2Zpcm13YXJlL2h2
bWxvYWRlci9jb25maWcuaAotLS0gYS90b29scy9maXJtd2FyZS9odm1sb2FkZXIvY29uZmln
LmgJRnJpIE5vdiAxMSAxODoxNDozNSAyMDExICswMDAwCisrKyBiL3Rvb2xzL2Zpcm13YXJl
L2h2bWxvYWRlci9jb25maWcuaAlNb24gTm92IDE0IDEzOjIwOjI2IDIwMTEgKzAwMDAKQEAg
LTU0LDE4ICs1NCwxNyBAQCBleHRlcm4gc3RydWN0IGJpb3NfY29uZmlnIHNlYWJpb3NfY29u
ZmlnCiAjZGVmaW5lIFBDSV9NRU1fRU5EICAgICAgICAgMHhmYzAwMDAwMAogZXh0ZXJuIHVu
c2lnbmVkIGxvbmcgcGNpX21lbV9zdGFydCwgcGNpX21lbV9lbmQ7CiAKLS8qIFJlc2VydmVk
IGZvciBzcGVjaWFsIEJJT1MgbWFwcGluZ3MsIGV0Yy4gKi8KLSNkZWZpbmUgUkVTRVJWRURf
TUVNQkFTRSAgICAweGZjMDAwMDAwCiAKIC8qIE1lbW9yeSBtYXAuICovCiAjZGVmaW5lIFND
UkFUQ0hfUEhZU0lDQUxfQUREUkVTUyAgICAgIDB4MDAwMTAwMDAKICNkZWZpbmUgSFlQRVJD
QUxMX1BIWVNJQ0FMX0FERFJFU1MgICAgMHgwMDA4MDAwMAotI2RlZmluZSBBQ1BJX0lORk9f
UEhZU0lDQUxfQUREUkVTUyAgICAweDAwMDlGMDAwCiAjZGVmaW5lIFZHQUJJT1NfUEhZU0lD
QUxfQUREUkVTUyAgICAgIDB4MDAwQzAwMDAKICNkZWZpbmUgSFZNTE9BREVSX1BIWVNJQ0FM
X0FERFJFU1MgICAgMHgwMDEwMDAwMAotCi0jZGVmaW5lIEFDUElfSU5GT19TSVpFICAgICAg
ICAgICAgICAgICAgICAgMHhDMDAKLSNkZWZpbmUgQUNQSV9JTkZPX1BIWVNJQ0FMX0VORCAo
QUNQSV9JTkZPX1BIWVNJQ0FMX0FERFJFU1MgKyBBQ1BJX0lORk9fU0laRSkKKy8qIFNwZWNp
YWwgQklPUyBtYXBwaW5ncywgZXRjLiBhcmUgYWxsb2NhdGVkIGZyb20gaGVyZSB1cHdhcmRz
Li4uICovCisjZGVmaW5lIFJFU0VSVkVEX01FTUJBU0UgICAgICAgICAgICAgIDB4RkMwMDAw
MDAKKy8qIE5CLiBBQ1BJX0lORk9fUEhZU0lDQUxfQUREUkVTUyAqTVVTVCogbWF0Y2ggZGVm
aW5pdGlvbiBpbiBhY3BpL2RzZHQuYXNsISAqLworI2RlZmluZSBBQ1BJX0lORk9fUEhZU0lD
QUxfQUREUkVTUyAgICAweEZDMDAwMDAwCisjZGVmaW5lIFJFU0VSVkVEX01FTU9SWV9EWU5B
TUlDICAgICAgIDB4RkMwMDEwMDAKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2NyYXRjaF9z
dGFydDsKIApkaWZmIC1yIDA4NDRiMTdkZjdhOSB0b29scy9maXJtd2FyZS9odm1sb2FkZXIv
ZTgyMC5jCi0tLSBhL3Rvb2xzL2Zpcm13YXJlL2h2bWxvYWRlci9lODIwLmMJRnJpIE5vdiAx
MSAxODoxNDozNSAyMDExICswMDAwCisrKyBiL3Rvb2xzL2Zpcm13YXJlL2h2bWxvYWRlci9l
ODIwLmMJTW9uIE5vdiAxNCAxMzoyMDoyNiAyMDExICswMDAwCkBAIC04MSw1NSArODEsMjQg
QEAgaW50IGJ1aWxkX2U4MjBfdGFibGUoc3RydWN0IGU4MjBlbnRyeSAqZQogICAgIC8qIExv
d21lbSBtdXN0IGJlIGF0IGxlYXN0IDUxMksgdG8ga2VlcCBXaW5kb3dzIGhhcHB5KSAqLwog
ICAgIEFTU0VSVCAoIGxvd21lbV9yZXNlcnZlZF9iYXNlID4gNTEyPDwxMCApOwogCi0gICAg
LyoKLSAgICAgKiBMb3dtZW0gcmVzZXJ2YXRpb24gbXVzdCBlaXRoZXIgY292ZXIgdGhlIEFD
UEkgaW5mbyByZWdpb24KLSAgICAgKiBlbnRpcmVseSBvciBub3QgYXQgYWxsLiBTaXR0aW5n
IGhhbGYgd2F5IHRocm91Z2ggc3VnZ2VzdHMKLSAgICAgKiBzb21ldGhpbmcgZnVubnkgaXMg
Z29pbmcgb24uCi0gICAgICovCi0gICAgQVNTRVJUICggbG93bWVtX3Jlc2VydmVkX2Jhc2Ug
PCBBQ1BJX0lORk9fUEhZU0lDQUxfQUREUkVTUyB8fAotICAgICAgICAgICAgIGxvd21lbV9y
ZXNlcnZlZF9iYXNlID4gQUNQSV9JTkZPX1BIWVNJQ0FMX0VORCApOwotCiAgICAgQVNTRVJU
ICggYmlvc19pbWFnZV9iYXNlIDwgMHgxMDAwMDAgKTsKIAotICAgIGlmICggbG93bWVtX3Jl
c2VydmVkX2Jhc2UgPCBBQ1BJX0lORk9fUEhZU0lDQUxfQUREUkVTUyApCisgICAgLyoKKyAg
ICAgKiAweDAtbG93bWVtX3Jlc2VydmVkX2Jhc2U6IE9yZGluYXJ5IFJBTS4KKyAgICAgKi8K
KyAgICBlODIwW25yXS5hZGRyID0gMHgwMDAwMDsKKyAgICBlODIwW25yXS5zaXplID0gbG93
bWVtX3Jlc2VydmVkX2Jhc2U7CisgICAgZTgyMFtucl0udHlwZSA9IEU4MjBfUkFNOworICAg
IG5yKys7CisKKyAgICAvKiBsb3dtZW1fcmVzZXJ2ZWRfYmFzZS0weEEwMDAwOiByZXNlcnZl
ZCBieSBCSU9TIGltcGxlbWVudGF0aW9uLiAqLworICAgIGlmICggbG93bWVtX3Jlc2VydmVk
X2Jhc2UgPCAweEEwMDAwICkKICAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIDB4MC1s
b3dtZW1fcmVzZXJ2ZWRfYmFzZTogT3JkaW5hcnkgUkFNLgotICAgICAgICAgKi8KLSAgICAg
ICAgZTgyMFtucl0uYWRkciA9IDB4MDAwMDA7Ci0gICAgICAgIGU4MjBbbnJdLnNpemUgPSBs
b3dtZW1fcmVzZXJ2ZWRfYmFzZTsKLSAgICAgICAgZTgyMFtucl0udHlwZSA9IEU4MjBfUkFN
OwotICAgICAgICBucisrOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiAw
eDAtQUNQSV9JTkZPOiBPcmRpbmFyeSBSQU0uICovCi0gICAgICAgIGU4MjBbbnJdLmFkZHIg
PSAweDAwMDAwOwotICAgICAgICBlODIwW25yXS5zaXplID0gQUNQSV9JTkZPX1BIWVNJQ0FM
X0FERFJFU1M7Ci0gICAgICAgIGU4MjBbbnJdLnR5cGUgPSBFODIwX1JBTTsKLSAgICAgICAg
bnIrKzsKLQotICAgICAgICAvKiBBQ1BJIElORk86IFJlc2VydmVkLiAqLwotICAgICAgICBl
ODIwW25yXS5hZGRyID0gQUNQSV9JTkZPX1BIWVNJQ0FMX0FERFJFU1M7Ci0gICAgICAgIGU4
MjBbbnJdLnNpemUgPSBBQ1BJX0lORk9fU0laRTsKKyAgICAgICAgLyogUmVzZXJ2ZWQgZm9y
IGludGVybmFsIHVzZS4gKi8KKyAgICAgICAgZTgyMFtucl0uYWRkciA9IGxvd21lbV9yZXNl
cnZlZF9iYXNlOworICAgICAgICBlODIwW25yXS5zaXplID0gMHhBMDAwMC1sb3dtZW1fcmVz
ZXJ2ZWRfYmFzZTsKICAgICAgICAgZTgyMFtucl0udHlwZSA9IEU4MjBfUkVTRVJWRUQ7CiAg
ICAgICAgIG5yKys7Ci0KLSAgICAgICAgLyogQUNQSV9JTkZPLWxvd21lbV9yZXNlcnZlZF9i
YXNlOiBPcmRpbmFyeSBSQU0uICovCi0gICAgICAgIGU4MjBbbnJdLmFkZHIgPSBBQ1BJX0lO
Rk9fUEhZU0lDQUxfRU5EOwotICAgICAgICBlODIwW25yXS5zaXplID0gbG93bWVtX3Jlc2Vy
dmVkX2Jhc2UgLSBBQ1BJX0lORk9fUEhZU0lDQUxfRU5EOwotICAgICAgICBlODIwW25yXS50
eXBlID0gRTgyMF9SQU07Ci0gICAgICAgIG5yKys7Ci0gICAgfQotCi0gICAgLyogbG93bWVt
X3Jlc2VydmVkX2Jhc2UtMHhhMDAwMDA6IHJlc2VydmVkIGJ5IEJJT1MgaW1wbGVtZW50YXRp
b24uICovCi0gICAgaWYgKCBsb3dtZW1fcmVzZXJ2ZWRfYmFzZSA8IDB4QTAwMDAgKQotICAg
IHsKLSAgICAgICAgICAgIC8qIFJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuICovCi0gICAg
ICAgICAgICBlODIwW25yXS5hZGRyID0gbG93bWVtX3Jlc2VydmVkX2Jhc2U7Ci0gICAgICAg
ICAgICBlODIwW25yXS5zaXplID0gMHhBMDAwMC1sb3dtZW1fcmVzZXJ2ZWRfYmFzZTsKLSAg
ICAgICAgICAgIGU4MjBbbnJdLnR5cGUgPSBFODIwX1JFU0VSVkVEOwotICAgICAgICAgICAg
bnIrKzsKICAgICB9CiAKICAgICAvKgpkaWZmIC1yIDA4NDRiMTdkZjdhOSB0b29scy9maXJt
d2FyZS9odm1sb2FkZXIvcm9tYmlvcy5jCi0tLSBhL3Rvb2xzL2Zpcm13YXJlL2h2bWxvYWRl
ci9yb21iaW9zLmMJRnJpIE5vdiAxMSAxODoxNDozNSAyMDExICswMDAwCisrKyBiL3Rvb2xz
L2Zpcm13YXJlL2h2bWxvYWRlci9yb21iaW9zLmMJTW9uIE5vdiAxNCAxMzoyMDoyNiAyMDEx
ICswMDAwCkBAIC00Nyw3ICs0Nyw2IEBAIHN0YXRpYyB2b2lkIHJvbWJpb3Nfc2V0dXBfZTgy
MCh2b2lkKQogewogICAgIC8qCiAgICAgICogMHg5RTAwMC0weDA5RjAwMDogU3RhY2suCi0g
ICAgICogMHg5RjAwMC0weDA5QzAwMDogQUNQSSBpbmZvLgogICAgICAqIDB4OUZDMDAtMHgw
QTAwMDA6IEV4dGVuZGVkIEJJT1MgRGF0YSBBcmVhIChFQkRBKS4KICAgICAgKiAuLi4KICAg
ICAgKiAweEUwMDAwLTB4MEYwMDAwOiBQQy1zcGVjaWZpYyBhcmVhLiBXZSBwbGFjZSB2YXJp
b3VzIHRhYmxlcyBoZXJlLgpkaWZmIC1yIDA4NDRiMTdkZjdhOSB0b29scy9maXJtd2FyZS9o
dm1sb2FkZXIvdXRpbC5jCi0tLSBhL3Rvb2xzL2Zpcm13YXJlL2h2bWxvYWRlci91dGlsLmMJ
RnJpIE5vdiAxMSAxODoxNDozNSAyMDExICswMDAwCisrKyBiL3Rvb2xzL2Zpcm13YXJlL2h2
bWxvYWRlci91dGlsLmMJTW9uIE5vdiAxNCAxMzoyMDoyNiAyMDExICswMDAwCkBAIC0zNDMs
NyArMzQzLDcgQEAgdm9pZCBtZW1faG9sZV9wb3B1bGF0ZV9yYW0oeGVuX3Bmbl90IG1mbgog
ICAgIH0KIH0KIAotc3RhdGljIHVpbnQzMl90IHJlc2VydmUgPSBSRVNFUlZFRF9NRU1CQVNF
IC0gMTsKK3N0YXRpYyB1aW50MzJfdCByZXNlcnZlID0gUkVTRVJWRURfTUVNT1JZX0RZTkFN
SUMgLSAxOwogCiB4ZW5fcGZuX3QgbWVtX2hvbGVfYWxsb2ModWludDMyX3QgbnJfbWZucykK
IHsK
--B_3404121826_77154596
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--B_3404121826_77154596--




From xen-devel-bounces@lists.xensource.com Mon Nov 14 05:28:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 05:28:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPwaj-00063t-U5; Mon, 14 Nov 2011 05:28:53 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPwaG-0005rg-91
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 05:28:24 -0800
X-Env-Sender: swaplinker@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1321277270!52998867!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31125 invoked from network); 14 Nov 2011 13:27:51 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 13:27:51 -0000
Received: by vws13 with SMTP id 13so7615185vws.30
	for <xen-devel@lists.xensource.com>;
	Mon, 14 Nov 2011 05:28:20 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:from:date
	:x-google-sender-auth:message-id:subject:to:cc:content-type
	:content-transfer-encoding;
	bh=B7XvYWKRiaYAcRMwuRtJeyTDauJCGM0N9IV9ggJDdIg=;
	b=vWba3KAszHGaOjZrrlBMbKrN5YQ8osoumeeYX5QAPW4nbj5Frmy4hBoy+dbR2OMx5W
	azoD4wy5w8n+ZOSLO4SeLjnBPgGxbfGwfbKjvZ8q4snIbZd6859HkAymZUtO1PfeQSaz
	Bd7x8i6o0TQurFVJSxcKcsF/6s6s8dfBQFuAo=
Received: by 10.52.77.69 with SMTP id q5mr35615047vdw.11.1321277300036; Mon,
	14 Nov 2011 05:28:20 -0800 (PST)
MIME-Version: 1.0
Received: by 10.52.20.142 with HTTP; Mon, 14 Nov 2011 05:27:59 -0800 (PST)
In-Reply-To: <CAE6C6DF.34049%keir@xen.org>
References: <CAE687A1.24CDF%keir.xen@gmail.com> <CAE6C6DF.34049%keir@xen.org>
From: Julian Pidancet <julian.pidancet@gmail.com>
Date: Mon, 14 Nov 2011 13:27:59 +0000
X-Google-Sender-Auth: ab12pqyjH0vNG0ULq9mvxHjm2jA
Message-ID: <CAKZ=5EUNzYSzq+a4jUBGzRvkTPmM3SjnD2C1=08QR23OfDxqMA@mail.gmail.com>
Subject: Re: [Xen-devel] Re: [PATCH] SeaBIOS/Xen: Compute the low RAM memory
	size in the BDA according to the e820
To: Keir Fraser <keir@xen.org>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Kevin O'Connor <kevin@koconnor.net>, seabios@seabios.org,
	xen-devel@lists.xensource.com, ian.campbell@citrix.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 1:23 PM, Keir Fraser <keir@xen.org> wrote:
> On 14/11/2011 08:53, "Keir Fraser" <keir.xen@gmail.com> wrote:
>
>> On 14/11/2011 03:36, "Kevin O'Connor" <kevin@koconnor.net> wrote:
>>
>>> On Xen, the PCI init code isn't used, so assuming this struct doesn't
>>> need to live in real "ram", I think it could live just about anywhere
>>> past the end of ram. =C2=A0Even with pciinit.c, addresses over 0xfc0000=
0
>>> (with the exception of a few bytes for hpet, apic, ioapic, and bios
>>> image) could be used.
>>
>> I suggest we stick it at FC000000, and shift hvmloader's mem_alloc()
>> starting address up by one page to FC001000. The acpi build code will ha=
ve
>> to manually mem_hole_populate_ram() that one page before writing to it. =
This
>> can then be documented in hvmloader/config.h which contains a descriptio=
n
>> of, and defines for, the system memory map. This is by far the easiest
>> solution to this problem; manually crafting an SSDT is a right pain in t=
he
>> arse, whereas this is maybe a 5-line patch.
>
> Like the attached patch (untested), which is a bit larger than anticipate=
d,
> but actually allows code to be net deleted. :-)
>

That was quick. I will give it a try shortly.

--=20
Julian

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 05:44:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 05:44:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPwpn-0006hi-Ul; Mon, 14 Nov 2011 05:44:28 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPwp7-0006VA-HE
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 05:43:45 -0800
X-Env-Sender: kevin@koconnor.net
X-Msg-Ref: server-9.tower-216.messagelabs.com!1321278221!3474117!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25050 invoked from network); 14 Nov 2011 13:43:42 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-9.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 13:43:42 -0000
Received: by vcbfk13 with SMTP id fk13so7545849vcb.30
	for <xen-devel@lists.xensource.com>;
	Mon, 14 Nov 2011 05:43:41 -0800 (PST)
Received: by 10.52.112.74 with SMTP id io10mr34364794vdb.116.1321278220984;
	Mon, 14 Nov 2011 05:43:40 -0800 (PST)
Received: from localhost
	(207-172-165-101.c3-0.avec-ubr1.nyr-avec.ny.cable.rcn.com.
	[207.172.165.101])
	by mx.google.com with ESMTPS id bl9sm30686641vdb.15.2011.11.14.05.43.39
	(version=TLSv1/SSLv3 cipher=OTHER);
	Mon, 14 Nov 2011 05:43:39 -0800 (PST)
Date: Mon, 14 Nov 2011 08:43:38 -0500
From: Kevin O'Connor <kevin@koconnor.net>
To: Keir Fraser <keir@xen.org>
Subject: Re: [Xen-devel] Re: [PATCH] SeaBIOS/Xen: Compute the low RAM memory
	size in the BDA according to the e820
Message-ID: <20111114134338.GB22124@morn.localdomain>
References: <CAE687A1.24CDF%keir.xen@gmail.com> <CAE6C6DF.34049%keir@xen.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAE6C6DF.34049%keir@xen.org>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: xen-devel@lists.xensource.com, seabios@seabios.org, ian.campbell@citrix.com,
	Julian Pidancet <julian.pidancet@gmail.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 01:23:41PM +0000, Keir Fraser wrote:
> On 14/11/2011 08:53, "Keir Fraser" <keir.xen@gmail.com> wrote:
> 
> > On 14/11/2011 03:36, "Kevin O'Connor" <kevin@koconnor.net> wrote:
> > 
> >> On Xen, the PCI init code isn't used, so assuming this struct doesn't
> >> need to live in real "ram", I think it could live just about anywhere
> >> past the end of ram.  Even with pciinit.c, addresses over 0xfc00000

Oops - that should have read 0xfec00000.

> >> (with the exception of a few bytes for hpet, apic, ioapic, and bios
> >> image) could be used.
> > 
> > I suggest we stick it at FC000000, and shift hvmloader's mem_alloc()

Since Xen lays out the PCI space (and assuming it wont put a PCI
device at that address) that should be fine.

> > starting address up by one page to FC001000. The acpi build code will have
> > to manually mem_hole_populate_ram() that one page before writing to it. This
> > can then be documented in hvmloader/config.h which contains a description
> > of, and defines for, the system memory map. This is by far the easiest
> > solution to this problem; manually crafting an SSDT is a right pain in the
> > arse, whereas this is maybe a 5-line patch.
> 
> Like the attached patch (untested), which is a bit larger than anticipated,
> but actually allows code to be net deleted. :-)

-Kevin

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 06:03:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 06:03:40 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPx8N-00085k-U1; Mon, 14 Nov 2011 06:03:40 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPx45-0007pQ-M3
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 05:59:23 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1321279124!52154826!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26546 invoked from network); 14 Nov 2011 13:58:45 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 13:58:45 -0000
X-IronPort-AV: E=Sophos;i="4.69,509,1315195200"; d="scan'208";a="19070541"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 08:59:08 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX02.citrite.net
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Mon, 14 Nov 2011
	08:59:08 -0500
Message-ID: <4EC11EAB.80400@citrix.com>
Date: Mon, 14 Nov 2011 13:59:07 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: prevent vector sharing within	
	IO-APICs
References: <4EBD54B80200007800060776@nat28.tlf.novell.com>
	<4EBD579F.70901@citrix.com>
	<4EC0E6010200007800060B29@nat28.tlf.novell.com>
In-Reply-To: <4EC0E6010200007800060B29@nat28.tlf.novell.com>
X-Enigmail-Version: 1.1.2
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 14/11/11 08:57, Jan Beulich wrote:
>>>> On 11.11.11 at 18:13, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
>> On 11/11/11 16:00, Jan Beulich wrote:
>>> Following the prevention of vector sharing for MSIs, this change
>>> enforces the same within IO-APICs: Pin based interrupts use the IO-APIC
>>> as their identifying device under the AMD IOMMU (and just like for
>>> MSIs, only the identifying device is used to remap interrupts here,
>>> with no regard to an interrupt's destination).
>>>
>>> Additionally, LAPIC initiated EOIs (for level triggered interrupts) too
>>> use only the vector for identifying which interrupts to end. While this
>>> generally causes no significant problem (at worst an interrupt would be
>>> re-raised without a new interrupt event actually having occurred)
>> At worst, hardware asserts a line interrupt, deasserts it later, and an
>> EOI broadcast gets rid of any record that the IRQ was ever raised. 
>> While I would classify this as buggy behavior, I believe I have seen
>> some hardware doing this when investigating the line level IRQ migration
>> bug, as clearing the IRR did not immediately cause another interrupt to
>> be generated.
>>
>>> , it
>>> still seems better to avoid the situation.
>>>
>>> For this second aspect, a distinction is being made between the
>>> traditional and the directed-EOI cases: In the former, vectors should
>>> not be shared throughout all IO-APICs in the system, while in the
>>> latter case only individual IO-APICs need to be contrained (or, if the
>>> firmware indicates so, sub- groups of them having the same GSI appear
>>> at multiple pins).
>>>
>>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>> Provisional nack because it is my understanding that under all
>> circumstances, you must maintain a vector exclusivity map across all
>> IO-APICs because of the broadcast problem.  Or have I made a mistake in
>> my reasoning?
> With directed EOI there's no broadcasting involved, which is why
> global sharing prevention is not necessary.
>
> However, after some more thinking over the weekend I think we need
> to also/first adjust end_level_ioapic_irq()'s call to io_apic_eoi_vector():
> It shouldn't really iterate over all IO-APICs, but instead call
> eoi_IO_APIC_irq(). Thoughts? (That would also eliminate the need to
> look up pin or vector in __io_apic_eoi(), as all remaining call sites pass
> both.)
>
> Jan
>

I believe that should work.  By the point end_level_ioapic_irq() is
called, all the irq_desc information should point to the new vector, so
eoi_IO_APIC_irq() should get it correct.  At the time I made that patch,
I was not so familiar with the IO-APIC code so decided that calling
io_apic_eoi was the safer bet.

Having had the weekend to consider the logic in your patch, I now think
I was wrong, and your reasoning is correct.  Therefore, Ack.

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 06:11:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 06:11:33 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPxFz-00007q-Nw; Mon, 14 Nov 2011 06:11:31 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPxCI-0008Jn-Ig
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 06:07:50 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1321279657!1476435!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15076 invoked from network); 14 Nov 2011 14:07:39 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 14:07:39 -0000
X-IronPort-AV: E=Sophos;i="4.69,509,1315195200"; d="scan'208";a="19070768"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 09:07:37 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX02.citrite.net
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Mon, 14 Nov 2011
	09:07:37 -0500
Message-ID: <4EC120A7.3080600@citrix.com>
Date: Mon, 14 Nov 2011 14:07:35 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH] x86: clean up __io_apic_eoi()
References: <4EBD5639020000780006077C@nat28.tlf.novell.com>
	<4EBD5213.3030407@citrix.com>
	<4EC0E88F0200007800060B37@nat28.tlf.novell.com>
In-Reply-To: <4EC0E88F0200007800060B37@nat28.tlf.novell.com>
X-Enigmail-Version: 1.1.2
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com



On 14/11/11 09:08, Jan Beulich wrote:
>>>> On 11.11.11 at 17:49, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
>> On 11/11/11 16:07, Jan Beulich wrote:
>>> Irrespective of the IO-APIC vector sharing suppression patch just sent
>>> the logic in this function needs to iterate over all RTEs, since
>>> multiple pins within an IO-APIC may still use the same vector.
>> Why?  The whole point of preventing vector sharing for IO-APICs is to
>> prevent two or more RTEs referencing the same vector.
> If that was really the case on *all* systems, then we wouldn't need
> the chains of IRQs hanging off irq_2_pin[] entries. Obviously there are
> or have been or could theoretically be systems that do make use of this.
>
> BUT again after some more thinking about this over the weekend
> (and after fixing the issue pointed out in the other response regarding
> the other patch) I think we can actually convert the function to
> behave the way you intended it to after dealing with the vector
> sharing issue: The call sites are then only __eoi_IO_APIC_irq() (which
> already traverses the chain from irq_2_pin[]) and clear_IO_APIC_pin()
> (which explicitly wants to deal with just a single (apic, pin) tuple, the
> uses in the timer interrupt related boot time code having been bogus in
> this respect even before your original change to the EOI logic, as they
> imply that no other (apic, pin) tuple also represents the timer IRQ).
>
> Jan
>

Ah yes.  I was silly and had not considered that possibility. 
Realistically, I doubt there are many boxes still around which have
shared ISA interrupts, but we should deal with the case.

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 06:13:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 06:13:06 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPxHW-0000W8-8s; Mon, 14 Nov 2011 06:13:06 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPxE5-0008LV-MY
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 06:09:37 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1321279769!3451977!1
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7340 invoked from network); 14 Nov 2011 14:09:29 -0000
Received: from dgate20.ts.fujitsu.com (HELO dgate20.ts.fujitsu.com)
	(80.70.172.51)
	by server-4.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 14:09:29 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Content-Type:MIME-Version:Subject:
	X-Mercurial-Node:Message-Id:Date:From:To;
	b=YwSguRvRNqrxThlsdaRCiedkSF6hcTz0G9RJLfhbhLn/kP4e57CZJv0b
	iWZakZJA77v5/NE7O/JZonxVIw1yZ7e0ryetW1hcU89uT/TK8PkdCeQHt
	lORngkPWRU3VmC4mfN5ySSEYrfXiZcpud2yjaXy5xWgpmz4Zy2KwkHW69
	ny1Vx+dOQfOAG7ZHpUJkXUIPkCkbTJxocleHBkV6t2vxv8YQreeuKnspg
	q6FUv9ddPUbp3EhXZg2XizFEP1cyH;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1321279769; x=1352815769;
	h=mime-version:subject:message-id:date:from:to;
	bh=+6TKIqkD+2CGJYEIXbbSPqQYbjkS7HJwtxGoY3D03Eg=;
	b=CUnC1F6Zh0IbxjXBQ6vbWykOm0+4AqrtzG9s2Et418STXMjvcHzOv9gd
	Li8nnEScwN/gQ4tTGvOudFaJRekd6mIk7EVGkjjQTTNZ5sC4txOWWl7Kf
	IklDHfSJgGOc8ENImUsTsIjuQ9Gnflt0KZ2DCEmfQwJIhTPyV/8gJXeyQ
	/WZKY5X1Zjv/xbkbS4m1rO5MjyOIg8dvqwAguFJylrFXV99Gwqa2qTtII
	XbVVOrrkshrmyXZifLa4dXXlOMM2t;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,509,1315173600"; d="scan'208";a="78946459"
Received: from abgdgate40u.abg.fsc.net ([172.25.138.90])
	by dgate20u.abg.fsc.net with ESMTP; 14 Nov 2011 15:09:28 +0100
X-IronPort-AV: E=Sophos;i="4.69,508,1315173600"; d="scan'208";a="123428143"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate40u.abg.fsc.net with ESMTP; 14 Nov 2011 15:09:28 +0100
Received: from [172.17.21.25] (nehalem1.osd.mch.fsc.net [172.17.21.25])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id B3BD6A1C30;
	Mon, 14 Nov 2011 15:09:28 +0100 (CET)
Content-Type: multipart/mixed; boundary="===============1662775580937527808=="
MIME-Version: 1.0
X-Mercurial-Node: 123596ca8b29d3fd992284b3cbe31a3f28da56e5
Message-Id: <123596ca8b29d3fd9922.1321279510@nehalem1>
Date: Mon, 14 Nov 2011 15:05:10 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] add xl sched-credit2 sub command
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1662775580937527808==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

Adds the sched-credit2 sub command to xl.

Signed-off-by: juergen.gross@ts.fujitsu.com


7 files changed, 184 insertions(+)
docs/man/xl.pod.1           |   20 ++++++++
tools/libxl/libxl.c         |   48 ++++++++++++++++++++
tools/libxl/libxl.h         |    4 +
tools/libxl/libxl_types.idl |    4 +
tools/libxl/xl.h            |    1 
tools/libxl/xl_cmdimpl.c    |  100 +++++++++++++++++++++++++++++++++++++++++++
tools/libxl/xl_cmdtable.c   |    7 +++



--===============1662775580937527808==
Content-Type: text/x-patch; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=xen-staging.hg.patch

# HG changeset patch
# User Juergen Gross <juergen.gross@ts.fujitsu.com>
# Date 1321279498 -3600
# Node ID 123596ca8b29d3fd992284b3cbe31a3f28da56e5
# Parent  0844b17df7a9dd885e98e505f14fc99c1951b483
add xl sched-credit2 sub command

Adds the sched-credit2 sub command to xl.

Signed-off-by: juergen.gross@ts.fujitsu.com

diff -r 0844b17df7a9 -r 123596ca8b29 docs/man/xl.pod.1
--- a/docs/man/xl.pod.1	Fri Nov 11 18:14:35 2011 +0000
+++ b/docs/man/xl.pod.1	Mon Nov 14 15:04:58 2011 +0100
@@ -607,6 +607,26 @@ no upper cap.
 
 =back
 
+=item B<sched-credit2> [ B<-d> I<domain-id> [ B<-w>[B<=>I<WEIGHT>] ] ]
+
+Set credit2 scheduler parameters.  The credit2 scheduler is a
+proportional fair share CPU scheduler built from the ground up to be
+work conserving on SMP hosts.
+
+Each domain (including Domain0) is assigned a weight.
+
+B<PARAMETERS>
+
+=over 4
+
+=item I<WEIGHT>
+
+A domain with a weight of 512 will get twice as much CPU as a domain
+with a weight of 256 on a contended host. Legal weights range from 1
+to 65535 and the default is 256.
+
+=back
+
 =back
 
 =head1 CPUPOOLS COMMANDS
diff -r 0844b17df7a9 -r 123596ca8b29 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Fri Nov 11 18:14:35 2011 +0000
+++ b/tools/libxl/libxl.c	Mon Nov 14 15:04:58 2011 +0100
@@ -2728,6 +2728,54 @@ int libxl_sched_credit_domain_set(libxl_
     return 0;
 }
 
+int libxl_sched_credit2_domain_get(libxl_ctx *ctx, uint32_t domid, libxl_sched_credit2 *scinfo)
+{
+    struct xen_domctl_sched_credit2 sdom;
+    int rc;
+
+    rc = xc_sched_credit2_domain_get(ctx->xch, domid, &sdom);
+    if (rc != 0) {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "setting domain sched credit2");
+        return ERROR_FAIL;
+    }
+
+    scinfo->weight = sdom.weight;
+
+    return 0;
+}
+
+int libxl_sched_credit2_domain_set(libxl_ctx *ctx, uint32_t domid, libxl_sched_credit2 *scinfo)
+{
+    struct xen_domctl_sched_credit2 sdom;
+    xc_domaininfo_t domaininfo;
+    int rc;
+
+    rc = xc_domain_getinfolist(ctx->xch, domid, 1, &domaininfo);
+    if (rc < 0) {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain info list");
+        return ERROR_FAIL;
+    }
+    if (rc != 1 || domaininfo.domain != domid)
+        return ERROR_INVAL;
+
+
+    if (scinfo->weight < 1 || scinfo->weight > 65535) {
+        LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc,
+            "Cpu weight out of range, valid values are within range from 1 to 65535");
+        return ERROR_INVAL;
+    }
+
+    sdom.weight = scinfo->weight;
+
+    rc = xc_sched_credit2_domain_set(ctx->xch, domid, &sdom);
+    if ( rc < 0 ) {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "setting domain sched credit2");
+        return ERROR_FAIL;
+    }
+
+    return 0;
+}
+
 static int trigger_type_from_string(char *trigger_name)
 {
     if (!strcmp(trigger_name, "nmi"))
diff -r 0844b17df7a9 -r 123596ca8b29 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Fri Nov 11 18:14:35 2011 +0000
+++ b/tools/libxl/libxl.h	Mon Nov 14 15:04:58 2011 +0100
@@ -567,6 +567,10 @@ int libxl_sched_credit_domain_get(libxl_
                                   libxl_sched_credit *scinfo);
 int libxl_sched_credit_domain_set(libxl_ctx *ctx, uint32_t domid,
                                   libxl_sched_credit *scinfo);
+int libxl_sched_credit2_domain_get(libxl_ctx *ctx, uint32_t domid,
+                                  libxl_sched_credit2 *scinfo);
+int libxl_sched_credit2_domain_set(libxl_ctx *ctx, uint32_t domid,
+                                  libxl_sched_credit2 *scinfo);
 int libxl_send_trigger(libxl_ctx *ctx, uint32_t domid,
                        char *trigger_name, uint32_t vcpuid);
 int libxl_send_sysrq(libxl_ctx *ctx, uint32_t domid, char sysrq);
diff -r 0844b17df7a9 -r 123596ca8b29 tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl	Fri Nov 11 18:14:35 2011 +0000
+++ b/tools/libxl/libxl_types.idl	Mon Nov 14 15:04:58 2011 +0100
@@ -372,3 +372,7 @@ libxl_sched_credit = Struct("sched_credi
     ("weight", integer),
     ("cap", integer),
     ], dispose_fn=None)
+
+libxl_sched_credit2 = Struct("sched_credit2", [
+    ("weight", integer),
+    ], dispose_fn=None)
diff -r 0844b17df7a9 -r 123596ca8b29 tools/libxl/xl.h
--- a/tools/libxl/xl.h	Fri Nov 11 18:14:35 2011 +0000
+++ b/tools/libxl/xl.h	Mon Nov 14 15:04:58 2011 +0100
@@ -55,6 +55,7 @@ int main_memmax(int argc, char **argv);
 int main_memmax(int argc, char **argv);
 int main_memset(int argc, char **argv);
 int main_sched_credit(int argc, char **argv);
+int main_sched_credit2(int argc, char **argv);
 int main_domid(int argc, char **argv);
 int main_domname(int argc, char **argv);
 int main_rename(int argc, char **argv);
diff -r 0844b17df7a9 -r 123596ca8b29 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Fri Nov 11 18:14:35 2011 +0000
+++ b/tools/libxl/xl_cmdimpl.c	Mon Nov 14 15:04:58 2011 +0100
@@ -3708,6 +3708,42 @@ static void sched_credit_domain_output(
     free(domname);
 }
 
+static int sched_credit2_domain_get(
+    int domid, libxl_sched_credit2 *scinfo)
+{
+    int rc;
+
+    rc = libxl_sched_credit2_domain_get(ctx, domid, scinfo);
+    if (rc)
+        fprintf(stderr, "libxl_sched_credit2_domain_get failed.\n");
+
+    return rc;
+}
+
+static int sched_credit2_domain_set(
+    int domid, libxl_sched_credit2 *scinfo)
+{
+    int rc;
+
+    rc = libxl_sched_credit2_domain_set(ctx, domid, scinfo);
+    if (rc)
+        fprintf(stderr, "libxl_sched_credit2_domain_set failed.\n");
+
+    return rc;
+}
+
+static void sched_credit2_domain_output(
+    int domid, libxl_sched_credit2 *scinfo)
+{
+    char *domname;
+    domname = libxl_domid_to_name(ctx, domid);
+    printf("%-33s %4d %6d\n",
+        domname,
+        domid,
+        scinfo->weight);
+    free(domname);
+}
+
 int main_sched_credit(int argc, char **argv)
 {
     libxl_dominfo *info;
@@ -3770,6 +3806,70 @@ int main_sched_credit(int argc, char **a
             if (opt_c)
                 scinfo.cap = cap;
             rc = sched_credit_domain_set(domid, &scinfo);
+            if (rc)
+                return -rc;
+        }
+    }
+
+    return 0;
+}
+
+int main_sched_credit2(int argc, char **argv)
+{
+    libxl_dominfo *info;
+    libxl_sched_credit2 scinfo;
+    int nb_domain, i;
+    const char *dom = NULL;
+    int weight = 256, opt_w = 0;
+    int opt, rc;
+
+    while ((opt = def_getopt(argc, argv, "d:w:", "sched-credit2", 0)) != -1) {
+        switch (opt) {
+        case 0: case 2:
+            return opt;
+        case 'd':
+            dom = optarg;
+            break;
+        case 'w':
+            weight = strtol(optarg, NULL, 10);
+            opt_w = 1;
+            break;
+        }
+    }
+
+    if (!dom && opt_w) {
+        fprintf(stderr, "Must specify a domain.\n");
+        return 1;
+    }
+
+    if (!dom) { /* list all domain's credit scheduler info */
+        info = libxl_list_domain(ctx, &nb_domain);
+        if (!info) {
+            fprintf(stderr, "libxl_domain_infolist failed.\n");
+            return 1;
+        }
+
+        printf("%-33s %4s %6s\n", "Name", "ID", "Weight");
+        for (i = 0; i < nb_domain; i++) {
+            rc = sched_credit2_domain_get(info[i].domid, &scinfo);
+            if (rc)
+                return -rc;
+            sched_credit2_domain_output(info[i].domid, &scinfo);
+        }
+    } else {
+        find_domain(dom);
+
+        rc = sched_credit2_domain_get(domid, &scinfo);
+        if (rc)
+            return -rc;
+
+        if (!opt_w) { /* output credit2 scheduler info */
+            printf("%-33s %4s %6s\n", "Name", "ID", "Weight");
+            sched_credit2_domain_output(domid, &scinfo);
+        } else { /* set credit scheduler paramaters */
+            if (opt_w)
+                scinfo.weight = weight;
+            rc = sched_credit2_domain_set(domid, &scinfo);
             if (rc)
                 return -rc;
         }
diff -r 0844b17df7a9 -r 123596ca8b29 tools/libxl/xl_cmdtable.c
--- a/tools/libxl/xl_cmdtable.c	Fri Nov 11 18:14:35 2011 +0000
+++ b/tools/libxl/xl_cmdtable.c	Mon Nov 14 15:04:58 2011 +0100
@@ -196,6 +196,13 @@ struct cmd_spec cmd_table[] = {
       "-d DOMAIN, --domain=DOMAIN     Domain to modify\n"
       "-w WEIGHT, --weight=WEIGHT     Weight (int)\n"
       "-c CAP, --cap=CAP              Cap (int)"
+    },
+    { "sched-credit2",
+      &main_sched_credit2, 0,
+      "Get/set credit2 scheduler parameters",
+      "[-d <Domain> [-w[=WEIGHT]]]",
+      "-d DOMAIN, --domain=DOMAIN     Domain to modify\n"
+      "-w WEIGHT, --weight=WEIGHT     Weight (int)"
     },
     { "domid",
       &main_domid, 0,

--===============1662775580937527808==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1662775580937527808==--


From xen-devel-bounces@lists.xensource.com Mon Nov 14 06:15:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 06:15:25 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPxJl-000111-H2; Mon, 14 Nov 2011 06:15:25 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPxIy-0000oJ-JH
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 06:14:36 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1321280073!3062441!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17794 invoked from network); 14 Nov 2011 14:14:33 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-5.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Nov 2011 14:14:33 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 14 Nov 2011 14:14:33 +0000
Message-Id: <4EC130560200007800060C83@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 14 Nov 2011 14:14:30 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Andrew Cooper" <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] [PATCH] x86: clean up __io_apic_eoi()
References: <4EBD5639020000780006077C@nat28.tlf.novell.com>
	<4EBD5213.3030407@citrix.com>
	<4EC0E88F0200007800060B37@nat28.tlf.novell.com>
	<4EC120A7.3080600@citrix.com>
In-Reply-To: <4EC120A7.3080600@citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 14.11.11 at 15:07, Andrew Cooper <andrew.cooper3@citrix.com> wrote:

>=20
> On 14/11/11 09:08, Jan Beulich wrote:
>>>>> On 11.11.11 at 17:49, Andrew Cooper <andrew.cooper3@citrix.com> =
wrote:
>>> On 11/11/11 16:07, Jan Beulich wrote:
>>>> Irrespective of the IO-APIC vector sharing suppression patch just =
sent
>>>> the logic in this function needs to iterate over all RTEs, since
>>>> multiple pins within an IO-APIC may still use the same vector.
>>> Why?  The whole point of preventing vector sharing for IO-APICs is to
>>> prevent two or more RTEs referencing the same vector.
>> If that was really the case on *all* systems, then we wouldn't need
>> the chains of IRQs hanging off irq_2_pin[] entries. Obviously there are
>> or have been or could theoretically be systems that do make use of =
this.
>>
>> BUT again after some more thinking about this over the weekend
>> (and after fixing the issue pointed out in the other response regarding
>> the other patch) I think we can actually convert the function to
>> behave the way you intended it to after dealing with the vector
>> sharing issue: The call sites are then only __eoi_IO_APIC_irq() (which
>> already traverses the chain from irq_2_pin[]) and clear_IO_APIC_pin()
>> (which explicitly wants to deal with just a single (apic, pin) tuple, =
the
>> uses in the timer interrupt related boot time code having been bogus in
>> this respect even before your original change to the EOI logic, as they
>> imply that no other (apic, pin) tuple also represents the timer IRQ).
>>
>> Jan
>>
>=20
> Ah yes.  I was silly and had not considered that possibility.=20
> Realistically, I doubt there are many boxes still around which have
> shared ISA interrupts, but we should deal with the case.

But I'll withdraw the patch nevertheless, in favor of a more
radical cleanup (removing the pin =3D=3D -1 case altogether). See
my response on the other thread.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 06:18:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 06:18:48 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPxN2-0001Qr-2q; Mon, 14 Nov 2011 06:18:48 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RPxM2-0001Ds-6F
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 06:17:47 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-12.tower-182.messagelabs.com!1321280262!3052474!1
X-Originating-IP: [208.97.132.202]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20331 invoked from network); 14 Nov 2011 14:17:42 -0000
Received: from caiajhbdccac.dreamhost.com (HELO homiemail-a12.g.dreamhost.com)
	(208.97.132.202) by server-12.tower-182.messagelabs.com with SMTP;
	14 Nov 2011 14:17:42 -0000
Received: from homiemail-a12.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a12.g.dreamhost.com (Postfix) with ESMTP id 248A1714070;
	Mon, 14 Nov 2011 06:17:42 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=message-id
	:in-reply-to:references:date:subject:from:to:reply-to
	:mime-version:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.org; b=sFTOBxkJvM0YtO7hUWZntYBJz6OLBzYLxdDWF+V6S/YR
	rkwDCGtQFlPdT3BCL3ASZaLCwcBHJiZDuA+lRjEw8C+xr/cfDdxhnflMpuYg5MZ5
	WWKfNWFhly/8niXsi0GVtgelWtFERw/6ncuLchdswdqKb2y/4yQ4IZkJL49+Bok=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	message-id:in-reply-to:references:date:subject:from:to:reply-to
	:mime-version:content-type:content-transfer-encoding; s=
	lagarcavilla.org; bh=eCAoihal7GOixGrnydkMZgrzG8o=; b=RIUk+1/e2lK
	vinQbgBJ/PCcG6McDnwT72oNwS7RFjIuFrboFHdMmIQ47FFEZlTFbE2AgFjrnDrI
	09GP7PAAL/JziTVqA8iYiJPTA9z4Q+fZ4326uFUM9qxNHByY7XvSAm1zKGS0z4HW
	6KU0XjnjlOeU9dIZA1vd9KEJ/zlfwvpM=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a12.g.dreamhost.com (Postfix) with ESMTPA id AB5FB71406A; 
	Mon, 14 Nov 2011 06:17:41 -0800 (PST)
Received: from 206.223.182.18 (proxying for 206.223.182.18)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP;
	Mon, 14 Nov 2011 06:17:42 -0800
Message-ID: <e70772f3f45519bce1dd645aed64878e.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <20111113175006.1EF1C72C36F@homiemail-mx8.g.dreamhost.com>
References: <20111113175006.1EF1C72C36F@homiemail-mx8.g.dreamhost.com>
Date: Mon, 14 Nov 2011 06:17:42 -0800
From: "Andres Lagar-Cavilla" <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com,
 jean.guyader@eu.citrix.com
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: 
Subject: [Xen-devel] Re: [PATCH 3/6] add_to_physmap: Move the code for >
 XENMEM_add_to_physmap
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: andres@lagarcavilla.org
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> Date: Sun, 13 Nov 2011 17:40:49 +0000
> From: Jean Guyader <jean.guyader@eu.citrix.com>
> Subject: [Xen-devel] [PATCH 3/6] add_to_physmap: Move the code for
> 	XENMEM_add_to_physmap
> To: <xen-devel@lists.xensource.com>
> Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,	Jean Guyader
> 	<jean.guyader@eu.citrix.com>, JBeulich@suse.com
> Message-ID:
> 	<1321206052-18833-4-git-send-email-jean.guyader@eu.citrix.com>
> Content-Type: text/plain; charset=3D"utf-8"
>
>
> Move the code for the XENMEM_add_to_physmap case into it's own
> function (xenmem_add_to_physmap).
>
> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> ---
Jean, with the p2m API changes, your patch won't compile any more.

gfn_to_mfn* is now get_gfn*, with the need to put_gfn once done working
with the p2m translation. From what I've seen, your patch need not worry
about put_gfn, although it needs rebasing.

Andres

>  xen/arch/x86/mm.c |  189
> ++++++++++++++++++++++++++++-------------------------
>  1 files changed, 100 insertions(+), 89 deletions(-)
>
> -------------- next part --------------
> A non-text attachment was scrubbed...
> Name: 0003-add_to_physmap-Move-the-code-for-XENMEM_add_to_physm.patch
> Type: text/x-patch
> Size: 6630 bytes
> Desc: not available
> Url :
> http://lists.xensource.com/archives/html/xen-devel/attachments/20111113=
/13c22ac8/0003-add_to_physmap-Move-the-code-for-XENMEM_add_to_physm.bin
>
> ------------------------------
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>
>
> End of Xen-devel Digest, Vol 81, Issue 163
> ******************************************
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 06:21:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 06:21:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPxPN-0001qO-Oh; Mon, 14 Nov 2011 06:21:13 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPxOe-0001dk-ML
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 06:20:29 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1321280425!3056473!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11540 invoked from network); 14 Nov 2011 14:20:25 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-6.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Nov 2011 14:20:25 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 14 Nov 2011 14:20:25 +0000
Message-Id: <4EC131B60200007800060C9B@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 14 Nov 2011 14:20:22 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Andrew Cooper" <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: prevent vector sharing within
	IO-APICs
References: <4EBD54B80200007800060776@nat28.tlf.novell.com>
	<4EBD579F.70901@citrix.com>
	<4EC0E6010200007800060B29@nat28.tlf.novell.com>
	<4EC11EAB.80400@citrix.com>
In-Reply-To: <4EC11EAB.80400@citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 14.11.11 at 14:59, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
> On 14/11/11 08:57, Jan Beulich wrote:
>>>>> On 11.11.11 at 18:13, Andrew Cooper <andrew.cooper3@citrix.com> =
wrote:
>>> On 11/11/11 16:00, Jan Beulich wrote:
>>>> Following the prevention of vector sharing for MSIs, this change
>>>> enforces the same within IO-APICs: Pin based interrupts use the =
IO-APIC
>>>> as their identifying device under the AMD IOMMU (and just like for
>>>> MSIs, only the identifying device is used to remap interrupts here,
>>>> with no regard to an interrupt's destination).
>>>>
>>>> Additionally, LAPIC initiated EOIs (for level triggered interrupts) =
too
>>>> use only the vector for identifying which interrupts to end. While =
this
>>>> generally causes no significant problem (at worst an interrupt would =
be
>>>> re-raised without a new interrupt event actually having occurred)
>>> At worst, hardware asserts a line interrupt, deasserts it later, and =
an
>>> EOI broadcast gets rid of any record that the IRQ was ever raised.=20
>>> While I would classify this as buggy behavior, I believe I have seen
>>> some hardware doing this when investigating the line level IRQ =
migration
>>> bug, as clearing the IRR did not immediately cause another interrupt =
to
>>> be generated.
>>>
>>>> , it
>>>> still seems better to avoid the situation.
>>>>
>>>> For this second aspect, a distinction is being made between the
>>>> traditional and the directed-EOI cases: In the former, vectors should
>>>> not be shared throughout all IO-APICs in the system, while in the
>>>> latter case only individual IO-APICs need to be contrained (or, if =
the
>>>> firmware indicates so, sub- groups of them having the same GSI appear
>>>> at multiple pins).
>>>>
>>>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>>> Provisional nack because it is my understanding that under all
>>> circumstances, you must maintain a vector exclusivity map across all
>>> IO-APICs because of the broadcast problem.  Or have I made a mistake =
in
>>> my reasoning?
>> With directed EOI there's no broadcasting involved, which is why
>> global sharing prevention is not necessary.
>>
>> However, after some more thinking over the weekend I think we need
>> to also/first adjust end_level_ioapic_irq()'s call to io_apic_eoi_vector=
():
>> It shouldn't really iterate over all IO-APICs, but instead call
>> eoi_IO_APIC_irq(). Thoughts? (That would also eliminate the need to
>> look up pin or vector in __io_apic_eoi(), as all remaining call sites =
pass
>> both.)
>>
>> Jan
>>
>=20
> I believe that should work.  By the point end_level_ioapic_irq() is
> called, all the irq_desc information should point to the new vector, so
> eoi_IO_APIC_irq() should get it correct.  At the time I made that patch,
> I was not so familiar with the IO-APIC code so decided that calling
> io_apic_eoi was the safer bet.

I'm having some more fundamental problem with this original change
of yours: The assignment of the new vector happens in the context
of move_native_irq(), which gets called *after* doing the manual
EOI (and hence also *after* the vector !=3D desc->arch.vector check).
How does that do what it is supposed to?

(Below the [untested] patch that I would propose to do what I described
above, pending your clarification regarding the original change.)

Jan

--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -69,10 +69,6 @@ int __read_mostly nr_ioapics;
=20
 #define ioapic_has_eoi_reg(apic) (mp_ioapics[(apic)].mpc_apicver >=3D =
0x20)
=20
-#define io_apic_eoi_vector(apic, vector) io_apic_eoi((apic), (vector), =
-1)
-#define io_apic_eoi_pin(apic, pin) io_apic_eoi((apic), -1, (pin))
-
-
 /*
  * This is performance-critical, we want to do it O(1)
  *
@@ -220,14 +216,11 @@ static void ioapic_write_entry(
  * same redirection entry in the IO-APIC. */
 static void __io_apic_eoi(unsigned int apic, unsigned int vector, =
unsigned int pin)
 {
-    /* Ensure some useful information is passed in */
-    BUG_ON( (vector =3D=3D -1 && pin =3D=3D -1) );
-   =20
     /* Prefer the use of the EOI register if available */
     if ( ioapic_has_eoi_reg(apic) )
     {
         /* If vector is unknown, read it from the IO-APIC */
-        if ( vector =3D=3D -1 )
+        if ( vector =3D=3D IRQ_VECTOR_UNASSIGNED )
             vector =3D __ioapic_read_entry(apic, pin, TRUE).vector;
=20
         *(IO_APIC_BASE(apic)+16) =3D vector;
@@ -239,42 +232,6 @@ static void __io_apic_eoi(unsigned int a
         struct IO_APIC_route_entry entry;
         bool_t need_to_unmask =3D 0;
=20
-        /* If pin is unknown, search for it */
-        if ( pin =3D=3D -1 )
-        {
-            unsigned int p;
-            for ( p =3D 0; p < nr_ioapic_entries[apic]; ++p )
-            {
-                entry =3D __ioapic_read_entry(apic, p, TRUE);
-                if ( entry.vector =3D=3D vector )
-                {
-                    pin =3D p;
-                    /* break; */
-
-                    /* Here should be a break out of the loop, but at =
the=20
-                     * Xen code doesn't actually prevent multiple IO-APIC
-                     * entries being assigned the same vector, so EOI all
-                     * pins which have the correct vector.
-                     *
-                     * Remove the following code when the above assertion
-                     * is fulfilled. */
-                    __io_apic_eoi(apic, vector, p);
-                }
-            }
-           =20
-            /* If search fails, nothing to do */
-
-            /* if ( pin =3D=3D -1 ) */
-
-            /* Because the loop wasn't broken out of (see comment above),
-             * all relevant pins have been EOI, so we can always return.
-             *=20
-             * Re-instate the if statement above when the Xen logic has =
been
-             * fixed.*/
-
-            return;
-        }
-
         entry =3D __ioapic_read_entry(apic, pin, TRUE);
=20
         if ( ! entry.mask )
@@ -1645,7 +1602,6 @@ static void mask_and_ack_level_ioapic_ir
 static void end_level_ioapic_irq(struct irq_desc *desc, u8 vector)
 {
     unsigned long v;
-    int i;
=20
     if ( !ioapic_ack_new )
     {
@@ -1689,15 +1645,9 @@ static void end_level_ioapic_irq(struct=20
  * operation to prevent an edge-triggered interrupt escaping meanwhile.
  * The idea is from Manfred Spraul.  --macro
  */
-    i =3D desc->arch.vector;
-
     /* Manually EOI the old vector if we are moving to the new */
-    if ( vector && i !=3D vector )
-    {
-        int ioapic;
-        for (ioapic =3D 0; ioapic < nr_ioapics; ioapic++)
-            io_apic_eoi_vector(ioapic, i);
-    }
+    if ( vector && desc->arch.vector !=3D vector )
+        eoi_IO_APIC_irq(desc);
=20
     v =3D apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
=20


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 06:31:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 06:31:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPxZC-0002P5-PZ; Mon, 14 Nov 2011 06:31:22 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPxYW-0002CB-LA
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 06:30:41 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1321281037!4043212!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27122 invoked from network); 14 Nov 2011 14:30:37 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Nov 2011 14:30:37 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 14 Nov 2011 14:30:37 +0000
Message-Id: <4EC1341B0200007800060CAD@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 14 Nov 2011 14:30:35 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: prevent vector sharing within
	IO-APICs
References: <4EBD54B80200007800060776@nat28.tlf.novell.com>
	<4EBD579F.70901@citrix.com>
	<4EC0E6010200007800060B29@nat28.tlf.novell.com>
	<4EC11EAB.80400@citrix.com>
	<4EC131B60200007800060C9B@nat28.tlf.novell.com>
In-Reply-To: <4EC131B60200007800060C9B@nat28.tlf.novell.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 14.11.11 at 15:20, "Jan Beulich" <JBeulich@suse.com> wrote:
>>>> On 14.11.11 at 14:59, Andrew Cooper <andrew.cooper3@citrix.com> =
wrote:
>> On 14/11/11 08:57, Jan Beulich wrote:
>>>>>> On 11.11.11 at 18:13, Andrew Cooper <andrew.cooper3@citrix.com> =
wrote:
>>>> On 11/11/11 16:00, Jan Beulich wrote:
>>>>> Following the prevention of vector sharing for MSIs, this change
>>>>> enforces the same within IO-APICs: Pin based interrupts use the =
IO-APIC
>>>>> as their identifying device under the AMD IOMMU (and just like for
>>>>> MSIs, only the identifying device is used to remap interrupts here,
>>>>> with no regard to an interrupt's destination).
>>>>>
>>>>> Additionally, LAPIC initiated EOIs (for level triggered interrupts) =
too
>>>>> use only the vector for identifying which interrupts to end. While =
this
>>>>> generally causes no significant problem (at worst an interrupt would =
be
>>>>> re-raised without a new interrupt event actually having occurred)
>>>> At worst, hardware asserts a line interrupt, deasserts it later, and =
an
>>>> EOI broadcast gets rid of any record that the IRQ was ever raised.=20
>>>> While I would classify this as buggy behavior, I believe I have seen
>>>> some hardware doing this when investigating the line level IRQ =
migration
>>>> bug, as clearing the IRR did not immediately cause another interrupt =
to
>>>> be generated.
>>>>
>>>>> , it
>>>>> still seems better to avoid the situation.
>>>>>
>>>>> For this second aspect, a distinction is being made between the
>>>>> traditional and the directed-EOI cases: In the former, vectors =
should
>>>>> not be shared throughout all IO-APICs in the system, while in the
>>>>> latter case only individual IO-APICs need to be contrained (or, if =
the
>>>>> firmware indicates so, sub- groups of them having the same GSI =
appear
>>>>> at multiple pins).
>>>>>
>>>>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>>>> Provisional nack because it is my understanding that under all
>>>> circumstances, you must maintain a vector exclusivity map across all
>>>> IO-APICs because of the broadcast problem.  Or have I made a mistake =
in
>>>> my reasoning?
>>> With directed EOI there's no broadcasting involved, which is why
>>> global sharing prevention is not necessary.
>>>
>>> However, after some more thinking over the weekend I think we need
>>> to also/first adjust end_level_ioapic_irq()'s call to io_apic_eoi_vecto=
r():
>>> It shouldn't really iterate over all IO-APICs, but instead call
>>> eoi_IO_APIC_irq(). Thoughts? (That would also eliminate the need to
>>> look up pin or vector in __io_apic_eoi(), as all remaining call sites =
pass
>>> both.)
>>>
>>> Jan
>>>
>>=20
>> I believe that should work.  By the point end_level_ioapic_irq() is
>> called, all the irq_desc information should point to the new vector, so
>> eoi_IO_APIC_irq() should get it correct.  At the time I made that =
patch,
>> I was not so familiar with the IO-APIC code so decided that calling
>> io_apic_eoi was the safer bet.
>=20
> I'm having some more fundamental problem with this original change
> of yours: The assignment of the new vector happens in the context
> of move_native_irq(), which gets called *after* doing the manual
> EOI (and hence also *after* the vector !=3D desc->arch.vector check).
> How does that do what it is supposed to?
>=20
> (Below the [untested] patch that I would propose to do what I described
> above, pending your clarification regarding the original change.)

Here is one that actually compiles (and does even more cleanup, as
pointed out by the compiler).

Jan

--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -69,10 +69,6 @@ int __read_mostly nr_ioapics;
=20
 #define ioapic_has_eoi_reg(apic) (mp_ioapics[(apic)].mpc_apicver >=3D =
0x20)
=20
-#define io_apic_eoi_vector(apic, vector) io_apic_eoi((apic), (vector), =
-1)
-#define io_apic_eoi_pin(apic, pin) io_apic_eoi((apic), -1, (pin))
-
-
 /*
  * This is performance-critical, we want to do it O(1)
  *
@@ -213,21 +209,18 @@ static void ioapic_write_entry(
     spin_unlock_irqrestore(&ioapic_lock, flags);
 }
=20
-/* EOI an IO-APIC entry.  One of vector or pin may be -1, indicating that
- * it should be worked out using the other.  This function expect that =
the
- * ioapic_lock is taken, and interrupts are disabled (or there is a good =
reason
- * not to), and that if both pin and vector are passed, that they refer =
to the
+/* EOI an IO-APIC entry.  Vector may be -1, indicating that it should be
+ * worked out using the pin.  This function expects that the ioapic_lock =
is
+ * being held, and interrupts are disabled (or there is a good reason not
+ * to), and that if both pin and vector are passed, that they refer to =
the
  * same redirection entry in the IO-APIC. */
 static void __io_apic_eoi(unsigned int apic, unsigned int vector, =
unsigned int pin)
 {
-    /* Ensure some useful information is passed in */
-    BUG_ON( (vector =3D=3D -1 && pin =3D=3D -1) );
-   =20
     /* Prefer the use of the EOI register if available */
     if ( ioapic_has_eoi_reg(apic) )
     {
         /* If vector is unknown, read it from the IO-APIC */
-        if ( vector =3D=3D -1 )
+        if ( vector =3D=3D IRQ_VECTOR_UNASSIGNED )
             vector =3D __ioapic_read_entry(apic, pin, TRUE).vector;
=20
         *(IO_APIC_BASE(apic)+16) =3D vector;
@@ -239,42 +232,6 @@ static void __io_apic_eoi(unsigned int a
         struct IO_APIC_route_entry entry;
         bool_t need_to_unmask =3D 0;
=20
-        /* If pin is unknown, search for it */
-        if ( pin =3D=3D -1 )
-        {
-            unsigned int p;
-            for ( p =3D 0; p < nr_ioapic_entries[apic]; ++p )
-            {
-                entry =3D __ioapic_read_entry(apic, p, TRUE);
-                if ( entry.vector =3D=3D vector )
-                {
-                    pin =3D p;
-                    /* break; */
-
-                    /* Here should be a break out of the loop, but at =
the=20
-                     * Xen code doesn't actually prevent multiple IO-APIC
-                     * entries being assigned the same vector, so EOI all
-                     * pins which have the correct vector.
-                     *
-                     * Remove the following code when the above assertion
-                     * is fulfilled. */
-                    __io_apic_eoi(apic, vector, p);
-                }
-            }
-           =20
-            /* If search fails, nothing to do */
-
-            /* if ( pin =3D=3D -1 ) */
-
-            /* Because the loop wasn't broken out of (see comment above),
-             * all relevant pins have been EOI, so we can always return.
-             *=20
-             * Re-instate the if statement above when the Xen logic has =
been
-             * fixed.*/
-
-            return;
-        }
-
         entry =3D __ioapic_read_entry(apic, pin, TRUE);
=20
         if ( ! entry.mask )
@@ -301,17 +258,6 @@ static void __io_apic_eoi(unsigned int a
     }
 }
=20
-/* EOI an IO-APIC entry.  One of vector or pin may be -1, indicating that
- * it should be worked out using the other.  This function disables =
interrupts
- * and takes the ioapic_lock */
-static void io_apic_eoi(unsigned int apic, unsigned int vector, unsigned =
int pin)
-{
-    unsigned int flags;
-    spin_lock_irqsave(&ioapic_lock, flags);
-    __io_apic_eoi(apic, vector, pin);
-    spin_unlock_irqrestore(&ioapic_lock, flags);
-}
-
 /*
  * Saves all the IO-APIC RTE's
  */
@@ -1693,11 +1639,7 @@ static void end_level_ioapic_irq(struct=20
=20
     /* Manually EOI the old vector if we are moving to the new */
     if ( vector && i !=3D vector )
-    {
-        int ioapic;
-        for (ioapic =3D 0; ioapic < nr_ioapics; ioapic++)
-            io_apic_eoi_vector(ioapic, i);
-    }
+        eoi_IO_APIC_irq(desc);
=20
     v =3D apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
=20


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 06:33:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 06:33:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPxb9-0002nf-IZ; Mon, 14 Nov 2011 06:33:23 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPxaa-0002b0-Tp
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 06:32:49 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1321281164!4159860!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 731 invoked from network); 14 Nov 2011 14:32:45 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-6.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Nov 2011 14:32:45 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAEEVVDd014507
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 14 Nov 2011 14:31:32 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAEEVU5X024691
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 14 Nov 2011 14:31:30 GMT
Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAEEVPWm008113; Mon, 14 Nov 2011 08:31:25 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 14 Nov 2011 06:31:24 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 19FDE814AA; Mon, 14 Nov 2011 09:31:24 -0500 (EST)
Date: Mon, 14 Nov 2011 09:31:24 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Len Brown <lenb@kernel.org>
Message-ID: <20111114143123.GA8317@phenom.dumpdata.com>
References: <4EA7DFD1.9060608@canonical.com>
	<CAJvTdK=yAek4sJFXUp=kQSmnuE=HpgefN5Q-GLWhMXo=LhJ-2A@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAJvTdK=yAek4sJFXUp=kQSmnuE=HpgefN5Q-GLWhMXo=LhJ-2A@mail.gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090205.4EC12644.006A,ss=1,re=0.000,fgs=0
Cc: "linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefan Bader <stefan.bader@canonical.com>
Subject: [Xen-devel] Re: Regression in 3.1 causes Xen to use wrong idle
	routine
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hey Len,

> > The problem I see is that select_idle_routine() is called from
> > arch/x86/kernel/cpu/common.c and since Xen setup does not set pm_idle
> > anymore, it can cause mwait_idle or amd_e400_idle functions to be selected.
> > In testing it seem amd_e400_idle in PVM domU at least does not immediately cause
> > problems, but mwait_idle just causes crashes. From the reports I have
> > this may be related to older hypervisors (3.1 and older) not clearing the mwait
> > capability. But overall there seems something wrong in the interaction.
> 
> Why is Xen advertising X86_FEATURE_MWAIT and then crashing
> when the dom0 (or other guests) use what it advertises?

The only case where I've seen this is with Amazon EC2. The other
newer hypervisors (4.1.1 and such) do not trigger this.

> 
> What versions of Xen have this bug?

Whatever Amazon is using. I think they are RHEL5 based hypervisor.

> 
> > I am not really sure whether the logic of calling pm_idle() on all errors from
> > cpuidle_call_idle() is already flawed or the assumption in the Xen patch about
> > being able to prevent the wrong idle function by turning cpuidle off is incorrect.
> 
> The patches above appear to be operating as intended.
> What wasn't expected, was that some version of Xen is deployed that
> advertises the MWAIT feature, but crashes when it is used.

How does that work with AMD? On those machines it ends up calling
amd_e400_idle instead of the default_idle. Granted it does not "BUG" out
but it does lead to extra trap-n-emulate (the MSR operation) in to the hypervisor
which is not good.

> 
> > One quick fix could be to add some Xen case into select_idle_routine() which
> > picks default_idle...
> 
> No.
> 
> Working around this Xen bug for a newly compiled Dom0 is insufficient.
> 
> All guests that also look for MWAIT support w/o asking ACPI
> (ie. all versions of Linux that use intel_idle, such as the last few
> Fedora's, RHEL, SLES etc.)
> will trip over the same Xen bug, even if Dom0 doesn't.
> 
> Xen must not advertises MWAIT support if it doesn't have MWAIT support.

How does work out when we figure MWAIT support from the CPUID?
Or are you saying that it is correct - if the CPU advertises it, then yes
advertise it to the Linux kernel?

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 06:39:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 06:39:35 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPxh9-0003OK-6x; Mon, 14 Nov 2011 06:39:35 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPxgO-0003BY-Hb
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 06:38:48 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1321281523!3473129!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18428 invoked from network); 14 Nov 2011 14:38:45 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-12.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Nov 2011 14:38:45 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAEEbSN3022682
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 14 Nov 2011 14:37:29 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAEEbQJ0007945
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 14 Nov 2011 14:37:27 GMT
Received: from abhmt101.oracle.com (abhmt101.oracle.com [141.146.116.53])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAEEbHQY015877; Mon, 14 Nov 2011 08:37:18 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 14 Nov 2011 06:37:17 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 45433814AA; Mon, 14 Nov 2011 09:37:16 -0500 (EST)
Date: Mon, 14 Nov 2011 09:37:16 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Len Brown <lenb@kernel.org>
Subject: Re: [Xen-devel] [PATCH 1/3] cpuidle: If disable_cpuidle() is called, 
	set pm_idle to default_idle.
Message-ID: <20111114143716.GB8317@phenom.dumpdata.com>
References: <1320786914-10541-1-git-send-email-konrad.wilk@oracle.com>
	<1320786914-10541-2-git-send-email-konrad.wilk@oracle.com>
	<20111110040644.GA5434@phenom.dumpdata.com>
	<CAJvTdKnSLD8q3QqcFVY7u-eyhTnN=2rQ3rTmd1qeJ7nGz4y5Bg@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAJvTdKnSLD8q3QqcFVY7u-eyhTnN=2rQ3rTmd1qeJ7nGz4y5Bg@mail.gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090201.4EC127AA.008E,ss=1,re=0.000,fgs=0
Cc: len.brown@intel.com, jeremy@goop.org, xen-devel@lists.xensource.com,
	x86@kernel.org, linux-kernel@vger.kernel.org, trenn@suse.de,
	mingo@redhat.com, bp@alien8.de, hpa@zytor.com, tj@kernel.org,
	tglx@linutronix.de, stable@kernel.org
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Sun, Nov 13, 2011 at 01:00:15AM -0500, Len Brown wrote:
> > And just found that there is a BZ for this as well:
> > https://bugzilla.redhat.com/show_bug.cgi?id=739499
> >
> > And this patch fixes the Linux kernel to boot under Amazon EC2.
> 
> doesn't matter.
> 
> Working around an Amazon EC2 bug in a newly compiled upstream kernel
> isn't going to help with any of the kernels that don't include that workaround.

Prior to 3.1 we did have a solution for this - we would use the default_idle
and not pick and/choose one based on the CPUID flags.

It was not really a choice made by "hypervisor wrongly advertises the
MWAIT flag", but rather that we want to use the safe_halt, which ends up
calling the yield hypercall.

That is the optimal solution irregardless of what version of hypervisor
is being used.

> 
> Amazon EC2 should not advertise MWAIT support that it does not have,
> and all kernels should run on it w/o any workaround.
> 
> Len Brown, Intel Open Source Technology Center
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 06:55:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 06:55:35 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPxwd-00043N-6J; Mon, 14 Nov 2011 06:55:35 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPxvl-0003qT-Hy
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 06:54:41 -0800
X-Env-Sender: giamteckchoon@gmail.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1321282477!3046833!1
X-Originating-IP: [209.85.213.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9372 invoked from network); 14 Nov 2011 14:54:38 -0000
Received: from mail-yx0-f171.google.com (HELO mail-yx0-f171.google.com)
	(209.85.213.171)
	by server-14.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 14:54:38 -0000
Received: by yenl7 with SMTP id l7so1558835yen.30
	for <xen-devel@lists.xensource.com>;
	Mon, 14 Nov 2011 06:54:36 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type:content-transfer-encoding;
	bh=Nt+o/O7YAQduoUbYOodz/t9Wtwp/f1o2lq2/K0XJDNc=;
	b=J9DrXAh3YQrJDVsKGSavygNLJeLplzCvJHrs3U1CV+OWSDo9O2yBbqye0eA9Hd07z6
	xJeBgpfuolvyxYIYMDmQKMCIUnfXbRPkeHZGmXJ9PjmL8Ldbr3pboteu26qEOsiz2Tpz
	/zAX60iqqdP0/dvCKWKDMP3nkkVeY7PL20vf0=
MIME-Version: 1.0
Received: by 10.68.29.101 with SMTP id j5mr49763580pbh.61.1321282475627; Mon,
	14 Nov 2011 06:54:35 -0800 (PST)
Received: by 10.68.58.233 with HTTP; Mon, 14 Nov 2011 06:54:35 -0800 (PST)
In-Reply-To: <4EC0F47B0200007800060B98@nat28.tlf.novell.com>
References: <CAEwRVpOHeBXnjDQ8KSXeGxOTyFNh+kD_001KkRqOEszkuBt_TA@mail.gmail.com>
	<4EC0F47B0200007800060B98@nat28.tlf.novell.com>
Date: Mon, 14 Nov 2011 22:54:35 +0800
Message-ID: <CAEwRVpPgt1Oq71DcE9uSE=C7s8MEnZB7_EyfL0Rm3Qe8ve4udw@mail.gmail.com>
Subject: Re: [Xen-devel] kernel messages: alignment check: 0000 [#1] SMP
From: Teck Choon Giam <giamteckchoon@gmail.com>
To: Jan Beulich <JBeulich@suse.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 5:59 PM, Jan Beulich <JBeulich@suse.com> wrote:
>>>> On 13.11.11 at 20:00, Teck Choon Giam <giamteckchoon@gmail.com> wrote:
>> derefnull[15862]: segfault at 0 ip 000000000804c2eb sp
>> 00000000ffb4dfac error 4 in derefnull[8048000+57000]
>> divbyzero[15899] trap divide error ip:804d0be sp:ff849e9c error:0 in
>> divbyzero[8048000+56000]
>> derefnull[7328]: segfault at 0 ip 0000000000407701 sp 00007fff943b1c60
>> error 4 in derefnull[400000+77000]
>> divbyzero[7345] trap divide error ip:408d05 sp:7fff35784750 error:0 in
>> divbyzero[400000+76000]
>> derefnull[32738]: segfault at 0 ip 000000000804c2eb sp
>> 00000000ffbdbebc error 4 in derefnull[8048000+57000]
>> divbyzero[32755] trap divide error ip:804d0be sp:ffc0f53c error:0 in
>> divbyzero[8048000+56000]
>> derefnull[18732]: segfault at 0 ip 0000000000407701 sp
>> 00007fffec69eb30 error 4 in derefnull[400000+77000]
>> divbyzero[18841] trap divide error ip:408d05 sp:7fffed159ae0 error:0
>> in divbyzero[400000+76000]
>> derefnull[10813]: segfault at 0 ip 000000000804c2eb sp
>> 00000000ffc17dec error 4 in derefnull[8048000+57000]
>> divbyzero[10827] trap divide error ip:804d0be sp:ffdb347c error:0 in
>> divbyzero[8048000+56000]
>> derefnull[27073]: segfault at 0 ip 0000000000407701 sp
>> 00007fff37c6ba00 error 4 in derefnull[400000+77000]
>> divbyzero[27087] trap divide error ip:408d05 sp:7fffc93d8ab0 error:0
>> in divbyzero[400000+76000]
>> derefnull[11819]: segfault at 0 ip 000000000804c2eb sp
>> 00000000ffbb9edc error 4 in derefnull[8048000+57000]
>> divbyzero[11833] trap divide error ip:804d0be sp:ff9c5a1c error:0 in
>> divbyzero[8048000+56000]
>> derefnull[28080]: segfault at 0 ip 0000000000407701 sp
>> 00007fff5d3045d0 error 4 in derefnull[400000+77000]
>> divbyzero[28094] trap divide error ip:408d05 sp:7fff6369ca90 error:0
>> in divbyzero[400000+76000]
>> derefnull[22199]: segfault at 0 ip 000000000804c2eb sp
>> 00000000ffa5f64c error 4 in derefnull[8048000+57000]
>> divbyzero[22213] trap divide error ip:804d0be sp:ffb2c92c error:0 in
>> divbyzero[8048000+56000]
>> derefnull[11755]: segfault at 0 ip 0000000000407701 sp
>> 00007fffe0a4a070 error 4 in derefnull[400000+77000]
>> divbyzero[11768] trap divide error ip:408d05 sp:7fffaac47410 error:0
>> in divbyzero[400000+76000]
>> derefnull[3492]: segfault at 0 ip 000000000804c2eb sp 00000000ff9b0a9c
>> error 4 in derefnull[8048000+57000]
>> divbyzero[3506] trap divide error ip:804d0be sp:ffb387ac error:0 in
>> divbyzero[8048000+56000]
>> derefnull[25591]: segfault at 0 ip 0000000000407701 sp
>> 00007fffc5e82060 error 4 in derefnull[400000+77000]
>> divbyzero[25607] trap divide error ip:408d05 sp:7ffff3882660 error:0
>> in divbyzero[400000+76000]
>
> Up to here (you're certainly aware) are only indications of application f=
aults.

Yes, I know.  Trying to include what is going on in the build system
prior to the kernel message.

>
>> alignment check: 0000 [#1] SMP
>> last sysfs file: /sys/devices/system/cpu/cpu7/cache/index2/shared_cpu_ma=
p
>> CPU 7
>> Modules linked in: ipv6 dm_mirror dm_region_hash dm_log microcode
>> rtc_core rtc_lib pcspkr ext3 jbd dm_mod [last unloaded:
>> scsi_wait_scan]
>> Pid: 4002, comm: sbcl Not tainted 2.6.32.47-0.choon.sl6 #1
>> RIP: e030:[<ffffffff810179ff>] =A0[<ffffffff810179ff>]
>> convert_from_fxsr+0x11f/0x13d
>> RSP: e02b:ffff8800a8301cb8 =A0EFLAGS: 00050246
>
> Something in the kernel has turned on EFLAGS.AC which, in a 64-bit pv
> Xen kernel, must never be done (for it is running itself in ring 3). Trac=
king
> down where this happens may (unless someone can offer a good guess)
> require sprinkling around respective WARN_ON()s or BUG_ON()s.
>

Ok... thanks for your kind explanation.  I will see whether can I
reproduce this in version 2.6.32.48.  By the way, just the two related
kernel messages and the pv/domU still running as per normal without
any problem though.

Once again, many thanks.

Kindest regards,
Giam Teck Choon

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 07:23:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 07:23:48 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPyNv-0004te-KC; Mon, 14 Nov 2011 07:23:47 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPyMm-0004gt-9O
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 07:22:36 -0800
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1321284124!3450707!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17335 invoked from network); 14 Nov 2011 15:22:05 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-16.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 15:22:05 -0000
Received: by iaby12 with SMTP id y12so5685532iab.30
	for <xen-devel@lists.xensource.com>;
	Mon, 14 Nov 2011 07:22:04 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:cc:content-type
	:content-transfer-encoding;
	bh=6zzAFSit8yhIqam2WdXniMJ7xgDqor12/W13IjlU6fo=;
	b=IC7L10DVXsmGUsk2ceLrtqgoEUZ0CadLuol+rUWk60p3Q8/NCd/UQfQqdeV7gNyhFl
	rkjz+1eF8UInHtn3sq2pJL+oW8O5rSG7Knuq2WFqJ5BfQJFuODSkwAQYHfqJ6YxhsV1V
	7jGzZrPFKfAasWw4EGs8wyvT95j9AUqo9QYi4=
MIME-Version: 1.0
Received: by 10.42.137.6 with SMTP id w6mr23202880ict.5.1321284124380; Mon, 14
	Nov 2011 07:22:04 -0800 (PST)
Received: by 10.231.169.13 with HTTP; Mon, 14 Nov 2011 07:22:03 -0800 (PST)
In-Reply-To: <C10D3FB0CD45994C8A51FEC1227CE22F34D480385E@shsmsx502.ccr.corp.intel.com>
References: <C10D3FB0CD45994C8A51FEC1227CE22F340768D793@shsmsx502.ccr.corp.intel.com>
	<CAFLBxZZ9nqeb7CVqTZCsEtJRjgGMTHF2Ak929kvauj2KUFSOyg@mail.gmail.com>
	<C10D3FB0CD45994C8A51FEC1227CE22F3428CB5EF9@shsmsx502.ccr.corp.intel.com>
	<1319789425.19320.12.camel@Abyss>
	<C10D3FB0CD45994C8A51FEC1227CE22F3428CB61F2@shsmsx502.ccr.corp.intel.com>
	<1319796584.19320.31.camel@Abyss>
	<1319818714.21033.414.camel@elijah>
	<C10D3FB0CD45994C8A51FEC1227CE22F34B3905D03@shsmsx502.ccr.corp.intel.com>
	<CAFLBxZa5v_YgnC1LTa4a5wis4h6eQPijCAfUDLDsR4ucMuBXWg@mail.gmail.com>
	<C10D3FB0CD45994C8A51FEC1227CE22F34D480385E@shsmsx502.ccr.corp.intel.com>
Date: Mon, 14 Nov 2011 15:22:03 +0000
X-Google-Sender-Auth: dEIXh-dwPYq9vlEUB4J4kG07K2Y
Message-ID: <CAFLBxZYfzDQLYhJKy17G+YJH+ODeQy6QgGRs0ot2WJ00hJ5t5A@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] scheduler rate controller
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: "Lv, Hui" <hui.lv@intel.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: "Tian, Kevin" <kevin.tian@intel.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Keir \(Xen.org\)" <keir@xen.org>, "Dong, Eddie" <eddie.dong@intel.com>,
	George Dunlap <george.dunlap@citrix.com>, "Duan,
	Jiangang" <jiangang.duan@intel.com>, Dario Faggioli <raistlin@linux.it>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, Nov 4, 2011 at 2:08 PM, Lv, Hui <hui.lv@intel.com> wrote:
> So that, an idea came to me that may enforce your proposal,
> 1. we still count the scheduling number during each period (for example 1=
0ms)
> 2. This scheduling number is used to adaptively decide the delay value.
> For example, if scheduling number is very excessive, we can set longer de=
lay time, such as 5ms or 10ms. Or if the scheduling number is small, we can=
 set small delay time, such as 1ms, 500us or even zero. In this way, the de=
lay value is decided adaptively.

Setting the value adaptively is good, but only if it's adapting to the
right thing. :-)

For instance, adapting to number of cache misses, or to latency
requirements of guests, seems like a good idea.

But adapting to the number of scheduling events in the last period
doesn't seem very useful -- especially since our whole goal is to
change the number of scheduling events to be fewer. :-)

> I'd like to try this and see the result. May also to compare the results =
between different solutions. As you know, SPECvirt workloads is too complex=
 that I need some time to produce this :).

I've heard that; thanks for doing the work.

> Also we have a set of small workloads to make quick testing.

What kinds of workloads are these?

Our performance team here is also trying to develop a lighter-weight
(i.e., easier to set up and run) benchmark for scalability /
consolidation.  Hopefully once they get that up and running I can test
the scheduling characteristics as well.

Peace,
 -George

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 07:28:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 07:28:26 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPySP-0005LC-GK; Mon, 14 Nov 2011 07:28:25 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPyRh-00058g-7V
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 07:27:42 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1321284456!1487255!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22739 invoked from network); 14 Nov 2011 15:27:38 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 15:27:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,509,1315195200"; d="scan'208";a="19074738"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 10:27:36 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX02.citrite.net
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Mon, 14 Nov 2011
	10:27:36 -0500
Message-ID: <4EC13367.9080209@citrix.com>
Date: Mon, 14 Nov 2011 15:27:35 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: prevent vector sharing within	
	IO-APICs
References: <4EBD54B80200007800060776@nat28.tlf.novell.com>
	<4EBD579F.70901@citrix.com>
	<4EC0E6010200007800060B29@nat28.tlf.novell.com>
	<4EC11EAB.80400@citrix.com>
	<4EC131B60200007800060C9B@nat28.tlf.novell.com>
In-Reply-To: <4EC131B60200007800060C9B@nat28.tlf.novell.com>
X-Enigmail-Version: 1.1.2
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 14/11/11 14:20, Jan Beulich wrote:
>>>> On 14.11.11 at 14:59, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
>> On 14/11/11 08:57, Jan Beulich wrote:
>>>>>> On 11.11.11 at 18:13, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
>>>> On 11/11/11 16:00, Jan Beulich wrote:
>>>>> Following the prevention of vector sharing for MSIs, this change
>>>>> enforces the same within IO-APICs: Pin based interrupts use the IO-APIC
>>>>> as their identifying device under the AMD IOMMU (and just like for
>>>>> MSIs, only the identifying device is used to remap interrupts here,
>>>>> with no regard to an interrupt's destination).
>>>>>
>>>>> Additionally, LAPIC initiated EOIs (for level triggered interrupts) too
>>>>> use only the vector for identifying which interrupts to end. While this
>>>>> generally causes no significant problem (at worst an interrupt would be
>>>>> re-raised without a new interrupt event actually having occurred)
>>>> At worst, hardware asserts a line interrupt, deasserts it later, and an
>>>> EOI broadcast gets rid of any record that the IRQ was ever raised. 
>>>> While I would classify this as buggy behavior, I believe I have seen
>>>> some hardware doing this when investigating the line level IRQ migration
>>>> bug, as clearing the IRR did not immediately cause another interrupt to
>>>> be generated.
>>>>
>>>>> , it
>>>>> still seems better to avoid the situation.
>>>>>
>>>>> For this second aspect, a distinction is being made between the
>>>>> traditional and the directed-EOI cases: In the former, vectors should
>>>>> not be shared throughout all IO-APICs in the system, while in the
>>>>> latter case only individual IO-APICs need to be contrained (or, if the
>>>>> firmware indicates so, sub- groups of them having the same GSI appear
>>>>> at multiple pins).
>>>>>
>>>>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>>>> Provisional nack because it is my understanding that under all
>>>> circumstances, you must maintain a vector exclusivity map across all
>>>> IO-APICs because of the broadcast problem.  Or have I made a mistake in
>>>> my reasoning?
>>> With directed EOI there's no broadcasting involved, which is why
>>> global sharing prevention is not necessary.
>>>
>>> However, after some more thinking over the weekend I think we need
>>> to also/first adjust end_level_ioapic_irq()'s call to io_apic_eoi_vector():
>>> It shouldn't really iterate over all IO-APICs, but instead call
>>> eoi_IO_APIC_irq(). Thoughts? (That would also eliminate the need to
>>> look up pin or vector in __io_apic_eoi(), as all remaining call sites pass
>>> both.)
>>>
>>> Jan
>>>
>> I believe that should work.  By the point end_level_ioapic_irq() is
>> called, all the irq_desc information should point to the new vector, so
>> eoi_IO_APIC_irq() should get it correct.  At the time I made that patch,
>> I was not so familiar with the IO-APIC code so decided that calling
>> io_apic_eoi was the safer bet.
> I'm having some more fundamental problem with this original change
> of yours: The assignment of the new vector happens in the context
> of move_native_irq(), which gets called *after* doing the manual
> EOI (and hence also *after* the vector != desc->arch.vector check).
> How does that do what it is supposed to?
>
> (Below the [untested] patch that I would propose to do what I described
> above, pending your clarification regarding the original change.)
>
> Jan

Are you sure?  I was under the impression that for safety, you have to
move the IRQ before ack'ing it at the local APIC, to prevent another IRQ
coming in while you are updating the structures.

The steps (as far as I remember from debugging this issue) are:

1) Scheduler decides move a vcpu to a different pcpu.  This implies
moving all bound IRQs.  It sets irq_desc->arch->pending_mask to the
pcpu(s) we wish to move to, and sets irq_desc->static |= IRQ_MOVE_PENDING
2) When an irq appears (on the original pcpu) which has IRQ_MOVE_PENDING
set, the ack handler rewrites the RTE to point to the new pcpu:vector,
and updates the irq_desc a bit.  This rewriting necessarily happens
before sending an EOI.
3) When the next irq appears (on the new pcpu), the code cleans up the
old vector_irq reference for the old pcpu, and tweaks some of irq_desc.

An alternative to 3) can occur when using the IRQ_MOVE_CLEANUP_VECTOR
IPI which looks through all pending cleanups on the current pcpu and
cleans them up.

Anyway, it was certainly the case that I saw the RTE being updated
before the EOI was sent, which is why I had to change the
hw_irq_controler.end interface to include the vector from the pending
EOI stack, so end_level_ioapic_irq could EOI the new vector if it was
different from the vector the lapic saw.

I hope this makes sense - it has been a little while since I last looked
at the problem.

~Andrew

> --- a/xen/arch/x86/io_apic.c
> +++ b/xen/arch/x86/io_apic.c
> @@ -69,10 +69,6 @@ int __read_mostly nr_ioapics;
>  
>  #define ioapic_has_eoi_reg(apic) (mp_ioapics[(apic)].mpc_apicver >= 0x20)
>  
> -#define io_apic_eoi_vector(apic, vector) io_apic_eoi((apic), (vector), -1)
> -#define io_apic_eoi_pin(apic, pin) io_apic_eoi((apic), -1, (pin))
> -
> -
>  /*
>   * This is performance-critical, we want to do it O(1)
>   *
> @@ -220,14 +216,11 @@ static void ioapic_write_entry(
>   * same redirection entry in the IO-APIC. */
>  static void __io_apic_eoi(unsigned int apic, unsigned int vector, unsigned int pin)
>  {
> -    /* Ensure some useful information is passed in */
> -    BUG_ON( (vector == -1 && pin == -1) );
> -    
>      /* Prefer the use of the EOI register if available */
>      if ( ioapic_has_eoi_reg(apic) )
>      {
>          /* If vector is unknown, read it from the IO-APIC */
> -        if ( vector == -1 )
> +        if ( vector == IRQ_VECTOR_UNASSIGNED )
>              vector = __ioapic_read_entry(apic, pin, TRUE).vector;
>  
>          *(IO_APIC_BASE(apic)+16) = vector;
> @@ -239,42 +232,6 @@ static void __io_apic_eoi(unsigned int a
>          struct IO_APIC_route_entry entry;
>          bool_t need_to_unmask = 0;
>  
> -        /* If pin is unknown, search for it */
> -        if ( pin == -1 )
> -        {
> -            unsigned int p;
> -            for ( p = 0; p < nr_ioapic_entries[apic]; ++p )
> -            {
> -                entry = __ioapic_read_entry(apic, p, TRUE);
> -                if ( entry.vector == vector )
> -                {
> -                    pin = p;
> -                    /* break; */
> -
> -                    /* Here should be a break out of the loop, but at the 
> -                     * Xen code doesn't actually prevent multiple IO-APIC
> -                     * entries being assigned the same vector, so EOI all
> -                     * pins which have the correct vector.
> -                     *
> -                     * Remove the following code when the above assertion
> -                     * is fulfilled. */
> -                    __io_apic_eoi(apic, vector, p);
> -                }
> -            }
> -            
> -            /* If search fails, nothing to do */
> -
> -            /* if ( pin == -1 ) */
> -
> -            /* Because the loop wasn't broken out of (see comment above),
> -             * all relevant pins have been EOI, so we can always return.
> -             * 
> -             * Re-instate the if statement above when the Xen logic has been
> -             * fixed.*/
> -
> -            return;
> -        }
> -
>          entry = __ioapic_read_entry(apic, pin, TRUE);
>  
>          if ( ! entry.mask )
> @@ -1645,7 +1602,6 @@ static void mask_and_ack_level_ioapic_ir
>  static void end_level_ioapic_irq(struct irq_desc *desc, u8 vector)
>  {
>      unsigned long v;
> -    int i;
>  
>      if ( !ioapic_ack_new )
>      {
> @@ -1689,15 +1645,9 @@ static void end_level_ioapic_irq(struct 
>   * operation to prevent an edge-triggered interrupt escaping meanwhile.
>   * The idea is from Manfred Spraul.  --macro
>   */
> -    i = desc->arch.vector;
> -
>      /* Manually EOI the old vector if we are moving to the new */
> -    if ( vector && i != vector )
> -    {
> -        int ioapic;
> -        for (ioapic = 0; ioapic < nr_ioapics; ioapic++)
> -            io_apic_eoi_vector(ioapic, i);
> -    }
> +    if ( vector && desc->arch.vector != vector )
> +        eoi_IO_APIC_irq(desc);
>  
>      v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
>  
>

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 07:30:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 07:30:56 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPyUq-0005ju-R1; Mon, 14 Nov 2011 07:30:56 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPyUL-0005Y3-QX
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 07:30:26 -0800
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1321284614!3067669!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2930 invoked from network); 14 Nov 2011 15:30:22 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-6.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 15:30:22 -0000
Received: by iaby12 with SMTP id y12so5695047iab.30
	for <xen-devel@lists.xensource.com>;
	Mon, 14 Nov 2011 07:30:07 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:cc:content-type;
	bh=cuyTnw2bLqfDsBeha04L5smHFy3be5GBzIj1AyNX43I=;
	b=crHmEHAPJSP6f7i2/6/AgKRQSj8eEDKpuG7bgYYelKBYDa9/mlzHKosb9Gn7bN8TMV
	cy+QpPiVn/hQ0axVy2hyL0h+0iZCOiy1MzxYps0KwOxXGAsCWwIuhzyBwmcSeYkAoyql
	N/KVQjW+/Qf2IVe0PcbHelEyYsYmQZK/hUxSQ=
MIME-Version: 1.0
Received: by 10.231.48.149 with SMTP id r21mr5183390ibf.95.1321284607230; Mon,
	14 Nov 2011 07:30:07 -0800 (PST)
Received: by 10.231.169.13 with HTTP; Mon, 14 Nov 2011 07:30:07 -0800 (PST)
In-Reply-To: <C10D3FB0CD45994C8A51FEC1227CE22F34D480385E@shsmsx502.ccr.corp.intel.com>
References: <C10D3FB0CD45994C8A51FEC1227CE22F340768D793@shsmsx502.ccr.corp.intel.com>
	<CAFLBxZZ9nqeb7CVqTZCsEtJRjgGMTHF2Ak929kvauj2KUFSOyg@mail.gmail.com>
	<C10D3FB0CD45994C8A51FEC1227CE22F3428CB5EF9@shsmsx502.ccr.corp.intel.com>
	<1319789425.19320.12.camel@Abyss>
	<C10D3FB0CD45994C8A51FEC1227CE22F3428CB61F2@shsmsx502.ccr.corp.intel.com>
	<1319796584.19320.31.camel@Abyss>
	<1319818714.21033.414.camel@elijah>
	<C10D3FB0CD45994C8A51FEC1227CE22F34B3905D03@shsmsx502.ccr.corp.intel.com>
	<CAFLBxZa5v_YgnC1LTa4a5wis4h6eQPijCAfUDLDsR4ucMuBXWg@mail.gmail.com>
	<C10D3FB0CD45994C8A51FEC1227CE22F34D480385E@shsmsx502.ccr.corp.intel.com>
Date: Mon, 14 Nov 2011 15:30:07 +0000
X-Google-Sender-Auth: 7z5VADlSGuwM4V7OOl3g6fvWc2U
Message-ID: <CAFLBxZZvyDjDBNrhp=ouWt5aw6tuLMV5eE7+We5ZRFtXXkm-0Q@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] scheduler rate controller
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: "Lv, Hui" <hui.lv@intel.com>
Content-Type: text/plain; charset=ISO-8859-1
Cc: "Duan, Jiangang" <jiangang.duan@intel.com>, "Tian,
	Kevin" <kevin.tian@intel.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Dario Faggioli <raistlin@linux.it>,
	George Dunlap <george.dunlap@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, Nov 4, 2011 at 2:08 PM, Lv, Hui <hui.lv@intel.com> wrote:
> I'd like to try this and see the result. May also to compare the results between different solutions. As you know, SPECvirt workloads is too complex that I need some time to produce this :).
> Also we have a set of small workloads to make quick testing.

BTW, did you take any traces when running SPECVirt for your previous
tests?  If you could take some traces of SPECVirt whenever you get to
doing the new tests, that would be really helpful in understanding
both how the SPECVirt benchmark behaves, and how we can best tweak the
scheduler so that it runs better.

Thanks,
 -George

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 07:49:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 07:49:41 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPymy-0006aD-An; Mon, 14 Nov 2011 07:49:40 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPymA-0006NH-Ig
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 07:48:50 -0800
X-Env-Sender: Bob.Jung@mandiant.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1321285726!1503859!1
X-Originating-IP: [165.212.64.21]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31976 invoked from network); 14 Nov 2011 15:48:47 -0000
Received: from gateout01.mbox.net (HELO gateout01.mbox.net) (165.212.64.21)
	by server-14.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Nov 2011 15:48:47 -0000
Received: from gateout01.mbox.net (gateout01-lo [127.0.0.1])
	by gateout01.mbox.net (Postfix) with ESMTP id 85134CEAC9
	for <xen-devel@lists.xensource.com>;
	Mon, 14 Nov 2011 15:48:43 +0000 (GMT)
X-USANET-Received: from gateout01.mbox.net [127.0.0.1] by gateout01.mbox.net
	via mtad (C8.MAIN.3.72B) 
	with ESMTP id 113PkNPWp9664Mo1; Mon, 14 Nov 2011 15:48:41 -0000
Received: from S1HUB3.EXCHPROD.USA.NET [165.212.120.254] by gateout01.mbox.net
	via smtad (C8.MAIN.3.72B) 
	with ESMTPS id XID763PkNPWp5963Xo1; Mon, 14 Nov 2011 15:48:41 -0000
X-USANET-Source: 165.212.120.254 IN Bob.Jung@mandiant.com
	S1HUB3.EXCHPROD.USA.NET
X-USANET-MsgId: XID763PkNPWp5963Xo1
Received: from MBX3.EXCHPROD.USA.NET ([10.120.221.32]) by
	S1HUB3.EXCHPROD.USA.NET ([10.120.220.33]) with mapi; Mon, 14 Nov 2011
	15:48:17 +0000
From: Bob Jung <Bob.Jung@mandiant.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Mon, 14 Nov 2011 15:48:14 +0000
Thread-Topic: Setting and responding to breakpoints?
Thread-Index: Acyi5NLMxF2L+yv4RByFOA6KGCK4XA==
Message-ID: <CDF8541D-9E32-41C5-A5BC-399974C5848A@mandiant.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Subject: [Xen-devel] Setting and responding to breakpoints?
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi there,

Sorry I'm not sure if this is the correct mailing list for this question - =
I already tried tools and didn't get any replies - please let me know if I =
should repost somewhere else.  Anyways, I've been using some of the API's i=
n libxc to look at memory of a guest, set single stepping, read registers, =
etc....   using the xc_* functions.  This library is awesome.

I was wondering - Does anyone know of a way using libxc or some other api's=
 to set and respond to hardware (not software!) breakpoints on a guest vm? =
 If so are there any examples out there?

Note - I'm NOT talking about connecting to a guest with a gdb client - I wa=
nt to do this programmatically.

Thanks!!!
-Bob=

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 08:30:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 08:30:11 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPzQA-0000WX-S2; Mon, 14 Nov 2011 08:30:11 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPzPf-0000Jt-J5
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 08:29:39 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1321288175!1506907!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4294 invoked from network); 14 Nov 2011 16:29:36 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-7.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Nov 2011 16:29:36 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 14 Nov 2011 16:29:35 +0000
Message-Id: <4EC14FFE0200007800060D18@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 14 Nov 2011 16:29:34 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Andrew Cooper" <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: prevent vector sharing within
	IO-APICs
References: <4EBD54B80200007800060776@nat28.tlf.novell.com>
	<4EBD579F.70901@citrix.com>
	<4EC0E6010200007800060B29@nat28.tlf.novell.com>
	<4EC11EAB.80400@citrix.com>
	<4EC131B60200007800060C9B@nat28.tlf.novell.com>
	<4EC13367.9080209@citrix.com>
In-Reply-To: <4EC13367.9080209@citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 14.11.11 at 16:27, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
> On 14/11/11 14:20, Jan Beulich wrote:
>> I'm having some more fundamental problem with this original change
>> of yours: The assignment of the new vector happens in the context
>> of move_native_irq(), which gets called *after* doing the manual
>> EOI (and hence also *after* the vector !=3D desc->arch.vector check).
>> How does that do what it is supposed to?
>>
>> (Below the [untested] patch that I would propose to do what I described
>> above, pending your clarification regarding the original change.)
>>
>> Jan
>=20
> Are you sure?  I was under the impression that for safety, you have to
> move the IRQ before ack'ing it at the local APIC, to prevent another IRQ
> coming in while you are updating the structures.

Just take another look at end_level_ioapic_irq().

> The steps (as far as I remember from debugging this issue) are:
>=20
> 1) Scheduler decides move a vcpu to a different pcpu.  This implies
> moving all bound IRQs.  It sets irq_desc->arch->pending_mask to the
> pcpu(s) we wish to move to, and sets irq_desc->static |=3D IRQ_MOVE_PENDI=
NG
> 2) When an irq appears (on the original pcpu) which has IRQ_MOVE_PENDING
> set, the ack handler rewrites the RTE to point to the new pcpu:vector,
> and updates the irq_desc a bit.  This rewriting necessarily happens
> before sending an EOI.

One would think so, but according to my reading of the code that's
not the case. And it really can't, as otherwise
io_apic_level_ack_pending() would always return true (and hence
move_native_irq() would never get called).

> 3) When the next irq appears (on the new pcpu), the code cleans up the
> old vector_irq reference for the old pcpu, and tweaks some of irq_desc.

But the crucial thing is that desc->arch.vector gets written during step =
2,
and hence the condition around the EOI can never be true unless an
interrupt surfaces in the window between the EOI in step 2 and the
disabling of it in move_native_irq(). Was it just this special case that
your original change addressed (the change description doesn't hint in
that direction).

> An alternative to 3) can occur when using the IRQ_MOVE_CLEANUP_VECTOR
> IPI which looks through all pending cleanups on the current pcpu and
> cleans them up.
>=20
> Anyway, it was certainly the case that I saw the RTE being updated
> before the EOI was sent, which is why I had to change the
> hw_irq_controler.end interface to include the vector from the pending
> EOI stack, so end_level_ioapic_irq could EOI the new vector if it was
> different from the vector the lapic saw.

That's another thing I would want to revert: There really shouldn't be
a need to pass in the old vector, as it is getting stored in
__assign_irq_vector(). If the value wasn't valid anymore at the point
we'd need it, we'd have a more severe problem - the vector gets
marked as not in use by smp_irq_move_cleanup_interrupt(), and
hence it wouldn't be valid anymore to play with it (read: EOI it) as
it may have got re-used already. As vector_irq[] gets updated there
too, that should result in "No irq handler for vector ...", but it would
not make it into end_level_ioapic_irq() in such a case.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 08:53:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 08:53:53 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPzn6-0002fS-Oq; Mon, 14 Nov 2011 08:53:52 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RPzmb-0002Tl-VW
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 08:53:22 -0800
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-5.tower-174.messagelabs.com!1321289598!1518070!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22217 invoked from network); 14 Nov 2011 16:53:19 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-5.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Nov 2011 16:53:19 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1321289598; l=1088;
	s=domk; d=aepfle.de;
	h=Content-Type:MIME-Version:Subject:To:From:Date:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=OimOK4VQdyzne9VuCdk6e0GNgpg=;
	b=QWwssS5qFVl9G9UP3I+MAoWO6wY1nByIbWlG+lYxKWkhBak8Cp6gnndr7LQf90NvPPq
	7t9SJxxBIzsDjTERVO6Cd26+Q8xTlFe0Gtwpni0Tlpm+VytH4euSuf4GUc1d7ACbLT1DR
	SJISaDXAlIBMm7Z7qXp9wkYCE1KrXkJ/Z/8=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmwtM48/ll2s7qFK+M
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-084-057-083-163.pools.arcor-ip.net [84.57.83.163])
	by smtp.strato.de (cohen mo49) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id Y05954nAEGkPPb
	for <xen-devel@lists.xensource.com>;
	Mon, 14 Nov 2011 17:53:03 +0100 (MET)
Received: by probook.site (Postfix, from userid 1000)
	id C5FCF18637; Mon, 14 Nov 2011 17:53:02 +0100 (CET)
Date: Mon, 14 Nov 2011 17:53:02 +0100
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Message-ID: <20111114165302.GA6688@aepfle.de>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
Subject: [Xen-devel] mark pages in p2m_ram_paging_out state read-only
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


I was wondering why ept_p2m_type_to_flags() removes all permissions from
a gfn in state p2m_ram_paging_out. If the guest happens to read or
execute from that page while the pager writes that gfn to disk, wouldnt
it be enough to remove the write bit to prevent writes from the guest?
If the page is read-only the guest could continue to make progress until
the gfn is really evicted and the p2mt changes to p2m_ram_paged.

I havent actually tried the patch below, but is there any reason it
would break the guest?


diff -r ed809663f829 xen/arch/x86/mm/p2m-ept.c
--- a/xen/arch/x86/mm/p2m-ept.c
+++ b/xen/arch/x86/mm/p2m-ept.c
@@ -75,7 +75,6 @@ static void ept_p2m_type_to_flags(ept_en
         case p2m_invalid:
         case p2m_mmio_dm:
         case p2m_populate_on_demand:
-        case p2m_ram_paging_out:
         case p2m_ram_paged:
         case p2m_ram_paging_in:
         case p2m_ram_paging_in_start:
@@ -92,6 +91,7 @@ static void ept_p2m_type_to_flags(ept_en
             break;
         case p2m_ram_logdirty:
         case p2m_ram_ro:
+        case p2m_ram_paging_out:
         case p2m_ram_shared:
             entry->r = entry->x = 1;
             entry->w = 0;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 09:22:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 09:22:22 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ0Ee-0003UU-HH; Mon, 14 Nov 2011 09:22:20 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ0DK-0003Gy-Du
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 09:20:59 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1321291255!3079771!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8578 invoked from network); 14 Nov 2011 17:20:55 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 17:20:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,510,1315180800"; 
   d="scan'208";a="8921491"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 17:20:42 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 14 Nov 2011 17:20:42 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RQ0D3-0008KE-Mp; Mon, 14 Nov 2011 17:20:41 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RQ0D3-0003t7-Lm;
	Mon, 14 Nov 2011 17:20:41 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20161.19943.363795.996759@mariner.uk.xensource.com>
Date: Mon, 14 Nov 2011 17:20:39 +0000
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 1/4] docs/html/hcall: Initial cut of header
	documentation massager
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1321264778.3664.19.camel@zakaz.uk.xensource.com>
References: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
	<1321212066-10648-2-git-send-email-ian.jackson@eu.citrix.com>
	<1321264778.3664.19.camel@zakaz.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ian Campbell writes ("Re: [Xen-devel] [PATCH 1/4] docs/html/hcall: Initial cut of header documentation massager"):
> On Sun, 2011-11-13 at 19:21 +0000, Ian Jackson wrote:
> > diff --git a/docs/xen-headers b/docs/xen-headers
> > new file mode 100755
> > index 0000000..6918380
> > --- /dev/null
> > +++ b/docs/xen-headers
> > @@ -0,0 +1,281 @@
> > +#!/usr/bin/perl -w
> > +# usage: xen-headers [ -X GLOB -I GLOB ... [-D...] ] \
> > +#                    -O HTML-DIR PUBLIC-INCLUDE-DIR
> 
> No "-T"? Also for PUBLIC-INCLUDE-DIR you appear to pass "../xen
> include/public" so my guess is that it is slightly more complicated?
> Looks like "BASE-PUBLIC-INCLUDE-DIR PUBLIC-INCLUDE-FILE
> [ PUBLIC-INCLUDE-FILE ... ] 

I seem to have forgotten to update the usage comment there.  I will
fix this.

> [...]
> > +	s/\&/\&amp;/g;
> > +	s/\</\&lt;/g;
> > +	s/\>/\&gt;/g;
> 
> There must be a perl lib for this?

Yes, but it's not in the base perl distribution and I didn't want to
pull in a dependent library for three trivial lines.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 09:23:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 09:23:39 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ0Fv-0003s1-6a; Mon, 14 Nov 2011 09:23:39 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ0FC-0003bf-US
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 09:22:55 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1321291371!1504644!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21195 invoked from network); 14 Nov 2011 17:22:51 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 17:22:51 -0000
X-IronPort-AV: E=Sophos;i="4.69,510,1315180800"; 
   d="scan'208";a="8921546"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 17:22:51 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 14 Nov 2011 17:22:51 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RQ0F8-0008L4-Av; Mon, 14 Nov 2011 17:22:50 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RQ0F8-0003tV-A0;
	Mon, 14 Nov 2011 17:22:50 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20161.20074.297455.727406@mariner.uk.xensource.com>
Date: Mon, 14 Nov 2011 17:22:50 +0000
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 2/4] docs/html/hcall: Annotations for two
	hypercalls
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1321265556.3664.25.camel@zakaz.uk.xensource.com>
References: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
	<1321212066-10648-3-git-send-email-ian.jackson@eu.citrix.com>
	<1321265556.3664.25.camel@zakaz.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ian Campbell writes ("Re: [Xen-devel] [PATCH 2/4] docs/html/hcall: Annotations for two hypercalls"):
> On Sun, 2011-11-13 at 19:21 +0000, Ian Jackson wrote:
> > +/* ` enum neg_errnoval { /* -Efoo for each Efoo in the list below } */
> 
> Do we pass -Wcomment (or something which includes it)? If so gcc might
> warn:
>         /home/ianc/t.c:5:26: warning: "/*" within comment
> (and we use -Werror, so...).

Good point.  I don't think we pass that now - I would have noticed.
But we probably should do so I should change the comment there to [ ]
or something.

> Is this syntax trying to encode some meaning or was it just a typo?

Ideally it would have had a matching */ but obv. that wouldn't have
worked :-).

> > +/* ` enum errnoval { */
> > +
> >  #define	EPERM		 1	/* Operation not permitted */
> >  #define	ENOENT		 2	/* No such file or directory */
> >  #define	ESRCH		 3	/* No such process */
> > @@ -129,4 +132,6 @@
> >  #define	ENOMEDIUM	123	/* No medium found */
> >  #define	EMEDIUMTYPE	124	/* Wrong medium type */
> >  
> > +/* } */
> 
> Is the ` supposed to be required here or is omitting it fine?

Omitting the ` means the processor doesn't see that which means the
remaining #defines in that file would count as part of the enum -
except there aren't any.  So it's a bug.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 09:24:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 09:24:30 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ0Gk-0004Ep-Gu; Mon, 14 Nov 2011 09:24:30 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ0FT-0003hA-Fs
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 09:23:12 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1321291388!3508483!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14020 invoked from network); 14 Nov 2011 17:23:08 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 17:23:08 -0000
X-IronPort-AV: E=Sophos;i="4.69,510,1315180800"; 
   d="scan'208";a="8921549"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 17:23:08 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 14 Nov 2011 17:23:08 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RQ0FP-0008LE-L8; Mon, 14 Nov 2011 17:23:07 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RQ0FP-0003tm-KR;
	Mon, 14 Nov 2011 17:23:07 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20161.20091.553127.544338@mariner.uk.xensource.com>
Date: Mon, 14 Nov 2011 17:23:07 +0000
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 3/4] docs/html/hcall: Generate an "index.html"
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1321265580.3664.26.camel@zakaz.uk.xensource.com>
References: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
	<1321212066-10648-4-git-send-email-ian.jackson@eu.citrix.com>
	<1321265580.3664.26.camel@zakaz.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ian Campbell writes ("Re: [Xen-devel] [PATCH 3/4] docs/html/hcall: Generate an "index.html""):
> On Sun, 2011-11-13 at 19:21 +0000, Ian Jackson wrote:
> > @@ -231,6 +246,8 @@ sub process_file ($$) {
> >  	    }
> >  	} elsif (s/^( \s* \#define \s+ ) (\w+) ( \s+\S )
> >                    / $1.defmacro($2).norm($3) /xe) {
> > +	} elsif (s/( \`incontents \s+ (\d+) \s+ (\w+) \s+ )(\S .* \S)
> > +                 / norm($1).incontents($4, $2, $3) /xe) {
> 
> You had a comment describing the syntax which I don't think includes
> this bit.

Good point.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 09:25:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 09:25:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ0HY-0004bt-BY; Mon, 14 Nov 2011 09:25:20 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ0Gl-0004E5-G5
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 09:24:31 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1321291468!4136543!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10605 invoked from network); 14 Nov 2011 17:24:28 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-12.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 17:24:28 -0000
X-IronPort-AV: E=Sophos;i="4.69,510,1315180800"; 
   d="scan'208";a="8921591"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 17:24:28 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 14 Nov 2011 17:24:28 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RQ0Gh-0008Lh-7i; Mon, 14 Nov 2011 17:24:27 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RQ0Gh-0003tv-6q;
	Mon, 14 Nov 2011 17:24:27 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20161.20171.199678.136614@mariner.uk.xensource.com>
Date: Mon, 14 Nov 2011 17:24:27 +0000
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 0/4] docs/html/hcall: Hypercall docs headers
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1321265610.3664.27.camel@zakaz.uk.xensource.com>
References: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
	<1321265610.3664.27.camel@zakaz.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ian Campbell writes ("Re: [Xen-devel] [PATCH 0/4] docs/html/hcall: Hypercall doc> Excellent stuff.

Glad you like it.

> It seems to consider
>         static struct xsd_errors xsd_errors[]
>         #if defined(__GNUC__)
>         __attribute__((unused))
> as defining a function called __attribute__ which is a bit unfortunate!

I can fix that easily enough by special-casing keywords.

> I had some nitpicks as I looked over the patches but regardless I think
> this is a good start and should go in. All:
> Acked-by: Ian Campbell <ian.campbell@citrix.com>

Thanks.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 09:34:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 09:34:25 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ0QL-0005B1-Nd; Mon, 14 Nov 2011 09:34:25 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ0Pa-0004wZ-8l
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 09:33:38 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1321292013!2543162!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7894 invoked from network); 14 Nov 2011 17:33:35 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 17:33:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,510,1315195200"; d="scan'208";a="170508907"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 12:33:33 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX02.citrite.net
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Mon, 14 Nov 2011
	12:33:33 -0500
Message-ID: <4EC150EC.3020100@citrix.com>
Date: Mon, 14 Nov 2011 17:33:32 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: prevent vector sharing within	
	IO-APICs
References: <4EBD54B80200007800060776@nat28.tlf.novell.com>
	<4EBD579F.70901@citrix.com>
	<4EC0E6010200007800060B29@nat28.tlf.novell.com>
	<4EC11EAB.80400@citrix.com>
	<4EC131B60200007800060C9B@nat28.tlf.novell.com>
	<4EC13367.9080209@citrix.com>
	<4EC14FFE0200007800060D18@nat28.tlf.novell.com>
In-Reply-To: <4EC14FFE0200007800060D18@nat28.tlf.novell.com>
X-Enigmail-Version: 1.1.2
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 14/11/11 16:29, Jan Beulich wrote:
>>>> On 14.11.11 at 16:27, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
>> On 14/11/11 14:20, Jan Beulich wrote:
>>> I'm having some more fundamental problem with this original change
>>> of yours: The assignment of the new vector happens in the context
>>> of move_native_irq(), which gets called *after* doing the manual
>>> EOI (and hence also *after* the vector != desc->arch.vector check).
>>> How does that do what it is supposed to?
>>>
>>> (Below the [untested] patch that I would propose to do what I described
>>> above, pending your clarification regarding the original change.)
>>>
>>> Jan
>> Are you sure?  I was under the impression that for safety, you have to
>> move the IRQ before ack'ing it at the local APIC, to prevent another IRQ
>> coming in while you are updating the structures.
> Just take another look at end_level_ioapic_irq().

If it makes a difference, I was debugging the issue on boxes without
x2APIC, so there was no direct EOI support.  Given the number of times
the code conditionally returns depending on direct_eoi_enabled, I would
not be surprised if there are two separate codepaths.

>> The steps (as far as I remember from debugging this issue) are:
>>
>> 1) Scheduler decides move a vcpu to a different pcpu.  This implies
>> moving all bound IRQs.  It sets irq_desc->arch->pending_mask to the
>> pcpu(s) we wish to move to, and sets irq_desc->static |= IRQ_MOVE_PENDING
>> 2) When an irq appears (on the original pcpu) which has IRQ_MOVE_PENDING
>> set, the ack handler rewrites the RTE to point to the new pcpu:vector,
>> and updates the irq_desc a bit.  This rewriting necessarily happens
>> before sending an EOI.
> One would think so, but according to my reading of the code that's
> not the case. And it really can't, as otherwise
> io_apic_level_ack_pending() would always return true (and hence
> move_native_irq() would never get called).

In mask_and_ack_level_ioapic_irq which is the ack handler for level
triggered interrupts, there seems to be a codepath which masks the irq,
then EOIs the local apic which should clear the Remote IRR in the RTE at
which point the call to move_masked_irq() should go ahead.

I have to admit that I am perplexed as to how the original bug occurred,
but I guarantee that at the time, I was seeing the RTE being updated to
the new vector while the LAPIC still held the vector for the old irq. 
This is why the submitted patch fixed the bug.

>> 3) When the next irq appears (on the new pcpu), the code cleans up the
>> old vector_irq reference for the old pcpu, and tweaks some of irq_desc.
> But the crucial thing is that desc->arch.vector gets written during step 2,
> and hence the condition around the EOI can never be true unless an
> interrupt surfaces in the window between the EOI in step 2 and the
> disabling of it in move_native_irq(). Was it just this special case that
> your original change addressed (the change description doesn't hint in
> that direction).

Given that the bug was certainly a timing issue, and most of the time
the IRQ migrated, everything worked fine, It is quite possible that it
was a new IRQ appearing in that window.  Having said that, even if a new
IRQ arrived, its remote IRR should not be set until the LAPIC has acked
it, at which point we should be in the IRQ handler for it which seems
rather hard if we are still in the handler for the previous IRQ. 
Perhaps there is a weird interaction whereby acking a masked level
interrupt doesn't reset the IRR.

I have to admit that the logic seems a bit broken, and it certainly
seems to be more complicated than it needs to be.

>> An alternative to 3) can occur when using the IRQ_MOVE_CLEANUP_VECTOR
>> IPI which looks through all pending cleanups on the current pcpu and
>> cleans them up.
>>
>> Anyway, it was certainly the case that I saw the RTE being updated
>> before the EOI was sent, which is why I had to change the
>> hw_irq_controler.end interface to include the vector from the pending
>> EOI stack, so end_level_ioapic_irq could EOI the new vector if it was
>> different from the vector the lapic saw.
> That's another thing I would want to revert: There really shouldn't be
> a need to pass in the old vector, as it is getting stored in
> __assign_irq_vector(). If the value wasn't valid anymore at the point
> we'd need it, we'd have a more severe problem - the vector gets
> marked as not in use by smp_irq_move_cleanup_interrupt(), and
> hence it wouldn't be valid anymore to play with it (read: EOI it) as
> it may have got re-used already. As vector_irq[] gets updated there
> too, that should result in "No irq handler for vector ...", but it would
> not make it into end_level_ioapic_irq() in such a case.
>
> Jan

That is fair enough.  When I submitted this patch, irq_cfg did not have
old_vector in it - I added old_vector in a later patch.  I really should
have remembered that I could then revert the change to the interface.

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 09:40:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 09:40:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ0Vu-0005ip-48; Mon, 14 Nov 2011 09:40:10 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ0VM-0005WH-AD
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 09:39:36 -0800
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-4.tower-216.messagelabs.com!1321292372!3484962!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 679 invoked from network); 14 Nov 2011 17:39:32 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-4.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Nov 2011 17:39:32 -0000
X-Originating-Ip: [194.89.68.22]
Received: from ydin.reaktio.net (reaktio.net [194.89.68.22])
	by smtp.tele.fi (Postfix) with ESMTP id 0EA45122F;
	Mon, 14 Nov 2011 19:39:31 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id D673F20058; Mon, 14 Nov 2011 19:39:31 +0200 (EET)
Date: Mon, 14 Nov 2011 19:39:31 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek nic problems
	(eth0 8139cp transmit queue timed out)
Message-ID: <20111114173931.GG12984@reaktio.net>
References: <CAD88F26.24242%keir.xen@gmail.com>
	<alpine.DEB.2.00.1111071153230.3519@kaball-desktop>
	<20111108112421.GU12984@reaktio.net>
	<20111111070250.GZ12984@reaktio.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <20111111070250.GZ12984@reaktio.net>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: "xen@lists.fedoraproject.org" <xen@lists.fedoraproject.org>,
	Keir Fraser <keir.xen@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, Nov 11, 2011 at 09:02:50AM +0200, Pasi Kärkkäinen wrote:
> > > > >> 
> > > > >> So the Ubuntu backport from xen-unstable to Xen 4.1.1 is here:
> > > > >> https://launchpadlibrarian.net/81948978/xen-pirq-resubmit-irq.patch
> > > > >> 
> > > > >> It seems to be shipping in Ubuntu 11.10 xen 4.1.1-2ubuntu4.1 packages.
> > > > >> 
> > > > >> Does that patch look suitable to be applied to xen-4.1-testing.hg ?
> > > > >> This bug should be fixed for Xen 4.1.3.
> > > > > 
> > > > > Any comments? 
> > > > 
> > > > This looks like a backport of Stefano's xen-unstable c/s 24007. I would like
> > > > him to submit/ack the backport, as it is not a trivial backport of the
> > > > xen-unstable patch.
> > > 
> > > I would rather use the following backport. Compared to the other one it
> > > returns EINVAL in PHYSDEVOP_irq_status_query when the arguments are not
> > > correct.
> > > 
> > 
> > Thanks! Mayoung added this patch in xen-4.1.2-1.1.fc14.src.rpm,
> > and binary rpms are built for Fedora 16 here:
> > http://koji.fedoraproject.org/koji/taskinfo?taskID=3495905
> > 
> > So people should test this patch (or the rpms above) and confirm 
> > that it fixes the emulated realtek/ne2k issues.
> > 
> 
> Konrad confirmed the patch works with Xen 4.1.2 and realtek emulated nics.
> 
> So please commit the patch to xen-4.1-testing.hg.
> 

I also tested Fedora 16 xen-4.1.2-1.2.fc16 rpms,
which includes stefano's bugfix patch, and it seems to fix 
the emulated realtek nic problems.

So please go ahead and commit the fix to xen-4.1-testing.hg.

-- Pasi


> > 
> > > ---
> > > 
> > > diff -r 8c2d76193eaf xen/arch/x86/physdev.c
> > > --- a/xen/arch/x86/physdev.c	Wed Nov 02 15:02:18 2011 +0000
> > > +++ b/xen/arch/x86/physdev.c	Mon Nov 07 11:58:28 2011 +0000
> > > @@ -261,6 +261,7 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
> > >          ret = -EINVAL;
> > >          if ( eoi.irq >= v->domain->nr_pirqs )
> > >              break;
> > > +        spin_lock(&v->domain->event_lock);
> > >          if ( v->domain->arch.pirq_eoi_map )
> > >              evtchn_unmask(v->domain->pirq_to_evtchn[eoi.irq]);
> > >          if ( !is_hvm_domain(v->domain) ||
> > > @@ -268,6 +269,19 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
> > >              ret = pirq_guest_eoi(v->domain, eoi.irq);
> > >          else
> > >              ret = 0;
> > > +        if ( is_hvm_domain(v->domain) &&
> > > +                domain_pirq_to_emuirq(v->domain, eoi.irq) > 0 )
> > > +        {
> > > +            struct hvm_irq *hvm_irq = &v->domain->arch.hvm_domain.irq;
> > > +            int gsi = domain_pirq_to_emuirq(v->domain, eoi.irq);
> > > +
> > > +            /* if this is a level irq and count > 0, send another
> > > +             * notification */ 
> > > +            if ( gsi >= NR_ISAIRQS /* ISA irqs are edge triggered */
> > > +                    && hvm_irq->gsi_assert_count[gsi] )
> > > +                send_guest_pirq(v->domain, eoi.irq);
> > > +        }
> > > +        spin_unlock(&v->domain->event_lock);
> > >          break;
> > >      }
> > >  
> > > @@ -323,9 +337,10 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
> > >              break;
> > >          irq_status_query.flags = 0;
> > >          if ( is_hvm_domain(v->domain) &&
> > > -             domain_pirq_to_irq(v->domain, irq) <= 0 )
> > > +                domain_pirq_to_irq(v->domain, irq) <= 0 &&
> > > +                domain_pirq_to_emuirq(v->domain, irq) == IRQ_UNBOUND )
> > >          {
> > > -            ret = copy_to_guest(arg, &irq_status_query, 1) ? -EFAULT : 0;
> > > +            ret = -EINVAL;
> > >              break;
> > >          }
> > >  
> > 
> > _______________________________________________
> > Xen-devel mailing list
> > Xen-devel@lists.xensource.com
> > http://lists.xensource.com/xen-devel
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 09:48:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 09:48:05 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ0dZ-0006Fn-B8; Mon, 14 Nov 2011 09:48:05 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ0cm-00062j-2i
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 09:47:16 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1321292832!2544701!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6604 invoked from network); 14 Nov 2011 17:47:13 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 17:47:13 -0000
X-IronPort-AV: E=Sophos;i="4.69,510,1315180800"; 
   d="scan'208";a="8921903"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 17:47:12 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 14 Nov 2011 17:47:13 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RQ0ci-0008Tt-G9; Mon, 14 Nov 2011 17:47:12 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RQ0ci-0003vq-FJ;
	Mon, 14 Nov 2011 17:47:12 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8bit
Message-ID: <20161.21535.456074.757497@mariner.uk.xensource.com>
Date: Mon, 14 Nov 2011 17:47:11 +0000
To: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
Subject: Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek nic problems
	(eth0 8139cp transmit queue timed out)
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <m2n.s.1RQ0WH-146660@chiark.greenend.org.uk>
References: <CAD88F26.24242%keir.xen@gmail.com>
	<alpine.DEB.2.00.1111071153230.3519@kaball-desktop>
	<20111108112421.GU12984@reaktio.net>
	<20111111070250.GZ12984@reaktio.net>
	<m2n.s.1RQ0WH-146660@chiark.greenend.org.uk>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen@lists.fedoraproject.org" <xen@lists.fedoraproject.org>,
	Keir Fraser <keir.xen@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Pasi Kärkkäinen writes ("Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek nic problems (eth0 8139cp transmit queue timed out)"):
> So please go ahead and commit the fix to xen-4.1-testing.hg.

Keir, will you do this ?  If you prefer I can do it, but I need the
blessing of a hypervisor maintainer.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 09:49:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 09:49:53 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ0fI-0006ee-8E; Mon, 14 Nov 2011 09:49:52 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ0er-0006St-5l
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 09:49:25 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1321292962!2174692!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14105 invoked from network); 14 Nov 2011 17:49:22 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 17:49:22 -0000
X-IronPort-AV: E=Sophos;i="4.69,510,1315180800"; 
   d="scan'208";a="8921950"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 17:49:22 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 14 Nov 2011 17:49:22 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RQ0en-0008Uf-Rz; Mon, 14 Nov 2011 17:49:21 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RQ0en-0003xn-R5;
	Mon, 14 Nov 2011 17:49:21 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20161.21665.813418.406748@mariner.uk.xensource.com>
Date: Mon, 14 Nov 2011 17:49:21 +0000
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH] xenpaging: munmap all pages after page-in
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <79677f532a2406ca5012.1320255446@probook.site>
References: <79677f532a2406ca5012.1320255446@probook.site>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Olaf Hering writes ("[Xen-devel] [PATCH] xenpaging: munmap all pages after page-in"):
> xenpaging: munmap all pages after page-in

Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 09:50:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 09:50:58 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ0gM-00072V-2F; Mon, 14 Nov 2011 09:50:58 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ0fd-0006jT-JW
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 09:50:13 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1321293010!3078198!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9151 invoked from network); 14 Nov 2011 17:50:10 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 17:50:10 -0000
X-IronPort-AV: E=Sophos;i="4.69,510,1315180800"; 
   d="scan'208";a="8921972"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 17:50:10 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 14 Nov 2011 17:50:10 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RQ0fZ-0008Uy-Pg; Mon, 14 Nov 2011 17:50:09 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RQ0fZ-0003yd-P1;
	Mon, 14 Nov 2011 17:50:09 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20161.21713.764464.215011@mariner.uk.xensource.com>
Date: Mon, 14 Nov 2011 17:50:09 +0000
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH] xenpaging: improve policy mru list handling
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <af9eb3b6c6d874e54d28.1320258837@probook.site>
References: <af9eb3b6c6d874e54d28.1320258837@probook.site>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Olaf Hering writes ("[Xen-devel] [PATCH] xenpaging: improve policy mru list handling"):
> xenpaging: improve policy mru list handling

This does not apply to xen-unstable tip, I'm afraid.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 09:51:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 09:51:43 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ0h5-0007PM-D5; Mon, 14 Nov 2011 09:51:43 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ0gY-000781-EA
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 09:51:10 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1321293066!3472732!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18518 invoked from network); 14 Nov 2011 17:51:06 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 17:51:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,510,1315180800"; 
   d="scan'208";a="8921997"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 17:51:06 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 14 Nov 2011 17:51:06 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RQ0gT-0008VC-Mt; Mon, 14 Nov 2011 17:51:05 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RQ0gT-00040T-MG;
	Mon, 14 Nov 2011 17:51:05 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20161.21765.515484.147899@mariner.uk.xensource.com>
Date: Mon, 14 Nov 2011 17:51:01 +0000
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] docs: report if we do not build a doc due to
	lack of the necessary tool
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1320262986-23352-1-git-send-email-ian.campbell@citrix.com>
References: <1320262986-23352-1-git-send-email-ian.campbell@citrix.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ian Campbell writes ("[Xen-devel] [PATCH] docs: report if we do not build a doc due to lack of the necessary tool"):
> Previously only some targets did this. An alternative would be to make a hard
> dependency on these tools, this might make more sense especially for markdown?

Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-users-bounces@lists.xensource.com Mon Nov 14 11:22:48 2011
Return-path: <xen-users-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 11:22:48 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ276-0005T5-UJ; Mon, 14 Nov 2011 11:22:43 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPtAT-0004nQ-El; Mon, 14 Nov 2011 01:50:01 -0800
X-Env-Sender: amrish.parikh@gmail.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1321264139!48140829!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27610 invoked from network); 14 Nov 2011 09:49:00 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 09:49:00 -0000
Received: by ggnk1 with SMTP id k1so1328379ggn.30
	for <multiple recipients>; Mon, 14 Nov 2011 01:49:17 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=fxANUTnq88rgCM+ugI/1xjf1XJzP3aAhed8jaEWtEjs=;
	b=ggmcnemxSV5qWj66ijSTPFFJJrY+hdOS83I7XO2LdXdw/eWBvQ4NCtP2Ezctv8Fn/z
	BgL8SWpHICHNjXD+XoGRfv5m+YZeyuUxO5AL3JPD8YyVaimomapDXZ/5TMy16afXbQ3L
	uwO1+Zfe/q6qDt86JRP2Mxmo7PX/RSbizvjog=
MIME-Version: 1.0
Received: by 10.68.16.70 with SMTP id e6mr48808631pbd.91.1321264155307; Mon,
	14 Nov 2011 01:49:15 -0800 (PST)
Received: by 10.142.43.1 with HTTP; Mon, 14 Nov 2011 01:49:13 -0800 (PST)
Date: Mon, 14 Nov 2011 15:19:13 +0530
Message-ID: <CAB_2i1SfJJ+zXGgv9DqkD2s6gHsV6CGTD6kPJw9z0RtqJQbFYg@mail.gmail.com>
From: Amrish Parikh <amrish.parikh@gmail.com>
To: xen-devel@lists.xensource.com, xen-users@lists.xensource.com
Content-Type: multipart/mixed; boundary=bcaec51dd491a1b5f004b1aec8c3
X-Mailman-Approved-At: Mon, 14 Nov 2011 09:52:56 -0800
Cc: 
Subject: [Xen-users] Getting wierd behaviour of SLES11 SP1 on XenCenter5.6
	FP1
X-BeenThere: xen-users@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen user discussion <xen-users.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-users>,
	<mailto:xen-users-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-users@lists.xensource.com>
List-Help: <mailto:xen-users-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-users>,
	<mailto:xen-users-request@lists.xensource.com?subject=subscribe>
Sender: xen-users-bounces@lists.xensource.com
Errors-To: xen-users-bounces@lists.xensource.com

--bcaec51dd491a1b5f004b1aec8c3
Content-Type: multipart/alternative; boundary=bcaec51dd491a1b5ea04b1aec8c1

--bcaec51dd491a1b5ea04b1aec8c1
Content-Type: text/plain; charset=ISO-8859-1

Hi,

I am trying to install SLES11 SP1 on XenCenter Virtual image and while
Installation finding that it is showing 4 disks (hda, hdb, sda & sdb)
instead of 2 disks.

Here is my observations:
1. Checked SLES11SP1 OS installation on Xen virtual image (5.6 FP1 -
build38895), seeing 4 disks (hda, hdb, sda, sdb) instead of 2 disks (either
hda, hdb, or sda, sdb).
2. On The same virtual instance, SLES11 GA shows proper 2 disks hda & hdb
3. When upgraded the SLES11GA instance with the SLES11SP1 OS, again during
installation it shows 4 disks and after OS installation completed also it
shows
only 4 disks (hda, hdb, sda, sdb). That is, in SLES11 GA it was only 2 disks
and now after upgrde it shows 4 disks (hda, hdb, sda, sdb).
4. On the same instance, SLES10SP3 is installed successfully and shows only
2
disks hda & hdb
5. Even with the new virtual instance on XenCenter, I am getting the same
behaviour.

here is the output after SLES11 SP1 installation:
**************************************************
***************************
xensles11sp1: # df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 17G 3.9G 13G 25% /
devtmpfs 939M 152K 939M 1% /dev
tmpfs 939M 24K 939M 1% /dev/shm
/dev/sda2 1004M 42M 912M 5% /boot
/dev/sr0 2.9G 2.9G 0 100% /media/SLES-11-SP1-DVD-x86_64.0432..001


xensles11sp1: #
You have new mail in /var/spool/mail/root
xensles11sp1: #
xensles11sp1: #
xensles11sp1: # cat /etc/*release
LSB_VERSION="core-2.0-noarch:core-3.2-noarch:core-4.0-noarch:core-2.0-x86_64:core-3.2-x86_64:core-4.0-x86_64"
SUSE Linux Enterprise Server 11 (x86_64)
VERSION = 11
PATCHLEVEL = 1
xensles11sp1:# fdisk -l

Disk /dev/hdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x86aa86aa

Disk /dev/hdb doesn't contain a valid partition table

Disk /dev/hda: 26.8 GB, 26843545600 bytes
255 heads, 63 sectors/track, 3263 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000b81a5

Device Boot Start End Blocks Id System
/dev/hda1 2 2220 17824117+ 83 Linux
/dev/hda2 * 2221 2350 1044225 83 Linux
/dev/hda3 2351 2872 4192965 82 Linux swap / Solaris

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x86aa86aa

Disk /dev/sdb doesn't contain a valid partition table

Disk /dev/sda: 26.8 GB, 26843545600 bytes
255 heads, 63 sectors/track, 3263 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000b81a5

Device Boot Start End Blocks Id System
/dev/sda1 2 2220 17824117+ 83 Linux
/dev/sda2 * 2221 2350 1044225 83 Linux
/dev/sda3 2351 2872 4192965 82 Linux swap / Solaris
xensles11sp1: # df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 17G 3.9G 12G 25% /
devtmpfs 939M 152K 939M 1% /dev
tmpfs 939M 24K 939M 1% /dev/shm
/dev/sda2 1004M 42M 912M 5% /boot
/dev/sr0 2.9G 2.9G 0 100% /media/SLES-11-SP1-DVD-x86_64.0432..001

--bcaec51dd491a1b5ea04b1aec8c1
Content-Type: text/html; charset=ISO-8859-1

Hi,<br>
<br>
I am trying to install SLES11 SP1 on XenCenter Virtual image and while 
Installation finding that it is showing 4 disks (hda, hdb, sda &amp; 
sdb) instead of 2 disks.<br>
<br>
Here is my observations:<br>
1. Checked SLES11SP1 OS installation on Xen virtual image (5.6 FP1 -<br>
build38895), seeing 4 disks (hda, hdb, sda, sdb) instead of 2 disks (either<br>
hda, hdb, or sda, sdb).<br>
2. On The same virtual instance, SLES11 GA shows proper 2 disks hda &amp; hdb<br>
3. When upgraded the SLES11GA instance with the SLES11SP1 OS, again during<br>
installation it shows 4 disks and after OS installation completed also it shows<br>
only 4 disks (hda, hdb, sda, sdb). That is, in SLES11 GA it was only 2 disks<br>
and now after upgrde it shows 4 disks (hda, hdb, sda, sdb).<br>
4. On the same instance, SLES10SP3 is installed successfully and shows only 2<br>
disks hda &amp; hdb<br>
5. Even with the new virtual instance on XenCenter, I am getting the same behaviour.<br>
<br>
here is the output after SLES11 SP1 installation:<br>
************************************************** ***************************<br>
xensles11sp1: # df -h<br>
Filesystem Size Used Avail Use% Mounted on<br>
/dev/sda1 17G 3.9G 13G 25% /<br>
devtmpfs 939M 152K 939M 1% /dev<br>
tmpfs 939M 24K 939M 1% /dev/shm<br>
/dev/sda2 1004M 42M 912M 5% /boot<br>
/dev/sr0 2.9G 2.9G 0 100% /media/SLES-11-SP1-DVD-x86_64.0432..001<br>
<br>
<br>
xensles11sp1: #<br>
You have new mail in /var/spool/mail/root<br>
xensles11sp1: #<br>
xensles11sp1: #<br>
xensles11sp1: # cat /etc/*release<br>
LSB_VERSION=&quot;core-2.0-noarch:core-3.2-noarch:core-4.0-noarch:core-2.0-x86_64:core-3.2-x86_64:core-4.0-x86_64&quot;<br>
SUSE Linux Enterprise Server 11 (x86_64)<br>
VERSION = 11<br>
PATCHLEVEL = 1<br>
xensles11sp1:# fdisk -l<br>
<br>
Disk /dev/hdb: 21.5 GB, 21474836480 bytes<br>
255 heads, 63 sectors/track, 2610 cylinders<br>
Units = cylinders of 16065 * 512 = 8225280 bytes<br>
Disk identifier: 0x86aa86aa<br>
<br>
Disk /dev/hdb doesn&#39;t contain a valid partition table<br>
<br>
Disk /dev/hda: 26.8 GB, 26843545600 bytes<br>
255 heads, 63 sectors/track, 3263 cylinders<br>
Units = cylinders of 16065 * 512 = 8225280 bytes<br>
Disk identifier: 0x000b81a5<br>
<br>
Device Boot Start End Blocks Id System<br>
/dev/hda1 2 2220 17824117+ 83 Linux<br>
/dev/hda2 * 2221 2350 1044225 83 Linux<br>
/dev/hda3 2351 2872 4192965 82 Linux swap / Solaris<br>
<br>
Disk /dev/sdb: 21.5 GB, 21474836480 bytes<br>
255 heads, 63 sectors/track, 2610 cylinders<br>
Units = cylinders of 16065 * 512 = 8225280 bytes<br>
Disk identifier: 0x86aa86aa<br>
<br>
Disk /dev/sdb doesn&#39;t contain a valid partition table<br>
<br>
Disk /dev/sda: 26.8 GB, 26843545600 bytes<br>
255 heads, 63 sectors/track, 3263 cylinders<br>
Units = cylinders of 16065 * 512 = 8225280 bytes<br>
Disk identifier: 0x000b81a5<br>
<br>
Device Boot Start End Blocks Id System<br>
/dev/sda1 2 2220 17824117+ 83 Linux<br>
/dev/sda2 * 2221 2350 1044225 83 Linux<br>
/dev/sda3 2351 2872 4192965 82 Linux swap / Solaris<br>
xensles11sp1: # df -h<br>
Filesystem Size Used Avail Use% Mounted on<br>
/dev/sda1 17G 3.9G 12G 25% /<br>
devtmpfs 939M 152K 939M 1% /dev<br>
tmpfs 939M 24K 939M 1% /dev/shm<br>
/dev/sda2 1004M 42M 912M 5% /boot<br>
/dev/sr0 2.9G 2.9G 0 100% /media/SLES-11-SP1-DVD-x86_64.0432..001
				

--bcaec51dd491a1b5ea04b1aec8c1--
--bcaec51dd491a1b5f004b1aec8c3
Content-Type: application/msword; name="SLES11 GA Installation.doc"
Content-Disposition: attachment; filename="SLES11 GA Installation.doc"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_guzaeqwp0

0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAABFAAAANSIAAAAAAAAA
EAAANyIAAAEAAAD+////AAAAAPAhAADxIQAA8iEAAPMhAAD0IQAA9SEAAPYhAAD3IQAA+CEAAPkh
AAD6IQAA+yEAAPwhAAD9IQAA/iEAAP8hAAAAIgAAASIAAAIiAAADIgAABCIAAAUiAAAGIgAAByIA
AAgiAAAJIgAACiIAAAsiAAAMIgAADSIAAA4iAAAPIgAAECIAABEiAAASIgAAEyIAABQiAAAVIgAA
FiIAABciAAAYIgAAGSIAABoiAAAbIgAAHCIAAB0iAAAeIgAAHyIAACAiAAAhIgAAIiIAACMiAAAk
IgAAJSIAACYiAAAnIgAAKCIAACkiAAAqIgAAKyIAACwiAAAtIgAALiIAAC8iAAAwIgAAMSIAADIi
AAAzIgAANCIAAP//////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////s
pcEAZ8AJBAAA+BK/AAAAAAAAEAAAAAAACAAA/ggAAA4AYmpiahBWEFYAAAAAAAAAAAAAAAAAAAAA
AAAJBBYALhQAAHI8AQByPAEA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AAAAA
AAAAAAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAAAAAAAAAAAALcAAAAAAJIFAAAAAAAAkgUAAOwS
AAAAAAAA7BIAAAAAAADsEgAAAAAAAOwSAAAAAAAA7BIAABQAAAAAAAAAAAAAAP////8AAAAAABMA
AAAAAAAAEwAAAAAAAAATAAAAAAAAABMAABwAAAAcEwAAFAAAAAATAAAAAAAANBUAADABAAAwEwAA
AAAAADATAAAAAAAAMBMAAAAAAAAwEwAAAAAAADATAAAAAAAACxQAAAAAAAALFAAAAAAAAAsUAAAA
AAAAsxQAAAIAAAC1FAAAAAAAALUUAAAAAAAAtRQAAAAAAAC1FAAAAAAAALUUAAAAAAAAtRQAACQA
AABkFgAAsgIAABYZAABeAAAA2RQAABUAAAAAAAAAAAAAAAAAAAAAAAAA7BIAAAAAAAALFAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAALFAAAAAAAAAsUAAAAAAAACxQAAAAAAAALFAAAAAAAANkUAAAAAAAA
AAAAAAAAAADsEgAAAAAAAOwSAAAAAAAAMBMAAAAAAAAAAAAAAAAAADATAADbAAAA7hQAABYAAABT
FAAAAAAAAFMUAAAAAAAAUxQAAAAAAAALFAAAIgAAAOwSAAAAAAAAMBMAAAAAAADsEgAAAAAAADAT
AAAAAAAAsxQAAAAAAAAAAAAAAAAAAFMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAACxQAAAAAAACzFAAAAAAAAAAAAAAAAAAAUxQAAAAAAAAAAAAA
AAAAAFMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUxQAAAAAAAAwEwAAAAAAAP////8AAAAAUPiyYOuP
zAEAAAAAAAAAAP////8AAAAALRQAAAoAAABTFAAAAAAAAAAAAAAAAAAAnxQAABQAAAAEFQAAMAAA
ADQVAAAAAAAAUxQAAAAAAAB0GQAAAAAAADcUAAAcAAAAdBkAAAAAAABTFAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAHQZAAAAAAAAAAAAAAAAAADsEgAAAAAAAFMUAABMAAAACxQAAAAAAAALFAAAAAAAAFMU
AAAAAAAACxQAAAAAAAALFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACxQA
AAAAAAALFAAAAAAAAAsUAAAAAAAA2RQAAAAAAADZFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAUxQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsUAAAA
AAAACxQAAAAAAAALFAAAAAAAADQVAAAAAAAACxQAAAAAAAALFAAAAAAAAAsUAAAAAAAACxQAAAAA
AAAAAAAAAAAAAP////8AAAAA/////wAAAAD/////AAAAAAAAAAAAAAAA/////wAAAAD/////AAAA
AP////8AAAAA/////wAAAAD/////AAAAAP////8AAAAA/////wAAAAD/////AAAAAP////8AAAAA
/////wAAAAD/////AAAAAP////8AAAAA/////wAAAAD/////AAAAAHQZAAAAAAAACxQAAAAAAAAL
FAAAAAAAAAsUAAAAAAAACxQAAAAAAAALFAAAAAAAAAsUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALFAAAAAAAAAsUAAAAAAAACxQA
AAAAAACSBQAAIAwAALIRAAA6AQAABQASAQAACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNMRVMx
MSBHQSBJbnN0YWxsYXRpb24NAQ0NAQ1BZnRlciBTTEVTMTEgR0EgSW5zdGFsbGF0aW9uOg0BDQ1O
b3csIFVwZ3JhZGluZyBTTEVTMTEgR0Egd2l0aCBTTEVTMTEgU1AxOg0NAQ0NAQ0NAQ0NQWZ0ZXIg
VXBncmFkZWQgdG8gU0xFUzExIFNQMToNDQENDVNMRVMxMSBTUDEgSW5zdGFsbGF0aW9uOg0NAQ0N
UGFydGl0aW9uIGNyZWF0aW9ucyBvbiBzZGE6DQ0BDQ1TTEVTMTAgU1AzOg0NAQ0NAQ0NQWZ0ZXIg
T1MgSW5zdGFsbGF0aW9uOg0BDQ0NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAABcI
AAAYCAAAGggAABsIAAAcCAAAOggAADsIAAA8CAAAPQgAAGYIAABnCAAAaAgAAGkIAABrCAAAbAgA
AG0IAABuCAAAbwgAAHAIAABxCAAAkAgAAPTh9M7D9LD0rKikqJGGc4ZoVWhKPwAAAAAAAAAAAAAA
AAAAAAAAFRZovwGVAG1IAARuSAAEdEgJQHUIARUWaNo/cgBtSAAEbkgABHRICUB1CAEkA2ozox4A
FWgeKkoAFmjaP3IAVQgBbUgABG5IAAR0SAlAdQgBABUWaBgQEgBtSAAEbkgABHRICUB1CAEkA2pI
PRgAFWgeKkoAFmgYEBIAVQgBbUgABG5IAAR0SAlAdQgBABUWaJBoGABtSAAEbkgABHRICUB1CAEk
A2p/vREAFWgeKkoAFmiQaBgAVQgBbUgABG5IAAR0SAlAdQgBAAYWaMVPyAAABhZokGgYAAAGFmjq
YWAAACQDas3/DAAVaB4qSgAWaClcggBVCAFtSAAEbkgABHRICUB1CAEAFRZo0EGHAG1IAARuSAAE
dEgJQHUIASQDahziBgAVaB4qSgAWaNBBhwBVCAFtSAAEbkgABHRICUB1CAEAJANqAAAAABVoHipK
ABZo6mFgAFUIAW1IAARuSAAEdEgJQHUIAQAVFmjqYWAAbUgABG5IAAR0SAlAdQgBABUACAAAFwgA
ABkIAAAaCAAAHAgAADoIAAA8CAAAPQgAAGcIAABoCAAAaggAAGsIAABtCAAAbggAAHAIAABxCAAA
jwgAAJAIAACSCAAAkwgAAKwIAACtCAAArwgAALAIAADMCAAAzQgAAM8IAADQCAAA3AgAAN0IAAD9
AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAA
AAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAA
AAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAA
AAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAA
AAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA
/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAA
AAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAHZAIAACRCAAA
kggAAJMIAACtCAAArggAALAIAADLCAAAzAgAAM0IAADOCAAA0AgAANsIAADcCAAA3QgAAN4IAADf
CAAA4AgAAOEIAADjCAAA+ggAAPsIAAD8CAAA/QgAAO3i3trHvLjauKWalriWg7x4ZXhaR3g8ABUW
aGwM1gBtSAAEbkgABHRICUB1CAEkA2qXd0AAFWgeKkoAFmhsDNYAVQgBbUgABG5IAAR0SAlAdQgB
ABUWaA1BNgBtSAAEbkgABHRICUB1CAEkA2q7Gz0AFWgeKkoAFmhzBEsAVQgBbUgABG5IAAR0SAlA
dQgBABUWaHMESwBtSAAEbkgABHRICUB1CAEkA2rBNjoAFWgeKkoAFmhzBEsAVQgBbUgABG5IAAR0
SAlAdQgBAAYWaHMESwAAFRZoa1F/AG1IAARuSAAEdEgJQHUIASQDahT7MgAVaB4qSgAWaGtRfwBV
CAFtSAAEbkgABHRICUB1CAEABhZoa1F/AAAVFmjFT8gAbUgABG5IAAR0SAlAdQgBJANqPacpABVo
HipKABZoxU/IAFUIAW1IAARuSAAEdEgJQHUIAQAGFmjFT8gAAAYWaNo/cgAAFRZovwGVAG1IAARu
SAAEdEgJQHUIASQDaqKDJgAVaB4qSgAWaL8BlQBVCAFtSAAEbkgABHRICUB1CAEX3QgAAN8IAADg
CAAA4ggAAOMIAAD6CAAA/AgAAP0IAAD+CAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAA
AAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAA
AAAAAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAj9CAAA/ggAAPwA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGFmhsDNYAASwAMZBoAR+wgi4g
sMZBIbCgBSKwoAUjkKAFJJCgBSWwAAAXsMQCGLDEAgyQxAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHOIGAEQAZAAAAAAA
AAAIAAAAAAAAAAAAAAAAAABLADzoAegBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP
AATwcAAAALIECvAIAAAAAQQAAAAKAABzAAvwPgAAAH8AgADhAARBAQAAAD8BAAAGAL8BAAAQAP8B
AAAIAIDDFAAAAL8DAAACAFAAaQBjAHQAdQByAGUAIAAxAAAAEwAi8QYAAACqAwAAAA8AABDwBAAA
AAAAAIBiAAfwWOEGAAYG6kqIqW/dOjFqm2heSYUra/8ANOEGAAEAAABEAAAAAAC2DABuHvAs4QYA
6kqIqW/dOjFqm2heSYUra/+JUE5HDQoaCgAAAA1JSERSAAAFAAAABAAIAgAAADHxYxQAAAABc1JH
QgCuzhzpAAD/yklEQVR4Xux9B4BVxfX+e9t36R3sgoiKolgQOxZQLLHEkmgSW5rd2ElM8k+1xthb
rL/EbsSOghq7iAIWQJBip0sv29//nPOdM3de3bfLLrAwl8fb+26ZO/PNmXPON3NmbvzpJ/4ai8Xi
tBUWFMTjMfpD+7wXo285E4slEjE6w3u86W4iQVclYvxNd9K1fB/tcAKcBl1eQFu8AOnzbXKz2yjV
GH04ed6jL/6nB2iXj/Ih3nAT9jhD+k8O4jZcJOd4q9e75a56vdsehoT1Ftqrp3+USH09P43vrJdd
+uIPpVVXV0cnaJNn0TefQNb4WfID6ck1ml0qNh2MAz2FhPMIrOh2RiVuxecsS3r8l744UboTP6QU
CcqEHuHc6fNREHs+yq/oUd5tz13ABajj4sld9fV1/KQ6/kdbfX0tfdH/utraOimwlK2uFnnTirCK
ovybSHjVKqVucONi4yIIG8QDYiMf7LBMej/5OvopcEfga105GZIyox5QfOQcOypRItR63IlTJGhR
/l1lam4zlczq24qR6RqUsYD+SemotfFWGC8qKiwsLKD/9LeIdvg//+RWRBcBHzSuCBZpTSlYKTaK
pMuKtSkDwhUcCAIWiL8DBHLu5NtvbdkrFkLrmgNLDskTtx3+K98sYSxtclwkSyvStXw/edFBWZ4X
IW6qQS8URdOkLS+xhcTm9wSvdUjl66Y7qmbtaHQWilZvzu9JJpqNuTozRp4kmyYVScKmejOpkgx3
IEPtVdQdtB394jZMf2WHLYxcog07KqXoAIDkPc5sRtIj9IfdIE9NqnJtGy6TbH+SLslYfbBT0XUw
Wy6RJGS9w/4VmSQvCU9AlBn4FjkKc4ZisUpUm6itDu0Px8XQ8Y42WzteT1bAzkNfiJVkWZC/Who6
7KRdSyliQBfww6xSnX71zbpZE0nUtC2Shljwf1GV0JmkMFllFhbQt6hKeBkQMhFSyQoyqWnaD828
6B1nwKEE1fqyBVcjofhwUUVHwmaKuZdkYUChwVSXKkTWTpztQIqe26JwSea5lFwe2iHlzwWBQyUa
Qsqk9tFrG1nkMU2KVPsrxqbhpbbZvotyrkvUQj/X8ndtbYLsP5l/nBLVTRdz6QEI6h+2wzYVLPyE
NxVt6W0gOZtISFHXmoAFN1dMKgt+CjIgFkSNCJ9ixygyKOan+aYhysTabIAt0qpbJlGnvZwuhjIk
AWW1bC2R5dUpdvVpIaXquaH5++oZaoOr2OrY/Ep4zipR6lHjGs/4cHJmDSNH0T1RcincBS4RZxi5
8QyNOpOaFJsnuGGS1Sjz+hgpspkjyg7YkKSu7RHWipQebsaTzB8TLcWXFkojLhQfr7i4iL/Fu9t3
v+GPPPrwYcMOmjVziggx4wBnyDUrzhrlUR1gtZioBPA051KIqgDV4moSpSgOZGG8Z68tJ06YeNDB
Q7/84lMoUtwOb5M2yk9RMW20I1qVNQ/fKLpTHUJqdKQN+CNaoZ60BKmEWs41XdW58yYffjhhyJCD
v/xykhkRbbwwN+muHWoHIqWOgYDFWVO/Qf0HSLogLWnCh1XXEZrCNK6vjVh+tKxwRaw6+Jk9e/V+
4cXRJ5/yky9mjOfEnx15NZ5Brrd45KKSGVGWEWdK2PsWSwr1QfSNTV6sno6Kpk4g61TZ7OdQzcPX
gTya3EFEcDOgwUcKZeqUrYszg1C14K+oFK0a/6ftSxJOvaHJRZrY8EM60f0wfkqBRY+Slq0DuuLC
K/VVd170rJJHNF3JnrkazLuESuhDuMDsAcCqFXCbiSdg2gVHvk8qWJiD1qgyYDXSsRirdzmGEpJR
4lNsFNjbFOlQj0LKK1f57EVv5IsgMpEhpGuZlFCh+Q9zYJJz/i8H5Ai6AWyTSrD6UYUBkdD/rq5M
WDw7aec8GyTuqogIyxYkRFqyqDBrJKZc7IEMqeYj6pdAv4U2FRUp4BZln89yfwIUjdeEFLhU1Wuy
0pDDkZdVRZVDV6uWFDeOObDoLGXCxcx+1a+DakdbAgfG7apCFDGnfCMGgYd5hgRi4ZSsWB6TB1Et
6HExZPx9VLpXsxl30ZBF9kF+6SYmvHCn1NkSNmy+iquvDLBTKiIV2KJm7T/auXc4GHnaSbKYTkys
KHp/6jPwwLQqFSuYnJsskCj2xuk8W6XV5vhhpPRN3KWy1dz6T8sBf5TTDGLYQJadpkoqStpRpGLK
xWokrVWYE6KGFu0XFhsdPvgFhwqNWb+0riMt4nDwM5ZcGLElSVUtGUuuJ7koBaEk/aMJQCHbtZZs
Bq2WlJ/0h6WLRErN5aUqsghW4w8r62VDoxzDKQF1uhyxYVMgjZO7WtVHFeMgLgdsEAtB5HeYOyCS
ATUFcydGSWEXo4x/olO0DOYMW9N1HoGnaJxvCuGBbyJ6UgiwdB1SuuqzaAacUOmDNNsiv85hAhp4
lOd56zWMDJtxR8rQIw7D7rgylxrHoR2dlTSfL9KZaoEtAyb2sHHS0cm+k5JhNBT2FkzPo705Wcyg
m6wVpOpJRRX+gSh5VCd3govlJ/bLPd5CfYUD19bW17AHwDt6UPsr2beJNLY6HVp95lAJno0lwM59
gXSoJdIuCTAE9lOQd85MTIyICKnIp/wSx02dH6s6yV2k7dHCG9+INo47zLcXvmeNlvU2AYjuGFXv
cEWg1f1umkifQ8FbA4RLAUdVWqPr2hBlozQYbiyUi1drkpVIg6vCZ61unUORTXHWJrKhwofFBqAA
kpLaFhxCY7QMO1/Us0+i0fRKu5BhEQqkKYsLq/YOpAsOXJzYL49qkE8nHJiUVsE+Bxz+6MP/GXbo
IbNmTNJWyRqX3HyGSMbFVEzFDVacQSJQcFZ7LMicKdYVcp30oRGP0z5B4mK9NtlqwviJBx8y7Ksv
Jrm6g/Yk3cnMt7iopKS4uIT+0S7TNkqZznIrFieNMkS+W01NbQ3/J0euRrQE/6snkhRLdO6yyQcf
jh9ywMHEsUWpSu+TsCS4k6CNrgU5KyvOvf6jrIJ4aw6M9/tun+vfUkYCpSRDN2abnKEVkyMSLE8Q
GVCKnUaAn3/meq45ejZhwialiKtOK098bZVAKhVZMOZpbN4wsCkSy+yX0FeeLY47tw86AOGT3gl1
6aDTWXSQRbUoRlGQoDpa+mBT4WhCkSOuLco1lTQHHdAreba6sKblK2xpn7ALoE1SfeC91DcqvaPM
hXlfztWJay+7av1YdpWJwq5a+VSXyHgC/iu700YFAHXoDKRb8iE8RH6xvnD5UxvGesJMmoxH42LL
hDiqCqWSar/TWm2hwG99cdT+WKa5rOj6xQY5FjAUH2fcrYiez6hi7rmbmS0Haj/6h34gJcDgeEAJ
3fqyL9xPDor5l6KqR4VuCC49DCHDr8MWigqVXkYyxAWUbymOXWauIe41tW07zhp4jRglddem3GLN
3b/Kc1q4tyjaqNtJeK8MAutosA5uoD9PEYCrxI1JVDNDo/tg1KIO5eOceM/Uq6sHcFTE2WNjEYOM
iZMLVqzSpIKFW6J6j+pU9XSSgwEDhnoADUYDkm5DkTFxZNTRtvpKJ9gmREmqMxlw1QhaETjnezde
NaS4jKkGNrOYJh21huykwn9S0rPdCbWtZnYhxEZ9VUuaeENFwx82UU/yQzLJW1qJgUAWDy/LYU+K
faWIcqZKuB71Dienav4A38gevPkE8Ok9t0nEFF3vWmuRx+S8HVyAZ6bnPvKKMpwDDC5tbcOZktJT
RsAjoUliHBklRG0j8uZlwu368GU6n0Pustyah6SmXYL2TsVxbR96Ts0ZnBVRBC40w3VTsU7g6CdR
DtAU4htBMqgKOGWOZhLlDNVjP6Dl9YDJpa9gRQenCpnTwag8rkXxdMVBEt9O3BNlv8qKQSFV96Xo
ACCpzxKaqk5EFLHC9tIDx5lX5fwAENZB/yjd5ZSFTgoZhlEGc5Yj6h1gHze7J5EHpaBxxiXiB73k
avNQbim+IGGyrDKcJvOp7USKbWUXAETJq7PA7Jd7J3n4F7xXer2Z9BIB5o/jwHRcqLIYCOGbPhSq
EfRZ8jx1TZwcZlYivphCrCR7klGz4hgZc+OEui+kN5Y0CKzyK7ZHbJXc52cqymc2PdiUprVB3ROZ
XDTlqPURZDLYiRaumhxuiMgoWij0tvN4nUC6JiO1YwRY9I8yYRvYB7UQ/zfJ9ESqPnIckwgw0wqX
Bx4QZvah6kgyJkREMyk5dKzSz7ZfDrlCqCxypQpMcUHPrnAZbsiq+hwiwn3YeaNcEuOlIVaiwRjq
IAq83/7DH3704UOHHTRz+mQGB86S6mEWKbgBAJOpA3w/9R108APeBFQI5USGHrWXkONIWDESAd5y
woSPDjlkGA3PoqLoEsqJEF4a+i355LNVn89anY8U77Bt2z12bl/LDJg/RIaFFcQ6dd5k3Afjhww5
6KsvPk12IFG3UIKqtLhEsgs3R+g6az7hnhr7qOxT9KHTeWKAxIeUfi6jJypA4tirbZLkpbbM+jB0
GNrmZ6YR4JdevInFgftTiwsKS1ZWFk6aEZv2Rd0X39Z9M6eWTm2xSXHvzYu326Z0537FndpTSirG
bOhopLSeB4FR3+yRU9GkV5ZEUHhM1JnJ3IWri+MC2KGW0qmqg9BDfYkmlAv4vJQDatHhKFeJUArA
Eb5JcEP/CT93N3s60e5TSwXGJKO3oAJgvNztKD48mQAexWL8YQ2EUYI+SDHAwDzTINUnkU4UKy5F
hghzx65IASEJDLhfAUxTracGLmvADyfPioNoN/0BkVM9z54JuyCebcapuBljMyYud4KJ5VQZoIZA
iwfEZlBGfxG2an4PVBWMS1JlSJ2irZplyeqCq+PhlJipWRA56CnVVkqDqW2oBIlnwFeYShJsuRrU
8+DMCa1CrbA1xci51SeZTOV7bFNximGF9olgSfP6pQ5Ns0deNeQOciRFF1Xob1CckXyqp0wxNWY2
ZOAXXp0oRwxrCA2WgBQjwNB/9iG9Kq06OoIGCAzVdiW55JpT14smqkoAgU8D50Z+au+ANgIDx0rq
NUMzCV4JfedPOyNYkCiEXqQKgXbowbMOPIDvJMN0V8RdvGHgJHDR2CNH0xMuXOeLoZNNrbMkveHX
klRgJMj2RO9+Vco53SjnPaA+WPOqeVISbGqRJV6UM1QlvtTDwE3SslIK7gleulimiaAvgK48thO5
yU5SrYoj7z0S8aSM4Ee6ews3AkWXcsNPUgLMbQmuCC5Lcu31TtS+mzyT/NSoitKCm/0L4bjACmbI
tlfPZmbV44ukJ7siS9ICXJYsT0g6nCJEWW5RPCHYmpcGko8chcxpwutUr0A7p2AzdDANrmg9d/bL
TAUYPA3ViCI2zKWBh4oqdhWtO1Z1KKyTAeeURMVSPpiaZbHCtnnps0PJbh03EYmYsRBo9CVS2J7y
X88UOdwMAci0I0di0GSzC2A3QZ9g7UQjqnWHwlHbr/Oh+GYkqDfBHZA0oy9JAUYHD+Uvtg/cGSp6
W7ESrR9FAAoFhn9twhCBI2d8/Kxp+L6S5EGfyBzY2USpZyG3CeK9EuXINJjYL/kANTUJdnNlHJhZ
MQREODO6QcwZMBUMaXVelSCnWUvXEOl1LvfCk6K/RtQZQjgeYqd4RwOLdH6W9rHyBQiLg5eCOvLc
QS8LvJtXc03N5Ab/2/Qg+Ik2ZG1N7JlJn6YIp3z7PFjj2kzhClRCz6QdqACKuw6142iwVFnkWwpn
oidHDTPSBJF/iYyi2WBfKSiaUnKQkVNEzug4syqc2WkNNUS4Hr23siO/xXu3phgpPn2e5wJbc2b+
CZuPWBXiwOTXlUjk8X40AvzIQ8MOPZgIsPUrimfPakjbkNJV1AQXCexBgbYBRTGuOgzPmZBYQhnB
ZCcy3otCoCd+hBFgHmXVmSNFpbyV0OffT85+8rG78pHs40/61S9O2aq6uprJb01NdQ2FiXBb69ip
1wfjxu8/5KCvv5wkNan6FYRGSxM1P6sv8wgUHx5/xibOL/vA7DG4piqOOg/QyTQNyoKEZMs8DSgH
1/BV4jwCzLUgI8uZCfArr9xO91AdragsnjQj/tb42rpYu4LCNrGCsli8lHOQqErU02dVUcGqg/Zq
t9tO5V07ForiIfbLhDAer2PeC0anFgqunIwKq0fHl6hE8FAo634YABlOhVYFBUUPEI0qyxRZyINc
6epJzQtUmfmykf5V8myXU2qeITSAokqHwhSl7vx/GewVd10JMMe8i4dAnrxSKiq+DcDjdum3krbN
wQHwvPBkSLA4fcLxeEe+49x9IHZDuLYO/ZqJ0bE4DF+CmvOOzm61Tg/LtNkkGY0WXQOTAJ3jGS01
6DDzVD6x8WLfZNCXuT7G6+QI6kVnAXlMRTSbIWs6xWnNpDYlCEdb5DSJ/hKpUP4mwiI9KRwDLOqD
/B6KIfHoH5gePZ3+oFRqIaX+0F2Bj1Qax3rpTxA8oXzuGvwEPpKOEyjIHTLLT9Mf8tuzoNnMeyRz
aUU3vxAF1MjnAmryRaQlMROY+bBO5JDz6GASTDhYQ4kxgyNH1Bhh0kLkCBoFgNBzKxORENrPHf8s
4zIUwPsClEGkDocgY+KINPx69NwyadDWMFXYpCo4XE1FSSaTgAmb5wL75/sq2l7wGOf5RcbZ466o
NS0b5DFVzpyAeu3drvQcpORCuUe7w0lkOgnV5EfqL58YqP6FBZMNdlE3BHBidqMoad0BD1YKoclq
+TIXM91BRjEazq0i6ANorjvhmzFdXw5M8WpVSJ4RpyHOvbF66dnihqNUWJShZlEBR4VrQ1PqrBbT
v1BK5cRE82dNUnpL+Yr0dmkOWUqVRW1Z8wPYPPA8MfDulUvMjqWKgacgkoTIR9NybhdEoGIPgEaS
7xIyvauKVGvZ8uP5937VKI/jajEaJk1bZiegZ4pbJiZ/YpalhASxFYDhgZqFmEAwnK5xPiWMvNSt
UTrTdlweKG4ZjpZ0rLK0ziIUBQEtuoqNhACxLoSHZ5qTf+nwqccWk4mh2ghFVVS9hkR5XoON2qq1
dDRYdCYwg54Cv3VQRA4+9CPiiVBO+xY1itga1wHBylEGD9TECHIwfwZeJOhZ+mIiccpygVPZKILp
c/orYc9s1jHwax8iwMyBaYSnmtkwjwbL9D/ocO0kdebSYyoorNagSIjXkeGdSm0pdgcwY4MBFK3r
Aa4tJNAi0mC+uRI1RF9lVA2c1qBVQ/LDk0UuS242ysORPoJmVnKIVq7ROmKUrIvW58N8EM4H/CWx
AkjREWDotKiPyaMuzk211ibtnxJSJaiqzlfLomDgVes/UET6oVxR8oFMSn6cRfXmZaIrNjLYln2n
vVQNSXZUr9kTVQGqifIfKmO/3GGnIxxFBTzblifcMrnb/8AjH3n4oUOHHjiDR4AxaRLUEf1jyrqN
2aIHGSTCOpJVVQjKmKQt1/j+JOVhEwqBnjjxkEMOJXYqY5wcgF1SUlLGWyl9/vWfL/InwOecvk1V
VXV1DbFgZsCwEx06EwH+cP8DDv7qy08xjmLN1eIxvebnnBHQeSx4gHnIU6ZXz/qqyrW7HbfvcODe
m8B7+d+7cz6dssSd2rZ3+S792yAqm0cl6ZnitapehsQ52wGgzPWiHW8O8Idc2a+/cQ/9+W5B4SfT
Cj6ZXjR7YZt27du3aVMhXQQldKq6qrqyqmrlytUrli3drEf1HjuV7rlLm603LU7U1zABrq+leuOx
bHZ3WI7ERImNoo+MVIl7Dr3OlBh6Hm4SKUntXLSZADzjVYwTBRdIW5MhXLUEkY7lS7h5SHHxDfUL
p0HMq4i9qNLIHTEvTSEyQyU2UdgP237xyr0QaA6E1gFR6YYAxRXQObfQ9co3JTdSF/F6KiolDFiU
lrCMUncDD/pa0Zjnyw1acERXix2V9bekSXDmTOnzqK/ImVgF0Skg4NZ+5ARfI4Jhw7wsIWKwrJ3B
jOkkL2mC4vVwhbAbpEdcxxTKq1g799JBm9RDBmlFBaA73G3J2gpuEpqu7YD6ymx+XviEu7VIcCRS
AvQAHeQCqYx/A3vGR8w5OK10V5MPp4FeiPhSvqcXCAP0+DAlJf3Inrw4H8/UukmXlifyRU3ZR7KW
VOxkDHTSMy/e4AaBMfZrcTIYB47LogkctQKWy6yYvvmQnBIyXCQcWNETF8o3X1YPKicASkkvrXfC
dS0EmNc+YZdI2iMPDvtdCRBIuDsRPo6cpJVZmTZLH4/SI3pC2lA0Dqw9+tr9oK0XspJkR7FsWDKY
kWdpTqf6TZHcSbkzuIWqAZy/pr8tfTGgWtnqgCcnZAfRQ5ws25qICCf/M+VrDrrS3IgIG92VTg6x
Xi7IE34wQ6yd0KboHBLJgpoCmhY/RQYjGE1ccQGKwbUbPcUQyuRai4ZOuQV3Q/fCT2LnnguFgqhv
hKaL3OpBl0k6ppea/2HSnKkm4db4lZUiJHB8UD6dH567derZ6DbbS7rNxMqDsKFG77KqteT+RN0T
Bj7sB5iW6SJgF9WUeWOA0cFpqSosZhAlJbVPlI6ofyN1RICF3Oi6D9RSxbFBfCnvwaVRpiEdWtFG
9ctCKjXAVY0d7blXha7R0aB0MNVskPUmqb9IbLykzVCj4CZB4llAZ/KMNfBhPQhH1wDx9LUWH9YR
8190qJAuNqlNknv0yUXUCzXhQpsFPSmIouF29ISe1NIK+J5rqLZb9KyIprYEQci8BUMVkKTJl5PU
DPJvkDqBgTghykn7MrAiA3d/YN4vD/9SVGMtMd6aOhIB/q7mQGg+VSMXaKcId5VqOuJAmNPldtDe
AE6yesyoLJ1gSwLay4Cbla6rrIq9UHdRhoMjAiw9qjpEjLu0AWXgwJqJhlqsJ+Yby66n/aB+nQGF
FobKtt4Z8D01UnZayBhat/j32r615whtn2tZ+Qo6LJxMsnLBEa7ESGdaG9BcoUGoFgapxS+Qc21N
ThuodoKOijgwXyp+pt4s5TUjJdk3EUGhKOtunUTrIHCeCl8vGETcW0iPency/FtAXzzRtqjggCFH
PvLIw8OGHTj9c1o4CuNUDIx4+AyQUF5oTA7OdaxX0hfuiEMCL3vPNgLPbrPoRkwS2WRTR4A/LeJ1
rni9K2J2kz6vmj6rMk+5BkOmEeALf7l9ZVUlM2CiwdVVQhFiHTr2fP+DDw/Ynwmw9Ja6XjbUpPZy
Rl4WU0W4+qy96S/mIT8zeqlPxelxA3fqMmzIFqPf+GbiJwtTTp18TE/m4DIcraaKH+x6VM2L1Kpn
yIRs83cqAX7n3f9btDTx9vjEmxOLl1d26LlJz/KyYrrDZ40isomqqqq5s+d2qFg5bL+Kofu279ah
gDkwEbn6OhEt8FWJv9fhZppLTYUslurhgzBeCI5A86Kc2gAUO8cgMsIn65ko8pCyEzutL/PVVM9C
s7MkOCtkFcv8WAy+9ex7MTkwEuLbEXIsSvZcMX7MEYQACvVljK0PVGbEoMlq3CyRKp32ImQU8ds8
7CyAaONFpBOCIRPxQmHF9bXgwCIkWD6XYs45BfBM7dZgch1FLgkvF8aLb2G/ghqPDIsIin1Cr71d
ppgKRVQDIS4R/dchXlFEwn/B8dUB4uFhBBfBH9Nuctg4aCL9q/195h1abaUaPef6MBrSNSA+jXaQ
SKtw45wU5CY0mKZPyOAYKLEsB4ob4VNxzulxGLJArK1NbSIDb7yOaR4W/AATFrLHa9qhV5txA5JR
W4V+Uc1oXfWqbX3tIdPhpa6j0ibTBj9Np1yhsm0CsM4BljgQWelUvou55Fxq0pzKh/k4I1NUxGPj
2EeXgVOMZoFMh4uJUCcMg68EBbk1dRTnZn3/GgjHPT/KhF1Xgik1kVQrZCTbqNIkdaq+C3S7eSdo
SW402DpbxASYyDtpgmwpD0rDHNlQR0fJQpICUARSeZP633y30814pOpM3rWBSUVPixeVF4m6AvsS
Lu6+88LFxsJljwZ5rTMS5lgsgTr07M1zl4eGALhpgXKlZjJ6mPZFqbchQqWSpZ5DJhcvOpZyVmtW
/M4klzYzxVf3NlpZQCA0KUd+MQ9LCH3kpbD6M2lRRFE2tCBFRFq32EhsThiShEx+ZDvtatqrHqeb
vLozGE0KPFwkiXQUzUnyWrhcZbY+OY/J+lCdGnW1HACiQKx7STQxeJrkXaUNj3CSak1D1aA2FNcS
oY2UBkilKueV42a6eIciXVkNiomjXV7oRAaBQXthCOhumf6DLLmmQsV2BFiris6rd2g9mqpC5Sha
BzatWvw20XXY+bJkF4MfslCA96pkgQCzL+XNAzQZA2DIObra4HKDTcHnBSMXvKQRSVc0X299c2Yy
YTElSaswK4y0GiRhm1WgqifzDjkxizMXvadw8EIqyA+EX5GyPFkGfUXrKyiAlCx71pZVDDBvWZ6J
sV9oYx0B5oqX2b9EfenDUdD1NMzDHFhOIRBausitu1ncD9fuXec4MmHuaLIDkOoORBl2zYclTGqH
dkT29BvVJgM+UoViuKValf0am5J75T9S8Zu4e74OnqQCttH+TrMMwuXUfopkCdGKmhjYpjRHb8QV
d0XGyNbE86wDakdq0FVutI+DomhUuJLk2nWIqrkTNej1fDleCOdKTbGzjJbhyESLJ8lcHarAIred
5+TaFF0I4QFl1ivN6xN88MWH0OcLlsorYKk7JyG+RYVDDuIR4GHDDpo+nVdOhtvJDQnTQN1iWhgn
VQ9ZkDaDyMctB+qfMO5MszBPRLxKJsAffTRx6CGHff3VJCLAvNJVcTEN/D7x/KL8B34dAb7k7P40
FErsl5ggUWC8J6Z9x17j3v9QQ6CNdKiOxWiSaKFkM6s+j/hFTIBpsPXTaZUzvqhMIbq7D+z+4cT5
KQe379t2t53bczZ4JJpDoqHHrFtSND5v6jcAN6zOTLtEgF8cNebkU07RVaDfG/vw6+Oq/vdB8TcL
O/TafPMiiaJk/cVaEuogIe61pvftV19v2bPqsP3bDtunQ2Gchn9raaiR2a88kJ+lDo9w3Th/pBbp
Jy2vRTsc3O2MH0EDb1smCbI2Ew1NjJooIhPIwkJ9V5Ape5kQa4aGlSNTX/yzqDcx0m4CAtwrbyah
M+Fq7QQqSUnccJkVSvtCpLhfEYNXXNu6PFQ9RdZKA2buLPKLHHGnFVN3ulfyxPmgUqAVMoDcImlY
mFxDnQBMaeAW2eEkUXaZMazejj2IpvWC+vIQtcAExhv16erEV7QoXikRhorhlZF2dEJLdmErVM3I
Dw0ehnnDmIDSYLGYppU8A8+4efZCdKS5oziFVp1sU1TLiNqS/iqQQFEWCHi2EF9ZPp6XEJBl9HhH
ZlMYPZaxdHgvSoBtNUteqI4NttBdNuokXejqZp+GZjfxsCexX13lUmmwOgfaCaclE49cfTUe0RJZ
SXMztJDuRNJqxB5nFElE22Rw0AowARiTfqmkWC5fIlX4Dy+fwKfiHB3NgTTUj0j7FCwt+yDA9BMA
Qsy0EtSdAvzwPl2EM6Ehvo50+deSoyP70n2gvo4gJk6GRMqpqMAusa/nCqv1nlzLJlzmu7AUQlNh
5MFGmcTHFHFVXemSUd/UGA60vHypUjI76tFg1bNyhftynqTJJIRSy2E1kuyaW/HMKLoHR+YQmjG5
1PrL+bEiPRrdbEHO4L9iccVUGgGW/g+Rdl4mQ6YMib5W9ogHq0qwAmjNGo9yVj2LjDrRixquoZSE
iTmNZry8QpodU+deiZSrAr4D4icaDxtTem5FAjH781I93O0onTJ0pcsYusGE0GgnOKwXCuq1L0Ma
NR1RUb3GXCdooaimkim3KVi+RmwGUIiQxr1JogEpdPZLW7KuSa+5AkgeP9Z60oPivDgTiNScUwjP
Hi1CdLQ8zgrv3Hk6omYUPV9Rx4GKKhwz7aJ1qp7rSzfu8OPeZ5nwKZxXFkASDpw8twrWQkKilFig
IE7hwzN2zUuKpquXohODzlGdqrJGfelBN7SLCtZErEIsUfkrCcFqiICI1hR/Q942Io1KgfAFQupW
CJNCCoMIs6neL9xZEFDZMPItTBW+nCPDip/Ii8qGaiqpKk7Alxc8WjbGUCeYYFV88dkk/tEaLkRL
B4GRE2QIzQRi6psf0/Sp6Fklm2ek6o69AqAB9oihfraJWvWwBcx4hfrW11TX4qf2k0osj5RCQ9JU
D2iHgOQUz46cF/vh8pRxxzVSSUDklAtrbooODFq15DsTWJwd1fbpj81gx3NncuM5ixaRToCl7WpD
dGRMfrvmwy3d2rLXoCHGKgxSsxjyUQfadV44x5TF1KQ/Uv2iAdQeOM1vxJDz7A8CmyWK8mN0OeLG
SBA2xDSAORvusc6ssMaQNumMUoQS2r2jweLWQj/JKtBF8RLmwfzCISLADxMBHnrQ9M8/gU5FqRkQ
0SKwf8IUbOEDdDWoWVQyZpaIARenjIYMhQOL70B6cZNNt/7oo48OGXroN19PoafTQCtRTYp9fuSZ
BU0gwJedN6CqkkaAmf7SP6iC9h17vD9uwv77H/jNVzQHWOgGq0vEP6sJQ/Z86iAKnIMbKZ/EyWVC
cunEScunzliZQndTfu60fYe9du9M49CUicoqJsCIWiWXXp1U10jNEqYT4BdGjTnllFNmyWuQCpat
ir/5Ye2X88rbduxCdrBX59qte9Vv3SvRtUN9ZXUtfaqq69qW1/XZJLHt5rFtN4v13qr913Pqxry1
aPFSGsDk+pWqERM0beQWvQ/e9N5ZzLd1OaOZd2+ye5dfvjtf5gPTimgyMbiIP7xfLLGbRVRxTJVj
NOxM39inRS1kYOuzxzp336Njtz06dOXPHVOkZ0MYg0ZZy9iyJMiVLvnBEf4Iw5KBFeRSzadGnvJB
Pql+pow16lrYMhXTXsmKtdv4P9EREuBS4hySajGxermJIw4kIYxyy7Cd9PpoQAITFeJu7AvKA/FY
oXBSYdLCeNCbP5T9ohhdXVISLymNl5YWlBUXlJXEy0sKy2i/lPpLaKeovLigvISO05HC0pJC4kul
JbS8WwHv03u9mCMJgZSPTRyFW4mpyPAXWAHAnwE8tmKPx0tl4TK6XJkaiKh8MHqJfZ7CShnX2hX0
cRYDXFI92Je33XKumMIRkePccp4p/yhaWSl1UxVRJAJ/yvlTgU9FUUVFcZs2xW3p07akXbvSdm3p
U2LftFPStqKkXZuSijYl5RV6bzknyMlS4oRSieBDQDG35BegoQKZeKOccLB0wJl+ygAsMUxayN6V
2pXdG781h18Hq50koqVLJAt7bUpp9Lf5bFwbOmGAuxhZddpguFBcQMT1W1JWWErgkACU04cwIWQE
FkamiMFpS/iUMET0XYH9EoKLvhkffNqUtKkoaUPYVgDqIvouKaU+QggPxW1w7USlEwHwWpCJC7q2
vFLgGhRWorW5pUJISP+DtFMTkn02Bt4i2NKMtEME+9o6sQOxkU4Q6SyQtSW80XKJBudn8YqIfr14
++44hFk7XBBTAIuF50p7sT4XUTfalPShKgqWAW1l6N9Flw0+buaPFFk2+SPx7fowderhvKuQAD2+
BjHxcg8W6ccjTCNh15aXhJJiLRVt9so/PNLfcKNqOneZXiFqVmtAWoAoN0TxaC6hRNzHyz80HLJP
2UHJ9VWDBrH4Hd7tSNW1EqkcseP4ONHgFukkUXMgrdTutWRE7du1UeO0GhZLpHqQl2QQ7wUfIcHy
YbXs2J35XUpIOfMi+oyArJHCH1HlMiUIt7sPs39hsupDuhypOTN50An9nA0NW1XvAT6EcFr9tgzD
M0JlRVVmP6M6kiKDTYuIyz3SrLlykW0YB5SF4xGkfYq6FvnBl2t+qGCJVcH8FLEm6IRDEJmCiX3g
AxBcVVtLQMsWE0yWVabL2SOxo09X4CR8DiYrqdlA29qmksLPRd4IVe5wkTAvmp2BrmtUN3SZiq64
EAoIZV4Wm+RrUAvizFFxsLyd3gh7CLcBzdT/SP6hc0SWVf4F/kiyECcH06yWCO0Nzi5UrVWPXKgN
EntJ7QkHDCTkUm9HUpGiFvNs+tDUvuhDKoxoc7ne9dsggs81Ee3QANHQDgHX0cEih0tzfJCU9gTw
s+xR+OserP0UlCF0N0jOFC77E12MhDQn6mptPCy2qSUVaQTPg3OakhComvUBZXqKUMQU9mvC4SpZ
O8Ig/66KTdJR7eoccyMFiYpCcrJmL3exXW+UlkI6b3WAUjqHlEzK06xXHv2jnDC6w3jIBddiprpc
Zx1dyvvQx6QUUC5GhCsGfKUDPuqXc2CaCo5JiB9iADlwurSkqJg+GMUlJ5Z3xJWAbYbq5IYA3KVI
6PlBVXGMpKl7Ih5N2piwiKLgvPFzY3hlkNAWGugWn1miNWmEDytRw3mG5vE/qFtZAcGELJ7Ya7fO
/bdrT8HPLnfpQdEH7buJqRMjuMkSCjlJ36zvxc7YNQWfTq9bXtUmVtSmLl5UVVO7ctnsYYPbn/2j
rU4+vOdO25AjXL/frm3POGaTX5+41cnDe5bF51VW19XE2yxcVvzqe0sollf1LizfDseP+UM89uf/
vLIAOqhgyr9O+V1i6GN/378nK082sWIdheUmyECSOSnkWYKyU8/DtDgIZb/otV/u2mnI9Ve99dGK
xR+tXPLRqncuHfHWDAIWbg/DrJOKnfMh8sM8RgKtGXlQ8Rl39Bh0+muLUQmy6a5ZGn6eVCOqTa2B
OYNwuoRRM8vjeuZvKgXIHfN2idXmdCWDVt3sRQjrYUdAnWvNFmRVjCvags5CpmN0hZAHCnyNFxcT
Ey4sIfJWGme6S2SYWXGciBAdLCVeVyLUsaSgmGkweAVoBhg83EjxPeAGmDlRbw/xX2qDYanEbqq1
ZP9H8sO/tV8ByMJvUr8YmCUTD/ikQjPUETUqaOyCfQRklakXF4QKpQyfKBk+RM/4I3wPlLiivIQ/
ROHalrQRdqffxAaZEBZXlBXRh3mdEEVmv5Q494HRU4Ry6ypT0oMhLB2+D5cULiiEhB1/1Kq6CCIj
6jNGxjfFBjsTrBoJUhZpefOL2UyIFlUt7JQBHWNR5uyADzOvI2GgwV7uKaBvqfqysoKyskLuF2Bw
BB/9FAn/LyojflvB36UVJfRdXsGg8Uc6FPhiwqeMAYcUySvRsWS/VpzvRTnBgRevpYQYRVLluyvw
txgd9C0Z7WSGrwIj44PySx1JNE+5Eb4NfkrXDJoXqgo5NKmTVmsOrOAGqUOPFIRQT+sRTxmoTlC1
IDmRRqvpg/9ZV448Wbt1VE84+iVP0LugPOARo39IGTWS9UrpSFGSjygq2jsi7ju8xIieRZ4lKJx4
jtJ+zelUaideOwXrkJKh0VePUxkxk9XodU1BvGBcVJNe6XiXRINo7EldIq5rp/FBXKyEBxKP4gMB
pqNSgWKYOXEs5ieDNMZALPNiIPnDeQBLwT4H2EgG5EOTT3j+iQ6ZuqAYxJJpJsWRwb585Djmj+hc
d+6ulpUCJDAE6+JGHz5OoRPuo0tu8EEvTQ6xgQLHI6IIHbkMa+3K5AJZVxGxPMqj3CivlpcqSCbh
8/USwFJTR3FSFLdCR3iHh+PoWy6wQUUrlLA7qzWuaBclxA4Z+2QOLkUAdNp9gLM0aG2CajNFYrlZ
YBYKWiFLtlpU6URgifUeGuMJJvpcgVSdQhmK1OInCbnVMupaOKeODUaiaJIMp5MLGC3loMIgifsV
JBIiGeCIMw1+4bWdGEzkUJxSVhHWcESYaYVPqQu+nQKI+BOrraWH0sQvhOCqGEM4LXArK9lTSQYJ
16bkvF9G3Ki1NGFtKY5MGKdQjgkdLACaBTcP2Pw8pKIYS6MC1dRvR49RuaLx9Fttt+hOuEXq0/gu
RGQDzBhEZs6nsBEzhhFM/UTZ8q2kN8UU/QLac6D2QToL1FlBeKN1HzjLwYc8PuyMMPBKyweEfmPf
BDBxCHXlT/BZlnXtpYC+Vh2t0iU3iADra4HgUqaCaQdg/vRbHGv8FK3DF2HXPQWiS98ydKxSrbJv
FIiOUvNBPkToYVlcA0ilRUpZXfsDSYKpsw3XgP5GTdKoskRTKiuOaDDrAbEACDrRYB5ZiwebsmWQ
bDh/0HNacFBfGrAtK6UVq0rKeUCopKKstKK8tKyclrCin8W8U15SylfwzF7xrdSnMDw0w+rQW3UQ
sHTBCtuIcKZ/3Fl3JafJqxfxhztGMVeLPFLhKTxHD4MEyts5VJMHALQTm9UqHGnPq9PsSbUq4PsP
7rHzjp0pPyuTNzqyx8Duhw7Z3HBC5WbdkjhwhgvVqFAaBdNm1VbXl9FQY3V9bHVtbO7yktnzF1eU
VA/eqdMxB3Y7ekjnI/brsvsObYsLqz6c9O30ufHFlcWJ4oqq+tJpM1fpY6CORX/u8PN7/hL/3ynP
zmTZXTD2ht8njnnkimE9hPdyMZnfsvEgz4k+bM7JuvAO+xOwJRwZwdfP+9+1Jz4z7Mmpn563k5K4
ggE/W33e9mBV1oEN95p1s6dDxRFE41GdL3Wu2CsRFCruMWeWC1WL0vJA99AQo3YKEolVivFEsXzo
7cZc+UhvaDpQtCJ3wAnyD4HX9YcQWUT+gqwKRmdZYojzINIVQ39EToiilMaJ6JYyC6JPHNRXRjV5
7FdGU3nAUCOHRTSx7JYoFF1jBvk025ikItR7Bp5OI8mOAg/LKJUAGsKcUEij+7YwZkcU0TadETVi
LDdLwCdTLwnSwDgwUTJmrfiUllKMBH/4J7G1smL6lIG/kXbQwWHZYXbHPFDJM90rA5v0TV1oOvbL
KCFsWLrNjJ+7sS0OamFzylWtPQEu75EboNLilHSkqqF6oUWT2p7HW3ANgHcMGCIBN0rrROL/IyJn
Q/roLJCeEeWuNMRNHSJlhUVlhQWlhfFSih8ojJUWxUoLY7wjn7KiGJ2la4gYsxol6kt3MTKEtnSd
sKS5GdfweIQ3QvOjNfGO2iITHA0bNXcNhbCmxxeZxwIHC0NK4Njwn5XomrGUZxnN8y2oiZBKo3O+
rVfCq55I2qUBS+ZhUqGFtVhu33+psgqq2hOB35SOSIvHwZVdKxsXZ9GJOui+9gEpG9YugKgxIF+w
9rwggPgdNrUBy7a5j3rqRiR8kiZLviF0FpRASBcCznkKgES2Y01Xm+ynP724d3n/J6aFy4RARMXj
A9ogK8TKLEE+KxGzWERNHu14dUTRoZkt1oVHBVk9gmBziCnrQV6uT3W1tSJwbwvUZOKBbEj+lcDo
ZEUJ16QZSRLPr5MVpbC6fg9n1coii/poOrTkjxSHV7utruYPxTpJUjwHkmfIS/F5ooQWXxfIxcQB
mSwrFzBvtgV1BQqZUovlBvQjz9IPPU5XFbJpGlxMnd4C5qZsWWcoyJzMKvpwJmuRVf5IFaA6rE6t
+MyWk1f3jcDhp/MtyIZEtyIONloBHvUIs5XU/FRWXXOW1mQKQro/dFQEE0ykFoyu8xpLsq+TU1J6
GTBCkvKhg0L7BVIs4iBQK8KoAlqyiYN1BQRUnEEdSa/Diuqa9rmK66tpkadqXfZJWK6M1mAFDymL
vBBBHiq3s2wgMBhCwkyYT/GiCRAAoeJG+LGgoHTKyPRjJEU9KXIcpXBNOwJfHq1et8w7YudQwkX5
uIzpCEnWwR1xNrxN7Y47El1mt4gnb/+j2kU3h1NfoqdE12FgX9Wa3x3qsRSnWz1psU5M7b1MlqTU
X+jhdJuTO3EqIrfZ+WLqt6nrp/zcjS8om7LMusRTnpLEtXPnb6M6CxIqRWbx0m4CIbd4561WD0ih
OgR2Jc6pt4B9gKdmER0VYoUxMCTujXVdi11GZ7Xe4MsEHs2PlEEbJA1nQUdx8Nt65OVKS8DJVLTj
uTTisUmK4PhoZiBmIGhol+oKiQsk7VHapDRJyrqxZfXtMKyhB7Evz8FdbpNHiKeH8VUZ2qVYReK2
5eWlbcrLytuUV7Qpb9O2vE2bsrZtytu2raB9IsPlZfQhR66EhnbkVcPcOSmtAGVAMXQXY4NSs3yC
VpDCRvs3/HXITVcddOs1h9x27bDbrz8s5ay7jFmZjHsx6bUYN3GheUCYJ+VpOKe+95jdbFmrVYN5
7ErztFEzmkk4jYTJwftustvO3U494yKeaSwb7Q/evdfhh2ytcOOPbEm6T6vKdJ8jwakX+foyVjDr
69rV9cWJwmJaf6k6UbCwqtPoDxaPn7Kwoiw+ZPeuPz6sZ9/NS76dt/TZN7558MVvp85ru7ymNFFY
UllX9MU3leLRQwpBNElot/316PPj/+/UO6csfu33Fzx99K1XD+3O/ieLyMKXzujdruOW7Tpu3rbD
r1/8jjytWO3s/53WZcvbx/zvl5v02XSzvptuvt1dU9DXO+3pU16O/eWXh/WUqGAjobwjjWXBqxe3
77RTh84DOnbZ6YxXvxea8P1rvxjQ7a53Xv35gG7dB3TtvkuXuz7nTE15qFO3k34biz190rAOXXa7
bZKgNunhDl1379Bl9/b0uXM6KmLyXXu1O+Ox287ct33X/U97lYaLheqCgmi3J+YWS7kxgs3D1zqH
DVYTZADNQiQQoRLSaO0AKARdKVMgqReAp0RaH7/0EMmKcyLKFGaAgGEa/aPRYBmjKyks4vFeZsLM
W+SbPjKDVGaN2mibjrvChIlygdig1kxR8A6/wlmP82FE44LbimEEBYDa0jbmNJrHflWVGQdQeoxH
q7VyidhYGbd5mfRoHJgpWZmwMvkQ9ZXoXB7FLeZpDDjF14ASc38Y4qWF9xI3Jg7MBI9ZNEeGC0sk
fojgcFIuEvmsE4yjgURImRYbxQU30fz7rEkbLzwJRdKNV7iWCQrsPtBIUKo6YoCQGwgMhi80GkCV
JESGHoDYeET5SnB7vIirXjpHSgoLid8Wy4fobklBrCQeK6VvfIpo7JhC6vlD+6XFIMYlZcWkOJX9
SuRz1G+CAXGVemfDTOd4CkVkWgXe6ZWI2IuQS/OHJlYFDEcEaPsIq00z9gudAmuW5Iq7OmLJVG4q
1ZZqNE3nQ++b6VWnHdUrDdv9N9uv4oqoIV8kVLJVKuhO7Xd1Em871kOEzm25LPXiiCq7LIhZ5aoX
Xx8DgMY8jXYqBeVVaoSqee6+u5iJhzj68NrB7qqEPvFOFe3Q3BawKZ7kYmf5IJ2tquKL5YNTIF21
NVW0NqzeJTTAqJQRAOd/R9UdVSp3/EHaMbtVQsKgFtWImEVjT4JHd5lGMkFFSZl12NOFCtbSUpT6
0Wwj894Hx3kqI76pLDVEJvknLqukT01VVU1lFX3zESWZCqBOj5dlgZgwM5i1tZQlTsTRUawbxKvK
4YPBXtRgAp0FzJ30+nrJQMS0dYKlLkrEZAlrs1PNWvVpMVEvKHuNViIzOu0CEHy40qXi+BqHWPTE
ejpVqZhQKRgZnueJpeCtFwM+pdaLHx8eWQ2LDLcj1FZkPATsnfOv/Q7SocAv1FEyzAtL8oLDLDPE
IV2vCi7A8kupn2qAL/0vAr6AENUpatZVnyu4YiUw8jUCiCGGR1svDwbqTQ9zFxKLKPcf6cxY7oOQ
p2ilIEEulywo6NaOcr1F/E7dqCDSWyT9OPKyQRlMBggYltdRa3GLEafAPgRiCiIDgdPwLrSfIt3G
wGgo4zU+b8ReHRHYLHgDusH+iXvKis/6JhFB5rixKm1RXnD5oHqd6VRnw06JjtWVLn2S6x5rT/eN
L3wMx2g93e4iehB8gO5FicnD1bzDueVvzhji0Z1pMH1uZj3yTCxv5qk4lyWyUM4Z2LB3nD2UmhXf
w/oS4DViOEl9YqON4lvahZHLhC6ytI86GFQxEhwkU6VQk1Jxrso8EVAPUrMiykl5smYlki5YerX3
qYKWQfBQHPXM9Ly0C+M27h707CsRt/Pq7zOHlZEwpV7wsZU5Gw828iZmTz1BSZOhEHGlELxSGtep
KGtDpJfobruKdm0r2rVr054/bWmnXdu27dq2IRpMrJg+RINLy2kSbTENidmIDoqus3cYKJ1TIHUn
7Z7eIYSN9qWzEi/X5S3lrLtMFmayOGcJTVUvmukGzXDGIJYXy8njNBh2stVqbLIhQupAHCRvkfPo
tJqfQ1WJqv0cdtBf6kDAXOkR++toFzz19K3g6+9qVtcW1RcV0YpX9KH1rL5b1v6rhQVLl68idrFJ
t4rZcxc9PGrm/S8tWlLfqzZWyNcUFS1bHfvks+XwdJMcVPrVf+ijP4hdefDhJzwT+/tF+/XUxy4c
8/O9T6i/77MFX36/4Os3/vLCidvfPZHNEndu/vEnTxw7dvqsmdNevDL+58MemEzysGDBB4nYMX27
GgVJcpQXvHLx1j+MPz1j8sqlk5e/ddnTJw25cwrEMhb7/VmPnPy/RQs+WfT6pbHfn3jHlFis/0+W
fP/432OxYx57Zen3E87dMR4n9nvADVe9MX7Z9+OXfXbzsb87+WevfK/QPHPTuFOeW77orQeHdkaC
cMARFWbwCemV/jC8yU96vq37x1UgOnsQtsckGOs1aT3YaI1YOMTd6Sxu9CjpNF3paElw7KtGNbMk
ldBHxgCF/dK+zKiU4V9pADAB3FNgo0+g7zLijV4gb0OLFrUmtNepO+V/FrhtA18eueVIcxgkdfct
4hq6TBz/yMv3uISmwZGhOtNSYqGZ23PXF3+E7grj5Z8yfitTIGS2MxUZR2RYWAaHQXeFLcu3RAjr
SDKpBoxz6ngpHiSj6xgqF5PJH5hdsatiVn1ew34BShSZbOVnrumh3zDV54BIKPU1xcf6T1SkiBFY
gXT5c5vlBSC0s0IVLrQY6wpklUVCO97ixHJp8bpi+vDEeXBlhCrwXANWgzLpgD9FsXhRjKaYEwcm
gUHPgkAK5cUaDaG/Hl0TY2ISY5QU7R7ijS3d0/LUDZKI2CGmDPKj1IWBdKgogu8q8QX95eYDLa7e
llc1RkctCfWX0H+hT1arHnFv9bciKq5W06g5rL/rB0qXXrXhrn/ETL2fMS2xOWDqMIpLlZKgPQ0T
FDHGJWNZwhxkxE+c+Ii4uoPi1qsvrkQRhNbYrCzlkIkW0kHmQpX0XVNZWbO6sqZydfXq1bzD+96H
KCKYpLFE42/C8WwEWPvD4QDAaEkl6qQjL8AVzYEX9lNvQTwLligMDnPEKQ2yMv903EafHpVFyTnT
QvrU1MgFnE8uDi1goTvKbOkaOUIXa9GojKukpKuZAPNdfLsxTKZb4DAaNGtkxo3EokbA2dzF0StV
MXjO45MYTzYCxvRMMowK1QFnWZNPl0qyQU6MmsoYNRisXK+9EszHtBfAjnBFy7IdRJgFDfrIjdaL
YRSRCiuVS1UvGZDxfBuuhNlidWcMWBujOH6uvcPewhOWihNjh6Br4cAY7wUN1sWEZYQWxA+gYRC1
VgW4jndsP+rfQd8BFaSKxvm5aAKC1Fc1VV919KmiqqS3NlLtswCg44OLzy+NdJ0UOjivgHMHNN5V
riEMUGsYtpWCcE8Nsq00Hh1P0vcEISHzresIYskoGo6WQWktCwactQvAFpRCOAOC7TVKHCvkI45D
aDB20JTkCOBVPsxtTH0KbURyxKe+uq9WBaZHpzmgZcK6uL5eZ7R1NhM6qcUYysCcmHT9D7sP3asE
13iOXRbpe9GldrtaV9hY+xhLYuXodRfKmJjQo4zfPM1a511zVuVdCf4kFMu/hmLK46ILMu0n50qz
l/uWRp5NKnZGLNbpQcVHXTjrtY2MtwqMio3aMVSueJnyxzFenUHmcWCs9SgRjupboma1nwVumEHK
tc8/RNjs4x4NfyHqoTar6ptiZCnZ2npOqTkUQqfF3kP54V/kP2CBBDmvVEB7SOAa4T7tyI2Ygow/
qzPDjRADAnalWDsQAskkVvYgV6yshAKey4jcEtGlD/Heju3bdujQTj6006Z9e2LCTIbbVFRUlMtL
fdld5mU2xHOTdXYxZcyNO6CRytgXPZN74WSjfazxhxd0cK9k8ll3mSDJKyLzxEyK0GYaInxE/EZE
I/LUPFqrCHP0hKHIykQ6+ITFiUCbdeUdERsJteXOfwLitbdmT/h44U03/AFsnDbaf3/8nBfHzDLv
2MYSYX5UkUGdmeMYHdTeQpy1LdrnVZjqqe+2oKC+qDBRVFhWXnDiId2P2LdX9y7tcXVpRZuitl3r
SjvSBfrhBZrVOlr1mVAwc+t6yIW/4Sf85ZFzd4T3Go9NfuHEp4c/+tcDukpAUb8j7z8q9pfXP1IC
PPye3+3TiQ3DtnteHo9d8w6x1gVfPhuLDerVTaVQ+wmYoRUUfP74sS//8OnfHdZLanrAEU8dE/vt
W9Ok9cViR99xzSFd+ZE7DvpbLPa7N6eZnWakZM2pRaNv+Efsb4+cu5MUr/s+l/4tNvKhafMUoAsu
G9oFWDq2Cpl3G6wJVYYYfhfKoDPV3Mwm6aN1o/U8EIyLtd9HfXqpU/gVMocI2gVyLO+5IR1BjBYh
B3xE+l1I+OgjPJBnw9NoMC8STBIpVJknoOt6G2y4hExbP5xZOw3vxU9rpOqYQz2wvcPaI7IvhkZ7
mMQaYoKlWEMxjLCUkZE0e2naJzKBUFhqWXX9Hh3+ldFsYmXUlmh8sogZmqO+pBk4TJfjQ4gJc5Gl
wNwfQKOahAipDYkbEa7LTJgin3lMGKPEdERIssQMO0ats17ZcEoktnQkW2ekK5QUGDodql1+iPoF
dk6lqZTooiluSqSji9hRJSoOCCbWiHTwJpSAFQEkTFLmzhZ7MnsbEpkGGsyqhGdX8EJyXNGYPmCk
198R9ssf7DBiNDJsCOsIPIJVQK2lNtHx5DpUTVYcKU3jw8aKdRafajWbvyryJuKC5a9lR0a2TYbM
9ii06AqKNmdeNV9RVwvSUsqrjN3NiMVUahnZkLR8kyg/vKNQOVpwJ73agNSQ62G/wagXCdHwPUFf
8CFAXiIKgpceC4NG/8q715gGIyAZRMUbHPMGgYUtC/vVwVKNlQUT5oFBdyPustecYGgXvJpJBX8z
r8AImyN4GIbVIS+lLvpqOHTggDWJCDtbwD9NjJUD8xEMbYlDL4XVeDZpSt5gF3NgibIW1oTiMx/W
6F/lhFYWHo6OuglkeNaorA59Y8SYoFAmj5Ji1JdHtgVeDKfzKvJAPmmxXMwCxdRcCSHWj4usxsLy
PDVUXjODyV/yOgG8coaHdjX0WtfaVR6IFOQWpWGYsivvH8BQIRgXky2FRWKYNS5deZcMNWs4t6IB
qgYY+ZRwaWHOGkrNF4jvgzVajEqJ2ZBp22zmUDeoX+vOi+Z7o8blCjVjNhNYZjbJ5Gohw9E0YIyT
C9QIvEcsva7Yj3X7MX7O3zH+lqFayrZwSxFpKoIMg3OHAo3kY/RegwJo/EC4qBYf0ezs6EFWI19K
hRBCC2clCunCSCw6JlAEi3tH2DPXlxZNo5olqzLsr5nnOrJ78Z4CCIlEekXR77x2akofIuVTVQHq
RdwOrQI0NISb+SrX7cOaSG+Fu8b2zWr5etUUnmhDMXbgHNJPyf2hSbyROy6VGWvHcUQCZYwI7oF7
oQNbUo+aej6B27X0bekEmGF5jvgfspCCUCXptpbVSLFEoEz40sXTsDhi9MEVWLtNLlN+lfSUBihx
Mh1t8OIGL0jOoZ/b9WLfz78NwruxAauQqN8iqU9B3KKEdouoIyUVmNZH4GpEBy2FDMuqTla/WpXS
9yGVl5QxeGQig8pbpe2aPdUd51aIJIlow+swFxQpuHRs3/Mj5GK9SaUaVFy95ig59RugMuUsupfs
D9inNkd0MsITwXo6mFXLa8EWz1/aZdLMTh9Oqnh7fNH/xsZGv1X7/GuVz4xe+fTLK0a+tOKpUctH
vrT82TErX3h19UtvVL3ybv3UmbzCMy82yQxTmorrcRAKIIyN6RJmI7GfaRsUBeiOhpckn7Vpy7IY
DUekygK9mH8nI3CYw4i5eGV00EIveZJdNBAl9FhnayIGk6iKrguoCide8Nb78z+evPiG637n+Dl2
6Mj4jxeMeeNb9Y6RZZD5CGD1rFWtqbZz/rmaKFcD2CnYctPismJWxWXlhf22KL3kR5ses1+37h0L
P5767a0Pv7toycrNurc7YGCXfQa0I+6PD13ctiI+YPt2TvmqDlYyvui1m/7J9fv7H982WZnjvDkf
JWKjfjSgT7eeW/fYZKueA097jroZZASYrty5axeZg1Sf6LzV4agMUAopm2NoEqVbEJs/f2ws9t9j
9i9rs0N52/5tOhxw3NNsC/DapNigbj2ZLRBn6Lzt0Vq15pFhGc6Fnz9DzPjH7Trv1r4Lf/b+nYFJ
f4/Zqrt1cRtLgR2xo8JSQWMlbAkyg5fe4RoxVTyOIxRYPTqd5m0xodw+mdVgji5Wx+GeFea6QvOE
8UpUMKb1utWShfthvFfnBsvyRXSXXC+rxulLg9SImQNuXr82OnQm2IYWA+PnbAQMjBoQGVsWIwTj
ZxQJagVGU22i6Qv9aWeTzZ6nFjH8S4ReVrfjbxn4lThnjPfyKLeMANuH7R9H9hKL0w8xukJaJYy6
BIj9ytzg0mi2sIRG0yoCun6ALPskq23J3FfulOIhUCqTjYJihjCMtpbLzz7cBRBikVLraJMVUNWR
ggo0BWOHjTuKx+hpSUkGQ2ciREIPRDLBztDXrrxX1pQSq6/sN4n6ptNgNwLsaLCQYRoHJmx58WcO
FJcBdtGhbIXgSZij4I3UKv+XbPncFIoIxXellkas0fXM3bFsnvpDkCwVJDVFsE7au6q2TX8q2FEP
hFPyXtW4nh4+qXEU8kjXc2F0XuU2WSr9NuH2QVoj5pqUO2lGXkvCZRHHTs6uNUazwZGhEjiNYmgM
JIaCEVOKaEyd1miTSzF7U3myhp46hiwhmvpyV2F0eMscwuzxxgL5yDinxvfSCJuNbsl7cfBQoy4y
UIb5rtB8yiUiBcpCABuP5Xzkh+xgQqMGO1hHIMd52gYS7Qa+sCqVGwsFwxeqJsPj4IcYOrP1RpRn
YgKwjcWhROgXkLF0DXKWATpi1AhkZaAwJCjcVUbehJHIyiVaWMVNLtBAX8yeBbPSsTu+2pkFzMp2
r+7j9LRcNjhsE4nxZrtIAwiIUAWciL60xs30jtJxMgCIhOui0wRvNlL54bBqJqJuarTIhlhdnf5q
5FcdCNNxrHucohO5jlScRxrh90EhwHTriCWWleGCSJCUyo0ES0O8pV9AZ+DaTGCtWUgpXlCPd9e5
8PIoyFwqsVZqWaPc2a+IpnCL9MriZCqSzu+0kqqOlVauG5wpiDPbesiCiKs1Hx2qxTgtz2GWNyjS
pl0eaF8qStriwL9FutB1bi4CngLJEb/Cu9LEiftFGVtHa5FXoO2MiXqEuha36mQti96AP6JPpWvQ
01Hq7Kt1hk3H0vdiCtUgiIuNX2rdk3bEcpjx4HttNqByGG8CoT+ZEL38GBjEBCU2yrqOnlFZWVmb
3QBOFotoSuCYuAb8LDZheJMcJkZK5vWDl3l4H00VNDn7x/i1vhhBUcjwJ3c62e9bL88gPk47p4Wu
oBNBd8BsWTe4bziHqGXpbtC+iVRY0CuR/JGXBWD6KGbz6csP9DIZKXFCJVlR/wRummN9yID4GMiG
5FAyCbItGcM6xkjPdYt4RB2xvhaj6xa10VnxErqmDxKtp+1BIrqVlEvPkfqFOlnA+Rrim2BIGa3P
6l/ellC4fGUxLYCc/2f+9/VEm4UakOusLABrU2HCrSAn03dlSSDa/BHgy//0zqV/fPviP7x50e/f
+M3vXk8560aAZW1nfhmKjPfKwkP0oYBteltNMVFffZkI1p3FArQ0G1FcbhuIkjmJvKAvBrr0NRna
K/Heh4smT1123dVXuLxddOnf3D4d/3jSojfenSvvu3WdCrojyzKpZwdd6EbmVUeKIyKn4JUovSvY
ZksiwLWd2yYG71B+ysGdDh7YvrRg9dufzv2/1+Y/N7H62bdmLFu5eufebQ4a2G6LnoWFZTzPkJRz
SWHt1puXOY9X1KkYw3hswWs3nPDMwU9Ofvm/x8RG3PD2fDMisdiI/82ePvvbGd98NeOrWdNnzfj8
1G3Z/InTY/3PxjPj3bYm9jri7WmQIB2+kVKiB+P6D6fWVn1Wu/qz6lVTKldOWX1eP+qcgO9lpkC9
L88Xj9jIsY+PWb5oAj4rFk9Y8eA+3SOmYi6b+R/w0GwwV00WWSusSGr+myztxj+NH6tpk24GQR9v
wdApzXEKbKYmHC8u4Oh5DFeWlBaUlxeWl0r8AP3koV2e7isRBiR33DmGmZ+yLrQNY7IU4gU2WNtJ
KYU2bDCKJMeef6ATywKYk/pFNY7a+lxhY5gTsbaQBu769oz9gv6CA8s+vmxTaylXuH44s2yavrwU
B/1Ywn4l/pmZMC/77tivvogKk1rBgbEvPQfxMp7gSq+HIpkmDszrBPBaebL6MS+aRa8L4qXz+IjM
GZb3j8kcY2nJxAORvq0ogD5j6Ejoeq9EBqnqMLgSzrGwPfWnfFIHeiQf7GiHofYXosHoqzkgz84z
k2xIVBjlxQ3/5sV+/ZFh8OFi/vDgOQ+2y+RqRoA7HYCAmiL4Bah0GQcQDBwWjlsa84MzJoXyFiU2
3xhOMt2P7nh1o/BX07VHOMEVeon+hiRmGVUHBDpV7HCb1JPHUCGolJLeoQKptZteLvcUnwE7pzHS
uh6XlQfbI5176bcIkRPP34bORoeJrYmIHlmJh4fTzINpbn1JR2XtLDvNuj6QUB1v4NGGvZxKRJeg
UCxdr1gGAEEVEA7qHHTHUP2eDdWWKt2ocimBMl749q5TWR19UDxjxrLDdyTFeerkkIilK8HQoVFv
kDIyZFYWqGCQTK/XAANuygAjHqgU1HEvYfOup1MCcpL6PSOuItRO1xszepzEZzzMwFDUOBrmtlqS
0D6Miyodimy3WnD0JnldsKg6JWZSXiw6rXxM6i7iXknZE94lQbXIv3RKuA5fqCwRSqgrmQqK8RVt
gahvaSN6VImUtCh4cmgH1nNtfWJwOTyJV5uqWQeYAAHdIDgP5uyQB/C8KSWWF9NaB5BQeq5rdKe7
oG6tDfhKnEebGqp+oXOXRYFA0XAxXAefjfagLuFDwZHEvkKIfPIPNwvGCbuOOdvF6oVpV4IVFk4a
Ss3Li+jALwTInhtVk5kbW5BR1a36S6ZpXc+dr6ldWKgoJa1eKbwpUdXGzvgpVTDyo7TE2Glm4icM
R8dg8fa3hsln6mVunqG+OU9jwEB92Wxh0SB7U6A5CDIQZi+E4xC5aJEUnw9raogry/vjvWUudTdn
Ijae4QY21q+dDBWUXms6nO66FTAiwgM2RjK10rUThAXAerldZwYGPNDPjt4KWcoY7p/s4FuXR7Wl
bWSun3km+orBNCItvSegtcJy/d4WdKyoWGJ+OI5oh4sOHeEC8XalI0adAiXtOjTNi9SyR2QLqWqU
BPfgYHBCDb+4TMKlRZ9AsehEQyXY8lIJSZaXTaaVXGKxxY3Z6HrzosUBl8FVHwSsyewmLND1jlhe
e9Xl6R+fHjsCXESjn1zRvBQRM155t6jUEVMDWoQVa9Y66itvbyE3W97hwoNSTIY5KtONPLGrqfMQ
x01c8tn0FVf/7VL36EuvuJpWw6Jvd4TOTpq67J0PFjiaKCpae/y0Q8E53tGET6FdjhaK6XRsr6B/
35KyglXFidWd2sfati38+KsVoyZ8/9g73784uf6rym5PvPv98x8snPTNylW19e3axgp4yKiwvraq
LF7Vr3eFujumnfnRC8aOOPnVYx69+NBeXQ+9+JL402df9soCemLPXrvEY1e9NQX2C72xunKoWDia
eix2w4x7vMd+l/w1HvvtXS/Nl/5Nf550z+6DY7FLXp+KSE9dX9vi3SkRsc1CG9RAyXRdSz0e79rv
mNjIh6fOd+NVziWAoXQjuTKMK0dAdNW+STCz0F0szigv45Cz9Xh1g6VhngXbMolzRoRzLEHBqjLA
GKP4eH6NjbzJpg1/6G2u/JYafoENL+dL039pESNZ2QhLHPE8T92hZX5pvV9a/Qgzgd1AMUdNY1Kr
8/ydCw6fXLkvKB04qSytBNUgHWXY0S5VGRq1vjfX82WEQdLA8xrajCBrr5v226mhEsWHF53JqC9i
oTEHGN+yTLRw1Ij30oxWIXLxeAnvxDkyg0gdvTSZXhhFawm0Kee142k0WN4ARPv8/iRhxSU8SsxD
wcy0seCWDP9CNasZ1lITRIjqSipkQwWOiC664VJoWMTXWMA5MaUTIqssnRwdrTyNV0SDCnNElHBj
6afg56SwZ3+wF/suEBrDv34stOzLZA7iwDp3GpOrZbq1vRXJHBdW9jp5Q4IXnDQl4QJ3Cs6m/jf+
LwAq8xUDKUBHFosPGCuOCK1PSp1H7tBVqVO+2VCleDKK8XS+LyLP3LuA7mJc6PizMQPXd6F8XAqq
XRjKExzzVQx82u4IRhL7Ve0E/RN1boq28DrwPIXinG7RT3ICocjykUhaoxOkcEGv2a3n4vGjpXyg
WGpC5Fnq4WuRUCzrPJB6idCK4JFiG/tV0iJhMUpnNCfIp30cMwD7xSAk2Jpm3g0VumLzzYo1exI2
PU1ESqpKe6AUMgFCx9Jt5NT6D8AEAbjDPKpGFS6TYYeRjrWZyUVLBXLafQUMtSXrGJvJnHV5qJ1B
rQnr1lxoNUmzEpXKjcGTaPxynVBRQwPJFiHAl1JHLZwvVtbRolkExTWR1bqOql1UtSxYguVqrO1G
zQi36hiGjqVorClyqy6iuHjaS6o804Dz/BGpC/B7AVVbAz/BmKf2rUDixZ3QUXoMz0rYOQQJWAAa
LIygoYZ48Z5MoAFDk5FGiLe5rcgqev2k7HAoEa8Cp5YOsH6GS6ty4JwY7biM2rk1t0hhuDf0aMNT
aUAngBXTa/8QNtWlIky2QKirvxQTLG0+pfdPHQAUNJIvdRikJZlih6p2Fl771n3Koa8cx8vzkofs
cBlzHKY5MKjGPcSdkBPpH3tTOtWKpCBeCHwDWQlFp0HxcWG/2mmOHV0xBN3oOiSGoWG70ueceFuk
++jQmTJtfVN94w5inCD7pxEsO38+3lxXurfLegkCLrzLHavMSF1oVbr3JkrTkJfxQGehz1wEhmfn
aTeI18MAyw/+i/f4SAiv/JaPjYWAEkMAdHwYNJieiPdWOO4HD5YO2gCvBkWq6KVEAVCu9KWP6obY
IqASXCAf9QSdwFtzcIDoQqooJ1g3T2BUR9pC7sVo8jlTLxrzrL40XS8v48QYNeNGemtVYza6HoO9
xfpSFZ1qiygJShGTb2WdKnb1TU+6OOisO3TlZSOuoc9eu3fhISceLiH/2ub3RlHNxH55SVoeZ5Kx
pQq8rxTL07qXbvJ7N+UdTlieliY5SsghIfDZ9FV//8vFLh9X/O66XXbqcvB+mw7cqQvtu+N0DfFk
MZliaNFdaYMZCJMEFOLZ6doErKZh3GFdPKcq/tbYJ6+5a/HH8zoW9upVUF7GpwtL44Ul8rZe6lum
jvTVNCggtorGvyvqaYmJb74c2H35b8/eonsX8sHrOOifw4/p9PevnXX0SbEbpt2376Yc4lv46R27
Dh4x7KlpNw7tNu2WLsf8NjHilW9P60cd3nPfOOf/JX53075d5r914b5n7Tzyk1O35QcWL3r7gr3P
3v3lyefsTCh/flfXYy9NHPbcNzcdvonwyk8eKH5tcM2F231y47a7XhK7fsLUCwdQDhe89OO/Ja6/
YVj3+S/95MCjBz2x8ux+Eqq0YPRph/xw0GPLft03Fv/8ts4/GvG3R5eftS0BMO+Vy/ucOObYJ8b8
+5DOVN5Pb9/t9f0/OLd//ad37Ln3uH/MvH9wt3paCQ2GVFZsRBwZ9zSjv5lfHYigLfolcU/y7hEe
tSOg6Jv5vNhdWRhOZ59TBcibjXiCZYKGamnatY4h86wJDtvm8HruVYoVENEtipM4U6nFJ3WuWoF5
NzJMhA8RcA57o3lHHPolK4Um6Dt6VQYt1so5j9EgCGLenMcQ2Vqzt9oFr4Hc4l6Ik8HdAO4FZnaR
FNn5kJFkob/BRhpSBhmE1Ml6Ffr2I5o5YO/+1cFYmV0gE+VJJyBYBUoEsxC4/4C/MbIebcitVAd6
WGrotY+yyja/tUKCPKvrK2nJH171p46nO1bWraZ9njkWvd+FAu0wzISAN64C7ylwWNk/sfe/CUDq
r2D0AgHxunFT1fvR95Ts0ajrDB9U1vpmrS0dbBwrAmWByczE4enFv7zYNUeYkB6RDhGCQlmudh9F
Lpj5fh5DtpEHkRsRP1n8rr4mRgispnVxamUlpDpaFojA0ZevVPE8PReL64YTHYexLh9DRsRSkFDJ
lTIzTCLL0hkkYzgy/MWtCWGcLJgSRAhIfVYAXxiepky/cWstYgwTbrBWjj+upYNvmpZXKZBdDc4U
VxmdVLJ5rIY72SSRJC7qSZ0UE9663orbRTfDxTTHX48bXREZ46ehXPCQI1aG9BylSXKLo+c75kWH
MKSHb49WeSTHRpIAYEQ4WdNxjeDmKDeSLf5Ci0ZTluQNIss3+rVdMWQ6lkwrYN+FTok2ZU3KI5Y2
FZOSAtmjVJlFC/LIvYmHrhMNJFgKJNbIun21+djIIIJIWcchMpw1gRk9JVMKKoSGQ7IhV2iAPEUK
TEB+mShIibFhXS/7rz0LWnLAZgzTGj2XRkNbld6jjkSSdQU+jk9j14c1Hj1EQrJpaitbHLM0Uv1S
FrEIHv6Khtr3JPXiCiv9EayxrJlI7dNijkoy6by1BmmnwhhhvCj7MoLOhecW60SP3oIAmGRiDxa+
4hatcfu6ppfIiTRYFnTdxU80clWKWjrXjCKdiycqo4Ve0Ktci0Ua2qeDUWjxRXXgRYup/o8WwOWL
ux8xa5T9RbKwMr+Xl+DmlVEphJ6WRqO50yy60lyhZTTkDoWSJJEJ1Vymv6SdqU5jH4JVnHgV3BbI
couHgI4PrlqZqicoibbkOuGTPNPFehMlIEiEVhqCQmswRopBdQdEV1stmpZIsVQnnxEvR9q+Tm7n
idm8BJ0sXcYTIvAWMboKkwugqPm/NQp5VKRxUlWYVB8LnJ6Avci9aWpqRzAOwT4ZzIoEL2gfn8S3
83FpK+j9E8BtVw0WLJDoRtSXadYGcuKdTm9b+d+bYvgbcWNLX+pMbfYHqcJTUYcWYoEUAUSjhgLX
30JMaB86FK1dNjkgmgbVgTrQakmtMlSrfPOpyI80UTNGEz3DZQyHtM2Y/ZY2ZtnRtRldHvmMKVhr
0pGql7O2qfykiYPgAKvBRUS3cMRsZRI7KZn9hxzx6KMPH3rowV/MnAwICC6ELhAfpLDEb+d3WLQ0
WjWjQQHYpEfRHgOKqsi7FZUCRKms3XtuOXHixwcfPHT+vKkS1kfdCrQV33TPd8QkG0yWLvjt7/9x
41/2kHU76mKJWrh0cVoF2Jp7UWm3seM+2Gefg1Yvn4kKxbd2RLK2YxJJ1cdvrdd32qGi8e5b0aSx
grfGLZk8baXL0s79Ox6036Zopa++NfuTKYvdqe22abP7zu1rSTlDjSLiSRu9GRWxJs62uC56qlea
hPvCCy+ffPJPZs38kK/45NP/vvLuqhfHFk5Z2qXt9v2im9wDVd+r1V3x2ec7dFj+g/0qDt2vc3FR
XYESYC7E1Hv3H/LHxN/fGHv+AOlHJLU9772f9D37v8feOfOBA7rVMQf+nSm+3784+Yxt6+vnv3Xe
3mfv8uwnp/WTyYyL3zl30Fl7vDL5vJ2ps4FigxeNOXXfI550WRlOZHh4L07ikxv7EQfW7bqnas/d
tj6xYNQpTIBXnU37VA8LXz79kB/u8eiys/rSZUR6+574Cu1c9eZ4WpprPnNg/snb0TfNuH9wj1hi
0u2D9/rgHzPuHUQEWPQ1FKqQX+G/PAeJbSI0LbtyiLQSN5YHgWVVN2HC8XrxVHTtOOL24lRJDD3N
1yWiS1N2C4n3UjXVc/cB7WBwjnegT7j9QktIo0XN+G0OeoQIXiJGTA8v22BeRyuC0HeC9mXh0AQv
HCLuIOWUl1qJCIMZMFgVqBV5Hsdyi2zKUXGKYVgwlY8SYnwAn9aoyZuCKsnAy5GLWCJNH8W5F8pN
b5aVq3SSgEyUlwm6MvwofomGlDDj5SUFCUTui5HEfQLMaICogwbLjvZNJKqp5DzZkQARAszfq3kp
VP6sWs1rpeKdMXgrhrhxGMISVWZCK4jolzZ1i8zUM4ahcmAoQ1SgKUa/DlHNqG0UljwwcoS5j414
LwUCEDjlvKg1DVzL653wluNC+i7iFx258V5A4WOCI/58YFzgLBCEFt81tBZ+jNaPYUBqCBBhwtwv
IG/NETeIFJbMVxSOgU1dK6vyyB+CzjCZQtEhDx7r5Jf9SEMS1SiYQ6GxrDnJAThAUJxA9gWdRoCE
Oo/HZUlEN6m1gM64zXk/zhsTCcV5bW2oGmZFOKr/Ux5uP80TdS6BGGAbR3JD/CiDLHtm+PGdoMtq
QV1SZum1XOq+uiamGXYOhtIbpzTM8Fv0gnaCspWWDgQ4smZClHOyg2hejRvaAuvUSpcm7/oENNMq
x9F7FzGwj/gOulgsFWwV/Fcmqyyg8OyFaVkjkShQeLPySI3mkQqAV2Gb7EMP6ugxW1xW17JwFN0e
9V0gdThBqtmkaYN+6NCfUl/JlckD2Jon9upHqVBGak1uEXGBb4gHKdmA/43wcmGjpOktAocHDXih
Hx5qZI2Omdsczssw6Bxdddy5GCaKnqBCxdhDJeseibA24jVbcVMo9spKKZpd/jMxtkXjJJ2IV4hL
avB5BFjS11WsRSVicq8aB5UNHaD3m5EYGW1cnqXTyVquNKBPyLxroMiG3uw6nLgqQX2178lYN0TG
aWKVItFIeCeHhg5SgmLjiQZTJ4Qs8ixvz+L54ab3rIYtL5JRZA42w1W+oiUNDepOJjNLb7owSRe/
DCmDCJm5V8shI7KiJURKWcPYT3dtBu1k4odcSdWaatAeGZsvYIu0kVMjYeRUdiyxhjdL6+u+ufdc
vR+V4ShBcx+iSkHJvc0RYK03s6ppF5qEOedBvA26HCwIMGtXqcyol4bFRZJ9jF1A1aDN6RIt4rqo
xLm24Z5uyj9LdjIcTrYoedznPaKBwueRWHNe4jwca07piUtHoek2bUU4YkQ3Ir2YtCXK2mtwzoyb
XtT2ws/iqhJFo9VnO1qzrnFpB4hmz7UTM0dQ5qqA1eeybKOLEy038sekKUkzdmecZnCHIxnRCyN4
UrwMUfyiZWDO2F1B2IiEgSPeZP/9j3jssUeGDjv46y8/oyYF86dzkuUNwLyuM7/mlyfoyZC7rFDD
Hf9AlQ2xaBL0KTMZFGXFDZR1ougfGk7r2m3zCUSADxr6/YJpEjvJQY6U1mvvLJ3wyfJ8BGi/Pbud
dPSW5CIqryF3Ua0PXpIcLyzuOvb9D/feZ0jVyi+NL0g1YkUDZ+9spg8tMg3TIO9+k7k/HDjLbqp0
qst6MaappfkykMK0pAdShktkKUHjYWJPlZ2IPU8WZq4RdRlEArp13+rFF17+0Y9P/mLGh/yoTz99
7Psl9a+8V/vS+JI5sa5t+mxVUFHOXkaq8qqvX7V65cwve8UXH7ln2WH7d+remdyaWuZvGJaL3lOK
8Hm2QboaLTtbBfw6Af7E0ROAymOlJm6y9JeQ0UJsMC9lzGttU2QrjYKiUcrIgFk8+Lf2kVlQ9Aw2
wGajUAcAQ53xyIUV78/Ul1SkutC2g/UsmO9yZtkaskslvbbcO4x/5s7wlZIZDZPmEWBxpvGR4CuZ
fU7crShOYc/MgXkVXur2Sei7aaikaIbWOt1fcwuctnU7Tocy+43xO0N44Jfe57Gaxu74bR94PyTe
QoHlZBQiRcm54ElQQX4c/RVTqUMHImuqp/QCOHjppsDVVVRp3gARcTx9747M9ODhTYlGpnkFWKgZ
UdCYkkEv3lb2y440+8wetcOT9fkgwJJBR4BRubXcSUEcjkd9a1cRPjLUuXo107xVq2gxWB7tlFdo
8lAw5JPggoMFqq/Ol5EQcyngN8pT5Q/K68atxKtBzWpOfazUZxVFyeLBQUTEgXkE2CZLMNeVkHj+
BgEGB46X0QuN3FuOQHSRtsMHWPkfX4FDYulD8Q7yqeVx4Eq8BWeVDJLzO3J4qJwHo3QRVHU4dDKh
IQQEzM9yfxU0dQhlTINQAhS0Iy1KnUKhv9xq0e3kc2trFCAqzq6pHTUCbPQbVeYaB/QYGiP2ZcNV
0X7y9f4TcY30CWf0eMwnN6dX9bf8YX8VcfMIZNVjnJRoJw3DVRJoHBj91vw4r2HieudnRln3MiV2
0bEEJYeUFMI7LVRTmZLips6ic9D5OZJPNUTItHrkmh8PLHUezIeQKsb1EtGgC3hSUZiY8lgiKyKG
XvQHEgbbdI4//UBrgpoSO2tjD871t6doEq7LWdbE0pcPyVgVvAFXHFcYlVZpmMombPANA8Jom2gw
aONiUmTP5EMqSqrZvCbFyqOi7HVLYcQhEO8c5JCmH/AQsA4/IniQ/tNx0AwszizW3Y1cmRBT3jwR
19qRk2ZHolZgDVNbKCiEkl1padoaHce0tYbZC0BThVQJCqboTE4wAqzkCtyDFaYMBmtLcyLBYDqF
7WkMFEW0N5CVC9UgWg2I8Kg86BUiGtLBqDWGubuy4A0aHaUijqMGQUiiLmX+ISnIjFi+gQw0ez7S
zccLWFEt8CJqZPux/Fpq+4Jbos2BiZZqFc66VJGKipAzUXdC0rh6sc54PQWL+VXG6CJNBwRILwa0
ZVhBCiXdaCDDKqcqBKlaCh4Qqs5VE2oTq3hitTkuLlYQkDFeWrlaXlwMPqwrV8siZJxr19lkEmF+
FqouZVMJw1GHVsZLFT5TzHI9f3mGxfSbNAwdaKJEHQ1GP4W5xOKwSONTfQup1FStuuyxIndRxjKq
+7R853eVSWzWYq/rE6kWM1N+jCtG+kYkkGVW+2Wkqfv7oM3SHtAmzPpE/pJWCHScVqt2f9pQvxkC
7jdMEiepsUhnQNU77YyzZj3cAIzXQaWqyWVPKlNZPRDwNHmKeMhJM4WmtlTDWewM0EBfsE0qLtx3
3+FPPfX4QQcdMnf29Orq1cifzv3iSHJ5AyhPzSuNFqORWEjtl5aoHIZChBrmBP8oEAfF5ymhhfGu
3TabMOGjgw4+ZPHC6S6CXXqlhVPLCnMSnM399NY7DgxVd0sQqxvPY2UlCkq+BZ6Ckm7vjf1w772H
1FZ+KesXqKoRXcmZZI1Hg8fs7Nly+sZE4GPjjetEg/nlsmJHmAybR40wE2nOWJ1E3UUNjhIlAPZr
miJNxTjzT5Mki4rbd9zstf+9+sPjTpxFBJhqa8KE/9Cfr2bHPvisYNzUwhkrOsQ7dy3q0I6GnBAR
XU90ioaEli5PLFq4TbuVe+1QvPfAtttsWVpAg+zE9GL0BiUOQMciY9LbIQHxmHDNfUD06lF5U24d
DQIwAWYfV4oNWVdrLHKsC5fJamN406lMcWRcnNMssIszqB9M8+IP01a2UuzVQwPiWoxb8h4bJcg1
/0EVKmvifPBNYu2xGCh3OHCQswwosOsmHaASxiesmFOV9SWlokWtMvUVEdHpvgKBMDiOfOYS8Xux
aJkrIsAlcX5xK81g1UANZ/lhol27hubw9ax5FqJ7uLTEwKvqYtUJfpslUbvVRF3ow+8OoRG8muoE
BzVxAaTfBdYPRkXxcZ515GBrvXDPq3pv6FSFvGlAtKXhuIRBa86W6AxkF7oA31juDxyY6K68rEgX
i8N0XObAMjeAscNax+qO+UOdbt+rTH3dFEuZeG4Y5MRP4sC1McaHYn3r6Jvkml8EuoqZMIf7Stw4
v/JRvQEETEmb1Jap9jsCUM6huWrL06YLMYP7rH+NItkpgGJd/sz0uYOQRzjxHmP6Zq5La3dR7wB9
62peHBFNP3nVaw0bcOyXfbnsBJiFyj4iNrqEm4wAgwMT+6dOAeLATIOFA8s3SRG9AxOvLSHxR1Nx
IEjR1aVW99p+Q8DUigiTUNedGqJIkyg0ARz+vrgyInEqgI6FmB4z9uGQFeAjD8+riBRvRlqVa/2e
FjAr5lUMFE5SswOT8q+BcrGK9iy8VStLrTdxXMd5ZXARDgdEA8O/OhKqjMqeZE1TkfR8t5RcJ8uk
qg9pb24aoNBILQRXhjRm5y+iLjhfHmNUhwI3qsLQnEcFcJjgAthg0ec6h5COIWlldBqgxIiBasJn
wk+kgNSBkjo1kiwogOQH2RSlLtoM+UesjkTrsDy5zLCfIQ8jywTZcZWnfRPaPwFVpbSCHTgVMBN4
8+E0B+LfIYd4FnKMpo8NuPIH73sXW0LHo1mmwthk9hyHi6uu1uqIegLQFpwMQucoQHiSXeEebVVm
Zs/0lLUXcR7gRdClbNNELNhW8rQmeaCCq/ZCtCoLiWshYlVVyUnHv+hEGeFXGLRbRO7SCoPt0Vag
noDMBxDpo/RcUV39slqARlaM+bkuGwiARswFD6lgojE6ntil1f4n9ZHtScgEVzhm6EmRMVQLK6fL
g+MARADehOg11IVcan3GUnYrd0SAbTBfetO5I1361SPOjATNJKMJIGPey11AgDEhiNuCfBsCUf2b
3CGXKiaqH2CtZJQeHSvqhorvRGIZrTMPDmyvbkKvDTcu8bXgkvrSBVBky6RP7Yw/pSHLdUmHFWsF
XSdu0BXaMW8esHQwoY7AijlzyCE0j5yRdg+HJimb2TOcou+9Ru2DnGk/9c6Mz0hLvqFUm/t8MtYN
1KDpYdf8ojFhG1xVHYsrhTDbMLBpJ1ORnqyrmLp+NmU0qdWHivOtj2VEnQSnG01/4zhaCQyf0Tw9
wpmStmqX6O+oXVm2k4D31LvTfJoXvY5LiWWHbd0W0Uiy5MmAAXtOmDh+k0226tSxdPGiebV1VdRi
pHtLZ0vpRHeKh8byYZiTz51eYmgAa+R8sJCLcaYX2goLY73Hz+3cZVMiwAceNHTpIiLA/sxkLPUT
zfWX993BPIo+Yf7CyFh8Cr9kR+d1GnJqhgq7MAHeZ0h99ddoU86ySNOTYV62LNAz6AGXQWBbz588
dCy6KZRQbpGiyLf2/aJHVRm1eIlKhVUhIzBAfdD0hgYppPHvtu07L1i4auH8b/ba50AlwO+PvU+E
oGjJisKPpsZeH1e5tKhzdVmHquI21UXldKqktrKkZkXp6mUd65cevHeHPQa07daRxi4TxH5pKF4A
Ssh0dlllG28l545/Rlde1AuPnJeIIoPI8cLyqgNAw2bDXuxOgGLiMlch00VyEKQGYITVdUbpxELr
R9c5oURrhVobZoy4GnNP3ZnGEd3t3CBuVVCacr8M/8qwO7qC5X2UOvYO5GnqL5sxdD7IvRgE1rzJ
CLB04uI9Nbx6uLA+IsClBaVlBWUlNM86Hi8lhs82TcoI4dN5v1AgrtWJ1kD6kW/jgUDstzYmwc/E
5VYRAWbeoiPAPDWAh62lA4Y+Rhg8wgYw1ZuSQhinExFE/4upJRFLAVfOcdUiayZ5nmvpZRgtTPuz
dV4+CLDEP8uScfTNP7EmNq+QIXNciQAnsV9/BBgIqZCgZJp93gcH5hndPAjMGSSUautpmqsM/K5c
VcPfRPZW0UQvHurkycDU4S+NE5GHCosGfytM1tTtcc6TUwhEsFONpXNcvRPqOnPd8xoGPAuQO0r4
HWv6BmN6NTeobzG+eUm9iqKi8mKeLM49fRQ6nzIk7oZ8CRbHhxE07j6ocXBgbxCY8FldU2UcWAKh
WZaIAMu7WJUAwxEUohrhbTpIjshxaKTIUYT3Ia2O/qOriVuOCw2UJmhyBmfXFyB1/4Gjs3n6LEdo
3ENd43Ey4pGH6KTkKEVpahtztlqfl4e7YiZEK1Y8ctg2Y1nqtfqTVHQE2P7IPWKFKGuKcFLj0raW
2mSt3VrSkhddDFGHjxxpgarSTYyn+YusF4FwUlk8kwtDoylIXjz4xBhL9bjlgiWeSNKPGhRnjR4k
xTR8pLyqB7V+ccQxUihFcGZkD5cj/9IPKT66rQzMjq6VQjsW0L3PZkV1FicZFVU9AK35SMgcWMBe
oVWPBEmYj6V5slYO7WkIayQOCLAuEiWUBl3xMmgpHFLKElWQ5Bbyh7xpw0uSXKluw8SERBWi3xqE
0XICgMsRBM6c5BaODHwgCIraAWAm4zAqH5ofDIRGGaN9yr6iKbPHXWPCDpNGKwVyoNpEC8ASBkHC
hgxHSgFQyNhSJA/gugiB1oVntN2h9rWeUVOGCKcrJ2QOo2gDc91EZBGoIkMRgAZWQfLEDRQHgCeH
lEdVAsmkRyk3Q2qYU6V6T6GO2qLWjIm9wGvh3G4dHRQTeXbNQMFKUVJaY/ZHMinSiH57+glmayPA
0n/ETo68mDp6y7H03fARKAqTTXMaUmy+L21uX/KAmk52GDJe7VeP3Cj9KRB7o0aoKRQHmUIXm409
watz8m0KE7KkQDUmL8iTZ8hz5DwPY9GI1HJCtAYnVY+nppBiD91pNShoMdz0LMbZ2wFPg5YF7fRV
NQD0FYXKAnKiNsK4bkr1OX3oNTKXIBSHVhC3dvmJf049276XebkshfEmDwIneW5evaoagUzqo7VO
sVCFdPzxannokKPRHKadXbv26rlJ75dfHtWv3w6bbdaTxjnYU6VmLvRcFZj1c4kys8YueKq1krVJ
5ACpQe1hxHpDoNyYPDhu3Nihw46rrlygLBoWBtEk1u8ORSL/uBg6yUjkHKFNMozHZWSUoDrxkf/v
vfveXvscHqtfzEX39Az/MkUBWiudgDJmKKSXP0SkhAxKQAwbFqPBolN1IFOZhjqcTIRBPdQmsDrh
ps+qWOB3TVrFmHJJA7E0qDN33vwpkycfOvywypXfL1/+PRfgrTfuFImkC3gd3eUrCz6Znpg6q3rW
N7XfzK6hAm7eq6TPFiXb9ykbuH1Zpw4USM6MTpQus1/mwHg3lHQ5SDcDDbALAeZBdRr+lXmb9M0K
l2FDIcGhxEWW5f4FS1gp8J0CGvvlByjKKmRcQvfh9iLhVmzJxahIF7Z1TyLODNYa5lXMtqlsa9Rm
vszpYN8E6hRvEpGZWIiFlodw9Yn9khTRlcodHOYTogqoywTtCsPjHFvF7LeECTC/7qiM328UK6Mg
eobJunpVssxWY8aC5Ng0DtqXBwIIDM1xraOxTaIuFN9LdG4V7VfW06gmsV+OgkZYL15KGKERaT+D
V0GRn/qlzht6WLU/VZLhbgIMHHBFuLScKYT0qachetAIsLzij1d15kFgHucU6otvXk6daTDNf6BG
LKtec19IOsdzrVDbolat88zFLEopOChSyLB8iAmvrqHJritXVa9ayRx4xSpa9onGPLEsFr0XlPvC
ZQ6YFNiQ8Bw2NDExp1x09Yd8W4J9Q8BEzf6qDlVlrV6i6MeYvICX5IRecyXLyhMavDw4LWEN6svr
hFMgdAGNAFPj4hYDApz+4faEVuV9IDx4PsLFTX40ELomRh0A0iOwisbJWZxoQFgJsLxXVmckitqC
LCkWkWCBIIEkCX6Rvyl+B5ogXBdxW7idSbPSfj11/cXXTMLO2ThpARAtrQg4N2a40w04ypzuu6jq
Sa0ip96jEz4bSrscwLKeQ5t1dheDNT77xVivZUUbhVwSDQVrFLIgmbIulhbNnDnImYqbWQDLjYqW
2jDzQ6xNSi0kNXOfg2it+YTKtANUcCTiSbibkyoPVU3GeVS1zJNOWSTUf2KTaoPfDAGVlp0PuyAq
iFhmgU39KcOYL+HMOJKJSE7YAg3JVgaNYXY80tWgLSWkWbJkkziSgOxLGLJveZFcOfHyZYwLK5vY
OKUQYulZaejgpESns1uicz21FuQOlWlgDQkUg5DkNWpZTNXCS4FgJLUKKzNnSK0XXp0F3us2abqR
oVRPQ/0NaWZijyQrSh5BBrl+kDV4vmq3omYro5qSDRgMKA1QlxSE2X+Ua/gh0LUWIamlgy7TmtBm
Zn4euKJtJDs6AUB9RtQWMIKK0uKYiItpEysHuUWILXBztk5AxIUAxbOCAr0WgUstnoOALLHQQjiF
qnno8k+FN5oFjVEdGQJCsKKUy0RFu9OcilVBdNINK6VfVgBkVZqkeJ+cKePAzIeNA6PHXNSyeD+4
XnU3/qryN1vnhC7KQHJWTCA9BZ2uq72bnWITmYFDJ8oED3bkFsbIJBjNS/E2hoy6kiYFhxNulJ/1
TLnOcCxSHpEY5XerNQ7v6nSTlF9SzXOVs5hoCzkS1aZoQTpOQ5MEsqTbfGAIJMkpFVVppLYtI6PW
8iIVFcmoBs1qW0K/m9eLAX2oeba/SI95m2yiIiVHaix4P40ARz4JX4XQj0iZyC02NzjSulH6poeB
ms3q8qyWsEftn9OoJV1FX6YFdezYdbMt+k0cP3bhoiWVldWmxMxOOULKzAkWC1YSJifq1GaodVRJ
qC/rB6a+VAs0sibKULpZtQueE0FXheoN6ajwTSr2hbwI74UpwTCkjdMpDNoKvMbgfClpaCpQ3Cy1
zbJB1k43DDByIDC61XQQWFWNhkpJixaGIRE2EpKj7qYaDIuI9xQRpMDkGoZDtjZtynt07zJgwG6L
Fs1etXKJSsurY25BxdMQsSxJWSw9AIK6Th6GG6M9OugeYGstIVLCVImk8Mur+HUCIMCyWj1ra+bK
xJiBIibb8jrGYjS4D0C4PNtQkXMGmqd5chQY80ZGXNbsNiuFPMNxlx1R3jz2y30JGJqVYVnelZho
VoOq8NTQ6ZiK1o9MO4JCJKThB2ByrwwCs37lqE8e7WU+DAvGFQe33SljeoaMrbJhh2/O8LEE8buz
eD6zvD4LBJjX8i0tKKY5nPQqZV4BVYfpGFRBnpI1DoyWRkeiHnSgICAACuF1EtzLjIU+zF4oFpoJ
cE0VfSsBxmpsbBvMpfDEw1JVtCPM0d+i1lsAgjdgdNi8GOgjzyACYuf8OPZLOykEmCe4EvXlJdR1
NJjfGMZv5pVXQOlM1/TgXpOriNQZNNpBpASYV8rmEWDKtcT6EpNbTby3etWK2hUrq4kAcxQ0j5lz
ADn1F8ADkKh3bVmQWGvWUfNK0sWR+TAoTDno3+S50pHPLEpN+u34g/WxaQS4nDhwOX2K28jYL70o
Cy80rmhTTBOAuXdJR4C5uWTnwCm4cZ2kyQ+DI1HQtBpWDXUQiAhxIDQJEhFgQoaHf2WZcQwZGQEG
Pqk+lrEqSFEkA/ZcHBbHF0Qa8+KEsaCBoe9BZcoBm4mDupOeMKfKtVPSya6LyXy2EWDnaEOSk3/6
DUb3za3WrlQzLDJKg6Ea/MGubjqSI+fcSdg6rzlFT/CkzHDXdudypN6dUVgYY/6KyqBpo0JEjTmu
ZSPASM4jL07soXyinyru9nzzTMwFkaudn2/ip06JmxwNI60EGF3yKqrIuuQl2lAirRg4Riox0rUq
xpWPJll3MWOA3xJ3JArHfIhSXFPX+p00sP4BcbKvFCnhFNVnk/I7viGUSWLz5CN9H/jmcktd+AAr
4FobDudMDqtB5RFYScyXfGUumiVxQbC2rxAK7ThQyQBpkGYuJYiaG1K1YV7Oi0oYcER1Sd1LSLMT
JS2a0SfIn+N+Jo+amPNynTKISCa8CukuseFQMF55KRMGXSimRs5FE+B911fF2CwV7An4leBvSkiM
u1QKSRb7YupYRDQeTMzlVkqBWyRxqXoQXqg3nlQszp2SbCmehPmJdZbODkAmPSNaHDadUiKEeYv7
C2XifH4TDlffqp/VMgNGI7HSatAzjpg3yZT0/xrpxVQwjU40QNCchWVauvZc/RtpKXfCV8riJMmW
4cJMdwBF+m/UFrZBfznZjTgwnzEvxVSDqyIoI00xzViktPuUkqX9bMTlUZmj5tiI2xvKSdPOqw+T
veKcSKHFq/Y09cscS8VPu23Bn0AgI2ppCj1beVEh2oxElcMTYM/LflrTU7HxZcezF9oW5OmmkpTg
isZwl1oloMuV2hR9qxkQ/YUieEfcL5hFPcV6QX/KMf4Sm2uqJtLw/PYTfu8jkdLOXXr07Ll1RUVb
hycSxO3adyDqzXQpn9P+BeG66BqzFS55pSEOFcHYL6+qpVoPqkJcC7OglnFwa6HqWrHmlEg5+Hmq
g1Ae2UxL6n42obMWa74FnACbPaFLQ+v8CxcXraN0ZI64txgdxVA+sEC8D0UM90OExlSsr1H06X4b
h6r69pvPV69eitS4MC89f4NWtbyFgbxqscLSdaCugnluEGhhdRKojC4HfUOpLF6F14LJS/Nk1TJZ
iEKioMVDEAXGQ8GcaR4EF0DwLRkGyJQLvpprkY/ghUJiDlBC4SI8cMXriDErhb7WSEruahW8QNBA
yICT3Ez3slUWBPQ3XyzaHEQPdomNlKDPg8CIFEM/MP+jv0gXDAn92fLISEZk5BsxCfK+H3qDFk8A
5vhnWsVXAqFj9JGIBGEvYL+8CIpFdTHyaBTcxJI0B8rjhu+UABORW7mqTsJ6iQwjBJqWd0pQ/KqU
RSd5wcYKlNhS/wIpyEhkooELYoyUuvg8RT0T5wQgUadCuAFqR5TOAeYRYHnjEVZ4UhpMxI/3S2hB
LFoVPlbqCLDjeCwjkrB2SdlzIqMCiydlwARgGgF2BLiGOgsSqwmo6hUr6FOzfGU14cZdBkqAbdFL
BAdKSrCXyUbTgEMjc8X2EPUVtCLtMMEOfBf4cZgoTpqLXw5OQkKvQaJIAeoXKCICXNGW3mkMGkzf
RYUUAk0xEjL86w0C+zQY+KSEQ6NCABR6T+iDsXHCR74T1USAGRDhwPyRBbFqZZVsIsDUNSAtABJg
goK/kp7n9an+sYrhv3QRVLyJTiSZ0pRloCHiv76n4kPooexeHeTBnRF5X3P7aYkiTEo8+VfKqSwn
vcOR3dXmK/UMI2RMWC2N91tdWXdCEkz2TjSbyaVLkbwot05jwKj6+gPMxKXjDEoGfzTi/XKPbWZa
9Df0rNaKZdp/JCoS/9AJHcFhHdJievQMzDJExdMhgNZ5JbIXOeHaVJ3JpBxJ+0Irc5s5JtYY9UH6
LME9+orwdIXXquZC6FByUueC3m4CYapD1YhwHnCH5M4QBEupkCqakQ51mXLCqtnxhcEyplUNA5eh
2ZgiEzspXZrSnsFDEQit9sFinNCqQf+QojVknaqqhA3VlSRw6RlAvLSCALUqnq6z0foEPCU6Lo/F
QVcoV3dKfWUFLBgapY06Y9YGPbwM+m2A04S0sSHXZzIcWnDNCBgXqhLYGgeznDrszGKo5EcLNQFw
GxCW02DCoMNWOCwjAjdXSa84VFjTTmc3s68sTNg1cC2E02hRep4VQ6HEtMExgEzqEI30/8tx54Oq
5ypZFbOhgmECllTJGbWv1448a9nApSZtTtYpn1BDgAp44Rviq+ZE9/UgrnG1ye6PDSanqDS/mUUy
lmIekltUngw2WWGmGpE8E0lvy81yxGtPDdcdi5xGOokzoTSRMwL1ZX299sNpayhiaN0UAEzfiVzB
lxYnwHVC4acIs2iqDPnUxKNnaH7wLOV6cIBcTsSagAdy/q07CTk0g4EMq0nA7bBKbkcUhx7McEpN
PyPjaJEwWOkCFWXlGWg8ir89l0BGeumIvKWPF5GVd7Zx7C0tKoQ1ZTmmUigYrbPL774mLsf0S18m
r4XRuks2iUJVqE550FFIF942yvGrxt0iZxsWSu1Uquek4hgpcHMyud6Y5tGHInYl4IRe3Up2h9bb
4/fXcHRhAu9hwTcFG8rr6GRJS+go66qDeEARq3YVq6CWgQ4xb4TicwRQPRTRF9B8Uq0zp/NaWOYj
gOs6CUGVR/UhIuGu5rKj9wd1Y5qauxNYYZuLY06CSj5nSnxvIadmoGXfdLeXI20tbsaG3mDFjrSg
mG8HhwMnWT+oErLG47U6gUpBjYBNAZlRE0pl6MpdLkvyLAAr7wEGdCLH8hokic6X9b1klS+eHMzt
Um5TroviOo2BNLILmUgVf2QitEgMv/DWX/aZabuaOhMJRVozn4yQ/XIOmJVPbvaZoGItgEiZnQ+c
rpsARqR3pM0rINxZJUuhYs1nWQMcC8fLC0I5JMAR3ZSGByWaaku8AkHMMQ7sviVYnd8yUi+vPuKB
TVv5Q8KebZqTyhiKHeGCvYwaOPWinAhL1rWFaTmsq4mbD0aDBQfuQMEb3hkZocccHM4dRQ6QFIhU
ijKpKgeXU1IiPypIWCqMdJPKkr4GA7FwpoZ8UUhFwjQLQMq4ebIF6dJ2BbdS9ZbaOjSnqMFmSNXz
9nM81M9JZonJIUdJxWj4OtNj/l9HQE2/ShUZmxNZMLNnT/MeZLv4G2HSgLsSPSJzTSQfda1YRDMJ
sJQyR4/1XKcGHuG1GJSUy+GDYU5JBIOqDW0dlill5Gg63kMdcVB8VBPrVfZM39HQm9MqNAPwyYXT
C6LrfMuVAQd12lnxJGkTTwZ8UcinsnJf48lJlgvVOwCRgz2LXARImbY951hoSn4LT0lc6yRrC0lq
x9EznA1FckkqJJuoeZLvGo7nnbAwiTpV30b3M3Zs6FP9sqgsGQQeGn7jA4ZJpjJSVZHm0ss8iIVj
O8MSga/+SaQ41auWpoEiwEOTfiD7yVLkiWIa+hnaqNa5VwWqhPUIVDGKrQX0BUaryf/TSJnNaT+T
00rScYZq5HZZa4cUQ3qcGYlcYlccSVxCEjzRaij3Den8LOfTDxuKqWdaCQHOLGZJetrxBRNLVzQ0
T2zJ5Wdb4FezeQEZaxSXZtBCfvr6FNPLvsJ2lsCRcc0PLrYOXyW5dqedVJbiEnRl901Ain3ANaaK
lGwZs7JcR0+OhFGzij5FoRLMJpQzi/+MHjH5KLums7aen/SoqqpIwTwJKwVCSi7xNLKDQnCurbr8
nUzVmNSKkurTzoCtmNIUPox+N4z0YiUCJbquP8666pxDrm2Z05HEkKC34zISXSmn/X9agKOO3EeK
CW3K2Dre6iLnnaJVSCAaNj/XDa/rULtOWVGGo53cKvCcAAc8g/16H6eOXMVYfesBLEEWlcJ8ZgxE
aScgiL1oQb02xclM8clTPPEkMB3HSTbHWq3RQTtgteGwty4iKghGyx0BJo7HIkuTnPW9PimC5ZRD
+o4vYl4oOKLBjfpKtKrMXbaVxxENKLCn+SBJUhv9cOVSgfUKbrZE5E7ABpBOCLMk6ey3Dn1oo5VA
NURuOOprOxIiritgASX0F/jNEj8zbk4MIBIWMU5kGFjJm4G1v8C6D3wCjDlZVjTvEY2w31myhmJI
xt23OjfRSgYS4gLeK3PIscPyg5Wxk7rlcnBghxgyw/bGNRAPGQQUEDh4CSTTYPSnICJOJq6hu938
ZoEn2QNMLy89y6+gSAI1E+ZHmjw53ysL+JkQNf2XC+0mnHP5Rlab4KakmmD11iWxVOPqUbsmPKkJ
xVsLtyTpG2cUk+2viKRzAJxL4YTVhz7Ft4A0q6C44iQ3T/8WH/L00mfWI6lHo99JZ7IpITzGx8H3
gjOXNkPFWPIpj4kgzV6Zvi/i5cU0u3oRAprP0uRSMxiZaZ5r2OY2qn/oqiWDak7PjXNjklhJlvKk
0LmUhhKRYWuu5pCjez1dfFIfk5w9V2y7LIk3Jeclzf5FB+wun1U6y+LbU5EUuxrWAdKP3Ivf5VSH
K1oa6klNxxc+r3RatRERd3QXFs++PZfBWXoVaM/5SYExtZKzC6fHQ3NclN6IFCn/j8t1qkmKpNgI
tKXXiHw2mLt8L2gm5yHfxzXTdVm0HkQ0klSV2BTbJnnIkUKUx0gXOCH0yK7fb5EdxnTjmaye9GkZ
VK+Ww294VsCIGLt+ayu2S137sz2t6PkMURuWg/YzCRivrjxNpVRCp/5y/xdNOI3ebugWmpYdGWYD
3QCrc/WTArKPgvEzcGD6j6djJ+Wny3AOg+eaVYqfCb2BjxAGiWmWGF7MvKD1EXSfV12Shfc0GkVI
nsUAWC+X5DKpb8tX2MnERJu+9Oc5OYovWbKkmRpIo5NJ77BpdBKt6oaNrbytqnKaIbMbW/2G8jaD
0IQk1hsEgjyvN1XRIhnZ2Oq3RUBcjxPd2Oo3lHc9FsaQtUYjsE7kWVdOa3Rmww0BgYBAQCAgEBAI
CAQEAgIBgYBAQCAgEBBoVQgEAtyqqitkNiAQEAgIBAQCAgGBgEBAICAQEAgIBASaikAgwE1FLtwX
EAgIBAQCAgGBgEBAICAQEAgIBAQCAq0KgUCAW1V1hcwGBAICAYGAQEAgIBAQCAgEBAICAYGAQFMR
CAS4qciF+wICAYGAQEAgIBAQCAgEBAICAYGAQECgVSEQCHCrqq6Q2YBAQCAgEBAICAQEAgIBgYBA
QCAgEBBoKgKBADcVuXBfQCAgEBAICAQEAgIBgYBAQCAgEBAICLQqBAIBblXVFTIbEAgIBAQCAgGB
gEBAICAQEAgIBAQCAk1FIBDgpiIX7gsIBAQCAgGBgEBAICAQEAgIBAQCAgGBVoVA0wnwmAs7+tuF
Y7jcchC7vD/sjlkth8aYCzp0uACPijZ3kHfST7dcbjKlLHlw29DbZ67R40df0P6QNUzCez6lFm0X
jF6jnK2tmznPaVl1B6VEGRGSM81XxtYIXYNVNOb8dhm281PbV4PpNOqC0ee3Pei2FlQRjcqMfzFl
LH1rc17Tm8no89ocfNuatf8shaGUUzLGR5If5q7hnUYWY+ZtBzfyjiajnuvGjNnIB9V8rmmRHIdE
AwIBgYBAQCAgEBBYXxFoOgGmEg26asIS224cykUceiP9xm6Lb0OPPC32wPPJHvqY5x+InXYkP3/o
TUuXLr1p7eQkR1EHXTWR8kHbxKtiVwxsRgK7JvDOvP2Q9sfHnlxm25P9ZrSIb74mecx077AjTo/d
/0IyCxn9wv2x048YZpePe+rl1KLMvP3ayYMGNVNeskM3+oJ2B9++PpK5/Eo+9Obl2J46PRY7/Sn9
cfM6b0Cx2LpgycNuXoHtqTNisTOewv7KW5yY5YfpWrlq2FFnxO57zmsUM6dPicXGPvVS1A74yBlH
ceaH3bJy5fpZjLWCVXhIQCAgEBAICAQEAgIBAUJgjQjwOkYwnQFH/HcdZy398b3PvuvqQRno2TrI
6MyXnxo36OrzI29+2Nln91kH+Wj8I9MZcDL/HTRo0Lgrbk5myFzaxj8pyx2tF7pmgyAktJ4h0Ge7
wbEp0x3dnfnSU2MHDx48dmryke1aRwtfz7AN2QkIBAQCAgGBgEBAYENEoJkJcI6w51l3DLOQ6eaK
jE5lwD7/pfDjod6A3Kzbh1ossh5OjqBO+sUXpwVXN2/t80ii25Kjc3Ocap489Nmmf2zctCxjvt7T
3Xg1H7tgNCJ/L7ggOQ6Zz9mFDd7b9BBSLXkqA04Z/40dd9nVg5LHiEfffEXs6suOax7kYlmgY2iO
vz827vKdKYzYwoZn3X5wFFQcxRLz4fPHIOJYjvrXJY8hR2HJB98+Rm5zxfBuWhvjzhkfJ0Ozo287
SIOFz6fanZX0C7nFCG50JlvQc3RFWxcYzaHIx91HwA6gh/ADePMu9NKKopZbPKqaw3HdlhwXneNU
JIISiCxbc4RF9znsuMHRgC/z3zMuv3wHb1R45tSxg487TAiwFw+MmGKX36Sc5MhgxgImh2En/Vqb
EdRe3jIDi+JHlzUH/M2kWUIyAYGAQEAgIBAQCAisPQSamQBnyzix311HHqsB00/sMGJXnSe8hgVN
ZsCzKNIP8c8pGxHagSOP1VjkJ3cYMZDZLd87ZbrGrDJ1juKpZ04blzGdNcwt3d5/G/ZDiSgOvKK/
hSBPvHry8W6Gao5Ta/50S2HY+UQTj88wX5af/tRxExEa/WT/KwZG1HzytS/04xM33URxyJNdyDQP
iZ5+GQ8g53PvmoeQJjPgmTMm+/HPVL4+hx436P5ro6nSxJAHHXdo841+ZYZu2E0E1+mxQdd8TKHD
EjZMjHHny/tbJPHH10w+zqevk69+bju7dNZLU3/I+7R9fE3s8p2N5RL7PW6yJEjbFVOPuzwax+bE
/2s3PdU/uqf5RMRPKcfjxl1+deweDg/+5JpB9x3Xtu3PvV/GVykpIrB6hi6MXT7AO+UeNGvUtB9+
gljj6BoORaYo5EHX8JmbWXyI/Q74r1341I6aFh09bpJcRNf/sGVg0FSJPg24bIeRFErM2yfXTjnW
TZHNcSrKEl107JRrP5G7RzZLx4wwYBvwZba7XR+Oi7ZR4dHP3RfboW/GJnDfsb+M3S0ZOWPsZb/U
OcrEEl0GV14+9djLxrrMZyug/7gYPy+i35QfRF+39MZ5e+o44Lpy5A6XDcg8Y3vsZQO0zFR3sWxX
tXRmQ/oBgYBAQCAgEBAICKxLBNaIAI8bsasN6uYmtGNuHhG76s6zeqOkQ8+/atADLzTL8jo+i531
0sjMvHXMTfT0u862p19AT+epw336DRo38iVhwMR/T7vqqkHKh+nXoH7Nx5lQ6DEXDLxiHCaryqDk
xJvMK+zDwdE6bJnjVHNKSZ+zX1k28WqalJy8bJQ8/S4LhxauF824Pe58PUEc1IVyC/+NCtXgvWte
CGbAxr+jp0fp9jn7Mi97t197P+h5s21ZoEtJf8yNl8eu+djNoO199r+uGXT/c5HI//BCE8dY77Nv
tv3eZ19BhUOnzJjn7h90zb+c0N7MU3N1k8SjUxcmJ91sJc3rcWdccY60q97nXMGzZf1fk6x3iU6f
8dRruI4uvIe48tXpS1/1PudmvQSJ+bdHZRrNZb/HLhxGZb/veR0Y3rEvnjDsHDvd7FBw473xsti1
n7jZwH3OufvawToFN8eplJwYH6WsNods9unrBnyJfcpoL1FSHRVmPpqNgg6+9m5kYNiF1xqH5hTs
ME8aHkn1qlv2AlIYtg1C0/1nXHvtYKXfnFqzRV/fd2w08C57xxLV9vOmpUF5kiZGRxVwxshXFXTU
3TUtszZZS8heSDMgEBAICAQEAgIBgeZBYI0IsLcIVs6Fr8a88EDMI8sddx3RbLMyiQEri83Of2l0
d9yIgW415oH69N6HHTsIkcDMf488u+8OSIn577GHKV1eU5Tdg4+fctXEZUJ6OWwXI8G2cWCtkLoc
p9Y0I2n3M5PjcctxRIMx0MtP51+2EWOP7vJyHDFgj//mee+aFyPT05NSbfCCNc5DOnQpSRJ7jfVX
PoZTvftSFTtGmHzOC4I+7n5Nadb0yckp9NnO1vHixBFsjW1nb2x4jYuWnkDOxw3qt413R/KvbCd6
990xSzaj2GYKe864jX7e4qERdz1Ay957+A9lBDrT0HKzYpI+nMrsU9hejlN+Fni8lpncGiwpnVYi
txCW8V/q3iNKyqPC0QJYGXBIHhiWUvD1SYd5ijG2HAWMBqGZ/x51Tt8dwIej/DRHLZxh4+46/E4D
15Ys540Gdx1BHuCNWyc9OomOc92FLSAQEAgIBAQCAgGBjQ6BNSLAjUHrtCfcgtGy01xLRRsDzsp/
JZOnPYm1mG2T5aGZAfNYMIVO84gvp0R8mH81G/+lhbI18nrpmGYdiGwM9LmupeDdiTTQ64KGT4/W
hpY4aDdO7SdiFDNlBDave9c841meHiVMQ9cxXgqLshfz1/pa80cnpZAKXdOS53m+XjyzjfPOnJqz
j8gt07x2VmteC4/jKbxebHM07JgGqy3KrOs0IzK69zmvcej0JCLBLc+Cm1bTdlefc17V0OnmY8Ea
g+yxV+HZz42WJbEaMwRLIctNKZ4+jvkzP44HoIl+8y+dfdyURBt5Tyo/Xi8X7W5kmcLlAYGAQEAg
IBAQCAi0AAJrhQBTsHFsyowWekUMGPCYbPHPEuocTfZNgpAZ8JTpdGtMGC+l9MDzt1NCOyQN3jU3
6pyfaBItp85TWWWENcep5s5FlJ5b2Cn96dkeCg462sU/Z8p5y2U4/ekpz5KJwC9cQAHdzTn9N0OB
si0nxsO10Xgv35g2oqup8fHTn3pVQ535F7a0FCJGnJ54y0GdKSdNeNq4aTOiu3gU18KV3dFZ0yd5
cdL8K+O2DbWdzLHRfDmzYJ6MnCHAugmZznhLypLL3HhtyDTHqfSkmAV/0owBuBKDfOONtACWTbhF
XPSN0QJY+UGQVoqIEecsIDPgKdNHv/RUTBgvMeD7nruN2HeW2cf5ZSb/q9LzluVeb3XsTGPa+T8x
XBkQCAgEBAICAYGAQKtFYK0Q4N5nXXoahUC7ecKz7rjwjuajw8yARxw/Iuu6Vb3PvowukIWvZJt1
+wW2PHRvCnumW8F/hcVNGZllInHz1bDMUvXWl5p5+69o6q28lSjHqeZ7Pi9X5a07Ta/J1Tfppj/9
gmg1qeTnCwe91htgbcS9a14SfvoVx9uU6gzpcW7uv795l7+Sx2SDDnkYZysR8WReilJ2qzbPuv0X
NHX1wiwv1TWqzFfZuG/vw344aNzlvzBBHXO+C46mScOpiZ/fku8fbpbH3XecBSePPv+4+wZdc2Gm
ZZGM2c667ecpUd2OQPPsYFpRy0U6z7rtfJlNPPp8P/g5jV6vuchZCn3OuZzWi4oWWJp52y9pTrAU
J8cp//mjz/ODn5uLH0oM8n33+aO9Ehd9H6YE57+hFLYgFi0bHc2zzV1AItxjLzv2MvBfCcGe8pTH
x/PPQZOuTM/beVnm9t53rOHPZRuMugtbQCAgEBAICAQEAgIbEwJrhQDT4OqNS5447YETdMmsXUf2
O7SZ5thyXfFKWBTlnGn9Z1Tl0JuWPnnaA8frLOCBI/u5Gb5yq4t4phHh2LiWWgDakyoJnqWln7Hx
usuvuJWnsp9qNrGkcUtaAzqa6UvrUWukM2XsydPduYFP9cu6fjJz0HFJA6z537vmBeGVsGIp6z8n
p8pXNPPyV+LWZ4UuNux8WozqOHu30dCbaU1nWvpZp+nSms02ypucT14ei5Z+lst+EftXtNRV77Nf
lUWhkcBzR318jc0BJnm+eflTp8uzZA7wf7drrhnrmWtmzR836Jqn+l2NWbvH3RctiOU9jtfGouWh
5RJaMJpWfnabrHTlQptpXeinzpCfMgf4v/2GsybZpp8EP8uRH34iQdEttQ27BUs/Y+OFh21RJVox
KuupKDd9trOb+d5mC9NlBhyLJbFdZsCxbAtAZ4dn2C2yPDLK99xRNE4dVUWuAsrjXAYoP7Gxa2kB
aMkfgT/yDLdM1oCntsvM+wdfO3K7a1C2Y++LFsRqKWkJ6QYEAgIBgYBAQCAgsB4iEKfpuOsqW/F4
fF09ep08d2Mr7zoBeR0+tEXrl+YKX71dFha9jsqcZ3lpdu/V/T6xVaDXUV6b47F5lrc5HhXSaBEE
6A1P12wXdVikPGNjq99Q3hYRspDoOkIgyPM6An4tPXZjq9+1BOt685h1Ur9raQR4vQE5ZCQg0AoR
4BDo069wr05qhSUIWQ4IBAQCAgGBgEBAICAQEAgIrA8IBAK8PtRCyENAIBUBXh7abcfFnlru3ioc
sAoIBAQCAgGBgEBAICAQEAgIBASaiEAIgW4icE24bZ0M8Tchn+GWpiGwsdVvKG/T5CTctX4iEOR5
/ayX5srVxla/zYVba0lnY6vfUN7WIpkhn/kgsE7kOYwA51M14ZqAQEAgIBAQCAgEBAICAYGAQEAg
IBAQaPUIBALc6qswFCAgEBAICAQEAgIBgYBAQCAgEBAICAQE8kEgEOB8UArXBAQCAgGBgEBAICAQ
EAgIBAQCAgGBgECrRyAQ4FZfhaEAAYGAQEAgIBAQCAgEBAICAYGAQEAgIJAPAoEA54NSuCYgEBAI
CAQEAgIBgYBAQCAgEBAICAQEWj0C8dra2lZfiFCAgEBAICAQEAgIBAQCAgGBgEBAICAQENjoEaiq
qsqNQRgB3uhlJAAQEAgIBAQCAgGBgEBAICAQEAgIBAQ2DgTiNTU1G0dJQykDAgGBgEBAICAQEAgI
BAQCAgGBgEBAYENGoMER4ECAN+TqD2ULCKwdBBK0rZgXb9N92hM3bHPseROefWCP434RLwgBJmsH
/vCUBhBw8vn5f2/oc/R5E599YPcgn0FqAgIBgYBAQCAnArW19R9PmvnmG29/M3thZVU8kYgXFSYq
ymJbbtnjwAMP7rdNr4KCeIBw/USgRQhwIpYY890rU1dMiyXih/Y6pG/7vrFErCA4u+unCKxnufrz
9Q/mmaPf/eYnJFTxeFAueQK2Li+r+t/Vqz9/v6Bz75qZr5Qf8tvlb95UeNy97Sb9tvTIkesyW63h
2dfsVXL5e9XDtyoZ9WV1a8hvq8xj3TcfLB/194LOfSL5PPaedlN+W3p4kM81qtD6+vo5c+bMnz9/
xYoV5G1QQFlxcXGHDh169OjRq1evwsLC4Bjkie/ixYsXLly4cuXK6upqWpmlqKioXbt23bt379y5
M6WwYdtBKu/333+/atWq2bNnU2HpJ5WXOq3Kysq23HLL9u3bl5eXb9gI5Ckk4bK1iUB9feLDidMf
fuyZmd+1qa2viBW0rUuUJhIFhQU18cSqRP2qru1WbNaz5KcnH9F/+y3XZsbCs/JEoGECTNo2z7To
stfnvvGHSX8a+/37ZfGysoKygnhBXax+ae2SPTrv/pf+/29IzwPIHJLizj/B1nIlobR69Wqy5aSR
yaiTLg7quGl195d//N+l55zUIHp/v+nhc08/gmw/od20B4W71jICix+9uNPKhwo277j6q9rKmuK2
JUtvmHby4nI1DHBokKVEoj4eTxocprN/+9O5aznD6/Zx22233Qf7fjl+WcFu7eu/qi7YoqQ+UVrY
4baV6zZXG/DTFz96SedVD8c377D6y7r6WHl5yeLvd3u4y477bsBFbumiffHFF8RYKioqiKKQcSTe
Qg4H0ZglsrVp02abbbbp27dvMJe5K2LBggXffPMNOU6EGPoLCEZiwsQJ6ZuMIMFIvQl0fIPsTVi+
fPnYsWOp+KWlpSUlJSQtdXV1hABtJFHUpUI/SVtuu+22QZBaukWH9B0CNbV1t9310Otjly2v6dln
q549u7fp2rmsvLyYvP/q2rqly6rnzl/13Zwlc+Z+O7DP0t133eFnJx8a0FvfEGiQ3sYbvAJFmrF8
5hH/O+q71XM2L9/8hK1+OLjHnqsSqxdVL/p25Xdvz3nnwwUf1iZqe1X0eGG/57bt0HeD0dSkeal7
e+7cud99952rWjJF2MCE17cqX8/zQwT44rNOWPj9cooayLb16NGRCPBZPzusS5cuNJ6wnpcoZI8Q
WPV/xyUqNqn98pUuu8dXvFbbbrvlS5a0L93xF+UH/xb4XDriBvq+7qqLMsJFZ//+5/M2HiSXnFlW
GI8tixe2T9TVJ2IrCgvb19e1u6dy40FgLZe0+vVrahZ+E//2jfYD60Q+ly1Z0mHk1L6flh9U0q5r
SndMat7isSMPGzRo4LZrOc/r8+OIlowfP56U86abbkr5BFEh9kL7xGeIti1bRggvoYPdunUbNGgQ
kWQ6FcxlSp1Sn+DUqVOJ6fXs2dPBiN4EGg0mDGlbunQpjStsscUWAwYMIMA3MAy//vrrjz/+mIQE
pSYQyOlCTwrtk/zQwAN9k0TRePi+++4bBGl9VgsbTN6o1+X3f75xwszuvXpt3X+7LvDy6ZucVnxj
oy79Jcuq3p84e6sus7bepMNvL6OgxcAI1iMpaJDe5kWAP1n86cGvHdalpPN52529b499SovLltYu
W1K7dEH1wsXVixZULZz4/ccT5k9YtOL7NiUVL+z9zO7ddyMMWvXYHWnhL7/8ctKkSVQQ0svUAUm2
CnqZVDZquH///ltttVWgwY2SdxDg+/79VEV5WUV5OWFL1t2lsGr16lWrK39x2gmBADcK1fXh4vl/
27Pn7ktXv1lFUSBkJdrsX/jNrF2+Xbho0hbn/foXx4EAn3ziIe+8/xlySzXP3/FSnN2oCDAVfP4v
KsoT9bH9itrFO32Q6P3ilwflqERSR3/+85/Xh1puvXlg+dxjWYp8Ltr6mNItB3bpsUmOci38fulD
T/7vzyN+0nrL3rw5J0JCQ3ZEWqiDEkSF1DjtgMNQlzHPuE4kqOOYeAtd3LZtW6IuNLzJTmToMvYq
g7gfDXvSGC+5FmQHwf0ogJxQmjdvHrFfuhb9CHS2a9euu+++O8ZIm7dC11VqX331FblYJEU++6WS
YgMalDcSLQKBmDCx3wMPPJAEKQwFr6sq2xieS33St9z+71FjC8vabr5Zz4oiDkIE502jwNIUaUB4
yudz+/X4cs9de5/x08M3BohaSxkbDoFu8IoZy2bs/coBvcp6/XHg7/t12LZTSadErH5xzZIpK6aS
9/p9zaLF1d/PqST6O/Hj+R8XroqXlBS/tu/oHbpsT7LRSiN2CBNSzdQ127t3b7JGIGlkhNDPTd/U
yU0b7feRjWxYMO15Nom/3vBvHgFevDJeEKfJ5DSNnDRIPQXF1td/VPZ2Zc/7/7xi2UeFY/5+I48A
k2cQRoDzBHbdXkYjbF9P+HiTwgkduy1dPq1dxd6FKybVvL2sz8S/v0cZuzJe6Qiwy2dhQcmzA3Zx
ZzeqEOjlP6cpbbH4vkWF7Ypumflbculoktsmm2xCkZAUbEJiTz9ph4bX9thjj0WLFpE6olhTIhW/
+93v1m1Ft9Kni3x+smnJxA5dFi+f1h7y+c6yPg/XHji95/6x7r2zlYuq6amDKm65+9k/jTillZa9
2bP9/vvvk3wSAcaMXzJ/pL2JrYHGfPvtt8R4O3bsSKRl5syZGMHr1KkTceANbwBzTbCdMmUK+RI0
WZpgwfRpghEEmJKladXkY4ABUj87dSVMnz6dMN9tt902jD53EpiXX36ZikbS4hxFIr3pBJiuREQ0
bTQpev/99w+CtCaCF+7NjcDb70+78V9vLajsQzHPZKV5IZqs5oGpMZHjyuraxQsX7NX3qysuOaNz
p3YB4fUEgQZHgBtepvWIN35QW1/78+3OLC8rX1a/bGHN9zOXf/HEzKfem/Me94rQ1D6aE15U2L1t
j3adOlaV16ysXnX0u8dVVrbWcD5SwWC/22+/PZlt6nAl7exvROzJ/FNnJB0kA09beJVUY8W9tLio
bXlJ+4qy9m1K27Up7dC2rFP7igNLhu2x6LanVjwgPW1ha00IlAy5fNs9e7XvsmzZwo5t9itc8Vlt
mx1LehWv7Pyv+7ve87BfEhoBxuft9yemn21NZV6DvLa7Z/Uy0psdS26afgWN6uyzzz677rorEQla
COf0008/+uijhw0bRjv0kzbiwwMHDjziiCM233zzv/3tb2vw2I33VpbPwT3bdV66bGEnJ5+La9oV
zp2x45ejdhx3W8pnpw9u51nqcQ5ya6XduC1U2WQcab0r4rfEbImHkCkk80fzfp0RJAJDk1fpGiJy
NAGYLqDL6MiMGTNAb1ooY60rWYpwpqm/6DKgDW4G4YNhTwKTNnhvW2+9NTkbBCNtNKhO+IMitq7y
pueWCkLUl4rm+riJ3lMoOGFCFxMOVHCSH+ogIEmjI3QZMX/qF6COADrrVpRo7TiE/K9XCNDU35HP
vvTN0l5LVsVmflc547tVVTV1iXgBfepi8flLaj7/ZvW0r/kz/ZvVNXUx4j6FRYVtKko7de32xcJO
N93+yHpVnJCZ3Ag0QIBp1atvV88+essfFJYULalbtqh2ydcrvxn17Uv9yvouq12+KlFZFSMlXVsT
r6N+kpKikhj1mJTG51bNe+nLl0mPo//S32becgD5eW474JaZTaohTuacl5p0a0M30cIexH5pXJe0
LelZMkLO3pBRp400L3FgLNgADjxr1iwEfaWnPemhS/ztIQ6pXvfb/Ff/cUmzZuXtt99uVKmeGPnC
yGdHvzT6zdGvvE3fbufNZz549al3if42PspLJKshecohN9lOvXQOVXVqui0hf/Ig21pIuBtVSXZx
npW7Ytq77yzZfd7C9vMmdflkWe9JH3T4tnTXRb84feHPT/Yfu8+e2+Oz754D08+mZHDtgJ+EfIMy
1BCGlFpDYhijEeD28frCT3m5F4om/eCDD2iAl8Y3qMft/vvvf+aZZ0aPHk079JM2GgEmX/mFF14g
RzC327d24CIA1ltZzVE5K6a9V9/3NMjnp8t6P/V6n0mxLYng/uKnP7nwrLP8z0XnnMPanCiGaPQc
ZGMtAM6PSNMG7mDGDAgIciZvNZJnGycoPvvsM+qRIVmlVYuIkpFMkk2k8Uk6QsKMYUw6QmaUuApd
sNlmm9GVxF7oCJhMA1ZSDVNz2ihOK3n7x6vzG2rHLXueWBx1EBBcNMWXoCN7h1FNDAWT40RgkndB
JJAwpCFQmpBFIFOeCMaMowspnkY+9p1uWVc40OD2559/ToIE2p+CNboAcNB1P1GLxD7NQSMEGna3
mtXDWUNpaE5pXsOshNtzIjDxky8+n9Np7tLSJSsS9Fm6on7gtrV//83211yy0zUX73jS8E2JDS9e
UbeyKrHHgE5/+82O/7hsAH2u/FXvnbep/Wx251Wrq+bMXZzpCTMLDygtIdZgn6KW4S/NUL0zb6Go
HsnnAYU+P9PjyQeb4Xn5JfHSOZylA25p3sGxAjC3bNthbx7Ztqhtx4qOS+oWL6pd/NXqr5/4+r/7
d9v3Z9txPNjS+uUr61dWJqqq6qtreDWXRKw4Xl9GnZP1137xD+oVxtKvSRvdduYzpL94m3x97JId
zn4pdxYyn6VkKPSg2TfSvBSYRJ2OlD76YmHUsUMHaSUG0t1QvnjHA32TKifTToY/Q35isV7DL73O
tpP7N3uWm5Qgi1yTbsxyEyVH3QH5pAhh/8GRw448/OBDDtrnoCF70fchB+07ZP/B5QdXlp/+4O0/
u5+GCRqdvxkvPhkbPHjsky/OyJmLHHKT5ZQ4wWMvOeOWpISbWf5mEHs/OmHtorLyme2m5y5HPlA3
1zX5VC4v/37K68/OO3Bmdbu5Q++Z32W/xLH3b3742Ud8NO7Hs6Zk1HB19dX+2Yy5XSvgcwzT4Osn
ezrpgOTKbhyQkucGbmn7r1WrYwWV3/K4GS3xSk7wxIkTiQlT2DPpTGK8WHWPplM+//zzb775JgWd
0qp7RCQw9JFtWytwZZfVl84m6r/+yK2PEsvnyf+r3PF37y7t9VmvUx8oPf6Vtoe+v9mx8XbdSMs/
/Phr/qdQFjIpL4q3Kymgb9Lr2Wp0LQB+6FFnxu55NtlIvvTsPbEzjzqUzZBop3StN+OWqyYNHpy/
jcynjdPjSCDJ0pHJI4NIw3f0TdwM7Bdr9mIME6G8FAtNUdBkMTHOSe2LjtDxZOmdR+T0gdipzkSe
2nPePLmi0TbqU+ZzuDd1o7QGRo+47rpTe4669pJLHvq0cS272a6m9k6RHYQJda8TLNTe0TVADZyg
o580PkxHaE4E2C/hRn0KoH+ENk0PzqAHksp46sCJD2QDIypGoyFuCIEcVZB8K/Xo0cOpRHCuID8w
E/7sX/zElaQYCR/aISiouzANgayC1FCm18r5Zod6reR6I3zI2++8P3tJ+9U1BatrYquqYiuq4k+/
vmTWl99uu1W77ft0/OkPttp/986JeOEJw3r96dwddu7XaavN2vbsWnzrg28/+sqq+cvLFiwrHfXq
+DTcXios3aFwbJIf1BT+MkOo6QG3NORfrFG9xV580kjm2IIkf9ry39jk1yzbBWcLGz/6Hjy+sQ/P
fX2uEeD6BFn+RLfybktjy+fVLpyxYtab37x1TI8fHLXZEayIa1d++u2EWXOmL1wwO7a0untVh2Fl
Bxxcvn+8uCheHv9o1cekp9L79pJEoM+5I86M3fvsyxn943VyEK+hg6PpIpEwlI3RbJqCQp4oxoFJ
NbuXu9CNIMDrJNut66G0wt6KFauqq9j2r15dRR9a+4p+7l6575n/fOXLf73b5e5O15ae1eeJPp3v
7JxnsNPLN1wSO/7eEWeOveSG5henwddfTwmfeWvTohXyqJyZo54cO/j6i6Jl9A8999w+edy3/lzC
Ixi0BmxBcY+f3kq5im85+Ntv582f//2SJbyOS8r2xRfk0WU9m3Jxi4Of/Lw+5957PfWjjGqxurbH
lSbq51WyoSFveOjQoRQCfdBBB+233360ZC7t77TTTrTwHk2Q23vvvU866aQf/OAHpHkaXK+BUmtx
uFqnrEI+i8vKPyzco++QH365+ZCZPfaq7bBJYVExddcef9x+/seXiJJCngOWo6G1OOCH/iDVSL78
7L2xM39g2mIw9fulaj2upJZQDtQvA/ZLw5VERYib4fW/2DD8629EmOmnC/Ql2pM6XWj+pI/m9Bp+
yI4utzsedFD3lsh6Upo7nnzdpcN7TXzw4XUTkUU4oI+AQCMOTEMFNFpOzJb61ukIAs3oLF1GPQiE
If1E9hEYRfS4oVlXOx4yvNecjyat42Hu7PVIRcDgARVE3ADe3OUpMd5gv7gecXkUCp6qDNeNILW4
pIYHrGUE5sxbtHBlRVVtYXVtYVVdYXVd0ZcLO4y4efobY6dTTjq0K7nmNzvcdFm/v1+442Y9Kqqq
a94aN+OQ00Y+/Eb7+csrquqK5y1r+8WXC1Pz/PKzeJln3TOVVZXyeebMJpQrPspR0ybcnectMwvF
diSo/5QUzpOj1nzEdQ2zXXcbI1Z9Peen2bdcBPj5b18oidO/wu9rF8+rXDBt4dQjeg0/fFM1vE/u
/cj/7Xnvg4PuwTd2en3RI1YUj1UUlMRKxyx4tQECLKUZvP02WqqZtw6h1+xiG5LENvwz56QSHJxM
O9wkqEix0n1Ydp80LCll2kGIl1PQFJRIi9PQWdBd9MuSAUuP986Rhfmv3XCp2yIzzIcfnjTpYT71
8MP0JzrFB90vXMfp+wnd8JoZvKR0YOSRKG/RZU3CaI1vomGClauqKqvIW9K0aKUB6jyorKqlSXdf
/mLmZ7+c+MHPX3v11P8m4gnyAPKY70Qu4eDjh/c59KLrB6d1qLx8TiRUM5Izn+NU8oXDb3smF7f2
5FMFl1OORDLpF1+cIq19+vaPjf0sJXOWg/TEYzGkgeyfc07Ss+ScNZ8G723+3gIPuFden/ji6HF3
3vP0JVdcj8MPP/4Kfd77YOpb7+XverYw+Dnl2dc8KbWW41Q+TaTdv1b1uZ/9WlpMnsJK6TUntEPx
oqRb3EY/aaNVUseNG0dT5ogY55FyC8OVRVZZFo++l0Il+nvKOAtESdLLEphd8/st9OXkhpNJthuG
p23XLWnOVkX7TuU9tuzUgWcb0jb2za/x+a7bq7/dYRAdIXe7TXFBUUG8GOw3lxfQwoDHUhlwMv+N
xY4fkar1uDvw+hHHN4xGY68gbUxWj+wjjUxi4Ssyi274l1LDgpHY6EqidmQ6Ma+DOAx4XdJDu3fv
GZszNytRc+bNGS2yY54BM0PI1u3BibE5o65jy5mPbul+0LCBsYmfuEszWuQkoysmNM0EIwfp+cwF
LeHmBjbB7kB3sdoThtAJPfpJ4b6ENjUpNw2YGCBhnpez0bO760rwSpdq/qNTyWeyuChcrqxY5V0F
JEiIF8DQAuY8AzIqO+071zHF+gMuQia1CyCrIGUWGH5SmkuES/MAxCGVq/bXH4+rsc18Y76+srZ4
yeryukRhbaKIvmWn8PO5Hf5857QF3y8hZDp1KD/h0C2KCikyqP6eR8edc9VnH8zqUicX18cK5y1v
t2Bxhk7/VEgPva320JlFQ8pKy8pKnTf48jn8c8itbG1m3lpC+/oZUjQzVnhOWckl0q059hI6VWIM
iY7bZWVF6s+9XCQ30k87yyl4aZ4DQp5hmzmqgB9yZt29xyO6KCkKOvmGnI+WPAy5tShjttNKZ3mT
fK7FLRcB/mzFtNKCMpr6u7B6UfXsyp9s+qMTNj+ubTG/zCDXRu9tLYqVFpR8vnp6A0MWL59z9L1n
jrCxrpmjPjvei0Psb2JBjk7/S/preOjk67dPfvbL5/QnYz+58rYG30LtyDV20otAPZFEgGlFVoQ9
k0uavuEuWgKEwpPQHYvIHFrko8EZeu6JpDWvG9XTQrIuHT73Qd9mzx39SU8Omj755AEDY3Pnq28w
6ZOJschez587Z+AA7jWfP2nuLhphfenw2KjrPNvv0qHrSBc/ONdCsYfNfXDUnDxl7NHkLc+7cl9G
7YrinhZ8v+y7eYvmzF9Cn7kL+PO9KI4SekNqIU33qa0p4HXUyDo2TICV/8ZifYYfn8yAyYE+erKF
t4747GhoENlynMqQ/0OJAt97dKZuFpbPJ01ynyFR5YvYaZ08Xdsye6xRpMOMz8ZGwzf6JGHuR6d0
+/C5jInjpslXPbs9t5fbbvOfFePBHzSqfO5tsNU0tsZTXlBBL/6lz/VXX4Id92lcrETLgp+hiP37
8gB8kuahCRuTj3YcOMepxiI2efJkWm+PxsSnTZtG3zTI5jb6SRutHkTDwltuueWECRPySrxl4cos
q4feRoH7Z2oouSjj3BA56aVLs2n+HC00h2znA1FZQaIdGykN2Bm8/xb4bLrg4L9PGYcUSgsTbema
wqiXM2vKLQt4CgOeOX2yN/7LedqGtd5VUZcx1KH1K+eDR77XIJyMlA6ZPIzd+QSGLCAxXsff0MbJ
ByDORteD5qUxNx6rnPhg5l7ZiQ/+J/YTDo4+deCcUf9x3bsZcktDunSRTjc6ORpPzlWw7j17mX3N
ZpF3zMME0yPyzyfyAxCon4tCPGhlO9ohd4L6CAgr9B0AQ7qG+N6OO+5IbwCm7x122KFfv36IPG9g
aGH+a/8ZFXPj6ly6j8xNoOhvz0ugHgOFmIbEPf8hh4uSFavGVAFJDhUQLpOjwa6yUkaA6bi/Jgjt
I9I+uXJzCVIGMaBiOJfo1F3cBbkAyYJhxtpvsseVb1MM17UMAnWJgppYcX1BUX1BoXzzp66g5P2Z
FR9P4eExbDT2e/Wdb/7xgeUz5pX3KF1WXEQua1FdvKiynt+Fnrptsz0sTeHRxm/5V5+642VU814d
Hy5kPzGWOH54gvhh/0vyGXolClrEN+lG6RsH5iMFVw2xs2MLzxzipXlvUZYRQx2tPfMHdX2G13Pu
xhZkiYbL/ejCo4/OzrHzLV3L1HBSqrkIMC98Fo8vqVk0u3rOlPYzXnvrtbZFbaCXnZvrSKDTUIni
BH3iFCYf52CVDGUgTx8b0d9nIuLa59zbjAtLbLTyB+rNHhtd1ufccz2fXT2k1/OKF/WXjsi4jAQZ
b8ptJiOdWggyS7R+A9Fj9Eei7JgGnF5e9ErLBno66RUyTpc6K939oJ+QCxB1Rcd2OUSDwMhCWxgT
8d+Bw4f3Uj5Mv3r1lN7d7gedbBFj0qXtCDOdc+nE+PrhP7ELdzyZXIU8tx/96EfuSn8/z9szXsZr
XMm4CoXYm//ENh1z7ZbVL1pWP39x3YIldTxNqK4+kwglp+v4bxoD5jPX32viwX6quzPHqcyFE8ff
czP1KhltiR5hY9DbbO8CaelJZ15//WCTZ8qSC3pwT+pz7usyJZ7Hz7zohyyJ47bjL9KCEdt2QbvC
fyU8Mr9716Qi87h34sRPbr3zMXxuv/sR+tz5r6fyuC/1khYF338Yd6j5AE52CkqCozW+QLDNfKrR
hcMIMI30knebcQSYJgk3ZgSYM9CicGWR1ZSCNwSRk15qtFk0f47Gm7nR5Y19cWFBcWGcBnhz3FFW
WFBWHKfvfFJtUcCTutOiBh7li+1lpAFuvcrrVs4n8/lfA0tHhhKWDkzMRT5TZw0t0YS1msB+MZLp
6Jw77j+x+0EXgXylByc5oyURvdnHifMvQNKDafAZW3aLnIcJpvublk9EQVMINKLHQep8rJA5jIgS
5nihFA5m7kCkjgRsTGovMnsvpYusP3c4RN7GwFPtOvgho6WbIYeL0pD30pi6wErXkCLfV8T8stwp
pV+QQ5CyJGVD5H7YfQ5AsmCYqfab7nE1Br9wbfMjUFxY36YiFi8qpmXHY/RN6/eVlQzaqf0zNww4
eN9+mA5D36U0n6bDpivrOxxS+sG9ZVfuX/hWnNawKyrq0o5Wbk+bCNnn3Grnesr4LUZ9E+eOEO/2
3jj/ejnOVHZw/fA+sRmfiWU6sxbx0pWv1/aJUSSwhgEPvp5mD1aT8zfz1kK5pW4yX1Yrzm2hN6U0
3n9EFDw8diy5LO4yoleZjN/LhTJEVMcepPLz+CU3ZKCyDT2ausIpk1Wvn1ubnu1MpSMngK+Xkq7N
LZd1H9rzEDZvtbWLaxYtqv3+f1uOO+3/zoQJJA015bvPJn8zJeVDpyhomkQhVhjbr90+mUviFsGq
nLz9VUnBy1FUG0XTYUuN94qSnHzVEGbQ+bFf3Abem+0VTQhmpiI3+PIoaQMFtBYF3krvyH9Gre0t
giWkl8dyveAkOsLROxFzjc5133EXNfvMfwcc1L0n+DBr1112tPCmKGKHApC8LUpn/vy5yU/kvu+8
N/De5mK/+tiEvF5N3gBxyPu743PQe7vR2cW1c+fXzllQM/v76vnUBbPtf7ftdFentre27XBrh9o6
XkAlNeMzyeHj+GcclzFgo6k8WILBPN2IlupejlPZkGEGFEudCszyibhPbESfXD4Q1cz89wfn9u0P
D9Uj66nPYWLBw2icHPrnsiUud3oFixiwx3+zZCz13rzlIJ8L4wX/fnQMfSjI+c13P8Ud2ZZ9dgHS
eEVwA1sLg++qUOIFhPQy+EnCE+PoX+nGyHGqoXKkn6dx3WYeAeZmsNZlNaVgDUGUjKwXBO00f44W
mrNdNFADcWIUiTZxMlMxev1ojovL6b0G9MY7junNY2WHlgU8UwNPynqDFzReLjPdQWO5dBhThGga
MG0weY4PpwfskIl0pI7GgTPng7kLxnmv84Ohks2k37nbHMVhsyhbDoucnwlubD4JNzJkk2SjLgOK
+KC+A3QcODzdUDCtykkdZLRqNN43QUzYLYycioIu9MU4vuJiu7l0Xif8pdf54V/aj46E2A9pCJCG
vJc8K4ZC6BESj7lm/pAvogxcOhmpvntzUurjsghShlxxzXKHQUq8fHZAsmKYofbXzOPKE8NwWUsg
UFZS275NLbHfgqJiWpm9sKT4pKFdbr+0z5DdupLELl22cvK0r2ERfv3DrU7at+Tyjo/27N3p992e
Kq6dW1hc0K3dyh7dO2XI2KG3JU39vfdoiWE+NOFYK+YJnzmCGaCOGN8rkcxZo4Jtbu3Ywv4S8OwN
BSMDwmNjieESzAxqzQezTz/WucqDYxI+ZDeCnydtDT96xLlZrWZ+pWuJyk1PM5cHMKDTTisSK2I1
9ZU1lSvrVi6OLQYHZmhiiWteue7a165P+fCp4vrEyvpltcu2Ke9Dxi9nMTCoArrCs728UNI854i7
MNN84crxgmJSypQKApBoB2tRpGzuMWS6aJ+osmO/FMKUbybyvU6UNPXWkj5lxUwBWdwNzr+U//I0
Ey+6KcvALgVM5/vEzNc1M/uVh1BHCi3p2LZdBe0vvGD2rHMnffzrt9/6xTOzq76et+q7BSvnLV61
6MrDT73kkBPPG/KD0/Y8mIIKFizktUNSsijrvXgUlBmojYZQtHG2guc4lR0rGWlJXw0r6tHBSsLC
nywam/x4HvFlD5X4MP9yZD3jgyiWdLI/1Jwx8dQ7zf9NGR7K6941E42ku//6x7P+/qdz6PPX/8cf
nMv24l9c4z4NZqNFwXerQFc2pkOtwTzncwHN7CUHl16AmXEEmIZ/iR6/99575PvmNwdYn9micOkz
UmU1n+KmX5NF8zfQQtdItmmhRpppQd85clxcSO80iNF3nluLAp6lgUdZoyHoGC+FRRog5i+nl2fm
87yMlrOCcaRFjOmbLCYYb7YhO7y9FvNayVBS+G5W8kbJ6dJUGIRs+Y3MotePnOV5DZrgpuQTr7ol
KkveBa2BhzchUTg0BYDQcUBKG83GIp2Ad01hoBizf8Eesz+YQ7ySF/hKWgKbp1flFyTelLLldw8t
pAJmi9m//hxgEGBn6HGZ/00/m0OQhCvL/LP8Zo03BsM19rjyQzFc1fwIbLVJ127tKwtLSwpKS9q2
Kz33+O7XnLXlzn3b0aRfmrV31X0Tz7zms+8XL6Xhm7YVJb8o/W9Zm6Ke+w8qrSj6cd3DBUWxzdov
6btV9lX8mAY/g5jGuAyP1F10Pcv3vc8WSfwzKKsMh06u08Ea5rduxm+mAruBYhkubngyaFbQEINN
Yc9g1KUWhu2PKiff3KRHN650zV/Ffoq5CDBFqO7eabdYTSxeQ/qodlXdynmJ+S/0foM5cCL2Radv
H+r3wkPbv/BQ/+f+s9MzD+3yzEO7jvzPHk/QK6Nji2M7txnAC29SFEHDmwwGyMwmN5zLv7DxmF1m
ltt/xOsSNJq8XlbDj8t6BeWWllqFOaeL6M176RtuBvslg+RWsKCFarAwZsPP96Ye6cVp/YUuETa/
c+dPmvRRTBgvMeCJn7xG62ZqpyPfGIXsuB7t1DykPXHd62cy34lEWTmvsUq5XZ5YvLhu3oK6b+dW
fzOv6utZq6dMWzlx8opxnyx/f+ryibNWTv5mFSsLCphKC6rHorQ6d9zeZGPRx2nCEznVOU7lqkKO
oqY1V0e5a7LLJzPgydNfJodUGC+5sPc+eyvlNmXsK8PT3DpD2RNPvQsOMj3MzS/O/96GRXaNrmjU
i39zPmmtgJ+jZt2YZDq2acOV+UM2fvx4ori0+kDGOcB0/Jtvvtlrr7169+796ac6qJ5f4msFrmzr
t+UPUd6aP0fjzQ+Q6CrqwKWeNLxEqLiQeG6skIKW5CMBTnyagt0Kda5Gnsm3JODpDTwlU+hwO4dX
w7domDyz3YjLaLYqrqZX9ZD569atG1bDyjhMR7oaLxTE2CZtRHswhpx1a2BNrLT7mm7JJj384MSB
wyRMOKdFbsAENwK86NKuXbuSqwDQ0DXQt29fInVYLYxWGKEJVjR4QBODae0rIsb0E4YP/gZdkHUs
HQ+R+bDakZBeOi/PSXHlbnQ3ByCN8V5y1nN3TP2la8D2/a7t9G5uYAXaTyCQu9UAAtkEKUVgEDbt
sKI3z/mB9jkAyV3v66HH1SRB3Qhv2ueAA7btPLdN29iO25bceVGPP5/Ws0v7AlqrfdKMuUf/9u3b
3uowafmW5984fuGi5cu+nJ748IW++/Zrf8xf2u2263HtP9uy7q2ieM3wQ9LWqnz5nKwMVqfa3ivB
zGcmogmefWpfjwKbwZZ1G/sZaEaCItJ4u7fQ1n+I33pr3h226XWLGOxMm81Sduea8mjLtiSSvXRr
V+ZyETayVX/u/0d62W2cFqivSZCiqovVLq9d/vqWH5z+759LPutp+d4YMd4i+tTLJxFfSbPI4xf0
PJc0eEOEcOatZ9qEO07NiK4cVhzQr+6tiHWrNxxPQaPCgZtnCWhSr2RyWLASCbLZtFEfLdboxzey
lDL2C6VMJg2vBW64+niuLoXTeMtJ+gtWpNxPenzOqAdHgf+KqZ770Ue6ABYutcAwXvciy0AvnugW
EWHT33A2W/QKin4uLS0qLSkqLeUukmV187+vm/NZ1fvvrHz6/ZUvfFXz6bLEvFhhdUVpUae2bbq0
a9epLQ8UZ9iE/6Z4fOwK4sUgKYMyvOiapZHjVO6Sy4I3l2STT4rlPMe0EXGDsZcc7RxSogSTn4wI
qv8UCv33RJhjurHMTYrw+4mnZlIc5Ku80Z9G3NuiVR0lnvLi36Y8tSXAz5aPdADPpIm/8q6qHKca
WSrSHrvttluOEWAaGaZlcjACTO9GalzyLQFXNllFztxa5o2DKKPml2bsXj6W3ngjte81usYAJK/R
jd/9n4du/dc9N9+tH9q/9tZbaTkTmtJFbKMx6VEvVwsoB80BN3DSJukL6Pka7d57vdkgjct6XldT
BzGNXmJWKkXtUp8vLYSBN8Cn3E/0howpXYz3JOEFNhl4C03g8YJQ5782emIMyztm23hWrgX4plmy
POcJ86whor+n6kBobovcsAnOCzr/Ino3MkFBbZ+QJAyp/4vYL973S1j1kY2oL0VH02rJ5FQQyHQ9
pUAYEkNuuB+B1gZxJj+9dA97Q+zRSDGDqS+kygFIg95LflXQoUMHKrgb6/YJcEofN34SVugyoCtp
ohH1CKQS4KyClEVgJj3sBz9HYcx5AuJjmF7/65/H1WgZ3Vhv6L9Nj55tV2/edkGvTiumfff9Dc/M
uuqJGX9/fMYvbp8xtaZfccc2Je1Lxi7s+ed/T3rrb1d23rx9RWJlQUlZ5w5VW/XreFbBE9Rl2qlj
23Tw4pf0t7WadXUoHewlKkgLHmGjpaewg+WgsZKzuKwazGyMl0KjmVEfehFGiV3iJZd81vR6s/hn
zCjWz2QZoNZZyl7ajXm0Y8ua7Yyl03WhM8R7Y61pfwXs0rLsq1gnl58CZ3JvrFNybAd0379neQ9i
v4lVdbG6BK9ZVF+9ILHgzS0+mNNuQaKgXtYJryPqy8uA0ysV6+pj3yZ6FHffo93uFMADnZW8EZi2
CBZNmOz/9Opbh/EFvc+55zqsAVRWdmbinqdJJvS+YbeufpoW4NUplk8m+tgcEfnb+5z/4ew5L+Uu
SsNnCTr0WPtd2v4cJzrlxn4x9ZcKiAlOZJ/Qt52hvGmH+v/42ksOk9Ab3q77aOdLfnNgN70qNYX+
O+1Ci2zs3B/nu/XfOTZnzi479cfV3Q485TCsHkLrXiRO+Rldag9LTqf/jy9xF1768U6XHNared8n
TW8rzVT2DJjTZbff/8zo199/7uV3H3v6tX8//hIdmVbz/murH5hRPTZRsKpjSdsupe27V3TsXtGh
S0W79mWl5aXFZaU8eSw9uZdohbTBPzysd/KZ3of9cDAFlbBADLt1khOrsmePmnQdKQwnV1lPJSWX
9uBhv+FUMssnRfFv57Iz7CiSYpc9ylVs7NgzjxJxT8nwNv2jRuG3Csq/J/x+4um5OupMWubAxyL/
e3O3jfwrNyUdp4syvvi34QZJV6wF8DM9BXkjACddR0s/m+r54aT/naOiluNUep5zlPTKK68cM2YM
rfNMa0G/8847tNjVxx9/TLP+aMofhZ/Q5MCJEycS+yXnmDrjRo8e/fvf/z4XbmsBrt5ZZTXBDUPk
WHRxvhBl1fyk2nM03iztoiGpgkzS8lelhfGygniHI3/T4ciL0j+djjif+jKLC/hK3JI54bUAuD1Y
tEksVX/4GeArzrzCRDRD48kOTp5tnJ5GQblYsYmWwMBLE2j0koaCiZBQ8qArOEh9N9SJTBSOjhCv
69WrF1FlTH+Ntm7derilm8gWjurxs2t/rNYtGXMraLcDf/OzXfSWZEvW/+DDZFbnpQ99mlZQXqnZ
vXbw0uvmDL32WvccujiXRU7kNMGiPfzH5WkHaWoDCDDGfgklTAPGDCwQQsKZ9AAFSJObQegRbaZT
tENQA+3kLcXkExrU6/3qPCmdg4z9jR7qTVDWex32sx6jAcyDE3f5mfNDcgCSC6tcVZCUWSoy9evx
EjM15FzqauHOXqQMCOM4HcSMM+pYIV8L3S55CFIWgenWwzwwdsCczOUAJDOGWWq/pT2uhvRcON9E
BKjP85STDt2r+2djvyi9c3zRHeMK7/iw6F8TS76Ib1HSmTqfSko6lVS2bb/gs6nt503uu0PHglpe
OrekfsW2B2w2sGLZkJ5VdbUcMZv0+GFHJS/lOrh20uoa5wj22U7m9Q2u/Y075JoC79Q9bRcPu7Xa
yLKk37vmf5Nq/ffjnnkUL5PjuiNdJpJMWEaDNqOQhl04Fz+s9d3p3oeBYxeKO41uzsY9mq5OzXaW
0iVlMsIv42p4yfhmreuG+G91HEsfZ9uI8E5fMWPIG4fUVNVUldfE2xTSa34TFBlWXMBLPdNCIkRM
SBWX1MeJ/dXUxb+PV3xT/nCfB7ftsC3ZP9JWDUSq5Hj2ujhFQNJSE1OnTsVb15EFjPGiLHh1O/3E
YC8pZRoZ3nrrrUmbU5ctnc05OWddFGk9eybZPJo/5vfy9n1qW7caa1FhwR9OGk6LXZELQNdc+/T/
6mwFmqJE0cQjJ/TswV7UelamkJ3MCPzhz3ecfOIhdI4IMDm+JSVF5ABvscUmffr0poWv/vyHswJw
QOCKK64g7zYjGqRzSAkTepdddtlGDtfocyuu3u7T1/Ja8j8rVH/9x+PHHrlXz26dsZ5ngxt5MnMX
LBr5/HtXXnxigxdvDBeQyfvggw9mz55NMknCSdSXeo3xCh/yNkhpI46XdojUUaQ0Il3JXNJbfEjI
qXskrzipDR1K8jSon4ucDRrOpcBy6kqgTi50qdMbj+ibTtHgOcFAONPcYHIz6EXBBCwRZho+zSO8
br1GkIpP0vLiiy+SN0VeE5WR5AQxdHC9nNMF3xZSRLeQvFEXDAkSxd43uyBNeuTyMT0u+c1B3dZr
7ELmWh6Bfz/x2psfLXxz9V4FvdoXlcX9+BZEBV3/+jH9+pT2275drLay7tcvrn7wxLadiz5/4+sv
Z1Xves9LPPiXe66HV4TCcytK7iPmeW3la9kXjmr5Im+QT5gvr5GlWSR+6Whowf1sgADTdWTwxs57
/9hxJ6yqXk2rgiTaxBLltNRzQaJUCDC/9TeRiNfHqxOxpbE231Xc3fv2AW13olipltBQa6GSSCN/
/vnnFH0EXewUsRvy9VUzddnS+znJPlFhW7tNWgvY0iPImKX079IrlAEpndrxue2vP/mkGiPAIx4f
+cnwT8jqw9SRv0W2v3V1qawdVNfPpxABPuWkoZS3WbO+CQR4/ayjVpMror/HxJ5edeuwNcvx++M/
H/P6R41NY+iQXfbcbdvG3rVBXo+RSYpKoH5MLHtBto9YHPl8WAaSuAomENG8IVLsGC4G+0VQWLPz
ltaIM+wgzf8n6ksWDYFm4H4UEU07X3/9tZs7jQsI7W233ZYwpK52UOXWWHCXZ0Jg+fLlFP9CEgJB
8gkwXQaPiy5DpDT1sNC4Mb0SmeSNdlpisCEQ4FYtUc2b+T/f9MTsBbXjqvZY0blHm+5xWuCqgJaI
iCVomYj9P3/sp5/fMujQraljpraovODnTy7792mdu9fXFRR9ePeHc3Y56qALR5SUlrn8lFdkmcHX
vDneyFKjl843WGLSoriGes38i2m9FfyMOyWbLS3EA09eNOX490+aWzmPlw6h2uwYj9GSyVTFhbKc
yKpY4RcFFPl8R59b+1T0xtoYrVRHU2HJchMB9jkwdDFKBLZGSpk0Mk3OoZAkUscp70NqsGLCBQ4B
925DOrLJgz1uP+V0GgGuT9AIcP15j/5n0pGTunTmBcbgHzj8A4DrPwJ//MudOQjwn37/6/W/CCGH
6xCB0ee1OZa6xnU7Y+TKW9aQ/a7DsmxIj8bwnSNv4C1E0khL0z6oHR1BeBR5AjRoSZyNrCRdEyKk
nCRgYJPmPsBLc528BBftz5kzh3wzHCQTST2/NI5BYBIBbgnut/blE0O7NMr95ptvUkmpUAjtTvEb
QX3pICFAXixFENDE8hYSpMmPXjGmx8UXHhhGgNe+OKx3TyTa8+Cjr34+48tPV2z/SVX/wg7F5Z3j
JW1i3evmXzn6x7sf0K1TeUG8RKNEV8fKKrZuW1dUtGTm4vFPTe945R077bZ7g0UqPK9NqRi4upEr
q4JtaxCvxl9AcTS5b2qYAHP1yMQeooUvffXydV/949PVk0ti9ALcElrKqD5ev6JuxY4VO1zQ47xB
7fagPmBan4CUFF3fwHqPjS/MWruD9DKZHCLANDcPlsn1TdJPvLaOdijymdgv2ST0XwbTvuYV1O2e
zvf/9Nc8CYqWIK9PnP7Qvz47ekrXLt1C2POaY7v2U/jjX+/WkY1M0aaBAK/9GglPDAg0CwIgb7Qw
G95MS3YfRtANS2LhK5oGRQHSeBkSIneClfTxB4wUT07OBg2HEjgEI7lPtIOgX9oIW3IzyK0CjBsG
+wUI4MA8z276dAq7o14V0GAHEcwH9Z6QIGEOeehGaZb2GxLJE4FFi5f/884nq+rql1e3+2p5r7mr
uv58+S1D2n686+Ae/CbP8pKagrK64/+15PELe22Z4EUj4vGJ937wVZsdDr0u25LKeT45XNYMCNDy
opTK7rsndUZ8+OGHLml+F3k+z4EmIlVFNJg09f++f2Pq6mlEgIe033/r0q3oFOkmTMwA723V8Tmk
lKGdqbBknGjuDV57CPtNLyGgIW6sQwjD74Ki80EyXJMDge738lqXzjrW1iYm/WBSt66BAAepCQgE
BAIC6xECGOkloksmcuHChXhXLSgc3uWDVwMSnSPfAF5BYL/p9QcSSNCRm0Gzgcgfc288osFeGu3E
S48Ixg2ynx2+FhWZBIne90YB4eR0kZ9Jx6nUWC6bfC2SH/ItSa42JP6/HjXmkJWcCMyZv/SlNz/5
as7C2NwvD5/20E77b9qhXVmsjMYBS2sKy2OFxVV1sfab00RQfo3eshnzJz0+efcnxgdQ1zkCn3zy
CfKAVR5B6+ibpvDgZ5zYbP65xGoWpK1oI5WN17iRViJVhWFSsogbzBRNWCasykjWHa9BwsRmLNvg
InKDXc9fhHJfiaVTIFfYCOqGX3vYXI8P6QQEAgIBgYBAfgi4VySQxsZcXxhNZyLhGFBirbpDPD8w
mn6VI4EY9cUq0AANI6L8CimJLd9QYYTYYFFoRNgBE7hY1IGCBVYwDa3pQIc7AwJrhkDlwjkTb/5j
25kT66vr5JXxvNE6rbykov0sKi/+quOWh//zsTV7VLi7GRCgeToulSFDhkCrvPHGG+5g4whwM+Qo
JBEQCAgEBAICAYGAQEAgIBAQCAgEBAICAYEWQMCN9CLtoUOH0qp7/nPitPh+Czw3JBkQCAgEBAIC
AYGAQEAgIBAQCAgEBAICAYG1ioA/2JvxwXF6zfpazVF4WEAgIBAQCAgEBAICAYGAQEAgIBAQCAgE
BFoAgZTx3vQnhBHgFkA9JBkQCAgEBAICAYGAQEAgIBAQCAgEBAIC6x8CcVpzaP3LVchRQCAgEBAI
CAQEAgIBgYBAQCAgEBAICAQEmhkBXqExbAGBgEBAICAQEAgIBAQCAgGBgEBAICAQENjgEQgEeIOv
4lDAgEBAICAQEAgIBAQCAgGBgEBAICAQEGAEAgEOchAQCAgEBAICAYGAQEAgIBAQCAgEBAICGwUC
6/sc4Oueil5kvFFUSChkcyBw6XG7pSTz9NNPN0fCIY2AQEAgIBAQCAgEBAICAYGAQECgVSJwzDHH
UL5bAQH+6+kHtUqAQ6Ybg8BvfvOb66+/vjF3ZL32j//3RkYCfOyxxzZL+iGRgEBAICAQEAgIBAQC
AgGBgEBAoHUhMHLkSBDgwiuuuGJ9zvq7n805aODW63MOQ96aBYGXX3552LBhq1atqlmzrbi4+PWP
v9pn+01ScjV16tTtttuuWbIaEgkIBAQCAgGBgEBAICAQEAgIBARaFwKODgQC3LoqboPNLQgwkd81
LGEOAtyvX781TDzcHhAICAQEAgIBgYBAQCAgEBAICLRGBKZNm4bxsECAW2P1bYB5BgGurq5ew7KV
lJRkGwEOBHgNsQ23BwQCAgGBgEBAICAQEAgIBARaKQKOAIc5wK20BltBtr9fuurBF8a/88HkhYtX
7LBNr769tzj1iN26dKjImHXMAV6xYsUaFqxt27bZ5gAfeeSRa5h4uD0gEBAICAQEAgIBgYBAQCAg
EBBojQg8//zzYQ5wa6y4VpPn59+eet5Vj02Y9E27jh169urx5XdLxn006+Fn3+jVq8e2W3RNLwZG
gKuqqtawhKWlpdlGgPv27buGiYfbAwIBgYBAQCAgEBAICAQEAgIBgdaIwPTp0xECHUaAW2P1re95
Jvb7lztf3GLzHmecdwLltV1xvKouVlWf+NeNj305fcZfLv7xkfumrkeFEeClS5euYdk6dOiQbQT4
8MMPz5b4C6PGTP2iMpbI+fB4bLuty44YPnQNcxhuDwgEBAICAYGAQEAgIBAQCAgEBNYyAi+++GJ4
DVIzYj7qV/HDYy8m7hrejGm21qQo8vnws2/ZfIvNzjzvhN5tC4n9VtclahOJlbWx71bX/+ufj875
+osX7r40JRZ6LRDgww47LBum/7zzhVNOOLBbl445QF/4/dL/PPHab359RGutmJDvgEBAICAQEAgI
BAQCAgGBgMDGisBLL73UKAI85sKO1/WbMPqs3msbsOueGp/hPcAzbtqn74XvIi+/XHu8k2ju08ck
s9wMh9Y2ROvb8254+K2Hnnn/L/88f+s2hW147DdBn9pErDDG33MqE7//zc2nHL3nRSfv5+ccBHjJ
kiVrWJyOHTtmGwE+9NBDsyV+450vnv+ro88dt6LTq3ckEqkDwfF4fMWPRvxz69qb73rmwl9nHUZe
w5w33+2zn770goe+jMW2OuWm645JfR9U8z0mpBQQCAgEBAICAYGAQEAgIBAQaC0I0IxLEOCCDDme
dccwohHYLhyz3hWJ2e/jJ04nnsLb9B0+H7W2sjj8mF/e/XTS00Y9ffcvjwnDvkkVMPHT6Zts0jUe
i1UUxVbVJvhTxzuVdYnCWD1dSmc/n/VdnpW2zTbbdM20bbXVVnmm4C5Ticn0B9csLyigk7/82U9/
c/bZ7nPxuefSQSpOQQE3lhyJrEentMxrmKNxt5zA26Ujv8uUUO6zTXt0S6TZtJyEuwICAYGAQEAg
IBAQ2BgQIN8j3dNhh+SWca26+BnL1apL1AyZd6QgjQAT+9115LETaCiOtwn9Zqx/DDgW2/vEI7bR
ImxzwQVGQIkZ01gdbfvcNANnaXx2n5tGyeF9brqJf+gJnJEfDdxlN0h6qQzY8d8oucaysg3v+q/n
LOrQqV3bIh77XV3HvJdm/9bb/NqKwljHDhUzv1mQseDpoj1x4kRa2DnlYjryxRdfZGwHOfBskADj
3tqa2jdenUGfN1+d+d6b3xQWEPmN1cZi9fXM3puh8bV8Evlw/hy5+O7py07k7bo3MxHp3GebVriW
SLNpOQl3BQQCAgGBgEBAICCwdhH44NYTL3s6Y2f72siH+DqpD9r9nMceO2f3tfF4e0azg5CxXGtY
ombP5Brmh25vXJayE2A6M+jYQy3UufdZZ0Vr/szUkeFhd8xy91NstG52lI7YsDHt2lHi1XzUO9Jk
5rfNESfGLuwbcVlNaNSv+l6444sM5PQTHz/VMd13L/xr7EE6+M4FFxzzy3enTFdm/PTdINEN3mVE
G/cxA/5rxKKfnnTjpWH8N6Umd+q32ZzZC6vqY/U0cEqfeKwknigriJUWsHrhKOg53/ffpmee9U9c
d9y4cT4Hpn1awy3P2/3L8iTAlPEjjtqZPpsd//mTP/8BpVAXr6usW1Vfz6HRa95S10YKmYhrY56b
jG7qnbnPNuY50bUtkWbTchLuCggEBAICAYGAQEBgbSLAgyRr83nJz1q3T3d5afZsNHuClNWWSHMN
a75xWcpOgHsfemxsxK4+x9Vrx424LnYnDQo/cdq4ETdjWJhY7QlTrsJo8RM7jNhViO/QI0574AU5
P2tGbFBs5MvMlme9PDLWr08TSEumW7a54B0muX39sd4YDcburWyUGfLjL+jQ7d43PniBktho/JZH
bq/kw3nclZwDSuNdTXvGTX+dFI1EN1PZNoBkem+56ZLFy6vredUrIr0VBbE2hfE2hbEiZsMF1fWx
xUtWbtare8aSLsu00ZuNXnvttTZt2tAt9D1hwoRVq1ZlvJIO5gAwTwJMKSxatoQ+my04ZN9XR/R/
Yct/b3XDix9suuUTPSaVvNvkZvrhbT/CdtuHksZ3z1yB31c8o52e7oh/MGH30W0uiegeLx0vcQdC
lNvMiWe+nYn+fpc88sglNks7xVLkPOs/SAtrh6ik/lkFQhLP/cQmgx5uDAgEBAICAYGAQEBgvUeA
/Za0TGb0eugqd/yKZ565zfOIshxP97f4Sd7F32Z6Op2HfyY7H6rP5nsuUX6jjJqP5z9Aj7kEs1ZG
U0EQLzJTHrKWC8Ux/7NBnPVKBvK6t2JfPnKR82W9smQEIQln9XY95FOPJFem84+z10XuLGVCOjsB
jvU+a/SSCceO3JUGdpNo8KCr7pQ1sIjgxqbMYFY75uYRMT1Ih298Qolvn36D5DyT3mOPjU2bSZfO
nBaTYeWhNy5pnpW0mATLWG/f+K9sVu67FzInps0tkJXChowBJ83cbfCuFAZ86Y1g1zNeeDwW+G8G
vnnqEbvV1Fbec+Pj86oSK+oSBbF6or70qY8VzKmM3fPPR4sTy08/ao+MTJXCjDNunTp1euWVV4j9
jh8/nio422WIUs625U+AkcIx7x78p+lXFnYrL+pRQR/aeanTv4954pim2ZFdz7oYfPKtJ56ZTRrh
6Ue+5F/7Xfz3o3olErOfueLHF+OIbF8+cvGPbwdT1iNvXf/j69+KTt/MiSQ+vD3pLjotd+hNskdb
1sQz357oddTfHz5rV/doS0bLnets7vxQofwyUom0iA08sWmAh7sCAgGBgEBAICAQEGgVCLD7ksyA
yXW5/usf/eNh3i7e/JGLzWHwj5+XePctuzHb8Q9vv/iRzS/mVP4x+F34TuIXucT9RHysXJbYJ3si
cR7nY7+3rrd8RJfOfub9TZFP74IPb78+Jk+lTTwq9sxSy5hSNU0C4R8/3ITSzZiHzE+MimP+Z4M4
K/7s/5EruyXXipbJlSBzBjyckU8f+fQjSRXto5G1LnJlKbPgO0c70yJYMSHBNAGYaXDuVbB22CZp
XWghvjyGTOO+xH93OOKsbXbg4eAxLzyQcmUOntKIU9tc8OCNe7t1qfa+0VbG4ojn5NhlJAoGPOPz
Sd7KVQ3flZwhHV8O/DdbPVVWVZVttcuE+RX33PT4gqrYV6vjC2viX68u+Hp14p4bH/ti+udXnv/j
lHcg5VPltBLWRx99VFhYmM/FGa/JYQPSr39hzsjZNXOKupTVLa6qp7HsWEGcnt2p7KOyT19757Um
mZNdf33Rvvygrx4d+eGH7wuZ3fKko0Utfjjy0a/k5/UP8Ybr3noSilozh5PXn7Sl/P7qvXGzE7O/
/Vp+7HuR3EYnN0HO9Bb8yJp41ttd8ZBOttKmnW0oP66AVoq33gfJj7bcT2wS7uGmgEBAICAQEAgI
BATWawRSfQ1yXWInnXdUT8k0+0/qMCQd73nUD8lfMlcnut4//v5b5mr13H1wjH0n8YsyXpzqkOhv
cl6Qk1332Df29bfg0NHW86hfaz6TLki9ctdfP/R3uy5LVTQFhJ677kpZy5aHTB6cKw7nIi+cPfzB
49O3jBnwE0c+cx/xKzr5Qe6hGeuiMfHzzuHPTIBxuvdZd141SMOZs7AODAW7DSy39zY7jJs2c+a0
HY4YyuPFU2aMmTHlNNpvpm3Ur7z5v9OnvLv3Dn0pZY5NvvC6hhaEljm8pz6+o63cnN9dyRkXBnzd
dZnHf91qWOk7zVT89TuZ398z5si/vzW3ssPCmW9P/3Q8vfHorhseufv2Z676f/fS/jezpv3poh8f
ue922Qqx5to5Bzx5jhuXFBXTsld/mnJFcY+K+uXVc0+dc8mAi+oWrqJ9Sryoa/kZc8/IkVSuUwN/
cKLQ17dvuOFt+rPliecc2YOv//B9/kms9rFLTuFNztLPb7+jicfKZvc5Tq7tsdueYMCxBP3Sc2/f
cMopt39IJ488ciCn5whwA4lnud2KYI/mJ6Vvmc7mzo8rb1SKb7iI0Zb7iU1EPdwWEAgIBAQCAgGB
gMB6jICwnaT80ZHNNhEXSTb6CYch/ThuzHHcfKtTLnnsq9wXpzoklrLLW3o++ZbvnvmtOG/qv8ld
A3/17+O+FZ+O3bO8tiaDkC0PGXObcjB/nB3+KTWlZcsEQkri6dWUseLSH+Ty7Gc+48GGgXY0IY0A
j7nQC3yeOW3coOxTd4ncjhvxa10Ra8yFJzxgLJdZ73XXTZE7hx6xw4gTRjAX5q05FsEafinm/8p2
eOxFHewdfteLv7z7cD2ctkSWFZgZ77uO/xJvzuuudAZ89907yiTisBkCM7+Zd9Bvn/9kUed5VZ2+
n/jExw+c8/ojf/vxUXuUF9Z++/XX225a8aMjdht1729/sH//dYVZDnYdi9Miz3SeZtLH7/r3f278
1530o6CwMF4Qb1vU5g87X/nOj949fLPh9Uur6GCCr2za1vPIs0GBedvn2CPRtTn7O5l/kmHjs3bY
nuguox4/L7l3/vnTn/70yuf8MWPpEsuReLbbXdlSH53aN6pM3B3OJz+4uOcmm8nNX32X3JOa+4lN
Az3cFRAICAQEAgIBgYDA+owAW/9UH+Nb30OIER8WnykWSzmuN2Y/vuWJ1/yfbX+B45XtYj8LLkt+
3tLzmRh/52Xv72lPuHCfqCADf8VPvTD2T/XNGsS/ySBky0OG3MKr9LKSBkU2nN3xTOOtWUBISTwd
+Ux1keFBuesiYzGzoe2c6DQCPPR8zP+V7YTYE7mm7NKMXl77CpfSalg32igvsd5xmPQbi9GU4FgO
Fp3F8891GPN/dbsrWoV5+F3uqCPFabHQfJF3D1PgPO5Kzo5kIDURPJJSy7bThJK2plsu+ueT7Ttv
9t7MlSuXLfrrSX379OlDcc6X/OSAR64587V7L7r99z+79GcHNhj53HDXTUNX5IAsh+qhd/zOXbDo
gd3K//bbS//228v+cOkFRIULiovp5b+aYDx2QO8D4yVFfLAxsRbJD53z3G2Pc6yzbO/ceNd4sMFe
YIOxfS54MGn75UBRDdg0peQJvj2P+DPdcc0JW+Carx6/7bk5yXOAcyae8fYoy/bgzEHQmc42nB+k
Pue7b+T2LTahCdBJihhFXYerQTZoocIFAYGAQEAgIBAQCAg0JwJpln/g7vvApeFt/F03vrPP7uwS
JeT4s/Ce5Li6DHkdtxxnuzjFIVFnJONk1CTPxbyWOc89Zflx53ttsgX6+sff9bMrtTxZkGsSCHPG
jyeQolv9PGT0p5IP5sQ5A/7ZZjJnzICPM/KZ5UiGBzFuYz/k+s9WIm9icCPcRkcT0kOgMf9XN6O0
/uJVSQtZ0Q/dkpiydw2n58412yJYrYkabhx5vfD4wWMnfFxfU1U17dnTT/1p0wrdEL1t+HyO5+ZQ
1X02jT/13Lu33/f8rfc8R5/7HniVxn6LExQLHV9Rt/I/Xz58w0f/vPy1S8u6d+CDBbSedVO2Oc/f
9oRM2t17771BgUc+L7qdmnnSb27vz9+Fc/YCZccJXQmji3oc8eerjQMzdfQuyZW4PSP1diubPToL
/02eacw3ZUtQ8/P1E89MQNoTngEQW+y5Ww8fydxPbArm4Z6AQEAgIBAQCAgEBNZvBMj6f/3E5adi
+724PwN/8cAFm+mxm7454epfCP/l41ef8M1NuPKD3S9gd6qB4xfs/Y5er0lnT8RDSRwS54bpCXfQ
u3DgUTRaiLzfFtvT8jPhLi3N5e/vibxnujepVpoGwuUfxHokMuch4xNTD2bHOSP+9qS71J/TEmTO
gF9Zks8k5N2RjA/qccSxe0MmPFT9zLv9LFnKIvHOQ44TfW0aV1k7d1331Pi/nn7Q2nlWeMoaIvDu
2HH3/+fRK35zDg3/Njap3/zmN9dff/3UqVMbe2PK9dttt90f/++NS4/bLeX4008/vc8+HJmS5/bG
2Dd+ueSs9lv0WPHtgoKiwuK25fShe5d9Pe/ujnccMPiAPNPxLpvwr9NveZdZ3wl//9PAiX/8rXBA
/nF4r5id8y5PObP3eff/Ylc6PedF3JmUirtNbop5l1DaWRO366KH4pn2iJQiag5ynO2lD05JMP05
eoGVyRUq8xMbD3W4IyAQEAgIBAQCAgGBDR0B9ki+Oxrukb9lO76h4xHK1yAC77zzzjHHHEOX5VoE
q8FUwgUBAR+BvQcP+tetNzSB/bpEGh7hbeiKHDXSqO7P/ffcf5fqnYjuVvTqVNGzs2O/dJBONSop
uXj2C38U9huL7XX08J6JnsOP3kt+ff3EnS9QaMzAn9/3t+M1jhlF2GLQLpioogOtUVSwFlGSTSru
Xufd9/8o7eiwdcxlT9y/P7o9OVm7Jn0M2r8bZ3PmZ4vjz/PKSI/7ufbnpt6Y9sTG4x3uCAgEBAIC
AYGAQEBgQ0Zg9gt3PvH1XrtFroQWNtvxDRmLULY8EXB+ahgBDhx2vUAAI8CTJ09ew9z0798/2wjw
XnuBczZie/P9N3/1/a9o1Su6hyKf7+pyF7HfRtwfLmUE5o760++e5EHr4//2x+E9AyYBgYBAQCAg
EBAICAQEmoTAxHvOvPU9u3Ovc+/9+UD8yHa8SQ8JN22wCLz33nsYAQ4EeIOt49ZVMBDgTz/9dA2z
vdNOO2UjwHvuuecaJh5ubxIC817685X/pUWvNv/hX/9wWI8mJRFuCggEBAICAYGAQEAgIBAQCAis
CQLvv/9+IMBrAmC4t5kRAAFulkSzEeBBgwY1S/ohkUYiMO+lv/z+KSbAx/3l94EANxK8cHlAICAQ
EAgIBAQCAgGBgEBzIDBu3LhWQ4Cbo7whjY0LgYyLYO2xxx4bFwrrS2nnvvTXP45kAnzsn648LIRA
ry/VEvIREAgIBAQCAgGBgEBAYGNC4IMPPmgdBHhjqpRQ1hZEgFaB3m231KWhW/B5IemAQEAgIBAQ
CAgEBAICAYGAQEBgvUFg/PjxIMCFV1xxxXqTq5CRgEBLIUAvWOrVi14JFLaAQEAgIBAQCAgEBAIC
AYGAQEBgo0Ngzpw59MJUKrYugnXzHQ9sdBiEAm+gCJx/1mnpJaMR4IEDdanADbTcoVgBgYBAQCAg
EBAICAQEAgIBgYBAZgQmTpyYFAJNBPj3V1wQ0AoItHYE/nL1TdkIcGsvWsh/QCAgEBAICAQEAgIB
gYBAQCAg0GQEAgFuMnThxvUXgRwEGBIftoBAQCAgEBAICAQEAgIBgYBAQGCjRaBgoy15KHhAICAQ
EAgIBAQCAgGBgEBAICAQEAgIbFQItCABrqqqfveDL6+7870DTniEPrRDP+ngRoVvKGxAICAQEAgI
BAQCAgGBgEBAICAQEAgIrCcItBQBJq7bY7d/nf/3SWM+qNtk653pQzv0kw7SqfWk8CEbAYGAQEAg
IBAQCAgEBAICAYGAQEAgILDxIBCtAt2Mi2DRYO+t/5nZf0D/NhXFdfWFPpqVlZWTP5l87k/6XPrr
vTYelENJ1xoCYQ7wWoM6PKhVI3DXPQ+16vynZP5XPz9lQypOKEtAICAQEAgIBAQCAi2HQAMEeMwr
r342ZXK2x2+/Q/+hhxyccpYGeE+68O1+Ow7Ikelpkz557MZ9995jq5YrWEh540QgEOCNs95DqRuL
ABHgyy4+u7F3rZ/XX/uP2wMBXj+rJuQqIBAQCAgEBAIC6yECDRDgm2+++ZxzzsmW79tuu+3888/3
z9IUXwpy3nbn3YuKCgf0jpWWFtfVJSZ8Xk/XxGOJXfsVlpYUxBKxT6YtHDf2s3njf1FaWpKU+Khf
xQ+fdOP0dy7YBodn3LRP3wt3fDFx1/BGYic3voubftnI+ykTf90hykMjnxwuX6cI5CbAG9io1zpF
Ojy81SOwIRHgVl8ZoQAbHwKh12bjq/NQ4oBAQGB9QaCZCTAN/54y4qOO3Tel8vVuP+3JOzgs7W//
mvr8O8v/ctaWh+zZva6u/vw/PPHurM2XLlxw7YXbnHDkjilIMHOdciUYL+8/fmLjqWgyjZ5x003T
L7igEQw6EOD1RTqbkI8GCfDFF/6qCcmu81v+ceNdlIdWmnkfvdZekNaef1cXVJANiQBvAE2jJZTM
BiOu+YDTugpLuQ0EOJ9qDdcEBAICAYGWQKCZCTDN/r3rhZUlbTtIXhNHDfj2mhHHVVbVfjl7xXZb
d/xuzsKTLx21oG47Ole9YumvjmiTaSaw458pRNQN6u5tQ8RywYsnPn44j/W6cd7s/DWPFPqmjxzn
vMvlpSUqJ6TZeATyIcCrVq1qfMLr8o6Kigrn27W6zPvAtfaCtPb8+3Vxx93/3pAI8Fm//Om6bKLr
5bM3JHFtEODWVVjkNhDgBqs1XBAQCAgEBFoIgYZXgU4Qkc3ySc/T869+GS+vqI3F5BN/7tOe02bO
ListIvb78usfDzvvnTl12+EsXfa3WydkKtXwu17c8cJTb7rpVxQM/aDFQsdG/UpioWmbfuLjp940
Q+9898K/xh6kgy/+8u7DfzWKD456+u5fXulu8x6QVwrbXPAOpRUjXpvAKHQDd7lg7Raqn5BsQCAg
EBAICAQEAgIBgYBAQCAgEBAICDQTAg0TYHrQMb96Iv2TLQN1BYX1Rfxp07bg9ku33bZ3L1zZrlO3
2jab4hR96LKsRRAKfKFPf5nW7n3jpRLHvM0RJ8Yef0EZ8N7KkYcf88vYpM/p4IzPJ2VON+8Ukm5v
6K5mqoaQzFpDgPtQWuEGfFphxlOz3NoL0trz7+rj/7P3NgBeFeX++FmEXA1rfSnRfKFkkYiK0u6f
QGtV7AJadysluqVs6Q+Qq7GmeDfDfpRoW2ou6dWFTLG0yyWrvVcFMim0RO7vmnKTy0VeEsuSEvWr
oa6K7P95mZnznJk5b9/dld1lThue75yZZ575zHPOmc88z8x5w+64N6aiAXBr9EYTBoy5FgGnfzX2
jbkvQi0BgYBAQCAg4EUgnwC/8HzlB98+1f2DdFfi6acM3/Xqy11D9nn38DfdeeXohg8c8uRTO878
8u0vvfzK+Pcf/pXPHgqX+A+yffX8D6Zw1ZlTouXkBtaOXsy3prm+hg6zu5Wv9IiR9qriOFcxCbbU
6koFe+u7CBQZS/WpPBLKPqVYWWX6e0P6u/6yv/ru/VmVZmVNcW/IP5DMNbe/+ldjq7LxUCggEBAI
CAQEegyBfAL80ksvp/25Wkw47rDXXn6x8cP73XbJOw85oGbF6kdO/erDD7/8gX9qvRu+ADyt4W0T
x+4T7TsE/iDb8CMO8LVjBcY+z52sIqFjCkxhyerIiDyuHz1+cQcFQztHQQlWuepK9VgPBUE9jkDu
WKqvZehfY7sM9Pp7Q/q7/qUI8Ja28TzjSAcvMOn1A3ZwGN8m5z2L1tjX7tm+oM9AMtdcPPtXY4ua
dcgXEAgIBAQCAr2DQD4BLlXvce87/OU/Pv6z/3z6gy0b3nPRoxd07Pv6QccM2v9Nv3lh9Hu+/Dv4
W7XpVfgZDep6+Y/bPnHqSEc47Dhllv5OntsWaS8whDivab6qyBhsxJx5sB5YjNdgF2gsV1yCVKq6
UqUwC5nfUARgILW7vx2gM2PUH5WXYPf3hvR3/WVfZN51SH7rL3wvbbpAx/IoZVbxDb15Myrrb/f0
G6HvQDLXXLz6V2ONtn3l/gl6BAQCAgGBvQyBHibA8F3f5bec/rdNfxhy8DD4G/yWA/Z58774d8Cb
hxxyGPwNPuht8POFR3+3/JbT7I8A845TUbzz1Yg5twIFriffAziEkdfyMSERG2132eRFXZvb1uu8
NdOj02jtcGEJRLwh3LpsvXuZ6fTf5vqdCb+48GB5XPiLXJ9Db2QALf7+hi2WZAm1dYm0dktALrqy
h1qRhkxGQ7TGug/6mObcorIdseWGv99zXZBTecb9u6Xt7AujazfLz69PXlT6W+xv7APCd1+Y+9l7
g+TcvggfHn3SEIs9evrY7da7d0POvdnHuvGNvTlCbQGBgEBAICBgI5BDgN89+j0/TT/gqovo+A8N
v+Qfhz/z6wfAzbvPAbXWHyTCJcgA2dyyQF27EtHNuCmzHobhRXWoPJBicstz2CgLyyUzEwUuJkGV
ViO+7FLBpPofAs7oceuNkw45ZFq09GlzLD17w+atxUaZPZuL0SxOgCn7Q/9+j63s1huv3nD88a6o
ntW2rLT0QSp2geyBpfUa/3u/fMikG/dIX7ityxhkc0dc9k8JVb29aYvtrQbmVJ5+36646sIHZ1zW
PCIlRyI0Oo6MxuSZK8xFEcgMYc3qiBNThNhVimw5kdHuLXP85f/J9/N/Xh5d9v+VtKGtN/7TZREJ
uOaUslbeZ/JXc7v1ovKF7oaq7468e7Nv7SDY/96aQeOAQEAgIDCwEMj5DnDVjV3zX9umfOHuA94/
et/D3g5/IOeVp/4Kf3/77w3g+/Wy36rrCgUDAgaB3O8AXzD7C0899ZREbNstZ5xy92mr7vjC8D6A
4+qvHnP9CFuXww477LobbgHtXOUx/2MfeOSRY7+/9YqGWH9qU/SBR449P5G8pxuY2pCMPvAisoca
ktMRI+Ydu2DBY/Pi7sNmbcnrgt5qYE7ld/xspf87wMBXYRNC6f4VaAMjpdBonh2Uv+j8wQ9fu3kN
UGeU8SidYvKyqZQYrWhrq2+Gk3QhWPDyd3NuyqaLksRUrb59zQ1nfHKSNIokqOVv8UI9t4essHC1
1dxuhYWXz1gVpoXvjux785wo+YAsr33PlmBtw3eAexbVIC0gEBAICBRHoIdDoE3FQHH/8tv/82/N
75w54oVD1t4Lf3ACPyExsN/i3RNy9gYCyeVkv1q84JHP/NP0o9IXmf3++58+Rh2f/v7vOR+mXfor
c8Wk62v+/L+6FNMv/ZUS4EjdvRvCbN01yhIES03MP/mfLh279B4Uqg9oU9el/zQZrsXCfK3YDQp9
+vu/Mu1DzeJ8pKc+RHHVAoGDatel0DxRCIskgNmd2pCjho+MHtn8uN0HKPecpdEjC07RsFnIieq4
R/IRBgmcCQ9uvKWz3XexVjkdsfujl9/0mUcWLBa45XSB1UD8GSuT+MXNi41PtyALgbhy7r1Eh1Z1
Z4FzGGKjTTT0iOYfXPthsefgh6/9ATuOJ8+99sMP/u9mVcd7j2Vv8mRkv8CDs4VoxSibkscS03Y3
xBKe+yKx+jy+rdJvZ2U83wewTlnwSLT0nPJWV/SGkrdTfI8UfKrEHem9qU27y95uWY81v8L8APl9
fFHe7/I248cmGmTuMzO2U8/t78rUrc2+N+WTMO+ZhtdTHxHpCtgPr8zfVd19oVBAICAQEAgI9BgC
vUWAQUFY4gtcd+6sD9/348/CH5zAT3fdb481JQgKCBRDIBFlt/oX/xZ9ZuJHUiP/Hr/lzFOXT7ln
Ex3fO/bKU+et1stB/+3cudG3Kfkz666ce8vjlJ6R/7Hrf3EMCrocanv8V1u10HsujYxUXmZqKyOb
5bt2VMOUsf92vVIAMkCbxk5pOEqIStMKqlt35fXcinsuHftv59bXqzbRL9VWatSVx36PQYCMj51b
ry9BJaZdl0/8TPTY7xkHbOLydZ/5p6ajhcbpDfnIOVT7mXEjsNhHLkdwo7GXatiKapKB8Op59ec+
RgLh+Ket5165zgCeipJuQl5HoMbf+0yMm+xNr3CrgR+RAKJlRv/2Cza3rm1b17GZFuwLyGr6f/W8
U6+MoMloeOYodq8kc8Fn0SPNZvnKiGPfGz36mN62OXmN0kecPvXDuHlDHCudJ0RVidkevFB9+g6/
fnfhg1kq++6LRGOPfSdaYpHbs6lpGd4M0WfQ4Amz4pgXvaFSbn9oYepTxdyA91x6TOajxtvFSXz8
txvkSVUg/Xm17spT1TMDUDOPMoDM3Gbfm8KPtEKtE48X+/b3ySzQWP9DNaNPUx8RmQrYFpj5u5q7
L5QJCAQEAgIBgZ5DoBcJcM8pGSQFBHoMARiWJKbmcXQUJz1+y9SR6pi3GvOtvunK6CvfOvsoLnPi
F78yFigJ+jKg2Fh9AZPXbdmWlz+a/EUtaPdRZ39dnx919uypyBvZR5JQR2nKY0c4bOV1fhSxbvmv
WMTjt/zLv02dffZRQlRaK6g6zIvlSI/kL6UVFf/5109U6hx19rc0DCQgbteJpwg1gP9OPUWX4aIZ
DTnq7KUbf/6V6MqPAfxTbxG+4AQihTXB5ngRxskB0aFfXwxtVv2fipIxmNyO0DbyL9yCIl2Q6PKj
3jVW9yMoOvUrXxmruwDUfhd2U3EEVOWr5438P4995edLjemp1qTeUfXv/rDgtN2+8UY0r+nq2nzt
o7grYdlvKc2It6EmOpGxEVfipk7eR6vnfexKZYpZt7O8PZP3YXHMC95QacaZ8VRZN3WxvgGPOvts
vK26Za4pt1uaApnPq6mLtXHxk4GMHyWNHM7PzRPPJuPLfGb6Hy/JjvTIjLu9yL0pjCSjT9MfEZkK
WBaY/dNo2+37KwgICAQEAgIBgWoQCAS4GtRCmYGKwNHTl26E4+dfGcstvP/eZdG6b/79KH38/TfX
xU0f+c6jBQ6bHn+iVP7oiVunKbEzlnUbz49MnLpuxWrQIHpi9Yp1Uyd+RErMbMXYY2Qrkr9iEJJt
PfqdIyNqLx3iWqYauY1k9BdPRcS/dr8nOzakoCZY2oPwE49vSko4+hjV1dl9nat7nOHo6d/6SvTN
f75Vw5NvSKJsw+Sx67ZiSWjq1InT3zmSexV+jZ3cAB1VEoFNN0ybsQwIynTZxzltQZ/tgxd6vznn
cuMtjz1q+YS90pEFb4YY5svhG78FhXSbh5v7dsamr/x84zfwjihxO4tmlMQ8/4Yi2Wm3f8pTxbql
c9pSyFxTbjePApkKJ9qLTwY6jgZLXjZjlH0fp7Qu66ZO3h0emYUaa2XK6NOMR0RKo6pRIJQJCAQE
AgIBgT2KQCDAexT+UPkeRwAJUMzlfOpMXYycOD5oKJ1xFMl//9dGjfr7FZN/zlLRC9nd4yPnAOv6
/v3If6OvnOOqWESr7uoA5TUD9tDwotI/8g2cgFh2Q5JBFi2t86Ug/MTWdd3tu3xNjp4ODnmbAoNz
vYAh0RD7XujGxzchsUA4gQ/jL+K/VR3Z5u2KBLZK35yT+y6vmIne2xHNl82AsGTjyOXvJc2lDbFS
Di6oD4yRLijEzTYT2HOJYyzQXj4S/L9IL5SopaqsPXX790RbCt1uVShM9PrnX9kEJNg/m1UFcr0h
01Ej6xHxhihQBTChSEAgIBAQCAiURKCvEOA5l1x7wcXXZPx9ae53SjYtZA8IFECAyQowR++RT4+T
xQrmRydD7JfDX90/mDp97fvfjByqVFCrNB3c4o6TJC7KDPh+1w1dpoXoR2JHaB68aZqkIey0JR7u
dhOlhKYf+Qb6sb+/2iQWFo7duOlxwI+7EeBcdu+tgKbykZXqC3DOz14KceXf/PtpJWcT8Fvq10Zi
Be7l72aaSxconBmPeJPm1N6tf7fOjZk5hrmgEMgmPv5ev+zdp6d9mamobRXuhYTAkpjnK1P29veq
XV1b/E+5lNvNZM5UOHGjWp5VJIx5s1ll4S0iM7cPMirNeESw2B5RIFfDkCEgEBAICAQEehOBvkKA
YcHMBbOb/mnW2d6/5gu+ENbM9KYZ7F2yrdVZJ8xfNBUC66YtoUW8aq0qIIJrhY886zwMyP3aferC
tiVf42y09tWsJuZf8LNE/k2/5/q2LflnjKtW61C1oISOsnvstY6qYqXrsmXLxk766JHJRqRrBduy
yhXQKb/cRv3zN6OWL57g4oApJ8A64BU3QBj2KZShWEO2LZlmMEZIblgW6fK4rdBW1TXFNcEe8SF8
5EcnjQXnrO7r+75G4efUkal9FzehWEdQfrKqb1LP5giXDUQ1ho9c980Z34xUN8Kq4E0rYjSLI6BN
9MizfrSyBTiwwJcUzLvnae2uOfjDRHTIC1ZyvEYXM9FFkVtkThOC3FhmEx9hT6S7yqffF+JKwdvT
ur9LYF7shkozzoJPlW1LlsDzqDvmmnq7pTzWUhWm9i6boW0Lb6ex/GS472s6kRfOwjOp8DMzfrzg
xtHx7e+RWfjetDbXz+jTjEdEpgLO0y4rIe/uC9cDAgGBgEBAoHcR6CsEGFoJr4v/3bj197//4xN/
eOrPTz39178++9xzz7/wtxdfeqnzlVde610YgvS9GoET52/YsGhk66TR+pjUOnLR/BMJE7gGTGam
ujJp5bt4d+XUo1D+o85ubYlUfXCyqAdCoEnXU6ZGU88726NgIa0yG7WyZVMMwqSVP/LVwgJO/GJL
tA4IMuNX7DjqnSMNxqNHI/wbFP4obixdm/9r7o5CmqQifNTZyAd1X686ZWXLWKNiN1GymoqKi6RU
4ckGci9GYycpOzuqYVK0Drdw0qKKIiCqhjazDROEe/VRXRdXgXkWyuVv/4Tak1ZGFA1fXVuwZMbt
5tU7U+GxLYvedSM/H2cum7pIPRmOfpd+XkxaOWmlvpn9qGTBK++OMjLtmsTjZfQ//uAPWU+S9EdE
dxTYq2+70PiAQEAgINDnEKipVCqg1HdvXHJZy5we1O4X96763w3/kybw3aPfc+rEU+RVCH7+0uym
/7j7N/vuO6RmUM0gOGrw3zd1vRnmjcd/pP66G2+97uqLelDDIGpAInB568IvndfkNq2jo6OxsXHR
Tbeff17TE0+4wbV9Goyjjz76+huXgIr9Q/lfzx9947u8FLkPNiRdWY9J9EH9qzbcO5f/6pKLZldd
vE8V/PY1N3x8ykl9SqW+oMwbYK6lbp9exaT3GtsbbWRtZ577uV7FJAgPCAQEAgIBgTQEessDDOz3
n9IPLzfetev106eMn3jyh05pOP6kEz/wkRPGNvx/H3y+6ZvPf+HKmlfze3DFzJoJC0ttkpIvU+TY
snBCykc88Io5xIYvaemlqqXM0LSyXxCR6lZRvLyOVepZXUWhVB9G4A8/uBHCsHP85H1F/1/PB6eV
12feVzQMegQEAgJ7EIHwiNiD4IeqAwIBgYBAryHQWwS4CoUH7TNow//qEOjtO55++rkdf3v2hIcW
n/zI93cNzl2xVkWFPVJky8LpG+bplXK4ZYti4Wnp1VRKC+EyPoGZI7ObxYtrnKiolyckimtl5XQ/
pVtq7dYeyZzxics9ok9apff9XwiDnNRaf+Ntnz/Cm6cvNISU1MfMrhvXf21CYRD7gv6Flc3JWPUd
1DcL9hQsA0nOG2GuXbB26fW+AFoPNrY7j4iCUIQ9TfrmYyRoFRAICOw9CPQlAjxo0O8f/8vvt23f
8vs/Pbb5j//72BPrN2xrfeybU/50/MceO/5Hf9f2zjve8/Mn7u1jfTNizgMxNZ08t238mmV3ox86
Lb2Pqb9XqlNwjNJ3ssle6jtauZpMuOx3eFyWyij7QkOUkqRplq4+oPuC/j1lAAPs1u8pWAaSnDfA
XOFuuu3zvOneHj56sLHdeUQURGGA3X2hOQGBgEBAoN8h0IsEGLZvTPvzwpQIgf7IBz964gcePPLf
H66558JhF8Lfl981+52DDv/4T08/4e6JGSjHccciHpqckStMpDKGKcf54m9aUpAzxQtjsDMHEZuf
XKcplhFtPWak/2MdiXSUa4VLKxUT+nAe4UxlrfxqsK54TFi4WWCU8MXKwGynEV6tOKxclDPFbIhM
RShnyuJoTXO9id1Oq1cq7QSwy0JJXHRLBYYgqcjtJ3a27U+n3LT+pHGKrv29If1df9MtRW6WfpRn
ANwavdGEAWOuRcDpX43tRzdXUDUgEBAICAw8BHqRAANYjTN/7P6lgbjPPoPW/8+WLVueeHzbn+Dv
Wxu/9e9P/Pibf3f5u498L/wNftub33rM4W855rAHnrg/zQ8MhGt6dCu9KTe3Rc31gh2taV7AVza3
jV8MX7FU+eiXyLZ+QcfozXG8sfVz8RRVbPmMNc3TfQuON29YM350vdtCJ31y44xo/SbN+LbcvWzN
jHlzJs+5FfRZQIIhhLo5alPfzUwK9KoB9G/K+jbUHY55G6Y0r/HivOXuDVNVJhsiyO/VCug8EFH8
iCcLXz5GImtBxJViLPTyGdF40occ5P56Qa5Rerm9EzJW2jxmOVe6uW205uFxIqSun5KyMjvrVi04
Sd93ssnG9B2tqtCkvzekv+svu2yAvcyqsMYBX2QgmWtuZ/Wvxg6wuy80JyAQEAgI9DsEemsX6O9+
97uf/3zqDoe33Xb7l770JQkW7AIN3wH+n//dsu+QIfsMHgyXZjzz2UNee/PpH2isOWBf+PnHXU89
+vL/mtf0LAAA//RJREFU/u759a/84dnohV1d575sYY0MMFoeL5VVpO2BOSPQgyouOb8WjN6MuUQB
FJ35Ey/C0l9rXS5IVrKSunnTRaKUps4bO4QoKytQUdRX6chq2FXIRqap5RQCiV6tLAFGXQuipLzU
WkUlfhgZPLs/dWISYSEBCgDxTtsFGvZ/7nc3Z1A4INCrCAykXaB7FaggPCAQEAgIBAQCAgGBgYGA
GvzAZ5Dg+MY324qEGBXPs3Dhwj+mH3DVEnX+RVc/tnXHT+9ae/fPf7ty1X/D31HLRn/w9g99bcMV
//ePV8PfFx+/6EMbpuz74FHRvw2NvlframI8jvpSnJC8lPYLvMHRDOVwZFdx+k+8yP5Nc4BYO4kd
pinpsYvUqgkL4ARArIrQOJnXqGGJSGpvIYN5zWE1QjhuY5FKoYTZk3Z2rYmKnP7w1avSRFtF70kI
lPMZoLHyJnoZcoEls0lbx7eu/pfi1htyBgQCAgGBgEBAICAQEAgIBAQCAgMJAUMHetED/KlPfSpt
quCnP/2p6wGG7wCvFx7gT/9l4ltf3W/0mOOjA4aAnB27nnv8lT88//rz0V87oz+/1HVupyXc8TjG
CclLab8sd2TmT9v3af/WuqWlS3fmaXcnvckU+rsGmKly86a4ZbUHmPzBmy33N/mvtYtaNBjdqouN
6CzPtNDK64vV1Us/eEKe/SO9Xm4wMlvhUU9zACe8/AmXda4H2Pi7xn/pmnKTWIUWF5cTmcjdx+SX
Vqd0gZJYVSMf9h8ofFQjv7BwyFhSfsnspeWXUb2qvKUbUFUtxQv1tj59TH5pdUoXKA495dwb5Yfn
T0kjyci+l9lP6eaWLtBzXeOVNBD0CfdvzxlJb9tDSfmrL77k29fcwHSgd9cAF4ewZtCgIUNqhgwe
PEQfBww64KnO7Q8++19rdz4Mf+tf/l9kv13w1YWu6HW/da7ZIPZ+WtGxOErbj6q4XkVyVsV+QTCs
uIUto1fg+t9GXCdLB679HbMc1+d6Fxmn6FM/erxYUgyZYNGxJ+uWTeuBZ2pijb/cw9XKEV4ElESe
7Hphw2xams2Ln9XhrdRNRMlvTC+XbnQoEBAICAQEAgIBgYBAQCAgEBAICPQ1BHqLAL979HvAzZt2
wFULiH0GDbpm4S0//8Xq/7j7np/9+3L4e9ef39e1O3rxmed2vvg8/O3avQvZb+fr0Wu7l530Iz+O
8YZWK2aix3Gu4ZW9hrvaqsl4a3VFKem4r7HZRZm45oJlUawnb301d/II2A6rDAUeMWee3JcLW5/W
Yr31FlalSXK2Viw83lJsy8KZvg3A3AoTExK+elfMFBuQEZE1mliVblm4EPbDdjVhuHqtd4PggEBA
ICAQEAgIBAQCAgGBgEBAYCAh0FsE+NSJp0CQc9oBVy0Qr22dc93VF8m/By782YnDTomefSV68kX8
+8vL0bOvRi+9Pnboe88c+WlvH4xvWz56AX8gZ8ri2NPZm/214ipkkbivtDn4y0Up6UldkAGviaae
pr6btGJmPfC5W2mDK4vS5rZh8iLa1Zm16GhMLLg1hZlXcybY0Nq3uBfyWlphyiJYsWwaWb9stNY4
Qy38JjIVATzS6q0fDbs404GbTFtbiiUqrV8W0ebakEhbP8elnKmHXKhChoBAQCAgEBAICAQEAgIB
gYBAQGAvRaC31gD3FJz3PHHv3688DaXtUxO9efC//d0Ppx7zyZ4SHuQMPAQydoEOa4ALdnfJJRV9
c41fWMNTsLd7IVtpA+oFHaTI3tanj8kvrU7pAiX7a2+UH54/JY0kI/teZj+lm1u6QM91jVfSQNAn
3L89ZyS9bQ8l5ffFNcBpYH/s6IldM1/Bv3M7uz67M7DfnrPKICkgEBAICAQEAgIBgYBAQCAgEBAI
COxdCPRWCPTehWJobUAgIBAQCAgEBAICAYGAQEAgIBAQCAj0eQQCAe7zXRQUDAgEBAICAYGAQEAg
IBAQCAgEBAICAYGeQCAQ4J5AMcgICAQEAgIBgYBAQCAgEBAICAQEAgIBgT6PQF/fBCsXwEc3bL39
x/dF2UvWa6LPnfnR944+JldayNDfEQibYHl6sOQmASWzh02w8m6akoCWzN77+Oe1z75eugFlKyiZ
v7f16WPyS6tTukDAPxeBsIlOLkSFM+xl9lm6uaULFEa+fMYPveWAE941fPfu3eWLhhIBge4iMGjQ
oN9s2/bQyy9kCJKbYPV7Atzy9Zs/d+ZJbzu4LqPBO555/rYf/7L1/36xu+iG8n0egUCAe5sAjz70
LZ/5u1GVyvN93haCggGBgEBAICAQEOhzCNTVvfXHG/73f32v0dJ8tnSB3kJj3AFDp3xw7AfeP+bN
++/fW3UEuQGBdARefOmlR/57/fJ16/6z829puQYWAZ5/85dm/sP5/2/ngatu7Oqyp13hc7E7p33l
2nfu+u6if2+dHwjwwL91AgHubQK89KKz993vTW8/+K0D35hCCwMCAYGAQEAgINDTCPz1medf+NtL
X7ztNldwaT5bukBPN0bLa37/mIkfPXG//WpfeeWV3qojyA0IpCOw7777vvxy5733/XrhxkeLEOAB
sgb4b4MGAfudcfZZF86ebf4uOv98SISHA7jFg80EBAICPYVAYL89hWSQExAICAQEAgJ7GwID8h0K
4+39998vsN+9zZj7TnvB9sACXVdomoYDihnuem3Xfau2wN/9q7Y+eP8f9xmEM2O7ougNX5CwZeGE
mpkrSljFipk1ExZuEQVQgjqSF0oIDVkDAgGBgEBAICAQEAgIBAQCAgGBgEBAQCAwoAjw7mj3aR9/
P/wdccamO879BDfztS4gwGV2pNjz9gHst755zHKYxsDjgTkj9rxKQYOAQEAgIBAQCAgEBAICAYGA
QEAgINDvERhQBBh649kXKvB3xNMTL1h207K5c55vv3afiYf9cM7szj893l/6asvC6ch+F03uLwoH
PQMCAYGAQEAgIBAQCAgEBAICAYGAQL9AYKARYAb9sVX3PHLB2Q3r/+OKY3dfecyrE9b9rO4n1/xp
61a3SyjU2EQrJ375opA5ttlcMdHJnA6BzHAkpWFKIog5L7h5y93L1sxoDOy3X9w+QcmAQEAgIBAQ
CAgEBAICAYGAQECgPyEwAAnwn9f/bvOCS846snPkIdERhww69O1Dxr77rReeevgtJx7//DPPWJ0z
Ys6tbeMXL6D1t+h6jdo2k+sVo5CXTd3MQcjLxzTXx0t6F0+ZHt1KyTPWNE+PV+6uX9AxGgso1603
W4ZYpRjy3/Gj65lL2+S5P1lW0DUgEBAICAQEAgIBgYBAQCAgEBAICPQxBAYUAX7T4CGw7dVDP/pB
Q90r++1bM2zta0NXv3rgL19+y507al6qvLPmxXtvvtnBHylw1HzVimjFVUB/b+UFt/I8iibPBZLc
oTe1Gq8zYfKaDZuNxKlz5WpdX7YssVKxZdM7Gol6bwbVBPfuY8YT1AkIdAsBM80jIycw0dlBTsRN
2BNDXiEpalFez65yaekJMY4OCUletU1idtlSIIr2WjDlBZfE1WTlpGsFdt5L4B53WTqUdCV9b8De
hzerl3OUK9VDIXNAICCwtyJw0EEH6f1LE/99y1vesrdCkt/uhxd/4QuLH87Pl5/jqbu+5pGE8nuo
AlAB68CjZzTOb1M/zwHgf+2up/pmI/o/Aa7BPa7gA8BdUc2iH9523eLvrV+5/NDarqG1iY+jvf7i
i8cduPv+2z1fXYtGzJk3Y/GUmimLZ8xTDHZFx+JoTXO9eX7VN6+Ju2/MSLkp1fpNevPmZHrkyZYp
VtrH1FuVG5kd1IZ7900bGqhajTz9C2u+exH+LVR/S087xDR20jkXrTlnlNV2kzjytC+YUnwiy1ql
MHPbRfIvIzOUnfRFyPyJST2A+6hvXXvRmpYTRvaAqLIikO9MifRObxBPMdrcSSmiZsSZ9dZwxYUw
vVowum1GUnpaehEdMDLEULrJjTMi+07FGz5ezpDQP1G2OHbA06asb+PIlOXw1IqJavGd8zJzQhjM
smh8jkIEmuw80CV+EELhNcvulnvao7gtCxesH58nOB2i7sGb38uTF8XBO8W7I+QMCAQEAgISgSee
eOKAAw6wMIGUF154IQC1pxD44Ixbbrllxgd7pPqn7rrxJ9Gnr+w5gT2ilRTSlxlnjze2ewL7PQGG
b/xuf/rZJcftd8Wlc6+49BL4GzJkMGDy2qB9JDJDdr8OPztf3OmFq340jswg8lhcTYzFem5wVI3Y
xNiye/0dSpdD4Hd3j//SNePn8N/dT3xs+pqFinmuXLc5et/IJAsdddL7ol+v26iqgLKqoF3WowNk
br5G/939xKnTMyjuypsh53+sLNcSK/chs1suWnPth5/4RRzB0C15ZQtTqH/b3Hit++Q55Xc7LyFk
xJwHaEd1m+unpRdpD5CmzTA/NYW9mi5FS/LfpMRk2SK1YZ4tm9ZHZppORqAU3zkvMyddnDdvTKY+
aqlIYpu+yYvEZvXjx49fgzE18sCuKtpKla8H4e1OL5fUOmQPCAQE9mIEgOtu3rxZcmA4f/bZZ/di
SAZe0484/LCB16i9sUX9ngA3ffbkn9655oab77r+pjv5r3bk2L901uyz3/6yP3d2dkHiyBNP9HQy
Dwkx2liv6EVC3Auss4jYEadNTcRVo76Wb3lvtNM+0eaN/zzn1tv+Uv81dvz+dtOvo/qTjhOaHTfy
xGjzr37r1TVZNqc5G/+5mSr6ou1h7jkYdtzQes34C2+5YXvPiSwlacTIMZFcP1CqsM7cI0Kqqtlo
ANEj2vFrM+As/ovlMfLEcRorwSmb82GDzYNJbReAJYrvnJeVkx+EedvPwzqONYaE+8GbOs+OW6HF
H/OmlsVaQtST8Lp6JL7EHkd3JzzscURjqY+8l210yB8QCAj0ZwQOPfTQLVu2MAeGf5977rnBg9Er
U+qobzjnvnlzxd85M9+OAj52BiQ2fqyUrH6bWQcbeyKOMy7p5nIWDFQWPlGOkTalE8G5FClNx9fu
etgXS43FLv3JH6MHrxMR0CmacEUs0hMsnVJX0nubDOgWFQm1paCnsKVfuO7B6I8/uTQlRltqa9TK
bIIPq2SlDHiBHrGy7fnI6H5PgEeOOOrKy5rk38JVd963c//d0aAXphz03Mn77Wx40/ZxQ15+pWvV
011nXX6F8yhgf8bcybwWmCkwjrsgBFrs5zwz3uyq+odJIbHIgLVTifblCntCV494j5fcccPPjeN3
469+F504Nuaok8bWR7/blO6YlWVzFdtxwz2mokNmf+Wibx036lsYJo3+ZwiB5hhpjIUWJBlDqb+i
4plFWPUXZh+eW53OcPgJS6/9wnnF8xcW7GSkhfVTiiw2zaijR4RU3wYsKWa1khSNvLXZ27mnz4il
bc43eRHFTtNO9PVmz4LiO+dl5CxGf6M8Wk9o1uNDjLcWpAMKjZ96mgywKQp678CbVTsgG0eZK8qe
jBrf3LZ+SsZi5qJNC/kCAgGBAYrA29/+dvYDA/vdZ59ENGKJFm+886MLrtJ/31/0Vyx6zx2Q0nFP
CSk663sa75t1YjUP4Srq6okiQKgu/ckRF0CsMR5XfvrJ6wyRzLhkan548aUUquyJfH7wuhuj81Do
BR/+409uVOtTgdNd9ySFNsPR+OfrgOc6x2GnfwMUOTL6MGpFgrM1ebLjocN9wdJF6rIqx4r+398p
9S444ieXEnuFVKP0BX8HCRjsfcGHoyP9MdoJba/8NA/0spvgwcqpNFeIaYu/FT1hLdXJ6PcE2G32
Ww8++JwHHl7421cf3vTCX/762pM7dm/c0XXz1ujjP7vn7e94h5V/xcx4GMn8lCkwhN/hEjs151+/
bPRpcuFvdVgXFAvhejTCwqM+fBG4aqx7qeBTz/4hOvhd9ORIRkEf8q5DRfyzt3ZRNl+7ZOajPzby
iW/bkc8r/3tzdOghOqr3kInvO+jX9/xmUxQB+13yvs1NHFP9w2c+P7dHFgznq1wqB4al0iZvRfc6
N7ejKFBaSCkVi2RGp6w+kAFrB20Rp6wsa9fl3ZwPHyEwcRAtnoLbEiT9sMV3zvPlLEh/bS3FzlUJ
ryg9S/VCYFj+G++vUARTkae34M1WQ8fcqLh88l/z5wHwCDszlOzEkD0gsPchAH5gWPdbPfvd+xBL
tvjhO5G/Gvp62OnnffrIBx+inbIyLikZimF+43RvqPKRnz6PL3zw458+8o9/pg2aHn7oQZOMPBJY
ZIEjT5O/+7hPgyrqooqU1qy3wiKKdDz2B0/3tzZuBgj544cv0JAedvrpSOFzmuDDCkpZlebhoLsl
vRUFwO6FLAOQAANK7zjmmOb/+f2zs1ovf3Lo17fVPvr3M7702B8/dPLJLoC490m8ei3xi7ZFUYfO
guPtOEQQf/GVZLr1M86G9fvEYqJYQ0fl1ZEXkNgLNhFEZiHw5x1PmMsYBa3IcHT4qI8cmhb/rAvI
srkoW5l/t+aGPztlQIFD6yfyPF6swKhzTo1uuxWZMB6/XQPR1CcV3P/hz7+ZduEtN7oV5WpbXQY2
dPyeGHo1c2TI5fPu3ZIQIncozpXrrbawBHT0mgMYsKJ9RfgvLenlw1eduzkf5TOfZ1seJRzoxXfO
c3Om098cHNSTCpZC2yhmQ/EGw1vGOjkER+5XjU7v5DKURCh6GeEhb0AgIBAQ6AYCEAL9w4Z4M06M
lP7qXPpTMdIsW6TPvfI9FDjdWB8dPO4myHlG7y2t6kbDrKJAEg3L4kuHHX5E9CSy1YxLlPHJjq9d
9+CHL0hhv5AhuYSXZD715yeTyYcdfmR+Y/I08a8VrqIurIjDmvnAOGzC5Li/OxLjsQttSI1CPny8
NRQs1wTCyq00T4hCMq0V+UD3Vo6BSYABLfADf+rii2+vVP51584L/uWGtx0WFq33lg3tXXIPP+To
uMEQBX3QRz6Ab6ORH6g/Kiv+mcokyubBlsz8xPYdvgI+BXAp8kGfv8RsKz3984fm1bVnr6vdjkTI
bBX6JITIWabqppAKS9i8YQ1E9+r4EE37CvHfKC7rr87enI9cqcs1+YdwaJg5sDabMsgV38Ng/aYV
uENV7GCfwnvg0/pXR7EiGxmQEuCqps/LARS4xCTZpW8wvKXsiUi9CsKpbvakVHUhc0AgIBAQqAYB
YLk3vXvTuVdc9VH463jmH/+PWhuM6ROeuYLTv7cWpuwxcLpjc/TMWsx8h96ns5o6+0sZomrFj6f+
7Il4Ll68VM4q66K4a3GQJxeDsjk8vCALLqVpSubuVOptRU8oVZWMAUuAq0IjFAoI5CFw2EFH/WXz
vdpHClHQR71/1MjokInvPyje/zlNRrJsTk3FMkMU9FHvIwUg/vm/zYtt8zfiPaVhs6tr/rlHvrGX
h03113tkO6seEVKuDStmiq+nEe0jHzAyypz1v+jNtcpaVbub8wFhTuRhggwBKIV3zvPnnBxHnPD3
laLx8Kkl6WWPq+WFImm0W6pHrtSOmRA+HE8QlEPXhagH4c1WhWPreSGzy/nRdR+2JizZmSF7QCAg
UAqBUR+PN8E6z12+O+oLJ0Q/+smv1Ycc/uc3P3qmvuE9UMGoL0w46IEOvU74r79e9D+lau0bmdED
mySxxnGacYl0P6LxG1d+OvrJpWX2WHJkFmKpeZr4oSxel1HCrUiKVkuTH+zI/tyuV0h1TYDaZaUF
hWS3Yk/YXSDAewL1UGd/RWDUt86u//XPdXQxtIKDkI8rEP8cOWWzQBj1rbPqeUFvzuEqUGqlcZ74
3roOi0eFdw1dm3k7Rnk06REhVbeQPkIMHtmkixkpWvOUvK3r/GWlKr7N+WiXLeMoFzvkFd85r3jO
VFzQ81xo+zKK4V6M219Vs4FC78JLrcMq4n2eVYNXzJRuX6S57uaFvG9i1ZYTCgYEAgIBgVwE5CZY
N2qia0qNGTUhOugfZ3D8M/x94R8PpmvvgfTNq/sj6U2SukbYoYq3esKDP7/7cfZ6pl7SEoCdEQcu
FBqMhTCsN94QCzZThq2U848CmniEZNUFHPGPP7mTGy2UcCtaTGT34cWyhXHEtVrYnKzcEvLUXXdB
PVU0wa20oJC0VuD+0TRb4Z7k90G3ctRUKhUQ8N0bl1zWMqdbkkLhgEAfQODy1oVfOq/JVWTRTbdf
ctFsTodP+xbRdOTpX1gy7MHxN22Maig77JD8z//fUfDB3u8nIogmnXPR194XRcl03IYKypqcKWVZ
Dazo0AfH36zFQuZLqCKVArtATz/6nmv+WX9gCTZ/bvrLrdPuVkHR+PPQZ6Pf3SlTvvY+cALzt4IP
mX3OqHtvTuHSH/zEmo8929Sqr0LVc+vvvyprGfDSi84+8oi3FQEw5AkIBAQCAgGBgEBAwEVgy7an
vnjbbW46DzcwjPmQB9xwZVjNe9aOW85avSMa03hfY3QF7AjNBcwBuz1D+hXOTtGQfuIz57Y7RLrn
+mbO+97zD1P+vrOzs6xI3LNKEk7YxJhW8NIGxSo2Wacp2SmXMPnPjWrrZxYLQbfHP/SFjsNjkSYD
VQB7K/NyYSHywxdceXhHLEi2J1EDXiiiiQNIRl0GDFsJiZJCQ4gR+OhUaLmzB7YQEpco1ASDVRT3
iuyUtM6CGjX4CENKK6gXUHLypPzS1dra2n9f/vPvPib2Zkmiv/riS759zQ1MB/o9AX50w9bbf3xf
1JV5x9VEnzvzo+8dfUzZ2zLk73cI9DAB/thBAoHN35jDlDJ5HPeJNeAW/kFMUOEyEuAiZUkSEuBT
kxUp7soV5RDgCBQ46+Dbvn2L3CULWDHScjr+8Itbpy23lxBjhvfKhjx721W33BAVIsD77vemtx/8
1n5nG0HhgEBAICAQEAgI7HEE/vrM8y/87aVuEeC3n/jDGSN/s/j7i55OtgbS/8/I33xPfTYpvtaH
CfAe7w5XAYu29aqGb2RdvdqQviB87yLALV+/+XNnnvS2g+syoN/xzPO3/fiXrf/3i32he4IOvYpA
DxLgWE9rhrXHG9DH5Ger89H3HDP7Ew09jkEQGBAICAQEAgIBgb0EgfZf/ur+LeZb6fZwI98DHOHe
zl8dtVk7ew+Zeca7f3kHOngx/Vid/vYTZ76NlgGneYZ7Du6qPcA9p0IPSUI3ZeTxn/aQ+ISYN7Ku
3tC/j8ncywjw/Ju/NPMfzv9/Ow9cdSPs32L1BXwxdOe0r1z7zl3fXfTvrfMDAe5jptoL6gQC7AG1
JMEumR3iSHqhI6XIauRnx4QkFa5Gfpkml5RfMnvv41+mrZi3dAPKVlAyf2/r08fkl1andIGAfy4C
4fmTC1HhDHuZfcYh0CfIuLDogY6rLl2P5FaFQBN+xIEVkn94gEKjTfqxfPrsj5Q3+JCZs2id8GN3
9tJG0P2aACfDsH3Rw4UNNjfjG1lXrjIDLMPeSICnP/TSkfdcP+Pss9489ADTnYMGDbrm+utf+uyl
bcfsbrvxZ4EADzBD9zYnEOBAgAmBMADdc7d7bw9Yy7ast/XpY/JLq1O6QMkO2Bvlh+dPSSPJyL6X
2U92cy0CjLD1Nj6Fe7JfE+DCrQwZ+zQCey8B/uJnP7vu4WfogVAzZMibPnLy8G9/97oXPnvpd/eE
B3jFzJoFozf7PyWSYz9QdMpi+BCJXTgtvU+b4xusXCDAgQAHAvwG33R2dX1mQKYU6219+pj80uqU
LlDSvvZG+YEAlzSSQIA1AnC7wNePeg4+jyT4PnBvyA8EuDdQDTJLIVCKAA+ozyDtjnaf9vH3w98R
Z2y649xPMGqvdUW7d5d5G5UCu4cz43c5aoA4t81ICk5L7+Hqg7iAQEAgIBAQCAgEBAICAYE9hcBH
F1xl/3Woz/1CILR96YqrgNCW+uuldsHg9aWXXt533317SX4QGxDIRgBsDywQ7LAgUP1+F+gWWgPM
IdBNn/3Mmw94C7f8z+t/98i/3f7fd9/ZNXjwh047/S8HHtv2vcsLgtIj2brhAY6itMLdEtojzerr
QoIH2NNDRZ8GqmjJ7L0fglVaIWhImTmvauSXuRFKyi+ZvffxL9NWzFu6AWUrKJm/t/XpY/JLq1O6
QMA/F4Hw/MmFqHCGvcw+Sze3dIHCyJfM+P+95YDTPvD+48a+b7/9aksWDdkDAj2AwMsvd/523e/u
/u91/+/lv6WJG1CfQfIS4MdW3bNlwSUNda+8vRbfQ3/trPnls0P+z389+o5j7C8hgWu1vnnM8q5F
kxGtxC/6sYZANOHImLZh3ubRC/iKCFOm8GSZ2eKqPmlEdJOlVJ+VIcBSxvKpy6ZsmCdbww2QmvaA
lfVhEYEAezqn5AuyZPbeJzylFQIMwgB0z92l1fRXb2rb2/r0Mfml1SldoGRn7Y3yw/OnpJFkZN/L
7Kd0c0sX6LmucSSNe8sB4955tLsfbS9WGUQHBDQC4Pv9zyeeWPvyCxmQDHACDL7fhy84++wjO/fb
t2Zobc1rg/bZ581v7tq/7rpfP3PBo1veejDsgicPZKbLpuJ62/iMqTCnQl6kmBGRZKaxivdi8npa
qStzr1i4sH4OFJMc1i/NV6osAY51UHoujmYoOr9l4cy7T1tEDUjS/AF9twQCHAgwIRAGoHvuPu9L
AzJEobf16WPyS6tTukBJ09ob5YfnT0kjCQTYDOLLItfb99feqE+4f8v2enr+3rbPkvIlAR5Qa4Df
NHgIQPHQj34Avl9gv8PWvjZ09asH/vLlt9y5o+alyjtrXrz35pudXhox59a2qPmqFdGKq5qjtluJ
MCbOo2jy3LbxiztWqKLjdSZMXrNBrcyIxoykktFkZL/JQ0q2pGWUKmJ/KzpgsyylM0hetFysHR4x
h9kvHCPmzJsRrd/k+eRckUpCnoBAQCAgEBAICAQEAgIBgYBAQCAgMCAQ6P8EuAb3uIIPAHdFNYt+
eNt1i7+3fuXyQ2u7wPcrO+j1F1887sDd999+m6fXkB4ungKxyDPmKcYIvDJa01wP7nQ+dCg0Fdac
lSURrRxx2tTxIKFmpibJiVrSpGWXKmJeWzatT6pTP3q8LMd7Z+GhAq2LCA15AgIBgYBAQCAgEBAI
CAQEAgIBgYDAwESg3xNg+Njv9qefXXLcfldcOveKSy+BvyFDBkNfQeSz7LEhu1+Hn50v7vR2I/PG
8aPrxVWIJE4cvEo45Rgx54Gurs1t64EE+1mwV1puqTyb27xBLfH1ZITg6BqM4uZGSNdwntRwPSAQ
EAgIBAQCAgGBgEBAICAQEAgIDEgE+j0BbvrsyT+9c80NN991/U138l/tyLF/6azZZ7/9ZYft7OyC
xJEnnujpxS0Lp8M+WJshEHr6Qo4SRkJcPmIY+exmCJZeoKToqrKlpZUqYm6O5JgRo3N4xnL9JWH8
FY6AQEAgIBAQCAgEBAICAYGAQEAgILB3I9DvCfDIEUddeVmT/Fu46s77du6/Oxr0wpSDnjt5v50N
b9o+bsjLr3SterrrrMuvcLob6W/UNncyrwVmCoxB0RACbSKaYT8pi9QmxayYKYOfkzHS6dKySxWx
SwyiXmNoO+y7lYx01hwem5juKi5SUcgTEAgIBAQCAgGBgEBAICAQEAgIBAT6PwL9ngC7XQD7PJ/z
wMMLf/vqw5te+MtfX3tyx+6NO7pu3hp9/Gf3vP0d77Dyr5hZb7a+YtrLFHjyIogaxmW9vAZ42ejT
7J2tpKD60RT8TDmnbnaDpf3SfKUwcJmX7Ko1yBOYeaekg/sYPddqtXJHIziglV7M5/nC9OjWEALd
/+/V0IKAQEAgIBAQCAgEBAICAYGAQECgmwjUVCoVEPHdG5dc1jKnm7L6VPHnn3lm1S23/GTBgt27
do2ffva0eZe97bDD+pSGvaFM2veDe6OuvikzfAbJ0y8lt4kvmb1vfmYmfMZgz92gpQ2ol1XtbX36
mPzS6pQuULK/9kb54flT0kgysu9l9lO6uaUL9FzXeCUNBH3C/dtzRtLb9lBS/oD9DJLsMfADf+ri
i2+vVP51584L/uWGvYH9Ugi02cm658w3SAoIBAQCAgGBgEBAICAQEAgIBAQCAgMCgQHrAR4QvZPf
CHD5inW/sNd05mbV+fL6fY4iHuB+38jQgIBAQCAgEBAICAQEAgIBgYBAQKAMAt++5oZLLpoNJfZe
Anz84jKADfS8D80YIC0MBHiAdGRoRkAgIBAQCAgEBAICAYGAQECg5xAwBHgAboLVcygFSQGBgEBA
ICAQEAgIBAQCAgGBgEBAICAwcBDo9x7gRzdsvf3H90XZS9Zros+d+dH3jj5G9lvwAEs0ggd44NzT
oSUBgYBAQCAgEBAICAQEAgIBgYBAEoGB4wEG9vu5M09qPu+TGX+fP/NkJMnhCAgEBAICAYGAQEAg
IBAQCAgEBAICAYG9GIH+HwLdFR184Ftmr33hq1d869IFrdYfJM7ZOuigAw/IcRHvxRYQmh4QCAgE
BAICAYGAQEAgIBAQCAgEBPYSBPo/AaaO+tugQV1dXTPOPuvC2bPN30Xnnw+J8I2oQYMGSDP3EqMM
zQwIBAQCAgGBgEBAICAQEAgIBAQCAr2BwIBihrte23Xfqi3wd/+qrQ/e/8d9BuEHkndF0e7du3sD
u2yZp58a/fRDVVb7nRnRQ2dGxzql09JLVdMjQkrVGDIHBAICAYGAQEAgIBAQCAgEBAICAYG+gMCA
IsC7o92nffz98HfEGZvuOPcTgO/rNa93vv7S7t3Ze2T1hY5QOlxwZgT7UT3+iK1SWnop1XtESKka
Q+aAQEAgIBAQCAgEBAICAYGAQEAgINB3EBhQBBhgffaFCvwd8fTEE1Z95T13H/3D4d9Z/l/vOPrH
h65/05q+A3qGJtf9OILtqa971s6Sll6qUT0ipFSNIXNAICAQEAgIBAQCAgGBgEBAICAQEOg7CAw0
AszINq455eub5+3ztv0GH7o//MHJygN/OOH2CS7ux34IPa6n6wvoIz1V/eBL/HfBQSoRMnznmIhd
qTI9OsaTWVbnlZZbKt9QnHo59DquzhdKnS825AgIBAQCAgGBgEBAICAQEAgIBAQCAgMOgQFIgO9+
6md/fu2pwQfXvv7cK7tfhCXAg2r22WefA2v/84WHHv3zo1YPPvZf0a3PRV+kxbpAGqdH0ed+oc5v
Hx59bjH6Y49fFU0/IybJHzklilZh+vzHo+mn0Erdg6KfnhLdeofK7KXZHml5pfKNLUXCUR+IvhmR
MoujW6Podk3p8wWGHAGBgEBAICAQEAgIBAQCAgGBgEBAYOAiMKAI8JsGD4Ftr76+oWXIofvv/tur
26c/dfH7vvz6jpfgHHpw8CH7jV021u3K61ZF0QeQ3878QHTrqugxyiHPo61Ikk8+RhX9wyMqRPmu
30Z/ODCq1xIf57jlrZ4A5gxpGaUKWp1HwuPRp/5LlYbW/eGdsQe7oMyQLSAQEAgIBAQCAgGBgEBA
ICAQEAgIDDwE+j8BroFNnuFrR/Ch35pFP7yt7Xvt8GPQPvvUDKoZOvjNX3v/vAemrZlyxOTdz78C
iV3e3bCejW5+PJo/I/rI45q7HhN9JEKvrwmBnn5g3PXbkgt03wnR0c9Gv3oOJUB0tOdIk5Zdqoit
pUj4Q0UUfjbaVkRUyBMQCAgEBAICAYGAQEAgIBAQCAgEBAY6Av2eAMM3frc//eyS4/a74tK5V1x6
ydfmzgEqPGjIEPj4r+q7muij7zqp5k2DMTHl2EyMMcEbo2g+xz/rvy9vzbIF3F/qjmj4KYkVxbKA
V1puqVzz676E3CpChoBAQCAgEBAICAQEAgIBgYBAQCAgMDAQ6PcEuOmzJ//0zjU33HzX9TfdCX83
L1kFvt8hXRALXbPz9Rdv2/aj76y79p9/Obf27W/FRPoysH0cFH3zA9H8OzAQWm129Vz0hyhC126p
49noU7DmVq8ojotmS0srVbxqR8JRdaIw+Z9VmHRxmSFnQCAgEBAICAQEAgIBgYBAQCAgEBAYcAj0
ewI8csRRV17WJP/WTV33wh/+sv/BdYf/4IgLfj1n+Y5fDH3H2/Z5fRAkwiW3By+ATa0eie56NvrK
I3pTKwqKlhtfXXAqbXaVdhyTCH62YqQhQNovLbtUEVNLk/DOWJ/vnBLBouW7ikgLeQICAYGAQEAg
IBAQCAgEBAICAYGAwIBGoN8TYLd33nv4e8cd+CHkwIcduP+wg4YM3Q/ywE9IhEtWfvhoEOz8/BXa
Mgp2hL7/wOibtCP0Xb/ATZ5hWS8vAz6pojbH8hvDcyr4GXNui9xgab80XynQB2sETn5gdLv40pI/
PaVeYLyPf1BpDgubzYZYacIHtIWHxgUEAgIBgYBAQCAgEBAICAQEAgIBAYVATaVSgdPv3rjkspY5
AwkV+OIR7PnMu15B5DP4fi32C4t7B+QBLPeLlZj0FmwjsO6BcVzeuvBL5zW5bVl00+2XXDR7YLQx
tCIgEBAICAQEAgIBgYBAQCAgEBAohcC3r7mB6cAA9AAzEEB3X29+ffeXd8MfnLi+31J4hcwBgYBA
QCAgEBAICAQEAgIBgYBAQCAg0N8RGLAEuL93TNA/IBAQCAgEBAICAYGAQEAgIBAQCAgEBHoWgQEb
At2zMAVp/QWBEALdX3oq6BkQCAgEBAICAYGAQEAgIBAQeMMQGPgh0G8YlKGigEBAICAQEAgIBAQC
AgGBgEBAICAQEOgXCPR7D/CjG7be/uP7ItzrKv2oiT535kffO/qYftElQcnuIBA8wN1BL5QNCAQE
AgIBgYBAQCAgEBAICAxIBAaOBxjY7+fOPKn5vE9m/H3+zJORJIcjIBAQCAgEBAICAYGAQEAgIBAQ
CAgEBPZiBPr/Jlhd0cEHvmX22he+esW3Ll3Qav1B4pytgw468IAcF/FebAGh6QGBgEBAICAQEAgI
BAQCAgGBgEBAYC9BoP8TYOqovw0a1NXVNePssy6cPdv8XXT++ZBYA996GjRAmrmXGGVoZkAgIBAQ
CAgEBAICAYGAQEAgIBAQ6A0EBhQz3PXarvtWbYG/+1dtffD+P+4zCMhvtCuKdu/e3RvYZctcMbNm
wsItVdULRWt8hdPSS1XiF0KpdFSrdCklQuaAQEAgIBAQCAgEBAICAYGAQEAgIPDGIzCgCPDuaPdp
H38//B1xxqY7zv0Eo/laFxDg7D2y3njY02rcsnACcNAFo9tmJHOkpZfSPFUIXJiyvm0zuMu7NrdF
zfUzV5SSGzIHBAICAYGAQEAgIBAQCAgEBAICAYF+gcCAIsCA+LMvVODviKcnXrDspmVz5zzffu0+
Ew/74ZzZnX96vD/0x4g5DwALfWDOSEvZtPRSbUoTsuKq5jUz5s0ZgcJGzLm1bfzijsCASyEbMgcE
AgIBgYBAQCAgEBAICAQEAgL9AoGBRoAZ9MdW3fPIBWc3rP+PK47dfeUxr05Y97O6n1zzp61b3S4h
r6jxeCZ+scM0GRaMaTNXmCsiXDgvhtgnLYrySuXbkCOBQ6/j6nJDmrdsWh/NaJysqxoxckwUGHA+
8CFHQCAgEBAICAQEAgIBgYBAQCAg0O8QGIAE+M/rf7d5wSVnHdk58pDoiEMGHfr2IWPf/dYLTz38
lhOPf/6ZZ6weYo/nAlqsu2Xh9OaobfMi5IJAIOuXTaWo4K6u5WNkWPDiKdOjWyl5xprm6aqkiSHu
Wj7VS7M90kTksbdUvjGlSFjTXK9ULBLSvHnDmvGj6+PK6kePz6855AgIBAQCAgGBgEBAICAQEAgI
BAQCAv0OgQFFgN80eAhse/XQj37QUPfKfvvWDFv72tDVrx74y5ffcueOmpcq76x58d6bb3Z6CClw
1HzViggigaO2WzkSWJ5H0eS5Mix4vM6EyWs2bFYSx4ykktHkOSxCHBnSMkoVtCWfhBnLH1BKSIJf
UCBmW7+puu27SlQRsgYEAgIBgYBAQCAgEBAICAQEAgIBgTcYgf5PgGtwj6uuLvjQb82iH9523eLv
rV+5/NDarqG1uAW0OV5/8cXjDtx9/+23efAdMWfejMVTaqYs1gthoxUdiyNwo+oI6Jr65jVxOc04
OYWo4ojTpo4HCXEsdZL/pkjLLlXEEFIkJBy6GNJc+ki2sXTxUCAgEBAICAQEAgIBgYBAQCAgEBAI
CPRBBPo9AYZv/G5/+tklx+13xaVzr7j0EvgbMmQwAP3aoH0k3EN2vw4/O1/c6e0DjvpN8MZoxnKO
f9YHRUanHbS/1Oa29UCC/SzYKy23VK7BdF8CVRH7seEHhETn1hsyBAQCAgGBgEBAICAQEAgIBAQC
AgGB/odAvyfATZ89+ad3rrnh5ruuv+lO/qsdOfYvnTX77Le/7I2dnV2QOPLEEz1dhGt/xyzHDwDx
it4oQkJcPgoY2ehms6I4rihbWlqp4rbkSEjwWfRmZzp0JzfOkI219sQqrkbIGRAICAQEAgIBgYBA
QCAgEBAICAQE+jYC/Z4Ajxxx1JWXNcm/havuvG/n/rujQS9MOei5k/fb2fCm7eOGvPxK16qnu866
/AqnO3jrq7mTeS0wU2AMioYQaLE79ExFjf29uWKm/HSuTTfTpGWXKmI3aRIWT9H6rJg5ZfF4aF2W
NGDAejcvtRFYdv4imoU8AYGAQEAgIBAQCAgEBAICAYGAQECgzyHQ7wmwi+hbDz74nAceXvjbVx/e
9MJf/vrakzt2b9zRdfPW6OM/u+ft73iHlX/FzHqz9RUTVabAkxfBJs+4rJeO+mWjT7N3tpKC6kdT
8DPlnMrbSCcOvzRfKfVVoylmDbL6ipE/PaXe8W3LRy9gfWBhs9kQS390yRGO6sFG16Q/+ML1Blp9
zliDQgGBgEBAICAQEAgIBAQCAgGBgEBAoDsI1FQqFSj/3RuXXNYypzuC+lpZ+OLRqltu+cmCBbt3
7Ro//exp8y5722GH9TUle0MfoMoLRm/ea0ns5a0Lv3Rekwvsoptuv+Si2b0BeJAZEAgIBAQCAgGB
gEBAICAQEAgI9HEEvn3NDUwHBqAHmKEHP/CnLr749krlX3fuvOBfbthL2G8fN7ugXkAgIBAQCAgE
BAICAYGAQEAgIBAQ2IMIDFgCvAcxDVUHBAICAYGAQEAgIBAQCAgEBAICAYGAQB9EIBDgPtgp3VIJ
FvTutfHP3QIuFA4IBAQCAgGBgEBAICAQEAgIBAQGOgKBAA/0Hg7tCwgEBAICAYGAQEAgIBAQCAgE
BAICAQFCoN9vgvXohq23//i+qCuzP2uiz5350feOPiZ0+oBHIGyCNeC7ODQwIBAQCAgEBAICAYGA
QEAgIFAWgYGzCRaw38+deVLzeZ/M+Pv8mScjSQ5HQCAgEBAICAQEAgIBgYBAQCAgEBAICOzFCPT/
EOiu6OAD3zJ77QtfveJbly5otf4gcc7WQQcdeECOi3gvtoDQ9IBAQCAgEBAICAQEAgIBgYBAQCAg
sJcg0P8JMHXU3wYN6urqmnH2WRfOnm3+Ljr/fEisgW89DRogzdxLjDI0MyAQEAgIBAQCAgGBgEBA
ICAQEAgI9AYCA4oZ7npt132rtsDf/au2Pnj/H/cZBOQ32hVFu3fv7g3sqpa5YmbNhIVbRHFIqLGS
4Cql0pHMnVLvloUTUvPTtUJSqm5UKBgQCAgEBAICAYGAQEAgIBAQCAgEBPo4AgOKAO+Odp/28ffD
3xFnbLrj3E8w9K91AQHO3iNrD/YRs9YFo9tmWErAhSnr2zaDC7trc1vUXD9zRaaWkL2+ecxyzA6H
9R2kLQunL4vG78FWhqoDAgGBgEBAICAQEAgIBAQCAgGBgEAfQGBAEWDA89kXKvB3xNMTL1h207K5
c55vv3afiYf9cM7szj893gfQdlUYMecBIqwjrUsrrmpeM2PenBGYPGLOrW3jF3dkMGBguMh+F032
tZEuzps3pk+2PygVEAgIBAQCAgGBgEBAICAQEAgIBATeMAQGGgFm4B5bdc8jF5zdsP4/rjh295XH
vDph3c/qfnLNn7ZudWElD6zxriZ++UKKMW3mCnNFBBX74pWFBFFJkb7dsml9NKPR8NkRI8dEyIBT
tN1y97I1IneiAubGfmpcRJOQJyAQEAgIBAQCAgGBgEBAICAQEAgIDBQEBiAB/vP6321ecMlZR3aO
PCQ64pBBh759yNh3v/XCUw+/5cTjn3/mGavj2Lu6gFbkIleM2jYTWcSQ4mVTKQK5q2v5GBmCvHjK
9OhWSp6xpnm6KmnilbuWT+UqkkHJm9vWT4mJdq71bN6wZvzo+jhb/WiKYPZri/wXchsKLmh5oL+5
UIcMAYGAQEAgIBAQCAgEBAICAYGAwF6DwIAiwG8aPAS2vXroRz9oqHtlv31rhq19bejqVw/85ctv
uXNHzUuVd9a8eO/NNzs9i6Qyar5qRQRRx1HbrRx1LM+jaPJcGYI8XmfC5DUbNiuJY0ZSyWjyHBJB
EphMx9Q1K4w51+TWbwKW7tUWiy6b3tFIbF2sGA70NxfUkCEgEBAICAQEAgIBgYBAQCAgEBDYixDo
/wS4Bve46uqCD/3WLPrhbdct/t76lcsPre0aWotbQJvj9RdfPO7A3ffffpunb0fMmTdj8ZSaKYv1
ottoRcfiaE1zvd5Uuaa+eU1cTjNdTmFaetrU8SBBuHhRQjIjhjFT5moPJc7VlgROvVWRbbNiONDf
apEO5QICAYGAQEAgIBAQCAgEBAICAYGBiUBNpVKBln33xiWXtczpj0289PIln/r4+GFvO2gQffQI
ji8fc+T8d70Kkc/g+zUt2tnwpid37L72laMXbfavBAaOO75ts9o+GaKJp0S+TaUwrnnDPL3blIqT
1nsuU9DzmmgGFvRIgKQFo6mG+MzoZyXZxRO/uZ5YW0sNFb69fOqyKZK3c1Vxqf7Y2QV0vrx14ZfO
a3IzLrrp9ksuml1AQMhSDQInnQmxDrVUshP+D2ed/E/8rzpT0gdz7s5KVMvFVKldnbWDa1EEHPAF
M8g2OKpAImcf3BntqoUUuNSJ/2JmysYVYX3wVxe3gNJJDh86g8pPMlVFlM3obESwLpweq0kCjeIm
T1xx6lmiOqqadXAOrJIyQ3tRXWqFBNS0QSUqSFUebCyVNQ2PMRSdolHRDSQ8SWCnQYOuqdrgvAJX
uRXcwanKY2fJpskWWc3FllIb+cQArYqTSp27SAsAAU6ktfG5VolRkn2m+kkVRJUmDR4HGSadPqlA
h9lZ0D5ZgeQJmiIrqS9xSpWHaY4pLxqIacaqrRNh7dLylRh5lZPclCo1Ll3MAFi6ZI8USANQCuc8
8ib1psgibscV0xYsx5hQxokU1mMAuk8hTqnq4FtA3iBFxWT0iNHQOskU7d6M3ju3GlXNvQMnuT2e
nsF0OsurHjoLB2mlKRBZVXPtruEZcOTzzYgsYYFGpVy4HIVZMdN3EqhCpmU94qQJFVam+O3pviAK
Kel97AyOpn9ueunioUAeAt++5gamA/3eA9z02ZN/eueaG26+6/qb7uS/2pFj/9JZs89++0sQdnZ2
QeLIE0/0IMOuUgwd5hW9UYRLbst7a3FH581qRbErAfe1SvqEMzppcuMMqYDcE8vVFv3PcSg2Sx0z
cjLtL22O5TOQ/NofSMqzk3A9IFAcAUMRkSNp9svFO4G70GWgVcxj8Sf81QmSpq4S2cHMyIUgpx6A
wi9+dcEAS723gK0BhSbCg5eQS9fF+mq2yHLoALYmMmj5fI20Ym3FnxEHstP4TMalWBt1ppogiLeT
hRN0o5DHxiliUsEoisQywdGJicXUFCYUEBmij7oXdDNNg40WLEqrgOUoDwjB/1b4qhkfC4KtCuFk
BB80kaFy4qn6OZgFJlE2vRyPvEkLMTTHERjPCJAOoAmrytrCTzxwusQ0JT6pMPvFuRWjnidbRhLU
7g4BDcW1xmfYeD1iK1eNye22QqZIqmCKcF/45iNiHdyr2fmpIblNcPMUSckVa2UookkJmabh7okl
BR9ZIimbHFZLHbNtiavnPMYUTUqJVmdn5duwTBPgtjK0zZUtVc1XkkGWtcsUORNRTMPitWc0IV/t
XGXSM1gmzQpXaecubpmqF6nFKCOJsSyocMt+WEk1uBOtG8qnp+kRSdTTdM5pi/WI49rTOqXA85Bt
np/w8sS0I1UfU2n2SZ4O+TYZchRDoN8T4JEjjrrysib5t3DVnfft3H93NOiFKQc9d/J+4PvdPm7I
y690rXq666zLr3Bg4a2v5k7m1bVMgTHMGEKgxe7QMxU19qO6Yqb8TC/SXFcC11KsV2AlcaPZYUtt
zsVlfdqqCGylAuZI3RO6aPUhX0CgFALgXTQuX6ZbcCDfUiecAswHKSs6BiE/ss1a8PiRg5coDQ7v
kDWBJ7AWs1F+4W8kHyY6jVEsES2qS8np3FUROjM5wtKkhtZIESqUw1eVgjjsM1pTWuIFyU1hmVQQ
MluERDdX1ZqETyXKF79h/smXsSwuz7FW4n4MLKnOv/ggoMBTytDpFFIa4EUkVW5qJuUgqOmUMaR2
wXudr5MrOG4jO+Gxp6gfUbAubiTQJfL6Kg2gj6h1WLuhykYBZ8Rm8EUDIPkVghr/TbA7zKihUHQa
Wk2NBXqgzUmjgInEfsmdThZoDncgwqU063NHe1aKHBpi+x0vSlxXqTMvPXNpmEmxrTFZWfERqiyX
LOVi4me5VEr6sqyxZhFu7B1BShdQKSxzMqeBY2YZ0AhJhhm7e4fUbKXGUDMItu+SQowuJZov6pLW
xY2yMPHarb/50vINJSjATCxpaYTN0AOT39YtDfY0IzfdIfslCY7ERBqhde4CkmPbaXRFwiW7vqR1
SrJnmpChkrpkaWXeI/guS9XAmJldqY90mdkNl/JxBUoTDNQSLyPZU5wvA8AUTa3mS8uXlNiFy5Yn
qzZ3Md+q5o6WZZLQJZ5j+o6T8wJs5ypFl43nUyiFXjp0Am8teQLvI05hxKwTiVtJiwrZCyLQ7wmw
2863HnzwOQ88vPC3rz686YW//PU1iHzeuKPr5q3Rx392z9vf8Q4r/4qZ9WbrKyatTIEnL4JNnnFZ
Lx31y0afNiID0frRsMezyjlV7XwFEmjr5zhdh0onBKm9m6eYRcdqD2dUADafptrBP81l07QF37Op
C3OnfBG4oE2EbAGBsggYloUcCfgPvl2QmtZRcLLiqJpuIk9hTyy9DOrIuwhcqw6ZCZFeZFDwLxck
8oZyFNWBgviCoVho89ZFyqQCmFl3ZGumFdrvR9nVQEETKJVZD14Ns03yUhLIMs0Jeaf5kOMwShAc
K/6JfFIUMfRSRRQTv+WC9r+a+uI1foMSsxXdZJTBdjE1pX8BQ6OwprlKGnJaLQJLqVkMmpjgqHIx
qFGqcSw0c2/8P8LFQtS/lEhNwMaqUvgf3XCTgUO7+ZBebi6Dl5S7vrNOy6yDLobLJJaaprRg5ZUs
0IcoLpYiEFg9fZUD3fXhUhGlj1LNOzbVOhv11fhP+pFynBKxBiln3iGjtDffgNWWlZGncHHZKLfh
nhRXMqUUkZOBisHTlZOLZZUZUhriB9mMra0TbbpYKo0G0CXDauwGppAZHnlL/N2UrIan8fMUelkc
QyYD+TdONrwuVtkWKziYd4aFE9PoummdqzZe8lbND3NJ9iS/Ko5Xcr4jHzdzK3l7kPXhS3ySVN6Y
mTsfUWSGq1CzvHDJ96nbuXlyzXyKsS6rK1MfC2koud2aaWDZjy85e5Voinn0eU9UXJLoI0bJ6bU8
eML1KhHo92uA09oNXzxadcstP1mwYPeuXeOnnz1t3mVvO+ywKkEKxfoPAmEN8B7pq5PO/CQOL4is
En9ihxuS4QowVfoJHLVCvAVyAo9C3otRx+wexJEcTZQqTx3mZAm4LlTxKBRsPGyKiYHfmNfHQk5i
zvT+gAIVpECkS5FDVS3mYonD66I80GQ1OFGTn0S2IjUl85gXnhxIpb2JTWanHqUZZUAV+XWbbIBo
DPJbZo80c2EdxH4RTPbVkxdXNd8Wq0omFSOZBiWOW+YVxeow3RnraDVZC4xzmvET+qUrxCWEGO5u
3Xy61klmE+ttMoDBNJZfA8yjQ9fBm5FS3hpECdNe6yTNNorYTzcUMs2XMiTPUVA7gd/ePIwkdpP2
n1jjS1nK5HFLWSlGoLehribV4GHhzEN52SkpfLVUXRk+LsvepAe4J6cGyrdCdqjsiBKwZ2DLlwza
aSfpKFuQpmlbqptUZvfWs9BzNTfVSFqYrLtEbxYEJ6WuIg5VaXXZd5kNoBec9Fab4lgjeUfdqt27
3pTKMjYvSgU6IsMkWLfilu9RLw0fqJUuhTXA1dySeWUGzhrgtJaCH/hTF198e6Xyrzt3XvAvNwT2
m2cS4XpAoHoEkIuQ25Zdwcys6N9aZKH8kkDShWQY85jtptBdwEwNIl0xgBZy4m8M5SVPoB5cqh2S
gFHHfAyvo98YX6ioAkRTUxuQV8dhvZwS/yvGrEqUXv1LRNrauilSdMuAU6EzVBj/y06AwofNNq2y
5nUoBMZFmNtzjdonjFcJKFaGoYRZAIyFxmZrHy9VRNkwmS+xH5XSTSXUcQQmZ4hbqpptCDMHQpNE
7gLtuNUyuS6ul2vB/KoMX6BlvXIbLcxHwyOuWx84e6Jk4ew4g8/SwGzwJ+OAVdL0OSWqg+RQZsKn
zumvDNeH9CaVcM7Emhc7MwzKy2+9/CpjkG3qLGKZKXksTORw3Oths9qZnccaMsbd7Kw3dn2JRVK8
oOczChcKk5KGpNs1nEJGmDjhRGX2OScWepKieGciyLbRwl1Lzrc/t438FMq2SUeu8chZrjm3c20l
i2DLd7elktRc741noLBODG7GDFwT9QLozZZofdqclEnPsKJk2713WdE+TbMu3zul4A2C7+JklEHu
bZ7I4LI7eRd47whdHlutnuf07tBhxqySNR1pKo0BzDYqo5ixc9e6kqq6Tw/3rvSMBEwTkuME1ToO
gaYjNRY6/wYOOapHYACGQFcPRigZEAgIVIUAcloKYFZhtPiTKApuUqV4FK4OBY6Kgc3oyEVuRgtW
MZ1W/NZCaUWG0SsMfDgOygVijD5k5GO1nUR06X0Piez1RRatdhABmezhjCmQZnGCVeGbSYYNa7al
1GaSWcE64kE552GxcEkQNP26lVV6gUzQP5FDkUAxljKiZK08KUBaKYrL58iK9YFA4R9kYMRQZ7WV
NLFQ5ooKeRUpzYV5/kL1F6ONTJj7iPgtE0sRCI3ycfG2WdqNcmgsrhkvhXeytlhW9wF4aBWTR7l6
mAWwqghqmgQxbYI8auKDYx1joCocJw8GgP9RxWklM3cxHWhPfIbc2O6EXGabPc2PjdJb15iT7IFj
3FvckORQ3k7h3BYtiUWkn6UNzWWJZB4z2s6ni0UUED1rZc/gFV7y7B2AFlOhJ3JZRDeXVCTHu0oD
7uXs6QzfwN3tFDaz4q6nLAhcVmls0jqRyqeYljR7o6TUFm9Gi1MVnBdw+WQSTIWSLxZaWlQ+oeUn
hpf4WVTW9LJ1Yt3UGn3Lhr300gKQNUnje0qwBNDYmDQ2PnfNj5K9txtLTpvUyHk4yOpMvXyScSnd
RhkBQ335vCgmRmwRM+PMGRMWWTcSvYjFFB6ixKMUPrHmaEwKVdcJry9m47IHizzAs1UKVzMRCAQ4
GEhAICDQfQSAX/BfwgMM7LGOvIi4NRE+zZmS8Z5MvFqYPMBIaRTvUqQFlgTrXZ3Zp8dvZLzKZIO+
jUTuUAqxVmt3iQWxF9d4g1XjJJE00qRkcv8m3pdaCGmOf/HwtC75k3zIhp2Wh1MtD2Y/J78Rk0IU
GSUcmC0zp5XpfE7EnktrkklLrBG75DJjoo6Gqcbh0FRYCeaKFHtUNFJOLuAV5NKQhQLauaDGmk7w
pS4DrdVF4rd0bhZA6tkF1XQzGqDfynOrxgdsMEiqiVfjUmRlf4SNihdQiis0VF2JmZEEytLZwudy
mGUGXuaSISHJvuLeUZjlDLitUSk32Ri8NSQy1XgJWLHRUvZ4l2twlc9oqSzi8Yo40sxwNrsiqYNh
ehnq5V4y4KX2iAugNyV+HLndTimcwWVBJsXHcr2yLKYhe4Fh9JIB2QspKqYnWzxBWiDdqqqBugle
DS0zkNSlIP9U+kkqYs5lpzj6FI/HyeaffoDSwJEmITkMS9Gl4rarB3i84bN8pBhLTpvg8OvG9FJq
aAinLFDY9qBQGtE1DfFnYB3ch5ixJXnJbYwFMj1ApLVbD5BCbNyYLp9wH0nrcnstqZjNbOmq1UEy
Bc69T9HUvjMqmadE8vVX+kYOBQogEAhwAZBCloBAQKAkAkxn4ajwKwcXAKv3oiJU8vkev5WZd2Fp
zE8vA+X6ozeO4muaZZkAaaSC5hVC+wzTntL4GtKKsDppB2Xmha/WoSatsQbShwVSNg/lyK4lpXYz
cNFrmO2ZciqHopkbi3+NREP/tH608bJ52dM5jiQEyXR1VdxUqInMNoaFG24gVfmUTKqL3bYmB55g
uqHEifqJNpMQQ4YlQurzv3EtcWMTBANMhTdI4x5XR50+SaqbyMNZvINyd1zldwoluzRnNJbM7LMf
Kwf9lMNrvu5yAF85b5rU0NB7zuk20E1JIzBpZS3OxmjLzHKKwauD6aMM/ItobtAo10dczKUNXj7m
ZnZG84lO8TxAEtfTZitym5Cboai9yIYbbUWiV0Mr0UseiiqQnU+yhWISXfuXT4Ci81ayLou6uGpk
GE/mfZd2r/nTXVvKs640wOTUgHkyeC2qBMcr1juJe81nZjzp4worN7FiPULlDZ43QWAmd4wm7nxT
1t1HY6FC2uZpUhzRkDMNgX5PgB/dsLXl6ze3zM/8+/rNkC0YQUAgINDLCPDOw4r6IiVjlyZPeGt3
X4WYEi/I1EuFmV5iCXx58EuCRuQUXI2namMt9S0lzVTpO8DqIKKFOZEw0O5ZVCMuE9XRvDzeSIDA
1Is/2MOeZD7iAS7po0ZaqixlgpqZdbIKlNbNl5b5NhLroEcwBkNdjcIn5sNMiRl8gg7XWrNTlLcZ
w73EEBCKKuecYt0slaNSeGIAYkc9pfB+JNRBqh6DpF5IrEK8GEDsL5JDHac82xC7jle1/FgBmpKn
SwpAyqLMBhur06U5oRO4wtunqdZrEPQnkYxHmjKwYtxZiaMIfTKT/ShIbuiVHI0VGtmYyqULghPV
bIvvxGSguyM+3GFuYSM0DU8jWhImiy0XYT4u1O6IOYPWZg+vDZF2W1GOObhauilluYTpIz6xPE6u
ARTRQeThwTcTFYmStNKSInV2r03yFIx5DELebGLvTKYYbctp5YU927wzFwNbN285ZWSvWfepFOQC
qK8WnySCEtmTRKkc2Krd7aZ0S5aGVO45lo2jdQvIe6HYk8qLm7kFrBk02cV4SSLA1aWluPOMvjlB
09bsGQEJSUJ/qiVR1tQr77KyD5wqTXlvL9bvCfDtP77vc2ee1HzeJzP+Pn/myZBtb+/q0P6AQO8j
wPyKySowJSRLagesmDsR9eJIZtwLmoOZeZUp/L8O46KZDNOeWJSBdlGiNcMUCqucvdQcyM/Mhugr
rQrW7zliTciE8fM5igPj+5GyKnpMBakIZq6LEWI+DMcuTqRK9H7UpFWd5iGQQbE+yp9Kg7WeqhL1
U76P2QNs6tPnqIc8V61VtXKIOLNKAp9apz+lC1ghFyXfLNJgDh3XLJSR5PexxkQtl1WrhVkbqh3X
2epPKFF+bgH2JtaLfBs/7KyhVrVwNrVsmK4KsFhrTOQz/W0kyiJCyuVGWQoianXd4DosxdSdyDDY
g+4OBoRq1yv6iMCrI4Nfmdl96ySDrWmp6f/NGIxal3gkZP5AZNJIclzHYvCU4dHyNt/i+cxbLK+L
spYYUu642K/LEGTLt6haRmbTfaaK7I4rUntGHutSandmj1CzB7V57DHflsikDQcw+HvJQDkyw/yE
TU6eGBrPypnHkZ4uM25DQ8vdkzTY7fZ6OWSaYo6qRcwjDeFCrMbqXFaA+9Q9ETcvbHSkzF7vSJDY
A4luGU6xetbg5n/+SLgYJTnnwoqZyQuHc7pNzpgXy8XNlsb1SnCsaRQLNwGXIYoxbmLSR1qXsX91
Imwyniu0EJCvaQlXsoUFbck8zQrZTxqI3o4r8iwIeapFoN8T4KgrOvjAt8xe+8JXr/jWpQtarT9I
nLN10EEHHgDZwhEQCAj0KgKGWhDrgI8A00JNXM1LLISol3IJEq2VbAR5ryY8wIoV10WGg7RTMS3a
hAnoMbs3mcRVgFoxL6VsQI/ZnYjnWAtSMh2FG/s2oaDhbzEmMv4ZBwpULTuHedwQjx7YaUycEQ/T
dD6XP2PxVqr6aSSbVzI1gXROcGkGgY+YQwrvKF+yamHfr/IA05bLNDFBkxS6RdQ7mkZqAW51ark1
zxcYCWpFt2o4h0Abny1RU7zEMyNUUAmu0+0gPbQ3mHfnUq1UVJnV40pJcw2CnuBnxJX9KN1U9AHU
gkV0PLzWh0Q5+9zI4UvGVe8oRyuV/l93WG8NRs1YMF9W0RwZjJ0ZlMQBuyFlH2Y5JubRuZXTSDOX
ZNVFxpFWHiNQNtUrx7B0botFAt0UI7CHuzibEpta3WyGIRToVYuceDtRijG8tIBsncWabTElHe4k
DSZtzojzcKdIXldIHwurtCkkL2EWFbgd7Rqw1NO6KYre70YNw0JZB6GeMuCMR4EA2VhyDiO1YJGE
U9ZeCPFymYoikyZVvvJ8mBi45I1v7nc5I5boYmk2uRNVsteknnm3s2y7d+LJbXTOVJR8DvTCu6Bc
1+4dufs/AaZ++tugQV1dXTPOPuvC2bPN30Xnnw+JNVE0aNAAaebeYZOhlf0VARjjEBUhlyB90Ahp
FW7Py3Gz8VGhU4s1GlJHjEU5AIk1oRwuonf3VTszIZ/BnOTVZIJE8UWQGUd+6Eym4moWnBUkObG3
V2jhG+Hp4YvJpimYziyIoqBXXlHSNWl1sjXotPm28uuq7a98DJtZovmXmyr2DxOuaa2bapJeoEs9
IvsEZdCchTm47RpPpYbpN5OTBrtKmlKE/ckoXTurjQ3onAlESA8lEM6VWg6q5PilVcqCGkNdKHyw
Do+PwUQxivlb+IufZlyFgIivy8hBs0sdPfK8VMfb71Z3m3GhyeyaU4qBpTcr/4rFE9wRXmwHwv3r
MmGTLe1SKebpcrw0Vp/B9mXjvdQ6H520HBkdkTeGFhNqjvSUst4xtLHSggiUbmwa86TbWR0pCmdP
wfg1yb5xGPA0blysbV7m5jV4d84ljvGx+JvFewuA4yqbRinlQ0neX94ZK8zgouTFLWXOi6uQsyde
w0ut3aio3rz0m+Eys7p5luM+bSxw5MMZMnt6SuIrq2M1DMk0KnF+qXMBc8qhtb6Z1iypebM5BTQK
WYoiMKCY4a7Xdt23agv83b9q64P3/3GfQUB+8Y7bvXt3UTx6L9+WhRNqzDFzhaoIU80PWfmKmW5m
Rzm/zN5rQ5AcEEhDgEkKUl8iGLx2FFfgVFQJ/I4R5CEyrEOgIY/yA+MJ+431Klz8YBL9JAcm+jAp
Lpr+5bho8AbDH385idaCkueQP5Vk3mGUH8qSQ5VjrdXaVNESw/r4hP5FCWZhMJ2TBM21uDT+pEr1
T8XUQPOK3oo5gZipyZBFvqwcpyzKvJ7FlLDSjEl+wguqipudscTu0OhIp48hKTJMlxAcQhadrqiG
/lQSqkG9oxuD9ZC7WHWchoYjxk0vM56GgtJPcptjEirMUfEolqvDxlIgNMdpxw2iTxmR8QgXN+PD
O1or0MUJV4SX2PbI3jhkABrOq62oIAUO8NerVAOlV4olGg+V5XBQ9SX5MOc3lxInxvzceQ1r4MXF
REd7fnIG68j83Is7FsxOYU5oAeItksa1XG9MwRSDvCW5YHFZSnZfbnF3OkN2aBEAVYdksDXJjb08
2R1q53LmpBm4XZab4rdYb6oci7OJGhKVduLI4Y6Qkw4Z2KrS2dM98bPd0cfUnoQxw5LT7mLvHI2S
497C8v61iBbfvBb5TLeZNErJALoMMJHCbwd+nruPIAZHcr8SppBctqoLunTdT+AZAZdzGqNKAmia
oO5uETpubEne+BY4Liaq4RIBhoL/NSeys1JsySTL7vBai8xpnnLWSUIBviY7LmNyrUzfhbxpCAwo
Arw72n3ax98Pf0ecsemOcz/BbX6tCwjwHg+A3rJw+oZ54I+mY/mMxVMmLNySbpXAfqesb9uck7mc
zHAPBATeAAQMwaMTpLX6g8CK49UhFaFr6pM8yGBjdiR8fcQtDFsjssHreHfBymEmOXBCjJRqIWpN
HIbW/TJLpLeUea8Qc7N3h8ZaNDJ8Qv8Sc7NWDtN+yHI0o/fiinmvwRh1VNzS9xozQHEBw+4S089U
kLmx+lfrx61jGPFfo7f+PjDxUaR8aoEu5UTMmf/rFcKi4TTXgEjq5biGKJJ4hDomzFi5Xq7MAepq
WkEppuYFEB+9lljPO7DDWS0uRZqKvcw7llHgOopSjVIh0NRA5eEnKBR4bCHYoUijVSLgjqudGROe
VSFpddQcuBqbKK98ptE54yDP5UjUZMid7Fd4SubASXKYJQde1thL90eR/2aMunIvWZTAHVunKeAW
LMIV8zmPmE2oTqDpPlncFcXt4nQLpYIjWv8Q34uXNf0BeczTw8qfTfkyrSFXH9cYilgX5pH6yzJe
804XaiYmzF1mTqxLSkbGnII7ZeCttwxzyAbQ+xzIAjADHPeSEZRUWD6IXHNNrT0NN5efF8PHTBLJ
2SJv7UUfjK7ZMzE2j0d6VCppKSd8nxrLse5lWz3XhtOsuuhdEedLe1LlopEwOWv2k++7tAdFeSVD
iQwEBhQBhnY++0IF/o54euIFy25aNnfO8+3X7jPxsB/Omd35p8f3qB2MmPPAoslag8lz28avWXZ3
KgPesml9NGPenBGUnzJv2OzRvpTMPdr6UPleg0BdoqXEvxQVBY6B5IjoEPJVIlT0L39lh1mxjkxm
kuYc/D1hcPwSYzHkQb/SsHYmrub9QSuQKUmvg8XaYTtipl65B+VB+YY3URFrKKM3x+J6coV6MqQP
m7hi+S8XNwphfRq9BGhqn221sxSrhaAT39bbWcXC+BJjRcITTUYmmRxgKSc/fdgZSSyXNVCokY3y
P7NYhg5P+JtMnEccaq8sFoUsWrU7xjRZRJP8WtgNi9cAw18lFgjpqkuwx/XO3Xw9m5XxGAtRcNbK
2iPmnhpRdYMFJUBM+SHb6+X8yhTSl0ZnOzp6tniRFsk8XqLiuolMEXPJSilbb5y/SPdJ65WWn0v5
oBqfmXmNkxkCN9Al+dU30KtDhvG7jdJ1+1llBoD285YEGeaQhipXJ9QoPhfgchg/q5GTWd1CNrWw
nH1jHQrxUi/ZtqhmSp1FbnPrEWokJR6qUgc5cyHpLpRMYePF1bCUyZluk1oZy0mxJdTBmZtIe9AV
f5L4J+aKzUr0jpXtpVIHGgHmbnxs1T2PXHB2w/r/uOLY3Vce8+qEdT+r+8k1f9rq+RISBREnApLN
LxFfbNy1HLFsrqh0DFeO45gTv1JDnKMxI5ngxgeLBUEjRo6J1m9S/HjL3cvWjB9dj9lYGAdHe+Om
XZl7qVmHZr/hCCDx43BZpiyGsRjmpiKc0SOHEcvwE75OVGG2hQuG8QQ5DwUz86a+KFCH2iIXQtqG
7Be9yrjEFyQweVYDPsyPKz+xTo6CriDZU3WhZGRfPIbgdHUI1pRgfeqyIdX4m7g6b5el3lhQCR8c
0c0SdCKnJLfMzeoda1gsX4p63IB0U4jAn/pFzsHAqg1mf2wtxFBQCg/GbJRTJdN/VAg0oyTwwd7R
Ll90t1JvEkHVa3oNVlSKPkbF4cfkk+fAY20M+F9qha4BQ9zJElQ2SsdvWbFuqkWYSjbAMdiUm0pR
Ldq3HxN4KozZkO07H0zK6gUaZUr6hErogGd7KOyONb1uB040Iy3rxJkLUJnTtUwbo0t3jRwxu24T
blSavyJjHOnl0qxpdimLdhqQTStlSq4fG3tX0HVui3fmwntJdnER5dPyKOUzSKzbienk0NxH+Sfp
VupyJIlAWo+n2prLPzlF2nlaCvURd4o8YVNJ2EMuJmn6melOeWIyi0do6i0s7JbLuW5hmRID6L2p
JRTmNrfg4mq8DwrnPipyI2AhL+E0zFPWlTFtIUCWduIC4u2NhKpud3AKY2L+JA4C/Ng8kiHQxnKM
UVm2ZD23VW8acKw3LDdDcnIBY9ozlms0CLg1pt5KpoFUoyLY1v3FylR9O2TXHa4KBAYgAf7z+t9t
XnDJWUd2jjwkOuKQQYe+fcjYd7/1wlMPv+XE459/5hmr90fMubVt/OIFFI8MIcXNUdtm8tQC16xf
NpWDkLuWj2mujwnn4inTo1s5knlN83QsOblxRkxYV3QsjqLFHWqR7+YNa2Y0GtevrhxSFaeN1Vkx
sx5r78LqJy/CKplqY+qtyhsMudcv6BiNasX+ZCXCJzOYekDgjUFA0RSqrE5/Kpbcd7Q9lf5XOxf1
p30Hg4MOWQy7hfEqLbJlLgQ8p474qmZNSHso7Fmt+8VzKg55YcfpOlo6Sr5ljnpFIegAxMBazEA+
TArx1WMCYnQoXkVTo/rmrcYcjJok6S7zNGLgpDBWqt+g7CNlfeuIwxv4NdNL6Q9Tq6GySiZxdXWI
sZRiiqQhE0ce/ahVtbw1NMc8Cx5rKkfI9PeQuI80QcWO0It+YyxIiPLxctWUjSYsVB9xAzGjkkbh
xxy5TV8kZpw5E2WjDxST2mqFtllfjRn4s8PMolV1VIy/osS8Wm0bjgnU9yiZ+4O0IcvhYGzEUGUz
XZzGlEhhqjSN8aZ0YpzsUmIzwJIjLaUYlSs/3EkboxuaYUaQMqccNcp2VN3YUmwqY0AZG6cDe0Eq
zhLKZs5ViTOU9UfZNpI2qDX8hAsItpZrZVZ7C+Zn8yiYWakkSZTkMNKqLf2TtFNOxBi18++yNH4o
6YFFQS010pme1e/maWAh48UqB0DzoGasvE+DNLgoszXB5E7fcGlbDauxjJIxPPeE7c158njvCKsH
zQxLjiF5H2usiTT1pNnbt7ATC82dZWa75EyKfKondHM18TJhU6bMA1k+IorOVkgjkTbMPWLushI3
ashaGoEBRYDfNHgIbHv10I9+0FD3yn771gxb+9rQ1a8e+MuX33LnjpqXKu+sefHem292EEIKHDVf
tSJacVVMNeU5RyEbShuN13w0Dk6uH21CmoH/zmhrG68cuPDLYbrRipmwwFdwWlBJLfp9wBBdlB0t
nlLfvCYOhmbVp86N2XDcGI/M0rYQCgQEqkWAXIL0Stakl4gQUxFFqJjoMlXhExqK4TlxWsqrPLrE
ndCdq0gv/KyDAuT1FXXxIIC8gkSiuHb8v9IHZeJPWj8MdJqqJr3onQr0mBTAdKfplMIeSBksjW8m
SsQv0ArXrnqfwSVIR71QGVrgSn916pUfu4gTFaoBKXtTk6MBprLxUEaXU0XEx3K5GUjveV8o+jND
XYJFk0N648avajUBoXAw6411n6JUDRCf4D/spccz9XFgbjX+y9MZxsGrZjcYF2UkLA+zY1/HemK6
tiJuOOfkdCbP8agOTAKpMvyPKS7Jgb+6mAbTuZkREKi7wyZ3RCU7ScGVNigX0xN63iTp4ZEZpFyX
85RnQVKeObcIBve4O+7n/EXGbdWRQLeUV1sr0Ua7SBmdp2xbJCxsA9XprOr3dqjV+5I65loOy00z
PN19LlE3KVajymDp1GuRT0urNCNPGphF8BjtmM5l3BF8SRJLa2rJSwL5ieEz8jQovIydMyfuINbH
0kFXp57kkuqY+orxK0nnMnipvxUSCombAZCLabQL3jWms7yzAP7pJDkF4N4IFhQFkLEIp0V6E4p5
Zx9MrxngjFUb9ZJTA25j05pvsXc5U4CXyFQSeUyK9aJnIw9HbyLQ/wlwDe5x1dUFH/qtWfTD265b
/L31K5cfWts1tBa3gDbH6y++eNyBu++//TYPmCPmzINdqWqmLDbrbtGLuwZcsPpAHmqOZJwxMd0R
p01V63SR/zbOGTmGl/gi/5162ghZJ1PdBP1dv2AC1L08Zr/Ih43/eXk0pUbsmOWLcvbI7E2bCbID
Aj4E2CMqDqaahr7Iy8ioVG5DyjCSmZkS+n4NcWNiwz/5/UFOZqBMdVQXkFj9Fme+ZmTjT4yRhoP2
gq47pG7c2LGTJjY0NU5rOXfW/Itb2ua3ti9obZvX2kp/85tbmptmTTtj2qSJk8YdP27YsGGqXm5U
XFFUN7SudqgJZzXLhGQItAYCX6hMyvRhRksuiikvPCaZ3DZ1WD+1hliNHI3p7HYv6OIUeR5L1ZSV
W8Shy9YhHarx+ihNTaUBmA5XJyaCmjOpIvyNYtydi7b7JvZr3P4GNxzimIGa1kjppiyEcFaDJ3Wl
jnJWFCU2TUm0yYxFrAGNocem/SqnO6LiHG63esfxLkNwB3wFhoCu7cgUi9vbTRCDeNvZUu0lWbuL
JF+Vg+Pc0bZEu8joU+aRxA8tLfPjwKyYNYZ2+U824ImrBbsvo9+zB74+C7QopURbTuvwcLwnW2cx
q/SHm2Vp1qRDwkIKAmhAz84vwHStXQIlTcilef45Ea5aUlyvMt5HARfs3uGlYbFIyeLy6vKC4965
Xn0zJozwkuFy1vQEI2BMKB2KtCeAy7dTZcjmZz9yM++vjGepe4kfPvbDgb9NQEfipMiroXvWEkpb
CPR7Agzf+N3+9LNLjtvvikvnXnHpJfA3ZAha92uD9pFNHbL7dbS2F3d6LQA8uJCe9NXOWK43beb/
OjHHUhIyYPQRw/ZVKAVionHfKvyV4L8Q0Yy7Owuqa4SYNb8Yfr1A8GEIh4ZQa/BQpxwZMoO1BwTe
IASQzOiXSkU7eIE+VbTTERIVuWXXqI6L5hO4ykHFdILvywoqjqNSWCeMKeQoZjcvESEMY+Y8+INP
TOw0NVpRvsHR2DHDZ02b1bagbUlbu6K4jY0NDQ1jx4wdTseoEfw3auzYsZA+7fTGWZ9vajm/ub21
bWn7ktZ585umTQM+XKu4PApvOGHc0rYlS1rbW85vmXb6NODVdXXg4zUEzNRPFFG9UIkGxyHToL7D
LmV3ibGCitlWnzWm1tFVU141lmltfEnPPmgvMTNRQQRxUzEciZIblgXyCZ5zDLOqRzvteXk2+bF1
Tg4sxxXdkKi5K5RDqewGpx5Hgqoc+6qZJETt160vYf+aSAFSJp4yp/Bs9eUkaikHUbN3miKx8Y8Q
JtvAWuGE2wM5+Vw20HjGJGXChpeNEZUdR8qoQ57IQXDeYNSS5/2ZwV3JDFQ/mvMSg8Ui1afnKVJR
EeJtanAFFqmiYCMyhBsWJDHM4AmpNeYyNLYNyR69JlSsSWlzOngXkG2nzVDkiLdU8mpbTEOL/Vp8
wNO5XuLE3EnMSyoMmUhkTyJoPd3bhK9018Bkj6dNmckHhdYnbRrOTGnJm6I0+5VwuZA6fee9Nbyz
J1XCxSbk9mBhTdiQ5ASW3X0ZXLdAvSit8LPavE1Yh4w5vkT7LHNlQNiAi9lwsXsu5PIg0O8JcNNn
T/7pnWtuuPmu62+6k/9qR479S2fNPvvtL5u7s7MLEkeeeKIHA1z7O2b5ZgiEphW9cCAhFoy0gOUg
A16/acXdyyJivMCAF3cshO2rhMNWLSt22e+YeQ9g5fXazwureRM1Mj33HqkyC6gcsgQEegwB5BXE
S2HkUBdTDh0NrFKQ2DBLYfrEnJaKEPMyQbP4oSMmNpxZUSyogDavwhQgP5QHDxWLC/yKlgRDOjCl
cSc0tDQ3dwCDbWltPH3S8COGVdFaIL1AjBsnNQIfXnr9EvAYg38YUvh9zy7laeBPbm5ZcnV7e2s7
MGekykMVFBoJDtylv3hK3uCUopd8+XEpE2msP/Kkm684LbFM/dbkaQISgqAooOJzwo35pFqjy9nY
CazOmVGrRdrsmzVH7B/mek0YM+XBDjX8mc0DugwvkU+e5GM4OlSHV9nbrGLLuXKWSspQ27nfOdRZ
XcMtwUlBOHiYQkMHHBKpjw+rWGiWQ7XHn1w2Y0ozfnJPsuJOvYNyhidtvB6j5xvclBzuyAFWGivj
AWLGUCz/kuuvECNCVbwsFBkoFb8kwfQxFi/HZoWtrk9LQdsTUyFpA9ykIuKXmpASN43pYjmq5vGu
tl5VPi0lzbos3OinRMDlvSal6HSP1custqWnSZG3pAMQK+bOL3DGWJ+MWQC+ZIiu1E3SqiRcRTmJ
UDhjpsbT7+5Ehre/Ui1GdZl7a1tTBvJJlSpMkiiDSYGJFS9KprOsE6v2BFzS/r1sUyYW5pmyRnNL
yjuaTUhp4vuWkpLgtZP4BS2YufvEE0pYneV2jd+EqHa8xCfwypJ9VPJdkG5Q4UoWAv2eAI8ccdSV
lzXJv4Wr7rxv5/67o0EvTDnouZP329nwpu3jhrz8Steqp7vOuvwKBwze+mruZF4LzBQYg6IhBFrs
Dj0z67O9KBN2bl7TPKWZ+S9R6PXLlsUbYNFuVmNkmHNCEfiiEXFgqhH31FL7csEv1M+3kRZv1JUh
Mxh+QOANREAt49TEBf/LDEeTKWREmtgodx8xXsxAfIZP1GCxYlTHdw8vpiUSo3yPwnlKezvTgdIq
USe4Z9vB2Tur2XLbdh8NcBeDfxh8wkCDXWkQMj2pYVLLrGZwDoNneOyYUZrFIXWUjC4eOBbRyQyq
6NtFeND7mEmgPEn8NANTeqMj9M6MsuoPRliTZBar+1ExTe4VPZDXNev9t8QA33Q3d4cRpgUij+V5
Dex0+hfZLJ+gHD2iReOhbbrIh0zqGRwMaBQ7rdZIayiUEE3jVQPUVAyjJ/R18Lc4g8eXK2q3S2eM
WhzwPY6F8kNAo601CDM0z7hrWNWM0XzqJWvFGkgRzTSjTAVFLmORxbuZ2em7IglFEDBycCZFf3gG
bxJNhi1UU+vl+zQ3msDiclKc16LcxCSSXgJjtYWNwaBRBLosa5cKWN2aclOkOYETtbh3RPF7xGdd
2b3vel+93ZfVoe60RTXIxmW8HeTOZWRZoDU1gA/Aojp1xzwQJdf+5YSFwYrV6SHKZxu/mb8TE3lx
+71QZM4RuI9cL5rZd70Ch1WiOaP8p0TRTgv5SiDQ7wmw29a3HnzwOQ88vPC3rz686YW//PW1J3fs
3rij6+at0cd/ds/b3/EOKz/vvcxLcpn2MgWevAg2eYaFwXzULxudXMnrQRhpa2QinsEjHK2JeSts
qgVeXSPP9x0j4MBc48wVWDnuAs11A8f1xl8XkFnCEELWgEA3ECDeY0KElV+X3YBMhFR4qjhh9qUP
5dOLf3NJJEuKLwGzpY8k0cbCekxZwfElOZaJIWNk8tXtzbOahx0yrBut6W7RSqUCDmcIt4Yg6kkN
DYmGmgbjiWHFWTVqRqeXAct5/YQ09UORVclSiD3it395wa12wHIBSSypU7AvdO+o89jpSp2mGTCe
a8+tDvaOw62VDHbya4H8XxXJzP5nlKCWfyuNeJoDp9IpN1kXTiLQoDl2RJNR0VXEhBk126H6yJPR
tI5qgatgMNEu/Adb4SwNtbrBP/7LoB9cXg7yDLdhz1jhoWd8I2RuicxNcPmY8YdwM017rZPuGnp/
K58xyvT63Nz2MdpSDqeUosQJscYqpOsJrVTnck9M+cKcwbJk92c5qmOpZDn3CliF99bLYKdZs0WS
4Fn8s+QdlwYCp1udXqCVzi1fbX/hY9b6ZJR+gmURJ9lNEiXzmLIoqM7j4iAt3Ji6ZfPurVEIosKZ
vC01D0D5JJQiPX3qhULecQYfS7fk01tKlk+PjOdtDstlc+XngNU1hVEKGUshUANjNSjw3RuXXNYy
p1TJPp4Zvni06pZbfrJgwe5du8ZPP3vavMvedthhfVznoF73Ebi8deGXzmty5Sy66fZLLprdfflB
gheBk87kb32p1Zvo+lNf9CVCRXtQETGLfb9Msoi0xLGymuww5aGrivBQaR7KK0qgwnexyODOhnEN
TWdMo22r9uSxccvGtpvatu+owAusrrZuVlPTuLHjlt7VsbRjidkdmoGiN5wmkpyiLiRSVWOYuJqB
pnwTo4OOihjexWU01zXvVMZU1iJim2nlsNqGSmXksGStAKsXdx9Hs5ugaMxMH4uiDpUSVBrnV93K
H7ti/4CaIuGC9A8uS+arbEVcjIsrZs5B0biAOV5brleh01bhaCr0P9a7IichBkeTasdBYmNjoz0Q
tzCUqHpprfTdSRqQ7CDujt445LDYJRUZKUYZlSezdZ2dyb2jc6EohVv3M5dBVjoeuVwp3LyZQUii
I8AqRXdbhFkpa9FdSPWmVA1Oeru65WsySkpt3USZIpsgeioNScySBw5CakBOq8u1UoGJtH/TfZLo
uvTGutf8RpcNhVSJm2kO98mTNE7rhuVOTGPmcRfLB1RZW0qakG3keUsJjMIJ+/faj8lqtLXAKXaD
G0z8J8Wt1Pd8s5+Bec+NNKNCu4WOM182ZkvmFN/J9OnTi7U+5CqBwLevuYHpwAD0ADMM4Af+1MUX
316p/OvOnRf8yw2B/ZawjpA1IFAeAaJKyFLqmGgRb2H6AWTGUCnF82IfI2XQ1Wm+RbHQ9IkdWusb
bwiBhEdviwWf9gUyPGrUcFh/C2t09zj73b59+/yrW0eNGgfbSkMUNKwcbrtpybp166ZNaqw7ZLjy
YnJL1fjYIBTDLTlxnMpuVXR9O9tjmA8IWe4Fs05YF2HJskrmh0Q6KZaYuoxcqWZigjpVJdJ7Wn92
iLpMLd9VPYjqUUw7SeBE4rcqJ/7ij12pDsdIAVoYTCd6Wbj6GrDa4ArLarKtSDKWR8+nmTdR2hI+
lEgbYnElbJZoQqr1mbF2Gd7dDEdc3E++szzqW875JmpwXZHYVPGhoyyXmpaj8mT4G0UIdHZDE1eL
IOmKy3CRFfaeZSvp9W4p4yj2/WFAWJI3LptglXk9jgUy8nhb6ub3UiZR1u19q5l4h5aNgna9ZyyU
H03eE050DqsjJKPLXR1AM6qZ/ezOQPH971v+4Hoyjeg0r2Nq3S4+KZrYmJQ077SHBhtnrB7Uzgq4
J6bj0k5EI107sVIyZlX8t4bVfcZ+pAll9jDfdNLdak0H2J7YNNO1akmxq4yndLkHOHVEQjeT4j3J
AyFc7w4CA5YAdweUUDYgEBAoiQA6eGkTI3j7Ks6j2VZMeJgT8RLQujgs1lNVHafRK6FiBgf600d8
sRJ1gtcXNqba49SX9Vlyx1LYFqu5qQl2hF4K53W1sGAYEqEJ0yY2JhqJLTLfEPbQYBsR+fImly8e
ctDg6y3uDHNwNVYKfzSYD/WxXPoZE2Py6FIXqjB1RZipiOlac6pe7dRlIieRUeLGpDnTXdzwWazI
NdrhFSqrqC+FbXMwvIlzpo27kO5yiirCcfjGBNV3s+hTT9R82XqbK3bLM8bdAYd3vJs5WPfWm8Fd
rfFWWuShK7a7DTSWlDEXkMF7XRMtMujPpsRFqKbv1jBpRQbu1kjai7+6gxwKjXdB7hpgLpzRljyu
m9lEuhMdfx3ejTqy15AZyWpKDOu95Lww7CUq8sqUz0YGyjweTX7xlLNk5NYuuy83c2qjrYdDEcvn
J2b6hgU8/1XUulizwvWmNSSNCRs9S+gjlUnj5+LWcGc9eoyUWq21nm/eu8/XNWZGUiqWmNkp8gys
eqY19ykQMjgIBAIcjCIgEBDoAQRUEOwuDjdlwkNjL/Evv9MhBfJgOn64lakLcxaOuUWqAuSWP4wk
KBY6GCtYBPLXDhtW1z6/bVpjYw+o3kMitm3b2NgwCYRte3Lbyt+sXnnvaliTvG37NghtgpXAdXXD
EvRTOUyYEOYNTZIDF8SERwx6qBfDLdoSsz1NR6kixJ/Ip/qXPyZE22tj77Aflc6YhTL55C2pMP6c
6TfzTKpX/ZfEqkDlOFXJ0ZJ0TICWjxXRNY6mRgcyRzUj1yV/MlFcprV8SXmq6YScvfpjSDS3QjpQ
xAFKwx2h2djgC1u2KZrxCurAjlPXS5CRwlCnjP47d3ZWdlYqOyrbd0BkwHY4gQMSC45BbfdFionK
IZc10rJah4AnF6+ySFVRqYZn+FLy5EDYORyqNUWIk0VvJA65XVPgvs4lGBI3C222GQm764/i4kYR
2DzP3j/Py0kMXzJczou5TkSx06YlrDGZXzrHmDU1fR4+7jaNFTY8ynKpZeFnqW2pxyyUE33E3muc
XF2iR1wykDHDYkDjx6lUyUoRsxKyywwaEq4MMpPFh9NojIWJDxwJe8ZzgM2PdUjjpfZKcuZyFvO0
nmNCJUlr00zFIuGmiHtS4HZMZkmCgwJxy8P4tWbuTe+daCvgbgftfZhYlgN5knC5DN+969XbRMiP
S5E0bguu4oEXGp/wU8LdDro0aqFACQQCAS4BVsgaEAgIpCCAjAWpLHIPpCEUBIucyHAbQXTVV47I
iYesg1kNDsW09Do6YU6F/AjjXTHsjb2U40YNh/2l4OO9fao7aofWbty2DVSCLwzzB4SB+BAHwzY2
jBuHy4D12zSeIyg1K8/uXwKBd3XGf00UtGKkChU17tZ8lfHElbpMGhMT2/TBJI5GZoUV/DS6onOV
RN9kRgU0Q+acmrXyOe1eplg39q0wCeEWVt8fpt7nrzHFW0ObbCpegMiwCpOO9/Gi+REyOcWWSRlW
TzFqGGJAqHwtflgrCQtntVx2GQPutEvWgBImgODYUUEeDkddLezHBgeEA9B3pDvxKuy7UazTmS/x
H/BGIC0tF7csuW0JEOkiA80SeXJ5hXunyeFpseb479ZsOZLVyPKGGUKizJPCKBLE29Ej7Wo2gJIe
sC15GZEZ+/r5kk9hpLOm66dNa2pqaj6/ubW1deXKlQnjKdJryTxeplT6KWpIghHeGa28d+X8BfNn
zZrVdG7TrPNntc5v7bijY/uT29NM3cLW5TCoVZE5jozpGNEwwG3tb9YuWbKkpaUFlAQ8+aJUw5BJ
dy5JQpQ1OSWfBvKJYcyVE9PosdMT7kwBPmF929pZxEzxUu/EBNeSdsl3L6fZdmnLMQWkCTFoBpmM
h7DuL9lY1s1MBxjyaaPkbgdt3oCJV6GvTQYrAY7LhL1o2BMoPM6Rmz/TVJGSJvaFTvRR9UCHklkI
9HsC/OiGrS1fv7llfubf12+GbMEQAgIBgV5DAAb3mnIon148U2s8IERyOCee1Bkvgf54Ly7rJdpb
0cHSdWpzafLmkfZjx46aP6+V6MQePjZu3MgbV/Axbsy4tQ+t5W0F+ehY2TF2zDgeaowbMxabpl+l
ROzh0FTTnZtPaZz6EpLxZyZf3sRL1aE0U0SU+S19NEiRRsWcuYjekgp9qtQ7fKj/mkYyldWaG38v
u+7VgQqoRcuaNqsClkmQh1n5n5Wbl6VrVzDmx5Ec7RFNnNZ4pGMXNM2J4BZcxJ+1E1jPvGDN6ARW
ZWVsgmqhM5pMAd5JliNIHtZ0dm6vbMdpGtgADQmvZkRwlX8OrYMgeYAafMLoDTaIpa8+lbWC/G3b
tgGvgEE8m1nWWLxoM5L5ilNZi/mzmLziHXSoKi0ykKGwFOsOlItVXRYPL81wbcbiBtIvB5nt4W9S
iUKUGMwb7Gr79nUPrQP+Bsyt4y4NoLbApXTkNtCwKcn6LIVzhfANpQ42+52dLfNblt62dNuWbRzj
AP/CdoDQ0S3zWqRAYPJwJEzaWcZpeRTz9fGSSX4q8vuFMsAtA+itXZt4PlvCsymNRbqssgpS80YT
VSsdrEtcPoPh60uGllsnlilmAWXdPuZdY7100m9eOYlj1LD60b01/Bqa6SqJQGFw2DzYklkrK0VO
GeQYjyThpiOgTAEGLm9t625Kw0EWybdqzpH3OC0qJ+RLQaDfE+Dbf3zf5848qfm8T2b8ff7MkyFb
sIGAQECgFxFQTjzpG0RipRgNsSr2EzL3I68dezKJJlHstCJjgsVVeP0nZkMOM/b4sa0Xz1eLYHux
McVED65tungWuD4497TGacOOqGu6uLltSfvSjo5ZLc0wCpz1+Sa+OmrUqJi0x3FcHARuXnWMgX0g
PmmJ9BZnAFmOoqf0kwuaf9U2VyIzS8Ui6l1LPUA7XYmDwrQUeSbfvtrVjOOT8YpRmiY49IbVMUND
sUoxLVdFVrNhkIPXaTmGQGsFyZBsyqQNTA1zY3uLPcBQnn3ahHklCa+MVcM8Bcaj/rWaxFLA8QvL
v5H6YqWkOcVgM59XUesAxNA6cAlDaLThwJJr8XBKjrZhPTn8AZ0AkgPjePAnAx0CPzD2rG/Rqey5
oudWw+OZqby1qVyBi5tVsRxf8rmswghx65WSDaVx8xuZBYeMUp8UjLzuX9c3aPFkOTTnfvTK4ToT
jMvRHEktdT30ddv1bc3NzaPGjAIzA6qJdNeFVHaEr1FSGalAac6ZFA7KgKcXzBIcv+3t7aAt/Dt/
Pn4sHT6c7r9fdNszwMkx3eyOZlPhORoCCiaexp0wDug3ONK9kqXn0PVOm3vN+Bvl3Wd3pakgg1al
WWCSfbmcPJeHJ2ZVDNu0aCdraBhgDtaey64tcSb/nI4U4DY8N0X0tZxvyq9LquSdKDGKmaveR5+v
s7xdU/CBnJON7TYcvY9AvyfAUVd08IFvmb32ha9e8a1LF7Raf5A4Z+uggw48ALKFIyAQEOg9BDpp
NS+xWaQ0evUmMx9FbOEq5jEx0rQGuEKfe+UceIC/Tu8VTOs5mXFBts7hw4a1Ns9PG1H1XtPSJEMM
NgS4tt+2ZFbLLNjtGRRra2lrOqOxsmP7uo3rxh0/DuK0gRBxcSAtsdMaX6jE6HgUwk3HV6+imlaN
MTMUb2JETPsZTAYOkIbDCinHFKqL07FuHXyuPMNUpY5XN2HJzFp59+Z4MoNHlvorvujM58ZQJ9I/
ajaElhYLsZxFz4BgIeSsaiNoZRi6HpJHRqUGagooWgSuYrB5MoXJrVaBdmITHmlDPmthMgWbwTMO
yUONZjLm/q1LGmfuQSgOhBYG2UqqYb9YHfFq6ly0fEXVaocdMYzXh7vKWAM7Q4mBWY8bN6754mYo
gvbW44exrozhV+5olS25Rw5Day1prnypcBENq1Uve8xd3IVYtH6exqqFLQ+GAX+bP28+e1DBCQwb
DdiuKmmTRSvwMJaCvIItHw4Ie4F/gZ+DcfLkDywGAeo7qXES0OA0liXd0WZawWJ3WZrImRFurHdG
QOPQuqAVoAMNzQPZQiiXuhh/oymY1d2SwxieKU9YinyqkP6WTOnP9E61WBDZcxnW/BGj5E4k5VmL
2xHeZ1SeGH3dgGOdmDmLJDgxJhou6QQ2UxLxczK5c5gqnmEw7qUCLSl4m8hsVg+63a2qNSS8px6k
BZqzd2bp998BhuDnL838h+kPvXTkPdfPOPusNw89wHTkoEGDrrn++pc+e2nbMbvbbvxZ6/wv7p19
vFe1OnwHeI9090lnfpLqVYGs5LNF1hrTPL6sPMAcMaviWo3Pk6+qIsplx5yRgmBra9sX9JUNnw3I
EIkKcc4rV68GJgM+XljoCzHPwwwR4lbv7FzSsXTl6pWayzHnoZbZ/l5KLP7aM0NeM6zRYyymg3L0
adWH1FRvKM2gG22Ip+nPLPOwzExPJLLFdNoAInPqc1gZruzBumpsgCOc6UvCHEiP+AgXMXFamhZh
nfUKcybeikOqJut4aSXTLEcnJy1gC7kbh46DCuLdmIrcMxbUyW6i2Y3auqEq0Dp2/8aM16xzo+XW
dODOWDsro4aPQq3EPr1mJMcbJoEPEOHQ69ygTxvPaIQiEAvNA0FuCLiIYY0oHBhfvasTrnItwJTg
0sb1G4Gig5LDjxjecELDpNMnyUYbCeBdBEMFq4aZnYaJDRDUIK0RYlzhKoravh2Ko1dt3DjIAwHf
aihPKCX0uXcluAdRH4h8NpcgiFf76Ezm1feuhlsJYrxBSbiVYBnsqBGIDB46MzgbV69ejXMNdXWT
Jk6CPKo4C+ROsU4o2dSSyKMhSFxl0Lil6xC0REuHom0a95cpCIwUFaOWgpLYWZ3YZKkt9Bp3KKRn
U2XZ77KbuGngDYblrJMmTYLVtpzCO2AptzClQL1wAJhQUd3QOsAT4AIHspFmiqi27Ira2lEsAAhL
zaHroQkyDxR0KStLm3XuLGhs+03t9rKUZEdYwc9cFsKS+QRUhVCabRu3wSICqAimh8C0GhpQDQac
K4J/wb0MaHMwM1gpZAMoYl4HOVyeaayIFZ6l5CSw9f2QbmGDgCSl8jxLmqWSO1VRJEVU4J0yyG1O
fGswSuYoPHVi1Ss5p7lk+iuhj0HApKbNC3iftNqWUr+aK7ajy765PDMyliaZT5IMkC0E5P3CmPjv
IFOdRAbOyWinfy58BzjfrsvmGJjfAd712q77Vm2Bv/tXbX3w/j/uM6iGb/Pdu3eXBajn829ZOKHG
HDNXqAow1fyQla6Y6WbOUEpIn7BwSzIjXXNSe76FQeLejoChNzhmoc2W8MB/IYH/0DPMXEuwKhUc
K+BjLoP/VvQOT83nzuojnzuS3QwD8aZpTUva2uGDTOD4bV+C3mAIfoY4QBjNL+1YCl8GntbcBE4S
+CSSdmlm24n5PFKeObnsV5RQpDApQybiudg9C92YMQ2OSRokYrqOrDbyODjZWlKr+oyjoMXkB3cn
u4UlldZhz3gRXf3qc0cmIkCRYWUwuOhLuZpphy2UapZSUxWUUcVvU+CAYr/s+FXsSJtfHrx8vchk
BG18BTSDNxKzIY/vAkQl7gJgJnW1uDV0+r6mLMryTQFVgER2ZEn3Qvv1QA3akfNAJVoNYEHgmgNu
iZSVF2du3AhcBXyJjqpR29VtQLaBlsMlyA9kuPXqVu2yRijA+bzyrpVcBS5MfXI70GxIxFhu47XQ
7Vf6wLpQoY8NuoYXVAJeB7STlYT1rhDszS01vQDBqxhtSw0BJeG8ra0tFug6ADkl0zGYZgSqpU/6
WpqEHSRAS5fctARXwIqWgm5Z2mZYn21CNlcBKguloR/TZECngCWoHQrIOIEuwg5VafkhA1wF9gsM
FnZZA/aLlurbaYklWBYLZBUSAQGeLPD3SEZ7wYf8G1QP/kUJNFEFYIL5gUG6VgqcGYzQWCnMJkBj
s8RbfsVMTayL8v4q6PErI17kze50kdF9XMDForq5T7Miz7dkk1yfs9VkyQNj3cpX5HY9vkF4qzlx
UiXgacUkUZezb+nVWGELfINYD+0sTp6BjGsVPdzavV1c/w+BFj24O9p92sffD39HnLHpjnM/wVde
6wICvMcDoLcsnL5hXpc6ls9YPCWTkAL7nbK+bTNlz80cRcBw65vHLFfSH5gzQlo11LwsGr+323lo
fy8jgE9q3hIJGRON8nFHaOQnGOFs1v0qbx3RIfzWEREYZsXK/csp9LWemC2PJedqL7ehevEwcGw8
vbH96nbY+XlSwyR4+YH7aMnSJWsfWgdEpblp1pKr22FraKwgwZEq5AJlRgb/Kp7IeuTzNMUnk2pL
X4f2m7EoZqTm4E2kmffiv2KYyKokD0xQG2ipKQzFMHVO5fzUbnzRCGS25N1VzmQuqDLoulRxHYOt
XLv0E62IT5Aw45bO5FImI2GotLOXfpB/2MyzkHwVmIAT8CpeWlWf4yvg/uLDe0KJuPq3UoGwT85I
eNIdoGYNOldvrKxcV+l4iP7Wwt/2jt9sX/qb7avXgwcYv5YkHU0ZKkFFwGSQlMKeamPt22H1b1aD
SxDogdloClgEsEpg5uDyAn4CfjOgZBCVCuGp69avg9kZi97DNA2wZd5RCU7AqqE69ArqA1yIwAy5
CqDKwEghBamy3IFJj+eUPjATdJfY+MrISg77gKKjkpQZdAaPJaDHrm8+gMmDLqASakgrY+EEUkwG
PMlzZMFNigf/K46EEPqhWgqg0dLruKVCpVg3Qh44vEEe2q60PR/xhHZB64DVuxUVTRHPDfDhQyme
CLAPSoEoAPgX2gfMEGunrY/Hjh1rMksbq2yvgEkAW4bpRTiBhqeyqZR7Ydrnp7GptDS3AH+G6QCO
OFDVaUZhnL1wAoDwAXlgmqN9STtYKS7QvbqVp0Kgc4FXg1bxjl9ae7BSyAl54A+9yoNxOQBiaywq
jVFkcrD8R4Fg/gyR5eJL9IXpLz4xT9ekLzqj97MnIKRjHIS4jMsj2XVsciY5kVrAHI1iRVm3lCkt
VmJiUILMBeYCJDhMiRmBOEyGKrVYqErJmAUoY0JFDIa7xrrvPLhZKjmTiQW6JWSpBoEBRYABgGdf
qMDfEU9PvGDZTcvmznm+/dp9Jh72wzmzO//0eDXw9FiZEXMeWDRZS5s8t238mmV3W47auK4tm9ZH
M+YpHkuZN2xO1wQYLrLfWLzMShfnzRvTYw0JggICPgRwpa4a8fOKUHzZKB6F4a+Gg3HhOvg/bd1E
9I8XhcaEin13dUih6eUBUXkUOmgd254Ej2t7y4L5Tc1N02CA2dKCwYEwEtpz86YQtAm7XrUtaF16
09KOmzrgBBzXEHFa6excAkNnFRZu2oEwUAvNO5JPEC0TKGu12mCripnhi/Q08rZY2gPGXYOYGmar
luaqPEomfwpY7wKt8utvJmE/YaQuz1OwKPyHNFauWk5kfhtXpxWDsvz1JpbAXJdbxzHzOGMC4xia
+xCk1+RE+spOY+UB5shq7Vbl9cDxF5XUwmBVA4VYR3XcVH3kj+HcIZEZnYhhSudO9JqaeF0CnJpG
K6Xh39XrO4HuAg1euW77SmTC+O+2CtAYMA0VGqecG2wB4pu9wGT4M0gQkgpMDJgPxB4D67AMA1KA
2skljhx1DJwEYkRxfTJ9ZBK2kUP3L1FKdafoNoIEDDrF3aprMf6ZAmuZTfEBCykhAy91xkDlMaOA
WcE5rwJVh777Yn3M/SjHecmbFG5fVJLc2kDwYDslOJEkChgypKjoXKh7MGqYiKo143uCncGv+sCW
niBaOmoUwGi3VEvnlkI4LieAbqwt4gneVLC6oXXQOvWp3iRd8WjoHaCzsdElDDjngXXKUJ7H3Ljr
Hk3KYKePHcs9ZTTkE2COsIEzWBQ8uHhmRHIJoKkczq1K6didONSZFMCyC+bDEmVIB1HAhMEFDYYK
JFbxUtk1LEt/0BVURQPbFTXNagIJjCErzF8qAmkW04B7QVkpLIk/YRwuBwBj/o02ZhIeH5LdmTvU
A3rijnPJpyzhpab2k8R9SnAK6+B9qnAd+pIB2XBdL52z3K3KMIy6cs4ig3Aa3YQC0rqglpyKdI0Z
vF21zuodiUkZcFglQEmd6H2h5axEjjLeCR2DkpnCkBYllM/oDtMLllVY0xbSqNit7Zlm9dlqSOsp
BAYaAWZcHlt1zyMXnN2w/j+uOHb3lce8OmHdz+p+cs2ftnq+hEThwYmAZPPLF1XMEcvminLjYrhy
HMec+JUa4hyNGTnC6kQWC4JGjBwTrd+k+PGWu5etGT+6nvy8PlXx+oxGQ64TMpkb+6lxT1lQkBMQ
IARwlESERA2X4lcF8liiBLHjT/EeYj685lMsAFbZIA+Rh86xo8ABPErCDPFvrW2tsANzx72r123c
WNnRCQxk+5PbVkMoXdv8xlnTVtIAdA8fNJTBXVs7ls66eBaGLGJYOCyv5QWT2D5Nfev0OZwkKZrT
BobOABjzLkIYD3qPMuDxC1VHO6uCaiWtzsyqcl16BKYqYqrMX9xV/DbWifgqe2i1Deg8JjOd6LG7
CLo2pTgDceDEiW4oXSSxyH4VdJphoh+Yq0YdNDmnrxDTMnINMQpRnufkFik5RuIlUYLr8lAejbiz
Avs/K2n6K1AUj905djg5wLk7CC74d/gwIvO4aZzd45Yfw2iIK3iHD4cRf3tbu7uXDxA2qy2wExuk
AMOBIvEffE8Y1o6yC5EP3UbgFYbDQzL+JAedEQtFwL8HZBUX34If9XT8NDFc5XhU6+DieHgdGkny
BkxGsgLcPRjEwrSCPmBDdTgd1zBO1oKl3MOtTtfFHlr3cGVAdDe29HxqKR1MtrGlzuEir7SloBUz
CDaAuJ7D/IkYUSlvHp5RhCsCCoofEIZN6WnNsHc6ADyuIA2315o/34QwQFlDeMwJJ7IWru8Lt4Ce
NQuct1ApgAYrzMF/C1jBumLl9zZEVDfEOFE5lhuindU3hOE/9DFhZux2WDV9CEAqAHsNQja0UpdV
wgV5qzo6WD2ZQTU5p8G8IBv0GCerlHG4rCxZtSkq58hkNyVkW5hkcG8vGxSd5fI9byPyLdmdtTGC
0i75dFPThSYWmnpHPjndPsrEXVxkNbxPrUwR7IWWpiJT8mt3eycDq3xxIUc+AgOQAP95/e82L7jk
rCM7Rx4SHXHIoEPfPmTsu9964amH33Li8c8/84wFyYg5t7aNX7yAls0iXYzaNhNfxKjiZVM5CLlr
+Zjm+pjgLp4yPbqVg5PXNE/HkpMbZ8SEdUXH4iha3KEW+W7e4GOnkEqcVh4rZtZj7eTJnbwIq2Sq
jam3ojfYr6rix2bJsAitDvQ33/5Djp5BgD9oRK8NGiRhSC3zGvIN8tLNeE8s5IHsP1SEmfx4zIOM
AxnOOTQa9zgRB7ANWFi78qG1/NFg8EdBdDEMg4aPGE6f+UHB4Bme3zpffpK3Z9pZWApUDR621vb2
puZZ8AUb2rqDKFD8SlOjSY9IJEvpV7N1sF6iZsznjLrYU6oOXzQ1X9WklN31/vzcefLQmbEEXWWa
yrnsna4pgwkFJ+LKR1JnHTjNLNNEXLNEdPyaREziTdT055qAwLP6+FGiXAKczqBSsR8cbcQhOO6D
ZZTnraqpzciB1aidODCw37Ejhq1bv612VwUvi/1R+KesiOONORYXVpYC55RcxeR0KbGyf028DQOP
4U0OsGIJlM4/kYXST/AWArfBTbZgqyea0TJH4qeWmbbdrhdDe/8kziQMgKvwapjaKWkX8oa22NJm
/LxZTku1fLellrbcoaUAsZofd5mekog3RJAkhxAD3gv7ReEWYkAgn9wO7BeDii9ujqc8DDKUHzmk
vi/KDdkdhHnzKg5VQN/sLtzxK/Z8cv7kM0pNc6RbqXXDWjDyT+9u6kUMI9vZa0lgcNwHSCLFetKa
WUg+sRipzFye7bjKeNWzceBKjWLJGy0bNPloyn+QkqysbAYTL0rp4KS5dk26mV6xaHBCGQm4OyuR
3TV628IiNsZ5suFyJ5WKSw45q0ZgQBHgNw0eAttePfSjHzTUvbLfvjXD1r42dPWrB/7y5bfcuaPm
pco7a1689+abHaSQV0bNV62IVlylqWaUOAc+ClHIhtJG45mPcjIHJ9ePNiHNwH9ntLWNVw5c+OUw
3WjFTFjgq2QoddSi33j5LsqOFk+pb14TB0MTBXZURQnLpnc0ElXfDNcVVw/0t+qbIhQsjYCefMXn
PDrDcCdeHJYwicUtheOvHxElgM8aMTPSXzlCMszRrfixVi6MGSpR57hRY6VCrdfjTj9AzOoOGQbf
BF7a1j4fnAXNzW3zWztuWtIEcZuwHRHEzkF034LWQgMjORTIbDq4I1rb25pb58+/en5LW2vr9W3A
tJGcrFwJbl74HhJcBeINm2BBVDZ8DXjt2tW88zC1lNqLdTGjMDxQsyREAJoeuzQNAYiZp1e95Mub
nJ+UT01J4Kn5cjKLwn/lDlgmIhoZr6qN+4KVw5l1dQ5zFhgpTQQIc6qdnzSGcboqrfIpk6DFwCgK
KbeRiZMWFAtATJjdtjSHwmHSek2vMg/KRvUQ6SVwVU7NgXlJGGRgYqzAZwOLCXZaX0t7kEia/GZa
QQ/lgfcCuyA3VC2OyM3QSg/rx42gL0KRVuNGDRs3dvjadRtpXTR+GMly+RpXBldYNSeByFsorlYF
w0JcWouL/+oT1SCtrTVhxD9RCBkSrtjcFUFML2/vpOTovaY94bhyuJ8GtUx3x6ACcGbIXg1t2dlj
Wc4tbg1XNfzGMrcUdgWDlvJhWlqgLayt+c4zl3Dn43JGvS4johT+8LgKirEG8fpnw6QGCEteugS3
MWMyjN77m9ot3XlukV3EXqpgCJVkVgWZDwQIgHAP6zb40wlbKRgVqKdWBtN/4CensM6mUlxvL+aw
2CePgJt+dymo7PQkBK5jUwpPI1Qsw9yYCVpowkA4k2H73mmXDA6Wx4e5UtNrBTtFkXAWbh5uySkJ
y0isW9vUaFmvpYD5GU/8WXL5+WA04YeqVxP5vGVjoMjnxElyF+i0KUUs5X3OZKBtapf6k+fZBkr/
5ue5MRK2Xu/N7pqfkpHxMEyrNaSXR6D/E+Aa3OOqqws+9Fuz6Ie3Xbf4e+tXLj+0tmtoLW4BbY7X
X3zxuAN333/7bR6IRsyZB7tS1UxZbNbdohd3Dbhg9YE81BzJ2GViuiNOm6qoMPLfxjkjx/ASX+S/
U08jtqwPproJ+rt+wQSoe7nYvAoyGf/z8mhKvIWzqyrJnXqrCnNmLzG4nwP9LX8vhBLdQIAX5Gge
VcfhpkSl+D1A/l61iy8v4ORoVbrER0ySoTj5fpF5wUdipL8LgpzXrlsLF8AB0jZ/vtzZhYTiZlRL
FrQOHwYkpHbj9m3gK04LOUM229Y2bda0hqZpjbCIGCh0e5sM+HThgPywJm3b+o3r1m/c+NBaWPoI
H0BaeheMM5cAAV55L36cA0Kyacwn3o7M0/hffMHzJfhXIWAq6qTF0Xw15nhiB2b5yvW/fmXwM7+5
6VVqVhRzlfiv5QE2BTUDRzc+aYmKYqQuN4ncqiZWGRLE0IGX+LLmZjqDqwNaK3tZsUFaLk5AqBNT
Cl21SF9VvVomc10Dn8JQLCfmcHqskDg2VaoGE7iEmBVzezY/RY5IktQOrG7YsOGw4xRsA75t20b8
OguQYNjiGZeqqiFdXW3UOG5Yw5hhjQ0QDx2tXL0Os0Xb0LyTY6PsEXm+niIHf/YGXXDFDrnfFZTA
dZWwIheikamL+daAlZkQamFuSbgZU2XnjeDtgpn52Z9paZj46aWLVmKuStRfqqWzqKXQW1Qqsc45
D09LW+5TXHSdPIqSFlEKPPD8sSIrLkZlsUjgYFxQDUy+ZV4L9iBssp08wFeM8dLmG0j6qjtehzux
lLMUZKpnqcHcmpjTdTGTh3alMSi4Ki9BTLXkEvxBbGOlKNXUmE0+8zrRqtfN7mU1hVx5coqN5RaZ
taGMGSjB1fzaJTimSdbDzWqquCrnQaxcpWdzMvDnGt0ZDZGicBBE1JqsseYNY9y8DwpXmWxK7FNe
2oPVTRY47q1ko5f7pCpgvSFLLgL9ngDDx363P/3skuP2u+LSuVdcegn8DRmCtvPaoH1k44fsfh2f
Di/u9CICHlxIT/pqZ+hdldXmypkraZEBE+/ctB6lQEw0uobxV4L/QkQz7u5s7dNMKpk1vxh+vUDw
YQiHhlBr8FDz4VPVbtP6TStgYTA4kDWBn8J8PnwKKfd+CBmqRAAdWYpyAL0ghoHeXZLG/xLT4Q+9
8u7QkiKqDDEzqWjqNYpWA5oDdq/F88FR67zWtJBCCIpum9826ojhUCUsgwQPjtso2KQVlhCvfmht
504gnVjvtsr2lb9ZO2teS8vVrXLxoSkLhBnoDdeuW8TTyYaR8YnvkKNAuK4pGWbVuyUpD2tcmh2J
BKd+8UvqlkXjuDozoZ4kbLH2vFcWHdgflA33weJDn1gVIZcWk+LMQfnftIOusr+XHLz8CWKqluKE
2flvYIR0nC/QYmkuAHfG4pQ4+NlQWRw9JEYMRik13UBEWhlmrKc7FvSODiUaVj/qS2CKMI6H2Rmg
tUCDaV36dmwGfBy4rg74cO3QOo6CXvmbdcB+obnDa7fBlj+47RC5jHjwlD9+TQfZ6jX4iZ+Thc8F
d3SAJxM2lOJoCP7GDPhvYY8iSxh422D3Jv7EEZzAd2ggA38UBw7eoAjysM8NGgpfo8EP1bwhB6uB
GtI3t1lD4x6sXgXfQNPfUvnJJbe+xDRQp9L2NqUtPE8QT7lXdorGOG5OciE0DPjiFGwuBRsczJ8P
u3lDUViT7P8mHKkBdFfFb9N9Af3FkyDeOHNYcItLqXdF4G4FFir9ihBsD8HMuTYJ8TfgHgcDQxc3
Kc8fXgLHMpzHc5SwGRiFK1t7d6OjeDASYPx00xZlpYAY8GcADZoMReStAW1BfzUdcMJN4ybYB6fw
w8r3DPSELaRwyGwQsiYyXBbHKpWdmtFtK6iJ12NvSCMKc0l4+l3kVpprFUZYKjjmJSWVkVoVIIFp
TNJSz1DTxP3l7Rov67beC2pOWb1JpA7cWFm718ebMcuZ6hOu/hkXSqYi0O8JcNNnT/7pnWtuuPmu
62+6k/9qR479S2fNPvvtLxu9s7MLEkeeeKIHCfaWYvQwreiFA1mmYKQF7AcZMPHOiBgvMODFHQuB
hQp3sVpW7LLfMfMeoNBlzU9hhXCiRua8dLiqxs7nuMyYkZPnPKC/ucSrlSFwe3OXj3gXaFvIEhDI
RwAJBr1mkKJAdvIEKhpDZIYyMFFS4a9McNjVSa8N847XXsEKZk4Qq41b1oFkYMXDaCtaOCDwuPHc
psbPN8K2WIoeQ/GhtbNo0xo4he/xWrGIMHJqv62dlh/TAJEF0VsNolI3Quz0PNwZ1Wo0xXLTylLM
CbHZmD2Zx/xMkkHe+8ocNBSjaGeWQJfkaECKdRiXrFJRRjFQsBQyoxyTnlCRvb6aBqtu0PzWLsL4
CKwYNFUqAYXqTVEXQk1NpTBm5qtsLeRPJiEMGsuj83jROPYL1ywuMxPW6AHC7H+m9eSUikwb+os7
ji2T0rVeGR6GZL/av5LjVxxrDq0Fpx8cK4HdgktqF34YaduT22Bh8Mb168AsYacfCJFe9xD8Wxle
Fw2L1o0aNgw3TxqKtITHZ5Z3pZzDTVqXNidg10BOQDfw5cKJ2kr6jGlAffm7tVa7YPUmRKIC54Gc
cAK3CaSYrZuAdEF+4BvgNuTtr4CxxDtdZSPW7atQEe5+1NkJlBvUYw1BvfjeMVV4Jyncq5YlCwBV
S+/qgK2YcPsraOlNeS1NesmgZ0E31JbwBAnABnm7Ju+RGK9r/bmZrAA43kEUkEwwlmlIS3FqAw8f
jYGehf6FRb/IYM+YBiu3mSVyu9wDhCOSu2h+AWZAkqbII/IM1x9+DrqDtn0+vxlsg7UF2wDiDUuC
5XbljABcwmx0wE/I0zyrGdqFn/ha0Io7YMHeXec3A/WFKQMTkmOIATBq0BMywB+cAMiQwsuY1eEy
YboAoeB8cDY8oxQLEEnY0mheBoGx4S01y5ZmH3npcoLATGEkHiCGs8mJAC/DLEA7pTpZ5D9PbbzO
0xPmiepODXAePszKW30Sx0IX3wU6Y5YzWZep1OOLpjuCM8gT66EtfcLFpwz4psb8KZZcBNeQpwgC
/Z4Ajxxx1JWXNcm/havuvG/n/rujQS9MOei5k/fb2fCm7eOGvPxK16qnu866/AoHFN76au5kXmDL
FBgjjcFlKnaHnqmocSqmsHPzmuYpzcx/iUKvXya2Z1af6k2joPCVpHj5Lu6ppfblAkmon9pIy6cq
hV8vnqJUFZmL9H7IExDoGQToCzdq4SW+jJkrEr2sY74RbwjETjkKVUVySxv2kneOtjJigsOsmFKS
2+1se7ICF8ym0DA86rgLvBaQSB+ivLoV9yKiA/KMg29agjuis7L0rg7ZTghgxo2jkcQSa4r9l8xU
O7dXKrMWtBhR6j0H+xvR8tcKvkHZacn+UsXNuBX8TqR/dTrKrGACZ6ZXPvE0cv8qBwVlJslGDiLD
u0ZzcX4vOhWY8Oa4SuP6YJm8ZJfHQDHnVloy/+SDt5JSmujqsIgOkO6k1d3wr0rU4dwcmUyqo49X
j8sxm4bCnGMCMVU1Y0Jbl2FBgk8BiwgzMda0lk/kmICRImkYXECKMZFWdfF6ZnIgK+tSS4J1e1P/
m+a3SSmAJHZoLYzCJ02ctH1HZekdHRBiwEHRWOMu9InBz+F1lVG1G8H323DCOHASonN46DAe3rnj
yG65AvQwF1SC3YyBBam4ZcAHuPqoUbBBETvopCcKiDEwK3QtDsYlBkBd5LdzYGtfyMBRwSwEmBV/
r+iNOeDrTUY9/BAUEEtiUKmbS7kjXdOtaaN8ygDRxYmWwrfNBHEq2Fj4bBIAGIM5Decd3LJMLLNY
BHQZxtgPA/6P379tb+O1teqQDeFziI5pbYXOUsEF5HeFsjCp54+apkJAJtlVC5QSHPuunhnhCbDM
GPoCiuP3sehpgwERY0bhd30XtNbV1ikz24UhCaADOtiT+IN6uGnW6Y2oMzxmyUrB0qAVsJKZHxRG
JWCtkM51wb/A6m0Sa/W75FfezkunfNkkB4S5bLOgeWA2+TQrTHWkM5Nr9xIwWw0vJqyDmUlh8ikZ
spbifTpZ4KSZcSHiZ6DwYiKexqpSE/nshECb6RvLbLL6xQWHc3O9uQ8NIdrMFnGaMQ/506Snnsjp
gBL2FLKWRqCGN2b47o1LLmuZU7p0Xy0AXzy6acIHPzr0xWH02NzeGa36a/SJjns+dPLJlsrJ3acS
v/AHbOhMB/hPibsij90wT39zN+nTTYpSjFdllbKUSAixhqjqhEDORRdkAc4Je2fh6mEdP534RZWx
21hlTjYTMi8Y7Y287qs9WLVel7cu/NJ5TW7xRTfdfslFs6sWGwpmI3DSJycj7aDQVjj0YmAkS5V4
bTDxW94fC+NgVeAr0Rh22RlGg6SUl32OHTMKop1N7RCiDIHI4GBp5pl7GFSd31TB74Io93Jt3bCl
17dzflig235TW2Vw7fChdUt0IqQDH15y21LUA1/2yj1LVIrOcVMivATDONjuynzeEy7Pgp1UKbRV
Ecn41YitFxDFDfHj5hlnUBHUh+Uws6OfqhbF9ezYuYyO4VqUHPVfSzP7p9gNS4U6UzmTjU+Miuqn
LsWXmMRiGxSzTUAjkWKb4WkFsgo1GqM8aADKDLSX2IzPhNqWaqgszk3EUwkmvlpZCFxqGDwW8vEu
tQSyBkr2i7wkx4gScFI4HpJGtRC6iQGrEAW9Hlf5QugB74KGo0MIhwbeOGYskBnY+EdFPrNPuvuH
7GtuEeNpjswmMKeCuOjuK/JGSgCqBu5E/LIxBcoWOqzxvZwq8sLlAugajEwRSpgheMETKCpdRp7m
uOTEa6VGH2kGlpHngaXnpxT5ND/zyuVdtxgXW6mjp6zOYALUF7Krrby8UFhG7q0r2VkZXZPdEq+G
WV3Gylj25qbk4efyOm8TbDHZduI1aZ8maXV5abnh51kcWMLCNcpOtJ7PUiXriUeXrBkB5UTV/FYp
SZ9DT1yq6iaCB7s1L1DFbY4q0RR/wpVtUjo7p0+fnmcR4XppBL59zQ1MB/q9B9jb9Hccc0zz//z+
2Vmtlz859Ovbah/9+xlfeuyPLvuFspMXdYnI4MQv/KEP7bkFT61mv1AYf4mNmxOi8FqcVcpKrClO
CORctNhYFlCrjzNUpcr48C5VhqIh/Ln0TRIKlEIAiQgt7DQn+EKSb1a1UJOIXGLSXXMi/a0aLsh7
/27fmdBi3Bj8CCR/4JTltF/dDl+f7LhpKQb4kavNRC/DBjCQpU7Fo26PBeELr7NC/6K+FF6LmuNK
ZlKP3ohAZua3wnpgZp54TDKfNpXEUkXqSj3jIpRq/dRjPhTCgGlN1ImTXzfWI0pWa537pq69og0J
Y3elOoh2MhqStbKuzF3jfwUxjrUgaYah2qBoehwLV6yVYSGPLqNjVGLEhMvaAEI7KmPN8eZb7B7h
nZ8VxDj/kpSWAZ9lpWL8mgQ2Ht6Rs662Dr/WC67gaY0Y+8pBofg3rWnS6Y3wUWuYUsFsdGQMDQt5
Toz6cmAt25Tu3cps+Rt6saCvG1guboBE9yOua72jg9cAA9Ql1M0GRF61IDW3hhx5JyzT1qKI/9Ad
Q7MUf0SAq7x0Xrk2ICl9pqp4UycXmzBb8DYhI1ohtSOkJtJo9RPGuiu99Zpy9KAu0ecZWbMrMgUN
OOXuSigvO4h/upNTXI0XosKtzPFFm3qlPhnmlFevO1OTZsk5iLEOlnru7Abr496eQk/Jt+Uz2W2K
uiqlZZuTde/QEyAraiNFKz+opu3Jy+QtyOuGcL17CAxMAgyYvPXggz918cW3Vyr/unPnBf9yw9sO
O6x7QIXSAYGAQBYCxIV4gyumRrhcFodQ9N5CV54iVJTOgbKa/PE5LtQUXBGoSwXCN7Ztk8txOU4P
UszWVuBVA6KLS+Map7EjEQqworROGPf+BTmtbfMhKjVuAIYdohqgIQZv00sInNXkP4SDI5Nx7xn4
4hHv+gMHeJ71olPiUWphairF09UZgqklw38V/YYaSTgOr3U4tIRZjUohD9QYuwulRANjavfwjlP0
FlecViGvQoUlNcXG6Nhj3hCL6lIVUk5Ug+LV8V/SPL6q3b+WgrFqDBYCzdtfGY5NnyzC7jAOZB0O
zUWoUsacFVCasHIYUk6iKPye5mJIeW4ax0Xjz2Q4pVLLGt8YqiNPOKsZrqVhHTt7cSNo4LoQpQl/
eAIHOX7R91tgZJM/wHKFeAmPHGB1Y8ibal3dvlCQXQD7BQ4M0ba4Armpidd/wu5HuAFS2UNOYRTo
i4T47hEVK0iSbRJNNO/z1KlEwuLATB7y6K4LWIYCsmp6YNoK57j4+MZxb6vMXvPSby7hv4stqmnu
VnnC5Rkiq99TeAiXyJ6nkM3P7ce40Zl0Lg0byTwl5StUr2u6BgrDOdPIp4ODsWRrEgGjXfKMWfVC
hgEYa+H+Mh2XXoTrZdtwp29i3DTssZJey5E3kVVp3hOA63JvCvdB509hU8yrpewzL+R3ERiwBDh0
dkAgIPCGIYDMkxijeVEpR9zgWnK0UjgrvlkVV5RBqljGvJOIwCCHIcZCQjrlCt6xsHzx9EbIsAQ2
SLljqXxJdHQs5YJm42iIRGWFwAkMmw/BokfY+RniovETNbBktBPlK5pEr9s6YsX8ood6mUrBNkZN
LbPa2tu3PbkdCk47oxFeb7M+34Q7GDH9o/z6X41AwmlqEimnGmHwllqcQueKXAkJ8VikjqvBa7TC
VkpU6UIPPBU7PGMG/TY1mzyTBI481+yWSimmKLy+vJWUqVEtflYeWkzHqQQi5/jHK8DVJ51pWa/+
5C93KstXHay//MykFzfEokW8OhsJ55bTqmNWlqpTMwicGGdT5Jk/umt901gJ8DgHDK21RkJmTGyN
lb3jSKUeqci9SX9qOEg7nxvq6/qdROm8U6lMxiDeO7x+owZVGU7CjLZnwwLLRIHr8uJPXIQ8Bhch
y1XKecDR9TQEJCW2BFmzHt4JhUz2ZTxO1nhXDtNzaXAC0jQLNEPnImwwj/kbziBJl8Emx7Nn8klN
rBtN3l8im+vKs+hEQh+XHXlTrCkPfoBI3awUfrAkv+Zq2mSZt6F8XqBss2RNDMNJs66U3jHk3z3h
J4/FS1UKVYrPHwkOI2AaLk9YQ+fwEjZONH3EJ+69bD8TXPkW63Nt2HeHW3ZoyKdlvbFK2nkbby9i
YWKeEqxA5oyANBLTQEPC1btAT9kkMCG0McU9oUoTnVXo0RYylUZgYK4BLg1DKDBQEAhrgPdIT4o1
wJqfwJtYsiZ6lxBRYXbEy0Q1D6JzXvPJrKwSZ0Cn39Lrl8itbuh7vKs7B8OiyrrhI0aBqI1btsHG
u52DO8cd3zBfbzazcvXKNvpqCEivk7hw0DK99vDVrd7WlMjvYKJPWIrVphTQauyYsY2TGpfcsWTc
2HGw/9Za/AQlL9wtgrqgaZCdN5TmQ1dKohgTfHUKyTrFXOJSpQ455DJDn6QQ2R+xfJHZZNC9SQqJ
FbymU6kBWl2xtFhhrq6K1cK6FrUeWNNa1XL95SQlH9VWpmIEmgpNvQpbhVKsTkPtKEiLN8W1kDE9
IrumDNTuOFiOxspIyszrVRvtWduGe9JjdZOBJr9gLFNc7lQqc7aahWhGd1pqDF7enkagGRZ3pwrH
jSn5jBRcTWOl/t3QNk2lbrXba5x5EiUlzsvru244p7noslB3TsEnycIke44gR1ULCkullMKu97vo
TERB4ErigI9ftZ0hPqozbvxUS3ZfoBIZ+TQu2ATKVo31VmGc8GLSi4Ez5iYsAy7yeMQ27IrCGuAy
fV407wBfA1wUhpAvIBAQ6AkEmAWRJxP3kVLeYJrgxzlOzSf1hsPk2lUvWhP2rHc8IgchkGfNZ1Cg
9S3flvObGxunASUG0rvuobVrH6Lvr0KI8riGFvFZi6V3rUSajR5I+t6ser2hQHghQX51SC6q08DN
iOxXTYoTC9sVwc5G869ugc9+LO1YunbdWsF+VYZ0LA371aSXdsBW+a0RgEIGIqJjHY1exicKMLFW
ubFScU6hHyZq9qsyCM7Je1MhdEz+9RSAcedq1clDq6cSuE+5qSpWnD248aAKHblwyZBRLQez0aQD
62I00ifxd6TIFUwCSYjJyTXrssSQyb2vp9g12rxBV+Iw6rknAiW7VObvbAeI15FSSn4CVTlmLTZ+
LV2Xr4Bphe3b6XZmKcD1tvXwiD/NGDjd8kr1CHBJIcZjZjmBi6DqsWTzMKHHb5HnQ5E2Gdeiyeym
+O8pkyoJHp/7nl3eW4Prch1reHvnRtsyILIfvSlFUHDyVG+KFsfzPnl8KrntLZKiJGU86Eo+N2Sl
fG7sgX/KzuLau4VVVb3jLZRlMJbP2cLEO+Oc3Iaaa5RVGMe4RKDQ89+dF+g5EIIkRmBAhUB/+ctf
np084MMDc+YMnN2tg9UGBPomAopp8I7KtLbWkC58ERJLoR19mYvif4m9IBWhVaCcnfc9AmpKmxUp
tzCedMD3VX+zNm774Ai+hQm7PeOaQPhO5rSm5nOb4AcQY95cFw7Iz4uHiYzR/zl01nwjRxAmcCaD
zxld07QjsY5M5pETBG+TUPX+442LNInSiVglnhtyJVkWtTvOaS4pVTHumgke5qmonAoWUxcDAn8V
PomDkn02oUQzrCaDeIVjon7BcwbVB1yElw2L7ydx3DV3kIJUfbiIEmnWgwKYFS/Vy7n1XlYw6aDL
cjOIBmPNeK52BUfzALRp0KAcyFqgWkyORsJDXr1amEXFHa0EqlaoNtJ3gPmIObM13DFdzMNl90gZ
I7pclwDEpkmnh3TdZNNjX90izagn9fcq7CZ2Y5ibo1XysjvYzScqQoLExyBpBtYZmpSqRclxMWHc
LPQM7Ca/tJM0W1J3E91h8u7TMaKGJ1hjYtdd5jUze/KLq5At8irmbaADq7cX2KrZwrMojYWe5HvS
gI0m5suuOqzA8pIZN6M64Z1yReZEcC+3RVJuxp8ptzzhnN7bRwDineuRlM+avPCYqEU+1VtGZ/Te
1MVuOWtewLIcpWQSChVea0FhwLEw8YEjzZXPjT3IR5/XQuyb1JWfBk5hQCxr4XLKbs3uze63lGQf
Sf5pbqvkLWyp49JarjQxQUBVJO5lgt2+u0MIdLG+7mauAUKAv/6Ny6/5zrWnf/wTX513mfybdd7s
CSec2PqtbwM37iZSoXhAICCQhgCtt4x9rWrrXfXSpVhffKXhv8SUkDExScaltsyyiHQhMVbMR6XV
8VrcqLO1vXXtQ+ssBWBJMDBh4MCwE6z5ODDkgdW/7UvbkVZBSXxpwX67xMBV1DGSJiLeeJ1rqqMX
E2/cpWOSKbxZ+TD53ByaUHFivIGq5oYJzyQTtrisPlPbPNI3gbV83szJP/vLwkFTEsjLlVPYGjfK
PpS2rLN27cbaMAQqpBklsBq6g1BLvYsy0U5VCZ9z0Ljmmcx74127FA3npukOT2TgURRWoQi2Xgou
GiHR5m8jUYoagSm5HEqAyQQTnYrV6bp2MT72YmUS80hj7iCvGlYmVXK5hFeljEG8y4Kym2xMIrkz
sFXIbZeXJxSrqnQuL6pZlCytBpfoSorrlrJG55zB7RGRoqdsYlneGZCCLcpvo9cSJAWSz4EywFff
v2kkx2iS6UljFpGYLBCfH1NPgIw5iDx+m4tBWtfIWa0cIQV1yHvaZNSSoWTM8EkN9Y4Tsw9KrLRt
yQadWqUBJwieyGnpU/ox6CpQAENpJGamhpVSnaWnWmg0ol9hahtOH7oplZZuDsv23gi+RNVHuaYZ
MnQDgX5PgDc+tunyBVd85jOf+eQnP3nssccCFO84/DDzd8ABB0yYMOFTn/pU4yc/BRwYMncDq1A0
IBAQ8CNA1IipJh2av+FLAp17eoCI6YpzEkkGFsqbJ/FeSkySDYcEQeJ8VzT/6ta2m9pzI343btvW
PI+2btaimFaBuDri0uh7VOuToXZFPjEPTc1ynnhAwO9OswlTYnBsdq4iqqUOwz1lomyUyam3JHFw
06zb4MYqAUlmNXvsiLuMRKqW8yZbZtqbqbJahWu+NqT0iBtJ+VmCThSqemkDyTBF7IbxoCT2PAt8
jTR9YtQgaUx9zb5Zoi1SDdNACaccRpsBImcoMPxyO8ZyZFXTc0XGxGpmoRrxBcsUGfAVySOr8w6j
OYNLEb3YWtLKKlCw7SpbwY4oJ9QehbtNyGqUdzxtFDCk10oppqGkB1Z35JPwjCrYVouAmSKE+XCx
RqTkAtwkdNUqI+9uqMnLh21VLaJuNHE7q1gLjfxqOkU23H30FVPA5JJucNcd6nWQJmqwekHqk3Ep
qWTacyMmw1pUjgl5n/aZfSSrthpr7CQNUU/fVWuTJTttr87e7wnwdxe2Afvdf//9Bw8e/PrrrwP1
Xfffv1ty6w++f/MtcAI/IRHiPeDDjOANhsx7dW+HxgcEeg8B9bymcQl65+jbQkBG6Jw+jMQhshwI
rQOGKV4aQ4B482faLFfthkUCKxgTyyWQ2qy8d3XjrGlLli6R30YybYKtsIAht8xvoRXB8Fkj5ZfW
pAxpNl6Af+O9pmgHY47Ppf9jBgzkpn/lC4/4OWbARKZYFZVBUTWLwXFVfMC5/qyf2miaa6ODfc5w
8BQAHnpvLfUa1qLUT1GQl+kqOfGwUiFsvcWtn84w1DQAi3MUtJqYUB5v7An29HInKnZKfSqCls0C
b62Z3u9aIMKy4wy6j9lCyFqMLUlSTQHPOkwATItxUzHbClNFfeMxsnR/pfFYLx+mNtoHpWQztAzy
4IgrlmAN2bmQbItF14tJtXIVYV/dGnAn65PDPuXGd/bddYeSRoYccHOim1INDNl3jQU7/7RYjczj
XtJ6ssJmaG45rFhz/9A5aYH+NlrcJkPDFIwyBvRGtyrhNbbqO0njThIKyKOgc2/GlBs2oWoaA095
OHjJm7xZjOG5TMZOkY9r1snL7vL4TzafNHMEqZMF8pHI54wJvoOSIUg+A5b3oLlzpQFbUwNsyZbZ
pE4N5FqVi6EowrZhPQ3k3ITS011E5LUKd46AUeJDuJElJu6EURbfFsHYpiPMYq5cMEKGqhHo9wQY
Wg5D4V27wOQ74d8//fmpse9/X9P0s8/54hfgZNPmLZDIx/Lly70wbVk4oSZ5TFi4xeRcMbOmZuYK
q6BJzC6b3StY1pHMRVB+2rWquzoUDAj0GgJMnOj9pk7R46o+JwtMmF41RCmR3PJeR3pbI/zJH4nB
MFp0CNdhBoqXJp9tpyKr7DHu7NzZCXtiNTXPmnburPmtrfBxo5arW1sWzG86v3nWvGZgyBUorL4W
izQKQ2pJLAdB11G9dWopKcqsg9+YQfmi8Sc3JB7XUlAuvvZw2Wodvvz4XV6niSvTMKokfl/G/Et7
dAmcXboGSf9M3DXK1I5lZv5Ur4FL9yEKxyBkuUxX9C/W5L7ONaclbU2XKSrLmrPS3IvsHyZuyQmK
/ap69DiAPa7IWpmXmvkOWspLcc4c8Y4fOuKwZ+4O9vxTIzEDn8eTDhRUb1RVV7WXmgKkuVq1jJxZ
N+mvgp+V0ipRT2fkDkAFjBmnaQNQa+jTXVeV0cD0Zho9M+1KY/gF2mXG8ZbaLg1zB9ZuETfFqOAO
EJWBCece58nl5JJDspBqXGHZ4GRPLmRzFd9gPZ8MOPqYRmFZdWMaA3dIlLhxUJJ8FGSShzQYZF+4
gBewLJ2F+RUfRqvkiRecVO9iRiy0Uav4HZHSlWl3sWVppQ1PNtzCJA9TazrAWL6rkl8rSWuleRt2
J0+Mbo5W8jlQtvme/AwI90IxBaxbno2TwZEn8WNBhECr1pSfG4phEKH7BZvvsSUrKpsGHgWl5ZlJ
uJ6FwEAgwEv/9UdXX/Xt5557Dljuiy++CKTX/OFNtGvX008/DRk2PbYxFYkZy7viY/mY5nrDPyc3
zogWdyQZ8IqOxdGMxslKWnrZqk1v8iLQZpGuoGoxoWBA4A1CALmI2eqZ2Sy+wzDCmc81F9Q8Cpkb
ER8mqJqi0Gd40XXM+YkXITHmZiDdUeQTyVJl53bYihk2u4KNoDeu37h9xzbeVwnJLa+qxZEibapE
Eohc0T7VSpgCx2zXRBSLa0YqjoRKvYkpkYduJvTOikY2ObMGW0q4kpboHE3PkEKbPbHM8mkRxBuX
gnbVJbwHXidh0gTEkJnaSY1SiZruMtR4aEppSuEJLb7VfRGTeNVBqtd0rSiTS9O/KJBorUvO9d5a
TKfZz8xFmFdrK1Lz9qShOjf6m1J2M40C3I/WIVOyrzIfS+aRAxrp90hzZKHemWtrHf3SE7KpVwlB
mNU0JMG1tJA0OsrXJWkpzoSzS1nqpzFhr5Aem3cogqEhdRa7K1I26Q22kCwmgHK50yK5KYWlS0u2
2AUrXA7t4nRUaMh3lrxxsg3S3zh+QjKzyp7USJZPu2Fdrm7KpWLiZZ4ZHMy95NySFhT53eGdBCw5
M2g939LmdFzo7BT5EJP9Im8rbrKAQhkDEUXmumkn5Z63XIV8PUn8MyePJAJmvibjLZB///Xo4z2/
ur0vx0AgwGecOXXylNNuXXJL27Xfgb/HxMEpcOm44z8Ef8X6F+jn5rbxi6ewe9ZlwEn+m5SZLFus
vpArINDvEaB3Vfze5RBipq/wZjIfccWPA5O/1+Y/RGcU5yFWozYNZmDYN0icVv3LJ3ipEifi74qE
Um+SxC9OcCxzmYomV+z1TY4diToplqtplHkpkls7wTlNxLIZV8VML7NXaYLAQ8ZYH1MjQaEGbXxJ
BYQTJJok+uVkW5WcZecRod752QBNKip8i5io7h7t4403hU4ETrPeRrKJitfp1N08CUI4qPD4pAZ6
oa9KxVkSMi0VEK6pu0dtM6qwRsAGEC7jDj4KDEcsqsCS0oaGRSD1j9QlhWCtTEoBJd16M8bxnDmX
sXvHeZxoeAuPU6U0KTZtpOit2hriW3nMNEQhhLufSQ6L0+mKtx6JSQY40ooyui+/KfxsKcP9LJmy
m6z+za/dypHN+pw9igw+FtNINc40msfPanm/Z2iS1DltFsa607NuGUsrl+al4Zh3a7MtGSpoOJiH
D8tKrQeIfLZk9qj10Ei7f7MRSzy7THWuDk6KmnahUYfh/9ZJ2uNX1VOS8Mce6RRY3NkZc3dn37/d
fUeUvvFCAYXAQCDAv/71rx9++OEvnnPu9KYvTPvsP65Yfrf5mzR5ysRTP3bSyac8SUfhbh8xZ55x
/NoMOIv/YgWyrF0hxTbTMWHh5vgiR0PzRaTdcMZh2FYANubT8dki+lqEbMsKUEA4AgJvEAIVYrzI
alTELJFNPdRQbEctdqUlwRROjEUo4BlHysrxSxtTqRhmZsLsIkbSpL21XBal8i5WJiAWflZ0zC3z
LHJB11Zw+W4nUF962aCqFTzFatltyKUU2aYmkGQ64i0iiYuq4aMJTkYZcWPNuWGn9olhf7zQl7Gh
w/BeBRRvCUaaGl5N+bVmXIydxl63aqL3ZSkCgVvHgJg6pMc2ObtAecwaYB5BmsZocdQcowz7b/nj
UlRa/KuC5Kl/41W7LJDj5BkaCqdXwd7cKWQPrKf6qVz3NG9CweomA2dSTU/g5qW4eeM/M8pJc7Pk
u18SfeL8sBRIG/WmDdlT9PdqZRJz+a2rci4OCLuzU5EZlLsCLfrnLW7yVKGwqbFbHeTlt92glNn9
kjsxoW7bjIACvhMtymfN9WQapJeiV4Ohl/gxdKwhPYvEMzBr5sjQvCxNSk5GKAUYjeR9l93e0taY
Qb0KsLIMqulqYqaf7E7uCQ4sZRoimnajFUJJTkxIY7A6RV/K8K/m2600D2sWQDbM+wSuwrS0TGlL
2fpXM6+d/XIJV5MIDAQCfNJJJ/3DP/zD3XffvXLlyl/96lefmfZZ8An/Q+Mngf0+8sgjjz766IYN
G0aOHHnEEUeU6P360eOj9ZuIQyYZ8JZN60X8s1eiKCuvAzmdsr5tM8daz9swpXmNvLp+QcdovJaI
fMaqlRaQd8vdy9bMmDdnBJwtnFC/bKoShSHb5K2GVFPB8qklGhuyBgS6icAu/DhPRTl+aS8rnI0m
py6wF3pbEAviQF9e60sLRLEIOwz5G0XIV4nlajrKX7thgqQ+KYwshsgP/qO5Y8wJ8TLJ5KNO7b+F
88R1TJVpzy1wCDN9IirOn0FS7F191pjLczY1ZKTa1NpU/bWkOJsVqGxUsE4UvVf6sUfXjP9MR2j1
Ynatsunmx0MljYEpm3Ii86l9qqhe5ZDXOljqylJIO8VQ1RBRQSypOXzw6FZTX8qMMx2qFO2IpiUk
KL3pUw0RMWHak4wj6iGDrkbZgI6T1yahnf+sip43iacilHqqf4W2BjqXSeZxYzQU5yumBK/dQalj
QTMqlWp4ibpBOK/T064bVd0MuU6b3MEuQ8GSXReNqTG3IlncIFmwlKndOqkWMCrn8pM0cRlDal8R
13JkB8mJgwwi4eFpkpwbqlnAkl20WR/uTXNidZDL2GOV0qZsLDaeNuOjQwnMJIg88RPUjM5yp5mq
ut8NShnzQbZu8SNRk3+QIulo2q2tNcwAmS8VnZ7wVmrsNs9Iirt8LXvP8tinmat1N2nNcftKDoE2
J8lY6LRnckIlw7RlqkuPze0vn9LCXL2wmzvXgsvqqUSfmlmAbj2qQuF8BAYCAQbS++///u+nnXba
pEmTJk6cuHr1avAJr127FtjvBz7wgfe+972jR4/etGlTGQ8w+HFHjjHoSRpKJNSs//UDLMvGOcBz
PL7tVqSveExetHxGsvTUufqaSIeq1yy7m3g481+qesVVzZEQNRcCtvUy5TEjuYLJczzS8u0h5AgI
VIMAEhJ2/PLiW30wk+SoVApPxU8i4WJOjiUmZ6wiJ0SYNTtSnl6z1pRXFCOvVtwn4d9DQc7KTCpA
9bIyiXEVuH+ZQ+lDX60jpWjrJjrk+5guCe+jb2dj856OqxPc0KlOJcQvVCcoOn43yz2cWA3dxMGg
taglfQQZt9eriS6ouKUBQRTDS2JYiSiJ8Sv3PbNczili3TXaNAPCPYKTHUlt6YLTL2rZtiLJpkNN
PmNzNta+JnhAkEml0HNkeWPeihA2e7JfjpJNLd7EnPaoy9kk3HAJzp3L2LOdOWlXc8WmNcVlF5bC
eCfo4Oq0trjj9WLIJXNlswJpPGKeqGBFFrExtmRmECwAXbsq5GQrqE2SR3nH8ZwoK83waKVWm0e0
TEE57SL5Q9Z0EheWZMbl4ZzBnbAo/CjIJpw5nVKceFuPysz90iVWWR1ucTkvFZTPfzGXl8bD0260
orS8sH1yRtVSXyx0SUkp2SUm5qZOwcR9flrPJfmkylavl+DqGUwGipSBQIClB/jee+9taGg48cQT
x40bB+y3eg8wOnrNEdPQIvw3SpTVQjBRs1NKQz+xOBLXsqvGIOw1uFGXOuqVL3nEaVNh6XLYP3qg
3Jz9qB2KjQ3GrxaB2kh+6M0ah7/yPsb6dUvURa0TxvBUfMcg7UQ5TIyJ8VZo+2hN9fBUUWLOg/5D
chSDP3kXhDdzXnIgq32kydfKYbEY/6y2GuaCelREtEoxJ9pbK+bGOpSXCZh6EfLu0KwzbeWFL0Xl
5VbnkBC/KZmmGbJGJzQvoL2YtNOVOirK4ax+knw1H8wOZ948TFBEpa2VKAlx4ly1ldUzLgVjajoc
GnkpR6TLjaO10iiEynJss+GfiDOhbR9ymEXTHKJbtZGoDuWeNQd1jq6FU9XIgBzInELS8FyK5QZa
ohKyRatdldNS0sYl1Y9X3BG5hMurhxw0Fx6mu5Jydc7wa1nS5Ci/LJ3GjvMNrGMjSK4cdhvi5WC5
rSve6aVzekmdj3oVmRRI470l6C4/Q/gJpp4n5doEYEoOnMbVY6FimkwlWimWGuaJZJ04anr5VQko
WKCsvTADz4DMAGJQSjysZElZtcTEvDLElKK3Ru9kRMbzykwW2HeE4fyS/JvafWS4R+4plzkr5aVx
WuZqMU/HurwzL8yNeSLJnHj6xX2c5ppEboZit5d/wggHGPnbLhSrIeTKQmAgEOBe8QBv3rBm/NTT
RijsNAMuxH+jZFklAhKrMsWUqhN7T+vI6RFzHuiCDbzWAwkOX1GqCu1QqEoEFAvCTwrhx34paFm/
1XiFJ0VEE3shysRLcykbuYUxvJkdvMgt8V+19BfSh9ZNOn3SrHNnNZ/bBCcY3kwrhEeNGt4wsWHY
sOH8mSWQOamhYdLEScTH8J3XcMK4WZ+f1TxrVlNjY93QYbxaePiwYZMmNUDOhomN8A+UgCKjRgxH
2kaEFumx2jgaudyoUaMmNTQOq4OWMTln33UnTLFBumok+73VW1m7ag0rJjKvgaUTTKmoRLUbtmbF
hk4zSU6MQqiVqhammSBEOreZWqq1taYrLUaKP5NjLGq7+jOh0dgkqp2LCyYZz1MoyWo+gvClPb05
P9NRkmNazfHnfFUt8dU5OfpdFdQnOjRahz2rEANeV4wh8Xwoa6HuYetihfVW3jicYmX1FYMOt90c
hUc21pg7Y1SaMzqXI05WwxAVqSSnu4PjwgpbwtIcOMZ3JE8KlkXE07/2WeSSVZH8KQffaTRDVmEG
vtyQ1GG30DmjdvuSCzvfQdYh5zJcTsjPw2SEvEU1GVLIk2FF+bRE392ondHTPbHuBd0Wy7ZdUiF1
5kLmK6bqxDzHLFoleY5l4QYuMT/CfYq3sT5R1WV/Y1aISnh6zY2Wpl4Jg8CsrnqeXiuIvztdQilY
Ba3vMSfypnP1NZZjm5C3yayblxhr2+AWSWkWi0uzRgkO66kKyt4xCqRooooIcJRx5sVCG7UTVVt4
+Th/DAjbJx9CZ7e91lNI1mjd76kPJYlJSSMM2Ysj0O8J8KHDDivoAT766KMhczFoVsycsphX26qD
aeiKAvHPsHGVVZZFOAuDizJit+qUNcZKVWTBuIv1AvE142KtDrkCAlUioGKG1auRKC7TWv2eIzbC
8a7Eh4m6dNI+WIaRICNihsnsl+hx3SHDllzd1tzU1DgRmWpz06y21lZ8i0QR0Njmc2eNGs7MFv8/
q6kJUlDE4Nq2+fObZzU3wrqIhoamadPa29qGDauDXMOHD5/VBFx6FsjEf88FftzUcMIk0pRcyvTq
rdN+zYYTGiDD8COGa6cuu45rp53eCOlAztHbzIMGe8ii2ZmfotBVdvByBsWTmR4qr7hKt8iwQgku
Yos8w26WVuolyvkFv2L2i02ldEMfqYc0K1aTHdS7mlz6KCaNmXjQRtSXA+aTMvESXZUHdjSnaDTJ
inATNa6Uux7rNNk4qB7/r6mFLsuSkzUw+JKoJBRQP8xIxYz2LE7ljsszGJevBp0mR36cJkfMJiVL
RM41o2pavrTBYj7R6oZWpYoWYbNWl+VMQ5SqvrrMKVMV2QNoUxVnk5ldmyynl7zffSN7V5oX9gwu
hDdbvIOgNmbLhuWt551EyJxVsZS0yJi6KpGXT2lz70sdij020yzQr0BGx+Q+qJNdg/VSSuKE5Htv
T/mYSmjhEmy+7FqCqwDVZSFQpOH+e9B7XzAsziVVqVDJpCiVdCw0820mnN67psT70dhJuRss0Sm5
T11/75SvMZQojkC/J8D/92uXsQcYBrrZa4CfeOIJyJwPDW6vDBR2efI7vEhDm2Hfquz1v/6yVCdu
Dr2mebpmpUiT83WhHMSAFyyL2uaqLwOzKN74Co8tC2eqPaNNEqSmxFQXrDRkCwhUgQATDWQyFf4g
jdqAiskPr/hFjoP5YtanPI3IiNQLT9FCyAb0ta6ubuW9qxubmqbNalq3bh1wUfDbWjQGa4z1rW0A
v+2IUes2boQik5qaOlaurB1aO61xGu3tjMfqtWtb5s1vmd8C/zbPb+no6MB0jKNOuApj4uQQpPYl
S+ZfPb+yU1QLDVSbOhk/rYVhkohhjRxNTdQP2w4NN4xPzsSzVxwy4J5hJJT+jTMbycwiqzlUMdMv
On4YO0UPRGzRYpGtWunNnwj2eVpZM/b2JwkneTTEh694cyziqYoVi/ZwZoy11oipnJwnyW51OWFs
CWjMAMsd9RYYBxcZ89k94Y47ZYqpNIUs+Sc7CvR2BsuyRqUZRNFtb5EUV7s3jItW00EFwPSbkLeg
bxDvzJS5c2dkyWKRZ/bUQ9ZVya/M9JZnti6r2V75zHurnOXh2sxcD59YNDV5C7g20zNWZPHPtPvO
gcdbu5mkKAQLd4dVo3zsFFbGe4vl42Nx3VwqXvbWSMmfb64uJi4UlJLx/FGvg/Twilg778Pfm5jx
9BbKGMkZRpKGZSHL6aGOCGL6PQGGLgRaC39333Un7AINa4BhHyx3DTDnSe1vXDlrVtRumGdvxozl
cCesyLf/c4GyXO/kRZvbIr10t6MRvLQF7Q8Z8JooDshGUV3LZ5iK65eNpmDt+tEU/AwHbhGdJPAF
qwrZAgLdQYDcufSZX/KgIqshRy75NHmVLw6bkPWxNxj+zx5X8jGyBxjzMlUWm/cCNa1UdnS23tTW
en3bxi0b1cphUlZTxpj7dDJL5E2YOitL7lg6//q2tb9ZXdHksFLZvm7LxrVbNm58cuO2Ldu2bd+G
hXVwNcbiDsYvJ2nxJAdZPaWQ5uBVbjm/BXg1uJQ72pe0NLe0zpu/FGhxW9ukhnHQolHDh8PPWZ9v
4plmyLC0vR3IPPifIR0cyJAILH3p9e2tLS0xf9dTANgAOqd5hIqeL6hgcx02HhffBRn0UXJAw61l
HssHplCwMR/clXiiSTZ3N6fgOU95UH5KUf5b6gz6hwXqgHmWo6MAcNaDvM1xLDT7dalSVZwrIt0w
lADP4q9ncT5dEX/kmTObEb8yMH0hY7iZN/7GukTgJY912OGgK40NUteX4mARkw4J171JN9QlFlTu
TDqurZJp3NgdilWX4iqq5HRjfF+w8ZKQWM30esaqGX1aLMLSTLbRzZmSYtlSrlFlUR1JLFkZi3Z6
KXoKvrIi416TZl8NgFwXP6zMIyv57LKceHRH+7l39kyBqsjburQ5smTmXB7OnVVo8sJlU9w75rA4
WGESWOjukI9EqUkGx/PdsKaxaY8R+eTJ8YKySlIBk+JCwW8Zinw2J2wVZmom7T5SN1T288eLNqsh
378mRbwODP7mznVv4VxDzZ+/KNTNIVMWAgOBAHP7vvGNbwDF3fXaq8CBzS7Q8DOH+qJrFhbOyiOF
OQLptD5SVLys6gJR1aLJ+ENVJU4pJ1T1gNzEGatOJHAec6hrQrydO9wFAYHeRICZBg6JmGzgwbHN
vO0z0Rh+OfE1WqNLfImWa6rPt1LwM32wF5kzef9Wr10N+SH+eWX70pbm5uHDhq/+zeptW7YrHsj1
in9Z+Lr1azt3do4dMwqoKfh5x40ZtQ72hV8PtFlxkoZxDW0LWtvnt7XNa22d3zoMIpyxHIlSK5NN
FDSmcTFi9cw/4c1LB4fg1taOO35cpVJZee9KoLjgaubwLZWFaDO2lxjZkqVLQDfIA65sCMCG9LYl
7dgI5mZMn5hqMp/EE7qKjuI6yqPDnvElbQrSOe4IrQ/zCrdGD3EOz5kCiB34cOhgY1RJcF3Oxt1N
oOBhErVc5W9XlkCUmItQipq5MOdGJHcol2JRJlSeV4arqtFO9DQHT6ZwL4oibB3creqQPoHCHMw7
XvGOwktwAKuDrKGnOyotrK23h63RpxkdKricVZQlRmApQ/OEGm6eMmbpbVHxROmu5HZZLIVF5Uxe
eOsr0nYoKEf2eXqnTTRIzpnRxVniDcnkQXzJiRWjmMWETY3uNJBHmRQyk6F2GrmSRXLBUZl74ibC
R0ryG9fGqKy7SRpVagMlIBnzKfpSDD6TQOdr27Iiaef++9HLeNk8rEkB3w0rJ5LMfJPbL9Yd54fC
2zXZ4FDAM0pLiXxm5mlsw8/AMzi/VDTjeZV+qeDroJonT95jJFzPRWDgEGBu6uWXX86Ml//gZy4E
IUNAICDQTQQUh0HuSkfy9YlX1UgLKS6+EvgTOLTrFfkVVTneK0vSmO3btzdd3Nxx70qQCZtagZd1
SVs7bH8lFI4dxWrwQbtYNbU0Q2AzhCiPGzsWvK9L2tuheBzKW1tbNxT/wIWL//IwYjB8Hgn/rcOf
mnySUEjR/E43kCvTo4Rt27aBa7r9tiXgTwYODFtzGaclEdf46OzsbG1vA02gLcOGDYMi0EZ9mYEU
Vciyav9nHQsdO2KTKnn7sizZMLHNpqAeJaiuoloMd41baEZpmuJCNsOQ1YQI4Wa2yyJJSgBZQgIu
WZyrjv81EwHcEYke0iZF/5U6+30sKZMFRUbeKD/b6ws5vGMs4T2oOrbZ29vFE13Nc31csr2qItqQ
LFFpEXsrSB2LN8bJKUf/ciSa637pRp2iqGygBITTJSUW5qGQFNvAWn1U0CY9TeCHFf+ldVAxfijB
lJMLXGnO1Im33y1MDDgpEwfu/EUq08vtS0nz3Ps0pbhpo2R95brG2wUFFPByb0tNw0vdE7tBch7E
TIiwqRS4izMeF2l2m8MJMypNN87c2TorAw9CzOMrPnGnhNw710wN0F2c8Qj1vhcMCZf9mDbnlWu8
IUN3EBhoBLg7WISyAYGAQHUIMMMxrjlFC9X8NI6I1M7PvDmWdv/GsbWQjp5G9cVgKq4cmyB2+5Pb
2m9qb5w1a/7VrWvXrQPSCFtbGWepGn9ArKym1lBfBeKed1Taly6BjapaFswH/lw3tK7pjGnsgYRj
5erV05pnNTU3wx/sE739ye1QKWy4NZw2yuJRHP0ryZj0tdo4IYml17NaFSxHD85rG0K4YTEzOIQh
88rfrNTVJYmf2jxG8woCBHPgeAUSzabTrKTSmVymlYRyBQYx/k7Xq7jlMIi7zChq+t2wH8N1CUG1
JJpsAwupbNTd+DPeEVrK1NMouipTXBsY/pfOYfaENi0j+VIHq+cSPy1ArJ/JzspmtuxeQOHOCbVO
cELvYEuOvN1uyuu4IqNta1zlumtM12eMwEpV5LcltlvrKJKSKq7QBTn65wJy9Jl2VYou6MDBIu4c
ijV0tmzAEA8JTtKjlWZdphUWCuWYp5eBGyWLMWHLvVbNzIJEKY2M6XZanmeDj+xcj2V4byVO9M5M
ec21kMWpTAyL9RCwwSnAdRMallHA5DXzAlkTBNmaZFqCefSZxqbZQCpRdJ/AhmGmVe0o7J2RMVMz
1n2kVPV2vXd2xqBpbEbcywWfnH4dsvs07xVQlUWEQjECgQAHawgIBAS6iwCN9BUtYrpSIZFI1Mzn
f+FjRfhAp2y0RzRQVn7BY0wsLw/mQQN93Rcz7OpsaWpeetMS+FgRUNrVD61ru74NMowaPgpY9PYK
VjJqzChgQcB4x40aBaK279gOl6ZNbFx6UzustgVN1q1f137TEohPBuZcpxVD7kTOXigCUqAuWMo7
6YSGSeMaIHCaXpAo0zA9rEn5t5PkE9+XmuckXlf8wd4IiDeTVdqDmg+IzR4LB7iC4eq006dRomKO
KugXxUJKRdMG2hxLfZFIrwHmBckEoDlMRxjN42s0uPSk6+o5pyKZROBRmmC8qCITV8W5dUA7r8Kl
8bSZYiCqHLP0OHQZwt05BBqj3FUUNEU4C7YsFh4b0KAEmxbHC+iW8n5plKhV5Uh2aZP6J7dOY8DD
rGIDfe9sfYytZlYo3YklltkS597xTTF9sEWW0zXX81YgQ6qqA/SCISrWqN38zJ4B8aOS3YOF+zfb
luRchlGjBP/kGTp3XsbIKjb4ljSvtA/WohOMTB7dYsu37jI3JdE1Xpky0atJVTZvcXIpI9dLqTLL
eTH9BM7QRc6+cTZOkZhkNcVUl3GSCUUaA3QnmEojahmha64+K5X1MhScktY1nrtGcmNjG+4MV969
bPW4nIxgKFInBfhSnvzSeIYCSQQCAQ4WERAICPQAAma5Jj7WKbAZ38T4R5sbwf9o96OYFBHjpUEY
rmjFlxDyKKIt+F1f9AZD4rqN64AlwieLgM1OmzRp/sUtcB0SQTI4UeEcWOt8WBzcNKvl/Gb4Cds7
w6W1UKq2DhzFLefPmjSpEa5DWPLGLds6d1XqqK24Bnj+fFgA3DZvfvv8ViiLHzQiHXjzLVC1ToQf
z5rWBEuFIWi5FdYMz2vFryKZw2TjLxiroxMWKgPTGzVmLCz3BQWGHTKMr0B8NHyaGNgv7D4NfuNp
jY2wFRZdYdpG9Ey91w1dJSDVvDid8xHvAq05qak+1o/O9KvU6Gddj/WmC3ohtyqLP5NB0ZCfiSiq
oqkyLeom/y0tGEZ+y9uA68qI8VJVFAKtlFaSMZ1TSLj60i+TdiFEnZJMjqLHE/yp2sjZ8SBzMpVT
PvOPwIT1kQdaIxuwb31dxqjFQjX+meZtyGDghUc/GbSn6Jg7dyimrILw8zlJVEXeZjIK7iWDTkap
VEALXWCtJDGrxg/DtpS50jKhTRp1LAWOnNVytoMu3q1+mJj6su25tLOY4cm7QLLxEkBZgKjnm7YW
o5g4kd3HxEZ6+UyKanUGh5dUius1mMh5gUJWZmfKnSyz1UubCPPdaK5GLtGV5uFOlNgp/KCD6UeJ
AN+whvuVwUEahrkB7aer/J0xE2E9ImTOwlZqTQfEcJllw52KIXvmg4xNGnDk0yxpsdl3pXuPeO8a
9eoxkSBlkA95yyIwoAjwl7/85dnJo7m5ec6cOWVBCfkDAgGBKhCo6A/n4AuVyjOToTGWYjs0gsaL
nE6Rz3FmplJ1zHkoHQjtkqVLgZoCm4Xv7sLnjWA3q/YlSyHbui3b2trbgUnCBlRwFSju6tWrl96x
FARXnoQVua3g9YWv+AJ5bhg3DqKO57e18r7EcEBmEGWOsSNGVXaAR3n79kon/IvOxl34JSdzDD9i
GGQeqwvU1mlaJV+BOE6N6Ra8Djvu6gCOCgSY6TdLaz63GSg9NArYL21/FSH9jncs9gHvzj2ndg8o
kKB8VfRjXESOUM22WEJikpoq1orLvCGPYcWCvhqAlIpmjGU84Jnqyuq4H808C/6k4ZochVB1KmMO
DsnhlJl9d8c0Xr+KcS9YCsSVpvkurHFVgd4qQjDS8qT5ahBJx3GdmpLidUHd3UsZKRlWbUoVG+am
wcZNSB1oplzySivBOTOofm7/unaS7BqLwBcxBk+dFuWwQC5Ge7hq7w0izcnUnqWq4Zx5J9Imrc6V
Xj5VaYbxFOOWGd2VPevk+vqyesGLf8G7KUVFl/eajHI+CBOpdvXE647pCk2MlZa7lawZEFnYeoxU
S85ZpJmtk91knvm592g8NSD7KIWyZkCR+kihaakSD5x8jUMOPwI1MEaEK9+9ccllLf2YKH79G5cP
HTr0Ax/4wLHHHisb+re//e13v/vd73//+7/+Zft3vvOdYAUDHoHLWxd+6bwmt5mLbrr9kotmD/jm
76kGfviTk2E0BI+SOnafii8YSW6AjBf9pRjqXEsRxTSMQD+w2ix6MLryMBya0g13AX6IHlRYNAus
cWdFEyH67+BaXLg7uHbbjkq0s8IeVBVSO7hz2CHDYY+r7Tsq2yvbiXQZDsVcTNUA+UF5DoqG4Oc6
dlRCrYqfKOKmmoaxSRikjSXwTYw/yaNCKWb4SHwY9/QaWocLg+MMlN9zMITmkmGL6q2tShl/BQ8C
YlEO04NPIqlNoaln9EGfmCp6IEaqIlVEIhjLFM5bRpmQochktQ04nWDnAiZYv+kArQ9DmtDNGBKe
sG1QJ1L/xv2HabFFUc+pDPEGaULt2oa6UVCi8YzGoiiQoZoRCZ8bAlCUhAi2r+qVwzjpaijJ+oxu
3hOEVISMFm9yt3LKxhr7SRvFmpoyIFIWJRxTGaW6obrLMKsfibp9Gj8cSEW3vXmau4Yn3Z6Jhy2J
clPiGryOxzwF+Hq2GsVkiFzVwuJVw8jNajtnkgjwTVcek2wdcrpAIpWYSy0HoXuD94DRGhXKY+LV
vhqV5ERYSTW8mMhZm3zzsHqHb1jXctL7Suogm+9OHqVNJ03/3PRyphByF0Dg29fcwHSg33uANz62
6fIFV3zmM5/55Cc/yez3HYcfZv4OOOCACRMmfOpTn2r85KfAPwyZC4ATsgQEAgLlEGB2UUe7OkPJ
ilk9q/khszrc8BkYJm2FFU88s1eW+CF+D4nYLy3p5EWhkFILbt6N8K3eLRvBQ4tyKEAa8nBBuLR9
2/ZaIJlEfZmaUuh1LVwA1ys4dYlKoZrqSzykD2rCbBACntkRDVthgc61RG+gVryERfjtxRJoch3P
SUkk8ypgmD9WhOuKORYa5cF/Kju3Y2X47iQYEpSVgaGMmKFO/6Sm86HW+tIlHgQYDsx8UCVykXgp
rGK/Uqya7KfFwMnxhOogXb3WVbFfjF3nuQAdCE0VKxW596kNnIIdigt9oUNVILQ60c0xq3kV/oQ8
4SwmAEgskl4KE4jXYzO5lYcpjjpQ09gwVLi1oMpUUJR2B1UWLM5URTn2Kz0qZpSvulW3gPN0w/di
hlbyxEvLvTlZD/eS0s/nKzMuFDuP17Hm8t5k93ljqq0sHq5YcpogrZnq1qY1k7lkxtaqit/ejs7o
fdHMNNrpalFoUoYcTYlA6MJ2KD2xcsrAOB4LKWD0ZjX4sSZPWB9zgyR33DXM3zphqQl6473NTXWm
UklBvZZcoLsNGsZBnU/8LP7vPh/yTN2iTwyIUcB/QpXiJX6ww8En5lEvU7yPrORzw8WGbyh+tkgq
KI3HdJZdXD4tzTxRmYekl2SiJhTwzFoplHQstD8E2jIeg5KFiWiA6XHTUqtHErUrNwANN5J74FUx
HVPAQkOWGIF+T4C/u7AN2O/+++8/ePDg119/Hajvuv/+3ZJbf/D9m2+BE/gJieDIgR1uZp03GzKH
zg8IBAR6HAHFf/QeS3XGtconavsoIkfEEpEgkRLIbXgfXXrd8uJbJJlEn/DM5GX/qnID8rbS/OZG
wslk2EQ4M9FlRkYS8NwQY3bkIlVGvk1bMelBAO28RRt3xQed06sX28VeTbUqj9+jpIM5yMUNKlUw
hdJZmnmPxiesIbe+TrdF1Mynu8C/zSfQfK2YGh8Q08bxAVdE2ZjlxvoIgeJdLjSO88tEdU5F1LlS
Q2nskmGFuM7OwHJZ6h1zzr5c6l/NV9X6cO6zJGXl+QVTnNtjsKNLDAsKVJLVgnOFidVYgYhzmj7W
dAf3+aN8T6frPjLjzixtyl3LpR8ZQ0/3kqrbRx5U5rTWcUlhLfjTzWwaZ4iHrMvQEs6WUZerYTps
3maa4anboQZSKTIVK6veMuP1DLSNVKtewy5MBpdrZbGvbAssjGquVuWM2MqdpGeyLtlZhnb6ofCy
Wcs+c7UsDAg+iXK/i5ZRne+Oi2+oArbtzWLR0XgCOjnFkCibew9q8mbV6HZHNroeK83j/GkCLVGW
keBPGnIYDoz5KSVR0Kq9WNcXvPtSb0nTEfTwZMXC0asI9HsCDOhAUOSuXTixA//+6c9PjX3/+5qm
n33OF78AJ5s2b4FEPpYvX+6FcsXMmpqZK3oJZRA+YeGWXhIexAYE+hYCOrZWExK1lxLzGQh87eSA
Z/a78kJfnnwl7lKhgGHFdlSwdDTsENjLqnHSxEmNEydNmtjQOBHPYQtl9vJpxqV5JLzYqCrmQ8yF
KMU68ApUF7Mq2pLaUGW8qhWjSVn0OYMIWEs8Cb/AhLKNqxldx/oFWcFLvLOX9lgagmpoqjufTRtR
a7ZsXMQmUpqdupQBo5qpOfhq1O1S/IH3nSZKbPiw8wZVZfSHiIraDzUwLms2xNI4a/0SvJT9Cdgf
jA+NZQ1VpRP8R/Yj/jbzI1iKbYf5j6of8lMp/Mn9wrHTfNAZb2bm6Xi7vSVHGO64Nt+944VYTFUU
7YK8fF6PR16hlOu5sMixWkYD+VKGMy3tkjEYWdzlkxkMM7cJWm2X4maTXrSx7tAbA5fkn8VG2BJp
6VNCiy++R5eRYtGbsoSQbzcfFEUnCFzLSdJd67qXYFiTPtLTWMj4TasNGtaJ1wKF6GqQtzSzbNWy
6oyZo5QWSvwt72s+Jvw2MS+p/AKeHBYm1k/bZtIIPwg2U2NWJen3S253mOekx0rTJko4XWJiHuBC
k+zpRTkpYE1dSfpd5Qulqm4KhQYCAV76rz+6+qpvP/fcc8ByX3zxRSC95g/voF27nn76aciw6bGN
fbq/A1fu090TlMtBgKmL5mSK/jF9qSC3JEISz7xyvLT2ANMLpo6+kwT52StLy3GjUUeMaj63qfnc
WfoPz4EGE7OCdaFMrjDaGZ29KKcTeHJ7W3vD8WMrigKBN5jZkKS4ehEvVYguX6JYqCFySLWItEL7
DPNmyxXYzuqMabClFrznQDJ5m9kbDCS7tkJfVFILg1F5JuHCZ0uJmGb4Kp9zNnkgZyaFne/cqET1
nq7E4wP+1hQeRADVC1uFAEvpiinSd6dkhFVSg4ROfIn6hfbx1uzXFOFe4z9JO6nHSSf9SWEzwcGK
JiSja51NwuzAjLlookF1DVFoABYT5IJhKQo7Uc1BKExp2XnewQw/8wtGctxmjaLUpSIMzVBHM6hi
1cpTINMk6c1w3WKy5RkEPtEEOe70NoqNJ7u91hhRZpZjepd4sAG7xWWKHKPLzKa1hfHMntTo3fGo
sYEMJA3JFKNz6cKSpuiO/nP5QNyJhvmk8THfPQTyzcjeOsG71/ME01K8vE7eHQIcJblWr8M3cUPp
u0Cbx0jOnW8sOfuk8E3KhDwf9rwHUnxddofL0HxzENaTyvQRy1TqufhnIMAlXSvNbIW0UpnRBoe/
ASEP7+1vZbCen3l4sjJyOiBWTwdFZ4WZ8CPaQsD7DBSapL0yuL2y1farJ+wCndehPXJ9IBDgM86c
OnnKabcuuaXt2u/A32Pi4BS4dNzxH4K/HoEsCAkIBAS8CChyxbSWcjClqeMgZ4xqZv8kD3A5GIlo
oeCBmAfoH38ZWG+mtXbduuZ5LfA3a9785paW9tvakc3u6qwjcgXndUOxNqJbtbDlMnzyFxY+UHFK
GQyf4R1G4dPM0WKPYe1QZlNEqgZ3QlGiVhRWDfKRGBM9HlpXN7i2tb295er5cBHqpQhqcFAPo6ZR
Tt1+8FrT+4yDk5k/0wueubp6iVKKx29DUlxiHA99SBryQAqNNqyAG2F25GLsqRRKtPiAM5CK+053
rUkxXYmiTGixwZB6k0OduZ1SFCeaoQPtgMUVsNtf9AV1OrVdb5elpelodiqGsxVkHixF/9dULVYI
09ps6EeSTHDnHF4XE9aS4l5zRy2qgrTBPV8uzM3y9I2vZ42lhJRsH0VCN1fJtBSXL/mG6SjcS2/S
0DCZDWhSrLdUVcBmkMZsGlMNyckjM3FfibaoitwUskyXwFuEJ9+KmPmwZRbp96RELw754GRyflWD
en7qG9BaIclPgCTbTNzCaXaYj0i3ckiHHgvKQcPCPONnpoUXnP5Q6nnx987IuE+zvBvNnQrJBtQz
UeIl2+WN0/SFdacwVmbWz57BNOp6TcibWLJrLEDsuzjsAt2tW7Bo4YFAgH/9618//PDDXzzn3OlN
X5j22X9csfxu8zdp8pSJp37spJNPeZKOoqhQvi0LJ9SYIxkjLS+pKzKpSNAzBl7zgbnx15TF0Zrm
ekjQdf3/7P1vqF/HdS8On/Co+YmQwPdFoEpriF7IjhBOr0xTUO0Y5NYtkpxeyyG1T9pQK3+QlRCq
Q+oUwbVbtdYF3SRNj0NoZZM2xyVthW95HoVb/XlhiCCN0YuQqI0xiiwuCqStnieBfOEmoNs65Flr
fdasvfb83+fIiS1/d5Tj+c6eWWvNmjV7r8+smdkFATj7kbOoL0XLrD2Ts1LNNOAq9Yg7SXOLwq93
DSAkyC9+pwmGKDj5mT0tjp0SgGTQJqcfSUmJ9cmm0LmCH96mS3l0WP2lS5fou0dXr1y8eOXS1e/S
J3av0zeBT66dPPC+5VNra6fWTh4/cpSw7/J79h/Yv0xVjhxaObC8nyov799ziu6vrp5bO0VfSyIM
PNu8+dzaGlWnz/OeOrFGhU+eOLF6jL4GfIQSRGrlAwcETS6tUf7R4xSCpmIkIoV/j378CDYT73/f
Mt1dWz2x9vkTB5YPyNlX17dv3U7BZ/p38gtrRx49yhhc8HkIyUp65E8YWjRNiSZSxIUwJlObAUhb
WFsyBWky3pO7CoxnQlRBaKdRpgJFFS3eO8oPUDzgUmWM48ps4pyXwWu1YAnBTtRmwsp2zg6KsqkF
j65FlRZGxqZiYwoeYXd0+JJwTQNlXzmFE5MBhmtL6MQgixlDy1nv8W6bQL1tA+YBo2gFpdgt7/kZ
jsrW9XqI/MXRVM5YOalmkOPsKpbTg+eWYk0nnUDOit2w4LCHnX3Qgo17HFz1UxvTBIMaPfJJu6Zs
N56XgYo2+m0aYhaKJ7Ui7hZYmzBCvYVHMyxmZlVpm9puCxONsshis1DQDc/Kk6EpW6ZlvvdLyiko
pMRu/fYQYe+og+oPKBEymh8xwS38q0+SUheXxmNFMEfKNzyCuJFVVKYmm2NlUWDdGrgZAPA999xz
//33nz59+ty5c1/5ylceWn4/xYTv3/8Aod9vfvOb3/rWt1588cXbbrvtlltu6VcT4cNbV24/8xNc
L62+sM/j0uHWS6s7hOiV0y8++FIovLRya31TMVHf98Iqyp95kKrvfYoSB5fulLyn9jLBsgB094Vj
p3aEoiXWhH6NyU8ee3HfyvPWfCb+bJD3zO0tcfvVtij5OtUA4AfFSA0+SWCWL87Bgh8PUQCENoVv
7eKnhIhlqzB/Tkmjl3IUFn3pd/X46oljx1ePrZ44vrp923bel0uFN2/es3vPqXPnrl69ShuDqdiF
ixfOf/0CVTl1/hx9Q3jn7TsJndIp0Se+tEaHBdCXhLds3zrn+ONmKszfB/7uVSpMH+bdum3r9lu2
0pd7r//w+v737KeKJADl06d/adfxVSnG/AjTvnydPgtMMPvSVf62MN2i8gR9qZkUnt4ym508der8
hfO7dhLrZTQzLGYW9aivL2l/eJW3HfNuWXUCfflCYj44rLI2mzcGD+9pucvas5O6pJJ0hxEarS8t
vOOHwo435GCuUgvglkuG1dFSS81AelyBrm7txunTOj+iHAzHss1A+CH+L+yY16AHDuPLmmqcVYbN
wGZ4xp1rhqbRXQgpOa5laEV55TPclKjAyHmCRnCV4KLHY1FJX72aLkWnRT/DCS5RGiTTIGGRlSHY
yPs3tJn6x5GX7EtGSHXSLdMnOGZ931SqyDF1NtDUdKolKBP5/u4NcOgjaXomGkSGCGRmc7xJT4BA
JdxVVVwUWANrMF2/ltDdeE5G4DwIYyx8v0Ab6LI298jUvakYd9/27pmU9SuhBLfSrsmB8/owNygY
Y0J7BtpAs9kHJNARNtZaAyk7jrKV2n00RefKIqfDyCTSmRqVJKt/yzRhvCqqHWGt7n2JpI+vlrYX
9zeigZsBABPo/fKXv3zffffR+TT33nvv+fPnKSZ84cIFQr/0ZeB3vvOdO3bsuHz58pQI8NlPryyt
viRIlK9th59ZvfPpUxI/pVvPHzwTbm07fFgKbTv81OFtofBjB5deuHyl0S2334byew+Hir5CRQAp
9uAnrVaB9dlTT9+5+kwotfcpwtfhEuLDrU9a2zZiSYu6r2cNAGDollN2fXStLOXPCLHJiVBShrEH
p/lrQ7xClVcO47wr9jl4C65EgBm/YbWtVmEsSuuc9R+D5LDr9cQXVte+dPLEyTWivOv27RQcBli9
9MIlQsUEcSl9/p/OX7x09dyF85Te865dBoAOfHyFFlRbx6185sjql06urp1gUu/aZfBp5cjKoUeP
XP9hKLhpM6Fc+rF1y9atb926durUoUdX6CNNdNT87K0zQsXnv37x3PnzVH3Xu3aHJd+6x9ghzxAc
1oXKQHAOx+Gn7geWtC4SFlK2lhiIERd7KiGNAmPoGFEfxaLhBjkjTkQZGThKcp+6c57xdShE8tHj
oAmkygF/OWwsrIJWWBoYcbt0R7d+niosipbN1cG6wr5rpqxK82L7A7EkX9lxURz9lexL7PTYKjhZ
VVNyX8yhHKlw2o9KnMcTgncbIZC25KksUVtSTzTCpWmBFNQZl55bvnAEpJsTCiUgUVV5NgiTwobO
jsizqjQcFaoAfqNhokgtEarBz+kzCFnr6gLepfFiiAsKMaTq5K8beRReq/WFRzVWzisqW8BRrDff
T0jFYtTRTtpwX35dFg4BYpGkgdxf3jiRjtBdiylUUUTa5dE3GlORWryVVowzkS2asfJTmfHsia03
1jfmeLoNYndAceNozamPgsxkpZOkawRNe4csSscauBkAsI8AP/fcc7t377777rt37dpF6HedEWAC
j0sBoEJj2267HaCWbx3cH5CxV+ewqJgWM9evbfc9eOfT+yqHT1cEEMpj4dwiaGN95fIL41K37rhT
hWLiWGyN61YXG16MkIUG1qkBYCG97IRn+Y29uAyE9MtGnKnP90183rIgPXkx68tGFkXzy0BhFMVy
D3380IGVlWX6+/EV+rRvAFFLl65dY7Q8j8GdfBtp80z26FIk9sSxo7RYmtKSw+9pwsnXvn+VWCOE
OP/h/Po12lR8nWAz/aR9vCjGq6+vXpNIprG4fvGFS6eeO0dw98AHllcfO3rk4ytbaN+x8KLoNPGi
9dgSQOaAMV9ppHfwMKSEAlcP5URzEg5VLeoqaOiEJwi0gHzaYSimOuTmu/yubk2UWKw16EIagu6Q
TP7D8gU4LR+sEu9KT2bmXlZ7CFBZqoRzs2V+JCuJLJXnO1AT/xTl+MLG1+QZgtVCebS8fOzWZCMS
aYyLKVdO9/E6K7mMLVcy1XvqXVmZDUEyzymFZ14/HvF6CBp5pYMpJmhqfbd4dIiUaXWfo2Yf2lNp
SxOFJtovGUYEftoRLaM83QAioaJZmxQQRuVZtsiJz84jTJqbcDyyeEOeDPpMyyhnekf4RnmCaUA4
HUHFHG/Y/HyQgmkCFth9tUdl3USnG3B2fsRQVg2KZx9Zfjakr9WlmcSSDeRD1hEKhZWiO/p0YvFe
TcjZaYjB+ud2/hmedjG42ywMVJGbvKj0uB+enm9janLDT4m+fnv9lroZAPArEAGeahC82dYtKh6C
rQVC2w5/TRdWb/gTTAXWL704rHjOCHEwrO7WRd4W7J7a8kX5hQbYy9GIn/o6HvxgLTRAG4qJVwS1
MbqbuVv8njCYxAFD2zKq4EroINNQj6yYzSAmBlQEX6no8c+v7v/A8n5aDP3xQ6tfOIGa2HRqotJq
Z9ocTCJt3bad7l6bX9PGCBgjIYeLzr7asuXChfMU+F39/CqtrKbYL32rCbwuvnBxmQD3R5YPrBBi
P0DAnNkZ3OW3aQhsUr694czrGtlTgIp8V6UeqkCXBo/t80iBpsqfp5w4c8mLX6uX7Xso4DfuuvLa
Q+6DVT7EhI3foYVaDVWCnYQGuiOvrNfRh6H7BllAM7lkVbYuvY7vpxP2FsoQO4mXQLOE2WOxmv5Z
pUBZz9GdrNcIeXAr71b20M95dRmn09ttHSc0FWJDY+OJeJSFBk+JGvWoOvWbe2dDvN6MU4RC/YMC
ZQqgK3KdzUq9uXpDrQnpEWDFTqrueOrie5v0Ztm2RI92srDHkYigL8SY0CNeGsNaUHtlZifXBj9F
lX0+tKUylFXqkdLDfCxPBLHywCztzWiaaQraB/+ox00oey61NdBvfpF4rrNIDHuAcyJpaXGiyve4
rxXNidQfVolxRsppgN5QfcJsWntELUrkNfCaB8A/v+VtnRHgt7/97VS4yxA4WjpexGwB1fQWUeS7
B898Tdcb86+ei1HwS7T8+Fj6oeCKABHlEuuEwoCIs03oEXhRZqGBggbI757z+0+hBT5QxJetZ0ZF
OvvKoC+/RcRfly8GUXW65hwK1g8I4ShpLIGm/bTHjx0/fpT2APM/iq8irCeXW7sl3v/8+0xs185d
W7duob24lKbY7+579xw9cpQOrKLtuxZFnDMGGxATkV1e3n/oA8tU5cLXLxoDloB9owFlEeI9/tjx
QwcOXbt+/YJsOSZRL125RKx3bt+5vJ/ILNP5WMvvOaD0NcCLc6osMBuOiWbNiOryPsd8iIDhcGm+
AniEzoc399wiGE5F1pQhMYTrkSeT3EMLxzDS51taO9s+7WsURBgGsQ6K8/nPWAIdpJXznOOpEz40
S9YLiPAaE+aV8PKdKt9yEUMhNERijiq2xt2tjJCSU8e14EghJbcsyt+Q9+b7KEpnOsd1U4K0vXtX
rdpxMxvuQL0+V7uDx0+rSCTwdPc9K+ikTm8XTmcEslw3Fvlpi1ECP6Wuv0HKLJpCJE8W23hE6giV
gPcEs6u3rrvtWcRio7UmT0/zwyOaH4u2/CRUbPd4YA95uHx27G8YA/Nz2J3L7XWC/C5c58eyvFaK
i7ETS06n/zAlhFYbRG/PYNpUVKcl3egxm++jTmEWxfo08JoHwH/8R48jAkwbgOt7gL/zne9Q4S61
bDv82EFaJGwnWV158mHaNftJXvgc3bry5JN6snIAzFy2GnwlImcf8YdkDeuZn3/xJchXESDTgBxr
XmX9/MrDAVuffWRYl50SfySF4F16WhRaaMA0wNjDgVKLr4adq8CQfKqzrG2mV5Gu+0WIdMafC6Yt
wVxGVsDqp2v07my2c/t2+kcXEjazK3wV8PDbl7DrxQsUld397l173r374sVLa/9wkgK2dIAznXG1
dvIk7Q1W5KZ4SVA2cf/+fH79OgFXCgXTqVoEgC2qzDFngu7B7SDWtJ2YThnYefv2448eodgvrYhe
+4c1Evvo54/TUur9dL1HMk+uCSqTI6n4CtBXmqnLnvlFy19dKttSuOVDx1xaJMcXjM07xCnQyPEu
TuLu2Cllnm8JM5vGwBV6tksxrXCUNcYBneN8LBVUVj6HryjJEVa6KFqawTS4QFhq7ipiRbR202jL
sXylWUCvVQdHXTggog6LCGSaQBdRN0eun6ePokxjjTnd+AACCkVhhDrwqMpUchwjF9MHAEdVInvw
vCJUhpLehKYGQCq+YEUDFe3134pgkm91Cj5bcDSda8h68F0+fWoP1gV113l8N+vfs1mPN343EFH0
NIhsw1AQJCwgz9Ras+jCx+IsjbqD3rKIN9JYWUvRULXR2hjj9dGaBV05MJyq2gKe/PTJ7ZWIDaZk
h9FjPBSL9OaHfARrS7IVLbYyRhJtlkzRtzrti97eMcNLH0feJp3ASnm84BnKob+W8INF29TzUIqY
psaTszav50hdNmCjseCNufmSWhTYoAbegGV7n/vLtcePHN4grZ9t9T/6oz/6f236OZKBzsH6v//3
//7nf/4n/aU9wJCqAn35tGS/aZeOYpZYrpzDrFA25GkTXRW9MxSmjMdevPXYDhChkiHp1ONIO8oh
l5YnDwdBpwJwsRcfQxG+SqxHLTh45qUdx3w13+qodT/bftwg9yeOP/n7Hz2QEnnqC3/7h3/wsQ0S
X1QvaeBXH2BzDPE3TtBjxTAS8sNd/i9OyeIqATLB4Qa88ZlcOsnH94ERHNaEoil32haBKo4/8xZf
+kowbdC9evWai2uqUAK9Np/60slr379Gi5a33LKFDruip6KSVdZchqSi07xmimYFD2/eTOdgXb12
6fp1/tQwXyGTVlDTadKx74jPINNlAAMKNWcr+zNSuq7pcsRBFvnmEEQ0jUgp3wrknLy0362v41uh
adbp0kd6aaawGGBziAyP7SQYzIDtxXLGoelBmTAbZ4ResBHlTUu7Zzvp7v737UeZyBexHJ8/AeSA
aNTFPT2barmQY9GMke/bXX0omGKbrGV6MJCC4RvatHU0oljFTwxZj6yXQaTqypzINA6GNlPENYVQ
STweaJ371Y3dxiQxMpP5ZgUwe+vWRtQ16ejuMpjhsTOexkoqp2PQRxqzj5d2U7zp+hFXnSvxfKPJ
CN8Xdqsthu+RCaWHolnY6SdrGkaSvq38eOke1I3RmuXiDc8/FUsCVOeJ0q7BwExVEeU8/LsPr0vx
i0o1DXzqz/4CcODmAcBo7uOPP77p5944DNv//I8nnnhiYQukgTwUv+lUswDAP5MuJQA8wrcOAAtu
DGBYXhKCaRUK4txggqn8PpBToDkyaatqZe3rfBPDTkakvIKavx4sIJkpSGH5chICrfbRHaGJ8CBT
5gjz5rlgZhy25JESZZ4LAJjIUAFGuVIEoUXUEkjD8UM7XArCAHMxI24pIeHrc0bLHOAlAUJMe0iP
oqfq6AT4ijf6cBnc87hPWjOASllT7QFwFMDx9JroF4Ut1JCizax5YZogeAAqa4gDq4Kg0jCXwZl2
VLgqQZQWOgi9FurCZsY/A9ZVOqEAYryubtTbTGT3W3fS3xQAl9yRbGgro4nUaY5mEzr13zeGvSNr
kJj11vwGTFbOLBKL4G6KhFNRp7dxAkRpaiadS/JVqk5qhbZ3oFO1j0bs+KCdprxcwNBO6nNjMEY+
d45oCXRVPOyBrBE0fDUddmYNLw9veqwoamMfJo9g3jonKdYFsby8tWBj1iAqE0xVxNu0rjokriHh
CIFPESPLVB74w+n0EyYpprD2Rrj+tnu1pi/TJgCm9xrNiIdDGXoSXjlRny4AcNPI11HAAPBrfgl0
1HiCuxTstX8L9Kv64SXQBx/LfXBpHdazqLLQQFYDcrQVoIcdc4UvHkkO32OcKOBzOPJXkKocEx1e
ugxpqIqGNK8ThgReJSQMoOWxrqBf3l+q71SCnQECMXAVgEp3gX4FqdJf7B3lv0DItH2XPpoUoCxD
ZbpLf2W/LqNfllz28c7p/4pqmBS93uSIY8K34CstJab64R/VhmRymlfz8l1RQwB+uv6Zm+zOx/IQ
V7dIq2pFhQNl/g6wXaCZ+q9ZHzr4FhDbqNvCXcdjtOYZvTlUMfQrrLmDRABTiJSUHtf5gjH6BTU9
IVzOAx+jXyEl3cYKNBNSFWApAWxApJLzsfWEM6BfcPcic5YFdevhEe+3uUbnkt5X810Q4YoGlZFs
6Yo45PiIdJTDPyPgzeoNXOvo12RL2xIRKbUiZd1qr+q/4unarbRMdMtDXD8WIHzkzlZE9eoSbXuF
o0G+a9JO6TUV36KsBsYNNFuNsGVqpaVZm6GiPShM1igHShirotKuCFABgWQM2DaspNNDoO6brE9L
PaTAuGf1AHbZzsqInRqVNw8YD4SpjKayOlL9F02oRD81YLBLewTP22qon+6iQJzIWl3EAobR4luC
takNRGqLJY8ePmaHUUJUoXUlwSZnS6Bba6Hr6lIJsy9T/5CxljhzKj208dAoDeH0qdJ4hixub1gD
NxsA3rBCbh4CfDy0XfuWdF31zdO+RUtedRqwSC+/Zt07LEAUBoFAIYwD9Z0t2Ebf3AJdEBhEIEtK
uu8D63Jo+0owgyWJysrrWc5JIpAs2FJiy7LWWgCqICF9/QMUKaASVoeO0vlaq8BZYXF1AGzSkJm6
HaPM4E8jOo2mCRqX4KeAfDQXSFsBGPPmN2hAKeZmKTg01GngDcJG10xgM/6xdKPF1Sib9e8t0zl2
xpIbkLrF6DLH30s2ugVvNYB8RGJR2P1FL4z2FmJmBO0EePYNRlp2AvN/JeqOdJhxkAzK4cxgeCjs
pPZpEIxzLDNyVVPP1ZEtJCOs1a4wKpE6SeZcdlFqAkWnqNF2X8pPvcwulhsu1A1HR5wKTjmX8QQ9
lqvAaSNdKFNxbVG1y6v2DSgMt9HucVe+giUiK43QSNo9RauGf2/IM9VJq6uzrOt+/6i/TICySfRj
qmKPVCwnMp7KaMqpItsRWZ3FskXtNT1ElQvQvTJHQwSK8wIlJYNLagbRo2M8EwRJSxqI2ts1WOrK
5xe9vB8kwek0EdpuMzJFvp0d7Ytlpw/KA6Srya3xtbh/ozSwAMA3SpOvOjp7n9JPHMl/Ft85etV1
0E0ukHutKgqEg4gXpHuJYuum3YI7rhiYcgXBAu1gAS2XBL7Vd4/c5DTjLKXstoPKkmlAsAF2CuIS
sApqyp9/IW2QDN001+YouNW+k0zaGMxVnIfNSEz2Hs+FFM0L2EViz6zt6mWK/AaDM6FWDwZBCW3J
4DdZCx0UUn83V/DGIK8xG2UZ40EyzytQDh001A3dIGQxCSL/3CFYHMtlrSlmljRi/onAttR5UITC
zrgw9+u4Uf5XCe6mEa0RjboDbX1a5ttzp9OVZC0l9lB0r1PJzSbriZbElZmCJnRkk6gdBdfiHd03
9x0dEfnx3cYPqqX5CNzyer4BUycQuGldBX3Ay5+orFbxVF0d0LRFtHrfNFBJjIeYdYRGAtethAhe
TjSVqFW94WhUa07N9AlTmtqziYkiVPag11tgFgZvqINHlWN5svYWvc5aqihNuGRmEteBe3PDs/0E
lkY3525unF4XlBoaWADghYksNLDQwI3RwEw+YMOPePpf2Mdr+JadxeCUMLyRV4htBCWXjX0FyeO1
rFgUrVBZ8nX9sxQJE70c2mUkHBw+3n/LCCpgWqrIm291E68QYZIsm0SbZbFtWK/LP2Wps8ZvqaQg
Zyyx5hgvl+DV1ALRsJaJ0S+vjqbdv9J22c+sO3KBpXVLKoWm6cccoVD26qCq8DkKgf0hM3QHc8Q/
UepwWSbgLoiEAnBW6v5BBRsntyrQUSUb88IkBToX65md8ApNRQvc0XxhibukuQ0ByGEpO2eGAlwG
m8ahu+H0bx8K5h3RWIVuKpNe11/pWmjTKzyYKH5li9bi1WtZb3WYyBgtglAWBbWvAxzmq4zdMi4T
OWqAEzpNIEJ5gAEp1wu9THXOUJ3JWrcmiUj/2eqxAlPlp7jFRoEOrjAuIg10NLneQXXAecPg6Nh4
Spjcm6vXZKd3jvE4MgPL8eSqk2tZF78enxx1enZkGQaThDZnLEZW1W28UYKdfiyXjbIyORKNCCtZ
NInszJSfDYm6phsE9o4pEKxPOvjxYnNDUrGEOZvPt2xvqimWeiFRhRKxtdC5Xbjpsx2aUQmzwNt0
l+0dZzx1C4+U498mtd5Z3HslNXBTAeBPfOITHxtfKysrhw+/tk+3fiV7f0F7oYEbpgHGYQLqCGfM
/Wm94Q0hJ0IpmDLUKkiVoeNcXp8SaFUQIhgJaEdWt3LAUNLhJU2hV4I6vO6atgHzAVpceCY/BXoJ
fFWAqliUxTMQJVBK+IEV38RqavAdZXIEUo7gYsiNw7ewwlkwBh3TpRFpHJGFFdfiE9hp1YLSRQNy
XHMAzJK2I53dd5LYzxD6KomqTghbJnYmY+dwgMHpFtAUDwsGMHw4OD3mbZi7Cb0kfy2TGdtkhzZZ
q2Cds9QN/a7zDtIG2bwNrK4QV0hBe74WGiydArFlRQD6XQULwXwuycUlX++iCBbAo0eQKF3wY3wk
renAKamx0gb6Wc/Jsa8HGNMgUtGBbsLCFLesL6euwVfubgWc129lAVul7VWA59tXx7dRfDhjEpaV
4pxIjdE0U5hMzBpnNgY4oVs8r25VRPT9dBIGFI9DF5gtChlxzwlQAhsYtriLRAmVFYennyTqUFkT
YE+YejB2dXNNhnnEwotkFpg+RpSbYdcSnK48VaxDpUzvc9JB5ZGCK3jejw6qkxNJudsSaCEdiWQm
YQ95LmQbif1gTLveP96jDmrNRJgkkd3Wn/wd1rcosiEN3CQA+E/+9Ik/++yfv+e3/ut/e+xx/+/Q
Rz9217vvPv4/PkXYeEN6WlReaGChgaYGCq6SIjaLnQLnhJOTBabqucYEX/lGADzsxQAc4mUm8InR
kXwRlzCnvFcEC0kxwGPZLEpIUsjIEVbyNwAnrgU8BbCE/BBUBJ8ghQFNzmAuANUOOeLdKSFKkmdY
qcuQGFz4L/1/hjbgSC34HPyT2RF61z2xwkUn4L0yB45GyZRkAge3wN7T6dy5pxlWngfdFrZ7BV2o
wIZlXSK9ZTmcEHkgrvFipQiUlRzBq1i1LjMglMCNUEt2WUsZrqhbrHHX5hoU7kpF1AZH/hMYBQkK
/x15RaFM0YEuIa7IV2vwbN+GC+sBeRZWTcA8WXfNbMPumlPb4d6pwquo7MaWaSsuLSHPitFVbVoF
umStYkIXmBDrgJcdMqfxpSZOY4kgjGkJjLp739rk42ze419P1MtGU5oYy+aZGvae0CP22MwqocPa
srzq8yMdVF0R3xG52ZAsmiri3jBBgE4fyelVAW147NctdAXdlR4FMW0/YMcvLy050TjtQWrW4udK
ZFJVNxIrfd9ws0C8o3HZS9ZJUoe1foI14u47gm+t4+HQ3TuLgqSB1zwAvvTty08c++8PPfTQAw88
8I53vIOa9Iu/8Db795a3vOWuu+5673vfu/+B9xIGpsKLXl9oYKGBV1QDgCUKQQY0yzmzEQjSgJ6i
Gv864VrjtbJBYgm9MqQBaGQu8jaS/BAb5bRIoQFnA6IAvgylAMZESAgmSdRSVKws58MHhyVHjxfW
lx/JoI0ieC+bjZU4vAqBZ/Oh1Q6jUrBahcdx0LJw2t6syFGR3OvWH/ic7UWuNR9cWNNq8OrQcFya
NjRuheVNj5Xh67iMBSekRbYW2vTLCUPg2EQNnDwEkwFcB+SsfR0EYhiM3d2q6oykwo7rge/Uy7vU
LEy0q9C8k8gzMwc65dft0HjHyNJehlIELObpHbWKB+ldOiMBw6geLRuxW19Ao6dWO45X13bqp8Kd
jRo+9msrSs4Gu7pA5lQrtPJZe0uoGcgsQa9ah0ZaKimn2oRST60H/YbHwoihxyTOpL3y+0ORA+V0
pKz7AVjYftw7Zkkm6wjIlz43ck+STvOz6bPsPBqzy841TLHb0pOzGf9UJumTKsWckTwRIrXXRN/j
S1URlk+PaHsz6Hu2V8zPj4J4pKT2tl4LnNJXr+uyr3kA/LknVwn9vulNb9q0adOPf/xjgr4X//lf
1p75m7/66y9Sgn5SJh2MvnXrVooGU+HXdW8vGr/QwCupgQH56AZXZSb5AueGD7RiTTJfElbla6aR
YQT6NKw6LE+Svb5cRiK6sgJZosG2BzispOWtoeLayi0qJodCD0BIvm/EvHiHMMKzhFEBubGAVsQ1
JIyE/ZPvCQ8AmwKPXEWgLweHZWE2wDAvBecGoq4EwOWQakSbBabSJXJK6BiYP8BgRH2RY5dGlSGk
/bXbQINA/so0CuAoLXmR6yFVAJAGI0PCcR3PW6DXcn+RqRrkxmoDOSfMZ1uwHaJK26WFAXUHDCx9
pAFe+96y5IRTpvWuAnjbdu72A5NpDc1h6URCiBkDWo8zo7uNMI65KU18e4McmnWGlcyvHewppG6Q
YCnhNGc9ULaHbmeZFEY2e62TcigGHzcypyKNrOZTnxsDZF3XOq0FvAposy6IB+GNWaRmi9BqTFUk
0zT1EH0nIBxEyGJgMO1QflbP9fmjxuxSEwa3tNelATw/DSiW5vWsI6aoogQFuwQrtS5rk4XpoahT
6KcfnhYQjlmlcDptPqwienq0lGNrE8CxZ+6v1cmL++vXwGseAFPTr1279vLLtETsOv3913/7953/
5ZcOPPx7H/7QBylx+aUrlInrzJkz69eT1JQPCz1yto/KpMIRSap715NX+vhMK1ZQyqQAAP/0SURB
VMVSjVvAOWNmKHPlybv0I0pyV5oTC8VlArWhfPj2UrYJo48zuRL9gqHBIzq9fTJNV4vSUzVgkIng
n4IMQRtzISQ4R7N5oXLI5K/7UtpeMJTWk5PwhmBwyAhqOLkK+zMZXwkRWe0MUCQ7gYGniCzfk42+
Q3xY7jLa5MKMXbENdRZQUcC9OH6J5Qr4VoUPe3qBeIFaeVcwL3jmf9cpIKxbhV+mLxhjFZOCW+Yy
fOSWveQARwW46ns9HFw0nkTIhTCJnmnRdE8yh3/waSLH0eawx94k6hsVpRukUqic8IOOrK6qzIo5
UC3TFjAovzVXOg77hHmFuUaAiQ563AoLllY+gnvFkKgHYWlhDbyUMPommtTEV7XCwVoQJb28RwLn
qeikpr5O5A/1A+Mgh6GmyE8yOSsOU7491svo9wr8a3mQ9bAGuEdl4G4iv+IKNylXqnumsQayHYRC
kYObIKtMzG1Mvd9z3RD+9KKaAKl37mRrWkgbe6Rm7B/OXg85d98ARpqw0dSrE49+DW84ODrE09zR
R4ZqokRpyMf59sBME1US2QeFN90G3M0OTxhAhL68AeS6oDIvEA1GG7bcI/7VAL6RBiBhBPk61JrG
nCMrje3BNyqSysZvZJMt5GliYnLK5mW8lcpktLxZss/J9BHqnxs2W+EkyU72tZ+KouTeMdKh/0WR
kgZuBgB88u//7jOf/tQPfvADQrk/+tGPCPTaP7bkl1/+3ve+RwUuf/vSBu1APixU/p7QGLY2Cm9Q
lPVW37v/4NLTpxyGv3L5haWl5589PcBtzjm4f++2w197afXOpTtXX/ra4W3K7vmVh6u4/OAZ9+Wl
M7ev3DpG2wxa972w+lIoJCUUvPYLtrTEWJs/bGx0dlx+RWYL1qvkRb2yBgLCCi8Y4BzBJ1zJVsDy
ezpQsQ2ccxd45JL6QkKAF0gMByzbT5DVL8eOFmaHMrpt2KGywJfpSbTWEizszKTapMdBy9tdmEtY
eB6Q8xyOi7gRA9YdmiVxbAmT2rzAeEYZb2K0jAvKX9MKQKJdJhfOhcYVMs2jTV/Y2a4KXo5n4Aum
+SZWXAyr07khcdAYRKzrrYWYreAreBJj4qxqmZXQS+mMCotiUUZP4VJest87VByvjjMvbaCcHNsz
0pZ3krrdr6y+o0xzm5rIkCo2/KTIdTZOKYgqwKomoGJVJ+sMPYBPJfQzC+aJZjVjdOC2jqyrfJp0
TclRMzEipndfpWuiTmnDHhO3E1oUpipApiRYHRTFGosUUhKskB/JMI11JIohrjTh2zs++shUsR4U
Md0YIs33jPF8mcIYjPGYV3unzVRl0kdf9pmwXm14hqU5F8svjhF7YU2foqo8T+LHCF7QcoxIbbRm
VZHqP9cj2WdgkZc8kSY8N9ZvcK/3mjcDAH7fbz+4d999z6x9cfXPP0v/vu0u5NCtX37Xr9C/13tv
U/tv3XHn0gsDXrxy+tnn77zzzudffCnoRnJ23JpR1Z2rqwdbENhVoxkAQtBP7wvh2bOP7Ht6BKeX
qMSZg6FAv2Ai4eon9xqvvYcNoi96+GepAQdZA+wRhDMLQjFAHHtp4rE5mc3HdXiGkSTocAKgUY4+
Gl7YHCIW4rrkVWCVrJVFTFgOwTIfmoO32Egs8DJ8RYkJEECaKzf+D6HZ8flJej7TAEYDrpOgNxZm
y2ec9PRpTOXKuVn4xA6f46UrqCWmrRDdVECNoi8qDRPt+MqRxXIDzB5rlEQeJIK3xJTTF3bbmxmD
zYDhs/uBUXTAse4nq1Wk4IT4LqFrlL5ZQmiIrD8X8VCer8GT4Fph6TgzVCuSDx0ZfVRBDF8LIAcK
wXTDMINgKh8lsr7aBF/Ea9jkb6tdZUihrxdu/WKs10suYVdI1S+PL9lTK4W7pgdfvRfepIix6bZ2
d1nejFxur5B+wK63v+rCTJDE0KYfhhOliiZB6jMdTTV2FoDl+Jb22NuIuM6rDtOXejfFYJ0yJcUm
dISfDSwbbdTGEtxKJ7O6WjCx37M0ox7xU2BdMvhC2Wdsh5BmGz7BhM3ZSNyP4lIRzw5vyT7cGz02
0x6ZbK6T1beoMGjgZgDAX/3qV7/xjW986MMfefjAB5ff/ztnz5y2f3v27rv3N37znl/79e/Kle15
BG6jFb9SEit8sdiWYdwoxDusweWFvBLcfHrpeQ56IqjpCoOOcRgtDXYrh3MLjLGceLxU+K4nz9ry
ZGY1kLClwLHkQ8O33ffgnUPAl7Hkwcceu91FhV968fk7H7xvW1ZV9z11hiDwpzsXgS8tbTv8mAWc
z556eungYzFS3ftJwsjHOKzcL9i2225fcoh9MZxfHRogeDEXlMKPeF2/ypLRq47ykTkzBOLOdvbL
a+krQQHJDcdo8UJiYGDeRitbf6nYaMlWWEStZ0ELXtJvI+m0Lu81tVlVdmU4bMvQdIlWL0saMsrG
YLcQmoQPLdKTvRgkY7uvxBgRyJXwVIh2ansZfpOcEh+mZd6bZSU273rdPMdZ0IKHBfXptmScgyVS
jXf/4sWM9/RwuDRXVOAPG3CeAZPQncDh3eyd2sRmFJjiPCohxYlQBZ0CfnYZiJVMvYP/SNMoS9oI
9EuNwjHdYcpACqCn9JBnWcQuq5Rx0phs6hZqzB8aMwPjmQs+T1s/HMU+jewoBvqFbGZaCMKji60J
JTfRnLMooQ03K/IBk8gfCjqM1Vz10jz2NvDgUQRLn4Q98w6Th3zxbIIIlWLCWFZRlou7RtowmOET
aiRu5XNKhLt7/K2aZhkYCf76RISpirgiG9qCBjzAgFpMXTkMXNF/FuSvB677jsji8GxzXK0IXZiW
2r61n7KBWw8VmT1PmRfwHe1laMO/yHpNjFxCGxVGJT9mEc0T600NOGfmIc9MwiCNB70FkJMSbOu5
JER2psaEKXdEtsejx4WfF8iOJp05xYvVZgEiDURPtqo9+MHin2MwDBvUPhErJov/O7ButlPAFyZh
CVZFWD5A+yjVOH1HmCrscZFaxXhyJDWA9DkQPQMhxqAKLIFeV0trFr64N9bAzQCA77nnnvvvv//0
6dPnzp37yle+8tDy+ykmfP/+Bwj9fvOb3/zWt7714osv3nbbbbfcckup9wm3Prz0jKyofWl1aeVW
t6f0hWOndvCa3fHKZwKYtpb3zINElhc8nznIC4YLq6Sf3qccGEKGhcRE5tZnH9QlwbwgeGBcEen5
lWMQVgKsb3iDEh6FW0mkvOQAmiHgy2h3x628/DhEhRmn3n5bHv9KO4eYbc9Ysriu4N/9Q9Q2VB7Q
bL9ggpr3vVLbpHuatSiTecEoGpMXW9j3i3cwIAcy7TAqe7hr3E/KGNBCLSAZxj9hkXPIke8eCRwC
oGLAg92k/M5glCX58lUk9puFjr2l+LXKOBbspAAgluA0wbdyS9OMWmXZ7WwAnMyTfnIVRt0c4OUC
AqoZUTMY4zjzANgsFMkVBcixqHp0E1PGWmg0QY+ADr5IKCkQHbjUVOW6YnhfYiE0VKgN4f+W/RUl
Z/HuIG3U0RHXQYGh65DDjLFDW30ptQr+T5BBek3AqsW34e7I1321rhRGG0JLTARYSFjSjE2AzorA
C7VwsQG47eVR06KfHo6OblX2iaG9lavPX+TGCtKLsGXqwqJkm2MFMrUgTQr5gjK1I+reXl3JU++m
LrWnMA14lHRiKCgnXGoV2Zy0U8zp7+2ylHsWHaFYzupKhlHTUmoMUc5EjzwLzNrdlHYN2hhxlxxD
LD7hO6VkwJnurY+FVtuz7TI0vn5DzVpCn5VGTP28QOaWNF9eZ+M3Bd6bXjmpKVYHy9RhPiofGUPU
R63Hl5GKJs7MMtnTsEmTdHKT6ldYFG61p3hcC4fCnhok6W7dhjT8Oq58MwBgAr1f/vKX77vvvj17
9tx7773nz5+nmPCFCxcI/d5xxx3vfOc7d+zYcfny5VIEmHv/4Jmw0XXb4WdCTBJm8eAnC+trA0zs
W4B75+ozoMPoTQHo2U+vLIVs3HDbcysihUCqBFgtrCq/3OrmkuQMOZUPoVKJ9hIC1qhwCacOQ2SI
2fYMG2bWe/ULRvuTMVOROZirl9ui3CurgZmQBwhzMGmAuAP7gmOhKMi9gWgttGGhsP5ZAryKHsOB
0sP5yW4mWyAZTpxmIhIfDjIwzsTxSEME2wBqAL2MdfWLwRANYVvsEx6AIbA3rjn9E0QHbcxCcFJK
a0BSFkXLedHwM+TTPmFVdvA8hpiwHZGV7T6Dn+NttPYejRyXiksN8iH4gEgs68u2XgdEGskRYOrI
W9VJChAZICiXNYkV8YKF/LXX/6DcERjW6roVHNIOq8pVLu3urLZCZjQ9P8FjzpJtOcpppSLYropd
u5l6qxZLWTfNVsUKEo5U6tGgxYIqCc/5xuDtkuVn9WZjoaWBeCyM1+La3QYCdJafQX0dMkT0e6yr
7bJP98UNbvGoDw/bNqOogcC9Ub8kQywds4iwgZifOerQnxQx1Oe5Z5F5oNhsY3ZaZCRPZQIiO37H
eqjQz6o9C84HeSq4t6XEdLxbR2THcjwi0kdo86FameMrSDvZFGEVdPm+mD4XECmn0QstVS/ub0QD
NwMA9hHg5557bvfu3XffffeuXbsI/XZGgEd7XseYLR8N5WglB1/7jx8e0xGcymATa6Zx3bry/NCV
FZHGO3Tz+3WJUDGOa+dNBfwrO4MFlOsBWFWL4imCpcZpWEZAztjqvSYJxiCYo+6swf5u6BVlUW6y
BiTmyc4G/k9gla5ZwMCSqbc4jQWNYKKbMwVohteYwFG9sF+XL37ZIFKq1Dihm2x1zTATof/hk0i6
2larSwQYHwri3b8Md/XtBZTEfyXaLKugdf4V5y1hjS4nJORIhbm8tIgTvGuXAbMs9hYlYI00s5BI
rGzr5WKghlZzYdXAKFCpBSAAJMQhWyL4yB3MuwVgIVyG6qbO4NvlHDtXKKBQqEtIBQk4xwRCC0Kr
ZDLCcqQ3+TfPZ4fN3mMnTzUYOpTLy4ZtrjXEzE1Tum1byEqYHWF/VhQ2e4uQNlEiBgOxta9zfrz3
hLx3MopfVRys6dgA7TG+hv2Gdo5TkzG5dS4SFb9tzKgnwhkJbwSiuh51RLcMnFTKeP14Ga0KEhGF
XqjjezNSTtSbXpO2WsElTDbfRx776XBIDvEq9fWQD0nsb7eLX0JiFTNrIJAIfWFerHz5uQz0CHrc
J9rNlyeAzcENQUjjLon6BAr4AmM0Aeogko2a7PCZMpfkDbI9d1MCfjYL4E3CbCNRZZZRNHCiSqyc
CMuhmZEqUK06EVAauZTfOzXjrSsaniZkabKghUhTk8ivfA4KGt4O0UPV7DPSidNs9rldecZ6C1wP
Pu8aVItCgwZuBgB8AyLAk01C4NdLqy8QCN4Q/Bqdm1w9Y3qyiOUKuuSZwamiZAH0p86WD8AaEeNY
c+dpWLajODrjyuixEIbhpwumJ23JLuLF9TPVAIU3JfIZlqQacBqgGyMRBVF6IhRLPLwkwuZPfoNG
H8uRijN8WVdhre1WlVXQQLyCnRh/UkwVB2WBlKQFmemWUeBSXiANarxcWW4DJGNPL1cXHD4A6WFp
NPYJA9BS2+GfKe7Fimt0h/gQnL9p8wyAEFqiby9t1oCzwHVhZwubmZr4bYPHwwCb/+naZiGuMw7K
KvQ/mA+fHVJZQCq8xRWnotVWEx6PXBFRZDLUFDr+rlVHveGnA8+sLFAOHHX9szMPVJSpB+kmfB7Z
y8YCDKpVY2OZRS2KtxHP50z9wBLgevi+hdHMemPeTQxNFhkqfpW56VRsChhO/VTR8NgSVO2qhy6v
yDradNeNnbIimVRqGG75fQo4I1Tv605AICa5a76XLauHFHaOyRR+lTzpXPFKE1KRopySbmM+Xp66
OaV4KSezx35dCikV6mOX7XFPckLIK5qnsAeIS/TAichKJ3REVv/derBWdw3bfrW3MF6dXVb/8tQN
EvgEYHA05dESIGq4Kbx3fqrfTFuS+MZ6ODp6zGaPdYAMGzuNeR1PPBVyY3z79fc6L/maB8A/v+Vt
nRHgt7/97VQ429+jI5Uau2AdAazE1UOcphtSCRMKpXWK1CcFB3yf/fSn6QCssCsXy48/XTkAa0SZ
twLTaVinG+z44Gddrw3QnJyfRavA6RQuW2S+HsEWZ2L1dforXWoecNQYDjFbBTYOaGXLGCKyuxVS
vNJYmiQvDMbA8jPsC2VIGd7oDJA4Wui+JUtAmjERQ+XwRWLcdSFoBc+cGzAnVZg5tIim0T+0HRFI
vRCEZCAnjMJiPBZSUausjgYTLHsm4noWl9Dgu0EBWhItguQGyYTCoGZKzVQGD6dR3sSzdcgRmo0c
ncRosI02urQjko5G/ugEaYeuQzOU2OgnR2yAWnm+Q6chIGoA1UKcGy4V+RdkQ5ovrRt+Wn5u+zTC
RKjX6x9HepjuFpsavcNqEa1E90lGCdaO7TDtrzbloARTi/mRqW89SW+VIFjzVqqlns4aCVzpo5In
DQDA5lTW//hO1stvQ6BUNj/WonRPF4470cPgtjDZxvrMkk5yw8dY946stHWmnCkTTOiICfaZ7QIT
xg+rnP4rrcvOtWVolCCol8GbYrc21oHE+kwsXyrSeTRy0x4pqi56lOmDXf4TWWA6TjEfmnyBPKOK
0O+DnNkHRTQdA2FMjNbz3x7sUcIeYuD+U+6pjfTyTVD3NQ+A//iPHkcEmDYA1/cAf+c736HC+T6L
P9bjvrGTrXD2Eb/qdlhsPOlwYmDC4eCrK08+4gKZU0WaYoxy3tTTT/vPHcny46exJbjnktOwVvyi
7aiWfKz36YNn7PQwnJ/l4+V0UPaohB4F3RKMKDvtX3nyWP54rZ5WLMrcIA0ABxrUMKrAe8ifuQLD
F4xiAQTLhTeNEox+ShWL4wmC5bOUdYtvOHtJznzGjllEfTncymBRz8pi2gSSDT5GMNL2AztYxxTm
gKyaq+0WysNi6cCLP3cEfE5NZ7iLd6QEhFGTEbiGTEV/gj/5lrz4EdYWhahaBDOPX7rDe9eaMpfy
UgWq0rixLv8ekLB/Z5cAQNxBmd/GCf0FS7BMVMDSaDUSW9MeZhCkwAjHS/dJL2NiAl9UYlVYq8a8
0Nd6hJhvu3IPWboimoVxx0d5H30EDyqwJ/VWIZqbZehQnog3jqlGOelPJZt2mc+puGtUv9DdkfuV
oiafA8GaHpvFNCKdoxVcPbiqEcisBPeiW/bT5PE5Qy9kAUPWk0497yw6cgTrbn1bUU3MWZrv8CY3
Njhvydnpg7Z9RnYCGVJVOOE95rQuLk3r5KF41jhldKfRSG9dYOc7AmrH9E0b9ps6snZiEKultSbO
r+E9EM+q3fPtg75ZmzRMmILDuGV4Z6HhvtNb3KFqz93nVMZ1LIBn1Ak1q0DULMESHnZmjCRLLftw
KL0Ogk1WHq2R3eaHWMvqFvfXoYHXPACmNhOspX+n//F/0SnQtAeYzsFK9wCjTElBd66e2XEMG3EZ
kYUDscr6vHWHLH7mjbt0irNiPD2ceMKaaP0QbtgD/OyOAX1OFmlS5zMCXloaoV1GwH7jMJ9QTfiW
EHr8eSblxM2NmPK2aNvR/OJj8ZJuWa8cFMe6XjoTH6/dIdgShXwdo1tXbj8TndE9SRWLwjdCA3NB
pIpXJSI6E7KC5RR6SBm9dL2xFAGqobpUZa6nHwscCm6xoj7JASKiKlQS1AgaMS/sv3XoFEuU5f3N
cvEPfJtXv8oTlsjKsVjhUGhaO20nCeNgZ22FfPQopAMX5NBf7BwWqAmYLXveFPKJmLrQGqdwySHV
Qgx/WXIEmWnltjDlf5Jm+lx4riuHBQ3qImS8hpEjLMLlP58Q+mR4ZxfOlkx9mkAQeua/4xzjJ6Kb
cpJ5EAXzcuAzt1S+PiUa4MkIpYIt3/wH65Yl0itq1HOtQsFgUWAaugCbrtEdms2GB3OS7IDATVgT
Xx21vI+ehT1D1Wqq5SYOHWYLBAISjpz1Cb47iJqznqI7KxAloKbs6eJusqAkSZofu7kVx3S9ky/R
xME6MV7Vc23Ez12jspoxCdcpW9pHKSRwA7NkjhEg6bRfLWYoKK3WmkZpMsrbWwXqg6KzalVsoSOm
qb0y29VsybrGSEy1/sTw2ka6CvYi4oB8GONRIp2z0Lr6fgkvGnvj9PH1ALtDf4UiHnun9lZ5dIRb
EQ5HYyGbqsKtN47nUyoPB1NOJLhTTmrepQdsPFWxWAK9fouZUPMN8/mcin/uL9ceP3J4Qr1Xa9HH
H39808+90aR7+T//44knnqgLS3HIYzteaoPeV2uTF3J5DTxx/Mnf/+iBVCdPfeFv//APPrbQ1Suk
gV99YC/BDnqUAAjRa3bmfq6bKaCM4RxjgQSx0Lv2wVjsBHZViLUSkTcZdgvTRaB6NpzMJGdcITIM
0DV2RNCcsOkXZz6rUJIaxNSfAkop/ozvIWEB9mzY1czrrgnc4sww0ZiDZ7bLN2AYaFVFcp6fNAFY
1zBtpDAo3usPnSM8S86Wn95Oew61vAMaUGhadmAsqsbMBbrAgKmTWA/TNuUiCKzhQUBidFACsY0R
t9Z4SYfqFcAwqu/espPyl5eXI3fEcEIX4EwjQpFKq5qMQiIWfGiHqoxvf6IbiqvFhACO94zNcczO
FLTFFtI9xSaV8XpLLbCdk/aR5ZiRlxIt6mmfrlPaPgHq7CLb7pJkY6q4Yc33eo5ESrrgxjD1XKIn
Xh/2g1yRklOcWUSeqJ99gCBzunHasC1hsFiXWSV4bZTtf6optkZSThVlDdChVvwioI8bRQn3/eFe
JZhk2bGQvgK6deKfolBX1EHIefh3H24rZ1FiogY+9Wd/AThwM0SAfdsJ7iLYi39N9DtRb4viCw0s
NFDTgEdgHpZEdSJMVqHoiQToNioOKEV/Ge3YpG8owtUTzJbQGcOxgBbmFtcUUG2FAkOGkQxNlam8
dDXszAFhQbzMXyab8dUlQZ5yMfyWuvMASekeHxO96brw5Vc33SJfZyblOS0/Bwqh3U4dYxlFugSf
Bhkws27/jEoFLEHDYxcwYgkyI8ao5T7JO6hbz3mGSJyt4V/Ibd80GnH0DLULdJOwUwSmMyQsL/JI
o1JdhLtCx6E+lqQQC81MHEBjA9gOclRhp9E3YOmF0dCEa9GQNG2kCV/exy6meO0RT79E0CSsTBDU
PcuemYVJZeI4s/RjKnNWkaNe8/YfqSty+iP7T7aOZzUw2eGOJM7aku9iGDDsvPXNoTjcVNLOmH5R
h4UbJZ++Z4Kjl1cSKPNtxyBqaqPGK4t+J04n+WdLxKtoFRG6o2rZIdz5KAhQ3PdIptWp2WdBZsfD
pKTzyPDsKdcz5OMHYLkX9Akg34hmypbotSpXzjc2bbifoWgNlnR2Nc1Zh4CLKhvRwM0GgDeii0Xd
hQYWGli3BgiXzByWA0zxmM/DDxSmi4u5N5kBRINEOMwZF1ML30wCgJRMOQVawKRF/NQDBqDitxTT
EMA5ICLdIRzW4upaYi3Ai5MhIbNQ+MQMA9xV4eVsLYR5bfGtspgrXKRvIMkCaXaUWQQKIMs6Z1pu
LZFnYYFl3jRnLQXQVlkzHBYJb2YiXF9XiTtcS230oDDcATt/h2trpq0NJiEjT6IAq0ZdY35hzhlC
R4feYddNNK+HVPESaFOjuux8X1VtH2oWw+Abwks+WwWdi0ODfhHuwkg3CUtJvoNgvjUfa9SFzcAr
dK61TLs7ys87qZHSpvvEI2bJD0Nx9WKZu+uSJHJYN4LWir5sKti6RK0opKS0ae61MYhwrxhkeq2T
+OR+7auQG49dIDCqmMxzMXv/ZLhBypmmPcMbDphVKNit2nRSVq+dltlZrK/riqXSvkh6uX/AYoxE
5VVR2RGaQvFKcwoKMQuMRmhP3+mUq75MA+8s8h/bZDrLAzHQ/N4H7Ma6uL9f7KXTOzm1QaNaVBcN
LADwEu1MXax/XgyHhQY2roExDFN680A3CtNZYYOUBESsMCWAS2bhnCq+y2/BAKzsFbjp+ixUpAS4
YIExtn3KJV9Con3CsvtUkCd/UAcICRuDAYwIzcoiavqLc62w4JbLg5o/vovYCaDiS/Ync1oJCgV8
m4fxXsCZQofDv3xJWBhfTsJ6bEQsQVHjn0pTlkhRLi17VizNQjJ/fp0Htgr5mKHgdyTwD+67ZMKZ
AEo17wr6LABak2pIuIiuaVl1HRRihUWxuCl5cGRVBgitalT9oaCAXmmdLGzWhe5BFdwirsXc5Vwx
I8HninG7ZGW4NFAkRM8OF1wNv/DML0Xzt1yloKKKV2otzSnTSHnnz7ukbZ8pDTV4L82DBPMIW8jN
lOBbmrqnHlGMdNLzI9VGVT89JH2ZyHE0lfoEyufd7iy6w7CNMECqfyMrt7L0K8qMW5pVSz1zfLek
isikPSwxbD9goSwc0gfXaBOEyl/uzQiBp11T7OsI56QoqIVPOvti1AQ/tH2jIvgtj53slQ7hPOB0
lWM5vY1lOwJ1w62huuRUniFRVBxkas+cyNoxIsaZQ/WgkE4LNAV4C4lFMnY2GKNRaaqwcYrxSNPJ
WAJgCXccWmNOJNuzvtXpMyG11dyjwHoq+8zvmqsqjpbFjckaWADgySpbVFhoYKGBSAMjXJHTjmC1
AaL0K1Aqhoji8FoaSCFGqmUCpmL6IQ3ZNvM3dQUXyanRwEVc0X4GtKzUFFwZSIb8tgGYiZw6eerc
yVNgLmhS391AzoL0GHkJihYZ9NtIwlraMpNsWayLfbzhM07ySSRseRUsa+daMWamf4yE8YGll68T
eGYMr1MDRBLIFhIFobhKAKo4r4su71p5Rx/tCHeHzjUXUO6z2FILbbELbHwmVGoXQtbYrIuOc3dH
J1eFKtq60NEq0VAxzF+wNtFsPQxcj4ZGtD+A8KFB0inSR6I9pL2PMmpY9KPlfGcDhoMSwlE04F4J
hsQyRJ4W3U7BG7pv7BFGdLzX65UQ6aSmAd/p7kjtzio3tljUaxUQknf3U1gbwS2o1F/j4cB3OiC9
xwb5Tq/bVdPqcgZs/Rt1tJ8DQsuKWAh8owZ2tNeTBeqI0FHXEIueVPazWwAb2h545Fl7gGclPOhq
GW7zAdJEyAOHaAhbe7PdETqo/jCZ8KhJW+pnB8rsSoOx0vXtib+62lNLyC2BJsG8JUQkM5rJGlh2
KiR6gHRY5oY6omWEi/s9GripAPAnPvGJj42vlZWVw4dvhsO9evpyUWahgZ+VBiyKGyDKAGmAbUb4
J6AU9rf6JD7/D6fo34V/YMC5euz49lu2eIIDCxyzBJryQiLBOPqKb+TgvWWz1HJXwoMSENZlySgv
YdOw9ddCu+dPnhTECyIqgtS1ZmjmIIbicD0mGvqZh7glJSSNHcIsyRx4EED9ZdoPzBf+skgAuuOG
OGRLdVE2ctapSsgfouwOEpv4pp/I0bEC+X25dtvpP+SpRkRFqivFvcNHmIf6mJtQ+aETCZWHrnRL
oCU+jL7T+sgRXWkHKTUvg1nONNSXAqSMnl071pv0XtEEpxDildzisTBNB70pe9F1y8LISFHrK9OU
KWljhPomEnDFI6163Jtzcyf0Wr9MWdxb0WQH5XwnphA3By06yMt4d/NKPCpbm5OLZCPgZxblzT5U
9igrSjfifukER3aMd8xBZBuyUcDjO6IDX5n+S1otokEjbm+BHO7ttAEU68TkeQgKeSCDTUtVpwB8
21PUXRqhQ77v4mgOImp2nzHUZciOi1fkMTKpz14HhW8SAPwnf/rEn332z9/zW//1vz32uP936KMf
u+vddx//H58ibPw66M1FExca+JlpgDAKBfRmeNs5KQSQcIachBzfHdCgK0CFqKQiGax8lmvP+/Yf
+czxndu3H1k5IrAHfBwQDXCIoqOIQFIxKSkrnwMGFkwFtMnbg/lNoyFEBHJppTSTBbJiTCWxU9co
Xdi8Z3k//WPistxaCuAzSJpAIzhfFlTLR5JwDDIik/zVJd3IKjgZMI8vPgpraBuC5yQVF5DvA3Pc
FQfAcGCTdR9WpoVY8XCGkynSJXQPMNVyX0Xy3qRb4azaD/8BFW6XeQb2vWI3o2F9AzXqcnSWVhTF
3ozcARgOoWCokXsBq5rDvIB2JS9fD1Mb8jUpXLrvFwpUY0MNPQSFg/+sVe3WuEW5QzijMqMoK+6Z
W4af5gnlfFPzNY2sz/FRqTgwWwLexpENKbiGkMpcw4JzVvLGmg56O3ZXAUveq/YK9IruKTPumIpn
aehrna4kNGlTQtlEbCUyLhKY5xU7AQRmQY6HIi11RcoxM6tJmNqMQQ5vcrmGp3npHATMfp09os+N
wMfDM8fbty7SPLgX7TzSp4dYhr78EGspodnM5ogbcch2TfTw6cNjqGTTAfG8gH/m2EvBUy48lPKD
kV9YwxHHYG2GYZJEiaHh/vlWGYOJSBtaAm3swT26skpOB+PYJqPJIOgfqsg+V6fZRssUF/ezGnjN
fwbp0rcv/8//+T9/+7d/+41vfOP/8//8P9TIX/yFt1lT//Xf/p3SP/rRj65du3bq//P/PvjIoe3v
uG1hCjexBhafQfqZdC59Bome5bMQ2/RpftAHJDkPyBY53dfm8/9wkgrvft9+ehudlxjsrvftp4Cw
UaBbW946W/nIys7bt9Ob48ILF1dPnLj2/WsUN7Yy9BA4unr86pVr54QaXy8vXfru1RNfOHHxyiWQ
xUWwViO9Uubqd6+ufuEERZ69wITGzwlxKjx769YjHzmw8/ad1K5LxPoLa1e/f9UTpO8xrJ1cow+V
zxmScTSY/s4l+AwPmzMFkItaFDN6LCfTB7KymhdyC8Ym3Cubh+nsaN7PzP461Q40tIF+RTFlQeuC
YdWZCP1gICobbLGW20eMPOhyegF89X/tZpSpS6DFmRCBTDgUNNgs0w3Yvqu6kvSAhDH7wGxxqBh+
jv8yPT6LW27tGn8GaZ2uhvfGvGUYBPWZSdozJQdoPTJ0Q7KqIMPN1E/FvXWK18nVTNGa01+xVRKS
3xgknIWjLQGi+6bJLpFSQ1qvDJ5vqpA2IvVBMIvCTWw7DInH4QYBsMelHTIYurAh1sSlTDVSvmkg
SlQF8AOni2mJ2hSmWRrpEF6PPOs1v/QZEnFvm0RpLKTPwD6T8Bxr3LN8oyf/utQSjYXSqFx8Bqmj
PycXuXk+g/S5J1cfeuihN73pTZs2bfrxj39M6PfiP//L2jN/81d//UVK0E/KpKmgrVu3UjSYCk9W
1aLCQgMLDXRoQFGLKwloZUDXcJHPtOL+bsIN+IhJ7dy5ixJXr161MhQTJixKP48+emTXu3YeOX78
0GMru3buPLKyggOE6Tpy7OjRY0e3bNly5NAKBQM5cvs+/rfy2Mr2rVuPfHzF4ntHP7NKd+knIeo9
y8uUpjL09CBq4EIX8m1imIQ7urKykzh+5ujxzxzlBLEO8h1fXT2wcogeQQeWD2gev1P5W0dBP0RA
TtvS+DlrIsA5wnLYzcvoV3WJ5dyijxn94c3AureZ83R/77BnOPQAcTP0K2n/2pazwYbLB74sN8RA
tDPMD5aKvpfpp5ZxJJHJRoJTwfBTtgFzQoiwItAw+SvlJXJrWNczDZFkFJOKxnbEn38YzC44K+3Y
ZhRhqERapgRhTENZf7ThpPqYg2daaGMl7lcPS8bgvCck0izTGVpp0hnbWPZXLeBZr57CHpSvdnEl
KB1x6wUhUYeCu1dgEv7iweC+47We6RUvq9Gvz46VlZmGvzr6rVXENDBORIHNaKapS+cRyF8X+uXn
2NSN8X5Eo/V+6sEMz5vfup42kWbjqDge9eAeJVp9kr2/oYmAFPxHOjGWBVVE4zE1gIxJpI9QUwXU
ks7CtMYgxPTTMfWn7ro0vag0TQM3wxJoCuy8/DJt4LtOfynku/O//NKBh3/vwx/6ICUuv3SFMnGd
OXMmq5uzj7zBXXc9eSWvQSn2yNk+9U4qHJGkukUh+rhXSl158q6u1m6Y0Q0hMOoa1T23oLcbbogQ
CyJ9GmAcQjBO3hMEWuahFiUMz3hKBpkCDqSbBu1GLK0kRVxXHz1y6dKlo59fnYUiF79+AXBn+7bt
9Hf16NETx1cpQSulbYnsxRcunn/hImUSlCXx9uzZs3ZijalJSQLG5tFe+Pp5hmSblpbfs2ft86u8
5Rhl3rrFoSvALZWL/rN921b6TWHnCy9cEknop949d+ECPaC4NL5xBLF1KS/DQELC+EoTyTAH6ONj
pfiWFMU5z5w/lzLuhgSBgSH1EGlbzxwS/FYGHfrr8aGk7W52nhuiBnQayodcl28iDfcCS9e5kiVz
5ypH+OIRVx8+doXg7XBB1bagPawwlyYNYpuNIPyrp445hUvknF1SnE8WX+04YeSbFkAm063cSvjW
gQF7SKlflc3xPZhzBNOFdpF3PsFZz3qHaFq/O+6JmJOddkyFF2ys/BneKNxquKgdbjIxvKp92lxw
w6JO8n683dC5DJaRVkvTHClwEvRVn9bJIuSiSFHPVgTLGXmW7IZMznPxzc999DUCeA2+HuQ3YU9q
seOpB9yPhnkqgOaUBnvpkZJayHhQpNKloddhEHku0SQLphhaz6LSYExHHNpreijOSqSPNQ8+O2yS
HwLuFGgoxD/tLSfXk+MHWg7iai3riPHzP9vRFS3lZVjkvmIauBkA8Mm//7vPfPpTP/jBDwjl0mpn
Ar32j63x5Ze/973vUYHL32bfNHvdufrST+R6aXVp5dY8/KSvJf3kJ0/tLZEYw9ZG4VesO7sIHzyD
xqK1r1YwyUB331IQ9Sc/ObPjcmFqoqvRi0KvqAaANPSbtnjHBH6zUViPs1F4HgpQAoUJ/s3CO9iq
605dKbDnfcu7lvcfeuzINY4AhyJchdMEjOnv0c8c3728H/Fba/L223fuun0n/eTQ8aallQ8covXS
h46sHDpyJFYLNuguLR3iMluozMpjWsbiyVvePBOIZTBt86UrJA9B7l20AJslkZ+4EMsdfukB0aiO
jzOxSrAJVj9xRG9TrsY7hIWHfviHlKM7YNkJkO3KhCH1Yz+yXRbnQvswKpSjKsJdqEvSQXVaJgos
hJ29VifSlbWfE+OOQ4MdEA1f8cWqb5VDv0sk4FY04DwwEVGmDGTPsxCUk5x5HzVgoSS0JaZtIcUa
01pBSF03Lp1hgnNf98OVqPkxOPF+c1x0+B3Fo8oFw50U2+TQzrBVtUAxG/fwmV2Rsaa4WdlQK9VP
BCONeD+Kdj50th898JgAt0wSQ+YlBBI1rUP50/ScqqKEgXOsS7ad5teh8kA7CnxVujvU8ZQxJdHL
y7cIAMODH1hUIkCE6iPohfHe6AIgvQjhlyy/MNnUHChRgV6RzCAjwxvbZxFgh/ESzQ3xQ1M/QyB0
s8DSS1x4KFWepdEttLc9FuqPgpwBRCbBfMdzIjAAbwkZk6iMu+gtmX0y+MmCxBSyrwCbnlvP6Jhq
bYvyQQM3AwB+328/uHfffc+sfXH1zz9L/77tLuTQrV9+16/Qv2a/bzv8zOqdzz97+vUBtbYdfuzg
0tOnOqPaTeXd0AJXTj/7/J2rnxwmHPYePrzthnJYELuBGuAtmjjHCN9rHYcdHf7DMUUJKBRRPHqb
m/80gtUDdJFgKV9UEpCG9veev3CBFjnT5lva+nvu5Elr4OpjR48/dpQiscc/v0pcTvzD2vUfXqdA
8Ynjx1HGJBS+jAxpyy7K2NZfauDJfzxFK01OfmGNiFsVKn/088cvvnBp9ciR448epWgz/XTwWAjq
xeHHmWBUBm+0d1c/ViTfAWbt6ZeBSZ9UjOFxgHlMAmVwQrXAWlL1TAKe9I8+mGzHSg09K0AxRHo9
YqX0zKmcCY9Cl+Jb6HeDxB10H/JNDMc5AeAR/tqUiPa7dDE+9RQuA7diPCaGCCRkWBK/wtmMi2cB
wMutGA8AWwxSb8EgZaG47iW2/kjih3HbWkGPRBeNjKzPl/qjvWSzDmILlkTO6GRk2KOTUpnIfUzb
mYaexPJr0ac+ZZmSffF82yOsnuKBCAfC5sux6D4By6VKHZpTsopRRQ4RAKiJFyEuFE35lkkY0ogS
k3WS2oDlSEInO3SqTXvEILchrqwZqDAezFgXe4NM0U4O/zRxXbNACuwV/GdHR6LK7GwXStmUkNkA
Zfp5QH3korRNOnio6Q2g2ovR3Ae4RzMUIJAi5wzh0sRfZJMdhgXE60eBaiD9clIW6vvMyE683pwk
2YdDffoV0H1xvaIauBkA8Fe/+tVvfOMbH/rwRx4+8MHl9//O2TOn7d+evfvu/Y3fvOfXfv27ck1R
JZbaYhEuR0lHId5hbS6Hi/nXvqeXnl+5NaySdoVBx5Yej8LLbkFyHHYebrk7QvasrWJmsYZyFsqN
Ja+3+s4dt6LAOomPVQFSuXaNpHqENOZCz3wvUsC2225fev7Fl0qy5/R55ckp/bsoe4M1YLBWE9Er
06FAfhGOA3cQBagJ0MjBS/5JEV36h1qh+mZkCjvOnn9/TvuB9x9Ypkw6Iou36YaL4saUeeDjhygC
TLjo1KlTez5CxbgkFeOztWhdtGwM1rn/TUv0iV8qQzFnLiCnPROxtS+tEX2tQlItL9MtqkvQ+six
I3s+sH/3B5ZpvzH9JKBFd6UWhzGxbVgilhqqNYTMkVv63JFTl8R16WgrdTTn0mIH+xTHEuqb0R3v
jJa8XvsCMLDzcAltf3EcIHxmifIjJBCXbvx2Mg9zIlpHQWlYEa1xbAGoo1awtNpglUfAsKrLuwhD
qaRRQ0a6/tk8wnxjCrGOoXCfj+KBVjM+k5ckQh3w/tflFDaa3OzlSpOb2mhCCBsIviTSVVCXSl1C
pN4Fz0ORlJF3c03tPtGKRafiTZh38B09Gq3hhzMDJSs5JSAUhbxqeMwQF1iFh1LRRsaqM8pRY9sI
sGKE3kIMn4eVOx4zGMCIAV7TwqMC447ur91sZvFRUJo/Mt7NgVaW0lBoOkDs4TwkIshtZP18RIFX
T0AYVYuS+Pamkkx5IPgZEKMaAXJMo3BJS2SbluVb7ZEswm8/h6c0sN8sFyVNAzcDAL7nnnvuv//+
06dP0yGrX/nKVx5afj/FhO/f/wCh329+85vf+ta3Xnzxxdtuu+2WW27p7Pjbb9uGki8cO7WDF0eP
Vz4T+Nr3gi6aPvMgFeMFz2cOLmEhdW6V9NP7Hl56hhcdnzn4/MrDusuYyNz67IO69vrM7X4xMkFp
rZAsU35+5RhIvbR659P73vAGLSe/HKTMSx61/+wj+54++JgLrE4mnqiCOFTaZVI9tf/g0gu2pJmj
vSM5WM69n5QGZtej5/V5+sXO/l0Uu+EaYPCBbah4nyVhXuTMHb61tAcuBs4kwX8iEOUkH77fY9/p
nWkUEZt8hrIc+tNbAqg4EiinMQt4xi3GnBRQJfAp7g4+nEMwVSKu+DCvBF1dWqEZsJx+KklDnfyJ
I/1OD1bqyjFXiHaKAzcgednfy+urhS9WRPOGVbo4jShxUAy/EXkzML+nBVpzM/lzwYJaWbygFi7A
x02zFvSjR1CIVzzwMIgHFkFv/HtjL2DrWdGkaD6Yh4Rn0UDhjdnu4FShv7wxhGXP3Aua7+wNrQgq
1aXRMmtgm4GZl+gx6CTwnYBDnPHdkOQ01iUHK/WVu4VrOugNSln4jTqRtCVD6jEwA5+GdrIsgqwl
0DVN200d9kieIwIxLAbV5KMFjJ1X7HplMKaTdRJxrE5nIMLm4Zbl+FavU4ZW20vTHxH4H+m/NPHh
n4TRjEC5iys9W2ly15CsjDt7nI7Zl0KsGeSZEq/k9JpvHOM1OIq5ick2YE+AlioiUwcvi/3a2ydC
woM82aerTcGUZqa61VKZjOiyhG5Gi4JZDdwMAJhA75e//OX77ruPzra59957z58/TzHhCxcuEPq9
44473vnOd+7YsePy5cs9EeCzj9y68vzB/bbw9sFPFtbdBozctzD3ztVnQIdRncY1z356ZSlkK9wb
FiMfPPM1ZSyLsp8+NhzNFZCirF9eGv0aIOXSUlHypSXGzXIR/D0zxuvrIR6potouk2rv/oO20lzw
76DzYKfbDn8N8J8kjWBwTp9L2w4/tRjkPysNKISSdafs3slHa7FpFphnNo76Uibl4LKEwCS95qGq
A38uEmjvP0lYLf4BbBmWI4YosQAhYEu9+EO7WhLIk7fgMu41dMroUZdzcy35LK0gKKBynGaMUC0l
5TtGQMsC9gQJy6JlcOVmhvOffCansX5PgK4Ab14dTQSkGD4yzHyZqHwdl0gNkUw5J2nGAoCOIEkB
k5weoC+CpUH4AV3aAmnoJZzIhUgsSI3dXL9TFwgZvW/F1BiUnDbfdt7aXW5OcC8w6c76GT4IrK0m
iXl6QhA++ku7EN+OwheS+HPKejKZWRES3EfoDkXOo+9CdcVA0LrIE6r4ysHC/H/hcrGumlsQc9Xj
PO94oXfSnIROJSDTw3Mok6qikuNJhwmO0ZJmKxBBCyucpRBlup/FqBrmWWCW4zN42s2PlGzaNnDu
7CH1XONAk0xgmRht7tkS3gKzbrprLwiYERq9CWLY7IOpwg+KnISmZA85vAyGRiZrAPpPzcnZjGFv
n4AS2uwiYG/PwPBojed3WhQrNpmvWsecLfCf0vQPuhRwjnK8bfv2QuG47NVQbXh2DsLrvzINNGis
9HzrmInISufnZVI8rDnyMmEZsgDbzCzSScIv+yiwUl7t8cPZVjS0TGtxfyMauBkAsI8AP/fcc7t3
77777rt37dpF6LczAozFywwJObI7YEILBY9UvO2+ByX42n981JiO4NSzp8KaaXAm4D0wsWXJnMWL
gQu3lkYFvZB5yVHCDsH6yUs7jo2aMSbXQTxVRbVdTqoBARfwr4jKIBhx81u9ujP63MggWNTduAbC
28iDH1BFjgGv2RgJo4wBQo9erLo5LKnnYiBnaIHCReUY8uV95hGXYFdPEEBrQL+QS3CgrcvFB3iB
UTlBRfRdKJT8OSKBMY7LCodmaTRYDjqWyLOPcxI0MiFZn3J6B/CbxEuJDkF0FCE18i2OGIcVy+Ks
zLBPWBRPZZyjNgTMxxMBKINuQSsGXWZToyXKQNrjctbX1rP+vt1VTKtOlUaAVSfDp5LYfCLIDYvC
igNLB+fMTAlSIU6uPAkD+73ZFoVgFtEHS+oOaF1DBQV6dimBLr8c1bw77lFiAQUZryLalxKlGFGt
rQaKrFC27XV/vdObN6jZsk8vcBZ4WOYE+NcU0qTiiT+1SpPEPN30VmOwdd7OuukJ2IsmXyaYnAy3
jVw3suERKotGhDMPr/YbI4AZYZ8uSkzTuF8fvfWXqo/ueILGP0kMZ3oD6BuDPbC/oiJtbWR4HnNO
10dk89pw1xyvimkDxITpGynRYIzfQX1EpitgUWOkgZsBAG88AmynQP8kBF6rZiKw7KXVFziS2o+C
U5IDEsWpzOUzpl8hq03Cy5P5ZFXR1a6AgGv4V8WhJea8xNuFwTNy8l7kyeIvKtwoDeDMIXHHCW3M
CXaEl4ohEoNJcA/tp88HLPQX3Z25wrFrqZ6Zy1a+DP8oCs3vFRwmLPgWUinKAnpi0CsoC+hXnFcP
euWnLKDlNdJ8mLCJDzwsAUaAZBE+nGslaa4d0C/CtgzJqLhERCEX7wGmvzwzDemwepmVSXuDIRuU
tFlapIuf59AilZEAMt/SU6ChP1AIc9iKnCPdC3e+hJheECwgYQ88oD3vbRsYQ91xpzuaQ3dD+bhC
R6i0YUpCAH+A+nKPy2ofYxW69az5Q7oEHUq2wK82DyufebKA5VdKXjzm0hMasjrW8NRTKfguWR90
gl+e4luxWL1aLmmW0bQmR/ryPx38q5TyFjKIjbpeaVOdv1bbTaQs8EjjosUmlLTtu6ZPmDQK19Ab
bvv5jmjo5eo3ratZoKGKjsZ6nVvwjYehWx3d1XYqlG1yy1qikGNXkyOaFdzb4o6mRQOtjQxLgz2d
curV3ajchKkfqN0us0Bvii0ZfHuR1vds8wzCiHXEqE/5vhLGHexwkCrs+PU5WivbEZ4iXkCFR3G2
o70xpOn6NGVL04v70zTwmgfAP7/lbZ0R4Le//e1UeJp6KqWxQrcFy4oEbt1xp9sFGxUbnf7EMdVa
QHfDLdowca+KartGogIBn82vf44b1TgTi3YeX35hiZaEL66fmQbotTYj3Ca7WDUOCX9F/s3cUmd2
CFzM0eCI4BwDR6OXLsoQ2XnItvXVFBQdDpQKd3kls0E1fDFIoR5TAncsDxbgyglGXHIelZYEMNZ1
zrL4WVYa4xBjxmNhn7AEimV/L+/FBQplekxUgrpcmgvJruAAfQGDeY8xI1XgYVmdi82xARsSU2uy
0UF7mSYflyU7afE5JT7Ag7cTC5gXYSwozW2kf0IsSDhEfQEYRew8FIEfIH+tRZbDieCpWG8iEf20
6tYWaa8Uk9kEyWdtYybFEZE+0ukGO89Z1hWLgeGQZynAf6S10i9OXiE7fFk3csVGPlk4VDZe+SwS
6jXF/bL5fj/x732dtl/u0ZdnbQCyCoY9zLOWeqZFxyt1AdH+1BUuzQWkXqwHzD1qdOY34muSRAnf
TTCq8ZrnSNvtiQCP0oc5l8BGcpiIJeROqlKfEwGzRORxRhb5VLzznFYjG2ibHI/KsRgpMvRdk2tD
BDkMe8QgpN5+r3/DG+OE6tONXGBvj7QNjee5pXjeq91ATjr6xuRKQ6liZvGtdCyb1UVDLxqMHYZn
w8GPC32QYqQId3u0jhY844UOVXiRcgrNIj1kGgKPoLjZpCYqDzoIMPGKTMJgsFrp9QCM3XHQysH3
SPRAi1SRvjvGMyD+8Tt6LpnaZdx1Dc+JzV8UjzTwmgfAf/xHjyMCTBuA63uAv/Od71DhG2ABZx/x
Yd8BPlYOLU658hZeWtjrjm5+ZNjnS9t0ww0+qGr0OaAb0AAjceXJh0dbnifTTlVRb9eIgSDgY88u
+Y8dOdHuGh0Tfezppcw+4bHAL0yWf1HhBmkA0IWCkIL0FLowepEXGCXmATihJC5DXRFY8mW4XOIN
MMGw/JUoG8oaSLvlzbZQlmPUAWCzkEKWeRl4wz7S8LUhPonKIXKuzu6Unjsl+4EttoySFgHmxgke
05O0JMjMwCzAM4Bh1QAkYcwsxSjeGwAhi0O4GlDZWjdTmCcnNkth7BBWvI1oPJZAe2UzF68qODq+
iVKaZdAP7Y5W25qiDAZ77ySkTUokop8QB0LILWkg/oNWux6hhhsRUy/0wN0HMaiM+MFcYJBHSekc
B8AwaxJ+26BJU0/seKWHymZd0pGGe394ryvy/3pJWLlcF5RWq0ZOZ4lX7Hg1G17HSNyzCas0J+vO
RpQNjZgLHtGZ7hD3KtxDzSz+cQYT21KA3xGv7OxDUZ46zmz2EcZdWJttONCjkTxr8K0o1kPEsjZH
s0uhWHveIbXz7HSMGI+2bpyIjNmGXq2x/l4L3mfplKBLml8EOfVZIRssJVQWxEpNUZ+Z42eg2kN4
oupEJyZPTQM+kdpbThFp6/p7PFMynXxJe6o1ntPpmNEUSeUU6GyPZDOdBaatqGkg+zBvtWhxfyMa
eM0DYGo8wVr6d/of/xedAk17gOkcrHQPMMpsRFND3Vt3yOJn3rhLpzjrumU9tHjCmmha2HvmoB1I
deuzO+7bFnjcuXqGd+eGg6q61mX3t8140sbj289saOF1ThWVdkUyMgJ+funBod3uPoV8Bzk7BOXV
3P0qWJS8wRrAaU+KrsLbkVEKe12KTAx7oWQWGmXF8iUNIxmFKOERXkoNd4tl7A2k5y0pSFYYj9XR
QkHivbq51HbzMoTDnmEqwd5D4DbMlJuSBgw26C2Iy3FdwWyzgQIQndRS34VPq6JMWdC7maYDcGtm
bcYkvcB1rjbI4LQyen872fyXkDxB0Ewvn9kBQjwAHSwBFcNx0L5bQ3+F4DwECH4GlmRj6QF05Opa
l8mMA47mHstfCtfk2tlqexAsLeeDb/7uhGl+7/pXAE+H/utN63dSGxGYkrVk2Zur7e+68Si24e5N
NTkXdxJriaygr7e92r3AdbjiaGcBSRfvLOTo7uvIyDsh+iBYzxRGqxl+/sWGQ2lc1IgB/rXa7pts
sKclY/W+PUKzz9IppCeY37o0X3mqTADh1qI+uOsVUHqoNrkXNeO7uz4pk06RJDpsPnUbBQpTYKkJ
ZAdaOhE5wR6mmNmibFMDb5jP51Toc3+59viRw83Sr/4Cjz/++Kafe+Mwcv/zP5544olXv9gLCW+U
Bp44/uTvf/RASu2pL/ztH/7Bx24UlwWdSAO/+lt8cvqA5eAiyEsLi3iBSWYWuHM7e5FPZfhuoOuR
Iu6CgsOuAea4w5AIfMqKaOEbqIVjqALxsM4Z7LhYwIrAVPw20oOvZHduuCusw05dOU6JcxRk8keV
GIO5Y5ZkZTLCwsxHyg8rqG0ptQiLpdGWGFqgO1oHLGGnGau+TatUXbTEYWRqmrAGR0XjkGfQIiA6
Z3qwOQIGXD31NjwsKc+LW38l3TH0su8azKFAn1yXlRlKmjkJOxVXdMJrxWWJu0096FJ2nSwIH7vS
A7G5KlXZdct2orO8vBw74qZnYi3L4YbNXe7WMJugoD1YbfJfNScYZNh7ttGor3HxIgXVFUUJNywW
l0+kqDVquJjWCH5ENuBxAgrXrx44kZZJNV9FRCnQ8l3fEtHNH6UoyCRJBIhYmAHwIAynQHf5vr75
47GgHdHso3ELvTYsAja5m9xDnuv2zXdEI66r+d62s/oXG4sHbKJkG4x+VOZbnbW3iUpGL/uouxfA
bKBX7VHDvf235gK8JFmzt0eBCpMO4cjIU1VUmxFZe6r/do9UbKA8ACtC+YfwoBN65m8WB6A+zP07
sWIV9hJxcqRTP145Q0fQq00kefh3H24/nRYlJmrgU3/2F4ADN0ME2Led4C6Cvfi3QL8TDWNRfKGB
9WgAy1D5Av6ER0JwgwAZ3iUCKed4jdGWYPl6kEe5QDUj+BUwM9UC7nXol8nb29rywylKwj20A8tf
mTU+tyuYdub21uoaaSAunEQl71QGkCL2kIMl0FqMP3rEaSYrGAzE7YO0dqrzoFEOEStlps+Nlm3A
iEzqZmA5uBi4TmK8KrMeajUTCUVdfHdm4SzRKgWEKYdv8kJoOUdaIC5QPd8YjoAStSk+sa4wWVlp
so3WeQP24s+6X9KzfGkbh15QyCo3jZNkgotGqnXGRL4mhYXojG+lX9B3oaP5v9AkK1D4Whwe26el
JPpFlqmHZgJyWyPjGXpzJStLoIfebKe8f9/r67ephv23YWRpjRbUjN3cMSNVRepMO51oDcvxHNNM
eybUW9QS21npmJC5nmZ4ZUbZkA71CPxR/KuJaUL6hNdVDoR460K6xKWXe9M20s7KVQHewL8myVqB
lgaaxJuxuNi2I/3bAycdsKJtU/sE9CuPo/hCTmTSLeTZ27pUTXXKfb3sqcYPujHH2BK8krPD0548
LQ2AT9QRWcGapjJ6+Hi+Ho5WqcDa/ai3hmuifvSD2UDKJfskzD4nQ11vGxk7MUl69bIotx4N3GwA
eD06WNRZaGChgY1pIJw/FIdodSYVEMUAjAvSGtsIgcEb9T6p99Q8oOJXWihsRDw1FJ5xGQFLdI09
ZqMGJGyMED61n+6unCSpKEvIClXGWvwiZOYiOQcbQwMhERUQP1gbp7QlRDwU5XLWfBzQJeVZNgnb
CmbmvcGSzzFhlBl2OAv25ibLi5luz6AAnNQtSphjMzME1y3K/gQskyLEdlDR3vSmScMhZcDjVAp+
w1/Vj33QCK0IPg3S2sygBwebJb6tF3ZQhyPNAgtpxijwHk2kGAaYBgb6PL9BOgd+utziLOICOa/w
Cjr1vEP8Wft7g7BnTDkOQk7XTERvCC9X0HikiphE/nfU174jot5v9BEES0FRCTgl4rQhd7NF69Jz
qZl1gDQ0NrK3nskL1xBMNxgCuQEI3HqhrC5r8gSdV4ZVx2zL8Egan3JcmQ6L7S0d/iDqDc8/CprW
spECBnenE0mfrhbwJGI2K9FFuATLE514NIuZX29yxrf2wK8Mrgh7Vycj0llF3+T0ceRF6npNdClu
UaiogQUAXhjHQgMLDdwIDQT4BeRkJxIB+Q2XwCTOxAeTHNhD2iBNBJNwC6Q8zRHxKEjsfS/hqIUl
igt0qpIEoDiIzecqh+An7g4xSRZNI9sDmuU8+0iSoGWJu4ZGIcZrDQxNgLYkSmn+DcSWaQLZ2qrr
6EQ/qoaw0JcLcuDXJgHwwSRxWVi9BllxCjQfZK2bk5mdzZ0rbqeKpk5KoEPwlSYhm06BlzzgxIEY
d9PQMcj3/Y57Ip4cba2XfhV5qCnNhPpCFdYi1CiZuubc6IWC0ha54JFHCbRUfZGSJ4r6Zcw/knMd
+LOObFMMXJcTUydQRCHaGbuqJQRuTa5A9KjxU39W2pJl6o2wCslSmOcDg17MonNs3rbvIJ+OBJBb
JRjQq5jI565UayHSKO40WTBveDYEepsx7AKA2ie4+NnhAFOM8I9pewx70FIDQg2R007M2lhL2+lD
oMQ3trcSrGoN84h+vX/9oyDtiyEHSk6Bn58PLTQsGnGpPP0qiifaSqp0BzhrAy0nqVIJTWvZLBJO
x6NXRRq8dXaSvnHwTPZPie7xtCi4UQ0sAPBGNbiov9DAQgOMPAAvBQbPKUGvBErLB5ACfhKcg5XP
2Lgrd1GFM4H3pK4mJJ/LyEUJpoxLXioDlNGSGoz1gMooEE2qrgBJY5787iGUSBiSqQXEJbDKHbkU
8CRglXhdvBYaFy++DUAX7QjYOBwZzS0CxAWYpAtrniEm/6Nbc/lpmVgXzZ6iITSpCw0Id16fTLXo
C0D0uWCRjVc4z11oWpZPs4IZCfMtLnCdaAhmhipCUFcanX50yXRcgWRZR1B8JiBY3Yoc+guiqsCm
Q5cZDGDoTVaRTkDAUlT3WOEsCkFCgvzjxechX43CheUDmeCCgA7n2orKociGUjdsat88fhOn5YW3
g3tBgSAZRy0iFzD6mXJvybMhPaaVDf+Ab9ZhbbGsxYJadeP7OQEmIL0suxut0qi9jVCYbxHSBoci
XDRRVxPUHgG/6Fk0HhR+CGeNfzLfCP2W0Gl389sClJ+osf6rTLOGpwFSqahTtNgjM75GOZhrsGui
Btrt7VSd52umiLrlge9RNxAvUCgSSHudMLXsRFvp4ZPkm9qVtXw/orOJlR7ppLAo1q+BmwoAf+IT
n/jY+FpZWTl8+GY43Ku/RxclFxr46WvAzivCOmfsm2VUhxOwBOgq6A3wRTfTkqyCSIBOCIgqnnFt
AEaki8CeQR+88IafUqD0krF8h8Rsna1f9yuIS09j4vXMDLbCsmFIqDkOrhP69euKBbVqKJULc+hV
j2Li7/S6rwQH4fm/huqsRQrX+NXObGfUVjmTaQiKsmC845cahQgwYvBcMuBA2QAcNgZz+BdaAhOc
gGWKBkN0BSRyajNNW5VcpCs1PJCAYIFrmOxw3WfTDVAvLtVJOMUaYksmqNo6cyk8RDi1gBRS/lwz
xP+tVUyi6fmlflWEB6qIqx5j8WKnqtOcrCtmvdCB95pRF9V23UUrYbAOAUC/FmIqNj65UfK8DYlV
saK5uZFOsmaQF8pgtsfbne5yTgkRlzZUritc7lbAjLnXUaeAb4Z7hHzwM21vdw9asKvd0hLN1Phz
OolgT9dYM45NoNWngVIbK3NScZUIe0PCir0VBEs5Gg5sa6Yb7pYMz8ZXczKuCBTR6ZMabksA5DQp
D3QjxNuFTr2N1ecCXMms2s3KsljXQ/TuUbUouE4N3CQA+E/+9Ik/++yfv+e3/ut/e+xx/+/QRz92
17vvPv4/PkXYeJ0aWlRbaGChgbYGHKwILyoDPAFSyrpocxwTr0WhprzgmZw4tcPuYnHtDKUZP4OO
SCg2cujNCrCHF0Adl0ze6xZ2FjyPg5SGrcu6Bxi17IBit4pblaQh7rAl1QVVZXYgCAhXVURCsBe/
ZH8vcR43lMK2w8IqlYvQL3AjTt7ChAMEIwozUeDcYiOa0HOz6IQtigkrbpezstxlqiUaJolQ1TOx
pYB3Q0dA2lFCdwdw4jtIgWnZrriRkHC4VDBnatKl/mJetjF4MEAUCRUHAvCK+JaDfw3XHCJVgdZI
6HDer2VO4AU940IimJ9mdotR1rTeKbY6GrARxxsnQFPCkdpLCKQ1HwEuJTTei8r8sEr7yOeMW+W7
vsvtriilrPnKXEPkkU8ON9lEQ1dvDYWyMw5+emgCvTomDGM5i7XAsbeXMcytr/3os2FYtTc3Kzd6
TGUfO9BAbBUR/RICTDHquGL0zDFEWpJw1B2RtZtakj6LFGvNtBHXORmXMYbKcybSiVOF9rVbAh31
vv20kjFrr8ZsX/dNhRjZ9OHvtZS3gQljY1F0mgZe8wD40rcvP3Hsvz/00EMPPPDAO97xDmr9L/7C
2+zfW97ylrvuuuu9733v/gfeSxiYCk9Tz6L0QgMLDXRoYHR8FDavchRywAmGZHAIr6I9YEX666CJ
Ib+IrcEncyUUCIZy2YpUa+bAqtuZvJny2eFwBbSkIliDhZpg+hRx1bAwr3NGTJu/1ssIkHNmAj4F
tEvUVyLhdG6zCE/5uhCaf+qC3hDnVJ0wiAUYVlQsn/llnemiXMSr+dgqKcZCzQXC8SJnddFYm6JR
PnR6Lhiel38zx7mAXlTnAtIRRBMdYhczFeQe5QNshwvesPcRIxchcZc9D6JiXaktwQeQhDz/Rbgb
kdsQvw1rqlGEiyMyrKRk5gKto8i8TYmIMnFRwti6BpcOAa4DvG74F/m1E1xw1yua9EhYezwtlGla
F9MbhG8jXj2ss8ikpyI3dV1ipzhk/aA0tQSX00+2XbI+/zLRHefx4Cy/xj0ayzYtYobWNxZ6O7Rm
0W4aKAKiIkPKIgoAlgbjUDG0RXPwiCuNxLqoubs3RgmOcttsxmKkGmhTiAygAw1aMz3MjuytPR/h
+XqcH03MhQamGDvKMWPALADuaqI6igcVVmc9vKlUtFqygfXPEUy3w0WN1zwA/tyTq4R+3/SmN23a
tOnHP/4xQd+L//wva8/8zV/99RcpQT8pkz6otXXrVooGU+FFly80sNDADdcAoB3wHmAHLWYOG1B1
Qy/AJ9ZFzwQBAuFweWwJBsjBNmD4HCgj4oLygI4cYjNAM0I2cIaYoAsJhlcXoUcgRipACVS0hMTZ
pB2AiyIG/9aDlxlluXXOIpTsCua9uPTpHW4X7c7FClvZWiw4kzbrBgmZWFj3qyhOoK+oCGhZoB2m
C2TltryquS0qGO3mZQysfxVRi7RMBorijhDZKEOWl8stLKWWpdH8lxU1C5FG1AtSBBWGTHSCXFlH
3HQeR2ZDPD8Q8jys1RzydQXUNtQBkp3VAuatdRKlZ5FsZXtYGC/AHseYhSA2UsD8yj3s/rKfY+nk
VxpaQaEIhWZqCjN39JQVsfBLodI4O4U0bJOhDCYgvJzyK0U1EdOiC55OYWSlbKGdqOHmaHpik8po
xVakK6sNYxoFW6ATuOBdMxSp2ok0HlOGxGxcOE2atr3a14OCvADZ2FTBXLOoAG3HrbYw9kD29u+N
s4oKIvptuFUaG6bnaGzmRoEfcRAAfZ0Kg5xBqtAW+rawDq4sX/R++apotcvePOWogeOOjqB7Rb3Z
7u7tjgo+HIvHesODOlhXZIHWHXgyRANzaDeeb5GZRTlWGi/0MNWJ7+gy5XECZmBMWZL0xIcOeM/M
svafG/jeFP3jCGnfKdlnRc3IFvc2oIHXPACmtl+7du3ll8nSr9Pff/23f9/5X37pwMO/9+EPfZAS
l1+6Qpm4zpw5k1XU2UfeMLoeObsBfb4iVUnCu568UhK+dOsVEWVBdKGBnAZ06y9wrIAkijcCz9DP
0e5fwTPsVshJV8OLwS8VDrkejfF7y8EqoKbhXSKpucPJbiuph51aI8AhXeGscNHHiuXFBDTOwFhE
ZfrO89Ctrfi+sQJXOTh6KAM4amiUWwDYpjhW6onY5DKwUOEuVAeAp5nqNPD7kquJVvlzwYyKWdvy
5kc4mvcMi8L4DQ2yfJMwsCgfXh3uQlrbCA29BrdPteX/I4RFM6PL+UaKVDN1R/gW9xmp5kqa1rgA
N2o4dUwaphdWqksQW3LgdQUlCFo2Dn5tORczJwy0GhggC/gDx1wL4rwsCGlXTF0xA72+8tg3zXq0
KSpuc7cS3umkzCrayZK9MY5ddjoA/EzCCKo5adIuLiHAPCTwUw9Gtg5ECypOIfcEI0xptuYjmsrv
hUBm8F7bHWaUGj8qTeBrvZxlN8UgU6ZxTkufgwhVvv2tLuqhJEkpX18N0eux9XDr6EEtUnoOjPUA
VGkP1RTfpvi/OOJKsmUfg75w+ThoyGMwmGe3uw+pYg7pNNMU8+tX9qLkK62BmwEAn/z7v/vMpz/1
gx/8gFDuj370IwK99o9t9eWXv/e971GBy9++VNTmwTM/0evMwaf3vb4gZQVev9LWt6B/E2mAQ50c
fpwz3rL5cgCSgEuHN0d4f2NX8LA32N6vgoqAgvzLHGDJ/uLuPJSJyhuyit0BT9Z9gRYhR1zGlxMB
GA8JKiFNYI4cRGUOWFursiG4Ldt0RSr5A6gp5D0Gnik7AF0PCPnXWHsS8tVIMlCfhHMRkRbKgj8B
sDn2O5cCYCGk5Dwt7imKgUsZLJDmwh7YBHg8oHcIzwUzcQ/vAQy4WpU5/GfEIrlbzEBb7EzpoXcG
dUmrlUDkoOi3ncaqhbKC36OJCr7KytbtKE9zsLK8Sri3z/cqCRBjwlQD/b2UK1lpuLG+AcpJWfep
pbdx6XRPeQLIaFamPKImT9aAN7xsumWZBgB6NWDl4sElNyZqux1w7hErmvJIqiDKh2Hu//XQ1jKR
Gu291kdi/c3MQqx0qmWi2iOpLRjuE6My6eN6ygO8PdGQqLGmMbD2k1BemERj/ROOGabp8GkNqFE0
OGeKyPNSRdNS0TTB5GdCn00uSnkN3AwA+H2//eDeffc9s/bF1T//LP37truQQ7d++V2/Qv86+n7v
J1fvfP7Z01c6ii6KLDSw0AA0IACM8ZjsdAVA4jOTNPIIrChnGgGGaQwTmeFUYpShl9yMUoLKhPKA
b6ki35JMYB37qW8XvGMCcsbdANq0YhB4hHW1uhyqzBchRgPDeOMGUGcoV5qpi6s36weK9EQlrP2W
v7IWV1Yps8ASrRWRGIwRBcVkAbL67alyC7phH87QG/+Q4DmHf6FObLpWdB1OnBbci8i8cAxr0uh7
S+7QLKHDgol4kNDpcnCwBIIOKhSqm+YZx7fqkylCDT2LdtnfkMCKcbllaufPQYVwvVSHQPgb9Kah
fuUid1TtwPyiupGS3RJQdjiyfifajVtR6zrcwSjOzDKFXZc1by8Lxc3/dgZZX4SpnSZMsx5V7Cam
3bdhJ9tkKCVShRQ1U+8g6yPTT5k3WETNL/ItzYz4joC5Wh/lOtq31PPqRUpmb75TsmmMkWh+p9ze
LpuEMrPTWy14YNqOEk3b0AJpv/uaBRM1XIeyE8zMiLveHLW9b57I9B/1b0XbeiuiDzOroLKCPKkB
eLX5CQLkRxgsXlWB3i9NvjjS4GvPHJ/wfWHs6nJyFa+B+oxPuIu10Mwil0DbJ1ijtzEvQOWJ5BSS
qsJu+iezf0T3PhN6h9CiXEYDNwMA/upXv/qNb3zjQx/+yMMHPrj8/t85e+a0/duzd9+9v/Gb9/za
r39Xrl4TuP22baHolSfvCgukh8CwBE3P2h1eND2UGy2hdtXf8IZwhxddu1JcBrR96SQMPdwsR6iz
0o5aPSz4Zir8a9/TS8+v3EqNDCJlZYZwj5xFfSlaltYzYTVFjVWFvr4C7b2299osBxzFUU1GuQFI
0G5YOalJEVr4hM8M2CbAGDueiPLnHq/mXi0C+ORVLX+pvKUpQRToMviEwpSJfF9yHFcOiCls8RWB
LVNqBk9II6sQAK95pCXKStjSosRMgd+UskpZPlfLJS14y+kQp5Vl0vT/+QDeUVx2+YokEmfW1qEp
vNmYD3BGBDisiHbzCbwRC8FPaQ52WbOWdJMw38IeYN4MbMUgM/7FLhfy5Tho/it6jbxP/6GmoHZQ
hP45MT7sShU4dJBu0xUNS5NlidowX+D0EMhyWaYPo5K5GJmDQDxcDsQC7KScYeoDxLWj8w5HydNF
ftYrda0WkVQ2o981tV/3q/r8by9I7NqOhfR60DsmQBbbtACPkTdXGDk2HZCdF2j7wSUgCuqGPynd
wu1esDbfRF35jDpOc3VKNtCwDbO3yPDKCNCrPbX2FP+3jdNjwu72ejHWo+2swWM6IAvIx90TIWGM
hdKU0KhqFur4Ei0zy9pJRcn5WykejugWOiJ9pkXzPtE49c+rWHKwsCkYWGC34WX1MGHaJdJ5yrfw
wGQW+hIZEvRm9AYwzRK8vaWPwfKDMWps6XWwntHR+XRaFEs0cDMA4Hvuuef+++8/ffr0uXPnvvKV
rzy0/H6KCd+//wFCv9/85je/9a1vvfjii7fddtstt9zSNoArTz68srT6yb0oSRDv1mcffAmro8/c
vnLrgOSeXzm29Axnv7R659P73vCGh90vhyRvXbk9rK5+afWFfYCCe/cfXHrhMiNeYXL62ecPPnaY
IPeV0y8GZi+tLnluDFGVAzEc37JGVaQNrJ68a98Lq2jPmQdZkqcocXDpTsl7ilvNRHIyg8ILx07t
CEVL0hL6NSY/eezFfSvPT5Cw3UOLEq9KDfBaXwAMjfTysVgvz7CoGAgDEWABgfgdVj6HdyqXDJ8R
RprRi4VJk3YHNDaAKyqiaCMUBriyTIe1FGVJTlQJlf33gQO58XsXeNIqyxRAuPiW3AEkw0o8Q8s4
JloKSBXcxVQA6LFckFYxMMcnAwHGbFwW7OR8LE7MgF0D4poJQdCkv/TTpFPfxd7lBufUy4HOTBLU
M13ORnQgAoN8vbR/x67AoKWhciNl4kqMWhYFoAZMAorN0giecTggmqLHQZeK7YOoydYv9T+6AV6W
f3Pyvlkgr5qsO74uF7yo+qjhfXpIA1z1BpYCHSV/3UurZUqthl9eFjsblJvQHZGfbRigisz7ndpe
SaLm1+cFukdcDf1mJ0SyuLTKzoPPCJd2ixkKGgbzPZ7reoT7PP00Z8TdwF544PB/fV/f2EFXaXkW
2fo29o3QiEPPgFXoGKnCCBkS7ui2dPatf0QMSyq8ztMxHnJSG454VQo0VgB5VUSvTpiHvJuGh09u
a3G24b471jkp0NELiyKpBm4GAEyg98tf/vJ99923Z8+ee++99/z58xQTvnDhAqHfO+64453vfOeO
HTsuX75ciwAzhJWLUebXGIzydfbTBIafCb94cfTTp+yELGDWpaVthx87uLQ0+qXgVqq/JLASBZ8J
BAgB2zJrwb/7pdC2w08FZkJ1AMnE4EwQC3SOJadiVaUdej5Et/ceDry8VZRlRqkHP2m1CtKePfX0
nU5pTxG+DlenhItx+trTAGMVfQFQ2BDHKprHQMhtHsDMHG1TwEegStwS+CYMSXOOBcM+KaEBzKAe
82gcsNN7eVxkEUgG4braWTClEmCQFPwJhqM6c+y6wzl8/uRhrHkeNMAVtTpWFwvyZ7UElKsHSgsR
5i5I1Z1mHBY/hwLaIFUUR6rtRGiuRf/mfJiWnNoVvqI852inQGiN/XJtoG5RpkwB4DtJUhGZriut
4SLdcAkF+3oK2u4dtdRnSroVQoCoT1sm5wdtczF/QDRWnvPdoGSVDTMIQVrGyVwQrQsNgEpChdLx
v6nfGTUh65gGsvUwWlfAwUT0GMMzTf0t10NNJFl0s9IBWPf1MQ2RoAsny6iAxV1TRzCrtKK3ampJ
+6XsmlcccQjc9j4rkC9yyp1gKdkS0G0HYE2z2X4Zm2VFydYRkxsedS1+Vo2kBjmy1CqZnlF2DFpm
DhkCcvd2R2l2I0JiZWmjXs5OvkT6j4lVh/nGNV8KCKsYZtIlwNmaAUnHu29v29rHeFLbazqJlIVX
mK0os9eHLYF2i31GMyDOZuJJmc65Bl8M1MR4ss/h0jOwd/Jr6pBZlC9r4GYAwD4C/Nxzz+3evfvu
u+/etWsXod/eCLAegnXm4PMrnzaIS1BOFwcDHN/qYplLd+641Wl1/As3uLpbS0052267XUHtgIAd
/uVKw7JiWplcYsB0kqsqrZbedt+DEq4uHnRdk5lpjNuTk/bK5RfGpW7dcady75FwMVZfmxrQraQM
Leb8Eto0JzAWNgMz6lPMgR2wcpoRw5uwK1gX94aVsXSLgplY9MtpwUIAclSXGTgQQ3cpR3AskI3i
SSjS5Yd7kk/f5gUdLhO+TgQWuGbAh/ptJKGJVxpu84s5gEYThjMp2Ij1txpAJoJz2tX8MgNUursZ
UVzdzirbMiVHmqCnPYODnAuNHJyDhUXU/IcRr66aZrCnL1TWKutAoDv2Y2v7aBfUXJAgrdAm5E9p
Ca2rpyDKF7GFLcuJi/MBF7VbBx1DA8j3PspQsbhVjKUSiBL6K0ip/3XwNPQFmwqrTmrpzuegIj1+
jCVXRUFs8Uhk97XoknszMNQzsRS2bcjtSNseWqGdGFyubMSp7f+pnoWY+VUgHf0c862ASdzqYg0u
OSAxcCvczfr6/dhjQqe0XHCvGE+2jre79OMBWH2aYNw7+NXFIlexljfujh6kF0GgtlSYX0B7+1pt
LDAB4QFAOiXRaLEHPwZQs5LY0yMseIbO/UgswTMfxBuaWZ9x6Oip1KrTGYqYTDrM660uPH8iS6jM
jBiBwRIiwA8BvBmUH0c9Fthvz6OSEQz2g9E/IYNskeGNgK5BZfsycPpYKz1nUr4R96phVOaG2iOx
w+QWReoauBkA8A2IAKuS9lK88ul9Hh4Ox0NjHbTFczdoWAEBe/zLO2fdiushctrNqynttsNf40Xb
tBa7goL72BWkfenFYcVzhlBTwj7mi1KvMg2EUBuBjJngp5nCvLDyliGZ4EMV3L3FAWywzHUe4ndI
GHzlGGb4eBISM/NvQpWA28J/hZMRAV+QpQuUcZ08vgqQ5yEZVtgGCsAMWhH5VoDvDS7CgIoJ9w5x
y7D1V2A/15BWyNHNAtgYyOKgrBAQFVGRMxwKBRQna55ZXkGtiBszukbIFPMOsq5bA+egL8BY/ssz
C4OWVP8SoKZ/M1MMN0rkMjVoQjJAYbQNWMB8HS+5mQusb9er7klzSf66skwcgC80pT0mWWHncDjs
Cr0kvRP3LZj6SKx6G6mXE+VErWs2NtkAHBq83v/2QY6UuiGNBrast9foThTDQ6BINgMhE0BvU3mt
fkHv218Pw3rFiDRgqMBkcwsgs3ijl1GzsdkCrXmBRuiv3tEgjmeXpatyQsMYcT7BQzQcmDShoamV
mrYTtYOphxOlwGwGz1svo6UpHO0TOgIzbWyTji//qDS1e+45my8BXTP+fMLzkrfJaMoDOdmr8Fjw
YiBd6vTaoDDlIxH1RfeQj0a914AZJ4K3fEu4WEL5RlYBYSrvjvFslw09A+F+MI6mDCY+ZvuMcVFq
0MBrHgD//Ja3dUaA3/72t1PhRufLOmddXsyxS78KeaLdpNV9dBQI+Oyw/nmJ7w4LnfmXu55/8aXh
VxqnpXv90jIK5p3L6SrqDJEkoqtilKRNxBgQcb+EEzW9KP4z14DCKT0BCxFLRXKcNldJX10C2xDU
tS8MCVjhWniRUEkhyl6qc7Os/Gw24/doaDk4avmlpeNHjm556xb6OXvz5rXjq5vfzIW3bNmy+uiR
kq4gMIhkr8qtuDxeh4jB2oFP9trW05gCPA4vOVbKsNCXP+SLyDnOgg5xYKTDFepqCB3Z7K/I4Vj6
NWA5Cgu4EbeIpPMh5qJFmlBgXvZJJC5s2s3pY3g3g7IIZX2HGj3v754yvr3wSJR+QUIVRg7xUpGs
ZNisLhTiAIX3/LJNmCStU1vW5e2CQCUk0+HwZc24kdnZwIncrfmVJrdRQVb0qMvMAqdIGEWHevXm
EVHOcirhr2bXNwv09qMIVgFCHhxmmEZq9I6+xyEtlUV4uxL4alEKYMyUj+eMLTd16069/n3TipZW
sploDFYQ4Fj6EqPUMOJWl0Z91to7HrZZc7KujxOeu01wTBlQUXNsfKWd2zQMrWI6bz6gCnLWHy/R
FAnPtGLSRKjFdTtV4UStDOdUOUPhTkbtMbMokdfAax4A//EfPY4IMG0Aru8B/s53vkOFW4bAm2+f
X3mYd9giORx8deXJR5KNtxVyaXV/vhafhPX8s8eeHU7cYlIBb/NZXONI6hCYPvvIPtplG87pMgF6
pD37iI9uD+uZDV43ZI5am5OWV1mr/rg0Cxtq9UjY6p7F/VenBmQb6pzBXlgkfJ32/XJ6Lm8RAiyy
gpe+EoxNqgy35rKiVSeYdcEzApjyJSTOCR/40egfNV7WRe/ctp0G+/atW5muaCRCpxcvXdy+bSvl
b799J/3ddft2Tm/devHSpbmUz2JdI4K7EboSLGrgk6aHtSuAcvkSnyy80fXTu5LDa3FRmt92sjhc
tCETzDwFwOt7eZMwzgAbR25FtzqnINFgTBTYxZLKcdAhLKwxXhaGotDha0mCpVm3HDGGwnD6F4uB
ZduhFZuZFEvFQexhHiNKBwEMcijqhoKDQpygteSwYDtfisUdoG+IdfsuCDqRvdbSdWJIeg62nHQt
mRJJ3sgFtyaC+gnB1OPxOeuHNykg6WtLxQfNE8jCm27VRQ3Ez2yrzQOulKlbzuhuCkSr+lkn6jYD
8IlSZlUAarXvGlPRNMFaqKBpbxEOKYpcMr+WAETQgn4pGu8z4fFTpQW/s5gf2o7Y1ZSTGnyUUx0R
JaA7rXO9uHhKdxt5trEx2Gtq37MzAex90awuBWx0RwnUbtrnwCTi25yyDDX9KPOmiKiv0YdyMvKk
UxLpWIh6pzXwwQvCeHONcvoUvCi1Hg285gEwNZpgLf07/Y//i06Bpj3AdA5WugcYZbo0JF8CBgSm
Q5J5TbQekHXrszvu29ZFQgtRdV1uLFuI6TxpO1+LSjACfn7pQSPJh1vR+c7hLC53eBQVvnP1zI5j
kGPf00OceCRNW9pbd8jiZxVGl3NL0NvWRNdlHvgVpaX4spxTDT6n9lOs2Wq1JZyi3kXZV48GOHK4
acbPcV2JyviOVqte1y8QBfxGK2bFE+YtnUszWogr36QlTCKY0BAvdt7aZ2zDflFiQKW3bt268/ad
lNi9a9fWW7bME6RKDAjobt/GoHf37TvP/dN5Kk9pyrnwwsWtW7Yc/fgKLXs+euQIkQLKZbJbthxZ
OULh4rXPrJKMW27ZevxR/nn00SN0i8pQ/vK9u1ePUdbxXTu377l3z4mjx+nfznftJI+EwstHD61I
+RUiK1PIGgcWzK+QTN9t+u60BcOMymS7L80KYGOw/KSTtANMxWpkRIM5fj5geI0Pi1pxSxAgH5S1
mXYyy9Zlrkjak28163Zf0bmskQZIxhp1QcjoOw0gI4I0QG6+G/4FnEklmDJ+zgAOdTd1cFAGFyPy
leHPuTOuYv80dBAguhiJigrh0X12AdVrJZZEP4mkuWOknfWSuW7q7hgD7/d4Z9TJwFzH50KlPta4
ePlXpC6D31GiTKDkhY+aGbUubb7DG00IMcGdbWmhyWtEIIy40RLNAkQxJxgUemWOHG4zAJsQyc2M
ZM3Mu7mTuUcwoInTgpqi6Qb4+l2TI2YAfgIoGgt+4CQ9a4wMhXo4Ok0D4GtK8NoIS6DpMCQDM2nC
S5eBoymej0Bg3+hrAt1igQrENSP3GmiNI88o1X88L4AXAV2+meCLWz7RYo2HYRbmdUHxVNVZC+wA
5N74zSTY+MNXkTB/HeVo+7JI2zIN+kI5uFqnQNcHQu+I6ND/okhJA2+Y02k1S0uf+8u1x48cvgnU
9Pjjj2/6uTdaQ17+z/944oknboJ2vXabQHuFj+0YIf9XtC1PHH/y9z96IGXx1Bf+9g//4GOvKOvX
M/Ff3XuPoCbd2opQMCAHYzI+LwrhTUE38vpkIEUggTI0LdWDEgGz6O+M/Bj+oK3e2nLLlj3v3o2f
V79/jY585zLJ5l4ideLRoyurx08cObpy/OjqY0dXjh0l3HvkM8ePrqyc+6cL5y9e2LVt+/J79lMO
IdsDj64Q0KWj489dOI+3PqHfc/T76xd2vWsXIe2jUuzkqVOnLpyn+PORA4fW/vHUxQvnt2zbfmj5
wBEC00L24sULBLOJ7NHV4/RgJcEUd6W4BQ0Etse3cyUU7NGcodxBkwHiAi2bglkh/N6VODBPLrga
lM2TC3TqNXbJcj36P4kXKEiIXgP1LtCqGJ6p0XzELHayI+nC+mr56LE6SX5IeM/A50cQojmKPOY0
kWLipsaQ0AaqPe6+ZSellpeXm9wyBSBAkfWohkGLyPdiOZJIVFuYiHW7QjARdxbXZL5TOyg0zYdZ
rPmlhlvUJZ04yIOE1JzML+9TSxrnacKVPGGTpA8URUS8lvoEH5daF1Mi4RXeBYDBNrV8jwE6ugB8
/ezDZLV7jtETpqVBz71VNtGzH30pQs6R8zYWNbzRam9U6dxKdbals12T1Y7etys30ZOyzna3t7cJ
thdZYO6VOpIwkWaC7WUfL0QwtQH/eOwYjNnHjj2TUyN5+Hcf7uzQRbF+DXzqz/4CcOBmiAD7ZhPc
RbAX/xbot98mXpGSvAQ6fCLqFWGwIPqq0QC/CQhKzSUCyatqZe0uoMJMsZYENnnyVSKEhMoY8snS
WaBfDxcpvfWWrfv37KGAKm5RlJWwKE/TLi1dm8/PnT/PuTlfhIhfvXZt+d49l65enV+/Tn/37N5N
f6ni1i1bDy0vUwR45SOHiCDUx7zeuuX8hQt2tBVtIT5/4TxBb8LAdAvFzv8Tw+NLly5Royg9X+I0
bTPm6kL2RCCLVc3DOU8Zl4W8QIBeCICPJAVYK41SbbC3Gk5sHvd2qCszC8xOwKfMLWiCY7yIt/Mc
RFgObY0O32eSKjQfIZWdDOhTQfJ8hYXcgxTh7GiuJ3McUgyOAlW0FmSs1EyiYsFaxpcw1wSzBvg3
ugY7GrYxQzNcGMrJXOvxCCuio1tzq+mmQVAXTxjghzW54IhHLKLwS0tqB+/Rm3Z1+/0lFtPangTS
neGFZJ9IqTwek6OnfJmpcg6xsrZyb1CJdTW8ZOTW3nbDwdf/RYPSnFxDPfrtCgBWtGVjP/MQGKr5
Jrdbl2VnTbPIpxWLpwVH9dfJjmj4UQ+So0er0/a6zGD9JhgFWqvNJy7QgI8wW06XDJXWRayrNlAf
2hnjT9tlDU/54pZ/Jkdacuy9SZj9exO19CvxPurS+eup0M0GgF9PffcqbSsfD23XvqUzN+zk7Fdp
exdikQZkaS57kHxuk6yeDQc4AQTOAcmw1FnBGSPkOa/NJczM6Fd2C8vGYM5Zur6d4C6tLl5a2nn7
9i1vnW1964y+bcZECP1+f06xX48HsODW478Lly5SrJg2A89kRfT+3XsoTWWuXrt64uTJA0eOUNR3
+dEVdB+JRICZ6Fuc89r3r1Hsl15X9JdCzSjmwZOGbVF9k5JdeYzJ0j+ch4zTvxSnIUg7TC1jL64U
ENRKBElUWY2sZ4PpKmL9JhOOdAbA1dOhoXkDfLJ5WBY2hyXQgkt1OTQrX8Kz6CxdL62fldKtxQbY
5jhv2V7qAtTDp5JMGb45IgXzCgnvLIZWe+hZAselMilsHXbzQsmqHyXM5Q2xy1ejtEcc1PHeRt5b
jTxR++k0o4wLvpqBz6xn0/ZyIqyLn2nYQYXQ/2TJRr7XuEb4Fc3UgJf9zdfZUG4debYhRLaDyg5o
JCvwWIqRYgWmMw7RvIDpzRi0ToHOaq3Y3si6SsAgBU5jNtmZEX6MhEHRMEjv/UPJkXm0EBGeMFB7
iouKlpRFFwY8vBhOAPSs72LL0WdFtAoj1aoNNw9yvJJzHZHqsD3Mo5ZX7A3P0lTtOc2n3RqZ+gig
ClPOsYRJBXhpj3T/bO8Y/V4Mex6CF36mEFRzfKOiR1/Et2V4ERezBG+K0Vpo5pDtCN/pXicQiQY+
vWDHhpE1CbN/Pxk3YSqqQ/OLInUNLADwwkJusAZoo6+7btR3o26wkAtyN1YDvKEXkC8cgiVwhfeF
YmmuYjYpw1BKznziHcJ8dyZFaUswvXpnEgqeUYGr379KYV6AFoKmu3btFpx8/foP5xcunKe4roRM
FSsyTRf9nEtslupeuHSJ8i9dukhvIILBlF790hrh6rVjsqT5M6sGw9b+YY3CyxTCpXySh0Dy/nfv
PnHs+J5du9ZOrlmxAba5bau0QviEkKXtwVQdFCQki+XH6q/ormBRvQTA5d3PoB87dXn6QLbpWgEE
LbFcWduHg7hEDM6RdICvGtzUU8eoR0ilM970G74/LPB5plMQHIGnn6xS8y0Uk1MZBtIAjbjohyL2
yHSGsDAgqnLXGmO/pAR6PclSGa95qNeH3QwMSzGWhBN2kHU4FksyIaeUC+nJwCP1t6oemKdvaZtu
iDRa/GkshmmUcbQ2VzPbtN729koWl4scvsjN9aXNBY88Y5RZJ3Iw2+iT3yOxPMcUWJa623nMRbe+
LFWxvRG7prtfQsiJ5a9HyV5+MEpxQofm/dTDBOCddq7ljG95gOH7wqwxZloa1ONHzdCygpL9APdq
6J1l4GdUh/oitTthjFFxmI/Ja0cIU65rCSsWTTEYCG+ZmT1mTef9IsUqiMagse7UlSNnky9mgaYB
n9AafW1Mn2nZLpz8QOszhEWp9WngZtsDvD4tLGrdNBpY7AH+mXTlHXv3El8cViyobC6gi9N6apHE
Q3C+MeMqxnsEz2YDagVQ5MyA6Gjf6Ztnu3fvpm3ATBVv5evXTz13juOeEiaVF/ZwXBZRm433A4tU
wwV2XGucjxL+bkSnUksQbGFZbYCyWgCzxbiQltkB/Xyu/bSVw5ID+iSPLJOWgIZ913f4QhKgLFoh
KFrgNBaiu8kBZkd3cSo1qxqT/Yqo0YNSXY6Atng4BGAorudUW6VQ1Zo2JMK+Ym6FWyDtumOUnO7H
DJos0bR82wMs7d29dSf9xR7gySjUuk8Uol3ZEsDm+KNEsV5Gn46dAeA0UaAYBVsmt7qvdzyXCGaU
HF+TBIkiOGlpeOiLqsNqXEoopcmHC2T1T/lprxXI+VbLSNSGt7mDtRleKdHBN4o7ef0XxfDsYBKR
ANUGbLSLQTxCPi18EhmYH/JtNNLUs3+kJ21v9nLa70VLyPZ721yKJSLZapQqT5uNKX+y2XspTSob
j83OynWQH31dz59IGy0NpIotGWT6wKScxR7gDdh4serNuQf4E5/4xMfG18rKyuHDN8PhXq+EESxo
LjRw4zTAu38lCifRSFlGxScbM/LhQ57leCf5eg0+/8vOIo4gnmtwmFdHa3yY78qZTAR3z//ThcHj
ub5ERzpf/6GgbAZpVJdPNmYKsgJ7RgjNHVhMdGYB2qUtNWAs5KT6gANHmJZwIMrIy9LSSsBuMZHh
HC/5ThK9HfWtLIAzUJB04I8Z9+DfyGbdgFk1Pok1aQw1RcO6vErBqqJbKFXmF7y0EFpOgea7Igwh
WyiQExIjnWvjpAzK69ebpAy+ViXRYBGai8g6ak0LCyUxYIOQMW6d5Y4S0uP6z/rFSkQ5mPjwV3Ti
tJ+O0LqDmxI2Kkv91AtUnziKNrC6AkPP3QIj+Wblc9tud6TPlEwWAuW4+dhmV+wl0m3UQN/Ljl0d
TJoMFm+xql4V0yLVWdVm+ygylbApMWJtgehGT1acbPSah4WBlvHyTLNm0NVHsMb6lEThrge9sH/6
24VDrOGgnAK/jikSMII9WAICNBoePV7qVpr0OAwPTH2i2NceY3ujStF+Ff9Yo6LWVcaLWkU00CLM
b3KbGbSUX7JAMwAWadyWIcdeZNlEdcBEGsiKAQOIyAw5kc6HV2p46UTKSZ9RuT4yS4jeAjpA5Fxo
Fsl9XzrTUA/CK68MV7MyHTOiPx1XT3kFLcqqBm6SJdB/8qdP/Nln//w9v/Vf/9tjj/t/hz76sbve
fffx//EpwsaLPl9oYKGBV0gDAttoFTTwrYQi5curvCKa35pywJK8YhmlAXgwrOIgsLx35WSssIKa
nDL6qBIX44jvtXNfv8BiX186Reh3ThuGBXnxuVm0ahqBZT1IeS74GxdwKeXYT2BEJi4JuoUyqIFb
w3tY3mdaMqzrFr5WHgiQWc8CF0LgAOCkEMWZKhtAo/KVtGhJNCbqEv9DdIU5AiGFWtcFgXN52zYs
UJZFHkeDVbfhzG2mz0TCAWPyUr8+E3yrDUEoOGwqpqkKbgvPKSAaTyuosYSbg8aycB27fKE6KMCU
F5Yc40Bp7xxAZzJVEaqM/qu5YX4kKhPVsYPKtJiuHTBIgJ7Ubgp1w3/dbmEukyyBNr/HiMeJbAOS
zMil6wK9dcqRS9QB9riHxmc7GYci3qg7XilTKV9vnd1NcU4d9vSiwUhvKTbLKTYLTsw9LXZFCQ5N
B0LZ1jXspDABMZp+gugtebKgt4u7p1ySBzK0UJkpuT06IsOLJhoMFLXGpmHvbMGhRyLJ14tGSu2a
YGZZTXq1I92S0Fs7sJ89/RTyhZXPo07xas8+cFp8Qa3yBGj1WGJF0QRTqoo2RZ339EMgngmyDfwu
oYS7rbr+YCw93FRXuU8odbRsUWSaBl7zAPjSty8/cey/P/TQQw888MA73vEOav0v/sLb7N9b3vKW
u+66673vfe/+B95LGJgKT1PPovRCAwsNdGggfL9HjkEi6IHvygI7iSc04BA9l3jGr4cQDRYUR0hY
sB/ije7Fdu3a1YsvXKTvDxH6lbO1uO4QX+XvDw+4VSCfBi0BOIGHkOCKLjG87B2YU1FFAMVSYw1w
gU26LJnLCEfUmrNgjB7BMQ0Hab4UBh1OcHuVrUFE/BaZtXWSw8QZBgskDhLqHmBrBILDssdYFqID
7mJPMhalG1+Bx7JYWqM6GsbnAhwNpioKtrWAhPElWj4EsfHpI7oYGxMp6krRgXYibwUfqbDpx48V
XvwVrGt8PLVpMlfP7dzG7bbznWVfd/0Tst7dSXFghkPqZvmcMfda/MRJsp6WlhzcPsfX2pVGflJh
sjltmSNJ+rCQYYCSYF3YuxLzmeIl+95v8MUYxHNjShc0m9lur7GGuOCeTgf4xuQkBOro6f3aMyBC
QdXHBdBmu4F+zEaj29hN4euFitqbnX3INyILO/smv3oeoiZJj36GHi/YXsXM0lsQb4DfY3EzA9/3
gtl/dQyqpQmYBEEkzAgjwxiYpg3MPvCz9u9KTnoyo3B2Yq6nKxdl1qGB1zwA/tyTq4R+3/SmN23a
tOnHP/4xQd+L//wva8/8zV/99RcpQT8pkz6JTl9SoWgwFV6HjhZVFhpYaKBHAxSSlSc4QZ+5wGAO
Aou3JOuZ6SxoXvZMt+Zh16u8kxgp4ewrwrdMAKdAK9ITOpeuXJ1/n+7ONzMph6wAPHE4VkDZhloj
+GogzPCqIku8iR1U1nezQ8Wh+QwUuVZYpSzyB7g7FIJIjrx/ecsLMkBGLLJSV1IrwImXd3wAvRzY
xj+r6+kLNRwHHY7F0m8aoWW8KB2nQPM7Xj9QxDuE0U0AqyFcH5oBPUtMmJ0Ggfr4SRfFt7GsWvo3
VOG+oM41CkEDCkusBarwTIyoD8Aog6AlbkjWNx2trMOm9OFYL/4RPlMU+2cVv8q1lZPdUMe7dJNx
nWdqrQ7clZrrhSx97421BTCgFbHGz/W64HV/ty1VpPysJBhN1X4xx7cERdqSeIcYPYKBgPwWQoDt
WWtK8GBobgXu+sYW7Db1qqOOaLc31XxkCdmfoZZvoEcdlt8LwEyMFIEnAxPEPeSOsHeRadZ4UtBV
0kkrv6jtFGVFOcOjtWZmFf6mk5qMdTHM2hMSJfBmj9mUaSRPlxlUxoIferJ6mQlawsHLSJIuvpHt
eRJeJznjSXs81cn6x2DL3hb3Sxp4zQNgati1a9defpkmdq7T33/9t3/f+V9+6cDDv/fhD32QEpdf
ukKZuM6cOZPVwuizPfT9nkfOWrErT97lfyKfyt/15BWkucDo0jtM09FxfF0NoyI0hytUHAvmSqsU
bxjkWBj4QgM/Uw0A6GwmiBtwEcNg3hWsmJbhGSY4GaFppFcWyko+n9WEfcKMBvmsLPY25sPpxABg
eqSWLqZlYEcHNSEqKlBsJvuN+QcW/fqly+MtvoIV9TIsOg9lKIfJOsxpZQn44bLqJDAKo5YWEKwI
HAtJRCo9GIySqBJI6f4r5gjMhpK6JlwPyBEWAcWpA41DxfR0MaTDodAcj2XEqyhXTnWW7wlzcFhC
9AahcVDWnBei89ZlBcnycWaJA4cNURz3xnZixJADvvX64CkPUqTwURcf224pM1ziIjAV58owrW4w
GQg5AYA9IgqjBcBiJtoFgyxIxa5byceqSFh3y8YMSzgwFsv/LvudWqogW+Tb/XTcrCyii+BHpbET
hPRqt6mBrDHUlLvhwEt3709omhd4kuEZVBsPsUgB9fCUFjZIH5kifqaAv1sP0birdk5y09BvlBgL
2bT8Rl/4tkx+NGUalLKLu6DJJZpnaWmtNBGWDs8REM1Oo5iqvXVFAiTyR1HNdRq/NzbTQDTjmRhe
pY0Anz4OHAuWdkRPTqs76H6pR6xqey6sg8uiSKcGbgYAfPLv/+4zn/7UD37wA0K5P/rRjwj02j9+
RL/88ve+9z0qcPnbl4pKOXgmfLnnzMGn90VYs6HKoS7R+NrhbZXihH5vXbk98NKyDIn5c7kmwY7L
Cq+Xlu5cfQnZL60urdwKuQChj+1YPdjZx4tiCw280hrAslgKMwrACPj2ZV7VDIzC4E2+cCsnYyHs
yduAseZZw8Wcz4Fc5PD2YA5dAtByphyDTPQEkulHg2ShL2XIx36EssBOfCFpjHI94kUaqNWKGXRD
DsrMx3FX06TV4s2x/KlepWNHNCnoxQ5VYPuXr885zYRVGH1to40cYiUUKlMAOO8KetOTsVknBFNJ
w6gupCQtClHJcJNnGSS0HgK83DsSs+XqEgrGwciqB8Bm6TjMQ8isxIw1yWWEKHcNdQlgM3eDSBcU
FfgzQcSWqSxcZEwEkDGY8kLCeRXMps97Nk6yIVlIAfnAriwn4SYldee23ex1gktkTeaW85oGYEvh
RxiDXj7h3f2W/xc10MBnExVoxYYaA/m+Lst2BZtvYYtyqfxgISnfVOCcTwyOdee4zT3qoGxn5aj4
yLPviFLoLEOjp1/KnRI13CZiosTAF8PKLhtoyEkbXtBd1EALf/lEUe3RDWsdhOFBXatqaKeXvhGM
Gu7ZtQZ7lteEXq4oFj2CAhXDk1ulOQ6Df9FM3Gg8ej2DV3OwhwINgJ1MOLZRX2p49jBMTBHPOlr4
GSeSU9AmTET6tmetLlLX2AKyXW+TDl7t/hExwWIXRdelgZsBAL/vtx/cu+++Z9a+uPrnn6V/33YX
cujWL7/rV+hfh4r2fnL1zuefPX2lo+jUIleefJjRb/Rl3Cunn33+ztVP8ldkcO09nAHR2w4/E+Ta
dvhrgrRvm8p/UX6hgVdKA7LUmV44RF8AUfhGEf9GGNbOjmJEJGIwMhQYJchQ0BolGSbJ/t45ZJWz
srDvl6PEOPM5LJkW/AaC2OPKKG6mqI5uCaTEpmLFhQHxgjH+MV50UBltGOO5oQzLIYIB4UlJuNRB
txEiUr9BVYMNw9p8NBAboQPchSRDE6QVgSGDt5kuDg/sggAgZtKFBeFKCWFhRlxAuBIBdju3Q0U9
iBvnRW+mPpAqIg9ywoZnyeQC7nI6i1wlwP7hq7yjalN/mHJ8R6sZYLe5uaodpFMfMV8pcnm7XX/t
vHUfRpV1OrsR16h7kqNWO9STWDUyWs3v1Sosux8Gp8BjChTxbqgPeRkMayikxCsd+02oUOBkqsgr
MPXCQSd65pSbkQJRHtXuI0zFvsiMaMemNeJS4G0zMhN632zPOqJDz1GTJ1nmCPynU1Hd46c069Ru
e9rA8PbUfi9NhJU1Y3NA2SmYoU3ZMY63bffwbza8rYHogdOhc8WQhSXQEKkXZ9YNrDQeg5Bp6yKs
m3369eqkQxWLInUN3AwA+Ktf/eo3vvGND334Iw8f+ODy+3/n7JnT9m/P3n33/sZv3vNrv/5duXqt
4fbbtvUW7S/HSPfg/gHoas1tt92+9PyLL/XTWZRcaOBVpwFZJcvRWoFzwJV0zSWoKBFd2Rgs66IR
YJRiuhkVxxRzCJd2kAYUhcW9AGyUnKPNwDxDlFVgmOTP+ZauuOatwlyRVvXaq2iMcgHqDEGZxDPD
w+EdT7eICqTyaSpp+R6vihgiqrwdo2XYWBEtzQ+roNml0EajyXBnEcnEWV98GyA/tFfFEcwvtbD0
mhGy0MKeYb1FZQg284yDLnvmprMHIMF2xsbyuWCBjhI3xilZsux84C6ChSO4Va2y+lqVIz3lLyhf
8nQruGRwp+PWMBXSji2MKBv3kAtHBHMNFh4p+i6q7RzJJC+KtET3O/xvq+ExwDQv3OvKKy3Kr7an
xDHOn4InjWGzOaVIFChELqlvR5FyRU4zgBuikJKSgQSsO/r05m2g7uZOc4InzguUiDf60bd3iu11
DbRQaIIMNjYLyvcYu2f0Dazt4R++haPS1WcBJrWzXrgTd/VZHbFKcRcys0HIkWjW6R73pjM+qFOY
mLMJJoOdUetrzwc/0DzfCPkb91AmmnPxSugfhvHyB9/GUg+2Zgey9dKOmPYEuIG293oidTMA4Hvu
uef+++8/ffr0uXPnvvKVrzy0/H6KCd+//wFCv9/85je/9a1vvfjii7fddtstt9zS7lmO0i75eGy7
SmcJifTuuNU29to6a445P72vaz/vKwLMO+VfFFtooKIBDWxiLS4hKNm+y2uS57wKmhAHgzdEiAUm
vcyf9qFLVkFzvJHRr8AzBmfyrqUdxQKeFMvJ3tQQs9W3Mt0iwMyQDZ9cog/8cAVsFQ6OtZy5pbFR
ZgeUJjFlQ0Ihz3avKv5kYXxc1aXnVt3WJAthgEbGt2ggsQ+ro/m3+RPipjOgpS3E+CSvhL75tQf8
DGAv09hQCMNm/RARryeXiK4olMny94pEnxyVDVhUV4bzwmmVJSx7Dudyk65kskBwrwRpOd4uB2Wx
ACQYVURh/fqUKEQWaUPV0miRN75wC/lsBtjyLa0bQ9AUsfQBy5iluWjwmUbeoec41MvGvkaeR+r0
o5mpC1iV2Xt+TbjI9AuupN7yLc05wVkWJSd41G+pi4+ciMu4+fVABxuBO/jXAlCRvWQdvqIXGOnf
C2kec2KR5ohDHvxD15hU5okOtWNbCr3v+8gE6MYk2T4q2kbaC76nuq0x8rOj6KjpJ9Fcsuw2kgdz
T4XLkwVHU3va3i6/38AP+KYdJJL4KF92kiXijleTH91DDoZ8BLr6HlNor9dNpPa8tpHrW2rlvI3J
tOZAAe+O8pKK6CFg3VHsvGiWAc/qEtANCmS9QRLJSR+zzWegyhlefKoKdDcEKI2IIJu4HWIGthY6
twQ6L0m2Z6PeR++YGLkxmAX2KdaFimxcqNgbWbBT7M7FjZEGbgYATKD3y1/+8n333bdnz5577733
/PnzFBO+cOECod877rjjne98544dOy5fvlyLABMAxfXw0jPRPl67FU6p2vf02IZ8gdbu4WcfPrV/
2NOrp13xmmbZ40scSgTOPnLrSi5+vDDnhQZeDRrwAUOssAUO1FOXsO9OD4XCe4kX0zL8UzAkwUZ3
apS8V2ZSUuqipL7d8bFffsUqjOVDgHkzcISIsI2WQ63D95Y4hsnuFzawOt0FSUS4EN2lBN6i9tcX
U+HG3sZAM6x21lhu1E/mpmORttwdraMOp3kpJA4vWp0dADQNslnbOQgfgsAsCX9vOYSFmaCkZeU5
58tGX43J4zgxB01BR/qR0LWcoSXYlU8aY1GBmaFGpiqF0Q53MQvozylbtx+7RdFxteDXpvnNHO8z
DX6M564kIqjT8EpT/4bIZH3BgoTmehoa9LAwrlRnl/X/HAnjZY2KfOIumMFdH4hm5fFCd4OBVD29
wozsKvzoBpxshbnPPreB9xhv1AywpQTvELf5pu01DDal1Z5MBHi8TaJYoy/WxTfbaptxaA7o8fNk
3O9NsxxT9yPOozItleI6q76uhpealqq9oYSUuwNjI5QlCmnCS+vr9Qy97Kgf82UB0pzcA2pyw5s9
ko7B8SnQ6Heb9lqPBnIs+s241DudvdbPaFGyqYGbAQD7CPBzzz23e/fuu+++e9euXYR+eyPAepDV
mYPPr3x6OARatDc644rB65no8ClfoH4G1tLSg8/oDmDZ0/v0KeOFjb3M/1Z/fDT/lGvfC3QcVrR7
uNm5iwILDfwUNeAnLPWFHVCHLiTD2UgDlHXCIQLDSJWAGeMl/YZwwJuCpQMi44ioxIo5tMtXOGCJ
qeupWuIHDAzkRGIuPB/n5/UDrpDe0viJfMvET2NkaZ8fcPhAMMR4lbunFofaUASOLzCzgR+TfXgf
D0eO2U0RW87NgkfC0xMMjK0tgloRBJZF0WGRNpSl7aXTuQJf1qBcM6c8ZM6HA7ld7MK89gEDh28R
lQCDOXw2TeB4ZZIWpgBBq5XO2eOuXBkP2ABAIcQxQrx1kap308hbm1jUNKtQxQBRwCflUvS6Ig2U
AEAFM7SbFJdYjzNqNLyEfXDFt32a9xnZ1WDh+UBoOvcxXTfjGn7gTJmFMSrZ6Z6MEkq+fqThFvKP
2pvGuyYrBDq3gW8JR6g+0zTZ2FqzTpObUKmQDmob/qg1UeFZVgCBeBLmp//sQZomprTW2399oOUt
MLL2zraHYpOnG3zT6rz8wK8+c7IzTelbYNpTaEoXLMpmNXAzAOAbEAFW3ex9ig+Bzn+/6JUwoBeG
856F/N6nKBR859PHwleWhlOgG8dLvxLCLWguNNCtAYZT4bhjPRSKciTACBoAr0BidOHIK7mnO4Sl
AC+cprAk7xZmgnISMr9j5GBkjtzOZYn1nKvxm4m/2SMwTdfucq3rtNNY8Z5scAVcDYBWD5HeTEuz
iBpis8BLQHqzMaCF8MQA8qMxVEaakMG9AyMUlpfizBCX5BhaDsdfidRYsw1+hnIBWb2fhzIM8mlb
b8C0w0Y1ViaISC8YKwgejobWo5tlQbKAYfn6kShK47ocwxdVyy5i+ZCSrGyXvhCyEnMW+uiIoGTR
jLDjfO19wdsaEwi3RCKdNJHpCX95x2J0Y/zD42TTm+gnXCIh/zRVjNIpBtacpgMKBt49yrlK5tAg
5oBKxjTjdJaAN1oBFn4GxBTV0lgW7XMPlVZLljQQdUenM+pqpU5e2+2rCBPdyk15pG0sRT7bkvgO
8umqHnxHR51uULBi5o1bZSOsNBO3YBWRcY7Yldz6qL19Mw7GaDIm8b2cpn2OkyQL8Hzrit2dts6G
nn/OeFp9GrAnQJSIu7hzXqlVrBPkF4ulUwyRoGMBOu0Nhpe16owkkCHt4tITLxEJa6Fhe2btloim
AFSwtDd9TravW08AG3HWcD8GkZmWWf9jYVGzQwOveQD881ve1hkBfvvb306FGzqRDbkDAO3QYG+R
bfc9eGd82FVmT+/iTKxehS7Kvao0wFhX8KTgItnOSrFc3lAqby/elcoJ/bqPHI4lII3nniWfn/6S
yS+2mSz0ZYKCEvknNhVTTjgRWngBvOHNweSIwkyQHD4mJBPbgr4UyMmOYSo/4xfwjEkA2cquV2By
/hlU60GkqXsuKV8MdFCY7g7vdnkpDthOVaGvcwWr8ESl5InPrOoqaLzdx+X1Hbm0tHZ81Y4Wg24V
MwtaDqeCIZbOSnDyCqbl2QQL9vLWXKBlmX1guC5biAXo8pZdQcXyV1QkwXnawo27At0V3yrqFnnU
c/L4M6gBTbOTvaDLsGSOf8GTiDzOrLGbzxEhYRQWaxwlVBFDhzDvxBXLO2eR05NyzHlF5s95/FnB
YyM/b2iFa3xJjJb/nWIPEG1DvkiMFqNsR/nMkpdcq1hy9COnk37m3NBSF68fj0VW2j0L4Lse6Wku
b+SFp3zHvZPOsGS7u26c2i/QbYQ6otmHat9PBr2eWmQAKfjpk8QgMWjXgB9KeL71J1LV8KJpjvWo
wvds2tiCBdYNACAwUkUNM7u30mAV7vlQYZc1vBumBxuPSUIcgOFBF82JRHg4YxJNJBxpvvx4NA1E
GvbPAQgQ5TSfqIsC69bAax4A//EfPY4IMG0Aru8B/s53vkOFW5radvgxWof8sMVgW+X77zMCtvAy
H7aFPb30WV8Xcr7y5LGnlzJnRfezWZRcaOBnoQEED+lizIPDnGRVrcKwEABkBCuuB9DijAEt51Ba
YBjCwnr+sBBkr8v2tXJNtG42m9HHkDgFAMYfDVb2grpm27dvPX7kCGHF1aPHd71rJ+eJA8d38UVc
wqoKwoetr2sEQQO4BXD0GBigl2Ud52sDDE4vLe3cvv3kZ1Z33r7d+gJtMWogProb5DfoG1rnysn7
9cCRlcETxRvXBZZNRVh6bTt1QUXRsm4MRjugU5wLDQk5VqydpDMRYfm6aFvPKhMcO0McSYmztyHY
2KAIB5NHTZVagrdBE/982Fa7mDP7/NqRXw76YfpgTBkacGpP/L+RqCOp4js/7d9h4mAqCLEQBwRu
It7YA14X4u2ZVugps04lT5S5qZO8HXoYlkJ0HGiHcVE+lGidDUS1ic00Xm3BsoBKZ7Uca9/qljDA
Hph02FDXmxhpYqxNjyUMVHT1BZrvlWCjbwNqN+na9mZFowdgeNrrfd8jVUuqtzrbIyN6NveRToKU
+VZm+qJ5n5pCbN4hq4qO8ZMF+elUVNxe/PZMS1bhB+P4mZDVQHaaoHOuqqO5iyITNPCaB8DUVoK1
9O/0P/4vOgWa9gDTOVjpHmCU6VKMfAl4AgQen5I1gNnkcCza5/vS6gs4butW+yIwhXxdySG/LKse
JE2HcekW4dbRW13NXhRaaGBDGtAlsgqoBtiD84qJdCgg+JPf3ASC54BnOM2Y2SMRzqziH+GVz3FL
/XTwfPu2rXves2f7thmg2nUO4vGiZiFCNLnkygdWTj13nrDi8RMndm7fKYiO/wGW6y5iReMinR7X
NFICoFuAaApfDUEh3+Ad0vi7+927L7xwcfeu3aFhLiwMgtYuZahkJHIuUFmBIq8JB1ngRn0ro7pi
SwackMqO0QJGxYXNvZIEF/uLY8NYZIaj8pUjqcgRYNUJo1kur/MUPNeAc60QGVaOs8DLtnnrQuhI
eQM6Fc6DSzFXSUf4VPI6nbzIPYoctaxDD+ju1oJaI4ZEisBTNwilq1jdgo2sfQcAJgQAgz3ogkA1
gHGQKsjtHcqs/1cKR0C8kR4i1RU0Gamu4vtayXaZlFeUk4IuU0umL4esRqenSkjxLSwTV9Q1wR6m
BsSqIic3hzmm9jxRZAOpYKA+9EhJsd7OozJlwyh1dDoQ2hpIAYkXaVw/CvdFQ6/NyxpoQx4d3TcE
vD6bw7wXEhvrSLZ2Y7REFgm3JwU6H8JBjHR8ZRGvfyoWWxANPY8wfZ10hIYc6NZ4pYlah3ojrwwK
ewKYNUpOZaLHXj1mJ7020N3Xi4JNDbxhPp9Toc/95drjRw43S7/6Czz++OObfu6NJufL//kfTzzx
xKtf7IWEN0oDTxx/8vc/eiCl9tQX/vYP/+BjN4rLgk6kgTt+41cZZMnLiffXchqbHnVFNJfnV4Ks
od08LI3GPlh9A4W3CFeTwkxBoSCVmtHXlag6oV864k5WSm8+d/7c1WvX5E3DHJSU8F09cvT8hQuX
rl66+l0qML++abb9lq2HlpePHD8qwl8//tjq6hdWd+3cuefdeza/eez0Ly0tr6xsuWXLofctU61r
82snTp68dPUqBXVPnju3f/duQoNrp05u37IFEPfEP568+PWLQpbR45a3zo4cOHTkM8ePP3rk+BdO
4BlLseVT587t2b2bpF37x1MXvn6BWNKaZ7pFBU6eOnn+hUtE/+jnV4kp1cUL8viRo6tfOEER7D27
dkPIQ4+uUC0C9vt379nzbs1cPrKCBoiaDOwKupPgMEkg+YqEgdL11CsHj3mps0SAmVZY4SzxfGTK
aduIz3MHSQhXXvNz7iypyoV0n7DJA+7xBXvg0D2WcAv94ZIl1oziKdQvuan/kdJUwQImSZGJENm9
dSf9XV5eZgnd7twsvWKmgfkp1TzknlLPlc0i4RYt729ZIM43f7IeIgRujmnJQ21JOO1+NwgpkUV7
m0g4ro7WeYP0OdPawKV7BTAuHuFngXdVhhIMaEOgiOwG9N/b5FJDJrL2hj25mV6G7o7OKpkorcfe
IgGmG1haY7IS0hE9sQtKMrQVkmXdPfNSH/vp6PMPSdRNcwaaXgkeAHf3ke8IQ+lR7Yd/9+FueouC
vRr41J/9BeDAzRAB9o0muItgL/4t0G+vRSzKLTSwEQ2ED9tsxsd1wtdrNa4o2251QlSAkyBVztSE
enXhw7YMqxgacdRRsNhmWiwtRzERHN31rl3YiUrQly65q8HfEMPkV9vqiROzt245sH/5xDFaAr2H
APPVq5eo/M6duwhXbd+689r3rxGFPbv3EPhcfnTlwMqh5UcPUc0Dj3JiRjHk5WWC0MuPrZw8dYpA
qSLM69cPHT1y4uTayvKBaz+8fuDYkdWTawfesxygG/+XwOrJ585Rgv5SKNj0Or9+/cBRLr/8nv0A
pQeI76MrlLP/PcszKXft6lUSbOfOnfR23L51Kws5v0ZA9+S5U4RyqbAyenmJsDRlEhImSJwJP8pW
XswLkIYCuFRFDehXwrlEk3oNB3Hh+CvZs40c0i5lcyZTIt3JV5RCDrbvYrKDa1PpWTjqjH5KoyhH
xXDhXGzNEkHUk0DLdMuW1qBV7sNdD49NqUnCwjW4Y7GLXBDDu6ojQuV4Qi8OR2OSDcbe6aH0ZGeU
O8hJ2u14rRPfQoGmyShR7oRX/E7arb5/y3MlJYVPC7+kLnh1dsaYWo9P7nfQb84BtQqUomHF/vIR
VxSKzK9TsMAAdphFGr0209n12Ibjjj6arHML9iIRTXz0dEdvkwoPMa9tDwW9BqosvOGhoOkfTyfY
gw/FY9J59OxCw+25On2GK7X/ktTxMPT2HJmiiTTl6RSZhJlilICvwlaKNVJRR5gk1hFR7yTNa3YE
usar3Tpi3Ua0qNjUwM0GgJsNXhRYaGChgVdGA4ayxFcYvlMr711lOWAYhj5Y7ovltUNkg17AM8Zs
L1/fesuW5T376S9qb3nrll3v3ilLc69f+/783PlTHJlU10QChsP7ckbQce0f1o7QFuDPHD2wfz/X
37REUHb/vbspSTHVU+cJo24+8Q8nCaOuHTu+f89+e8fzWuvN17du4YjxyeOrKx85tGWLynD+n85T
sUuXLhE1pC9eujR786jtu9+1a+UDByjkS3/3vGuXrnZe0vJUl8qTIiiSvPrYUSp29NAKBY3n0kYq
fPIfOcgsQu6iEDcJw0K+a9faURJyj/Ud4XbKPDHONC9tCIlrSJbrAcOjOzBrIB8Klrg9axI7s7Hj
mvWP5dByV6YwEJkXvMyOFC+c5qkKnvIIPUwAee5cZDRKm4YTvwdAa+KMNwAzC7mlZEO3riPs4P02
U5xLmL8VO16p35+rPsrLiWd+j6c/DWs1+bYwjxGIHKwSHtD8pgaaBZqSNwukKvVMPSZhS66tBI4a
i5/9frlKOnpMSV6fEl6p3q/oZ6zbyP/2+NPPwmQsszn90TEqU0vryWlax1Ag2/XJ118nEETRUttb
nd4c4G0o3hzUJbWPK2YlSWdhvA2wbEJkJGRu9rBfn7U4asFQY+I29DYmSVNmVUWYPclPOXVPOxq7
7IvGHsiRPQy91jSDZnsWBaoaWADghYEsNLDQwMY1AFCkKEkWr86UaPhejqyk1aOD+f0aljfjtGEs
aRYAhu/uXN+6devuXbvoDUQ4cPZWPvVKoqmMtWjN8Pnz53XBLcjSl5N0qw+fZkw/Dxw4QICZqm+9
ZSuz428sbaZo6tWrV3fvpMXLW65eukRfVLp44eKR1ePHP398/72CLcltevMWFoMixteunvjSyQNH
jnB8OIReAfUMuglW1Au3du/cdem7V6kKalF6D8ec+QrakfSmJcL2tLL6wGMrJ9ZODHdfXqIV1xQG
piAwyX/xylWqdeHixaMnVo+fWKVlz9ZV5ynz85xJQexZmKQnpQNvz7kJzHDAphK+NWktjWOxUQUX
a19wL1oqad1RzD/Z3US7sdSZu4+PEeN8bqh0X5jPljXwYQcyZwtx8JoPQRVl66SDFLhehmgmZsg3
XZQSw6xKKJE4juncfJ5YyevtAACmDVGOtXEUeCk2pY5AWgg/S7bufxfd9zoc5W4SbjfQaTNSoLyx
LmgaS1cBk8E3M+2jAi2vW98LbURUN7M+I0yFSv3ydu/7Xm5BQXAMT+YhHusHQhMuxmJ7m+8Yzl63
2Zhnrd99z/qG9xl5cX4tsOxqezrGK2ovWEKpozOGlxL3OcCf0+0NAqT6b6pIVRU9CpBbiQ+XByDQ
OCQB3LWEVWrPBPnYL6qZeUTKqZpKZTKi/UzoemAtCtU0sADAC/tYaGChgY1qQIGQfiSWl8Vi7RC/
9BT04lwliS3yGwJ3efmrHIili6Llhr6TCDpek92zRGT3u2W/K2amf3j93PnztJxYABj2oHIppig7
UTnz+uZLL1w68pFDFL+l0C5FUHkRtbyZaBPv8vsOnP+nC7LBdLb2+dWTqyeOHDpC+YTczl04v3r0
KOUQ49Uvre1+104KDtPWXIrTGvyiBIsll6E0w2R73r3r3D+dN5RD6d3v3oWfKDOTvxQmpejuyoED
Jx47Ptuy1e7CvTj53KlD+5fPyz5hjgmTAMdXj3yEjvU6Z6dnUQ5JhUyWR17JRBY7eImLfLsIIHYA
lvLTZOcEs6A/m67Lp6E4g6PBjGAZuCLGjm29XEwOi+Zd3IJsBRszPBaIa6FgmcjwSC+soBYi3EGi
BN00HvwYFllFU4Ctv6Q1dmS0pHsuOGpRxGDsjsD7YeUj4U7uVQ4l/Jm6NVVHxzw/8DLxo1Bkpll1
Zzd10IlEzj31ApgzmmFXaVfpVqRhz92lRz6l5Hd5/17EtCvXC7kjDUxGfYYBbIYFliPypFMqzUmW
hipgxrg8Aq9PjjjVRfQjswcAgOTT3G4vQAsTGuSwBGygi2OKwaiy2YMkNJ62ebSv28ObIuBJx0s2
B52Ovliv4UUjrth2L8C4mUyhW+1ZU4z0j14YLCS0jj+f69trDffW2PMcHo8Ib2ne3opRUGMRIUzr
BRTwWqpKFZmEx8PRymfWiTc8pKOcaAyOlWPPBJPImgmd24NolBC1T3489vXFopTXwE11CNYnPvGJ
Ycm+tPKNb3zjT37ykyeffHLR668TDSwOwfqZdPQde+8RvoxusLZWV8/KOUkBO83DXSwYFjQlOI0/
FyzvsM2IJcrF/9m8mRYDy+FPCiHpNi1dJgyM07MEm3HIkdHaELEUOnh7MTZjvrLKmtMEelc+sHzi
S2sBCkoAk4WcyZJsfKlYPjgsHyLmAOYmriUyAy7qX5Mzyo/KqOiurmrKVBb6LIjEvw994AAhcKtL
MV4GtziPyntgWYfM+2ejVzJEGy50hChwIK5pVTqjXNFG6APrOO4y6UpZDu3m47kdwclG7+NCxDhc
3oMxsIqb1qg2znQEfcPEnEZ0nB7sECx1mpOduhGlzE+HfNqFpYR5Wp6pQZFOIqNiXjlTvFKThLtk
3WeA+X5El3md+5y0bVOkVXsAkdRmosxuPZof3F0jWGa2mdOoTDz7yhOPhkaEClpipK22CaBW1eS+
f/JM7IUu0JsVKDsX0C16b6dH9jlRySaOH1y9rKO2mCRRYqJI6TBfZxd4MSaqHcUjPURPxTbJyADS
qagyCc96ZPbp4yibU3q+1ZH5WJ5SR/h5WHtBUGJxCFbbJKaXuNkOwfqTP33izz775+/5rf/63x57
3P879NGP3fXuu4//j08RNp6upUWNhQYWGujUAIKxjEYEwc4k3kuTyIKFLFCKM58VhEkUkaOUoYB+
5Ujvc8nr1899/YIsaZYfFDX9J0a/Mt8/+NwjSMdxy3CeU+Ble4zXVtfWjh+nxcOM8ULLRAYWmNAv
52nMU9G14LoR+oV8EvOcR/DLY12QtxyvRwPMJrlPUFyXDu66cPGC7sUS5KkCB6eTkTCBT/takg+O
SRl2LMBSz3BWHXoxgvCyNddfQzeha6QdrHBFuVxRzseaSdRL24ggUkC58kZHQzmb/hNUobvD52E5
tDAICmATCpt+w2lbTrQQlBjLm/+FRqV/Q+kNYT8zP1NdpMNEJj/3bzcnTPOn4T5rnedVEMMziuJC
63SFjampItJ2VqqSujwRVEw1HLV3iubRRvprCfwEq3YA1kSiRBR6Qo5drUDotK6vTAD5ju62vai9
FoA1DeRVkfLyw8orJzcUIwOLZp0mDIEO9Jsas8/p5RVNLVkDuzs3UoO3uqy9FQWziTYbEd78Wv2e
NTYbBbm+yuV5Ln7ir0MbHst50hbw3OjDJ/sUqjZsFO5GydCQURg8IhJFmKOHT3enRM/hirneMM30
dvPrsdxrfgn0pW9ffuLYf3/ooYceeOCBd7zjHdSHv/gLb7N/b3nLW+666673vve9+x94L2FgKvx6
7ORFmxcaeOU1wBtxCS5xMBBnOEtkVb+UwycqcbRQwowCnwCWqIyug5UQItYzI5yIPajX59+/Rl8M
YvR7ndDv+esUixX6HAXl3cX8P8QVBcVxDm33xUHTQkrvklT0b3nlEO/LfeGChItZvOub5rxXVkqK
SMC9tD2VJeTqxJLj0tIuKSKk8CNASPn4MF1zVJG7AH9IoGgAeZqehcJGBWu8+Wjox45ceOGSxrcF
5WpdfAwZnzWSYDWTRaYABgnnInF9Fl7SFD0OcXVmhaXglJrrgmT+xXR05bNsHuZZgLA3G34n/aOF
7SgjBLh3EN2VDzszaTsZC5oSNIvCAncBp8MaAdsxLiWpgIBVpmlLSbkjhBL+A86sUi4JhK+dIv2u
2qbCmjYkryddc8WhF8JmMBFVszXh0OYox080oEwWl6q0w39K+DPmm1QcMrJ4D46XRyNZV4zNw9o9
4D1zQzMaMMZpA0s5kY9oyjHcYgkrmfrWnq9nhCqp/ju6IEJ3pSBMRvcQz1QaNdz3iN1yLfKdGyFw
r3A25bAGYQSESrAzFbTSR1I4qwFDv7XeLxmkGX80CnLlU0YW90sReJ5h1BEo5O3NLYE2CkB6YJHq
36tFq6R40kPu1AwKyilBF+uFOkpnqim+svba0ziyfAdH06eKzzEEmCZUJ3hB2ALg6CEDAfDYcUyz
yrDAJu42H3e1GYpIJ93g3wRLLSHSwPBksBXI6VPXN9w/x6ovgmyPR1B8NDG0WAJdevLc0PzXPAD+
3JOrhH7f9KY3bdq06cc//jFB34v//C9rz/zNX/31FylBPymT4lB0oA5Fg6nwDdXegthCAwsNQAMS
G9QIsLwXCbMgBijw8jqlEQgGBhJoxFn8CsESaCnJnroAG6AvgZN0ItSFi5fOff38/PtX9cM8GgEm
yjOBwRKPZRzIYgyHP+GLPnKspZDFUVuCxPjFNhOsyCufBTECVvH5z0QWq7L532YO/yrCxFs8gDq3
uFfK4GaAvsN7N6RQRoGIYVoHjAe/J5RE+RkoQE5ZdSwNUYEJ6M55NxEKqAAsRvCqB6AohznP5VUt
ZE1awFQDh/JL5iDExUFfACFbTJh7B3MBUkJhsPDVBvPK6gBTpbBWDwuhoWCuyrfcOVvqVyluZyIy
+wD9cXmWj51a0/HotqrLtUh1nnhsKfDQHOf3xDkDz3Gq6pCVPL8UmZTIj/KhYUMFsI0KCsr5qc1A
kMqcdQGzUvqSkTbSn1mwYWThZUYIMMrsFyyR1rqj5nBDq7gM/JjaS5mOl0d3KSMPC63SyFH2vZbF
mRUd5qzREy+lY1V5G0s73fpoIhqpTwdkjCuLLjz3FLHII8WrvQ07o2FSalSrsSWjKgHjriGPQmCd
qn08WBpWnRsOowcUXhD+qwr+8eKHQEsVEaupgtUswSukW4MwCQDd7MyITXdaYvSY7WHk30pu2hFV
szaQUUt6GkUP60WZiRp4zQNgai992/Pll8kbuk5///Xf/n3nf/mlAw//3oc/9EFKXH7pCmXiOnPm
TEk5Zx95w3A9chbFODOkreKVJ+9yRSl515NX9GaWiFFyBZPyA43A13h4YQbGroITaExmoiEsii80
sGENCApVlIdnukAdRR8S3kSBELYTZIVYokBoei0BFAFQCWQVhHzp6qX5tTlTQwRPD75CqFnQKU9X
S9RXdwWHN41FnrnWjJuI8KZgRazvBS+OTCqumIlUQjm4RILB6MUp4eKXGe6KnCSSQi8DcwHmAw9r
+5EeXYnrwKKEfbYgS+IC9inSQ9MsVskeHquCAC1lQi1AxaEhqvkBSEhz0EPWCy6BLpNwbthiLTnD
J63YdQCO1c8FY4pBo/08a2AfTBIW1AQmKo3FxMFMmavi+UYKz8JqaqoehGe5hAILMBNb4rsCsKl3
JM2Z89CnaCbyaY5AWx3BKueRdLmnSfURSFMZGv9JUTfLPf4IZI2EgbE0MairRiBqaRMJF2k1IWiP
uiKUGzXBPP4+3UalDGipcSRK7u10WKmhwW6/P4t7TcgJeCBCPhO1YdYVmVnWFEe007GZTr60hAHe
gJlNaHKWbDozUuDuEV2EhFvyjqeW5KHKlyVgDLhyU0sl+nVjyKvda9vYdXMvTvC1VZBEofueLX6g
Ubr+WDN7GMHvUr9nW90z69fqo0a/RF0QdXr6DHTyZ/UfNTY7EUY0NjpSerr4dV/mZgDAJ//+7z7z
6U/94Ac/IJT7ox/9iECv/eMx+/LL3/ve96jA5W9fynU3I8h9S2forCxcZ3ZcDpC2YB0Hh8I/+cnX
Dm+jYiUigKfHdqwejGjRjX0vrL7EDF9aXVq5VYFuTZg7UVwrKNo9++kXHwuC325kXvdmvVDAT1kD
DH2x4Jk/aMS4S5Y3i8cTPpkjCE0QL9xQ/MVrFWFbXpCMFdEakBSghdXU3CC5G9Yqo5bQxHHHErFE
RY4ZCqCVCIAcZyVYWu7KMdGyK1hI6duRoOw8gpcMtXSFNh8TJYuiFTkCOYd1xcwyoErFkAzXxn0g
OG1Ay1J9+InqFtJkoEinXgkF0AFjLhNW83IQWNSCVmBhM1/aIncqlfMATCpprNYIicBK4vDSBKZN
ap9Jmpeva+AaC8ItAox5DVaRRnfDxuB5wAyBL7A0fiG0y5ZAmdwpIC6QnokLxmZ4H5qPWkJhMwW9
JdQsv/Q/XBuaRy64EwXL4d9eG27lMxyOYeIfdNMcVC8Bg1Ar+q/3hDzoMoQ2wd3x6GtjYFhnqcaB
skILXHal7aacitNpMDLiRFWsOdAw/qXF2iJqCWugrzEZhnklEyGPiKqS1N363liQ5+jZ1ZUz1lvk
iHe64KPGRQg86pcqxohibkS219qz6MIa7jXggJBH+1nsPYF7xCKaAfHmWrWEiKP9jG2gNKNUUq/H
5NNN0c98jST0zQQLvGuckpVbQbDSxEpq870Tf17V2QdIqooCNI1MwoyTWxTWEQyH6fqHbarhKTqx
t0k6GDPqqvPtfgAuCtY1cDMA4Pf99oN79933zNoXV//8s/Tv2+5CDt365Xf9Cv3L6OLK6Wefv3P1
k3vt1t7DAmknXUUi2w5/jeDp1w7fFpE7++mV5w8+BkbbDj+zeufTpzju3CeMVHj+2dOM0/c+9VQQ
fe/+g0sgs7gWGvgpa0C/AEwIQg5nUkyLo5h4RXEQh9O6WPc6rV4GpsU5WJvmXIgwUagu234VUMlS
W4E3wEjhgCUAUeAjQXGSkIgoS8KY1pZGy8pqBVoAh5RDotIWXw1pClQGqMNiaapOUjFa1mAxw6E5
o02ipeuBgbgQnIQ0TFYSjKj5CsdTY/8zA8cgNH6iAPKxfpgSBN4U+IWNviBFglE+hTRZsoAZwAib
gUNMEltq+SfjzJC2KPoMypdLQKamDZ1KA2WmQKcqqD848IsugKJE7NH+YRZjIGGAGdS5QUDOUJSn
QDaAORE9Npx7kA0DYs0R4mYSQkEOKuN8JUjzFwNfSoKyajtME2h3ON9Cp0icR66+yLgM1LiRqwS6
en3xHt7d7mmWWCpJUbaKKkq3vKOcOs3ZWrDk9NZ6OyILOHv0qmXM7Y5QeplEv0qLUDny9StACGIU
nP5URvj9yM9opqT5CHV7dlUM3NRz3tiyJm2yeSGdJB5OpFM8vuFFqcDXuJdMbqIptuOcTTVFvVx4
LqUdWpoBMYajKl7tpgoz+xSLGpWCDdjTz563qIGfjedMtpeNY8fzITvdA742BWDznvEEqG9RNBg7
O2tisViSidUXxSdp4GYAwF/96le/8Y1vfOjDH3n4wAeX3/87Z8+ctn979u679zd+855f+/XvypVR
zbbbbl96/sWXJiktKTyVyJXLLywd3G+gm6sLdJ1KJxHkzh23bqwli9oLDaxLA1gtHN5VgrI4vsce
lmQq5OPfEp4lGMmvEwkXS8LQylBSMSofvSSk5NBjATWKdcPLTzAVAI8wwGHFHCumxcxCTz5oxFzk
wGegRIVbVIkZCdLWo7monGwMZnA1ExQqbOV8aWwPZnGklvDFquARrOXKsvwWGgASEyw6ugySoTo3
QRpl6mA6gnUJ8aIwswwFhhCu3OKmioeqah/cOEwH4JbORwi1II52wVi4EEclshySpTIc4OU4vygQ
dbVlIMU/ANEB46UtLJUKD3VxXFd6Ba1EClKh4yxTF6VzOfelIrUBRIbl9C8LxUvH2AV2AuNjxQvT
cDKwylDBA14xsLosQoj1N/odsfP3umBwCgYgBq5u5GN8DQn4QFC2BW3oGLmhXjkQO/ViS55rhD2q
KvU3S8El62iPAaLCfKsCZszxjcp0Q76u/q20NGtsHRaYIi4fHeXxVvoAmAFda3KUE4EBD4pyDYkY
ARF58DPZxtZlGI2OqI8mfgCOxxr96rOBjL1l5c8C/vThk30UoBgevNXvupXgaFGjqQ2UioaSWcyJ
Stlxmu99fekEJcMCrRdce7XhiU3iyWZAN5vI6yr7NEh73x68lUmBsa7sqZudgbKuaXZit/kvCtY0
cDMA4Hvuuef+++8/ffr0uXPnvvKVrzy0/H6KCd+//wFCv9/85je/9a1vvfjii7fddtstt9yS08Te
T1L8dV+6RXeS3Uwk8tKLz4+g6q077gS7CXRuv23bSMSzj+x7OgSVJ8m+KLzQwMY1gBOJ3PbUAI0E
jwzgLQA9ObxK4AphHgU8DBQBYfk7Rgqo9N1G/3HbgwNy4v8y6OKXIpAYI6iwwjmAHgFIfI/faoy+
GIDpHlfGSA6eBSJ8jrRGL1kOxYeUnAPxXqftxCM0O0R9gy7nAF3SNqrF1wD4QiHjJ3IoHERiKCzv
XV836GsA1SivF0LH4YgsyOCqW+2h18PC5ojRUHI2BvBOQmGr66JVyQhiS/Nlip3BrYmgEWDh7dsR
EIiomuVXWZyQkgPWBMjnOPhaLhIvXIDWSsDkFPmh49HlHTV4QuaCxD5ZyTe1/AqCirjKTzhnhoon
AIAS1o38vxxTnxc5WykMrkBKpVPx11NgEBX2BXw6VWMfxsiGWw3vQeASMOBiWS5ZmNeaa8jCzgkd
7Tspkqri/ee6O4r7pUUi/bRMJrnfrQpfMwq+9TLNGowzqibat0HX5pg1hizIz4369lhuSxBKlJ4q
pUExLl/SScq/NgeEhoMyEq0hWRtouSdw0VAro7KkQ2eTNsNSizP394WVzM4K5UzRaniTiF40lefS
OkRbVJmkgZsBABPo/fKXv3zfffft2bPn3nvvPX/+PMWEL1y4QOj3jjvueOc737ljx47Lly/nI8C8
BPlr2Ic7OtKqokWCy3aFg6cmE0novyBbj3vonH3kVlpAHQLI4eytYzte+okth55kA4vCCw3cCA3w
CyBAGuyYxTpVxhXAk4Af8lfQcojLoSRjYUXRcjIWH4KlK5kFPvEy6SGWiAitkNNV0wKnDc3yXaKJ
M7TAfYgThnXUIopg5kBcVgLPJdKLUPVcCjB35iUrcoHN5DfvUyUujCVofTCE5HpCISBPQd3gpAjM
gJllBrL6PSFfQOPnQJU2xQ4Aj5euHXzlMLlMCgxeCyqKAAoCQ1dp19tP6S30E06Z4ukDOD2izBA5
H/GyM6iYA/9fvqJEsxjmV1lk282GMCJFF5DqhGmITsu2bTlSyzDrdUK8QZMcz0cvMAkFk9JzIROa
9mVce9E+hUMbjc6p/jb6H/OK1kmojiHXSTSuFutqIuYfkfNOZMQngjoTgX2prX66YT36yDY2l/kq
sahsG72ZmZwjwJa2yMAPUTQU1KfBPItQ1yuqS2mGvswkXCIFURbx4ydFmJxNsdDAujJr49ubzvtM
1Ea7uO8FDz5RM80ZUywhcJvviICxRiMrsDadiGm3YTSZ2NW/juZQPou9szopKCGa5URjG7Mwflqz
9Pzpm4OI9FSfHMmGhTs0vSiyTg3cDADYR4Cfe+653bt333333bt27SL02xEBFsVhr+6Zg88TDE5O
fo5V6w/BwhlYuCYRSfpriOgW6LBscsnpWcPW36dwCNYzSw/7M6nXaQ+LagsNbEwDDLpkVTPhIPk8
LCMRbPdlSCLITr6BhEycAi0lLR/IRM7Kkk8Hay0Bt2GhLPZ4AuHwcmslj8XPQIa0uVdW/OLbSFg3
K22Tw7oEbiuOlQ/qCnEgVVr/LP+1z/AI+uX/s5zAbIIkCfXyF54omk1bnSWarcBM0mH9LaBXYK+b
mQMRaESjk5zGUc+hzcwoLGlGvjbQwWmoBYhXuaiitCsBXFWPwbXiCCr0p83Bf0NL8Yt3aIvG6I9E
XOk2PrnES50FG9NfdAZCrNIuPjNM1znrDIh8B0s/fKXNdXME3DLpDjmxDG3El7Fk7TqCyUD7M1WP
WgLVknxZCKArq8MyAs2RhetBMJCyVnPbwsnApYQWNpc0QghZwOAZjNPZoIT5PV1uYtb/th73ibIY
2unjVd/e/WpVHd9PlVPJsaolNJUiLjG/tNd6ctLIdr5p2X6EqlO4paOjoaQswCsGu7LEslIVdFvx
rT0GiCL/MdvIrQ+PDi0WZtxGPzFgy5dx9ImsBRZpeBCSWniqJTeujWbKPZJhsDGv4ezI8oYxbaiM
SqfjXXP8GE/T6RNgnMNEkh7JRoNr826RmeEV2XdVHqogEDW8FqmGBaIXTIaWBpgFvZExN20JdxR5
9FioPXhT27bezz6pktb59qYQN8qZ9nzo645FqZIGbgYAvMEI8KCavU9RKPjOp4/Zl43WYzedREb7
jmlJdMIqoWOnQOvJ01ENgs0M4D+9OAVrPb22qLNRDQgOCmhTI5P8egjgjl/JAXjg+GVc7sM/Anr5
DuCWeifhv8BLChX1E8ECu+R9ClLhJyKl2KrqEI+c2ySncOme2LBlVMUJkBgnV48OlNIS2FesLHkV
tPCeA9oJqhaUrvkqrhSnMiPgBYLQWiAYJ9AeRDuB2wb0FoEH56WhGF+RDsd+/CyoyyPCEIlVSdgv
iYGHfnKJxeZbAn1DezmTpzx4PbyswdZt1TIvYCW19yGkcBesi/bhqG2Z0dAV8qyBAIyxBh3t0+Cw
FB7WYPOtMWUIyQhZaBavbASpXDy5k8WlSSnveKVuXxe7Erb0IAEdMfGqRydYfQEwTyQ8Lp4FdWOL
bdIvIgdXs2s2wcqX3FyvyQj2tPCAjzr6FiG/S5l1oxrLXGlvBMXTAGBT4cNzIGtXBVUYEDL6ikn8
iett3s6YI0DeMZytiA8I5+tFTTPQhdIeAUZjbUyuiWEqAz+2iiqjgW3hmRD1u82++e4oqjALMvv0
X3qWRg3vGgKRfP2PNTnSmSVxxhlpwORcjyRmFVGias/p9NP6WfcMnEWZqgZe8wD457e8rTMC/Pa3
v50KN+xhw8dQMf0mET6wGUue5YrOxDIRm3QWxr3QwKtFA4SU5iQLwAkjH9kQyhkEPQQpKTCRkK+u
qmXheZmrLYsFHAzBQEA5oGLGSMClfOETOIjQGpzWr/sKBXlNKg6EVMoFwuCwJZVW2A2XLjOWsDAk
0XOP2R/iTwFzfa7LCSHLGExrXZ+FULPhSkSVdRW0gTG5DY2N2OOng3DJT3mdaxl4A+E4KG6RLY22
Pcz69WCoSyT3yrEDukT1ChTVY1BtoxvwQxIDHFWoj46Qw7pYBppyF/Uy6AV9KSDr4YMqHKqX/hDi
WkvAsx4PLn0kUXeeYpCTt8NUgM0dmKkpljbjMxtAF487wvf5gEaK7kgfvh0Rbf3IRgh9pcm+UTot
AnJjfFKB+tNAY6uBo/sVhGnl+r3bAuvJGsvSSeFEpMOqnKkMUbjJeK5T2jDqB9n79Oad70bXhVk8
LeaRP25FcwF9lnCDraswJE3bHmzz8O+fvkmRcN1OWtY4ueH1uRV/t6/rvYApDC72nplBmqj3+Lhr
SjNBRqOmH7M3JOwRl85GjXM82EaTbeLJBkLRJEzD1pA0p8/mS6WyD3+fOcFcNybJ67n2ax4A//Ef
PY4IMG0Aru8B/s53vkOF486mL++6Nc9Xnjz2tD+fudM0JhMhBPz8ysOINF958uGVJXyIaTKds48M
wvMpWKMPOnUKvyi20MDGNcBwZaZk2D3CclQO4gkwBsAJQVx8SWjAffQzgCzFRURtHsCwwBkORcoX
lfBdHCBqDS+H+CHBJF0CrV8PZrwUKJ/8/AkRglkzEML6amA5/fASPv7HkggdwDwqQ99JkqoaARCg
KEAuxGZ58TYaQGILPlOIiLCwVKabc13Kyz9IJxyWFH5UhfEs5g4A7/AP1YLuRDKIodocQs1EDhLO
4JuGrbMzmQugTIBeJhXiGLqNFmBYZyjA0FgModpZAPBE0AKw2p1hCoC5Q30yHaD9Jz9VUfqxJW4T
6xwm4vG/YXvrX+willYwTZZWpMJeaxVbl0kztleEzL0Q9ElqZwJBk3wLVzQZb9GqfHwmBUWRk5pF
TYGX/de8T+/fmHMWFR/5hRUAaYgInWuOoHNDU9fKM43aXvK9NhQwSX36npzQU5Fm0j7Kdp/39StO
dhQmihUIOU23YQSVYuzp/IIYsNldYhOVjAoU9xgVAycBeJGWrMchTA0GUBu9vcGofMNNJ9XWGCNf
CmJ0wTDffI9/QK4w4oxyxKIy7xM3wvc4ut6zm9KB9qjxHZQaQ5yTDmHf5KhrvDz6PJdnXsEkStMx
mWaZGUT2UEDdg73R2wyS4J3qvrkFLlF7a0A0K0M6BpOczMpnWQvt5VEx0geR6aL0jEotpEJk3Bel
Z1fUX+t8Ykw3ztdzjdc8AKbOI1hL/07/4/+iU6BpDzCdg5XuAUaZTE9TlNUdanXryu1n/FFSufOu
lnzmG2TLcJmIHlG17+kl3cKrp2bRAuczt2NTL/PUrcR1YTLS37rjBTuRi7cG+y3Jr2ezXrT9p60B
XhscsBN7VwrWRlsu6d1DmI/fZ7R4WDaFBgQ7gGHauIu6suqVXwn8fwnY4iQqPcvq+my2RZEhv2uB
plCRAdLJz6+dXD2xduLE2uoJSlP+gY8f4ohuICvo1/Akv62pejimCwt3sbmURSbwTNT4nyTWjq/a
tlKGVSKbRDjR8IA29UNQ2A88ky8qyV2mOmP8LKgMMJjfyg70qv8S9AhRFcKNNwlzyfDqHcpAKnwr
WNCvnUHF5dEu8xjCV4u8zYAXVceloNfAqjglEpuVhAThwR0V5R/2A4OXeB7swiImLJ+/CqBUOyIU
ZnWIwNpeUZF6zJInu505If0F9Urf45iuMLOgfaGLn2EcLJdJxUUdZpjgH3tNOf1rdsE7VFWEk589
967J/gpcxC1DRJFzhi4ooyNrTVOMHiKRbm7IzwpgiHotci69r19pHd9Ke80GCNoAEJjAzs4G5mdV
mpWrthTVrmvJNz8Fxg1BpoiRksrOm3TBMOMLFGSwsAU2vAzNeYFM26P2GruJeoh6pAJp8sZp7Prn
2qRkHTt1TT2UDAK9UND/aDA6SSrTVesxvGwv5B6P8VRIWBRt8y/NJ15RPDNFezi0xnJ2XqxVaXH/
ldXAG+bzOXH43F+uPX7k8CvL6qdC/fHHH9/0c280Vi//53888cQTPxXOCyavCg08cfzJ3//ogVSU
p77wt3/4Bx97VYh4Mwpxx2/8qm9WBGkYishRzHzp65MxrSzHBR4BhrEQrmJdgYiaNvqUuXX71l07
d124cP7S1WvCC1gJh2ZpZJXKE15d/vghfPsX2E1QmbAWZBi8XgSTw6eDgmDMfSgD/tdXDqycv3jh
4gsXNBYNxBVOyWI5GAwTwqdIo6zT1ubpNlRpLfMKwuhvCTXrZaFgSZDkWiE0MswujOGxIkBz03E0
NEiKzpk1kLBIRbfmgQLx0HRYOK0VXWHtJ/n+EOFMokNVZlhWHZTJteT07DQIia4EChUV6WJs12rf
TM6W8qEWy0wq4noucoWjxVFGDwkXPVhFC/yaiTCXPdt2Ebnl5WUfEEjDYlGOdo/5f0h4J3Wif6xm
EMIj3m1FG62lwTS6/2v+WZ9IPjY4SScTJGTD0Hi+1oo06RtXdrLrKoiEn+bgWm9mE2EclQRwZjlu
psw+ZGOhvd3pn5ze864o0JGOuJf6OiOM8aV79mBp6SHbqJIMvRqwcqWumdLeCUw31mpj1GuHdQvs
HhSdplh54qnkuam0CdoLRf2o5Oe4e+KVbg1cSjrplq2kjaFT4rd8bh2NF8MPgXQMugedN4Dm+yWr
iod/9+F1KHxRpa6BT/3ZXwAO3AwRYN9UgrsI9uLfAv0uRsJCAz9FDQicwQZdwZkCDwT1RO8PWdWs
xUKsUaDpXKOMwGyy8lmrc/CWw8Jbt27Z9S4GMLvfvXvrLVvltcHQSKK7CCwjeMuQjQVi1tcJDFNy
7fNr+/fsoRDu6rHVXTt3Lu/Zv3Zsde3YiV27dhKF2ZYtRx89cvIzJ44/dnT7LduZsn31R6KbKx84
dPHSpYsXL5IkW7dsPfro0bXjJ46uHN96C4ejKdq8/949J46dWDt6fPeu3VRh61u3HP/4kZPHTxw/
cnz71q3oCGz9RYCUaiEOLAukGfIBJQqK41vAhwo+xx0ZykguMC2WOgPrBoWDC6KjSGAmgnDsTIpR
JmNawE/bTgzVKXwaoqYEqgn0ikj86SNG/kINYVje60urwQPARphdIuTSiVyAe2oQSRaZS+sQkOdw
riREGYZssX9YshQZQlGKfgPOl6OzRB1QW2CqP8B3iEtzCbcWtOmlCZnkgh/m4w+WLsRJQMLHYUqx
u3wkxzBtJQGR+tAvK3Z8HHSaQwXqTnxKwROJVBSvPETn+hh1miNKa8oJ3aJYTeC0ayrIKnK1U7WH
DrWejaykGQnMdzTxTe2qw9IiLXm8kVXLhFmM/BhoWFqK/22slehpfn0oiX7SXq7HPzH08nyz7FLD
oMp9IyuSLY0BxpLwU1qfwzpk/HyHCV2wwIYyk9s2qNOEltU3eAi/1x845eFZCn6mfac53sg75/IK
sun7AsdBj0+BHiwh7c16/2bvOuPJPs+j94uNRBueU7tvUX7jGrjZAPDGNbKgsNDAQgPTNeBcCjs6
GA6c3TE/kp/9Ak44Zy77e2fMkdAvJfjLurJzWL7lsHkmJbHIefP1rVu379q1G37htWvXrl67CoxI
yIqDyVRMdh8BFXM+6qpvLW7x9fmhR4+c+NLqyoFD8x/ODxw9svql1QP7DxD0Wlk+cP6fzi8fObT2
DycPfeCABE7lK0e8i3Xz8v7la9+fn79wnl+cS0uHDhw4f+HcgccOnf/6+UPLhwC8iPiBx5jg8nuW
qdah5QPnmOCBk6dOHnofsZAyAjwR5hXEy/RwuDSWggMHAscGPMfF8A9BV2myYl1uaigMDKzIT4pR
eh4K6ALO8N1gwr0CWXXlsBU29w6MghT6I6wClZvDedrSm1BwAKvcGaDPYXnEja/zV5TYbRXkLHiY
sPdc2wRe6DjWhsR1w/JUJqsHklEJaaPaVpATswm6Gh9KkJKqZJZNw8ihYW5LWMU9HTk0qZcMF7nl
HQb1DawNp3lHMIskR3WzAqCESVLF3pEklZ910Jut6HXVBH6eQmkWIFsmCqhOlrPi8lpIx1TaTBQ0
aC2Kpg+Kfn9Kx8tp6Vbn1i3Zz7wYw7wCzaoNBGbxGAwvuaJpiBT0tnvNjymbDhjPC0SW4FuEllYm
TWKR+4dwqws85Up3T7AEr+T6vIBD+N4SYIQeBObNNm2aZweTKAjQRviFkRLroYQwvQvRHJVSGCKZ
zZtJRLZRfAbWTaJvHgTEzVBNJMr0Uw8o1n7+F2Vd3JisgQUAnqyyRYWFBhYaSL0dPL1dvqEngSFF
hCAYRvbcKirmL+sqCqIAL8VUCfSC7Gy2dfeunRrAnF87df687CkVpAOMw+hXQZEK49/Wcuvc+fNU
+uILl0gkQqdUhdKzN/MtYke4lyLARz6+smXLFok6Ev5mmnTA3mzz7OS5U4zD+S3F0d1zFy7SzfMX
LmylwiB+4QKVv3jlKhGknEBwbeUjTBCtACQT0EvJmRDkeCbgreQbhONGoXmAfPRPorWC/EJCkV4I
8OruWV3IPXSI6sUUElYyh63O2n8skFSah7kLdIZ1LeWzVLQWWnC1BGEQ5tUAMkqGKswWOWE3svzS
bcOgbRFbLSg5WEfAuFrwMy+cRhwYV5AKeguroPWWtlXyFSdjmXQQbaATpaY55ahcgkxFJu0bWfDQ
roYS5iZ6zNBXuXcWoI+a9lT/6btTyKJsFjZ7F7NNsgQnKnG2nOPbCbRSgYsSZtEv7M0ML0o4B9rI
esEiuyqyhk5MM+6hEbPOkfDBrizkmKAEo29vkDQhZuCxRBfSq1iGNR/I3w8or/+WbUXoq1Xc3c9y
9A2v0sri6gr2G82JeKvDAwQaiBITGtMGdTV78KDXJLFeqAzSIGE0vRjZBrO2DyYZVM5OMnqrAHE/
WVB9JqTaghivxPN2Ss+83ssuAPDr3QIW7V9o4AZpwFBH5mkvbwvBRPopo4BfcHCUvV/1pcKkCD3u
3rWLkBVt993y1s0EIHfv3gV8SycXEI51cV1s6w0ARxGioClPGXLhy8PYewzXXPchL1397tUTX1o7
8OgKnZi1vMKHZvHpVi9fJzFoAfOJkycEgPHGYJLq6vevQbzd79pFgWh9ywqQhSIoQfknvnTi0KNM
7cDKAZHPgCSKzH1WUAqISBx4iF7OBcvNnXI5rfgvcAQ1E0BaKhh17MJyMUSSQz7n4AjusHPYBJsF
aF7o11GrmLu4AiqGnEkWJILmRwsIIb81RJJcihUp2pYOkoXT8tkqCy9zvhJXbphEYCVLwFkEAHcr
wDnWAZGb6L12rZNFbiW8VI+cpLpzOVkUx40fn9Yb08gCIe86Q9XwXPuuCMVFgpXkrNPOercVJFZB
kql4kXcbASHTYU3CSI1RP3r8AyrRfEcgnfqyfSpPSqWGxKaei7LmTBEa8AbsdYJ8s6uihNBJinsj
DRTsKlJFKc45wl11ZaH5kWZ8jiwejgBnRL8XdXvY76WycZTtoMLUg7dz00N7HEWKLT1zCkrrbWnT
EqK5holikHRR15eeJ8VpR//sKukkUsK4GHBmcyRGsydD+ewkVHZOJGcVFdZ+nDbFWxR4hTRwUwHg
T3ziEx8bXysrK4cP3wyHe71C3b8gu9DAjdPA3HAOvCzzDDmhrwdBVZTmm9g+autYsVAZUJYTV79/
iZYcy+wsQVACv7sE2/AyY47i/pBvgRHvBZU4pBwTTWJQzJYozNSHGxxWugU0GBZd8/tV0yTR6pfW
CM3SDuE1Oe1Zj7la2kyrl3fevvPk6hryaTsxUT9xcm3Pu3efOH6CtiKvnTyJ4CRjP/smMBFcI4Jc
hs+OXl3jb0LQ93sEnknLuYbhMYHHhHKD8xoS0CPAsLxQBdzxi5nrKtqUlcZczL7rK64Dg0b3eWSU
BwMiNIPSUMxg86CuYQcy3RXd8UVqZQr2TWZQC5uBWVp/+JYe9eyWMZsviw3DbA8S3/YWEiQEU9IY
JbjtenqZwVpaO422CB09WFvvBr0xgVCA1dj0hiYjmRQyBV3pf1v4sx52LnpRTX+0gskjCcs/K/FD
8xp97RS+ZmkbVknv9jisWY5ZRnXdjqqk+CpLsYB/OkVqy2PWUmLUIUAqzAS0aZXBCCDE23DT8Bx7
P6/k0UgKy2sm6ScpUiQMIcOzIqJjoba25lHTpo2Qbo7uwC9rt53GXJMt1fZEA+AnZACBkdozo7Xy
0IBmWk8zr/9oSiLqo3aPlHhVdDKWP4Xc0ACGgz7BApehcMo3mibDz0pHlLUUzdmZuqJpqbZyagNm
ca9LAzfJKdB/8qdPvPnNb77jjjve8Y53+Hb/n//zf/7lX/7lf//v//3/+/9e++xnP9ulkkWh17IG
FqdA/0x6747fuCfE/OZjGEziAIsKBNLvHvEbOayxRWKmq6D5/GQBaDjL6s2b9+ymtcfyE/7N9aVT
508xHsKx0nBQBpdRMJJ8EHizHbKFjxJrTCOEoLHKWqDX9WGTcDibmqUVQK4LibFhVerihGH5lg9V
5Oq4JSup9KVIJfRLvPSinfGbjG6hBQ7khwOfEEGFliyaik3S9Hcm6tCfYeaA1EBa0R2tAmvlwGrW
m+JPAFr7q3Hv8EkkRcLRmc9QcdhFPCSC7Ohag8ojS/Neu3cOLE2q0sCU0Ij9A4nxDhS5TLAM2Qbs
LSdE7AXxshJ8Q0cyhrX0VgBF92/bTayiU6BZ+e7g5Th0UJn197e8UrxljpSV/2ExAR8cMK+o05OO
XXbTfzMxFioSJhLDlLPBRIdW9NiznpIoA5EmuI9u4GTWuxYY1xue2pLl9DdkeLJFEsogtcEeEUxD
Xl7UyWJENlzmm21XVktehmk9hYYXLNmfMb5OFvXGpk+AVl9Gmm8Vr7VueNkRFa+BHAabOipVXXJ8
Bl9eyWAX9Xs6L5BrW8nw0gddzQxKPT5FJJuFMTF9DluOzIsOAmdVEb3XSgLk7KTzcRHb7fXrDz+8
OAW6PW6mlrh5ToG+9O3LTxz77w899NADDzwA9PuLv/A2+/eWt7zlrrvueu9737v/gfdSfJgKT9XU
ovxCAwsNdGiAYIXDL9kK9XlrP69vhwb/8DrtsJXQLlOkF5XEfsFLIbEDPEBMiIXKcdDD6xxVrku8
VdL0h4vhuCmmpuT4Q8TBCWBXwArIKdPCF4hU1yfrCVKG7lSuIB+qDMLqXlnOVQQbVIWSxN2rkdCv
7geWYlSFitE/nhNAOTBC4Jf/QVER+kW+4XMqYRMH43zQhCpwmJbqyz4+HKK7XkpOW+fa55c8xGV2
VgNTIX5RgMwmBEU4bYE7a9528OKbw2BnShA5PX2744iGtiQTNKN1esXwrzWwnvBGXg4CxGIlvxGg
8J5is4oWMLfMKniBozgGLCF3RaGhNFKkwRPxGkGgkigJX+Ji5VHAF8vmQJhUpC6lkQZ0dixXvKCf
1E58TjpbMQHp9T8ncyU9I/PyR+7+OrZk10Uqazkb1EolbHcTHhf2BMsl6vpvs6iUiEbNRG2Y9bbn
sNLhWZKqT4Y6RxsvOsSa3NNH34bU2t4bzOSzmHy9fH2T0WruHTk10x4syKld/m6lI9yt7GslheUx
0w28QdaroddXvdf8EujPPblK6PdNb3rTpk2bfvzjHxP0vfjP/7L2zN/81V9/kRL0kzJpdmfr1q2H
PvoxKvz66t5Faxca+OlpQPFhYAj0RNdsBE40k/xayud3kCsQwr98NLRWn//w2vmvX8Qr6tw/XZjP
rwWsJShPsO6SHNTM/+jTPAi3GsTiV4jEDzkznBRNaQK8DPDmdFu+pmP4SWLRsulUj55W55gxmIZ5
sa1IQtC8ohgOZQhRboYAsmF1IEtzzMikYjTdLCAcEWCP1bBJGDtXheg8JLigSIuKQOlQEWhwjvyj
P6GWW+087Pg1ZBtertKEIXRsa6RBWrQcNgyHM6g1M4LZ2mqOo5KgqIVt2SgvWsIqcWanTVOEM5on
GM8CmBYtQGFTG+HoM3U1oIrwrWOJ1UORwp2lwDHRkMVf3lNMgVxavpbT55umFCxKUBKsyDTyXFO3
6UY4UhW12K2ShD0guVTGuibi4n3ZNrQoSZb16bPquhE67DKkknvdbVdNbTQLqJx4LKRXhyTRZMR6
QG9WWX3zNTza3TJXzCW1lR8Rx8yIzSj5qaWfmjHIM3MU/kUOrkJHlOZfup5snrhpwE8Sdbc9nZKw
jijOM7Y7aT2r8W0y0c8qGqusuvRudlLA5mLSoWoGU2iIn6eDlaYzeqjafKj2qGpRpq6B1zwApubR
11Befpns6Dr9/dd/+/ed/+WXDjz8ex/+0AcpcfmlK5SJ68yZMyVdnH3kDcP1yFkU48yQtopXnrzL
FaXkXU9e0ZtZIkbJFTRiUmMgUKMzIh7XydNZmP5CAz9dDRhc0ge44w7IMeCgMe4zQBIK8FeRQub1
zde+e/XC1y9R7HdOW4LtYucsICLAQV6EPGfsitXIhHQYbQo8po3B9GZiuCQIGV9LYoxKjOhN49jx
UcNYPq2RYcFLoWlhbliCzATDZOGxLpaWYvJhWwHPXIBAL2LO7P9BA1x+Liu0+Scgq8EziSpzSaHF
fwJaI3zLgBlKkR2t1CIEh5kIv9f5r95VPb485y8PsTCG1QV5IpzrHDtgYDl1WU+ZZk29rAdBi9a0
/6gDmFHoBetRzhEnSXA+o32wcG9xqUR/MLUBvaGWQOXZALeVuvBlrIsE2k5SyYpoCc5TLVCTTysp
1sXUAwrwZAT3o239pVvCaLgil8j7iNn41QAJUthpbqJn0J1OQfgoKOG8pZhk5BCbx6x6Tpx45OMq
JHQQYVjJ1UxU/MhKXWtL5Bx7ABP1VxQ5MXA1zauOcIX3XM3BzepHpKlD+tR5zc5ujPqxiSpTX9xm
3wryRAZs/dgOPaWoz4uXRQVjo/S9iQ5qo9BUAxHTMHc2ROyDBijIASwBXtmEt7TaoLTe9xbCz6tx
FDohUUIsZpYTIE2qbQgAzbf0nzVOr//RULUzkEvttYb7BJrfAsOlJ1gkYW16IjJFG5KpKlrCeNvw
zzRvnPo6oAnr4EiobP6ZYB2BTvGq8DkFEJvtiNGzS3jVdFIz38W9CRq4GQDwyb//u898+lM/+MEP
COX+6Ec/ItBr/3iwvPzy9773PSpw+duXcophSLtv6cxPwnVmx+UrdQUeHAr/5CdfO7yNSpeIAC8f
27F6cEyyll8S5s7VlyDjS6tLK7cCN5foTLCARdGFBm6EBgBP6ArwbYiz2a2ZO0pp7mAUediuOr9d
5Ke+Zjh96cpFQb8+302NC+CUdyrQjhSjPzaBjbOmhxckorsgiH8aq5Q1z/z12gGhQZIQkSZsDNk2
E9i29ioAC8FkKUwFGKEKEsaqbIbE8pOlDfHJsMt3BjQrt3Hhvxy0tDzJklXZjOQZE0oOwLy4fU6V
VAanW/HbVO6KVLq2maTnwrpXOYRkwxlafMv5E2BkcqC3IB/SfJmLYGqnTK9zlLEaCJVbXUWtmA5Q
+nPJlK7Slc8kdqjFnMMEgXSZiOPEhmgqoMnJNHFjvLzWcpR7CfjVoWMWxjSxjZMntH74r/eN1uMV
Zbnn0JSyxJTEMNczUpfXUuTFWjQjq1uvc/NErZEG1VKQEAGnOvL0XFJNjnL8bIWfMmhU09s9kD4S
poF/rEdK1pIzvOashLXG905bSy2INSxM7VBXExl6w4v7KKU/BqiGTyLITfVKkLsXiLYAVSTaesZm
h/YyRVJLGBfKzgSZAcSWYAuAPcA2eBklwKglQDSuSz+7Wt80RaPS8Zi158xobkgmavNY3c0xNaTN
6aRuEsUJO/9o6tLRotA6NXAzAOD3/faDe/fd98zaF1f//LP079vuQg7d+uV3/Qr9yyjpyulnn79z
9ZN77dbewwJpJ11FItsOf40Q69cO3xaRK+T3CbPt8DOrdz7/7GlCwCX6k6RfFF5o4MZpgF8DQGGG
xQJM00zw8ncL3D2gQhG8C+ve6jAxbEgKFf3GHuHORxCLJBITlhXOso56uOaa5GlducvRSKk0fFhI
l2Ffl33LuqOYATMhMcKoYMDxZ66GNckSIFW+Btd1VTOXRxw4qIlqcCUPg4WRhX81RhopUZrB8vOi
X40/D3AUa57DwctBq4EEtyRxJiBHCn1Ny7irdaU6/xzcAg3hMgVALPZQtTfNGlRFIon1BDWDCmhn
ZJcyjqWViljtHC5MjozmFyKFSZ3xUsleRxmUUverwyGLey2YHyCi3e31rb2zCO5ZJ366YJMlCRXq
swwoFZXRmZrcl10jdaVqiUJbWr4+Z5F1NyeCn5Jg00wIVDAoBtPNGGo9qxRe67Uie/CaVUMer8b0
+VDYWpz2pgk/TTl9kxQpTcvpbb69ZaK+kGfmDbnaknhGVbV3yoMnW5tvltz0x0U9wFvpo5h/hXXp
VquPMrAzVGnop9QppcdsoW/8iPAPwM6uXBS7gRq4GQDwV7/61W984xsf+vBHHj7wweX3/87ZM6ft
3569++79jd+859d+/btyZRS37bbbl55/8aWNqfSGECERbhSdjbVmUXuhgakaCCfxYl0rwAZdSM8c
ljG45BNWXqqo++UKDB6AK8kHMltsVqACVj5juy9XmY/2A7MDZzhLlyiHA5xJQrmoAB8HiaArJNdm
hALeB5oFXE2FGUXbKVksuuiBE7rQWrAxixmWQzPgBi/Gs6grbaZC/C9sIda109LCufxVXBRgntVV
yMfSSAidW8GQm/Ugr3ZeIs7ImX8yDp/LgVKmFNGhfjEYq6lFJ8oSJUkjYI+e8DgZBfCH7waUS2Ww
btkO6AJhLoN5BEUgkBaLmQMhoSZkw5SARbkDThBe4RBshdws2pxXO5s82Hft6Eit0MjhvxxFH399
txhyTEMTw+TLmHDLJ4vEKIVS03xWowceKdIz0t5f9BCrAA5L2NL0w5pd1+poYHvvjhva90wjNzEt
U6mljc52kM0LRAmq46cMYPYJqCsaw7hwFtr1wo+op0pmRvI5u6qAydThjuwtFiw7IwB2kSW7n2nf
QYHoaN/jvXqwHoG4+rR3YkiONtzWQnfMm6SjXnM8zjcY7PWfA10T4FxgXOys7Pg1tXtJqo+UipVi
2KILNCFMOccnTBWA/X5OZGx463iE9jw34iEcGUP2sYbMAjC2WTaYIp6lKklYb2wHiQ8Pt6jhxiIa
lX5yJBc09rMw0fvFP0j7Q+tFG17cmKKBmwEA33PPPffff//p06fPnTv3la985aHl91NM+P79DxD6
/eY3v/mtb33rxRdfvO2222655ZacZvZ+cvXOp/fltuhO0OMNIUL8JtC5/bZtEwRcFF1o4JXUwFyJ
A0zR35ChiMmQBtAdXVZg7FTZ4uch/heq6CvHArl61pSsl9YwLMNO3RhMCQGogvRCUEV2hAJzygeN
OB+rhtXT5QRBNQXG/Cplafn/vBCXN/3Kl5OkriBJUNb9upCEq4OgBPFYbPCVMLIsseYcygAvzhf8
xntW+W0YOmrAbACbOFAKCYNzQTu6c1iQsx5qha2wtMRa3ESuSWlprTRw+LQSi8D5KBOC2wpuRe3Y
08vd5tdIhzOxVEXar4yu9WAtyWGhEfrGbl58fDhYiewZlnJYoU3A1ZCz/FTZBrVg4kAEloO+cUZ0
UBoYWS0VTVaAQ3suLBzqRP6oAQbcL7prFbRp0qw3YR4qN8CFhbM4sMbEu4MRskK1Ar6ahP0G5QdR
Uxc8LWPq7SnciTwb+vZ+KptcKF7QUmkWoGYVDmBEwlQwqth/y1ZSaV0VL6q3WM/UPO+iYFkZPN+o
QEHm0tSSgZBeDOyhFx4USU6EYdA1HnJXrGukh7QtpR4Zg89mW/z4bfVx7v7whHTm2rSWMidgPzxY
whtqvOUhmumA2rOzZtX2NDXTpY3OlraKRSZhRsIGIxvI8TCME/4JmYqbnYZw23c7J0esR/ICdKlp
UWg9GrgZADCB3i9/+cv33Xffnj177r333vPnz1NM+MKFC4R+6cvA73znO3fs2HH58uV8BBjLiGVb
be5EqpxOCS7bFY6wmkyk0Fk9dM4+cuvK8wf3D6u219PxizoLDdxADWyxsKScnOScOdvnKS+YEcCz
17ngRodhRoLxO2bAhHJLdvDGn3iVO6O3IEU+XY6+vxkeCtoMkAkAT2orGz2lCSIFaA0cAlgLQMtA
UWoEeKnBZ87RGHKIJJNDJpAMqBs7hKUiv3z559yayJBPxBb21nDb3EuJGQ7EMgws1BTySZrhocRR
Ce5KJFmipqI4FJvJL/rL2dwkPbNauDhEJKdYAWoGFQmIDarRPkPOcAW1axtRxT6kZF9XsmXh6Br5
q6TCx5YgnmTKTIEoDWkRTDY/B7irAoRTvix2DYxnu4VNziwgKQWyfPsaaW91KNpyzioEKxisJkYB
1ircrUKpCS0NRRvQzlxtR9p74SnHJsFpQmaxjffpU0e2GmHr5z4NA2Tl7Dae0hzBBBnQ6ghxpbaU
a3/W129D7n5VVodSL8qtsCsNGTya/Cju7hFwq+g/vpWVoSQYkS50TTpnN1XN2t4ICbeo2NRh1B2l
OcTKrNbAypSPRCRSRTl90rZK5e77h0P6LHU1sg3P2uqN6bL1NOZ1XedmAMA+Avzcc8/t3r377rvv
3rVrF6HfjgiwdD/20p45+DzB4OTk59hA/CFYOAML1yQiFasr0GHZ5Nr3Ah2H9dQC/76uB+6rrvGC
gCTgKbCH42zXICSCunwlu3A13+EpvE7ygYiAs7DIuXQZBX5T2jJpSBI8htFLlMVDTDIIKkBXg73C
NCwP03CubxRXlFZLTFinySmuKycV87pfoYMl4oBqUIikcGuua61FYCDbgPeAVyGbnoYVdv8qPJa7
c7lLf6XJTBtp/GVILFw0BssUvAz8dSi+qyCWzo6GeOL5aaaoKMDOAFMVmioeDkhVISt6C3SG2LKb
57A9ulTMf4qJ6QQPYyDipicsUxKI5w9OKmYNlCZkCNYCCdOrDnrJXxn58T0ul/lqYDYRTVmYt4ID
G1HTLMTFREOYa1DBUBK3cFVcusKtYpDcef83qkyuA1t52S7z8xQ9bRcmPYHoIZ4zlisPhPyjLItn
euxNGGV9aLMlL3xLX+u5n52pMUQ0jaLvjvShnUNl1kwkMGYt0eBu7CKga4PXxkhfM/onreIB3rTD
FIrnZK7PHyH4GTVF3lPjJ0D0uLBnbPmBNhXoTkB96QMqeqhWgSiMP7INDBlkqiT1qY3SQ9XsJEq4
x4Vpe+BVnRnhGfDsaRd9Frgo1amBmwEAbzACPGhq71MUCr7z6WP2ZaNOJY6K3RAiRDGhY6dA68nT
6xFuUWehgVdGA4IDr+JjPJLe/PL1LcqKI5YU9ryqsVO+C4Qi94GSAExmIeGAD1OTkkCzFnS0bxdR
AstaqaQlOOA3468icQ2hpsDYdggz+BQ8EILJYDTgAcbAQhd4GCBBMZ0IhDQI0ksU4slFAJbdBS4l
q6mFlwZ7uTAHabkWVjULMRKSc+YSdOVjq4QBsxAZkFBF+ciwpIUR5GFEzeU5SxiF1csSMRYnhstx
giLkJABzxOLq0A3SavrCkH4bSQ+X5hzJt5ZrcNh1pGpElkCjd6FPFlEUSImZ5DALbEWWMoZRkcOM
pAwSSkr/q7WYJi83kN6VNeT8j8O/Giue81ehDatDn9pSiJZekb8OFyT20ipOqvmIdUeqxD7kZ/3X
fljV8JzMlUz9XQiQhWHVW52wEDQ2WLilvNZ9HmWuzPS5iZLZVCwqaviopNd2p9l0FIusxcPgjJxZ
nXjzyCLDsqa9AZfsttZPWQs0ISNpAyGPgf2Yba8miGzAAHak5w61122gLUm2fgffiHL2CeCnA1JJ
OCc1xXT2ARJWRerv8ZpCst3tM1uSRM8ZD3TtOW+iauH0aZDNmfjQaD2SRvdNknVayyRmr/vCr3kA
/PNb3tYZAX77299OhRs9fkOOobohREjQG0XndW/lCwW80hqg45QIbm3F2lSOLs4Iisz5NckZBEXo
5boV8CPAyLk4w2MwTHkAO4qkgtiC6QQf2sFUWpdfRQSCbENvCPMqVA7U7IvBxFFf6lhHLfFYq467
uIYp54BsDd64zxqp/EafJ26lXTwXEJZ/k2/BgPT/z97/g9iWXGnf4G24M+SAjGPIyAYZZ0AD9wUZ
9wUNZIM+uAMauIaMNGQktEBpFEx2I7oTumjSqJ5J6DKSphqym6I7+6OMNNSQhoyEqe+bNGSkUUYa
Mq4hIw0Z54Uy0pBxDBnJzDXmeZ4Vsc7aEbH/nMyrV2rVPrrK2id2/FmxIvY+8Yu1IiKf0OOLhGl6
lfU4RxDBZxkyyEkd0oA049e6SObi0L5C3zRPoObIOjUwzofi4mIhG6x5dCelc/JCmKoGYArmljav
3ji3pzyDO7QJYOHyMN80rR8vnOLEVCgjnMNkJIwc0MyeoVfNNMO7jtAmqvy3beGxSeupkzyuj865
xEFnUX15++Wm6Wx8UBKHhgOo3C58E1oMYZtGm6E8aoQYGNv9PsdzYxV99v3h+QjLvkZ9C/FnfMrA
tytpRKzYWMUcyhOrN9yLupn2TSjUEOgTOiUgOee4ugrymcBgm6fO7WmaPOqzCo5opodyh1MVnL+1
Da05JbRN3dNbq7t3Wj370CtY87GNnbMQJnfg6TWdSqcDhVZtUKNm7Ay4rsUrQhrvVeuB9psbLyzr
+skNqkuo70dDd8+ILmRr96j6rWKFxpdJfLdsRgud2YH6zYBEEb9j6cV86xNfHXOybTTwXx6A/1//
z38wCzAWAA+vAf4f/+N/IHKpHJykG3yef/Mvn/6vL7ZfXvtBMoFkHyqfbXrAHHfWwIfRQOc3QOiR
lumaKdgRLiKKYK0xwgjkMiScsV7+WTLejiMn/1Gsh1Ox0Ch5zDAlz6tHUy0MziMhw5SqQP1aZ2Om
7aQlezhIO69gRTpBmrlVKyG3wjITca5ILohgnM8fdrlcj8mtmgUvUrYdXa1VFP5K3M4Q37gYH97N
H7Kk6523TUV2hDLtA4ycK59Y1792Sg5fmKGv/jU27oYo91zxPOy2bL11TVYGWnJD6Nxqdjc5sdvi
4bCW2GvkeboCa5mb0KsSkyztgeYobdYR+vSVwwfMpGNJszJdq30XRUZTSHJS2Z1IT+Sf6QWNKh9Z
WVfxwbSFqJ+kT/0K6sGe4Xap747XI8rQnIkY6zyFhiFDMV1SSDWOQM33oSttrEp9D9FTlFOU1dJP
09CnFwJdV0wbYyJ371s/8e7RbJTtcixjl7w3+uj1yTAG57Gg8cmIUTF6aj3yemylKuaJtm4jz7Ol
gVRTeREzZ794XqttUheDB+sqXQIvior90CrbDPlQAs75TNTAf3kARj2Btfj3v335/8Yu0FgDjH2w
6jXAFqehFFhZw6ZW/5fj7/3vcXlta7+rFzHwz7RkuD+T/8//w5bt/q8v0hLetGtWO3xYmFaT9uU/
sfnnaLMGPogG4Nf6YA6oxJudlXYqWgjeVlZAut6BuRb/AFSLVDDtoqtg4XQ7YvaIriErIEw633Wd
cclyNW50GM72Yd7KLtAyyWbBPMOwDoq/ZzZyMgdhXUc/5+wzxhubIWMEN+amxcBrc4dWDlaquVVD
2grHbJ0wx+tp5bDAL8KgK4Rl6Qaq7wbbhNpZaEXgEUSKmPapTjIQoYXiMoIjEHKS2+UUnQzRXB6c
jk2SNzXVsmYrS3Srbfrb3SA61Tf8x83L5vltqpXkedGvKEX1TQcIm304rhZm/EC5zMMmHTT+wDV1
YW7eynYjXrZmD/vv1WL3Wn37RqXPHjHXw8E4yi/k2QKVi8HiAP7VWrCQsQH3gPY+AP/0SdUX3myI
ei6sSj5u51eSZrSth/LDveUZfakQryFYc1rQmrg5dbh96xdaKmUY6IE2F+YRiq/xrRImp6Jtzcua
2JqbWj9D57ErbV1u0Q+9deLFtEdguGifoShN03GqxbuBTxtNeHAK6Z74yFvRPmNV68HuFs1U9aXm
izH2wKFHdcq0Wv9L8il9L+e2RbeZ1hnmWAMa+LP1eo3b//rvl/9w8rd/Apr6h3/4h5f/h/+jV+T9
/+//+4//+I9/AvWaqzBRA/949i9/81eHdeT/+OI///7v/npiJnO0bTXw3/7vf6HBCr2dd7X/E7Bq
ra2kFvr7wFXBWFZqi2MREySMNw8BaLEpLNGj/oM/uON8GMGSBSmRgRjyQUzLzaNZcg9UVp0RFYTM
gSaACea/o8gs/RKDExfyvhau+U8vIqOQzi+ljLrAWsNy0wMvwJBWlplSKSehjlllgc0L+nG983Ih
X1/FRAQjRUV3DrSaSwWun0SUFjsrp6M0JrEdksnD8FE3w3XOKm2ejCnz9SOlTdDOQ4ZYx5QnjNKb
baLNsdu055K2rk0O/hWsJhNuaC2znKe6BmrNeW+qZKJs6tK9phgdx2ypOnH7pn/sv3qDmPs/3vf8
UxXy3LzySZujRGPFVINSMXavh2tecPdWPTZthhRiN766ALU1r75VhPyezV/jwg/EaA58XeApF8h8
VAP9Agx0AL8VMaw3J69IvIiyjakpFlfYlPpuTR1bP0mkYXn8gYoXQ8rxe7E3DupkuGmGym3Wt3gK
IhBu2TSu9hI480tmKL+inxRidHvyxC4xJv7gff99tFgSYHq5/lLla7zYXHBYrP6Kp8N78drX3C/P
NOq7yMtbttBA8zmtX6pjOdY/IgMh8QXy07/86Vje8/2tNfBP//xvhgN/ChbgWHvgrhl77d9Mv1t3
jTnBrIHtNZDXZ+4sXj6uRX0g3gXB0baSogVyYT+WZqN7D8ri3YWVlX5WmYo/jRu649cHxkgAVQEX
MvNbFs0/Ef8c04w57QPZZCvOZwBunCQLgNEPq+Q0v259xa9sdK7LRstcl+C9bOZow0jLOW37lCWx
oQBxVytyuXOVhGdklStOzptgmbXW9IRLRgiLhDcbawU7a9Jqsj+TaZNNOGeV9o4SoFrYggZbrUO2
xcz6iiuWnkq1Pca0Z7Ur3RrAWtCvY+N1rvNwyuh3g9apLDeYm8ZVjAamvNDQJKUKsxIpq9xIjOwH
L7mU3YtoCojjkk2lhl2g62x9mDhqTepGGLCZ9NFLO9wFKAaspjf71LdMvVJ+WnrXo7E/WHCtzwFb
TRG5rvhAyFhXiS2F66a5aUhLtdhF7LGe0+dbvrUkTSmbfWOw1euHiI9eWA27hT0Qdbd//hnThkUs
irN2GS+3r6Dtu4eJ0WdarB/VMsRKtAcwfvqaoythXW7RKFNnQIqGNnlqqfI7ZLQrulqKtoitM6m+
rR6YSq8dnqsQQ+4hw+9wt4/antYhXV4vN07T+LzVH+x1+o0v+E8NgL/xDTorYNbAH0ADYF1Q0MpI
Sb8Ngh9C0Eo/k8ZCBoFyrzVDMaiPCIM9tNYpGiMumNxSGN2lrCr6tZsOcVaGwZjDl2sj+0UnlH1x
d3N79+Ud2PLu5u7uy1uJV2RlaR16mTmSMPJm26rNQG1juc01TfKw1rk6jtAIiIcMsfrus71ZMZz0
pjr6ltEb3MyaUUiiTr/rgWmD6KQJBrtRVEDLENtN+lFnIGU9svnSiUqMoO2XaaDmteYCbJfsHF1n
L9l5S57J5n7SiRTqG1+ZgjLHenhqwmy5NTks0PiW+adNqm2VdepjsdyUJDtms1yH545YoQ6t8boK
lYry3d5xZJNqtmeJKN107h0Xr661m7mivcuj+ZD3yTjdo+dG8PO01ID5giXs65bD1iZMPpEi+lQx
WvFRVE7PRfetMKz5mq8i3hSdwWeXxlqzmDz6kOP7YkZmsB17sWqiTgrlbNlnxpTUuh9LrPtDDKmf
08niOYMNQWD91MTWn1yWVbLwBI7sV2hhA6X1c2o9s3hT+bOclTMw71M8sEUv7UjiFfTHYbTK4fEc
n+CY0Dme8hqfkO0cpamBGYDnjjFrYNbAszWgBau74qi1mBb/XxGoHnf167WmdzTpZa3TgFb63SL3
cmulxcLcnV/KIJxXyeKGDMI0FJNRb26RoQm6EoMZ4OHaPvrKCLgg3N7cdkCMi11ZVrZusSh+isF9
nO0WkQJ3Ex4jspt8RVzZlzKvHLZAk5F3HceMxexvHqfy3CN5QWs6ILtGy+rL5IqMCIaa2g2LP42y
yGaLa8zWqHDDiVZQOiY3acaKNhWZezZz00pgXtvEhHA0Xacc0ugTMdc6OYni0VpLIDRztFY7b85e
Uv7p+ClmxYLzVtK8sdm9WRJYi9tyX0NZbelsBmHybVafKdSUaOFMlfy6SeOpoJzEsjLVZwtG2iVb
iRuf2prhkXrXznmMJszEIVTR2fqECOFNeeIgqc/8kvIYGMBFsirGnd69Lc4Ag9WZmKqLz2iIlWif
AS31xamTe4hXoQiJ9dqmMwxYkLZg42ZXada9W+W+gX7snHxGqs2fPCHlL3oFvto//8SvUbeDPbbw
xEbcyFojHTXmHJXjKOIX3Q4W6xWbZuvi6ifFoWvCcxqjxPmy2uLXyCw+RLEtmjRYPI9hZ/uJADZk
d40Py0Ctg65ibn3wZm3RbB0rZCN50QrppyeL0nzMdROezxaJLtDVQdAxxCTp6GrgvR1vDbzr0s9W
ksE113xXOIE3XxdDBuot++EcfVQDMwCPqmiOMGtg1sCoBtKKX/yWwQva+ATgKvaAUzTYmIwEGtl9
T3vvrn5LuEsWGc8sh2RjhsoajK9YPMxUSm7FLzPLLBUT0ZC9B67TSbkbs6QipGjiH8EaPrzWRflB
ikSDCV9Lennce7u396M3SpfXM3PdrwI2SGxfcxG2XZYZeDcILSC3r2k/LUTISZihb74VVi/LRm2R
DIP11+pltly7xnCAOYuYU61zdim1CsafrBM7QznZS7FCmEtnuScWQdSgF38XxrEypcIgvHD97TCO
cnDgdLEyf2pvLdm9zQNcStsUb9fZYMtSjGODA7O3WSdV4ufUsmYQtool6nYwVn7NhveKNM0FoZpS
W3cw53c3F8WIqkaIerTdyEXiVmbn4fFTmU0faKmtE2r6OLvAy1EQLUCl4OR67NgcTbrERXI1X/lp
jo8tUlOlHtjEpwHl9DRHxKpnjV/LF0uuwljHGOC6iRbXSZTeQ5s9WmkHG3X0deDYt7fKtohcA4NR
t5FnRJ3eig+AzTaSjSp2NMJIaT2zP1ug/nABzcetZk57deRPPcdRT74UxfYS+IB420wYFbbu2BMm
PiMbQeoXzjZdoo478+3z9PeBU88A/IEVOmc3a+AbqAEw7cKQw+yBXAOsLa84EMFFOm8H7PGQkQ/X
a3GUYRhQbVfAJloW/EVza9apmXbvbm7e3dzd/+Jm/0dvcedg/+Dm59erm7t3untP2y8/uDA7MOKn
hF/eXn5+8fp7r8NK4Jz1Sxh7aWeWyffu8vz89es9t/0ykFlt/KV3dxfnn57dXt/cXt+ef3q+uwup
X9xdW3L+u7262d/fT7nz99vW9Fp9M36k3/UcklQotRAFM1ojIB01bJZb0zPzlLbt03FIzguGDRUZ
R/E3PKwIFkwLs+eSBTYbr3zUuSeWOTyLinOOMgjnws1YvfmQwM2/WhdryYHSZTE2K0dm4FCdkEG8
VCmbenqVNDrJCk0ezp6brOudVD25B6HDom7nTL/dZ9/YpK8RDvdqvByVY0KEKEy0OFEhPcw8lGsf
ovchseVVp/L6Dldhe/JkfsMwbyXWAm9f1hRm64OZ50KO663Zl/Ld0SYubVx9UzYRdE17HjKG4n0t
XNiiY7SnjP7tXWGdbVAkx6rCADjhYco9x99I/oKycp/0cbPnFl1iYMppgiTjLyhVpOBDqxyljaXb
tXWGaRqoq+kkXAhWE3tbwVb0ls/vqBJqc/SmgnVZxUyQqSLqpA4ZfANHnQzr4SkPy5M66jc50QzA
3+TWn+s+a+DDaECn7HDSfS2PZWDPQpsh76QTdDAZnwh5wVNrzV1poWikL7g6I1BwuEBM/IKsNIhH
+Jpey05W6eLk09ODjw52vrVz/NExoh1/dITr/cMDmmffvsE/q5W+7iH53tu3CNx9+/bg+PDVd1+d
fnwSqr3BNkVjDofHR4x2fLLJ6kdv9gTb6fP+xdnJ6d7rPUhycnq29/o1vvrv6MnZ6cHRIcX7yRHj
p62eURX76IKBi4SlKQShoaa2H1UCZlvAnIzCeZBqkS3bCJ85WtIzb0uryoDWUdO/ZWi7cxmsWkZG
rckCLDM1zDgkWINYxtbmWHYolPJlJoywcYpeJx5OYCw81rASWZnvNLehxl+OMMzjWsbebEBOq5TD
5lgOulaT5PnMqkmGfBhSRxF+IHBWkNWx+EwcocaRfXuY1Td+dQam0rqFDw95W9IWw6bCzBVTtAdY
TTtPQek+7mzaf6Tt9IkxLWjAnjZwK2qm1knfJEItZ98ItRCsENW1puSjVlaL3rQ9tlqsFTY6rO8q
oeiidVe0kGh8K4xd7U4eqTL20ijyNP6pO97AFFJbS02dOIF0WX3iM9tszbL0ouLWqRxyRlsqZ9ck
lijneIfx3jvcjbqTIxNVUUwQoAQPsetOmcX8i/WT5qsjpx14Pfax3IjkPvHR97TqoU6Z5IuNL3Q4
breYE6mnhzZvs7qsQhUWoe8d1X0zNFu8ng5o6MEnIKa+UOZ4T9HADMBP0dqcZtbArIHOiIccRobZ
JdKYKXINWy6XBPMMJB0OLEJ+3IGNl461DzoPmLhFv2iSntZ8IhXJale+vnCBhiM0EvoYwy4uv7q9
/3qFC/3aPd7c3uACJHrx2eXBwQGwOcRHhMX+/tvry6uHm5urzy9xC9ZaMw/yE/x4DxjtGpZeWIkt
2qaOYraNQfHlCxAy7t69u7u7v8PFq+Ur/1G8/ep29ZDF43AKnsNrGVq1nxYNqpQ9UKtC0oS3KmsH
EcWxl4ZlCTsZQ/mYW3KorV26dTcrgo0iB2kakM0Sq9EMdM7TfTe7TGtnMsWz04+EvbbfFYfXKQSp
rCAz8BrHGoWKpfHB7IYk2Wz0JaIm0FJgorL0oOW+anpOl9hoRrlJvIS10kOxdVbSBodfKkna63SU
1ubP3VGeay5d9A3InCUG0KjMy77HFmxicHN01c6rFNKkdczYwq5S5D8wmCt6oLNB3/isoIUmSFvp
dcWnhESV1mRSa7sZv66vK6SHdlzVkRlc+Z56HEU2r53QBl7xLuPFVhpgp3grWrdq/hzsVrlFBkf2
AzlEFUXNjOvE22ibZ6HGe58JKqaE2nNVsSb1vMw2khQ6sTmIZq3rwJFZiYKHe5pm+KVU9NjeFozA
X8wiWbdsdk57M1eb5Hs/jJ1zvCHGHsPNeyOoIhWhPZ/jK9f7v7WINUrRN0aeiOZrqtlzxjPqxIiq
iK/xzYNjPL/93NOWgnzTo88A/E3vAXP9Zw08XwMAqgVf3jjdN7nCgn6xGBjWV7zHlzgTmDRL/1sR
1QvcXRKe+A1sZvCMQEAO0dfOUuKOWUyyzPK5k+0ycVe6cfrZ2duDt5dfXr/+3qujHx/aemN8Ftxd
C581DMWgWVhlD48P6/FKCnkPS3IVLY/gF4tlWsSbYj/e/+Yel3vfe733iiR8v+LX9PFxf47cnTA2
CossZsuDFczjeUWk/JsoMtAyFLXecLixbh6ahBwtoTO2GHUTYliLAM07MIccPy2TNlRODs/MKAkj
S2/erZrgivOEbV5gw+dKm72dVU9mDu5N1TZITochUyr6BBCMtWJclupkfzajhDwCNhnakCsrNl1E
1rU9pRVNksX4myYqr3rIp5mgdyQ3gHCsyFRnwn4pe+/YMLc9lsqQTIU8YSPrOAiLDG81KgblAyH1
LeQwhb37ikjPS9CJFfFUPdfKmQoP0xsssm4zlVdquC/ltB9G5jid4dqbPPgeII2pihkoK7ZmFS3a
va2xYsik0p3rvG9biPUlfy1bb5/8iebQ8URFDy9QM5Y7TQbvFcZ7xexJHaLXbKhv1EnUwHhN9NYN
L5n4RhqYoSvndwZeI95MY6pozlp6J7GqJFWEA5NSFYteYW+q+BtRzBH0dI/mlIfrPzZERzkqq57z
mqb+OdYWGpgBeAtlzVFnDcwaGNKAWGWh7ayAvg+2Epg/HnKvtb2O5SxN7tIeyKAp7ollSeTL+hB+
4ZQqh4SCkXOAPe75fHN1c/7xycPDw+nnZ8Dmy+urx8fHmyuac1Hc5c8vHn/3eHVxeXl+mX75GtV4
vKiiIVbO6go7UYcx0A6cn+/evTs/Pcc/XMDteZNl/KVMNGsglonMR+r2y+q/pkyomA6clulmWG9s
b/n4euCEsqFOrp6Mip4kbSLNJLIJqzk2ftTakto+WvRrNC4LbWrBtILXXI6Tv/SmFraNsz6JeO1L
9qxWWXnsogmRtdm6icEcPOkv/pFjeW19QPIk+7Bqnsg21RPHStuEgoYOvMoatgj213VhIvmHQ42e
4VS058RBbRz0bzIawDmLFDtGX0ghXP/XeoTkVo5GBU0Dowca11WwvOKQdLgukdz66uu51ReupeYg
2IXxaOWz1lLyNJU2ldNUcp96x8upFVKksQhxtK0Q9je/UJQCfQs526bFpnyRcPxFNF6TTYzhose7
XCzLKu7/WqqoRbMimjgxXo/44A+3Tvduc+rBxIiUZS+QETGKyY6BWZLR/jNe4Y7ncyd6nPuI8w4T
8iyi+OtxYtKkzAHCfPabs/lExEnD0uI6PCkz+qpXzZvzIJNmIcfwfqJi52jDGviz9XqNGP/675f/
cPK3s7JmDfxX18A/nv3L3/zVYV2L//jiP//+7/76v3rt/mjl/+//t794gL1XLr7wdjbH5rTTL4/M
Mb9obv6ctibKIy3CjIExPpmytP5TSehTTXZSVoTq1XvsBZ2O6lEaUpwZlh+0Wpil6yCfFY9lSphn
EcRgvtgVeLZO7rtajWw/WAgEiqtQ0PsaZSF09eJRF2m5LCMmUsXLU+EUzaqAugDwMlVqlawMpBlW
cWFew8kd2poUOcMKmvNPu0Z7KlwAETWK8twoQxAJpW9GUUaIKld1NEWFQOPH9NcqkMQI4aqLyaYG
2pzVZGt91XCmChatqY3Nz7armnGSldjqmsCGshmTUgAlRLai62TAz9kueOvlml7cacmxZWS1strl
+ibLOb6yTV0LYaswxj549QZ/93+8v8moe1UMXHwUO3DRl1UKLywGTh0RP0ayyFXODpZNIKcupoy5
p5UV2iskqGE4ciwi1rWzEB815ukJZtoXubiFr0WqgZDpteuPGduaPa1f7VuU1qzsFuk3UYf75BZZ
RpG2SFZGHZ4qmppxwTl1T+tmVHf1Qi3jEwFWYhODp00H9MkQzbDjYtS9farKGG/0kS8681De9Rvp
Q1C3lzikimbRA9MBgyrqe0AG2sWf8d6Mvbds2VEnVb9V6k//8qfbdIQ57iQN/NM//5vhwGwBnqSv
OdKsgVkDAxog1fHX6/GBrMOtsNY6GBbQ8vCeNmGw6EK0IxblxQNWA2uFMOCK8Y2m4CxN1tKaVRI1
HXFh74VxWNfcWVo0lc9Gopt0GgHQxTrDmDlOG4biozjpnB5dk76QrUoEOSOMrARbNIJ2LfJLQa/2
Xl6m32DUQ+Ipgm4J+RIZZg5MwybhZUpIC2cCTlxAAelr1ijp12RM/xcVKBXzz2yZhoPZ5zlxMg3s
mwEckiRjkRGmmWE3tOncm6HR2NEqlYU0RpdI1FGi32xB1ZnPRMqEx5YwI3QaGVgzMVoWgK0mTub0
hDWHapfoV4vAoeFFPsdI+ds0AQ/WYuSuqARnC7FjmbL8+C/yCSayTdUsmld2krWwaeop/OtSnHra
vjmwhhTPmODvMz3FKqe27N8OenxEPlwXK6BZi1HbyCj9WuYFK/bRr0cuLlKj9/5nWI121w1Ene40
6kY+VnTj/mb2Kt8MIcM9sNnWW9hdi0asJZlWHfc+iG4I492syFwvhM2/9ALMnc13PMpPt5tbvbGK
kJR9E+EcZhx0YzTrb9uwn/eZWKdxprKubk9TpPHYEGOvC38d9T34hUgdo3TxwMaKmwbGSq87SPH4
+HNk4b2ds/m2NPGKeYoJIhWlFBM01mHca8Au4DVWdhjvA1GAqBPrk92eM/BuseoXPgtN5wXG2ab7
TXtM51gdDcwAPHeIWQOzBp6rgfy7gc2riBe7RiyCDSwAplezfrEMLxmZS1yMgkhpSCXQwjJgXhOc
bDcm0unOUnsOI5qhplkLE+5YQQzE37Sy1G6ZKzVSUZ50YXxrgtkBwvwsRYlrsVkwjfI25EnDIK1Z
xXVKE73a0q+U/3ayKnk0o8C0sNbKbQ2qbDku6kVaTNSd2M/UZobNOFIxlRYjNuZQNGXSU7iRxUh6
qJueSbLN1trRCtLoQIc560Mu1e7fySCc0NoODc6bY3nuCsQflm59Q5KlracFsQvrMFYKO0DauTql
TDyct9cKRVhWSA5JFlKLzTiYLlSo5K+rWoT4mKkeuMeQegCXQurxSjPEO9WoQFtGKEbbcZg7MvSs
CyqGxakPKN7ALc+nGLDG/H1E6304jnEtZjHsjsPQKaVP0FtvI+a0NirtoIL1p8qjtQ6ZUH43yqC2
B0Qtih7ut71SNcfZ0wbfBdvwMevuJ/xE5cTXnXeJsDAy6qQXqLzCTV7qgyjn4WmtWFSw5q7xbEZx
buBpGs89xYgt1Wmj5uRLk0UnlzUxYu/8SJcwh3IbVZ0SF3MTEVA7rN6c/WkWER7YsocPPjjNd3JT
DwycVruJ2p6j1RqYAXjuFbMGZg08XwPEjAdtAW28IU9f8acOQHoQKcFCyzhkJ/KKmYJh8UPgTpob
5vZXsLIuGAirL3fSsmEnfjlWCDfQTYxNtpSfs7lbc58tlmhbbaXtlJSaVkeGoWhkaxi20l8IZstH
EQEiIWQNMy/cnrUdsUkIQdZwjRaSOT8zq4xVK7JxtIhKZpoyFIgS0i5TqWjlKablL1z8nZOz8YZi
c55p4+g8GW9GEneKjkSRylW2mw2irRamSedAVl8hJhUqHcXTt8164E3RnDi3UuTcHlA2LSrWz7nt
g+pF+ISIFSGKtpmObK+2s4JNJLSdtoxmkxn5p05Aq7j6jzLJ0rNL6NtaRyupCB860I6Nf5Zknb3T
c727/x02WNVjF8rQHe6380XoKGNM441m/sOMEQ0dveJNv9EcI3ryWItoSio0UA/snDqKkXdzKNwc
shdVeN7YcUClT4TMKF6Nu2P6Hy10a+7yWZh6rmFMmNjtC+PVsO1rPOMe7i0SNksxDTy9t6eXqoqy
zpPeUeNS1zGar4XxuYAmdk7uLaNzOpNqEot7qgZMEu8b8aLxzhx49fW9QybrxKpc9NJCD0PtUrxq
vFzvIS2dNmdkbALC/1m60fmjSU02R3qqBmYAfqrm5nSzBmYNZA3AqRX/doGeNACCLbWZM8y5ApgH
W50LB2kurwVnklgexH4PoClsdsSNoGX9lOM0IuCuzMgGqERiELLMy8wfEVZwh6ZrNFcFw3iIyEiN
cpEVkZhu1Qv7icH/V1oVLJxKi4pxuRQU7TKQFxKbkZEM0sIsLB5jiQgnigtxUQSEX8nGiLTGWvSR
hrE67oqs5crJORkJzRGYaUmMuoKtUihH/+dszk1ezZmNRfW6C3ILcZiPf7U4JqygEXnaONIduvJq
W8XIMVMC+8+6S8uKI3s7s+MoxIoQn79cuH2Yess7SNv/bAq7AAD/9ElEQVSy7U2uZjPnx8UzQqbA
wYN6s9RZ92wUm2Yl0o5ZaZpAftfC5gDzCBHZJoHTlEES2wI7EwqImduCdzta6HzpDsswphkednfS
DhBavPU8SKtFL4bdNrrqk7xIntIGkcpBvDOqpRxFU4vQVIXp1ka39UWBIn2RTQYXpqhPt/kGwKxj
Aupm4sNT9rnRrYz6u1I5/VHQflNLnpt8LJ3uLDiGxFve1rW0ZYgVWhNOM6SqWp8hK5LGgD7aD5p3
mNhzJE/RFWM1Yyf33p70oz7QNtDF7mHX9s504irQq6rMwMyXKcEiNGfNysyKbuwdvqCsya+LurfH
ElMbdQulnH0aqMudJkmkO3/KGi3Ck/D896v7QjC5vU8+9eXpnSQ+Oy5J9HxOkvhETNRSfOP5a2fg
Vd+dHq0hvInl3hDPeuFMffa+6fFmAP6m94C5/rMGnq8BozpbxyuC5WBijZONElIKXbDPr1BK+PSI
s3/xH1Kl+BbUSnwSqSKVTgZWVhqImNstIJmBWies/bSYBPC55ibAHHAsKQOjIc6CjIqY5B9ZhnXY
kthJC1P518TLF0BiRtYtBhuT46Nwu9SZTFgebL6RqiCNz7q5q9WtFFLIRyrWZ60y9MGW15nHXq7X
oEvWjvfzENn4LWDk5oAiZUAr9EIXyjRFFEt7aWk1dQCMjfwbUSSTFxSRMsehJE6qFqhlzxQ4W6rl
nd4hGc50OIVatkatTJ4c481anj2oA9Dmom19NT805qc90rQg3NSYK8v8MTMietdMgeE6fNrTCMYC
pbf0UUz/dDHJg61xmV2PgddGJ82ZfiarwSwW5GOmekS1kWyLq6aQPv6OdyMMFwVsRn6u3AL5al2N
hvg4Mhb2oVJtoaHeo0q9Eb0p++BhAHi2EaQVt4axrrp6u5l6YKR0T1dLOyR/bKbR1hmsrQuzBQn3
TZEELu3j+aJvl7TZfIQLqvT6FuTf82bovCL6VRF7US/JjBWRsq9fJt1y+x7/vpmd1EZdtTNy5Ezj
f745W94rY5LX8D/wLu3cGuTJTr1dvLHHz2ZD4qtvYIJgo8xpkN/4KWkpJ/aBcbKtJ6HG6jjff5oG
ZgB+mt7mVLMGZg0EDaSXfuYNjMzcQMpYQg79lAJQ8UmUSDRiElDuepOZyKeABFiMg40S9805Gbl1
rI7KJFEdGSY5RSs4yWZFKzmlQrb47OovPLFzBunuIhVEz2qjZcWRs3eqF0sD11k4LoHBGbPN8Xuj
k1xFomAWM6VKEm6UoFwdZQ3t8PELi9kBQjPV5izGxiidooa+uKhWYowab2Uzrxlv2XymQ/vriu3m
FjOLI9EwuFFuyMR6hekztY6lVgTlz3GD2ajtq2H2YEW3HeUIiSeOpdoFO2yYbB+smRqlNcGpQPfJ
3WDLiE+u1/YtsqVkneijWDs+Wq2LH657E3fH1FUM2QcmMqZqI5a4Jft1XgHBOl1Arz0pU+XpexWM
pa8LHUvRvW91b742n9oVRztVkqCAvfiysltjvcLy6ZsdmKSHgfmO7TFsYCauKWcp4YAwo6rob6y+
TtgIn9ji2/zODkxFDfeTqb1oUjPPkdoamAF47hmzBmYNPFcDsNDCFZbWWjPhaq9msOVC5APmNN9X
22YZ/yycMfmrT7jlElyuldWaYZ79S4iSQVUucHkTacW0hb7Kn2MsfjXTKzOl8zMdd2ElRjgIeSEa
X9CYDB9pGgwhAJb4SgyeX2RpQbD4KjZOOzMhYYa3PIXMOPRYTu7QvEDdWCxDzDxLT2/5HOvcJvwX
1dFuXqwxVSQ7s2E/WZq1C569xnj2E0tba0Y7JUlgaaMBMw4noEp5lryX7ag9DezD0+Y4FUVLB47i
NmFh5lZVR19FpJxuYFtlf2xaa21/Ms41mPv0hoeVZ1pCbKKZMZzqosE/1cv0YNW0a0XY0LXyMc2o
rI39nBMrbka2uxZZ8f3TM+TywUdzcOkj+/oiZTxgx4i3CgixxKNDvZ62jMGF8cftcvHC4tfGkC1C
wixVOVybOJQ0IWLkovpxWuRD6KdJklPUMq71geF7TBw7QKufJAm7t6wf1nbFpqmN3X2UPEPblZ12
vKqbGI7iTSYfGsTXzFkzub3xKhdoV0U0gFsjsuLKZ1wD6S2ae6C9SPsez36dFHUcAJ7ePEwSx6pi
XmwMRJsPrM8L9F50C016Mw2k35R8UT/LISTWt5hx6+ucvXpovgcmvg8Ho236hsr2p6mcImxm0nyu
B97w4TmNZXmtm/OS6W54KMY78DbP6Ry3qYEZgOeOMWtg1sBzNUD4BPjJaXlNZ2Du1YzlvghH1vxK
8tiBddRCjAZxzT2f6f9MgkVywBJgFX7LC/6KKCvth4RowFrEJDRylS95O+0XrY2dubpYAgDF5VZt
JyfZCtXHFd2kCcbgVTMnwocZIpnZVkjE3a2MhPWPH9AyAVWS2yJkib0GexvPLfmV35QP/bG1NpjV
lPxrs1gC8vEfyMyPYbldiB6z47QqiPiPdogUr+UwrH8bR9w0JyCQQzbgbRuy4Drjn/lUS8OMk0A6
UF++nTlWtWh/cnjakTK7GSOyrbyV17pGjbjFSitEqWyIoMmLFMHUZZIxVbaNJ5ut8Srtt3ZYdDaA
q+9wXJvckrv7dSlJytnmIEwYXSfoVUgHm3uqWwXXg8tmynKwMjC493Gnq2jiCG+qyJ149WDLQ4rh
6UDM3ltB8l4NuDgDfFirq67sB9JSIWefEp6i7EFOGMmwHvj26MTkj+AXc+5011EgLzjnGRruI/Oh
Wkfei53EuTRc9M1DFfknCFdDDLG3JcsvqKe09QdJM6zw2AEGY25LSmm6p4twVFcBdQbDBY1bxQce
/Cmaz9obkdwEiB8PmfLGCAltFqCer/TJps2sU3w/x6L7piEw5pm4D2Lrx6X8ffG5ntakzwfpdHMm
UQMzAM/9YdbArIHnasCspvqXCEf4qi2U5Pa8yD+cJDzjXm2Lpdja5ipxrPIRAtGqrIOIeBcoq+wR
DqBCZNtySaclJbMz7hKrsl0RMVGuHae0tDg0L/PHW9Zj5Mo8EzxJWlsbbKIifKlFwviKgvEXXLrc
SJuQHpI8KCbzwW5YBmcwSguz9fMml+BkgbStrc0AzkOSUS8TQIE6dYm6kgzpiGNiP/B+MxbRmIAJ
zd3XuDe6+/qQRTSu7J0SY0OnlopBQ9fFICzZV5WJjQBSWwg+rdC0EXSRK4Wh4zozlGBJ4CykVUfz
HckWwQyhV6nR4Lbvk3zOLStD8Zgkfx2oZ40xrcgOTk3zy7hKjT2Gx7j1IG8yovSNLCPKbjtuHq/U
/7QY09poQBwfCv9PE7nT3FZq7ABjctT9zVIMNeIwkBd9aZpKB4yNptKEoMOCeWW90G1UgdRRGwXb
jCmy534kK5Oqpq8JWcd+Nf58FcDp+RcMVkfraawh06KUNoRqXmgfAVbV73v1jfaB8VlFZ28UGqtf
T5qEu17BvgsXzLtQo0n7nhqfjvGHNydOam9NCtQlxpD4/I73lgndb46yrQZmAN5WY3P8WQOzBhoa
EFuQahZiQlAcERDuzdzk2Uy+xCTbBslORbI9n4lDwhTtipQGHxZuC33JrmJpUCvIGaZdgS45lmXp
GpbeB3k1G2CDfhkte+GuMDITQ4K7QNeLtHexNpQWXmI3aVsVvKvyhfG06xp1W231H1qJmTx9ZQSF
WyArmD4UKWE/8sQN7XrNwHWyYMrurYmAhK8bS6+y1wJmQ0GrLy5gyjaik8+5Tc+bqdMkygLE6Wor
wkWjkuyLXwSxE2R6jWNM04PaKo0SFOIjgySPSNg+xrGMo1TNQiMJp2mCroSpLrB1I5NNNUJuFj+I
Z0U3CvV6bRrK2ysGDZhDY7Ta8EW1DnufNgdYMTBeF6PSSurRgGLIG4eGlnYA4KfcKgXoG9MPCzqN
vjZ5TJ4I6Cu2r428yk2T44i2a6liSHwkPaNWxfsg0xrLBOvjYc940njaROpTfis8PheFDMXIfjuz
mIvRvKh6aUSsKMZ2hcYJpkhW0x66vq4yTnfeSPHNOdC3tp8IG9UD27HItk8D/RMB3hXri+LdUlRu
vHM+4R2oM6It5/qiLUA4Vrr8FWi+YaIq6hddj6N+8VMSm6aphxqnR1/yc4Qna2AG4Cerbk44a2DW
QNIAYIxoJ4vuWmcLcWkrGPWRZyM9cDVs2v7K/IfNXVk0Qysf74o61/ijI5F4BhJZ0e2x9AfWMUgv
Hh531kzJnzrG5M8S3YlJvDzxCPs/041Wd8neCEUInYrpSk3rMcgWxMsItKPCOVluyXJUXvHI37TB
FaQSWTGm/QfCUwCh/irB2ONCi4CRysy5yAo4Kg5/RMVJrVjdDOdtqWpnZ4GiQcu4WmnXaGYmd2hk
y6x0AQmpB66FJsshubEuN8fWGUKiX7kKv8R6Zvxdm4uvlt0KBRHLSIziGz3qw5W6xor21y4oZwjU
NWOa1MgKFxYBWcmtGh93/eIC4IzxCdETsaeYTsIbUlWhTOUO0pJhQ4/5K8oS/GeLmeG3C6xb9jF7
r3trb/B7w+Ryrs7xc/3r/3KYojoOQGBMVYz++zPueA9K5soU3Exs463JoDg6Ao6F1JFHk/cOYevB
+pAu8r1nA227BbvNV1jAiq9FDk/QyUjrpG48bvgdmHwZ5XavRaMFawE8hM9yUIB1s7FGicI0Z4JS
jgPzAk20K7BQX0fBe5Qryh7iMDNWzb7+O0Qvo32+1rYnGbiV4/TNahXvK58uaT8dA8w/8aWkfOvu
6sU5iFrI6FulI6d1Tu8Mdq/ZYbrVK97Y9pibJOXLvEbWJniPtmYh24T4Jkl8BdWyTchmjvJcDcwA
/FwNzulnDcwaAEY+inLBJQtRolBNhjj59KYQ8yXWDxu2pHIPZDgMg0LJomkFaVqPJLMtcdeOF1ZC
7pW1ILsJ7LTYWMCp7aC5KxVCtIhXgeJS7UeVA/WzypW9EBYsypjiSbtevgeDUzBcZ/HMh5m1sEAa
ZrUAWC7TRF2Eg2lVTR0vjCXHOttwV0bI5eacQXG4wdt7nB7Ma4QgFZYrM1uZsnGxK8Py4pFwrmXD
gmSU+nJtS6MJuO/J6soHNVoYjuJEqGSTloKURLpyZPUtlMl4zsCIi5axj0mYsdPCNsucWh7IltVm
TGn8bH+7eeYyknTJ/GscaFyKv36BPFGDTLzWnZJ4IY6LrUmBZPtlzlnVkoGq0CyMnAvyJ44CN6Ea
1XVpc9xqkZNvx07F+LsYeiblB8n6QhReC/mEkGg/sdIGxriVZH8sAW4L8irUwDZFOeP1qQflxTzF
AGL13BqYdhnm9qGJCTOu2kPq8ynN/l9JNWDVLOjCMWMjST1rU1jPCsgZ03gBwy6A99tJoFUzXoH9
/jbrkadPJ5M6VTGfFRVSM1h8WbUe88iZUTnWFkMdpmgIZO5qmTDX1tdLmzMjUYu9DVTAfxTPbrUE
ThVMxyI+7mASuXv+ueuht2c1H8OiP8QXrz81CAxpm28Yq2zEb/tav6A64j11Xmbs6ZnvdzQwA/Dc
IWYNzBr4EBqQ0SxBF3+rzGTHt7/BijZ2Er7YoUd8xSuO4AfcxmjaLovg6sC2sUyKW7T01/dDIs84
0VlMWYDlSs2vMBrLMZv2WK+kbazlghlT6TYNwpRNe1Y9yGwbaCllgAiI/JCQUWzPctPPMzUAU7Ot
NBawIWYui7ZxhBNoGc6/u7J5PgiGYfilosTtTGLQLou6qkalQXsicPpyW7myEpvaSM74SwndyU01
NQdsqyDjR6BN1UIOGxVZ5CokRc3/sUK9dAlrwrBQS+7688z9QhFYKbvwmJY2fNi1QvLO4CAUkcYl
aQKCMyMSAMo0j3ppslvNMQJxIYZH1cMGqEnwXI+3BsagPbcG2HuYqaKyB0bMk9Ci6CO/n69TJHEz
i4tgDTFdFU+UPXaqgbF1f+4uZ9FzfDDdl7RXLTU52KNa03sr6+EZkFjoACoPKbNg8v6oRf6jrDXS
gltOBMTc+h7quo3G+6pPARSYV0g/9rIaL6ipjr4+MMbAda/oe76s2A85jxZkTjDpLtDBF7qo7hMF
KLA8/cYN9SyblIm1boY88fUyJ/twGpgB+MPpcs5p1sA3VQO2tJWGU+13ZaZaMwsbFefTesmZNLdq
LS5Bkb+yZjqWLZeYIuOnfmaUnFtbrWllTftsEWXlQc1UjzTMkuj00XpgnULEEZVgL+cMARaCRkRD
uYxAIyolQRz5NpvdOPlLMx6TE5wQQRxFOfFVv2zm0mzX4mGUK89nQ1P5LcsBW1tewQsbfxFxpWkC
S6U6cumycmNBjC9i33m5WHF2QIuQyfxaqEywl6UXK6ttIkAaW4gh4URNrsb1Y5JKy5XT/IJOb2JB
O8kZWyJI+bkGTpLGigEsN9CowI1pF9lTT7Q/J/fjkOcGWU1DvuosjQxUtNmNUdOcVYe6kUo5mz02
zXRYTMuETcZZA9l1NRHAaCtrCPRAdQZFpX0eXQgq8uLbo/+xqfdhmt1iDNpkEtVKKvWr1tc6Qjd6
89t02XwgWzOk5TyFIbdioemymQDFUNvrG+k9Wl22EmaCLltR+oBhoKGH+0AupB49N4of7rfGugVo
bVPPelrEQuqGSA9IjVV9IdGe5iI5EneF7GvTvo5aVrGWYQzztlFSI27ndVHovzkBEZupm1/fQ9fU
iSeNxsbC6pjiuP7twjRvYmyjnLqHjKpuoxwvruilxbRgbr76ddFUjtXdeqlf2Our0y51NZshMdA7
UniEB6SKqoiK6n0vbaP5UT3PEfo0MAPw3DdmDcwaeK4GQJ5EWcCVDjHSYl2SnqiP5lA4GMtXWVsw
ASzTjsHkYa535W8So+EXVytyxcnyncZdJAHjLWwj4LR7Fo2ijCY02gUmipOT57AtDCYuCrF4BpJW
HWvRLJIgqyXEspN4ZUdlWTyNyYyH9JdGlogGAVYywApiKdSK+CXPZy4YZjSDQBCsJafAZDDjeTPz
Qs617fsFCVVZJjH0lcyGanKLkjJ23q+XPFKYOaxQsll9cY4xXKC1uBoV3Hm5Rr1AfbYeGCSPKoD9
iND28wwDstZRYwXvzos11MW9qbma18zdrFpm3UV2DGbpCU0DZyZrt81q+zBO9VVB2ZJv/cjQ15GV
8ZWw/FG3sizD7KTNC0hoOWuhtZpyZZxsYmdHaKwZl9plGDc7PKdd1kurAMl5Ab3xWrMwiIx23LhA
21AvDvhM/mmfJrMNQ1dnuFOMxeNoOKmxkiOODgdHSDWl95lrqOW8c4yVF9MW+YxmEpNvZW8Znlbo
a5CYynRbC1y3yFa1GO8L3hARQfvYpmjZmsdCeS55fWGxvDuxRsMjZudJJxykb0JmTz6OEF50QRfe
eVJD5IkmuKSmOgVUYIjzVQStgn+62o/I3ddR2x0p4kp6N4asI+xNpr7m4x9nBEySGC2pwtUe9V8o
x1rHPvnCNWkXLMsvgr3R5wIKCZ27UnjsrnXTWLmFrkLfqCluymNV9NuNJIVOIocPqoJTnzYR457P
XRdoaxHvOb3A2fdguh6sk0SlVUmaGihK7HvZlmnrgsbfRHOMrTUwA/DWKpsTzBqYNVBoYKHva/5J
VtYHUSugC0GrxGy0D9toCPyma7KW8YkwlQY9BuWVvfiaiDHvrQWuBucQ6vghQcmhl7wNLISXtXLA
nlIs2qh1jZW0QkHwD+XLgG2YTdsp/xLLdaH9q/ywpWT1Tacx4T5qigjiVC33Tf7MKlT5Q2CIt9S1
rNkmaqo4ihB18xZjQjC5hSMwsa9uUTYtf2Up2vWKJb33bNNcQKZu1s40t0x7XNHaqWxpW17LPA9t
0MKsWnJ6ApFVhPQAPE5i4obUywgZj1MqsyHnquTVtlSaAtNOXdXQTSir1bymBhaq65SVacCdz61x
USPsB7bEldTFCwvk5EVqfSncWtzqyDz1Na0ztyBW0MzjlnNukVRj+08cgXVu9H4ZZbbpI8JSEpPH
Ps0R+TDtdIfdRQXiyNVu+YjZvzYH9x4zXkxT1YePVQ/ui+awakYqris1ENKngU1Npo9Qa7bZUh99
o/bRHtgpp+Bz61oDA/qWkPWMg3WGWsIR0og93EDLWau/bxtyu1yxjUaKi3kOw56pZZtPBN16tiXm
NNKp+ipez5IohOX6hYqJcOW6qp/3JNLAO8TnBC1qa5omtkXxohvoDNvodTBuEClJUrlAG/pai3gb
bffIePXH3rd9snrR3jqjL5YUQXuIfDB1zRn1aGAG4LlrzBqYNfBcDYiaSHEiK17vKkv7utA1fHT5
RufB8fRVTte0dlpMEpouxIcc95tV0GhHlKVw40yDKNhOURCK09fsO40rGZ8fODizmWwrWlnJ+5oe
1GnP6mRbFiLKn1a8ZJlTpOzKq8SWQ5IH+aPojdiMTMrC/5mPaA22ZVXEnHJZFi29CRfpkGxUqUCr
Y9pzSzMCae/opAE7mYm+3MyYqcT5xW+qHMJdLZI5H8wrYzv3lAYVW6GuXrUXJclcahFMsVZc0nmK
w+FXbhrc3bhAJyXkhElXtn8VW0QImpss25BD7lZZaYORKUM6RstOjUr6RziUmWVKEjJQ+6gxebZg
2ByEKmgrt60uXQDYkgRSDuE/hcFndKCzSTpg/LFaxM8zhmK1zOOUktNMR+IpLDQljkvbJPZ6dDig
8JqWC1Vs0Vi1Evt4yVpqcns1dVJXc2RYXDNtYblys55XZEsJrTmeRRSFDt3cV+s2hBT6eS4eROT+
EM9XIfsk8Zo9JwZObpoBzRWzBu2Y6RfNf9q2mAWY/ux4zFI5sZrWLj4n4i/88OZPVVDIKGz3ideR
wXVeSGLP78DsSVeb01Ux8CqO773BB2K++QE0MAPwB1DinMWsgW+4BmBaxL+0Lle2VkAG7HVGHTp9
V7ZTGX7ByQiHvReBRJOddG6w8S2iIbklTMQrB9cFotnpvmlpqwhTizyZs1Z4In+itdlyVSLi4+8D
d5Mi9ojouHrW8qfYCdF11JA2zYIjMZOIveG3DIF5xb21eIGczR4LN2mVywoYVuGf+JkhuMX8dTaS
+I0WSDN6M5DRFghP7tZp4fEOl/zSjVxlIXCHK4SVijSOkhGuc5LMuJ0cs3GLSJ+5DrfkbW70Thsy
UT8qKm/0RSEfLRqEYQ6onS1XNhOx1WLF+uIrTcoGw/Qi5jCFcuVAq7g+ZHhKi32qpRCjepL/ggdd
IX+TVT7Y5sLNFbxpKsS85S0C5yA0HoK2k7kDftFqEZdNypF+1NbWHDa+sZ29KXGqhXUVhJmcG5Eb
Vz1361GOhRTh0RbkmbdHSDbgw6cYhnqyOCau4/QB2GDlTGA3GRX0Hk1Jls3AgN4qNRChMBDFyM1b
A6jjZY3i0AA6ToKTQnvTlVzEjETak0mhQO85dReykL4emLp0PWPiKG5c4WP6wtBXdZhml45AFUUt
+kmpZK97zVqx3C7ARwEK5PbeO1Ju3Y51A9mjVyPW2BNk92stFYG9/a2Y+TLBagZzMbotO8x+3k/K
DlN3Qq97Ud+xF2CfAPVDXbRRStgnSbO7FsrBUEE/R+b57BfWK6zK9XM08GQ1mrrZH1yM1rMcG7p+
QbVf/rngjtK6T8G0bjjHeooGZgB+itbmNLMGZg1EDazFlrvatRj0wq2eOLrCT5GFc78rQBFBUYuE
EQ2LM/F3kTjZVqsKjGUhRExcyDVapwrz+F/zLiZX4yvpF5i0Q+dYwKpBDj6g0LXFVIb4y19HMi2L
Q1aKQ9sp0gCMmZWs0wJdfpUAXMZsMeGtTSxXjYBwWnybgCfnT2CWCzQX9FIDiRKVj7hxSVom4OGa
a6TldQyBkS2dtykAjz7mba5ipTCkOJyiLPCWVMRCcDhSClCZxNBR9mozCwuzZRO2pcKwhcKMTI9u
HTRFFckaTLVrpsBWWz8ge81WqDkYwkwy8S4FotSSYNJqyq/yamY0rCs2bYul4bxt/sxYpcxzreSf
jP9IgIVSSYHJh9xmKx6hIpMZuaEF8UGtzYOAkTURoC/0gZcY/EA2u+YUg7oEkiwZH3kAqtMkBSJY
f1Nk1DJ8RsedndgjX4bhqvfulFFpMU4tRs/bCOlxm+hu2ra/BXA2R3hOJn0gF0UrcvayYpy+AfQQ
+OX0A1RQ33qKzryl+mZPPHwyM/ex+vCIeUT4Ygxt6FvD56CQo7MeU7Sd5Cy6a4RwxOgRY3QWYxgC
h1RUw//k9hrIdmR6opnS2qWYIGjqpCth32My0jHqfluE1JJ0cyzKjRMiFvFZ/dbLit01Btq1HJ7r
Cws0kYyBC+j1l1WnTtN1MvmVESWpE408OP50TC5ujvg0DcwA/DS9zalmDcwa2GiAlMMxlhDLfVMF
jcAVkAmNvdhlighHKyjirIWsNMYSlrRTEZOaJzBTmU3PyEdf+duqn7fktGw5a68p/ewZ1Bl7W8xM
xfad8XElSue1NtkyZAVkMjn3weIcvLkr20bW4EwVIT7fYJjMkrZDNa2s5ljLCmWlaAmuWNqC8Jel
p0BjtrR1DZIppk3/4w6tnctkuGY+lErOvY7WJFejlDS0pW8zvxrHphXFFAnq5Y+xdp+mMBY/VTAJ
v5SyqUwhukGmFI4PMxH0ciZClSTAI46ZeVFx6lxVwD86aYv205BOqstKUSqGLCzkQVWmhLiwotWC
6hKcT0nx0xZWln+OmXOwrJKKclkAflSZMy9eujqhPt5G+lbM9Nf2kJ6RsQ9i+ib+h2E4adcFaF6o
sn/YTxzTD4/vi8GlDUCp7gzSHuI1igPBgsZjKo/fHr9+qDH3gKL7cHdKkoGpCr3fUqesLuq8iymG
oY5R9+oP0Y0iTjw3v9ixo4rsuocBYq+ou9MkkVwz8Unfvn2bT/ckKC0I0+tr0m8vSRM4nUvri6Sl
ekJkkvrKSAPzSn0knLRUL3ON0zRbqmJ4esv7bedN0px08Ekij1r3k27XnTINFPtqnDKoO8ykLvSk
lpoT1RqYAXjuFbMGZg08VwMkFf0qrAVIHNNlqywdX812pxNoFzJdAjjxFZHhpArTrg13ZNo1d1kZ
ZnUmMOJj1ati8pwbJLTMUQoDdQ3cUunJZRdXiIMQ+gbb6TgSCZIItBIrIrlimv2W/6yIVBeiL12O
LXOjbn1o1jYZsK00fXTTWmJzGzYnW437lT1YWsKwUMuBiCjSVs7IjTtLa+6ANWIBZEjsdWxZKSTN
LJgRGH+1U5f4megu0zSZU2ZeiE20VtWYWMuSmTMtxpRHYtBhW+Lxs1Jcu4aJG6wrSdIKZLkx225e
cFpG6jRkR1nO/JDWJEVb255YyJ86Tztdg3jhT86EqLjlLEnIyTTgv8dOadS2GfMpmPJhvZSbrcq2
tra24IXt7JVOOdbSay3tXhmfaxaAV8rwQQbzJLoJa59RwuwOSQewthjwTRkYdQQoBmS1YDGkjjwc
P1a5uh4gq776TtdDXXIc5BX5NEeEbk4p5CwiR+QeGFkOaqJ7c6BvNNuimfWASc0NWejislnxEcoX
RWY1TvQBRkpYoFTN4U9irb45iKlabaq0hjEPUb6xpk39dHpRE2yG5Rt9CYxVr2/2p5FuYkMMzJuM
CRPvF1MGndddU5Jp5Xq2bbZsSdj7PiymQtIUbc4i9lKfMKouNr7QXRdoeyfUTxZDmv2/DowhrXfs
ALLGbjn8dLvCOlp6drfcpqd8E+POAPxNbPW5zrMGPqwGyCj8nTCLKOnuQWt9H+R6SjrVibu0AHPN
Z9rOCv6ximCUS4sfruH3C4aRpzHNqojAPY10nA+SM1s7xVdLRhMqi59BO4hshANmZlnmlgy/W2GS
4JBshK8gpaWOCzJCpvBIKcmN5PGBnRMZrmWK5IV52MKbWoKhxKU5/QoaBWO23Bfe13J7FgEyudCS
sKcL+ypIE37rHCYiK0pHEaiGqHjJjOXWi680zzIQMZGT+WOLP3WIFE9FSphNbNZ5SPgOsSEtD3+S
Hdg0g2vEAYuiaFxzZzJZmw2qIRNBNEmLs4hND4kk8d+lpjhQa0Cy7mrlMFQhtkSeyAQx2BAv18gN
MiD+6j2uIYMqLmdpis1l3Zp3kF4gg6zBzMa0gSTYAZs0LhVpxgH/oXs2kiOONq9WF9IcB6cDNHiC
NtQcKAvgbR+ch4RiN63AsAEysbut8ccAdTSn9lP5+s+Hmd2PFgmXMFrMYmAsfuzaB7Vs180OZ+1k
HsEr5SO8mo2LkEiqlnvMpJ5H6JtZcMmmzDWM1qhRTx/79o1Ei/DYZz7c4NX5f6wBW/cjW9r94W4/
uYytO7OV61a+gnMGy3W8HO1IqQjLbQA17XmxR8mixSdoghKsOw10qqf0t2br9HekNtdJ+Pgsb2oT
Xx1WawuxThJD/FaPKup3XV/IE/Xgqug+U6kD9LhAW8VdEruoXw5lnYb7ifeluof0TCEVb7MoQNFt
RmTbfopqQs+do2w0MAPw3BtmDcwa+BAaIJfSoAeYIZOIGBcEoUx+2nuZpGoOrlp5y7+Jl9IhRqAp
RAPqINxo0wyw9iH0ygBI+17eEAsREJJASIi73iE6krf4O2rrcs2HOS1kNfEUaMZGwjviAqiMymSZ
tEWzaTdm8K3RGlOl85ZIWcJIsh//iUuRodEgBaYE7ohrF4bHqk62+rKa4sM1uJAH2DIOhAG42gAF
NmFaQWnOJfUBhpGVNpdGiASgqzZONuLsgBmHKbnBeaq1wSCdlsXGmnRQ7VgFtRJyxryABKbbs7WO
qUV/k8aQA3iewC+bM6ckdAvVRybMnyqiJV/Zcq6Bmabl0NQhZgGsRBm0dZFWEbMgJLduY81BqE57
OzM3rO9FcimWbZWFtMkC+hdQexw10sKMGChuLW5nhlSy1aka+I4Sy2iEMCCOw74aCJMAff+ZOO6Z
IM9IQf23p8s8QKdTuNREePoo+ck1nJJwVMN1S9WDaS+o1awDKvJ02yknAkMcstv1lphXyNDEiani
Rc04fPqT2KJQpzi7sNJ99qTsOXVj1agfpwMK9uuZ8BrtJvFJmTQpUEjl5boGBjtMlKeeF2jOPW0C
Yw906B2YmBhj7/jkFo1lt4rGMuE7Qkbwxj0Xxt/PdlErp6dhYuZtAVrwnDKLTWPXdYj3WLsbVNp8
EAoat+p3+okaoh0y+v4Z7Z1zhEENzAA8d5BZA7MGnqsBEkyCvYydOUt6pep6bWBjP4HiVWcR4ZAs
geZpLFPwZnJaSYBVZNqEUnk5qJUm7rICRT7aHUoxkRtyzmUy0ARAoCWg2OlnRnf0W0umSmtTSZKM
KRM0SM8Yj4grxLIyyaVh/IRQlIsdmHKMJFsSRPmh+jmt/qs1uumzubCcrZQXN59fmcDI3IrG/4nZ
Gk1SNu13xWuvtYzwnDJQnhCbcxCWXOuxbUpiM+wQQ2bZsjyb/1o7W8mqHScCcMGvoE0Qr80CoKVk
y+VnrdvmlY0P5cmdAdcQ1VIlPeecEV5oLXcxnT+cNM86sV1ShjSn59bclMhS7SCoNFjpZtw3yBhg
m65i6nFPHxNOoR1JW2s+hPQhVh8APGlkP2426afWUSIqBqmDtd3i5tYoUuRdDHn9bqHYqM8ID9bB
6qe4Lx+Fj040jPauhoK8h7gwdcgEvdaTOE2emVKLTWl9SrYY3b5aw8NQWROnjSZUfGKUwpqHVK6f
oUegT86+53eiNIrmFOqJ6pB0q5gcmVaK16tJ2s08ejtwZF1/duqXm4UUyhmbS9oUqp/FjmC1H7Xf
jtkWkwXeP0cf864WrPQhQ3R3TorxbZDT56Q9raXmWFM0MAPwFC3NcWYNzBoY0sAi0ywu1oYuacfj
jTWPrryGSrQ6GgwzIoyfD/L+xceMeFxuakuIZRU0izE4B7EtLWFvsZA5l8CDcFwgwwRU+snZ+97r
89Oz64urq0/P9vf2tOI0b+NsDJlsjLaGNnk174DorFCxNJcBGzdydasdd5R+UCV2Mo2+ef3q4vTs
5uLq8vT89ff3mLn2vk4qk7lY1EXON09j4CIuqRAz/CqcMXD0EYtgIP5PS7h+IBGyf3SAi5WNcnQI
Ey4X2oMK9lCrAj5aOpvEhqIovyoLt3BwIEzKtqoW1ZTyWS/cRUyksrOXkQ/Ek0s5L1BivjZ7LGut
5jAhjV2ZJ3PWiUq4gVS4oEi8QJ5rxFfFpQjBO5WgM5/wVTZtWZVlMIfJFznQl1su3LSKp12pLQeq
TjkgAYXCBaUywzicq9lwPB2KybQu2vSpaqopJFX7osCGJ03DFwPEUSbMokz7b00RUchiENkdYE0r
oBFrShWmYDObbcy/eiBOczztpjCXe6IkjXoOTHz09YQn9ZCi6Nqa95SWGp4EGYbP/vJG22soQvGU
2RyB9UnH3dYcTV9DO1E0FdgJHJgqcgH8VfCkx8RbbVRFQz2tyVqTm8PhanQypZGltYW9DIsLBFbP
wjD32t1o4XxKH65fzn0v6m7u0YhqOmFIrsKQcgYe+W1mVUb1X7+Uel9TcSrt6UqcU45oYAbguYvM
Gpg18FwNgNPwD0RqiEhmE2/ISzn5QsNXdi2PXMQk5dg4WEMfIq5ysHD7MWZCmWGNeJEtMmf4yxev
vvfq6Ef7i1evREHaz9nOW7JrAfPpR8dXNzdvf3Zw8tnZq+/tIYSG0MdHcBiXjyIOz8NJBwJLSC4h
Bk4L/7K1WRzO03R0nhDytwoamRtM4uLk8Pjylzf7x4cn52d7KEuoz9wEZqjXUngGEnu1sYgSzHCX
jCcQpT0WF1gCza8MJLDpHCYCJM9GItyydCjhUSc5ifyREKuEEZPXaY8oOkXTt9ncoVU140At2eUq
5SWTM4kBsxiYFVcr8ABk8D+aDMmXok1cIxoyMSpmTDEt66W13LTiMrm1idblamoDfP7ABcbUGAvS
GmmkEohyNa+qQFgl/ebuga9LCgy8Z1qba9DcAZNIdclzm1V4sVYR3DwM8w6KwBXCKMKSwMXAUlnC
1N2HQXGAarq3moPCOLKxEWEakKnsjsNbkmb7//iQvRB12nhxYnl17QbG+gP12ooQmpF7TUnTiHpi
fTvRmsPfqHaLUIdYoH0Gt3ouRsDRUmSpR0fVqRS3p3m5tYUty1P2/0o1hdkqItZW7ZiUg//0gVZQ
YJEz5/Lyh1N+YTcjBG8wOPf2TfLh/h/ZuyDPCRMZUci6t9fN1+h1zRkBjzeBuIrpHn+x2EVBoWWI
Smccm3TwaQgnrvqi9eTEfmvX1kbxoujApbqct2Pdm03QN5HREszDinkB7IpRChAaIt2KMzKWkWtJ
D3J6lr0zd5/u2F2jGKaTOC/Q7Dl5LJSaRnPZgzWcbz5bAzMAP1uFcwazBr7xGqARj78KmwW0RrAJ
FMWla5EbPojMnwSh7EK3ZMW1U20VR7/BjJ/tyZackV+8ePXd5ZvXe4h58IM3r3aXsm2SaUityjwl
/N168a3F6+Wrh8fHsy/OTZjd7+xefHx6d3EJU+0b8vPj9RdXhz8+vL24Wu7u3pxdkNlkCL357GLn
28tXu7vnOf7rV6/AYHcXV4cHhzAsA8xQqGHq+nfr3W8tXn1n+fC4PkdZ3B36xd7u8vyT0+vPr5CE
Yu8uzj8+u/r86ur0/NV3X4EqYTHef7t/dX559dnlm+/vocoA7KuLK2R++enF6++9hj6RnMWdXwGq
bz+/RLa731men5wh/Orjs93vvOIgkZon8tEWamcd2fHFWaWgU53HS+UIp+X/LCYHw1PnMoqKYLXs
Oe35TIuxAnUjLcfVRtOyAENaVZ+24qVlI4O8ZQWmVWuSkAXPZlXmTQQihJdGp0JuzRowMOVAEtaG
22a8VSvjg7oYkCOMNMsuhws7b9mWRtukBkXDBTQv4W30IxDdWOYlgn98tFEgRDcWv3UHqb2z+Hnc
MxChzns8pB7fTxg0j2fbE6MPeCKYDaDpVuV6PsPUXQDAVkUMRa7bfXQAahF83GzX9qmH1z0THxuW
C8INqHQEiWM3bnaMWsJKKcUAvejAWzNw8chEdbmuwjLIQoG1fhwneKtutZqXnv2A9PVMRz6TeZJm
CvAr+tholxvs7k6hHqvkUpWe9BanbwZnDYbrNXWOJsvUya1omkI5xd1+5dTv2E4nUQ+MMwWUpTVF
1Xm3FzpRvy0rG0Qa1lLzMe80pgN2vPhgb7c5o4YGZgCeu8WsgVkDH0YDsu/xA/AAqOCDvwa9+OUg
8eazXhP9aCbVAu3ngcbbxNLmbMxthMlV+QAkEO/+99+sBVvvvl6tfrvyzA2fUCISIs/Ti/Pd3QXp
8bPzvb03/NV/+eLko+Obr27f/Ozg/Ory+PAIIfjcr1Zvjw4eHh548cO3yPntD96++839+rer44+O
r29v944PwKTHPzmihzDif834dK9NS4JfnH5+tvvtXZZ1dvHmB2+QA8Q4/ujoGmUdH9B1+cXO8SGK
vmFWv2BWCSwfHw8+Pjy9PD/68YHg8AVyhtX67PLi+ODQVv9Cqv2fHRi2rVCvnxxd392+PTlERU5+
cqiymJSMZwCZtqcS0Mqyqpy5NRcbJW0exog7yd/bjkdSJJ0VxHvCVzQolGkqNTaWug16tUG3GoKC
ZXduUmZa2Uv3ZlllVVYG6e41IyMfuXxDeDKtrngNqeRGboHc2sqswasUUzlqezCKagMRxuF5S3K3
Rng2p9sRUMk53EQOn9ZApx2hTLnRVXGnHhQ2ifG5bOwA5sVPHEBPjNZf3+ZobxIA5Dyn1P35pbRq
0BNWK9MiFuE1v21RxiZqHBDHahY9p9ZAW8mFMdPEbpL5mLTN/AcgZyqQ111uUJO1Thxg2jUYpVz9
3KQGzdOsG+u9hfR8vI5RqoFWG9NxkCT2sfFkmxhxkmKAe9tZNidBJlTfc2vaMC3QTZ12Mf6YN99F
saUmqKWWZ7QpGxHqqZMYqX7EbPpYtY4XMVHRNKaNJq6X8jzjFT1BYXMUamAG4LkfzBqYNfBcDRi+
0LoozlxnSyz8bI1MFmEHZvnWprWpuAb/2A8IUtlYE/ZekB6SLL+73Ier83IJIyFcc1/v7r5588ZM
x/e/Xd/98gZuTSxRudFNWjgNhEZWD1+vLn9+eXJ6cnJ2cnJwaOZQGGnBvbD3nh2f7O7uonR8rn91
i1yQ5Ormev+H+7s7Owdv9y9uriEM4p98dHT3+dXp8QlMxCgFn7u7W/psp0JpjVw9PJxfXZx+enJ8
dnL040MyPITfXQKAIZUA8tGKZlY/Y1am8ZvbG5Ry/+t7GKuR4ds3+5dnF9jsiuJ9O8W5u7tDTNPt
Ag7Ju8u7r27gAn377hbXshvzN5V6gCuyfpIBrispRL++ySMdJlbJz724QZKII7MqQRFFi0tpHIby
yZ/p/F4aV63WiCNfYiuLcSEfYsLiyk3LiNkkTHhZI6bsvSpLebIs+TxD/uyPnbKyVdYAV7ad7LRI
jmjWIjoRiq7RaztOWXHgzyyZeUEBVAUIIwHo+737AsqkQdgcpxFhV07XrIttV2afaADpC4nhzRF8
GM3UiNs3/msOH7NYk/8bh2sDo/8o9ocYVNWANEz7RX2mJB8A6W3NTSParBXSB0Ie3lR7S/8DtXCW
s4u6n0wd0A/TeKxLPbjv6TN93biPP4dmPQrm9KepePSibrPHeN/Jrnz7AKvwsUWe9j4yn177NC9M
ElNXfYGnGC8Ml7a/00TlPPEpjl2uW/HNS2nyOwARvQuZHpoU2tHJgCr8rSgBUsuGfhLJzVlu+GL8
5eD5e2e2BoqtOTq7IWmjJPZMFZ2EIe4LHbaDbvQc7wzeRrF7OJ+Hlmo+CLFFPG7Zb4tdoNWHZxfo
bR6CJ8adAfiJipuTzRqYNeAaAJzYSIR4JL7FIGNhlluRDP6BzQzpSDIyZhKbbY9l2X55kR2nERO+
vm+/vwdIw1/seLVc7O79kMZV5P+wJv0iT7P+GSyR/cwkq5XDRx8dvdjdfSC0LRHBMA/G27MvLvaP
Dt98dPD2owPIhg/YEpyGOCtYfdcPJz87Wa0fHlcr3EL88y8u3v7sEJHffHRoMA++xQVSyTGbzsYw
9i6/vYuvEBP5cFup96Di1f4PiOssBZSLrC6ZFQzCb2gTVlZSBTKhBl68OPzxwcXlBQzUMCnbXf41
C6d+cQHSMHrDoP34cvH69RsU8QhiZMWlRayAFZ8iK8KhGXu1uFfNkUAXd2FPpvwiWKTgCmRDWS2B
1gJa7Sal44KxZFe23CSnSFLhaVMrbRtGzbNEY1eUxRkHfUU4UByBgGfWVNt3KTn+8hYKZdH6irIk
AFc4ow8wQ8nGHLRXlmKSq41+xedaDo0tyjhLgnqhxLX8onlwNGpn3QOF0hiOFcJxvKWmaYyYrXlG
P91h2YCto89wNFpCO0Ix/PIqTOfbQglPlCMlq0d+42afUOIQQVWCbRV5u2q5VofVGIfmNWuFIgdY
ve/WgCaZ8fT25dtAogxj4aCCCmEipU9VbKTumtVjvzU5FZKU03U3LecIlHOnm00m/KbwXmjzbqEK
/+rt6Og1opnRFhyNMNZkbRytZ22KkFZPrnUSya3ow056JuDw7M+k15pHas5SdbMoQNd6i0lYvosG
doFuihVLH3zePfV2k3QasbSFnID9U5/EOV5LAzMAz/1i1sCsgQ+gAZEXP4tku0tfPdyISyya/aIR
hU7O5gSrX039Azjh78NvVwBd4dkLGH7f/vAN7YdccPt4fXOzokdrcqBNecp0bJZS/KLcvXt38bMT
WFyP9w/Ofn6BMGR7+vn52x+8ufr88vaLq5svrpKISiKxd2AExlpf/NVv0gssHoZL8/X5JSLffnEJ
US2mfRABeeJz++t3Zz87geUWZZ3+/II/Zi9fgJwBwAjEWl98PUVWe8wKS3xhgs55JIWo7jvXN9cn
R8c3n10ul0uPkOYWJCTgDRS9/+YtlihjCfS56iXDhUzhaa5aS2S11bNLarpVZP6X2rZZ9s1PrLsr
WxydNuQZ5NRBqqwEaQKwmkpQnirLBNCllLnOAigoGZZZKVO+tUI64gg2WxmuGcj1w0ySrD28lGTc
4suKsa4FGUxeq2mQXpLImxplSdTBTzHeqgfWYxmw9MovLoZMQeUh0uuTMAo2cST9QUl4gmKGomw3
cHxOYfWsRxPPiiImqnRQsLrpLaTuMI1s6gFxbL786tug75MEjh3PEaJp+XxKC9hDPUGwWoynFGdp
7MUY6aUImZx1cyZrC1HTKzpLhf/2MdVAW3eldVPn5ErkiFEnWydOCWLHaL6yet9jdR+w36Pyhym0
3ZhOJk055XJ7I/tz5J1nyvs2PMJIVzzmW0weTWPspzbXnK6jgT9br9cI+Nd/v/yHk7+ddTNr4L+6
Bv7x7F/+5q8O61r8xxf/+fd/99f/1Wv3Ryv/n/8v/50v/UwgeKcAM+wvKAVsAzLBP8MP0VXiZKSy
mDRRZkssYjIEXsTf2gH57n6LqZkK9szfPV7+8hp/V9qEGR9gMMy85F47eEnhZCpZgxfp6CN69pKO
hFWIvMLOzNpwmAJIQnwYOW+2RAl1+BAMjMxWBkkYfhHHbuFDX2K75i83HW7hCcysrFyxffqoXIqK
LayVQ7qrY3tgluTfzinHdFE2VENNl3kzMPC2JUS5CWJVKXxUQVlQYSeF06/40I5Tgg0ZdlE6Gyc5
6ZCsg4VoOmZBypZT+Hmn7s0oJGMnVLo07JTW8X83AjMVtcq7qCA1T8OvNs3WwUsPXM1rqZDa/oZd
u60KSVfcR5py2iyJ9CNRoV45izI9k2O2Ak2j2nF9r1E3pkhMb7iLQN6S9zX+sksoDv6dfPcACfd/
vJ9Gnz4QLC5MpGI81JF2075hKkEumtXxjxa1SRQ5l6f+t09+5OdV6LvwMjuzIV1JBm71iFxrYIsh
4FPVkNINS2t3YxwPiepyGWIfGBAMXSu7VkbTU9HcRa8Y0FJHXXWNmiEmv9/yfltc9NfCJI9AHkOe
0ixRmIGuqKxH9ZYeRnq1hOcLL6TRTt6nivrB6VZyWKTtOnmhivhWiXz1bJHampSWKPCwurwLxRYJ
nFyYVWtD63Y66etSo+0VEhbzR1Z9e9O2L+RdzFvNzjnxIWrpxIVqdhsXKdqlk5BBJMqm31gT8qd/
+dOnPHdzmkEN/NM//5vhwGwBnnvKrIFZA8/VgNgjw2HGYLDKWpY90lIItMgWCFZZ2XU+x4jALIAk
Pv3uEVs9IQf+IOjsn6uvbh5/J9yynIWUi0fyGz1gM82m/OWaix9EiIGPMR4vMv0CtJAPSNJEsqzw
wTUFzmmRHMxM+s0O20hiMGwRkZDkmbfFIskrMkpH2lX+oTX2RgjCjdIBpbZJFcRgfMtOzsasfvbd
ZR1sBiEJTEsm/gnn5Pq7Q19igqIwG2QIrZL2tTMWZwdIleYsTRYlOkrh9C7OswAIpCRkdfxXy4mV
A8gTFyYVs9WKXPzDFTBbqXBUknhYGAxwhWYgv44d5nLipQ5SNrdnACpSUqVqdkgFSIbYqBqoFXGs
LLYU25RatUZUtjozydYYm+MA4uokKqUi/1NvmrZQL+ICY96lYQEYrBLdru3jzr4LhMdb9jWOVu06
hiignv53awNuFYPIGF+pt/8UA+gpGYzZUjp51JHHiuizc46l+xD3m9IWbVTEqVpwI8fArShsvYov
T3YgVrTu2jWncrKPQLMDdOxmo/qvCWqgb/fruOYZk23AsFZmVuu5CTP+4IT4UUv1E5QKkio6d105
Axd9Va611I05seJ1b+9kU7xD7I3h0F5obIJIAw+XvV5MRZ0L11uhJZPE2yjK5v22p40mKqfW/Sah
v07rC5PEPoM6qR+lBmEqm6S34AIdOxWv44PWfPAHJek8s/1PmTdNUyRmwl+rIR/y/rznO9tpYAbg
7fQ1x541MGug8ZNmrJvgbbMLNGJyuGc/P9nqK5TiB0iDi4WzsX5+aAj13AA56/UtN53ies+r25uH
366RChGYW95ti5Zegd/ScNo8qPV7RpSyslJ80iBDbLss5WBiM8PspI204CgLx8euISe4l4EmZ4Zh
AJiATSZoI/OcoSUnYZqtGDmkpc48Z5iIqJgr2beBf4wQNAZUsxyQoWVLumOAlWg7NpPxdm3zKs0I
IBqwUJkzueVM2ZJp1DiTd00AWlk1/mDtxKJgZotMpkzTAUmLCCQzCyOVieXPrbZYnMYHmrDgTVu9
bAIAla26lDzpVRtTaQoAYZpcMGst5XecRnW0DDi5SWvpr9YYZ7cCWbPTHuN0k5Yh3XTFRcXsG2Rm
yAz2RuaG7u3PABZqULL5F4eMFt7/KWwUw0aSZ6GjjyOjMJMRrrcGE3MY0sEf4l7/aBVb66VRdV21
0LL7+/t6QDrCp8CnViiSCZ+HgMFbZBkMUExVD9xHmbkqLJrLDCoMfTu26FER65kFJz2/aGUSqcDU
EuV5FoSbfkxjfjFakR4h+9INtaNV3N8edh1fILEFJ2B8PYeydS+KXdoZeIy9i7rX9lWLMCKMtmZM
WRXt4lqy2y1VpH4iPjRWLFC/6K5DUNoE7Ng00xQSJ25qDRQCeNtN6oD/RV+8k+r2RxFpBuA/imaY
hZg18F9aA4uAbagIIA0hCVqyQXWdLzY11fsdTJg+acPkdOIrqUaW0ndfP9y+e4cNkx/XyMPMnhkU
s1Nr+r3MO04R1/KwQ5bAtB0X+cd9rXWBDw2k+OQfG0O+7MorWrKDmkTI/MXVz7cwj1+RIYszj+tk
+03kafUyX2XmoKOD8QG/AdJMS0gIOJRyhIumE0UzYEMcYZv59yYfchE13XpZdFY4LozDLQOYTwWT
ZjjlTchMbtfyYNKprKY6Q9jHZwzMpYsgecsW0LJElYYwehpDMGWbBENs5aM4ajtxrI323OprAlMA
/SftboVLqwv/suFUHGcokjs0wnk/dxUqMx+YZP1HkpLbDeAROcUR2JOEs0u5RO5+BrjXIvrY3Uck
zwMMyzUO6wdGUVuPbpH16Mhp2tiuoas/giDia/gUXzd3aszoUQuYFp+Dg4Ojo6PrX1wzB8W8vr4e
ntpoKmPYQFcgZTE5MqDdshvUffLZTfOsyZfppddg06WmqBN/Riaa1zpS+HyQ02YxQ9TzFA+UVbSC
fx0Xr/srU/Yro9Dmk9vttMMFFebQRptEVfibbXrb5ZjDnXwov9GX7YBUtk4nzXJ2L9SFYusMc+m4
hN4iUZ7QdeuGaDZNIUaTh5MwRefcvlHmFNtqYAbgbTU2x581MGug1ABgA4iyyNC7qwv8RaBd44OL
VYiwucaKXP3GWPK1IpNe9FNtTr/vfn2/+u0a/MY4OhMYeIxbZu6j5dY4x/5p4GvRQEXgW9KsgBNM
xSJUllmAcYG7hKcdmQ1lPGTpYCn92lF+XaSY+l1kTIPSXAqv5TbMHDQzjfgWASFWF5gimZt5QWeD
s5WOf6gCA7MjNGRYKprgzRg4+UVbzpCfF6o76mh1Zw5YPCTNoGikNWxGtlypSykst3TArxlpISGU
aRmisgB1XENUoK+SaAGtWZLN3iv4ZI2SjZq5ISN8tYkAnq6kuXkqVkyLfNQfWJxyYzBS4VpFJHVx
LiA5MzMH1hqLq+XFbVZlw2wUhLT0eTa8Z2Wx5plOzittWG27giGa0nANsORPZnblEz4FDcYhWo1M
cVRd3G2OYGxGw40e3ZItvB5NlhI+4Xsxnh5F4oEitqf9J8j74ZPEIexY7tdfXl9dXZ18fHL3q7ur
n19toj9Hb6HQ8SZu9rQih7q/WYSCamLIWMXtfjT2ugdpcdHIaUA5fSKZbN45Q9eKqNA3LzBpMqjZ
XaOoYcq1qZ6+UurwrQ2Msb28mYrA7tcamZrwaS04zuG1hdNDXBcTnveatIuQEUl8OqDvIiqn6mZ9
+G3WYJ9j8g7snbzT3HEixrvr8PMy7W0w3gq5lE5MyFNofkJDTHu+51htDcwAPPeMWQOzBp6rAcCG
AaE4LZ0qBLbBByF2gZE+4uDrffcat8haBm+ZgZeZiyxbfsSWxCZb/pqQMu1ERViSMdayIhWLbBHN
EFpmQMlje0fnXzIDPzKVbnu0BVhKcVC6kExxMqMSsYzZcGSxBhAsHQtQAfO6RmRSmcCP0ma37ZUq
gvgUKe2WnCzMiJzy37g6mwJ1Uq5hedJwQkeIgVtWU1zbXMCD3KGN0nfsON9wGjOFNMbOxybbRlkU
VZ7GEps5CMhZtJWiojcWaVMm0JRZGVjqUCg2AXeuIpQuE+syW7guIyY1lrmXTs4s1+y65tic4tAv
GgWatu0c4ORwTlHVAbjbFldQs8mIyorAVHYylu2eRfnlAo0myAuATfDBTz1WjsOjYuxeRJ5g36i5
wkeucQg70cLQW5M+oBodwxXTAbGAgVtjSn3W/VGZc+6wBuPf4eHhu1+9QxiuL7+4NKfl1f3q6GdH
MPNeXl42hFER2H39+GfHPJ1bH0sIMEaGZiX2hO9+/Q6Bt7+8rbOqTU+IYy1bEFQ5/C0mSob7kmGk
xal5ss+cmMUtEKLogREhXPJGvQYG6FGAYRiWSE3Mi1BXwExfCzK82Vsi5o11pwGAibfqBu1IFfnK
2miAuPrbetNncpzmTIG34Dh9xd4CVcSOZBVo6cen6uqe47WORbuQbXmsOWIHbpK5ZV2t2rUNoqh/
v2j5zLeLbr4Y6+ellie2bljz78F1u3jH7pubaL4rqJmxLtro/3PQ9hqYAXh7nc0pZg3MGuhqINkh
k8VSnr0CFQNFu3Z+W+ZoCMQ1+TCTs6daC5bwwUXi3rBHdOJPQRrpTlhLyrKzdvRjlnIw269+a8Gc
iBknWZGP0SDKIjS6tPr5McMv4AoJDZsIaTk3k9kMrfzYz7mokuRmW0Bnv2jDdRqlFRN5UhJhMDOx
BcmJkxmQhM/yuOpwD7fAeEbUjGnLX+06zyzYz6fljLtY2YuC/K7xvH1N7s36xbUluIgpk2myySMy
a5F/jyUJ2VIZMrKZYbPlNu0chuQMT5t+mf+zrb9lTOQNPVhyhPOvNq8y3ta+Vmb7NZZOUye4yD2F
maOtWUgeQhlgI61UgT8sBdFUtKU01/XUlLqsPsUwtPhaD0oGAKBdgATI1uD6IiaqzU2TzF995T5J
1P5KPOlOVOBWIzwXPqcy0LV/URQYcvEPhtyLiwt70pffXZpX8/nn5yBYWHd3v60+jk9Lht3v7NrR
GP6BI/ThTw6RCT2i9bm9vUX+p6enb374xqONNmuTgS35OLQ8Sd8DiWJfGpDcMMMkHO6u7bIi9SFG
fyfsmxrYotDhHm7vZ/s8+1nYQqpCL9OL7nZOlph+ROw1lvrM098Joy+3ruRtVGu9zYoaP13CkFHK
JEzAJYOzO0VX/e8DPFNxpqD/WWrOVBbqmi5MR11bvSQ/9Cvim5DfDMDfhFae6zhr4PerAVCWQBQA
s0qQlok3UoddP7jd0q71M4Nbi4RkyXrpHJvoUQZYxBeDJY9ZedtuTLu4y49vKJ0dg1EEM0neubpO
i3INyRKO0jhsptpsjLUxB7IVpJmZl9eQhGJkyS1nZqvlpxTPMNiYPO/RRTEynFll01hGsIcQ/Uuc
hmtTlP21KuN6KdqHAEldEsbkoRiuwzwpAKkAzMzEODaPe0wn7gsNEkZaLBu26XYasbUhFkqhQsJ0
BhfuyqIFXlVx8qbOLt9IuKJmeNc0ibhWNZ8PUSq6JVvVEA2KkirMgzo7TiNAqE/nZ7PSy/bLrAj2
dpQFt8tiuBY2W1bMjDrPRz1pk2qEJyv0wO67YYDFbOJMfHErWgyaE/ZjYxcb6NQcYpjk1EExPhQg
bTnktaKTHuxiACEG6jumirKUTcHVVRbAQJf/MpQi6s2XN2aqPTk5efhtehngHG/LZfX16u0P36IK
b9++3eRbAcnD1w+LxSIWDLvxzS9vDg4PYAq2cLD00UdH3cO620IPU3GbDWp1Ff3Qv8aLoqUm6jz3
QDdmxovediieBcTrCzEJ48NSdKRuGU0T4kB3aN+KbToZOJtMW3BL8bWPCTv92TTg//qaqb+9rNBo
QhzoVAkLFb+XPGO3sRkKa6NtJgi8n2zXOrGfWLnbKGd4psaqHAWrG4ghqmZHObHiJuGEbtPk3mFt
DMtvaRmnmDbaTsVz7C00MAPwFsqao84amDXQ1ADG8isBhgCNxIIr/APOYRy6qzQLhdvFOhMdYpvx
U3f1N6+qNQ9kpMVdyw2Uxdzl7cxsjWnz3ZTcWEtpyU4GZsJFJFnqlx6BuDD6MmMjC1X4KsOkUfdi
Jx1oxOJQaMY8ps2/5ZAQ0C+DpD55aS7lNDOmBMAFKoJozMTYWOHUiCWRhCs3X2YyRDTTof9FTETD
BxemAeSJX3RUwSrLQBSxk6AajMjwHR3Jm5gz7adlAqh0bjdF8fIBTjjBiJlgVW2a3UBaVCiLKpst
v0vPMNV6Qy8VZlMAypx9AFmJVLUgWRMFuDZpUZdlWqz7+CBNKg5jSjPy935p5uLk+w2/aJ47xYkG
Y2NWDXmiFoiGQkHvQGW0JhuXoE5JWceEypK7O6xMQcV/6kFhMTaywYoN5uKnZwhVjM98dGvCUHGt
NWx+y0oYxqp2RaTM9KkvetN0bzRz6MvNw2tVDOPZdL6K0r1/Ad/m4+Pj66vr009O08AaEXLpy+8s
b25uEA6a3aTrSrJarc4vzt++eRszBkKf4fPpmcM28j8/P7+7u4vRmqNtn+bYwg5Wq6sYEA/0yQkD
96Kpi/7mCFFLvqnCsAAOvUU7xmeELyi++bwz26SPz/4470WttoFzgL2tAEeawW4fSxxtrPp5bCQx
Lfn7Ib4lprRgjhNfC1ahph58yqxzUT9ozrp2YfrxCxO4gkCfkqs5vE9XzQmFMnPv2PVFeHL9EU7n
93KmM7tA5+nCZs+ZApybHlKrou454eGpKx67UD1t0ddwnXfRk9/MxVM9f52mgRmAp+lpjjVrYNbA
oAYWL7BJVTpvBqxBCGF8UFge6Oir5SGcWy8EdWvGMcq1u+AlgsrK4gd7oHEjTb4yw+IalEXuykcH
E7fyNYCTllKJQcutsBkfZGvYZiBtVlxScT6XiDEFdSxIsuOrUTqZ3E7f6ZzZm2yYzDavFmaybJqG
LiChfbXMDQJNWqay9brKf5mBH/FZQUUWxaW/qDg+Fg2fVEENKBHCJLleuzgeWSEolMkfGcHwkqDo
RzoJzs1SzaGFCZMF5jHFudZAWVYhzDhIORiLCG7Tguek3axDGpZ1bexqrs5pga4VxNZPu0xLw4J5
s/pKMxQ79yLbLlt52hFWcoFDtpDEbpm6EB/TMSYS8xdvS2EU2C7S1+FzaJqo1iS6yezRHBpOGea2
DRpWqdHTdAaY04gFn+bwaxhWkcoH+qbQGL/INo77/drjNMEvNpWX5Rc+dle0/R/vA1Rhqr3/zX2R
Dl+xuBcW44OfHDw8oI+UHy7wRfLPzvZe7yFOvG2rf+HwjAgW/vr1a3y9+OICNuc6Kw9xbEBIbS/q
CxzIcHOrr7MNTDpMyDf2zAKotpC2SXpFx6goDh14CLmlwDZTeb0KqoxQV5XeVEaBtYgzSnexrUcU
XDxHRQsOTPoo3/EHvFn8wDMVb/kbICoqCOytUxt+i47d7OcTul4rSksnSQ/B89lk65vHGSq6+bA0
pwwsl56HzpumNj7X6hqSx2cBvKzJvylP1PA3Ptmf2XKXf/33y384+dtvvDZmBfyX18A/nv3L3/zV
YV2N//jiP//+7/76v3z1/lgr8Of/y38nZcAflTvx8iPPW10kegE7LSLICXcXugtC5C1hMy4IM3kx
pxa75tODOA548QCcRORFwMiMWKS4lXvVimDlyptmtREN9OUGWBPP8iHrCqRhM1waVAOVbQPnDJ+0
Ru68WIlmEVgIgK+sT7bTMoJWCzMf8Kp8py0Va2dEKsFMKqRFpVDuUiZifCzQJMSFRWNW+asp09Mq
buJkyxbzBcgKEViFvDVXklDyUACoO2+pzaxs+p9Qms4N4gRB3voLDHn/4hECsIUkRspcwlu9OElh
O5Blc7fdQlpQqNfCEiIaVUFfa2ZpNfJwdCd8UzNpI2j1CkA4lJCSv8Sezwon/qU1xriSxnjCMG5B
DCta3JsmVk6/e4BMhw50dTOIqbUYTBchBcttOWqJRhVWtbubSwHG242oTHj/eKWKC69drGbuCUzd
NBZNSeWKchm6yNrJ/AlxYm5FzsPcXrRvoagJX70h4kXdfMMhnXImasZUGlsktq81Vs+nltkiNq1V
E3SwTZRCYFWhSVPF47BNGVVcU0Vft891n/KIuXU6QnJt8Wv056YM9fskyjlY52EErRm+kVn+Qewo
Z5qip/d2z6/doMMy1I9nt8N4c9jzZX04Nkcd0ujkrT7ZedVP6zle0w/yTijU9dO//Om0lpljbaGB
f/rnfzMcmC3AW2htjjprYNZAnwbWLxZAvsf3K7KW7IGPBFqaeYU0aR+m3U0gf7cQM9Mv4pCHZd+j
tdA8ZrnHL4tcI6GwZ2Hws0ppLZpQ0L2aZR4k9yp8nbETgcAhYlB2SzarLAnQ2DUblm0QmSQ3cNUq
Xws3TnNjr2qdyHPD/HawUGZFG7Aiw2Re9hW8olDUhfmrCmaRRh0ZKF2bhJbVMmN/IkAz8JqRM+2E
vDGSU0ijaCTHNEPOnLT/XtZR7XRt0SwHiIFwVVP0KO9iSp6suwkpLQkjSKpkNDZTsG0fLYEF0omf
cRSw9QEkQS1seypcq+zNNteIg1qbwkmtyYRrRxZLVOnHrjXgUFsjZvYqT9niAOFsPLe6mPu9ST7+
KYwDESqag1cf5m5DVk2LbjRlmJzR8NU3wB0xjllGfVYmt/8MWD9qlcXIRcK+r1EAux7IpLhbVMG+
mraLbC1kYBpimzbq6yrNtos2TB9wWw7DXMeEtcAxJHawWhXeJ3votxYm1quwoZm0tT3Wk/BWs6C6
3YtWDjTYR7+urvGHtO7Vdaca6Pa5XYoGii0V7ZmOWH2ckwRutmOBwS6VR24i36AKmrbWaCdvp46P
RhR1bNqueMNMt0inhEXf8EkcKxd/44WrKz/mj/LFKlyg42NVTEZseNiGAdHfvni3+5uk0FezaYJg
AxqYPonjyikl7HmQpz4Uc7xpGpgBeJqe5lizBmYN9GuAFARXVZxK8HIpIHlY08K5ANMCcnZfPN6n
RZ5AYphRLRC2XELyQqfXIO8V0Qj2PawD5W8WiAyZLPQXSVYvFrjAJbkIdkisUBXcwSZscmUjIS/h
jK08CU5L2nKxsQQZaYGbdKUzEFobJ5P9eKyOaMqJLhtsV7ZgOIwPJBVPPzK6IzbL4soclRvuOrIa
oVFQY0I3FNsW0LY/lplejSQz6TFQv4LUVd49a5WxE4EoxTJEBVm6VvCabETZPCYmSWYzuAE2/kE5
K8SXBi0T5ICYK5tNl/GcZRHaN5tyUcIUn/jKJCa2LbGWxRUyK5XaLx2wxCkM5IkGQnGIg5zViBvr
dG4RYqpUrXOPlDmrs2HsRMImNuKoymRmGz9JLQmhwdgmhoVn5ds2151PcyiZYvRBI24XVNwcV1Vl
xQArN45Zi5ACQoaHXJbz9IHpoGjVyskIycXwdJg2rZgB5RQTCnVuTazqG6/7MHpgBPl7G1zWHWmi
cbW3Bw6LWnfOnkYd6BXDHNUEKiapW61o6D7ky52hFinOKfg00HivjqDiWFU/nmOA589OVEgUsgnG
Q68OE907pIk0prdNhrlx67mtGDIuQNElCq6rRRrsQj4z4uoq2rFXngH993Xy0L1TKX74UNcF2t6i
Po9jsiVJhueVYht5Y40+Vj0CD3BvMXFZaqkQ0qYDfm+vqZE3/zfp9gzA36TWnus6a+D3owFyEUZF
O6AaOEKjjCW/gjDtJa4DcslLgabWiMOQXcBJ5BSE6DuoKaEK/gMuggWYP2w5MuAKEUhB2hhLQw1C
mSIgBTmHhsGNBVhbFtsBs+n3Jh0sAWBD1qB0pMSFpEp+vCxSH1Xwxbtf3q1v7/D1Hhe/5AW4DpFZ
tcy3hL2QCkD4cHO3QuS8CZbZeJkqH89LmQUYLD2faUS00zVyNgFwF6kMpK0UkxZ/ca2KK1z5u1Ha
4liJjAkX7pwVFWI52C5ZNIzz/F6G5O2+GEGLrl0GXaSNmiGMtKp8Upx08pAKpRnWWNc+dmYSAk1s
y5N/5eievhKn2TTQgG27lVtzowTzkM/ma+obMbNa0hlRKNdqF5TDby5MFipAYxwd2u3REB/RFoOY
Zw9fbDhVIHEMMQEHRsDjg9G6dq6Uul4DkQtdFZn4160u+hQY9RxRvB41Thn7DorUB7RR7U0+seG4
5+0YXJTW5tJiYgVpIqXUd6f00lY1rS95N4v9bWpDFV3CmsA7g+OoQ2BPFyp0OIB8DSoocMUKdY15
r+iZpqnL0uuofklsVBJB3UI78dNPXo4fvzrV9D9KffMCsUdFAeo5sl7hXZKmSD09pHjJ1OxdPCOT
lONd2lrKvloDeciW8sTo0Rq8aSD7eYrOC7F0ixd7TnzowptkeD7CQbfQQ/EGGNDSpvlmBp76Gnp6
vBmAn667OeWsgVkDQQMLneBKXz4SCbloB9a8BeFk1wZGgFvcQoisivgDUy1NdmuRHS4eUnYwDlse
+M/i/NOzve+9XqdDblaICI4ysFm7hZA4RMOy+dXi1rvbdw+397hWHAjGIsjoL5HcAnfxFzI8yDv3
/pf3xFQs8rWdkANwEvCyq7Blbh+z0PJCwyxWTRALPEZWHi1F0g8qhNt1k6ZtPS2HYZpS9YPHeuXT
jCHDq1evrs4v7r68Xd3c3f/i9ubiymgTtzZiBGdp1ssOSbJotstXJlgKn1sHtxAZwjCC7RyWHblN
4NSI2SJtXyGeFW3/8JXVMdO6tQh8j1U6VWGbTicbu7FoImerAu4SZaVGS8j4Gb/VedJJSxuReMAS
xjGcxcCFKU0VkYBpVzMUZVrihTW3/pZtwmhN77iavvp4rBh/I8dIZSb35E9hBKPwrf1dLNyEL2wL
saiRobCLutWFD8umEP4UNTbj1LhSjIzj12Jk79WZUvpg0/TRiCcqsKQ2AcWQIa5rilHXsU/avk4Y
W7abtrCYeV8aZr+Rjtxkv7p3dUf2sQ/XswZliY4iw92vnvvoEb05T1FjXkw90o5O+5ZmsiTNIkbf
HH0TZGXC+EA1RWoxXrM5BmbcrBdZ0c2ZhY1hs5gTibNX9ewAfyWZbSTbZohP6MTISRhly1TFHI1r
auB1EW4Ns+sWz3j3hcaECvGL0aafIzxfAzMAP1+Hcw6zBr7pGhAfai1ughasAeYAnQY3/HK9XAN2
sIEUnGDpW/v+YYEtiQmxC5AMOcqAOPusAnqBLvKOBhC9eP2911dn51dnF7jIZmHbKXolqlmBwcQ4
WCSMVJAi8ZhCH3Gcz0pbSpOmuOYWvzS2RJnJIQNSmayU4eWuOS3joB3AsKEdHKpZhDZqwieZtc1u
aTZMVJ7xH1daXWwfR9DFD/de/XCPPGZLZJWEjG30q0OGmLWdP2Rp827VF58Q/vdPjl+/3ds/OXp4
gA7T4lvEwT8ktBJZfL6FTFbmlqw1xiiOtdBfRLYLCqCNyKiT5EvMfOwuhckmVpRIoM0221Viy0Sw
jJ/O/k0+yawjTiGS6ziKk0vzBtqTxvLhwOw2+XAmziMkmy2S7xiQmyQolFJpBMNaZ3s7g3SCcSoi
MTwDUPQqb1tttVbRPsmyGVQpdY/ZZ8qoKOJHQW42ypnCirl2JkxhMbDA+lOPxvpifrDwWJeCu5rA
NoXNav0MYHZTmZM1/KH0MBEUh2mhLUwBAFMUOLlWTXlQF6/OJIH7RLJWM/mniV3TbxRgSMktTEpq
qBXofGUXPY9Sk20cuqYK1sy9KLdWTjfVAJabPJH0ehs/luKNMnrRehN6Dxm4mNoHR2cEWj2nDzuL
/lPMN8WOPSReFMnfPKNyVjkWz84ADCcOz2C/6bf+BMVHaapm53hba2AG4K1VNieYNTBroNAA0eIl
j0ECbmn97VqIQn9jgO9C5PXwfkmsxUrRlwsz53I5ruI80qqH+Gvw6s77NR1l+RcWXTo522fv9eur
8/Pr8wtcgI0R/ijn550XSyQG9+IfLmyzX/3jB3ne//Ld+vZhdXsHm/Dqy9uD/X3cPdg/ePeLewSu
bt+9u727l2MzPg+/fEc7MLydaUBmKny9/eJq+b3XL95TSHx49qx93q9x1/yiV798B/Psm++9hvnX
bt7f3D3gFhTyyzsELhC0u3vz6fn9l7f3N7fXZ+e7u6wdHKQRE/9Y0C9uj360j9ylHIGr1re+2l3u
LBY43OXo9ARY+A45458qScvwzR0ko6O1rnnx5d3dxdXdz29w/e4XN2/fMs+HL+/e6R8vru9uP7+6
/eIGMe+vbt7+cB+54Xp1rbu/uLs5v1y+eg0wfkDINYzPDIQ8V2eX61/c7S4WmIxA4M2nF1SyrWeW
5Rm4qwmCdIgRsrXa0CCctGYsqsOBTefa/UuB+sfffvUKI/xExWmSIvUHeo/7scbZH9sOas4FIUMk
tzzZ39ICbx1QrE/TOpdlzP/tG2fHEW1hzYgw5rfKfCd9jyPd2tRjWWxhcxgoczpOIJMPErmpwELC
Ik6hzCliTFJzGWlk5JrVXkCIN1ZfmR2cm2KdtjhF79pW/11pouOACWxdyC8mKaxP85F+ve36mdOe
QROg6ciwIYqJ81AWzSdi7MJYoriV69ls66Y2IoP1zk9NmRKyFpzMVwX7RYEjjlqFOn0sslyhiuKW
Jc7CD/f/us8MTw1QpOHmc2FMjNhzxrpjMR3gHclU4R071q49NeNd15+vOqQrTN9ckjdEG9rVEJ1b
HmIX+KGLjTWmgfn+czQwA/BztDennTUwa8A1QAjSvwWIhgOr94TSxXtuiAVWBDfiIi8oFRm9XJhn
cnrjv0cOiV/NFrqQhTKqeO97e3AJvjq/BgbnXYRJUvkMYW6sha8sMX2YJz5Axzc/OVh8a+fk6AQZ
nx4d4/r1wf6rH77affN6982eRcP18oevcPH6h3uLN3u43v/Zwavvvjr/5NTXJINp0weG0zew7r6C
jffg6BDRLk5OFz+EYPwsf7hc/nAvC4aA9SXMud/fO/zk6PCTkzff3zs/OXMYO/z05O1HEu+jY0bN
HsLHn53i2NLzj0/urm7A4a/33ixy4bjwavrFyacnrz86wBji1XJ58sXZ24/2F99anB0xT/scnp28
PUoRzr84e3OkCB8dI7flj/Ze7e/h79sT1uXy+FSNxM/JZyevfoy6vDi/vsTXN6/3Xi2pJXyFwu2f
fQxlIYCJh78Gw3SxznHswu3nBFTe5VCYafMtu7ZAeDi7MMxWjM2uFriao4fOSCvBcsolM7Znm7O3
EvOmKTEU132GLB9Se/y+QV4c6dZxiuJaX4vRdjTWNYeeE42TnaL6qjmggeatWhsDCiwiN1Uakxfa
myLzBPXWUfrMTdZPLH5kj+ZQuA5sRmsI2Owkwz1nQBUqoCg69naryFP6TP2kuHXRbvUwZ5/CI72U
cSbj4rYN3vvgV3qbNNM0MCnTfLGM1Wu0zxSs3hu/nm+KbdSVre4MTwuxXClSgbgILQi80MOT3pOb
4lp9vjHj0Fdo8TTVwm/byWL8eu5DIUlLtU34OWXNacc0MAPwmIbm+7MGZg2MaYAIBMdm+DPDTPry
YedxpZWlsNOuue0zbsOjlSSE30JEoKMyBpKkppcrjihfLh6Riu7QWELMW2t6QdMpuoO/QQwak9Ox
ScBsfGxVMA9Jot1UNBU/N7e3D1+vFI+3rm9vcHH5yenl+dXJT47MzMiUdgjTyxdv99/cX12vfnl/
fXGF8OXu7iMdufXxLVLeL45+fHDz81vYeK++uMQdGHXN4ImPOWPnbZxYl9evCI13797dvbvDxevv
vlq/T1h3fXt7v0ri2b7WEAk4d/PV7dvD/VeH++dfXCy/s7z8+DSIWlXyxYvLr27XqiY+V7e3q6+Z
FU+PyBW8/up2pYLwgRn4PkfAb/Dhjw5uLq5hB775LNVFnMkPslVdXtzd3a4eHt5+/w0IefX16vpX
d6jwOttpzcHbhhpqxHRBo252QkYm1vS4y4u88Bh9A4H0ptaKZcwyWM6Ig3+WyrjaFi3jK6ph3cMy
NL3LCV8XmgdJgek84eSXbpVyC149tLUIUz/NAVMcwxnabTOqKxisOQCNgcNGm6kVeX68beo4pJCB
fLYqYvsaTdFkEcchqibn3vKb5OOdxOrY5EmE17g7uZrFjIlbyUZBq12Cd2xcRENrFLKVsjk7MDDv
0MijRk2PZIwxWUtW7nMYb7yVfS7AovbLNjBVUZcy0mrWKPETQwZYPd8afu243mL/f2JHKoQstNTf
ve0dbgLEeZyhCZ360auhdMID1SzCJyuj8XnKK6XTJYoOPEGYOcrTNDAD8NP0NqeaNTBrYKMBsOsO
HZvBG/gDVoS3M2CYjIrFwI87K9xZPdrOzDAO67wcOD6/f9h5Dwdm8BkS7uIUJe5CzOORsM4TyZmq
QNm7X787OD7cPz4ERqp4rR7mxyAIxSMVrvhXF/l+vqXAF4efHu7tv724vsYK28ODA6741aAENljs
44X1sadHZ6BZGEv3jw5TAWasxif7QgP1T46OwMb7Hx28/dl+jpbGN4sdejgvNzz84v7+HnHevn6z
93oPF+9W+ApNqNwssL4xEPD5+HJ1+ek5XJHXv727+/Uda/f4CNnSoYgQ7wdvLHnKJa8KTnKG/8Aw
m2Lm04DxFYr2hMgWxmfW5fjg7cepyrYoFx+tnU7W3asv4em99/q7r8+uL41R8ddQmQRrzWBbWGe4
BdOq6VME0KxVEBdY/2yaT2l1ipItw85G47ThGUepdjiTITd0q9XLsVyjX9zFB/E9pl0g5F6S2CcO
m+JAivfC6DANXyaMFxu+wVaSDWiazJOFKf5bjJmK4ZRzi6WKVqB6MNq0cfUy/9Oq+UeSqkeZzeC+
Uanrtk+Tru04gWKjYW+mgjM3AtT07iF1JzFceaZuuxM9Re22xpViWsdljkLa9WCHr+duKBg+eVfq
1LH97d5j4mY+USSfMughPX+Wm61faKOPRYemOXrkTB3AddL/KvCO5I92EWIvrgifjRCfQInyFJMU
RRyfMghzBwNail29fhBMJH/Nbt6oUR5vrOL5nPaejKjpL3OTxJ7EUoBQdLrVN99UPHHdDtacu/Ea
xNK9c6aLrTyfixmTbd5sc9zpGpgBeLqu5pizBmYNtDVA8x2XgO6sd5b0RE28wQW9ay7r3aULNOGY
ByPtvJdpjr9T9n/gLwLW4GDC8PvdFAGo4qgpw6nQ9wjmU+VPt2dbKZrdjO2EG8IOFganX98AwIuX
m0CsCr67vrn4hA7GJ5+dIfLFLy4wAMN+yw+3yH99fnm+/t0ay3qvLy43wxddAfVTyPvd88uL9e8e
r7+4uvn8Ov/ery9+cYms7r+84WlJWQCIenR2cveru/NPz4G1uDj+9CSbMJF02Rnpvl/jWN3FewZe
nJ49fPlw9dnlu9/cn5wdA/lOvzhbr9d3l9fYIssKhWLzRWLCLEyS1JhTMTd2Y1QjJdOti5+rLudX
ZgHGx7GZPlq2WBfRvrrZ+RaX1N58dUPWVSYp23xEE0PteGT9kCOy8a1/0FJqOCXMJz/hGhZgoLh9
uJ6c/7Um7hp7hb7O57m/8SylJEkWDLfSXY3/KJJPSeQFkFZcZ7TXHC1ZvFHLUg05oeK/j8to+pC2
e4aAUf/F8NRvDYzg//hvbaPcGmNiiAOGZxnnIEzhzZmFWoStITNmUQBnXw8c5K4IS70THxNVF+Gk
ti7a0+Fj9wkPQpy7sRdgR101/HflLHU7XGL3FNmixpHJ7VYR0jdj0snHoa6P4ibopC56tHEKHG1P
mhQTE0bjE3rOaOnNCO2e1jeb490mvmD7C675NqKvpSsFCC0y8kgOvOFD8016rjmTq1FJPR+kEGbS
vWhHflobzKnGNPBnGEghzr/+++U/nPztWOT5/qyBP3YN/OPZv/zNXx3WUv7HF//593/313/s0v+X
le/P/+LP07pfuj3TgXmXWygv8TNkSIO/AA8Yfx+039XicQE/adgAgZoPLxe7tBXzBNrdHRyMtJCn
K3bA4n6/sACff3p6cXX57t27NWLy5CQeqgSTKfNPxywhJsrlkcKwIYOXAIS72hMLGSCTB24oDQB/
eJCPtG1TTCOzImB7auynJYqmKVpGRUGXTqYludG1m//V5ltwJ2ZZNDK/X7oFEqz48AJO4IsHbjG9
ALxhQ6Zd7C6jikMGZahAuoVTRdAO6kgJ5OmdmDC5kTOHRwyy1SVgDN8hvdu+UNAApLWfTxLdirXG
e5xVgwZSEl6wXsqfyaFetAL+WlqpZbOhtKTVIUliSxMVJlabYyDBagCBar/dP8CaYUD4xc21lWVZ
URXhICWICtlIs6EsBFpNs2IT1lqhFsiylCopxAnWUplhWZHtwrY922SbcVqNG6TKW20j/+PlAW69
/dHbPitfPRpWZtt/RgfEk7PsE1V1TAuY7aIA4KZVZHKxfwoRp2hgit6acUz/7Jn5AJipKotWSkvj
NrqpWXTiRSooMuiT/EnlhERehWlc9+HFiAIUz9o0kZoaMDmtQZ/VuM+QYaBppva0YeX0GWCf1Cd6
Rerr5M/r7XVXrwHY6jFxlipVumvsnbhopa/oSYoca6Of/uVPJ+UzR9pGA//0z/9mODBbgLdR2xx3
1sCsgaYGYBQlt6wWwFdwI3iEO1qtE++8fEDg4v0KVk1QJc10L1eCXhjxFmAqfAXswWN4DQQG9b1f
rJGVQAlZHH9ycvdrRaCD9GIHq4XJe4gJOqOF2U4/gu+0eVALes0fGwCJLbh4zC8kMUQEG8M3G3yu
c5iAu5DV9prW6l+dAyxrtvyo6doNioOzMFcpIx9iPDb3YgQKABs1r0HjnMdl3bnpNVb28pa2aeLI
GH9WrAu4mdZvgHTawRj3kSdPcgIlktCQgmFUDldNg7Ft1esu5SG04xQfHtQEbSMVgVYl8ECp5I2M
eiVb60L1EkbCls54ZGBWnAXBLRk5U3u2Q5UOsrK01IDOcwIDUwA7MRj3wNvLJegXRviLX14zpjqD
Ya0N3xOIZprd2CJCZAdgEqyYWXVXGwQC94pYEfzku/bNmNkmMqSltAA4ZeV1Uf6oAr0P8kFTSr5Z
OWaDmAIgrZT06bNdSCqTrTS8TPPl65TS/2XAAFWMwPpixrFgPWDtzb/YlyW1QmqQUt6WllLOowoc
1vZENXWjRYaxFvf7RX0L5TgCWTT8bYZYbnZ3SMAahAbAoNmXvJv1XxSoFitotSuqsIVGm/K7JLEu
A60c9F/gpT16G3n6ikOMaJ2L8wVmzPSQWr25pbzJ+i6iWqJKXcL6Ykjy2JpjBu2BFila02KWevMQ
05IbeIuLppZasjXfCfGJqDt/OXVYYHbdLvbaLF6eY29O78/1s1m0DlyxUkiw/2+cFEyP0f7sknRF
HXhhFh3GiktNo4boiKSyNiF5z+fO5s8mkrfaFg/qHHU7DcwAvJ2+5tizBmYN1Brgcl86Oe/KF3dn
sUPHEhoSCaJrufI+rnHELslqLSPeLqCLK4fBpfxLkyYdpLVmVxFAifgZADCTafFXDrFAXwTiFgyk
KBGoCfBbczkxSQ+l4/cEsEebJdBXYAYIRK4QR2XxL7GQIE1w4q5dQkTKK5ymJLyg8HDn5qhxl0ng
vK38cdqTGXxoqgX2G3nK8ZuiEphfvERMIRlX69IGbsZwrHJbk94pLazAYm9EZEE49ol2cjsICjse
J/snIJSLfsm9OHvJzkzG/IL9rL5fmrbkZ274CgFYkDLZ7L+FCQKZ0ykbIshajsOoeGAVBGFZGuTj
HzFYe33h4kF/kw+z6B15vvt6tdzf2//02PyTWcfcG9Q0ybycsNk8onNMKwNJqGt1D5ZkdmNDWRmo
EwzL0ssIis+CjMaF8WojXegMYTVBDtRFqk+WTXpLgGp3GaHrAm2B5QAuR+6MvC0wjsUHQiyaj7Hs
Ig7x6+G+F7rlRRwQO8/HSg2M3XvH92G4lsSpQwa15ANQT957MZDPlqpAdGz2dv/u/t2v3mG3tjp1
gYseIXYA06GHFDi9vUTdFMNU+bSOF0ro7clPkLsGkhgSR+oDD0W33IKBO4/eQHGR03ziqVmj1mM1
oJOilbeYIerT5/D7oYfxinJ9biVKHrm0HX94smlyew2/LrboYE3y9zmL+HqM79X+jhqn/PxBLp5o
n3erLzZTlk94FqokQ3pQxTvzCALsdkgxC9AzifMhRJ7zSBqYAXjuCrMGZg08VwMGJIl/+Mq39/6G
jnSyKyNhRyyAImPDTArKolVTnsC23JfYQ9ZNEAPeIY8ts3x2YYZV7hqtu+C7XKT2T85QJmoV+m5s
oumuymIh5GFdxA/ucissy8f8kyWbZbWpplIpkCt5lKfkRyAojmmJx6B0hEMwpYUnMwdGuCa4KfOU
/YJ5ydIr8swGjVxZY0t+YF7WX7e/vqSBNzVBimN5cr4AjJ2L4EZfygRFwcMcqInSd/FFH9yhGd+o
cm2V5U/y2nzRCdgvWS/cyEmSvddDTNHm9qzq55nsrGFLmDRr1+b8rMGi0S8FsJ6Th01WcfaKEJiu
kx07obgJAHnwsYukljyhzlrrrn3iCK8YSvoAPUQfvOzjGUvklpA4yom3phbTtSfkWjRtNbGCuK7j
TC7zg0UcsZROLqevvpYBFvZf/vzy3a/fWfNj9QS+InBAA8Wt2Pp93Ns7ZVDXYoDoitkQpK1DJqvF
WrxZF58QiUi/TcZVXH9HDc7gvMax7ZV53LjORPV5qCl9A8fIJTnijJIpzT71W6Knkt6sfb2ifgOM
I1/B5/aw16a8OiQLWRRRN9a4DF7f4TfShLavW2S08/Q24qgw8RkJjcgMHSP9FyFaWVuzlrWWNiH1
xIS/n2MX6valiWqvO1V8CTdkqBvrw82HTmjhb3qUGYC/6T1grv+sgQ+gAR5uRN6AJZP2Wx5rJJTF
ZOcjKZQGTPkPA/qwEBf/oScwrSu06Ap46DyMHDgkQlZKxY2K3y9gupTdWP7J4EHtQfWIv+JTOCov
8NfckuVdTL9lWVgNf1gwa8gLRWBZdmEMiYXJBm55sW5yPxaDITdanukCLVbXOU/8h690bJYjN42W
dFqGqKgdarSzfkRdVizB1qlyB+kF2B9+4KgIN8fGV8lPGpSpnN/440cQNUMxq6AV0VQCB4uMzIRU
l0IUWXZ1lJUrS8GQP+MoO666xiQBFS7mV3XgjL1CuC2jZXKNLQCfWDttKqJrtJKDxnmhxoNadxP0
b8y/rIL+4QIxCf86x8iqpnZJvM67GVCt6DS4yYSsNsqezEpoHzVWulDVNE2QJ1ksT9Y/m4tZF61w
tphWrvS8+dSowILyYD0aGVLRxTh+2MxiaaKRKo7w/Hr74c4A+xW3Il1Almhzm57JRieF4UK1S/mE
qg2HdMaRNRaG1hm+HIBPgO7NL28ODg6Ojo7e6oMLfEXg+rd4bPXUdVd4IgTHeuHfcrmMbe0KjMKk
CtI5IvVKXBTJU/xu4yKO4ZlFfvW9V29/+Pbi4sInel7hg3D7IHLsQt6XXrxARbB8Hcn39/fv7u6Y
YfgULfvw2wfUHRSKv6uHFSLjr4Uc/uQQdws9X35xCalwd/9H+9dfXtvd1997bf9w6+bLm41g3UcA
JndouxR7Gp9QsNUKhXbkabKKx4gPUfEwKuHZ2dmbH77BBxemeShnT583P3iDf7iwxxwX0KpnfHV1
hbumSdyycOszCC80hq9FIL9mye++usNXayZraAqE0t+8QSvc3t5uAhH0wzcHPznAZI03IuOFcKsC
JEFDmEhwcDj6iP388PDw9pe3Bqh2FzmvfrNCK7Mdi/mCug7h1VffjJ2qOWHRfh5j8zUf9jgt2GxW
6zzKxy8sYny5mU780XYtMV6WoU3mTSxv9aUkXb0epKs304P/djTUbHXhL3moFH4rLcQurLH6Z0la
rTeHPUUDMwA/RWtzmlkDswaiBh4fgXNYWIu393LnEYMquPsa3GFvZ6wexaJWRICH7YpnHb18gNPy
EkwEokNkGIVhIOWGTzDqIhHwGD7Huw+wOwqkacRMW0Pv4kxh7DWl7Z14etIDdpyiZzJ+Hdd0Tian
AUp3EzZru6kFMqBIyB/IRzYWEwKbiYiKwPWtLPMlwhWBmwkv+YukYa5coOW3zMhLwbYI8+WSzIxU
OM+JMIl9vLial3Zgshb4S7ZfWb+J2SxmyWxI0QhbiStRnPlCs/o4GFk/hMjefiMhOeLj/3SNRiQz
KeA2HJhRIxjS4YxNqRIQrrgy+QWHuiie8Te2UM4prOnFTV90+UJjZkH2djl7J8zEVEX6AcYvsRRD
UTENL6u4iae5Dl0wFQXlBIc+cl22i41ZxrA+J7CKmXrTx37vcw5WAECaPclZN4MxblHbBr1mHLC6
5wuTDBGQ3D7JsGzzHDmw+O/oHH8ZoR6d94WYPuNgy0MKu8eonaRH+BjcNCLV4784XmwmLwe1xTEe
ar4UJ4g9JWTT6BOqs20Uo18cmp10LlXjK3njl7eWW9SGCUx/6d/cD5RVKrA7oEfa4eSFiRInot3/
+v78/BwIdP7Zud9leP6UWspKBoJenF/ArA1YOj4+tmgxVYSBs0/PXn//NSLj7/nZOWLibxHitQb9
Qh4wObDq/PNzwBtvqVyY0/E5/fQU/5K0Pky3OC9fIBVy7mvcJkTF5qCQr3Nyu1HPMcUWqh+WcBe1
wFTI9S+u8cHF+QXrbh/g6O1Xt/iLj+sK0ItbFBKnr9/cxHKikGV4IUN8zHWN0oG7EMM1iQsoGR+0
3RkOIMg5IAQte4INL766u7zcMDD68+3NbQrXafNRk2iO/QNOVaChUZ3NlM17Oj6cnp4ef3zMaQWf
ifPXckWkTmWxjm1urLXTDHG+tbsRwq3W8Zeifnn2l2KEaW1XMGcxAbTpQp7bwMTlYImxBScqoOg5
lM1+sMLcmf2gW8dLFzYvPNi9txJgjtyngRmA574xa2DWwHM1AExdmK8s1qMCCPnjBGxb2BpdkAn4
DVcrkDAwjhwFJ1u5KOv0YBmBsQgWIbgGpIEk1/xi6CjPWwMt2BW5QZSW1IJxuLoVd4lztFASEXEO
Ey20XAcLEgZbAngA4UjKlcOMxmstGMZnDQjEHtFCMlqHkEM+SMmgNHEvHYnJmdxQGq7X2BcaFyiX
lIXFz+BPLtBF+HLFn3keCqWKQ4YFuVqbFYvZgLsIwS5fgAfWIknFXzvWmJt7aY2uES+wkxFgcM6o
Cc1IDxADmkRl86lRaQUySBhiMitbYIz/4j8yp4P2oQEuexaia74g30W1WVl6IDNn1JGALbVT0WpE
fLhcWfZqM9dLb8qfHuwkUKE1y+XKZFlclWfm1WyqpboDvrIuKf+wxFe8yhzcwGu26Ay9qmOqpFWV
zRFmDtDSeXihsYV1GsWk3F2LbjFyGraX5jye+l8b4hRj0DrE5O9+BoyfzVsOusVgsebkKZUpx5ch
zcBYeUqqp8UpUoFjF4sF6bf6IBBzaw9fo4NsPn2FQjlmg52i7V69xbZrDbthxYVxEozUIL2q3b0U
YPPyu0sIBrJyaAF54gNbt1m5HQ8ARUeHR0iLv2aHxF9YC3GBv8kymbMGBAKokDnkgTGchlPvgXmK
Cuptj87fv8DRbuaiDLaHjRq2U4hqeaNdIACERDjuRlsxpIUBEyHOzxdfXMCGiaw8N9i6UdmLzy9c
CWbIRUJSeoS6jA1gwpOPTyAtPoBAY9rYmkV3hRHdgB/A6VZfK25oaqzvEdazDAM7Pqdnp3ZRt3LB
nPj6+tVrsC6k7XS8l/QaQPj1zXUhD2qHFl/drxbfXiCC6we1wBQAWpBzCjV5It6EuTbrRb3de/A5
2qjXX2vOdXVILKP1pBSzJ/Zytn4e329TRG3MutY0bhnV83qtFwIi1jLE3tV+hxRTolWJDXSfVL05
0hYamAF4C2XNUWcNzBpoamAhMJGpkKQni+UCMIJQfczMSAKkRzTpFFccieL/iEf4oYezsRN9eqOt
DlntYMGw2T8VsxjxELS0bzMTy5KJ/zNbciMuYM6ltVmIhT9eLtmSSQRR4GdFIDfmRbMEKPtAcu5N
rQONWLu09BTpQL8yzxKeEQE7UduIAezKpbnMk8JbHvZhKlvKayXyw199BOYAunnjK9KaAxiyQggm
FJBKxyOncYlytvFfmm6nojIVWtZIaEVbubpOFkhc05SNUJzhjD+sF6zusCrL6VqHReE+4vPoKZtZ
kHatRvjLVLqmFT1J7yMYH0BwCXT7s9FAbUtRik22XtNcEDK1OQjXrFcYqVKdtaIYH3zNlU+SDI/t
mmg0cTg4NHaJgy0TZMuZ/lqwIsSGhpa3XXhIHKj5rRjTk/RdDNhb/FadYT0E9N4wQJhT4hQtAhhw
N+a6w4GBySEaxfrQ2XUS4yPQLLqj2m506wlo4alcJAuZ4gJtMVHTo58dwcSHa5h/adW8vQW7uk3Y
JMc5l3KpeQFAsjMv8ZcQyyc/hbgwUI5pz32e/Rbx+nsEbFBlo8oKAgCbBfjk9ASet5Bnd3fXIoPN
YKh8d/fu5OQEMqOayM2MrrCO4hrlOj9fXV6hard3twhBBDD54cEhiA5V8KJpvf3VHQCPRlR83NiY
Xz7Qz+53UulQstXdPu4FbS7QFggHAdhd0Ssg1cGPD2IdB2Z2PJr5VNs/BqoPoGo+18BpjvwxF2gA
Ko3/1We5u4TwU8IhLQy/tG9/fg6Zoxc3JgtQI9d/yq1/VmXb+tbiWcjUN2SdvpYt2ITjW2LgZTIk
wPBrdvMDOuZ3kCWvEdeAfKoemtOdlnjLX4S+tpjDRzUwA/CoiuYIswZmDYxoAEZdwBLOFlqRNGAs
fYAnMCBK+zzL2rmj5aMgUjguv8cRuFgxi9EJXaMBjaQsnSeEBagPsh7ndbOEUp0JBF9oHgKsrYDp
MyzqBENjN2MYNvHDwyQ07TICcpMxWEyuXyTwG88QspXGZGwC0Ur2XkooAylQVg7JWi4rXmJtEEPh
KAVyGoR7HMKXFvQiI4qBU6A4nlKh+jmUnRZrgwmcyoprpCkGqswIMj5TflpQrSx+3axn1rnEWKNL
CVlHZMW1wRCJeRJWURMoRwqhVq1qrLQWHlu9aGfWBASKoFSaI1jAnxysC0sv1E453j/QgA+/dGQi
s+0u7cAABpmCiVXKgb/xyI1Vtl97lK0Lliu7NO9yHXiebmBPyDGtgvhmwtlH2mYgK65lw/QpcMNv
niVJlUyLk9PGzlJgZ30vFZEhWdpLLtDocB6uslhivMjilDP6fWjn8cuLvhGMD9ORIFoAavj/PYyB
ilr0Ch80MxDnj+2WA+3o8DGS/3SdfPj6qgNgh+pIKcmTOTpUBwxwGeCQvP/jfcAVOMoDAbQAVNyK
ZjGjXITACIlrXDj3Ogl7DpDEdsymwzO2ELOPBDAXaPhIJ6/dCldsZoG2dy09hXg739qB5dbygNX3
9JNT4PHxz45h7EUIhL/6+RXWxWDJK67NMm/ISlPn9XVaII3X9G9Wb3/8Fr8gnhsY9e0+TcRY/spy
Ww8LaNkKwgcXpmRrenN+tk+sO+KgdqhCJG1OU3LKj5/H3yUXVpTYwV3zav7KXJtvU56PL2CFBu0j
Jv5yIW7KhpFh48WUgiktfiAhFmlDgNrmef/1vQkWb2HiAFMewF0wMC3kWRWYGcBXiNRRjmNeUWr3
aw2xT8day9ln/UwAf/XZRXwrWuRu72pOQkUjsF0Xc3PIqSN2NCybPC1T86BinnhzYBJtk6PVOlZ8
WmM9UaY5mTQwA/DcEWYNzBp4rgbIS3h3w81ZLru7jwtsBWzH5JJ7QZR8m4NXF9z6Cc63WLvLrZjg
JbteYL8omhZpk1k/PiwJWtog6iVxF2TI44MIvTA47sLOCMaDoXiBo4YwmCNVcv0toBc+ybuPu1xo
SxdlkCXdgLXqlUZa7XGFY5bwlb7NCIEwxmxaVAxCQ97AQFoyZdDGvaXwGEKaI7SykblUS16RIYEZ
ePnAPavI7bhHUtWaXqEgViNTcpqg0yrlpWzFcg/WXlYqFNpDWajOA7bFpo80Tz96gKM1akerrE5+
4i5c+I6yMJx9D99vnA6FQkmwkIxKI2DD6s5xlvIk29OuaypK+4GZAzkKBdxqPbCag2bSl7tIIESU
/FowLG9qKg0NwQZCdjqNSVqy6QCbF2B8xtRhTgylZzj0I30qYYoglTIC3Cy19bdaFmvCeY0WZ+la
mYyxocTmjZUZsm3L6MzDmGSx8aNFy1KlceZSd5nKFlsrIeJYZKbqma0386APqiJONK2FOb/Wf+OA
xg31xVDMPQN9HD9gHBgqbMRfN5p/Y/WpluANHuteK6rOZHpILGiKZfUJcRa7CyCcWbzrfwZCAy3r
2h0Y8Y/DQMMDIjRbAFoYmWERda5jJIeB/hmQq19cAfxg+rMto1z/AFoAKlx5DQasmjBywrCJPQVh
VjWDp4XgAn8LX19QK1DNGHjjK97trjSlWk82afMFYDJt0YwV199dgmDBjWb2RFmQCoZcxCFGv3vH
kO+9As4B3mDwxDWtx3kBMBybIRscofEXyZHbzfUNcvP9t+BZDZwG3SULqouB2FlvUA6YENLig/hm
1B1uO1QfNlsYTmO3h1RUlz4A7yTkyxfEXf1LTVs93Vi5C8u2gzGuNxZabnWxAys36kio9g9eeqsH
sOv+2/3O2+k9jfyo7GaPsZwEWrWWSrSfG8u862Fk3qxnLjizepPEl4DdjCH13SJCJ0nRe6NyIum5
SPGN5zMOeccp6Cq+ZKx794VQKp+wsIW19okXNXJbBOfzIkmlq9iXNlNv4WEs3qixR5WZxVmA0BPa
Cw1aksxhT9bADMBPVt2ccNbArIGkARk/SVi0TuIHiLZM/kbQ4iqTLFaWLvTzQFvuI53ysPmVURlj
ydEXILrYWT5o3S9txWAnoR1YGgRFvCbAcIWbU4zYjFs64Q4NxchMv3OEQAVi9ywCKn/eAJZwTwZZ
4YJEuss4jIbQTMVaMExCM2MsAQpyomqsoJkoRcVIBbpjTJlzeSgxBYOAGB1yjVxeIkuiBkZyNCMf
ZtYbEbSfMxmY2cJ4zhXUzFx+4DYI1m5bTK5a0wZLxdIuiqxI3dpkC6kIqNSjKD1bvCkqSFvEh0wg
M3WQLd4QEiZxMrBOn0o5KImahEuyCfmiYgRAw7Cl0/WaedLmrLLSX4hBVQg2UcFk4FV1tExLVMyK
Z9u77yQN7pXM7AQr7RnGXkTd0tKC7JSKF7hnXUraMEqXBPoLlkaI/dt8OqdwbQzOHqfmK0tr4VPo
K5bWvo4DwWgGGUjZTz6jxU2RuVnrCAbGjfWoznRSmFnqcZ7HQfx6iqEZ4mPZWMT05LGxzNnVTX9R
YwjELdgYvXZRFbYzM+LbBQnN92Hu6r1JAkVyyyd2xaLtuG3z61cwh8KE607LqfS8pbMlwbciLdgP
FTn86NAi4nmxi70f7IEtzSXYMBgXAGysrQWagjCxFBYh+Gsh+Gsh/oEBee/1HryXzds5eRfrtjlF
H58c+0LTtLjUEmsBsO+AdXZ6BmiE5dMtnIAxQCwkpCt1Bl0YfiHDweEBMoDkfsSRrf49Pjq21cuo
L6zEMAh7bkiIeoEG3/3mnZVekDzCMEeAyQ5MLiAazKSGtaYTc4G2T6w+BAPQAh0t0BUI+LTtxGEG
j+tsi3YpiAUsHac2cL3xgrbX7Mudg/0DMLDlQ6/ot2/gPQ6psL2ZZ87gH70F6EInaJqiUESGSDZl
ULQmJg5A/oB2zJgMLcooq9H4Hh/qeLt3QqFyENikKoycuf9EQE3Zhj324nujWWjnqSymHSdUcLp+
6se/fuM1XxFJCv3AjU+iTZF5jvNsDfyZLY3413+//IeTv312bnMGswb+wBr4x7N/+Zu/Kn8kINN/
fPGff/93f/0HFu5Pt/g//4v/M0cMYCpu3QwgwwZRNCcKlmCi3JVPMEyINHgiJhaaPmBTaIRym2WY
NLnEFBS6+7hewdXZnWC1sNbICSBHeCYS45t2mSI08sQgloVr5SeYlJUWC1npGwx2wu5cOu0Wftr0
JSZoIfbyxWIFozHzSocQ2DZakpAgxxwNMYlniimChel4KaDM4ahUAgNzJ16hIjS6whxNc+hafst0
pbO9oHhaEuRccfdpVYG6ST+KeB3zK82q7xerl8xNJu6kNyqQOmEUumqTUZklPZ81qGITpBBg7Uqo
aXMMwF1F0D5Y3FuLdK2JChiL7PAqqogakxEbVUKeMG6vly92V9w0G5U2S7hmLqD2VFPL0yzj/Itr
RWClmITe1NgrGzMabARanmk2h12aMM+/tPoyf2qekemAjQ9iS+2MKe/6JTsGKvV+iVvyeDdjMmx6
tPGyqhmPoXmIuwJFp7Gmup0Ew8XZkuNLDCsV1vvps/32DQeHc5t6t7YfSpnpU/vFPcNTrllBx9Hm
RQ3AHzyEzRR8Gmu9RcFi6dYuPAbp5gbWvLgYGPQLIMExM+YKG/F+UrtMUXuMU89iNO1v0XTZIwdQ
FgBW3GzORAy05qQ69kWKZrFg8gUPg1qN+iAPLK7wueUGWvYYdudKijmOuigz2A6s3y6TuLalanBg
saGXywDsBD/DAA6X7GbPif1hOx1m6/cG3qYpetvm2+o5LV8UhZC19b5f5ijnRC0NPVlbqqtPSwO9
q3hl9fYZvxF7UcuvoW7ZiVI9/SXT7dg//elPp/WpOdYWGvinf/43w4HZAryF1uaoswZmDTQ1INSE
/ZdLbWEy3X1JV+SEWC934TQrT2YAFZgNsLQADHFHJSziBdAyMp2l6a+LyKAy7r0EluaKVjpCp7Nq
4T6tfa3oGv1I82k6JEnHIIGauMoYhmhaNWnjpXMv18quH2kEpoWW2zjD7ouyAXXAqhUIFkkflVCI
uEJWxnG4kCsvpZWXLwoHuNKnl3ZkJDR/YG7RjAvapfFPsG2bRSf6ZRTtCA2nZfEepgZYWduoWcuV
Ibz8lvl3vUv5E/KbLzFtyMwBA3fQL7Oi6zX23CYJIyY9sXlCMiuIzEmw3BqaoMgiFJ+zBnLYRhUQ
k01DYdJ2YlAma8H8dzBBADuzFl3L3xgaQ+lgYDsSiQdWCWIN76FGKpBMC4KFtCRY7vZNjl3JWZqM
DXA1bM7O2PCL1pLsl4hjpmEwNsRGoZz+oH7er1csV5ML0mfi2/e7xGDiBBqF4Zo6ISEjH7UI/qJl
Sb9wp1c/sQhsbOS2zD141D5pYx2HsTgM9adgaLJ/9GVhUOTuf3ZhHnH2sZABc4rFqWpUh4yaXtW4
G0KwHOrhrPXzbUfkrqU+ukZZkZGKouvkhXhRTjjWAnSJPV9cgoTxwQXoF1ayPvpNB/Pa8bz5X6f1
6iYYCLEhbNG4MbuBtNUto99RBRa9NPbb0W5YRvDuF4nFO6d1OZ2yQ8HwUX/AGtfdpT2jm55Td5U4
eRTtYEjeoN9CEmRczCxkCeNBu0Xnp+n1F9eg31jNPk6rH+ehB7xo5fi0xsfW2zRfbI6B1Vwie7su
rNX8YuoTYVOf7u5rLxB/kxQzL7VKq/4x/Z1WdMvYUVOusTjvQs2nI2gpVdw9n3tcoIdfRI1uX6vC
Q5x+Yx9rOePUL1KvdV+niv08Gro71yZu3XBbP71zgi00MAPwFsqao84amDXQ1AC4Ao7GgEW5Oj/S
2MeFuGauhAfsgvRBoyK3WeLhRlwQS3QhGskuSqTkQT4gKNzlamFaY/mjTnsg+ZkITcOyfJgBcpk5
ia/4vQdLg/foYq3lxOlgHjrZ7kgAHp6EUnAuMcTUeb+UCoRmJmU6/Rpl7b1aXhyfX39yfvnJlWyM
EGZpzsMUTzyJf7tav0rBie6IAHkB/7igNzJImLmTJHkBuy7JW67RDOQcAa3KiAnJVzApa5cvW4Gs
E3dhCSddiy2pLpVkaI1oVAs0vH6/vDy5vDo5h//w1cnF1ccX5D1hM1y1uQhZFlmRJyuSPMZfLBDz
4uNz7ZgNhbPJsDs3KwtbOn+GWU3sgIV1vDucoeBmY5zF4MpkWF+pClMmIwtQZb/VHAGNyUutgtYm
2HK0hmFceRKkV5QHgagIMkcqzlloey2anTn1QPBGo6OCFFs23eSmrmw5QGStzLec0lozUPPoFUqy
VFksQkNy1mKVAJjNp4ab6uRcD/JiWsvqiR8bYDnxRvQtcoxI3F/YwPB9YKgab9lYrQ7xcTnuNsd5
UwbNPr53CvJUcYzYGS+2mqlWQMwQyeEITT/e16/pK/H+BS7gU+o7G9Wi2im+xb/t2rRou7opBxo3
9+HUGZ7Uvt6li9pNaZeywAjhBU1Z1AAGBbPFrBzCPbCvZXtrXKFjitkik4H2ikrwHl4IYx3bM9lO
b/UjHJt7AOO7t1Bo8zmNpNeoZqGlmjMHu/J2Nd3uqQjTc81ZvB4tpYbod4E2hcQXUfMt3Ra2kGTL
vtTsIcVrs09JjBYbq9lwltiAfHjqc9u2mONXGpgBeO4UswZmDTxXAzyFaGeX3GtepjKbEo+AhFxN
yo06gSIPZCX+BsBKvDkGqTM1L7jMzrTIBB+BFg2GMjaSA0lNyoSlKLK2TVZZWjWKZcNXp5eXn1zc
fHJx8cnF2UdHi10YooFYIGFuK2UMBC6lLy45EKnAtDy36fDt4eJbi+OLs4NPjxSHORuHqTjwJzkW
4f6Bl7Lk5HZQjKJtkBGBMd+T0yzm5cn51ScXDCT2YxEyEREfsDFMo+Jb7QqqXz6o6wJMe3IuJbBe
LJ07M+dii3FqCs41SxtTEQAhydXH55cfXyBzZpQzoIScF0AcYDD+prRgSzYiVUrrOjlWFUdqaYDV
AWrKKG1JeNCUTM2MLs9ndQPUgtdIBBdokwRtRIy3COkvmlIrfpmWscHbkpHNAcSlwplQHxmToYpU
luTBh3ftGn9TNSg2C+WHumIc6NybI92q/uNjesrT3Sm6Hj3XxNiXbRaje78Y4hSGo6a9yzKox21T
QoaEG7pnehgAbE9cwy1uDQwQ+xRYQ0udT3PsbhSBf1jui3W2WJjqx+E8tfYhXR/MTB+qNmPWD3U3
WmF3ciWbTiI4max1yFPqbjJESfqINOc+wCFbIEota9G3o+HOnoXCuCexn4B2TfueidOw4/VNakzv
DP2tEt9CLkAN7SmDult6zpMBr+9pqmVszlsNdbA402doF6XqUVfRYZqdPLZL3XZtdTVLj7TZ6uQT
e29vA3W10xHVfi7r85Y/RC96ylP/TUozA/A3qbXnus4a+P1oAJbMFRygXz488ABbeCwBabjsk6t/
tdcxHYbfPyx1tCyuYfAEUMm7dc2lujTYYoQNoKV5FuwGSsFtZCILsAIdg0nU4EX6ymqHKnkRcz6Y
UApDMYy9mXteHJweX/z88tV3lif7h7CdoiAYWiGGxogwDMobmQ7DyBM2WIIf6Bd31799J1XBOspT
kVgp0jx8p1Ed1G+lcIjFu1inCklg06YAFBU0CPHF6jgRiixKw6/pHtZOxBFIc4Ut3cK53RdspyhF
Tsv0GOfZUSm+FikbRtIIqwOTZFen57PFWeYfS2nApMWHFck8yCtz58atg8+Ojz47lqOmTSJAdUxK
2XQEMWARG4+hmpq05iJhZQh3dBi31S66K9RkWTL/Una0wouXkArZaqJBpwpjrfLje4oqPbPuSAgj
OYtUqiUdmCUtFoe/RPPxmi1lhmI2Pc8lpgZ07JPAmK7XcLe2miIr/EP/oQe+YFea5EiL7S6QZgU4
s2CAvPnUdOH34i03ONSDlYFxc6cka9M4wBqg1toCYGNHfJrGgXrARPfv1OuKKrMtsr8lVR12gbaY
zwmJaQtytq9Rk6MFOeAV+q8h0HI2+adc1K1ca6kMGRiVFqDYFzO2+JhtsFBO3QMtxJtyKgM069kU
pgBL78ChFsVUhYFKUxJv/XE9W4xCVwOzD63nqPlUDiP6FIDfPMI+XVVfxBqOzW7Efhgf2Kiu4jlq
d8s4EeCc2ZyzCLMDE5mt2WS9Uwz1hIXJZlIV6spiF8ovNn9uvjeab5LOS6Y5NRCfzaJL+zvWu58i
D7zhXYbma3NYb6nKWkXfmRfw9/zUR2WO9xQNzJtgPUVrc5o/Wg3Mm2D9QZrmz/6v/w0Mpu2azVKE
Y4oWK4Ao2YV7XMGJV8hK2rUIWu7LDx2DQbwA3kecHoyVpTSNgpaRA5GMdlH4zT682n39Zg9bni7u
fnXz8Ftb4IpMzIqL04MES1wEy/2NAUjXn1wg87efHi9fPFx8coV8Dk+Plt9aYknY6+Ur3LpfrS5u
rrBl7NUnl31KO/78+ODtYYr/9f3ll9fYSRbe0R7/4NPDmBylPPx2De9tUDSPHvnlzS3O/CBFr0Fn
sEgj4cHZEdyVPQeehPnVJc4HebO393Zvf1f4XX/enh3enCQ5WcrDw8Uvbx4e7i8/pjBHnx5fSKqj
zw4uPr6y5Bbt8vb69OA4Zrj/2dH1x5Lks2O0weEPjzBBQIV8vbq4vXpc318epxyYCY5L+er67td3
IGRayxNYsjpgV/C4MTBQnBifNgYDJHN2IDlRYwcyHW4ENF3qL9B3xZjEYHYMu9aGXg8vV7t0wybG
0IBMxl4iGpRCzwBSNz/SEaYVjPM5gQInbRE15yCQCnMCsj+vVi+XsELjGklQEARYvdw5+84BUo1u
ghWVxkr2nDZp0XzQH0f/RQ5bf4340QSqJglvXcxQgji8s3jNkKYGajSqITaWXeTsg844op0izwdV
QH9mPrb2pplsbdtWwrp3xZBtc+uNHydorGt9iBp5N7AG7aWmPrEGEGVyzQsFTpmImZx30FJtiB7M
ZbhZa3XVnb+RffFOeIb2+t5p4y1Yv5diyJM6VTEdMEkVA8ovurrHnNznP7A8LkCcxXjxYt4Ea4vH
cHLUeROsyaqaI84amDUwpgEd+Yuh8dr+D1LSDsZgFqwI3dXGVLANYtUuqJW2O1jzsFh0zdWhYB1w
LNeO8hxa7fpLYy8P3eFgG362Kwbuvvn+3qtvLxffxsWbF/Ta1QpbrPClsy6YCuXyOCKUbocM2QdU
/eq7b3ABFIRx8vDgYO+7r89+fnF+efb6u6+O9w9tU2h8zq8ujj49ent6bF8PPz1+e3p4/ONjxD+/
ujy7uni9fH3048NFth+e/+IS9GuoxuS/uDz5/BRVW3579/Lm6vjzk8XO4vDtPsSEHh7kAJw+3KU5
J/niBPPch2+Yz8GbA5Dz0cXp4adHh2dHEMCi7Z8dHXx6jAoy8Oz44Ozw9PIMh2ce/2gfK64tjts0
gZeIA8Q9+uzkWNGO3h68hbHXKvXZ8eFnh9kyTNGPf3QMvL+4vjz9EhV8dfL20EU9/fIcBWGccfiD
fXmYw+oL3AUGU+Eo0+hXZlgz5PKbGBhSwWa7OWNJDc3luLiAAnEbrZxszpBGJxjbImGtCmaX0EbQ
JFarmiXU3l2WA/NnW2idM41OtM/Lfs7oS+TFjvGSpy5jQkSZYGJFFF1ZO005o59ooCjGpr30u60b
W2GuGUWs5nCtZQ0razdlDKo4HXrppqqtVTF+09zXxLbaBhXVW7DKaDN9gAgTFeiGLCsyDvHjLWvT
OsQC7RMuksK7PccV0rx4jhGvra7aglfJ2UxYGPFif7D4G3aaqORaS4We+9t7VJg66YChbxMZAriB
LtbCja6Tu2D9GnEtxYa26yhbKWe0c0YxYrj30h7xorr6VMc3bY95v6OfpuOAPSNPnbNDlQ16TYBx
CC+qGVvNO1XRfMVT3JqsKSb1rEvHB7DuQgxR6Z1bHlJ0p+170eTuNkcsNTC7QM99YtbArIHnagD+
pXBVJcngTCOgCIxvPBIYuwovYH974HZKthGx1riSbMx/VUZCnhpMn2FgzwI2QLo0c9knt8IyVuEp
wfCDFeKSluFHTUAC1nDzTNmUtTU0IU0riDdT8lefXhwfHN1/fX9xfYU7y++8wk2A7clHp7iQ5dMk
enHzm/skWlIGgRkAiW/3q/v71Ttc4Os6q+ru/kaWz8Sed/fvYBy2m+9gXNY1f7MFb1RCRmWuiNYH
OTxwcXH6XXx3/w7xj390cHJ48mbvrR2Bi89CS3CRz97335wdnVydXAKBEb67wHzBIosj7mPknTff
f33x0enFx2cXORrAzz5JmPwVdbcK3q7uH1as/i42cs1jAlT63e8oA6SiiZW/0yguOX7LDxl3bV8u
A2D70BRsxxFjl2ne5WCFrgGoBdyz0YiItM5LdrUxONdO2+HAwlq5WOPDiQwkos82HarlBI5gaYNh
ukBaWZvZnWypNty2NauizcBFyJbKJKQP9kYB3av22MVUF1L58GvgImU8hTOjDH3xfcBtkYezral7
Skitip5U9dDzQ4XU7fK0nFNH/HqFY2bx7+Hr9Cj1tXsZ3jdt4UNVT1A3RJ81uNlkLT5JPa07+9Bn
sSxIYBK/DWvBp1QGLvp7YIEoTVgab4XR7m0RxmaXnqONIb6yuQwDuTi7UUi1zUMXRR3g9s4t7yHN
GYEtLZnFK268jRSjFrXTLrELWY6FTsZasJ1/EG68iWvELeo2OEcwMLVU3xqah/KuonfIaL0m6n+O
9kwNzAD8TAXOyWcNzBrAO522uHT4EIdHANRdgM0ON3bG6JP+yZy7fbm7S2swWAVAC+ABuiAmd3Xm
hr34S4gFEeMabqxiZpyFAwvezuLmV9cr8OL68ebuhjs5k37BS9jVmYSJxcbEa+45DLzh4Tf2OTg9
hHvw8Rcnq4d77EG9+nqFQBh790+Pjz49wAphrZjlB17KWm6aaBEHGgPmLf7r7yyWyz1cIJNkYiRQ
0VM3IOjaWRpe3PJ5Th/ExJfN5lUyX6tE+HtnGHv5cPHlxcH5yd27O2D5wd5b2DOBc/jswCl6h2h3
+GYf0Hv6xdnxz08tB1/Oyt2k9UHFYUlmtMvz45+fW6CWYfMDvcOWvsqCgVQBvvi2h6NflktcPDys
HngIEz/0J88xQb+YqlAGdDi3/bpRLy2shWMzzbC6xfXM/MYSQb9rNSg2lIbRmHwLLwBNGSCyzLxW
C7Y+vsKtHVlhc2xsFa4hAve+poYRzXybH8nVWFqclAaWtgXPzFGrfBGHG01zTAN7Nc6IxhbT6F3C
ZR0ojabB2Ui5WuV/pww9+9J6eD0M2tpYgbwGhmUOw4U5ZVvYHqzJAHkOjfP689xuvFjls5UO4e5x
dXV1/+t7HH6Df+9+/Q5fETjadilCnybjeD0CRmHDic033JQTBBqoeNMYZVlupa5y8eGA+W6CwGap
s4i4wBbcdmG2u00GA3xYGMYd8N7zvF/kYH/5mdbnncOb01hRXVvoLc50xCexfnK9zj3SFvNopsD4
LjKxy7eTN1PdXpE8HdF72q75YFqgN2Vs0wldoBWlib5jzRc1Yxpw5dRaagtW9CVEKtRlycZQPGZu
Pdn/mWDevUd+RIrZE59GiRcuzzZSPbFdvtnJZgD+Zrf/XPtZAx9CA/y91Gm9O9jriAfn7ABC4PnM
jZqwlPc9QAh7WcHt+YH7V2GXo/e7glWMYLBAFFtn0XhrsESw5VrQZM4FMq1oE35cPzzwbM/ry/uv
sVj0YcVNkDBKgDUYkMMdnuWdCySDKXjhkAMoAkjv0rEWXtY7p1cXMNUe7R9en55jYfDV6bmjo05F
Ap+nUfJq53H5cvf8F+fvfnN/9JOT04PDd6t3F7+4gk+1KUxGS1Qhk2feZgm35N+L3PjJC4BhkPTB
39pugSE3GzK93+WBRsdnhz86fFg/nN9c775cA/Xxa3pxfHb98RVqev3Vzfrx8fSjk/OfnFoOmZ45
BZCb8TFFOzw+/8mxBa5evrj91TWyuvzZOU4/WmY4h7Yvvrx89/X98Y8O4QuNi/ObiwUOMbKPjgLO
17LDs3VgiV1q6yyyKGqHorH+FpqnK7IcpLVnlRyV3y9RQZxBBc7XoU30fn+gHhCZJ10h8poHO7PF
adHlEl8oZwmtsl3ew95OYNZfrhzG7MmKR1WZ5ql80z+uWVByxk67TEP3cJnGjIAdxYR2RRwuY+63
AOfabv7btDD4eLp5MZCJtFrfHwyJVqbULsHu1Ey61RB8whi0DzN8qGePf/OzBVGE9J2ct1QYQPf2
l7cHBwdHR0c4+xcfXOArAjsM3BUYxwUj5qtXr/Z/tH/3q7tUZuz/hRhdA+DNL2+wpPzV915hi4HO
mbTefPA3efXK8sAFP997hRIvLi68V6Tw/J9iuI9oFmKi8mynHx/cfnWL8IffPqCCCMHhT7jmE5E7
Ob7aiVB+qw6JlszLy8u3P3yLrbN5fO7NtcmG5PZBuTdf3vQ1yGq1QgS7a6LWMNDoJ1nJSA7lM3HR
gQ3nAgZvWic8TWVZ71+cnZ3hRGh8zj87tzwR580PsNnCnv+1rPD19paaNL1hugQhfivKk8LjJNTL
FyhiI7Z/VXp0BtxNXcLKyh/2SRWKD3TO4B++OTw8RBOYJPiHcN5SOKTyZkWgJcRpzEcfsZ8ffnSI
Hm5aSndfvlj9ZoV2xxnLtdqbnGaB8ZaHxAe5/XhKJx2cjk3mGov8OQbn/oK1yvo0SrywW72fODll
kWJfiobZVl/ybGP163mBOEHQ+clQWY0Q/BK6GMWFCznZhj+igfl2vwbmTbDm3vEnpYF5E6w/SHP+
+V/8ufxjgUP0etWpvNjyag2qwVmy2h+LbIOzcLCfMEJpwuUF2RiELJdmLimFpZfYbCSsE4CJ0LD0
Mjk3TOKKWmWra3jPkmpWOmUXvygPOztLbPzEXaO58TLWFWtTYuy/hR2qYSGm0zUNg4/r3R2A8QNs
j/i5B4lRVLpq21Jk2gyBSQQ81oJHyGIJrsYW3MNJtAafXmCesJBjJlqeIZYLIyPwkgzGPGl7Qg5k
e6oI4AcwowYgHm4B14WIkAEQaPtCozyMICkef3q5wTVXR6MKUIWO5KVKsd02RGVaVF97NVvm2iyK
ZwWbEVX2eeoE8iKy1ugiA5rfeVYza8Fl2FIabrA68lCmys2lnLXDom5Ii9bUbtjaooxtykgicUEv
qoOKYxqCPUFLedkdiLXcX1oe0ZofsbZwc71dcJKCdnhIiD4A/UDhyJ+JlLM2oNYRypKPMZGKUmk+
QgJTUXK2Z4vgO1pWa4PB7SRnVvDl+uQ7x5Bqq02woi3CBkM2rCmGaM0QBG79iTYcGzsW/oQ2uPRb
bMSKrp8WsrWsjQQRfvrymxLnCbKAE4AWOAq4SAtvDrvVzPP4Z8f4t/vdXcyynZ+dJwbuU2Cl9pR8
uQvYYPK7u7oUgO39/T3C08X7F/h6+ukpeOz4mB3SI1ha72ZxngXhJx+fAOmxWAEsCrQDA5+cnOzu
7h797Ojy80tU8+yzMy8dkXEKFG5dfH4BV3DcqkOcjoBeQLLTT06Xy+XqYQU4P/v0jAD8vdcALeSJ
eh1/fHz3VaN2uHv9i2s4sDBJ/kDyve/vbSYUBpsTyVEKFJJ6cqFkPQKWG/+2NByzh/BU7+kpNfbJ
CXSLNjIAtlkDf35xjUDMR6TJiPcvAJNAR4vm8S3z4msnMHM7SNbJFk3Dfv746I3id1EFVNYmFCwQ
0dB8aFNMQABrIS1QFnMrUAiW4VycXyAcJIz4DL+5gUIwT4HGRfL1wxrNh+IMgJEKykRWaC80X634
gRdX0d/qV5/n1vsIjz44xTttsGP4szBebp1PhPC+F2acC+vBzueoa+RFF/s55I/CzJtgjXWMp92f
N8F6mt7mVLMGZg20NCDvZUDLgq6zNPotX8JVlbwkauKCXu4F/Z7mWV4TiQhsRFkaEvEX/0sLhmU8
BAryh0/2RO4PvENLL2kNjEeegUMzOZmkhDJJP4j/iBN3YA1GWfT7xTZU4EnGJ6uQJ0FxgGGkB1ct
KR62p4J7NgAVrEicAjuxVC1YBV3SbgmsowlaVKmkCNSKVvoD2zJXsLiWmLIU+7fzYsmMSKFmqOTS
U/K85U/XbkEdThUi/UIPBHiSP+lXRlEdrivyZ+S0Nxi2+8JqZ8aBqnFB7NTe2kmZXPJKk7siqAmo
WGuXdKYuaRHXKBJ5giqhWEEmaw/+F9ACIwnkBEpeQHhMFsiznSirIjD7IEdoRFA0ZCvQZSkrmwdB
02DcgH8Qhu2uKQAQqSYCoBPK8EAYZmV1vhFNypwukXkZ0w3KnIoiygrLNZhYCfvJw1QslYNWFgXD
w5nZan8soTLcByQeSsdHZWWn962e5AGDieVTW0Ua5q/pRRZGMCSMIbU5JQ6bzKRQhFjRA36n02V7
UsyOaairsSfl104EflgsFjX9IjYCcatvPfD55+fLV0sICcLhzgLA0e++6qirNiW5CO9fnJ+fL7+r
5Hsp+XilXr4AdMFKCeQuIttTE2dY4pwLygLORVFBpEeHRwg5ODwoyBBfgUy4hb92qw5xCzAmCECM
qAhCoK6Est0ROXQYpTVRLQRoCisxvgK9MLsEsAd12y2oHQIgBMCGu8lWrJyJeW/fIgThADyEXFxe
AOEQ2Vyd79/d7/94H4wHAmQCpULOCEE4HN2bqsZMBFAf0uIDLCQudj9Rcjb3q1cG9kDHjYt1M+vm
w9XVUqo1XA4eHkC5sLrjE62IFsF6mn/wFVMPQFZI24mMroItGxW+ia1nGbVb/3a9ume3B+d7j0VM
zl98dpbot/IE3jyP+VbHUGniBW92a6lah94iTVV1AgfeaVXi4uUZZat5sn631LUrX32t9hqoQizC
e44/p7EvNX8pUs5NDbhTtBdfe/2MK3eO8RQNzC7QT9HanGbWwKyBqAFw5uKRSzfh0br7SPSCBRgQ
osWfxFQtFgWdwqzHHaFpuZXVEWT18H5XZjocbJs3sgIHYixAGKP5FOyzlk2Ult6XK5pPaQXlPtK0
EoMkub6UDmMgXny1bbQeX65wNDEdkOSMDcTF6lbKxlOKAa4QZmcJSzSO5Hm/u1QqiLhicVxZSiom
xAHBcHwxt3GmbZM0uQv+BNhzDTDM18wZ0AUByL0P2CdLJlMup01ADLFhe0T+QEcAJDd8kvsuknAD
JzIh+RAVJMvJwol9sxEBktOEuyCZY09sqAiGbiyNZiBdkXcQDbEAmeZGTg1zSEQ1gkthhF9KsaDB
B3qk02S6Ikgm12sYRdEKmEcgVMMID/3spBOUeXYx1KJBA7QNPVLDlI2+61geDUSH8NKGuBN1lBWX
i3ihK7myE1A5zSGaBedLPKiIurL1ulAL+gz+gZllgsbxV9AzWRcX1DOvGYLIVDj2DyMYIAcyLWvL
A4QRAe0Ff2mS9kprkhG45i0eyESfAiZfQQJOnUQI1IiEg5ue8VBzUGg9vxgSRYMS7hrARJLZ7o3R
JNXCY7Be3uZljDpa1/XthkzRCUubPI7sjJ7HSt8q56hY2MGAEH2qBtQ1ANhnE9DNfruGcdXMhvfY
FS8OWOOo1N043XqjECb/WUq+GXAPtgUst3TMznHM/RnQgn/WhawX1b3LyiLz8BHFKXLsw7vf3sV1
FBtfiax4ykBKulWHuLogCekXux7kj9+yAJb4MUv0T2Qk2mb39hAC5IPnLUhy8e2FxQSCwmEbhInk
4Gq00etXr69+cYVbMPyisggx0y5Cri6vUNDt3a0R++nZ6eHBIYhugfdK/uAaIbDn466FFeAB/Xh8
KJl1zx/Mcfg/D0RWsKBCeLoJ/Pgg1rHTDXCjeoEgzB2bkzu0omFqwwy2+Itrf2NYZAAqfbO7kiPO
q+UrCO+K9QsLR/z45oEy0WqYvoH8EY8xQYBaoD+kiuSezL0pJVtSFy4spCuG3S3mCOqXIZPJxNp5
XUSja3i4Gk9E/xvMO3y8qN+oxXPhrcZKxaJNThfMGzG+iKJvds6oyfxF05gCXQMdLanQdAsX5vls
Ex92a9gXevLbtdNd5y+TNTAD8GRVzRFnDcwa6NGAuSvDBgtjLZgOX2FEFQCKCwkYDASKgPfsBo5j
pdMzDZX4oSWJ7e6AeWjLhekVuChEpP8qXKDNeRl2V5wtbK6tjIZs6ZMMpAVurWkoFgIxW/7qEBdl
XYS/Md1f6WvNlaW0ZMJNl4wqPCZPMgJwmj9IRHQYeLVpk/brkvMt7c+icOEllgfLWVq//QAw7n3N
D7ATcVQ/DNYoDLKVvRn5m2Mz/toFNEBRYQ9fvXhc6vhiLkIGsso1GoFUKRc5Yz9qkiSqQKO3NsRG
uLbXpslUIxXTLecXbHeuBevOH2ZVY5dWd4Iqh5ACRagFl4zD86g0oUB9gmxlCpaCifdar8s9ybBm
m1SsOsqxXNZjVoQWbOalpqY09MTmHTq90wkcRmZonnUxAzKdtHVgkuzh1DYN/iwLFVdZMhQzrZoA
nCydooGI2Zh34GpzVRwYDA2bYPhrsw8UWFMMqiwim5xLtZHNGuSPBj0suodSBqbzi1vNmA4wmxJ1
VY+riggNsGxaIOsBXJlR+L7NcGqKTgaKGqngFEP0KMP3Fb9NNWNPwF5ZsCiCVTZLOgsZagOOpVfT
NJL73ZaopiLQC/DMmxteu8gHf81Zuu5UFgizJ4AHkGmiJriF68RvH4i7gSv8VuJevECMhPFKMTYO
kSEJLLHIEMZY83n2j4VcXlxG/+oYwRJiigHiwX/47f5bvEph77U45o1szt4W8+Cjg6ufX/EU9MtL
6NwmJuCtjb+gZeAijMAXX1xAM3VuiIOcmf+P9nHXiijwDOztkx24oJLzB1wN92b8i9ZyREASGOTp
KZC5nSmcFeOLAgt9jaJt9S820g+fVM7jC1ihUWvEwd+4EBdxAauYUDCgjR827tf3EKAwM1KHCsdF
fLigMaiULP35OV2481sCFcFX98T2IpKWfGFqeFgiV8frQsL4VT/BDOi8LiLWFk9QAZl9D1Quo2jT
OCVkLd77nqmNqH3vkzEZTJahF9rwRKT1H8njWipDihye/OobaKr5VksDMwDP/WLWwKyB52oAEMtj
chJukUKITfhO20U2E/G1roNbuTdvKpEYyp2x+DtqZlVDIxEiMsDvPTkLX4hqKREMywggvuYAxAZM
Wnwui6XhFHZKWyJrXsopMiGNqXSK0oJWTa3vpbTwlQV0kU41HgXTkpRoQX0UOfMrDK0gKOSmxcBy
5U2l2m0eNgvbJkWFU64Exh8jLstBzr22UlciSQDTFQUAOtK2iRkByQx5ZAIlA1MD/EuqxwXyxy25
B9NKbORPBKVtFjMItK/Kg5r6hFkYRdAQLVFMIISY/IkItfcYUF+EDJhkRWgupnN70rQNd5BESiw+
SbeqNXVO0z2nDKRtnoQEbXMcysrqYwkw76DITGVJEIdyWqH8iwCqjoTMTc6sczGE8uGCmmROMpKj
jhY/5ShbMZdJy00ad1uyF1WZ8DUOzmrbSHMEOc69E8rdRCmGbv61D9vsSSwsIZ5dPeqaQpJ/ZGM1
ItzXK4OH+h/QyxCro0NVAXY/eBHDnkZmaypwcKAMYyYWbTK5beM05aM1wIA9sKJHtyG+9ZPCCOYh
gEOaqT899UXsAEtgJFLhb+G+W99KISJPRvYu8Z5UCVSzre/7fMXNlFrjmfk/W0VgRr65phOv75gF
szZyJnP+6s6WBMPqC5wDvAE44Qoek6NekA38xu2g4IyN3L68wXsMeTJ3tU4K+fLGTNb1Bw0BX3FI
iw8uULX66StCMKcA3RarxFEp6lYfXHgdHXj7mhoGcNTRo+Gaq3nzB/QOK/f5xfnj75J5n+0LL6ff
cA3wPg+QDx/NAiDc9xjze7QAY+5AEWIKKJwM/MXFwKZlfZIX4VMmAXuzsqfGcbTnlTLQNM05oL7i
RrjdhyJIP+Xl1p1VsT7vVmjk4U+BXY/rs36HxJBidmA8uznGczUwA/BzNTinnzUwawBvf5oQjVYF
Kmt4F3PzZ+AiPZ+19hL2Pdh4aUrlL+IjfHSBLrR2kpFka8UmzLJMwoJHS6kuQEQw4dpyXPAzcsDs
OMqCMZDOwDAd4y7j0IEWXsqLNbgXIbYCdoffeCATjbo6jEd2Y5ShXY65mRPBm0nsHGPaV1EXnqDD
XzRZL3e4DJU5wNUWYsvjC/FxXhPQUgfzQEgZqQGNj6yCSHgJbYgk6Yesn0fKKbfhtRGaDLAmPFGO
GE/zJpewytANQw3qzu2sdrilNg5/AsKh4jzhlsQuCzBttmRIXANZgdbUqhLC8AsDMplw/RL2T9jP
eR4VrN8ySsNVmEm0NJqu44n/aVxFpZAVARvoCKpEIyIEaqcLJYzPFABgDMmRisZkNpVKR8WMyTlx
gCN5UQud27wkuhNfRfJQP3sLZgHkEYAWQTeAPvAVcxBcks1MODign7OczOk7wOpQGFsbjAxW0j8k
JC/Tm4Bp6caN71oCzc3MNJeRjN62d9fmgR0bBtUjqmGybQ4WfcxUsM0T3xu1wcHHlzaw80Fns4AY
2eIXnxqkB+J42qfFeaIKepOBb7kkUjbG4oNAsNDGEtgdjGLnJ9yFKRKLLfEPtMNNm2OlCr1Z7rkt
UvKPDs2HOSXvxony0M/5+6+BfzAPnhyfsPdqAA1MMhdoZqLRtvlCW1q7sLLA28lT+vERFI3jjuE/
jL9YKWr5MMH7F/jaueUhe5vIzifgamQCJZi3MwjKZTYX6GPIim2WBAbmrmw+DriAfdhDzk7PLn9+
+fbNW992G1mBxFBZxLFokA0FQbaDnxyk5K8VzgPPGQd7VmFKAtFQ305uahRQOvK/vLo8PTllkr29
QkvQD9oa3AtohH81rOX+5Nou0PYvNgoqCEQHjadAFYT6Yp7CthPnhIV8zjuP2GaeLmZG/2c3gEM2
7qpdLfY+2D+glVsfWpPfvuGmaN/fg05csdwI+kdvLRy12JQh8fZ+sAeRIBtUxK3UwtwNag1mxtQM
Pp5qgCcjwsXrenavU8+BB19Tn0ld8a1SvcH6XrP2CCAHnxJyCvXAKMxG7D7UdHmCDClVUF0TyK1F
TCSTqrzoUcVGgfjR0/t5kufzH9ncYqfR/1S+zLtA/6m05FwPaWDeBfoP0hH+7C/+G6kDy4C5Fg1k
Cxuc1rVq92awq0K49Be/H9oWSzGxkhV7C9M/FnPYwEKstsUpteQu+EKDyuANC36lLVc7J5GXgL55
X98deikzGFgoJ2d4QeMuqVKRgV6Win6wiAzJ1jilCYJoV2RuQ2W2RB3DI5KEPzaRlUAuckNa+PeS
sc1YSpFkgUybeyEH2pCX2qeK1ktsFsVlqKqsbJKyo+IKCE2SB9fpr2WIP1SbbiEyjcPAeFyxYtzs
CqRKl2PIAFFlvVQ1mRbw/7DziBW5dP0VUVOBzEokb+EgQHN+Fqma9ZXQqyQ08DJTFoc8QcL6UacM
bESRv9nquVWYPJPBsdw9W7MPNAsjHwNOZGs+1agUPa6TViGGuU/TxZ1mZJ1IrH2w8DEBWChkQLNa
DqwJ/cDpBY2sMiQTqnFXq8rZUrqmMpleYxG2FImdUxgkfGhMJ05zI26z5MtMjM/p8gh/aU6px0OK
8EE+EXd9APdBch7PJNYr8nBBdMgoDlL7tOFxvOCnhdRy1/mMxqnxvpuJHYMEZ+a4GBj0i7WmOE6m
A8BmEfKBZlMVLk/TPhNtSuOtwrdfbde1dPUtR2I4RXtfmlDI5CiuybFpoGaOwMXoJs0jnT6/gD12
kimsypEGW+xDhr27XaURAApRK7WDad2f2TVpWgV4Aw6xrhgnQkeOeopKrYcU6poS0tMmRaNH8eyd
toUyXbYPZ0icJE/fq6Cvd01+ZPqU4w9LIV5vv+97xY11qphh8/GMcG6R65Dxp7FQYJTq5Yuf/uVP
x3OYY2ypgXkX6C0VNkefNTBroF8D2NFKXAfyIcjRlJfWfJIbdSQSF3buiH4BMMS5Rzrf2uJSO8iX
xl4YYLnqFeMMrHHleUg8E1hIo5894hLMrUhFg6Q8YBnOuyQxrt3FCmQLB2XptwTkA1sl8GlF2RaM
rxODFjskUpoQsTO00Aj3gGQwyVqGJC6cnyQ7LSE5VV9zwOYpTVsr8W9FiyvJU9s4mSkY17TcCtsA
bIREo1/hIrHW/MRxSxTH4nAtPVCZmBEQvGENLYrx4iQELbHInNhMPqSJGBtESasJDm0lLV2mZSAV
/+cji2Q+tQ//K1MzfapZzaRMVTYvfnvgfmM8TVfczmZSwrTLiCSnqzZVpuS64FFSyND8nxmgLbsx
v6CvpmGGSI38A+VLAJQiIzNd4m0RL2PKb1ymXfoakORhuAbwS3hca9lwmlww4zmlEIebtJRBgE22
T7WnJnX5gebaC4OA2wriRdJ716a3kUdD9vh10nVtE/aqxfRe2Vjfuu4RCC35QBzPf0qcujJTNF/E
wdc6JOQMxAXoAncvv7jESkt8cNGgX0/ynlvs8h8+4aLRN0bJZ6y1ojHNG7oPMywyrI4FCNXmsrFi
u/dlg0rkP5lGvN+62Ea/ZpHDBfTc5408Ip60CutoSb8mZOzJrv+K2AdORYLplSbQ/Po2mf3vdqrz
GZMazusHbeDRyLeasyFFx9hCQmfgCTMaTSOnt7IXGvte+9XUx//+nMaL2JqhYnWVI3BGDQzE7FVU
Ma8XZzGi8INKK57c2IXcGlx0qsZzWnfgCOexw0xowS06xhy1RwOzC/TcNWYNzBp4rgZokcNICJiC
sQXNsEvt3szlvvSPpYEX9joYJOmHLLYkGKcfV/4GwOJHO7CBrliFLtBiFRKjzHe4BaMoAQbgJwCm
Z7JMr4IrJoEYMDgb/UKMBZPzuCOkAujS3Vr2YfISEsLIycOTZNGFnRAC4KAjysx/QlSe4Ahbqwyh
XAbMBau4y5NsYe6GKTttLkXAhhRCMpSFr/CFJn/KmkrTrnnzQkj495JsZZWF/GbhlNMvPzowmYcP
IzvWC4uN5fGrXcQYYnqDMFoNqzrayck6dAoev5g4oJO2SoTCkWTJM3ipPkxACFApJESllV7wSQG4
MRjuohQiJeShC7QchpmKdlfVi3eRXErW6VMETW0QLebkXwrGkITunJhA49qabVaBLWsQLuJlfa2u
bE2deKRJE/rJZ8Q1HbIgAq3WddNn2/wLKDwM1CvURP0nATmajPCs/bRB1IbBsKubnZmfKfSVom7+
E0dCFhoHOs3xGcvNnOAXVcYpYBxvarHjaOlpIBqlqcde/eCxsYZNieOlDBTRpxcLH06Y74KB4UTK
5Zpo8/f0B8bCzmT7rSFWGz6nDy7sGltA+6ePwJ8xSB02KBV2JCfkrftMc8AdW2HLKvgUj+fhovZ1
7NSfR1u8mMSJYDD4nA7gYt9c0vAj3FDylloqc+gmH+bbWrbhB6K3l3aTDUyrxVvDeNmWTS3VeWvV
UNd66KKARc7F02HjBO97ftffvY3apd+a7hujfk+6qFGa0N/6FNJ854+/DI23rdDiwl5ufqvvdTe1
N8zxJmlgBuBJapojzRqYNTCgAa6Y1QJRHOHD3Yy5R5QdaUuQI8UCz7iGk/QIbKNvM3GFx3fII5ru
zdoAiYtygaAwAsMWqgN44eWLZZ9ACJo6QXcsi2ZkrCaVazRjctcosvdLnBBLVtQOwLSjEqRBPPB8
5n+5NRSQchcHIMlFFiuEFzBEw7apFcs44wesTtdfcCGiccUt6R1Uhv2WaZeWVKgL/bR3sPkzbNd0
/F4id1SBVllCpuzYK2QpfuO+Uzh+if7DvEYIq05YTGtl4ZAM2YhnCuS1NrsWB8L3mPstQ1ouS8ZK
Ws4UMH+IxKW5UAsYG/q06QBUDZEBwzweWXMB0C1t7JpE4FHG2lhb3sIEciAltcoluDBH8xxgxIFy
oD1GQKbmQkxtQyvQPA8oIsQKUG2eYldrfcW9st/yDGRqG/HQAaAW6FBGfnqVQz9aqYv8UWVrJh5l
DPGgHNyCHlgjIS49unWMFsVgfJiUV4Reoj70ZqZslEVnaXU00C/yZHyqXZuKaY9rREN9cRoT+2Hq
yREP7HqA4nLv70Nc3C9uufGkOeA2YLA4w2Pi8rkbGI7Xw77hELvrcawkH5wVY7K+ci28SSlFzrEm
MbdC+V5uEb8QIFatbkq0/nd2sc4Wn7Tx1bbKsdIHUpUN88G+e5do2t/q4X4v3riBK154K0+/UMyi
l0YhcbeAdtdFSjUwL1Og7xQthtzaKDIlk6pGKVHxEmi+JQaewf6ifSJj+B3Sp8lGxoVs/a1cT6s1
X0rjs2+1EGoL1qh4ov2hrl+qY9pzDcQLf2FacSNaqjtVDGm+sjwCBxv6YdnmwyQ+EeA6aXb7Qja3
kNtb1Bj4SZOz28g7x6UGZgCe+8GsgVkDz9UA19DKWfeRhjia3OCn+rCDM4HJHthhCuAEiAKhcW0n
6Rc8A2IhQT0+rsweSCsrcQUxGR8esGKelQ7jkVnv/XJFoAIBEnq1FRboCMuGuWkWsuOKXDuYgYuH
VRDHr4QlHdTEH2mSJDeykumYmyShUJCemT3zGlqtN+YBxdp6CuJhR2lkjqjiPZ51jELh0EuLJU3H
uOZeXLxGbXnOsBk5afwEjwEQRWvIYYn/44Kor4W4omLS7prhYEjUmt8FbyRPKkSgKFM2vYgBh9qj
SyuZdWIQkkAwkTP2pkIOyCyJh4SAT/qB0wzLrCg/D1UmrEJI+iqDacXSPHRKLuu0HssSjpg8b5mr
smk95pZaImFwLB286YtO+JT/NgRgk8kp2nRFr2lca00ykoiQtYQbdI2mRI3NGkwDOFsTEtISznXI
Wqe9kuMAkV5nGpm2qUCqd71KhyFRCZwukQGZDad+pQtQN/Ge1WegnN5lyd984visHkH2PxkDdiQz
VgzYMdygES/Y+9XHfi+f4RFhHG/FEZgNxerxomNhPVaLWdndInMb5/nHiwsD0JSqaJoiK//qQnpI
JGrLtohspdc6cak+0ADUKbG4iJMjNRd5T/DuEfvGFp3EdNs3U2CVrfiE+x2bk7Bf5F2p46yNiVSH
jPTePhwqJhpiryt4yW91S4rPYxNgpk4z9fFJ7EIDlezvVMUbw94SllNzpqMzM1XwpKnLG9cKnYCa
E2dPmn1sRIGxyeKDP1FvlUqLZ8RfqoW6emcto06KR6B4KIoHIbyH++Yu6/bfYtoivvqs1awp7TrK
NvIszbefq4EZgJ+rwTn9rIFZA1qtutjlKbKGteZwSlSB0VXH2NLTWBimTaHTkbDcfJh0qdWqOvtX
QwH8BjA5T/eRT6z2o+JYgdnggzLooKvvi6x9YA9i067IXxFALv1ywW/mPcto6ddFy1BpB6aolPIR
vr6MAECihVYMp18jFUdeok8voY7WYEAUomo7R2abjLe6hvU4wxWX4PIEIPsOhheKqwrpHFrunoWP
mBPZIVdCuGRiCfyePIppukQqsLpsm6yKFIQLMiRdi7kf1eZDX2JMSSQzOyXZ5UbQZvoEDVpC6g//
oZ1ZTYU5BWNFGb3lDS7xjWYRm3MZ2rCKErQJwW7iXCsJQ5DmtQSA/GRXXXMjKwhpalbMpChGMG/t
JK3d9sphFsAOQ6YvuqpBqrccpDNj+M0HEx+as1Bz2GJya9ZYBWekkHD0cthKUNyN/GM5P8HIMCrS
1hEic26dODVcSldbdSYMxztWo60E8Mx7cKiTWYxTy7lVuVtGdsiJcyLF5Mhof+jrKpNIuK5vMY9Q
1aiQGfcjBth1NM1FMZ7eqwtujEhQSKgaNWGsxpWYdGDGarxV45TKcOy62/fEH9dVbKm+eZwPNFNj
Kh1G3HZ/K2aprLLT1TWu+hQjqqujuoFprCLzsZ7v0YenCYa72eQKdd+fnux/7gtqO2n/5GLPAPwn
16RzhWYN/E/XAOx1cnjmeTbaSJlHB5EkdQiNrLVyKga97OxqayLt9GseqvK85TJOnGAE2iR9ar9l
IjHtvcBOZI5rmB/pX601wABRwipNi4RD+ELbwl1QtHyDGVM+zNwmSg7YCAf8PMAwLIMh19bin5YK
8xBjHW4EeKbhERwrUyfsyXK3Bk/Sros/sk/mlcwLbMJsK1ex7JlVAJLJCCmDsChOq4VZX9qfddIP
HZLlHoy/IECIh+pAD2A5XIOubSNo3kIYi+PRQUhOUrXzilhf+oBxTTU0sFQqzRTQgRku2TKZglFh
Awd/0ov7gZZnQq5ORTIKpfU1zyHAMZse3dqsG3Fg78Wm2VSvycAVvJi/0BrjpbyIUYSmAbgqW4TJ
RpfYuEFzMWgZqbTDNm2wEpVGY9pp5b6uKtMMjtaENnQ2FaLBUZw5mCMAmp4uAy9WiIxgVAEK18Zp
cDdADpAQdaAvNEpXBRmZipM8KJ0zFLYY2KYU0r8w+DA6ihPwPoCLF/3PVD1qtJBo1Ymp1XakCLuw
cadfWEzLIQ5Jt36mi5FxTRQDI3U3mMRSa0Mc+1glV4zWl48bOiyH2j5juRYGLgt0g0nM3AfcU6rZ
hKs+dW2t90aCYdRpjqf7OpX3jXjRKNIUUrNBrdIxfhiQxMsdZzmP2ieSN3dL4Sn/Qdh7Ary1xY59
yfubXTSF7JFqegvGCZFJ3S0+uRE1J8BwDbHNkElzK4Ws/godeLqr6g1rKb4nrcOPz2LUrymTJ3a8
ImSS0lOkvq4+3P02Jbh4wyJNaMptpJ7jtjUwA/DcM2YNzBp4rgZsneqCa3536dfLNb06BgkQIuMn
cCjxJP3quJJ29R4bZdGIt4tDjLgSGPDzANdiHrqrRTgJogCTMEeC5ejLCgpd8oeQ20cTMmmehaOy
1uUiFdcSg3kewWkPODxp/UiMlMMt/KgRgVbfh0c4CfOIYO23DHaCRZF7L9OzmreWwFGuztU2WsiT
JIbds7g3tfjLOIxgyUOPeNjsyxU4n7tMaWUyfwhF+8k2S5MvmJ+YJwM4gQ15rLhjNnLjGmnZQumj
i6Ll6wtPbLptA9tYHnUo87hyhrmYZwvZjtk86RdZiVpFtRAY+Ur5dBpnDiRJTTrQAxm2bsA2fdFR
lkpE0RABm0hzniL5GxPgudYXSkCm3FgLudJmqy2vEVN7ZQuk2S47ZE5MBJBgtcsULbZoC4onPJZV
ljXiWUdcxc36ovqoLB0AFEEnZqFRdld0lac5WiZr+jATZbXtGXQomEfrE4O10hvzBagRTNlUJrgX
qM9OpfOZd2kuZnGPL1bUmJAb/TB19wi9xei24OFpz0cxarThmlvM4oXfal6gNB8TP2UkatI2B4Kx
Im4XrQdbHhIzcZ0U+dcg3ZfKrVgmXsFCBZc66LqcnsrnLIoq2JiyZr9CFbVyBkI+xEg0TnOY8pqT
I3FsPT7Qr/tkbIh6Qicqp9BkbNBQX5+aiTI7hFjfLuKMPygDeBnByVtE8iRt1O0YrNNedKFbn0vy
CCO47r00dlfTXgzx7OoHrdvELk+8sErFaS+Tqv28x7keRLJOHilu+/dVE9gcOKOKRtBu+PE0ae1T
X0Tngh32pfhoFHpzdaU4/H3jh+MJy6c5Q+Gdqtnxep7ugbdu7F1PfGCbr0dvU38YP8SbZ/x5/GbH
mAH4m93+c+1nDXwIDazJJMY8tvcvjauwy8nEB0McF4Vqn2Fc0zLJDaO1xFToyGWo2kSKK3h1YCxA
CGLRj5eu0QwEjxGvuRWWfu0ATlq8iusVzioS02gXCq3ypfMwT9yhRRS3YC2EJEyl83uRFe2rOEaI
cXhf5wDDOKxoNBISsrTtk5LzDz/cNZoWRZoWCcK0lIIDl7qmhzPhSouQbSsmYBgSyZGYRw2TqwVp
3KkLTK7lvsI/rT1OnrrCb1wLoUWk1Kciy1itFbw6coliUfPa4ErapsN22sgaxWneQRtfU2laPQuB
KZuqib/m6+114dQEhhESgGCMnFkKtx9TPLmp65gooCzhHBEggJCeTUwB0spty5NIT+suRyE0BcO0
S0u4DVxIv6ya9EPk1niCFaL9lrSPEDV32sNZRnVtvsWJA+YDqz6anuGmTMij6REgMe4ifzaW4J9l
irq5EVr6FKRUPAit0fbws1IPrA0PKFNwLywymWo6GC579O4ABEby7IvWB8n1YC7GLFI1VeqtUNNF
TO4MUF+w16n+A/kP62egrZ/RDWLLxuG79QeXqMljda8YwTY++znL4sLRt6hLgVWWOsQxmaOcdcho
v2tH6OtOdey6gynOAKIUihqIOVX4Zj/sS9xVoMVysCyI12cTYpxGxs7efi+GFOJNrVUj3ngfa2be
ItvUl6Y/PvwpZ2crdOIzLHGqhXJ2C61DkqTFW2VLqmy+0p/Vo7zhXDP+eEbdxmmFZzTonHRYAzMA
zz1k1sCsgedqQN65ZFcRr9bRynuW5AlQEeIATuAuK/Qi/yIFcci2VtKBsY/cB4rOq7JV0oJHiJXP
KgPp2MyfPebLvZG4lpXmQRQEZ10JYKtZ7ZweugQbepo9GVnzJ4dlyLvY/pKviGDcvsti6sAh7VON
vGiLlm5o29QuU7glIWWSlJX1QZtpGUyKuKwgMCnLQtUEpaRHRtNGXHC3hkESvspQCJmc9IvktAZL
fuZuTEsHYJlAQXGIo/3AtAs0zaEokMpEOGiZ0oobtRWZsqB1lHsppxoIL6VSejXzP/qj4ui7joS2
35hs4CiOkwiaDuAJTLktbJYBOduOYpo7IOhanmw1y1sO3mzHdHyUMDWjKU3TWJacW0E1ZWsiZQpH
boxDddERmrXWSmzKw9LZWIa1aH7VhW2HaRGW4bWz9YrMQX1LlL4rdXQ+EYmjLWXL0VKdcR3SN56r
h8jPGmZNESXGqdGoT0UIL2jTtRTD/bqYbvDkxUXE2lhEE9IGalcXt60qnhrfx8rDDTcx2lOlyOn6
9NDHKv3lFQzQnMrZApyacO6lQ+yWhCn/sD3vc6aNeq2sJkbsutb9YsiW74SBma8+lff2n9FHaYJs
w7MtTZFcnvZFn1QWHkEuxGyCZVH6cKeqhel9q9sNlyQicexvIf30/jxQkemZbEqe0ILPfTPM6YMG
ZgCeu8OsgVkDz9aAjv8B/mHtKPdbhk1Wpku4N5v1lefZcjUsV/OuCZYwIQrquFiUtkEiCrBWyzWB
NGCeNXykeXoQstEGy49rrB/GPltcakvuhacrAZJ8iE2MkUjXKIXWVGbIY2y5+9TLx/0fvn24ebe6
W9H5+at3D1/Bb5knzdrW0Eae3EFahwAx899xlSmpkgtTUTSqoF2F4SzNjb7IutwpSjZtFKf1vZAf
daEvMTdn/uphdXePJKwpTcj0AxccwmEbSQTecvymRVp1JM4K/6QBga58lR9sE2wuJ8aJUHTb1m8/
7dtyMKZ3MTRDt2f69y5kTdVaWfmfy1X7cak1w8RRhnPuQPzJVOYLTe9xWmhRXSmNS4XtxCMuYEaV
ZeE3+7nM+KTTh/Uj0J1THshWpmn4S+MPrpEEFZGHuTAV0K6dsWGMRYlQhWVOslVNibVqEXQPSMUW
Fy1Dt0gNB2naeE1v8ouWDVxHJdksBjqDDLz0JMc3VoOTEfwLCYHKKIZzItojuvMp6DeO2wZGnCGL
esDaDGka08zcYXah+sIKqcf6TxlaDTziw+a4UWNd08jTZ42EGM1bRSkxTm3DGci8ruYA8j17uBmb
pmnci/MdhWgTx/eeanxCpDmPg/SGcD6zYznmyM3eZYH1ZI2Fe03HIcSl75sQcdkGn7UBBotaHVbp
CDP3kXmcETO9NbtNq0/Gh9r15o+5hzQvyneUlRvVVYS0ZJv4opjYjqUCbT4iVtwbEYGF3rq9v3gZ
djTQ4wud9KYJW/bA7kXs0o0OX8xihP7fdBuZ+Eo3SYrnmiHNzjz6CIQWtNrNn9+3BmYA/n1reM5/
1sCfvga4XBPGOgAqaASLeLl9lFbVyoGWBEWbKt7p4EPaBrl6lrgFvsERRLTuEt5gDsXJSUZFMBuT
Ksl4XO77/vHwR/t3l1eru/X6q/urzy/FRUAa8Ay4aCVDJjZq4n5aCCRccn8sQdf79dnPzhaLxfLt
HoDNGgNH/oqQuf3VggH8GeP6YWIelyvLWMp1xQBXbAdFfKVxeCXfZhk83y9RKXnhoi6L1e3q8e4e
SAy/aN9nGPLQsvp+qfW6VIKO7QU505KJvaBk/dZuT8nCTBOomI1/zQ8Z6qJWeeYQUJOOxzTwatcx
FG2YitOSlAPtyXIdB6lyPkL1goEaReOL5aD9xnBgklynha9kV0ogJYBYeUIy4BasTmXSlVosSqI2
ypWVPtlsLSHEQI2EmvR5Fotq3a8AlxuScW0y50d4TYM5V03LbRtFcNEv4kPmXTi0M0PohL2DOfBU
Z3Qhcix5WC3NU6DhwU5zNzyfgbuoZGpZzZikjsHK8EhhWqGRHdKhxKGnsW/gMmg3m2jNKKK5aWi6
jWgcgZ72pqkJtsm0U6YDtorj0sbhqQXGfHzg6LemlBIzL/Ksbz1Nb3n4OxEzBiYypsxxjJcyzPPN
Ng0j+EhBdh1Rjc9Udts2ros6mypb5CJL3zfx8dQWsXQ1XxWBU7PvMWA2krf6ZFRpc+7ANTkO5z4N
FC/GHoSBN0bzVrMdexu3r78V4T0dz3VY4rd8oX3yxTteek/a734G75LAvVP1TWc0e11/b3DZhl/y
ZX8bmOOzR8AmL4q5A7/V4uqpPXaOt40GZgDeRltz3FkDswZaGgAcwvuUVj+Z+ERost0RdwGEOpqI
PAb+IDF1F6CScBZ0nF5w/yrzNEYsO8VHh+gc7B9dnJ6vfvvw+u3eq/3X978B8ZL3kErmW+5vBJql
DzOtx7CR2rJYWxK8iw+L/x0swI87P1gufrBM86uUU2tKtZwYH5QlsblmVS6+vOYtQphYDsLJWZq7
RpPhuak0Xa7Tx9DxxfIHr3feLGGvJj9rG2e5Z7PywD/lRJEtnYQxP178QRjLSWt7pa7NYluG08Cr
mJCN9bK64C+SCfAsABe0JIuouYc2ozJh/tAineIhppCVmSMbXqD5uJ82L6FJExXYr6/KHOur05Jd
pIXxlmhqy3EVgeZuQSlVRFZnnsrIdvbSvINltSFwdRtt9E3hifRcVQ6qtww5HZDrxuXQULVqa7Pl
Viw+JG0l1/9B/pac9bVNxbofH4jEcVsx3JTATVtBnd+TQ5oGNxsiF+PjD0bC9RB2AEiaozppePOp
9eYhHmkgZHCigRmMCjwxzlMbqUmqDoqjF1bsB2u+uha1hdDiDCi2B2Oa2GMV9GLHubcpYd1GxgP2
lPVhle6PgGKrWadqewwmU96D4sXy+5Cp0KEn6ZVzWLCnqmv6vFtbwqZU3oh+t4t5Axg53LIlJLcm
bpKcA9N5Lky3m02RauoLI69kjo95p2VNvGarRcknd7Opgs3xWhqYAXjuF7MGZg08VwNcT6t9pGDR
BRYazQGG6Y38csX9inRujayRAkitDiWdwhLJC1nqaBEld8mGmfDVkOz4J4cQ8fyzkxW497frk7Pj
9c7Oq93FxfklDMKr23c35xcvdpcwbK7v7hHy8BXssat3N/dHPz58+OqdVW/91cP93erxq9X6qxV+
gV5/99XtL24f796tvlqv796t71a0KOLiK+3kDEM2s1pBYLhMP96ukPPDVzhe+AExH+4eHuVKffvF
9avXbx9v760IlPVwC9x9sfrqHZI87iyWu6+uzq9WNwhfXX12tfvtxQruu1+9o8WYkt+vvrw//PGR
7L12mJBIU/7PeXMpbjcN1oU9XNt3gcxpnabOIc37F0u6iwPDSar0TxbBgni1Bxg1KT7EXyIu1G4H
UNnchJyiabylRRrJ4ZWt5ceKbOFoCKNOczBm5hAM1CqzKiY9zBzEjbUhPCAZcWTZRkHgTXoj0ybP
9b1cM8wqyHuZvYWlSyglxF0Y7eWujK+mBzo5y6+bClHHQiCt2fSphumb65Phpg5RORsi2VgX0TgU
SAcEVESmZn5FWYDyzieO5HwAhxj19DwC62Gf5xWGL1PH3F1B+vAJsSxDtxcVNXj613o0NjB87Kt7
PTXQDCkUNVBQrE9Bbn2p4nhxSpxtVBbHx/VA3HIqxtA1XXhI7BtThvXjfanZgW2sH8HSBC0G2Ran
VQWfdjEBvAcWMzKWthSyj9ksPHaPidhZtde4WnKSqcxcPO/+Bqh74LQpg3qmoDmTZeLFW2VdrY0i
szVDLFlXtoEO1mi1sYciabJ4aXgXak6QdR/GutViNytU0bmVXYJrz2dPlcSP73DvafGiehCaUrU7
dmv2qtN2Rd9QuSVgN5+CKDZ/rYNv+Vi7zPefrIEZgJ+sujnhrIFZA1kD8BbekTOtdn7aeUwHCz28
h6kWnrTAFQQCmXbX+A9sevjRh2mOYEyb5SNXh4risJ0VnVrpPi0HZnDh7u7Ow/I7S5R0uyKO0t0a
hwm/X1+cXbzde3NwcnT08fGbvTdXp5crWUTxOfjk6PXB3uJbO6c/O3m199oCl3uLxd6r9MP24vHy
kwtku398ePjxkQUKtPiRdTEZOuD/7Hkuf/CKe1zvLZd7rxY/WLz9aP/1q1cXp6eLN17E650fEOzt
A6K+/PTszfff7J8cH31y9Ob7e1dnl6I+fg5Pj9/8REIenQAj6ZxMBhYK2u7ZtFgC2OjDrHW5JEP5
DGvfbAqsXbK5zBixtek0zyii4zH9kN9jny1kC3s4GZJLlOl3zVJ0ThUyXyFz2WkVyIkHLZG1VdYv
YSfnOl6eI0WzNlsWf3GkkHAXPEkfaaQC+pI/5V8tUjUi1UFKNMxyUTTs3pCQi3LpE84SZbfnXIOk
BbKy0eGaTvBVVnZwEf5RCSwOiIvwJfoLj7CinR9VIORDQjrDc6crKAcZQgOAcCZHR4PMrBT7BjkZ
geWnOQq3MZMPPX3YV1xIXfyEoc9WlrF6oFyI57l5zKlj+rqmzZCaGD3awC2veMxzAGun3BrAoW0l
GWjliWrJ0YrxsaOsXRQj+DhJYbeaIZZ33Y6NkDz0b0y+xK5ogBSJ18fZffWNINpisIKBkU3fREzZ
4ZssFMWIhsEivJD2SaawrR7AhnqcMGMnrztnN2XdT/x+1FucHPG+MSJwoa74wvF2t1fQ8GMSBB6d
ytlOh/FtWQDeBL1F9I06cb3523WHPkbdtcfdRylV0bpNXzfb8g3gT6u1XdGCJnz7Wa4bLs5M+QNb
NRwrPrkpn1SbORE1MAPw3A9mDcwaeK4GgFX0fKYxEMs4SVY8Ioj7Ni1BtjhfCEhJMya9aGktBAOb
gVHH6jAtKAVpeXiv7HVgHpKbDvIBVK++JsIsv/Ma5INUAqTd169eI/Ddr26ufnWDC7CocImf619e
P6w0s74DKEoEC8bzX32U++q7hOG7X91e3TE5f8OyGigMDdH8kNX1ubu9xYbPOFP3+ODw9vp2/dX6
5vKaUu0ud3x1nMTTIUn8LCgVhbz99fX1r25x8fq7r82hF5+b2+t3K8oGIZGAZz4JfbXol2hHYiR2
GkaaqRS2ayKiVL2L+QUaRbHcOq2MZXyoTqmoYU4uICU3l0rbdEE2WHTtWCPUhTXNJz8hK8nFw5yQ
ShhPPbAFZWs1gyoXctPOTGDGJAXEZmR6reNCW08lOzaxnJMhZuFPW3BpzbZwWkZa+slLZmWrHaqY
FQVgvZg+RWCJKChF0O7ZyB/dzPznZWpmn6HMKXNF4FFStJlLaZw+kIN090MvdzVzMWyKw5c+A5Gn
KjOd+r05cvJBVXN0VZMJCnsWFdeYMcAwf9hbU/X6AeI1mwbKN/0PXKjf9p5r6pLVpqeG0FO07cm8
A1tInbZHK5FALErB+QUOTaWjCD8O51aATy1FUYs4Fq0ysDdD+tq7Jj2niw5mFJzmFrnJOmwKEGEp
RqibvrczNAEyildFGJ5YqV8psTXb6pLo6VbXVpnmXGrgnNJvc5xYaP3gRL31dry++TXrUQOtGV59
A3qz6o8rx7Skvl1fpBkKn7OIFx/gdTVnsbUGZgDeWmVzglkDswYqDSzMcReAgf/AKJdQhcAC/iF+
kAd5wZ1+GU1WTaMaYolOD9a1AQovtdMVae7i5xe4Ov/4BFtZwdZ89vEZ8n/363cI3Hv9BuZfXLz7
zTtHWICQc68tlMUHi4Rht0ySv3xx/5t7Jd87UHIWCddi2VuwZvjtD1Ogm4UlFQ20sCovd3dfH+6/
+eitJQTW20Bt8S3FCYd8vrtnKW9e7b99nYTMHsWoLa2XSR6SG22h4jBisNb9+gekym20+J0FwdJL
32DZXe1cJbGe1IVIZEtuf227WGHqgTtOKRU2oAJtAjVZADesVrnWOkbRKBX7SJm/NP9xcpphbCpm
JbE0pND+YcgTEQjtSKJ/zNxqhSZAZGtT6YR5wOYMCzDbmrZfVMFKxx82DeJTmTkVXZcB2xwo5Ibz
DC0hlwGjNNTGP5wUkPBmEMZeWXI3EACrJBUYP75wq7ZdRDNazcCpOcr8tvo+hYIKy5sbSbygGLIx
m0yXo2/4GCtYD8SnhEyRYavSp2Q4FmcKv7UtUcq5b6BcmIZMiillubxTOkPde1NItMJZ0JjxzcUb
pg7LzOOMabfHDulmrvrCRa1MYV70eKGDTVO2mp5lNk2T00xvcf5rYvEhmjVlQU3NiYahfuIzAgMX
lWxT6Hq0pw3T4Mba3HwrNtU18LroV29U4FAjxCk8b77ifd58IsLLZwrfxke1qUOfS33WjOT2/W1O
8QQNzAD8BKXNSWYNzBroaGCBhb7kjQd4OwO9eDwP/wI4d7CsVPZhjop2dwhyBCTbHhnGTDpG7wBl
aPsFre3QCioTqBaLElrgALx7fn1x9Cmx89313f31u9ffxb7Ki+NPTm7v7i7PL68/u7j91e3xJ8fp
DF0CGK3KafCUJeV5PB74/vHk05PV16vrz68uP7u0KJDk5Px0vV7f/+L28tMUCINqygfLknnwz875
F+fr363fXV7ffnFjt0CV51fngOf7Gywwfuc2Xijh+JPD21/dXZ+fX352cferu4NPDs36io92MF7b
Nc22WtYLpBRqou5wTubsAAywuMYZSGb3Rlwd0UTnZC2axVJbOIQjjlgW4XI4X0PD72FfNsstfZtl
vOXxQjvvV4ipvbioKGChmYuNULEYm6tw2XAcICINPNV5h/itzZ+1lzXclXlUldlauRgYt3hwFOKg
RISbOzRyg1ZxocXDcFrGomWKjXXgWMYsJ2ca/80jGhG4h/N7cDv9pcHJ6xcQFZt+oQp0JRDWssPI
zkyyBR6bwzNyoKicDqBW1RsZna7gMnFDcUplxUn/YZ4iNcnAfyJdFFQ8ATMGMh4Qox78FYhVGHO8
lO2qlpM9LdWI6raC5JqExxvmKTHqkatrsraPxd4yYNcdIIpi/mKgmYaaoE+TTzVRFjBWVK22d9XT
Lr2q77P+9SGlx5/cAUb57SndwtNEeZ73dMf3TJxSmSTeKP3aS6m/AzRJuAi0hvbOMEmw4fck7saJ
jKpNm2gdn7s4hRffeFNli/beZpeLtNzN1IsryrWvUfI6ZJNTbBFThYnRvDB1zZ8/hAb+DKM9lPuv
/375Dyd/+4cQYC5z1sCH1MA/nv3L3/zVYZ3jf3zxn3//d3/9IUua8woa+D/99/9GGx1Mu4QlwsaD
uQjyxw+my6WO5+GRvzJvwod2Be9osyuCYeDnLOMh7JNLeEoTULgeeLXziKOGxH7YmAmGXBZBTAXK
YmEw/HK5kxN2mtrJh8raOb30+8VZxP9/9v4XxrLkyhPHy1KDXKnAW6lB/iSDBAb1lWalWmlAAYMG
BgkMChgUsDQp7UiuXY12S1prVaBXSmkbpEYzUu1qNFsjGSTwSgUMEgxIYNDAoMCAAgYFDBIYJDB4
oEGCBr/Pn7jnnRcR98/LrPZ6x/d29qt4cU+cOOdE3PviE+dEBKKFT4CfUcUxjw0EUNtu7sAfftdh
PyFux3X39Onp9dvL7R+2T378xMcmUUKsm8UaWkJNHjkLrzVRKZbU4twmbdMFPGmPIg8c4tJWqiAX
JhEgYnpRHAuePQtAj6fc3fJ5ngDQ0j17d7M9ohGkEU9CBkoE5KPPU0cEAdrxluxJD7B8uXKbAxlC
S8I52hPiefMwqK/ji+hyZ+g4DS7wSnTNaQgeRlWO2DXMFvJUMDNbE4iUqJunQ9GHzIXcaiBoBzG4
PBvnLYGAtRLEcm0wMLZAKX5I0BycsBB6p7tVK5mphfzDRKFErcS0bDgaxB5+BmPz3Cz1HGBgI3E4
T1jKvYwc0NbsYOCviQOai0c6qVNRa0hlGAynPQjEhXMKdAjz0OayvzSM+erkJUhPT0/LkBRiI4I7
n+wSgxV2xV4E3R/x8ffwNA8Kq5wx/3CLWDKfPiqbcNP9yd76RG1xkLm6LXJvQQ5wrrqOqk9WLq8R
P2or3hgGDsqDBeuKZ4FxLelCmpma7dJdGr00RiPPeQsvg4yOuk93FjWIu8KPt3eLJ7Op87Nc3m/D
Lncdlt22nuxqCw04b66YIpQM9zFgYzfKht8BbQ21Sxx6qlaon/G/04G3p9tu8hmZNmCxm/rSXn+L
nJxAn8Q0vyLLIpHlnJ5X+qu/+qt7v1XWgmMW+Nu//0fDgdUDvHaS1QKrBR5ugS0xIdlwGydARLgl
h1EaIA2+yntnNCXfILCKlowiIfDFsQgzRUZgBvgGaMcFoqDjjxmDXVEcFDzOR79zPNsGGAz4S3eP
sIcToSbyWYUBmNaswtvMYFovKyWKhtcUZxRpP+erf3iLaGr4Zunk5OlKxJvHd0RiOkWJuEtgnq5p
IFVgSOghpyL9n9rdmnLyB45bT9Fr+ginBENwH/wDCTl5TLFxh75N+TBx7BNPDAb248nDtJ4XAENZ
SMDate8U2OpsW6A+GVjbNcOVSjxOIIpckAvPgicGFdr2WZgcBPSo81wojym5tRhO0OWPcZGZusBQ
4quThHmDikAewEu2l3zRNDF8vLfAwCJwYxH9so0A+Fm71ZEi9l1TAC70JfsTdwDHRzMMniaF5Mzx
vIk0gsZyhuuMZdxTz8FXBREUMtmagfTqUWXeAcLTsALhVmG42II6f1iZ4dKnyh54pbMrSpkxH2/w
bF1Vi51XwWM2kZ0zMhobKmOS8EgEqzYnCu70TRXXPqIRNyPZLvHl/l+hGbHjQuNE6dZd5lsTfOJW
1+yz7Tvdap3ieXBv75967w7UuczirugOljtGZYR76tUNi229giN+wpChTXRNmoVsW2QvZ8w1Db4Z
nHcf80NcwWHYsT5QGRZfR01twaKVx7zovZraLt3t5DmzL4bsxltdb/NCy/gne9jeaS+x/FGpKLPv
1OnWm9pOuyx+RsbeCaMVVVbaf4F0bTtVxb3NshZcZoEVAC+z00q1WmC1wLgFiMTkTaXLV79zcFEC
kOhoHC1SRXS0/K4bYjPclwdVp+nSawoQxQBphrOa1ZbQD95OADzgFiI6IiRWIUrGx6IigT1G0rII
kSp/2BReS3hnmvKLCEpAKQIz+R6NF4//8gT7Qh8/O3721y++/pcPQE0UkngJmkBSwksG2QJ9CXoY
kgFB0VWLTarJBFCQ1RoiMopbTleudJX7ETywGTIRO08AgluY0wGUgQwpsLC9HKQ6IErRyDwUqmTy
K1bSUkVrR3gJr7jWUdPtzFJgK3CIXZTts1ULGIUSmmqNriYLIDmc2/wKZzu8tXJcEzpSEgFX2Nbn
NlNZhK/7/CrNOIAMFRl+y0dN6Eu2AsOcX1Aryd9LZgMMxowAtRB/FFQ+oSx1l7TsKoLcskqZE4FB
UIL+dhiTpmb78hAjre5mP6JbXp1Ki401HUB+qB0ExtI0MnzmMh3byIIpf1kIdIYZYlL+cnrh+M+1
HnLlYXGg32CQR/ZIV76vyHGiqnYa7LX1HiL1nxxtGCq0HoNJobgTYyZV1y2exlbbTzOi7U4lZKdW
rngx4s2FquF4VnYaFc80cDwyQTcmXps/FwvaxecTbbGoL2Yxqufdj/nDrkMnYpbWNg7md1YaaLpv
gKqVXW/7jNTyVAbJYuTmG38rdp8+Z05NBCy1y/7i7cXREGPs23eC5TR9m9h7P3u2woOQbiLX2oXu
y7VeKQ+3wAqAD7fZWmK1wGqBfQsARzESmChN/kkGtRLeYN3miXyJm28RBb1BvDLWrHJJJ9yviqQ9
JuTZImp5S0BzA3imEF+sUCUqBjy+uzsGYuTxOfSUctkwlqQiXJYuXHhGiX+0YTKG+MA93Hcagbv0
PWJxMUUiLGRdW4cEAwraNYq1sliQTHpGDgM3aqEpMKrg3GOw/QjADC0gl0EjAJ4iormoleCqnBXE
jbXk7ubqVqqMfC7BxQAaO1TRz8mdq++4tTL+biGWdOEqaFSH04kIOG+4FBZltdoWMgDyHSlUWDMC
dCmjRlAqQhjFPVOAXaDh4sbFTJakqxnuVmRyUgCDGWBUpLkFN5nA1ogVByssEv6I6sAZSFuIF+5l
8KR3WiiRgJyh1Hc3qIsAEjMXEg808ifL7AV8en9vHXwl1zXgKPzbmBqQq9/OYeRwua/yITIAPLzf
0FTAW/tIW01HBCBcmdrZXY+EpwN08lNMDYCA/GVJHvhUQqzRc4iBcesO+3ML0rMUxx9cX60pDNms
60pN20GXkc20y8iMKprvDA+jqokBYgBdJ4wKImFJZ4Zrg01yKYbtVRC6Z5MJc9W3LEprt5wzQRO3
5hIZ0VW0FbKNztDabdaSrRQt4Glrn3entw7J1pHVdcfNmSV6kY1QdYnIyahyViPWGd2+QkHhsQwf
phq67orOEZMJdNGCdtMHbGsTIdvorTytEF7EJQ/+iKltw/gLjdoO2RdpQQvu0JQtbw+t5w+zAVNO
hTArXNfW2Tep6uKt7gRNxsb7BmTtFtKRz1Vi/321xAA1TZ52qaYpcw+cZN3283iF+hWx14JSNkwx
mnDrxFz8kGBj5ScinqDuJMJ9LLKWmbfACoDnbbRSrBZYLTBtAYITrXEFoNUmTzp5Vb8QNwp+piOX
flSsQaVnEvhXbkBvsAQMw8OBNyQufkguHPXxtvz1gqNPbIVIha61EJew2ShLDi66JcEZrlf7n3GM
MFzEBIFySxK/4UAmjxCI4rAvFE9UInOUAVIFJDO41cG2jEzWgMJnMqG4Tycmf+1pfCKoT1gl/zb9
wyDzlsvgBhc3DzrWGmBAU5qIwxEtfwUSZigykBs+sYaZkBLOVaA7urhxnq2dn8NuxnS0sqSPOCqm
g6iUVi5rAFeIga+YNdB5VAhOpiyckqBvFr/ctJEDm8lNZykRw+sEYDlX6aGFPalwga9MouEQ9iw8
jOGykCqthbrA+8SCKZKZtWiTbWTSAyx0jVoUO62lvwLDDMYWwEYTMHxasdCMVIfBURDtzv6gI6Cc
kGz4CrEhGMUzukampMVAE1MYKAUZKBhMpAamNgUVa/yhlrUHGMTlqgd5aTvocqs7znPpfMvp7D6q
BjdR5YMTIXPLKSOHCaybC85jm9YDlhQvxatttGWKuFWq28c2tQE9ap+sq9J3VnLsVHfz8QY7z338
7Ueku4Yfw1oTyLDlM9Eio5VO46s8mo9+VfWx7No60EvpoTwYRyLL6Vuz5q1Va/1XoKgyU88pRosT
19tlCEYX+9eYqScwMxkM0MvM+j0tV1ShKd9aPLE1BmuXA/uObavmjs6QZLs/nJ58KY2KvbDXLQGK
aRYjT2eMylU9IKbLz1Se1OgSJ9YHd3V3oehU0wk3XIBwJ/ILc+wZmWyU9eYnscAKgD+JGVcmqwVW
C3jl6jBQ0IsebkZG5yoTtzbDet+t8IovJAirtAAVYFUOQwXWKkqWgb4ioIeXF4qSACkhIjNAJq4N
Ns6iAPkCsBM8k+OxACMUJkYUnOIfEBaX44rl8MNJyc0HOa65XKpT636xcdIAqLjxsrc4LsJgt6zA
nPRBwoGJmW8kCIJ59DHkIWyTVLyA4iQfrt3Agtpo4yjKD+qiMX22BNXMMa6QQuJsPCyGhQ9c7nT8
Uh5icq0HJvLn7mIRpx3qqQ7gZDnPIR7XPIOVWwm6ezcy8sGGWGVuG5ncuAsqEBgL5zNAWjyhM75C
EUJu2Y7yUkLvDS6DQzzxdxH+U1Jy/GpGQPMgQr/DLdOiycjMF1N74wlkSDaj5WEPcBNPQMR7DIlC
Biayz2HhMHGv/NSXSrYuhimm2d8QyCNLQ7v7JbLRoooxWVt/12IVC+E0hq9w2h74v7u7vr6++tUV
cC9PAv9me3V1hZzsIus7uNylBtw1oUJGYg/tLZVdcoeZGLsnsqdPn1Y8ImcWdIHSNKFRBv9jTfb6
9eu4dXl5+QzXXz4rOWOzGC3mR4FP/XS0Ap9/ed7RIgtjGeKZPbSb9uinpxiW1hCt70R2JC5lUejy
W6Lb82dmEKK67sRNd+6jkXC2K7avl9FAibaxwjitZebEm56wiMdhyXOxV/nEdJ7729iV4iMObOeV
/DALrAD4MHut1KsFVgu0FuBCVqAUuhbpbIT7TktDGcks1x8AFb2mhLjcGJkLPkmsI14Zvit/EaNV
uakvl5gyJJgjdeJGelDpRz1GsC5wF2NluZaVHOTT47WVr5hAkZ5Yuojpe5QjkmtoEWlM7AdCVMG1
wfQnkjMdtnR+0hssoKZVylxrioBqeZuJ04RcuZ4Z9RL0ajUvRsk8w4lKGWCDGzO1AzMxt05yQnXM
56LiIyBUbKCl4GH5pe+0zbKUhZoAz8f2jtIfbrbQgHRSEXJyBSw3vi5xy4xeJqqkU5120C5fYiV3
MSi5MpbB2CdEgGgLHolMKEh3PatAEQol8IxPNpy8taAh4qXXlM5q1IFYaG0D5rOFKSokR13yCQsS
K0ydUJw+W6mjyGdAYraF3blw9tptK3SNuHTeol5cOM0ZEE2CsLcoEh78oQoNWFYOy/sts9iNjGaB
47pAfUU7cyG0moO1UAeFr9Ma7Bvwt8OCIJBBGzQYHXsHb9qxSHcI6JLtXP4w3184t06kBwOAALQh
vFWzdpEIfdtbh+aAVQv5Ss5+aCvN2MvJojptUXf5suSsRyuXCrCKVwrg7snJyesvX7948eL5j5/j
8/XPXyMH+XYFZ2Qb8A9ADhuDAxB+8aMvrv/5OtTswuAo9fQvnmZ00arGnIl21y0w8R8E+PrrrwsY
c3ca6W+EuMMtn4ieYfCHD8wJ+0wk4CE3ZQWD+4ooF1MJT/7iSSH49tG7X76DYc1nd2UX5TCrGNOL
WamJaY7RbtYI98UPv3Be22cg6te//jqknU+YIozfxe0T1hmM2eKl2f48yjXwXvWG2ZdtoSW7QHTv
6QtLTkC4Ye5yF/aS+2rWREKyB0bk8xBi4Erzayq/r6IV/BrpX+0MkXOqWaQo3OMzZjeL184dlBxV
sdemkSMBvMd10aKdwmjeCbve3ouGmOxx6817WmAFwPc03FpstcBqgbCAUKXwEnCmQnnpdWTI7pYe
Vq0dZTiswAyAKBLGqwyHJj7h3sJENvBq8rRenBtEDAPIhJW+RGJcgHpLoIUFtwC3CH7WTk5AXKBB
UcYPK77VK0WxKhW7WBEh8/wj4z2CT9zBAmAuGCaCJdiGMxYhvoS4hK8oCk8mwSHCdyGwRNX+y3Tn
smqELqO44C6imvHJA5CEQymwNNrgf6xfZXWAoOIJaXHQMYkE7yE2lj1DCRqKP4RUkxbTIUwwo1Ai
VkTT+y3cS84ErtprCtpZME4TMIHFrooY5+ZYtzqsCLfQFrQATA4TybYQ6Ya2pT2BUU/grZVeCO0e
4rdpPMd181ArTl4QvWOegmCVC5vvOPuAmiE58KeAJUxGYrYyG4vNBMGEZigAD3Yi5iQslyfZO4Rz
vy5kCEJbX8c2g/MN7MZzjHX6MTC5vPeE3CiFlKcbiHvRRqqLAdVlOTRshRYnhtfiYcJjrh6nGXlu
sNzIrNdXDG5GMUw1FrGfAddsouuxaX04c96JEHU6EYOnGFM6p8pfyG2MrB3B1/zTuLMQT+aMIpyI
oG7AduCKtqyRKgAkMA+Q5LvLd0hgGIrPy18K3P7F0/e/ed8d7wL9AsW9efPm44ePl7+4fP9+B+dm
cUULdWoDjk2aBIp49AggFn8A6ufn5yw+1s3iVkvTNFvVXtV8gbvHBM1YNwAA3vl78Rrfbo8xORlX
9s7lx6SVXDl96LWgp7YdIHd43vXkwtOnEHgBP5HMTVUs4ZNN6r4RT6WLZ7PXDLMAMX1WzSaMCNk+
ntm2McFxgMEXvp0y2YRsLWIcTBFW6j5Kew3dipQfrmraop04mJxwbC1Ttc7eS3UA9tGm/lEgjeqt
xa5+MqrHJGHpJX1spfkkFlgB8Ccx48pktcCftQW4JlO7H8tR6VBnnl4rfEVsgzQhKd2VcCTiXyIo
OTAJb4B5dJyPdu9VKUUXcxNml6Irl8B4a4CKW3S/8ggi+ieJGLmWTMHMDjwGzDPa0UbBrLS0jxbN
kgtPV5I7EX8KZQbAVXFVpFXHEIJMdEgPwbP3LtYWUPR123vJtDZ51olEqo6DQQJCfZX6IMbWUKhC
ZblCmADRu1iDgJlyg8uAxGn8nQaukxGkvhnZmLKhxPbG10PcuPey0plPPFkXxya7XbSYmfxvHwH0
ek0vOcPaHI1JHlekE5UAL0nAinB2EfWC2bmkmbXL/6wAdW1LptOY0JQU1y5iseTZSISabl/zpPZG
rVi/zZXMtHMZGiofJlKtBLecfBCC5RSJwuCJn9HEPhEKnJHPTLFSVLatVBZsF7vLZrIqmhJkRQD3
hVH0VbpKj2bJ+HiCJnH+jpIxzFWv2/mBQ992iJnH6C41lpNlrmiCf3fMPaZsd8geKlQJV5GVsqi5
NfHM3t7env7oFCD25d+8vPndDe7i89XfvELOsy+e3f4BE2UFk+TiAMAXf3fx5MkTPM7H3z8+/+rc
pgBmNv9Iv337Fv7G8NniltNIfPz48fnz50jjE2nfAj0ChFEEMOztPzCNyx7mPb+Wn3o9AAWGfSvO
8kjbh4n0xcXF079kpr8yATInImfwBlOenzzHLXwCXVOFp0/f/uLtsx8+wx8Av3PwCUBLvXQhn7r8
lrpAbMoc4c2SDrdOvn9is/gWP79lPpztSOPz4+8+IgfpN3/3BvpSowGo3NzcnP31GQSwVCgOpaAg
xMAn0mT47BnqRTuCBmyR41IQL0pBNjCnxHL/4tMJNCXc/vz6Bb9CVLcFr+5MRKCmJOTOWV1KHvaP
e2lVpn00OkzH5sjyhNp+sSXvMZSoQHjkIDEFOyvEWM1oWJIKtB9iKj+D1UOdGRRLjr1UQx6LUU07
ll/SNJ3Uk21ieiJehkt1avF5NqDvtk050EzMtS0VYKU7xAIrAD7EWivtaoHVAt2fkDJyI/4h7qFH
jrG7wD9bbuks758cvxquYl9lOBW1SRWXd4JEYE8bOKmIIa5WipZScP15C2LtKqzNpViXdt5SKCwu
whuiLPk/wcSSyiVIYuYAvWn4q526DF8pHsOz4DdkpLNhW8BsVgEaSV5Os78V4qVr2dRIEOvyuB3g
cG4HbbFVCyXjLsr06wrjKUEaBehyGhh8oL7ShI4YqdAFzUxuFQYb2GjMMVAcBlaM5WacOeXB/zpd
SUHg8ABrC2VrAS80mAD+cRswsiq+EbhtIYIDgt0EZfg9mM6uYIF/OXhJywBvzAg4ZB3WdhEsBsYs
BkWkI12Yk/5+Npkxp/C/oqNNvNOXHlq2F121w4nE6BKaJQFLsJIFuMbYAkJmGlhmoewKtkcOeFJZ
m0uykl6ZmIsxurY9XVws9uFTO9xpR7FRdirROiU8FPPQZ6FfZVFNfaI9T8XIADdKxujT4+B2EJZH
qGG3KJVzsjQulY08ZvaqIdrxaG6skLAr5+3NLUKdQX/x5qIyDXLAGXDIqLga9AM2u2ClQiszgPSr
V68Q8WufLQgigZWxL37yArfwGatkN5sNnNLAdchxGrDNMC9fBrEXX12UNavqJIhkBvM3EB30yoE3
m5mKcI6E05ETlmEQOOR5/x5QtjiW8Vw83lz/+hoM4e7O2Ono8VHkgxWmAM5+eoacPe+uJIbL1+Gs
uBz57E8UQUVf/+brXB0EhtedpMMoH5K8eP4CWBfu7ovzC8iABFD3u3cMpUbaUqHeq3++ApY+vzgn
8/1Srp3hzbh+8zXS+MQfmhgh2S9fvrz++tr50AsCm/4+Dt4FT2vuk/HoLcSlRbD8z6d7RWQZus9L
VNudisrTFjsDBorriF6yluje0nT5Fdt2Zy5cIMtT4eGK4z6YrwSI6bBqniLmMmYnNTq9KwQY8zzv
966qFRaaaLwd1jszFlgB8NpFVgusFnioBQCZuNhVOJZBuVgpqshkOU7h7FWEM6KFC0o5waJbORJZ
Sms+iR55NI5AizZGJm6B6xLoVOGvt/D0IqgYuGjz7Q0SAJDaRJp4GUfsCG2yIsZg80wmoizwBGzj
8UsKvaZTFA4ibZ6MBEGRCCj2HYdIWyJuuS4RKoy0d+FikDP9nCjF2GshWIAwxgNDALAFyGKEMOOl
GWBMnCkHqfGelivj8CcSEHkykJie2zuGBwP7bQC+Eetr9zhloKsW+bQJ4qLLhsxCjDxhCDXf0No6
EonWJp7DulzwPJFscN4WWwny0/KgkSKIzeY5UnTPChVzTazu8qRiLtWWf5VrrUkAswMpQkHEb+O2
HNT0td5i9yzvxU2RqAWLwGJUmRaTmlxNLVbEwKYF+IepCfK10FpYlMUV7QyHMOOW7ZPH+VU8Wkl7
VskCnIAAt+KF1iZeyONtFsc9tohykIck1x4r/J6Z6oG0n05X4iSL8ncukQwXu6Mc0/ev7sjMw50x
Z04wakdFraNjgnhKrJ127dDW5SoEaIOY+GAjJEnGBm0tcI0miNJ7eCz50NqxaYDkKoElvgCZYAiH
YWUe417AodgKK/cBwC0QBGjPZatJECCxd796B+8iXJRtFfBPAhzi09XhAoRDDhyeeChe/FTpZ88K
JAsP1YCi4RmGv9c9B0DOYdvwfAKfe3gNbLkbZ7uCBqGFTSADJAEBYLC1K/J8dgQHacBC5wPuomDI
BvrT56eQ9vTHp5WasHC2Ie9qZofVPZf6z3fqQ4XdpI9EhT8WUBkGxDzCze9lpc8enZ2dAZCfvTwL
dVw7fLm2ZKcUvL6w1f5V4PQ/X6Egpipw8+6bO3eJ0Su1whRC7pU/FKLUE2pL3gAxaxZvlX1J2km6
sUd+ygjNPaq2APyXcvsvrgmR2CLDpmt+J8S0Y06YbR+Wj6nRTjvGVMKkItNwvX1Phgq7RNU0rSSW
uW3KHHTQ6NWa8aAWXIlnLbAC4FkTrQSrBVYLzFiA4FDwDXCF6AgoVG5AYlE6bBmUaxwCcMglo3S+
kga/cVtuDgViLuslBvQSXAJCEt9q0Sa9vlySaicnkBLDXYWZFczslb3DEl/W9O0JoC74A1giEpi4
iJgK/Hk4MLEroBcO5eVhRRgcIQE0SKzFLYWBho8IAh02zILcuYqlmFAmXJTYAooH5DIol8tTjZCt
lMAWvCT00NJPyghqmoVn/3KZLqKUuQCYuvNkJgZyQzYhTGBsRupqry8c6muvJngW1/qG7YDwYMb6
whoE0jQsNeV+UXT8Eo3TB66jGsGWRtC0AqcksPkWt7DS1lbev4oGhI4w0QkSjD3GYcLEpXanc103
uLnBMGeBmQiiVk0NoFGESJGvjbLsdQcO5zpkhUm7xYWKUYoVcQUyUSiUJytJy/7AReM34CDiLTfQ
4lQC0xRS24O7F1ETHWusaGd1IDqHhbdlExWh45dtza+cAjAh25cx4ZZnLwTakG/CSTI60u3G5lVO
khjl5PGu09UIuIXTlpVtVP6dGN3mW3mUSf2TdsEy7NAdhtpEMTuQacJ6GZqO1WiasHDX1BVNbqCx
4i1D5MC9aVzXunNPfnBCdQCHHqtHDDYxH0BT+EuNEm9/fxtbB9tnC7x39e7KpQAI4atEnC1iid0u
2z+wRlb6A+6zReJfXSFd2Xn3NbqHB+jRE3Jf+oxObIBtOFeBDHdlgybqTTnEycMFpSjPr66IpX/1
Duk8WTA96Lcu11fXICvR2maruuB35fxC7sDSAjYHMSzMTchC/TwN5OJPnsC8sCpc015rDYshABtq
ck5hWBVMVqrdrFAKDQSPNPy6eYV2UTe1whenX4AbWGHhN+4CY6NskO0SGbS0AGkZ9rNJ3YVywunc
7V1vbfZuvQbkYTebvfsOGe1h5UY1o+TcB73o8gsqv7smXlyNkLkf9p9uhGT5hezgJ/WQKlFPVcRz
1LVbO9EgO4RBuoaMF1rbdjU0rdoxT6kE66pN3awh9n73OHRiZa4jrPf7FlgB8NozVgusFnioBYRS
iEW5BpVp4CL6delpVdysfq42dDfS/0agOATEMva4/A6VEZX9xvLZEd6QWj/bSgzjAPny5HT1lcaO
KkIP8OB5YL0CjUwQtvmAWXsQS1gsmMFxDfwFlAWC4fdW/FmvFxLHDK4PXxpqt6iDHkVI6cW6LDan
ABjELZcpPZqwjxcJ21tuYQS5JdWA32ANUOIryQn1hxDfYg2JxHsFgQ8GGf7FLWDpoV4tmdb64Swv
44exp5co1XDgRhe9kGoZJVgqYGMLagkVVAwC8idgJpq1+xhDmNJkIuDkAnoC2kWQGMYDDT8xcyG3
MJ3D7BbUwrVDWWJ4o2JuVCaIq22fi63UduwIcvyWOYLBkhTRVUNQC6xJAZL5yoOYDH0D6WWaesQz
MOn/2463MrZJiOUAH8tQU4vSQ4YlAL6rSItjw0QVqM5jfVo4xZDHuNZllwgzRlMB78ywvZVzNt/f
fLzhqb/wLlZNgxwMo3EXS3zzLReHBxI+QywbRhwyPK5YZ2uaVz9/hdBluCtv0fd1ecXvy79GmO1L
fIVz1X5apBHADGyMha8AnG2Q86Kukl5oqAK1o+rdEtbEotSbDkBCDlSA/GFV4ExIAqcuEClkm+g5
rWwoy53Dvjgl1t0f30PfD//yoRRJt8I3juoi4nrHeej2kOTq+grOWy+Hpt3+7gK+X9gcrYC0i2Aa
4vnp88t3l+evz/EVDLGIGlXDd+1S+YLPGb7uvBgYzQ2fNmgQHI61xIU4kMm98GS/BUdyqwmjA8pm
v2W2fA/Fddl24VP7qOayM++3bK6Y+JieI5ibQahev3miDf2tPNQtrj4EaS+0+RjanEXI4D9vtyxE
fvM7f79ND/uVWajeSjZuge95uvR//e/L//76v6yGWi3w/7oF/sfF//zP/5E/e9X1T7/4P//tv/6n
/9e1+5OV/3v//t/yx2DYGZjoFj7Qgp3oRcTgEdGwgE8DHmFCgHm7OTpGaK5Al8NWGc7KGGmG78r3
e3R7zCONAHGwlzIBD9KG00MpAjCjI9Yjz6FOYOK2xAps3hHQyUnfLIOBvayYwjKkGsVJidhghF4L
c8LXyphnBB7DMcsFpkcI/iNCJpr1rtdls0c4kO3VpAoAddqGih5jcQd+A2euHEaNiOsTROdSYXLg
MUuM3BY38lCaG0fLa8pqHdALswgrAqky0Ho4c5g2AIS+9Xw294K+EYiFj1eeWEIRrNpFbSYDkgR/
ulWRCXe0Irclmw5PEuzE9AEtzAOitHqWbccjlBiWzAjqcvoR2NzIqU4HLDe7Yi3E0ph9ILV2cnZM
svoG25ATE3Ijy/2LT7e4D3BWIxdKflVbaEV0EZu+a/DXCcbE3nJTexNphmf7ATkmzKYwYoWaaEO1
prvI7cUPXoMMQ/DwP8RkfzeRXRauYtFVOSVQppvDVhscvG0iajqIpi2VJM4uoEWKDOO81qHkUT6b
KoU1tp7GFmA/MCfEbvlgcenmeAPkBuwHpyKcunAhAg4BH8LrCB9pjputTRFGnjDgEpquWSvQtaR7
BJ99T1HLPjdE1V2rW9NdHZz3bALv8bt38LvC472r9O7R6/PXfYRfeQX9NQm/UE5AWbh5u70rSzg2
cVNElcGB5InGDZy64i18BibJqlmzClPNP3FjT3eGTIsBcLd72G5x6zAJu/MFi0061gP93ljyKmif
99zEe/pOvCdHDLiwT+7e0stfDtW7onocRt4AIQ/q+au/+qtP0T1XHnsW+Nu//0fDgdUDvPaM1QKr
BR5qAYA3YBiBWyEZLrUl4NEffZ4bolUSgAzEwC0n5SBfol8gGXjnCPkQV0xkSNCHmFiu+6WrFrsB
a2esO5xkSz8eQ4WFf4B8hHIBlXngEDAYvamc5ieAJMEdUR/CpSGAjlYiqAaW3WhBKZDqMc8Y3AJg
83Aj4U8gLm0WxfNjAQ5vEUYN3MiDl4CbkVNOA9K2T1zDrC2d6CnlymTBuS0ECAvw3CDEAxNzMugX
3HSSkDIJAlERjj7yKmIoSNc08TMhmw2Kfz0vgMLydoIGVYQxidVh7SNutaVDgBihrUOMCc7tXL4x
lt5+dkJD0ulKrbGqFpIcSwVFO6MUWg+WLD5WWZgXpgAQ2IwobsrEaHDtjP3ZDeKZcVcYlXDaUdwo
zkwdHCW/tAMBCsDmNloKtxYiJXw1Vsd3ZBKu85a885qJ0HQGQDsxOfsA49UxtYFZAJ1yrDXnDO1m
pTAO5AX6tXGKCTVrAMB8g1I4xSpwcndUmj2cHi8u8QPISOmyDyd7fadzqpGQh025OK0x8B/3gcTW
RDuZFX9QaTHm8ai1kO6VX9espgf0LRjOpaJ4N8G2T6B6jDiUauEcVtti32BgXbhDsf0SEK/TAMbY
UAobQecGdfHY0pn7UA1H8pa9nRtHVhh5Z64KCVQNB7o88G2xRNVPgj63xxz46aKIbKVAGlXzRWdo
E3Bl48I8wutXnDDixVcrn1J4cUvaOXErZG47cNMPq54ZRTNOc38Y68BV69cdWO3CDb2zMOFfzeBk
zq/YPjJdAJlt23az9vna2S0LYJM6pyvtPqMJ2fKt9kHOVp15J1T26UJf94HmeXEt1TuhO3PhLspb
KeC5vIKG/l82otQCn2KftgeGAcc6Z78landuBqLUAlcVNa3NPnbMuurnpyPstp/wPprs6lJ8frpk
RP41+1ALrB7gQy220v9JW2D1AP9faZ7v/fv/H+rdEHLgDS6kq+WjyHQCufJkDvssc0TCMFftV3QC
ZKJSPOGW59myFGGSYlzlweMGV9VC7AAA//RJREFUSwRaZkU/YTl1iTHS/OGIfEI7jpnohpUttCm0
/FSMQ9YSWW3azD2o9eMEby2+8igj/oSXgvzBZix0oUTt1IXreAuWC1CHNaWAo9SdCBYFqBdViDN+
UJe8vhYAOHlLbbkvlyxA7YoAql355EbFfSCTThuWDaW7lKWX+NGNfixZueEuyFwvCbjFlyCclS3F
1Ux0UHNlbzQNlSVmFk+dM6RW4FSF0nKnswrMFGDJMeC0V/z6YCewvGFgM01ByCrXq1q2+LEBPgl3
aR03ioSRCsjkZMdWza2bYM4qANERrc2zke2E11po7W3m4HMxkLTaPxy15+IalxDYly4kGFxKXfzg
DKl2Bx0Ktn94STUGEodPcWXEa3558BRju09R1afi0YVYXRhgM46Bk3Z4N0HcCr9kdIhxJKAvFn9i
VSpXBX+zRRwv9n/O6PdTmWURnwx6W/CwiMUMUYUSgzrPJjhziQHryqrOmfGkSZfkzKnZPmsB2ueK
Lr6fUVMW+8HyZ1EP6s8d0WOyY1lXGbMbOFetP/HoLbbg8KYas+QCRu2k1Qz8zjy7j1LXUG2bjsg2
YUDbMMrNG9DitUi4yh+Zz2olWT3ACzrUwSSrB/hgk60FVgusFhizwEbRvEKthK9wVB7HYtdyeA+K
ggo+OiETwR6uFdVWw4ZDvLH3w0CnHzx7IAW0447QdCMXEYgG6fO0j1QRroNwXkYrwAm4y8WovJRp
moIky084tyw2QXBwyDQctkJ3qncoRBAoUYHBdmKzuLhCf8NXcBt+gLlPVYF92phKqBdilxmDYpCy
2lmERUDgT9VFuxk60r89KOGVvd5nW/IzVNi6o4BzLaF2IHO+5dAuzUqppC79QpNn2XnLON88DFOR
YA6QpMA/PMmefcDFuHHQEP1qAgKfkEHMgbGFZgcbuADloCMa7lyMyLkBmC86mUXPflIORi5CogmU
CUgMaM0Loc7UiZMaaCJkeiNxIN4S7ayWRVWQDQS0BC3Q81G4do9vPOJxos0pgu7/szeAa71J0/4l
uyncW6qBUZvTrf6PkjkxSK1mDWy90tD77rt8K6Qeg8rzph5RHNNNmN1AzPPx52h3HqiDtCPe/yim
WlZJOPcWd5i2CaK7ZmPmDhw9ubL2MhEHqgwwYnyfXZR5xN9DI1V/aHtIlqedVYnHcyrh1374BvEl
nqYRvDFF0CvStX+3S1fmHe14rYRjoi5osCxea/DMoJWn9mRW1XUtmV+kk2JPvA26Uk09p5UTFeVz
Ttsnx9/2Y61ZdcXigs65SdnCZHmrZcrmwW+nXxc0+0pyfwusIdD3t91acrXAagFbYFsgohOEGviM
wSZgSgFPOguHC2uJWAClGMJqTGX8rFBVRjsjsSm4lyCOw1hVAfcqPK5yYJI9KXVWEGiwbFjOQ2Bs
MNU5SeKPmGOiRx7OBP8kwRu3jxZgp1TaEQpfKLOOXMInXJf4dvsZHJioEi5ZCGwN7OwllPKBRqwX
5Axp1jbUPAuKLtxy/JKO4WWlPPcIqICAjTkSlRsyCygy8okR4NyFSwiNoVaIA6PWxP9c3SrjgDmg
HeKKuVhXe0oR3WOuQSanAPbAoxp5ZUFPhnIRoy6wgIQ2Oy5uiE2Hqg74pYQs5b2XcYGGsxhStRxV
pbN54cFGJg17zKOAxYpnI8E/jB2kCS+Zz8OoQIwDn71At7RgCRD4TBHODJsHB6wZhvoKsS77S7Og
+wDMCKUMs49pBFteipQl5SjOJco0EbExN9wWkS1wg09EgMtQbHQYUTdV/TBWzsOOdrgTOZ2RkBkN
yLl8mRjU5lvGP9M5tO2Ccfwgxnf670L0aLIgdiJ7NvKtTLyEZlbBvaZ8fIT9irG1EjYBxulHs2UX
EUyMdHNTeuaiSxz5VdOj+jk41MUtYcPK8ovU6RKNiRFzNGMJc3Px/cF91R9ytdP9KlBKJuvDadXI
W9PzTfnuODrqGqaVwRNkfjPkRPVO6EweVdNe2aSuu5sTt6yprq4BW4N3yfo4Ob9zwhBtZ+52755J
szB5tmvUbvzJ3n8/V7Mb1VvRkuQnq8rpNedYn4wX0dhEDGd+u5HPqDTUbwWIu03Ckc95MiusdP+n
eC25wAIrAF5gpJVktcBqgUkLyJcLkEN4BsSlpbbAHsUHKBREHAUEIqhJcGUnocAkIaUAKgapdBHT
0TfsPyyfJ3AL+SPIFi5KxAMDjmJZLJyHpORxRyeQjlgNxXiur87m1YE3+MOKUIA6OmZ5vLBwoFaT
8j8duUT+XH7MHYkpAIOQbxQ9i7Bexg9TZkFZiqqDhSg9ywueHeEUX+JMQG6C8YLAkYApwBBZt16q
yiBh7uOlw5nKftRC+wyQtoS3Pv+JrHlSEV3ctgb3oN6tfFZdQndgi12ddltMEcoycvjRtx+BGLF0
VjHJxb3M2Gz+QlNKFL/9FkcW3cA+8sF6uS+OTUZF8pRq7bFwAxNSgXpjnTOkFf7kQmKZSOuWtZIZ
+JNbnXGAwmjzWxuKfn4k5dflkb8yIA9tAhmTx2BnqK8dszABoXoZD49M7s5NadWmnA6A31vCSguJ
h7oQL4BCDlwfKDUJg+6hHbPci3h0k8vGWDmPAj0KyWNZ3+0MYc1luBbiw12BCiB1PcDh0Ijh8n6l
f8xvfdQRlhwSYa6AvjtrjxOPKRKDwgn7d6HRd2WZCcg0BhsqPNn1my33IE0qltFF7pmHdc4WQN4D
NLYoeuR56bZsRnfRo2afwVHbtK3WfdxGynfrrUBdFrLq+X2unv/KV+S0U2Mm2zfpYW166JuqlW3h
EzXek+O9OpbYvSj25zL2XtTTsxtgceCkRquW5zKqHwWQtQC1lI0Hv3pMDHR917dibqjXlJ4OMM97
N+7CVlrJbIEVAK89YbXAaoGHW4BITxAROJQIBNvwaiksX+jKKS/27ZDYFHjsO9rTgr8K2mBZIM03
5CImAlF6+HCR4cbAXLnyDGOHZMBO4TGCPUA1hwErrtdrdCEIsNYgjWoXfzH7DJtp4ScQeNvOZKNQ
cQbIFRk/gWS1LJZH1PJHS/5QInktxx3c4CpuNQiYCb/tweZPY2GLWiAQHcJctEqxJQZpHFfsJb6y
BkWSAJCfCJl4X9Buq0oIGoFL6ZUtrglmDr5cBVRruoEJgcayFNmal+YQK3/FH1AuSxnKUi2uyxUK
pTcYuYDECkUmJLaEuI4xWbBTvcTGk8Ow9xWLswJudmUj4X8WsbtbOoonLjaocySwljTrKznI0tzV
TNbgLEzIoJOKzYSzDsqH3eavariTR0UZlS0alE+jpkoW9/92fDwv8p8WxSLL7IvcYuwlKt2joiVs
70PTAsXcjtXYvQI8C+prO95YTjUpsMhEYy6+bv4YSJtr0EOb2FNR5jrj1WwhdxeEh2tuomlQ2SSO
GoPEGcNkS0zhmWWWnOgd0407MW81L2E2YIs8s4l6d6uqZ0HdPPzLXTHaMRoro81xAN+aa9HT0W2A
4czqXedMOXvBO4OQe3WNmPT+8ix4h6wk2QIrAF77w2qB1QIPtYBwEv26jon1dkfCMN6qFy5QxqkC
VtlXjLtyCPtCKaKUskkSTw8K8FOwryGf/MaAN7jEgYDQgIqrhQVx6QsFW219BPgqVyrhGQAn3bCi
B1JiLDFWkJIDf0d5XBA58C4XsnLzZHk7kaDD8IiZ0vGOZyh9e3tMAoJPCwOKohWAHDAhZ3wpgBA3
a5QYYEv7aPdppoVvVQ7x0YSs/BnlFzBVIDG/q1Lna8toGtDjQfkzCwEEAD5UMPMwDTHYEAXlgcdd
YVlFI0trBjZzUyu3i9TBBW85bVqMjCJ2L9MaciADtUod+szBCRoBCWtFNLWm15dzByjOAGnWoqZH
zW4LisCwZ/rhwdP4+YbrNBUu4IJKkJIh3DzNiFSeGRlKaXswRkpb3xNOTXA7bgdIQ3wH0ru3SZDS
Flx4rK+dK4/APJaNP5p6mKHPiZZLZ/jS9Yq0A9/IyWM7GkSVhJ8hcsbUaPM/kYPRjJcAkk9Fs1zF
2TZ9EKtZcFXm75pKIr8l6MKzSdw10QNt8FmMcbAR7Lyy8PEXOcFuROwZyDoujeebrNEEhOtDhVaY
eHbyre5D0WuULEM8AgdJtZOzO5tgI/sK2072hOXt2BqwVQfcRi052/MrURJ9t/U9o2EZImEeiAQu
Of7pwCVu5NO+A8NcJst90h11pK3HnpE81RKPUn7/18+Xqih2cyJy8sOeZXPsdMgmpUrBwQJVn1/e
0CvlPSywAuB7GG0tslpgtcCeBYivBGyAPDdEWfww4NwSgeAr3bDEnAY5DHOFo48ARowApYghcYGP
8BIOs0EpkPECE3p0sWxVq0NFiTN4GFKLGrnFESEu+SBYlzVyNez2mAiTHmBIYm5CxTfIYAXh1wXI
0y+WONCTSRBIqHsD0HjLXyztb6wFq1sC12Nm8vQmZmL/JzDkKUo4Kgl8GUqtvZEJYmENViULbI/h
MQYOPzrZctHvMTbZoolwhM/RLYKpgbEJHXHiseKvthKcunBoe8tzoUo0dQkIlzUG8zowWxti0Y08
LA+j91j7hNGGw55SVFYXI5BhTyqYQqB36NH8TwRcJQwFQ4g1GuWYbeCNvsD+qKxnNvJn6zMhuA59
KL0a0GiUYkPOApWVOMGZvTy517hXQelyBSMHIdzHWsPMeHOcF6XV4zf2n+sQJqNZ9Qht3H2soGjK
xrtI4xN3UWMkhtFVMcPunzyodSvMugu6g+OGcS+ji4iq4WYeyeVbHttNjE2rCh8Cniet5JtLwMD9
aBZZMhM1AGPRfEQXlphtNfJuLVnldGFVJeEhoGKiB2aI6OF7CxpdcwtFOobt4sZM94kg2XSbWoX7
OMHGcG88aDmRGzc/SiO9PaOm1uxhZL8xpqYhukJWUK2aGpt7BmYnmwLFmXJKwm7vjUcgJBnvwO1j
HoUqu1mS3NBYCVRy9l2jpBlxlhYw+eCeWb35owdWvwJ73TI/+FYyT144nZty5CWce8ui53SuP6z3
l1tgBcDLbbVSrhZYLdC3gOOEASTl3CtBpxuhHft1+cOrPZmQkEMPGxrBs0d37iaAkXiDBqgSVCiu
03eUJv6k45G+SgW+IhN8tTSXGJjIT79AwGziyVGUYC2L6GAeLS3m9kuIECYMpmNTXl+s4JVbtezb
BBhM3EgMDF282xaX4IIzeHqzKNArKlibEmtNKX8p6UQFFAeYJJDjgl5UpF9BwDnsEXULWQDIER5O
mXlcLVfksjoupkWaKB0rijUpQLtxOS5PM+LsAFYve+tmxvQqEljLpGVYUkIaGpKAHztyGUkKfjNa
uDQBLc9Fy/a9S68hfJoW85pqLco1f0oou/qul9d6ckE7dW2xYJiMcOixvNncBIsy4y7Pi0Iavm2W
FzfNVpitndiYR6AphHXZUjKsZCgrwC0JuDGh45dQNYsKtGO5sgnQfOBzTKW06pgB5DQmzaKzlADI
mT3Upcp9zcKVNEqL4VqVMPCoBu5tzq5SpCbARjXUy5QxqDKviUHhXmUjxC3NgTntQH9i6D8xTD+w
2knyJUPhWaTX2jacNmO3zNPj3XxFTr4VjqOgTE1ZjcWr3hVAt0qA0yz2yDRTj0B+KHIfqwb0Wc39
52jJZEe3FTM2m0Bre91sejZh3+x1G409QWrKAGytqAvx+TyeycK3M2KTPX3ayPE6qhIVyz0Jo5NX
c23LX1Z8HZeX4Q7Nqspo2T3Em1a99junxc29y+mwVaDKCZQ+CFDp3kpiIW2TSDjtsnUiPLq+lR8Q
pwc5WdfIMxJSVdMBUwaZ7BjrzeUWWAHwclutlKsFVgtMW+DYOFSols5eQ1NdxFrFlSuE4/BX+W8J
LIfLLtNSSAS4GKss2GzO5KYEEA4ygX/o9iS44g5MkMHDUBDgLgmMf6IaOBLlD0Rxkm19wm2RgAfP
yglZSmyPtgh41hZNcA5vt0LLDFSWbEawxICDWHvBV8g1xKUMhIUMkCZQHMTz4UlWSj+Qcrpy2y2I
WCQo4w+tGebWzUVQVyizyBTexEt7IDPkW/U6bWO5pkEeu7sLARlJnWziEMl3JaKudjzk5vKPPRct
8zv2vqa4uqMmoad4UBb8JA7l9HwHG5HycMKClwqqjYaanW8BhJndAg4sBzngcbmsu2vG9IHySSCr
oi6L86CrGiTlgVGMm4OmU1MLvKfH8RWLatyMuweOnh+k/FC4hQETwGAJ8ZTr7JNIfCiTGG27YDX4
jpxgG60wkVCpWtPUoLkvjY3F8+j8UJ0OoM+dKg/oJ3Ej+I8Bv4W4sZJwpudMT3lMPGi5mt7TN9Yb
A5lnBpl4ApruigRgq5BbQk0HtFRDOo29+xJWkx3gmW3bWnLEgKVzeqeGZQePzVCOIfCJd+a4QWat
uqSXLmriqCl2jZ7sqwfNJ85qsRIsscAKgJdYaaVZLbBaYMoCwiJ0DA4JjoIUAo3tfzcAKUrT3ap1
woAgyATWNTiBH5hATjAGcMhhz/LclhjpE4M8eXFRnJHDWDJKdCcXqCjxeSv3IYG3VhGDJ92DoEfM
rWo/uv7q8t3FO0JcVgc/MG7x0uFGwqiETMDbiOmFzxOozFrR33j11eX1V+9UEbPhxpRS2hVLO0Uz
/hYuTZTibz+ColEtvNy8vE8yboGAHlQdIKR8r4bCXYYWY2RMnyo3SYYkm+vzy+svLxEvff3lOyTE
CqcuMfpYxRWSXWYTcAiQ104fX3357gqlHA7NI6NoPM8yMPaYi3jpLt5Cdi4Aht+brCB8WVMtRKp1
sxDJrloSGNaSmw4Khn0UmSxnss5/koJMEKBywoKeWzcNbGUMTiGYAw5qN3j4seG2T1SCALxLskFg
ZmhZryQsm1fDSlSWe0HDbU7PsEu5IKvTXWXKaSzt0LheFYyvqHG4pkfPO7o9d1CMgMO7Qq2WrVoM
lkuGWSSehsp2cBmcmDiAims6CFcnfb+75EEg+VOKcb9JhwxUdhMrybafCLFY02m3XgW9Yqql8lUu
RB3FthP+veXWb7vZftkWyY/xnvC7zohT4bcKWE4/Cws0zU2TAdu0i7XDuIW+1UTDAmH8wjHhRCL3
qCo9X8nEdE/T3NP91kLaw1nNFWbrLeq3uZXbiZh5rfYowumaE/EkLkK57cSQc+K1nF8a8aJOrZZn
GRZZ4EAdV/IJC6wAeO0eqwVWCzzUAogZJvYS6AXkAIZUSCohLhfrcv0qEdExF3DaI3oD/Lktzjj8
S8gHerkBTwT/6AvFWlP5+nALgJNQVA5eBk6jAoBbUDKGmWlANSwuZayw6uA2zs+ePn3z6vzq4urt
+bs3L1/bx4hLHmBCaK0ZJlgCjjJExL93j05Q6S1AIg6zpV5YegpYW0yEnygF9wIU6+jab7n5MID2
O8Djc8BOxk57rSx3NiZUY+SwFATgRswwlhPTPXt9/vb6/Ao7aQH9HmNwcIdSxzqYl3HR8IsKH0qT
YaDD44gL5C/7h2lG4JHg8duIix7aEhbCKUfyn3K8Qu0QE67FyRTmSCiRogtMYrky7UBMi8OH6E53
QLvMglXZyOf5ySAgUPeaasJ7ENAHi4XQZQwhVltvjs2Wgq18ijIakdKDvxoIZoEpsP3YCVG9QTgz
tQJcDTTUCwvQeJoTAXKmhfGhPoYu4TkUlGIR9x+whcoKWccfJffUhr9KhuGaG7jvKJXyAC6P5Kqc
uDWWCIYHjHXc96qRXwa97aAw8PCSRKXkEqfZPs0BuuSRX1XvxK1p75P5zIpdIb0xA5rbmLV9K1ok
D3PbW0NOGUlXW+bsq1+AX0SQpm423ZcCVLTj9cbAKWPMXNUTEcP3iURTzSwcmhCs9a8yR1JFYq+5
u1M80UZxN3Kicduc4VY7R1MZOVrkoJ5ftK6Aeu42Vcfrmalr24CRLhFwbszOe2J3e0JAuAlzJQMi
4Nn1tiHQ+YUZs4QmrsSrc7JgY2h87s0wUYtnMaqpmTy1EbdCzr25BvdJTn/zhVASNpdnNPC8Y8rX
CSvrnKGNSgJZ++veZ5tv6rle7x1igRUAH2KtlXa1wGqBngWI8IqDDyCWZ8kC+hI96pifW+A7uSuB
CY3TdBQNKL2FEWAS8oFFDU4IZQFUAE23pS7AHhIDcqkUCPArAiZIEEzJyayK5BZWqe2zZy9ev3h1
u7199dXLFxevbm4Juc2PAcnDElyBIfk5tU6YSSBYQFD+TjlWmdt3BWpiRDG08zZXWm3LHaSHXzUN
0bijslAui4u/gZm2s+I6YSCogsEcwAwj6AhiAFQmISBMJ2Vd+3Dtzv6hbUEnq6ZL0p5+9fz5V2c+
FBfyaIExHdTUzToKatLIKE2eWk8rpKxFvF4aLQIdGeW2EIYn4NSa20JJ8EzToWVVQszNyk53Fdfg
aCgubmxEHRSMgQIsozEEj3fmuIEHaBU5taBX9h+UlDeYIw9FqhdY61Kl9gKk0RkUHq8Ow09yIH+L
1FytH6xDxKzuADQPm1xuemg1wnskux38mXAYZpV0Lu1bcbXOsTRKq2td4hLcp2lHmRMKThCP3lrS
OkvEPszue2PZXdGw7eJEGTdH5HMbAh3gPwWOtp3K/WoeORyqZtB7UqACHjGHEr2uSty7uqZgF09S
X8kQCX5Z0iXGyMbQlJ+p/YmYwLoWtpXwPhg4P5jVo7qP5ycellxvC9WihpasWLJ9OXTB5ISdG4Dq
GYrSb/dDoKt5w64lOy+iPH8x0ejut73rHq1T2Tx/3Xv560mpO6cFHqYPWLvI6jfAJ+9In+4Z/LPi
9L0tgtQePfpf//vyv7/+L39Wmq/K/qu0wP+4+J//+T+etar90y/+z3/7r//pX6XKfwpK/dt//2/x
HoEvFJsbSx7CDKFWYtdjuEP5qwBAAjegHb8EyYBPgrBIb/SzgTsKylWMNHyPcsyKgC7dk+fPnoHF
9fv3t7fwInKLJtcFYmAq7Pp7qzN7AKe3j44vX18cb47PLoCBwYM4DWSXF2/DXJh4fXt9+f791/Ac
v3r+4ukPnuLWh5uPb3/1Zru93Xz+9Oz09NkPnnlu+/nrs6uLSybOXz59cvz6xfmH372/+OUbRjtj
46WjLdy5uHv6+uxaZL4QvXz568sP//L+2V8+e/7Fi+PHUrO5Ts9fwiHsbPyg3vzh5vKf3328vUEk
M3men8G3jMSL87N3SpDs0R0g/dvrd2/OzjO/06/OECzNUhcvjx/fvfzxq6fff4KvH3//8c0/X8IU
vhvivfvN5fW/fA1kTnisM4rBG2h5i3+1qXKpTfhZ9XqBtKe9DXp5chICwe2YPf6MweHIx1plRGsX
8FsmLMAV/aGUUqMQMG9gKAFvjRVQ6THXbO+qRhQAGhR3URzB0mhjhG+ja2CDsRsQwy+tA5BuBh8v
72HqQft1nwgAM1JdW3mTA2q5+MEriPrFj77Ipjso7fGchzWRiHTOMdslOQcJsCOuEEvLJQBMRjJd
h949JUjFxkeiD+d9Tw4hUoxNq4T5ZjN2jdMtdYhMS/pAl8aVxFB+drqhC5JrSUOduDGm4GwHW2wE
S56fmsipEotZjhDmRl8gf/sstw3R1nQfmcfM/lCF++WrrjLfMSbEq+ZBRgTuWtKNfh9ztbWMPcUL
Wjm/h7OcUUlrnxmLZXPlyaP2lduKtyTn0aO/+qu/+m66xp8117/9+380HFg9wH/W/WBVfrXAJ7HA
1uDjM8TcMlAWsb5wchKlEORos1/sz0xvJcKbAWaBXYFnuHgWNPiuFbPy12GhJks5thluO2IkpJEF
9Lv5/MmTzzdI0MmslcOAapBfZPZS8n+AJcBjoF/e2nIBsByA9A9b2fNfnp/93TmQ7csfnwHynf/0
5bMnz84v37x6e/7sB09f//Q1ANXrFy+/+IsvLn/97vTLs9PXz3XIMK8vnj49f3H+/uP781+8hUIo
fpv2+VCwrqp4d3725nyDKk7PINjZ6RnSL968PvvyOTDqiy9PTQZwiz+E7AIDM/3V81e/uHhy/OTV
T14SaparJIAST796efbV8xdfnb0W2evnL0+/Kqyef3VKx28ETn+7ff2T82cnTxH9ff6rt09Pnr7+
yavYQOv86vzsFxTv7IszWo0nHjNuWT5VTj3AO8x1s2XigO0IeSSSkCrvlvZCYa5bFiTFH1tB/u1b
L6JWf3ARxJYL/ZqtEkKk8uUCnTpaDGWFfjm2MLHmaHHRVaJgaRyMxEhR4FtmM9xau0BLdxahZ57F
AaRv5ImWitwf2+7uwq/wDOZVYrC+/608CR4/2TtEQdN5Ht1bMeg3tyXD6/3607fwdVTDLOq4H53r
HJsuJzz2GtwUu8SYKfa9Un27uexCv5xFWl5daN91Uk3zyWi2NUUldmuTsZwxa6dwxyJ12k84e5DG
+knVqXLHy92s7ZNhpB3sac2VXWoZ0lTIx7dC99yyTRNnpSxDlVOJneWsppDycxGK269YXwv7T5a2
enCSUjmC1/K3T7e1yH+Vso2IvYx4QuOmc0Zkm7Zt9fLpvo66/WTvbSZLFiNHi9u88ZZwOsvsVlbf
zomuJWO6MCcWmSvEqGpvu+t+D6mQf/TJ3KkCkFv9PKeZc7IBoyuGuSLyOWKhy1Ra4GElSuRzauVu
LHR+NPJztMhWK9HhFlgB8OE2W0usFlgtUFkAXlB6dOEBxsG28NEBz8A7x1jfIx44dIJlt7f4iWAA
KkARkckxT9OB2xE+W7jyuOUVzvglZKJ/zwHAcksq8lnoi+mtnZD8wwpVACpeG8EkYjZtJiwIdYTg
Z97awOGMQnTjBqD8+PHm9g8fyo/ct49Ovn+C9MVfv377NxdIPIHLlJkAVI+u/uXrWM9sjV89fwnO
b375BqiVZ/8yInerzah5wfPsxMcPN7fbj64CH1//9j0S5z85e/Xy4sWz0wjGpv+T+PDo+V8+u3x1
cf3l1duX5yhl9O4LLvEheXf69NnF37x99+Xlm78uZPCo+6729NotGMYUw5PjE0ry+48ff/8eiZPj
Y50bxOs9LXAT4mkBMPkoEht28x7U9J3iH3t02VbMhGsXN7HMm63BcYMrZ2sy0J2mNpQdDiXGfISO
Kdo4mlvisqXYXg4F945ZOvNJltQ5xnIva2Uv5VJZLD9mpYPBhatpfEo1xDZTTtHr0qFQSrGgoLJq
jGt8TLxHlsb0kT82xqJ6ydPloZVLVcP9qoqlX6eH/tWQkQ2xz9g5hoU5kW0St4oZh3uLzTWvywSr
9lbbXm0FSxiySyRdqmE07oS5cqKqq0uTzF6aOzVT1QHcE5w5kXC1LQSa6IG1Vdr5iCpnDA+bUe45
ba8bKmu1CzFCx9n+MIuiZzkUgSs5c/+ffnACBA7PaYCieHJzYpE8s0QWb1zIbs+5h3krQWhtWSP4
12+z6CfV2yMxMggsHTglzNYAL7/xJmZ2Zu20R5DbMZ67fRZ7CH//Vvvezg9aTMHkWZu9zqk3pzF/
N1Gemphk1HO08J1QyTahxWEWW6lHLLAC4LVrrBZYLfBQCyg+1gDJF+CKkA43G4ZHDmDVsBUJIGRA
RwVF86Ij1wAVYbQCe3DZ4ozcDc7LBRDGXUbSPnr09fsPt3/4ePuH268RtDxcomf880bYGLGywpak
v/r6Cp8vn59tHgN5H589f24kRJmivBI3Nzf4PP/lxfPXLxDDjGhn/PA48/lffiGG2yiLqGmg05c/
eRUoURtRlSv22aK2aejw5ldvEIx99f4aAcnPf3gqdyhZAu7Tt/zZ5uz0Bdm+ff3q7WvzCtwbVeM8
25ciA82rSwjAi3YXK9gRybL+lnduEUSNf56cnDz7/jOqCaOWAHX8Hu/Ekzudl7GjJhEY1x1K7dRT
lk5Xpt+11D6o6TkL5ipns0MawMngsXUXkB+eX/FPXKWyoYhu0exaFo5+BblQxMuGFSmdjC6Ubp6+
aBIxBDbG9Ae+Dh4kCgZdgzJJ8LBkF8ZQlGFmJCdiUFjEbXzIkV95eB4kY4uEW3bVWDwTTNx6kFj3
LTw+Lt9xnKap0N0EcQK39xV3r9wSsDc2TD9MgDnIt4sLAF83cbiFq0S34hZgi6wauC+cKso11EP/
OEgmiMZmSe43ezJu1jyBlZ/ogxui6kXV8zhiyahluj905yAmuhnZ+gU+rK+OnJKwtK2/el/tiZad
lbyj0dgky8Q8zpzdQox2FtK3lqhQt3U7iebHp+2cbS/pCfxpHvbDeuRKTQusAHjtB6sFVgs81ALc
7QmrLnEOECd+NwhRJfzgLlDHQkrYV8mBqSdY0IsBkty5d3QBa9UuZ1LxH4i1q5Mx55ZoTcfYyFWy
vf3w9ur68t07ADkA3QEgqSIsXhXkkQP2hv7jR3dX7z9c/Ort8Wbz9svLd1++OTl+EsiHDsZwnB4d
vX335v1v3yNC+OriHVbwYq0vfpDO372F2/bsRy/w9friXWxbBVx9ef2OntgX5wRa9lsOfkV4O21K
4a6Shn/1+qury9dvUAW8x2+vLnHv+jfXqOXd68ur83fH396++/oKC4bfvrx48/Ji4LB1IpyWCIF+
95t3IAPNm7M3w91HwNVgdflznJn0bvczjJWuv3r74ebD+U9eI6Aaa5svruC1HniWPavEv+zALId8
8eXe3mk9tkKLvRUZteQZSNrHC+DWW2cRiDLNfKpM3y8gPduVDedaECiu/ajgjDWUxaec9iWNr1uF
W7NYOUgJZW/cxHL+ywwWlcc4scPoWKbSl3gf+2kXmw+sKDOW/gr9eo1xUUT8fE0ghB3RTIrujv1Y
6NbvUfl+s59hzIFWg+olo8BpL6jvelBrqJMTcSvThJWqofAsssq27Vr7IA6Vz6fCrmNNGTJksNGO
UwP1VRYw2xGTljFrBDynPlLfSjQRGpAT7gzuQjlhlg/yAk30mRA4uoGVDeQzhkby0yCaJXi+q0uF
LTNNPCClNvvcZh/YLvqNbp9VHmvcEURkeZa2Rdd03bY46KGWzF3A1jZB7jmt2Hbehm07iZj+CLIe
couA54DTuxedfhhpN1zDjgkzBqyqaOekonNG881NhI3h2/at65z5Vq7s1n2XDnNJiyKf014SVmvF
w/kd852m102wvlPzrsz/2BZYN8H6Y1tc9X3v3/9bv7rloAOmxXgOcc5ARPD+Ee3AbcitqhAXDeQD
gMutkgRmuLZ0A6ACGg5wtKERXJLHRyfY0WoD7/FnCKsGor5lWHXZVUtIDbtifXuDU4XICi5l1giA
5K2wUBech/CJojrW5h2zUF7uxxM4V42BvMnW4BIWoDo63tzZOUlWxoR3BHcI6gaaOsEv/QYY+9sT
7rpE2MbwXXw9gmpcm8r4bXqyeTKQ18FSbNzaQBEKeSfdyQrnCemsIIrG6HFOBMBJiyo81MNZuz5H
GByhH5jQV4xAcbl5oSWuEwtPp7ls4kNuZUwIgkOG6M6l9NiH7LOb40cn3GhaYmvnqsQWMeraO0oY
GI0ItghWZ5DzYCKKov3GULXcsLFLlpb7Gl2rIiQK7OTCYB62RKw72NkJbkZVEDIVEbSW1lo5jNkT
qkAYTGkFZYtv39HaEorbZeFrKVXSpS7cxi0sSocKEgCHHrMJ0KY3F0/OcZubYGXwI4Pe+/IgD8UX
Jqhzs41WPe63NAFLQrg251C5M4excWfk20oT7sEKNVU4KgbT90tkC2TOofJE7exR+7guctrEGJ9D
bZtaNopWbZ0bOo93Az+4YPSlw0WYLFEBCZuitXO017Lqx/pzPBfR50PlpQpO971WzgMlz80UZs9t
ERDOKmR7tCqUnPbdUnXFOfC2zOqkiqmTbp8ZldAVzD7XJlv2zsnvwNaAh3XpMQNOyNyYtH2jTuTk
DrzI+FnC7ntmEZeaKNvwZ//hZ/fisRaassC6CdbaP1YLrBb4ZBaAI9RuVeINuvi4BlhBsARg3OSZ
ZwvRPaiDZLGVEdI3REeIkBZyowOEiEthskeMapYvEZiWiBnod8PfNhSnT091ETjiv9tHN8B7A8Qi
DmTUNFE1GALtcA9hnR7MZcaGYVqtyv2QtiXSGGm6JQmx7m5AxqWwgK/0TBIqI/ZYgbhkxeIAulqh
Kjem3QJCVkTQ+EotICS0LmlCW4DqEvYspIqC9I0K81E2K06hvt1CUyJAKOgDh4k2oSMFZiCzfM5c
Ry0nqn2q2v4aVd9w+TBd8XKYEvXBU0q+Qq2cGjC6FqCk2Erzm+Yj5K7lDzkIGY4O48uwIIPuvMiB
YFXSWmTiTNy80XJoRTjbK87Wp/OWAniltNp2iIWGVWlDcRUbrg83T60kJx9wNgEpaS7xHGCzeUpR
Z3pJdvEtqyA7FeIOVO9naAKxjUrzaMlz9g+4un4w+xO6wDiPw1q/H3WOcfYgWJtzf3lb3W2Bygg5
p4K1efCXPW+Vwy2j6wp3ZTzsitqc0BC3KmdLJbCL52F6BerYH8TONE7nhOsKC4z3h1kXzQTkCEeT
mzhDwegG7NDL/Y1holbgrEvoawuEplVPqG7lVl7W2yZQxCx0HK0hdzATjfWrMTC8TPgwe+urrOYm
gt+Yj3Gvm4XM+RGoJp56Eo4yT8TT6HfvTTKUKmzb57H7hB4ym5AN6O4d78AqgQetELdPXPfJdVdc
8ggn44y1Y9t81Qu8LVi3T/VotG+nXvvmR777k+Fn33XNy7CsV69UYxZYQ6DXvrFaYLXAgy0AfAsf
r9yY9IgW+KVzaIWRhBX5W3wkRyjQG0GvDge+4zk4AFb43ALtwZFLAIlr+P0wt61o6C8WwOP2SNzi
iD8TKKLze1GVayEKUvgucoCQgJ1CAAlRYDCTpCA9K+EuXDqUmAxZaqOtnhyVXf48yFY1UBlscRvg
lHtZCcmDoXySwplC9RRZUA+WIVsASxSgsrQAapR2jklTmK4wJ2YQYIzYlQrB4fDc4uaJ5EGIsmO4
IT6oKDaNSbFv5UmWDNaVzmsmGKZeDs4lqrdxpMhwAS0jSacxRRUNRTYN9SrwFfxsD7L1P0KY+jd+
9Qt+s1kKL1mgXM7VLMDAoxoJaUjh2lkT7Vn429QqzukJ6YJPx2AHufNdJ+A0zKJ2iKsaoBwyzkt6
zCTHRjlFyuRNmh3ujBIsGEl3tO6CimjEPNacUHECdEWpalTdcptgUmHaCUkyrHUpXEvEA1lrislW
nfZbVvMd7Lr7oQGRE5V0Geax8vL+1qH0U9OdGqioM03VfA+SgIXzgzAGJkcrGcNILhBtfdCDMKdR
BT7v0xzT/fDwyYUxkfOkQwuf+u+NqD3btnpqqsdn8WMyO0PkVism7b6IsqrtC6R9rhe3Zu6Hrd3a
1/Uc4wUzp/vdsmqgiRoXmXFevpVi1AIrAF47x2qB1QIPtQBhELZv1hLNLcAnUQb8t9gK8hYHtyLQ
F/iNZ/4SD/uTsBRbQ9N1LH8j3MJHRKNwYN6Szx1gGzyB+AQf4DHumwWAinOGCQXv4MzcCEPqd/Sz
LXaTEtpB3DLW3eC02BvsES20SQgKTIgatUYUBCwkDEehQU9RhaB4Ay5pnaNzDDfvI3qDmVN2hBIH
RGVjz2quhpXKYIv0HXKO5GkkgPSpPNwtGWG3dE5CEU4KuEbwFMS1wPSN02/MHZVRFsBVeFrAmHaj
9eRBhVTcAoox0RtEYnPnKjBBXTTagPRgE9CDBBagNowiZsQ10iccbbAK3hV6BMamd5Q4koMhIlgw
QhWCmgLSRWAkqJF6CVqEnnxxNqqECrwr7Ur4tJAqG8j6OrBZDUGZjV3NX6HakodeX00cKF5gQxc3
rMGGE30p5ROVyLNMW/CULMFvQl/Va+3YlkNiQMUciMjm+XrY6GpiuDl9y5gnkEAFCVo32tTI7KDh
YB74VsiBPW0wTUZNLVkLqMaGzl3o4szK8oFg84DYInVvWdIW81TEGWa0SKlVba9zjFSBvjU49tmT
97c6i1ttIohz6zuzwsDLx747eFOZIiw/DQvz3WiRQ5BkK2rO6SqyXLu2NXY50V3bRPSunJjiVe4F
yh2TsH6oY4NfdYldr64EyN3M/bN6XkZk6zow2/62QDO9ENOJfZ0HxzLHszkx6TD3wonu7UR07yph
sVuT7tSZwMYxuRDUqdMuxLFdX2tt81bZeExyIl5TIU9+hQ6Z3QZ1Jj4reUZnPBe290o2Z4EVAM9Z
aL2/WmC1wJwFGJ5LFygQEeCZApW5jTN9vUSzjOJFPPBWmQRu8qwCYiGWeMsAaQXKAtwy/FUOPQQP
cxEvzn0lxCI3IEgG0yIaGvn0KyNUGASEXoBkwrdAuyiF6hBiTVZkRMmBnymbYn2NnL3vMeGxIoGx
hJjojnKAk2C8Ft8SVVtU4nMksMuX8BgDtwHdQaLVqhr4MPQa+uIMZEaAgzNRnxzCdMlyu5ANfxEF
xnQLy2XpTNZKaWNdRoVxsgBVYIWzgDCRNrA05FXtnxFnIjDbkFhnPrEuSu/DezUvACwtNeWVZWix
oKC2UMaGW5JcbaRtxlgUnJmvE309SCrrbBl4bByLXN3w4m25bb2DqC2jr3GKkuu1VAK3EIb1Cr7C
tLYYm7UQ2GtNewpOY1cz6siM/YvaURDqQhyesK7y6UiXwXk5IQE40SCjedG1r2r4EjW1o//xAV87
0qo8DDRBb23w2KBwYrxY3TLnafhhnWqaiaFttkwFPm2xDEdb4sjpYuaweSSCYXvLOS1ycJExFYwu
cEVijHMWPtNEN4jEsANTRkf3az6wDEhQtcu9MeGuYGWTDLEqO4/dCpuE5bM1JgFGTNlU9lvikOyi
gj0+LRDybaOgjIUmoPsCVB8gpEpYuwrXWYDdga6OhsnzL9XzErem+9ugeXceIezcJirLT7yaatvG
I2P5w7ZVon00xnMy9G0n+5gzBA/1DTj2eHYhekXcguomZ8w4edKqtkPU0n255XmN9OrwS6xtyvzq
XtpSh9h/pV1igRUAL7HSSrNaYLXAtAWIaG6xv5Tikx3DrEW/QGj0/NkNizW02NsZSPiWO11xuMD4
VcA8gTS5gnERrpTzhMrIRqCxnISxUTir+PPXWvXSh6glskBnBe6SFSAlqHHBgax4Y3wlkhQeZkFA
TSWApxlgzP238IV+aWFqLe5lLRTRnASe/PsHTVGvz0J0JZSdxx0zwehoRFNzSbAcpAR43Nea0Bva
kZu0BdIDMSC9Frhi2TBVAEDFolwyAR4WJX3qsKq8vriwnxNxndyn1EMwXh54KVhgIf2oAqgqwwXJ
WH0NEIgzkkmh1mFzEDMQMFMvVkte1nYXoAv/LT3Dw/BIJATJFEPqUC9ieOjrVcrI8uJb/qHC3aXO
QC0Gx7UJyjxC2a6ZTbxHoCYOPhbAwu4uFAjko0kN0OPTUxV7lCxTjWMyoyq9YOg8Udq3KoTT9RNS
n2bx59igvEvszEqYB3kSWvA/Ph2wqzcPqZ27pNTE1EMGvRO2boHxbMMsIKhcNBMtEsy6NO4GD2qO
VtpQOcNak1XIsJ0aCG5L2iu14HJYu2RwPz+J023WVt9Qp/vALuiB7YxSNevhFtwTuIsYh9+I3URM
AKTFL5NP3E+qnpNN2r4JWyFzX1rwyLQk9czgJ0La07JMAF0X7DqB29f1rpZ7iL3f8aoa5zv/vay9
FlpigRUAL7HSSrNaYLXAlAUIcAnVbghsCK2Q3iKpfxBqa78uENQJI2wFLBny6r2aUNhpuAzlpSRe
xfbOXEusUN7PTrgVFjdkou9RqA/cEBFNBApW2G+ZW0AXbzBjd5VPGEAhFIWLAlyczLho4uUSr1tY
AcKdACt6hyRCOoFwoFXy0eZecJAyLLk4lhX9a70kwJbbOMshCYyG4RFKEPdzEyn4rYHASswwtoaW
FRXhDGcymDDGGwgZC4kFL+/AkdBaYcCKcPZq52E5McE/apRgMp70Yn0wmuYdqLW96OUUXHhT6del
UFIBUw8uC1kQVq0Fz4LTsADwsCoV1qXnFv+XigZcbc5eJo0ELUYjl/BvYWY3B33XAMPQVKzuENzO
FeBDKLUys4fWqJjDCzuWLZXtz14xRFCHPKIsYwsFTnNVdvB0I7oWp1WQfmA3wnDFgGbB+DgKLQGZ
YyAhQ6DK4ZCHa+FxcqUTQKK9xQLSa2akXhkhxrjdhIknxn/tLdBXyKpbvAJmB1Vx0Hi0K2EzN5F7
x8TwdNqJ5Lvx6cSSbrPXOZd8GQNUuT8voYnG6lU6pmzXS9mVOs/sLIV2049kd06kmg5YYsBJfaub
teQRAt1C9Gn7L4bBFiC/TKq+FO+QMV0f2uusSNfaPS2iz8cbrHrjVRoVsVtz5abMED1PLuzr3D6t
C9s/T3PU8oy1bDZIpJ2oJp7cfPu2yo1yMAhfqNVKNmeBFQDPWWi9v1pgtcCsBRisC3THdaobBslu
CXjwD4d9dGMCvipaDP5RnDNEVINDhuAOvfvsFmG9QI/EnyilbZ95DvBnt7fEhvAVb+3VJPrVwmAh
GmbSacmgVoQEgx7HC21AJl8o8Th3tNJ6WuE0LdbdrZglyoW0uMXTjHQ0Djga1CFau/DXwTn6cYIY
QE3A57cQG3tf3fGUI0TqQgDBPCpCyIcFz+XHD4ANtwhUjxVXjDXMjKCj65tgnttl38onIDepIDlt
Akpwkx6qjsHYxKsnWh6MxDGcxVSQnmQCOYotV6e2vC4XHMj0PGuWwRHdJe5aExCA8bQUqylM9Ju9
2fJYJnCAXqgaCVQEQlz+1CRCCZyGwZmDWmhhysYmKNZwMDPRKerCzAIU4GQB1xsrnlyg1IgU1san
JxSQUCmj4oCy9LEHgWwlAsWim1Lwu3BQCLQ8+Wl1NJu+eJsLpaqaHrNW4xubdigSYXu7nLRpswc0
05B1bJgYo1uPySpHcQueuzkhqosXSVp9rVToVQ3jnB/D330L9K0X49Qgnsip/E5ZPI8gD82p2sgt
ksedFdIetPdxpnHlYXSLLsKk0co5x+l8y2zbHGdWQ/Y+MuziwLHem0G+my8asWqLyjjZBPvpJQBm
YqagNezS6YBZlDimURetjShYNfdYC7p0rWZEt0Z3be2fbwVAqtpUpfKkib923yHt62V6QqHfNPn5
Cst0XxETrdDrmWHAeINZl3pGD9PbjnZpn8rIyYL5tzUbsKm9skPVsrn58kMaj+deYngnlJeDa/fV
TWRYXv12uHE1wTvWptUt17N0nmj8yV3vTFtgBcBrD1ktsFrgoRbAKlCAWEbqAkdh+yhCxxtE5CpS
F7DuFvhMa0RxC5HAfNsD2eqUWhwRzLN/NVYlKNpwXSvxj8sSjsInzGBgQGsASMIurpsl+tLGUQy4
BaZS9DPRLCXBKbv4yqBcsdVGwcR7xsMDxLzRAlpUgVLCpRKAkduMMcYtOqLLYTyO5fZ5QnKT4hBd
+jOJV7eE9/RV8q4WxCK0G0gcBFxqy1XE3CJLPmotUsW8wB0xEmOSve2TFhjDgEa52w3Xz8pbW0LE
Bcs1m2CE/+joROHc+pn0slganxLSI62lwk5LGGpU3LxEm14yjR/y4Uee63hhSVRKVkUqEFBrFMAH
DbstDvPSQHJraxttQnQ0kCjlh6dYHDEgcbPlLmLWy02MtjBPUKKBkCPnuSY2CpTl1miCspzgwHyB
dRGBleJUgrGuZtZ1whYJ3BCc8hCrYplISIAqFjqPomI87eFONZalxWzyXmK4Y3d9fJtNZOIYAcd4
kfo0Ic0TPMuYMlG0ObMi3Z+gHRBP5EwD8qpgC2nmQE6x20EiuYftG7y1f+TEMDrTON2ilNy4tvAS
0LjX2XLDLOmKuaNOo+jJJj+oB1acsq2qW0vVH5OtndoAZVfNce3cghlnRk6Go4ss0ALFPI9TgaJK
JImde46/Rr2zEPegd06pfHZ+YfGLoALqYdIqsSfkxC7QY/VONG5Pl4knN2pon9Pq2Swydxs3y5Px
+Xjjtm+GsZbNUHlxO6yEh1lgBcCH2WulXi2wWqC1AEEM0Q7nOeU1hS+REcRb4cMCL7n5MxELCOjJ
ZLQvdsKg19fwlwCHrloDYThaGdOrO0BcJGG6+PIQIM3TjwjbgP+4GxZRGT3E3CmantsijMYVW/yn
04mx1hfQyxHOoQVwne5uGa3NvbWIl4BXSbFDQQjS1rZVXo7rXaC5mxSFQmU8ZIj04MBbWo4LmRWP
DZ14JrDgOuUnVKP/mYHEgw+57AjlA6KosBhTKrJlFTQd73IjaEtLYQbDKV28pqGZlYSJ6YDVLIBj
wmnfHVHxAwNvG9eFZQiV5cVGIelVMCrxd3Es27MqZkOIMpD2bWHO8YFx+xCrvDeMYGMlMYYkSymY
2VtnFZn3CbtwiMaRQapxSS6aBcjem0qO1j3y6QaLrcpjg1ePgeKvdqG0TpUBeE+MhquhKm09Adfz
LEDInX0dnfZLWdM+k7GyS6BdS1OJN9bovUonbDJ9y+P7Cj5VI9f7IJNpq+a7bVcfm1aILt0dys/V
uLDbLMS0/UF/K/k0mj0Q606r2G2mCQQ1P73SzqxBgu4DNWf86n7bFiCYF7Xicg/rjT+YC4F6lnPe
gCGwRZ2Yjqze+QumlvKsx55hZufLFszEsYH2bRU57UxZt+3GMg/sKSv5jAVWALx2kdUCqwUeagHG
3ILHN3d3j4+32CMZTmBgTrn5uL4XEOzb4k1FkLCWpNKXy0WhIEJwLBbT4gyeEq+L0ChCUJ4/RABG
Lyuic32ODhAmN6w6QvwzUSXzCcaEpQnCt4Jq2ORpg5qxCZUcjEiDgAhN0c5Ic/0wf2PKIbSsxacH
IbMU4U5RDEIWRiWxHbzk4Ewt8RUX+n6JFOWTZH1AJvRCM7qbgPzuRAJAQkUCcwx0dPvtDcKDiRXp
5gUrBTzDwQt8DRc3MSY4IB9agy24nuCTe2LruCAvV4a4oHQItPA2pQI8pv/ZW2fLg+rwYNmKZNqg
C2UJmIUXWZxly087QLuijvemCdgiKgUOBplD6FoRT5BYzU2frecI4ipHIqkFtGxY99gcsjnrgtps
s+LsVUmOReTgLcKIv1UoaFzoupCBm1jJgV/cwoPfeygSrAp/DkcyMBgbgk+MiiZG7fcYYu5MVnBp
HlkaWQXoWpKglY3QNCBz8bGEK98bXqtL1ANu66XPGXRnr8hA3E8klUtyCRAag3mprh0QHYgrpBrG
uYeR2TUHR3F2c1mF7vB6kRdxua0CFVQYuEIpuQmiLVqaaIWRiZ4K4Yy1+xIY1hqnlFo48dF9rO6F
6qMRD3so8mOSZ8pyi9jsfqNWb5hoEfAZsfb0PEI2sinbrlg/yO1T1uLJcXkOeDCHF05tUgU8W6qS
8I9P14CVtPd4hwxtFJWaZX4BRs6eASPy2U93+wYLK1XtaEVigqP73OWeM7w82/mypS+Ktk3XnAMt
sALgAw22kq8WWC3QWEBOwO2jxwjlxWJXOy219fO3j47xCw1Eh1WvBHXAkBuV5gnAigoGzAUKIpLR
eUi3OGEI6BE4GQkcFIy4XJ7QQ6C3PSboAj4FASgBx4iBwYqO2eKwPcZhwowW5o8rgqspFZ2odwJX
5RBgVAf8jFsMkBYIw02KbFSMi8R09DJPmQxFE/ZDFDYB+fHgAYY8RTyus8XCYPKDt5aAFiiXv/pI
lMhn/0BSeGgHiRTITREwDQBQSpR4QgthVTPHUlrtSywN64IYTBQvjcuxwYL0xfKCpg4FBzbmouiC
/TzCELpmoDURuDbHsheX1huGIGJOHM4fcu7I7RODvoXbGXXdQDabS7t/oSIyAFvajqDXocXqBjYs
pzkoquKiBUpJaeviq3PA1mmJTdVkEF4oDpUhj7WWBZxfdrp2gmxZaYlyhxiipBZO4DMoo14V8hXD
1sjxICaPTSeG13l0aw7tOD7VViVnAcNyl1rFKo+J1UCyXcJsluR+OWG6+bHaw2YBxi03f4fP7Egw
c9zq0rhURRNIo4IcoKxu5Zws5VJX8BIc6G5Wdd0upMkSHDSzMGng1m4V+YTHeGGX3mNYPYCfSJHA
HsZFeSJjaWN1n/d4e4xNNExM3+w/lWGEiec0+psTD3okjdh9zQmZ6w05K0vungUuhPGLfZg1m+jn
Y6/QkfmCtqvGI9x9Wid64CIhKyvFTIeN1tsXLTdK9XrJTZzh+gE9cP5duFL0LbAC4LVnrBZYLfBg
CzAa2ZCMK0V9DJJAI7a9Ihzd8hZXwwKgDrsW8y7dnV64a58ndq3SP8Cu2B9LsbtlsyuebSv3IE8M
EgoCkizrcvELBL5aPwz3syCyKImW8Al3tJaqEjCVTMgkCbluVrgKPH0mMHkqgJnkQ6VE8nfM1AnA
cEBzgyvJ/xkOFtZwmQt6AbmPhQCxrhiQTP5MmgIYDPHP0IVOV6+wpYl0QBHtxi2mAUpx94bLklmE
mVITNODpsGciZ6FxSA4xrJOszv83lpDnEpuDgCJmE2KTKi5axi2FmQ8E4imESUrDUXq2Ja1c1sOc
hYcvJOBRzEzC0Qqsi5GN/NiWh1XLovJsK58iCb7CYhUWVRMNsFn8QaYiZBVzBILQjrFXG1ntHaWL
FASu6jhUolJWZ4DHrsuKNDF11WS/RznZQVG02x8aZj+A2R4C+ZYMxcw1U7ZuDROMjT5z8eXIZMkI
rNCkgeleqcUD1qFBO/9OiMFb+1Us0e5+NOx5w2JRJ6oWGQPG/S7RdpKJbjN2qxl5j3ods13v1SjW
Lmud1V+EuybauHpwJjCYH7d7YKfJ2ivQGKodACa7Mjsz46VZI+w/7N2+Gm2RpyFmntYsnq3X5uS3
4pyR420TXaJNZF3nXya5k1d289d2xqcx5mwtLficb+K2ycI4+eXf2/phyasm2IdJnXMfwZb1rpUq
LLAC4LUzrBZYLfBQCxCV8jf1DlhTAAtohPtdKeb19rgcPKOzjoAa6RbmKcFcNerTcREnrBWqdPqB
E8Kh6QC0Z/ZI7lZDLFwohchn/ULgi87vwWpjbwdNpyTl2AjiYDEwHcFbFTMroWtI5RBcbko8RD5T
GPPXH3a0FsQTklQabJjDAGxsx8VsR2h7NAaXL1RgCUiAu4woZuAxJIHk9AzzLv8Uws3gZA0ouUJY
ohQPsKX1sB4eV2oNfzKzuDk2ClKMYV0u8SQliQW63t6JWB2USMgHW3aTQnVlf6/i2iUBjyYSLCfQ
5THI/EU3EwlCU+hr+SwJ/lS7UQqgRQtiXsNOchq5cHDMG7nJl8uZBdVVwpjFmBdKQQ/bP9+1HaIW
Nw272VCQLaUcu4tFoFYYQtdMX6Qoq5Gj2khMDLgzcTtEG7tbVXEIJK6KtsOgDMNM3AKzPM7rjqsy
Ygk4vXzIVSOEpOAekwcoHnYI7dp2Y137VUw4ygK1ZprWODknrFSZqxrXZpX7Q/AWc06g0LY3BvEE
lBqr4iCkLRNPjNpD08BgVQ+cgI7Le1fb0MNT3L+zd7e13nihMdzrZ2qi4+1qbL3uMSsx5sYclycj
29wQ4yUO30etK9XCTpJsG9g7g3DbLbrEzKusaqlqqhGFK1HHEHuqpjszaEtO3Jow7+5Wt1/FVIIH
JGVHxqFQeiRzX4qZsmm4PgvmF4m9Ek1aYAXAawdZLbBa4KEWQKgv198i6PcIIdBys8Lfy+EpMNUx
MrUg9u7umxLryxW8wCbAQkRwQMgb+GyPvtkeA0EryPmWXkrsg0UIKrcqFtkC1aAKOFcRJg2GJ9gl
i3iJuNDnFQFtwh+52Qi2XV9cX1+848lJWG377fG7i8uri6sIctYaWqM7JOSo/MzRzsiFD3ZzeXEJ
DoJSG0gLug1/AhH8TFS5VUi2AC3RqI50AgfiMcBIAFcKha25PoMPGdyOdZQRfyIVth3+TKShMEEa
Pec6NIhRwdjEi64tiK3xPQyLVcSMMaaQ9jALMQLJM9hYOdSFshnAczbBNQp4k63mCIjN4UxG3LL5
bLfUAhpZKgggDsWxJuOUvZRtKxmcDW1UCdVAAJ6qiFPg9hsrhzQDPili46vrUhU7UA364O8WkRYF
TqMLoUao4ErFoRCEmq4LZX1XDMs2WmJVHNEiKEg7+UCkQP/Kc/xBYQ9A1y8xRj9RxcitasRGzdPg
0iOqiRF8Hj8F9nNV3YItqwnE0so2pt+SYVxLU+XMQJGh7iV8DmqHWbsFTKqsXdWyCPu1w/0upu0i
56orliclQYgxtXvcJjDMcuvNtkWHVRc6ZsxvNducSbGmvXDRk+OhyDlTjLuAzbKFh7BFmxMTH8MD
Xj3mlqHN7L4BpgQOu7WJLNX4bOCsJUOk2bcT5ZwwTgDL6MmVYotn1rqPXqvIfMfOnTNauUpE5xzk
z7U7necLco67X/WiW/TemBd9pRi1wAqA186xWmC1wEMtwNhahAQT2GATLGJVxCcDvgIMI6yXQbmP
cBwu0BEQlFya+OV4DKSKBE8JxoZY8Ihi3eztY8f6koDB0hxJ0EXJI3aY5vZOiM6lrxKIF+cMCeQg
iHrLc3f5A4Moa4iimGsPHI519G75OkTz2qnrGOwNCmmxMU5mIs7VYtpCrwN4kEZ0sVbbfnajhcr4
rWImBVMRxWZr+2jqq6BlbWoFt7ZOAJJbmwWovhKGqaDXwU5WU45chUbDVWvoi0hjLpbmPtYMezYs
NCsIYCxHUbWM+fa24ENkKL8EIYPVDYjl7GWmwq1pGrLhBMSAgVWdYDaHcQ4vtx/eeNsbjA2Rycqh
VOADvQSG1Q2KtSm/XbgUeADVZiLOO8evvxYLDD5kGmcfZIKbyAq8Nwc2+oDMbVXXqHx2A/NRIt9S
sTIS6g3FdrfygFulyhC866DoDiVdygWrazxnDELYRZnvtujLwymT5aFz5ASH5Tk2l+vyJ+M+9nPQ
3C3n0Li6tePTO4cml2Jd+6t5fbcayObhY5Fwn7P5jI3js1VrI2snsD08PDTczviH5OwFoHa7RIuv
cv+p+uQEdJxEXNPh+mM9sOnEh2SM46sddMw0GUxWT1zcQv3tIxy9NAWuW9BuH8j9rZ0C6EORCqfF
5Jdbp0VH3TdAMl7umflBqx696lYo1WmG1pKBz32rO8liRsmk1fOe3y3VC6S6NdUzxl590bctQDwI
4z256qjRvt3ElLmmO7L7Wzagcjjc2e+l5ZT4FBTdfedEO068rg95tFbagy3wve12i0L/639f/vfX
/+Xg0muB1QJ/Yhb4Hxf/8z//x7NWqH/6xf/5b//1P/2JCfuvR5x/8+/+DUbEcPnqWKNjLfdVoDJ+
LQhIuWyVQc7wiGqtKcEkEIq28OW+UtwsCsDMOAo5eCsRwIASaAcBvdgg6ujzzekPT1Hk6/cfbm8/
3mFArLpAhh2bAICBKnnq0hBtS/fvo0fPXz/XZk2P/PX09enJ5uTsJy+fnjzB1w83H9/+6vJ2+/H5
D188/+Hp8Ybc2uv09dn1xWXkQ9p3v766+s2764srZ+IH7OYPN2+v3n38/fvrr66DkouZb2+PHm+O
H2/ga728vrz+8GHz+OjV8yLAx5uPb/75ze03gmoC6oCk4D/segV1BvcsjRnuTdSA97axn3HjTdmb
Sv5YY1eaSHt5yQksWjVBQrMuRTDDemlweLDNlguq6ejmhTuowgX9FXzkMdb2YCxPL6s82wXKiok2
3NInUf2OFXfYolxDpkQO1DqcCFW0KyHZqsQOXk0clLvhRmZwdZmASHdVr6G476qWi794hdQXX3wh
Jr2rhR95HJbHjnnUWw3R4lbU0OaMSnDPG9WYzwP3gMHdBM26v7o16q6K31OmBxfLMN7MpjWa0NrK
hkQtTq6EHbOMySqPzQGKtt1mIqftP9EDxxIo0oXQC0TsWrur7P3V74oxbZOs0X1Vy+0enWSBSSZJ
umI/jOlY957trvPVZmnDpBnJT7z6etwrkSbAZ116rLmrLj2vUoei6sMhZPXg5xddO93Tr3nhk7tf
ODdofpRmn6Cf/Yef3csAa6EpC/zt3/+j4cDqAV47ymqB1QIPtQAQG3yq228IuvRDcoyTjei2xVDz
m5Njol8H6HLNLTZlJiz5Bi5T4l7gY7lYAYqOj+mihI+XW0zxECBuhcXpVeDh0x9+8WRzcnx88sUP
v0AVWiRMryacsXA1A+QQb9MniWhkxFSXMS7CngF9jX59vfrp62c/eHpx+eb8l2+QeP3Tl8g8O32x
ebx5dfHq9PXz569PAZtNDMCMv7LQ9NGj819enL05A2I/+xEI7k7PX5y+xt/Zq394/eT4yesXLxGY
7YLn7y7O/u4cKP/k+OTt9dtXFyi1efnjl8Bv5y9eoV7U/urt66cQ4CevMYcMO9g/LPRrFzF/KEtA
r3b/gmUUa71NO0UZN/oSxpPPVhtiCShqwTNvepdmhlUDkRK4SilIW8hYLxcP279KbjhdWXeNaSlb
qaWAYdVr9EvmovSGW6ZXg5ZAbu3+peJgcjvssG2GkrmgXwvmP1xyKQfbsggclYoJx0ngabaotM0U
24yKLcPQN1Sw5wMhjfLDBdGb+O+EQGd/S5fztDuuCFT/0/c+jRBPDJ3HbnkQlkGj0y2MdJ3ZcZFz
4tahiVCl6yexJNWtaSfPxKA8BLbnqpK/df21rFxkAj4taq/WYzmREwYKoNI6o0yT+230wJ53dKT7
PDR7ke5LKgk3YCSsXag53v+X9Ml2Zuc+kk9MQ1iI+1q+7YfxSB4sZzagRapM2uZI9h0gHMzefTwh
T7xAqjdJ1RB1i013+AfMFea3WfWY+2uLdafQ75i5wm5tonpg06SbzeUXSDfh/INbeckztdI0FlgB
8NopVgusFniwBbhSFyiVWAieQwXu8ihgOoR5Zu8GEIUn3yqSGc5hxgnzQCH6io+5ehaYF5/Y/Bkc
uJ72GDfxO6HzgZRDaMQtlBzjysOCkM9oaq07xRJiqADYqD2ojhCTvLVKQKdnBLEvBg1Pnnz/BOkP
v3v/4XdfI3HCr8df//Zr/OS8/OnLi5fnz78404G6vk4UJFy+vv/tx1sgStZPkPb86enl6zdwDr99
9QaZciCXIfXNb9/ffvPeLFDq4zcqRdjvGh9dnL1++zcs9eT7T+j0tfua5oIPHOAT+J8OVe6bzfBd
ebYRRs59rC0PGPJzw5ht3nJ4syAr6A3zBEGNXTnpoHhvYuAT0Ali3ggwg5WLS18Q8AK9CsaS2oI2
wVyzDF6AXTZ8BsqmUmyyshb6pGxMNex/Jq8sitAMTPNPcvJSRcXPnN3C0MJslfBBUDr4StBarApU
dpAz5LGrWcoVE6FryVaM0EamfeDl4rhHI63OAMjjnolRTnXLcuLKpVxPDNyj4iU5Wcgo2EuU0VIa
p8aoNMBq5JhBxnUeL+5yEMC34LRhWj9FWXPdw4JSXRrLc+/iWQyzipysbHfga4IYbtbdQCbdG9Y3
x5m2jVsCIHO77yM3VtdiuW6OMys02OuTRfIMZnKpsX440Z0SBKqG46Pmyqip4rxE31ykmn7yrR5k
CsVnZz32Orlj+Hvx8JOP2vAsz74cKoO3z3uqZmzeJ57TDNuqbtwipb3eZaNlp247RdLkFEtqJw+b
vTyew5KHWPuw9waoVkNM27Gd1+gC9W6jD5zHcGxuaLfyBOacae7KgGkmdBf5PBgwcnZ9Uht85N+X
aL4qkV9Z8TKcl22leJgFVgD8MPutpVcLrBbgbwxwCxfoAhph/SpP9+VexcBqRKc60QebV+EHFXHO
CKwFXvLxPMRp2NIK+eJA/OzFrjzCl39Y6EuUha2kvv7N9RbxxH+4/fr91ywr7ygDqbXAFUuIuX6V
W0wzPUAgtE2c4uN2uvn4e9A/evqDZ09PvuB3fr198+7di6/Orn9z/fTk6fMvTpHvTaE3j+WfVpCw
Lsfu6vrs7uzHLwB6X/7D+at/eLUjMB2F31SZLqUa6Ux+AQfy+fPn52fM5w5VNEsJZkYOISvCyLnr
tRyqQncFhQJlGk9qwbOAKGYchk2YDQ5pBJ7zxLBnThbwK83FWyzFn22AZ9hN6LHwv/FJVKorUK4A
JHOFLeNkI0NWMRTINPK0icAQ2DJwNXKoTpm/0LplDeuHinbxzxB1sHCZTbAXt3SP0hZlObQsw8tV
69LEwZDpfiKp2A/liE4e4ICOn2DGPbCKxYgR/CFYt6hw4D878DMUbMHe2GAxqtq5Hcq67r39WlqJ
AhYW0zWlJsadbaXTg9Rq/JqFyQ3XHTgaD49BOLMaNY4Ql+9WQCvn1MaZ8+W21Q1dd+g5B3YATSyq
/08CrWmurVSf4KGIKu8V+1AL3EPR7SMcYs/KP9oQE5ayIl18fl9lW4GrXm3GGa5HVf2u+xBrR1+K
OpRjXF0nBnjZfcqm+lsYsCIymMxX2+jD3Yn2HbsVz/LBTR+TCIN4ZaIhTXdGTv0wtiZNk26HPusr
/Se0wAqAP6ExV1arBf5MLcA4W8x/0jHIvaCAu+wohYc2hmVcjaofjw3+v7vl6Ud3XPIqAmybTKwC
JId/dLiR/J8MmUaajuKb25vLX11dXr27uQUxmZMNI6uTzREZjQXDOss3fiWViK/Hb395/uF3HxC2
fH72ComLX17iNry47768fPXi1e329u0VcrYAw1Do3ZcOn94VHxAXCh2/+/U7rOx9+zfnb+TL3b8E
+XZXgLpjREd//fH9q5+8fHf+7vr86uoc1UFvuXa/jVXIwHXCn1TfadhKxpT9hMt94SvziUE5VkBF
wJAGzI4hdw5Jt3R+2sbIpIS0NmciBAvtbOd8hO1vJki73uGiVE6Lc/HESigOawA4ddOx1kS5UqHA
XUNZsI3L1UmD3eUaw2i6VYCrfLkUT7XvaELIIVGEFH/1TLl/mwFWVq1Nx4Asj8PGnCqzWDccR21F
DxmzTquQ7lbjQg9bafohGJhG7+VUcLcdX7alXG13gF4h0llwnvnEUDsLPwtxWwvNoqPFRj2EcA4b
73hN9zfT5f52aMdupA6DRHNUiQmEfIAxJyww5r5+AKqvtHQ3ds85GAJ1Xw45MztaP9Hj7I59gHmz
PFX3qF4+5S09dKTxd9dYf2if7qC0wEvFjjkFlAm7TTf6iHm7b6HuvJjF6/eB3jxLsWv1VI49+uOt
n1uzmubwrdbah7xfVtrDLLBugnWYvVbqP3ELrJtg/V9poO/9f98jsgLg/cYQCAj0FqtqsSkWdzl2
3CmQyGdHOPGIKa7dxZZLiGpGERWkl28D/ycCpHGmEmhxVjA3cPaSUcb9GgUBYBcC+ioRCo2oXQZX
G0pvh7hcAR7vsJUzC5YzdgIMQ3FcxIrhwNS+0KgsCE6GGF1gVNwQruNPNcN9sXD37ugEWgJ13x1h
22f5PMOnCqwIUM/trI+Pvr3BDe3J5ChcsB3EtiJlXygIcwORju+28JvvCWngV3axgjVkHF4hoS2A
Q6G00onV0f0+BDZTL9VO/sKrviuZyx5RwsAFJ+OWitQGdL02GtJbQXengZlPtKEXqgYrCEaly45Z
XsRrjzQz8QmCQZiizr4uHFMKtdJHbfe1rWcZ0PTyDJdo52Bl2aR+zBq4lBZCX/zFBW5iE6wKRJGR
MWEey8oEu5zsCvB4qHIOhE8gbuVRXevfiJFolXC9tNhS0F7GT4k+chy1CGYxRpyGviyo3U1jTNbP
2Q8l3SP+pLfCGFnsgOXRcK2OeVBejXfbEfBoDrczkAFTouOqGmvKPI3S0lT9JHeqjFLajhdGeUBi
9BGIZ2GYxZho3Lr+aX0PstLiRw/dte3b3d6+pJf2LRpNk5/K6nn3rXxNvEwS2QQgP0jgeE73Xh3d
FpmzbTYpXx14BPSrsks0m+fNzCxkA8bLzWKESduXapXTtM1sH47XwsGzHo3daBMHhw+39nKkS7Fb
m1jwKFVtvW6C9YB322jRdROs78KqK8/VAn+2FlDcKXy2nMXk5sePHvM8JOIzrvi93dwdcyzCE4+2
+BUAyORRRSgC7PeYw0oWZDAz947mjywovT5TwJjOT57oix8e7KHFn2Ee/EP0e3x0d8NQXozUaXtR
IhiY3ksgJS2mpQyGi6ganwr6JYDDVySQQ2ik+GH84YylshMy3cjkDICHXzW5Q7G+2Hs7OcIZ+29h
82ou3MUKXrhboamDbFHFSWHLPasQ+I2dvVARq9MxS6CEsicFeR4BCaMKCylUjDOZFBkOJvhfYclQ
U+5TclEwc94tOU5IUgJay4sulSF2wX7qnGWTKrEh+hUc9fm9tJUBPK1UZgRouqJLGLCstiUaF39r
zQvpQU6gX++2xXa311dtQfjtRpGLu9SF7zT+gFepRcGrSDimvWzxBTINPry8OUenew2wLwomn3bx
dXM2pAxMq02wRB6T8SVxb6fTQQUrF02RfKfEoEuTM5JRhncJY0dOdiw4bcdI5lQ5cDL6zZK0o8kq
ZwmwnFWp8ocEffbnZEXywNHaVWLEKDmzqsRox8e1AWO5eOvkmfBt7rplqnDc57YjOqg7zdq0R5Dd
UO39bJADfFPL/Z+VgruHNMHIZR65aUXcJfykt4osVY3zevGGaRLICPmzKRc0tDunVWgT+QU128iH
YbxJ2+a3on6+p0Kgw7YzDTHWN2a7+izBuGnyrNmMAccM4lkMBzO7lbs56gPxI1InUuN+4nacZbcS
9CywhkCv/WK1wGqBh1qAh/QSseCAWcAVuey0+7B+zwHhkI+YaHyD/xYQCym5RoVRgQ6Rs+UWxNgf
q/y0bIafyQ0Z8i5obn18jnYzohvZP0iSfQgAZjUauCPLC2WLE1NB0WAGxGWUBUe0i2qhstbT6k/4
VgS6rVp4xDEwJzJBQYgozqDcSE/KKCRJwKwRkuC0hlvkUc7god8b3Ijtit8SSDiO3sXpUOBm8Ugy
hEBviJwF9cvuVsNtUXouGoKxFE/69aZTBLHSwltG2QZlCzGly+W62C5MUHJaWMpKAC+dLWmbi1oN
kc8eE0C2zFP3bRnjq7Ipl+VEvvyrpX3NE5fELpcbQhYutQ9mLJ5ei4or1xtpJFSR691dIijzAkNN
Xjm55JoehU87tboj4OxbgAB56G95HjDgW6JQl2YCCeSBdTvGrWcQBu4ZdgamXZKYVqEa5VeoJoBx
xeQwbJALH9QWbVcJVmNTHu4M7kVORE43ce8GTu3iZHcSpIt7ZxFmR6gxuBh2qOBQRpj31bHtihWw
PIzxBHydaOi5OqoHrStzNdczDd33KsxmD7SWO+GY/ROXJdMEYw/ajk1louwM9632zRlvv7gV7EbA
c2W9McnHOkZtuhCsekXH41k17oLpnvbNk6c5/BgegNLnetd6f6EFVgC80FAr2WqB1QKjFhCi2/AQ
oxJ5S18loCFBL5EtfKQIfib8UEAy9qmC5xYwktgJvkpgP5zlywOECW7BBJP08uDB34JfFzh9CSmF
Veg8BTwjXjqWb3OLmFv6OSEAOdsliPpYFzlgwTDdm7GV1DGClgfUvNEWyo52ZiadrifIAQKkU5cA
EgW5N5VQK1FZkR9JqEOJ4JeG5PwhP2bIqPEzpJKblvILB+LEJi6NFtQEYGbMMNMc4nju4O5WCWNR
eU1LApmwkryse/sbQyJQelrBrk5NE9AUdpZS5OIgZTS4yLwdVHF6uwpdxU8uAeAhYQT1UC/p8WfK
jT6NTsHfUFaeZOwCbTuUWx7BD5UWBzW+3sjxq2kFO2nLZal8sQVLRSWyOrlzvVDZddkzXCYvIKFU
LugX+WCIiiSepyeoKUSNSnej/yWjvSJUd7gzNs5rB3yUQZzGsMGgfOffaRh24HA8vBNtRV0YnIeP
eWjOJt9fWlmB3iCuEmzp/c2fc47TIdsE5M6U02SlVzWzHvOlhi2+drMSExMi3RacaDuPs/MMSM6J
Wzkx1klGxuLd8XfXGjEuj7sTxhmdUJgwzpgdqvz8dLRKpZxWhulJnKpzTjxte8971mhstqviNYmL
qqcpen4kshYTOLM/K1FJm99CfvO0BmxCG/KiibFHODB5Bm97LdK+5WyliRemCULmbMaRzrNkNiH3
9pmJsGr6wOaqULHCmy1nJ+EX175JoxHbRLxCcw+6z3zTfG9eKfYssALgtUOsFlgt8HALAGBsb7/B
WPjYEAtLWPVDy72g6YvFitYCnICaiHKBsrbyT/IAlSOc5QtMeHv3+HijeGahYjiHgcTgjOQmWIKp
J+CDf7Rj1vZW0cVlRStOTpIHFattN3Dz0gutHyHUThBlaIRMnMkECVXQmyET9bIgMxVpzEN0XQMp
8ScfJl27wK7Ct/jKMGoIRhfrrbd0QtAyB9bUYrfhcKmINqEQ4MmzjuC9Bg3Q6UnZn5l4W6COPmoZ
TaIXbmW9LhiAv4wQTl0HORd0irv4Mx8hXi7xJfDWcEfFGa1tZW0Ew1fUbuaqtKBokBkYI4EazYFm
LwC1HEekUoyCvpHwhtyqoiwkhiTgwzkIVQGVQenLPm0rRRMN4Nx3JaRNUbawQll/RXOgrA2FP2Bv
fCrHbAurQSPtB0apHuPjyaPHzt+7snfFN8Zcmm3Zg3PyALQaTFO7gd/kuL9T6UTBnohlFDiUmgWB
rY+im+OqZicUut6Y8NS1ALttFFfROn8qRVrAMwGZwk6jNBPTFgfNaEyio36PWjLBMYIQ2satFMxf
bbFqmN5t09GeP6tdRdCKnZWduJs6QAhcedLcl0J+q2acXxlhFHJ4PgJXlfCcRQvVgjgMNDkxEd0+
y2YJ8y339ilcNDtB1rNkYdhuJJ72Ls71VtJaqhlIGZM7+f1m4+yj8al3aWPDqHQaK07Itrs11sda
+O3mnohzHrm1ENAuJDv4R2ct0LPACoDXfrFaYLXAwy3goFk4VOGtBabS3ldEX4+IN+Tr05JantN7
hOOR6Jfzcpq7zWOsrSWYYQwwdoe2D5l7SvEQIBIQnm3wtwHKovvOUIq/nQqZxi3g3rLbFuDu9gjr
jQGfkE9CIGqF9Zalv8BC2uYKPHW7eEqBbwENVcq/ed5/a1hazAOZCPCEt72qVhHWWvAMvfZZDeFM
zt1BzeINBsKnOgX++QBeH2NLNzjU9E8s4bqWzloXyswqDWULpBfwK3HFdhHfSAWxIvTFKmW2i1QS
jOcezicDE9q/eK3L2E4FCz1uoS4Ud47NjoRq360ldqiz7IY/TiJIl8EvLagvT6zxczkdCunItHgg
QKnQTpkliNoWHly+6jyDzVFKMw5eI13sg69gJYFdO9p2A/AvqJ/GNAcMglW/ZIhUSowN6LuOozwc
zI4Fp1ucswT59ITa5U2PjEX3IFg4XXvvbkbIGWvlFunSmNkswM51tsSHyzve+mPtlVu5qq884Ptu
pdy7AlMt7G+L9VnSyhWz2ZkR0I+O2scmZaoOGWQTRpvTMYCZCSv0WPWBQMXdflJX1Z2lyk9ubrvU
ZBP4KqZvqk7u/l/NPrQ5IeFeg1bWDrge1IuR+YSxq6fVD2PdASo43YWRUUdY0qarhBx/+431upAn
GzlPi0TBHYdqHrA1HWRrrbdvpuUPV5eynbiZ6/Lr/YdaYAXAD7XgWn61wGoBYSS5GBnwTNCn04m0
8xNDnXcXAn0JfUoU4lbLhofQWf3AcAEqYQ+9xkZi/LVQzlb+WKEcVMf0djf7bnzl+2DLcj6cFt5j
hSKX2wk9kqjIJsAJhCRUFqfsCo85xJcCC7MVkIZbUtkVsmaJxITFLhIm1Ye6nEVlCaqP+ANPFht+
JVtKLzDJyHBH/A51bQ3qdsNHq4wSgrLlCjvkymU2y09cjfQg+u603kxvTU1ToT6oBgWjuqGUpTJj
e1zzuNbgn8jZBOAge+f2Yn4IDw7pYtngaUQtSlbqqQRIK/6uhQ0n3o/h+MUfkDAU32PJyhasvJpx
bphlHsPhazvu33XUWoZO8R4J8xr5xwhL/gTuXQCJO8zvV2pGyr3bi6x9CMM+7bQi7d0lOVVNVWPt
PQsDaRdZRXea6AZVf3uwQSb8TkuG9TXNxKSARc3WyDmH9vBlUyF+zCvYc5gr1Yiowudz0k5U0cFg
TSMudQaOWTtPoyx/eySl7v8wtnvFjaHHSvjp9+RIP6/kjEm0DCkzzcSMWLnV9s9ctX6d62uyM1QT
Lt1JpYDrD36aVwZLLbAC4KWWWulWC6wWGLfAhkttGZN8B8wGEKuA5428cyeCqVjrixOPHHCLha+M
JSYMBpL5BlyJYe7kqsWGU/ARP/pmwz2i8euIr8jneloc+UvoVZYWCz0SH9I/jBhpYMMNN3aWZ1Ir
Y4+1pndLwXghB8WRRg4Ew3VS0KYwGNy/WuqLW1o8zB9mgE9HUDNYV79P1EireYW+EKNdzi6Cn1lu
Z2uEhcdGldDa4dPkBue2M7WwmbY6wV0uEtY+zKiUgdc7nKYocTPERbenBQBDo0HrRTkSBlYmB2rK
pLtV+JBmwZ+Ku0TJBEyFnXWLzmGYyHUhB1+HUsXfawEIW8s2V+F8LpMOyi9Lc4VFHRZe7loYfFpq
EGCWgz1B9YotiU0vW5VM3D3RmENOY3Yn9gfBaTXr7rgju+71iT6D4ALcJ2PpVeYmXFF9xWgpXBxd
skWZC4Fi9jNUWCh7QhaOHVvJWhweNHNj976a9ys1abIJB+MSkDDBewo/TCsyMbrtTm1YiIlbizrN
PtGEDOM+saqe5QBmAhLMy75Ynp0PzUVywSpnrtZZ1VqNsj8ws+/0k+qJq55Tw+DAw5/oKTNED6ye
4VD2ZlvyAx6NAO0ZvU80WXp3dZ/NSsgQuyvVYc/g3OulavTpPpDvVs7VXeuPzR1UndNPd2XJStoU
MR78czM5nSdipvv40umPuSdlvT9hgRUAr91jtcBqgQdbABsjc3shIlh4fbGm1444hh9z3yP8fugQ
I/jiCCAd8wzICrItUIqAK7HQ0WNgQMG2x4pYxs5SdOSKDKDasK0Q4wbie/Gjwv20iHKOfOoSwaog
jtfpEtzKvxpp5+DGzQDnWJxi43Cl2psKgI1MQSyCcDqEiVQJvIXQtGUX5PRS5nKkkI+6pdZGvzeC
tdBd/k/+lJot8gE1oTiY2xrwoQMQCuCVGQSpJgMOO2OBj/9wSzzpa3ViMI4X3DqKW6YQhpd2/NlG
dbhvLGpKgUnyOSG51yeXr1I/IorLjlMC7awdNhQy93pmCmA4atwuIcsgwwKXGQoVEfamGKY0LkVd
IEOlDpC2YBAGZnHDITGwLZMUiZh7j2F+Y/Poc3l9uXs2SlkvJEBZWl91yTS9paRxF4kDBiJdQGte
XUCbx9DtqHosx9zaIfjywZw5/GlcE+PUB6Gy5Bs8WNlZS7agYhpmRB9AIvu4XFHkRLvknGimBzTZ
GFSI/ApQRWTEogdhyaRAZhQOtEMLJiYtAsw5GUYG+KlQ0HzvynNS+Ynrtmb3mRqabAyN+/0TM24W
2zmRCJpwbMZbqyQqM1ZvoWztCaw++TaYFbLYNo5i9jImTnIO0dHR1av+3Bo5m3dfqupVXH2NTlvN
dITdRmc6/Ay6BatEdSuD3kGj9uHqNndu5VBrumP8abyh/zVLsQLgf82tu+q2WuCPZAE5MBk8XPYl
InSBhxaobghSBbBDJgHJlrGvhMqaDQXCvb21e5OuX0AU/m7iPy0q3t7yZwZnBekUIm7gJByLg4Xj
MHp6bgURvZUxf++NdfkjrN9h5m/NVFswq4qN/nHaaA2fwktYjUwEKLDE3ZuRKZCGw4rxX/lph3Qs
YpQuxqpTDmH5h8XQunhbJkI+EBjvUesBvgqnETwniYrzVt7RsgR3EJUMgz94qiIKCYwtmYs3Ncsg
QYzV44AiimoZIJWcsRa7wE4Dzpuh/8B+YG51qGNZ0xtuWG9Ixj8LLE0LWKW1y7QFBTBgttjyEnNm
AUWsoFQgBxC4gZzwhbtiZbELAf7xDMUdQS+9vuYv+uIttzWE/8utobzMnkd4MU6a9TIlwYbkhGsl
qJfQmHjMJTI9qJ1wpCwZAT8AaHUMckjWfQy+hP+cZ6nmMWuleyC3sRkQ1N0afHETTFus68HrGmxi
EB/0860zNnEwoU7gjaimzelJPCtwfqLNYF7+rmnyhEVLsKylJuA6WFbQfaxHz8s/Np/yXTwj+yYt
svUin3lrooe3Mi+RtkeTJwgW8qgfkPZF0X11xOu3+/Du193OMeWueIAnf6FKK9khFlgB8CHWWmlX
C6wW6P72AIUKz/AsX65rlX+v+BvtgxMmgXOOYFVHIvEQIAf98heBmz/DpfvZlkCScb/YFxrl8AcM
gyOCwNkAiaV4VM/OxwhETdS68W+VcClzCv41YHNZDjYEg/GHpbaEasS0xeUI0IUc+Z93OzY5mtre
12Fa26tPGS893PUPYYn49Yy+WJV6kYADVkwK9gNgEzYzHgM5VTbYQ76Rj0p5L2ViNiSsi6EdJaDd
uLmXL4HJostQIwUTmPdJSBzMoWqXHdB1GYJI8RxOXLZxNjH+wHMwEX2qUWNpl0JmmM0rfL/S0Utz
DT6puM1u5vEJ/s4s2iUkrOJquMHdLSY6FJrudEy2FOgrwVxLOaN4sFDpQmiaA65PNknf+kBCCqMj
D7VzAgSRQ41GIPHYKHwWyHXNMJQ6wPV9gDlHSZegtU9Fc4C8Vat1oe+Yd8vNN3HF3UAOkzhtwmmZ
0dEsUpogCO9ZeQjLI3OAwTqkFYqwN7V7TdyaFKGyTOsqXNJz6hqykAHLl8x9jNB0QfsYBLI/c9rn
eVirTNt2sqNakuxZzbJNw/si5MJ30bh5Z6c8XFH4gfkTMkxuxq0izKDsjmc1dxOzHvkRDgMq0SLb
LtbtPkd/5FfrYf3kz4l6BcB/Tq296rpa4LuxAJbp8u3PTbC4qRXXteq4XazN5em+R9oNi78lJ1st
Pb1lFC4h8zG/ApBo9TA3it5w6yp+sx8Pm2l5LystMDYkJhlA5hbHIwkfyhvJRcBIC/waqh1tRIp6
SQME7rQALRKoFGSbLekh2Ja4ndz0I8rfP8mA45ocZkwAySOLC1IluAL6AhiTVGA5rBCWK1VuXjKB
AznAHkQQWuNKYLlboRaZAK0DoAKOSvLiSjVqRSZql4QMA3Yan0akkBYbZdNiIuCsQdk1uqxMVtWU
EPkwOMq6IP6QPlEOCFALmLsWQHRXoVqMWgvwtt1814B20JRVoyxuSWA0HGEbzAK2EJJyltObvAqa
HnXDbzBBLSAozbGvI+6Cw0BWvL7yIXNuhbMeDKqnsKhUEwdG5uxRqAJpl7VxUIuMtu8BDk+RyHhV
GCDy21C6qXHMmDOhHVW7Ao+uPPAyTfaNODOP0iInl8oFK/qoZSwRes6ODgfZ9tSfRnrBvE1EdcP8
UtUQO1NwCsqtuTNFO4Tt5DSlaktOGCe3SKp3j0MuPjuSzmNrF1TOEl/QBNLIbTERwlDh5BYhjOVM
NODu1hh6qfpGfjQmbqUqD0LsfqKzQdqceMyn9IqWqhIBhrvdJg6GTY+w+212UWYw6fSY2FnCqakN
vweiR3UVC4LJpzXPJuQao29YkTByTrja+jlt8WQlagifE/vmrV62XcHCyLkbd56sdo6vmuBo5fFz
mrruQhAbkrQ/NLkTTrXsomdvJbqPBVYAfB+rrWVWC6wW2LNA8e8JTQlhHvHEoEc8DAkrexVei1yd
AbvhXeJJIlsi4QKQkAPAimBgEGsjaC6OBVTWrw4GEJyEViks8WXQLDAPQRSdyTyhl2wl0vGGIdNk
a+jmGoEsBX15KbjaqGxA19huCriNwwIhtBJNbXgm1EqHLXgIdCGX3lRhMIOxspEyxJYwxdmLtPfT
EiXqIjIUEIUs5AClthJDXk0HMDM4XICQK4cF54oKMB2qBjGKSDBeqstpYnLVQhA4ZNJcshWhtYXX
X1lPKw5EmGAuqEw+qYpYG7yrNAvgtgZDtl2BzaVGgn8dDgzm5m9N8WmDyA4s5Xw1VAHbTruB8Gl9
4w8NActofgQu38fgB/6SvFA6rQmIIp7TJwM2Lt1AZLy6Q5lpd02UHU20Q8wlORW7Ci1X2KnF2C7e
AoyJnDGgniUZATZ7JhoTZtZSs6P2rNEE8YQiuVRMK7S2qoBN1Js531vNsMM9usGsDQ8hmB5qL/Sz
LaowNB0z2mJTLAQbWapKkQw+FwlfdQ8/ektmedrNkHrbI+WXTyVb6/hdJHAFbi1tJfYS+dP7MDt+
+Uptzk/OUHlPyLHndEKAZbJNv7QtZGWuUSEzcftayDNZrSUXNUlNdI9ufK961kJLLbAC4KWWWulW
C6wWmLEAdrzAj72hlKNeS9it0As+8gjev5HV2Ii/NMInxIpyt5qmYBbhQ1z8cdLvnDG20BHgsiHT
lvs8+1fQ8CwuYyqTDRzKmtUAUYaOQKRluEPSshA3uG0FojOOsqjgDz6Prr+6uj6/FAcpvgsjxF1M
BwBxQXIJ41/Z8lsLtoZ5uqyXbThw3lcH+axuuOSGjZ/qYFLss29qCiCMSnyebpUNmQeW3hR670IO
6rUB5aOmFpYE8vvKNsdXAF3Rh7K7YVm2YVQDVm4jt4WrM6W6FhzLcPlugIEFpKNe+oQhjG1iGWx/
S2td8FmJF/XOJ8JXU/RsBlvzLIKiiyrzOCzwmBvLVzRxTjg/k7lNc05br3MOHHceoOCfJmkLxqqc
8mgM0keL7D2qI7rlRyk335gpWmHSoLwduLeuuTFnHbv+SOfMDrHwQ1rARQP0DAyqLlRhhqp3ZQDZ
U3yiv0xgmG6pg9zpNYeQs008uEuPBuXK+GNIuK/OWENUr4hxmWlVNUQkDtJvwsidjjTW4hPIc0Sa
MYjb+vw7LVtlLZ6CiXITT2VLM2vPRU/cLJeV4L4WWAHwfS23llstsFogLIAzirRUVV7ORzjZ6A5I
1fsPIQSaP8nYGnojcsAhnXiE/aW8tdU3x8f2mmIfZlLCr4vwKhbHllok0MbO+JlWjDWhNUORAXiJ
h7D2+MQ4Z1s8ugUyXV9cX1+8e/X8TNhpe31xhRxT8mRgh1jjKzcKBmS9BIGjbRk4TVjoYN27LcVG
wrtnAY6ShgHXjh82vjJMxZJmb/vsi6NhpH0X37XDM6zho5IZv42yAzzmYMswMrAfjbbDz1rbPNx1
wuZFGioIx9obbIczJyBUKWU20hZS1RrsARkqzWZCvWoCuuhhT6vMNioMCxAdKHe1QwsoJX94cUSr
vRz5zL2XJZIsWchsrkLsxlLryVFflNpVZ0pIJXM9Bgm2d4bxpX45UQkEKAhdwBn1ughyUErtVqCg
20WUupZHnbXeJHOohlzOnL8qaBSoqUpk6BXoKyY4cgJVZnRR3fLdfGXiyB8bT1ecTb8QBbXMW+sc
yuoeAkwMc8fQTszRVIlu7abB1SZa42ck0AqWOtXE4LgFsdmuGdYuCWRoQ1irvr3XaN2JG6sZHdum
qFp/IudAPDz7iHWjcydiaGcU9O0Qcr/VpucpXLSiqZrP0jpENhIuNTXj1s6wtE1jsUcmffQzR/Ei
0UrblS1gfJWI10K7VGH3gFRP0NjjPNvGzXxNOKhdtMXnDByrrtlXcRhwaPTC9rNls0VzWiz/DZrj
tN6/jwVWAHwfq61lVgusFtizwLfb2xL6yx9ubcu8BRJBNDIBEiAJju3V2b9H2OxKJx4BBW0FQIFn
uAs0l+wKO3FtsCATlhPzoF0AGEMswRv+hm34d3QDUATQyzBqQrsB/BS8Ct68npw83WwGuMUMlDUH
xVrDjchPADZdhI4Yc2DkQYELpmJwNDEb/imQ1YtLSxQxOBiPUfGyj5S5xcpeQz66Kw0XXVGIrWl4
Y8gAioxYFgIvHk7ZpIQro6AsV1CrvLgEq+AMXYR+i2wCokTyNwJ9AqW8UBwieVpBLWVlGYMt4ghK
lxrKFwE/8XeiWlCXUbfuulKvH+bUAPjgqxA+ycxEwhRgDElS1R6ZlDXP/mJRNY3CPa6Q1DFa7Btg
AhokxMTW4FQCLKB6aRzB7yIVyKIPoJQYp2sM34KkcpG5UNcfdcBc/gTkq0VrsGtLUOX0MNWeAznT
Z+IxYBMD6EA44DBG3L2VM1v5D2VlDrlUgM9gXlk4cGnA3Vzc6VCzTczafKLVupjkHgxVJPexypfY
jZvNNIGmogPnbj/mVVskaWX/CnHdb4Jjv+IOmBn2N+oixuxKnfIej8lWzXpYo1bN/UYZEzI3XJfG
mW7BT4CI3MnbmZ2xB795p2VYa5FCtqrX1badeJaj9njckNN9/yzoc2Oduc2P3p4TuxraNrXdqg4w
MYPWRdq9rePuOVu6wBoryb0tsALge5tuLbhaYLVAWECAhD9pBHI4z8ibRSEamTjzMe8eCfzIRazj
ajjozF5KhE8D3hAtcyWt4Y33K5Kj7+T45Oz52dmPXx7jiFeeSCQYSWphm7KxMLK1H/Xg5Xv39dWL
L87iK+5uNpvzs1dXX11dffX2/K9f332+ub64tBr0En91jcTbn79F+uT4+PL1m8vXb08+P4b3+O2r
C9w6frxBqasv316dvzs/Oz/+/Oj2s831+fX1V+9QFp7kXYDtt3fPnn5x9dX1+YuX2rirTLdLHZgC
FyQPYCaVCVyhnScCjO6CBsoa7OHTCNCKgxhpEAPQAgQabYKM1i5LmkuUMurFnyxvtmVPZpmrwFeJ
YUd0cRQjJ6pGPjjcDNjVbSRu4OdF0UyzcUqYuldT86vk5MDCGkk8Q/diBMuMW65RdRH9GvcqUfav
wl2TnTjEQPwtNi6xJRIeUE0BzEWQ+KcdjNYU+5CjvUvNHxIF3XKsHIlBkMffHp85ZzpRWiENNGN4
Z855LmAWqIQMZmv6XGosJ6s5NpTM+ZPDzcKsHTpHTgZg0yPy2Yq65rLZrXubyE1W0bi3qNKD3IbB
cgLLjSHYg1BZt4fXmW0/CYrqVoY67my5v3VzRiSY1m4C/HeEr3rOGOCJls29verwi+zVJwrXbuvm
jQL9ObXWyMvNPv44tC7oMaf0vNLTj1V+S7TTWNXjkyrLfSBPFuTpA5DnDj8/KVl1yOiTzauVtasD
Tycqj333Sa+EtIpLfozmLb9SHGiBFQAfaLCVfLXAaoGOBY7oZy0/J5stCQY4REREYMb9nzmAIBDi
5s868nejl7/+sCEz0C9wC8aIgna87o4BZgiZ77549vT4+Mnx8dHpD0/5O5Rl0BexIjdtdlVw19cf
rp+ePNlgvehwnf/09bMnz84v37x6++rZD56e/+TV6evnvonE6Wsyf//xPb6CbPN4g79nT57gKzO/
PX79QqV+eX7+7g0Sr3/yevBVPgIiPv3yufZkErenz85/8hqlQFzAJLe/ErKVM3wAt7fDAlqhR+JS
TQ1QKeeAcmvVbJMEX42ZdXFgsUmUsL+I/RnguezIBUo7h4c5CFZql6z5D2zDcIWDv+dKPesBhoPZ
h820h/4w+LELOI+yoi8DTcHm4vFW7chHqPPmROgXstmqbnZ8urpQfCdlAeFFhptyoxgBpoa0Q2Yq
lJPZjeD8B/nHRmrpZ+dhtymqnBg+5kT4K6hd8mB07WOa6qpyWjjaFumOHaeVbZkEfcstbk3I1tUi
j7Arc4XuGTNU+MEGzFZqId9YzvSEQm+YOwFQu7acxcAxBK/ciRN9+LBJnBZEVd1sCUIea9yDHpYe
ceWirEkmQPgYOJzomXPSTjmfe2Xta407/XaZtf/Eoz3Rk+d0yfdngGU1UzbBOU8hTb+R0t3soEZ2
GO3+b+mJHjv0bVaqN0MkyiuiyhH9mH3uN+11SMustIdZYAXAh9lrpV4tsFqgZ4FtOU/o0XbDXZqx
spdY95hhwPg92CCTuGUAh9y56jEA2NGWP5a6xfBXexGxWvj40TfCz99ubr2qk0HIRoMeH2y5JBZs
GReL/8iB3uYSG4yEoI5+jN59fX32o9OQ+eT7J0hf/PXrt3/zFoknJ08GWAXajX/V3v/2Pf49/cvT
jzcfP9x8QAJf3//2Ayp68n3QP/qA/N+RhtwKNhOB47R1vXr+6nZ7e/HufIh8puNaS21hE7k0pcIQ
QkxRh7OUpGaJeYZIYGj4p+IFDw/cyMWZA672uUd0CAsec8dpMEEOPoGHT7TgFsRAv6IsUdaRNqhG
/sB256Q1HwPXIc3obghzUwQspeyiTPWWUiCDYNBIAjBAQHU5VN4YG/mPJSw2eS4bZaNvWE3k4lJB
/oGbcujylXHKrtrgE5RFLk+yDMX578RwJMrMYoN2rDNbJJh3ErPQlMpOMbgP86pSg4QYm5qjKx0D
CaYxn1nxuuAzOLjeiSFp3G1ReijfRdo5MyvSTjosNPCspkussaCuWUdW25Mngmkf1D+70lZ26E7Z
RPfIHIYWmRWpskCLeZY8y/OPRnStbiI/CAtaDSTTbj1rUbmvZ01Raq468/R7o7nbNVeOc3b/yTlZ
43khqxdFnneYfWpGCNqpjXamEkJaton+v3tThUq5ud1RnVO9i/Y7wK5PDgK3kQiVSbMNW+JlfWql
+pQWWAHwp7Tmymu1wJ+rBTZlG+ZyMi3wG1DK0a1Wzt59e7v1ollgY6JZbnylXxf5J4kGjzYcCiiI
11CHu0Ar5LXAy6Prf7m6+8P29vb2+v21FprC0lvgJ+HIzeB+RKVI468gRlB9/eHKqFXX5ubmBv/A
K3v6+gz+XnxSQvtbvWD1s+3H338Awj7eHAPoAgMjsb3bfryFB/jRx9+z+NMfPH168gyJG3y1ZxsX
van2e/N6e32Jgq+evxa2N2iEOpANSA9FFKkdi4FZv5BkLJQtaM3aoUiRPy3QRb5jfY0bOV9Q7sbe
yPaper2xXbtlb20V0YlTw0pdWMzAUtMQNmM5ExhfVbY4oi2kBC67bZm/LivCipxQRW5KDinkZPZi
YzNhBLtk075oOrl5K+jrTDCRJCUh8XiBLfIx+2DEBZ6aTSCl0mWixG3hTlVl9nZJGdpueUDarEdu
EPhB/+6NOKuxb4aLqCTgRzUGzYC2oonhqTlXI7+MZ1pc2qLKbk47Xrc8uerIqbTIo+fA2M60qHFV
A9mgMUMrUsEzlx2rOjdaF2OkwTrbSHz2uoRKHeT5yW0d7txpyLGkux7qai6qj7V4tnw0SjZX7n5z
mKfCNrPmCniTE3y8hSd3CQnWN07In3t7Rj75QXA6usqBj3LgtJywYFVOxbg/8RHWziLlZ8RcuvYP
qHZUFhtXljTotVRVIlty3gD5TRKWzIkQsu08+w9a1Rm6LR6gN4Scgehth8yvBb9GZFLu5pVfHSmH
VQSN1MmixpObGzp3xTCyLTE7yTVv85XicAusAPhwm60lVgusFqgtoLjj8rvCiOWNIQdyuK0yUsC0
ci3y1+V4wyN8kQmIBSiLyGf5cIGIBFg2/ChgjGlyAvTdvrm6vLx6d0sIKubc+CrjQxQGEiP62gyI
kftwPXp0+eurkBeByl//9v2rn7zC0l/tFH2JEle/ucYP0tWX77QXNPgcf1AU9MebDx9+9xGJ9x8/
2KF68e7Nh999OH/x+vynr5DA1wFrgQoF/ccLPC9/fXn69Ivzn54XHFjW5Uo7ekGN4vAnxWM1acFv
Jij6DwjW5gmtIZK9o6q3LJGNIipebB4GGBJl/2eL7Z/8LdMlplrGLBtKWYz4NO4NPpCnqMys6ANZ
cod8V0DL+NmSow8A9G6Afg3pDWhdhdq6XFGRMh3nnHFUo2XDARkq9QBY0q+kyY0xzbzDZI7j6PBo
AgFWQ/YMDrtjaFuyC2Z2zdoTtEKGeeTdko9hoV13mrOF71dyVpVmJFPVWMGGLv5Zboqke2mjdOjr
BOZcAlkhxaHD4ranzYLJGXNPt2Y0RDcRLTXWQ+aa+h7q700ZSPj+FNU+qtnNgLRTIXNCzt6fnXoY
ez/c871RWbudqlBjdaXqGnxijm9W9z7B2KzKJLuYJWkT1fv8nlL1iu0ZRJZkzn6iW93CrnvPJv6E
Gv55s/reFk6UR4/+1/++/O+v/8uftylW7f81WOB/XPzP//wfz1pN/ukX/+e//df/9K9Bwz9JHb73
/30Po+djYwuNIbAPFv5TGtmIi9ZCXnt0725xEO6dol6P745vDYY90vLWx2ZCsMPNo7gRtH2PQ6bW
0SIH+UaJGSNRiqNHxzypqORbLooxrJJFEadRGo5Q/CMaeK1x7JGcwHffwrt4u8HpTdq4i75ZHsM0
ODONYMvoUGUpmzK5o7UCjxnejFrIbcgUyPQGV8UykZA8PCcJwsCNqTWx3AcrxI60QaOx30k5Isjn
8RoYxwJjW9LRxXT2UtviK5bm8s0aSUJyico0EoPFtC32iAyWU/Cbig/2JE/XJT7YUxqWNJb2Zl3e
DtqVQl8fL4WFvhySoi70GUHlXbNanhtteeWGtpz4H0ZWEYcA1OAKRVBQxHvX3cXmDBnPfvisuTWf
ES6IIB0bmc3zWkIxDVzNIWhahgcV7wLgeDaDeeS0iZbmU5UynzF/0YSa7a0Q6YGlJvgsadm2XzZL
QLNrtNvxwvcVI+kJsnsJNZi9mqGY6HL3r2aqZKVpfujujyImenI1STTRiw7R157VKDEj+cSjF8+C
H//8dCyQJ8SYTbRmb7vcaIX5aW0nQWZzEt9st/BOL1B0jmS2lZe8PeYqyc09C+MrZj/7Dz9bzH4l
XGqBv/37fzQcWD3AS0220q0WWC0wboENwMYt13MCcgD4Af3yk7BHpx1tsWqXpx+BATEPIaUih4V+
kS6ljgj5BB05SADPrYKTgZrkLSynDW1vixMPxCgIWhW3L1HIVif9GrkhT3CL9SKHwsgdbTcj0K8w
kg/1lag4y/eOGPWGYn8GnUApGcDbuz1xAlhAjvriq92bm0ffGPAb90JgozsAQmBpVRsnIdF37YIA
fpKZa5qF93l4j4oX9GtFrCk+oaZQH0sBdgJe2g1uRyjrEBQEgZC2YaQ35abu4sB9yFCjeDrw2NMB
ZRtn8DIf2AfVqcbyh7QlwS0QyLBsVlvV5pXBaR8TC/8XjCqxvT6ZMPju0edPHmFP7w2sZDEgm9UU
q+IkRw4Mrs/SxDcD+lVzOAh8h35lDV4n++jXZrRqe1eZ1MeN8RDoakYfX9ucim18vfcAnQVHvCV7
PPeHkvUtW6YLVsdumaF9Rx4CdnO6o8M8ppwoNcbZ9ebacw7SlTzO8eWEnXtjQ9vcSCO2LbWjr1Sb
Nju8WaWKkaucfCtoFicy3LWYGdaG4CbrupgC/eaeHIjFHKZ8U2MGqeBuNni2ebatW+FeV9dr7SfO
4MeJAEL1wygtat+dc6Z7cu6T8WhYhdYyjWpjznaLmlszcmbMkw1Y9WeXzF09CKJFgnuE5Q8JnFNY
esV+LHSYNIPM3Kl26Nc/WLZMZZzIaSdNQuyMjbOFhyLVO3Ns2jH389kXcqfnhwH3E7vIZ3eJicjn
fdtS7P1FENH0rW2rW/OP572eprXQhAVWALx2j9UCqwUebgGhC44wCFbh4PUBOYS8Bif0MSLMFRkC
bHFgD9GvoJcyeRKSERo9gcjEUA8FId4xF+rykiPRS2oLkgG8ywgNNCguPnZCshzSOohIMbcEzN5z
i8BVYtNha1TJugSMoxR/0rRzlbATnbRIg1JFqAiYC1lZIpMRBgfEBWATKDVyNqTkHlcxUgcCLDMC
w8ZOlh/EIAtdxIQWUL00uFgVsZGDrzdSwX5UFFe6SCi4a+gOHSkqLOzhC5oAxMiXeGVAYwOClc2C
yxoi07fw6cxI4KuMU1zKbmsVp6HUgpzdwDlYjx59js2utsL8IEC96gPsKuCmiujfRi26ijcbwBs0
mCNQjhkWaQfKKDIIPcx6gCcUlEb7l0ctuMaGsK3T5t6Ytqp6+usEVjng1gTMa6sP4uWCHsR/lm0r
QM4Zw1RZhnZEvusks9XvEdQTIm3gaC+UNFi0bdTOsEwQZ1Fyf6vQ1ES/nb7VscU9IGvV+hnzLOtL
E49S9dxlwGDh2xy9K/ae5b2cgOUZn2d4vwDojvWhqrm7kxeWuZ3pOKxfLqHOxo9eOpIIQF5NMWQj
132pnQRZIlVFM/6wL3+/TU3ojInUdtr9+YXdXIn7xkTkczJpqW1Zt69Ea3967mHOtcihFlgB8KEW
W+lXC6wWaC0g1FQ8tIIY+tnY7vYB3nrEcvRoSzzELbLkRTT48a8p7pVdf8WhjFECmCHLAMallBDa
EVr1XRAbpLEu/SFHV+FGNH5XfrwDIpp+k5gorNfewhIDDD4DhCtVS+JS0WAQiq1SpXYlyolHoDGY
7127fNers6N2ugxFvEMYIaK4Fc+qdOS8gI0g4xvQmm1ARCI9WyldO1/HVujXakLyMJ1YFdxoqxrW
YhIBn5AnuEEw4Vij0DyeLn4JLPTdPtoA+grz76r2PAjKqGD3YguqSAH2EEn2r0ftssDoNZSaJKpu
dj021cC9pWlH9gfB5oOID9FmoO2O+4PR/ogw9aJ9h094TlyQHS85YB+Y4+KZ8zS4de3VtSTnPuYb
LTOBe9sy2bU1PQg+tDvdBxiEfAuR8KeY+1hirgfpco8plYXqy1xjrTYmc+vMnO99uWPHOzMLWU0A
jXCcnuBbjjnBvk9cXvL7j2H1COeHel7zmmJMhWiIw7pK+w50zkQHmOwb3dp3bvNhm4/v/N1+uGH/
PEusAPjPs91XrVcLfFoLECMdfyNki/g04j74GL1oVt4/rowlMkFEMVcCM/4WX7YlGvlbAC8EYwmw
cbUqv2FDJPxDkMP4ZPDaDDG3KsUAV+YnD6QBGzJVLy/UKB4EbPgDuhM8sxfUOyTTXSkobhriN2RC
EjkYfUoQS0kqRyzzzzJAJBTBp8UQFCwObWQ67WBmJeQV12VPssf3QpI7/7MBpMUGE1eU65I9XZ1/
UO0nt0c0zgGyXg4t5sSEJRSB3dfIi+Dnsnm1VbBSoi9B1Mrf8/eKwE5sAm8g4ZNyuBE1dVnZjSHK
9usePXp89OhzfJ5QnuLRFd5mdWoChwOUeQ0wuRksbFOglDiTp8coKAgaXzI4L9lkl5bxy5QE0hA4
iiRCJVsH3ZKc4HLY2MuyDkOincRNTpZydvyXedbMU7Se7FCrz+9peMfiGgsWPnErJ4xIv6OcLE8e
qlrwMXkqtabxT88GbVvcz+z3KzUm0ZKumGnuM8iO+bLKaGM2LI/hJGDY12eiw0+bC6pZu4lEeYQl
7Z4TL2SI7hozKW0H9qPR9q6Rhqna5dAnus+1Mnh3rirTzElbYbBdCLSCyW0uT+HlhF8RgdiLSZ0T
IdDZtlU6JtHigW1zqme5MUdlz7Hpg4nO0z7OvZlZveisVGDgsV2g2/fkpNjh8J+Y67nHb8fkq2u9
ucgCKwBeZKaVaLXAaoEpC+jcndvHgFVwxwqYIbr1DpgWgIewdvPZ9ggwCb8vZeErfmYIlXHmryHr
FitvDeGGlbp33263joUuOFP1e7UwNgu+uxlQDXINcvAHoCMCr851YG1JU0L98glEAX8WhKbtpgoG
E2g3jPQ2VAX9KrzZ/mRw+MZAVw5kx/rirk/3wQ88d9XSLaahMuQR1C/rfo1UudNWWkw7pElqADnA
QmpxIs1hCtyCRmAo8YrKgpd0xgq300TmL/lpbVvA8hvDC0mWc4ZVV+GGKsBBrIoL12AyGdPEbDtv
rOXakbgZDjeybGXaQngVnQFrfbeMeQYnn/frKrzKl9AXguGWtQaRFPGuV94RmgXdfJbH6pimusAT
F3TBn1mZreYjON5F1c2lkdm9EYsLZifwofAj6Fuck2U9FAXt6dlG67XejDSqLnWlKN+O3ZzVxdJj
1EuIJ2gmPDBLOHedVCOi3s/aS1yao5Ycv3E/6DhVUQUCq6aMu8Ei0wdxYOZlKh3kZszPVDxcE4ny
CKuJaa7A5yFblRMdZklimYJBldurq/UU5pl0M7KKiqCVf1/auifvh+4H9DW8DMDmWvbeitm2EwaZ
lb/tbAf2/LH35JRVu62cOvDepIl6+y7Hb7nE4ZNA1vYX5+DX6YHdciXPFlgB8NofVgusFni4BQSu
iAIAOYTuyipZ5BDkACPqpu7S1wpiApWtfXq8IjH8zJQAaf4EF24F0w6cSsGNihvkbI52Gx1hr+lj
/UrhD+kBXHkMFMtii2/Q0HrAq2XGXaJ6ha0dyMzf+IhjSTWgTSJMoDghNK403kohrzqWOjzgVxjM
5xuX31HkqJSvsrDZ+A23ArmZQDWWW/bNAn4LXrJgYFHxdFR4iWQWWN05SIFvBdq9lLrMCNjmQxVl
UbG/miE4oEaZ2loXCyQT8Z5EJSsR0IsPry8Cnt30ll+103r4ejKM5GBnCVmaabAJFdSUAS7PLxS0
LxPtDb7xFUoh/0QyQFTBXVvMYxe7NLsu1oUjNvMbv3Zjx0myFsy0w6n+2GhOgPn7WdMKMU74kcIH
FYnS0KnC7i03mW8tgR+VDKXFh+Ku1DRtIis/1qDRZyrd5w33x6BYMm+yhGaRrNEcuV1yJh+6/fb1
t7af3C9HzA6FxItU6xJ1UWLVJ+e4z86RdSdNAmGC/QHPde6i0ecrCU0z8eQum9fr6r10KidkqCxc
PYNd+88ZHDLUsFx9Zg+o93rR9ExiXW28oMbkOfAHIjzVbWJO4+FtOU+3UjzUAisAfqgF1/KrBVYL
6CwcuUPpQQXws59zc+ffPONe5guw2c3LkYd9j8AtgpRlta3NCbRjaMcxw+6Pv0MbfN3u8KGxWaHZ
ml5wW8OOUjsjqPkjB9QX3PAVaNARwvJMknlhUJyc9ABrPbD9CR5zly2OpSm9l/ZSDniyQErDPBBA
PF17a4MjU5bhJQ4F99JkA1yksoNH1Cjd9dr1mkGj4aUv4UZSyhrlx9sFnWNrw/JQUAYkyJQkGZyH
75Q3bDewBaWwaJkdiHptRmkEiwH0IuAZmzyj9cl4aMrYBoyRzDeaApC0xTELfS0/WN0kl6+KF0Ws
BShzZlQhBiVG/WZw+aKhDYCRcBW62jGZcvZGfvs5E+OqPNaJGvJ4d2JA2YXEEZ24E7hJzY7I2U55
7ZnU6ZcaQwiVoSawZXcg7tkHPz7tmL7SaKRFJhqrcB7jM2E73TrYgItLtX2gK0vuFUvQ4EF+6ahx
kWesla/CV2PGbGcTlrTjiCWz3Yx/crVtTnlguzLk+Y7ogbmXRud0HXM4pzJ+wLD80qhmwQ5AvKHn
LKQMZVuBnZPys8zxSsmJAJlWp6WZ6sl+tPM1BnQnZkmaflW9D8derQeFRfQnbtwrbLFBl9gFOuII
2pDv7jxU6/bPQH2p07jtyXMvsfX+/SywAuD72W0ttVpgtUCyAIGijnX9FnGxW55mtINjzgfWEkjm
gGNzzFc88jciA2wGBoPTUvjk7u6Y2AxwVMBS0bDw5W6KDxNfQSwCuXyLw5OykLI4Ks22RDKLssDp
rfZbhrQqaO8iEawyCwf7IeUp5UpdScVAbiFku3mN4ngLXwMWgpXgHCGiNOUSaEnFEGj8Q/uUM5NQ
u8O/rSMFxlfFkO+W/iqnKIt8yKl6w39LX67kxOW0HenE3kJ6ZaWW+UBBEVNl1+I5COeLrZFnCSlX
jUUYsS1BxYamKm4IzcY6KTzBEC5fHMP8+YlO90X8cw63BhNJyw5jPI9awAQMNZXAW5YBCVNGju5S
U5dNmIrHQQ1kZYkvpMKfpiEYBC7EXqLEYaWZi+OY/SHm/WBSrmbp6CeViSKu3X6kOdnvuZK5Fi9G
qxPYZkKUiTHcBOdZ3boEs+PFLiwfWC3Bk/eTa7rFJ5qyW3BiziK6ax9ryT571WVYWJ6pAQYsAa4Z
J4RpbOSmLSqRch/ugjHzC7K2z3efggJUqnbiq0NZVcLyV8gn7LCgsUOp6gkdK7oQxi+oeSCZwJzR
uD12gSTDyM6Zbosdp+lnrZJqbjYhestom+6/9CamEnbde+J9Nda388yIaNis+onZS8gKE5OY2d7T
L+qJWdRdd/Vv3Hp9lxZYAfB3ad2V92qBPxcLCDHy7N/NlsfwGr1shaCA8eQpNeaR//a2eE2HFb/f
ykvIHZvwC7O55aJcwxXgJcKVu29vt/bNpuW+aWti0BueGSIO3tECdAW3HFvLQ2tBK2mNZg2DARQZ
nGwOAnUcJElyRyb71Fz9AuorSmkRLIsLOnpVrXfAsrub6EtSlVhuZ4JMEtJE5ikd8VHChp0AZ9yS
zD7PloDTBjR/WcOLkOlHhdiC8carTvguQbUHgvgHX4V1SQAySEhzSFkTu2r8IR+f1tdpE6AutvJA
OVQK2AmvL1oeOzzTKlruG5tdcbhpLApWkjzc5q6OJx6BRmZxExSBRWmnfYlwHga1Ih0oT0qkOnMA
xU2MP40h+Kf5CCJt3LJeLr4gsaMeTY2NiqphUHc0H0wD5TqndSYsEORhJHnAer+x10SpPPqcHRk/
TI+6dDvw/bT897nNznRM9IqDZjr6HbhVrbV2OLu6+LB9NGzA/LAETgjiqukH4mqsn6FgFwYEEps1
49I2nJ2LGQftbRUVUIzntAKWyM9+4IUwvlQ3zC/sbD4L6ibeY40O2ewWOxrFaSs1b//oFd3nq4s2
R2ZJqgmCLFJ4p23SfCuMvNepvDVjRqoDvuXGmv45yIgXpM6JCZFex1qEvVOl2XpjfaZ6ye9VGyIt
7eUr3X0ssALg+1htLbNaYLVAbQH+tBiwCS8ZcuBHxaCmusqP1H5uUPpuTNsXKiKqAZuZ9HYoj4Tv
4gJI89QpkKFgoV2m5VKR8hM4INIduLXADooWH1/tCBJV0ZUq+Fd8wmY7iAQG+VCo4jtVjTTUpkhb
Rgmprl2tYOV8JKRvEcOahr6uF5SscidA1rdAfVRqnqIk7gWmVUsVd67K9MeL0TaCqSWc29wAVuGe
P1bA8wkX/YJ3aTukhHu/8b7f+Ko5iAKzXReKq3WIwIXMPXeQLU/5NU9ha8QAsYBbkyq//QuNyi2Q
JV26ozTzOwQ1tfP9EznTzoFd+1deu3RjCYdMs0S88aYfKp5ArUsA7cPRdTbNp0svNY5qnHHdiGZi
rOy7E06kJfw/jerRHPHI5JzpOibwWBQUTWuK6Zxp0NU3znJwGLIF/hlRc0KMVoYMdFuV79OgGYkF
yFzY6oe8tRayHCWrnvqqIUKLZt5ktt7pbpBnE9oJo/7Tp98j3opBRRa+SlezQrPi9l7U7fTlojmF
3EXzb9ACGVaSe1hgBcD3MNpaZLXAaoHKAgJUZasnxfHyPCQBM/6cAGUhCFUeuXLmEJyo9kPij3fp
pqTrFT8mW4VDoxQS+Eewh+BH8KlkbvTVmbhOSiQtfzMEtJgtqMO4a3AWJeeG5ZksZVUR/gjYTCy2
ZVkv+NitCvGsiKGXvIheQGvfL8WjCgOsBZONhAWN/uhbRnEoperMapewUrJS8bVGDvIhD27ZfYqv
g6ZMI8eQMjycA2wrHlrbRxbmBbZIh9iwv+YsSuwxiCEVMm0WUZbLlocMIDgpAB4C+DBnIF5CXx1T
hZBvNjqYSEHXiQkFz0eQuYzJhGYBqJoldCl83uymTIrlBwIPsKga7An+vlxKCbemw6GLE9gJNQ2j
61V7WVjeQH0jgYlLd/uDs/1bE6PeJWPrMQ9h61UIYVu4m11SXTJnHgBRvh0nTnYbhX/Ttp00/Ce8
udCTUxmnNeCSOYgs9qH0rcoTHU/PxVCiSkSvruaGXIQvtFRVfgTG54YmdKnM2/pFo8t1b7XPVzj3
gr7u2O3kS4Ze5aURL8a5Z9zGyJitytlvmBbn5PtdtOzMyudZSuVnpH0d5aZ0gQVwN7dIhos2o1FZ
CylzM+1V1J3qWjL/NfIMVwg2JKkSMcswNgHReXWPd+D+wzLZVUbrlV7Rpp/wTTXzY/Qpa/rz5bUC
4D/ftl81Xy3w6SywFSzB59Hms80RhyCEZxtCPsE5BDYTywFE6RZ/NIAnQYMU7hgdicA7ZnmnZa8v
5WVAha++BrZOMKg4ew7BFpTiBklQv08DYtU+igmlVKnJeFIRKtVSZIPJEr2MfBR3JtWR/PgEjsIt
6cu0nMAM4pZedKhKZro6DafBWcKXTbCtyAA4i5qsqUQalyBkiASywUQlE8ytF/4sCbhJ/uKVdSS5
VNh5yMHZRjNWBxMXHIZ6uz2xkTnUK0SrghKMwFjyeF4AtUCp7+N8I3h9QXgiBGtMi0u2/eamnInl
gHNOSYChVChuWPUNRo+7FC7wwRdVsTcikQrEuuoeZWLlZmCrGRMfI1xWRCtRQO+mHEPlKO5yBLG5
DdU6XeX45v5ouD/6F03M8edBZ+UgAlnktEA3rNBNdKuuxl6tDFFjl+fEwO6gW8H8Pi6vabU/6d0K
RmZztQjzE+oywTzrt2Q+Ys8eE1DNt6JLVwk/XMaKLU3T7fODwFDS3qPBntYEoHZymiDbJTM7EzMX
nQ5SmSU/1+Pdafd8DdipbIbEyUy/Qus5oAqWV92pQpgZaoJh/TjnyYjcIqg1GmvE7J13VPNGMuS2
hN2EebcPSG56pieAZbbtMrJqOqCVzSJlsSNnLzEe+Vw6uc0bkz7ZpNU0UNKifeUunEHrztfMz4Jl
oy3rtOPdeb0zb4EVAM/baKVYLbBaYM4CRnqEYVvvvUx4hlOO/KsjwOM9eIsvl0Mo4h4NhnbrPHcB
0xhw8G9TooUFe8pdp8XAxcs5t0zp19qUBZCLzPKIOIJsIQx9s8gBXMQtQU3GPytNdQDYBKHDZ0hI
KebeEMs+WzIB3JIW0knyGMXZbCgFAt0NU5DJIHBhuxWxeBZvraqz2Ia4ho5lEiHkVH6A1Qg2prJA
pGXoJssP6LfwtwDS1MHMxR+LTHwdzLJbOSxWXOurw40+3+h8I9QCcyWgCAkx8YHTko1FeWniI1qN
NofdXFAW5mX1h6sgZMiQ7pZVxDEIO9HEhJm7F+GrwDBb0wKgEWV/w/iiadQyntiTZumXiQGTWWRn
SzCtSlVj0C52GkPRwXMCVLAlSqfa3xtpkHBM2/kB3FI7/ZHolghsmmyuCeO0bZE1mR4ut/MdS8T7
xJYKDGC+eY7J2CCG4LsnccHD0qKd/eL3wP+HId7WTGPqhNY5oeJ9IaXamPyVkAF7ur1ir7kDogdp
NycMG9MZlabO37c/pU1iGz1GP5+A5X5BLe1yVdWV/O3UzAK+WbaKvCvYxIRRZ2Yn5npyIh6Bnnj3
ft6D2QH2RJleay4w20pyTwusAPiehluLrRZYLbCzgF/c3mSieA6FAO2zLT49hR+HT5g7BfMHtyzW
LbyM/fxHmHTnYOPdXaeM0PxTbeSGilxqAJmPHn3xl1+8/Zs3VxeXV+dXF399oZ2uVIqjQPEU+cDQ
PJF/dP3V1fX5O90Cdko+Q4mksGrXi7suhYQUZ5wzvgbgFzE32RKBt4Ai5BsUdPW03tEXf3H69uXF
1ZeXV6/fXZxdDCrbWYoi4AAdIZ7SFqOgyrvr1++uX18J9eEueOJPpcqpP6q0QMHBbsVLrHoogG0R
n0P9nhqwjqiU0BefG6319cwC/nB3uO5u1A7FrDtkLh1F5FLQRdie+YMZdz//yAeBe47FUxWFXmwI
ZVHTMGr3BIRjwjmRgT/B3XK6srUIGcxhJ3Un1Y7pl+S4jgFeLklE1d3B1tj4aWJctWTINQvUIdUS
X8fEAPR+tyabZHdziY6Z1Zgu7TRBO0ORc6brnUDO0Su6SLvtA23P6Vum6sOBYKvEBBocQ2LTT8ey
dloy3ZM52QE4nTP6qFYqZ726wH6ZChXVQvFaJDwNpUotY/MInraIa0HT5A6//MVS97rubEjbYSzY
AqlCgyLewCr6Se4Axu1+EVWJ3Tt2Yr5msbkOehku7DUhc/fnYJ5J1eLzBVaK+1hgBcD3sdpaZrXA
aoE9C5Ttr+QXpXfUvjg7V/VZcA7AAVDiRlhIZAwt24oGOXLlcWtlAyp8bgRxjNnwh1v8QdQfSgkE
FmAjb63v6gji02enr3/y6vab27OLsxcXL25uP4oeZKh0UxAsKgUDB2bTWSpP5g5vmyFUkJfSwcy8
NkK5UBAyA2W5lBK4EEfN048UJOwoZaBfYkWlQRl7bpWff/7Gn/7l09fPX91ut2dvXr5481LSgptq
KYHQRsISLwJ984ZSFqwEhws0loWybhRZrwQAa46g+HU93MQnMlNdZXLBuFGWAej9HAHPOOBXYerg
6c+46HoV/i+NImtwgCL7KDqAfGgW3HKXgMD+lBgkvtnBWuaIgPnSnQNZ8AGNbrG3wBrqY2WIf/fo
G8N+F3Gfsd2UE/0Q3/J0eww4QqP7JVzN4EVph6HdnBjeFSnTcUfTPqVBr12NLQbLw7slgHwCek0M
4idcfN1Kwx9lFRbBg2TYJfTTA+gwXdh8NqciyF/H0H5uvvvNCMxA/QqNeELKfTsn/NWdPBfpdnuD
irb/h8ItBGpzBuKqb0dbW6/KJtOzD337Z426urfF9lV7YLssnIsZJcsQLt5IlT0rYLz31t01FqvQ
LfZ8hQSPPQJuFKPNLNjYPNGeCS1MO6fQypxfsGYx0JTnd9CrnfiweJY/hGyfpjbAfldFd89ni+1u
3/ac3O0nnvb9vt19b0w/+DO84zkdf6wWSLeSzFvge9vtFlT/639f/vfX/2WefKVYLfCnbYH/cfE/
//N/PGtl/Kdf/J//9l//05+27P8PS/e9f/dv9aMibKZf3h0y5GZXeMnIOcylsAJydop6FyVCFGGY
nQfSHIzNSuL4+BiYFl+v37+/vb0pqIy/oKhR+xtxeyp5a7m70u3lzy+PN8dnFy9vucEWMBi5XX/1
Dp+nX54CR11fXDF9/vz5X54+/+L5MXBd7zo9f3H8+Ojl81dPT57g/oebj2//+c3t9vb6/DrI8TuN
HPwYg8n2bnv563fXH77ePH706vTV0x88dak31xd42V5/uSt1+tXZsAPz9vJvJO0/AAMD+gqOPtpu
Hp+8+vHLod4Pb67fbLdH119eRr3bu7vL31y++tHLLPjpxYvN5ujVjwaBf//xza9R9dH1z3cFT/+O
FihbZBeUiCawwd0csIZyYDeMJB7jOF858GlGNVlBkjYacC+mEow2UQqfuECJHBCLxkuIWYrTE3uW
LqNwEfBCKbMScUkAMAPZ4qsnAoB+3WcEg8tickxwoK6bYaswCGBFBsHM4bOjiye02LMfPiteiwwM
qtH/nqDf+Zcu3J2ttR0gdnNo2XGnStfNUlWd3Rpjt5bwmdVojKAV4H4iZSHZU5PXMZD5RKKyZEh7
v+a7tzXmCwZwCqA7X+ZBFGPNURm8qqMFyQ8SonqED/FMLq/XGrWdJPrGQmDcqTEDs0BroMuzFYuV
art6JVjutFMduJo6CSOPJZabskcZQua+EZB4yraVnGAeOVVi3IZL3jNjhv00L4FB1J/9h589zJBr
6Y4F/vbv/9FwYPUAr/1jtcBqgYdbQC5fuwrpYjWG0cVNmPVneFV+dfwVRYLSqK97MR/o9/jzY/yd
/vCLnR+PgErn3PLalG2WtMsR8CQ+b7kSVUBuV5FQXBrynp2ebY42L/7uDFgX2BifZnf6Jb4+hzqv
X7x+9oOn5+8uzn95jsTrn7wOKZEJ1IrfvJPPT95evzt7Q1YvT8+g2vlPzp89eYYiry5Z6vz5eQSJ
nf/q4vQr1AJQZ8E2RdqtQV25zn/yyvW+ukTiGTkMqp7/6s3ZL1DX0csvzsRKAn/1/PTvmD5/LoF/
dfHql6+enTw9P01V//Ob04vTgmyLd9RgEpLAgLSZ4Te/PkbA84YQEo5f5IUfqcxMC1ui3b9JTtYi
O5SyLqAB5pRrIv52KopmejAXs+Cesyex4ws0pVLQLyTX9MdeMDwNO3QqVCQ13WGWXCHVQYmWs4ov
8Z3m8fQSAb9rmgl30CJP0SDfQR62hUpV4+OxUmNVdwepCxFLl6zr5bZUS2+13WykL+09Mt3OGU/K
hKv2u3EuVVB2zFbZA5m1DE9gmxjtGOWd0PNJ+tan03RJt2/h5Vg36Lz3KjAZOh+uwsLO3Lfqt0On
zb3rUBn23eyuqJIKX6dz/JxWcLSvWvsjsniOIIzQcu7mLLRt++CPWbvkV9aOjr3wnbiSHW6BFQAf
brO1xGqB1QKVBYhw4H3V8kujHe96RXTqNZlIb1VoU4AWYQhAlRGgE/hzJi6AGaeNasSqBMqCIZik
KlgC+Ef8GX7MEF+4ZMml+HUlTGzvQeenawGTzde//Rq/VecvXl+cnb/44sUuBJoR0dBl8wR7HcOL
+/EjHLlInHz/JLbFev+7D3JH83r/22tX6l8+kj16hNW8b7H8+NEjMhnWyr7/7deDa9QgjQ5kSosw
4+KxhC4nhcNPz9/+9duBQwFv7393ffsHqUswL8X5BRgP6e3Jsap+cf72bCg4oD5WXRYJ25Uqhswx
DIYASsPr+7lwL0QqsdxhNDtyNbgE9P3GsdO4LBvVGZyuipEupkY+ZRtgtiVGZlyRlgBlYbAcvKbk
gECgl4t71Vs81YLaAhjvxEDKdQH0SiTPelDyXGlvfDw71GvHdhNFdCuPmSow3DrH8oBvCXxKNvy/
n8wCL4e+ExME2Xot2cLBaGuXthUW2m7CXRwD+gywlxqhBxhqkSY6XvbxeqbJV6SrnMBaQVZVNl3X
WKllRqxsEnabSBTGXVSz8Hncf0gn0M7svMkYzu8+y5a85tki88jJCRfuaU2G8W7Zf8lkMUJUzyn4
Vp6AyHYoaR+Z685TNfQsqpyYLmzmAUOk6DWVkBYjxM5kTu8exrE+UFk15kSi/7vgfvH2PZNzpu9O
PO/9hyNXnWdAZn+Glj1rK9WEBVYAvHaP1QKrBT6FBbi0VTCDfmCAYeEx/kYhrbN5AO3wc8b1wFuC
E8c/l7hZ3EAmOCizhM5GJtEOI5//cHP7hy0SwwpSEKsKrDvlrwW++kwjML979/U7ZL18/mLzGE7Z
Y8QwA9T5xwkhzc+ePBl0vn1z9ebFxaur99cINn7+wxcAV/YpHxE4gdvtx99/xNenT06enjxF4ub3
N7utlRlcbeDnEDXQ+zomGZyx7+B/fQlPMgOei1MUlOAMpVAQCdrt3ftrSktfNJZvHb88fYn8woHu
4jO4bU8vztJIKGAnJbUER8MUw40w+fkVnb2IdmbBPSGNk+0OhQAojT8BRTvqAX2/j02esdxXvLmQ
uwy2inLe5Bl/bHSwAhOqrE/k4KsandMH8nJ7FE6tTTlYbOfzp8DD5fRgybKxM6LcNcfhva94vhFq
tyLgefPo25MkCTvMDuiWc62sZhpNerQxNtEeiGIJMknSzyYX+hnMpzucGgNvmXgaUs4KCYIJD8ZS
54aq6XrzDuIwIe0SNbs0gbXGmE8gZNu5RTvB6t6wfEm7zNC4u+a+7R5e5ZhLC1eC+wSSGS8ViMVs
Fk4EHKB11s7yR05OBM4Z13ECxiyfdbr/jEwX3lTNNNZGsj+rbhNDt8zQscLD7SxDNNZ8Q1Ri2/5V
ZpszydedJP/54RqbJfFds9w9aC0yz2ASpH6f507inHgukklD3mmsuyfA0OErYy55Qe2ZZ+KRnG+e
leIwC6wA+DB7rdSrBVYLdCzAZbcbuenC1+oEcm4KxOJhuSgKMv5TPLrcqwM/ZkYsQ+bOIexMfgL9
Xl69u7x6i8QApQCujGpQkR2hQFxApBwZACdfXL1FaPHl68t3P39Dp+i3j97+81uu0X19CX9v0eKz
DVbzvnv9hjtmbW/fXr3Bb+TVb67xy3r15bvr80twvvjV2w+/+3D+4vz8p6+RuHgHGmihK+9LDDkD
ZyIE+lfnX398/+r56+vzt9xWmmt3h1K7eGzITLtd/8vVxT+/obQ/v3z36u3J8RNkFg4/foWy16+v
r19fJv6ea/B1dPX+HQX++RXI8BXBz1//7v2r05cs9XMVDKhJ57lNZD+qjS90CqyLuHFDX6SRzeEC
KjpJDnO4fAF96WPXLcBUQ00ogj9c6AkeFakWT4WEj5oEqNGUuCJxMnzFXaTdpoC7YshP42HUi2kU
TFBIfu5rjXyQ2bVrdZRforidKWBPaXErjDYMhmK4Vg2h8mjJwi6BBINiu3/bkdk+zcOhYCDMYHzw
qKsVuzvKHMg6A9DxWxPEKBRgsidCyVuizgMx55IqTBNwousUWoqdRsbre6gmLLKk4+XuGukuOJkw
9MNuhWWCTbZV1zKV2bs9udgkA/iALmOJ6oE9RK/u/FT00txdA97PwqS9+sda09gsmiwnXH4ZsLRU
2dpZTt+ySavEbvIiS5jwYXkHBrC0PIEhQ8g8+zBi+e7TaplH+0Bi1Xla2wmFPHGZRCpVR47d3dJl
JiEBsuQTHT5POsz0vvwqCJO6udfrO7bAugnWd2zglf0f1wLrJlh/XHuX2r73775XEAiPGtLWyvRK
CtaWTZI1Xc1tnwW0AnftibtJiGgoXrAicI42zdodcjvANq9fLTO7goXe3il+VwB7uPhT9NycWVLB
fwhujt01gZlwatmchd79g0Q3L2QTkOOps0Ly1HTDTxYHQWiCe8J+BZbra9lxygjNGAwMUalVDlQm
YgM2SgL0CIxndSQ2OUMAqCODUEefPIwi4IZL+TRCIGQLAFbGk8aBYK60gSV2EXt8whW/3Nh5UJb6
puYp5+sOkrA1JSovJ8ANYkgdTwRUm10lZkMyODjDUtlKaAsIrCkVZzpCm1HQN/L3Wk3XgltSvFgy
zCjLWx5QIslJmeOLvzgDx2fPnhUxPIyjwHOJP/qgJPvQLG03h7aLCP85mhgiZzeROQefPIyuPEim
qdDgRE40+1h1Y0Ci5ZlZLRFgzFwTij/EyCHefCIw6jxpj6ItnnOcrrr0/So6pNRsr5gx+7RSliTj
/PDmdZ/cnuQtYmmpdjhw6OdtTvW4dbvZUst1tZ5+FwXraGXlLMRj+THfE3JaksrabosRSZbqPkJX
vco+gbXjWYgulJ6Og+wWIufOPGrShYYY6/nfPvrZz9ZNsBYa8QCydROsA4y1kq4WWC0wZwEgE0Ep
AjMhQwAPHgZrZKhMwyFvBF3chsA2Qk0F5eKWcwzM8IkclXLwsE/TJeQDB5VydCsTwquEScZgPoUI
leJPSMk+T4JzoFYQmKfrGtgy0x5LKwKyrdAv8p0WKmOItJyfRNFIgEACEAn7K6oApQziixwgniQs
n5YBnyaTOsVcgG22ACAu8sUq/AOkQaZkhgw+7IFWxWWZcQ0WpllUBYG0JPQEAS0mzjza9+4R3OMb
bPUsoFiOVkqQHvx5uq8KspQBvxsOrCy89LKaXmNc0C/IfEXiZshxQVxuCMgp4bmyV6ZmhLMKcrYe
oBdWRRrFT4p7ubh2UcpTGOoJxfcrU7AJPJsglVldapSQI0Zyswn7Dfz3R7m6rpK25iVkQTNBPHZr
SZEJ/hlCZOG7bJfUdQ/bt16jypkzy3PWyEvcyKWWB86kRHH3w/h0z9y9K+7fUVtlZ3MqTyPkanP4
PKfZkz2eE048Wy3jhMBj2dHXpUntuqSBsgey9UmOcZjtG0WK6fdGfrFMvIvaF5dyKtmq+Qh8dY4T
wWNXarDkXk7uSyjjH0dfOd1+7eaktqievkqqIOzm78oueQ+721RTQilnwgLZkT72fmjRb+vEnnm3
dN8GS1SbfWetBJMWWEOg1w6yWmC1wIMtQNS3FVbB56YAOaIypHHZlYevuOScLIDHOA35hoUmNkSJ
TCExIjfd9Z5PxJ/OH7AfCYSjfAwSAQ++ii1qK05auUx5FC0gNPyoyneErQ/INXwtUdwSgGxFSTLg
Z7MSnKZHGswNuYcqkO2gXJ95S5QIPqERRAIBPm0K5Ft9XMZv4KZP8kdxfPrHWwXJDXdtPRmkBAlL
vOI4FTK3R5qOYtsNxZ1AXRIMfNA6mw323eIfoO9jFUGmMbCtTeiLPxhcPD1ZUDZfMVvQSH4KqT5Q
pg8keWllJWP9MyOcfSv+bAcwVC3F2oOtDIN5zBLqkppx6BH5oKCtBCa2IeSxbLatJhEoFb4i03+6
qqFzmxMjvDZhDnmQmqFIdavU92n+mcUhNO4wwM1j4nYwVzlRac0hCtGydvlUtya0cvElwHuJaZZi
jH3JJziHQVo1J3LCSgEwooo2J9fO6kZQzcStuptVHW+sJ0cPnOjkk0ZvkV70lmjWauhfIS43fe5j
Ve8KnFD30q6VDGMCIgbUz+C/fSpHdJx4iAJxTSeiG3QTo6YNGJYbKEOd2ZfSkkdFNNXsg63tFsnA
/u5uFxRdSnFjDl3d91tr8CDen6EA52qisAXezrFIIbD5jfXAPQOMTSRlIfNcSeo2FE8vdsrgRJXT
e3dlQJ6fiPx2jbmGRW3V7e3V5MIiRivRwRZYAfDBJlsLrBZYLdCxgN/jXtPLX1A7DP1TateiYNvu
MkbSXV6GQ7i2A6rBV6c97tGvlHZ4LqUc3QpoxF84MTcBd3JSrDXBnkoVx+BQF0V1XcMv/V70rPCn
3ZiUX0A3YGc5fnYQnswBqEAg7Fd47kvIeQFxs7LmzD8jMdkKV5HTagqwlYXNgwVIhCLHxSBRBJTF
Nz6oU8oOYpdRo0xk2P8YO11tHn0Ox6+wLkWykxnMh+rA00col+LO10xBgfQnEls5ngIoyNN2kLI7
j6uId1dY3gnh6qhrd8qR4S4M6HrDVuCM6pDjy5ZEJnKggjSlqSNTtZSZERmQX4fSbWKMIOR3W+fR
ajUUi5Hu2BBtZ4rvMJXBZwVEKw+MhZgFmd1S34UClSTTKHoCabcFZ3XM6nSJJ4SZYF7G2ZWx1D0O
Emm09wbnDKjazO7dQ5qwRSZLSs/iyV0P7ILAeOLyA3VfXSZUONh9d+gUT8Zj2XDLdZl7pbTTN1WX
jufFfbI0TXTFOf5TzZ3epbMIduwZB//79bE9wVp7jkyslOmnhJn3JqTEdFaeiSmV2lwTvztjv0RL
HrCV5nALrAD4cJutJVYLrBaoLbBRhqKCCTv5k1FAL6EHkIlxDj5xNxCgvobrstCY2DSbEuJb8DOg
C7BWAFTB3QLYgJFchVBr+SGxt1bg2cy9NNd/BtVckAy25mPspHTZ3tmsRO+ly0R6wtUsPuiFO/YM
swpxKGHANlOoaf6wlQvGV6ULtLYi8u7iMmYjZ5Uqwsi2xSULAnl9bVgSADGawPUa3w6ibny070bn
G6HI7eCzTS1aLCRuZbMr2zAg5aBXKa7W96S1vda8btP8ws0+d9wKqeRDpo6e3QAr+WwZ8IyErQdi
pIGBkTbSVqIoFTXatmDuVhh8vzbjbrIjyTKWHBujjA2qIj9wrw3yXV6z40saaNccRZScE+4X35uG
xBXq644IZ+DfYmtMw91W2hBmYug/O4TtSvdwI/eVbvtGRn3uTu5LMS7PjAJEOXPJkHqx8acJs6fL
lHbc4S8SuS9lj9kU5yUqZBq/bfJTFjn30rTb0NlTak3bx2dRbRPgtm3f5Y3bw95tQ1Q50WrzkrcT
fDZy2xBZwWXvvfyM505STWZlIQ+YJ2qnS5qcXVMOAk/lpDdk9Iro5xMv1Y6Rq/md7nRPfqjn22ml
uKcFVgB8T8OtxVYLrBZIFgAuBeTYltW5fKcDhwi2EZ4I8PDPqG+rBD6Rg9sDZYEoyBcNAee2+DaJ
iISUDALtLSTkQ70qbvej62UaQc4g0B8PRrKjUhyIn4WvKBhQFm7J/chbcjbuQnnNU8uG/Umv8pDg
UEB1Abbx8GFXp7usVACswF0BZofjFsVRdVhguEux7YYV3qPMEsm1EM4hrbsOKS+IHXclsy1jpUxA
YuNqoXccifz9o0fYX/pzfeV+V6B2jRDmhjXi329uyoFDZCIZSlS22PJSkxX1XRw5Ks4LZOCiqj03
wetEnyiOP1XKum7UjoL39P2qCXi+kaZRHOdc8D9KWUcW4x/RuGAzuSEf/N2LkFa9HJA5E3awhS2Y
/3SNjTzaW2Nj6zE8DA4TA3rXPktQpBz95wCfQ+Lh0bAzIoSvi2pMUNG0OVm+PDSs8mfxZyaIWirB
nF/hdvaJIZAyy1wZbsJcLX6OskuMnE3qgrkUmY+09eitgEAtzAu8lPvk2HB/upPvG2ihpqFg9iJG
u4x1pE67SJE9yJFhvyU3/p9NVMSDXhMatXM97ZxLoLI2kR+fPS3ahzWUilutmpY/XkdBUCHJ3lso
Pw7xFLhD+laViIZoI5/dS+s+WeHzaBGrk5sm5yzoWhas+sv95P6TWVW3AdOUU+Kc/ZDKpP2c/Qc5
pnji6a5yJl6qbaeoc/LzbmnzkztffqW4pwVWAHxPw63FVgusFkgWsJdS3lejvj1ssEnRqlsBFf+Z
2AnkG7PhE2nHMAOkCSwF9CpgBr9b9kYC4PFHs8Qq82cDpQYnqmuJxcleu1sktHtQ0Mj5JWzYoMt/
gE8CS0TI+Ax/KdAjboEStQtMkpXxJMCwkJjPQCZMhS5SqqhsdYzBUMRwLmQ2Ajdas3aGc4K+ZTXy
zc5ENpqB4m78JJBfgOKWq53xh5ONPsdCXzADfxCLfjeiAgQ9efSNYtcLtJYz1uDW8wIEnBKGBpHx
cTwScamHEUjjgjxuyrgS4CyTIL4rbp7UKB5g4QTiYdnHzeoG4jDrZPDwQwapwLuuEWnYXPmuvexE
jVuQNoQxYHbv0jUGQT2qm6ZJGu6Suc9Xg1cQtcNZl2xxeIuru9UtyOz6TGahTnfE33pmxhwy2Z9j
GVsPjzPjbqhSQccsSUWch/vtrVa2PEKt0PiYIgsMXEj2OOw33wTze9Z7v2mXtkvvq9fapJ2zaEf5
3UbJLZ5beU9fdfs2p34iKmxfzQhMziLNym/hJ2ZtsoXu2Viz74GDHvaGOD+VMVcV9jcGDpp+IjfE
twMsrLp+q8XYs9FTZ6IhqvfD7DRZ/cboPgttJ3GOJlMC4ZeEjoPaA/+JZ1eeWXXa19rUm2SsAxzU
MZa/qlbKZIEVAK/dYbXAaoGHW8CIq722Q5YJNokibnEQkryFQWICQc09AjARDOMvBGjwVZRZhJJG
jV3OYplxjnG4d+0yKC24q8EtuxlxUFq2QYC4tRPMAlhOS+IivSvD0WKrLjGqG9ga6HoDMP26D7YS
XMeF3a1AzoDn7aPHA+i17r4IQW8FfcXBOf7Mg57wFUfItJn0B0bAorggfO4SgqbkDHALN6+rFigt
a7k1JWHnLWtHGvS+i7R8zvWFKlxXXPg6ONzKAMJmByvcUsvm3blblmGBfKs7zKrgblhsDOhOM8x3
J4ebS8aIS4Zo4TuKmrs5lYVaGhDcExvss+7C5kyypOoJFbKQlcBLTNr2lNFSE5ine2sM0HYnYkIO
PybLO1W3q49nztokfHcHMh4hn0D1WeXFj8k9pGqnVLpM2omb0f6/ZKpiQlAXn+tOGfea2ULk3yFu
3105J083BKQ0l+r3YlypCet1Z8SqN8CYgqMVTrxLZ+cm9plmqy7RYmkPjMd8+SzDUtYr3YwFVgC8
dpHVAqsFHm4BuSjpfMOnoE4GY8UxaAgkELLziIJ+s/PdGToaCMFvWRavmrPRC9LAQgNALZDG/lth
oRIMbMxjNIUEWNktLOhYFgaDp9ERqlMVRGWqyKtw4Y30sUmk1ye9joCRdvbKdWxwVZbgin+5K7hV
Ip8N0iCGJOFl76U5GJhJKjtdy+JeZEIdKGvx4C/FdlxxF6khzWhwMfHxTsX9C9B78ugYjt+Nop3F
mUdDqSCvm9IU30A1fMUnikNmfboRC/h0DtREwhzEzYoUhH+jrxA1+DvtP9xVgs0Bw6IuaUeVUQss
jwSsgfTtAJtlVW9k7bB2L7HehTojH38QCX+4hYL2qFtIt4UJ8BX2AQG+ql5fMeB4SMJlZxGyawzQ
MjasDLLxRBl7TQKGlqYdoyNnImwvRtWzNJB0Id62ThXDbg4yA41EqYmc4NlVc9fiSi2hKUUONHJd
KgOGqkFDpgnk0L2VZ51G+i0VfMBget5nKBtmMy5p07qTVLZt0X6VY2vEE1SmyTrP8gSO6jZ9dqLm
7jE2SzKhbNXT9uZYA822io/1jcm3AcWT99IPckz97OUMOzzvaLTDc1aBAcDVI5yNnF9cub+19m/0
WvLOcdX+c1UTj2enZcdmlCxMCAnPtnd4TnMKnT2fY/vroSHbWTlLOPFWrPvA2PdqNsHS5usBj/BS
Gf7s6VYA/GffBVYDrBb4NBYAxhAK3S1PNY7ChVvxaUS0LZiK+Ujj2gxYFHBFd+mTHMAw8Y9oCHSF
hRwgzaW8SBj2CB/6wB4iZH7RoUdCxY5SLhAIxJK2XMJOuAXIbZ4FdIEBipstPsEEBSwVBh9CWfyV
kjolAjyEsYJWCvzBGWn8IS2VCdcltpU1VPNWTwWiQ039ebWz5xS4ERQYgsYyiy1PXRZEZAKfWwY8
n2C5L7y+AuG0AP7cFjfic/foGxgqgW1vwVWQsNoIUceGkTx31xAazAUyCys3nK+TIRGZsn/R94Sc
GV89QFwPTfgVYgj97naWNvS1QQyVZeGYCCiI18wNxW1qEKN2dxJkGm8jATIb3MYfrgl8svxWDBaL
9dIY3Tl5KOaai+5pxDNR3Z7E6csS98XcEGqJH+OT04QOn5DzqAtuzHoL8w8ycjV+rarI/WS29qh3
tndFj0oJjs4nhZmeAgg0VU2CxLg/J1xtbsrKITkKR8egC9jFpFIg3pzjJ2g8pwWoYe+uW3uCfrah
KvU775bp57cLNas2bTi0M0FuAkPfvcRREwItu8UUSZvg7ZhkmXuBZH3rTpV6YDXFEB0mT7UgM2P4
hZbf9fMunrQi6i27h2KAwSWnCoFWxblLOD3dc5ZKO0F3j5+AT1DrnzuLFQD/ufeAVf/VAp/CAoIo
dMHJPVtciEZo/L0bcOBmqIs/Ksr0n+GZEBrBKnJESdwF0KJb/B1SmpTOVynP7DJHR8Ua+hr/FK+j
QFTJRylREu+BQMDJCIqY1sz1Zw6eli6Lh4evBS0DrBqeWTtfUiGUKjnQxVr4Cj5SsLijB7F3McYW
VfkFZktsirQdqpC1i2tUwmOhL1y+AMAMeAZwFWotAxopBVgLQRDzzLRsSKCILKFc22SHlm1P0KAi
DzpdxLr4E8KEapHpfHDTfITDnlmj9GXC642Rxl3Zx6YuZyy5F0mwMl45HhiG7qBGQTHczWtAWcFs
++EpMz5BNliesQDg8CmuGB1OJ3w3xpSu2V+HwdleIhNPcP4UGhSj7IICBjPdK2ehRNNg9SBnctTY
HZ5W8nx3nEtFs/0h94FhFL4nZDsIdmeYvZbQJCbLTRGuuYyKK6CS3Y+o5EGTEYF4LW0GupEzm2jM
lUWqAHnlOEXRMeNMzNfUFYbY0XzdnNy4qfMUWNjLqfBtrnfP8dtbXT/biToEY9MovY460alaDBlm
d4fJkyZZkeoF1XnMo8NUCdvW8wvVszYIPz0N5Kq70zeV8O4zB3R7CxBStb8C92mqtcx9LLAC4PtY
bS2zWmC1wL4FBtyoXw3/dhS/5S4dmUaM+gs4RxTEnxL9Ym0LqiwRwuV3sPxs+Mcj2HKz6KEgMdTA
vKAgixH5CXOWUGdgLYArIz3j3sJvwM8D4CyignjgaUdoAdvKZA4IBCN3hypZACg4ZLIIdBQgLFfY
RMKU63avVGSXXbvAAQgckksFLPc9PtFOVwCBYv7ZTcJdMKyIucmzreHaLUBMIvgWMjePjlBc6LHA
yLCL7rK4RR04FGyc5CfKBe7VxIRVNgYu0Ffot3jFgZNBALaSvJhFZiQGRgKmsFWjuqHsbsJF4pTB
n2c0UCoynY75gnJn6T8tvFlaskcX3SxDl2pYGd4hKjUwWeIoOIimRSzeCCdXmgapoUwe8C3xubU0
3ZzWu3XQOHWiTbpKVfQ1TWuKJQ3RpXFDdyFuK3QLaKsJFBfpko3dGjdN18IVaBwb34/lj05JjGGq
MM6nfdAarTPW4uugwYpj/e0AR3G3Xax4PNRjbSeH5M5dqSKRU81HWLkDoNf+Q11sM/266LbXPjjf
s7FOFR7ra2FDg94MjKtS4RzOrPqc49HIPac7JTQyRbXkDVPZOXpRlZh4/+ysXcnWeydQpANntear
XikaC6wAeO0UqwVWCzzcAhsu49yFMQMFBVYB840qiEx83RZ47AW6JBY+8TZU2adnj2iJbgWhXaYg
M5RFvUJodiSWZbRiAnF8lI53DM7hx3Qy8xet1BVkyPBOy6wRCVQNX6L4E7y5FDKdg9N67GCE/BYy
FBm0cxVFdyhoNY2T8Sdv5J5DciAojk3JUICcWNlj7FOXKKdOM3qMtb53XO77eFsONypOY8iji7hX
WJRrnJB5I6erlTLCREXIlNiEtZYK4slKnBoAvWVWQZdyghfMawuLhqzkhjWmLWwhACwGGeTXpQA3
CpxGRdBLLl8gdq+Ctvu3mNrp/IkirlSfBTlDbPAUZQmYt+9XBRk6rnSZxVDRg65qmJK9CmMjyHBB
eNRb+pVqjVu0YbqVWR0EmczH18g4b0/ddnTVjnT3aQ4bZ4/bdg9yjMChJTQzrTcGtA5X/KBuUojz
5IWz2pzcZFHHEoB9P+KkRtWUrUcrq1w56MIJCRrzyTlRcLS3TMz4xDMVT0d+yqq+fUirdJ2TVWbg
sWBc5cz0/7a/VYg3N/ch8yAVRM/IMN9yM1W4se8yjQ7ZmtSCHQK96ioaO4RIOeGaK9WquYl4oe0s
P2bkMdvGK7T3Lo1ZhiVzc9UTcUjv26cNSfxzEAbfT+zNgNy/srXkjAVWALx2kdUCqwUebgEtNC2B
vkZxBi1GXP669a8eE1y4a9Q0nBtkNyzRLNCXaOx+tDOQ7lzcQinhMS4ANmwATwEtMAQsJIiSyxH5
HJuBDH+o3cDMUNmZuIw/mX/91fX1l+9w9/r88vqrKwXoCkwSVFts1U5Z5LfkyA8EVjDqEmXhD1LX
gtr1SeGVQ6UCVBPQXr9G7VeDrczBsFNYrtQrRagyPiG5NgmD1xcBz9zkGbIJiu/ifgXOQU8ZZSKv
qi0JaG37oJQQKeOlhSF9TpLBNqW1jrgiMaTL1LvvQnc1MdmeCOICVMMyyPExvz7dV7SlM6iHlBBr
AXuGYYOPCGj2oYcU9IscWabku1JdFBIWxp9oHJfuaZGyD5aarKwoBpMHX3ko1gJOs8+IN3JywgMg
mzEPgIphrdrwGYmi8qDCWO1zKtYj1/vyQT2tGy0qn7gV2nVpduKND8dH3YxhN/SVJpy7NkyPfyk1
MZUwfSu3YNRXjcJDyLYvTQz0s/SHAJVcrgsITRBOuUBTAY+rW0HsglP4cGw6INvQNJVVF9phpKtn
kTJWzwJnU1T0XSfkqKZdrB5Pt9u60rfqJBX41Pm0hLXDOl4naPbIGfq2sfqUJ7O1ZNdobRfNvXdi
diZxq0xaea3zfEoW2/LnSQeomfukFd/lRIfJCdu5mzP+PpywW7dXtxNGXeOXCrt9OJo+Xv5VIr3B
xgVf7zzUAisAfqgF1/KrBVYLNBbY7KOXuI98/pDRE0jo5aETsJYchnzpIzHAHoPM3bBABL52Iz8T
C+qUCyiu0Lz44vnlz99cn19f/vzy+Q+fDwQZ0QXG883y+ypYrkjdgv10M8BbGXa4XpVSEiD2+str
kbLg9ZeX+hoSCpK5iGOnwwJFss2wq1MARfF5/e765+Aj4FdAqQD/54+41heFUIN/PuPPtdDdqnJF
coHeaohZjaH3mKCNcKECQMo8cSAMXxbWom4QDFdZ3wuIvhngrv29e4YcqDUBUVzESKM6+5/dN9wW
djXjb2jWXWWRAiX4AG8PPcd+e1zF4ENPo/pIWy9xb6L1Zvw8ufYWfhw6Xu+OSrtsJ4ae971VNF02
qK2tPjGeXjjU7rTjXtaShvhUNKXiZIp54ywxe7e3LJxoaLvBfeFuZemuCzEehwwUK4/cGIaca8l9
7GfqLvZD/ifqPK1IrZevegNUfWlijmBe3y7F9Muh150KGmxDoL1v08SV6sqQsl/CcLG6xmBbNF+V
GBFmfvppKDjRu9oJMuZkDFn1nArGP6xTdadRQt14RkY1HZtTOPQFcs9utxabssAKgNf+sVpgtcDD
LRAoxSBkOwQ5R74TAn5loayccnaiFmSCgv6KT3AQuHK8MQk2BZd65yRmytfHqGn7io3T4AakU/fF
Fy/OfvTi/cf3p1+d4vPlj86ef/EF8RVrlHuzxNkKoZXr6PT8FH/lFoGl3Ia4H7HK3sap7BcVCZSH
GLrKAubdT6SUOtmBfAce87JTeqidkkN+TQEwAUwIGmjtS5bx3k6Evjjg19s7i3gP78HvaugLg7gh
JBsrNTdYT87hEhwu64EJ9rs2Ii2KKEGT3qj2gQ/TgSGRKb80zYKE2LoV7IkFLb8CnSpnpwvSyEG+
VCATtX4RwH0ANBD1eEDPyAGNJXRfktjuMCUBXWBeEZQFxpK8NBkSqvSTXO0I5n5sbbE8Tio2FLvu
OOlhQ7qDxVxSXdBM4LQ52Lw3iFwyQBxj2B3TV2pPN98SDq0do9RBibFWHhM48pe0S5rlKf7DATtl
XDE9lbAkRnSeZqJBoVEXEreTBfeaBXjQPNf005KbwL9TzomHevZZnnsa+/BPvnrPZURixylZqcx3
LJlP6dJMGzypX8kZ8yxVIgcUhPx7Nmh79eyrwEK6C1UtYtaTHWnJZIfnEcamUfgj1Myl7ikVAvhV
P6uRutCSCb657rPen7LA97bbLe7/r/99+d9f/5fVVKsF/l+3wP+4+J//+T+etVr80y/+z3/7r//p
/3Xt/mTl/96//7cJpVhMwAy+W3Ql6FUWyhqDAc8EYgEygStVmJCZgnC8jFSPscT19NkpfhWu/+X6
lvhLcNEoi0HRdt/yf53fe3f56u3x5vjF373cbm83m6N3P393u709e3MGh3CYcXu3vfz15fWHD/DW
IvP0q+cKRX4EDNyQXaFe8Hn145dPT56C5sPNhzdXb8BBlVJBBlGLib2+A8/TwS3Mam/+cHtxdXFz
e3ty/OT187OTz09CmNOLF3D2Dva6u7m9efvryzc/vQgCMr98sfn86atnz5/ijN/PHn34w82bj1db
L7IlzBOeNITmCls0QYb3MlSJA7ePFHYEH3wibSBK85UFwNVApDMSQhUn+i2/KRtiGXPSvQ9JkGnt
zF8olFHlmiPgp/B5WXQ9yE9hUFYTHBnoFibuSFbE0g4cit9YUNwbiZtDGZWitxj3Ehhf/MVrpJ49
e5Zt+52kY6yTBz1tpnO6g6QAxhWNxXUb5VvBJzN8sG5TMX4PZv7/EoMYv+Z2cUNUzVe1TjTTwkRr
lGpwfy+rRQBqlI6cbgJkbdPPdIbok2GW3Evvrf5ifbOOgQ+zIhmD8Y0wYMiusnW17WM1kdM+jIeY
opzQi4Dn4ajemMLIcxm54RYbaX/Sbawztz8Bi+dcKlRZGTnMXiW6zVRedK2QC/uSHpyJnr/wWcjO
3qohFpm92xnybwG6Is5t1k8kpVXiZz/72SLmK9EhFvjbv/9Hw4HVA3yI2Vba1QKrBfoWADIpGHQI
JHZOZBrS4EJim7ANAI/AD6dvtV0wIQrQr6CLHZ4cSN2ePnt+/Pkx/pAoAc/2GZLeaAo/GMLD3CPq
COiXlW1vwGH7DWrEUllDIF7nvzoHGN4cbV6evhygu7BTuUri/N3F2T+8EtkLiH3+k9fPfvDs/JcX
ry4vmHhxPkQ4b3ZMitasUVdh9frdOf5OPj9+9eNXwG9Gv8z81cVAeQdnNWDw6cVz8H8ChPzjV0j7
7ukvzk5/9fLR5vj8hy+eff7k/MPlq/dvmPiLF7IPTKdFtj5rt4QE249qSYR4y/DFblXYFk5mpWln
N4FhsA01FDTg3H3FLZsd6BemHoA3l/gC/QpjO10kAUP98cceCTh7VSOZGOuKCcHq0FuKg92KgNKf
NqYyqYg4eAEzDze2zOLP1d2mNwezRb2qqFDq/nB9V3Pt7Uw/ahyb/rezKF+t4yLuBqVpxkD1Pr97
f/uu7HNvgf7IBdtx/xiSsWDRlHnaKCPDbivnvnEvBbvNlDO7zq7KkVh5FLvIYUo6v0Z8ReecTdxL
39lCEy47l60s9un7efcNMCF3oq9DoDUZ4daJxJ4HeAk6ze+NsV49Jt4S/rNNIpvbzm0it8heW1Q9
ymAyd6oxeDk8U8uDsbsdoyvYfG+J90AWL14R+XkXJYWUkSOxwJwryf0tsALg+9tuLblaYLXAYAH+
ng3hqQY8Rh0BfjYD5XCXPwmKXI2ZXYOcspJTDOnHA6ASWuMPw+DQM7rxoD9+WpgD8FNqvP0G6Ucb
nAmE9bLcc+sRPMAR/oqg6Nvt8Esz+JqTy7oIKzLy0c/n5uT7J0hfnJ2//etzJJ58/8kAySCtLbB3
0TE9/HJ/+N2HD7/7iNsn8GXjU77fDzcfP9y8jzKnf3l6+fLN9eurt2fkT8RuTXFhuS83+jo6ge8X
Mvzly7fPXlMGfIUFADt54FBwsrkgEoTfFPRYtpUaaMpBylEBpNoOyHafFUq02Mw5qKEEP6u6smc1
+KBSX6BAGrCTBpTfnuqXi60v0znOmTKjrEuFPUNC5dOeIi5k5oQcNz0IUAvums8gA7sKUDH6Txlh
pLt/xEizDIcsQZvjfDdlHj+5n7cIecmotB2F/+nnhB0qUXNX7FoprFcZMBu2opm9lbtLN72kFdqC
IX97a6xjzEkyOygP1DHHaer+AXBitqe1DXqIZKFvJEK2WVPsXhBD/OpEIHd5HqsZjQrYxO9RpdTu
N26os8oZ+LTqVDmtUruciT4TrRA0bU42e+7PE9NwzQwCeFQzJnl6BXdH443bJ+h+Od33alKha8CJ
rtK9dUD/n3jnt4a971N/yBOz0u4ssALgtTesFlgt8HALbAYf3XbAUcgJz6HckmWfKiQMiuywhQ9Q
vkGCEzsh8WkYozSjv7YIab7+l6vb24+3f7hFQqtbDai8W5XBm4oYO312+/W/fI0vWAmMW/pk7PRu
rywOUACZXMIFcQU2G9AXndLg7Gt78/sb/HP+qwvEOZ9+dQaH7QC0wGHz4fcfcPeLvzgFyvriKW49
+njzMbzKT3/w5OkPTpB5iwDub49u/kBWT09Onn7/2cD/6OWPXgL0vvzFy1e/fDVIdGJRjnDEkSYL
bnCQL2T47eXp169Pf/369J/PeMQRxwqQATaxVSEzykEdWYYgc7jLn1j5WmMBMNnDg8pKhGZtWH3F
FU54xx6T+Y1wr9tRzlju8IxMfKI1VdHOo+umASt8QhLJxkkNCwxdJKRXCBc5ccsC+8+6ODH4kAvW
deexGFEcX2UHXlKEqtmKJhvafRi9LR/NTI0+VUH32pUag695JGSabk7GEu0Auqo7huaZW9BMjL3u
N2JbwvAgGouqPl8uJxbmVMVnx5rtiH8CubUoojJ+FrKy+f2gMpiMFMwAKRyDWZwcsVw5DwOcVCsz
K21cRX5MprBlxn5ur4CF0ShtTtszxx8o3Gnh7syjN8ktbk7gz72n0s1RdcU2J+tbPYbDY15qtJVg
5LTDc2kdbX0cnl43xNgsRmmjiT420c+jsbqijvTAtldUEfI5cjjc1zZMdmjHY75zfg5P2V5OvB7z
XEMlebpVzNs+y/v9eSwyotvtKwWnetbQrKPv83iN7yeWz90s69crVd8CKwBee8ZqgdUCD7fAdkBc
YLUh/LAztuAc/o4UeGlA5Z2i+AmXIECRETISovQyTmM5lNM2VLd/uLu8urr853e3twpyLiffCIYV
5Kwa+Udcffn15bvfXD37iy+uz6+ePXnGr1+/0/FLvpJzldto6YojeWOPTUiF04Z8fbtB4PTXH99j
GbA2fPYmz2CIP1R9d/GrN19//Prl6RmW8r780QtQYrlvWPbixQX+brY3F9dvIDxXAm9vlfl6oNm+
+807LCp++9dv3/z0Tcl8fHd1c42fw6sfvb0+vUDB89+++/oPH149eXH9xcX1jy6uf3wplQXqCCMx
VBWYLE5UqCaUSDvb8k5IZQ/g+NN7okGqQaMv8eHvN5qGEwriL2v7fCPvd8WZCB0v7J3JiFFFaczp
I4gK/oQZjUJR3MNiEA+lyoJk0ONSfjm8ymkJRlHFkFAZf5DBNSItAmJv1G7xPKDEXVQqel42TmnQ
7mDXmd3xZeXZMNkS8DxKMwGxZm9lnJwHtZGOsRctI+1tw+rqDQ1HiZvSf1oZE9qNCRrTBC2mrTBz
F1RUNQb2axO5FVpWS3J6KlS4yCQV4g2aKhH8Aga7S4+ZaumgvAX/zsk9Lee0NlzQq5Y8dzaFmS0V
fkHVS0lmH2F1iRqyxp7PAz6MmNg8eWHoGM2dm7L/mC+fAAokNoGiR0zQNsrYizQaJd63eyrsdwnS
VEDRrzJ3qjzDEjnD4zbqcF7aip+CbuzptlKhmqvyPEiMQD5F/SuPMQusm2CtfeNflQXWTbD+rzTn
9/79v/EwY/C8CWKVNbqbEgFrx6+9f4xE3QonC3dp1W6BQwXMiAMdsBHUyt8F+Q+NdnzysJyHhtBm
5Xq5gYQS/JnUFlledFpOgs2s5NU03g6p+LMUdaHgwKq4IsFOuhREJ4IC0sStgM9CUDbW8uZYu/2Z
ol6Q4YJeAmbw9D4+efRYAuQfSIpkKxmUGq9aDENf8zF0xOcgRjGL7GC9infUP72SfAd9jQ/DmANM
dRE3Wez7tTfKhw0lAxsCVYPSl8XArZOCumntGzXcMKwxoXtFMak54NN6IQ2pVHshEBiGLxrHF7NL
iNKzLbGQ2K3GKY9BmMFiF0/OQIpNsALBVons8hqjAYeFAHgwxSH/BmC4d6KYNGw7IJBqKBkI8E8z
ETi/SoQtM7LKBu6qWc0aTJuiJZ7NOaSFSXu/xk0db3kHji79SRKjih7aiw612EA//VSCqvVpPzBn
eEf1HqjcOSc63riyS14yXZo9ll3jRzfLQKsBiod1xd6rb6EK8w0eWgTpbKdq3hLcTco/oMOtyKkT
+09T9JxwXE/3pRl1ZiX3W3r8WjfBmu8wh1Osm2AdbrO1xGqB1QKjFvBstLCT/8prXRs78y0vUMp8
wB45DPnDnImdxiUabxdslEvk7D+duFsgln45uOiUv1AqZXgpDvRJGsS6IiWAMAmnBxk4ILBT1MIb
XB0rPDgJY6kihyHZoPTfIFXkuPbCMPMRhyLPJnEQveElPj7H6b442lcFCd0B8CSaE/SQa58wbHNt
DEzDWmUU3u4Fnxe4KDnxEcruKF1cdiZT1wXZzM02QSZyUAWqg6lNrKkBn7HE/a5AgL/bATnLLGYV
7UtsDwKVJU42alUtJR7eRSAGtDA3mb3gZwsTZrHlB8riPUbDiYwtjlv4BB+1tYGxfdH+m7vyBPyE
D+GTzdMvEGlO5OZ+jKsmB1gzbCfKZjTY5dIqlfGeiwTNWCLaa0kiM2RPGPhnLTIMMI2vNhEitUYY
y5lux1bHsNuEGL12nPL+jQzoXVXrRazwsGmCeCyxa/BsChucr+WRRNUoc92+ddtGzqf17I2qXB1F
U3Vg90kr20LK3KmG3l4q+mww8pDglr+6ciI88xMJ26FY47NdojRQ93XXfTDbR3iiT0aNqVTuk2OT
LEXHwX2di+waNIwcBsxmj9dO7mZ+8NOt1q8++pjvK5771YQWBwQULHm0LX+6dk7vtl3WnE9ngTUE
+tPZcuW0WuDP1wJbYRKDHFxID0iSiBH4B5CJ0K1EwIISP9xGdAQ28AcCL6GgE8BFIEAaNChr6Ih8
gb3Hwr383cetzf+fvf8H0SRJ9kTRHGihHpTwPWghH7SQC0eoCyOUMEJfaKGFEUpooYV5UA/mQT0Y
2Dp7790pOMveEnYhYVdIlrtQu1x2a2GEEs5CCSOUMEIJI5QwQgtHKGGEFo6QwggptJBCCyWM8H72
+5lbWLh7eMSXmf1nZiL48kv/zM3NzczdI/zn5hFBXI3acU1mrgFaEA9UA5gHWQw2IhePidIjtbQh
1hJU22LIJa0qHDKxUu3oVl0GJvEtY/EtlMWfFq9mXSYQaSRUxcFuGL54Mt2aawhQRQApaSyivnie
Fkp8rN3dINIbCG/qwPOW7TFXeq2unEyGKdoMgVIVBxhoo2CzeZWwM2K/Zj4+QoYwQR/W5TFYOIEa
2s29+EYz4RcRr54y7bug4VjZIpwsgfhJnGyeZLv7Rmi2rGFpEVWpHAUhUgkf9ge/e5mW6sZgfz0S
dEAtbGKrAt/UyurVuoY6A4mOkOUZiIKBai85cIrf5ulvLPznCID4qzl3O2kW202OAcTaMn/awmOe
pGoVPskUqR4YJopkSvBEwZh35uJK+1BKLmkn363tXQ9WojI6DYtUY4bKbValf9gYlVYabvFty7Nk
QrilSix3mgEIrPqtIpzaHJsTGTQqayDz6N6b3aV0tVTRIpZoprbnzKvfgnK7PAELq4TEh3PWjV2D
6DMJ1TDp9ZwAZm3CRaVSbVMGJQyRLe0qRm1au/jSpaxi4y6iLl6Vb6VMN5HVFk9FcbUr3TSoc28R
JcZyu/rQGNKuGa1SltY3N617ds88uUvE2bh3KrAqNp4Y1zvxzrHogR0A751j98Dugdt7QHiGmESB
ON+vW9KKtRqABBI7GIMAreKigKYIFONqaDgN/wil7P5bBQwZJ9TWVqMTH9olUICWdHzs9b+QLIQG
yeQUJLM0ROkbAllK+66dzrQdFOU4SpVeF7hLxXJkldFYN1x1aSu16SmUBYjL2KZhbCYM2slXdMLh
nn1Oz04OMFao9WwKVOoSiG9/vxGnCwK9hgNRl6ozQdREH4F5WA1RpFi9Z2QjnrSCOPBNcyyXFIFe
KwtpBViqInM74brd8cv3LUkNmw8hAXBLCf4UK0mgtkLUujvXugQb3Q7Q4SJ4Az+RLsp4QfyUkNIu
uo1ZzL6NXCsXBMO+DMG6/Dlb9LDrA02ogBXHB5VSgzRxxM/uVLINCKhsW1zEIyIDIegGiUAaKpsh
R0up5oIx8eoCFRTPGFLSxpR2JtdWEXLaRFs8un3FHD81ucxTzHZ+LLXlnPBJF0VXbNW8s5pnVwJX
AUPFH5o0iYgNhraBaqKDVJSqA4utLSV6O2uPuGLIX+KsGBZ/ZvdmN7ZNEO0VzZQSi/HYOWTK9obh
VaICY2FgdxWg66WZ3wJ3RRfN2Cw6UjU8cx9Yc2V7Aok1i5wwMeVuYe3ptdySmLBTRlztsFqilM5p
ylRQsxpBqUVirUFuHKxBtMgze6UDL6O3hDnRo/J5IIfri9ob+1L0k+hU41XRPgbO3tbZNc6c+RRa
ZfXOCYoAf09Xk7U++VecvwPgv+LG3U3bPfA9e4BAaPYsJSqQJ0Pavmtxv+sCBSslCZx0zKYUCv2B
qFhfwbcOawWkIROwp8x640pjsggUDSIRMuWLE+jGqTVXgijHqGPvoa50CMnPKPqRzLHLNmAYATBQ
HHY7f3zPPionbWPyZMpgUUDgc+4Q/+lArtbSJNBRJpOLBXYAK5ZLshdoi1MPgVXBXT0B2285Lvja
r+UwBFlqx9KgHuxNqMPNJyyXjW4tSrGiydXygtwlnUspX3eABOLnCUWDIlhLzoy7ZLLgtNElip6f
9imwjhKFyBM495CUKAyZ+F2lB4AqZ1UgzRqi0ajqM5mnraUtvmrh9hoz2qnEVtDIewiZolSMiGrM
BnNlTgu9jnJXaHizUq3fBg2xJSsJXA09iaGduw8a87bR4MrbeQzqxKVWq5w57G8DgNSN94Z1G4fq
OltSb8Zcddf6jFoUWeo57bibN4zW4FZOPgHzCJACKc0SISLXODi3dPtH7wFdLWN3iTBWYSr8udqB
V886Y4Z6tWI4djJzV7ElKxYvCt32PXKMS2VFgL9rd93S238FxXcA/FfQiLsJuwd+cA8goAqMQVAE
QIKLuG7ctW8gE4ZS9TE2BhVtYqQQ68FxqV36iU4Bq2xjMyN4tosYOBDXgxI8NDngwdQKQhTCFUqU
TKXJoMCmBTPJbBTUxcih0gbtIJbCVTy27HpoVNMRYCfoKfh0mAKtDmVpo2B55NqmblTKoK5hMJbV
Nm8kAXoR9QUAvs+fCmP6RP/SKjQTLk++xTdv+vV9xYK1MApl8I0MfReiywGbBEaLyFh4QGWhko5I
y0wGrt17ciBXK+RMeVit6XhSzUfhvkVZTcO6gmhtKjYprARcSml+SKayoEwYVUrpRcEWPT4jPocJ
oFwVW/ATRBWUWLaFLyhIuD7Ez6pp4V7HiIzlEFnMTbuRgRBYIZBi3eb/W1BlCNsyteryiBiwpFtp
i1iqUoFLQ59MyfUKBeGoMLx3qrkmVS0SHpyVI7OE4MyJsFFCujy3z8patc5cbvyj+lK3u3YRb44M
t5P4zX1xG2O7uhEeyPgwQ8eqM+SshTrHuFeFctQRPzVgqzhkJX4R/B+1QhSYf6l3tQP2GDPDED8F
Fd1G6GiAdStvx9jMo8NPm3Mt19C7uLesp7Q9eaqpiuKGS7NKuYOBIbpZD+1v7DlZ8/X1kdWR0TpZ
esa33J7HTnt2Wq1lZ7i1B3YAfGsX7gJ2D+weAGgBRrWDkMZezCtcByKRiYUTlUW4C5hk/EKJZAC2
0QOfDYgC2GDCit22ivjxSVq+NRelDtMTlRwBEsTaB/BMEJpoVmBMt79agpDJ6uLHNtAKGFO4qySY
hypQVhYJUwlcKY1c/EQiABWrMLhITinguQCQBOSGqK9OPn7AqC+edAU/sFJBX9vszdp0u++3wPxn
/FlQn6E1quoYmzqYRUKGZ9MSg71cl4cc4of8hg8O6IaPTNNagByOSonkLexcPmgC24DNVjBVmZD5
QshWEQ30BoJRdL6xwQ+QD+EQy4IeMYZWUIB9w9WAsaBAvciSgaxC6x0y3zoMsijW6FKA5mi7tVrZ
8b/MlFjUJSf40U6OhRx8P2FKmBK9G+0qqGwOZUwmmKMuZeWfN0m3MFJSBvPdQW6LSUKnmG5WYKat
LiNM5apIqJrhQQUOK56sarYoC5T8FlG3IKpLaR1YuW5QKjdYW2o75KCZFS6dehdfA9vtb2NY68HA
0gOjK0pryQyem/S9QZklH+aWUpNV6xG5b0TPWV6ZyoMog6jKuqVRGRa0EWYF3OT2ylDPalUNq6v+
2XahI91dNaXaPZ9VfNUjbXh2qN9d4okVpRieeY0pGiWrnRsuumsMutSjsmXVikM0Vh0iToHNtiFm
p7LuYKzMof7Y+12deZyivkQ53fWj6DnR9LHQOaB0+8mkQOrJfqaqzoE6u/acLG29A+xboI8cODdg
3wHwDZy2F9k9sHug5wE70RMKKuLn1+MDYQk+RDsW1CVQwccQIGceDkqREEoRBUmyGbAk6FJUWeFB
Q0Ek2rWkVKcnFVsIWkICNrOUtvVagoDNWCjBDqpk1REbT9FIgZY8K2KuWaray0+bH0Rx2hUeMMYP
hngt6gsIFo9l9muzo1Dd6AsZ5jcpee21+1uOpIZUkiclQe5Fgj4xMAwFJAHMEgLH6kACbPggIfPB
eUaAGkXoHxTHIoVu93V76cC4z3lyFKpgsypi7zNC+twXQXjJd/5wePGhaQUJp1wjUAK60ZlqbjnE
raOeutVcOwi8myWxXhHkqAo5ASYLlrsDu/Nmq6l5jktxXQdCZFhilaX3c0YpJe5gP1s7+avqaH9q
ppWPoOTpcp4Tm5dSqSprUGMIrLBBLlIpo7q2yKzY2mn9qiu6dY1rl8xVnbO7Qo0uGmkE1r1iqE/F
nKfvXevvoMtt8WrbvrnXbfNDlrE9aneXQ2wOk/KQn1BZ2NUOq9VOAontKknPvVXgOiBZXpuzcr0t
0C4vQ8dtlU6KRAw2NZy3SLKx27WqtZuQOWNO+vRDweMOU5ljl910ai3tMoPW86bJykS6uzbUxcwy
an01s7WiPTPkc0u8/3meOHb87fxHeWAHwEe5a2fePbB7oOcBbW+2gyFEx6hKxKuMMJUsueAxJMK9
zXYt1/t+hVh4+Eo8ihMXOZEwTzjNcBHohHD+KCwpADrAm3gIUH15WO8NJnIWUMchOY7uVLyALt8C
nYmHicGBJWt33fCP4NBmw+AkHTjcQrsM+dqGZ9Yl0yxBe1W7ldK37BKmJQiUIROOlXAuCigWqkde
G9TE92VR0vVKCF+UUnsgf1sXEPRlvkWA+Vgyj1pDOPQR7j31WKuQp1XKLIu3g0GUq3LXsRYsUJxK
ygTvJDTQ6EjgoJk6dAey72HGbxRBpcgNZhDJY9qqalEkkwq4TOrmcDeaFTxq062Hx1vmOypVuIpg
dKdWW6u5Ad+WOdaWefmxVbeQuNIkA8It+GfAczPdrCOVkkcJP4r5WN0SfwtlczcDYwV7RJGAKkil
ggNAcgs145xwfGI77mo5C2UjEh54INanKgeGJ6tE7avhesRsnShKDoqMpc3r7kKsLnHTMkcXErfr
FGTbJHC5V7XrMhVlhB4JaO3ICdUVlO1dC6WW+1K2IJ/JA8aLoROmbm3XGS87uTKhNeooK241hvfC
ix7YAfDeOXYP7B64tQcMcxKq4SHPuvdS25ttyyumbMAwupgAHQnMMFSIpLbLas+q4JCAnN+MyoQx
CLewFkNEoIAfuShCxAsQaK8Ohkw93hnfqJoJ32N8INi+5oOdCEp1O6vgscdFQRRUY659oxYkhKn0
jeIgsnaDu/iJbwJ73X5sFiFBtaHS6b2TT4B+kb42JRUR1ZOozQrqY4Dzkg5UFTATH3mPBvqGYeks
noJ1FQmfdu7R4aCYsZcTsHSIKOWlNqq4ZMBZLUVf+UuPFMgFyMQ3IaiDUpaKR4gpJGsY9czvy3Wx
Qqf0/FSXvErrZkdRyR2i/qP+oLUMORO2wHYKtAM1yoHQDUSUIk42BjWcKqI00wG+pVcjFFx0yDHb
mEl350OxEdFsK/ucM1ARwyBuoDrXowdzB63/soWPdS7n6U6Fo3Q1hwN9lZJrF/P3Q8kVjZWsnNMy
h5lb3Ljm6bZ9V0NJeR9BFUYbT81zn4Ret4QutWUZclQt23Y5UeKzuUfFbtUoMdu/Oh8y7e6MwX6N
aqz1nTNYIRpgMJXqmnzTLlQFIdUl4jwTjTstf5S9xHr4s+mTl29ilUpujTWpbO8As3UHfu/cFX27
OpEOFi9C206LdAeyzQeKFTJHlExkwU7P8et7Zy907u3d9aZYkxLn4nlbbgwl5e2gtInQvz1PMst7
wr4Fuj4f3f3vHQDfvU93ibsH/vY8cO2AxO7aJY4ynAZQSrqhYoJJwC1eSohQcIsvQZEVEc7RJQ1F
DsZlcJGI0Z6DRU6LNxY0GHf52lWEiM6uOoRezg9mHgoUGzjnT6tLuJcM/sZgKhBxSMsQzgSbEsJv
tMKDw5CMNFXV47jsI/SFW3xPT06x5/lwcr9Y4fcnSyeyacOz3WSLf6Dg+4y50CTqVdXIBZEKO/aD
h898N7Jd+4s5ESs2YpYGBuFDCIGxJTxruB1ZgN94uREsKrFfvX3KfAtmwlEFoOwyz1UMky+fmw1+
F7fVDsVKewm3W9vBPzKEzN7EqAIahmKsXQ1tjSgF8JMFsUnblxskhDqgyWxJhRDd+gY+KKUELfW9
ABIiuvw8HRVkjXmnOCJ2kTFMnpWGoDZQUMX0Ws6sxq3SMRccS2nnxC1/nkMrd5VSTakrmUvF21LZ
ikGpbnWZX3PoVkIo1s2qnHOr9lgsvDGkGR2v6qiV3KpPdkvdyo5VLBcT/exbteNqtyltNADtOSvW
Bbb4MFu9Ir+1sYvBZE7VtSqrY7ys+q1plQzAlFlRdF6aQbIEkLwn5HoHOuQRNOwfLnYzfytsMQLP
njODlG0t1aDOFqnjxSHwmfZC98/GQ0Oqhac8mu54XWntpFovZ9xqDO+FRx7YAfDeP3YP7B64tQcc
qBwKSJNAxDZ5oQrEERctowAeR71AMnFJE8IBLLwukU/CWrvITQXKTbbcuzsJArxhvQ6riKbsfmDh
Lh6KOZskSvOLImBbEl77A3bpYPDWoJdEoRRVFbQz9bAhGRue+Zznw5kbZaahlIoAofHAHmMU1UzR
17OpoeNwpGELDMlaCViiChQpdBMLmfgp23WgYDgddDHTV4Z44U9hb9WINNcmLBeigNhVr/xGeCnQ
a8gZDLkiYmmXX/Cq8US7WDVpH7uYISHUw08gVbHJfB5aSnA68bYF87kaEvFw7xL0iWt1SOsFSEus
PsT/0w7t5K2U3Bie3cgGwbedPG2ZTA8m8WFaV84tprYz91Vy8s8WM4Qmq7WvMliHadqxomhw5aOL
cCoxW1za70ELD1KaM6+iOMXTqqigZIi4vQcuqNlzXcWacayyKoqfuHpZi7XeMGPgseyKgVvarFFM
b0nNLuZv/WZnsELd0N/avSfd+seNvvVUk0dEAPvegsVqL62UzCsyOvVN8Wr+nASuntYGCyjRFbtu
F7HIv/0wyRi+3yly++aFkmrIdEfT8jkku+6GY2YvtuaBHQCveWjP3z2we2DdAwQ/giiGOYleLN4I
gCS0pvit8J5CiwX22NblskMVjIpJ2guTRCRe9VfvIBsH8YxQqD0dWpFDwVHIlCbcu6vJil5mK6Rq
aA1ZqpESpJV2ZTsqI9LzI9UoECUMqViiwzMojJ/A89cGek+x4RmBX6hNJT1YWgTa07BP7P1GwJzm
DfAAjqKWqB10KQBQF1oFeAM/UJzsxUdiJQo6hC2hNoTguCxoHz6B2vAD0aaFoPXYLeFVHKzam0Ba
GV/ZB06rFWYXXWpIebnU8DNL6QbmyS6UDYHQKmRCeXxol4C0CRQni/juPhRRLhKnHuD1ZsqiWERP
O/Mnh0Es+NEcrGW2oOAYYCl4a3qUhYZBwuyf73wOiFIl5DXxR6KaolWTyA7ACymRWAWB4GxBaSun
SxlAwQ0z+0nkXcnJSm6RGYa3wFvnh8o5kr/g0gGIqhtu3sptu2+kxPx7Y1fc2Kp+buxyD9YvfLw3
SDjkrHUJ8xJ5tsDRMU8X22yJJ7eenLkh9wq5YnUhJtySBQ0gHB80Jf2XElW7T3CofT1vOU21m8ln
yuf+XzVTmDw/O4U1g74dzmwBm5WaO0GUiHDOGqsay+HSGKGitEsw3ZNb02Td3pKJEV2vutARELp7
Psl9Q7a0FBE1KMoW6HXgvXWo73yLHtgB8N45dg/sHri1BwymCg4RDRrmZEI3/ToRVy/eo4tcvSbX
HikMuKKy+BayApFZdjEg+rWgH8CPOMXApxMbSiKmtZt+mbCbgQmcbOt1gc1A48qy2ClyoVLUCCYI
xwFYRcl2oKxQVsFgJ4e3/+4tPgktE88rKIrPfcR7T04+eXByem1PurKnW5+54dN1nbMBQF8hVQ8F
Q20pIFGXRQHwiE6wZ3fAosbwA70Rrzsiny83OJFY0WXCijNiWgHUSz7YuWBbX3oArEWNKMG6bEcx
6gqoqcULtou1F/TUT7rImowNasFVtCBUPZNGRYJEgQhNZCPSSIAoUZRmQWYk0FhsCxNLlKjlBofH
SLMiUaZwLgsKMBu/0jyMR8VxsCJva+Xal6Y47W69PAeteLpZqnAMlVVdBPdi1qWyMYnMiciqEm7g
Df6tTuizzAG6Hk7xXcYtecbWbdEtJHStPsoVPWVWmzsKdWfbS4271Cfb7roFIYcOdQiu68AMOVCy
mtYLgQQaiYTqGDR3jA7yDKKLXYtaDHZsx59JoA4zbLPUE0TP0CswWJvYrJPCoRrmOVK6PvBj53AC
sW5Iu/owHshruVuwX8B4+bM+T5bXegnXyZOzxJbzg/yfu6IoapQKOc/bcbxspFw1weamaxhXzyGV
jRnDz7NMjVVpN1d0L1l7YAfAe5/YPbB74NYesBO3PrielKid388JsEqi0RntVKzYrmGATwyTEoCU
1+0Yt0cXtefZUKtmIbpK6R5j1qVNyIqgxs2o3JT74JMHF09evHn+5u2/e/X6+auXTy+I3FQRABIT
9rlmWlmqKKfJE/uWI8KpShWp/hifA6O+gL7AvUSGWgtwgVgRQJKxVt2YangPoJQ/HWar9qKhByqB
3CBHcJrS/KfccaZ/823nmSgFuBJhqxIEq3rstloKaY8bc+lBixGOb6GYnCMNoRiLaLXCY86XdA7E
6bLNDgBVp7upJV/8V0VbpEEBHY5SLVwiMehLId7KSIhTVbPF/RAP6fF8acuiKK9RjSui5GT3Fknp
fzvbG8Q9ull5spWnVnmaawrNZ115+jWerknZzlytmgJ2jEvTxPEsuVv2L4jYWncUpbV0XvyoiXLV
mu08OygVCopWPrYHSv0BVqw7eYvrgrKUQAXdrCM7yWC4tebnbt9FzuuDt8IV7ZCRUbJOhxJd6DUw
ttffAhlWibwQdnuE31l9iMbKdiHdws5kUfcsNF4BrE597UJe/8TVertSOK8+tFnKLbZkB2ZYvjQo
giczt4sv6/0695xYHqo0X5cyceTTwjHldt6jPbAD4KNdthfYPbB7YMED17wgBToVF1GcoKUdBZX5
RIGIxZ5EFXAxYFvBQnarqoAc4RbkG7QJOMQqhKi1v45A7vnj84efPHj+j+eP/uOj56+eX10HAFM8
M0s4pXwInLR0imEVMJ9CCD60RZowZIoNzx/jc88iwGYCPpfJM4RehjML4HQ9IRAf6CNsJp80h1a4
ccR3PbVCKRkF/ekEB/NBJKy12sssweLA8JWALov4S6FQCzUxDwsohkqEqdqq7ZiTTvbwLBJg1hqB
2gsR17AFXipt58FeFoyFDL+hF5pDiBzCJRL9tA0CLG782UXgl72gw3Z++8ucwKzWxCGtaFccvjF7
RuujmhzembHXP2K+0p11tdOsmARLUPVzWNWU2QavVsI1g0jLzD8b619juxkmn5qppLbIAW+wbQko
bXSFVJgzj2FbNGjlnY2lxui6hSVrbZDyh4CnhnzZnzdaLtkSORwo33XXGNWHc4KtdmZ+W2zTrN7Q
gXXbftil5M457IHVSsfA9sUlsDYwOG7TzD+wa9i+uSGkWItsgxJG3bL1TU531McJOTdfcuUAt1cq
rS+XJEvXR5mtHZdzha7amTIeTcn/fiGIp0Cnlax1HXaOG3lgB8A3ctteaPfA7oHsAcVC45WtepSR
gKuHQxU/JFwRsLG0GBhXNCKvHECSBi+BcpELOWT76N7pxw+efPnlky+enGKnMUKX2h1t0WOk+UYl
cKKI7jsqm5rODqf37p1dfnN1/tsXKHK4fzh//OzN89eIDCNxOBiyQoj47b9DoNg+p4fTt//u9fnj
C4HA8188x87n0/v3fAs0Hut87/D8y/PXz1++ff727f/+8uTw4XA4O//s2ZtH52++OD//2fnhPjQh
BIUm9qQrvev4suA6mAMDhfECHBbAFpFSB730iUVKVVw48EB8xyomdHdZAtoiAj1e29unHOsyNmsR
YPgZT3vmtx1gABHyS1vY1nEWl28VpDVUTJ21U930xzcXIwxPIq1SOmQXyoIYGoKIn6hFxWWvKqIm
RhHcVb1C0dE9WJHvsUf6LMm/5PKHFNAHFOog17l61j/mipEgarkjdyKZGvMFiFneLAyriUuecFeY
tgtduri3neVX+Dm0iEhFl9KWWpJT297Os+eGb/21Rc5gBj+e3LdKNNVtxJyVpMr/bRuN3T52zlLj
Rg/MHanSPwemlHVELLqaoKNwdm+euyurS4nQVsUjm+f+36JbN5BbDcktcrZ2yCW+Cmtlzyitb12b
KmMjq/FAtOlSIuNJNe4AYVpz26Mc50eLXZdw48BHqeHuALiWc2keJoOVi5leXfdWXVENoWNofj7l
yrdL8HhxxWEVf245xeUO03YhUvwkQ2mmzHaxt+36e/mTHQDvnWD3wO6BW3tA0CwinAonAso60aYB
pADYEMng1/SoYUIgDxUyOGmgCyVEB9KzHbCPPv309PQMAPXRzz4l0AWOInASBouopm45Pvnw4ncv
EfV99uWzN//m5cunLz598BBw6PwX55/+3afnry+evXr26d89PP/yPJAbEPKji0co8u6P75B1ALK9
f4oEfl5dC7CZMuePn3/+4NPXf3z96M2zR797CmR4/rMnn3784PyPL5599dISP33qIBOFtJ3YrnN0
iM1cYY5AIw6a5mFMgj1jPvO7eX3ftYAciNKAQV1Lwzkqq4JnHhJXjFe3RiMoalgXrcD7ri0h7C3n
088OuZEgBI3N4Xr8mPS06pgwmahXIVkIRKUMyzvOLCZMz6+WgbKXRUJhl8nI7XT7Lu3yYD4qknoH
3lPNzuBOkxuRBYYzzhiQG46VgWKmBPVG3WA8w+pF5PH/j8JXMQPLU7EqKFShmmpalidwoewAQiir
nfa1cr4PjHG8e7eW6M74WXiyq/AcRWkduMXt4um6NHeYanaeiwg5tMwZIKmWI+BKFypkQKvxEpQM
+XS20XcXBG5tKufbMnDCIZUfBmNki1jnyahVSmVKmFmtf7XrAiobPmmcDMjqCjOhFswJmdmlRFZ4
dzKwBUjd1aKsT1Ukt2NUEM+mSg3axbHRyStkG0NGnTOf3zb1kaKVQf1q0aHtgb2uiGeASaWsWHZ7
DJzW7VEqmzwYzt700QfazpB9vgTj2ankqBjgooQPN7luZ7qpB3YAfFPP7eV2D+wemC6fAmOMNOIb
kU9dojgPL1cLJhTptUtCoes1s36QiAMMenswrmi6l3jaoqx7hoUM/SKVLkh++fzq66+evHjy+P9+
+vL3L88+Pnv2xTPwnH1yhu+LX56//NVLJHCfsCPzk5Ovvn4nMPzqD6/x/fmDzz//6ef286tXwYPd
zmenKHLy5uprt+KjEwSZTebD5y8/tSoeYF+0ppLC53rotKlqSrvVjgaFx5SFqq122kXMbHFOrgtY
WbhCB5AwmKOUUB9LWXSXabv0Mgyuu7JBU5hXD5dy6Ki2UBTX9OeBesFNIdFAaia7VKPhUC/XJrw5
VITVGeVAITIqmkwUHST6bIBivRYIwU/Vi7KU5s8Yowf8gWRRr+qCJvCt6sK3aqc5vraignKLgLrY
5LHv9ahmwKg7cM7GhNRtwymDqX/LHDZvAQytg44AXXfn3VGlW6Il5JkJWYAQR3nyKGbruGWaO3DM
GDnfsfMD4GWFNDZjvh5ZLWVb+x6lcwyELDv34QAG7Vho43gzBVs00lrdWqRzeJcexBZ8JoprRWy5
caVpMGY3ubyrT25WSAkwvyAxt9oSGGt57uZ0wYhourKXK6nU7kL9UnELuVd6Rc/8m5wYB32gqiJ1
J+/thTKtfMkDZXFkU6PvTDf1wA6Ab+q5vdzugd0Dkwdw0RJA4iZkew0SDoIlC+cyrOfbewhI7CnQ
hFu62hlCI1rzmCSRkkWAg/Pk7Vdvr765wuftV+/4PC2FkZEQrCLIgVh7xLTti8YO5wdnD66vL7++
NODHi8qHyz9dIn3+24tH//FLfh4lOERlABC/uX739btHDx89evj5u6+/urq6np7CdTi7vDYJjz75
lFUbmL/k3cXn718+evv00e+ePXrzmPejKmYCmcglOrUD8g+lRiSQhW/oT5yGkK+FOu3a5zMAbUK2
Cz/YTLWyeZjo0TEn5TgoJcrVA7QVCsYh9Os7kKWAkLkCuUwIMBudnlSLKHYqUG0JGiKrhTlNVZpj
8gUvA1sigZ8i6qM0WlmSlb50nwQ6NVFFiPcH1CIlpa0OJOA0GutE2mi6Fa9qQ7WsMKOopL8bqYiJ
/1ugVCrUTq22UEJAOxtenR8vQd8IWWT80AZnlibWA4jSZq0q2bj1uyWsotCBT6wPla3vVeKoUkdh
PO+7C/WGSrfsS4tOH6K1KQgc5TPuVdlpzXFTy477eTXRz8w38GqlUN+HYw9AhFBWL8A43pu61Jeq
blaF+1CqDgAS+ciW2nttEyw1Snd1Y+0Udyz2q4KlKt6Ct5nY1R6oJtCRgXp0vC2JDSfqgds39ewl
pla9bFGUmiPhW9W4F76FB3YAfAvn7UV3D+wemK5VhGGAvrh8631FBk4AdBXLxcFv3RJsDEAjB+M3
Br06CFCKUFBROysFCRL14er68tXv3rx68+rq+mveXYyymijwVlv+N2YR7f3A97DhGffuXvzq+ddX
X1+8OccGYEBfYNpnXzwtN/2+JaziIZhkievX794iaIzP66/e4Lbfk7Mz57l3cv5Pr95dvX/64NHb
Rxdvf36BWs//+BqUZz998vbRy7dfvHj75etyq7M8gA8O2CUESCUn3Kt4r77Bc0aEqdouJ2jqSBWu
k7b4hskCeHDamcNd+EHoFzkW++XH0SOsuwoD/VHVca+yvVtIehLN2uWZ/D5TJzw29dQ6QvU62BB6
S5MjeaQlqgi0xFnBwOQ34CpRoKNgFOcqgDUEePgiaF8vKA2ttQCtLziQVidRwyEBmZAs9WCUvKTq
kFBu7zhyZr9xvus+WgM85sc5T0wuY3dcToA/x5Q0UW4pIkr4UiSn7w1SfyRwt6tGzLNd/9J8catk
129eqtxOWSGNmQMXeLJbtvgnsHROVPV2+1K011IXiobbhBUDKeVEIL0M+YT9WoqNrwJOBoOFWVug
VNsng1I5uW7r1GW3DsPQKuOTLp4MzB8YsgtpQoe248XOZ+5rNVtutAW648bK7YEPM7LtRu8HsDM5
s7tksHReirNKBYMXgWXbA1V17lSyqKK0PCpYBE47n21W4N0v0Pg4UZ1mt47uyp+twqFe2Ngk4mzj
bk+Nu7gCkhprT96JB35yfX0NQf/1v7/6989/fScSdyG7B35AD/yHi//yr//+SavA//jN//y3//Cv
fkDF/rqr/sn/+v9kiO6a30C2+ACLloii3woL6FIinAruWdxPkWErVtK4BDIIiRtW/YZhPGO5hAC1
qdhDzbqCHgiYhRtZr0dQJROHros5zSJBsQuYaqeGhuiQ/nByH282Aswm3QEqqgOmChDFQCsnOYSF
yIUCqhGfqAW5KIVvUEIrESGZpcwQzTszTgs5mSgFqL/VBduFCSFcP7GmwBUEB6W0RY+ttv3nMpxm
xpZgW4NQYzEqq1cZKerrwJjaWvGwRf6UKNUlkytvi44jqivyZ0QqqfiwO0TNQReFBNnr9SqtzgAe
cdKB8fhox+3qaZOoi797BsaHDx8eG9Fi1Tc/qsniWFA3IBbEFhVk/CDJLeXmqh9f8nurfUtFXefA
psrJFaZdKpULDtyeMd5R/juqnxwluWaOqXwLnG4lty68pXMuQeJNCH9V2xxOFHOA/MAeFaXCbKtV
9BjyOL1jAzMAzs3n15Fio50S5ysamw3JraZ0mLM9MattqRUy0522QuXzJbU3uyQx5gWU8YLRNulV
V9FJ5l/+y3+5rfTOdYQH/tN//m+CA3sE+Aiv7ay7B3YPLHjgegqv2cUAP3EcCrM2oIII5IaD8V6D
ZOXabGCKKNcRIH4K45UrN/PLAZitHwoVFlFGIQyuAxQQBf4oH1qJUypJW2oIBAUM//Gpfe6jHCGW
bpTN/AZ9oYmkMZo9HagrxAr+kSfZwFAno+UmE9gMbGV1QGXt+lqJTXoqSqOnZzv6RZpilBWuVqVT
HAMchJozZcqCepigtQBfEYB6gsf4R2/7Qbod8nB4QK5GLaBcJ7qWDyBZPgk2eYDFpwB4o5KVgrRc
MKNf6ECx08Zp6cNw8dLhvgqnLSSq4gOBiXNLhLDlqSDZUbP/VeYtobllZ902Z0vt3ydPa8+W2pe8
sOp8Fcxx5iXKRlEzTXJUSukqTtWlhIgYCLdt5JXyXQ+P3d6NTFbVrIy1jBVVMiOxcFdGwmKL4N68
vlB4NVGtWGUxldWDuF9tXXv+qRYyclvnJq6vjDOrxr1u0Apj51vuRvWqRu2eZtuA/Nyo1qu5jWJj
RZXINa/3peCOdYc1rQanGqhX6Vyh9O94RP5Ni98B8N908+/G7x64Gw8oNggkZlsHkSgboQ2TICCJ
oBzhmaK+2mRrO2wZcrS7ecGv6LHCrXyMlt3oWwKqflOrChI/2zUe30z4TlcBJEG7gJ3ILvDSEVop
5UiMAElAGpex+x9sz/Mn907waCtDp0LUyI1aOHn6cEmoKfAJPkQ1pZKqUxUCdSzrj3ESXVbDTALR
ci/xpLb5SmAYYiUNB+SgLsaZdcesz9uISP2lRwx+Orxk7b7EAHBIsOqbzCGK/nEdqMn0GCowU0+/
uVrglmUV7zXFUBHSRazvLgZD4fEEKmVb+IKINKerTaD8xg6g7cr+xC/W4kFdVEFVY4+A3y0cTUx/
uiaQDGkqCyLD135/MjQpogKoyznV3CUoOcEGmI7hPDLYtqCpvOqPgjn01wYrKsliFlsbPcj6btck
RHWLrwx1phQAAP/0SURBVE73Kz+t/mxDncdSFOEZ+E06VDxBrDRcWo/IDuyKkpzcHNEu7ey2O99d
1WTFmd0puE4RgeKqRAaBIb3t23wxaRi4pEYXPm1E8l23H9XZFisKD0jv7IGghEldYNkb7BkNtuN0
TFGP7fNQgZktXUqvjaZ2qazIGH64clctvWnULLVCN6vbN0xCu46w1Cfb7srzMPY5u/DSoEHxRHl9
bnVWrLwdGg5A5sZO2989NF91clExglLDubfT66kHKyArY3/PvqkHdgB8U8/t5XYP7B6Ypg7ARQRR
CtPpPUaGbbgn2QDUgeAE32TQvcFg+1YghPxgi+27EmVEwmmJ0uORBWmEsR3qMCFwJbBthwCPIFnC
Xa4GGCiND7Ky9P2Tk48fnHxyMOjrj00SNiMUNB7ozLfp2q22ZwWSsRb7KdOI5SbQS8l2EICZ+aiO
/nGEJg9KQ64g4PCbYJE6K9JID1xnNvLxzqYMTL4sfpMoMKMiqEFsb34mg9dySURqvjPdLIINZeg9
8y3t9duAUQtEac1CkuVMfNMKD+lLgryttITL5yziqFUFpZ4WC2S4EDKIUVy1UEMzQVkUZZoXxG6N
wiIuk8qra3mkWpSikouSM6VAOTQ16c6AE9edJyMQIckDpJoBVRvHqIoPpq3iPCqeUzFrTrkkZ3X6
mBlietpaFxZFdRUKDQUEO7NPgpL9UNUV3hZzdmBLCeaYXm+ZrQoqrwSU1tr9Jl1uCegG4s3QVz0/
lntaVIyHGDd3RLdadc3c0s3Gnuw2+k18slTGlxGLE+YApn9OmIuqwHA1OtrOqb7UH8JjZKt6q5WO
9iQW6i3B3Q3rd5V6+YyRrW9bpz3zOH9VadsDRfELFgtF07SvaEoU93961HYMuo2jL1s0Gq1ZN5UJ
Sqs2c7Nu/b5EG1vQrk5yl/18l9XzwA6A936xe2D3wK09YHiVH5tICfDE5YHwSW+1sXtKhWG4Kux4
RoFBoSyAE4EiYU6iLzwNSxcYR1a4MOgjvK25uEAdg34+O1dWgVgO3ihk2oJLTfC+4o/xOTs5EPGi
XgtEU5kJi8ocvFlXqlIB35RboJqDtOuiHrXyvdxnhGGoC5Kh4cFUthcdiZmWimJmyjolSBcE1YoA
FJA37MP1BcPAZPdDGFsLEJpVCK9Smh6G7EfESwsmVNt5QBhMp9Qqzbom70EsciEWHyUgVt84lFYT
RBuharU1BMIPBYebfEiQ1SGKenqjU5QK2lG0VUVmIIvLZDuKGtON0CqIXJSlUTq8XzVTmciKOVnL
LMoxx2CufxRUaOtU8VUhS8AYZbdnDeJCXWdUM7lcfOC8CNG0PBktV7nt/PWoeeQWB2pW3Z3oVzPv
Ch5EG1VK1tP0FoPl7loZXHXgtt9WKzuV8LZ4t1cf2c+rdQf1rqrVBhTxHzVYfCzHoI5Ea353qSuI
FbyEnJay3GurppQV4/Gy0j9zewUgzOeuDCwrhLZkFOVsGe9h6BLQzT3ZIrEVLi3oTnJmDRpqh4GV
IcecV8Vb9brc3wLPh9SWUgnp1O8X05Jjs5oC2quEWFLPWR0RgzPP8Z7YS2z1wA6At3pq59s9sHtg
0QOOkRSvI7Cxs78gjQAP6bxOFego/ECib69l7M6vJYF2UikXVYpYRapCx3WRj7LCXS29sDn8/nBy
APTF7b4I/AqSCfoSRZcwl4VYv5Xi1MqR2KHAdemg2hO4cmMFRAV9yaDroj05GUeYKVUvp91i9oqg
An0FO823lyUKzdUEC9VCjXARVYrnOVspUAL0Snn5HykUh2KwlAAyHiXlDUcHCv5N8kGUNBgrc7KT
syYyBxQd4KduM0hMaVNLIS1O+YRrHxN/FBdajvYtwNi7EE3zzqZKS2cwOuxFWajBI0+5iqKd/963
U05QNkooRbdMOiueLbPnmDzl0OXAoO8na/uUbhyxCQ9UAgNadDFGt1SA6jYRPhm00ZLfjkJ3bRvV
lAHiavtb2xW7PFA9g9ij+u0a8wDCZUDY7Q9LLZJdvWXUzIazn7Xm2FXmZ9+OUX2bu8C/vcOsLq/0
Tz5B7bbsQM92JSUxb1HmuKWu+XnS3NLtOeU9t94ho7GqLpp90RsRLaREiQqoD8Z7ZN3kZDhw7MLi
Qq7FPD8cU+0q3k2U3Mts8MAOgDc4aWfZPbB7YOwBW/3VBQ944+A7V/MWaAtCIhcQl6hMN6Pa2494
A7A/+hjgDQxEaIj6Am0qWAqCR00ZCrYDMEbxQ9RFCR48LLU79hY0FV4CJ+QTPunu1tMPJ588OPkY
T3sGEaCIbApFmj60BcoY9BVqQnEhwOvpRTuujFTCcVlAF6rDAf1RUBgsw7bgL/BMm7cj4ipNfOcw
oCDBKp65pc3J4LQ4MBggHMrQtLgPVm8JsgP3UctLgnzkdPOVAAUy+W0K6Fsf1uVwmuZ7vFeuwHck
onboLz8T8LtWqBfpM5Y6c9cFRDcdQnPwqDgNnDaAFVHGrOUD6Mm6fKkCLSIeGSiQj58UZQZypcBg
P9OxSCGobNXFsktKMGeCDZmnzdpOEefmYyVARDkVT8Z+S3BaPIpQVfgtZ0nNihLRuXFCZbvwIMIv
VRwmM0dW1BIC22nuRk0yZg7dqln+Ft2kwF0uNwzA2Npse+qlGfhV3bUCftHzUXgN365uc2jn6wNK
dxVDfSz3lnb9YvOI2cYorw4hogtabpqMr/JQagdXt+N1R8ei9i0IVHNn2JmbcrVZl/3UDsPBWF7K
Ct/OzgBtx/P1ymKLxFXGts00jyer84zX0bZ1i8Rl19l5IVHyJaPqQiXLO3m7BTrUbjZs53NanF6O
1nkvcKQHdgB8pMN29t0DuwdaDzjWDShrFyQP9hqmisAjIBno1wZCbGMz97jqBmDDM4RqsYPaLvDg
BLzhhUeICNuVDZcCxoAZFIJGf88wmPET3+RxnCP4J0wLOo4rQ7x40hXu9TUEDlSGqvHNQorWCizZ
f1ZqeEzQnUYZFJQo1RgJ2pWJCjl6VJlifSsy8ZukRfRYqNvvwi22A7npdb5CpFpoEDSlO0qYmmg2
XlnksWuU4nKD781GQmgQZelYPTFLCxNaHTCBSECUJOMDTvALLZPBYTmJlhVWJ3NcQ2vsMpuRKIFY
VMFFEDuoVYjSA8B8yQAJ5FIN41dd1MHFajECVkg4v9WXXG01uiQUsX6LOCVpiuMdbJ5gTj8rZkJt
QjIrKJIpErt8HAUnJKYqUqHBHOuosjL20/RxKeYTk0tVNwithEoBsDOl0raNw2RYHk5qZ4RL6wJj
77UqyZZcqlKpAmy53bJPwsZKAeeZz6SNZz6nj5tsvU8GPKvgwaDjLWWpQ+aJu3TtgYq1vtnP765x
iLWbVS0fqFGCs10TmbmUareU2qJAKWFsRQG9hY5dMNlDnrkjqf9ER1oaQbkPt7209mxunegMYUtQ
wqjMUyE0WtqOly2Upd7eDooZhf2tvm9caJC6Rf93SjZWTXDTzhl9qcKT0anaxGKfbzUJChO25VsJ
XUPjSV2J4sLTQ7C8q5dHdqn47BRU+tt6J7nZcN1LJQ/sAHjvDrsHdg/c2gN+0WKoLVamfauwXx6s
Dp3cDachwBuVEs9Mh3CXjpL2x1+Bcl3kxCRSgnIpoUrgJSoTB9IGfc/8dl+U0CXN8BhxuHQynMmw
c9x5O1MPqK97wKhQG/XyrU558uSzKxb3Czw01AFisSLe0wuYbToA0eGfoCx187KoDsVVo4xFWoYH
EQkYRY9NBxWwxyMT4vpNv+ABwieTy2cpPVcsDoeLyMrezsLBTFG+DEHdhE6nXfGyF2xgjraD/iAK
Xcsb+DChprejeD63qfCzMLyeDWYYWLAfFHrYwDO10l3HqjMfc3ySnECmaibUlJ54lOWdvPDFrHqm
dleKEbdMTCuewA8xZwrKElBURdU0saK0Kq4yVEXGc7gB1NnohKxPhbVaTLtkTqVGsGXE0rrrOMq8
6X3GnHrLzN7cYaIvrSaO6tKLve/ojNncvZTeOHfPqEnpbsHaORojMWbbYZXPutXQDnCVUVYYnZlb
DJYo7drH0Y5rC+Taq8vWQPqSgSjip2vC0bid50hFq2G1WnpCg/MHy01ntrQFemrZbefG1drHXai7
NrFFZpdnBuPn6zKzFS42hPs/2OZ9aSa/vRjdWMW94JoHdgC85qE9f/fA7oFVD2jfssNITGSuWYJI
DNjDNjMLrwLUgZOIRXdyGi7CT4IT37+KsiyundIeARYWYhGP7hJTeaxPkEmVBnZCmuhRm37t1b64
3feB3fR7H4iXujlWPLA6amilGYQ0KHVZGJAGlAIbvsGB76gr5ChLcEsoSKUE+PVTILaEbf15VJRg
zikQ1+K9+Fx66MbS+GDOh0plHYoUd3kCHuBhNxvLCaiUH3/WFMqylOmGBLxHE8w/MpZR2ekWYmpl
r6oKS8FJAyf4CutkvmrEIS/pKEoq+ho39MZCg5eSaQDkqAtV0GNuphLUyp0Jc7TIojC46iKDOZAA
WLc9exweblEadBZE417iZzmqiReEVGsW1axU8+YKoozxs6q6Gc+k6KbUFri7CmIr6Bg4sJoK58BF
zgr+JXybmTNPjqHJWnF2wcYSdhpoEh7sIv8KIQw8uaklui3elrxZr+iWij6JWiq0HJSc2GrGCl/2
W4uyxqHCaN+lphnVrZFYDc+Kkod5Xt0LtgHKLWVbBNgutcRYqCzqws4Mw2YGdkFgPh2JewkrLgGn
Bfq4saox0i4StaN7sbHk7XbpYYmST8JH9tJYRtkI+NfZBv5XVmibE1K75/nucls+9R274nCkh3b2
mQd2ALx3iN0Duwdu7QE9e9n2BuMAzCDYAww2NEJUBuBxD7lEnhZ+xOUBqIYA1fAeAYy9XqiEJa0U
sZCeO+XvuSFG8t2twlfXrBHfqAiUggOdDq0Ots/5Y9zxiydd8YHSjrQZocXHAWGZTtmjpxQdBUXw
CbWAD/KhTzHQHUaL7GDVDn1RBU0z8Ami2UBsRhvx7CtRtECuECUqNaKANzGnbXWGGviJXPyUJ/GB
WGoVT6IyVekWv2uXpdwnsAUFT1kvNJSXiAO1qduaA99cIFARtZepJHvPWJH8QE5fFJDzkaVvctqB
bzkEB91lqxvM1d3I/qgtVYdDZUul5nlKMN1QVurJ/zzUKD6/Bz0MV0PoW0se4ofakMkGNU9+OPnT
9ckVPe/SiiIVJabXgwSK5LldzLBjtldR5lV1JrK9qW13nlrN87posOXZSFFMbzszzOrinAADqwlI
iAl3i88zpYtGWoheebqFJd+pA6feFXpkoLXaTzI8W+pLAx51y9xvRdGxBJMql23+qdbJTRCUNksN
LdntUoXoY8w86SUbA0SF1RWltbpdKdCpQAcTpltJaCuvDYo2wdNmjBclwrR2QacLfmaeHgDy3OKh
bcaKgcdCYns+Ge6FrlamYoxki0L29MxnKmbMSwn4jY3im6KrhotTaLfhFvphu4YlJat+WJWOBopu
FibX9bTDpFBm7x9mX5peRJw3RbMveUdqtkBPtzzEFuh75aEM+ZVjdz1aF9z5t0veAfDfbtvvlu8e
uDMP6KlFhsRwIQTWVSwOVz5F6gjANPXBNUPozqYK+GNsVgxO0SyNpSJ32i5bSjl+RRlw4vua/MA/
lKkNt/fxal98EPs9O7mv4CcQHQG5Tw6oEhT+lugIv/QiYgOoyECC0jzwKxjG3GnTcql9EosqgMSA
fsO7lCNUZgAPR1EgAuOGcukxf8sR3RU/HQFKn3AmatGMDXVBIL4Jod0hoKMuNoHDV7kOClOCKYOf
gpHKElHagl5yAXqntQAUB4P44W3oULSKWKtyfc9zJMQmmXS7VgE8YCuXgods4NKmZQ+hk90mlzBT
Nqot6AFvfRb3W4vJYFOrkAlV751cfzi5umdtrWN5ltMHDNWE21QqU/CYVS9RSp3H/m+naC1WbLFE
l6cCigOeVsmbCbQ2ngOeVs4WwNPyHOXGNloVrpCcm1l3hAMzvlK66jBHUTJMauVUffu7nEO3Kws2
Gstu20F4rQuDoy1WE9H6VkUL83LnqHKFstYG/swEMjvAmyfCfPUEId4KBreUUdfN/UR8lf6xehJS
BksbAzPTwBwPpUWIuNCBZ5BP+FD71VPCz73ZtKpRxm2a+piU755Duv2w7Xh981sFCqXuG+2bn6pn
XxXT3A9Lw7Pbjmt+OOo0uDO3HtgB8N4rdg/sHri1ByZIKYzD0J+gDsCwHUzbWV6UIIICTuIZldJu
aoeIwkvp8G3PKqUDDJEWhUDrwD3PtuFZcI50uyTj++A/bU+sakC9glgqDoZIiwImUaJS6QDYyUBl
PCPKJ7hAXFKMMVgcusL5248gHwyCoMSf9iku0ozB72iNSiFKaYp1i0Kr4iXD3qGwNAywLbQGbcWM
RNgIZYrwWBrwJQAILAFVr13+QRFkFcdOgVwQZVpUAWYdqgI/oZWIRW0lBOYd0NKxXgWaTBqCTSsL
5FcVTi+VuN+kIRmNjWHwP+HO8w91ZynlVv5Xs0nNpKtjbWJddGaxm85cN+p7G7YK2q1vFGympKq9
mj1vkZNL5eIKSi9Ox4fWDkrdTOBxvt3S0C3PgNJWP6his67dpZZuO4bIvFNAxBxaz/A4N9/GbrCo
uM6WPE25zn5qLSVibLaDtBqh7YCNWkvWAKuvujYsDVS8WmSRIQAnOFq7lgFbJXC8PJEHfhQ8arVi
qi73Sam3vZfe2vndcb1laWamv9QIcB4dL/XAjr29Jswjpd1+ks9sWyH6zXvSXnLywA6A996we2D3
wK094A9VAlKKmJ6mKbzpV5gztkmDjoc56wFLBsaIo4BbdOewNhLjMVR2mQFFGAmJBP8m+ERE5JCV
CQgE9P0E254R9WV4OZ5p/NHl20cXb39+4VD8wyXRLxGUKYPvy1IXiJKMQxALaarn1ZFf8UaPOpJi
hkgIlfEwOCm+LxrGMoapncnadYyE7DVbtSecDnHDIUqaSKzKol7h5NAKCeijuoCQhVoZCA24aKXO
3ByPjqoVKFZmekhWTSM6PhCrdFCQAL9qVxX4gAJcfTa1uBcvmkf0WE97jrqEqK3DMMZrKqmuQMXw
WxxUcmY4HIJmEpEa+k8SzVEfTi6vTv5EHT8uctp4S9TQDcXkeY+m4O2UaECB8DJx7yeq2vPs/Nah
gJiBRSXbKS0QlZAW7WThqb2cuYuHq4hZSM4wSfPyuwKrWwDYFh43cBW7Vngsz6qP7ULVzLtbXGod
32Fak1uKmqBaH8nEaKk8jw9iFYqPLpS7yornNYIyAsxjSoJaSuWQ+ej2oGXyW1By5wzluwlhmGqZ
Ji8BLPbePMwz1gpbosOEFWFgl6J1gSy2WYpSI1YjVM0Rg7oay55FDRejoDn4iSuvmLXDS4m24YYd
ddAZohXymaFKy4SbLGHkbsb+Nj3zOfY56w0RC/ucI0t9yRWLRAyi5inQZte87dpm2il35YEdAN+V
J3c5uwf+hj2Am1QNLwHDCHBq1xMBiaFCbXZFLuGNBR6VJmQCBPU5zUEXLCPazbra3kbko/e42pGx
qDCnqsb31cnh7OSTU3vF0X284ujk87MHLz9//uaL129+fn7x6TNiP9VwbSoBc1p0lFDcJAjvSb4S
1wXUoQzSpToPUANcfXj75Yu3X7xwkPzRPaTffvG6WEGZZuxZCUKyRr+blx7wx01fcq5A3GtayQ/Q
VpDy0n450oZbCuqGb7WsIFRpCQg3d0/P0JKBhgxLQWNG1XTXhGZBFHqUM9lA7nlZDWXkARxokVCM
reNOY8JC0KhL8lWWKsXygU/OIku5rE5rH7pzeLbpmgw2LQDQRZb4qYyjaGlLh9ghk8FGn+D7W6Jf
Hd+WRAtdSk4nWDFmzvEZ02o+TY8ASIWrWzwcCiBxPIbJpat0CyBvT6ngUK6xml63dXWDHiHhDuFu
65MtQHoLj0vurpUor5slYnSY3MoZHmQeSbtZdx30ic1ZFeTLSydLoS3RlwDMEesLm5VcZGzhhCjF
8zPIwaygzJAeC2VXqJeqJ+dEO/RGulUdYNBzAh5v9Mm2E0i3LRZPDkKD+b6GTJnf7KpO7mg8b4GO
IVAt6Czb1S6dhA6x6DDobxsd1mHLnSR1gOgJ9XIAx2nt0i0jt9Q9W465ud57yU0e2AHwJjftTLsH
dg+MPFDu+zIeIA5ADmElXg887fCmzORitgdOwb9p66xKCiMB2wAXXccFoiDhUIc1HYB78Zgr3vdr
z1s6eXT2+fOHT68+XD159/zxH84vv72c9NdLfaWbXZyI2/1AdTpYr6shZfBTyhBtTlup8fOMGoaS
U1VJGnK1MI9vIHDCXWFsfwaylCnEwHjTQ6TBrFAn9dE9sSYB2C/mx3SaNJyUR4r40GBhKeuaiA25
wuo65HkcXJvQYdqyRklwaZCpNGpEvdTNioAon0gOylJJ/MyRBwfJoAv6gg0HS+nB0RNRaWQd0lIF
C8oDuS5r1sIppHEfbEU2esidHN11+oyEY57dnecF+pXHtsxuW54tpe7E2LsWcgTCvOuq70DeFrcv
4a5cfUZiGS1n6BKLKS2e6fbAbeYNwmJLWe2aRaao2kCDsTiSwcCWWNwoUtoOGY0dHXFBqRyln7nJ
Gkpb6dg/S6Cx9n2LfOZvxOksclXKh8nZdpmTTc6UgtJzIHG84tAaq6YMc9qw8GIv65nszNmWUDgl
Vvtka0W7+tCuWWwbEHOu9oScKdXwXzp7s63DdTkx6G830XYvc1MP7AD4pp7by+0e2D0QHjDwg1gu
4q7YyUwwAyzjwV6l8SfshNwCh6wIKEAvgk+44iItoIXjuiAio5x+fPrki2dPvnhyijt7fXMsbye2
9xuV231tkxVzP7p6/HefQ8TLr99cc3n+5R/fnGDPs44/Xx/uHc4/e/rmy4s3v7g4/+z5wQDSvbe/
ePn2F6/e/uIFiC9+fv7gYMFhEl/w++L1ly8f/d2nJTSNItAwjgCNRnn76OXbR4gG4/vi5WfPzg4P
CuQGrhPaP3gUWk941pOZ7YBYHGTwoCvp4jFUfFZuky5+sGxGbt11hI4OJgVckQseJBgH9gOIFHSY
AMkErlPINIAumNlwOHw+hFrArKptoaHAUbUamg+5kMxK49VHkgDDbf+YzMS3LGJBdQ+P5MuT6g9Q
L6qQhjhkHb4V1qb+Hj+PZQXNjCkTncQ2BbAElkgkcnzkWXXF2WZVEyDN86oZasy5Ja2aC66p4/kZ
XYvUUrqiFl4EWkW6fLpGzat5W1C+i8RG61fYNqPBOwg/VgA12jQnog+oudVYGR5EPxExVkliet1S
otGrROuaFi3PeZZim5mr4smz9grWKmBYhQ0DA4fMLoCRT/r6ZHepq1eU8Fs4OScqt8x9kkNt8YRn
IVIL58Yzn3neU4C3Ski8strx4i3eNJm7sdtAuSe0/bnC/7J0CTAX3SofdKHXKmisSs342Uudon3O
opSdz36Oqjp5z/wtfbLt6dEKq5Yule3Q5di2v0ntOOtmnuZRz1OovNkCPQ2E4ofb2H6EXTvr3AM7
AN57xO6B3QO39oA2FdtToBl8sx3RmtJdm2i7KBLt2OlePNrRes0HYuHRRARj00ZZSLBiBQ0ekPXo
089PPwYMPnv06ZcemQTStsAv3u57Vu71pTQ7zk6Rix/fEnV/S9n+liaTfP7Z409PH55/9fLZ7198
evrg/GePocCj3z579NvH+H72+4sHh7Pnnz4NtHT+1asnv39++Oje05+idhplCM2q4HHJ2Ga4UTqc
PP+ni+f/9Ors/umzh4/L3l3eFO2vOwIGJkr0ULCZWYArsZ8/W8smXnx/kigCsXKXIrRIIDLMSLLx
KFecDJwKN/o7clmFXp5kWJro0VcNJEqtBlEwSgYWxRwho7FQFh/Q8aEoqZof3eytSWX0sDGzgpJd
LH4KwbK41kf8Vc+yjlZosUAQ1w55T2IZD/dgr8yEVhBFnW37vXAviB9O/o5kiAQGXj3yPLtirrIq
rBuoxoxNyAc/M+AJPJwTLWRSKR2DRGjYTpqVlV9/kngCAwRW6VPk97zvscT6JH41axA87IMiih1M
CjtT9uWpZNWAo+BzF3V0O0DV7lVzS84ST+CWNqFS+TiqA1Q9YQ0GV5apKasWaXFvbu6lGJeab2kZ
ZVbFgpIZoLZ6zighIRLEYH4sJGL1x9jIk9eD9G6bDHoF79WTs5cypVoCWFG7za7wVe4MlY1LI73Y
ckSf72lZLXCIpR+hJQgMVO+tll4ONK3sSIpPDJp+PnTW+FSQu1l3PeIO1ryqIZnxvLKqhz+XhjCH
bLmaNOaPTlNHd6y9QN8DOwDee8bugd0Dt/aAx28hB/ADd/AeeKljdM4PoSMcoBAJ+3OwSDGIIniD
b35MQqBBJApdQAqvFEZ4FqFgxH6BcHTXsYlFQYBhu7heAVtCG8gxkEl05I9NAvnDGe4WPjm5+OzZ
y58/R+LBxw8gFNHdVwjb/uLFy5+fW1ncSFy2gX119f5qmhIpZC1zeODlRsLzjiCFwU7eX6HYeyTO
7oOBCNnedcwrIjC/v84H6qIgvmmCf4MCIaJLsilcosfBCR4VweoDEixlN1ejLkJrD6Uyy++ppkx/
wBWQpwCz1iNwsIhPtlQ1iRYihtXkdDbWK9AbwWHXFlkyB+qBn6VMJojUxA2XzrRFTWPo97Jogix8
5Gd1AGouG2MvtL9cShrKXjlH0BoYWOj68uSTM9MBvQX55ejGQ6bsLamleXaFZmPCZBapHe8uAZmV
wKDkhMw5HhR13TCYn23xajuZbhulP+Em36i4Hk6TeNLKVKkkAyTRwoGhx5JL85rFxnasGj03RMbA
UiOYt3S/MU/pnNs9OV6qkJzgabFfUOT/jBiD0m2+xQYNh4TTBosUOatFxcf0/AyZuvgqgFZORGs4
+F8D4d7xogfm1oyzRHTOpV663AcGod22oZeG1UDIrOZqTOWznNKEyrNEjNOMojVyW8p8UOcOUy1M
tEsV1Rmpj4erzjMY2gsOb5eKumtAufRgYN5+9O8SVj2wA+BVF+0Muwd2D2zzgM0wBJB0sSIwy9dv
Uv0RWb4vV4E7Yq2CIVn4eooTEuC9/erN1TdXV9fXb79+B1x78vEpoW+Z0EeihJFf//MbSHn64NHh
o9N79w5PHz4psUGTfvnNJb4RAWbU9wm+UcXTh18C9D79/fNn786LDQUE5slTijO8v/4anJ8TXH1+
9gjpr0Epl9KHHx8eGrQ+ubpW3Fs2MuQ7ewgnEFo6DFLOAbYDS/JMEzvOEjz+Sfk+vSDg1x3XHmln
pXK+XgikY0JljN/6FutoCOHSwwRiA3aqET38e1Yws6pAEbU7Eb7eq+xbnZGlg5wugXL8hmowcHHB
DnQkdgw9JXtaI1CoGVqRZzbrAlFVgwG78a/YQ4SW0VvwbHAstWzbAl0Uvfn/dpouWQGMBxP0DJ6j
VFeVtv8PKF0JS3qOmQcg5OYu21Byi7YtzulSKuJ0AilqdD1Z6ThuxKUWB71F4CF5i40bXJVZxkBI
nIPA72ptW5YzFoWMUWIsN6h8rBdkcVuQ7RaeInO8gtOGeRcpbfdYdWWYqXPFjY6NK1BbekW3/pWA
6urJYd75PfDee7h0W/tqL90CKWv/VIss0c16cH0C8FVvSW3t/aF95nNjT+vJOw5W36j//O0U2gHw
305b75buHvjOPOA3oGKCAnyCRxkTwul9vxaj443BdkUHGhERP5RmrqJ2ugd4Cvxelyii5V5df3j1
h7ev3r++Qtn7AREhFhFLfaO4gqv3sOf57T+/v/in16f3Tl99cfH6i+dniBhPd3/eO//q9bs/ffXs
Z094f6/d94sqXv/Rbhh++fOLF5+fu6fyc6GmNBTDxyKlF+/fvLt6//SnT3CvL8A20qg0vHzxKZ4+
/fTy26uLr14RBxIKwhqPzUIlojU75AQcgsdAffrAKEYyp8AlYaFZilx5EkFOIHBiRd0kLFUtV8gW
PynWnS8JgpFyO+SrFlGohhkoS0FhS/nuZRSkfEMIqA4fNofbQoVVu4Nh/ACFHrODFamxhDFMQzrB
FwUgkGq4QGSBgtolmXuhtYdcEWabvsh1xS49E8vuRQdbEK9Ozqxj5C3QN59/DKa2W5BtTOu7iTwh
i3WNmPrnWArN7myxG4OKXKo7yV6awm6xuoFSqu0Gh7dOtqWBQy1P3aaD6fh2L7VO1uQYx1IiN1wU
jym13KH+X2nYUm7gu7Uig3n20nZTxdkkWIkAEop0VTI3UiZNj8V73ZWCLpiphsmycyJ4GNZVlOyB
nBU+GSfS8iWVyHg+9+2qU6mfqMPkrkjKYC/GWi/YlL8FUk6dOYvM3VsWtfaGUb3EFoiubhZxePk/
B+1zi/QNjo53o7WnOAXlc5Gj+k0OngZUHlObi+6MN/fAT66vr1H6v/73V//++a9vLmYvuXvgx+GB
/3DxX/713z9pdfkfv/mf//Yf/tWPQ8e/Qi1+8r/+P3hh5uZbB6IAHocp3uuYCrBNO2yBA68IiAiE
fK+sfupAWSAcHsBpuIsYBIM0qoKcPifAGUxBQhyX2N3s74CdHuMsICTJAlc6SPEJE4SIgWhQm2Yj
eGi3+AJVUn5sRfZX42oKC5nEYJY2YMZ3I508ev2YgVBCNd+TDLLQmhKEcA77YVGohyyxQR/unfZn
R6EiqEqfOAKkQ7QB2BIEpXYzcBFuSxJSW1CQnGoFvSw3OB1hktluDIZurMuxqHSjWHOFGHBkHkhW
XYT6Hiimf7Rj3LsBy5kC8jY4KTD8oHS+NVrYXgYGnBb0deeo+ciG3oJf96Gq2p06G8Y+PfnqEu12
8ewCrA8fPmQRO/LkPjbUgR4T/SoRBYshnZsnZzzdHwGHYuLVRVNRNiOuarrc8tySsq7998iR582q
tksBPYOopcBOVnwJLy3JCVgbdXUpUUU0U27ZrP+N5ty5x0bX/Z4T3eYXFLmznpFbOdJVYrwMcYwq
N3SgXgzLNvVHZyXKBFlzT6g6wAD6Zv1vsTKiRsknsQElspYSM6fmEbQ0OpY6PA3H7daTYnr2WKYs
P4Qsr8K0He/orlidUiq7mo5U9xbe9jy7TBRKXic6dnT8+n/bcdkxY3gb73/6z/9NcGCPAG9z2M61
e2D3wKoH7OIVkUZG9qa11QByAiSICZPZYed1wp+qRtgMt/ji5Ub3bM/zgbf72iuOFDnEt+RzO7HB
SzzsSigIwEySD/yp/caalpUa/ZZgSvPgJJjJI4BtLw0GM8GeP4wKeUCGmOigXhQEJIaGKiUhzALg
LHchepAWGAz5dkGFQNo1gW1kUGd7EBT0FFqurBD61coCDtTOEKiz0XYHpfIt/SbYbKVIEVY0QIgq
ClBX3NhyKSEOYyh1aUXAsTp1MIdQBzsuS0Hx4IB11M1vzKYm1kxSWO6SAsXbU9MQzeLwB4MV57hi
pe3c1TTWZy1SnhRtfr6H6hRzINp3qI/wb6yVTOZWqaUImFUw7QJIhajzIKS2WJMbW/LzBDdwUQZI
5nkyx7AKSlVHt1TwtKWW5Cyq/v1mZDiqmruUitg1s1J81RUVQF0CxgMHVq1sfVKdvCRu5Mujemnb
OQextVV1BpP4Y+f37gdV2e3zS1k3XTgYWLcU31aRdp+zi0qDMfa+1ll56I39ewu7xqHapSW8vPa3
2vQrDNUAbCFlZR2HwMztc8pt9TmqfHX61YjOMDiP8Y+K2pFYeP1v1723GX1H2bQzjz2wA+C9h+we
2D1wew8IBAKHXBeEA6AlDIYD9AAzgknxDX7l5uIHYwHWBegFYsG30JYjHOQKC4lKROeAVpSrWbTT
FVClgeskJMSyRtuqrVp0XJY9wKUuu6KDGAxQXvrjALIS1jLTEPt99I9PjSzAPB1ghnqEalNFjJGa
AsiSNPlHFSGNXIVtxQC6UC6XAPxSLfRYxDrKVcWAhapUzOABBTKRgG6KYEhJUID5SbQjeJgwtghT
B4OY5SJKlpx4E69RGC42haFGwedayHB+qacFBfLIag+blyUPq52xXAWEtePADhUvttjbsNQWGQOj
1DWeDp63QG+5WU4eXDwyFhXTHVJauAX5LU7IlAqJjZml8A8NPPo6tEhgCza4mb2DUmrQ7uQ4+kTG
tFUH0DAcdImV7nVM9ryWHKEKKTlolkVn7FTxtHFRFOzuMl3adzqD31sasWv0DcbCMc4Tb4UhFUXM
GCZTVrdAT/UPkKGycj+J/hY9J1Oqk8zxNrYlussWR+98jpatxktYt3p6bDQbAMWM59UoVZ88Yi1m
Y5/MK1bzM4bqyjUeUTutnm2ZHpyQ76K5dxnhgR0A751h98DugVt7wHbkEt5YhPBAccBmiq8C+YAO
ir6RKwalBYoIfmIzLSJ4eLMRnixlT7rijtZ4oLRvu7306B9ird9eEuoAF1GCv6rHrilJJviF0Mhg
SJIhShF1p6u/jEchU1AwbT11bQNg2zxYeBsfyITV+CBBlOtvo8VbnVDFwW6EtgTyzsp2bkmGWHzL
XlbnoBTKFPApPOxRU0FK1IIqyGDYUh/UTnMcYcLDBI0Saybgm85xTokSaKQCyvJcJIAqI1dAFAcq
VVMKskpzFBQD1Zbt9uRtNYS8xyIGa2mymcnO4PAYRB2UYAeEoDVRnH4z18lXEkUnexUQAlHSRCrR
dtsqzxUKKw5pahc1OjxDxr+TgYtHtfGvG/mZZofxzOGy71EvUKG2pYrVhPBVXrOoKJH1XScqtfPs
XFnVVH7syu25XYhY+a1CocrN4PO7dk5uo6qu8FvwtB0g9M8JuWjg1YWsDj7JXZFT6qono54BRYoE
wNNP4YpcV1Bi0j9IhJCpI2yEgmO3bFlj2t73CmcF9TOsCnylba6zrKAk/zsYm3fgCeQMenI78KtO
Lm17mG0VLnaaY9lL9bKFIpxdrFiN03YI6K1IFdQvpTwr3cy8BXvH6sMgsbULVN0pznLVGaaMiJkb
qfbMV5Q2jvH2Dfx+lsm2OuVvgm8HwH8TzbwbuXvgO/YAYqfCWsQ8duUQJMYH8MOuCOU1vMQ/Hu9V
Ajz4vraEvdoX0AbQl8FYw134jYPwCfta/QbgM8ItVIQP0igrUWe6SBVcRJk2XQAqI9FuRhVERxaY
WQo7ga0uoCxqqzikXY0K6HLUBzniL3UJiGrPs/CVfWAp01PcmzI9qilEh+pQF2qR+fSP+e3SoaDW
C7wIFKY0gXbDwKQIqVpaNUIUv2WdLweAB8iQtotTYVLlmgLEh5Yr7K26aPgUMWYp84mKS2FWZz8Z
iZXrFI81iFssko16vJY3ATwgb4MoNiWkVdBBAV2SkUWL/PFXmkuhllCm+FA75F2aliqwEoEPkTCa
Cfj5787IUB+BDQabS6NMn4cTptlkqFtTS1xFyCjS8oyF23IDOaqEpnctrNoCKpZwWndavNH2AdtY
pa51WVprZkXJaitr4ORuG1WlovYs+ajGHfSNedaglx7Vgbvuz8G0KpaV8fDtW3jWD+Wo3Aq5gnDj
UiestFlma6Nz1bpAN8zrC2Hto32DkrprvWrGrH5UUF0oPm0X2mhvMn/JQLHkE9QgUDnLyueQttXz
SIxGjDMPL4t2d3QeCGmAOK6uKHfQtzaI8Et2WUfTT51sF85p9eCqtnCz7Bj9blBrZ/mePLAD4O/J
0Xs1uwf+yj2QL2+OTwQUy+G46FB+Cyb5RZm3+wL+cM8zEsJjQr95coBaDMwQdNkH2amKeG7WzNel
opq5N+0wfHs9lRZaMFQJGFlggz/ySgooVklkZbpBMeAupIk5p2CvfuoQqAvNgTmhoaCjkLP8Bigo
05CVTWiuzaYk1fOYMKX5Q6dQlh8XS3/KKCXk3kh7XJeYM7LMcKmHP2glbWU7BEI4c329Q7mgIyGE
TxTqG54FsIuqbpc8hiLX06OwdBuz+1wmyC1qEVCgSanaWg3dBu89ggT4UNLQFmwatRGK4vua70Za
Ptq1+RH3D5U3a7IebBuArtA5d4MsME/+qulgO0EURaBlI7M621HM0jmXCkqbaKHsANy2CDaGeSV5
qa0XJso37hrHbp5cragLhyriEmQaQKlqoadd96lDiIMmU+O2R0W8masbANkiwI2YEApuWXdwO2J8
5REXThgM4Yw2NbKG+PM2HWawWrcxnqyGm+SswvVgaBKVMoO+112wkBpHnMArx2YYn7tidUJAFimx
xhErI1Gozmo69gpCvlk/Xz0R7AyNB3YAvHeK3QO7B27vAUUXGST02zIZqBRS8t2wQCw4rgu6swuW
M9w/nJweTj7BhucDNzzjc0lpxIQCVDb9RSjvkmAGRBzMcuAnUaJHQpNmaCLshFzIEUIDuiauMyWR
pZ8E3gKcCqja/IMyLfyIj2ohtHNwRYF61LA01POWfG8wjEVaFMFIpFEFhF/6Xbh2tUMuOKEMY5t6
bNUUAS4AUrUooDpByoJLdc+tYekzD8k6pKRiIVMxcAsRw2SiSsVvfXlCVasWSvObclFEk1TprwPM
+pJ7edieahwQDrfLcAlnwlcBaKwdZPa7hVU8HCgeamjLCkVV3bps7XJZcD4otMXQbyxJYCM6I8C+
TUBp7Bo4PfkWynQOTUq6k+Nqk6cZrCd4DRNtHeuTs3b6uETJ07KlOWWGpjHhDrBalcrz9cwsM5an
rXVWNX1X2WpyOZgldyvSjDBnDSiRlcG5igfFB3uiZOYu5NiiWLdjbSNG3xhgkhxX3NIDK5wQiixV
kSFHNUcfBxXzQIha6hBi7khtZ8vtu+SxttsEVGgxwyBrYeTG8IfmioErIeuC4gM/Hvk733luubkH
invcXfM4FfOA0jhnC4hdbfq+y+detQalbnVnEEVqZ3vDEDsNa9vOxBO3ikyJ+Ul1sKSSGyVap+qE
A7fUxs4V67piNtyKmatjJHrUtnNA4RqcHo8TtHOveGAHwHsX2T2we+DWHvCYp3CjnfYJsXBRFM65
5reABygHx1EAcvdPTj55YDgIT3sWBvNbc88cmjp2pWSbagDJCAFKZyVQHlXgAwmoFETyWxaqI3xy
OEdEbbFlyIc0FCHKcoiOyzOIwFoQiG/KkeZ2TULWpf0ykHY93eiryzwwuVcnZUI40gUKOqjWVEAw
ldDUClKmHfgJCaiRcmymzm8H7QqWQiCY4caYdrAWhWRjD3DcAGwvRjore57VQFqVoDd8GUItRXfp
5ueodLYtmbqZE+gHD8nKRja6ALyVFREUJqwIqkYRHFIGh9YOWKkotiQhG2mI7mdW2Nn3YINJfYBt
JLfY89KkPNyID9oOv9k3dM82ILQhYTboN/LAyqH5rpgCG2+J/2yZjy7ytMAgU6SN+ls73VRW5hHk
M6/OZ9VBqbJUtguVq0n5EkIe4JDw9wAMhAJjnoAHWWYF7FtPyrTwSdX+FUrPfmvdtURZ61SD/C3z
9bZPRue8fSJLQDqD51zvLUxcLtrtNiIuwaolYa2owlktGQS+bcOGogj05lIVpPef29eGun0yDIke
eKRp3QhwG4QUJa+hqJUDTKramZdoWr2QUcGzPKY0uFoKTqF5CzQruvG5NOvTtb0ypOPOOJvlE0gM
6qoLkbnWtlDCgcFTrZVER+pGpwf6fycDbRc698AOgPcesXtg98CtPeCh1IOuofwwNuvbiQVUcAQD
N6weTu12XwTucOuv3d8LUHpN1ISCxJwCh3a7r9CdJvSBq1GLUBBKSTKBlkMm6jDbb3xGraQY2FQX
6i2Y0MoWaK2gpceHAaiUhdt98Q0oDgrVMHBF3dxAyMRHOvDj0wUkgNn47Zy0TrFif2CVgDcMJ49f
honlVJfP3YsQj9xqTk8nKFqrR3w5okYaFGJ+eUMgWQ+sNjwvDaWz3ELmaR+43BstCPNZ1iY6dIXq
qgC/bFSk2uPbUk91laYxe+kxwVRfdFB1MEp1CcfKRhIV7/UlD2Lm+yjBRjQ22EszrY30k3S7Exgd
iZ90VNPi7sRR7DkrS7jjdEy/2sSxNVUSKjwsaRnpZf6WeQlOZ6ASKNTbImHvLkXEgNODUpEVSkZd
oUCWE5IHbsxZ3seSi/1sk7wU7honjm2mOX/VIdXxogeuym7hwRIWyl06xC6hqWDo7N6sAMMWL+Vl
CHWAamGiiwa3QU23N92am9FswNpuovLzTfBJ7jYxxPIoi55cjb5wcdWNSa/BdoVLMw/TOYLdrt/l
1pTkWbPShD4lrAseUULnfAbo9oTVHpwYpFvV/wNJZg2PaKm2v2VKdLy2B5KSlcldKEZTXj2RKV1K
xw2DcXSM03be7R7YAfB2X+2cuwd2Dyx5ABcqfqbl4euyExhFkBaCEg/idQd7zjO+QRMidchUEKPt
zlVYFYjl0lGQ3316KEpA2lXB24Vml0ypQZSlsKEuZoCC9pCkUldGpwa9UBdLGQPE8vAItuCu8BVY
mJ6ir6oLBxSTjUjAZMlBGt8CXbTdJQsAkyduKsYvuw2YEoTADc0yEd82w6ACHjrW/KOgX9t4rLYo
hz84uuBD32VdsK5rCG1RBYs4LC8Ku+al7Ry7CoLiCDZZLaQtIWzxwP+OkMVGh5gP5Z/QFkWK68xG
oGIpdukeMEtBVKXgpFb38bw0OIrI30tRpM/VCNftZ6BianjMUc0RUbSdbx0xAzum6rvnnUZokV3h
Ck0HY8peaZCL5xlbNV8cw86WeQu2CU0qsGT9bW5LzMhFjjl6m2j92wKYu2uDozpJdwvooOMt4eQO
ZC0WVVtJB4YOYPls/UIillqzahc1TbRRlcjNvaRZr7jHqwnhzMBIFFgIYUsx7YGvtvaCdoBUI27J
5Iwtm8pcsTTitkRQQ8yW/QVitoZukF5FCbGb+vPc/C3rO9UiTttLK4qAaOWzvskZqy91vN65y1Rq
zgxHNUFWr++3wZl5a+fb+Y7zwA6Aj/PXzr17YPdAzwMHohEG2TwAC67rggNPPe4n6Gt7nrH5Gc98
Jo7yhw8jLXREOGSRukve/AkhKC75SCAXqAlEHCDig4Py7fokQEW048FhJITWCIbtQFleLP2OXNZo
tTDmbNtrKTmCkx6WVDgR0qiew+BAbqJfFq0gjbb4s44JrQVr/XnUVEGQbMKQRLm65VhBUQO9EIUE
mGUjTfYrZYHTvsOZogwcSgghsd3oCwnURDMbbScWgLePmkawmYc/IhsSULtyFYaVB4jJrTiV8YUG
aaW6KMrmGfT5rA/gJzj5rUCuyy9yTNtQiZjWt0NDptxCraboNJ5ohfvGYRcsIlq2tQnsdpZv1SW4
c17tZXTwuKH5X0yIBwnwj2MpHbk/LGkJ2eZZoMBkgN4K/UYWDKlK+XIJLcxTxgC3XZRbwYPMk1G3
BLY4PFsUPN5vG9BeFR/MfVebqUV0q0V6DFtwyHgqP8htO2c1Qe9OuyNUCH3veFknobVZJ+m2lzyc
O9IAG5eso5YDutArzA9MpWHeiYtub/HBak7Yrp7fYp62ljWeKiapcLc+atOKkht6adGkb6tGkIbV
IKGRW7VyIWwBjeNhMkbdUbbDVvWowQknd0Vqvl3tFo0f5+Ts+moEbe+BO+c2D+wAeJufdq7dA7sH
Rh4g2AA4sZ2o+AA74Tjo2uG3lR7unZwC+gKxEGUZ9AUD0MtZuU0UnMQteqKy417wQJpQCxLgASqT
5GtHwor+OX5WjQSTgmQWFEWNUgxs+omyEhWwGYgrNBczsvSyJQI2v/UXu6BJdzQuNc6oD76RluGQ
fFnu8iXIN2MvLdPfCQROaEKTbbog26U2vkn0zczU0Hcy07GCl/64aYhlKYOpIQra0jQF0uUoE1jA
nz/aCjygSz1Ga00TMEMmBDLXDvrTFxeogBUn4nWXUrhRCpR15I/qyOlyqIYhZwjEEfKRVnU02cG2
LAI/FAtPCturOP5j8zM8A78B/bIPODjnKoZ9SmNpJmEPUUvxZpdi/6r54naKZFQhiyT4u0puir1s
gBCjEFx3vuieTJgZJi6h6MCcckMXaWeBwdMmMkCSnJA5KJV5xHazo/HklkBWVHV7nBZgJvpbhje5
Ew56cmV6hkk388qsCaqljegV0QQBmbqUWM6QnIyglvEk7ix135YNz6IIhBybyO2V8XA1wPu+GvTJ
6Hh5WSe6fTa2Ee2Bx0QfoCmB+WodZJFCBWa4jib0KfOR6zf0tqeCwQlnblp3RFSmtWsQS5TcQIsn
xga0T+8f1gO64mXF1RuJlZVuQ7D08tuwouNFH65d2rq9avdw49rax62G7V745GQHwHsv2D2we+AO
PXAospC4JijiLZof4/1Ggr4ESz7LEWArqEz3rwq5+TWAAT2Hl3a9JjPElsMBj4SwoOYTBggFdPEt
fsKzCZyriJD2GUtJjQKuTAdFSokbhYTBMs2hK34pVtC10LgjW8FRaUgeB5kwP34SfxoGlgICruUQ
3LWDcU6Fdg05yzoiQA90F2RizISLJlZlteKQFBDudcUIOKdcKSlIySocx4IOTlGQltoQG4fcAoYg
Ro3CpWLgYTYWex3hQGeyqTo9qWuKfgdE53oHuhMWXPTgaN/BLpSljgQdoWppMpNJreYoaDUoFzPI
0LobhRuAnOScO0uuqn1nNQ0EDfBkOxWeNXq0foI6Y41vjF3v1BHRyuM47fY6t8jZ0gPbGrf3kNx1
K+C3yZBqmi6koWNpBr/aml2GDCDLCcTNTP2tdZd4tyxDbLK3YgqtNhbO/ilWdBxF1w0asc3atCgW
fpg3Td85gf3ikr3gyY2mZ7aN2kaRwZLTptqbXloHdXvv7zWe+bqANwobvUW2oYkXbDVrR0SXsjpA
Ntm8M614YAfAexfZPbB74PYeELzEcV0ALXEOIBbe64uo7wE3agr6gg2YB99gAIRDmj8NriBAR8Rr
UT58k8FxVE4Tp/GyVOoSwIN8hSKJ9DzCjJ8EgUa/dLQmfGUShL4+vP3i4u2jl9QEH1aNCsXg7+BB
jaGM6tVP2SL0yMOfYAw/oApcPolpHecH4JQ+BG8eEaV8f3gV6BRlsU3iT8W37VZYRms9aKx65cmQ
BooAJAGqnlNlFfEjL4lfUVwTmELQ0+ICeOhnKwuj4ENZJFBaKvVAOsKwUow87hbUIQmg4BBoZ2K6
NTqUh5lq92KLoDjedeRLCaEk/YzqAH0RAXb16GdboaC2eiyZS4K2TKnFsLlA9DIRjDBRNaHsoo5q
zpSLDPbIeX0/4L/BrGs5vFbDmC6w8WWLAnU2ztumJbDklJbYpajEAGItga5c6ti2KDKnFv/uKEW3
MTauAn0oFJQwrg0GRrdfcsAKLNnYvlm6TtRwV06Iwc/haVUxKCGhR+miNQ3YDJOCEmO5S1FVebxn
Oes9ZWkEzUGjO6HyTDazqmnB1blXRLQ/TKji/zJkabNA3RkC7kbrtAkZpQaV4S0lDFkeiVvOruue
vxmH9JfmOlrKgmTtLAhvy4HVON3i7UEY/2Y27aVu5oEdAN/Mb3up3QO7B7IHrsu2Z6Ej4BM84flw
cvbg5HBtaYtVnpWIKLet2oVEIcFLwhJG7exAcYI3h1KgXCZoSoTpaFMQFJDPrkQkogqGVT+69/bL
C4O1X1y8+eLFi8+ePjhA4JnvknV0TYSpOKcfhJr25C0BcqiHXCSAr8BDOOfYEmlVjY/UKMroNUu6
gxcJvdb45Ortk1dvn7x++rMvFcd++8sX+DkFyRVK9Ude3SPzC9YFBSQQOkB/VIdvqutPyaJKKiv4
GqsApi3KwnCiVr/eExU7IAe8RBEwQCxMwOfM00LdereT80M0LBKztCpQ0u7UDQlyCBjULpBJrfz1
y6VIvOjIsojz/TVFUA9aQbjMYZMJZvv90pdGvIdHiFMfayOtldhvbzjdBozDvpF7cvItEpAgc5g1
X7+vppJWtJk4Hkvxasq/YyMeVfHRT1rUn1RVABV8Yi6v5YyXcE6B8Zh5VwltEZSEmEG2CSk6xtUt
KLK2KyZGGy1pUjFX1VWz2+y4ClTM/TbzcKV/UUm7H+3IFBI6rzONN8TG/sktlLTZUirljtdSqgl3
vVezKb5lpWYx8NiFNONmqgBSGoCjTjLsQtXOZ/DecudzBopy+KIHWlxamZ8Ru7JWB8us53mLV7QB
5g9OqZ1XPVSqDVRGfLJOKApKE2Kf87ThuVrF8OtOMTAGdSjU+CpbsQQUo7eH2q0VFaXxXyJ0O6eg
fn6Bc6botcbz5QCvMbbcl/NtdLzpsmLLsnaY35TwG5FGEeOpn6hMnGRGtu15t/XADoBv68G9/O6B
3QP0wIHfuA0YSdzuy+dd2VOXiZR8HzKhl7/BlcjNbvcFhhGexHFdQnVK4FuSkQZMOpvFWi3qSPmG
HgXzdN1C2o9Hb5+f/9OrB/fPnj98XIQTDTqaVaWByhQpJaDyb4JA56GSdmXShU2gi7Vr+7F2FDuM
FyLV5EDg0I6Hpw8P94XudLCUh0ZBRNUEqH4ItYKuKqi53Q/MbGFyS8McEm2CwuCng2HkompIAycd
iEOBXNWLJQkP0kofZIE/oCY1t+3WrF0bnl1n1QuBRVvfXi6fSDEIl0zOqLwRkaYo3S1sqhKU+hyR
emr3smNadhhBX3+yNDoVXx9tCqAsPWYdKT3jSp7X645McrQXqp5am+rd8ZHnmtWc9biw0lF60Xv9
KfsCOGnnZOsVxhbB7bjU/U/Ztyw11m8gfFBws9+sKYN5Xtc4TqvKF9FU0m3MU4GB9cY6hqMLro4Q
UKHi+Nk2ypLQLueww7hD2CfVOhX2k9uV2yakyCAQt75c1SLhI1w2HxFNwUFzryu2oIbLjEWfnAiI
rptdA/vNEyY4ljOUFgbOHUCUsQ5pUAyGT2Vp21gjV0TrVMqkTjVB/RzUzcN8+fW/k30bTmuxajYz
ofXSFsqxfWznH3pgB8B7B9k9sHvg9h4gdAE8A/TVnmeDeUK/Ek7I5NAUKItwBR/Hh6HAoQBLUfBT
cOhwejg8+ezRk88en+L9SToCNltFBN6dS+/V+2/emyB7Uw4l3juc/+zxm0fnb754ef7pY6PH8Wfm
fvb8zS9evPnlq/OfP2Pu1dtfvXj7q9f4fvOrFy++fPYA7y4++fDlTz9/9fji7a9eKtck3z+gyJsn
F2+evDz/+ZMDHlAs5Ok3AFs1r//4+vFPP5/AwEcnp6gRpX758s3jF+ePnp/eP7z95StphCAw09cu
+fHLN7+8AI9B6JMTU+AX52Ag2+uChwlZp13N0IE+9A8hK44JgRNbTjufASav6Vt8KErR4wkngwh+
Oa1Ew9yBIBaYba2GVubhTUz4LSxqWaiFaFlsCiD7QoAkUyvNsbwg1ACFb5BGZsDmeNqzySlwWrWp
gymtI6XHM6o2lhLT6BDWBtNSTanOfNuztOhF+VzB5ayu8Ja4BW5tFLWzeeebxsvduGTQRm2nypSI
74VimXI3/WoLtGt5MvJZgkAVLNlS0YbBkpeWBpg2j6/ByI21IePfjuGjX1SxuyyhykKRZaxYdbxK
4crMiJq2iTjbRFanB6eHPE2540WlCvSuDYuN8DVj2vFAWBmYXTAZOD8SkqKrzLbe2J78o19VF4gb
L1XMOt6aY/f823hgB8C38d5edvfA7gE//xviRdTX3u6r8KDgE0HOFAG+FJo9+TZAFxALgA3YrtNr
hACHCB0n4tWjB49OPz49/fjBowcPS5QVRYjHDFqjLnyIzfKa9J8PDz9+AG3eX10qVnz+s6effvwQ
YeFnf3hhiZ89mUDRh3vnnz799JOH579/9ezNuSV+/hQbbh/95vGj3zx79Jsnz95cPPj47PnnIN57
YuD53uPXoD9+9OoZtD3/XGVfgq2UhYaIWCJKiarteHd5+fD0weE+cSCOP394/vkzY3734hz6nD58
/vnjR/8IaXY8evXk0T8+gdrnn0nyxbO3xnP+2RPkPvnZ48NH9x7/9tmjVygClRS+RkWoFIc8DB9e
Ml2AMXKmm3XxAwzIRRNQSQuonqUXJlFtxcOFXfXYLX+SGUrR4XaQaAd+EtP6nmQm1cQeRkONgNmo
q1A82MsFFI+rM0vbp30NpZgAZ96Dhtd+a7R2pxvKxZIKnvkMuowixac1/CkkjL7xLVVKR3c2XE0l
NclWNCmK3gxvZCGSluUMpn2Zc4sOxhNxnrnJbVBiq8AiM4SrYO2KNAFdnAiuzf7rdvq+fg8iolvm
8bm40mNK68AoNUhEqVzFuPOoyPr6yBZsEytTgRymtaqCJQYRrUAg4gnOOHWnc3hseO4k0vuKYnjK
IXnAdrOCp+pWMTSqHj5j6+L/zBHeyBZVpbLH5oOoHYwVpWropei3bAxIPyuVQ53qFfPgZyw+jrZA
o4IKTAZl7taq11Un0hgjg7PrUcsc/f0maotYqVEiHv6scSpKtQo5fAp0DKvqAtEOtNnaSvinu9Dw
Yz03fl/n4O+pnh0Af0+O3qvZPfDX7AGEfD85sZey2p5nBu60vdbSQjLANrj2ELrYvTcAKmC4nrbd
+g2oYAIR/IQZBpNQUBSUYkFDvNwQazcVB9wFj6pDMQAwYh4EUb94cfGzp9d/vn759Ss9zfjMbgY+
ufj06cvPniPx4PAgL/2e4VHVyH309OWXF5Zr0earRz/98tXj529/9erll+cgnsLMj67f/fN7XM+A
kC++uHj8009NMpH2xaNnYmNZSOMe3djV/Oer139888T2Y+s4kO3k/Z/ev/+T4UYTEoFQewgWDL8s
ks9fPqLOVtHBFfj82cUX548fPKL5+GhLMLyHD8rCZHhJ13WGVf3Kqiw1DWpBc5Cix1DZLAHfyL00
HeVwyZc5Hk+GwhKCBCv1B6GpyYhRHWATXU9PJkOW8HbEkFUp+NmIXpf6AOQzYZrgxb9IQyvoKbjO
Uv7kcHOgHSiR55pTEJhouQhz5vSvi3y6U7eK2J3rDCapbdWiDMBJTOursiuYJya182LtnDjy10FU
LyxWl0r+XzTqyJDLktPunN6fuc4baN1LgT1Ss2ag0rZ4NPFAgY0956jo0wgSr07EW4aqWVexoo3x
YlZOpLRrmDbhixI4KoPeyNKAEk/ApxZHjcwPd2eIbieiOWgfd8EW94q/8cwmTbZ192r9rloIm61/
xRpZTqSFiYCFE9Yt0NF1yWh/m3q5FbaV6DzEu1MwXFq1V8ua+m17MhyM7rorbtR+3pH6Db06lI6t
a+df88AOgNc8tOfvHtg9sOoBoEp7MK+mBQRI/jAqgSUCFUXnyoOXC0Y9FHgjHGWTloCvJQhsgOrt
119dfXN1dX399o/vjCtAnReBAkhBCBUoN+I++t2zp+9eQLPznz3TVefy2mo5/+rlo98+efT66aPX
TybA+eHD5TfM/f1LxHsV9YU+eHIVQO/T354jLFw8ce/Fu5ePXz9/8/VXD0/Pvnz4JfDY5TeXLPvi
0aunFrx9hbIMmWorrx+nAK4Cvcy9/pqlHn7yEHJMPft50COM7/kbkovkdy8fvfoS0WZKvn7xByjw
7M3X7xDi/vLho7Jgf2B18gOivnAL0oS+0yEPh5+RYNqmNWS2KLpyQ082qFEE5kva0aSEK2yLXNO9
NAHaIupCFvoA5RuDQK9q52LHVJC5ak133bU9TgybCxABtvbVM59Z3B6gxadeeZpiPCzMWaacYXMj
ymzmnYOIn5WZB/E0dYv5ZfJqncyTcuUtxQ/zfGjA02blKsdWVAoM1P6hso7CbAPmJQcO/L9k8l25
dCAnZ2XkVqnUtTdbWvXSKL5YdRoFi84cY1cNzIinZY0jaxq/MQYTdPRR2aMkaYMGzXWOVw0qIe2I
CxRUzhVJ4dBzkKjQS0by2RtLHlvogpVR2Yqqt1RrASujeLD21F2MCHHZTHFm9FvKbmyytpd2Cx6x
HlS5OirIvVQKB6Vdr2mHxpySF1/iJD+wZTGrcmDbu1aXn36ok/VfS707AP5racndjt0DP6AHbEW8
oCBLX1KXArr0MGFhEqcDFgZDRmIgEq/4O3gFlowI6PvqD+9e/eHN1bfAdcBOAGnAQshF8csCkyCW
gcfpynHv8turi/evzoBgf/oYCpx/9eLd1ftnP3vy9hev3j5++fbxq+mxVdjG/PtX7y6/evb5E8R7
eXPvK1Tx+v2b6z9/ePmL8xcM7epA1uvHF88/ewJ9Xv7hJSjn716y7NO3T17yMc4oqygoDJcVOKD8
vVfv35Wfh4s/vHh/9fX558+wg/r91fuLdy9g3Zs/vsWV9Q3uMbZ7gA/nf7h496f3zz578vbJG7vj
1yQf8P368QtX4KvXJWbLkDgOf7wzHIUa5aXwsyrXT+iG5QlqqJmBg2cBRXrYQ7KKe4BSmnVasABF
baGKBGtFgfnCscxV1Febk8050oFqxH3IvoNAAWccysXbpBmUto6E7wKwtaFAExrtqVYJJdyiWFFR
P3Tfry/zz2N3pcnq4lbh7e7yrSR78+RHs6jBEuWWcPFWCqdp2RiTz+xam8wdFf4aMG9s1sHMtW2O
myHhbqmj8Hm3YwRxo6X97vTRjfZCB9qxMV4UWcLJay0+kpAsb4O3qxShQXxHInuyG360dhkoPEBW
VSMFqhE9eyw45x7bPhjbM8AYjC2dSabtzWXns3EGLMzATEAxZyl3iJOzVtk9gdKDGMNQRXLLVjyV
nNHQaHtpRbELWTHBL5dGiT4wHu+DZQg/S9M5s+HZHSPVElKF0rOTxyeCPfemHvjJ9fU1yv7X//7q
3z//9U2F7OV2D/xYPPAfLv7Lv/77J602/+M3//Pf/sO/+rFo+Venx0/+j39Bmw5umZ/ZBVQu/eU6
fq0lMvE7RcWPUxCAqy5IQE1M+0Fwa1FH/AYiYhpHhkaWJZmEzRa01M/AVKiFBSXfdggLepHBNJQC
+GZa231dMaUF54ji/CHGlOMhVr6MJ2KnboIMYQzWFQMPSgmgQkNopZ9MC7Q7CmVZ9yH1sedRMexp
CgDtn01PqHL1wlgl4CvUojUC+RMJ1Fjqjb3Z5gGhU3LqYVTSEMqYG0IaOKVVyFSaSNWfFC3oyyLm
TBWnH+z7ctpojSzslsfKiDaHu2NZSl6Sz+MdTvcv7aHiph5u9AVDAc5QyX4WouhQEt+RiPmcu/T0
4lfPUOfDhw/1NqDV+TSYv2ueasqY4zlHIUO29Wxr6A2KS8h+ZE+ueqNF1FEksn7AhCmTZ9ipS7dZ
k7EZC9k4Tcgne2QJH656bTNDOyIGSxgarRnodkFvVfk6z5I3MnLu8gz90zVt9YTQDflWYeFRy+b+
MO8YnTYJGJwNieVFibrdsdSa7Yl3VE+1+pBZs4atFY3QLlbvNsqmQV1eOzeLPC8B4GiOP5/8+tc7
Lrtdx+qV/k//+b8JDuwR4Lt37i5x98DfngcODpxsbfXawIe/1hWeOPObeD3cByCED+CNgBkL2hUU
eAUFkcY3PoA6+CjSi2zgQBAJwCJE6VuLQYc0Rf9QVzBIGg5iOenjr40llBJY8kdJFyH+HCYK9Him
IgMAZpCGNPcA2/2uwuFk0wuQJuCtsvw2sE3Y5iFZOkdIO+TbBY9KAuHbdZoY0krhIxPwDSK0pZ6G
lmUCfChYqFIsaB4jrpbaVl2qy4RAAqvT1nTjufQlALOuSPMwftHHzIQoKcNgrHxiyJxkU4wKePuC
Ah5oSJ2tXqiqeqmbXpXs26ELj+5Dnm5XplFwHW791b2+DndZl8UlYAIXCBSjUEVSUzBYi/1We/m4
gZ31/ptF58bhgjYY0g3crc6izKzq0SykdGuvqrjDAKZaOo5Wcjd3e4wrm1nV1fVAq8lRjRgOzBrm
dIUoBsKt8zWPNAv12kZvrdvo2GMNnMTO4avLaTFDBRUC52gcxYBSIrCfZu3xcy0R0TaXKS3bUiRn
NJIHVF7cqVqwQrOdjhpmlsT6O7GXjJKE7MlKuJ+d+m3ePSFkq1c7ZOuHiZLBeVV/C8DCkGyRSgUG
zqapb4QDSxT9Bl20MmGwKBADreNN9cCmZV357Iq0TtHVth3LS0sSUmPF5PFwSMr4KBgg+fGJY889
xgM7AD7GWzvv7oHdA10P2IUHYAbwJoClrkMkzo7rgm9FBT9KZY5DwXvATioLCCToizSKg4HgM73v
l7AKH4I3jx+KmcKFHATP9NpYxYEdXgqGqS4QUW86fP5XsJ+eh6zHQTmuQxaBbgZ7HoIUSqS0QGh+
f7JqhD75mp2qFrA0sC3lkUYRAjy/xgMo0l47KMoqktOkTNHQrSMxnrAlWC5pTpdRVEzIVi8NdiA9
8wr1CdhZDBRLTIl8iky1fU97mp1M8J4OzC0rJO8h9GljgWugrc4OgBOyRb2QpNojkbuWXL3haKOm
R8VRu/PRoyaFG3Q0lqO0WpI5BrEbNQm27mR94M+l2X+33gGMHMg5qopj7e3yb2nrccHQedA6N2n9
tv9vGxE1qJhjaT+NzE7jxb5MTHXNlO8ilm0tUfnniJG7BtGn+lu7KkrXG9v0z1ytLbEuVo2v1fWU
ux3U5cRbtMirHskA04qeWe2ZRy3JjVedZm6ukKQuRjraJhP9xiNivv7Y73irPUeKtSsRXZ2P71F7
ibEHdgC895DdA7sH7sQDAIG4/uH7UB5nhQQ+OPB9nWKqgDeiKx4ozCYUJOSDD0GmBzMvy1OUWdCR
8CWvagoAEigKrdkBFAfciA8ejySthJdIsTTKQpTqKjjQCkoxKuOvwAVF+BNKEh9OqFtGFQaZY8A4
iFTG5kYMddpFrgS0PZSnWohUHW1CGRSRK6iYHp5s4Jaoz8ykhh5wRllQqJti1+YciRWUZaX+DVeA
SBsF181vECuF8Q1OeVjFlRYdFKRBoavlPb+xWd5GBpWfgHfyNl5WNK1lsBbzhmRCWsxCimSvkcYe
FG3mQoAhW7UgvMpKLaSvBRQukaiWHAcINE7lHBgrnY/u3L1l20bpzj4xQ6qAcUWB7KAshbxUf5Yz
nvGvTqBD1S3I4a54+l5sAUnwDbJangFlXrGcLKNywKe7flF5fsATlQza1ztjUqBt2W19bcY1aVV1
+66s4KkSgnMaEUrMlvDmoKIaOAtwtz/WCvOW9YLMozS+1YJKqBGjTTMlD5kBNvOs7LoKHW3EM/Ib
Dr9UufXVaeEojDqGlDle6pVtVzWaO7TN50/Zkg0Rf0VRrQ2YjGG1ZekqBkVurzyaFkdENFlWIPfb
6pwwHx3dBbK2/1SUpQG75SS5PrTbJZX1MjvH0R7YAfDRLtsL7B7YPVB7QMjEthkTUNkrjnBcO2ic
wC0wEmYq+Ch4KCQm4qHcUAokQ6yFLbgW4QQKgjSBMV1iBbTOpucJ6+ZSB94E1drYrO3HQkp60489
iRpZKCuAhwP1SiYSUAYfaVgwsANUAjAp6ZFkFD+d9vcKPfodwgFTUS/YIFxQtgA5IUyZr83P/log
WCr5Whq4pHx8y1gqEHcvB94TPDYULfAsrWSORFEN7ZRWwvEz6iJutLkC/eDP7qb+U3hZTQMPQCAO
yBcohXD5GRQwQHlhUbQdOKmGqrZ6NSkkv7PBLvFHFttXTaP4/P1rthLY4EBBX7kLNH57R8LPK3vB
r2pBAtotHe3U0AyXDn743LSlJJmDIEY7B8pTdsmoJu511Zzfi9hOvGLG36KC4Fci47pMyb6ptD0q
ONOqHQqEkgPKTFt7OxrtjUR4YJDV8gwoyaWBncLJFWXJgW23yk7OKw7ZA8EzRkEtFOx6OHeMrM/U
b+fQqw5/oUzGMAF4uhBIoKIFPN0qKgTCgpMf/jy/74DM5nY84L1KzN9ylJcS8pqFBpFGU9XN2p5v
lUGBD+VV3jG6y9uVvOP1THAnVwsxLcQKigrodFRKVQNtjGlnQ6N370O1ZJP9YA6hS8MzWQ23JSsf
HSCfG6W22LIhmaJliHKD62zklsaVDu3ZrNuxO0h+3ri5t0/ptitWPVkdOI6km3UJ7tz2XkpjsxoZ
w4unNWexsXJFqr3tXXKyslKf3LhZqe+QnbrNAzsA3uannWv3wO6BgQcMXhLdOaoEK9IHApGzgirt
Ulh2ruryLKAo9AV+RkrtpyKZwGAEw45IkUFopNClXyo0aRbkowQDTgoV4hvVASYJPgmJERB6BJX6
2AEKJXh0t0RTA7wJ6TnghEpSVTUWQxxwio56KdZAb9HKNjMTszn4pCa2Z0xgspiQA7l+M62cg28U
Icp1Q4pWXkQMtM4P6eYzoVJK12ASbZUBzDTNPkiclSJ0mlC9f8MWcgoGC9hP7S79pSrle5CZeD4u
8FYQjQi2pJjSCi+7f/jz3iXf+qt2FPQV+qVMB/YBrYvR1Ry0kNf/56mJuFvKuhTjaDFknjMNZARO
Xq1H07JBXCVLWALkmafVeVWHJYYlrSoYo+LrEbmhmYN4yzirdWBQtrhiiafCXeGiLv8SKt7esv0m
uH1Pjon40hCYzsBUobuoJOUIL81S8mxNpOWbyocZhGRYtbqO4yNaD/udj+5+a7ZG3RVlYeQsIeTu
GKkWmPqAP85FGVyp9i4lQG/wVKisKVg3bgzqXpdYWlzL9CWeTaejQQOpxyaGqit2DakqzWBYnbk9
1w1OO7UJ8naF3jPTTS9Am3y1M+0Pwdr7wO6B3QN34AG/rxUoyK4L6TvLJpJxBsKnvEfXo74KHgol
lsuDoSOgL0r2axjKYhIDzgMDpCnLbw0F2iQG8+2yceUrYgUm7YAcCJEoqSTJAuFkyJAVBIFbD2YG
PiyWaru1FaRAw8CsKCN2LjnzQVYFAwu16tFWqs4LymkQCHpR0oRTph4ipfcGzcBq/knFPHydzZcJ
OorhjsZBL2rPWpMrCx77RakoHhKIz2WXxdtLE/vDruhYX+yQf0IC+JkVwpED9DtNv1i1MDDEOBgW
2KecPPWxbdJca1g95pPyGXtejK8m7uQbTH22gLpcVzXny9hsKRZhDbwQIg6wfUSkgtoMgpMVMg8D
8yxcFnXnr6vgJJdawpDZYy3PAACsYING59aBx3pytd9VDG1faiVsmWpbqXm/nSgx+1dCI0vMLSXk
BGwInl4VU/O1tRdLqu7aduCNlCXfxkjZNDbzySFQX+CN1RUEFd/On5Q+yg9RTqXqE8tRgDy0rUq1
SFi1tmyV6zeYvwTpV/v/4BTa6QBji9Tb87F8aVg9qWYx3XWTIOaT5OKorEZT1nMO15e6/U6/jQf2
CPBtvLeX3T2we0AeAF65JhwB5kFCHxwk+p7k4FHuaQlXIjwraER+3ffrYUwAyEvfOTzBXUFWgjQF
b+16Rpl2zbj22K/9RBbBmB8F2TrEhQKCrzrIr7fmGnhGLmRKZ0JQ15kMTqSx0+Zh0AX5IErmSD5E
EcD7zb0QCHAo/0gl1MtfejCVdLZ5yRm9AVFUQPu6BXQRqvX7h6Ue6NJKDDiIpad7niHnknR8iycM
JOz0O65Z0OTIEFptPkFCFGjFgsL5biDqYilzeMGoQr/u/KK2WUH93XapSre7PiTYY5+v7T1JYvY2
ZUML2eKDHNwAbPqwxS2Bzc/Fz/dgwsKhynVw8mdTlmrmoawej89vVEpmHJPIOi3BQk3lY8pbhbyU
FTxLCSlWhSxAvBPc3uLVbFfWfKOLsiu2F29x6QC7rro0TBgsOlTNV8GSMY4d9JNc9UaP5Y7nxVtU
lilazhMYUN/eQmkGgheMocFEbLitMGGMLHNpbMptNzz3tkCrvXIHDkpOtB2vGpLVEHCZGfWFl5bR
exU8LKfrUvkWIFp42yEZJrQrNUtrNyqS9zl77wowL47Aftm0CvBnnoqtWvVIwu0U1N35zGrbuxhy
M1WDyG1ZfoL6Utmp2w8sUgdOAyH3SbXjrJfO995XZ9fQ5Kix7EOm6mbz60vNI7XbhZgVX+zZx3lg
B8DH+Wvn3j2we6DnAYCBQ0FihCWBr/yaKqQHHhwEbPHMKmFOmwMBh4iBEMh4AI3OiHUIsUyUfkoa
E/4wJCRxE7KE89vCgODBJ5CeUJ9UxYcSJrCt4DNQFiAfP14QRQDPdAQRxSVHNQL7qTru3bVLF2OS
imcahleYBZyKCRPT5qhsfgGvdnqbGmCGTGI8V5UK6F5i2w4tbKyDpRyZF5r5B0SgZWh4ZlTnZ0hZ
yNM+Z8TeEosDdtFAM0SeBz89YwdERY0yX7WjCGUKjprJApbFM1aKSNsOeS90Fhu+6W3EfsXlAF6g
F0AXPPAJYbAqjWVyn6td+53AVKF/5KzlUMByeebcdGqSZ05KtxGDgGoCutKkwpwVGAhtQd8STlyx
bkN21qfSsFIgq7TYJgXqWD8oXfooQ9qQ0YASKuVE9qHS3TBUDuzktNoo2rTCxmOPts5cb4Ebd12J
zsU1drYLHOC9OYY0/5ASiai6zRJlvLITTlb/3+K3RaxSoaYY1GHC0hjvOurIE0Jeu+l2sxhTg4HW
PTnMzk4ZZUniHA3WewHyEkkGbBWuZoPOWnA+XiqLqhNdHibVqWO922/kyP15rU+uGjJooI3q9Bul
6khzPetBekRNO+tWD+wAeKundr7dA7sHNnggQJRNe8h/7aWEf6ZDOBCXZAUA8bNgObvcBsyLyRnk
oDg4i2QPBgIdMdSp6gwPEwlPN8oWBbzqQIwHEsBKGCyohkPh1tmhn8pVBtIsaAmiPk+jXoE6KSNQ
LeiOo5jpSI80SxcJli742bIUGcY3pKEKivLbpOm3KZRKyaGki1W90lNrCkhIVaQhlt+T1WCSEB5u
KcsakJZdUhgJlVUuFZNRHtkmm7tUPPopFI1aJCFV5wxXJ/f47CurCMwF4tqEhj73RgcYLh2jnTcU
C6R46nT0bXWsxkxcsWMQQqniKFQ2mM1nKJjZNJXUZDTDZtXfRQiD+XQ4ZguuaPxYE9rat1Tdij1W
jnw1rqudkYfHctnuAsRAn3b1oevJo3pF388+uOZ9ctyTfYWojBpfkktLORkaVVPzatREbGqMmSO8
VnpjdnLl58iKbpy9tKnnlGdZQdTi0klX4aUTSEXvhuykd4Uqe222ZUxViyarK0GTiwZLEqFMC7ei
F80bqHMeKJymYQuq5/YuWdo1J0w+YsGo7ZwZq8fpOnppVnjp/N+YEKeI7ipDv2mOaoU8hNdcunqy
3Rlu5oEdAN/Mb3up3QO7B7IHAmccSkS0hO8mrIgsfK6J8ZAg1PRbf/kTu3O14zdijP78JOUSfTl2
EtDFh+BqutEXeOmMRIgSxMK3ioNIqBw6WASVufYcZgrxjb4gEmvp8LtS8VMATKIox69bwIEMYvt2
aIZ2fQs0aqR8uxgjQVQ/LQSEKwrIVEjW31GsIG1Uh8UC1YjqUBDVRS7S+KgJWLuBQy0KoJT48U0f
ugekEvG5xXiRJV8xYXRwFvxsptFR1hxyIH4KnTItTItAtz14jAsQ8pvfO03b1UbWLnSXlDHf6iiL
INj2fJA0fFOU38utFoeJlINHQE9ovJge09Ai9OQbzk2nSU9UVzhykXYWtTTTCvlIDDHAlol75qnA
WwCqPAlrY1+CZBWok4450BSUrL54VikVQ7dU8Kxa3a2xnWguzYm3FO8aXq0dhCerRDa2XXpogVnG
vVusWPUPFHCepd41mDF3wViGOhoRolQJWb59Ht8+UGqOEmHF6hOejWe+7zR61+SopFK7ytB2vPDe
CHaO0TuEroKldhliWWbVaZf6iZo+nwdyT14cEWV7ubtijmy9TWN9pOo8pSdYpUrb1dASE6X0Cqek
fuJnnrTY0Q699uwRlOqMF7YvFhmYFk02aNn2OeS9m1nymbO7ItNXb7XD5PHVXnq6Q2/guz3r1h7Y
AfCtXbgL2D2we8BjnpeEiAAqglsZbQol4rLKwKOhI/zE9/UU1/XdzsRaDueQiwNiE5s/2ooYyZ+0
dOYwzKEjioBiV7EJrNpPRnoVkRYiNYhFIcKoho/EgI9wmpAYsaKDSRBhAg30O1RJcfzMWoSNhcMF
pAWJDTES6elKad+IZIJH7sJBUeaoCM9Kn7MCsOkxx5BCtmBAKVl6YABWi/QhQVYgFx+FQAl67aDt
ponqZbt4kBZpwlSHwTIEwqNlSxGpZ6bhm7o5bkc0WAiZdvkDrs6mwK/e/5RDtHbrr1ynlmVZ2/kM
LnhYuJclwAkkTNf63gE5IE99kP5YDOkAW0xTAvFGfpn5sd6m7HdPqCa4AWtVs6b+miNq4jhIxAx7
CTC0k+m2uqh3S2JJJemZtR1QIuu7TlSejLatFh3yykLrbZVaWn3I/WWExHL3W+1jW9BpJWSAlsEZ
gEfpVpmosZdwXLfAE3gpJ+SudtGhWmvIWGi6xzh5W56fFN4CPzJPnIQr/8S6gEQPzM+5qw3XYxgs
hVQIuYXB2fy459Yr6bqiOt0loOtmZsNjZWTNRh8UFJ5bMJubT0EztXPzlQIrI2W1lfM6ZuD51JTd
Pimtuvrn8+R42WJTF6j0z8M5VihCUGvspjp2pq0e2AHwVk/tfLsHdg8se0AwDxDIroNpozLoZ/5k
rABdijgZ3D2UcCIAntCXXYn4LWwmuCU2oDh8tD6tKKu+QbziC37Bc03+rAB+ElLGbmE9ZEvPajKk
SvTrQUvVruoIBWOjr+wyMCwiwaHHMFUvjRKb3XALNkkAMRQg/lRU0+j8vndGfChoylJT7Bq1CFIS
jvrtytKNZQP3Ku2AXLFW5UoxBZOpp6LQoaQvQCBLEuANFMFPettUAjPN8YdXXRbJ9IObAwbWpZCv
7JIh3qZFN7+9mflqL+0C0PLBfSJbx8yoF80qX7FBPRQcfpYQ1IP7fj/Yrb/VdAECxBCTDFQBYp7v
VvOPSkI1I4ngQztrkb9VXTpmAZNZzqY7XasJWXf6tUTMoZWM0Kr5ZRf0iqct9VdGkY3xnX8OZsO5
SDtj3kKJjlAzR8wtOFZ7YNsnh3jV+6d4/FzK9GDyvQo55h179Ve1jtMN+nV5NJoWF322GJ7HacWf
TxQZOLWni/GCwtz+JYibl4QyxArDKzceDQvbZkhN7B2vRbw03OqaQ8cBUI96Mk87rJZGTba9PnOu
9qRui4dRYa8oy0foUJ3fRisyy88p6J/zs6pLilUrFM3VZNUfO8OxHtgB8LEe2/l3D+we6HpAgAOH
8I8SIAoHkmhoBwBMFySiO0UdDZ5x/5V9hN8O6dFToAD/gIdZweZFQIT8XHUoQPCmiKhfsYqS0xVR
yLDgQ0NfSEs9O94+efH2yasCywluDRyWCmcXLQmnIVNgE/wyhzr4nbSqBXqKnnGaNJEo+koyIyLt
ksNGU/XT04evv3jx9vFL2Pv2l6/f/hIK44BvKcqEFAU8vMx8o7ONBFPNS6zdQ7iqugJ1cLVp/vYX
qO6Vt4WU9TUFiUV118UQOiRPQeK9TXqDsSlA4G024Q9tLWQL1A08nGbq6h44HBgXDbvzm/vMhbxw
lcycY9T6p9pC3mhbuc0qKkylgiJ8lXVLVW8JJox5Yn5m/pg/KyviRdUczvyRpm5Ls89kwV9Gcgvs
bFcTYo1goydv32SVN/sCu4CzmhznXiqhmSIJLSWqPwbCTToPUcTtO0rljf4qDOHZUpbrMLZuPPwH
54cBwN5sfEaJeYlKQzhTMkKuxOfu2q95TVWHuN3CcSt1clS3xgoVtzwVpdvbKyeERiuAP/p8NqG1
undyjnNyt4r2zLm5bRNjdwi347Qd1DepbC9zcw/sAPjmvttL7h7YPeAe8GcgX5f9w8IcwBsHTsUQ
vWS0MLCusJ/uNVXg0W/3FSYU+EQC4PaSIUEGJG1bLH/qdUEQ7zt7VRfKKn4INe69/dWLt7965dj7
zwfDsb8CPmSw0Tc5U77wqkFTlDqc3KNk3+0sHXSQWdrq2VEC7UZUpYx8Tk+oojQBb7scEuZZRQKL
BXOawsB7FpX9/MGnL7989uaXb948vrh4dE7OgE+QJgMlSjYWq/989vRnjw73Dl/+9mm91K04ud+x
zKot3ArNzUUFpYNCpG1NQHt927PAp7z64e0vXr39BRxI2x2fC5rSlimETrHaw2wF5SK6zpc2aIVC
vvFgrXuX3PxMxVSp1Fbk2e/71fKHdj7TOSaHbsjfyoSa38yxrsyFmfJilFIi1iDy/DiARCkx+t9O
eqqptjm/EdDybKmLPIM5Yp5rVtGYKNjyqOaIsOlnNWXPE8SMn9u4XBSvBHbtG/BUMFU4YTDbbvnD
ioyBKwkD/Vs/bG6iHw3jUlccIKUtWcv2rXbOqiOpWQVuu8s30TmrxCYX23m4MMagzolsbDAPgPTm
tYC2m0V3CiSfh2S7CtB6cgQOM6bKp7U4v40TlTeXgdx4UFerbIP1qbBlHdVLt263bFct2+XLUtYq
opAlrcK03BYiHrUENuqZdiGb5wdlAOM39fWd6QgP7AD4CGftrLsHdg8se4C40dDRwdGaP2MJk49T
e7Sv7+AVWwXtBAsDmEECDsNdDlBxN6l9UFD4CkhYEAicwmNIsHbf61vUNBgJ+F1Aj783CMSMYMHM
IKTtuZXyAn6XE9LTXax+K2/RQWK1w1lA1x8KhUssib5JG0xFAW2Ntmsw/WAzDAN+j/7u8+efPr36
8OHJb589fvP08hquABqnXbZ8EDaCLgeGnoYYT++BCJcgffbo9ZNH//iED9M6s4pQs4NwJqzSMxZn
err1F3Q2yvQ+pLMCleVbHaz9zyeP/vHZo1eP/Y1HWhQwo8o6ghY7jM5mMkRNBt/dDYE8tGUajr1P
fmMD4sU31BASJoTGx1/5K4eX2QMbqp5JSDJq+DhmvaUU/tv0wnzF2st3nj8FvZoT54o0s6woktmW
8soW/vVm0lvngkPJSxCxjUFBTGbWvLw7MQ18giJVwCqK5LJSsKW0ig94AmbnRIUBurVXVoRdOZE1
lMwotRrRqvwmUf1S88luTMHXu1B0qra/DSixHlTx5L6tPjwAexn+HbUS1PNDhSWyr2JFY1Pigy9/
4K5XByqxKXoOIdzJ1dJYBh6RFcNZ/qmgSHVyCJ7h6FtFreon3WWXyIoaWspi5fl8Up3f1Nal3f0t
vhWF1rnySJQX2k3NJ0paFxvA+DhddIdwe9oZerScWnO3DLQfnblNRJ9XIqzrmVCdRioYPz5zrgzq
sC00zIOxUlLMmxdZVvy2Zy974CfX19fI/a///dW/f/7r3VG7B/7SPfAfLv7Lv/77J60V/+M3//Pf
/sO/+ku37ker/0/+f/9Cl0UHov6sKYBMwp4pi/jNz+wFGnk070A2MBAUWagW4Edwy6DR6cf3Hv30
c1y/3/7xq6srnLXwCckomGtB1gERYFAfvXqqGCajwSePfvNECer64fKbq5f/9Orrq2vEh8O3KHL2
8enzz5+e3S9IyeQ8e/mL56A8/d3F+efWwc7fvXz5xfnlt1dPf3sRxZdlfnm4/+DZp48fnj6A+e+v
vn7xh1fX3+IiZ6pCvVdfXpzeP33y5tmVgXy54vr0cHj68IkVOUGRy5fvX119e4VIbKh6/ecPr96/
fvYz06c6AIPPDg+ef/ZkZsWbZ2+/pFveoMjB07979vaLZP6b52+/vJhcdH318v2bF58/y/If/ePT
t798aXJePTm9f3j6aVHym69f/uHV1bV7W0VMyX96/fbrdzMN08TLXnpkUF9tzeX5KeTLboBMzUq1
oBC41zgbLIpqzLFpco++YfJxaJHiw8UTM/DBTx/4dBA/Yi4VWlazK9HzXHk7pW2eLZS2ri2ljuHJ
MQ2VqyiaArYzv6UZbVRexfey5C1Zwd9qmO1T7pina9cWJ20Ru0VOyzOTnBdTAq8uzX3bPtn22+il
mRnEAHJdpTPMqwoG/1hCWhOpaojeor4UnWqQWHfsxpEow+PI7pKEJS+1Wes6LXJ0rR4MinbctWOz
S1nUYNDNyupMKBlCNlKkSTRu29zV6eIWjpyfgasWXOr5C/UNrMvtNfbz7GyGy1Y1cru9NPrkhh74
61/vuOxW/aVb+D/95/8mOLBHgO/eubvE3QN/qx4wqDndbmogBABGmBYHsgiJPZyIEOWB9Mi1a6hv
xPUHCIOHYcCTD48efH56OMOHMBgyUbagmlnal6jVBG+fvCx7oUW4BwwMNIvo5bPfXTz4+Oz5Z0DI
3lznf3hlUc2Te8KNz39/8fydwTw7Pvrw1Z/e4/+np2fYbIzPp58YLv3q8muL3756qojos9+9cJnl
FuLzd5J5dv75008/eXj++1fPfneOW3bPASk/uiwmfAD6hbSrb81SBkXt8/zTZ8b5hxdQ7NPTBwgR
uzKA31+9evK7Z4eP7j19+BhVi47A76N/RF08/nzy/NPHZsUfLp5/VayIQK6/2SjkWeL8n148+h1E
XT568+zRbx8/+u3TZ79/8eBw9vxnSH/pVfz2mVWRnt75/PNnZte7F+e/fwFt8TPC5qA8efPclPzZ
47IOgrbGBzYefEeAEUi0hkbra/s0E3aobyAsLAA8R7+gIF9ZOuC/jIpBsU7IvdN2UGzMUUTMxYvr
Jr8Ez8xVpcaot8rtMmdiW7ClfPcRgEGcqjsFDwuqDYGZ7o5e2KhsbZA6T+WniAGO3Rm5EbNdDZG1
k93VKgZ6rpYdM7jkCru2kUZ1zu4RULnNbXvsgDmKR0VtouVZUGpp50LEOVGuQkqxfpETbXfqUMro
mCptx4tWwfKRKcrKiw4Z4QucVJj/pkNyaTElY8UYOBojqzHkxaFUndZ0fpMhFQzOlLx5Ydm3bRO3
jZv9nQ3vjsGlPuNCxifYaI6cGHTgpNnYvVI7eManrKnh2qWWPITbC02VK0FF//rJ3rc86ezFex7Y
AfDeL3YP7B64vQcEbBDvVdQX6AXRNsBUXHrPCHjwE5jnksAVqBgnekC+a35AVPFLf3iyYr/2bGdd
D3C7LyXo3bC+XZlA0ffx2mSgpAWZHAYb1v3N00e/KbDwo+tHP3306hfP3z55jfitiQbyLNetr/75
rTZUnx2g88n7P339/k9fuWv+fO+rS0sDh3/9zdfvv/kam5bx86s/vYM5IL76UjKfu8xy8/BXl5AJ
w68QVUbWxaOnL7+4QAI42bYoF/0R2rWCVq/WCGDFAeDT1Lh6jw8SZwdIgPfs+Oqf311dXyJhE4jp
8o+KrBY7Pjq4Fd9cvTcldXhxtpS7yN/zZLZwueHk9NHZw1ePXuCO35c/L+aYqjzs5UOBJ41ghkDJ
y0tXEj/Dn39CcL0oqbdJ6fZc2yxt9JN7iv0S2fpOafQN2M6N0Ea7snCu3SZdkK0xJ9RajJjZ93EK
/8a0AwkIbmfA5qviHgnPx3hOE5x51lXhjZh0LokVvZpqz7W4k195R58EDihtjRkSa3Y4mLxWM8gs
bUupFjCMla9mqF3m2wPaVmzYZVnsA32eeRY7fLNzYUyJDha9q+pX1fS67bddtHAnHWsupAVvQYmE
2jeWUaoEnOOUZp+zUEH2dkVx31arAPkk0OLDGH3ZpRVizCN0GQavotYcMJQhMVIGveu4VgpgLxMC
xjMRu5ojq97nnHnKqSnAWIsJ28YNbeMsIdMq2zNl0cD2rFgtUlRnzrBX9KJ/lp8XHWIFrQr5VgsT
s6aZXyCiK85MiI4Ul5tWsUzpaZtf/XVcB9i5N3tgB8CbXbUz7h7YPbDoAQIYg7i48BiGZMTv4EDU
iEIqADYAt5Jy7WBYqIz7nD18ZwzEwEbH/Z/gvPf2/Vvsrb26/vD2vUApBIIBWawu7gGeXjmrWqCJ
7qHVcfr0Z18C9D59c45obSEGioImVtclYdvDT84enn7qPB99+PqbS+zmRVnsRv766hKJ6z9ff/0N
sNl1kmmIkQfkxAFX3Lv8xmSev7tguBgfBEWtLjLde80dwpBzuI+A6OnTh19C86+lxunnD0/PkLAb
g6foGXQ2oh3TJdlQtB8fnVx+y+Ifnz385PMg69J+ev8M0dpCPJQEsgxqIqpsLvr982fvLqaCXFO4
Z+3IVvaqzS1WyyenDz8xgZfffF2Mwi80ogy0otMdv7FQYneGgwFsWhNBHyDWtfg/G0XF8cznSYLs
NZfWwFXNCMCcD6iKCLPPAoVSikoV1p2X6/9anvvO+PP8e2MRlN/OuUXVhqc7eb2RpB97oe/I0kFE
yLLYfH2Y3WYd29Yt/0YJeWlG7dZS7q49M6yV1C7QFTEAUg2i4lHPvYQ7OVy65vYbGncjv40Xd7Im
FeKKnjNY+oninVpWtS143gGb0BfXBVyaEi28zB1muGTWahWUpbWn49ak2kWN3J+7axxVh+fPjGar
RYdB80Vn1jCf4d7patj0tfEl5ja5N+zWe7GZB3YAvHeI3QO7B27tAQEMAV2LAANwEoxVs7T6jH/t
QHG6tqGU9sFSJbuqgWIQ9+qb61e/f/Pq96+vDGJVh6APgI2wLsQeCgcBW6r39fs3wLEvvzx/8cUz
54lYqH5/dHLxh5e4uffi5+cXP3/qPBDzZ8SE3+Pn11eIDFviqz99TZx2+vqPITMQY0FZ7oHr83ev
3/3p/bPPntmu7F/i89r9Q7+9/ec3F1+9xLOsXn1x8fqLCwZ7P1x89er9N+/PP3ty/tkz3DYMrRIA
hoEF7k5ODrRJK76iFZ89u4i90x/de/nH18Dtrz4/P+/dOSxHuYt+fvHi8+fh6Dd/fIv5ypvHr+wm
6uTPi3cv4I3znz/Hpm4kLrBpPM/G4vFjU4tBSSj/gQ++AlVh5/m8XLMZ+txzkbbIc2yBtt8lzN90
hy5B/TN5qMO1ConF0EUjq2WzjVF3W2oLZZvF27kGiPEvMWu74SPO1YaIztmT4n5rebqU3KkChGxJ
3I2pPSlzhLnY7edFxxAiA54B+BlAqZG5MSo10gcngdkJar75YssoPt7ng6UTCbuhyaFJC1xFkR+y
UYN1kyJkUmbjIst83UfFc/sGpUosOrJqIJmQ21clN6u3scWqPnn0gteWAZtbaqNaO9t35oH9IVjf
mWt3wT+EB/aHYP0QXj/5yd//L7wa4coXWFRBYIC0g6tUoCx/gkhOu9QBAnHDsx6hrEMvB/JDGLj6
lljiW390lhawBb8pVveO+nOhg1MIGRXhgwSFCDbrbUa+xRqiLv1pyWaaAtdFJXvGMpglR6WkHjkt
cWl7v/1CTifYnagMkrvaKFJ2X08XcgmRVlKPhvsrhUBkcYVhzTRymthism1Bh9qs2sSaOQ8+fvji
s2fAvY/fPp3tgrbHRMsuiBUQVYLO8dcUUQEDn0hAGtx7VpYt8BOcqgUGSm1ISGrr9VfQ3yois5S/
f8lbfxXjRWAWhkMMjNLyByiM/AsG4/iW30qghIh5YvdNRNNjYoRnj9MoTYhRBJCbx8XjC3z3H4JV
zRrbeeSxFOm5Za6Wq46Z61Ki+GP63xaPvAXJ3XDTNAtkqRWeVg1StpT6PnkW1Fwjtw13VBvdnhkK
HtvfNCgGpcYYb9sEPfaItonw6YDHshByvOfvlXFchA3PokRW9EA+Xsg6zDzhJ4EM85YMD59sTIQZ
LapZ7jU5rruE+iL6ncVsGQtrnXXKt0dk+9nVzzwDip6nDfcuJkoYHxWstOl8n/MS87oh3VOZiLl7
V00ZZ9rgEWV+LLVRnPe2tEV0xZnsY8f7clc0JdGCfz7ZH4K13luO59gfgnW8z/YSuwd2Dyx5wLAu
Ppeeb5BDGAUQlPDG0SPBj30uGdy79q3O/qAsSrCn/gqLAhSBQUWQEMYLWCgYJDagPiFM1IsawYyD
pfwxywmnKT7saE3ITbhLuiMXCkMBiD1zAOzPoxZehY1gLvU6AiSzv3EXelJbw8+QDyTM23oNBEpn
KsAbg8v90iguY1EWCeTqoC16MPK0OkBRUM9mA1KbpQxqygnQBGlUdPX2y5dvv3x18dlT7KY+/+qF
31trBuIj9Iu6wEnY6c6kQwL96o2+9qJgyQQ/2ohFZusd0pN+9pZVS4FIX/Fdxy4B9/3yvU3eRmov
e9EREkTadqex0C+EHKZIr+oEBrYqipOU/pj4Fp8pUMB7yKefUWMqKG3jaLHBgFJNxUJUhXVj3ib+
0DwnkgoryQGQniydG1h++RZH/STzyhbE4BlDpl78artBt+dsrWgpq5sb+2qES8MDrZM3GrDmw0Ux
N+iTuVfnYbJF1WU9l2J68m0V96tghkDFjGf+QhoTnl/AozsgogcuJIJnZtmWxaZVntT0UzC/VLMU
KtweAA+F23ipskZjc+2kJOzkzuF5xrfspnNRUFznai80u1C1Qzg7GVk3HFNbThd5lFWn+sHKoPRr
OnwVyA18WyWyRdGlKxvj55Yz52hEt6NyTvHW2TJgd55beGDfAn0L5+1Fdw/sHpg8cO0Y1aGvkB4O
IUlOaAT//BlXhEwW9AuMpxgg2A7kFGIRaARF0oIivIfvApwCj/k1UmiJxf3qIlGiEKoJTttkSz9F
0c2lEotPKWIoTppoZiaV9GG6vNPIpelJyxYHJoMFolVLAZMetpWSMjasw0+tGuiKLu8x4W9XpuaK
IdtHQlAjatFPqwivO8KDnb/83fmzd+dfX0MIiisoSoHxpGWrogjUc5hltb+MlwXdmeAUkmcV0yO4
4j5bRrnNPxACfXRvJBJsZVMY6BdZ+OAnlKEo2Wj9AVrRBMF+I4KTh5QE+q2O8FLOcreopSgK0WA7
irRGzEQYQ47BDEyVVsBYlMjqJmRdBa66lK7tmZiVn6u6MmmjkD7PHC1sAZy34kkmbJEzaMnI2mJ7
6mZzkbkh2sqq/gAGtXjbEJE19ed5o1c9R2whP6oeUCpc1+0MXX9VfS/qZQLei7ilPJmDe11KDqOp
+GLvavUZD8DsvarskmfywNRYq4REE7dZPcBWWddCwTb8iwrzKoDqzxgsKKuJ6GCBXVdOHXJL5YTG
7UeNtWjTCiRntNmuiajO4waj1K70b0+zuVnDNLamnBzrLxWl7dvSMEplhWeaV2Ot8mfVkUJhsQ2H
W9MyO+G78sAOgL8rz+5ydw/8bXlAWMhBIEwHlBWGAcIRfiNCiy2vyLIoX0AgZAGiHHSJTJBPP/M3
KgKb4qLMsssJEZrhuoIV9SRqEafrjYiFx8PRUQRyrqe6rBQqArKV/BLIVbzU3+FETRyig4f8YYLe
+eQPu5ImBO2O8MMoUEIlSYNbuBbg6FdiWVxw2j4QqLQOgtvYVm0UOQpCLh2vehhZdYFInytwbY0F
5tIEVjUo5HQgykIWYZbnQ3lVrZ+M8ca13+ejtMi7x6U99tnCy/ShRX1LI8bOZ9sPT6JqgVS5mlPo
qSll9DUt+1a6iYSDPU1HTJ7sh4islEc9FRvPaaLYINGbQK+U607HVUZZGU0N5lUtfFqiFMmzOMNc
chuCaMNB/TBFK4dGbIlpeBXc7Fo5bQtlS/vMcGlVoIs/owvlFommiUSe4ApN5b6U8VWLUaOVqyo2
2bPGtLFLr3XCQTBwrEG/20SXoANvHEusR0eoUpmjEZRRRzCoSAZUQakSczvHDokFAhXKzAEdQa+C
kxsprnAKmLtq1Yk399KivNe4EGwX17FIOJeqLK1sX+usTX41rAblW0iZmHN0d9A0WXwGzCtqd91e
6ZO73wYvmJIbR+4GaTvLkgd2ALz3jd0Duwdu7wHBHgEPgCggW/y8plx8E4gChtlEBFgLuYBe4CRd
e1x9m7EAGIoApQQmRFpCcBCFKu7qEFdgSVgO2KlEDiOE60hVQEvC8U3hLoo//Vp7ZmnfygseMtvP
AkotkCh+4j0PnMpqHKBQc0OeAZKJuBxOX5XANRhojhsr61ijpmsOR0HkyoJJgHWoBRpCq6KbbrL1
zcmQCTngUUNcOijVFnF/iRTKwkVgoFZ2gCI18KHaOMyl8qd4RCxg1c2HzNLuE3yFBMjBAZny1SVr
p5LY+ax7oR3Dowp6CVud7Zt2xeuvBI+lISAuzES5alpwn/n4Bl0uxKEnsalxIMQgd5EjaeWYQiii
DODrGkLoFw/sGlPwNtGttwuZ7npKFDNd88N8xjbLmqOFlTDIgpIxpRtA2RYPREvVTdabps+Ye6hy
ZiYZZspQ85Zn1rKtQl1K1e5LpQJyB0PVzSoUvdRLj+q3SZmNAKyNZwpRCCQMEqgqgEQOGkuFGoyF
Ym0XCko4ttvNKli72litkORJV+/PrmeOY0dAeykR1lVwN2TWo6DVfPWEE65YOoHEEEiJOOMtJuZw
XS7MsFbpgJQZW3b9vSne246XJevUZNk5LSX3rqa3q7vKhDbR2lsbtWWsjc8JS+2VRreWCze5brWT
7wzLHtgB8N47dg/sHri1B/z2TgEnoSZhMEId31WryB62uSq0eE0kBpaE5aJIADwHZpRjYK+U0r2+
hjPxTVSsO2CV8KgsdMAHRXgo8GhyAMwUziUxNLFLKdCawSbn90gUJAiMCTrqJ8Abaw+s7s++JpYw
D6giOsFfjExVHRbKajHgWwdxIA6rBZqo0qKM6rJnXFFDs5rFDVJqXQCc+MgbZLCDflMM1iSfOdv0
PqpSdaxf2GoCNKGq5pOC5x3DQ1rxg2S6dTJT/g+ZSKBGyjGtCIalpyuAn4LBtMXXLygB1oExQALS
wsD5qHCOQLCISFoifEtvmBqh3lzUsb/amEOX4osXlB62CN+qnygRn6C4toVH6sVsr6pLpcY8UbxJ
9GdaFBjANebu4aeW4lkJ1y2WSt5elNPjqVVdwjyV28MWySzumqQVOTPKqkuX3K7WzM0RtoTCwZNN
aGuMgksCj+23iX/CAHpm0gIqEIoTczehftJmZYGSfwdz+grwdHt11yerkHJeqorxbsH8YW8wVxR3
8vzpX8aT/B88s/6jniZY6NeXtbNBDIHoOWnRIWxtW6S7LDLG/LHMIXu7DT1q+upk2Jwe9fAzfCIx
OSedbYxYjNUD1eL0JSdHL5WGbZeOnpwTs34xPu3nM7yUyeptuWREZb2NMN1+vRNv7IEdAN/YdXvB
3QO7B8IDB6KXnkMcogAyKbYpBEPmgDdGqZANKEAs177XN9JTFQKTPIxITDjFeCWQH79JOMW4/AZg
lYpvyYIhqDThqInB54hTpQ6PAbGQVYKl08wbcmiCI3NVJKIOgkxB5SnEfVncCBcVTYwZtqA46ipA
zoXQb1ap1JMbVZEOJOht9zx9YpUGZ7LLoq+qF7mXebdwkcb/aUaV0pBDUT5DpapakhAI14OvYlu1
tYIWRwj7TUP0EGpVgXO1ZK4UPN+W6aDxJ+3cmqKMzSxFUjOBGYlbHJUaq5K8/ye+apgsQbjKLgmo
JlgtRVNktcKWGf+AJ1TOPK35FSVjwtB5i9Puiqdtka7OleGtu25PibGQVQplMhKudF518mqv28xQ
b4JYCAC2cftuDV3s1Nel7fYDSvTqLGuLhK7nt/SQBQdWqFhcEUiMQg69kpCWEgVzVa0DPXe6rJTR
vWW8NFbMNjjMc7sANYjjDhArKa03NvYcP2V1zznqk2zuSCx28DSuPTrdUlLhFq63CvdN6Ha/WJ2p
lmnas2LPgMXW3zycd8ajPLAD4KPctTPvHtg90POAIZbr8hRoAAykFeLDB5cuhviAYfS0Z7+9U4ju
QHFI4CfSKCjwhm8wgyLcorgi9w/r9hi/c5WcdrFhcX/+ln6KAn6WcnhMxfygAgJgIgoW2uOaqZU2
6xqxKiWZhHMeHYUO0FCYXPgKAs+Yq8pkrOwqurlY1UK77G1D9EmARpNAB3qcGVmsS56xIDAS+Fmq
kJemDcYQS9Qn14nTN5+Lk8q44VqkKA2kyK0WFwyXagpCr9rPkrC5KY3ySaqklZCmakTV9uArOQEM
8JIS/NgWABLxPzZdCxLHESGCoEAAiPf5W992sHbvD1KJVfiqQTR9knxscgkxjvGSaslzVrkr5kn6
KUqkrbESZYuqN5oWT07NN9+2M7wWvEXJFs4NKK0PWzkDY6uO4R0vFQhKTii/NWqLVzNPW10rYaBS
Jaoq26q3hTI0YQBKl7IyWsuhvxwFtcFWHuyMdIsMB5R6LLSj45aUzaOgQn1bgGvFUyGobiy02m88
VVoat6Usrl4tLWxVJ4rqZLLcgbfgvS7PRmQ7gtBLw6SFkQNKjGvybAxoq8fmlQtHy0lCUO7svNGe
5dKZMHqOJ/Yt0MeemY/n3wHw8T7bS+we2D1QewBwBJ8zx28Kh9pdncSKtucZBQ4MkxI++c/rBBeR
K5gHItLCKkgLv2nmiuIJyBlQZL3+FiWCKH8ZEmEkitttpQJsdsnjO2zxzZ96Oa1js1KLgKXVUpQ0
tAm7BN4uffOzBTOFHgkabVJCEGs8EgUibnnl5mHtuHa7IE3KkOhoFnZdlhkPJftsBmXBCbHUCt8G
I0UJsC3hso742UE40mclAItcmBCugBVIQ08ULM4x3At3UXkHkJQq5JmPKhahej3KjQQqBYqGhjyU
uHdZtprLqzCQPNZJqLy5F4YgUbY9+34BRnqRCU65zcWWCDCI36KK0nz6r2/BY9efws1v9/z9w/w9
2pWXatuU7AKVcF0A+OzPmMtmNsnJFFVfTXxjRhgOqeaIIUR9KYQgUQFIUWL6OK66VeYGlNbecHE2
M4iVbyue8G0WIp7w9lHOad1VtWNuoPB/7iXtqMnNkfVcao7K5LbJNnVKY+oC0Zj6dxPtDl7JiR2k
/eJUcpaVKJ61Bc8nVDBZmTt8Zqg8E5iqFdJWHc4pWTPMUxB+RnoCJ92AZ5Ulnpknxzufqfm0F1qv
MvILQcmaU2bjuurw827pJ7p0Jj8q2Li0LpDPn4OFAOnSOdlWw6QasHnDc8myLdAaSuU8OZlGymjn
M/eZq1FyT86UPKrCaquiughWoy/6ebfrtkO1PcdGV0w7nzcuMWw+E+yMtQd2ALz3id0Duwdu7wGh
k2v70h2/8cglIRzFDz8A5glJgg3MgotIgAf0g3PyclnwIa52hKkGRClnCvZGcRRkWjy+XYoVOcJU
QVR6yW/BPCgZqE/641tqALorUbS1K1ZBWR4LJcUu4TTNKwLQYszW73SFBFknY3HIUqSVRciq4q6A
OLVkIK1wQCzQskQBnMcMAEJUEC6SN5gWsvXHTUmUjJX3kIsE2PShE7RGoDuiDUWLQZMweVIYqdAj
EW50tYls/U5saCWlKMEVkBr4hu2gSzE4nMKnR0xzioMPeKvJh3Uk+k/C79ONpnxpWfnT5yLFRf7S
LDnfj+9qhhEKtzP1mKBDhd6MPHSbEl22ILYzs8EkbKlU6+FKj7aWm1Fa88Yzy4477ohUeTX/bB04
oHTbMVr52OYeNGvYvYVn6KTVyG0GsRnFtcB4BntafHXLxq1WOmRUNj+jYmVVlNt1lsH5ocpq8aQo
GTou8YhNJ9gZT5znaVTwTGbKOnlJbsn9LdkeIejWH62NLaytSgVDlG0Rsit8h/6ngbW26fXFXhUp
xrYwZqvFi+jAR18Lct9m2iSIWAH71gkbz/y3895eetUDOwBeddHOsHtg98CqB4Rw7Krn12C/sbNA
OL8wHwp20RZioRFhKpatvqewapE8XXUODPyiIJFebDzWpcXYQOTHELgkg7mk7XW4RQF/TRFKCVex
lO8lDsNVRcmNLdl6XpS/4xeGAKaiCCHWtBsZBQW6ijck1YPhJE5XRIWFoYBWnVEjYCQj23HoGc5W
adRVpj7uH1jKZQg9fnl2ZB2QS5M9OKxVibCRVdvBhD+eivg2VgriPUxTu7A1bU7GUlh013OqY71D
Ca1BWK9QG1Er7YU2unoFj2ovNCiQdr8yqvzMMw8XQBMszbUGQ/JF8oIMI4c5RyVC4LHzmwFkzUp2
4UR0+CVE16KITOlOE1tc4W1RtDkKImbmLZLbCf1tKFnzgSsiq3VyUNpmPbahl9wYrTyofQtPhaBY
ZBDrW4JkGSSo2ip816KFbpxZZWdZY2cOViVWB0I1nAcjN3FucU54oAoVRhQxzIyFg8GpxbIGHWnp
VNB23UbO1EbF9jbouoWyonyLQrdRRmI1PRgP82xv48Dx4kIVtFefbHtspeGsk28540X51dNCb5jn
gLMWO9rGWm2aneEoD+wA+Ch37cy7B3YP9DxgKOWyxBLxnGfAJGGeU25qFdDS51A2A9u0qgBgEAFL
8A1grGAvYa3ApG4hVhDSi4AB18vTaW+wFafweEx0REEdRgr4EZ4Z5ENZAEjxI03cbgrAilhHp9rC
Zg7JisK2wIyyQncUaJhZVdDAWbwa8sEjDaUD0WkAPw9gSgi0Yi1+764sVUWokQsHetiy39cKupSh
AuZ2yBGAFLIFBQ6U4YT9vk7BFQTQtals49STBsz5iwJqYoeaVNVQ+iXVAJVOcH2Y8O5RngpuWhzK
bnneGAyKaUX8nI9v5j/1yyGxB1LKpndUikNu1450uc6PPG2azTa2THe2oNYuZO1Nzb32Ln/H540H
QplBjZpi5rYOSpaXJQS6rnTIJlQ8LZIcw86uZBRRKSVwrFKCuUrI3srnXUpoEl6q3NXrd65blRVq
S/PtBY+CRr1eGtg1z+9zRBe6ZJ5xVhvyzSBwIMfGm994soDA21HQ9dVgRUCoScdRidQcrZciM+Mf
WS2jwidtovKtRHWAVjFqqiKwX07krpsH75bOTJ7tEeylHtrFYCstS1nr4C032Xx0xz7n6eHPvkGp
eXVWQYnTE57jedrHP/O5csLMhN5J23td92S4ioGrygaB6+Xzx55zSw/sAPiWDtyL7x7YPQAPMEJo
oEWg66xQQAfiAsVmD/NbYe0CTXACpAQGJvSMK4Nzig0K1zFqp/fiGnAFM9JCMkRfvOA6uPX4JLKI
JD1ueVmKRKWgQBTAuUKpZfOSP4MK01ZozjiwNgP7RU4KE2d61JeVS0PTFibw5xTyRRrypTC/bd7G
aLlPEItFAvnmLhmuUvQADj2bSg+mcnyLulipKUCixaLZFsYvx0oT8tghf4JB6Bff5Kyu1mMYJkkx
xXf8w7YzHShcOgBwTuF9gXDViG+iYi1tmKpwAjWPQHfAnjzNVdUfF2vyf8iAN+gq86E6hfUodR4o
giqgGDyAbzu6k9qe6FvQutOgBdxCzUtdg0So0wVLLbTLYlU2o0pRlqZrW3rCWEJ2Xldai7E3+js6
xhYJrT9bN4Z6mbkVnn21hJC72Cxq7FZUWX3sBDoVb+O3S6i4RbODIGc1XqoRFGNqY+t12AZYN/ex
8ExeZYiOffPq+3Axx+XCRkGjOmTH7HEostJuglgatnHSEwyuxk7VhwMql/Fr9w8P+vntPNN2qlvI
a0ybE2Ivse9kTvucHdIvUKqdz22YNyg56+aGLJ0e80k4S99wVo8VFpQbrF/cXOe9ZPLADoD37rB7
YPfArT2gDc+OZnkZ9gdfUfLsOiEMKYCib4EfAhi/FYo801OL9TNKsaD/jEt+FqgagWxVxXXZ+Syo
KU5oKzlKk+7gTbhRZYWolCZxsqVQ/BZfxR4deKVSUbtotELvvHUkD9QHxYSc9Sk6G5yGWKrt9xfJ
CdTK6yJQL4Cv1Cu1ufRgF138pIE4hDYdbAvJywPSn4kp3I2fKi7kHJy0XUDd9ZE5BJ8WrOazpjya
TcSrQ8++0iKCVUQYDAkf4BDO+aR44Idwv4rjp7K+dXn2L0NxCDOsS2nexBRhpqtSpJTbOToTji0I
MPaqBXMqtR4JqRSJSbDoLVgVMb6DLSiB2ZTIgCEo7WQ61Oji6sgNyBeiKhfF5C9XsVQqMw941Ohi
ztiyckJleKCI0LDrinBg667WpVWN2fndLhXNN2i1LLPtQgNKwK2mv2W4UsV4bSSU2OzSQBD9qPl3
G+cMNFLBEq80d4/K89Fpc1u3oCJ31Og8Q3e19g62BIff5AoZ2AnnzoW2Tpsog5HVdtHBeJzXOEPR
zBoYFUU39gHxC+r3m/j4rmIlqtasRvd4mA8H3ZYFiFi/yI6cWceWmjVldcKMLtpNLI2r4eh2J6fX
Fx/VRuOxvOd2PbAD4L1j7B7YPXBrD9j7exTKOytPVCKwid2nUyRQmIZgLACJB1oPE0XxXsMw+BZy
I+RTXNQBZK4CnNcOaG0nMAv6PA+lkMXqbBJDFCSk7ToUmGU3zSZoh6SebxwIWWUdixJK+UOeFQEW
vqIabrgsCujFILnjVRql+fHsRU2gqkZYeuaR8CnKHTpLT3yDU/5kLbYRHf5RWg6EPuKRelQAgNPm
HMVwaTtRpLCKlBp9MipOWUEGB2OKlmsLtOxC7adl4QDVRbp0FVUXomwHAfWU4ArnSIsAftPbfekB
MJs/UDt0AJ/cQkGC4l5cPQGa2JHDYm2cx4u0c1bPSP96D2KJ7I2g2uc6gdnyLHaMSFXTzXjCpWMz
k1b1rr9cdSUkl2qdFg1azSwznA5AKz0lMBIixkw6JyqfjLHTLR3YNa1aFGj1WaKEtLUJ92yiT+YK
6FbdOzp8zP5jB6/qjNBTBSFMDu+SaAVGpZ5IatRZrUMyZZDb9qIxZeC3Xkt1A5tLSwZi1ojOkbql
3l3Ti+bTOaFLqYZGoMEMnwIxCqd1+9uCvVu1bfi2YMutwiuFq9Fdxnt9VsxLjaWh49StqtVGFVzP
lC767XbXPv7s9tV5z/fz0lZfkC8uIgG8E+UoSTvzdg/sAHi7r3bO3QO7B5Y8QIwBAGPISlDnOkGv
QwnDCpIJiSGNg/FP2wqL2CDoCloSpxmwQfqsIFvANgEbFUFZlnKBksyyliUUBQo18eddAW4hTfys
vdZ24bnmtm1q5Y+MEui9LBuVIVlAF/VKMvX3t/5SAafL6mKsjJIOVikqEiakaXazMUyTtlIAh6Da
pQnXm5byA5kdFaM6fCAKOkAItVJFNjMTuoNApWWjsC4Nt+ctgxlVoyCt1k5vvzNWCZQNW2QvOZXQ
Xda6LdmfUKWt71p3gPIIAkMxHGzT6T5k/cSHzafN3prJ4WOTbDAQ1aj18hFYKPB2QHTIV3/BZxbx
VvBcCiBB4SkC3M5lM0WVb5nzbYm3dGyZ2xdb+5w8ANVr0MhbXILGzOH8YBZ/TK8zQ4ajwZYn5VFd
W6pqzZjTh5xgqCgSlVUKznYmGsyt4YOsYG6x9xYHVjxL+lcGVg5pclc7XoCxLtCVvAwGAtS1WUsU
0W1QlPfHBKWv/hjlqswY61Y8PthLbdGZs7u62G8zIJSXsl3VitWxo3uFn4pNPDrdLa12tbBQDiyl
ptWouWdGUejiui084eYIgA8oSz16kd62ZmblgF0/Kw5rFe5tF3SOVrXqt9XpsXVpexIQTzHZb3LO
FM5G8qaJPfx7k2Y6sswOgI902M6+e2D3QOsBC98JhRz4fZ3e94O0ndsbDAxMwpmHxV0BmVjQ3ygr
IYBYB3vzrb/YlgFGrwLwjzKn0CiKsFJ/pHNAOHAyy99LBAag2ZJr8FLIlsjZQaAS4sGEA3pCgiZJ
BFQTCJQjgj+VsoJlYd4isbr4Fbu0pVlBWiHJCF97jcK00FbOLAjPtAUHiECPIFI3s0ILB+DEQZxp
x2UxgcoIoPr6Au2NvdPTJmq63Q9Vqp8U6DrLLkL3CIZrdcA+Whqg93wrNfG/eYA432YPBPbuFlFK
nZ4mfz6+rQn+O+aIiP1KU/tmxzAVqMms/4R1NTwQ+o1YwXoiHrLSwIN4mec03T9mRr5gaiFXmLPL
PahOHrPWHAqMeXYwK5Gnrd25uCR3gXGomrF0Zg6GgW4ZEou/UknEgYSlrLGcVreVdlp2b1IgYlw+
U2eMS5izTmzrnKg1z/gjzBtxS6kVAcwB0g77jp6L5+EcbTRY2ljlyW0a8E+tHGik8Ji2mScckgZF
F6bm0G52UcC/cBpy41yxsRf02dpxGqMsfJjHXYJeZsIcIQelnyjtLtuzB5YouQPIdlG6Udaj/RBt
pyGsJlNijI1TTd1unPu8dB4A+GyU6p0tDXR78tzts86WG3T5FJRfVlwNczghU4726l7gGA/sAPgY
b+28uwd2D3Q94NBL+NAuIgXuDvwF7Fdy7ZJ8XeAl4aIfgeUKoTtjyPNpS0Oa1MBx8Kisa5hk+yQJ
VUBtzZgJjwV97SdnGKYYpIEuUfMgRnf6no32aZ/0kSiBQ2FFgUwqoEM1GmYTMJYJnHnMbIf3io3+
PiTqb+gX/KoriVVodNu9f1n9xbR7L5pbjNC8ON8XFGistHIdwKaQuCY6oXCe98jwdMim6tB8zJtA
RQqf+6rUblkKth8xu1JtMXnKUyUt1XvWfNoUq/izujZO6dru3bO7ph1baqMyG33VSluSH4MlK1wx
j20Za36sH7b4dgtPO9PNpbpzaDHMn+VT9Zzcu9quWEXw2in+FsUHPG2E8AiBXYcsgb3iCh/L8XPo
N1em1/fqsGFAmm3dXuhO8pcS4skuupW7Ws+OLyvZkDinpYR3pIpSamlV3UIZeCNnrXeS3KxdJNnr
J4OGiKGRg706b1eLmNIz0H4F+33VYL40sGkdrTvYx45I144Y5jkxOzms+3TnuKEHdgB8Q8ftxXYP
7B6YewCThsvp3stp06zAsJAeDoI0OwCBQGFc13AgEioO4AcKeMQPCsCnSimoiISQKoO3sUl4An4o
Ah5860BZwVeWMrhLmb4/FgKZ65Me6uNxZoJGHHq+seFhiZW2BX9OcW9kFfiHUr4lWBuDZb4iujhQ
O2qMelnKY6fIpY1Rl4NwYjmH8RFTRUFhS1lKb/hd03ICqzOoqf3GUoYJec+Ey6Wg4yDdrVBCDEgI
QEJP0s3zDDuHOSZQvpJ8ZikurYJWtYgMfTsAltoUkyMA1WwVP1VVPiTBnhmuBQV8yORGqc9If3ie
0eBpZWTljSYRRlCFmi1tmRwH88ZEbVFjZcdqkVqEEKyDuf4WXNEKnxqrV+8Wmd5YarIF/ZWlbrBq
43ek5Gq9PdBVa5varBtszJ2q6idtx+t2RZVqs0Sspv6Zoqq7lMjKKi31x42oyYsvR8Nm+xGib4zR
cqvTNnAb5QbKt7holbLFXSvDerVTaVAkYDw987n4ajJqAyUv5+V2V9+oelcsrwzWWVaWAMYNlE8v
vcYdaJvbNDSP/i/KzZeHstrdM1icyjaeA+fWLZ0c7ng9ZaXz/e1m7wD4b7ftd8t3D9ydB4DB7ErD
41CAx3UKBRNB2UHs5ztmkQAI1PZdQS9iQttNDfSC70IJ3OKwkOjLg4fEWr7NVbWDglyKcsQljCf0
i29WagmFYVmLfxcoZTgc6oUt0h/v1wGn4pzK0rdME5Hp6Z5bEIUGib5Uox4VZglpfs07fpFGcTCA
TbbjEMKXUQKfJJo0WCEkHGklKEq6aZ8zKrV7s1UWcnSwFr9sU7ege+KyOJOi9J5h4XZ/WdQV1S57
jLF+YW6RAtKKudqqLUisu39VlQLvSEuHb8tDsPKcI5TClM7Ul1ge2POM4z4SbA4jU+B9rjL4+5nD
FVwmkN9UcI4BBoBhS5bZMX86TlCieOZR7W7InfzbAhjEk6FIVSrHnYK5gi7fA48m+lK1W3trwhhf
LRmezV9yYCs52iurl4lKBwiZnsFWllG4vdn6QHpV6ZZutoWn6orSpQuVI2spMe6Ynbm7PeGPhTIY
2E7JLd72gaBUfXju7azzYOkh2NrQosZmC5y6lONWAQYO7Xa/P+PBCNyFlBaGnCInswfOXpbbUtQB
9LL3spCnxADYb1xGCYPyymDHymi7qhHDrtCtpWRx5SFYSwFh8VZwV5bGCmZfvTl1uke3tEs42RiX
3K419N65yBUo25urfc4KPvvojqdAp8YadJw96zYe2AHwbby3l909sHtAHgAIsUuPpx2DHTxaKxTq
01BiLTzayq4W+LCITyX1U9FF4qUpIFnQgp6PFeDBZPLndBdr0ceVyTBDdQGwCfgxYQfqkqpAd/gW
ZlPtzNLzrvCQYQN4RFkRFA0TJiLjmX6PK5hVBb4V2QblijoLm7GieNERGAUXPQpNhyjtD6PWFBPE
8DZygUjlTxwwRG5UgvjZ56M00EF7aCV3hZeStn7Dc4iiCXaphkNKEZvQhJcoyeoShXFgn/4yoei0
ELvS4NJ9wkj43c7SpxwZDBsNJtBMmxSyy7mryW9PDlNPkHqsQiDcGl3OZOvwqFCB5nA5pLadYvX1
bpALgarxjkHvyFEJhCw6c+7q6lft+V6LLPEMBS9mau5bGZWhFLLE0+KrsY0DsVXBdvJaKbCkXqtA
W3DhoT5Vz7lBD1TXChDSopGI9w5a5rjO2W36WBHYsrIgVQbuDYaeJ92QYfEtFlXOjzODXFpB6MqN
Aav6Xm1ddBSFWNHUC9DI4k5BKoBxGRee5adc8+0WD6B0u1IwLri+shA6yDVSdW3sTJUun3xiGULC
cp/PlMD2Fe4NzWcGNqsPo3WNWNhKJ/yoekK/c3PrJZXYAh1wff4U6Lj0DAbsnnV7D+wA+PY+3CXs
Htg9cJiCnO4MwA9ADtABQvCtdLkQWrSwEP1tPWIoSMxjoZIlSMO1cCXsAkmxevrxFHwWc8A5AemC
0BwRoRZAOBQXMlS9ir6yCoU6HUPGgi4qyuaEUZAgoEVL7RnL+WIvtCboRd0VPrUJAbGZAzMZBTmg
XE72WlnZAhQHBaSDahR0jJ9IQGAYS7rwp32kHg5IEJ5Hmlb7gYQqUkJykBADE+7kwuCh+Eun+6t3
pSqLu28Fg6Unc9Qi+MZ/rV9Ey7YQ6H5RsPovTrnUFibwjXpLHbqD2iTDnzA2GTI5bUFymg5WcYbV
aE+eF1bMg5DFOJqxqOWNMxBWUnOMAafkV2gziLn2ludmlErmUQbOZ8xm4AA1heQBIGmdM9Tn2PZV
98ilVnuX9fRm10Alp9Ix+FvE0lqzhWcq1UYsu/5pFxS6XShLqxqurWhj1dv6T2X1GNptcdEWnm2q
kWvJgUnE1CuO9EwL/ru4q+3b6/r7YnfDWJmjFZMluMvSW/y5yrOO2CtNu56Mc8KWhE6eVW8vlEmf
OWVa3Vh38c5xBx7YAfAdOHEXsXvgb94D181m4KAceCHHN2AYE3oXkR+MhQqh2VVHcEXM4BToBZ4B
buS3A7kQCCKwtBAOJFymWC5m+aCAQeAWlZJHbycSxYEuxAIM4yfBmz+7GMxCwhAi3eIgcdpiLYUh
P2soyEcYZjepCorTFrvkp1CwG04eu4ma4M0sIqfZBYVRFhQScZgDqbNCqXqcsr3ZiHXplmDbjgg0
LvBJ9eyQnmTwupCLD70k9fwWYgiHWDrEsogknYFgWPj2ozOuFzDHYTNyoSGqQLNKIColXHcIDehL
KwBZ5RKpEIBWwpYO6IXq7sNdSCXcay9DYnuhsex1U9AWQrncYJKhDPXXAgePiOcEiliKJ1TMvldt
/sJJBXvNmhslVEUoJjljT9w4t8ZReVbaTrjzuzdV5U15XGEWN+vmcoLSZvUrzZqELyhzY+Drxg5s
C1ZtFx1mloidzyW0OPW3u9sLHRgmhOdOJX1u65/u6kC16qGZfcYAOe2rgU1fyieBlkeWZLwUnTM1
yRa000YCNWxzgLEKHnoN7ftal7rRFugeNsoumT/c+TwNE+2OTkNptk2XWnXPIV3/VOfA7lpe28ln
pg+Wk2KoVn1gYZkpt067VKRKxRNtVK0lRTvmBs3a9qHmGLIGXGfCGyKdHl2HBYr4/doR+5zXKHd4
jtpFtR7YAfDeK3YP7B64vQcwd78uOErzeEIpD+QiSyirgE+7hIB4IB5DGkUA1Ujxzc9CYvpJCKen
LgUGFrMilnbdogRPk9k3GxMCeXiTCQu6Eo9NROLbeCpVBF1teoEsqGGX2oQeVRa1s0YcereQ3rLr
Lx9SFvG8VQcASdgpGImdulajAx46SgLxwUF3GaeIAJkisqxvw4YrBG6LYnKFHh4mdDphjKKnK2xT
h+IxJh2JKhFaFZeqUpMpbwiZC1VelieWMdf8j28pJk3Y4goC4/3DipDr7utv6VjN+Tjtm7SQUn6E
PvSYdIcog7vIYh9DAnf2WhOgdtyZDDr8gw8cglyqYcqDATqcuc0FYVaTJxM/z8qBkZgo54TSAYwl
oQW0A8rM4nnxKuvufy6hFNW07Y3Eblo7gwx151kzDMasmJLO5qbLU1LvPJU72ln43furlri0VFED
Bnoyr5641WjuDzP0VYFYAbNux2t7cu6KWdHcpe9gbaWL7tqVkdCg4q+aadxqkdtWmgpuwb1tX2hL
5Z6ZFxFqeLO0RDXoseOshK+mIaATY9oLPT37imMzDxwfEWs7n8PAjd2gOhnm0+PMn9E6bXuJMjg5
zBumXaDpLjCp0FGrOTPbW4WXzxU3Uan3jHdfZBk+Bdq1WGvH7/7E9tdfww6A//rbeLdw98AP4AG7
ugR0UcjxesJOtvR7mGNm/LRrq315RBcABkVAF8wLaYHfRAEboRQO211M6CXhjnIJkwR9I3AaRUxP
oiMDqxBF5OlRTaFQqZGVwU8UkVYCe6haGia0ZlRSDIgSg5XZzKw5TAHW6/hWpeQNOaRY58+UAhEK
CJGW6pQ2r+o7fWqVZpUXx0KgalRCptEndjARzwPze5LpVd/HXlR1QF6q8CBwmEP8iSMeW41KhHvV
pOND8xUIQ+K+guT8WGOVJjZBciYONau8F6C9rEHM62onhXnGU80UhWHc5l6ctjtlHIcyIK3F4X1/
bIEZLU+v1GAGvHFyvNZm06y3I/C7AKtbDL8lT7M+UrVd1THaxRQxZHAVbtzudnF2Z/+TkIGHb4zT
UGsLRNt+oHOdDp2OgpKLi6dijlKV2J45W6BRB8eWRhxkqVmPwldui9TurhFUFvlK4towGkPHLc0x
ryE6z5bEmnIpf6k148JXJY4QXbNW/T+WltRqys0Jle+Pr/EJIffeQPK5Px9vxeDyEetcx0vdSxzt
gR0AH+2yvcDugd0DjQeAQAQJiEamt9EIQypuqTkBkBuYSTQgpOAnDsEVUAjtHNKAIplISAITHh1l
lhGBeUCHTCEiaSfMRn38zs9CcYEhHMUJk6SeoKCtxyuNLCrs2iKQCCJrdMBJiOuHrGDB2PXtSoJD
RFmkn+BUWSiPn6hFavCnHrbsFdFXvp85kHzRzSsVAEZZzT4hWb6VIaqrSsAQEPHNUtmNsWDhsXcw
kFPPCZPO/tpkzXFJtOZjK1hCmiD2yzZVy6pgTJXMahGXjuJbtYjF0mURrUMc2IRTYDxY2yShX4VR
bD7fha7OYEcOOU7TKSoW0+IWBucJd56ExcSlSpiuC5uiI6w36dObc9ezJd7Ea8QWDxyFaobBk8nw
agu0tUKZR27bHe3WpYche0uz3c2Q+QR0RiFrS6n7SkgYeCDKHOWlHvbI3aOasFZZVV/q4g1JyFlB
GSSy5MWhMxhZg0l/iBvwZCQg/lh0UxqHivsJ7UhKFF+wrUUyA0rGsRVgbiFuHyOlweIStgfoukhY
7gq/CRk2ywTTM5+LQ1YoMV4av+XTSCzGLXmjPWVlef1FgXw6qkzeMip76LRui+GOdw+uJkUHYduZ
ewYnUrk94XY/F+nh23Nv1yfq5pnP0xbo2Aky2Au9BNcXR/uecbQHdgB8tMv2ArsHdg+0l9eCG4HT
gEYAk4DWCOG0KzWejWSxOIITm/gClmSUAjbOhrVVVahMMVghHMM/+HngTaRIEM5hF65NHS4Jugh1
PrBGvaVW0Ndv+yQws4PyHXyySABa2zGLLPAELIQ0HPhm1XZAT2FR6JOtQ1oIEweqhpyzqUbhW72+
2ArCHAkUP3HdtMcbGoIBRoVPonZIlj9ZKrRy5Cm3U4EZ1kURWCpt8Y20EqhCHpBnpD9Nk8J2KHge
1alq0qWA7uj2GLiKK5d41XMln5M85fv8r4DhIrTzP0+n7DVUYEEtQL8sC8HoRbYLWt4oivmt0dTN
WlzIuazOJFg1m7gEKmOxDHGlWBfDmNzhy1cFWQc8ITyHMlRdNVvNlKzSwH85q56lrRartkBzml5j
gFtAyliGiC4xo6jxvPst69pOYVveLTzzUr7QkIhBqSKH8mruLd1mauNUmrVX4GQVRedSR4coV1t8
CTZ3EU4GyeNI2mq9YuitOGwsenu2pdEdjTslKjA2BlGyK5s2h1XTMoEwsBBX9PxYSpgv28145utZ
7YlLzmlRYjZt7MDoaf01glC7BfaQWyzqbAQo3SYvukmrOPW5YuXM0z0rhvLZRknoWr2pt+RmjVNf
PgeG23tnRa+33fAcKs17+/qJbpPSO9NWD+wAeKundr7dA7sH1jxw7WBJ24n9fbmEUg5oFbYiFvIo
LooEoEICzARODu2Eu1jEJsGF7juTS5ZJQ1liGz1xSnjVYtHC0vjJvbK+zVhQkAwSrmDmBImlQ1HV
JKTItgM/od9SlwsBRTMY8BOBexxVsA0HQZrFgVGFalFFqkKGlLQ914rOsStuUcmDwOC5KsCVEhT7
tVcoh+ZypiiyNNwr0+TPSCsBySrF5YOAqb4vHXTZomUF6AAefNNwY2btHvIFhSsFAueWc3DtrFSa
EVKJ+SGFpR3alMsiuqHaI+c0WeF97Wz3PgZNyjKKb9uW1eSxD1WtjiE62hJc0pxM0GWQULVdHjN0
XnyAmYM580hygDEFK5xSgH0V8zFtlgBPx00/MtIQcYXhRyTCgQXexKt6I+5drUeorWOePfXZ9Eiz
yI12V/MFHs4yM+peWuzo8mR8Vc/4eysUMTt3nVdXMQLDoICYI24pisBbjOtuQpXl4hVlWxcbw/5q
ladaYoixE4NRlPhu8dW6UhmyirsCsdld4aUqUbk0ak1np8G5KCvZ+ieDyVWc33pM55ZNfpBRwsOy
KFMG3Wxub+iQbVHPz1n1Ga89B84pHRMGKz65P+eSbZFjKJMnS6nocuqEcSFYd/jOcQsP7AD4Fs7b
i+4e2D3gHiBc8UclYdp98AfwRkRRYGlCp7o6BshBri6uGaGVy6f9vy6ATfUBEQHPsJTAmAeEBZB0
ANqhVMzvhVeFf4R1if2EivMNpV68vdirCKxgtNNmA5Q/RU0J0WcXQvAIkKNggWFWl9CjnEbrfGt0
AH4oKeH50PJBHNTfkaT0YXVeMEuAKPwsDBNn8SHEdBGgz12iaVLlejaYlwLUl3BhXbJNEx1RYCPy
i1HdHbwems614HZfiLpmmFdLGDiKsQoM2hPF5F5mabuB79NGmi2uTQfmmaLA3LOdX0NI3C2dYUnF
MMhaVSQYMtCqJrhtVht8sL5SUNmsUlq6aXa7Xdfg3IKut/B0qx5ittYDGfKZK4aRGfdVqiJ7r/Vk
BbqyS2/g2zHAa3uXUdJyQN3feisFeWVkJrBlruprh8aAEkAo86gKwSQdQRn0sbUdsCpaYYlVSpQa
9+66RVqTacKsrVuK6hi46/jTTqjdxcbdbpkXXFb9s7Urri6gdA3vnXnGIL/Cw5AalPasOGrT1W7c
RfLjXpKHYTKtQunCt9nMiVL6zFa3r+qzMyx7YAfAe+/YPbB74NYe8GDvgeBEF3jCM48JEJjFHlQD
S4CRBC1+ERJyI3QJoh5upFVnv20YUWXwQJS+VQpFFAa0S6FvlrYylwV2gkeHYsICRfgAFCELRIgl
cvabfiGWkWQTyNo9kMh69WAnzxLuYuQ5Qru+91u2E7Ppycwmh1DN1ZYaKg7JVMkeqowEVfXneKFG
FKcm/u4o/CSo04KCbfM+8AHLdIL7kBLytvMp/gmri/kWYVY6ELhcim81GauWFWovS2v1AUfxvBtI
UXrYtbA9EnrjkXmMiSna7zbN48DFUbLXZMAoVMeyBp6hm2w/GO7VPnb7hj5gozO9ZdUfhITVf+Th
ohvrn47e+n07r+pSIpwiaTGVyYnIGvDk4EaECnNCZfOMNmIFbdZRlBxUyVVUTrrJzy0T+i08qe4t
UHPMEwBg7KWIw1QRp7ZUG5Va6gltK8vhOezTrbftQtspbcPV8B4c4ziYRPSAdD/QJ2ZBiCgYYLit
btgHvDUTzxgjjTtqVTYaN3p+S/GsjPEqxD6Gf+GK7MDAV5VvQ/veSkSLi8anqWNx1GDgrAz/7JBo
d5SJDrDQxJWGg/WLyGp5NNxiRFQDfKb5Ku5dstOv+/ORMmz3umnWqjZ+PuJhpP9NzsJ7mb4HdgC8
94zdA7sHbu0BvX7WEabmPQRaCgX7y3iBTwic7EIFSIN0BGyJwXR7cLwtVjfxitMDpNd+96/BSLvk
EeWiLuBG4R8gNAhhln0rHgsh+EmKX4GkKr6F6IQb+dOOgHAoSE4H2ISgfmepaheDwDyUJNBy0AuE
JrUJeqWYwVokQGQt5grJF/bWT6E4muMPwTor6BdKghk/kVClEIhKaUueXJos2TI/yvOfSJXV1VFK
SZpZVFSyIKrEXhYwieL4KazOLHveFTQUzkSaVfg9wFfGK+8ZMI6m76hpFaGoVk904zTS9hQlNrEH
8FEQVsfyAbuTWkQIX7Dctk+rraG2+h4TOsbT7njMSS/RjaJU0GWMasxHQ+QTsOpOEl4dH0ZVTSVD
bXnl2Elzrwm/Q9o0rSwP1tJGZWmeE32/3fqlu2MHLvl2qW/IUy0wDopynS09esd7YOqcXYpm1VWH
90f4tEAlD4oWumSK8ECgAiUkUGxLlMhaG4DRh8YLT9UKVLhrCdm2yx+V/IyvZjpkRJqBPZgy1K/8
Fj6peMJduXi09bxpBoB/dT2o8k+7mpMpNxm31bqAHhDFy0c8smuilE1SppV4om/Ph/DUjhsGbIyg
nOjb0i4rLFHUQLmXVj/VcDoiseDBPPzBEpeG3MHykBfPTZpjL7PZAzsA3uyqnXH3wO6BJQ94nJOQ
zCOKSttpvBQiLLGDqGl6gJOKEL1YlBg/D4VHkKaIDTRrRM0ICZIt6ig2QTKiptmzl8Qv4ZTmoFTq
ZWWSbo73iv52mYd86ZaPECuMLatZnTzgF3jaFZt4Ha+CLfwTYpnwUpGWW3AoQeHItFkmJAB8at4Z
6iEBzuJYx9uqDt/4SFrviMu8zQBKvRE3VozX60LxqF0haHxTvqelcPKZdEYVlRfNIXiQFfVRXfcl
nJ9wkuWSx4SgOVSdbME3PEyiLyvIG1rRCGmLdrvYNr83Q+rOO0XUPKabGNZ980xNp1bLBxYaRI1W
hWS7tjB/hzxp5t21qO+T2PlcpqHWMzY4MPNs8fYNDF+Pv6V5tjOnzllTUle8gTKzIu1SkZ/BjsAA
G3UYgL2Q0AYDc6lqcaottVGTzFZr1QKeVWTV+rBZmFBXXDwR9fTudsWuD+OkJDHrna3rpljdiNzK
Fe3joGQUrxqzcdpSKLO2iDVW60cdto2N2vp8iZIXLCB8AeIOOkY1HtuWmijx0AG2vq8ObLRoZ7up
B3YAfFPP7eV2D+weCA/kVX8jHgpWvC6IS6yBvkqEdkbUNUbASJHSAElIQBSjeTjsiiUGQFlW5wUJ
CwWEPJRKNr90FWjkcemQnyoSmrKYIVQtdLNOCki+rGAt4vRnSkMTVHHG8KM8ID2lqvCJdBY+ZK7C
ywqfejwZgA1lwUkGe8C10uJnehZrBX92VOYEXUWCAbmoDh8uNzgYll1FPe2mDuhrWcpl2bjd1z0s
b4RYpLEqwbcTOf4/kBEFqbnaooStiliG9D0MjgUFqv3tqT3nGQl7rLeVKeF6MFAOVjEs1IAP3AUT
6PAJ65Iiz8Qd19MWcYqMOU104ExpZjwD3Lgxq13jH4T+Ys5nxg/fpSQG8bSlIsITyFz8cn6V2MJT
Wm30fwuMacuvKtOqt0rJPhm44gYOzMsckjymRDPlxMaeI18dxdwJTy2FsDI2mxaYSvtouOWAWJdH
oy8D4ygl/hYipu63pVO1PNtXIgYdcgUKDiBTKLQFVskD2ZNdn/SAdDZT6Cgo0euW8NWW1a7tbpxi
3bkxdP7MiFEOqTBkpszbsts6SwsZMRDijCeK+GeLWe2iQ9S7AGg39cN26a23luFn13hxXTlLq8lm
Jic9nc5Sm5TZmW7qgR0A39Rze7ndA7sHpmsJ8FJCGnpPjz+IiFhL0M5RJdJAX3apIqpRLj6AOoWI
nx8EAgXhII2w8M9n6e243BlrsOqyPJAZxSX8Ku19DfkMLQoqWwRY8sEMkKmIceAo0j2sKmiKQ0Xw
rZkczOE+ZNvsDa0M5HkE0u+JBU6DHBBVkLjXN4SDTgkejiYetsgqLZ3Cs5TvT95CLlRiddg/7O+a
AgXHZXKUPCY3Ihff4X8ZQp+rinw79Cy8TAa7+ZbL9rarnCb4g8ekvPSk6wRQTaVwJhkcVVJJ4WGp
pm/pqG9IxrcmAdg6joQpzk5iaThKAinf3E7cix5im2BRu9SDwgTJMtnn3PSY8agyqV2Odt4/5QWW
nhLTux837DudZtUfJlwq8RmpmsXzhz8Hj9iq2XlQAnFtpLjLS4ShmlwGwJY+oWQ3kXlC2+y5TOwi
6mCuJnmVLXku23ppOyU8mV16rAOlanZODUuKVQG5g3+QCM/XMCzNgKc5MfuSNcqwB7oiS9P0PPUP
oFINioAuoFeTe2WJmJFPQKCcqHhUSxp3S7Ct7U5LPW2pC6nrhuej4SrKuI2s0mUUZzJbpDenYH/+
jGcZKEYrR/PVlFgIm6OjbJrKtpTsjYHHltw+0fMaR7TmfNUjNjzHgsj0+uLS9EuntUrP7oANHiUk
qk1421UmVbg39+2yrNNvCHJ6VrNzu93LrUWKGSYvFNEtK/G4mmlp44hVifVm2zk6HtgB8N4tdg/s
Hri9BwQgcR0CwAD20HcBih44FSTGRzDMr9TlAVck+sUJuREBZtpxMmG2wTDJATBjkSlcSU4BUUO2
KqtvAiQcjpFQXArz228hlgKET/4aYQgnuJpgJApqQgNECgUUAZalUg8CKQGHYWMmhPD9nl78tCX8
EteFfBSXWzQ1lHW0y9OSrHqFfinEUSu9bbWLX74Nw4tFzsBalo4I1LhDBCOlD/SHFfqJKugT7XO2
DeeqhRpOj+NSOs2VIeTbEgaBZOiiRlE83GaKFCLJ1qwkOoyHM7EXGmqwFJSxQmpcuSt8Ak50trJy
Yb3xsrgl/FNc0AIA5cSUTukgNomYEgVPvbpf3kVU4aVqCqhSwdOdwpqFvVCwOWLtDUwtCKxEhQJZ
k6qUbGyVrLRVqTz5yxQJyeCk+NeFD7KyB8LqgWniGTtnC0/2Va4uNJ8aNwV8wsxBIjB/doL3wIrE
Ptntb4v8RYKVyss9dWWbf4+F3EkVjS554KwC5ozuliBEhQCjwj7dT+9ztXhOMP6CmmqcXIBuzYNi
IXC+sjAAPEsKD5otYGHF04q6gfB6TURGlcMNSesg00pBxdOcTDQYK527nrmJ2q2/BvF2XQJoV1hU
Jwb698ZCfWmYO01euhu7Ng/ov2XGHQD/Lbf+bvvugTv3wHXarzu7KFpN+ZIwLcTianegHsJvSAus
AmLpQFpwTkiJSM/QkbAc0Q6OCTwT5fokQxMUYfL5EcDMI6JSgLjO6wp+KSAly6EgsKmkqstMyJGw
sDEqRalrL+OYSj91jUe65HqUEj+FAEWPeukBC/9mNwYPefuzT3kpHzIQZaEbclWFRDHh27NByU7L
qs6rU72+3KBlDiojuseHC7Z3JyBaK7+RWUDXPCk3SiupVB1dInjgcHUSNEruDz0ZA9rUKwpTS+kV
rzAhWFpKlBswt7IHcrLACk5vN3sw3xrMleuZ3Pb6CudgUpsx4cCuJc2rhYZV1W4w4xyhiOnM1tQ8
BzxV9pZesSkoFJBs1fL2jDGgaMAKEsTyUEtRpRWPKOlom/UoSkjqtl3lpe3tOys4cMWgHbe4NDti
uLjmjIMeNW/iMfjf0sFWu8y0GhhtWlCit7tfDuaSFkyI00h3QMXSlWRp4Skvq+k0W1FmFbctdYdt
1zhfix1uVJsI/gFP6g/b++16q+0cPQ/85Pr6GvT/+t9f/fvnv95dtHvgL90D/+Hiv/zrv3/SWvE/
fvM//+0//Ku/dOt+tPr/5P/7v3CjKYCHnU88FGxzIPwU0hPKwuZVABX8LMwevEVBZBEUBeSzG2sx
bQp4hjtCCf+0HdcfOo30ZbkXFPKZjriuEhOgwsVJiK7BeI7EFGIlYvRXCkEmTJBdxI2Spv3Sehi1
bkCdLCWnr2FDlPSRK6jt5IEzf2+wQ8dShdWupi7o1HyrUCrrVToWBVoE6wCe0Wk76BkH8LJIRNXY
iIqotRuFGnHIkGK7b8yWnmqRAnojgZxvp0V0tl2KTKtmb0eWBQU8RmddNpmQvaRIGVv74H7p6QAP
Pay2tpcGa/mDWk1WX3r63oeLz87BffZ38H9ZN4mEqZR0DiyxnPBHEOP5LnoWcZLZZtl+yBT81M5A
w3uRKJs2NftZyWqZlymqN7ClZo2i3DiRm0HpUDuyJkM2aHtjTbqGuAM31HuUkj/sxDSvDnAETX24
7YGz+OScuROxBEPgWzHnI+OctuG/A0q0ae5LgeKWOvMNmjIPimoIrziwdWlFCZfmRIw7ujQMiZGo
fps9OnBF1fPzAKxcdKt+254qlyk4m+lEF+dS04RLnBtPODFyK59E8feXX72//Prqm8vr+nES30FH
3CzycO/e6cdnDz95+OCTB91T2fiE2Trn17/ecdlm729m/E//+b8JDuwAeLPPdsa/BA/sAPgHaaWf
/L//X8Qbl9woy3fP+KOSDlNELjDkdKstilzP4Rnwg6COoG9Cy4aHcU1VaFRQlmzC1b71WpFhySTR
0ozEajLniE4AUmwi4hCKg+ZIE+k5zAIP7Drze5j9Nl3IBCc35frDusDPSjMqtqqpsANv6K+6pHZJ
S2e91khhXhz2E3ie9frLh2mLbzUHx4QX52BYMyfpQ2Sou5QdJYZdSgg6FlGCl6rU0GbkSqVAhoCa
eswVW0RgVZuWdeO3vQDpmu+sIjCWOsaIglx9sIoEcZlrTkO9SDFhFDLIFFWhtCNb1uJbviGTLppw
u1BoWCchxSEfnVx8/hy/HQBbXQlFiFcVKWvb8eFb3orWxn+2Fb9DLkw07903Z2lan/FSPdFPtd44
yzx7OxSdi4fad5JY1S0csDTPrhzYNlMNR++wIe9QVF7fie6dA8UxBHK37wLgDINbSLyFstmuMerr
9pDNsm/E2EA+vxP7RzDqF+3R+tr8PFAxT304r/3dyEN3W8geCkLf5uGJn1//6evXf3h9t3XdrbTH
nz0++/hs+ypG1F4tIO4A+G7bRdJ2APxdeHWX+cN7YAfAP0gb/OT/8y+IUq4LrjvUab9RVvFDoke8
MNZmYAURmd6CKBJyScwJsAQQgp9CYiwufOt4mEQHmcFWxPoiuhQjVNPuXEEju7IK46lSQbLwn3QA
hFPVAZOKmUKtMiFCqa6JsBprUQwz1PZ4MvMN8gmZA/JR+SncTQNd1Xsn3zItV/hDoSEcpaQecpEg
j7sOP3EUzV0Zt6P/z5Ee5fubilGdhDNOKzA80xC/kUvcq6C6HGgfpqWzHGtpJdTiUlU6B9aVx8jp
cXvmWjPJHGJd+1arFb/lpQd7hlZhMIAtJ8Ah8LZqPFx8/gykOgIMUoa7XQBcAYnCc/3N9eHjw+nH
px73GHr6O83EjPzy8hLf0KdbUR3vLbGaY0GsNUx6QJfqukOKtbe6TZF8A8odutpNY5xfmixGzsOl
2xLrMcYwo8WxrYUVgg1EmrcwDHgiazXRVN3i1Va7cVBX/Md2xbYhvCsyNjh7R/TNKPMdBKYiGwJr
Xj+SUb/Uz3Ee+Prrry2Xrd8ucs0G7J9PflTmQPn3X7/HUx/aBbJXv3/59dUlWvbRz788fKyL3Y/i
uP7m6u3v30DzB6dnjz9/ovWRye3YIhQ9cFvi//yH//NHYdhflxIBgPd7gP+6Gna3ZvfAD+MB4TEg
mVK97sJ1lEJ6hZ0MhR4IDiNX892CWAwBFtxlwkEXniEqi43NHkK0C02J6Op6TzRl3wGTCo+e+Qye
2LcM9cCrGqe4aLJFke144bC2Zxugogn+/GHKj83PekCXIKIbSyRp+sgcxpDtsCl1uYdWlRLVy4d6
frK2SfsDjUmZACRkshZ/aNZZ0VuSKdyhZvZwuDonhBKLk7XiIH1Mw6Kbu0hEOlm4d0qASGyvxlVZ
xXsVK3blT11VEFQ8i7I8UvSEMD3/TBIytlccWBueTc7ZtKihLQNTH4AbESiWzxeOaQUkMbTERLF5
8OFwegrJfvcXZmw/1Ac6ANjbpP9ba50IQSBh6bkhQphSdeyTlqEKblTF29wtlJEON80b1JudI/ED
o9wDcfNe6NO842RyaWJ2J/cotWXjTQfRgkuJtnhFGaDoyMrCc6BYA3mhinGX2N6AbbtE2W4V0Tnr
Xmqn6Hm1pMzYFrxdy6weTQQhWGP60Yz6pbMNjH3w0wd++i0rShn0Tq4A+v2RmQPlH/70oSk/H3TQ
+erazuGf//zLe4fTD9Y0P5YP9Pn88y+hm2nIQVR15jgP1yfk6g3JHGh3NaC2D72/Nc4dAP+ttfhu
7+6B78ID12UTsmbSEYUTMkFugXMOXwXhhK8EJlEKgFA4EEAFufgp4AdpZ9ycTKzliA4FdQhQsdR0
z6fkgwdXSn7rLUqmBr4JloR1rcbLtGEbBck2xVeppD+EmTFbxXX9nUBIA+lRvizyaDCIlwXRIQtp
usXNlPJQBgkaZbrRS7LIKNe2hThiquJ3SC/D9VM+odu1KGDXXYlSW4gItSsJyFXtAvYqWKow+C1L
0QSgHwyHeyBXzCw4QVkhW0JcfwYVjcXtuLGiAdlQw27QpZcMyqpFZAQAJOqiBGyhnxC7UCvLWiPy
QdCxu1uOcn6kURytGe0LP8gJoNAnqMI2ZvPI0331wDy5D4o7lkViuhzLLpoKL4Rbi/+/7/+nn5wq
1BAb6ioANk2Ci0WiZEg8UcgTuyirRLZtKXZXzbmrDY3Vrr+oN8//pFtLidrbUlUtwdkGlCq0swWr
V86xkRM3ba5C0NyRQq2NpaoeOOicS1nq5+r/MRCO6qHdRaJKwgKw3OLbgHPqddUyTUuJfr4xEYbn
RQ2pb5Q88OUlnRay1ST+2Eb9UhvaVpd0LK12/TjNseU8vyxONui+33v3D0vI/wek3zscoBs0bE+G
dcejQULC0zkw3RN+1KDcmW/ggR0A38Bpe5HdA7sHKg8A3FwXdIoLAD4FmE2wyi4MBRMWSCZAqCuc
39xbEAuQjCKrwjMW/cOFHJCJwVuHzSgIdHTpNdoba4GswBDAW6BadOlMKK7dsAJUJp8KOHxFLdBB
8A9TH5aVOSql2Oz04CvVGHgyCsoJwoRKC8ODAqMgk3hv2rosHrlIzFxFdtg/z5Ip3cNvgYb8ooB2
HbuBEi5t4VL8JPw2M+WB4l57XhdqBxsOWa0QIkSx1PRYLNHBSW9HOBqOldaqwtcyBCNZxHaTyiFI
kMFjtmxlHVprsIkpdKDrTL50oMLadi5jBUL8eWMQwrYwzsvpida+KbpMavPsVtPcgAeRVUGF4HEV
CX5E/HF8HGaUGIKmYlLS51vl1cTWEvO3BE08y68yCoFd7CqZNfZOvupOwTMKzZPCUo6NnVRSLZGb
q8sK5OIVs35WuHpGCQeWt++OHFi2O1bAMrtdWd5bVH3ub0FpE4MemLtrLlj15FyX2ALUZVAtaS2l
68cgziGxtUVLmUuoFh3k9mCp+2TbS8lahdcm31bxNLpiYtYD50VZSpRnONmO91gaC6Ponx/bqF86
+fS9NHfgj9acVvmpH2nJ9Uf4kW/5TEQ7vZREhLLHFI2F2Lo/Hnl77m08sAPg23hvL7t7YPfA2APT
DJV8wCSipAiqXcAEeATG+O0Y5pqcQrNFlACeT9GQFmYriNfv80S0UIjLriYF6wrKFqJNfVRcWlGO
HcEj0yAHtZdjimwwMlkdERjseAXCqbbvClZZWm3zKujA+Z+mrUh+kE+E95SQhviJAwqLHglVCQoO
ZUGCOKuDHnYeTHZDLDmFMCeMR60mITAhBEq+VMK3NOThxUOBUsRxctFHDeRIGClJkHqlOaTeZAT8
JgYeU2SGixrWl8oqg9sIfk3ooWQq2DjlNoQfMOCwVLWszjBD0S0PoLV7cTnrmvEEZZiwZivQZSm4
lH3b8rRRweB33D7HusrdEkvc2KatSk5JL93NlL6XSpy82iZQuT27a+rD3kVLl271XgiobjRwxjaH
pj4AxVHB7Ew5pqZBg27pIeOq1iUohFsO+T9TNDRqHvKPYXkVB/4RjvrR2WDNuh+tOUv9YePO5zfn
r8B5V99bKnWF56OpXQjTiKuWJqeVmnacHjMGd94tHtgB8BYv7Ty7B3YPrExLEgS67mzBFRqJG0r1
ziQ90NhCfAriAcQWACZYKIzquSWU6uGFAsz8Yb8KcirSyNipv8O2yPcN0kJcgklCWShFjDRhQogi
ErM4LdgYGlUY1oOrAmlkc/QIQxQgpQmCZ3oesql0WeAoKOAsDBYvJdQ0pHpWsB9+ol5q5TvAUaSI
cm3xU/hQTogEy0o3SbBDlOIuk0DrplIMaJsaMpnMZhoNn26jlU+kiSSAgZaasaJITvGMpekBIWrk
Iuku0qz0mq6ipXhwtPUE6BwaIkHJ075lcMNXklksUjxfKwseJVa9shH8+ikvybfS2f/bP82Y85Sl
mjRXkbFU9Eeb3AIRb8mzFJ+JsGoV1qt8peLdGKwKOiafz92rrJAZzCqY6xqYOQgxDYBcCL+ZAyuQ
3O9COQwbHBGNzPFbdE511+ilmVL17ba3ByXrcYeQO4nV1oDc4kGpmrvtAAN0ugJcqUCfJ/zWJuTD
7NJM+dEO+wXFRp35LwFrdRY+NsR+3/7HV4+eP8ZF5E6+IW1TwLn0t7yRoeqB1SaXqnNqUGw5//yl
dcMfl747AP5xtceuze6Bv0wPHAqS1LwzYq0FpQiPOXwizrEtzYLE3MVkqAlYEWlAIEozYIMpCNGR
3eTJw0oJoJKiZyz7LmVC0Ljl2LJRKRkMnRIjGRwlSDNQyp9+P7A4ib6klU80QQcnNBH6BYOkEej6
5mRQoA9yVbvSBJCuM0wQlsaH0uxzmW48lpIMXeKDTLvflQLtkLEqhYTo+ARDcaMYNPX3dYHgDAly
L+j0pBQzfukKE6ChNId8flsWmM9YUIsLJSFYaxIo095+BM3xuuZDScOc65NvcesvclH25OQ+Skg+
N0ijyD0tfKhGVUolbfMh+gmXKvBsZ/UHN5zLIt4EQvtsFNMEZaEGRENhqMoms1UM2MXDDFHC/9s/
rbZkyDHFwAtzRYlSkfAlmyLtdj8f/+IxPkvbGtfpcMFg427shR7sjm73SzeU+jGnZUHEJnCxJbi4
WZO8wb7l1B53nGxx+DTjLO8RrdwFDVqK4FAEc8TjuhYUUVHcFcpNxR1Z5TWXxDP1ybabBaDVOSpQ
2SCRe3sGdTEQqvWdlicapIyRxbB5arrgiUbXtF7zezEGRY4V5yAR/o++FDG0KXpW2mgrpWyK9tO+
nvUdaw3h5HBLtNQPO8a3194sCU2tFOe97dJuynnDcxp1bdHglmDs5//m8Ra2jTwbpcm37RboESUW
hmLjdPOM/Ts+J+7iTk52ALz3gt0Duwdu7wHMZoTW7MyfIsAFwulRvRF0VcRPzB7BkwTiT+MEbikU
oVbNrX1XM7AK434REXU6CkomviEnGACE8FOoEgfokI80caAhJVWNNCPPguIKfsZTrxyFqiDVmxSA
qpCJb1UqHhygEG8rMjlFmwlxK2RrWBT10ky97MeFIKGf0lYV4RMHlKTmDmvlWBw5IWfSTNOcubIx
toU7ClW9Yib4NCeQqCeBmXrKxREuBchUpdCErWMaKn3v5D5yEf4lQDU2PK4ZteObaxmaCnsLSizr
ArRQrtY7/AXIxRCfsrP/CHW7YnKF/ENLfVUCJkjtSyl6h8fG3YOPeQRz9bMSIvU2Sm7Zojjd0jxM
KCjxEONtjyz2KGvaSi0l1fqzOAaR0lEw6Q5bZCCqVimtenjWfOt4ODBkGlv1MGE6uT6yB1Ju1LLV
Xh+Yc/a2ulVxVZGMvVV2QAnhhWdL6Hug0W2jW11vV0T6re6TS5Ts5LT13U3orQgcNTbf/v6txvu7
d++i4I3H+PjUsXQ26DdHWtHYYpGqtuOXj5/9m2dfffXVllJ+3rjROa1SOy+mrFb97v96/fr5C3ye
/PxLMevnasHMEEUgbUvB2s+xzzlWdlpKGl+DPSmrQ3xnOMoDOwA+yl078+6B3QNLHiiQQ9AokKqz
Bxi7LhCO+Mqeb8SgosctTx3p+VWZyGd6fhWDlhO25KQzOG1ZWjroiBr1k3FC4wEdGGmurSEuSGYp
RZWNv0iaHrxUQVOKFd52NVRWNuKQ/oS1vv1bs0zpgAOcxIrTmjpcIRgcQpQQpxICcgTMOPwRUKCn
w10h4jxLXJOHCSn15LAJOkpJrQWQ34PYSuMD/dFYaj5IAAQttdMgHmBIjaKXIYMNggkhfI3D4DRC
xKj9QApK0VJnKy0VYX9vWXESVGsXgJZX5ntfPczudUkzaiUr1HB53j+gRFaVKHb/6P4vQDJr2ti7
XniOoxRTR6VanmMo35szR0hs2YGTekfxJLDtEjJFXTELzOkWndrwbHpypqiTR2+vElF87OstBi5I
qHyrYK8N+xT+1U9lBUwaJJaKS4VKsg/zSr0x8g8Htu66RacE7lVpIOFbiPmxFH31j6/O/+P51Z+u
Xv7m5fejU9uyW7Dow//9kdR7cPbg3v3ZvoMtxSvcDmlbSsWIqzY7hKOmNbjSFdX/M/Rtlw6/Hz//
TdWyA+C/qebejd098B15gNjDDiI3fycQY4y+5fjaMg1bgog08Y8hUsbutFvYmZlrPwnA7CDOmbYo
YzurfgKDxTcSRE12EBkaSiGboWsGKu1iI+EFYkUo1W8zRnGwgQFVC2wLp4EfaUFE1A4KDTEeCcQ3
DbdDWVJetSs3tBWkVNCSzPaGoWL+FOCVRTjkW8mkjaYhrdCznacIJ9kduCqhItJfpZjwnc9SEnKg
CT6MygaP+0pupBxnO/OtxbDrW4Fh7nPW4dubpTlsZ1FsgTanXfNdR2xZ29is/iDIqiqsPL3KhQZn
4ArCpD/97HCdgWKHoyxl3oB6IQ0V0QlWBepC4yriLU4pnyDHmBLMuZSvDhRR00JGj6J6g6f8vL66
fvF/vXj6q6dPnjy5uLjAz4xbnvzySXye/5vnl/98mZZLlutVRVFjSTgCSRt3fZbWo0ybS4mZp13N
lLxCYY15s2vRZlNYOJjvMhEOSULbyWj2m09JkydbyuTk6Ay5oauGGPNED8wNt9RLQ/JSv1Unz719
TOn6eu40c1dLmRfsYpXcGaJX5A3PGQNUYEBljbl0vK0JbWamA714pkTWcmK2RlY1xHiwp9xLHP98
iZeT4UAChw9h+k2jO4b21dUVTgI4FeSzQT4JIC1/i7j1bPD/Z+87AOSorfe3XC/2Nfd27gVjXLAx
YHonEHqAXygmEEpIgISEkAQChBrKH0hICIQkQCC0FEihGmx6dQEMGNzOvVzve3e7t/9PehqtdmZ2
d/YK3OE3DGetRuXp01P59DQaW+U624LH4liamSMH6KIC0ZPHxFu48Nqrrl21ahU866rq7rpLdmta
Tisu7MYoHTo90d+nzFfGii2mmN1aqrgr7nme8nx6ydMLFxxvNu2hBUXXnnbZ01f94fmrHrzljCvx
E08vO2bh89c+OH/CTNxw0E9KAQ6RWqocY1lY22RiZz7rtR7P50K7tkj27CkEmAD3FJKcDiOwCyOg
T4cSg5O066r3acl+i7+SthFZihFIy6BK379RHzESg50c8eqEg3ZEK/6DZIn+Ufgii+pI1qQpqGBE
kibpfc5ErcUFKohHFFjmEjs/ifKFqESKJC1UHFjKIKyXiE7y4EaC+KnpmSW2Iqv4SblYNJXIeSwF
GV7QciRVLs98JrYmS63KojkhHMhOFlxIok3EFECaYSmA+gSurAX6yq4qrwyoLyKNgmpSjhIxMuSq
rJEg3UgTSUmpQuUyI8zeEAyJU6ZSHnKLTcvwl7mLLe7yFqdbSU8EQzFFXcvqEGUirivDxy1GUFyZ
C321SOCDn1KXcCmjNwSTCAjbMvypLDK8uKh02iFLJ/Iiz5643AhVynRpaotLh7zrD3etWLHisssu
E3PHlavw05kI5sfYcIjJ8YMPPpgyCxXAzd6oyInxSFk53HzMRyKiDOPVIYXoW3YMm3HPhmNyuKiu
XTfHekjHXmVdM6uqxpK0/r3rpHN9xKtiuddsunWdJLzN8haTy1UD5TZ+d+Wk+pK4xTl0VdIjWv1x
CyP8xXBgiUCjQ5rXkkVLYH688rIr0caRlLYGUzK2pv2He/6AToACi97gnrt0bhd+/0I0f90DmO40
JTKCp18cREb3deVVV6IsxMZJElzowUDvH/zDg/CE5Cs+WHH8ycc/+EBMZvij+CjjzJkzL/u+QMPL
FbeVwIrixRg75bwDKf2nP1gyZeSUogLV+SPuladdNn/KzCsfvOvCP1w5c8KUK0++EJ63PP2HVRWr
Ljt+Ie4VFavw80CcoSUvOJCal0xVieJXzWj9xVzHIdXSPk6HF2Q4THcQYALcHfQ4LiPACEgE9AeH
nO/lqpddQV00gbEYiBjJwEkwQalTBkZF5MCRiNUgAHEheWEIoV9qCMSsxaKCagMzsU0iQjI7sZ0Y
bn0hiiRCylorSJh8RrFwEVWjLPRTuIssNi4loOxEGE23jEwUDaOsIUO5yiJm6pR5kXFSmH/lFI2W
ll0uEszAQRhjkS9kkNIqM7V0xkRCGCmkuOCAJJQC8VVaWZABiH8qczQSpGBk55FmWJ078Vhl3icL
NpCks69w8BUVh8ITzpLrUhYWf5CeMgh8xNlmlB2SourGZcUSnsiF/BBSyqaWP2QwlZGUU5UR8pBU
VhbiX5mIQsawXzkJQFo+VC4SQu7hTHlTYGwapFvHFRYhnw9mn2uvvRYO2IicNrTyCeVTJkwRTzeL
pylvJVkcDnF+X/GPeFOeECYt8LsTWNZasp3PrtB4mak7CbZHH2fbT1RAs4vQxKxraHRJA2wvKJok
1rnhWWu4q8PcHUDpmLzXJl2SR2iGnmrTRCllvSRaHTDwT9kGKUBdU514UbYphAWsK6+8Enr+zhvv
wFNDZ2vaaOAou82T0ABptC0NeJTBpar1iGN1zmklhe4LW6BRlj88+AdEfP7551G6hectpB5se9V2
eFK3Nn/BfLEySp9YkxfYMCzhsAxr/+RZJ1QMajVJ71UPLFFlD/seXPT4wgNP0z+njCyH+67zrvzD
92+BA3ukRVIh313/fRBmbdx/+O+DykBNccI+kVqqHHU/hkKZGxmoFLoiUu+O7kIf5VLN7JUMASbA
rB+MACPQfQQk24ljg0Rj6izLpOj/JRvEQCK5mdgbTG4aFRBd01cxhirrKz0SZmQkRWQJ4YtinEdw
b/yU6cSIsUxfHDuMWKBDFBcXHPKv2jas6RBCQhhkisCUDnEqcoObSfZFRlHaiac2P8v0FMemgiAM
bbqTDnFXSB/8pGIimAyp30lW9kzyl5nGHDJSDFgKQMmiLOXyKWSGePqiktpiWfmSKZ4M6epsbcRF
UjoW2aXJTiszIt4uSkSZSoew5cIlQyrLM4IZWQM3tS+a6L0EVpzGLKPQHvU4hbGyE7Z9K4A6dosw
kf6iRqgsqCzyMewzwh+Y4JH0xM5GQiaHEpeXfv1VA6a5TVoOgYOVhJdZkTMwxQ77ysshs+/CCy+E
YYQuJxvErkKxsRCVPVTy+ZQ3iWfyJZvAVu6qDAlIlN53SqIKLB07Ud0faXhduYSEWhvu4irRRjXN
IjhZaBKfJI/IZuhEgPLqPp+0pWOm6YRF6GR8vtrH5rDVZty6kkzBiwJrAbxQeiuwOXcnP/Ixp/i2
MDaqrDRHxk3EohPufHbGildFuwbqDc9aXUWPbdWs5n5UL/qRzaHDUzAnXCnboAwg2G8oBEJLTRsO
/FzxzgqtZramXS6JmfYUP51dBzWfOjl+ebl1pZvqR52kLpqXdGySQIYmIcPjf38cG56vvfJawfDp
srq1d5a8o2ikFRdnQYudLI886Elym84bBZE7jlLc5QvnK3X1hZ5fsWSK7GkFdL4QDLxwXPngLfN/
fDzdIrUM32UnX7i9Dq+h1F12/IX4Kb/KIJW2IAeppcwxFl6/0673Qqfv46w39ulBBJgA9yCYnBQj
sKsiQAcRKaMrzTOIGhFFAe1BgDrp0FZBSYPVJ14lvcEnggT/hKdkaGrgIVsl/GVc4qXqtV6ZY+wA
ZGtoE6Ov5Fpis66UIcYnZfpyeFY0WJ8zrLgWiQcZJGETIWV4bTQWX9OBP25KSiYuAkth1MQXBJtG
TSuksv0ijPSkc7/EjmKic/hJ4eFGYaWPucdYs2LagaySRUhcSFOW0X50lsZQOwgKYp6ISyZcKoiV
Y2xvs5STbMh4cZfIvCDGkBl/ZXRi9eJAbyRCyxlSJCQiSkNoUOnwrwxAfwGO2N+OC8kSROSuE0wV
tFnAgr/IAsFwk5wyHRKD9IGs1uJvuVplEOlUWGsQZJqWWSBKjPfC0/OVePrlOYnUAWEMmbnnTBhG
sMWRLmccvE2Ha2jZUHPvdIqkXekQlSgJUxI1GAsTx2o0a5XP4+hrvI8zVlymqSGJF9IW3pWNJKFz
yWlzctLohCulj5Y2LbpuxkqHmrpj6UVvjTA27prM3Oqx7jwES56L0yashdSKl9ChNzNrLSVIzbom
+keepFHmU02MdUFs9e6hgBQE9l78PXDBgfSTHEveWKITsDVt2FGnTJmC/cO44cBPZ1ZHHnok3iyF
0dW1r0gmmq707ukY8oWxt6isiLZAH3/M8eCHsAljG4vOXXRrM2c+/fTT1K1p/wMPPfD4448HLHEr
fZ7x1AG9mKwrHhTg46LAf3j+cf3zygevXbLiHbwG/M7tT9ONAFcev3DK0PIrH7kFN0zE+AlPmI6F
lfvaB5Gal0y1hPq8APsOBeMUaASOW1KUkeOWHdNHhmN4RMBfV1eHoL+598Grr7zUYxwOxgj0WQSu
v+XuSy5yGTDue+DRKy7/Xp8Vu78L5j99rEVRiMRKsyG9X6rOH5I/FQ+BgyyoxI7Iykqcp9zamlsh
WI3apkt8UtIttYMXUxaZuGI1xPFAhJA1LYpT4rGx0vpJYlhxyQ4ppEJ0EolIFwLIHDVX1HuqhafO
jrKgv9qT2CwSRBHgJsHwF55WMEEa8UgGENEtyWO5yJLqlMkeG8tI5+jqSBqS3vVVplSSh6S1yq4w
Mcoo5kzEMyW8wq4ryad6Nxie28VpWOo1b4k/pU98VXzQqMhXIItML4Rru7GA1yiCmpPpJRJSGKSP
C7lTdRCSVEZKTaagKlGCHLeAIrPAU0HjIbmQ7ZYFl+Ffsru6XKblx0MAjKGY/Lkn1RO+4k05+UJd
WonBMlNUBMDjI5nWHnqUxEdH7WYsU4S0kvoyA3sR0qRAKWVzBrb56Bx1RZg+TqJictqUKupBb9NS
J1tgbf7V/rThEz9Nh2h70uqlHyXx0Y9seZk7pemR00dpMv4xFd5JWdP1ca1lKYP4RnRvtvru1I4z
rrDTOhmvuZAEStZXiwPhbQs01z5+Lco4dPrMnkWpp1LbvnIFkrr2tGtpJVHrP7m1DguH1ZBjYeJ9
Lr2UeVlPVUssnVvv+D3RAbYA9zy4nCIjsIsiIAbUIln2OklRiPhJIzBRXP1yJn6p130tcqu4DQVD
OpJWETETnA3sRY0cat9U7IgjTdXkbF4QM5ONUCxJotREU3Iz8dUc8oGoktcp8ZCpdSl6hqcIIw3R
sTkEyYZLSqgu4oT4gSwQQDM3hJH8TZQatJCYIWJRCuSgRMghJfRyxdl5PEQxbR2q7CSDXJKgWwip
84YkFIAuyAbhZdWIMDJHIvPqqfxXnfBsGFVg1xX+lDLSlPqgvzsVt1SBh7r6qGaRKSVLKyBUQZIk
ayu9YsJUiXIBQotHcZGkWhOBy0pQpRtv+REl0g8Mh806ZAui0esNB+WVbspuhYjzcxbT5uOKg5dY
XsI4wXcK7Jyym7VgqyknjUyJgLMSk0dxriYkSsEkTraSmszWlfpSuWxEzvTR7NeGhqvwTkKYLizx
4V2pr2hhkuhqhznpNx/pxEzzb5xpN7F4nl70taKnCOyq22bWujPUamb6dK1JptuErfBYArPdXe8N
dMGdKupBPKck5JO2PB7yihuSbFUjf3oxxm5/fAWObna9vUS3hUFqXmLZlDy2XmM1RvIx9ziYK0T0
yH2Vp3uNl2PbEGALMKvE1woBtgB/JdXpP2WYfGW0yOKTFeJrNGTv1S/Wqu+1IgwRFVzYwCwpKx22
rK24+kxpMuWp85mMALEzkyxPwcpkUspCWKfeBRW+SJz8ZS70FRzxMqqkykS81bHVkMQixmJ+QHLK
ncAmqVZfV9JWWRRccjaBgBiXLRoGN/IiSoxEiPriZ530IayI7CGKdpC/XCBQRnIrHeFJ25IrpKkc
hUKpERfh4ZCxYjCWW6WW0ekEMkqWjtcWlwWXkocSlJ4iI0BRYW0hJoHpnGd81gjRZc3irzjkGRwY
AXQRLEEAMvY8q9QkOLbiyoDigj+dBC6MwzT7RwVBTqpfXQTJY2HLpZOo1QeNEAC5oLyQVhZTpGbF
MqMLhRSPbjnwQqQIC7Cr2UrMReTBsInm0CqWxUOEBThG2nWRvmIH5McGRRcDr5bLybLwyMaXXClf
F8I4U7b5ONGimXrKvJwk2ZaUrZh42ks+WuCv0BFvbjKRMNmpaHDxfDUtH6el14uPzsJpDU7WVLpW
Wckbn1O1tFbYaKG51hBfraJ/6HutPlG5xTHXerXF1UFfh+qTF4QX2mtUzbV/v1aokzwUsA9eoTWr
INW1JwshTSrrvdHpNvLTy3/aBwvY30ViC3B/r0GWnxHoUwgUKe6hXvGVW2QVrYWb+KGkl+ICq4ED
UcBbwEngoEsGUOwXbsTCozprn7DgWJYlloIhgPQU6YPNEn+zgil6KRmRSFbyNMGvJMVVSUk7pP5o
U8xmq429slyCOEkGK4qAmFIqQWiRo/wr7JlIGVlLvhcTgwoLT0nJxLI3eCOVi0LiKXE8yEYpwx8B
IK0OQI9kSNpGLsghflrFF4kTGrgJgXILNyt9FQCFpbLjkukrxk4lInmIi1LpJHqaQ1JgBBFIyqdi
XkLsl/LFU1lAQbN9YtszLgWdrAISUsy0kJeMJeqlSKYgZYAPHgp/Kj5FkTUoiiCVit4AVwhQOjIM
racIZi491WKBrDhRUgSg1JCyuhKe00OH6CS49Jtd+rkXs8CXHEYiYBFIV2tPEvOjreDaaiRqUz4z
fSiwlzA6mKtZ0rRN6YzMxDUbMdOxxTIlsRFRekRQOPOiR2YYW1JmwW2BU2ZKxUkpqjOddH0ks3VV
W32+VBccNIm3bWY2eSxytO1zJh+SxMa9nT6uzVB5Ohc4nIsyNp3UtaOBsPm4ViVBTdVk1pTo263v
JKEsxCRlCl9yi+5OdjGVSELpPZwt3x0ZuhxXCa/r3XJ4SvDpVZ6CeSy7t9Rsao+fZvMxW6huWRRG
tyPnPgvXRs2e3USAt0B3E0COzggwAqLfVrRWTTHxU1I1YcaEu87iHhSSpmiSzpF5UFxkACQHRaeI
xKwoBVzkIH/pVtNW4jY6gJUUkWq961h9ikmY+FySIhaqXytVnBM+Uk5xIVMqAhxIRMombN2gZAiA
GyGltHF8QHoSGmSEjL2kSmIjCqWvHXDDh7DSKcOtlxUINLoAMpUXV4XBoqXkav+5DCCCbZfBSELK
mjzBQmWayvKMoiFf+Mu1DIGzrBHN4enwZ8RQWcsw4qI0ZUiqHTWhpHyNAMItPZUC6LxQnDrLFk3L
FhCGFkSo4uQcVHF15IUAEJVoOaUvHTHKIX1ITjHHNaFTMunJuiVkmv/qYvYdh60ETsqqAyRnsxSs
a2EorkUYPJHkJHImEThRdaVMLaUB2TXlJKzMZl6j4ivFs9JyTOXjDN0aNJsjTZXsfnC9S9Pcjemk
tTqjlI3IZih2RjQTd6bmzu1NRpe8zF3TYdmi4yi6bfmj7zT5JJKYbce5XqDbeN8sS8LWjVEm1X3k
UN9/K0SwHvmL1FLmaHvLVwqvdzXbimJTac2TKVjKBtX9Nr6Lp8AEeBdXAC4+I9AjCEjOo04qIre0
7Ck7Xp3Kg3Ydi0kh8Zki6abwuCQTo1OalLEOnoiLnwiJW7JZxQnBl8AnyR5okS6VDqWG8DIdMe+R
ZkCywaqt2jIpOqtJXzF+SJ6aaGlqR0JKqcT2YBldSQs54Uksi+SXEpKnMv8ijHyqBJZZKMunlawm
kDFbJZFJiZI6GBmByc4pE4yVGmGADzzxSPqruZosTsxATeIhJCQkZiuDizd1LUBUYGK/+ItSWJWi
wyt8pDB00TFXKi/8AzdRVlzIjrDSMsMHUlEAMt5adJpOKVOX5sCWACq7IllB+EsyI7zMInZZZSEf
qnpR++VGmIROL5MPL2G85NVbYUxuoOC1qGxKw5qoC4dc6fqk5J9mDokSj1tLSiCSM4yobqsIJgXV
OJBKxHTDWjGhWPTISa5sPiaX0Nn1bHUaRVP6lg5p1yRWC5XERz/S83XnBJ3SsZl/tY/TYbYRW3uJ
/fRGTe3NzRZL/zRrkMR1LsGYlUV1avPREd0cfb3he9RA50KMx4hfSTC97mDlHhIfM/NwHzpUBOup
vx5y9NLWnGGcDfMrgXmXypQJ8C5V3VxYRqDXEBBMpkjyPeKZmFWAmkqWBRspsVb4i+2vmvXVKbdg
JsR5iL8RpyKzKpErzXDwVMZS1BduhJEkTVwWE4vxT9oBiwvBiNBqQoW4uEhCMqKSAFJUtWGbxLYy
FY8qFBtXm3IpU+sWG6EpL4gk/4od15I9akO3Ko6URyVIpaaIcMjU1Md+aHJmlUsJiYgoC2Uhr9gr
yiYCxA8l2uLLQzJZerFWVBbRdavUsc8mIzXEkukImaksKAWxAqoI+hqirFAhJzzl0jixXyCD2CIw
aK0UVSQGGyyBTDUlS4pfJA99HklkJNOnaqKN3DSvFbnIKCJ9AlNmqneMC8TgjzQtPi8SkQiTNsZ0
A7nYL+eJI0m2QOvIsTA0e+5TtwDNonAKQzcfgSchbPxN7kPlN8Mk8iF/x8w1lp1ZD5pzas9EPrZY
qn6NIuiCawFIYJPxmuDQI5uPBtAEx4mkrYxmFs5MU/rYyh6vp869905NtvnoDc+m0tq03bY/U2/L
tBl7kYLT/OsljFMk2w5P/fZprIA27dJVbOLj5G82HdaKpyvXVpXmyoippZoPm7UpW7fYAm3x/77V
3pN3Pho3EzRdOt1++1QPpoUxhY+TmUaBPnjHesi4cSQj7rvZ1IuamwuEO94nZQPnAN1BgAlwd9Dj
uIwAI0B9vUUghUOyWbLs0eu1wooIViMJm6BJ8iltGBZhiBrBH3xGEh4xSMuI4qd0xMZCRCSGI5m2
svjBs85iODJl9YKoZLaKbxPHJpZiGhV1RDiQoxxNRfRyWTDiY3DLfHGpTCUHE++jEp1DXOkTO3uJ
GKMkz4IDQxIqsgRBXOQgFqdlkIRNyUAOKW3cCcYILyVR0eGg4pCEZnGQO/KlUmgaj0ypICStXqSg
KqBkqThEvGXcEKSV6QiJZAoCQ3hSppBQFlCIipSRpnSLxOmplhbxZSwixpSaAg3JUtHwVxZc0V3J
bGltRSw6SNzUNE7KqUKS/BCVSiHJcAwiCiav2DvnMT+4vDDeuAjWD4qISXzfuUgeIaCTOQgE4sth
mwfbCpkycBLianJOM1lnjkl8nI9sIulcnIzImWmi1KiHSS6YLV9XbUjp6aXsKRPpagD9PmR3tN1m
/7S900iipSTGycK4VqiTrZn8lrTaqRg2vmfWslndrpVi85TZxa159bFWn6j/iVMW2wJNfBn7Tg+m
JRF6osZB6r3FnyLVucmuvq/dcqVbSOg8SEJYj9Xhz2plSvo4W3OXm2dXO4ZdNB4T4F204rnYjECP
IlAnU5NcRVzWz9i8hJgSkRMatIibkb+81GBsTdyVL+gQOA+ShT+SJYoFegN/ysW84FMUt3tWPIQP
UtAXSUipERnGPzJlcWkSaEYxYttmVMQVY8KbwkirJhFCRXpN8UhOiYl5aRCEA49wSzljF/2k6PhL
wtPP+EvNCK0C0ju0ase4pOVqlQHigVhKxhtnSbbYpqhTBNYVRFQf5z/Dy5BfWblJJBJeB4An4SnT
0ZdV85aHXArRlWWfzsrQ9I0lpQ+OBAW1lsWxXQk4XlrTdJ2knQAUkE7K1f2v/FJrEI6vejqZsPbR
OGsf2yw5VvUGrG70IA51Un6zEp0UxV5PSX97oY4pGSzRHk2ESDwzlo0jaYlsYSiWjXJ78TGL6MbY
9T7nJMrphCllYOdbiLYtl2QWJvMvpa8NxSl9PG0J7n71kVjOikhLi5yBnbXgwUdg0ndafaJuxxLS
HSHdHklv+1pxtPCOrmZoWbnQzypahu5LHDhcJ6TC8jkkxH4Bortu6uR8ZHsBgaJ3U7U5enIE+DNI
rCFfKwT4M0hfSXWKzyAJLgTugZEJNMYy0sY+50tGPEkFaQur+jAPTbbqrO2soC5wS6oW46UWTxID
oWVUjFFWJFuhPnok2BHlTtZIJEWUCZ5wSSKnDuVCRpAhPl/9Ads4Xop0KqQRGFlDeCmM4mAG1yLZ
1KZcSR29f/GIzLNq3gkhqbzSIYAi/inLIgQguHCh4BZWZA9XB2iTJwouUxAzGzJWoxTwLfeF4EBc
+CMkHDTKwkEcFXHJdAyKKz0VMZbGVTJ0x334l1LALeWhE6SF+PQNJLqoRPiLHCGYBJ90IKNCSoKH
UiRVNASQcQXsiCITFGqDfzCxkFqkdAbRCRxKCn+J28saF5iQwkhw1PvGdbcsuFYkJD+DJMTSO8wt
y1UXFuBDTWppX5X4q/qHdtnpL5qYZi6bSCb307SQ6kLH0mGcgUWNWGzEmYvzkZkUzWiT5OIqm54H
27JzklhdUlfBqIymAF9VZfVOvkRiTSqr89GeHh3UOszA2qcHHUq8JGs05tKMUyc9KqerTtrIlQwT
B4405SWCS3QgTmLfO9XalVSdLcXSfPWZNwOTJB9+60rW3Y9DDJAEjleAis2rHn/jcRq3+uZ12vzT
poyc4lQbsyXaWhB+6pZLj/D30ksv7ZsF7NdS6c8gMQHu1/XIwtsRYAL8leiE/5SpxiupxIUkG1Rb
oDHZrZOCSS4n5iugSRXWJmd09LjBuKQdUlEp/EQiVlLqcCkkQmyHohiBaV8u7a2N8T34SC4qhhJE
pEsKRtnFrJRkzCGui6RwIZfyuFdMSX4xEoNKwU05SqKr7LQyC/FIBjBPulKWVSoOUqboVBCZLDkE
DabUiLw5AsSKTLRWRzeSjYtFJUUwmZSQCg7pqbiiXClQT7UMZA2QadLhz7Fd0PKnnpSoWgBVtta5
1QeWrZKpvdASKFyYTQoWLetO5EYLJZL9qr3uEA/5IjAtlBAISLzcqiySnzAkN9WIpL4yLYsqy3QU
1af1F1kvGUW3LLgQ4WwE2EYYnNxYJv5lXUmIqxYhCe1MHgZPbWY0NxoQV1QzL82WnbHMlImWpPSx
SULhzbi27Jx015UAO4VM5ENCOqXV/mmB0x0F8VLpSdO3Ka22IOkFHacP0utDhqYkHFgrhqt66Bo0
mRJ5JlrsSPKoS5XouuJAKbnyZ/ibNnZdd7bqcB5PEJNOF80psHONKSUOXSq1jpRoMbF7qTpiW41x
1fZVKypWbK+qqKOPF/SNCzufhxYNnT/hwPKhsY/MmxDZlladOmPzYQLcGxXLBLg3UOU0v3oEmAB/
JXXgPx0W4CKL0dXF7IpikgEOU6Fe7CQSQhRFGQzJR0wGaKqgiEosNRlSvEkrn6pgiIU0y63dvzL9
GPUlZmiMi5rjiSzIGKjpJdE/7Um5IEeyoJKcko8RsxUsnTAmT8qFBLNszoI9SoIaJy3SIR4IzoZH
yFQTOSqO5HKxMuroFFJmFxeAxKBLB5YORQmk/TM277fKotg4lQsiwYEsCDEquywUnfZMSxLCmm15
hgACEVdKEHFlBcXYOB6REV7yZyEMoSQhEhgilrVOQeZiVUFGMWPbBOQsFi8h5xBcMmutP4SJWGcp
txSJMkJIhK+ILXyoShdVYFqAaUaSxCAWg9jYHapA9+Cjo9sdXthOyjCmNSzllDeJBewrfyT0zY2u
9LZgJoCJZHBWYZpSOW1rKSe+pk52UwMTreyYjCtlKzBZmZOSefFxopiM2tlCm7TWtcrQhENy87bR
ZLyArPJJ2tBc0xG9jNF1mPTPZsezMVsn6U3YRbg+8ACFzV4qkvEYS+cYv6ikEDDOAEtZqCTc3lO9
exS4a+3XKqat20+jEnNy9HFoKpb2cTrkHgqhMGnFkoF/evlP01MPDu0BAU2A+R1gD2hxEEaAEUiN
ANEnXJKoiMlBkSS08CEH/hLjomDE6OivvugR/bUuRcNkMJN8xl4WlekrK7Ew8SnTJeUrLqJeFgET
dJdysegZSausQIIjWWdHC3ZkWI/J+FkXY2IxEy4lKMUQYSgiXbqMiChlExc5pEixA591wSkKhaQA
lCD5aKjjgTKytJCXXurYZMvKSmnGkKHUkB0yAr0nISVB1WsBqkRSEiEIRZeB9VFkZCvGzmdTQm1Y
0/QePJa4tCK0lLXk2/pSOkO54EamSJYKSxplBVavcOMnQWSRf1rRoGUR4tgmv7Iyct38rOf6KS1j
rvP+uEpI8sNmV6SQMbjkz5RhaKnFnL477Txfpo+zvLoIaTk0FGas+El53Jye8jUnzR59TAApLydc
zqpJBKlZZYbkzh31XfMx0U1kcDN10mlUtM34bYE1o6OMzMCiydFhb8b7Al5VXYZLGNGp5K5qnyoz
e/r6NF1bm0qVDhWcWqIrgK5lSWTZs2HoRJXE6TKqyUpjg5FU3bzkT1FG7cBvc+OxW+qJ1MB7EVL2
qyJbXWvOLjFlP5Cyiq3K1TKbdN2sI7Nq4sJIxMzosXrUj4wwCCkCx8dy1oXw0UdnOc/QSlkuDpAm
AkyA0wSMgzMCjIATAXrfVXE2MvHhL3wkmYwRTtASObcQ4SmK5kuSwygTMTyxtZgIFdE2YjjEosXQ
o1gTkWr13ql+WmF94Efuc1aGXBmLTpxWNFJyKkHGpAz0wrCyzcpc1Ndo4V9hMTGiYdK8qYpGsWSa
SmAy/xIaFod02fZsBBAv6KKM2rBpcUKZtNoMHGPUSJZyl5IomWVeyi5KRBGFRfGJPGtJ9E/ypHTg
RrlQRokPbfymk5npW1PKUo1HuGW2ig9L87L6rpJ04Cd90Eh8EBhBLbgoF+Ki4u1igoWqFRmRhpAP
oshcdHHoxWaqHQG7TlMGxpZ1xQCtMtJ7v6JmpWFZcRXLNERkmDKQPBx/nRMyJ7swo+gU4PA+7TNj
dcvdJXrgzqXTlcPJJVynpzZ7mlCS+JycPniePlFJV3wVvqcA9JJOjxbKVLZEFNqmzE71dqUfiZqA
iXDK9uIMLNtsXHNzCeO0vtp8VAN3mDH14gXlQkplWwTRScmK8EjCnVzFnerIwjgfaU9Fe7qkpglF
dTJDKqMuODUlvUZjy93RYFVGTt5lVJwtjNk9UhlNNdM+tj7TE+/V0troOgnjZa1Eh0nSPBMQUVtV
6sULWy07DcUkm14/cqajoTDDkJppuExt0WS7S7rDkbwiwATYK1IcjhFgBBIiQJ8+ipngNEMrUruL
iW4RJY59KwiekviJR0RfLUanCBgeIQr8afAD+ZFkiYyBYpjHU0lxxVPJ1oQY5ZKJkRVa5ijSJ5Mg
xSXxZGBxS76kcpcJqqcISUS93GK8lCAROSJvuIn6yrdbDXqVWFtkGdXwTBE0dSemJ8WLEVdiejLf
mFmYSkHRjWIq27v2kUWGYGI+QeGlwOovflI6sghCKoSEG2LQ0oAURpFPpAN/nZ3MWViM8Q+qQPqH
ZCLiO8AkLSSnTAlJWfUiJOEmARS0eag4l0uDqT6wTIFBp6XFmOxOijnLNOl8NbHAQUWTecV2rUsM
42zsxLEJAYmadbqPadOgSY85+zTnbXr6QikksRWnZBTu08H4SZvXKaMZS5tHklAvZxiPPq7zbOfM
u/s+QrUkxOZ037sPVQ9F90JTXQHUiTgdbgsB7jVuQmEojE4ypZ64qlnyWPZJtkXSbLptozGUkZ70
uxKbJJAkfORlCSDRwgoRFTrRTfNbXa3Sh3aiqoqWaMd8LC3SRs4ksJvya6rvLJStyZvEzxnL9DFJ
UVqVbpfBSfBM8i9DCwRMcEjxtI9sxTEf2o+jzxyOdwh9wF5c6zRjpSFuPrrF6TDkk2TtwEVnErVE
0hBTByiy7rh0Ws4FgoSqGdeBmzReNwRdv2bBNVzewbHh5hFSr/1/4gLyk+QIMAFmDWEEGIFuI0D8
hyilYiPwATmRdj9N29T2YHAVYm4WG4kdkaUlkYZEuqwR2opVZ3E2UCB9WZMk4YEARfIBsSBNlbUn
fCBquRVZhomRSUqBqB2xOJIWlzaNEpXCLUMKAmnI4sUZm5pT7tYlkJQpx3aMS1as1hd0RhQrPq7w
kcKISy4HxElF/hp5ii5vMmjH7cQuEmHVtmSZi9oRbWSKlOhTwOpFaBIHEaWnxTNFXFEoaS6Gt4hl
UVk6p1rscJbZiVIjNUlrdSkosCoIglEpqOD6J5FbCEliy4eCPEt/OsRLrSzoKDKM26WJgW2y62TF
rsYfZ3TKxGbSSWjhMUTyEsZeAs8GkBhQGrHkjoSAdfuBs+24zvIpHy+PtETptkoz/STFMpJVSpJk
v6Lbpz6TUKAklZ5cH5LobSJNNhmvLq4tcLdrtxsJSDKTnAbYMXGrcSduXlqWaYXTMiRvxXr5wCyz
zTCYJExqpEzlt3E/vdRiqCLZGJVxUjt0d0TrWUmblUqBuq9Ugd2bp6NUySrURl+NQsW4bqLlktTw
WSEsvbJVjbOXtvvQioy5mTmVD2GiFlUNALWP6yMdy3uZOGQXEGAC3AXQOAojwAjEI0CbkGl/sqAi
0iqr7LTSjicMsMSLxAgib5Ac4kLwL7e4kSRaOGZJvEpapxiOOtEKiRNfknxGmPuIXdMtbYniKGC1
1G0FJqugNiUhTbildRG7ZymuYE2ULKUsJaQSEXfSTxW/0uyOmBWIliSBikDKLBQ3o5JSQXDBQeUi
iKStVVxULsOhRkoLLlpEULyOolBg7YCnBTj8BAimGFQEwpxikVT4CfABI0WXINBJ1Hrns7IDSzOs
IrqIKGUQ0wgCXGKuBKD0tTCULMBEXvLTwfhF1my1vqCLIPVH5G4JSQZ8+oqyWkahwDJ3Ekwf2a2W
M+QSjCojQU25y2RFhVKppYjxW6BtxhybPcd8KuCzzr+xBaOU6dJz5S9vId+Ltc0UkdxeYpmmVKWH
8bNnm3HGYZVynz1TLH3p+a5TSNPHo8DJE+mhp174ahIjmPORyT89rsWYCkb8ypmI00cDYNNts3WY
IHVXjU1qSm4nAUvpQ3pIeuJ0mO3OVZe8cScvRkvncpiz4XtXMU/YurY7ar+ueHpDIC3lVGzNKhgp
m+tKgXMZxVMZKWWnqphQOtc4kjN5ZzVo1ipHARsCZqFMhkzuRJxZp2Nz2PTECaCpNhpJLws03rWL
QyZCgAkw6wYjwAh0H4E6Y1ctcVrwDcnftP1NfZ1V85MKa+5bpGgYcTwxOElyqGySxNwkF9KfDhZP
pS2UPswrRnoZXsxv4MAFdoRkEUUKJtKkXCxmLmbe5Ra5xdOK2M5nRVDFYGd54inxKKSAC3+lQ730
C8ZuGVEV49ICEA9E1kQLycpqFYd4neLYsjiKgiIjWd4YbSZmiERA3iCMLVlJ/ukcrxxZEDrXRGwe
BjlHFEgrBVDvOUMeLQyeIhgVUAYQG5IlUPhL27xFbpJYCrZJ7BGyUYkQUqYmFiyoXPCXsdTCAfF8
pIyQsjrEIgWJCgcVmeRBGSVWFFKtaKBoeEp5Uabypteb1Uq8lIGWM9SXnGVZpFjSk9Y4totqUnZ1
8UxPaLw7rGRj/9pmKk7zjqvBx0zHOS/0MlN0jxU/NVRhjEm/00dIYsbSGyC1iNrQZEvHnF5rNmLG
0vyEPG22HfJxhtGzfFssEzLnDNgZOFEYZxVqXdEbGbz7OOGyFlY8VrGTJ5gRExkPzVh6Sm2qYnKV
pii2uTjlmy73Swyn44lJPsltLpoYPnG7mm1hSOton7N+pH3i1SxuL7R8pHyMOoKPrQpsC2GIl8TH
tkKh64tiEQTdooIaRavgivwbCMQ2POt9zvoQL70XWgtj80m885k2RQvh3RxKW6y90DG1sb5AHqdI
rpQ1iepoSm92GrZEbGsZrt1LUu10XV3S60euDq0MSfYw60fe9zmbINtipdG+OGj6CDABTh8zjsEI
MAI2BBRhAwuSJERZCC3ToqJ2dda7rAhAwTRlAoGR5FCN05KAiTBiSkazCGkzJHJFjJeorIwliDF8
QG8kg4oRZjzV6cjc1Z5bJIKfCIy/iI7IMpi4ZFL0qqqgixSsXOWuDLaIDtIopRXU1xJPs26RBMRA
KaiAkqFRdorOybyIDKtzqoghwAcOonm0dgAfmZSCQturqQiS89PXhsRFyFjRlQAknhRAJAIHFYp+
klvGpWDEflW+EnNhvSeugsB4SokQtlJI3Dj7SrjpEQkgU1YHockUiBWrRQQEkPiIMhJQ+EuTWgST
3FgY4SkMxSUhqRJlLuqtZohhqZPwqTDKaMWid7ZFmohLWNkvL7ST4jiX55Ms2DsZsi3jtFLTcdMw
EaQ1+/Ry9Kg+X1dLk4Rt6kdpiqHSTovHphXYVQniPVOD3O0cvdR+umGSaDJRmuQBCAPvzcG1RcSA
TFnvmu0gjlwQEeXVKyM2/TGXWiiMGYvcdBmnOtl94nm+k/N7UA0VxGS8Jm7J1zW8p+8S0mJ6SZYq
0nhk2y9t4aaqwELS3hjTbdQ2sorkbD66KnWBnYTWhkWippdEtgSt24TLuXJEkcxlJgJH+WiHDiMF
MNOhD3S5x0qcjvPbad1SG47shgATYNYLRoAR6CEE1KBVZ/A3K+XYgCeJVuzFYDAcafoTt2SViupQ
xCKDoUk7JxkGxTgN+yQ9pYtYHFEv6VYmBZl+zJrqKCnZpdWFNOUUKjYnI7Ik/WMXBCarJryI0xpX
8jkxRRGkTvIxSlwXWQmDTHHrlBFeUk26nFMHZTAnYaxgIiOKRcjgkuxRM1j13m/clNEqJp3mJSMS
7yVM1EqBTg+Sm/5UrZDWecmQqmpIqiJFRGNWZTLP0oXwkg/HKD1Fl4mTfZsuvSvbhF3XYMqJl9tE
34vpxjUMeSaZ+2prcG/Mj9OlSW7V5PCzkROFuQY/cRrJKbGLDlNtehIqWSBnjXtOMjXd9bb24bEi
klj+u6yBZlkhhua6TtKbFr/1DGGsBlOA4GQpZtU71YN8jDCx9J1MyUOrN3tRG9opq0+3YldYUkZH
rBSa5toKzELpQYok0IsCJhQmwrYEnWzTwNZUDKJtropqe+RFY1M0W+9dTfI27qYP2pStZNA2bUOm
RG3ErKwkbVanFFOPxL1ZsnS63wem0Vx39aBMgHd1DeDyMwI9gQCRH2mYVTZAMdBbBjcyURITq7P2
x0oGC8onttoWyacVxn5X4rEUGLxOWnfJfCeoI5ElSRHpMzxxKUsrKNkn6RLhEQycisTAjei49P5Y
yTnVGcWIS+xLZiHoFhyW/IJ4E/u1UlBfS5Ip2FmrzCtGa0laCAaLriyaSJyYsC5CuSUhHBSGssZf
CkZYaQckqYht7RYJEtpSeGUmlaCJssiQuuCxHcvEKhEMUSTjVW8dU6GwMCHBEWMzkMElBRMiywDC
AR8rsAiQo+RV0MlE6G1hkThxaSoCEgQaslBEXIVZGz/LFd8mvRLpQ3JZCpyYRbMcbLdT0x34UDCq
a0oEBbFAoze66TJ3unozF9gmrOYMWJuATBOBKJvxapnKN97uRJ4eZ1fJSbVOnxweZ2meYqkasYWN
/UzIo4xpqIs8dHKvvpxz1oQZOhaARI0boeOnjz0JRbxI3UzZuRSilUE/0hrlqm+eqi/eEuVF5ZzA
p1dSqy5isVx9bFSNOgS9ymY53Pc5q95DLb3pfc4uDmrpCXY+68bitOImb0cmJ6TLuF0lAADg/0lE
QVRiOluxx3btruauBM/sqTRcFN/EjXoA585nc3c0YWLs0BZuixO6bNylV5mMhqbXVtQB3W49mxLM
9ig5u3MSeM2KXbl9kl6CYLHw0QZY00fHTlKJzsURzaXJEYNLdrxxPkkg9XawdsLeNXnB+alnBJgA
e4aKAzICjEAiBNQZxRhZJbVT5xhJ2kaHKhGFo5Fb7Guts6yRcIPYVEhuU25sG0YAxCIyA+oluSLt
xSVio3Y+y2CC8yAR3PgpMxKjNVKGA4lYDjIwEjlUW2FlFJEFIkJyYkfwlCGJu6qhF4kglsxOsF8I
UCGlkpQsxqvxkyb32p+4N/lrxxQ1PIvi0PSCZNbSyujE39S2bUSnolEi0kFkT7zMDFpOHA9klTKS
UNAxyAJGyI+yUPr4i8QRkpCRzFMVBJ6S29NLs2IOIZERWVNEhAc+uLYriisYKX7iEUlIaSJ9+EA2
KYZYaKDiSHIrstBlQTApD5VFnY8FeGWmqiyUKYlBdScFFm8mUy5WSclBe8sFINJByx9qkUVqkbxo
2qcdrnNW2xTE1XTjkSHYgmmDg5foJLB5eYnVM2GMQ4yTTMjUIz2x1rGMPZYJ5TEC6zImzMs5h048
q9b11TNQ9NzigrNCvVRxolhJSkePtLIpbZe0pOvT6+TmfZIyiY2XHpEdksibtknG+9CuUTOMu49M
TZExt+/ZajVI7rC17iTKk8KEa9ST95ApVMKVFes48UZd92LKMOqR802HJPVl5mKT0gOhjeOQyUth
Jm5b1bKJl1K7jKRsJNbZBHRb8Ogg7bUjGe9DiqrDKHEScHId2Obw0ktwmO4gwAS4O+hxXEaAEdAI
EM0gBgVPybhwxU7lpZAgM0SBpNvc9hw3mhLLokvSJ4tvyfmQ5Nh08pOir8T6iGLpjKRDHZUkWZP4
KR0xu2KR8heSSDZIOeIi9qWkokcQWNJFZb3UDitrZbKGP3yQMnFCOCQtjL1CbCwKqExJDGmG1bHU
67LwwSWLphwkspwdiovykqIK3ogL6MkEFaUXEXN8dTK+FEYQe6uC9DKBYPW6+BbJ1LDbKS5VkJZK
FlBxY6oCDbgUQ60pIAxYK3F1Ky9VF1QvMllRs5BTVnFsIzfIvFwBEZfkrvr1aVUoIr0kFV3WBFpp
hZZWPrMsG04TkOsjp+VHyGFZerUZwebjDEM+qhhGdC2GzeEUNbmPVfZkBxp5pAQKxHigdPouYjhf
KTRCe8nUKbyZXZfdXrL2EiaJeM7orhWRkqza1EPrCaHtuiJjsixyJymLmWAX8UxCY5yPXH2I9+qL
3F7YkSNMsqUNK7AZJhEdMmG3weJsj14ab9o4J1nZMfmeXi8wFw4oM+dSgocKRum0ztgcWpF0GFuh
koCZMGePxaT4FDiJUulHbg5tkqXEqPmY/XPswCqjizPDOGNpHw2Oq49WJxNSytpsrVoYDZepq2ZI
DzXJQdJGgAlw2pBxBEaAEbAjoCgNkTe6wGTq5C3GAovzxPp59d4vmf6U/ZOeUgqaJhVZHFI6hNVO
U0r4IH38pVgyHUW9KE0ZmLZME3+LMUaIV6HyJUIrIsIHwcDl5F91TJdVIkEviSKSSEiTSpfqUlRf
8jrFfCRdVButkZS039LuYsXfKHEIiadwELBmplRYSzb1XjTiI4qYAVvfMaJYQnIcVIVbIoAwyIv+
Uu5ARkbU0wgEE7lRefGIEKaksGudpIIHiUQBNCBwACK6LFKKwiJ/MtcrGBELtY8wCCxzEV/uldQ3
tgpAiVhZkwIo1k2pyefq08EymDL8WvSYZjbq8G1LHyzhYv8mN2WQEObeaWcKjjDJeTXNhFyJiubS
OpMeN2A6Z67OvLyE6T0JEwDsybubcHVlWm/IlZziOie1Xoi3U5dUw3DoZEotNbPrxRm2apjUPC0r
LrlxacZLnI18iBWbJzxTIbt25rPOK15lbEh6VxXn+pf2cXV40lQKlIgT2sCJR0nDFcNTA2isr2k9
0XsBFKR6f3jSo551LOFwEFEBZrzwqTUqOZtNwHhTanUM7QRWVgpgFy/eEp6o443pjLXDJZEyEEqa
QpOjOz5paBEHTR8BJsDpY8YxGAFGwI6A5JZqG22RsZMZ4fBTUh1ljpMUJTZvIwqHp5rkILzkNuJd
VkpKutWuWpmOIE4miyPboOTMsZ26FrWmt4WJ8im6JUmRopdyXBfmX830kJ0khGr/LX6CmJE80ixs
CiaEkSkr+UkqmbjaYAxWqbOGAETCifuVi4Ai93L1SrAiugSuZnokre3CU4JC8uqQlJnswMRpCR/B
BiWf1FZWtSdZFkoIWRT7OBDKhS8w0+u+RIbxU4BPJaL04V8ns5VwCU6LMBSAskYQ4rGS3OoPVomp
EkSqEJxZGXgRq1wpgxAeyCB9GUZNkvCTLjhwS+hypIR0CejkDEyU0YKLjMYCZFISKZX+gJamxwah
1XO7RJQvydxXACGV2TkJdj4in7g5pZuPjuhldm5BFPs39RzUORF0puItjFu8rvu5ltfmqQHU2Th9
NIBdEyUJRzUzTZm4l4owEzHVL9GM36SvKRXPxMGV1cdySWKX0yKadkjy9Ogjaa17YErB5MDmKdBW
Lopo6cCpNqDaqkaDpstrM8RReFt9pUG6UqpC8gB6OYBWCnCZLNHD2lwiFipKJMFPuNDmpQYdChAH
lBQ1DuGUuqSLaaZskyR+0USl70HaJKtXidpL8oUMkxXTycxmOnCbPqTMdrTdfEyNECnIYxHiWrft
oIRu6hhHd0OACTDrBSPACHQbATUy1RnbViUp0hRIWfmIsSAYOAwxFmKMRYrLKSsi2Cw9JdJFfyWb
EjuftaHSCqAsqxQSCRLFIvKDW5IrZaXET1zkQxexa/Kki2LhsogWWWsVbydPLR4Fo5/xl2lNVQki
WSqaJHuKIUvqrhBALlJ+JbDEMGaURhbwoQJKC6eSGeGRMv0kGilBVh9zQuAKxefppWV6FxcXUXpR
Gi0A/BFdMlgywyp7O4mBXJCFTF8xfzggDy78lZ7iM8LEunFTLBTQig6Z8flfDZciyYiHYCgRWWgJ
UuQlJJN/4ZbLGYJFE4DyoooTc2t6qg28knsTCCoWQpoVpxKgf1xnh2YImuWYgZP40COaFWnTgfah
7MwwyX0EBI5t0lq2RIydYsUVMr6k+pEXsueaTkp64CVlWxgnLfHuY5PHmbKJiQkplc6sUGd5bT7O
2ncG0MscOn1d0Yl8zES05rjGctUKV6mcuu3MRfhYnZWimuQjO4cY+SQfettW85PkDp2OWKWKZ3fk
o7kfQpKP25VS2VwV3oxlayl60cTUE5PqqILHtyOzUmxVYNapTRhnQ4grokkXbSsFhB7hppEhhy2W
TlFWR1xhLR/qdtQjGcbO3IxVPFNCG280S+fe/7jaeE3ummRBxHykC24ru6GuZFyNU2D9aWLji8RU
cPPILuWT5s7nZO1OShIHqbU0ENMrw0f3bElGnxSa495W2DcNBJgApwEWB2UEGIEECGAQIoZQZ1Ej
ae1UTMkcs3VISomol7z0ZMgc+cTuVkkRxVOkifDEwSgjMSRZFEvSP52OShR0CyHpL0WkHPGT5nP0
0yJawkdRHevFXckSFZejpFwvKhcCUHEk/1TySB/burgY6XWmljyCK1K54pPSAlMA2jRO50gjI5EM
RYEL4kkOqZYJwAkRBp4EI4EgxVNyWtURW5WnjxtbIMTEppAEIF1UQCSFi5Ilh1URlIaqTTOA4U+R
hMBUO/qiKqMk6K9OWSdFAiAurWJIscVqiE5TTdljk8gEM2wj355xOqfsXnzMvOOsAfFGZh3MOYUV
MFmBdTDnPDUtH9d0bGRAS5ukmEnoendAd5Y3UWpJZvz6kQbQTERLTsV0DWwW3LYCQlEoZdt815V4
O8N0Bx+KayuCzTOuiuP5hohoMlWiHPE+sg3Gs1lT4rQanVvgOCYgM/JCiZ16qyvCiWeiFpGEIbuq
SpKU3StRrwuYj1OaOjVKegHChomuDiPZRGtSZtljYawsnKpr9j+2QiXkbElJbCwR2yjpQe9VjgZi
iltaPtTEYis7CVa7EoFjtpREKyCmpjk7B3PpQRNvtRghYdGdgHtFeACBg3QNASbAXcONYzECjICJ
QFGMU4npETFV6UmbVIVFEcSMqAtRHforCRtddLAzbTYmW58yVOKZJHjq3Cb4S4JHBEnRSOJmyJcY
LLEgGVL9tagUnUSlDnCGm8JQLHJbDtoFLdggJIcb2UHaCsXE9KnCqixUEKRAxZGCKRoprbJCMDwi
MeiyRLKFVEzPSIpMpsSZlWUVBZTCKHMuAkuEFbOVDn2ml6gRyouKgKqRP9Wh1tKTjl/GjW3P2NhM
1lQyn8YoLqWPS4aM2ckRhnzoliUlIirqXdpjaZOzwodyx/+yrtV7v+QDol5upE+oaqxkFDFpQAp6
CYDkoZCypsyjoTWYZFuO236vqiEtNug9sEm3zPm63VBgTYBMowSFV5MkJWaf/iddek+FsRVTlzct
hzMd15Rt8KXFoHTcrsXyXnNJ0tc837sGahyUAJISxGWRkmipdioTSBQ4tnYWH8Zp6NM+eomKbJs6
BTOpRKjJMMnpCkU11xH0yoV+ZFtlsP30UmXOKAnpX8rkbIC4oq0TMeEiz3hMFNmTKGm10QW3+SQU
LTEX1cV06pLwMcuixbOE1NLGOSgYkWSbmiXSLjNlQ6udrUMX0Na4EjFVCm9rbq5IxkEav8+ZcDCz
iCuaUZWuzdnGtFOqDwfoGgJMgLuGG8diBBgBE4G6GPdT39oBIbE81aAIHxrhJJ0Td0WMkqlvFOER
KBD4GEiapFigQ8L8S9ZLIm9wYHSRP5UnhSR/shUjlhjFLCsiMiIih2CWJzYGK7OwlZcQjtxIB0/1
dlz4Iy79LVKliFkqiKER4UQAYneS7AnSJQtL5zmr93IpBWKwMi9l+JUCi2QpESspzRuJh6vTuRAM
7JdAJjeyA59ELvAZOlTvLafVBBJJhBFPjYUJCFYk3/VFGEQHpPi8EBzwpCgUHk/xF5LLpNTKBXlK
wiyKINkyZBCf55VJCYeko6Jy6S9JK5ER26ERFwGQSIVF0VH1FTIMLllYgR4ykjAS6RVLD7IeY9uh
NVzEiikXcstYVHHE6mm7Nc2PE0zykkxtvT8y1/Vtc3FzdkXWiZQ+ENhpH+gpHwtwCxbzt0EktLeT
27vCYpvbmWGc5aUaoZSVxcaDjw5sTuttkKq6TgCgnmva2ItZfVRwjz4meGmxVlc5TcxNGXRgV0d8
BVq/TGMjab72SekwmaqmrLZYOoxOOZEPSaT5cAITsZdVlSTLAbrJ6PUUp4/5yFZxNsVwNuckPu74
u/oSRIRkIgdhhUvXmgbQcHihUnYdlskmabxOlqgxtJfGZuM1lz/oUXzpYh8r1l8tNj9fLAOrEqVy
iEIZO5+pTknyOIcOox/F75e2xdLNTaeTro+JrY6r12Js9Njs/Qjbrq+npKF/u3RQJsC7dPVz4RmB
HkLAsk8qkmNSLKIuoj+3TqKin3XGe7ngS5KJqV3TeETsESFBjYjmFRlRJPWK0RvKQvqoTxBT+kR+
cCEuZg9IR7ImXCJx/JSPcAYVUTsxvaAouMEAyWZIzJYuXRCDkml/ZZmUAdVxXJYFVX0ACXLSVEYK
rL5UTD+lVDFjss6LHJr+UfQ6EVaRNyktmaOJbEvj4XbCU2wJlumrc7DwVNaC+ggwlZpyl9HpJgtw
zB4ON24kSA4ZWK0dUI5UBFk6vE6sLM/kgKjSXwWggpCoUqrYxJpEpQJSFWi4kAglRaWW/qJEMgs1
d0QAI66aL1qemkIbFmAxu/I885aSpX25Tkltnh5n+bZgJt8jsWw+Xow/rhMsj/LYJs3OWKIWHS9O
a1G9mzj0lF3HNfNKUgTzUaJCOZm8ruMkACYP49QSV3DSViYPEXRGCafONpZCrY8uTbFcfZwcRsfS
5M3Vx8brVBOWQZ2WTA9lTBLE2UYSaWASapHWmkVy+u2pNM5ViZQQOZftpI8rjyUZEpY3Pim9HGDn
yckTSVJOrUs6I8tHiJTYcE2jW8ISxZtbKSm1amY5qAhxC2o6jLWyFttKYGRndk0mWTWRNPH0GEaJ
F48VeTpTi7VHTzrEgbqIABPgLgLH0RgBRiAeAaJGknfFGUKJ85BRFBf9pWDEmshyKBmO2ldMj2jN
eKgR2MpQ+FMKiFhhMee6GHeNZaRlBDeWRlcx4cB4iei4iCDBfIq4uCgFBKtT7DeWjkXwlPy6INpB
pM76qfgneRKZ15LAAcmRlyymYq0kAHKHYG550fK5oHwylriBDGLRMgH5yGQJMVoIEOHlI2XtlGir
eSdVivxLr/UKQkicn1KTgTURFSGQPhWQ8pLrCPRCsg4s0jPl11KZMlNSUk5CQBkH8BMlkpKbucQW
IEzaj4gAFpUllxuoBgXIlkMlS6xeSqWqAIl7vZJMcN0fySzSJTzO6WbyCaieoqUmPKkKmpaozml0
kuhJHrlP+CRuTrqrS5CI95qxbJViE9g5n04Fj/tzW7LJlwxsT5NQr+TCeFFFqwkk2OesM0jAoOIE
sIXRZNUM5CWd+FLF0LCIkBcO6WVRRufjXPhwxdxjRSRhlV1TnlgsE1K9EuFckjCzcS7YJfCxoaqZ
rdk7OZHHUycsKYBKqQNUTOL5FFj7UNHMR67apbOwHDF9cPh46ZGcvUSSfiORfhK1JnnJoUHuGYdx
mFl3NY3jJ0CACTCrBiPACHQbAWVhEwOoOn9YfFBHDg/WIBHbfKuob5HMFX/JxAoHMTdpkxT8jWgV
/HGDGuGvTDC2xVrSJG3IVUbCutiHiJQPJYJk8Rdcl3gd0pfWXfGX8pIy0OHJwvYLckW2TVkodWmR
KE3iaeTQHJ6ELFd0WjA0GUsbWDSFJl5HVjLLVmZJQhlRvjILZZ6VlE8gBk84kDX5SFhoo7UKTxwY
AcqVHVuxbgQeqj7sFLOpwgfyI5ci+e1f/ISDSke50EXp00/pVi9so3SS5OslBqpNWr9Qb25TRMQi
Qz0e4W957EwvMUmilFFqZEqwwIGrTkpFMCK6xbrVLmhZj8ryD4FRaqoCGR6vcCubMxInhk+5JJvq
Oa0TFCVmMUhknZC17DppthkKzIX/ODOFJRtNqsykbKxYJ4hg5lTMtGDQo5Q+ydGwpU9I2MQzwyis
jDAeZ6XJ5TRRcp3CEqRaMNeZa0oovMCVKHddcLNqUrJlHSu5IwkTi8sinhGJR5Jg2MNQz6bNj5ZD
nfBsPLL7aDKjw3TBRzYl2/4LL9QrORmzVa6phzYNNAlhItVNqSoeKy4umEkX1aofrWxaoUxzuq4j
nYTho0pENElGN3208LYOxNml2ErhdZ1FR3Nl4LZi6uq2lS4eAVUQbxueVf76w7z6zGfnXuiku6N1
D0kqQSdFUyegfOKPr1P9g3Xmsw5MVRDXSON9SGDd7SuH/EKV2V0gHWdL74qmcRwPCDAB9gASB2EE
GIEUCNQZ22jBoypipyULKgjaQzyEgkkWROxLjC6SuQkuqu2W8KyInWNs2jZjXzwSQ48Kow43BmFA
XjJBcSFBoo5EJokUWfkKDonfeKpDIoAUW70Qa9HjGB8z5dckTTpMG6x+4VbRV8n3lNkWPA2ykSmS
+CpJCwfJDByIv0nJ9Ruzwq5rEWxVIhlR2Jl1QeBAXIgtyyvYLNi+tJArYinBJ8qqDN0guoSS/Csm
UnWC/NOL1gIwEk/WlFqJkEIKtm8JTPLQF5WEgR1FAM4yEeFD4MislXUaj+CDR2SblfJQxNhCA9Fp
iCdzhgrRYeAi3+3qWDIhMH5K2dSaCEGEfBEST2WmQhIJJr5OrJVNpupkZXGTPzk5s4cxfLzMFM0w
iawEWhJzUu5MXIocJ3YS+XVgV0eiCVaSBJOwLx1Lh3FyY6fw2sekNClLZJuVJknWI+VOBFQSvmQ+
MmkGVZ+tlk01S1dhElV3knScxVGBbZrsNDNaJFazKW2107QkjrKa1EW0ZYvF2SyZDjoXo9MUK+k6
VHI1pqeulFhroF4QSV4RZhvsmlJ5EVWEcdJFM6Z+alJfh/0zhpsGMB7JJEsJrg05+bKC16K5FoQ8
TYZv1XtcstImbJctwdee46Q1wqgEnXuh5cd7RSznFmhLhYjWUhitVJqammqmcvfysV+ZuKmKLrVv
rBQk6fO7UgUcxwMCTIA9gMRBGAFGIAUCknQJPkMMk7gZXZrdwZ/YnSQq9BUfRcDEEGNZXOWjmDFQ
kiXzMucQyrxcJJ/jL2VKFE6yQVzKLird5mRCpCNInryIkoH9arErDCKNlC0eFWcRtWKLpJCCIap9
qZvYHclJC/Z1sZ+CsFn5us+QrJRFshQSQ7UsozoF2mKVoryWVLpoyuhtxVI7iikFKbbeY0x4KLKt
S00JaQTkL6KX4pgrq0JFDVL1SmO7SoTkkeohiq8B19CRORepUX1RAElu6XRoZaam3JEvUpbLASI7
WlmwhFGVC6mQGqEtHXp3vQhAYogrCalL+5FzJmraQCg/Lz4WKon+dXJL04dmbKbhgopp8xEo6H0Z
Vk40BTTzdfWxCZYkln5khtGM0TUd0xJii6W5pY7oWijXWGZtJuLYzjBedMCmSLqKdUWYaqYl95Jy
D4SJ10lPGqgNwmb1pK+3MZCtuJqHa4gSVYSpnEnCmGrgsbF0E1Jn9aVqrPGtPgGPjRnhqYswg5k0
2MwsOYuWrdvGpnRj0Y+cPi69YipeHYeAFz0xV15s5dWdpE7HUcyEemV0aElopPNRWkpIgW0A0iKp
eOR0aHT0Ix3dLZZdnTJ8dWItnq9eRMBfVycg/s29D1595aW9mA8nzQh8KQhcf8vdl1y00JnVfQ88
esXl3/tSROBMGAFGgBFgBBgBRoARYAQYAUagbyFw6x2/JzrAFuC+VTEsDSPACDACjAAjwAgwAowA
I8AIMAKMQC8hwAS4l4DlZBkBRoARYAQYAUaAEWAEGAFGgBFgBPoWAkyA+1Z9sDSMACPACDACjAAj
wAgwAowAI8AIMAK9hAAT4F4ClpNlBBgBRoARYAQYAUaAEWAEGAFGgBHoWwgwAe5b9cHSMAKMACPA
CDACjAAjwAgwAowAI8AI9BICTIB7CVhOlhFgBBgBRoARYAQYAUaAEWAEGAFGoG8hwAS4b9UHS8MI
MAKMACPACDACjAAjwAgwAowAI9BLCDAB7iVgOVlGgBFgBBgBRoARYAQYAUaAEWAEGIG+hQAT4L5V
HywNI8AIMAKMACPACDACjAAjwAgwAoxALyHABLiXgOVkGQFGgBFgBBgBRoARYAQYAUaAEWAE+hYC
TID7Vn2wNIwAI8AIMAKMACPACDACjAAjwAgwAr2EABPgXgKWk2UEGAFGgBFgBBgBRoARYAQYAUaA
EehbCDAB7lv1wdIwAowAI8AIMAKMACPACDACjAAjwAj0EgJMgHsJWE6WEWAEGAFGgBFgBBgBRoAR
YAQYAUagbyHABLhv1QdLwwgwAowAI8AIMAKMACPACDACjAAj0EsIMAHuJWA5WUaAEWAEGAFGgBFg
BBgBRoARYAQYgb6FABPgvlUfLA0jwAgwAowAI8AIMAKMACPACDACjEAvIcAEuJeA5WQZAUaAEWAE
GAFGgBFgBBgBRoARYAT6FgJMgPtWfbA0jAAjwAgwAowAI8AIMAKMACPACDACvYQAE+BeApaTZQQY
AUaAEWAEGAFGgBFgBBgBRoAR6FsIMAHuW/XB0jACjAAjwAgwAowAI8AIMAKMACPACPQSAkyAewlY
TpYRYAQYAUaAEWAEGAFGgBFgBBgBRqBvIcAEuG/VB0vDCDACjAAjwAgwAowAI8AIMAKMACPQSwgw
Ae4lYDlZRoARYAQYAUaAEWAEGAFGgBFgBBiBvoUAE+C+VR8sDSPACDACjAAjwAgwAowAI8AIMAKM
QC8hwAS4l4DlZBkBRoARYAQYAUaAEWAEGAFGgBFgBPoWAkyA+1Z9sDSMACPACDACjAAjwAgwAowA
I8AIMAK9hAAT4F4ClpNlBBgBRoARYAQYAUaAEWAEGAFGgBHoWwgwAe5b9cHSMAKMACPACDACjAAj
wAgwAowAI8AI9BICTIB7CVhOlhFgBBgBRoARYAQYAUaAEWAEGAFGoG8hwAS4b9UHS8MIMAKMACPA
CDACjAAjwAgwAowAI9BLCDAB7iVgOVlGgBFgBBgBRoARYAQYAUaAEWAEGIG+hQAT4L5VHywNI8AI
MAKMACPACDACjAAjwAgwAoxALyHABLiXgOVkGQFGgBFgBBgBRoARYAQYAUaAEWAE+hYCTID7Vn2w
NIwAI8AIMAKMACPACDACjAAjwAgwAr2EABPgXgKWk2UEGAFGgBFgBBgBRoARYAQYAUaAEehbCDAB
7lv1wdIwAowAI8AIMAKMACPACDACjAAjwAj0EgJMgHsJWE6WEWAEGAFGgBFgBBgBRoARYAQYAUag
byHABLhv1QdLwwgwAowAI8AIMAKMACPACDACjAAj0EsIMAHuJWA5WUaAEWAEGAFGgBFgBBgBRoAR
YAQYgb6FABPgvlUfLA0jwAgwAowAI8AIMAKMACPACDACjEAvIcAEuJeA5WQZAUaAEWAEGAFGgBFg
BBgBRoARYAT6FgJMgPtWfbA0jAAjwAgwAowAI8AIMAKMACPACDACvYQAE+BeApaTZQQYAUaAEWAE
GAFGgBFgBBgBRoAR6FsIMAHuW/XB0jACjAAjwAgwAowAI8AIMAKMACPACPQSAkyAewlYTpYRYAQY
AUaAEWAEGAFGgBFgBBgBRqBvIcAEuG/VB0vDCDACjAAjwAgwAowAI8AIMAKMACPQSwgwAe4lYDlZ
RoARYAQYAUaAEWAEGAFGgBFgBBiBvoUAE+C+VR8sDSPACDACjAAjwAgwAowAI8AIMAKMQC8hwAS4
l4DlZBkBRoARYAQYAUaAEWAEGAFGgBFgBPoWAkyA+1Z9sDSMACPACDACjAAjwAgwAowAI8AIMAK9
hAAT4F4ClpNlBBgBRoARYAQYAUaAEWAEGAFGgBHoWwgwAe5b9cHSMAKMACPACDACjAAjwAgwAowA
I8AI9BICTIB7CVhOlhFgBBgBRoARYAQYAUaAEWAEGAFGoG8hwAS4b9UHS8MIMAKMACPACDACjAAj
wAgwAowAI9BLCDAB7iVgOVlGgBFgBBgBRoARYAQYAUaAEWAEGIG+hQAT4L5VHywNI8AIMAKMACPA
CDACjAAjwAgwAoxALyHABLiXgOVkGQFGgBFgBBgBRoARYAQYAUaAEWAE+hYCTID7Vn2wNIwAI8AI
MAKMACPACDACjAAjwAgwAr2EgL+urg5J/+beB6++8tJeyoOTZQS+NASuv+XuSy5a6MzuvgceveLy
7yUS45577tm8eXNbW9uXJidnxAj0EQSys7NHjhz5/e9/v4/Iw2IwAowAI5AWAjyCpwXXLhW4pwY4
1rH+pTZJ6v3WO35PdIAJcP+qU5Y2BQJdIMC33nZbTnb2qaeeWlZWxvgyArsaAlVVVU888USore2K
n/xkVys7l5cRYAT6OwI8gvf3GuxV+XtkgGMd69U66o3Ek9Q7E+DeAJzT/OoR6AIBvuIKzPx/UlRU
FAqFvvoCsASMwJeLQE5ODvYB3XbbbbfeeuuXmzPnxggwAoxAdxHgEby7CH6t4/fIAMc61u90JEm9
awLM7wD3u2plgXsYgY6OjpKSEma/PQwrJ9dPEIDmQ//RCvqJvCwmI8AIMAIxBHgEZ21IgkCPDHCs
Y/1Ox7zUOxPgfletLHDPIxDlixHYtRHo+UbFKTICjAAj8KUgsGt33lz61Ah0Xw1T58Eh+h4Cyeud
CXD32wWnwAgwAowAI8AIMAKMACPACDACjAAj0A8QYALcDyqJRfwSEOh7S1csESPwJSHwJbQvzoIR
YAQYgd5D4EvqKzmbfohAT2ldPyz6Li1yynpnApwSIg7ACDACjAAjwAgwAowAI8AIMAKMACPwdUCA
P4P0dahFLoNGoAunQP/whz/EEbhNTU0MIyOwayJQUFCAg9DvvPPOXbP4XGpG4GuMwJ133ZVW6X54
2WVphf/KAycZwRe/+sbKTz71KGFWVtbuu03bZ+95HsNzsP6CQPcHOJ4l9pe6NuVMVO98CnR/rE2W
mRFgBBgBRoARYAQYgTQQOP+73/V4p5FofwgK9nvJDy4+9zt0nSOuhQvPWXj2wrPPXnjWWWefddZZ
Z5551plnnHkG7m8vPOuMjz2z5f5QepaREWAEkiHAW6BZPxgBH96T6OSLEdhVEYD+cy/ACDACX2ME
Xlz8puv98mtvv/bWe2+/t3TZio/6b/ETjeAoUXNz64svvvCSuF9c9NKLixa9tGjRopdfXvTyKy+/
8srLixe/snjx4iVLFr/++usNjWIX2K46CHydy90jAxzPEvudiqSsdybA/bfPZ8kZAUaAEWAEGAFG
gBFIjcCokSPpHj16VPmYMbjHjy2fOH7spAnjJk8cn52VkTKJ5y7wx64LnksZ3hkAKex795ouROxy
FF7b6zJ0HJER+HojwAT4612/XDpGgBFgBBgBRoARYAQEAsFgICszA3RX3pk58oYjOzsnKUBr7t7X
f7TvWX2q7LPTvvhSiWzXay+657y958ydP2fPvWbPmTdr9tyZs/bcY+acGXvM3n3GrOm777Hb9BnT
dtt98pRpKe1FXReBYzICjEDfQ4AJcN+rE5boq0DAy2nxL/2wNHb98CUvUVKGWXvvkaWJkxJP08wS
Qh5579qU+RoBZCaOOOmno5KMl1lI71Ge5DkK8A2g+h0yMYE9wpFOFdrCJlcqZ8JfRYPjPBkBRuDL
RgDsNzMjxntzsjNzsnH2U2YwGMzOzkomzZr/PfnWPnf95Cgd5qhLL53wZYufLD/X/hIR8HqHYLbu
3Wmn6S2CivAeetP0R8d0+2TbAO1lumEbIqPRHh7ZIZLbFChhyWTgmODWCOilKGYVuKVv4e8R1Z7S
U1clisMkbpLiEtxUnPSVqBtzgjSj9v3plpeqT1nvTIBTQsQBGAEgsO4PR5Wd5nu8yroen7RmXe8C
I3Kcd9VUI0vfs4tklot+VHbUH3os93UvPuObO/f9Z15MkmK6OZ4Vk7qq6vGpV80rK/sRyd7Fa9GP
BPj/71AZvV8iM+7C5967Ya5v7g3vPXfhuC6ikDSaUUcir0l39KCO9Ia8nCYjwAh8mQj4A/6MjGBW
VkYObL/ZMPmC/WZmghDLKzMzKQGeMGm6761PV7vLK6zD1qV2RpteiTc9G6F6bWe0N/YrCMKXWRk9
nlfcEEnjZM+O7GlPgQ79f5gtqTEbg/bFV/lueM/ySXdGkQCuPjLSYVTXM0OrwD1ewV9igv1hutUj
Vc8E+EvUKs6qDyOQYoFs7YvPvD/3hosP0cEOueCCsWkuqrkHl5g4H62V48W7lXcYWd6hfiSIQokk
fegiwqJ7rvIdd8/lZ71/1T2L4pbDTbnSStQe+JA7Kt+9Ye7Dp/0oLv0EdkhXkNb+4Y7PNPhfI2R6
RIGsROJhH3vB5VNtNZo4tz7cLlk0RoAR6BkEAv5AMBDICARg780IBnDrC+wVv5Jmc9RP7trn/qNd
3uAFiZ142XS1N3r1XdNkKmv+9+m3VlOPs/ou32UT3V4YFhGftEI9O909kOeiu3ZviQeuONuvGjrd
LcBuQ2paA2LXBmajPB5yixsiKWoPj+yJp0AexKOJydQJes7kLU5C5IzoXkY6z0qUImCaOuYS3Cx3
Ohj06FQhRWL9ZrqVsupT1ntcl9fGFyPQnxFIqe5dDzBuwlTf+1+sd09g3X1HD1LX0fcpO6rwu/xl
/UT7ixRevjwWPEGSL//uqvfPuvwCp6lQxD3tYd/7V+2FNC5/Gcu8MiNKUvx2vRAoToJYoJeffXju
cYeNO+RiUNRnXaM7coxFTpysTYpxF1x+ls9I3w2xxJUDMKZqLL4eyCRWD1M5LJt8YgVT9X65XSsA
Jqr0szssdey65nNMRoARYAR8vgmXvklkFmzZMNc+d9tlb53/7H1qb/SESy+VrgmX3mftkJ5w6VXn
+1Y6XxhGRN9dD1mhJL9+uivnaqUkLc71ZRf2qxeP06zqLg70RpduH7fNR44RnR46vOOGSCpBT4/s
SadANA+RV2yigcGJfohne131vu/h06TsPTGjMGupB0a6hx56KM16Tx5cF10GIx1JGcM+h4xhalW5
y2Qv0VQq3UmpMSXsR9Ot7lZ93Ll/W7du7YISWEYnH3bRbJRXbW0t0kEvqVOjMKZPFzLiKH0WAa0D
JGFxcfFoeXVT4HQVZtSoUV3LMRwONzQ0JI07d+HVsw8+bdDKq195auEYM+SGB085+H/feGXt48J3
yVXj97pk2NobDvQ1t0XQ31909Str144R3ude9Jt9ZEzh/hzeMhXx433f6c323Jc887Dv9D/NdRFq
7jVr1x5w1fjfTSA5Gho2IKOVtz4DCZARfi/p8EXa7AlCmojPkYsQ4JmHZx/5ShkKv8+Rs6965t/X
zD1QFa7ZSseRYwwo12RFyTsceQ0eM9v3v08+bpg7xpcAMZ/O0VYRGz5ZOXvMQoVFf0dG1U0C9QA0
p0HFpHIsefBBiWISBYvVu++aa+K0QtRR2bAJ7y9a2dBQlrJR5OfnpwzDARgBRqBfIxAMCDMvXgMm
2y/KQhZg2rxMPikuQYIv9eEo56Mn+j99Ngra+9zT9/vOfzb2anAsAWkZfkv93ucue8oi4lu+if7L
jAfnp8o/0XPbCP7Y5oee3/Gf+va6rJE5S997uSMc7uyMjsuddOigY0fljElkxyN/x6DrNqDFxqqu
DPSiS79+8p/WPi4HW/Fr0CV/ErMG+qEfbXjwwfUQJybAkqv2uioix4d4KeOGSMKo50f2RFOghAho
kMpOf3ztPijYmoupkD7bHCb5jCI5/iK5lCNdjwxwiWaJbvOWeD+jBOaDmDvRuO+mCeZk72P3yWey
OYPrpNRsVv1rupW86lPWexwBBoPtav8j4mFfDdjvAQccUFRUZGNE3UmW4/Y7BLACgq/qjRvX3Vcd
kxBgGrmhcrjI3dLS0qtAjVn41NqD0N8cPP563+wYDV7yx+t9V79iceIDvwuavGjJDQfKbn721bfT
A+m9BsZecOFFjyG2Dn/Dn05/7Nzuy/2N78azcq8pCmm+8YqUccxB35h9vRbdawKew40pn6zCJkPM
Nbn1a5ZNPjRu0cFzrj5fH0bGTT1QssnlVNYDFy4U/ySFK3npxk6Y/XnFBqF1fDECjMAujYA4/ioz
iOOucAQ0DZqAg8ZQcqcx/TvqvujqaftOvOHunxx1qTuogiLfv89dq6NvioOy8OsG13DnSw7dw9e6
5tUfNL99yyF3Vka2V4Z2NoQaOjsjQX+wrqH+xc1Pf2f0JUk2snZNlDQHeurSiQqKkXfh7Vf/T80a
8GjZ6X96Sj0as9Ac1tXSuW0BXibhHCJ7Y2RPMAUSAiQYy7oGZ/qxvuqRbtn1Yloor9PVSkbahXCO
+wk0ITboJ5obpDspjZO1n023ulf1cWt+OA+hC5c6QkEcopBZX18P6x+9hyiPHlA3lt9wmz7s/joh
QPWLOxLp7OjoKCgobGpq6oIu4TxK86IUbJ70k87uoME7XUOxa9fk6Rvfo856YvXq1Q+cJvq7XywW
URa/9JhP/LKug69fBp2XiUV9k8aM0slGfavWre/sXL9uVZx355hxs6wIhgiiCalkXAQTqmMGjs/I
fLj4FyQYxNJSnvxnyCGv9X++57FZRx2ghBx1wFGzHrtHP4zLxJZj8mRRcqfsouBS6MSI2TKxSoiY
s8aNsX71e2R0QdzUQ9bBueOVcqWlYOhf47QCkUeNmbRs9ToPmp32YM0RGAFGoF8hANoL6otbDpvq
0hZgYsJpFEifiTVx2j7O/c1rvlgJs/Cbanuz+OW8XCOmIYE9qO7nynPHz8qd96vXf7GmcdUHze8s
b3/73fbX3+t4w58TrWhO+H0EOgIal9uA6xjQzM423YFejIDm1EB21DQ9EI9OO2R/hwiYPdxz8rmP
nfbAE2fFphSxUPFDZC+O7BDVMQVKNNURM37bPMWYFqQ1o3BOKGzRU4103VCruKiuYylkmfWLRZgY
yutXsvbsg7EuQZziaHzcx313TYipTqKpVLqT0rhS9avpVqpJTsp6jyPAsSMRLPOazcf1Z6w3DQZB
RegcAQlpRN9QfKn7MR92f50QoPql7k3sNurs1OZZUz1Sup0aqA28rrrXI9Q3ZSOxBzjg+tWLfjHr
8d89COOauE57wOr86N/rD0icZMXa5V7yKx8/y/f5epW+lwgJwkBUeUFe3Uc/aa0qb1j87HLf8hsP
naiuQ2/Ez2cXe8g1abLuoqDgs44+SNki00HMN2bs5OVrK6xUv37IxOE1ZuGTorY+Pw91cvWr6lFa
cBnJbVj/+azx5d1QH47KCDACXw8EiABj3djc9kwDKP3FSnKykmJDs3GQ1Zq7b8DO5+NhvRVv+L4V
O79qzd13q/d4rbd+19x9tt4IbWZgi+hbc/cFd/fUh4XnDJw3LnPipprNteHKrW1bNrVVbGxd39TZ
0NLR7G7+JetM4mOg0x6MPQ706elWIinih0jso+7tkd0+BUqvGC6hU80oUuDf70c613HfC6qJ5gZd
nTP0r+kWEOpe1Xt468OqBdjccnJy8Dd5taAXgRkQdzgc2RVuWL5T3rsCDrqMqHxwey9t12MYLFnD
5JvGBi2P6cYHS++UvdFjJ/mWr6mIRsdIpgqH40LyxscHZWYI4whfsWa5GU4lM/rAo2ctv/GPr7pL
hQjGwdHxGSFP86GVgMreTK8Co+SsX7z0hXG99ItZYMBUmrh03BO1tnrYpLQJJJ6+etV5j5968dmj
3RDQsRNmEjUg7u/IWBXnrh6Exeizn/gCVYEllgrPCmarMJkOdGvSWIF5qqtLLYYjMQKMQL9BIDsr
c9u2rdu276jEB1uqa2pqanHX1tbV1+N10kbs2AIPTlYYmHxxBrR1yWOf1e5lbIh+9nzr2cQnfRMF
K35InZbl95/te+hZ93d74yL6Jz457Rvd+bCw7uQ+ql9+5cpLh4wYEipo3tG2rSZcVReure2obot0
hH0dZaXFuAeVlgwqE/fgQaVDBpUOHlw6ZPCgooGFbmOnHHLEYB+7Xn3pcZ/VtaY90DvnDBXrP6fk
EkwnkMWki5946Re+Gw/9FsYEl8mGOURGe21kNzPWUyAyecUOGrOmOvYRyRbKdZriOqNIgb+Xka6n
WqnrQOo2b4n3MyZ55gN7RA/jfhyIiSaf6U5K40sFqWIz2r4/3Uo6yUlZ714JMHgvbHGXXHKJh30y
linQw9a7r0EQQHzE4Yf96IeXEdam+8D9F/y/O26H59egmF6LII3AKdUurQBYsV6wYAH+9jYHTibV
hodOvfo1HWDDQ797wnfqYfvj/Z2zLz51+Y2H6WcbHrr6oWQmVAp/hRXmtavPe8I12zFnP/HAqU+c
N+lUI7XXro6JsHyNB0NtUpg3LAH/PfrAuPdDx0je/UCsoEYKXc4R0E0674lTH7gecOFKFzGfb//D
TjUy/xoh46wfs4ox6Rk7Jj244utow/ovZk3g93/T6mw4MCPw9URg9swZu02bNmH8uFEjRw4F2xtU
hru0tGTgwAEFBfl5uHJzk5YcdNW84t7dNZ6pfc/itCy64IHH1nZowylyMxO1gnQL/2V171/32ZUn
73HahqzVHzV9sLNjZ6cvWhIdXBgq8bf7quur/vbY4489/sRjTzzx+BNPPvHkU+J+6u9PPvUPOB5+
5LGJ410OLhHD4hPnxQZfMWrP+sV5NJ4luJIM9M4R8IobfZSc7dGGhx4yxmKMfIIDxyYbsazjhshe
GtkTTYG6XF2eZxQp8e97I92YCbGJVMJJXgy5lON+vCaoiImmUulPscw67F/TrW5WvScCTOx39913
Ly0tTantCV7k80qg+l04ADJlypR9992XkDHd8/baa8aMGfDsd4XqusCRiHrbO6WipBOgubn5nHPO
6T0OjGE6RZHxkgnoqHUdduOk+1ddt0DGWXDdqvsFVaXrsGfH709v6YgVzliisRcDFlz3ws8xilHw
lw554eezEigIEjZCIvDvxn9HZfmdn2NAhs/VSxwZyeUHR2lGnfnYY2fGvT205IEbl886Ssmq5Ry1
/1GzfE+8JJKNS2dBXI6x4I5kVckNrCYdtuaiVasstJIh5iq5jHDIqU/87kHrzWUJef9DZv2Dpx4m
9pjfeNipoiju6jFq/BdKkw579qgXSMO8KRjC2eoINTzpovhKT6Tk0P90miOHZQQYgf6EwP1//KPH
uz+VypCVRvD3a96+8fOrT9jj5FWBD1c0vLezfWdWZ/ZemfvnbR44L3Pf4ZmjOjMj3zrpuET3Cd88
evpuU1w6SQyfL/zc6pknTTrvi5+/EBtOuzDQywFMpye6ep1cXG9/2LNROWjrLCAITTbkyG9cxhDZ
WyN74ilQIgTiB/T4UGnNKJLi39mZeqTrkQEu4SzRZcalK8oxyTMDa3fKcd+hCVT3ieYG3uYMsUlp
Il2yMumz060UVZ+y3v11dXWohd/c++DVV166c+dOs/uTL/RGNfsdP27ckUceeeFFF4VCIddeEga6
J5988sQTT2ptbW1vx8nz4X7amaYl9ujRo264/ld777PPIYcciog29+FHHDFv3l4bN25KK83+GxgN
BhWfl5fz2quvnnjiid0sCL2bhP3Ps2bN2m/BgoKCgptuvhlZQLX0XiztwCnQ+Fra9bfcfclFC535
3vfAo1dc/j1XeX74wx/eeOONmzbtKnXUzUr5aqK/ds2Ulw9ZdV3SRfevRrI+muuGh0+/0nfLY2d5
sgDj+2G/+MUv7rzzzj5aGBaLEWAEGIEECOgR/KYvrt5jwsyPo0vfb3yzvr2xLDp4n7wDlq9avqD4
oH9seOycWee/u+bt2+f97usJ5K46RHoZ6VIOcPgO8Nlnn51EMXatWWI/0aWUVZ+o3m+94/dEB1JY
gDX7HTpkyKAhQwYPGfz17Du4VH0bAbx8XlxSgj1bd911V+/Zgfs2Bru2dPtfhzNXplzjujl710bG
rfQYGI5Ye5FH9svwMQKMACPwNUDg8EHHvPjF8wP8AzPacwZ3DFuQffB7n7x3UOnh50646GfTr7v/
/d99c/RJX4NiuhdhlxwieaTrFX3uD7rUI1WfggBj5zNevxwyZMjo0aOHDMLBAWW9And/TrS6uobE
hyORuz+Xr0/Iju9Zl5WB/w4aPmL4888/T98t7Nkr0e5Q9u8jCCy45tNPr6Et4HylQGDUGY+mhVXP
NiVOjRFgBBiBLxkB9ImzB86dnTP3w48//kbBSUcVHv/Gp68fNfibZ5R/B4/2HXTAvw9+ecHgA7/G
g8cuOER6HOl6ShW/xspjK1rf1yUvVZ+y3lMQiUgk8sYbb8D+BgKMF4ALB4hT8vhiBL5kBAoHDCgp
KRkwYMCM3WdgHz7a6pcsAGfHCDACjAAjwAgwAn0ZgTNHn7dgwEEvrXz+3x/964Thp55eHtvXmh3M
6cuSs2xfIQLJ9z9/hYJx1r2KQAoC3NHRAQ783//+t7m1paCQ2W+v1gUnnhCBAQWFeAF48uTJOGOM
3gHuWbBSH4K16yz9cUl3PQRSnhXRs82NU2MEGAFGoAcRMEfw00edfcPUO+6Z/eeTRp626/XlXGIX
BHpkgONZYr/TrZT1nnorKXHgW399a25eHk63StlnIUv5HeBd4iPA+PgtABk2bBjoGSFjc+fKTwvs
Wt8BDoc7Iz18qGx+Qf7w4cN7if2mVGkOwAgwAowAI8AIMAL9AoERuaNKs/h9vX5RVywkI/CVIZCa
AEM04sBnfPvbXsSUBJjY7y5xAZMxY8YUWuZxmxtf15MEeFe5xNnf4Qg+SeBFVbyHwdek5s6d2xu2
Xy1Dv1vcYoEZgZ5CwHtL5JCMACPACPRBBHqqM+R0vn4I9JS6fv2Q+XqXKGW9eyLAmgPja7cgt8kT
JQvwrkL4wuGamtopU6cPGFAMh9OdmZkDz10HDVr2oA/X9dSFJnrhhRf2KvvtKVE5HUaAEWAEGAFG
gBFgBBgBRoAR6MsIeCXAxIHxBWD8TV6ecCSCndItLfgU8C5xNTc3V8kLDqe7pqYGnrsEEKqQUJBw
Z49agMGokXaPv/drqjFWbfhiBHZlBPryKMWyMQKMACOQBIFduevmsntBoPvNx0suHKavIZC83tMg
wB4VqL2tvaGhsa0tFML/fO9SCKC+29rAgKP96pRmfOy6trZ2xIgRX+/dIFw6RsAVAWg+9B+twGMP
z8EYAUaAEeg7CPAIzkNbEgR6ZIBjHet3Oual3v11dXXoyH5z74NXX3lpdXV1Fzo1fdBWRkbGokWL
xowpz8rKwU7pHn8RtAuycZSvBAEYbNes+eLYY4/tvdz9xoVc8KulpQUfCr7+lrsvuWihM9/7Hnj0
isu/5yrPbbfdht7tlFNOGThwYO8JzCkzAn0Tgfr6+qeeegrrVj/5yU/6poQsFSPACDACiRDgEZx1
IwkCPTLAsY71Ox1LUu+33vF7ogNxBBh2ALOQIBUpT5E2wwcCgfXyIlLN1y6LQFZWFrjoXnvtlS4C
UDnvUYgCE/vF3y4TYMT99a9/jdWflNv7vcvGIRmB/oIAVn/wjfef/vSn/UVglpMRYAQYARMBHsFZ
HxIh0FMDHOtY/9KxJPXuToArKyv7VwlZ2j6OQFoLKJrKdrlQXbMAdzk7jsgIMAKMACPACDACjAAj
wAgwAv0CAXcC3C9EZyEZgSQIdGELNOPJCDACjAAjwAgwAowAI8AIMAJfbwRcCPDXu8Bcul0HgXTf
Ad51kOGSMgKMACPACDACjAAjwAgwArsmAnYCvGuiwKXedRBIcgjWrgMCl5QRYAQYAUaAEWAEGAFG
gBHYNRHQBLjnP4O0awLKpWYEGAFGgBFgBBgBRoARYAQYAUaAEejjCDAB7uMVxOIxAowAI8AIMAKM
ACPACDACjAAjwAj0DALqM0g9kxinwgj0VQSwBbqvisZyMQKMACPACDACjAAjwAgwAoxAryOgvgN8
991393pWnAEjwAgwAowAI8AIMAKMACPACDACjAAj8JUicPbZZ/vT/VLrVyowZ84IMAKMACPACDAC
jAAjwAgwAowAI8AIdAWB+vp6QYAbamq6EpvjMAKMACPACDACjAAjwAgwAowAI8AIMAL9AYEBJSUg
wHwIVn+oK5aREWAEGAFGgBFgBBgBRoARYAQYAUag2wgwAe42hJwAI8AIMAKMACPACDACjAAjwAgw
AoxAf0CACXB/qCWWkRFgBBgBRoARYAQYAUaAEWAEGAFGoNsIMAHuNoScACPACDACjAAjwAgwAowA
I8AIMAKMQH9AgAlwf6gllpERYAQYAUaAEWAEGAFGgBFgBBgBRqDbCDAB7jaEnAAjwAgwAowAI8AI
MAKMACPACDACjEB/QIAJcH+oJZaREWAEGAFGgBFgBBgBRoARYAQYAUag2wgwAe42hJwAI8AIMAKM
ACPACDACjAAjwAgwAoxAf0CACXB/qCWWkRFgBBgBRoARYAQYAUaAEWAEGAFGoNsIMAHuNoScACPA
CDACjAAjwAgwAowAI8AIMAKMQH9AgAlwf6gllpERYAQYAUaAEWAEGAFGgBFgBBgBRqDbCDAB7jaE
nAAjwAgwAowAI8AIMAKMACPACDACjEB/QIAJcH+oJZaREWAEGAFGgBFgBBgBRoARYAQYAUag2wgw
Ae42hJwAI8AIMAKMACPACDACjAAjwAgwAoxAf0CACXB/qCWWkRFgBBgBRoARYAQYAUaAEWAEGAFG
oNsIMAHuNoScACPACDACjAAjwAgwAowAI8AIMAKMQH9AgAlwf6gllpERYAQYAUaAEWAEGAFGgBFg
BBgBRqDbCDAB7jaEnAAjwAgwAowAI8AIMAKMACPACDACjEB/QIAJcH+oJZaREWAEGAFGgBFgBBgB
RoARYAQYAUag2wgwAe42hJwAI8AIMAKMACPACDACjAAjwAgwAoxAf0CACXB/qCWWkRFgBBgBRoAR
YAQYAUaAEWAEGAFGoNsIMAHuNoScACPACDACjAAjwAgwAowAI8AIMAKMQH9AgAlwf6gllpERYAQY
AUaAEWAEGAFGgBFgBBgBRqDbCPij0WhDTU2301EJRCKdb3228d1Vmz7dsHPjzro1W6tb2jrwLC87
c8Lw0tGDiyaPLNtntzH7TB0dDDL37inUOR1GgBFgBBgBRoARYAQYAUaAEWAEGIFkCAwoKamvr+8x
AgzG+8ALH7yyYl1eXv5e08eWDykaWjKwrCg/PzcrGvWFI9GmltCG7TWVDc2vfri+uaFh32kjFx46
a/rYoVxLjAAjwAgwAowAI8AIMAKMACPACDACjECvItBjBPjzzZXXPLzo9ZUbRgwpPfWQObMmjBhe
WlAI3tvZGe30dYL++qJ+cQXwn8/v37C9blN1w9+XrPjgk3Xzp4z45bcPmTZmcK8WlRNnBBgBRoAR
YAQYAUaAEWAEGAFGgBHYlRHoAQLc3hG++YlX//TC0hFlRccumHHOEXt2dMAv0h6OdHR2RsB9cQsC
DNor/gQDQex8zs0KZGUEs7OyPt5YfefjL3+0dvO5h8/52WkHZGVm7Mr1wWVnBBgBRoARYAQYAUaA
EWAEGAFGgBHoJQS6S4Cr6pvPu/Nfn2+pPmbv6f932B6lBTk7a5pC4Ui4IxLuDGPPs+S9MPnC7Ovz
CesvGYBBgwMZgWBG0F9cmDOkpOhvi5Y99dpHA7KDf/7RScWFub1UWk6WEWAEGAFGgBFgBBgBRoAR
YAQYAUZgl0WgWwQYb/yeceuT2ZmZV5x+8Lwpwzdur61vDsH4297Rjischvk3Arbrg8U3mIFL/BsI
+IN+f1TshMaPzKAfrDg3I2Pc8JJoIOPKe5/5ZP3Wv/3sdN4OvctqJBecEWAEGAFGgBFgBBgBRoAR
YAQYgV5CIEaA083g/VUbj/npfZNGDf7FGYfkZfk37KxvBfltb2sJhdpCbaDA0v4bheHXL+hvZmZW
Nq5gZhZYsLABBwJBkGDQ4QAIciDD7xsyMH/M8EG//eebTy5e/r9bL5w7ZXS6InF4RoARYAQYAUaA
EWAEGAFGgBFgBBgBRiAJAuIU6Lq6urQwWret5rirHhw5aOD15x7Z2tK6ubKuraOjuTXU2tQcaW7I
b94+qH5z5rZtvlCbLyujZciIHcXjmgcOy87OzcrNzczKBCMW3FdYf7EhOoqN0BkBYQ0uys+dOm7E
n55996lXlv/3lvPGDStJSyoOzAgwAowAI8AIMAKMACPACDACjAAjwAgkR8A/fdpwFQJG21RoRX3+
TYMOHzFq/PXnHBYJh7fVNLS1h5tbmpqbW7LqKkdv/mRQ1drCxtpga0sgEAlkBNvzcquLhq0bvce2
AeMycwuysnIysqQdmE6EDoAKR/E54Cy8E+z3FefnThs/4s4nlyx664Nh258FPU4lTsLnOH+6qrqp
qbkNp3B5TYTO6aLQYve25VIneJGneiCfihec5T8xt3ZZj/xg/QMH5KqgXkXxEE4eLdbPLgLF2yVq
sKoRNQiHtxhWTaRRg1YdWrVqVKiqSVRcbk7mgAG58kV2caR5ZRW03ZtUpB4+PwpAumVplwJCaZzl
T0piqpP2EWLkZkGRqmuaqHzYOlGQj4PkeuHcOM94m/UiI8XFRMVJrELp1qBVgao12kAzGyE9stoh
wRtraho9WYM5Sdqg2apVkjolXSdW3ciadLvS0G57dEC0s7KhsSk1Vu5oWCU31Ez3ThYMRkx0u1Cn
ooF5NbXN8M7OzhRnNUjNw9sqmZlBkg+d5w4hVav3GtSZKJRUEzDryawhahfuzYGekGCowYED8vzy
y/FSrxqbmtAGO13rwcUzvm+PKZhRyzFJXdqji14BwxzoVWGOWM2VPYNtxNGNIaFeGFLprsDSLjXU
GNpsjD/WSBQ/DIlfumbTH3GUvHJgoZMrdZs2Bpvk4046PXz6bcgFyNicRbgS91zGE2/dm1uorsd0
19O4tmz1M1LjrdYTGxES9jpem4A9nLfCdDV1qUMqMpQJBSJlkp8EoSequky1S5Zb2r1r2hF07p5i
egrUDfi+dlGNyXNsem2VMg5NO7SpoU7cxdpgTJ1U+t1Sf62puB4gUb+uGmuC3sMZK93wlHCCWC7I
mpNk0SfKGQL9S6Hx74RxQ2T/Qknr/5RbHMxs5Yhzl/2/v+dX3mvw3ytbV2wP/vTU/Uvys7bW1re1
R1qbQ00tTe1NdYe998zA9esyC4KZ+cGM3EAw2+/PEHLhY0jhqH/T6D1eLtmnMzMvMzM7kJEpNkHT
NmiRd2cgGs0M4A4MKimcMn7kj3/3vyE5TSfMyPMumC3kCy++PmrUmAsvumjw4OF44ThZOgJ7dVS1
hEb+wtwvgtmV8AdYnZGImA3io06dcEiJ5SU95TnXlIb1U8AuHnQ2NTa89NJLO3dun7nH1C6XJUHE
Xh/AelpgoZze03zhxddGogYvFDWIFZMkEQl9Gm9lBar6iNVgFPUl9uSjfqkGKYjwtHyp/igILZqI
f2I1uI1q8HnSKylVMr3SOmFpVCwvlbVInGbw9Ej+lXlK6eiR0DkZoKmp8aWXXqzcuf3MMxfiYSjU
umbN6nfffW/+XrO8Q9qrIWMTGyubF17QNTjMWYO23telDUoQrBmTbmgKNFV/bm2QqlDWsnA1ijb4
4s6d2/aYkbANmmzBJI4mPdN9LZXPTZXTUG9bEs8+t3jkSKFXgwYNTahXSs+FZsqyCYBU10M/VKck
FEYpu9U7kdKRdiFUU5Pol6BOp512ektL8/Llyxsb6+fOnYuIO3bsaG5qKi4eCAmlVKMvkFJ5aINq
zkviUZsUahxrC1JKS+3JX7cLFZLapuw8pf6LH41SWvSis2ZOg+dzz786atRogdXgYRhFPPQMqse2
+nbRnyu3andKkviewWqGsii6o6BOBhJaeqX6dow41F8NGTIMJzwma2tWPVInY43PstA0+kCqKGpQ
PFUkP9ZpxOrRkkn4WJJjxEFH8VJl5fbZs3ZLqKfuwmnOKztC6n8UG5ZThtiVZOhJswk4JEnCoF0p
PUkoRU1jFiXCu4KQnN5TRu4Rk1V4wmfGAoY1i1MzOllY6Y6R4S5lkSBSGrOHNILaMrNVjaVNeqwV
zxXiuh4TFbK7imWmm2qZpifz6slK669pGeQkbkSlxX66kmCeei0vcYU6kvVct/EBvUXzFuorrsZY
e07Sq5uPjLbpjOuemhXFdXUreRT3PkTriEmA5eI41p9jHJh6y7/+9S8/vPxaMyEaKyOSwuFl3UgE
R1RFwpHIA3+827/bVEGX1SW7JNcKGjW6fOrcw+9/P3TiftMPnjF64/aa1o6OUFukpbW1tblpUG3F
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
RFM7r9t+4+Y163P9a//0mptedp3o2bJu5fLxa65IRt6347pPb9k5ZWiziBj5+a037dhWspCck0OB
5Vj8jEZkW+tCgCLkq90AB20co2Fk570imYYO+Xy5AJuNM9A3RD82TlLs3bROHLTvAOd0N4/i+rjE
iQTK5Gn6U87hW6DXPV+abIht79iNn79xx+3bd+ycHKLU0SW6auXE6otXr73iKl4fnBF1RFT6yBAk
f9NSI2bbd45N6Vug8y0vsvPunT3fZLtt27Yt12+BnmuuueaKK6+oV7fuZeuQueVPRca3xsxhm7cw
kn1SOzDeX93HchrArc02N3JGrGVdsBkvSao8DDyczYvHJs6duPplV69aNcRJN4MuDGwm+Nj4puv+
7cJ3Yq990dorntXQo2hAt0eHwV+4iV5XfY86vnTV493pHd1vILwDBQ6D7+zJfT+DBGm/6eRzr/kd
hzLxHeCBrTuSQHwGaSTYotCcRyAI8BFpokSAUblyVwsAaqL47iuOImdKLRzXD/ZOJGvzTKWd9jki
MiKhzeuuvGrligncEnZO7dxy03Xpa0bkvUJxs7WtYgMJcGVbe/01HuydWLEKDBaUct3WTRTe+Okt
t9x+E+rCUuSJ8YkNN29CcHLTGhRBwPOadc+66upVa8Hlrl59FXK23nbjutVXb71t25bt1+n7osTO
iRWrr3vRBtH55+tvWrdVdG7bcsuk6Nz8ovWrVkxsuOm6qf2T171o0477JtfftF5thr878eCu1oLI
bQJwbGrz8zetghmfBlsb33TlNTumJtffvJEEeOMtWybv277lRZtBD67auuGml4n9Unxsr6uCd+IF
isOLK9SLG9fddJUUX/uh9QCWRBdpEuCNn998CwgYkddPK6P4dc9Xd2665qYX3yjCf75e3+28TJ+L
FgK8+UUbxS9ghe/rrt0gfoFCv1J9v3kzJgjA7dVI1AjX2F6IBmsrY74DHwhZjnwN/3rMHBnGeNUS
hH+lUs0kk/V5fXQw5nCbAp1OAXLs+lw709wWj216mTjeMGKuj0tcc36IBlTixirZTIAH0eYbP711
2/Zta9ZcNb6CsByL29R9O7fdfOPaZ629as3VDAb670A4+gh3cOBGApxX2p8Ab9y4kV/3wYthka5b
PusEOJ8JGoYAV3ivW143eAYZhQCL91ent0AzgU839WRNsHn79u2b37YZSja9TU7qObgJyR8fz7u0
+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
EUAFGHkAEUAEEAFEABFABBABRAARQAQQAUSgUyCACnCnIDNWEhFABBABRAARQAQQAUQAEUAEEAFE
ABVg5AFEABFABBABRAARQAQQAUQAEUAEEIFOgQAqwJ2CzFhJRAARQAQQAUQAEUAEEAFEABFABBAB
VICRBxABRAARQAQQAUQAEUAEEAFEABFABDoFAqgAdwoyYyURAUQAEUAEEAFEABFABBABRAARQARQ
AUYeQAQQAUQAEUAEEAFEABFABBABRAAR6BQIoALcKciMlUQEEAFEABFABBABRAARQAQQAUQAEUAF
GHkAEUAEEAFEABFABBABRAARQAQQAUSgUyCACnCnIDNWEhFABBABRAARQAQQAUQAEUAEEAFEABVg
5AFEABFABBABRAARQAQQAUQAEUAEEIFOgQAqwJ2CzFhJRAARQAQQAUQAEUAEEAFEABFABBABVICR
BxABRAARQAQQAUQAEUAEEAFEABFABDoFAqgAdwoyYyURAUQAEUAEEAFEABFABBABRAARQARQAUYe
QAQQAUQAEUAEEAFEABFABBABRAAR6BQIoALcKciMlUQEEAFEABFABBABRAARQAQQAUQAEUAFGHkA
EUAEEAFEABFABBABRAARQAQQAUSgUyCACnCnIDNWEhFABBABRAARQAQQAUQAEUAEEAFEABVg5AFE
ABFABBABRAARQAQQAUQAEUAEEIFOgQAqwJ2CzFhJRAARQAQQAUQAEUAEEAFEABFABBABVICRBxAB
RAARQAQQAUQAEUAEEAFEABFABDoFAqgAdwoyYyURAUQAEUAEEAFEABFABBABRAARQARQAUYeQAQQ
AUQAEUAEEAFEABFABBABRAAR6BQIoALcKciMlUQEEAFEABFABBABRAARQAQQAUQAEUAFGHkAEUAE
EAFEABFABBABRAARQAQQAUSgUyCACnCnIDNWEhFABBABRAARQAQQAUQAEUAEEAFEABVg5AFEABFA
BBABRAARQAQQAUQAEUAEEIFOgQAqwJ2CzFhJRAARQAQQAUQAEUAEEAFEABFABBABVICRBxABRAAR
QAQQAUQAEUAEEAFEABFABDoFAqgAdwoyYyURAUQAEUAEEAFEABFABBABRAARQARQAUYeQAQQAUQA
EUAEEAFEABFABBABRAAR6BQIoALcKciMlUQEEAFEABFABBABRAARQAQQAUQAEUAFGHkAEUAEEAFE
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
3u3KK6+Mi4s7eQXGlBGB0xOBhoaGFStWwLzVQw89dHqWEEuFCCACiEAgBHAER94IgkC7DHDIYx2O
x4LQfcGiN6k64KEAgx1AXElQKkLuIi2Or1AoSriLKtV4dVoENBoN6KKjRo0KFwFgOemfUBWYar/w
t9UKMHz74osvwuxPSPd+6WXDmIhAR0EAZn/gjPd//vOfHaXAWE5EABFABMQI4AiO/BAIgfYa4JDH
OhaPBaG7fwW4urq6Y9UQS3uaIxDWBApTZVtdqdZZgFudHX6ICCACiAAigAggAogAIoAIIAIdAgH/
CnCHKDoWEhEIgkArXKART0QAEUAEEAFEABFABBABRAAROLMR8KMAn9kVxtp1HgTCXQPceZDBmiIC
iAAigAggAogAIoAIIAKdEwFvBbhzooC17jwIBNkEq/OAgDVFBBABRAARQAQQAUQAEUAEOicCTAFu
/2OQOiegWGtEABFABBABRAARQAQQAUQAEUAEEIHTHAFUgE9zAmHxEAFEABFABBABRAARQAQQAUQA
EUAE2gcB/hik9kkMU0EETlcEwAX6dC0algsRQAQQAUQAEUAEEAFEABFABE46Avw5wK+++upJzwoz
QAQQAUQAEUAEEAFEABFABBABRAARQAROKQI33nijPNyTWk9pgTFzRAARQAQQAUQAEUAEEAFEABFA
BBABRKA1CDQ0NBAFuLGurjVf4zeIACKACCACiAAigAggAogAIoAIIAKIQEdAIDYhARRg3ASrI9AK
y4gIIAKIACKACCACiAAigAggAogAItBmBFABbjOEmAAigAggAogAIoAIIAKIACKACCACiEBHQAAV
4I5AJSwjIoAIIAKIACKACCACiAAigAggAohAmxFABbjNEGICiAAigAggAogAIoAIIAKIACKACCAC
HQEBVIA7ApWwjIgAIoAIIAKIACKACCACiAAigAggAm1GABXgNkOICSACiAAigAggAogAIoAIIAKI
ACKACHQEBFAB7ghUwjIiAogAIoAIIAKIACKACCACiAAigAi0GQFUgNsMISaACCACiAAigAggAogA
IoAIIAKIACLQERBABbgjUAnLiAggAogAIoAIIAKIACKACCACiAAi0GYEUAFuM4SYACKACCACiAAi
gAggAogAIoAIIAKIQEdAABXgjkAlLCMigAggAogAIoAIIAKIACKACCACiECbEUAFuM0QYgKIACKA
CCACiAAigAggAogAIoAIIAIdAQFUgDsClbCMiAAigAggAogAIoAIIAKIACKACCACbUYAFeA2Q4gJ
IAKIACKACCACiAAigAggAogAIoAIdAQEUAHuCFTCMiICiAAigAggAogAIoAIIAKIACKACLQZAVSA
2wwhJoAIIAKIACKACCACiAAigAggAogAItAREEAFuCNQCcuICCACiAAigAggAogAIoAIIAKIACLQ
ZgRQAW4zhJgAIoAIIAKIACKACCACiAAigAggAohAR0AAFeCOQCUsIyKACCACiAAigAggAogAIoAI
IAKIQJsRQAW4zRBiAogAIoAIIAKIACKACCACiAAigAggAh0BAVSAOwKVsIyIACKACCACiAAigAgg
AogAIoAIIAJtRgAV4DZDiAkgAogAIoAIIAKIACKACCACiAAigAh0BARQAe4IVMIyIgKIACKACCAC
iAAigAggAogAIoAItBkBucvlaqyra3M6fAIOh3Nj8bE/95buOVp1rMpw8EStqcUG7yK16l5dErul
6PtmJOUPyMrP6aZUou7dXqhjOogAIoAIIAKIACKACCACiAAigAggAsEQiE1IaGhoaDcFGDTed3/c
UrDtcGRk1KiB2d1T9WkJcUn6qKgIjcslsztcRpPlaEVddWPzL9tLmhsbz+qfcdP5uQOz05BKiAAi
gAggAogAIoAIIAKIACKACCACiMBJRaDdFOB9ZdVPfrT2t11Hu6YmXj1hWG6vrl0So2NA73U6XU6Z
E9RfmUtOLgX8J5PLj1YYSmsbv/h525bdh0f36/rEzAn9s1JOalUxcUQAEUAEEAFEABFABBABRAAR
QAQQgc6MQDsowFab/fnPf1ny49auSfqpYwfffOFwmw2eOax2h83pdIDuC4EowKD2kj9KhRI8nyM0
Co1KqdVodh6rffmzdTsOlc26YNi/rjlXo1Z1Znpg3REBRAARQAQQAUQAEUAEEAFEABFABE4SAm1V
gGsamm99+ct9x2svHjPw2olDEqN1VXVGi91htznsTjv4PHN6L5h8wewrkxHrLzUAgxqsUCmUKqU8
PkaXmqD/dG3hil93xGqV7z04PT4m4iTVFpNFBBABRAARQAQQAUQAEUAEEAFEABHotAi0SQGGFb/X
LViuVasfnjF+ZL8uxyrqG5otYPy12qxw2e1g/nWAtisDi69SBRf5V6GQK+VyF/GEhh9qpRy04giV
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
3loLxYKYuTMz2XO7lFLHwS4yq/SEwqK9IWqNe9XpwIQHfrZIzrTlg+6fvjZNYTCRdqpSFNTaa7fK
PeSFc9c3Yy+Tbot2ivMm2lYf9nP2XFtHvMHDgV1Ysb65HJ+rICzJU7pxsxwkKzbYGi/D5GqF/UaV
HdgvD2JU1hxxO9+P1y2ZvSf2e+7/nNcjy+ELPTH7TQeDpX51SThwrIUhz5nwo7yg3cNW3+dDScw3
3RjVF3zmEb9uu71RhV5eA2u/qdx+rijMDfn+b0egI9AR6Ah0BOaezwv8tn1XKTW4NOGWy4Ornp6y
I0bHcKkIvOO3QTr/R9/7n/6n/+kv/IW/8Cf+xJ/41//1f11g/dv/1p8eIPvf/49/rPN/9s/+mTb+
Pvn//c+//Cs7a3/2PUsFtBv/ySLQt0H6ieD/vg99EI6Ea2u4oqNZTG9Wb8mzVCwQN1qrvrApaYyr
4r0O3C1faN2EP6q5nYujzZ4cHaOCOm3y2fm5NtW8f35mbmRmVnl627nusoV7RyerT60efOHg9PT8
8vULCPmtS2nC2pBw686dyWR8uH8ga7t7e1tbt+88vy2R9pG4SbadjEY7O7vrz65pMjv9ztnh3buz
71/c++rJvP6DlenFdPSUqO5o9vrl3a8c3XvlninTijyfF81ufWpn75M72jhHnZcp7aIpZi5dd6hz
e3uruPGtldNjyje30Y2Fh5Tb/CopeKivP2v7hwfnr03Xn57s7e5pd9Dh0pWa6uFr08Ojuxr1Yn82
P749eddIGrUWCzS6s3O6dP79WT3CPKZQ3eYCzaMF9nJLhomitepfiefxHG6rBc5tNlJtM1hRTdT7
8mYfdN08RlhuXhhqJiOX3yKumv2iQlOSLwR117ytWGl6/iwa+1y1fsSzHbZBiswbNg5Lbws0Zuwl
m0c8DwjDSyuj8i1Yf2Z98/nNRzTQizoCHYGOQEfgBiNwfHSs3eC1DdLixBFWXIFdCydeDrYvtKNy
Mt30bZCW8fo8Odsg/ebnD/WK/Mk/+Sdv3br1L//lvxT7Pftf/7ej3/7v/9v/7u/pRL+qUE5u2mpP
arAqLwPNbrMjcOMRsDeyc1wRRwq/RQ+Uusj+vY4OFVlNYDAcTzWlu9Zf/JI94a7WM4k4jcPyEOFp
fNfX1g8ODu6+eLj27Jq2tI3ns+zIOH7UWTB1rO/+Fw4uvn+x96m9k68c3f3C0cbGurpx9NVjjLxf
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
37z/er1RHK/24BFXaz+h7ccP1jBrU1/uevOr6+VieXHzGrQ1raFkLm+/uuHS+dUF6HJ79TbnX7x8
+eonrxYKx/2O49WX58vlEtnwZHXC5Q/r9c3v3pDL6/bqzaxNaxuG9HyxfE6Wpu3t39y9+29fL56v
Xr96Ne76cP27W+g7neY4/eo1UOe9jo5ufnnFaF+Dvjha165ID5Scn569SL9/+PDmd7fw/C1K7zh4
m77527vXP5WkOY/z6/Oj5wtw+uTzuvHmb94dbd+//dXdXp0zZGweCpBvL2KtPkiMVQ1wVDDpsF4e
jegUtkdBlWhfOxIrLRnPYplAZYdAO4haew4t5a6sXFw68V7NQnz7t8s52RHg3AvryiHcHuxauXCG
akG490kWvXI4dRlrIqC4/xAQ4XsVQwMze1OVNkTs8LRWEyTOayJy2/YYcRfXioAvOY6XvrRmcfm5
7HZ6ehrtt4K1zPy7c5vMAF9/iOR8fr797dsXP3pxena6/wj6vC3QFmgLtAXaArdvb9+/f//FF19U
BFOt4WYld+9z31IV61RF//f///9uM/6jW+Df/fv/FBxoBfgf3bbdYFvgyVlADARweHcZOYxqvxyR
MPRr311F80IlyjOsq6IdYjtFrWQ8hk+8NAobQ7/WDL1/EnzluFpUwtOXL48XqxefLV68PLVuTCyr
okMTm6p7rXC6TWES9Kj+/iiFDyUQV+TJMBtaHTIvFH320zPcjS7+6uLsy/PTL1+fXr7Kw7v48uz0
8gKQe/3qHMi5+s3N9S20c3L189cVMXt0dHN7A7XS42q5un13d/5XrxfHC6iVkVye1V2Xv77h9uuf
X2hpwMfV7ZvTr85X4OID2aGY/jajXf+R1F7ywRYZqt+Ll/R7e3P5m5sXqxf8itqZFm7u3l6+ea1h
f/FKxOvj9Prs1fUlt1/+/IL6b3775vI3V5xc/uxs+3GVOte/e3t6c4bka5HTfUVPVss8KaOmoVe7
E1n3xtprrVNsnHEaSy9WFpblwZxtkxQbLGyWz7Oeo/V8si477hfjKCezt4OWr/sz4TGt8AQlreth
oTzzNOmO5yw/ZzJC2y9aGjiOA9J4rWybjTVmhXZrocSBxMQDO6Ba2bZL0Q2jauQm5yXVyC6OYnz5
41evX8C9kPA6BtlpvAn0zb7HIy80FaYarPPEh6vligpOYZrqoy3QFmgLtAXaAjsLjJdDdN2d9qu3
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
tAXaAm2BtkBe634l7um9WktNrO+I8q0cE/slfhNWnTbkIS3QAHxI63bbbYGnYQFhmANNo+VadyNi
03IiSYafS0ODT9byPbYXq+hIOwZbV5QHL8SlCFhHCFttI1K3VEd0wpc/eblaLE6Wqy9+fOIWxHvR
hB0RyiftaD/YqKNL+SkrrJQ6ihWFlxYQmsRCjqvbm/O/Ouc9dH76Kn7OPrb5Rwpsqv3m6vXNJdXO
Ti+Y4OXZ65c/enH9m5vXb645ef3qnHrcI/KM6Jjz4QXtgmrq+u315W+ul5+tLl6dwVTnr85Xny0v
395c317lxgWI/tX56Zenr756ffnmcrVcvf7ZxelXZ7nKpbPrc04uz841ht9ev/71jcbwszPTnewm
a/iNi7Rb5KaMU5KkAVRHLGuOjpg1uVm29Xylsm6K8aSSQsCsaMRTnYE5ybPapLbijWN5aafyuLa+
erzGAuWBrH2ANWhA2nG/OlxHt1ujpjW14KSXfEaDNarqmW1Y9TDcUo7ztj+tG6sd2hDDW1VWOHFp
uYqOjs9z6ca5V9IxwdWJAeYJvry4fCn7z+fiNjOq2CQauJ6a9N7khU6O6FFnnqudmeQz0+yjLdAW
aAu0BdoCtkB5eA0FOO/l0nj9avtU750182Jq96IDf5EagA9s4G6+LfAELCDwkLdtYmuPjp5DO/qP
v0gFZZh/5Oy6PX4uFdFLoHDFQm6v2ieJTL+E2VJTPsxkgY6PtHNZKZvUypHDiuAdntXolo7tjGe1
NUMSOzlrNLSD0ruRBpm0iuiOAqvNFo/rwrEP33zYWq20zlyMKpEzxyh5/+GbzR+lL0b0W32+4vzq
/PLNL684Ofl8RaF9pJlv3YpXsLyy3RHF1fTR0dd/9/6bv1tTuFrKGPAt5x/+8P79BxX62J7++Iu3
v3qLLo38y+8Q+xyJVWVF0ubGq7MrBGSP4cTxwPLNRsG2NaBTc6CUT1lBWcE8JKfjAj71TPQUuF/T
d+d+Isyfp8a9MoR3mUrEr8lZM12kPJ7JLpf7t7oYvtze9Sq6KKMFGvU1UDW3IKylvlFZuxCjJC+R
6DVC5+uqvir22NUYZmWE9jg1NqnZPDWpyh48o4o+PLzuBc+0mXszPUcpe1TL5ebNej4ZjadWZKKT
u7Yyb+mJ63w/EngvTnjGP1e7/U9boC3QFmgLtAX2LTDje3FNc5KLOBlF3dVi8zhXCXX2SioeuO15
SAs0AB/Sut12W+BpWADCWcJFipwFQY+W9+iOR4t7Z5P6qFTAEIg8UNnsR/okOX7hH5jn6PheG+pm
XyJFhKIb3wtq2G3IWq48qzn/+r99vdl8YN/eb/72VswpxRLSQ89MDDDkrF18xHiqv/jmm69phTBg
uO78p6ecv6MFZyfm8H7Ci5ybzXwyuHfCkjTPeZWUyH/Q7de/uT67fH16dXZ6ea67lG1YY/hm/YFf
z358sn22efHnLzn/sP4A26fxlz/64osfqccNU0ep3qw5B19PfvSiej9aXvz0DOh9/ebq9VvBLcfK
maI4UTCwJM1tjeG3N6++On91fYYynMjnjXIdo6hLgZ9e6OwapR6VvljR18kO5fTO3uVYOMfSgxcR
vNjMWLWlsBzUeZpbUk05bpZzASrVmKy09zw7nUeMZWDex1jcqNDikaM7PsmlIcuB2QnAIuFaWWV4
sgb98sXwPr2aq3f0teTrvkZGaF98cFCxvkVwuO5VkXAWe8qnIMq2vkUaGMr8B624S77WeN/87Rui
wW1a/ar2pq47hN/Se50FrSo4L/TuPJqwN2x0Q9VUGuyjLdAWaAu0BdoCssBwEUrO55TUq8d7Dezq
JAt09kCySjx3DG5LHs4CDcCHs2233BZ4KhZwfOlCWAA1Icw+X4ltjhUPvNC+rEtYZK3kveKTBZvx
spescwIfPQeQQGPBlXb6peZzucVa37O+qhaOAb+3v3t799u7b/4oErN3LrSziia8UJas7KyjiFwy
S9+8u73723eA6O1Xty9OXrz9m9t3f/NuqnbaqmfmAc5rSel8jViCwIE01gZzgI5Xv7l5//v3Fz9/
fXt98+6KnZPeCvl0UTT45vbN1x/ev/rZxbsv7y5+dkbN67sbvHlz+9X568tfXK//uLm+e8s4b+5u
dX5+df2L19Upscpf37FP0s3F1c35dQrXHx/u3r9jjne/uiP2WO3c3tDLxc8uyA59d3n77su3ivgN
9WlnKW81bBJW3mnteMxUCZkW/dIvuAvfesdmRcZyr3RZB9lKKnciaO17xO2O7E2K4433ItZqBb+g
vavCgnNl9qaR6LRKW61drPTUuFV2YyR0x3dAmryTVfFZeaEtKcOlqmNxmC+J26Sp7GO864tinq9a
0DdIj4kb7bGsEeWpqR17d8sjwLPTYKlvL4QcSpZ2fPHy+IJJaV457D1eT7z+IvkuHViy8J4mHK24
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
m5JKoLwNUs5oIxA5c2sVeEIO0E0nWokwXSn+oJAAJVbhcAeUBDP4WIQI02o91qoFiReMcOQvCwNJ
4VHMceTlVpqcsiO2mnIi86OvamMnQHvDhdCiXxsvU5VLJN5F32BNYrD4BRAw+nyE3wwtxAoDx/RK
n3/Ga6zISisaOluTHS5WvnSaQrebwNCbdgverJF6L+CyV+5JRQrhUUvuOhRYeGS2GgsQeK51l4iH
Be8uThwdIuC/eI+P9VnoRVqt8YsA3fLC6hxK+8JSw8r9EO2X5WAQ4JVlX1IlOe6IofyknZVxlJJJ
lWqv/RqLR7s2QNxSNcaZWSnpoANBQtwe0GDag0biVmketTiVvPiVKGH0FfBLXqOVjdnoeszSp3mQ
jACWYkZ8VZxGWepFXxxD7IOud4Oc8+/QlRdfdhV99ti1Ow8cVLfR5vfGo5qJ/dJLm+R1m/yuzdJ2
9E1v4pR9vJWTvvkj7x9FKJgcch6GKcM0Ppm68i9//KXLzKW/vman7bsfuM/G9O5f2nfH6RriyWLD
Re+q16bBGFlLRQyHfJsjbS9PZlUKjyL2YxKvjXvkqtsWfTi3S3GfPkWVHNRNFJcnist46iAHOWnO
7iqKzYrZIOLRrn51Vc3ML4b0XParszbr2Y2iTrXMNnl9MPpe+L8zj/p+9Ncpd+/dV6ZgT7x1l2GX
jfzvp38b0XPK37sf8+vkpS98fepAmgc195VR/y/56xv27j7vtfP3PnPHRz/68dZM8UoXvn7enmft
+tykUTuSZ/7ZbRsdc3HykCe/vP6wvuK8fHxf6UtDa87d5qMbtt35ouja8ZPP2Y4qcv6zP/pL/ZV/
Hb7R/LGnHfC9XR+Zd8bW0is6/8WfHvSDXf8z/4wBicSU23r+4Nd/fGDhGQMombkvXLrtiS8edf8z
dw3vRhdOvH3Ya3u98fNB9ZPv2Gf/966efNvQHkmaE40RRpipJit6yCwvmehFi6LQAXn3Mr2GmVfK
qEM/bCKqQyhYX3QkHdJiccTOScCS4/6lSVrbWd6vRBfzs/CWVz7CVCXBg58lkkaZEIPo9fCaoxXV
1EU0g7qmvqqKPrWr+btu9WpaV6yuqrq+uqqummejybossoqGBmE8bzT2ZSEPNv5KRqxRgbD8Rq04
i0z4uaR0lXiOMlxR/DvbzEuAWDoeoE4ivAQX8XDeCXr37QW8Mmme+4dkpLfMFuCZzzoiF1MQEIiS
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
q76asWrylBUTJi0f/9Gytz9dNmHGikkzV7KyoAFTGYPqsSitzh23N9nY6OMM4Ymd6jyn8lUhj6Km
NVfHuGtyyycz4ElTnyOHVBgvubB3PXET5TYt9pXlaW6dodyJp98FB5ke5uYXF35vwyK7Rlc06sW/
eZ+0VsDPU7MuJpmJbUa4snDI3nvvPaK4tPpA1jnAdHzmzJl77LFHv379Pv5Yg+qFJb5W4Mq1flvh
EBWs+fM03sIAia+iDlzqScNLhEqLiedGxTRoST4ywIlP02C3Yp2rUWDyLQl4ZgNPyxQ63Ebxavg2
GqbAbDfiMpqtiqvpVT1k/nr06IHVsLKG6UhX44WCiG3SRrQHMeScWwNrYmXc13RLNvGB+yYMGSnD
hPNa5AZMcCPAiy/daKONyFUAaOgaGDBgAJE6rBZGK4zQBCsKHtDEYFr7iogx/YThg79BF+SMpeMh
Mh9WOxIyS+flOWVcuYvu5gGkMd5L3nruiam/dA3Yvt+1ndnNDaxA+wkEcrcaQCCXIKUJDIZNO6zo
zXP+QPs8gOSv91bocTVJUDfAm/bab7+tu81p3yHabuuyWy/o9YdTenfvVERrtU+cNueoX71+82ud
Jy7b/Nzr31uwcNnSL6Ym3316wN4DOx39x4677Hxsp082r3utJFFz6EEZa1U+Nyong9WptnfJYObT
k/EEz/61L8cDm8GWdRv3CWhGkkak8XZXsa3/kLjppoI7bDPrFmOws202S9mda8qjLduSSO7SrV2Z
y0fYyFb9YfDv6GW3CVqgviZJiqouql1Wu+zlzd859Z8/kXzW0/K9ETHeEvrUyyeZWEGzyBPn9T6b
NHhDhHD6TafbhDtOzYiuHFYc0K/urYh1kxeOp0GjwoGbZwloUq9kcliwkkmy2bRRHy3W6Mc3spQW
+4VSJpOG1wI3XH08V5eG03jLSfoLVqTdT3p89pj7xoD/iqme88EHugAWLrWBYbzuRY5AL57oFhFh
099wNlv0Chr9XF5eUl5WUl7OXSRL6+Z9Wzf7k6q331jx2Nsrnv6y5uOlyblRcXW78pKuHdp379ix
awcOFGfZhP+meXzsCuLFIGlBGV50zdLIcyp/yWXBmwtzySeN5Rxl2oi4wbgLj3IOKVGCSY/EBNV/
Cg3990SYx3RjmZs04fcTT8+kOMhXeNGfRtzbolUdJ5724t+mPLUlwM+Vj0wAT6eJv/KuqjynGlkq
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
Zw8kq8Rzx+BG8nAINAE+HLZtuRF4Kgg4v3QhWgBrQpg9WYnbHCsfeKF9WZdwkbWK94qfLNiMl71k
XRP46ASCBDUWudJOv/Q8UVis9T3rq7JwDPF7+7u3d7+9++aPYmKOzoXtrKIJL1QlKzvrKCOXytKv
393e/e07iOjtV7fPT5+//Zvbd3/zbqp22qpn1gHOY0nlfE2xRAIHpbE2mAPqeP2b1+9///7y569u
b16/u2bnpLeifPpQbPDN7ZuvP7x/+bPLd1/eXf7snJ43d6+J5s3l1xevrn5xs/7j5ubuLX6+vrvV
+cX1zS9e1aDkKn99xz5Jry+vX1/cpHH98eHu/TvmePerO3KPZef2NaNc/uyS6tB3V7fvvnyrjN+w
Pu0s5a2GzYRVd1o7HjNVUqbFfhkXugu/9Y7NyozlWumyTrKVVO5C0Nr3iMud2ZsSxxvvRazVCt6g
vavDgnNV9sZIdFqVrdYuVrprXCrc8ITh+A5Ik3exKl6rLrQlZXip+lgc5ktim5jKPsa7sWjm/sqC
vkG6TVzoiGV5lLsmO47uVkSAZydn6e8ohBwqlnZ8+eL4kklpXjkcPV53vP4i+S4dWLLwniYcrbiP
RqARaAQagUbguxEY+wAn41cPoflnxmhx/YlHmrA48MgQbmAPisCfbR0r+B//89t/c/UvDzpSG28E
vgcE/u3Nf/gX/+zi2wP9l1//13/9r/759+DA0xzin/yf/xQGwr/j4hiuS6w9bLR70HbxsFBVJenD
MKPNFnZDdStpvN60x9WYYG7aYuh+u4Qzg6BUTcoybZB5iWXd3G+OTxRZjeXsHmylFxa0XD7boPd6
jyXVVaam8ZbKT9qBSdojEbDOWVX0L31gzkRBSxsslpjMYYuN3k8ILmd2bV4kzVO1uzyWUl5Vc8uy
qZVJYndh4BkFHv6BCOpEI0trhXMmPfhhe3dzh7WX1+fmqBIlRci8wxMHIzrXFAZK7WuVdJIRf4fs
sAl2eZjocUm10FaN/nGpkG9XAvMuuMxdJsVgvZDsuGiNBmJb1h8UdYw9WLFyhqW36r5M+yHzlmix
44VoRsSmo82l7k5PxDOFg/qOc99HeUtPBH8tdsgfX1Uf1f83tGZR10YQzg5MM4NXXwsxbVYAwNbV
pJXpnfxwYWXdWGi4Wri+D1KAV6oyrRHT0wiLCYta70WjZ/Sjm9NXjHt2dhYP66iKYn+yJSv06cz5
7W9vVz9anf/ifFzfvxuBRqARaAQaASFw++vbr99/zQ4Upes6V6jqSkTp9faQ9al3THzQQ3nX8hd/
8RcN5T86Av/u3/+n0IFWgP/RsW2DjcCTQ0DaHcTr2fFKwbSLFRvVwIEVwLqC/ZosiMM8UBo6ebyK
eeafes4VOksH8R8qCVt+xILoHxRIex3lWgmG2h9Ylq0VW/UVRXT8s0KaxSRXR2K/cFHtcpS4X1mo
bGG1wDmV91ufOjbbjyVxb/XHmhiOKmYpDlZcaKV4aT4lM5lPYY6E4G5WirlNfWMOBWBrByaiwM3V
i32N6tCK7zU3Iz45cdorF6NS+LGom32mw7OHlWO/GVdLxVoGFulWFjTMWexXexdt5dWpGjULcU7v
eLRQ3HLtG0QPjWUlFrRtX1fxwrwqW9hZsmbFauc17E73TkRP/FlDmatL2LcF5rtltaJUU8Kqde54
afljLdpMWqOPyliIw9iHudIkii6lmncaXcgqe1xL4GVfKjUmxH6t8+OhPBcEwhNCa4Q903Bjez4Z
r+6+WS42WSawN44wuPrJ5dVPXnncNDqAOesdVSvbrbMW9Kj5PPvkqrrQPftoBBqBRqARaAS+jUCt
2/6JKtBRevf13uT9PsoNblgPiUAT4EOi27YbgaeBwFaMkalu1+IS6434yOrh3mWx2CMH9vJAjaXl
w7F3zb2HwcBSFlTD4pxLICquWoQZKZxKHJVeul3cL9wItZPSS+6uyLBig0Vdlg+k8vIeRofgLF2U
TWVhVlhw3SxFNVs/lIapQF+fmzMr2dWcBzJG7Wjlc27E1vAEVTnVttbLsYvPmlLKZtFrsWLCudcE
Xa8/oqkqf/Xo4wftzISf9gS9WlzugVmvYZIvry/Prl8efTyF+8EbaVeU8tFmzeQdxAuLW3tvIRHj
++36+FTkDB8evJpg9XLNpWrhgyUh5Y55Xq+Vv2oOpl2Rla+7YQcgM0bUUTRq7XJsLVpBxerJ/kMg
nrmwiCANWfmxOrQNknOQ5BvpybGsPaV0R/CIzu6X1QFp+1Z3SfpNrW/lxNKtkNd9VAEsxV3Db3Ng
V0RXBBQdXtwVRZfh882pTtnN6IF1Ctiv2rIe4fgCGS0tV2yZnlqDEDNXF+XzOjoa5hxWjE3ggjSL
flu3P6IQ98MbZ537qBxgjyICn4j3vbrQajcx18rCyPuNV2ofEfLlfP9qBBqBRqARaASMQEUM7VV7
1pLrKLqxU4O9FUIpwzxYkjncVaAP/y1qAnx4jHuERuCHjoAKX2mOEDllYMJejo/I+RX1gpfC35zc
KfXSOaKQXkiFOJXqQovJrEh/1eWOQ3YOqotGOBgWHkssNCa4nCBnrhIrc5IxJG1ztCGX1dG2yqVR
NLWYqnYDJoYZHZhLNmJTMJyhLSuSVtRXAduK1sZs8o0lORKbDW+MD5BaRfNKkZbz2qlYI6t28cgd
9dZNUpjh8547mqiefAv2tiU614QK45Sbiu7qLYWyra66YWfFbDQ71YEUJ1QZZwcqGyV/dEyNK+91
fLRWcq86cDVOhsmLjYObcBU/V8SyOJ81Zwbj1LWpFs7steCuklpY0LpAqmcHTMny+hw74o2QdFhr
dGPWBThVxS8RWK0paD8k3JPwCz7yEJfsM+2JFddw5reSu8f/CepEqxLRzyub145pdUCZ5FLjI9Um
XtrtrCBUPLOR9O6+tlp7O3lcs2K36BPskJ2eP0WuKYLFxlHCYzgTjXeWJxGe1oR97awLHc8TWa2T
oRtHKx7z6t+NQCPQCDQCjcBAYNZ8HhWeK4Nmr+bzIwV4L/u32hvLQyLQBPiQ6LbtRuCJICBhEQFU
6iJsantvqc6ZvZLbtG8Nii60g4Bn5+KaJzvlFQ4FY7FqR1Fi9OIH0+XstZO803vxtO3HtSoqmV1h
UwImJC2VmXi5ZxgGFSf0VcQGYxPWZyVTmcOKPfanWGNEXc6n4oqOWMYr1esSe5fAKZIp9g4XYkxr
rWbX/BId9OygwWKJkoXJalZ8L5NJrekoq7CvCsdVnSfntnrumGWipqCJuFYFZq/4il5iVtqslV56
pGY1weEmbVB02LvOXcsqMcDMlApYxoHzqofs7GKbFXdV7DeAMmurvuKNcGznFe/tnYsR2C35zGaz
xQPNVFF65aNwkw+m5tbVhQw3t7Ro+5h2Bjdb9sqC2sVO9bHurK3rvD4dBaVL79W1GkG0v+KZLe+q
XfaBJd8QKcxi19K9Jf/WuL5rVSkt3Nv3igv+8vT4L7UaUuOb6z7Sfr33b+b+qD2SbwqZTO13FPkc
0+nfjUAj0Ag0Ao2AERghQqnwXI+VqLuz5rOenkPv9QPlkTLcQB4SgSbAh0S3bTcCTwMBop0hI5La
YKGqLex/66nPdE+urKJ5xdnoQ4tYCK/iWYuHDexlAUd2VWH2BT6mrtWxtrqBK6MM8yhQ7C494W/H
7IErhVOZnx9XqX0lwqZxN2i20nIh2Mo0JjpanFChv2Z3VE4Sd7VeCm90jDRsVlHQypt1/LB8o8+J
qhbTcyVau1G8NPY1lupVhLFDjxCHI046X1c0G59x2au2MEzxzJWZMg7Ae/FQNNuVtJxfKzvKXpa6
KxqoaG0ho8UCYqSx4Npd9NSr9V6TTLUzzErSt3VOxzyLFTsTWC5ZZ14QHx4LjOB441NmxxqEv48x
JSZsn9UiakcStrekkpyuGmA06sNRd2rlewr95R56Z10hKQ+VakslsAQWa0THJDvSO3fc1FEfev2b
dhY6Eg6dnZzVkuB281v9qbBUiS8HVyc2vnKGYfKSyvUt0mIHv6MVy9RYMTHjjVobLTc2KxJ7n34P
Lfdbub6l8X7S7kLQ0oHtZ2u//i710Qg0Ao1AI/BdCIz0H4eJucNePnAeIsn73bW7zmL+3qhnTUN7
MASaAB8M2jbcCDwZBBYnUvmcB+vCwuTHoiLCX06WMMOjE0WZKggIlgNduU/tqLV4qbJhxVigZKp6
BSOCRmnbHuJ1saD41Qfyc8WlOcekIpYJuKUPBbFUhFmRyVJNiXZGPEbRhThtvIctyqcyVLU3Evqn
F1mfLTdmUOT9yo7yZmGDZCArbhY18oiK01KqNwRwp6qz42CZhNKSmcqS/1yJqiKxlTmM/WiGXLuC
1WuH249QcBqhkWKJYrDabUhsGT5svq362CKd7JyMZo7nWPASgJgtyateMraSTPj3OhzVudNcgAQu
X6xsMxYzlVfWhDV9CdFD8QYYzSsRxdphCJU78d5mrSjGSe71vQs51+2Qw7Ymri7XfH/FJwntFoPV
XY6S7GB13QggBTHFqEenXUqR1uqASa+WAHKibag0pqZmDdn8VriFqWp2/GcaXavjtZRuhdx2PLo3
jrYPJtTVbjVYHFj++1UrBYyrIlgvLp2M7PEtYg8d2wLv0L2l/XJk9WS0c6Ify+rWwH3SRyPQCDQC
jUAj8G0ExmOiNN6ou44vU4v/F723WvYV4CjDfRwSgSbAh0S3bTcCTwMBc0VomTJF0Q8lBIuR6gXm
Acczl0CPVdzvQhov5FMswlvRWjkUn0OQTOYqiazwKMRdfSJaJS2Qc/iM1VoxLoTfWk/dkDPqHYPZ
VTgKITSb5wpR2eZ+xDZrTyO0xIUqV8GOVIlKTLIyYPEc1mTV2dHCx8ic0Exn5KpqV1RQ769j3dWu
EIktzpw6T1nBZY4buLd8VsStdGMLxVZ6FecssipCKz6mvXbpyTAEUSMzuybW0mRbwdhi8kJPjHvj
SG+uETWUh2AIVKrzbAWVuGsh4zxeoWImqSEX6h8VVO+wiHKuatWOYXZctIRWORMR2EpyxpKFfHvt
GBq+TYuCDgRWiXa2Fqo1C5vV1ISPsPL0dYRPWpW1DmyR2abSXhqvkpDDij0Kcxdcvu+6oVrFqP65
aii9MiX/PTajqJszt/nDQtZmvvFyuXz4NTZrZnLiW/Wfs1QvsXfqxl621zQTUT91YHcLSH00Ao1A
I9AINAI7BEag0NR49/VenUfv9cOr+oyW6MAN5kERaAJ8UHjbeCPwNBBAvxWNpdST1jJhm+Y2RPOK
FatGlHRdIorFABFypQdKOjQBsqamLNzUfBabpRIVXJpcYmXMetsh0UpF24rzoPuJjSBaelehzYpr
MWFJUNSx8o3FvswPYWKqIOX9adE8rSeL6UUTFqOG8Sp22s4rV9k8EBatmGGYMMSeSszisbApUXrr
kKJncClESNXoUlaPWKhydJ0+mhRcXpkCjskTAHHNZHYzxr6qUquusoKUlfisDqKmXiywtum9l7Tn
k3FyBrJ1R8ceR9tUiHV5Szy5GJrt61NsZkauApU1CKujsqCRjQ8+mH86H1hB0LrWXFfztdxpBXhP
g+UecaOlnMsfrUSYGUb4Dac1LF4H0Ewtz7KoYR1elD5MmPNcaKk2uGmgyXJtwRw74dVGwKpy+RM0
9IktBPAiwAE//D/ZvDcqgnXha4W8jvlp3s76zwb6O+tCzz7566R14EKyfzUCjUAj0AjsIzBDilI9
RDtciPFG7w37zQNl1xI1eCrDjechEWgCfEh023Yj8DQQgL6iLq6cUIrcenzCRkhEJjurVpyWcwOB
pKmE3gVnKzJXFXK7XR1DjVyN6UT0Rjm9USnvl0cn9IBBbc00kIGzo5J0QlXMUtysPhHHRt9U8LNU
R7FkZflCcqT0OjdY9aus4kqojCKq3X3FJIlbJq74gzRJabwO3NXS7AazkEVVz4LiklassGd2ElIJ
aPjzSgo0jmNKodS84ZqVLdNGJLOrXvOWkGa6sT/Tgg+sD8NaV2ix2ihZoq606KMTPfNW2vo4MiN+
MuJadavgxqoUbe56tFydmOUmDNvc3rsfCw3B5MtdrdocWK+OGBcmfLo6lk12YwZDSCM2V6abeIIG
rSJTrFOIjYtnms9LI4Wyat3BrQyykj/WjZHTdWe1PRV0OmIovWDOPrSf8CmcXxZEqgnzNhlODq8C
oVU8TKM46D3Sa6FaezJxBUqsvl2eiy+3Vx7XlySy2hbMn8tUMrE9Ry0opCKai2DhjCxoans1n9Oi
PtaES++NxutRPtGKB9Ov6/pXI9AINAKNQCOwQ2Dm/SrOy5m9e3pvabx7WcFq4cmznxvcaB4SgSbA
h0S3bTcCTwMB8YkH9rOFd0F6F2S0QrpgXZZ4VQpagq+oFBQIIqQ1zjWVq8RP2IbXyb2Ov3XcKe2m
yo5fVR/tF8z5dnHCzkBmJNrchzGpfSXe6Xhp7dAjdqdXKbpk+VSzHLwAAP/0SURBVJp8JpFUXJfM
ZMUqOx8YNrjRzj20Q8i5SkSMcdEPiTd2liyscq0MZGukztTVHLjKdGuxvqcPbkhvjJLNy7p2A4JZ
lU22JlLyMPHJ8sT9VSla2rUzbL1AQLCumfw6eqzIrZlbilI5kjyR29pA2AqttjtStq0UTm0N5U+V
gy2WC/JQQYFsqkkJbmYUBpjsayRrya3OgmZg+eA7mD6JNGYIqd9qlx0hLFvO0RXClm15qMPAo98q
zLh6Ckz5diwMwVN7AkfLjepb4ex8KQjbNmVNFnHGqj2ck3vMEoRSi533i31f7p6+sIi2p1nCbxD2
DXHPWlCQt+ax+kIOBm6Zt/K3cwOHYuw1jhDyQrKqqWWO1ooTj91HI9AINAKNQCPwbQS+pe5KAR4Z
vznXnzP7OcBTJebB0znAB/5SNQE+MMBtvhF4AgjAPx5gO5LUkExJa6VBQqsSaENjVBhKhQ3pQm0r
eDIVq7YpBUFtJ/Efib8mXkn4pc4zG/xqd6LswatoZG1NJK14+2wFx5IkyH8nRFlDYgkugkfBuLZb
RGZRcfE3YrDxansCCYST22YpwOirzroJc9beP8qPZSzJiGTVEngdLbeq/sKaEIfhpd65R6m7+MlA
Yr/K14WIqicWuJyP6S/p2DWxwypxKVsriYkti4ZZBZZIa5SARW+VR50856oOrV2aBIo+FdVU1WgJ
y5XfG37rqKrsPGwtVi7JGrnKyv6V8K6IdLNQidJC2wjAroWbL5IFEbvM2oKv79qQZ2tEXW5l3mzT
RJGUb69imEXHQvTwEYdsx8o3jVQIcLnHetxfqySaLusI2UnY1jT94ZvdHTnGGWt8+h3nGoUKWFdf
XNpOUIo3Fntn3m/MajWE1YG9ms9DK1ZZ8PS3PzrvoxFoBBqBRqAReIzATu/1I6NqO0fjRQ3WH0LW
hGfN5z3ttx40DekhEWgCfEh023Yj8DQQIF1W4b6K+kUyhRmStSvJdGEqsVWRZrJGVc8Zrgu3RP9k
JyExSSdwEuesClU6F31SFi4KH7sleZMhbdUj3RUeCTUWqzx6hjarB4fycpM6ywu8UbqgtFOx6GQg
i36rBft3X715d/OOrFfsK//WObQa1NqsWJYrY5nF8WBaO3TZuwF5t14I2SY77mrXXvizbHpcWLAu
0TmFtZT0K40aKZuwZ4X+qsEqt3Ye0uzlsQo7K0xaNF650xpLJ6ayiu0WjcxVUGzeriykmugqG1aq
r5cbnHEtNRg05BVLDdK0zb3rWmKbtRQND8dzacXKHLagKl7tLOjtmAVx11KnNSOrpp6Ur9poXlZf
g0Yx0upAT/rImnVmc+dKDPZHyWSWTd1KQaAx6KiFEhFv71llEGwnsy56qVtQ56ntrEHdIm2Zwzy8
kpC/3TP+S9FdfrZ8ePthTzq2CDz3/q2pyTvP0TqwZ5G7JvAVgz904KE124c+GoFGoBFoBBqBQiD8
Nk+TPEfUwgMkOcDOBy4deF8ZnppwHjp9HAyBJsAHg7YNNwJPBgEpvTAc1U02703sKJzwI7qwpMWl
omG1H5LkVil+qtikvFwkU/ihdxLaSpcjYFi7Fq0Udew9kz4usCC10NvqmLbxCnVcHDtnGGokYVYb
LBEqrdxa9jTiGfPF85fXr67vbt7eXb9+ffla/DyH6mCpbJUKU1ldXDkSO1WptBarHFrGkZ9Sqq1a
K3VZpJSayYpM9jSP33319t1Xt4mghqLnLSmyjnBeKY1YDzzUV6jXQp4nw0esT8Phi+VHUWiMAwi7
9cLtaVBc8dHKqwO0bthNSjtLSRoXz3dklHijGHgShq0JE27tPFg0cAEiesinjIAwbgxV3VpEFA8l
sFbybbFHNG2Ted25BypyKwzbebOi8bK8grlKh1f1LIxIkTb4Qyb1CoJzlZWN7IJhsqUMXt01uWTt
lBN/rrsmk+7GGsfW0dRYAC5TXC0p4DkHLUJglyAd55Plmw4RdfV3Rswya5sSW66eN1+/riJY0ain
/Pun9gGmQ4o/T314vy50a78BsY9GoBFoBBqBbyOwVwV6bq1X1Z5HPvCf3Ae4q0Af/hvVBPjwGPcI
jcAPHgHYkBcr4WOSTM3UYB7IgGuHHDsDdsPetkrfjXaXHWtVnxn10nWtEurs7Mq1lkbRP0WT12Iy
JfYpbhlGklxTrDk4FjEZSuYc4M3DCWNtX37x4ur8crPdXn51+eqvrj9sXOMqnMfb1Ypai9vAY7Gv
2ldjT2DFKsOfzDPXTGFj7ZHyUPxydq6nk9LVPsyluVxOpgHG5bRk8UP+c11iribOmato4UoL5uGB
Yn0SfuXhwwfvwGROqNF1ofOBORdjN8Hz2oBYGUimJ69oldaKja3POBdjlBYdWVXR2vZKuygPV2NT
z1o4ePzRxajf4O94Zu+xpLl7wrKPQbi07SmmeiTrim3Sx+Pq0PRNek22nbSrq/SpnPGnbotLxS3N
aZMPjP3IyLn53omq+sfP6LpzrPQUW7b9uQ9wpObc8YvV8V+yFuMZic/vcoAlBRvPfY3XEQGjfU8r
TnuM9NEINAKNQCPQCHyCwHyUTL1XLTMHeFaBHpqwF7WtD6sGpLXiPg6JQBPgQ6LbthuBp4EAKqe5
B9v8iFqYbS6lJEqW3C4VA1w8RRRYn6EwuoUqSo7+pW6WOKcin2k9XpnDeI8flNCH5fLo4uevzl++
XH5OkS2uVSdybrXVsFKIzXDEGxdH93p9+cVLOry9ewtxXd8/vPnd28VOAX5YnCyvLq7urt/cXt9e
XVwvPkMTfri7uZOEe3P79vr29S+vX3yOGHt8K1H3ndvf3n55e/aTM+8bZMXZ+/36MNcaoiKt9L/9
6u7dNdfe3fzyerXSlk5imQJnlThtxx4zX60JaC6lANfmxrL67FQ9KRumklcCjQWCqpYsrVWPSfJU
NS9l8IYJC0MxRu2onDsipdTFt3T4vtA42ODHxZJ3InIrBWNr32M+ZwZhnqV87nJ05VXMSnxOxSxP
HDy2rFWoKtioHW2KKwvbcF1XbNb9kqjr+1UeYgz2O74hUnSFjxGwt8k0HntBjaTfeGLkdWCNITJL
EEijLYQVF3NOy5gXn3yi/aoGm3OvavSsI4z6z+mfPsFZpvM97qMRaAQagUagEdhDIApwMn736j//
qRa1u78TnRIv1scBEWgCfEBw23Qj8EQQkPDr8sgUSSZ+WIIqO/5IbkXRXWyQCZUQC82FsMGUqP27
EVOVzChuA22GiR1vN6uPcFE6LyinrEhdJdAcrx8WZy9eLhbHJHCevThXNal7caTNAwqnGK+KYLmm
NOwUXkos9NLFpNb324d7oqnXsEslc/qA61794tXz0+fXv7l59ebmxY+eX//8Av3z7MuLyy/Pz65e
0ni6XF2eX4ThcMCIL//qEpJ/+dPzMHOVWVYmsA+G0zTrWaVkWh9Xb19f/+Zq9dnq1c8uJaKqgpel
zvBPxYTLwlIVnqOc4yFur4HN/O/DyI/dHrEjlFzncl3lvYuFm9YCxOiI3BY3WyraGR6oHYDtmDiq
VU1pqg6JFrN1nW18wM52IyRpFObes9e+hUCK41mYza65kawdYDySYBkFepuJk0UMh14VK7a7ulaW
6IBZMfaKRi79NjilkbnbeenhXMNbzWvovbxdltYtnOMPjWbsOucSM1Jx4GjIkYj9x0Q2RjraXv3k
kjpYieueh4TfUQv60blBqNTfsTCfq2p/4MT5e4Z9NAKNQCPQCDQC+whIxY3ea/b7Sc3nXYujjvY/
9UOtq0Af/NvUBPjgEPcAjcAPHgEnecJC4SSwVkiXonQheeLAIiTaVQjSyH5IaJ6SASG+J7UHDyQY
2qq82ePV+pidiuDCYj5k8y7ErTAjHTjVmBmCaGFplUiO4rpSLGG/5A8ztmObJQtv/mhueXJ8dLJa
YwrNePBSnFl9vuLTm4vrN7+85uR0dQotP3vxxfWvXr+7uUsjFDopuBzvf//NWkRRhrCmE5X4MinV
sWTXY6uaec4VI/rm79+9/3tdhQCcNd3jZ2sVwx51pJ2kqhrUpvmenPynZzYHEm9UZi8nJzIrNLI3
j/JyTS8r/pn8Z/FhNvA10+Pc9A8kiaSSrgtDVgC249TJtl3Bt8112WmZWQg5p3Art9lUU9TRUeJy
ydWwOdG1VmLldi6RHKolDFYiYObYh1vqsT47VAS0phfP+TLQM4zUBHUGQkvO1XD+8RD1KmhKxdUX
yh5WvnHs0BPABkMOkVZSuoXfmmmQOVoulw+/xofcuJJzdZIa41mtd5Q9awT5i6TKgD/WinXJWPIo
W/2rEWgEGoFGoBEYCOjvAT2J9LBIru+uZdZ/dp/UfN7/tOXf7+F71AT4ewC5h2gEfuAIeO8f0R72
v4WXWoWDqziplH/3xfDQEs0P4XjKb9E5/EnymzsiC6uGEzyWBlMeWC7VqpIB+/U379ebNbT29v0d
FDG1iCkurV9DA4S8SW2WSrm4ff+OTy5fIttu2Sfp4mfW/XygD6//wEBH17+5Ru9F+D27OiOP9/Ls
HNJ7+frq1Zur9NQORvMoVlufqArXx8036w+8P3v+HKL1xY+/4PzD+sPcu+/Fj7744kenNG6g5/YT
iikktBkyi8EiaQzgBN2lc1zVVzyttGWRamX2GiXVu6qcWLFEcqoH+8UywrtmXVnBugvC2RHCZoPe
FlikV8owN4J2M1V4o+alaRKUbvWVzpFqTYnN8VxJ28qwZmEKGu4dTHQV98iex6tqt4Xow/rUrFXn
5qJOPB4c2Fdl3F2m8RhL10SFBhlp2qOP+XP1z9zT0xS6NN49lB4ebt6/qSJYI0Y6kq/GTvavfZg6
cP5eSTno9Jlasd199J3w3PpoBBqBRqARaATy3NpTgPdqPtffQm4ppVdndZ7q0J0A/D18h5oAfw8g
9xCNwA8cAcgVscGKvGXvImelkr+qN6x9PqyQMRF+HRrNlkhidJJw6Q3vPUa5hUhQRRkCs1qJJCpq
l21ri7lJtzxe/2Hz9ndvv759R10rBf0qkVTmF1aKbUGyo0ROB/F+8/X71799vVws3n759vbqzWq5
MunWwV5Bb37z5v3v37/6+RV6r/N73xGDffv1LY+cN69uXl/epOdqcObibHUPpToqXPnZ0c1vX3/9
+/cXP7ug+PPl2QXnN7e3g/8dXV9cXf3iav3Hzc3vXjtLeVs6qrgc50uFDSdeFyhQX80StWWU9/u1
8OhFYVVjFsuF460kfgJU+ORgknOvXbFWS7Xay1eMUZm9xTbNJ1WyCmthtoI9ucSuoSU65xxdgcqI
2r1pskpVgcapLHOMdu1eiH8xlZBj2Ui8sdkvPRnRebJSp/k1mGplIwfT8GFfVVHNnGcsLjcr9u0d
Gc7pGaXXBkoPpzHsN574jmvW6ckoR8cXy+NfPJ8KsDp56T2pvPWaGtTRh8de0PlIjbVfcd7VJfWm
fzUCjUAj0Ag0AkFg7v37XTWfXSFFj9pH+wDPPYH74XL4b9Gf8fcko/zH//z231z9y8MP1yM0AodF
4N/e/Id/8c8uvj3Gf/n1f/3X/+qfH3bsJ2z9z/6Pf2qOIbWW2lTiHx+XD8dr7fUucRiOB4MSG1H2
qdVIlUQW51HerzN+1W4eRbAu5Z1cilmbJInCIfmmWJRzWc2WeXLw+DgRy1JAssjb8dH9hgJX8B9H
WcOQYXoLeOxa40p0ZSdesUfHVDuTMwzQWmidZxaYt3rJ+bMNmczsdUSsslgo1FxcDJq+JVpbOxJr
A9sFMql4PjnMz7bvrm/x9Oz65djUxwQPWqs9kInrhknGwwQ9eSxv/2s9XBh611/8JA7ZlYqrbFXY
o3sW+9WOvnBXWD3Jw1SQVgb1bl5iwk4qPj169gHiijKcWRNBratMOK1zgp9vgVjih6rDrFHMYOs1
/BP73Cnh7XaMM0RA06NkhElnFvTXA95aNJbpvHLnkMnQVKzZQ+/hFDbuqzLWyq/F/z2uhw4dfRQH
bq6bsfJdig4snOnu9ZSq4MVMlzd/fql79NMzrbbEH0OdNftqscwrfFg+mX/BaLetyua6u7tb/Wh1
/otzT6SPRqARaAQagUagEHj712+/+f03X3zxRbJpFGSkheAsbHvpmSePH4Pef1FnerjQZ7T8xf/z
F43mPzoC/+7f/6fQgVaA/9GxbYONwJNDQPsJia1JJ4SdaMtZkzrtlwN9hfU9Q+HkAUD0L9xP/8zD
UXws1ioITc/iRZwpnVXhx3o40NEfIfY+wAbDncxX9KRwHuYG/sagxDYT7Qy15hwuxFUL7+ID+xXF
FJGGqpnmaddcGNrSGbYaLuzX9k3kHKfNoERlOx5J+wYrSNvaKf5LL5Vb0Ej81Ma/nlp017A7e6i0
HzrIIJTV2zVJZZVkrZpV9GHP5PQPSaaz2S/nJ2oEGkViq/5zeG9YH7w3/JDcaTitWOIi2+oms3dw
Tt2X2m5XrF5j+QGsjGs9j0EgcBoW4bZ2PLNx1u7BblcfvQpHTSf2uZznNIP6qKhpuqwrXprTrCnU
7EySS7kVJa0iVRGiq/0xp43lGitv6Iz/468GVeTauo9cG7ouHrpPxUJHAWY1YXn1kwt+vCoRr3QU
17WSPBXgnd47az67Z2nCMx94WumTRqARaAQagUZgH4FZbMK6bh5ncx/gMOFPWmYfZ0s1modFoAnw
YfFt643Ak0CA+GeqOku9JJtX5BOCBQPZevsfDvbvLWIonokujMArUQ7OKTYTlQ8mpGLIg51A2Hyu
vYJU+8rCIG9ZRnWB39RXRFwOm5JSer9QcSzvMKxSyYnglWXkWWTkNfxN2w6LAerV0dpSHV1TKuwr
WuXWVZrXiiIuYVOrss4KRhFlnlaDi30ximeZFdyPR+fXL8+uLuRqVnnj4U7w3PohByOnnalBMqOX
Mm4s44OWD0TbxFdzzrxULzp7HY0c4PifuUg+HrOgJZKs5Go7ot8qvl0MX7OWEM1VlY7LtfSHssJU
4zaOMUdGpD0tQd5eqT1T06Q9d88rM40CL/U4HdbuwwkGTebrrvnDfXx8Zz2i7rUuKQt1l50J7E91
v/DQhyyDkmlw1aye/bNqwNeEzscqgvUbnNkdn+YAl0Mj73ckCcvL5ABnyqXMZ3Z9NAKNQCPQCDQC
jxFIJedUP2El3Trwo32Ax6fZMVif8tv988Dt46AINAE+KLxtvBF4EgiIwSqbF71RGqzqD7M5kIN+
pTlCeI6hxMihD0tFEENNUSPpQD1n79mjeldiL2ikC1Ec1W2GlIrEVtEm2NRy69hqWLHjqLfJHN6i
f2rLJVuQEkzoNVnESwjLwz3ByezaKu0R31BKFQVdcbZwGGmY5t7LjTXPbenAqLJk+dKeiGLsM67V
XSKu0UXZr4lznGEf3drcT7HKzMjFpJTFO6slO/UYJdk7GymqWcwQTBwiLr79wCd68MFIxXU3oaBH
i5Xe0s7outLOMEc+FQO3GuyeFXkeJhxVlj2lqP/MrBNgLUyqMnN09cn2S92Vh+b8fBo2Lgc8aNij
iLqwouOjitAmmSG0I/u6AshLV6cdO1zFagLdOLEzc+FAn4Zme9xKjc65jWu1gnOPIn+MUoLhEzde
FaGNvPiwQau1lsG0axZHN387imDt/Z9SQQSu/1w1n+vafMdKE85J5QOPhOFcNbXiPZN92gg0Ao1A
I/DkEZh6bypgEbQ260J/V83n9CnhN/pwH4dEoAnwIdFt243A00AA/pmizvqB096vH07Yp5fIYaVP
KnEX1qcPoLiwU1RiVXtSIK6431ZVoGCq5AkT9IshLYeSVVtKL5RmqYpK26UrJDEM10op1e47UfbE
1qDN4n7P2AwIhkmjSA3h0dJFtdeutUHtbRMd9UE2SwGW+gpPdoQzUcdSGMV5HNg8YrPXiiW+J5cY
/ZPhsCkmKUYrpsol2pUXnvbg0tcVeAz/t3CtIGopt+KoGkWuwmPhbKao2ieZJ596RmFm9HXCnj+u
zZw1WWdTa2GYuGVHbq9HrmyYql/NLTXr5MemrFQ4c6TLnSrOJeHSYuPlyYyjTkR6Kau4MCzETupj
51NRUFoMZlHZ+BmuzrmU5kGMuVx32ZfAijkP7/XEow8XqdYdkHulP/vLpTgCrRoY/zBe36vo1aH3
+TTWNK6+M6Xt8938xenxhbuNI5Fmyfvdr/OcjKzSe6OhjxZnZRvMvQ7TYJ80Ao1AI9AINAL6E8Ra
bqm7+wpw2ocCHL03KvHufDxlGskDIdAE+EDAttlG4GkhAKsce/yK6xantSpL9iyJr1LunhHHC3U1
C5K2KdKKtMrr1oufKMZ+DqBgGj2E4rAZMUBo4nqwGs7DgrT3r3gIMcBW/+B+WTiFInKtyHPugxhO
GJEUTnbxjerLw2apFnbK5dljfqjYXTHhofiJ5dikOaG1UPxOPrCdtPTquVhrxaY33Y2EK2Y7dVRz
KvFh00KFRSWvWJnSNW5UWXEtuL3mq1hxKc/MJjYdJS7LMECUZ+a1HV4BE6iKkKelpFRHTVe7eGP8
yVyCMxbikngjj2FBF4U54co7C3Lb/aO1cnCuu1OmatYZPQhgJFeFmsaTvNq4WrhLsZYOg3vvMp/T
H6/kWlkrQdtXpTaY+mCKlQ5ew+HjA7MzUdd9iW8ZbFfnWYpuMsyd67vroNmNzpF8W/sNOn00Ao1A
I9AI/AkEHtV5HkUvH+UA+7k59wfe5QnDnFMjuo9DItAE+JDotu1G4GkgIH1MjFa/zXukuVkRFQMh
Jpl/5R3ymyrEULgV6uzSeZtwY/RhNuy1/MurG5X7KuxyifThcBCdL1w0C84kpkrpKdM2hvDSaeyL
jTva+WizVa1mR1OL5S6XHzc+FxciW5hy097TyLs3SV2kLhQasJZuFQWtLNmtI7TNglVhCw/FPzVR
OcXWROtws+U9vNr6sLwSjXdPJiD7jpE2G1SMUwge9oMV08WrKJn44A7Ft81OlQOcb5K1U/XEJu2a
o6PHOTfytR9vcMCL3A1YvYm6ALRSWjqwZVtVxsq44cA6hAbzqjxn+GSWpT26Xn03cn91mHAW0R2M
VyOGeTKu3UjWbopsJc9Zh5ntrniYva12utEfn2kxld0pvekTHutzzchvdddYO4i3vlDrCILo6otL
FcGC3evLluv3dN15PnN9557Ajv72l9zarxXjOo+hPhqBRqARaAQagX0E9LTwsyParx+CleXLAyTP
dLfo0/2WqRU3nodEoAnwIdFt243AU0FAqtr6njrMq9ChlZieKCUip7J8VQNZvA4mKXUUpZYw5Whx
PAC02ZHoCgmx8FtCfLX8yZ5FihGCwGjfXQcRQWxUDUusUkHFImPH2tt2pXRcpFbth7RaMrQDoqXo
KqYo/A2lFLF5s6l8VLkET4alqzq0+eSxo2rxW1xUDJy54GFY60IMCCXW6akiRCfhV4t11MuPJCKT
20w3Gk0LZcF0Uemp6y05xuLMmkJR0+PTqoClxx9TMI10pvT41mDZ7FcZtnwK7ef1dOwDLFVTNbqK
zQIYCFs3VmQ1NhlaywRecjbXFe20h4W8k1gZTZq0FVQ9knlDZLeu9URoPy3FlQb5xoimvqlBpXMA
5Dx0lw64jQVG0dJDRTtrGBBDIfftyFXFYHMJuAVej6v49tUQjfOpwt41RLwt5kwLt4lX3wX5wwnX
0j++0UwH3mqCy89PH379zdEJM9KRyGejoJ7Z43fm+tqPak+f6q84drdnyn00Ao1AI9AINAKfIDB2
PCrVV8+1nd67y/XNHntDDX7UpyE9JAJNgA+JbttuBJ4MAiZSMBz241nA8dbWFb2DKv/oi9HRCuNQ
xLKqYPEu59sFXMtc0eWINvBbfkydif4VjZE4bMa1UKktWzNP42ICgD3AhsH0n+mutiwS+3JPK8Z0
pGcpnHhYcbmDsFkBlv1dfSkTRWWoEkpttoafjHgf1mcJ8R4WJJZdgbV0VR4sDssx0SPH33rWdqZc
1lzMpmCqNiVOq4mHuWnbJ00fs2OsxFo7TtueiwmX3BpCm+zikEnvRGWyxyqAPAFDFa8uaurhipfa
Q6nTZqq5XHaYNWP5rYXlVMMe+qpuhKeZSeVc98v96Ywp5oUFje6rcNKUW8w5Xo2rMkhdy4nds1pr
oTgfDyM69Z2qq/hFfw7cG2xcCOAP1/JR7rhdZXfoxfbm97eXZ+e+hFE8sPN+tbwycoCj7npU3N6t
30fv3eUJZ13fffpoBBqBRqARaAQ+RcBZvjOztxTgVISOGpwc4JEJrHbrwLvc4Mb0kAg0AT4kum27
EXgiCKSylDkvIizMCnqnSGBTNZ1LPRPjMB/SOqiZA1etxHIdLazMYUm36JwiSQqQTtVfUQ0xDWXD
igYTSwyrgeNpS17b1HbBFRuc3NfdVeLkDKig6BGRa7ZjLZEc4yh+8i1ZwRprmerEUoDxEMYlzoks
7Hxjc0u/mv94LiFa9MdZq74qnWVvNfPokF4C8CqvmLOzfTRZ8WoOxWODnOpOoxWrRUXD+DRqLa9C
VR4a5ZHdGo6XFQEfZt0+00CDmoYnp2f8d0+92q8RElwrC3V3hHD11IjDvpBhao+5X80xix1msNUn
c69FEPlGg3j7Un0S2D4Y7ZiDXZpC+o5hehY1buaYsdw4c4PTnjlqqQHquzw6scZOw9Xp8dULhQyM
Qwqwf3bab8736kKH90bvLU3YptNnz+0+bQQagUagEWgEjMCsAp2/UqYC7CSr+Wn+HNLTBBlAS/xj
r+Dd0nDjeRAEmgAfBNY22gg8LQSUQ2sKCt3VNr8QTtiChUoKPoMFS5tSTc0V2RJJSiCbGKmjWIzV
QviQU4KdN3u/0FUiOFxmrgFrcS6oOLb43la1mkSlNnyifN0H8nujZ3r0iumFT64q9Dfq6C4HOOdk
gfLIoToX6qs9EdMWV0qEc/ZDUk9tmatG9m6SCqnJEt0dxstgkF7sL+w0cdo+8UKvOJ+TV9nEyLs6
WdcWcdJbJRUXGguhIdad0fFtq7lX56i1mOUVy/HKLHRGQWvE5YhkBgfmQf/QYM7lT2XMKrCclqi4
fMK50NiVXM6nYv6+anLsUn09Ywv1ZT8h0CGi2UVJenjIodcgYke6N7za09ePQRZWhjwTL1Wcbvhj
6KJR17pGpmO3K1ac4XQHR3s6UDksP+mGKbPiyl6eww29dy+nd9aC1l8kyfvd14ej/aa/24fn/bsR
aAQagUagEZgPs6H0pgLWyOz9RAH2Y++xJjz6N5QHRaAJ8EHhbeONwNNA4Bm8N4Ie2xcdP5x4X3dY
pbQ1iJ94K2zvmEjUIwRhKmCphVhfa8YLtvxNGLC3AjIjgv/qKm+Sa16N5bWoJD2tH8KyqbMlQVX1
tCJjKs3YobPeJUhNin8W+xq7B1f8sIY7Nh8O+zXxXipXuQTMqJTcOya1cs1qCJh5IGnDx8pJPiLb
mQv12JJSCidXpLE2NFqJrysG267u6JwqaZWmGgmUnY1EdM0JCX0q3rgupiquy084pEmdVG7mAoaM
aIZZiiimzCpL+ZwipTltdODKZzbO0WOZUVhlacW2Jq8y1qlOeI3irXY7ouUGLjcpTbZtnFSesFmu
sn+xLPxHZq9nXTWl+ZRbGdJon0MgU0ZbB5/yA7d3B43Ip4xuMhzmP3dOYrQgrD586v5Y4mu2RPXl
HFP04XJBdPXnr66eX9hbPK+jdF27EVF31oJOi14TtZ44hcd90qGPRqARaAQagUZgH4Gd6hsFeOT6
5nyn9O7nAEcZrri2frgc9gvVBPiw+Lb1RuBJIPBxsXEksEJ2fSLOwJ66qoFsikKZY/2bDuek9hUV
sKShmmmIyG3oYjJznBLBsJp7c10SerVuqjJOx4pkFofUM+HjZgkbKRVxvVA9KhM5RdiKozqiFZ3Z
6cSOCsYTsVZXYw5fqsjnZ0fvvrp9d3Mbadq8a4tzot6ON1bisYtveXYWJGPzHnKFV/xnmVBczvqn
Niq2rhg+VtG5gw+XBmsqO/fj0U7IYYnx1vRSYeBeC0gCbVRTz8stNS+NIJfSB7PyvyKi1dM21cds
nNOk5uaqVISWh7yHE/o26EOuWlt9/VDzjSexo09569ei6NGTGZ2HN9xVd7lymOsqzyUdmJeMCL1S
iUOn62AUOmMNr8ZY5S02M0ffkbqPvizaPkYIdZbqG/sc9A9nNkRctlw+3HwzPlWz49hHlc49XXdq
vOoz2tM/2u9sH57370agEWgEGoFGoBDYz/7d13jTHk2YB9mjcz+O9VRKveg+DolAE+BDotu2G4Gn
gQC8F9HW0b4wRrgpZyYkjlaFai7NDxF9nV5LUiasY7sN2zIDoZqzg6SpiSW1jUcD9ZlNmSTtug8X
+iraJbCaKLl4lTJjVVTKvPdePW/Nad99dXd3c/v6lzenP3puvgTjkm6caFhFKUu4xoKPXZyttGoz
WDFJibRRX0umHuwRgdGqoxmUWLkPqZSis46aHu0P767v+Ln82YUH4u1b3kZctHnb10f8t1DnL2+t
bS7NyaUPR8dOhLZfNRdnDmuPqNKrxaLpCfKc2WAifiV4muVKw7RXpXubXde4ZrDRb1VxmlZeV/6U
dsaiJ4yaFl7pY0/CM0P+NRNbKOXWIwaZitPmLFjxikvYMQIlonKCtdgxyOWDTrOq4le88nSCT3qi
xp+QIb5ygHzs+6paQfC6wLPjm9+/vfzpua2N+7W3969cSa5v9N5owl6P2K/5nL9aZp/OAQ7QfTQC
jUAj0AjsI6Cc3qH0PlKDs9Hi0IHzgNOfAo9fx1OsQT0UAk2AD4Vs220Eng4ChCI7Kli7GW1JdhUt
IfL5eBmK+GzjHY9gDhSa2vKRylkpwpYO7M0LV4SOWvL8SMIwJXlhfXA/0aqV1GCY8koScmmMUl81
xP1iR5nu2WZJtXyLKxr68y/PX799fbpcXf381YJHi5yRV2aA5n4fjzeKxtYh3i5FVMzK/scHZ/Bq
QVZiqfN1B6OzQuuc3siM/Mi+4pmlXrunlgF2aaLPV6cLJErVSfYBV9eqAZxzZftmuZU3K49EJhml
GPvpYK3hwIBjl5R97bGiYGvdgau43FNINa8k6FYeb/z37JIT6wzk0o3ls2fk++VZlHZaUcqlvnIh
3mKcnjkBN0ZfD7OeoDOuS+xVVDPnDORXVZamhauw4PNizqHBxlBQMGvOPd+0TJU7s4Crfobqyw8W
wqtNjHUVpnJt+DCjHB9frY6/fGHn4uGuDmd03V1d6FHzufrsa8WOWMtP5wDvwOyzRqARaAQagYnA
Xp3nR3qvi4NMfThib6m+XqqOMlyRXI3nwRBoAnwwaNtwI/B0EEgMsGKEt+ZaS210xBa9Il0WhxXe
TFyx5UfikB1RDL/aaG/etRVFeAtbAIVBOZTa0dFrLYweLz9bXJxfXr48Wy6hNA/aOYn2E6mjJsrs
0EtnM1vqKo8MT+Kfv/77D3LrxDsJM+7J4vri6u767d1Xb64vrhdwpxFlBJM81qc3+vT6LScLxvp4
/O6rtyjJ727e3V2/eX15c7paYfDlj8/eXr1W+/W7d9dvYFzsvCTLV7ey/IurxWd0EyawvSkS3v7t
3fkXF7tw32cPjHD9i5u7q9d317f4s/xs9e76Nt+ad1++efelVGIk8evz67tf0e3t9c/t88eHly9e
vv0lHd6+u3oruXgI1RUvLZLLf0ZGJDAUPZqtyHHl0xYr5lPLqmHIiSVOH+EMBzY9rhzgnNvIfj6w
2CkX+lOvZPv22ay4tGAYFbx0W8coXOU+uSq+1Xla+JTGfLu0NmFVHGuubqXNjfR1Gv7w6fQtHurb
EjyVpSylmvvCqwCSxdR2jtL7nXrvbJc3pf2q56ho0n+jFLz9qxFoBBqBRmAfgez6ax146r2zzrPa
o/pWOJUWZNOSn15dPfS3qQnwoRFu+43A00BAhFaKqepOqXYU/+AjLZqBiGSqaLPWOJUCagZSQbPi
vSNn1SRNRwKVtyM49uHsiy+Wny35OfvJy/AWK5NSZyV3WiNdJAVXsc1c6OPZ4vmPVvz+Bhqs/muo
6YvT5ze/ef3qzasXP3p+/fOrkanLp5vrc316/ZubV2+u9OnLS649v3p59uXF2Zdnr359ZTH5irlc
nF3AS89f0/7y7Poc/3Xtj2LZ1/4cosu88CTkTcfXv//m+eerJZy9jgXStDrf3lzfvn6xen718tXZ
Vxf58Oyrs7Obc6DDSfX57etXb33ys1cYvPjiJasA56+vzm5e+pKBquEcrH7yxqmCCtsdnxx+qEUS
Kxejyq5HH1YHOPe1u1d/Gn3VCc9OBs450rEt7rKOM66/BoAQKpq1kupjf0r0ro9HjSsMzu/G/Ibo
/oowL1LheWuybTl6QOqv3LRvPpw/Lz6ur/78/OrPz/wpF+rI3yWl/Vbc++O60CPXV47PrK2cO166
o9QG8v27EWgEGoFGYIdA5fom4/c79/71ovNO7x3Zv5F/O7/m0F+mJsCHRrjtNwJPAIFnsDqTE+0b
JOaCoGppTfG9FKPSZkjiITTRxzseaeteqjTDPpYrZbqK2ECV1IFIaoXyPiy1HMpHK10hq4iH+q3o
Y+KfSS3W/sNwNumTKsLs6lmT0yLe3lxcb++3b373hghnmPnq8xXXI9W++eUbTk5XqILFhfAln3LJ
m1++rk+PHr74yfnbX928++rdm0s1ir4+e/j69+/hP+ixN5c35z85x+c9y77281NNRWsB0N1Bzz5u
b9+/O3/xsr4Qzx5Ol6ecf7P+RhQd9slVVb3JawReDnDj0c351Zu/HJY/Hn/94Rs5cH5x8wsc+GJE
CIOD9VUpt4M9ivvxNtamNhullHb3lC66sVdrKaUplFUKcM6F9q7n1GN1lwHQyxm7rGCsYZ92sMJm
OKq9olupyh5XLZ6p7i9Aab72nE9z0E4fdOCVrpXqiybuQPfMS15hn2s5eKWnT9XCub9yFbWuPsvl
6uGr9/s5wBnmk8rPuxzgoQ/PHY92ivHIDR6u9u9GoBFoBBqBRqAQ2OUAZ4/f78oHngpwKcP7mvBY
Om9AD4RAE+ADAdtmG4EnhQDBzBLipNwqdIe5b8hxXYpZrcVolOsrJRDhVMxY2/ZSmZlKV5CPzdpc
UXWe4bpcK45Eh+XmXkWN2C7o3TfvN3/cbP74zbu/e1dc7mQN/9mQYHwPc1toVyRlDpOHTMxtuNwR
yu3l61c8V2C8cGaU4fUf9NH1b16fXZ2dfXl5dnW+K4L1sFn/YT0+RfXVD5Yvzl5Cei9fX7769fV4
rC1e3709v7m4e3/3/PNT8c9nD+PaN2fXZ+fXL19yrepIM9x2R+eeLb/+/Z24cR2LD38Q732+ev78
R2pcb6RUOwOZjGXYIzTyeO0+KMBnX708u7lEGWa413c35399FQcIh64diRRvrLUAc2/Q8JKE1Fdo
rZVYqbu6F+LJ5P0KcN7Db/ETJklPWCI+4DNvo6ymnZ5hwvRkxcHcMklKUlw9KMNlP2EFPNPoTyuU
HTPWljNo6czpb/FZzJexrCfr8LleA4ILOyvXV2smxdsVR0D/+J/OzE4s1xEBTNnn+rLRLkhvPtxe
fnE+wM8watfJ4zrPXk+pOiX6aOi9kYvTP332rfV5I9AINAKNQCNQCMwc4Ozry9K91WCpu3s5wJX9
OytCD62482sO/UVqAnxohNt+I/AEEHCxq6Tgwl0XKY90zJ7AECd2ZNWnymZ1DeetKC49TaiKX/FI
gEhxCbSWOtKslZq8hQ0dLTd/WN/97t3tb283f1BPUeTJfFAFpSdbSHTVJcdg+4Dx/nF9c/tm9dnq
knjmZ8vr31wh3r76+SU5ve++ekOl6BSM4iCi+OY3t19/yKd3yu/96g4advv13fZh++bVm9d/eV1m
j48o43x79ZYA5s128/p3tzhADLOvvSAr+Pb67o5ra59enNkOf+T5268xW8fNb19/s/5A+PT1+St0
4JvfvmH6d+/f8Yy8Iwf46g6Wdf3bG1n+2SUpwe+uyPt9B9Xk/PaXN1cvr3Dgzbu3o6YUiFnpFQM0
dawCXb4vuSkpPxbmllwjnfBp+C28jvOp3OZT/LdNXYsFuCV9LPkq1j0X8mpencLLiYWu++ue4r1c
brorzdlMWDsbY5mWGHGH+mJ4LBZAVODKGb8Y0feBa/PDueeYGcnD1c5b+HZ9zcy99akuPr7+4vj6
RQi33qbg86z5HL33ca6v+uzXhR6acC7vv1GCZB+NQCPQCDQCjxDYq+qcHGApBPrzRw+dfX14PIj1
Ufp0DvD38F36s+2WPyCO/uN/fvtvrv7l9zBeD9EIHBSBf3vzH/7FP7v49hD/5df/9V//q39+0KGf
svE/+z/+f8SlosK6xrKJD5KdUkP558VkIwG0YU1Uhz5+2BDDfLLlqi1KKUqgGK9UX179bFikLjHb
Jm18UgWQxJqwQA6oCkfLNjYfVsjI6in7Hjf5t8k1DburCk/hhLTTAiVbDq/SIs5s5Ra3+cgqYqag
diJ1oWS2kALLlUrKbMPETBHDFaOdKkvZOmfmOC0ASORZneChNdXsHhWgpGlvSs2unXXDbO1hvFL/
Oa+wR65d7wVdu2fJqvScnpsuRond1buyJxra06m5DATC9EaW9cAzUzAaDlkfubjDw+KHvgVV2ooT
7jX+M4qvrXvEgNz2wI5jeAvUIHBqxpuv0Pz+YAHEzN6zylBrDeHztNB/msJgeua74a/Zx+XN4pzm
s5+efaLi1k5ITmH33fFfJEPp1TdzVIfm/Pbu9vT09PwXMtVHI9AINAKNQCMwEXj712/ff/P+7Isz
1z7xM8VLw2G/4xE2uushlUfVDsK/+H/+ovH8R0fg3/37/xQ60ArwPzq2bbAReHoIECZ6kuhQ70wL
+73X+RKqq/VOb/zLj/aqETuF4riGM48BPtc7xUjruSD+Kfarull8BKc1jxWVWgzaKd611f5ESwKY
pRWruPSRe4Yj8ZpztDvYkXmasoXNjZ2Duip1lIFtX+KzeVqpo6HHsKyt76XGkh2xeroN6sUnugT6
TTd5W2ywOGqugtky63DRwSF3WiiXmPKNjN/ihMInvM4Wiu+F1Zst0y62zLwy3zDwtTktnodzmrXq
JwiYLYd8xqv0LMaec+wMrlv7AHusMoid9DdBLbWWSXkKVdvMHmqmvmWlG+fBj0thv4yFt+HMxkT4
00IHg5ZEX/b1jdhb3xBz3VJ6fX+zQsFRucS0BDHcC9p55dbo9er0kjpYNUffV/HbKMPWgTnZ5fqm
XastjzOEx17B+jR1sPpoBBqBRqARaAQ+QSBVoLNmmhXVvbrQOtfjbG+f+QrIGvWfOwf4wN+oJsAH
BrjNNwJPAQH+fb+HKsAZiHBmT2B+w0MgpWQFK9tXG//y6QMs17QN+dd6o9ZBUX0VHg23gffSBofx
jwhJ9NjwzK3qbIn1mccSE/txwzZLSv0Vy52MK/xHLYuwWeevKi46GqkqGy/5z+cwMdMwBlZ56rA4
8yg5zKfmTjlXPm0IpPmqOJsVSFXtMi3UVfxwwE7hZhg0Q+M8a7q7ilC2HLky+9/KAsYxggw++Wr8
Z3TsRMNkdM7jT5AJxxvj8qn2GfaFYbwaiEZz0dJ4jacmC+Y5uBxezVsjwMNa/a1aFw6ZaSwMoHIu
hVkIy0wGVTK2e05+O3czpr/uLx56rKoIzbXxM8sI3tRK0dGMqG9UEeP4vPOB9pVB0zfBs/B9Tx2s
AD5V4iwEcGM+Wz5cvx9Kte6I9l/07c/yvP5S8ZaMYbb7ub4zTzi8N316p4rxFerfjUAj0Ag0AnsI
OAc42b9T3S012C156Oz2FBiPrVpX3ZOCG9ZDINAE+BCots1G4IkhwL/UqHYcUdsIXS490FSKNkl5
qGkLf0wpLDPASKbK+1XtaKKhLcOS30tPOJJ4JnpyKZaKhZYkZwYVPhM+DA+kBd5lHmiFdiG9d0nV
K4nJjrveQmbEhKceGD5JKDXlpuyUX4Yd2CDOmJjVomw+pnvYY4ifGfW0OdlyMmOLk9vnUlnDbLFg
+2KS0Sod/zzR41R9zCqL99KTawcHjh5bTBg7tIcohkLn8Hk4aoj39Cd2Pm1Hes3lzFHcT/ZTTVqs
Mh+NV7WHz9MT/xliYBW5Pq/pI9WdWS+rf61K2MeyQ3+ql620udFnWDZKhYY9mXOZKx1zsWCou7sR
M/vpQziw+6sI1k/Ph2XbNYPd5QD7bs6K0JGF8xfMro+R3N83OAP20Qg0Ao1AI9AI7BDYU4B3eu/I
o9lXgKMSz5aKMmsF+MBfpibABwa4zTcCTwEBRx2vYFDSMyX9bSOHFv3wzjUSzTZbhTdvkIXDc5a0
l9LLtTwFYIbQEn64XAzqQVwIiivl2JvliPEuFds8+RXsV6OP+Gcphw/PllaGrQ0mZrjYJp/6fpT2
KPtebR3KpGtxqR61BvV5tFkJoaGvnlf4XuZYew7RGJXVJ3yYV46pu0qHtCnF7npQaa2MtSqOp4rW
FiOxfw9jDAf2IsKMYY6FUqH9qZA0t9dYOcc9frCWw6ps8faMiw90GNOpetFhvlwOpzVu3n3Kls2f
de6J17zohm/MBWvDPt30qbm3JGXPRWhoqdufZVzsW2GW6kuFZ8KezcATDZ5U6lpQwIfJ9scKRVh6
9N5kF5dxhqDROEuXznfA/FwtR8dfvji+fr5TgAtuib7J0SopWF+QvfP9vYK9JrKvDw+Q+3cj0Ag0
Ao1AI1AIzPXTqfrOTOBqGXsN7KvBu/ClVoAP/FVqAnxggNt8I/AUEBCDWqyJghbblFz5QOiyyj6b
en3UjkcPKfnrqGbRXofUbo7hnwBkikt/1GB6ctVJmIw/VUQ0V5gpO2yYLZeqXdwPar0ala4wK2b1
oNewQVzCptu5vNqprrSyJ0SxynMPgQ+6aovxUEr12D4kgzepwnLG3IyoZtrF9BLhTJ9Q9JH3KwmU
EW1ZebmhYWaVSX/N7kGqqsWJ6atUdM5XZsWEAYMbF2YRgdeYghVrGM/XNDXytTitqalmmmxWjxtZ
GAsCn9FNU8VgQ30JPsfg4NhSgI1YsVn8ZwgtS1fmc2mz8cFeaVzjxpGYZ/li41K21zs9mbdZ9Uia
rvb13R59dqrNjWC/jBudPDskVXC47WdnI80l4BtYwetZy1TuIC2GonzzhVOfF4Zh14MPD9T8u3J9
dTLrQluTj/AbQPejnau9c4ADXx+NQCPQCDQCjxGoSGYLuWK8JyOeyA+XqL5ZTk5d6HoSVdBZnnF9
HBCBJsAHBLdNNwJPBgFreopPhr3wz7rJhna625qliNxWUHHliJquQOoSyRzd+GG7CBNO2LOYG9ei
o4qYYaqqWIVqVjSseNdiVwvK/E1Mz2Q7vFEGY6euIjramcDYCas0+SzWF91SpL1ESEVcx1XPRa90
8EmyasUSzdnC0tU/HeyJCKrHKqGSnhMKa55SmM3fNF9m6kvCY+t8ziVMOJyWnjYbvqcpxD3sTyfD
JMOWOTebFVkNYzTCyU2qKGXfiJnNW9Wq/ICOglpA5b74Nex6FzXNWDDY4OyBcpW64Z6hjs/ovVRG
g+SHtUYT9hJC3dmivr5Es+BT/PRrUWKz2RKjuTC3LDiYjZe346qPx1d//urq9OWuT7Rsr7Irpzca
tTOyhEtygH1Sf6n4JGarvWZnp/poBBqBRqARaAQ+QaCCp0a9Ccci1XMk5zxQOPLEqSey/yZpBfjA
36UmwAcGuM03Ak8CgUVJheYzyqrVv+xIgSFa5pn+9x0eu5Dk6HaFv5ophQWdkBm8dTXgQa5orkrI
sF+YydQezSHDJKkpnUDrXZww7WkJY2Qg2/d66oidNqeVVml2J2IDP8QaQ+AAjR5LHvJm8GSdm2sV
q2citPhtCLO01jy3BpfjVFJteKBRik6rIdw/5/Wos1dRXPP8q1nkHHbNtcHTZnezdqMswz89VpTn
zJ2GYsWmpglNn544PdsOcgmf0mdyZvuW+sxzWbrEcK8v1KC2pg7MdOOZmtmWTjvmKMsElUN9eQX8
Kel7lNDanX5b92v/3ukS3REPMWtNB8nd62rvfL9d58vl6uGr97mpOebSu87z7c3rqAtdLYRPZ4V+
Tw3e7zMN9kkj0Ag0Ao1AI6DwtFEFWud5SvKXzMj4zdtk/356Pv9WaRwPhkAT4INB24YbgaeDgLXW
laVafgh4VvguxImT5NAqxVI8kNBo4oodgmsZU7qxeJrSeu8XAozcV+9qQx0sqmH5qSA2tS1FNwwQ
CrQcSq9plZheuC6vZtE6p90kpSoYY5/Y6a2qbRWnhdLw47ehhQrY5iobjNAasVd1jGGJ7h/CPJj5
ECSxYE2yKh6bMeZchC3UnYHMTjOQzs2BRRfDit0nGrJamCPnnlGd0zIsqCo17b5IbNCj1z5DmGVo
WgypYqqDEoOG8+tW7HTa7FGsqQWKybc55yreZ0kiRN1eFeMNUcdmGtejsvTCVbXdTQcgsIkU0c68
IvxmylxonHfisK8qmZrL13VnNW4YeGh2zoPDB79ynlsWYNOS883wfHvz+zeXX5zbHfeJZ871rXN9
Z0Z+77frQrtb1YXWt9o68Lh2GuyTRqARaAQagUYg8UT8CRJddwYZoRCU0quHVPUpKThBSSMuqTE8
KAJNgA8KbxtvBJ4IAuJO6ySvitxapmOT3ofjY7Jt4bfERcN1RYrCBumwgvItlQor5qYNjVQDKbmv
Ykfk8W5DkvfrPEvVZKzlsWKtzXkq5hkCBi86Pq79e+B48O2NoqbFQpdO2jTPqfhkuWeaZPIWCgqJ
El8zf67CxSGlqXHtzvodEs5V+LBSJSexRyxwHraJnYDAKxOEOXs4XbyyTmsKl3zgVELOnsOJFZcq
bo5aex0Bl3FLVm0qSMtPjNDiuOuq2mVg449os0mp7ohJeyEZ9ijps1YQdM5Y5upVQ8v0O+3xtrix
+KF9xnO4rlm9fAZdbivdPKOo1ifCopj84vnRgozflcAJMq4xZvC5lvkykWCYUbHDcerRt+Vt6mPp
2iCWu0mfcrTIdgn4fBrPjUn6sMhy9cXxr56PNYuxJO8JKGzB7PfbdaFjodqPnce1Vzs61vtoBBqB
RqARaAR2CFj1nXpvFGBpwkoT8/m3NeFcvIu3ajgPiEAT4AOC26YbgaeCQNQ88Vv+7fa/+RZOFbfs
DFjoEdRH1GZmqN7TDu/lJTw2q562kAjqxLumfzKH1RMGKH2PehKDJYa5wZ3U7bj0UumH3kspTFJj
jVhoU6NSgMWZi3kmH1iEXLTPI8YlDrP6hHOnaJZnV1m+8DfsqTMMLRmz4e2JPfa4qRQtcEz/9rVK
7bUblzIjd6iB6Jl5hefjQ7ylOwZ5W95VYLOGGD0l2IZPho0bzFLI44yJa+moJpOl9OZeGKJSU/kM
C5m1e8rngcAuApwPQCCjeLLcQcRealzxfcgKQr4nsobz9DE7Tf/9ilkVR+25aLHAM9U6SBj4ekx7
IFmzwCtafNOjJFunfawJG+rKJdZ9nWvtWp6P3eQA72u8WY/f3x84daFZtEn0dR+NQCPQCDQCjcA+
AnOnX4fA6XmB9uuHTr1qiT9/PDi2aGq/9eRqNA+LQBPgw+Lb1huBJ4EA/FABz3CtUL6VCS878ZrX
icaYgIm2mcNAaaSa0ocO8Ba4TWizGWnUUUUNwcHSP8zHV5nLbSM/FqObPIr22R+lzqzbJEojyYFB
V4rjmdfRJo66tW8haTSZd1VyqTmVjpBGz5Qj/Fxz5ypa7Lw8tP+lQMbIIP81l4zl9p2+GugyL9oz
uyCwGpWxGMJuxE7Ip3AL142HfGSWXi28910IN47b1ZF2kIe1rqpAdIynT1To8jP425N6HdOvS3JV
8PGkFgQ8u8IzHFirFb7dpfrOWXDrDXX9jNET5Fy5vjFon8t/+psP71rG6FlDUfvWfmKfgzmuceDq
z8+vnr+siGh/kKOW4Z3l6/vkxlGW09b8kb6x1Sfd1FJLJHvm+rQRaAQagUagEYjG60eKdGCih9B+
/TibarDOZw4wzxQ/4/Rk0SO+ETwsAk2AD4tvW28EngQCUucsGH7cLhUgurYoGsaFQLqtrEt2OZKy
qgjaqs98zxnsCw72cHTPNZuj++1STGntB4C5meo8kw9sUlSVruB7m8EPzXaKJQ6uqJVUmOTWYiM9
OQmjC1F0Nm98ixoJYRM31lhFcaN5VtIsFNc9SzzEPc79iEo0coKooytiIP5zIifNYBX+zXvjUOG+
7PQbEstVS59HU/UlOx07hBw07KcCy8MkzdKjpj6YCu40YeaCTdonPeMSz7HivfnUHFvkzVOTt6Du
oeU3Y4WBM00+NU0tfTgzXJdur/hqLuE2BQFfBenlHUWeqXSVlY4seYTrOlK9aOoONwwW89xb78Cy
h9uprAK3VjGyRl6vHyp8QFh98FVci898LfGQeXGi+778bPXw+ptPOPAjHXik9VZZzvDblH3e04Tn
PsCdA2yA+mgEGoFGoBF4jEDye0f5jGi8lRW8rwPXA90PtIoOM2POeR8HQ6AJ8MGgbcONwNNBQMSS
HzjMcuNEz0r+1L/gpnAikOYkXuxcVxotkbFgtNWKJ9HLlEeiw8lyU9G54TBwPzYL3m4d4Zw4Z0fD
wqngqx40YcmJQK4diegTrkhPFltNz0R96WaSVt76AZPY2p2Oij+2L103VM0yb/nviehTM+QIvwlL
FpNc1FWJ3S0ZOSe82gENzbh4ZQsyu7ZG6uH0w2OSbmbjpQnbB+3e5E85EmSe+swjwLzmUpyWdn+q
uO7o0owLDmtnwJpFyyUzYZlaOyvbVDYP7Nws4TPcljXIcC63tQjmssNtXxx95oBnhN+UvOJT+Wlu
r2kylpGv5/q4I/KKoX1zay08V9kL8W2/nSW1rMQO39LztNT4nOvvjLB3rjJQrnp18/715dn5MJUZ
mpxzQk5vhsZR9txKu9fmhV1W5ceGwDrf14fjZh+NQCPQCDQCjcBEwA8RF+Goh0ueKbVsOnOA9dh6
VAu6Hk67ld/G9CAINAE+CKxttBF4cgjMfMuKiUXzDM8KezEetbq5nxE6PuU5IQXYfUQ3zKz0YLD2
OCNyK5fVHHLkA4+8WfPSVFeSQApbwyA9o4hmdFixPy3ix4krVFVdpbSHo2Jt+BY+qMMt8U05w4OY
JWh52k9H+Rz2xTmsj1YuMRTJNC4eiDX7vJtjztejfTLG0af02GFB9r0WIODWj3DOuLoLmVFs0tNH
BN5K4p3Wgrw9n/er0MuM8mNrkXA5Z/GCCs/a2je8d1qw/XvcsCdCzLiFdedGVP1qfKNzjgA152vQ
6o5ES9/7LtX5frstM4Si6P2q+6X7fvyXq+O/hCHXQNJ1PUfl/dYXo3KAPUSdb42YOnupXkHnc0/g
4XH/bgQagUagEWgEdgj4z548L8afQHu5vvt5v4/P59OnwTwoAk2ADwpvG28EngYC4qWQlvAWJEco
x6pyesWFoEmE2G4dCwQ7MlNV4O6QSRP5I7Uw2p3XTKVYho6GNZmRJi43KmVlxjKipchSg830ovGG
r4rNrvwYgvbglYVNXYva6RHhbAlvnhWwdJlHl5qK7oo1rqVPeobImSKGDSYAONJofGOU7FGkuGUs
L10d2qNUVSckU7zCB/cRz/cicUV6z3bGNZhhnjPzWeeb4u26inPPS8QvcNHiWQu3Qbx17hkl6jsE
3my1tGKmkLuQ+e5yboNhXunATO0/oxDnvCTXFxj9IyXcaNTqAPtahev6Dmos/2S+0nLzHQBSruId
bnPuiZTO76vKk9jxfKvFV0VhrpjtzcDKdypsX/HtMHAPpHHdqHN9LR4tz5f6bV+ybE+fqf36vK51
B/XpoxFoBBqBRqAR+ASBVIGeNZ8rvokH1rf2/tVTbPcz96JvRA+KQBPgg8LbxhuBp4FAuIfyVyl+
tPCGQyhyx+QDm7WKrsBsHkTA+GV2p3xgi2rZrrZYEJzKbMdbAVd+aXJ3a08g+sOCzF3rFeascR3l
O9iRMm9BfmXSCIdZF7VGIJUSyM9a/C2ZwPe5Cu5nxyr71y08v6hWDccpfTVmGcgcrxrjjzmnfF4X
9xbPpK/5Z3J3E7sb5ixOS0/3iWodXTSR28XwaTchrB1x/amelIzOcCGT2yFfc+IW8U+68WqEZRlX
5yt83uOKn9Pf4yZSWvzQo1febyabucem+XM4P6MwqeWpYp4XecvlYYw2CLb3yug28ow4WLruBYh5
dL3SwQ/+6OpVF5r22Jmv7qY+gxvXEgB9fCOk9NKZcXGSc38ZktWcxZTKkc69wFUfjjKoHGBz3VkL
Wu26I+6Top3uX9qvkVFj4hT6aAQagUagEWgE9hHIg8P/2+nA+oNk6MB6wD3K+/Uj74icrwbye0Cg
CfD3AHIP0Qj80BEo/ik9bJtiQZbHFAYt/jBVMoiNua4jYNUjarAeEOE8vIaz6THAK2G1x6HNUS9L
KQ0LWpQ2GB6bq8RSaA+fNC+NUJd2cUuzRO8SbGbLO9OnMJxQaBG8wS2LV8cCjyVzvFJH3TkEMlQz
LDfRztJazd/EWnHDYyUVVuc2pU95hR/uzy440DL8L7XTqOpas75iv/lqYdY+lDqac1yF74W5mdYm
bjkFvYKYDj6Kh2Hg4aUrq9MGIVglWFo2iXbmHcLvqPA8eeBURxUsDKrgE9xW4w7mLphVVobw7DP9
DOeM/x5RFsxF5aHby20coyWeT1QZ1/iEt2sFgfNlZY+XUM9HNhHVnRPtIF3nWp4vnIf2mz75xo57
kbddpyRI9tEINAKNQCPwCIGh9OpJAQe2Aryr8Ly3D3BpwuMPpew40Kurh/46NQE+NMJtvxF4AgiE
9SnuF35S/LZilfXveJgeJASiEmbCj9jjQ+KZiyeHv+XVfBg2/YzkTDOxap994DamMYmRDseuFgNe
6itn4UiOSZY6CrnlBTd4DU+GL4UymYXOTN2EQKfSckUgu3+4eqmm9DHLqpYRR12Rt2GYdrUs0BMf
sBB10fMKesWBM3cuiW/TfxyT35WiXCyaT81XKzDbOmfWDmrWbokkq1nABuGi8QpPVkV6Y41jrDsM
PjntjzmeUOaKbY20LqHOQt13vK71osO93c7sdEyev2c/On+uqrxlG9EiAq/h4Xg1WHotTAzE1HNt
5z1Q3NequfunBdJb+xXnKt+1CPhjvo9ygGONz5Lfu3e+nyc8d2ucKcEFXf9qBBqBRqARaAQmAqi7
7P1r9jtVXwkEeWz9d3OAIyX0cTAEmgAfDNo23Ag8HQSKE6KpwjSsrJZECUvhTbiHeaw0SRigGh9E
yUa7lFVzM+1YExbH65K9fEe157QMblx8BsvQHjiYmWpielMhuTjPILfKCg5rogu1pvnlqF1ptozL
KLy1Zpt84FJBbVnUnQ/4WVm6jIfhSJ5dVGLRKkY3ueWouO5QL0ahgz1MBLL4ufle5Tbj/+S9YZvY
Z7gwXl5DF8OKMQWGDjzW3PM6e3IeemnWXUWnjUnVecYlz6WyiN2/NHAudLhWZPDS0rG/cXnnU6m+
qnTFTcQebphbChOvL4g5urGUfOMjJZxXO49LlMtSeW1A9i2QBeANR+V1UzZrdSD3cTBnWXMfIQ9K
Nh4tXVm+Xn/Jfk4ZV3fcxktp9xpN1cH2+Nngd2q/kXk9YuX97unDc7fGOkn+8BS9ba+PRqARaAQa
gUYgCHxa89kPnfmz2wE4je7vPwz0KCKbrGE8KAJNgA8KbxtvBJ4GAok0Tu5l/avtf7tpL0ZkihgV
NFWXpb6G+dBu0hjWlx2VSv8Mh6GdPvQ0Ya7zcCfazSrFY+FF5kvJ9gyDYsCwTQddVyQwdu65eF1a
bmX5Eq/NhaaapUDaT80Ly2GYa9NW2iF7IX7bMZeoi2Ms8SIMmnZqUuFj9kpskPMAkplmxOAQ9khL
RpzzMj7JPdag/LilmJ6tVekp90lIc7i62epA3vy/0MbhyZzNPDN91evSs7gYMm+XSL78WDwXj+WH
g/tibskPub6YFQud9yjMkz4w0lzFnWKO9jkyu0a3pVoHmXw1OMQ394nGLq5rfi6NFzQYC4Pm3pzr
lY+4R6uBaixMdm2GrDhwD1oT3um9dmivLnStccg9RyJ41knrMifvWtA7HPusEWgEGoFG4DECs/4z
y6x6cNTDLo+8RxWhZ8zRfMR0fs2hv01NgA+NcNtvBJ4AAmIUkBOEQXhIqGBYR3b6NeUJD1S7W07C
Ax/zk32usjuHsYQl2mZZXpfeizXxKwaFU5mGSWDM6GaSooWLPaaHn2bO9KlMG/OxlBEWX42HZkp1
7I0eBp4Z6RlmNhVOKz3ZY+Vy1b4yDU7FqfCumYcsxstH4aIeunTO/Zl6OUBRzb48zD/ssXzLvMbc
My95bu6aHY/0aa4KerEWnzNBXmkxA1cfM+GMCOn9zEWea38jW8DVws08kx/FdIWxj3u0W61YWSH3
3eeqsc49epotT9+Kdeduju/Pvs0owBxRfStGmnNmCh/GH+Yb/h/+THvsGA1lfXshIB0wwe7TNbrk
3Iyb5N46T25wDuTiaMW+U7NPfdq/GoFGoBFoBBqBiYCfd9k0/jtrQdffQvmLaCrDPHrzLO7jwAg0
AT4wwG2+EXgKCCjqGMXPS5ylEFqR49/01AHmNWqemBL/uNMSvgSjMAuq88l8TCPVbm5TuqiZcFRK
8V4smwvNHYaUT2sfIvmGMWpQ95T6NxiXDIZNhUfRgY/soey7v5TeUGL7ueOcvkq82m5EjK2aVWOO
arFB8V7PvepI2aaQgbCBWLirryrVNyyOFghbWHQ+9aRUrwv0GBE7K78OBzJfVdg2lxbRs4dTSy81
G08G2pU8bIKH2SjzmSmmPnswATYfrCd02KNvn/C3GHsfhGnJq+9RtOssBFQL7cEzdzYzCp+0S7v+
OQcf/M8dd4uNWe/Fgfjp75XUYPcJja9VD3P4fLsiwuuI/2bFPkrXNbaPdN2xHiGNF+13rNzPPvv9
y1b/agQagUagEWgEJgJ50PDY0CNyvCaAKD85alXXT6c8yfy3TT13Gs+DIdAE+GDQtuFG4OkgoH/N
+SfbKqi0sZWmnn2AyPmkhVdRLBMS7cJKLqiZni4MD4QRwXlW5k4wHz4KD1zvRQjD7uAwk9UwShjU
ysoezMrsSFLz4J+pgRwf5FvGsnFxM48lLZqr/JE8N5MUveSVdpi82ZS2COJkPUhyyJiNJJ8WHx7w
xEOTz0yzNGEzLk0cgzBA+ylkzMqiWmumtiDfmG8+NZWtKO7Yx5o5cHkYDkzPzD24mavLE8+6Vgfs
Veohy1u3y0mmwxx9InUUlIzGZxgm43flSlfOatbdNAWNAs+sFfPMq52s3GwAZHTfI/H23AgGndf6
BnHstGLPSFPIXQ4zzznO5C8D8PHU9DeBvw/6w8B34d7wakWAaHN/c2q1InY8XK1u0Gccdcv8Nrm+
xb25yprwiFOYei/r8aX3uqrnJ/13lvusEWgEGoFGoBEIAn5eaJ241srd4pijRy3jiVMLzfnUf7I0
kAdFoAnwQeFt443AE0HAvFRMz3Rl7mlEo2o+hXNani2lN0odFMXcspjP/rlZ6E4ZhttwbfhkeA7n
5kJhOOGo0R5FbMwD51hk+arRfEwM2dRo96kpa/RDvNWBEZibx5LlhR9mnmN0Y53HJT+nKv55+K8W
+CSfw/b5tTbHhhnCPAfrLn0bUo0ntPMpM4pXNpvs1ujMminYhm166FJHwdYtWjvwvMIthT/LDbmW
9oziWUg79Vilo/ryKLeAQKgz6b7Uuwo9zhpBrRoYWKmhzqDWVcwuTuZu+l4UVnQFQE8t7Doaco7q
iZG0YxmGP5HhnHvhOWp9xF+DRGvrhJUF2pkj42bWflv82Y7VNyrfB9+yQsyuVks8cR5v9F46/Qm9
d/txW9qvV/E/zQfem1mfNgKNQCPQCDQCeWBlU8i5d0DpwPst0YfzdKtnXGm/nQN86G9RE+BDI9z2
G4GngAD8B9JixhWqI7rr9cvJ6EJcxScnx8v5fIUHzvOwqXzKNYvQlWoR4zXHi+qL0RornTOufZAn
obuxZhIe92YsbqpA6xh9KmiWC6Pieix41EmuCqEKDebHvqXelY70d585O83ajE6Zt4PfPlKA93HI
teDJWMZBswunDdtkFHyGPeYqupsHqs9q1Kba55z2LVxdSq8dFg70X/pcFSePPj9VwDNcXbM2cd0h
bHBU55kVhHmP/MwufjvuXd2m+U0IJkY43sp/HHg83919H+3zDoYG65sTPszwYIKFiQ9qc+6dP63I
avosHTGe2zRes2Iy2HjpvTULr7gnB3hfEx51oWvx3tc+0oE9wz4agUagEWgEGoFHCOgxWnpv7QOc
v5H22v14evSzU4kbzUMi0AT4kOi27UbgiSCgvYtMpcLZwgzvTTvFTKLv0SEqX7iQPy1uCV/KOYwl
5+F+ZmjReBMHG1asH9qhQJvKKBY7oiXkivb4wGGbcUxxyFYOZcoMU/b5aD101MGWS5PEOKwPxkj/
jWzehzSGVjEcJBPj+eEwcZXauXDPzDqsLDOCG9uTmnvaTTWrxbpxxspExGwT1223NSfrrjOaOqqv
mB4jco7PBn8yc1lbGajQYK9BiM3m7qD6IvES8GwaKfu0Y42r3E3s2iBI9cU+vUHSn1aMMWdAEYZJ
fzqEOQf/sE0NWesRRx+qXS3uo5hnzzpsn4PIaj4iwlmM1C2KeWZcw5vsaB2c5NtCN38T6tuF/5wH
PffJqkS4954CzMQqzyoK8IBG7WNVXpLvPE+7eLg7D+ZsZ/poBBqBRqARaAT2ENh7WOxnAvvBN7Rf
n+9+eBL5KVPPpobzYAg0AT4YtG24EXg6CBBkK0XRP+EeHHNfopCTKJYhGsUJ4VppDyc0gxVbDjdO
S65iSTQsa+HLMTLbzeukWJpHRThNVLA4GJHD8ENYEP1xw8onBslA5jqxIwy6GyOq5+Bgsc8P14or
0jPloOjPBD1QbTIEdXTPUPfaodceYlgzXWnSmpFtTqa3m+lwO5HJYY9aR5is0vx2x5Y9xxKiPZ2U
rQofq0BoO5B8Y50wwaAaDXwhNZuA58+JeQYNujmHWfeRC31VFGPxXpAx56wViijSdMYr380sNyi7
e/rsazXr9OE8t4OW00Kj/t9hfNSH+8vEYa0+r7184b2cM0Jinv0dyIj5Is04ecVah/fiZ84H5tlt
WKsG4EY735N8D91s1TeasHRdfrIMkJOs08+60LM9F6cudB+NQCPQCDQCjcC3EHiU65tykvnx42M+
d/ZbtDjtnp0DfOgvVBPgQyPc9huBJ4CAdEKzifybLv0TXgE3CNc19RIbjP7mnmEd+bSUUhPIqgW1
xxjDdsROvUrKsYun9biyY/Kj4TwoL9IPMciPqWmSSDOWLGxtiNcwXuhZPh0Pp6oz7J6JgtZICcTN
7ELDTAsrWTfzGjNS5+lbLPtVUdA5h4nZ/r5XUy+Vk/gc3ugRdcDhg2FaTDgzneJ7nl24q35oH3PU
onIaYbyQXIpdLR3wjEH6wxK5NgzTaCvX15NNjeXctdQYkw+0hCTDlk3Os4oRSG3CVzGFnMe+73he
KzogLfZTY2U6vh16y4hMOczWJ4W8Z5Gsb7WY0wqB9PQdKUU61oyP7il9VkOxt2f+7kXjJV9rt7Wv
F+CrPULx+O5VXWghoDrS9riPRqARaAQagUbgEQKfZv/u7/3LoyP68NR73aIdg/OU7OPACDQBPjDA
bb4ReAoIhBEl0FQao/mJKJspTTIqS8M0n+QQX4L7zU/nOe2DTUnWC2eLNmtlT8wn/Cev7m8uM1h3
xqIF0hWqxkfmpaHoqXucq0RgVkULSz/EvYXrV40+iXAOt4/IWYw0hD/UCDc8L/nJK+f2MHMvfjjZ
Y+a48iucM+eDq2OkyHx4o92WHdvXpxllU+jJN5Dx9EN6JWtPTGyhIpNNfeG9BDzzihFip+VenAw4
ZpJVZcrnpbgGrgwxVwqsG9e92PtUPTf2VV+C3fpCTQDPM6/cu8HMNQIta0c757sUl8JpcdgGK5Z+
YBuvag1lsl9awYFR4pXxqbWJciJIznqbknmtDJfeW94rH7hW4vf2/t3pw2HFfTQCjUAj0Ag0AvsI
eBNgPVPq2ao/IeopU8/c8YTkIfdsoeVU/Y1RfzzV6nZDejAEmgAfDNo23Ag8HQSSTVpFsPgXn3/H
0evMVXhXilwYL0wP/hP+RouZkl7zadrhhIkfjvqHcRgRr7Yp9kWjfzTueoQxm16GIUcelO7HJWFB
CxM5GjmwZpqj3FF6YoGxsLa1zswJo4dPchUfQZ/MCe9tWVnE01osYNbucaA88xbtdAJS3Ix54U8I
M35mpp5LZqrzhc959azlAzYxhc1NVYHW1FhWoMX9KwnZGMa4VFyuYtY5Z3aGhThn2lTpinM/aMsC
TjMEFkhyxv8PVewKx4Q5fnJZoPBbMdL1ePUosvPBwAY0g1w54ekfAPGKDn6rNe/cXOvknGuXI0ak
cTVqidOHOxWzQSz3N/b9ZSg8sZ9vkS+p1Y3MHbfzvcKxiTznPhh8rLWX3pu60OXnXl3o6L3RhGef
Zr+FY/9qBBqBRqAReIzAJ1Wg9djyD4+iqfHmkchT6mFb+Tg8ZkZEUgN6UASaAB8U3jbeCDwNBCKB
Fl2EIThvs1TfwdMq7je8F5bCq9lR6a6wFBOtVC2iXZm3tildzi3hhzlX5G2IKN3MbcSLfEkptNgx
71UUtBnUJLRFVk2YdY6RMGSPVbmmJuSh9OLYHiJ78EoE9kk4YTgnh1RfcmtN6rTzMAccbHhebN/c
z2yqOLlmOjibmG20bk9Ks4sdO1/ZyCZ+yVUuXheE7WEx6jhmrMh2xhk29SXXd4FZxsVm+mPVr/KN
W5ZoZzwM8gHWY9U0fdcyU9k5He05D/2Ot+rkFmZq5/UN8f2tT81U1W7jorLmunodRnTvMguOVYGg
naJtPDc6CEQfru9bvMU4yAeHeBJunHa3cGQf4LiKUe/xW/sAe+Y6n3Wha1ZDE9YdVJ8y1b8agUag
EWgEGoGJwKj/7EeVHxY+ybOmHm2zZS9DeKcSN5iHRKAJ8CHRbduNwBNBILxLjCLsLpzHRLFa+Od+
T52LHliMxeLqjGT+5FqpuFiDofmBMc8ZS0yJT6E0Uf/cohVWcx7RKL8t9lUrryNeOtxsMjSTrtBa
GE3mMuncLsI29nNTYVOMzgmMkbkwoo1UxuymAsKL57unztcjXjfcbw+x8HYzrsKqMlen5/E2bJnz
wTD1WJ0471uAS7vYFUWeF2jaAOXs6OLGw1smu91a9bXN/VmErFbksMeV9msSG/I5meTsGWR0rOta
g+IWMLG1aMvSfk3mxXt5XWtqu/vFOf3DnHll3GGn/Mm3K2hk1ua9uTs71h0L6cnrdijk7ibPwvvz
dfkfOLc+XBJxF+osFPtXI9AINAKNwGME9jN+98951ug5WE/27BVcb93YVaC/n29SE+DvB+cepRH4
QSOQOF5ohlRZK5NhR8VP0NzCUiZPg43waThtOAx99lRNrY8SPr0QamHLsa/DY2GquBw2Ya0wH9uU
3msWlBM6wbJm3aPZiJ/ZSbiUyUF/Sknm7TCYKsSlWmPfXF1emTEmwlY7CXuOOvegGVFc2qOXWksf
zs0zo23KZ/hzPKH3skTpYEUfxWOn0QMl1Dz9dZhMiuy5T3hgVFasfXZ6tCTs2VHoqeqsitCDOWfV
YJfrm6sSd23fEnqtufhRnaHlDOe2UxpvPDG5Lb3azHyXf8vbfBq00XjdQX8B0GL/q4UR+RmjC5l1
VbEu9ZsLzcCFAJ+CnhGolQU88RevMof9bVQ1b7wN+803jTnGf2u8TPjjw8z+TWOUYbW7Q2Te6jPr
c2b1pI9GoBFoBBqBRuA7EYjAGwXY68Wf5APr4RftN0d6dhXo7+Xr1AT4e4G5B2kEftgIiJOYGql2
EcyEf8TDCcOdaISZ0B6Njn/uYV/hKnya87BWf5oMWOmEEKe0OEC3YmgTK4s1HidQGtMeKXtQHXMq
Md7ATb8wZ9vh0FX0dLfqwC84FW89ijgh7MgehhCSISxuiM0wXry1hdRDLh5LYwyGzXJhnDFblnoJ
GvPc3hLKm6zjiug2z8QTtWMHa1xorqhkV5NPHSu9hBkmbFiRwO6jmHD3B73PFkcrylxtVPIqPDzM
MIBkXveGsXb0tRulnRpVnTNW5mIKLXxMIHXQ7leO6Ni7UO2MMo7o/CkunQLaKL1yx+DU/liDDIud
5gYtxsoC991vtQJC/3yLPLpeASHTDx/WfdqLJvAExWY9Zd0vO6BvqX1wa9hv5Vx5LjPLV+17mnDw
2a3Nj9rRu8n2WSPQCDQCjUAjsHsC8qjym7Hr7+4J4hZtpKeHo/83ni9RgyvOqME8GAJNgA8GbRtu
BJ4OAhW1C0cyUSx+Ygq3i00NSzEDKe0XLse//ln+jO4HYYFn0mKNTrzUDEqqHecwSVqxg9mcQ3h0
jSlrqLV7FpcOo+bC2I8FkbmxvbA7xEM1xod4mNFtXAzcV+1qOzvXd+Y8VzJwWJmfZ8Xn02K+mlnU
fPHK5/E87mWs6eGMx45OqQliGTbOtR5F+JjaRaSN558h/EJ9yfvlqlN1i9opC+4pQTtxzuaNVjs9
9+VeTHUipX13uErXRk3l4JJgNX0O482nY5TdjFZmsMahxvLcdTUtcFS/ap0id803t3Rg35d4nvUU
MeGJYfh/vj/BxB0SL1AqfVDCYNDmHDQyhF0w+32k8X5SFzr68BCBPcNH/SMO99EINAKNQCPQCDxC
YOYA69EztF9rvIt6Qo0npz+tWKT8IdQFJg7/ZWoCfHiMe4RG4AePQEWihjcOJhlOUoyX87DByRLN
WyrCFhYRXuSMUCnAkJmwLHPmHdENUTSFDo8S7clhkVPSsX2QZot9RnRjHWaSoUnxeT+cuDx3/3Dg
4mxTV2SscK302bNcLJ2rwsrCe826a9bm+RW1m9HDQjOdeb4yn8ynuGdyO2N3q+fEzeRWawQr8bLl
SgR4wSVeNTj6UKw4SKa+FLBUxtEea42HOiYrthHBy1hhj59gaIM7VEGGH/qk//hEmb1Uzw5n3oyM
X3csrR6U8NYKf1HfrCCY2WoRHLNm/rpxZv71HfP91crC/I4xhu+pvLUzybjOl0cWBs5jLvmbY5cD
7Pv+SV3ob/epfYCNai/SjzvdvxuBRqARaAT2EPh2DrAefH5w1Jq7H3F+HmWldf/T3g340F+mJsCH
RrjtNwJPAAElc/qnZNjVyMyMbplXNEYT1x0vhWLxT3/azdkqgxc7UDszTHG5XBJyywmfmt5Ej5XZ
MEYc4C2fcr6UBBrVUfbds5iSiWWEu1ICw6DMD5XNG8UVB0x0k4LLT5TMyinlWrTNaMKroViG8YZU
M6Pw5PDe1WjnU66yD8kTrjhqM3MhAGdjFDscH8SQY9PUWtM3brFDywm5vtujz5kyMc/uo572UIdn
GuobGpwdqgSdKW48qT2KcMxeyTKRz0FpGNEbXBpHuGhJoDjMT44MtB01pY2G4p8ZxXxY6w6gykxP
xwKE+6hulu87w0YNVlw37Z5Oqbu0e+71TeOmcw7y/s5UNAGe+FunmHZmxFvm4p7Rz4erutMj11cz
mTlanvVOH57t0YdTF1o478Dos0agEWgEGoFGYO8RmafnnvbLkyOxSH7E5GdXgYJP9ltmz8b0MAg0
AT4Mrm21EXhSCBSLg96E9cFtzDRKvTTj2uX9mm1W5Kopn5gJXMX0TOwUgmTeKxpDi6mvSAd9sAmz
8kfSDN1T1JGfEOYwTHbiNTkU02N0bLrSkmpfufMcS9wMlmVWJr63LtVxyrZVi9jXimmHQQ3GXv5k
Rm6X/bCyvNofUVbaPUcx7ck/44nnpVkbFlmwwxoubNZ0NAqq8oTNQuFyvCPgeYnqC580hvOxOr9+
oAQUWEomrXDjMkMafzIjXRvyzHnuDo4Zz9JL7WHOg2d56FlXmSsz6kxHcwnrXhzd87r06+TM9iTf
EE0j7SvbyXlw83kxXlriVdpzr3l1ZyHMt455jdnpXvMtWtQ3KgpzKp9VQrW+E9+RA5z1+IfKDf5O
fTgX9gr9/Jb1SSPQCDQCjcAjBB7n/UbdZb/f6uO3edZUC7/TYn24ny+H/jo1AT40wm2/EXgCCOy4
ShhLmF7Ow1jymnb+aQ+/NXt5QJ2zvlqSGvwkHHWw2Yq/DduxzcpHxQKczUSrKFlaMi7nHkuj5HyM
WMxtclQzvQqUHRam2/NaPZJsh5dpn7ecS22e9vdnPdr9VKv5ZtY7f2Iz4/JohNZO7ueempop5cxr
FWFka1/HPIMWo0s1nXMcyHPJPZcHyck8x3khPPCZM6psZ6zlHjEAPxxmyKWcc27WWjL1/IZ7rMl+
J7sW6869GBhqXsyUVmyOWevT1ahYlvvovwzk/2rMIv7vvSboOqXL8s2Rgu1vxcx8fvQd2FQtsfJG
uM38qz+VD2y/K0frUZ859T5pBBqBRqARaAQmAt/OAdaj3k9qjijAey1aqN5r2WnFDelhEGgCfBhc
22oj8KQQqBxgWErYF2wtfNV0aFcROopf+Ay0x+JeqitnxyNxJ7cnejkx1f7YJ7zls+h4k9rBZ8an
yZsNoaq4aPfUweUokKvaDkeXTJ5pbrkbi8tNzCIplyAJG7TnGj38fDDAMPA505l1XAjkU+iZzRbT
Ng4VnWuHs6ex7HNu+6kyHT0ziuXkwEzlMxyxkezuWz7QyU7er/X73lQwsc01rn1Ojaho0ZPH6mG8
HiNmRcCea9wPXrrGTjzkZ21Ic0577gXZxYalOLBHr/1+A34M4ozZb/YlstyqT6NLRwEurDjhbXpm
LcBfmMqLzopADOb74JuV+PYsiJQabCM6gsZqKsCaQ9baGX7mA4+WREF/d5+4Xesatt1HI9AINAKN
QCMwEYjGm8fEd+0JvNsNOBWhvcY6e7YCfOivUhPgQyPc9huBJ4BAZf+aJRZXgWqGVfJPP8xqOXI4
OUHPtLoosgQbgdWsaj+eiuOlxnLoENYgTqZt4V2iQLAdLMD9QuSgiyF4VBLmnOEYIjyK0amuFNps
Owq3NkeK8pzM3kRWo7vmqtgswjY6y2fsuD18LJHVGjpz8VhzXrXfb1qMQLYC2u2HBD7he5y4vWi8
9XBx2vBzhjBEEN0Talxtj1bPjz5D/qXbauyTbATkv4moVN/VzivxWADBQ15MPmUQrIynVHfOTSzL
B849o9LheXtqD30HizDbpQKZeTE7IxCmzRBiwnBagxYWXVI8fXwerXtaUI4u3XKjM4pZfZYhlDBs
tlznfGp/in8yBc+oYpvxE+PxPxaMRiwr0pvz3ZH1+BRz3uUAO8v3UYv7VOrv6L9vp88bgUagEWgE
GoFHCETmrZivca4HibjuItU68gSixeuwtOjpM3KDG8/DIdAE+HDYtuVG4MkgUPonbId/4iE/4W+Q
N15DSsMSaTfrq2jksMe8+iGg5VLYy0bqZWKPo3AWfbWF0jDNn0uEHMQJriviBMPJVZOdhk3lkvyY
/lXcLyPmI1Os0iQ5p92UUq8w5NRPNj2OXq3MYeYbEp750hJWzKuvKg6GEX9aOzllRhixnzVrTgdi
aY9OywlPxgUBzwi/kN4waizgHn3cAf/vF3Lv3o3ZFjj77u4QdgdNkD6wx8kbsRsjscZBi7tNZVuN
4Y15zSgY2TrLl/ULTxneq2pbBiGvk23WzTICOz2WgdJnfE+wXX8rmEJX9q8hKgWY4exDVgdy1PpC
vhuw+tVop2fuBeN6FO17DB8eF/Lx0HhnTu/cB1ig7CvAqRf9WBOugfpXI9AINAKNQCOwj8C+6ptn
1vhRjYmp9yoCyVUnWgH+fr8/TYC/X7x7tEbgB4lA8V4Yi3W5ysINMxyMsdrNM6MK7rMdnYffLqzd
iX2YqcJVoElmoVLwzDn16gzP8GGtsKbFPCr8apfx60vDoBJPm09V3jkDeaywdImlnGe4MUpaSgG2
LzvVN4x32BdjDCs2R40PYnee1E7KdnuNYlJaAqnHLWs+RwlfsLvv6dECBRiH47kRyLmmZtopzvkY
Q32Gb+G6ObcbOWqXo4wY0EDG96Xiz4f9iUYwKWT8O2hXnTAPoQc8zmSgOGnLAVzrCP6GlA9jvrll
xbdzL8Zcat1koCqbq/JZdoIkLXz3MMJ3APvMwj+PvgP04e77uzeysGrfxbn3r+/dbj/GP3VurXhe
OybTvxuBRqARaAQagfmAG/v90jClYP/JIaWXZ5cbowOnRU+WZ0MHridv43koBJoAHwrZttsIPCEE
ivVN1Q7uAdOA7cCFrOOp8mEURV4HKxN3Mj2O2pnIZDEZExvRm2iYtqPzWLDGGD6ZCCKF2pr/FK/2
WKJy2LSRUn3dnvPk3EYJVM5tuPpqZLSOj5iXNFVfUpzKHFv9oaOZCx7SEoYW/h9rg59n1gwnfo5L
mdqqdjOaxDhzScywIp9RfR3qTKWrEy7aFEsv0o7/7gmweKhg8mDiWdeeRuF7xj9qczHhPHo9XDgq
Wb45j4XKKA6egzCXEs7btbEF4cG6VeH5g+s8+4buMM98AyDneALyY71A6xofrEXHYQ9U8QLm6oXz
RNh3Xx6u/Zpvke6fL8eaByq919MpHm4yHM1c6j1Kvn0cPJa57/Kvxu5HUwcO160+OZe5yhkeCyhl
sH81Ao1AI9AINAJ+nO1Vch7Lvp/WfB51ofVk4dnCquvHvUzgxvGQCDQBPiS6bbsReCIImCGMjF9z
P8X6LqxJwkyi5sG4THIUP2xWptcId1wLRQmfyVWhXiZpaHplx2mYcJgTUxoRHn5ixxQrpE7caWE+
lZY4QM98lHb4Jz77I1kLx4ZHyT95OL06wb0wKCxmFmZTVZnJ/K3Ozc0008F1NQsuChNjXiBjh5N/
W1p32JjnIsq31nzRe5fPj5YbdUmlK+3Ky7ndC+uTU7wOlqt2+y+eiVfhmZ6pWK6nL+WTjF+M+lMB
4jui/Xj5ZXCKt/M2qMY9n9d6AaDBfk1QNS/4JMaZHaMDC/Mah8D3fdRYrBdkxNXQ8H1Vvgnqydux
aqDbBJL+VkS1Lj8zLxygxfRb9vO98oms0QdP3BK0NTQ/mSkgD094u6/xDj5cO/3uabyPcoP39w2u
e7GbcZ81Ao1AI9AINAJCoB7ZfnBXrNnYB1h/2FT7fL6g/aZnZQK3Anzgr1ET4AMD3OYbgaeAQMWs
boaCN5mMOVjEPe0DbC6kTNSwuFBKczwdYWV+BtCgh4FpZ0Xk+tP7fJr+HJOz+Z2u8qcYLrWQJsYN
fR1HmGFZJm/Wnshk+igdR7/3o6wVdz182+WjRm8MT+N8zKvmaD3TYuHejrUmhJm7vMUNXhfF3zBC
zPNnC/2g+hbTmywUJOO5dzlOsHH8lE0zwGKwZokVgw0bNFC14gB7NKssNZhPzedjZ9ZbTrmpsN9a
mxgj1kI1bgAsTDiIMQUfMwRdlD5vw8wHtkKVC8dNr2/CuHeFbb4/vpvybXrIvPJ94IcZYZZxfa4+
vDVDru9bvid8RDsXwo3tZEno9ha9d3+/39Th1PdzL/t37zw5wKUJ1yJEzbt/NQKNQCPQCDQCOwR4
/lj41TNFz+t6+0mLFrNTBXpqv6OlwTwoAk2ADwpvG28EngYCFfG7GmxwslwTuXCzEA/xH/Oi0gPD
6PREKLoVDozuavJVVamyMipd10xPtXxzydZiYNgdn5q7in+6PRoyR9WsQkm2Ziiml+Hcp+ps0ZP2
VTHwsPHSGJNdbH6b/Yp3ccKZCy12I+y9NM+tZzqmIAIYNpie5r31qdHgwyXUl1LPnBulqsacEy6w
Eq5CU3wWls5JZppR4jNoDE4eBGQ8Q2Tc9AwjjQ+cMITdy2uuSpXm0lFBIP4b+dBjBZ/zQ2fc8CUl
tIa9G+3o7dHGhTZ2fG1G0f3Cq6AaBp71ApuqiGh/eQpbzyJ3UHY8rl6Xu3WEqMF1bWDPiL6D85vm
+asK9H4OsFvCcnc1n33HdzowffZ0YJvpoxFoBBqBRqAR2EPAcq4U3ew1sLf2qidInmh7NZ8rs4Yc
YP8J0fsAH/rL1AT40Ai3/UbgCSBQ8ahrM5PwxlXxHzJUsw+NhEQTFTG3MLqooFwCP4HA0LKqjNyH
tbb50bop15rP6KFgI6IwZmviP4OniS9tzaqgQ/SElZlNicIN3ntP9C++eSwdqwoMZiyNjk07xqFr
scAQ8CizL8XNhitaY9R86R+WFW6csfCWE+x4CHRRsTWu8ryiZIoBehRFQdPNnHB5evQ59a6Ix+by
yZBN24Snqa9yfTnnKjumdj1WSxPW+Zh1RZubc2btQGOFtxt28UMGCj9Peygi5/Y/WcSavmeB8/cm
qPIBnGkh8hl3uePgYOMMlMxqHQxhops7nsjk4u1cRbdQZbeLG9PoWZfqy+zSLhD9qbHSHH2XFV1v
NhuNvZgzY2EBz2n33ay7Q59A7VHylciRHK0/pfGmfa/Pvva7+wumbPWvRqARaAQagUZgh8DM7K3n
CE8TPbD8jNzP9d3bB7hzgL+3L1AT4O8N6h6oEfjhIlD1ivhH3YxO3MZsRDzH1HQyHPHMMBl6RiE0
GSvpD95rPhMGpdzXsCNYinvuFFRaYDKMAo2hm7mT2CYtJmmsuYpxcWDcTIl38hMHzCQjWupBZBJV
mqGHiB157nFLb3RL8oprvmGnYch7Y4VlFfvy6HDs4nIwZIwwiq9CHifaeUnSr2lecn1LRA0v9ato
mJ+auta41bzM8UIdy1sbn7prsV/snPpexEmb2inhPk97cJbn5q6JEs/oSVEW+w2t9YiFFS75KiGM
/7FgcCq6e+9eK/953vRVVW+udZN8N/Kt8HmoclZAhLx90Ke8mvlnvaPivTl3vrRWGXKP8CR++nJR
X67FLCd1zHrO/NnxHbm+RuyTutCZtjThrCn00Qg0Ao1AI9AIfAuBqvbsZ4ZWWlk21oPe/Xh+fFLz
2apvdOBWgL+Hb1MT4O8B5B6iEfihI1Axt6h8phZiLHkNfwtzC5EziRI/oSe0xI+C2T9kL9Zyrg6D
nlWktJlPmKeOrKdurRJjE3qjJ01pxTLuPmpxu1ixKeKu3Z+mZxr1ip/Dk4rO3W+hJwxtz9tSVudM
7XjmpdE9C9kJn+fTrStdLYyBPxUS8WSMywmqtQjjsLOPaum9cdi+zU+FwHjGFlccDHyHtgbeuyqe
08KFsNyNZWdejTbtyWKquGsDrhEnXwVSd0u89LyDui9cyCv3Zd4FD6EVB6NRqm/uWu5svhW+qj71
na16Y7ncSwbSw/Fk2DcYRt4e1lpA0GO+/Ix2nz3Sfp/t8nsr1ze7Mu7VhU67Bkl7fTNjq49GoBFo
BBqBRmAgMPcBzoPJa6Zb53x9WvM5zxT/BaI6FDPyqLE8JAJNgA+JbttuBJ4IAuK0phaly5nl7sdC
s6wZNbWyed0/DBNaonNnC0fNI7b2hKYoivnUrDX2pQw7JFhaorulxLHaPa4Ot8d+xOfiKrEGm0o7
zbSE9Q33FA6N5cRLY5xP3VLnVhRleVUKrfRtzj1ulFgpkLTQB9YXBXK4kZjk5bFUX36YAjOVs/QM
a4UTZtUA6utZ40tGL0U95+Gf/pF92LinKQ2Z37xqCXlk9mLBTDXcPk5m6SEglOXwyaDhcYOhmHA4
NjM1FKWpZnTjo12aYoprmQtjMQpereo+FvulZdip+OdYyLclHHgixqDhzNwL7NCHEVeupsZYtIxB
hbM9T59U6tY0PUcd+JNXLHBttWf3o/zI9W/n+vpvkU+yf/U3SpThYWeM0r8bgUagEWgEGoF6GNYz
Qn+H+Efv/exIVQ7/7J4v/lMh+wCXDtxAHhKBJsCHRLdtNwJPBAHlZHqq4oqohYPDSOld6199iIaS
bweZhLGQUyoFD6KyrmjhezNGKasWHqE39EEpxbK4rtlXuJlsRuULR7Jl/WRcOpjqyCvYDjTJtErE
jLHMD+WJjcg+Pelv4ie+x+hhgH5EiZu5pWKGc84Q+OlPlSgLa+XVVE0sjvkyqH2WmmrSJda9VY0r
2O/CGx3NyHDcyLNQo6+UZytqyWR5CIbR+TzG5866orhMJBiuBj/knG7mjfrxhYUVPceMSkG1TR2G
hbEYXa+Ma28T8CwdmJ4GtgKhsZwWI6bs3/FRRRrjZzAEZENUcmnu72pkUE8+fDp2bzJtzlhBUq/J
G/e91mHodPs8Ix14my/AcLKWPMBf3x6zZfqPPrVKUrHNU8stXXe/LnT2+7UCP7Vf6cDWw1sBNuB9
NAKNQCPQCHwLgTyveHbMKtDfbtHDzn302M2ZK0KPPecb1sMh0AT4cNi25UbgySBQWm6YpInGjh1B
OxPfGwUvjNHnYoAhLX5NhHAJiZbvZMc8NrplaG1Ux7lFUFTfRCnPqsUy6xb4LSeigpzArKwNJnZX
Rkx66zWM0eMmJ7aUXnO5T84r/tb9NbvwNCwvHM+8rRzUMC40Xj76zJLvZ37rmpCDo7p/aa2en1iu
HdDc3TMTrFxoI6z2QQjldjBJHwvLRfzMTuXbvApTsFBzSCFj/ly1u/bGjQKsO7UZ0cvxk7sJax13
JEYingellPXK7IQM/gxvU227Vj3mPQ3OkxXz9eDW+EbXfG0nknVmrcO3SffX7/aV2OBQfeZHmQXt
+e7VZdGc92s+l967r/Fy/u260KnquT9uHOmjEWgEGoFGoBHIQ9CibtV/njrwXov2/s0zzPnAEoQ5
EmG0i2BqNA+CQBPgg8DaRhuBp4VA2A5HtL5EtCbuNOfJYkVO1OH2UEqUQ4l4ERK5NmxqgkdPa4bp
MD+KZiv1dTBPKaVh3VEjTQ6LBnughNdGH5ZXa/fMWO4ZTl5RuLaf4UqHDHMzl4t+mCrQOoYKqlju
rWFIz/yYay1XknwXJorJ+I0nhZszbDU/O7Dj+XlrC5pCZm2Usr4guh5uHPLJ8cGdh1fBp1rCb+Nt
+uQVn91eWb5GldxjXQvy4cAMyqx59b2ILp3FCBn0RzUXzqczdj6ZuqWZz1kEczCMP9MrzyjZ3fI2
lr1OMQm/znEPbEfOub429Ayqa0/M15Y+zHn89zezLKeTEebko25AIqL9tRi5vuO81uPDlmdu8KPv
qoftoxFoBBqBRqARyHOogqf0qK0Yojxn9Rh6vPfvfLKMzOH07+NwCDQBPhy2bbkReDIIVGQy3Mfs
RYxlVYKbuNbQJE+2RdtETlbWR02lxDbR/fzPfVilyG3IFfmfpjcJ6I2Ipxb60w8GZV6d3FcliMIw
TWGUhQtbM3FVvg00DMsxaw/pLFblQZPdOmssqTOmeOVC7Jhkzpjnah+kS6PQx2wwOnDYF6+Ivbi8
gv1yjif4rDmbtQ7WLbZl48nsFQL2RPyTiyfPNDI75ZbOsEqjEY5dr7idngYn7SXM2iWNHh4Ie1xr
FK0XjJhtXZV4Y26f58Ulyr8FZ15zm6JgY8e3QxPxR+GoFSatkX2zaDe2iie3V4lj360s8Cntvr/y
1nZKncZP24RvawcsZsqIvhd19w1pRsSHBITL5xxu12v+4JjexvNxeBvG/ezfct37AI9paB1ht/dv
anX675X6U2Znrs8agUagEWgEGgHx24X+/KiHIecVYVQPu09rPutPgWT/ehG5I4wO/R1qAnxohNt+
I/AEEAinEhc1I5JCaEYnPmN+KyZD3q81uoqXXlv+5S0UhU83ledZ27SG22BhMLRolZNnMkSRnLAm
fni/NmcOQ4a/mZ/ko6SqmnOX5hnfKkZ34azX6JBRKfE/5/DMMNvw4bA190wOqvgY/JBZuE9eTxZH
nxPwjOrr2RVT5SP/iJVZRxX/tKlSzk3Msoet+C2v5snF4kxoa6UATrga2ynbZvFzOsR/95S1AGWf
ZSqskkFph5f6048fRLbvOUH7BUMu5BUnjZj2cAKfWAh59iM96wvycDD/KPA7Tu7Lo/3yWK8o8fF9
EP7QaftTkdg2W+w9TJhrjQBrHOqfe4QDmZRvU6VS08Kn+cmNHpy8dHtuKC2ZFD/jcCrvrPZsIV5/
eUQTFu/9tibMR8nR2rezs9hnjUAj0Ag0Ak8dgYoVGnv/7qKHphr8WPXNimqeONKH+/ly4G9QE+AD
A9zmG4EngkDpcmYmIVpiLJCJcEW35Fzs0UpgVFAdJs91DkWxZpiqUdFLy84gkBVdvIes+B49TfmK
wfLWNis22OdivPYQbTZRyoqCNqeqDNW07/vJOa6OFvlmEiVv7XYU74iN2IH6fgaFhAOjS3t0xhJP
C7sLUbfiKvbr8xC2ydNiJ3m5kwFqLitPh8bEUQ/EKr+X/mHCZqRFAo1zes64aMU8m+uK/fLKsxYm
bE/EoumfOYarm2mLwZrt59bkkE13i+flD4a8slAzMgPfqegm4anzvLvK/es2TfZOn7Df2ZNzWmgP
ffXQeuWHifCKD/jGK+f0iW/uLDs2KKymBS+xe1zY7CO91y1pr8l+0sd49gr9BKdPGoFGoBFoBB4h
MP72qCeF/27Z3+P3k32AxXhHn6jBjedBEWgCfFB423gj8DQQmDw2aqfoU9gIyqG5EEd4ac51bMxM
wvFMWioyFopiElVBy+ZyYkFpMZkJn+GTYnoMZ24p6hXjq9JXSzA0JyzlE2rta+Xb8Cq7BD1SesN4
w8EwG66Ln9ixh6Ul0g6fpAWS7CLPqL7UuyJkl77F6kPGMgsTUZRwqd+emiowm/EWPp7L1GAnA5S5
dYnYO3Zq/pZM16rb7HmF6wpDaHaGUA+zbmbtqeVHKjSf4L8b9eo5Ru+tWfMpHJjR6Yx7sZk7Mu5m
0oCj81eUclqCWzA0IDt1nU/X7hNGmu9A1iPsbTKEdWdpcU+todgHkXB/OjXnKgTtiUT7jVItC/Tn
y+Z56cgcjdnevr6l/Tq2edded82r8tGEzYSrT6/QB8c+GoFGoBFoBB4jkO0D9KCpJyaPv+qx2/X3
Y0USzZwa7TEwleGG9JAINAE+JLptuxF4IgikBhVHQmRDEUPAxId9rmfAapBJCJWVQOmK9DEVFLeh
M9yG58RgpLKzMpOBuZlVzvOTcD/rq0marfBgSNTeuMpQ9aeVeWuvVCeZ11yCJ/THGkwpvA6DtHMe
Dsb5QgPJQ+bIOe+YY6i+45z5vTo9+myj3Yw10OmIdjZ/C5HzLM0tuTaUjB/cC9Pm3G6oE5+CFefg
wLh2AyW2Fhfiw3qsLPixqp2Ew/TyKUbC/fjUQ9QqA2Q47DfscZ+1+kJZgMBzg+yDMHFj7kt0YN2v
sNCMApKc8wo+8OTT4rHyMBZox3kPKmwBJ/ed16CBw7xyjqtYsG9hy/oyxL6P7DlcSnXuYBCLMzk8
YrirII239KSFbtifPUv73em9GXfovZXrGzU4X75i3e6zW80ZI/fvRqARaAQagUaAB0RCwPLU4KCG
4nj0VM1nL8LOJ0vFPD9WiRvIwyHQBPhw2LblRuDJIFB5m/AZ870RWVpqWxJld5yNDuEnVhrhVOIj
zobdpZjSHoZmPin+FpbIW+lzpQDrYz5aDH2VnuFO9KRPtL6143jp4oeQbMIq04dX65nFuDJKLMDZ
Ji81acyjqrhlrLmRwSHAxDxD/yZHreccjM78TdqhyXMppVwDM+RyGsfs/KAscTKjyIHEbMPAvbKg
I1yda1fuE5uTK4a3+9r5KR1K6R3Ks+Kfjdvc7zejS9313aka14wVD42VwM7onru4rvHXvTNv1OvK
fZiIaWetLICbp59rk82bORbzz03M3Rn3Tt+icOYRrR2Km5asPiQruFYTfK3U7HFVKeG579yLWPbr
PGYOMJdpxd6Qch4d2Ev4+3rvoz47yr2z12eNQCPQCDQCjUCeHTxQHum9o+XY2m9ii9In5/stjeFB
EWgCfFB423gj8HQQgPOYjYQDFxM2k0xocSly1uWGzjZ0XXQ5c0WO+RoL6Zz2YlAlfLrRfDXR1PMQ
X4JfwcTMojmkdqYnP4uK0d35aS6648xDe6xV223VHA4rLs4D3aWw8+poieqLSVMyZTWb+8kxe67q
xx5dUcfhhMZBLMsMsAqAGZNSU/fQq9nZVGx+8ppaUFJNDUXlJIcTepqix2MdYaqpibgOb6wMYa43
ONLkc54RuXwxIsO5hHPM7mUga0Lcu3BaruVTWPG8+7YmbKedzGXe1jBkU+XKZA5PZoWC4bCc7wOf
+iQoZXGhvlSeu9YC1vqtXG6uDc6xyStO5O7P7x5+6niUA5wIfI/Inyal9KYU554m/EgfbgU4OPbR
CDQCjUAj8BiBUneHoisFOJm9exrvfovO2XN+VoHOE7+PgyHQBPhg0LbhRuAJIQB95WdllgL/gXhA
N3iFikALzTXEAyEnaHThS9Abq5pSeuFseRtxbzH4MBZgp1g2h0z9Kp2bi4Ya3ZsB7kiUyXZYsTRJ
W5BXscmVYZ5ciw82EiVT5+ZO0Y1zXpIsPWF9WDYlY9CTY1e6Oj46MeMqjuTJyr77MwQVlfVqZ6JG
hvGWCh18/BrlU4SKS8LxGNGYaC7rIqVRUEVrbTkETP1jP/PCDv0j9notoBg4LZxboZUGbm+LZ3KJ
PZHnvjtJyt2x31g2elJZw/PD22mh3RbkCT5zeZitva1XhjYjLfXYdySRzMXMbbDwH3ck4BRKxl7j
MoSv1fQ/1GpCYsVl7cOIzTY+U22OJK4Dm3U80nuLUeOzAtVSF1rnvju7HOChD+evmWmqTxqBRqAR
aAQagYlANN5SgHn8fFvd1aN8pxLvtN+9qxrPwyHQBPhw2LblRuDJIFDBxuZCUeFEGWAjVuqgCWF0
0EUISYo+KAsXfgJxgheZlkR/EyXjJ+wr3A+2E0pmGiYuymvOscY1ZmWlamLTY2WH2GiSMVsxz7Fm
C/VqSpkIbY1ovq1zWmZPriL7lCLPbO3Lz8PRZ6cWTWk0EdO8TPak+tL5wbsKzbFC7HEMBohvTNDn
hUDWCDxHyDw2GbrYvilWZRRnpUATHqovHoaD+ZJJ8FTV2RPJyoKincOHwYRr+W9w7Kom5bdRpKPf
qmcwZ8CBibjrysw8/PPUU2BcM9scwna1l99rKMQt6ZO5+A7WCgXfEHPguSox1yBk03e8qoXbc8G1
9gmv9lA+0A074cxYy4hBKeOaY8sal8RmORt/+KbOfYD/lN4rDlw2SxMmFrpzgPdw7NNGoBFoBBqB
Tx8upffy9Moev0MBrjXW7Co/dwDmU/43ezach0SgCfAh0W3bjcATQcALmaXTwkBQPovnjHYxDZiV
6UedBxooClQqvGvyFnPFqJqREPdjgaTr+tJSm3nja7mo9EM+owV2BAPMuS3PT3Ou/lEIo1KGRw1r
pdPaQw1kfovv1HnmNTWZwrRLUTTvkt7r15R/zHwrctvtOaqCNIbCh/nIawFRHasUVihfdMj1sBbW
Z0IrO/A999ELMHpEScT0cTPn+COpktl6LL0ybnwLzvHcV5USnqnlfvk1MEZN9eL0QNXGK7831sJp
M+tgnvNxlfqYY+eoeIExeq042FQd+c4Eas9IBzjw9cCyX4VJWC4fTabtmSaH2VquLfjyObrPlevr
a+fev+o6aj7XeTRhH6UbtwI87lD/bgQagUagEfgUgfGg2eUA1/L/p6pvZf8mvIsHTFeB/l6+TE2A
vxeYe5BG4AeOgFXBYi+cr4bmBuPYji1/4B4hNqZJIi0hqOYU4rqmLmJQcC3HS0eWLN5iCpd4Wmmt
41rpk4PBMm6qaoVxcUT3Sz0tcbA9tla8KAwzr9inJ9Y8rlRNjPtkweZGhD2vVOQZ+3SWD+i0Y/Tw
Uo0JJcuFsWmOKu6UiTMdzzdSs4zjbTgbnsfn9DFVExr8yow8RLXnU3sbGKuaFGjnIerhAq8qWptG
htbO6GUvRQ/eOKyJQ4Yl8mluUy7hJCsRWMPDYGWbulN4mLsTfsurR9cr7eGiptnyygiL1oJV5phP
aeHcdjTTOBzchlcluOPMysp/viS5C77XuWv52qgdI56Fvp8c/rTWLErLlbrLjRw5wNkTWOvwVn1L
Ex59Zr3o6mOjfTQCjUAj0Ag0AvsIfLvmcwKO9DCLDmw+vDsfQVKzpfE8KAJNgA8KbxtvBJ4IAvyb
Dhsx8RCTgfXBYM1nYCVEPnMkMzYKcIXyQk15G8IZahr9cCP+lh1fp+ApYmNrYlw+jywsfZKhTasy
brEvc0spn+tqufdYYYPqE6YNcwtf8oNJynDcYAhzHHiv9jdaHi1Mw+oRxYieVLqJo6G1OuEWNli5
uGGn4a62X4SfSzxoCZsbPxB5NVwVn0zLh+LkGia8kRn5RLNYD1XT/Ba3NTQ/g/1Ki/aaQinhYX1c
ywHDjJNGRrMIMmGtGQtMYKeendyOt74d3IiH9WD48Qo7YeA5H1w36q5wZl7huh4rfFjs1/NV1q7d
1i1e73Kqi/RmvvFzzL30ambh4Yozx1XsY5me/lQHr6s99dtj+dhpuei9pVGPms/RhGdd6OjD6MCO
fO59gAvB/tUINAKNQCPwXQhUDrDjibTAqkdY7Qn8ac3n8TB6lCdcz+sG91AINAE+FLJttxF4QgiI
wIRYwmHCKmGSZlDFhPmnn/bQsCHQia74reRfPqI9b8NFtUTqZwaUJiQNHc9MrDJ7M1xIo/tMfTWy
rXywhSilJ+KpZkf2JHnF4jnmZsWdILFeluWjUn3Nz9XicVUgCqMmkJFYa3+jGA+jC5P0a55h8jOU
LK66MdJlfD4+LT+zFiA2eLqnzfKhO09luzg2lu28fDD/3Km++Om3u1eMrEpZrdjpMOoYT3/jEPQi
rgpBn0R/Vn5v1P55U9ynVj0mv50I49XGnwaZsNzcnfTJTIOqb26xWd+16X/WTUpnjp+DXavyNvOy
BSnzY6xMRDZtJysIOtm4xYc5eWm//73z3V7B8kTXdg5wwdi/GoFGoBFoBD5B4LHeqxXV6L1WgHWe
ms+jRQ+j0TLbG9TDIdAE+HDYtuVG4OkgAJ+BV6D1mbwVxzBH2pGr6H5psfqX8wiDIhW5NgefmsGm
fb6qBQVSTxBZS9x1Ckpz7EyFhVo5TBTxLjo3zI32DGqXJsGWTVOv5eros4UIVMVCj7mkkFLipbVT
bNg7Jsz55UM+5UqPnjnqmEwsfgLXxMcrBaV1e15YUAyz2Xhs7l5pMTI73ruubFj63KfdAOoq3obs
xavMGq4Yn2eLu9Wn8Rb/ccljRUelWXiOuywL67q/GotPPWKxXOOT3YwqtzlcN9+B3PQxYtYgxKI9
8tTAa9ZuLAY7PK+VFH9J5Coeeqyo8RUrzh3xZOdMy05uxDhS5znHrP9cQ+7Vgkb7dbfSfqMPzwt3
5vqsEWgEGoFGoBHwA8UPu0c5wH52f1oReq/Po08bxUMi0AT4kOi27UbgqSBgLpr8W5GTVYmf4gmr
wcTgHdb9ouapyrH1TzXS3x9FXy151p/CO8LcQjLDYZQrG3bnT3WV26saE8zHdoplhTWFj9EnV5ln
ykLcsIYp1Zfyzoujz5GLvddRRL6aFErjuJ3ZW6jyb7kW/jZHDG/nZ20aH7rlsdTHtLbyh00Co6ZG
2S779kocbW2UfEnJ4z6vKOWc0xmE8WdVkeHCgf54y+h0oRtDmAfSLHYdvurRhUzm7hZp76uKc87d
kVemi7qWPp6a+Dmfetxi1ONeVPwzfbgLMGRefb/qXtjmjFgWbmGj/gKU54xIf4bm0+AWuu67H28r
OiA42xNV7Tbama88xzfGyoiYos9A8pMc4BSCDgMfeb/7ub777TlfPFtor+B9Ij2+Gv27EWgEGoFG
oBHwArkeK9J7/ZCNrsv5pxWhRyawQJt1ofv5cuDvUBPgAwPc5huBp4BAhFlxJGgMPyY2+qccBmuO
VPHPMBOYmBmvmC17BYWTmE+K2MCpQiA5zKlgoeQSp+5U+FLJyOHYcJvB3MRIoT3OEA6/TUh2aZJm
QcWKc5WtJUJYzntno+VSBFi81C6IuTEd3uCtM5Bx6d6JvspDzih8CKU0r5tx1Lp4VSw99sPKpDD7
rTxZezph454FubXikwxnD5W5inu8pWd4r6/KcgBvFflMywf1rCrQXOXG7AxkFEdebmxy+cBEWrph
13DBAcumnXUHsOA+GsXsd6KtZQtz7JnTW7yU9twRYxsFWD74tgptM1V5Ypt6pQ+Dhm+PezQ88Jch
E7dPlWkMnpy7PRp11ObgL1QxCP5Ytp87Iu0vW62k1PK8QNrLAd7pwJ5FLd7v14ie+cCtAAvrPhqB
RqARaAQ+RSA1rkrRZU/gUdtZucHz3BUl0jIfN3Xez5cDf6eaAB8Y4DbfCDwFBELbiuVO/mZ2VzWZ
ISemOhLboCgQTrMXvZqAFcGDyYTrmsao3hJ9XBNr2o8IWRovBgcHlp7pt1XzeXKwUvZGzK2pVDh5
pNETClwtjpanR4voh1TtMtmrbNWlb6BjaxX2nKtiwRy+GFpmEd/o7xPBks7L0k6VS4w/tqm839jh
jXkjLVNlFSG0fR2x7BcxbVNH7e4LtzTlq+jlwQkDkXDmlc5Ly+ywwVBQpuAZCf+wZXDLQNPhuL1S
g27HQGwXz0x/+HkYpme302bzTTAyFeece2Q/EyteurGd0bkBKc4fgpqfyaLtWmFOh1wVMDnBT68p
qM/8Ro1lgkIvHJ5rGWtOVjYf5QCXKu6vZnRm/8wSJjrP6MkBTnx1H41AI9AINAKNwB4Clcf77Z1+
9+o/l0qsZ4keK+QA5xGjo57UjemhEGgCfChk224j8JQQMPfYibeTq4TV+G04YbqJJYafhIrAXnhd
+JwWs031zNtY46owqGFQlaLHteJUMLEw0tG/2NdsD28xDyzutHV5Z7Y4IuA5bNOeRGudbiMholQP
90t9TcB2eYhv/HCEXO3NNAxKw4XzjzmmUnEY3TySVUuDPP9gjXfgUIyXtQBfIlU23HVgIjuooNZC
C2f7UysFnlEwL6Nri6UsN9DOq+EdscHjRmT4yfbpCYH00DUp3yPNYrOLbS6F2bS/dGM+5SrPLv11
MJzbyx8sMxyvtBvAuJrvT0Wb51pjuEPP85pH7cBswh+SnymEjSe3fP5hEY13N4rOs9/vLtdXYx3N
GtH7/bN7cB+NQCPQCDQCjcAnCJSu66eJFte1Zj2qQKfYJnsKoP36AVSv6TNbGtNDItAE+JDotu1G
4IkgIDIWrQxyMphhtjiq0GiIB5+u3GICk7RP0R9O+EcfTgUzWZUcGmXyGGkRgmcaU5Wfw5eww7X+
iEHvo0DyGi4XthOuyyv205O3vOIJfSC9D0efP9crwm9qICvymc6DHyV2l+cUMdjyLSyOcc3TKos4
nCqT4nU93ma+vJoZTtU3fEnXxttcaK6Y/tKBrSsyd7V4LhWHzImhiPZbfBXPMwqY8GoOnAsTAKxR
Bs+UEO25CyVmSvtE3m7sJhI8N8aKm8KJX3ejGJPKKHZ7op3VMmYkxmt2qjrP9Dndyy4O5vZB3wS/
anTPWp7Ec64Ncc0NMtQRxuubRkvWQfLF4FPfoyrT7Qsr/pw+43zItnPvX1/v79L+3r80sg9w5RsD
6eM+JT7b3z4agUagEWgEGoE9BB6OnQPs50jyfnU4Uql2+qWd/6UitB8ou/bkD/dxSASaAB8S3bbd
CDwRBBK3XPKauWtpm6Fqg4sqx9WMS7QKBTIMJ+Q5/9bTwWQkCq3yWmE1JjbKGcasyaQ4HlwLUmT7
J5gaXLFiccOEozduRs9IhRuJvZ+xwe9KAcCTeTJsqXnxcOuKyvhmCqo9jRnRo9R5HKOnbeoIixs+
izPTH4bGKFYsq4/R4JBWGabnURQF7T5im3zit6Lf7DDsRp07w1kaLAh4dtF1M+6MMVYjGBqEqgIV
dopl0ABkjHDiTGb5BtfNRLgKyz4RDzdNVf/Yz4i2I1TDgcO6zbHrjjAKfbiKV981vWZ00PBVxVfz
9cBUcLO15DDL81j2RMKB5QOXuKXAp3908sDrmxVt+RHdpX+8cp8/Gj2dld67O/+2Jkz951LOR//k
ANfNiqU+GoFGoBFoBBqBPQSk5PrhNPYB1j7yM8IowUr0GPnAI9xptNRDrSE9FAJNgA+FbNttBJ4S
AuFOYTgcJsA5dppnWG60XDiPPwrvFUfyVbrQnE3kjXZ6xtRGfEwc2Bcqltj9K/7WPZOBvGuBRy3M
4iIh+qqT46PPqXTFFkcWEp1vYxpsZhvWLfa1NOe0ApwphMVpRCYY9jV8iCfxPBYgWlW1K7MrZ/3p
aqT10r4ds8BmRjIyFdW8KoacUF5hYpcybvFq3sb+uGqiXVHlTA1OGJwzO7iuPUzwc+arWl82VXOx
b2GSYrkDw7ITpv0J2ukDX2XElV85t29ZNRBIjEu7R6/8alo9Sq0d2KvyZNoJSgYn1gTAuKeRwWXZ
XzyhNJH0R8InJ6uSkbmz69w7O8Wq/Pi6/rf03rEYv9+nV+gnjH3SCDQCjUAj8AiBvVxf/xWhH+m9
MN4EEM2WT6pAu3pWP18O/XVqAnxohNt+I/A0EKi8UJhYqF04G2zEgp6IWQgVb004lZ4aLkdnuI0p
pfRVq3zFi/jIBqFtxazCkBfFc0p1DOOCG8OLYp/+nFsv1b4+2F4o1BnVFw5cOzCFdYc1RdtEa4UK
bq08M8SH0jClRq7dwiu+5dVTs2m/ety8LYbm/popJx5FmvYUMHNhEMjo1kt5FYOj5we/BjTTS2m/
9OTVMCZ2WpqnKaU4od0oTECAxrRzuWeUfGAdXEgL1xoxjRiDNPpm1XrEevTJuLyG5XKPeGV2WXHg
1fd0F/Mc3ptbP8wmRrpuqOe4mwvna0+fETOLjOXp5+tUEddWwrVsnllz2BOJtO6Wb115Swca004f
FO/N0R/I6PZccjjhasq58/y/VRda9nXXsrrfRyPQCDQCjUAj8AkCXlp+VOFZLY4nmq/7Lbs8YT9i
+vly6G9UE+BDI9z2G4GngIB5DrsBhe+FWIpnuqWScjk3FREL4uDc/E1MBu4aOhR9OIuj4VfmjcoX
XQ7uZK7LMTlSVWCCKcGEzcdmji6ZtLixZGtf6jwTLI2SLM9KoY0CXP44klYb6uJAPFwVE9N5Rqcl
53TFkDvUOaMzwbjKjztI7/X0ayGANnueY+enZxpTifoW1zVbY/qJhRYPtA95VYZwTIXPewhhlZWC
MFI6YIEWzzesVdsgxf/YYQpYZr5ZO/AUNJx7KmvXs6jsX3oaH61B+I4UH3ZPjc4ro4QVewrJl86+
0MV+PYQOT6pm5LssSBnR/asuF53DNu1VVbT25fqmrXWiJZWgET/tfIYIf97txrw92jwc/eGhFi7G
WoVALJ8NqDXh2fIoNzhrJR699wEuKPpXI9AINAKNwLcQ0B83PFn438jyja6rAs95iLhdDx3XfNan
LNCPKtCN6KERaAJ8aITbfiPwFBCw5gY7Un6s6R8nYguoixHlLOiJL0F8OIFEcc5Hi9onSVzU7emW
5NWqCJWe2zJSrNg0OxaKj00Fko64wR7C/CbdF+0XJkYjdlZ6zbmO2MRtGswzy4HRHh/E5fixzVDZ
ynbmPLSNKbtblO1otjpM3kLsQ6pZI6hxPU3pvbyauSnFl85DJc4ev3GzlGo4nv3RVdj0XIKGDnPv
2gPZ3E9sFnB8X2ZGdM3CV5QGy6fDTinwmVFYLm6srbLCLe1eKe2MC+9Nu9lp5QP7Ds41hQp0Dxf1
/dpJ5QMBLTowil3NWoa+GwGclsF+i9UnRgA7wS23IGj4WrUDVMCPhdg/Ovoj7JeSad7mqnrspfI6
szdof6cmrPbMYr9PYs77aAQagUagEWgE9hAodZfHSVTfvZrP9RBxzef5QEmf0n71l0OjeVgEmgAf
Ft+23gg8FQTGoqZpEoqf+RKHyAZ8xj+J+C0uylkYo3mL/rmHsIW6WN8rhhxuFu4UDTCMaCqNZrCl
Bs+eR+K9+jH15acUSE4Wg7UyDCqrSV3xKOuQRWKjMdrd3XMovGsQTvlvn1U7mnNfGxyi9GrK26Eb
77cvKy5XfUK8J8N3txrR/oTlhpFGGy/caE/P2QdrWKYPPeN/7kLs2LdglXGr3cy5Mm8nE/Y6RZYk
ymZYbjgwvNdzL7U53NWjFI8NSjBkPOHTXBuujod8yquPtGuO8SrtdLDNRBCUyk3LmMtkxVPM9fRq
XUNzmb6lnbfHCn5mOAjw3vFpDnAhrCEf5Qan3Xx+tg/8HxnsN41AI9AINAKNQPTeKL2p//zfqfk8
Hi67utAN4iERaAJ8SHTbdiPwRBCAw8BZpK9ChIZaKAa1UL6lGA6chB+OKIQwT+hQeCA6HlfRjXP3
hHfdm7BVjWJMmyIWj5rnXDLPucosmusIIlqxuREb/IaRYja894MZFNbMuyhJTcavwozDgU2kK5V0
XWqwPF/bc1PQitrlertXlag8i4wu8x9s32yt8lQz7mZokolzNg7KNwY6/3C5Vn+pPh33zCErS9YO
RDFOLeXk3FYdaeMs56GLH+yG7Qdt9THHxoLwPHU7+NOB4XxeswuzDR/m1dhGQU3J7kI7LWazFdyO
w/ZH/NDuFVfHMm8zOh4CYDA0D1e7KWtYsfwPyPzYchHa9Pd05jqF5oKF3Agb120yROU/b5k7r747
tK/XJf/SlxFypJ5z4SD/hXuKc8qu9WHPa/ZJbnBpxcNM/24EGoFGoBFoBB4hMPJ49bzIU8Vq8Mz7
9UNtr+Zzgoz8EKr9gRvQQyLQBPiQ6LbtRuCJICCuy1TXpq8oov7nnjxVOE/qMIu6mGqWkknPiJDw
orWrMZsFSQmkkXLNfqUtdY+nrviId3FtmJK1SixT44pE3yWq78o24WlcvhoZoeF++AYj4jfDhRib
ckddDFGP5ileZA9zlVrC0Pw2mbc0SKx2o7KXefUoxQbz0Dvd8czSMI2MfPAUPn5QrwjRpbiO1QTB
wiw8x+T9hnUXtvazWKjbEzZcDNNTUP/RSIMYqX9qucG4TbYJCxXmmVFAwD5OrootC3/4rb1VLHTO
vRZQKj0tGMQ+owRejboHYL4MuadGTACunS9t2VX8mQ6+KfoUN/KtMCZizozIq6+t+wKY6eYv0tSZ
61pqeq8rLJqxWF/4zJfixMfaldE2R2PqQqcDDmmm9ZFaHI9QuvGuuc8agUagEWgEGoE9BKLo+qkh
Zqsn3dgTWA9W95yqr1v0uEnOMPsGj8dQY3ogBJoAHwjYNtsIPCUE9I+86UoSV/b3H6oYVz4LsTHN
K+HONEM0Ldeu9YbT/YjZ8DQiine5oFYCxbtKnVP/E9e4Wlj+hZoWf2FEmBimMcKPBU9UX2mDjBIm
5nHl8+TwURo97qMnENbNu7iw4r3DtTy1YsuZRSyMVw2GNa61rqvFYKud6mOOnerEUaHVEo5nNBLh
7Mjbof3CFdNOC1STy3Ep/qenXQqGOuIJztMzM+IcTpv28OfJNnMVn8ZOxhp+Jiu4/Ik1uz114Iq4
xi5DQGjpYxeKmfu+R9kux7AfTwxgECvemzUU46P23C+vaKiF/kEGU7zFf3dTz/QHQz7l3M7z9QiG
fxyrAeWB5V/fmKjBseH75Hbrw/t6736e8OTMNXT/agQagUagEWgE6vlkKWBqvFP7tcorjVdL3n7c
KO6ozmfA0VCNG81DIdAE+FDItt1G4CkhAO2EVa68p+5i7NlrqjPjlielVGVgczYRFX5SoSrqn5lY
RTtjajAiMTT4DITWfGzuMQvtYVwEPVTfBUWe3a2qJZvwlE5opgTJFKkxL5JluyoGlas4X7h/WJCZ
VRhp/WDQPaP0plZT4qszzTDP4mZmaNOTop10MAkXw/RE5msidSODF4M1J0xVJ82aE1pgjCt7HgyX
gxuH84/+mcXkyZUzjD94m4VnY6gq0Ga/xY3DhzMdr0pUlm+maKYanV/t4czuGQ4sBFaV0a23np1Z
7MDTU847teMAdnwX4mGukk3jE65by+RmsPrhet+ahD1H364yY/mUce2M8PePQOXr4XO+Klx6Eh88
Lef6zr0Zd9rvrAVNn/29gvdyg/eV4Z3FPmsEGoFGoBF48giI5foRqZhnV4ROS9V8RuP1PhSzRedu
ycOrFeBDf4OaAB8a4bbfCDwBBKAc5Poer01RyGI1HxPBg0NO/gYF4XxrggkX5R966A10hP6wvvAW
3pqnodNWtDN2worpbPvJdxWxOVai75LXlamOTaWmlGpTMQz6JOZc90hJtjhgEhX9s3b3Mb9VAurG
rIzX8Ctz5vBMU6hdXatZD1l9bJPsYsUzhx9y4EOsrZ1ta1In+m22WQowONAYNOxA2GASVmXZLVUh
LKaY9coehjf6qrkioLrQOGP/61r44SCE8Us5yb5B1XPlFk+2OLPvWviw0A5iYbly1OeMzrj04b6Y
qariF64GvdVQsD2XRF8Xzw/UGcuzLgYbRm37QTsZwrGm74nRk5PxbfrPVTgZ/w2mPs13yZ0VGgDl
xv72aOVZ5NIMFSeGxqvYZn1Sem+15/Z4ef6RPpy1gBE1vTPXZ41AI9AINAKNAM8kNN6h6+p8r8Jz
tT9umX0EXu8DfPivUBPgw2PcIzQCTwEBKYSw0JVFNfMisVAzEy2CwjzC66zscaKo1PHpCfzTPKc4
FRqdGVE4hvhMeG9UR9g1gh7Ud+ktjmwcS1KeLYomPlksF1Z2LDaux0kcwGa4NGPlNfeGnnjlq9SN
WUSZNAeOishHPM5K56TFZuUPP6d1XpHDuJGpYTYj0sfUl0H9zDO3dGNpvLxlxPTnlXN8gPUFVdN1
zcKXpGd4vheYhyoehgzlc5+i7ga8lFVcyrwyFrjFB4NTEdTGQf7THnDwwRw197H4cD5FQ+Za+1AK
tr3aRYbbjYpPHniG1WtSc74GWT2Zsj2Jvq25ZEXA6BVLh2NjNgis6kLqXZVu7FWGipz35SSEw6hX
BjCoj2On/UbX9bHbB9hf5T+lD5f2vjPWZ41AI9AINAKNQCFQebzJ++V/+uNhtydwznf6MA/j5P3u
ZwU3lodEoAnwIdFt243AU0EAJhm+Cg9hzqaFUuRyPllH6KIJYTJdvT5anEpKKUw4duBIYTixHNYK
MXOoM8zoM4huWNN8dc/SIfmNNkjG79pMafBnKYRmbqWy5vbkKryNBQ6umk7vjZI80oxYWbi85ar0
X5T/89pkF6NmawTLkppjmHB8yKtnWuf8AhnIWF7THj/DSzP68Kqilwdusu8M1uLzzNcX6pVrt6VI
B9U5Yhhj1OBqZ/SFd9xlUswOD7mzYb++fRWpzqfcDF5tX6PQh1H4YZpGW5w/DNkzmmxWLbHGuP4p
VTl3PHZADAsTDfsf/iwcPOsgKUz2fNNqhel94gX0lmUN33rCAYrYl96byLTvzPutdnK3vDqwrw8/
ui/j/vTvRqARaAQagUYgD4iZA+wzPa1mFeh9fXjXM33ma+N4SASaAB8S3bbdCDwRBBTMnKmuit+W
aholcytFV4zFn4rH8pNzFDxfGwVYlZPCZ+Ab8JyoebRAYJaudOUNfhcmYKXH0sE/HOFUdIbcqbKU
CbNYK0yJUWxNj6UwLniR6aJ+eItpOB6vOWfE6H+cmz+LoWWU7dBXw0j5hD40TtpJU1joyqsAcDC3
pN5VKZmxZq/2Ofwkk0UsmZp5nfqYYe6YnoeOP8Ao1X1Z1ZulAPOph1aWb7Dlrd3gNKpyqaw+F8LG
QQiM+epac8go0roX+G/+qfuLIbPiXe2riWQ8C0vPXQBt7NBiJ+Utr1jwfayaVZmj70Kp/bk7XLuy
Id+jaOAV7WyGn/WIihTId8aFr8p/z53vwOfQ6W+JwL6DytEyy43emxZs1vl+XWglae3k4roF/asR
aAQagUagEdhHYG9f30e67uNa0HrK5H97VaPneSN6OASaAB8O27bcCDwZBCT0RWY0zykiCpEwRxKX
oJ1jbUnQTAZttpReU9aKfYWpmn0V77UqyOWLY1e6Cinlcp+oXlToaHRFHFiL4dxHGMS+OaeOxWCh
vOWHTryufCE/0Kq0czLoqPJao0OGP4fLMRezcf1wbpWbUTR45mX+Rudk20p/to4q7TcX2r5escyI
abEbEZB1ZNb4z1sDsqvtxLWTu/o8U1NOddYLsJNzrvW8pL7aiICjp2ckH8ZVGgL8aY8nH+yzUSpN
1VyddvXBK+NWMMKK9+a+r4EXJuDju1OabeA1+4XlJjsaC0Qpa75BA/ZrnKX94kZQ5dVoBOfCxKhy
7OIF/Cm8V4sjxln3Yoz1GRtEmy375uwfvmHK0SodOGLv3p7A24/b3OZdn09t9PtGoBFoBBqBRqAQ
iMarg9XVvZrPero4dmn3OvXh8ZTpfYC/h69RE+DvAeQeohH4wSNgfqif8EA4idMvxeXCXhamHVrj
LD3zxKyv2BHMyh89aoGVOVUY3sIPkc88TU4yihmMNExRkvrRb48ehlYZofQcHeJA/Zg1xUhlqEIX
rUDSRfZh1/hsH1QBK8zztNijdMvT0kuLG8M5scmUUX3dWRwyHC+8zofGwiaWjZVe7WH5gOfwQCMm
xdV95GG4aPqbNIqd+tqKN/ZagD411HUXghL/MbXgAM4YCQhMn3l5jsWHY8E9k0ddCry5cbTxaLZZ
dFBPZk07By2Zox2WnpyWMNL09FhT4a+cYXtYmv9Aaa5olKu+L1kj0KyxzJG5x0+wGhxbW0BvVPtK
o/sqrTt4dN1J2HUwiQlfPk522u/eSnz6zI1/Z595bdnqX41AI9AINAKNwEAgOb06sq9vaj4nH9h/
C80c4Pn4nu3aN7iPAyPQBPjAALf5RuCJICCOBw+BVpl7wElUeDncJopflMChYVbeJu1hL/SExcG1
aDFjhMMsoDzZ3yi8a5/zTFiRK1ECTdKKe9uHUm7DEjFk+leEJ3w7jfnU56Ga4YryZ+1LsGbJkSNZ
yhyVQ5u39lZx16ZbyXxOnHNcUgXjWMhYjC5be69hd1zCiOG9E7d0Mw+PCrrTxsPrisIN/TZzHLOo
udhyrRrwKX0GFKloPRl4os2rkjbnoIQDZr+lsftTwTXnmDuOWWOYO64lbt/HEGMhuTJuQX74HMxl
f96R4GNTshms4qF/YzMrC/VNc6N0aaORnqyS6OBe5P4a/HxDPl8omgAD1XXUfH6cA2wr1oTT7rnX
q3m+akT3HyiFYv9qBBqBRqAR+BYC+znAyf61Dvzt7N9k3JQmvJct3JgeFIEmwAeFt403Ak8DAVGa
RUWxFr0xs0p6qmoF84/7Vkpg5ZGGQ5qFFnvhPCzINHh5erRc6YcC0WK/PCCwz++VzYbqOAJWAcac
w4jC1jh3T/FPTsyvqqAUb8NFh3oZXTo5vdrBmKHNHsNtlNkL3+M1h/2PmhouGtYn/8PM48m2VN9y
zPqk9M9peXDIkG2RQefl6r/0HB5mLUAY8hGjMBc85JUWTyp1khN4rChiXsOKaaGPnRFj9ERKhfZ6
hGZNI1OAb/suiCuGVdLTPHMXV+xBcUELBAZWiHE5r7nvPi/qy1vDrtrLZvKawkQg13rKk9VXxPvE
kMvTwcY109wCTjJ3LNtzqfS+U+Ln5sAM91mgjrWsRyQf22o8oQSn3g14HJXrWzfgcc3nkfqbClha
v/cN0w+r+FgbSvLOXJ81Ao1AI9AINAJ6MOl5UUul4zzrqruM37FLcGLoXGLC2D07WiTmq4+DIdAE
+GDQtuFG4OkgUIHEsCZzs7DQyaN4V5GocAZYorlZKhWV3kuL2S//+iP8fr46WlA3i8vgnGZuxXPM
dmQNMkOGLZfANk0CS1sOI3J7+JIOs26dm93p0cIThg4r80PLm+I2pk/xJ4+g+Fn6rTlV2FSpmhmX
sVb2BA7paWrMySfN4irXFwv0x7i5YvF/LfoWoxYa/y97/w+qWZald4NRNUkRNMFwjWIIQTFcDW2E
QAwp0MckMw1TRhtlyCijjWroD3JA0Cm1RpUfEiINCfJDMgIhQUk0UgnaSKMFBSOjjDHKkFEMGqY+
RjMkjIwwZFyjjTDKuEYYSZMU86znt9ba65z3vTduZsXNjM57Tt48cd591l57rbX3+fPsZ+99XhQf
rlxGdDnKV6dkrSFojmE2gOyR1VGibHO5wu3rq8Lgc9ucT1PbHFaBkxUTpwTaHyg9664xnrOAtJOL
tmsZVWpcMvalOXPqNMw2Vme0Ngw2KDpHB4D5LUx8wiRbGAcS1l7NRpWuRHPLsekskXQMQ6caD2Y4
5lEjjtIrVYr+pEFfhH756HcvJ3CN3vZ31sqc8L2Bb+v7wFG8Ryg0D9wyxU7bnGM7InBE4IjAEYEj
AhWBxLo8BOfazjtmOB9zlmH+VMsfwbzPCBwA+D6je+g+IvBAIgCK0xaIUYdGQYlvgz0L1ASTGfjH
MIaVmXK+q+HlxeNHT/UnOAr7Cirr+ajALWsLeBNAs5CPtDm9sWWcsz3gsTyLTKdjlRMCBpf9PTeV
stas1zpmrayc8QuCtUmBkIXKLmvpJvlrL/JrtxKgFHOwOerbCC0IbaXY683IcEcs7HPesKc8XdYO
H+GEw4YLl+u8ScgXDu/IKD1CiNdVRzn+2WFJ3+kvqFgl+yr9xD8f7dnLEIj6yqUb32pPbKGII5Lu
48jeisbARMw2x58O3JDWHGnbGf0ROutagPOPzXEDUT9REURAzQO8LTO9j7Ho9lddFbLiGXltjb3b
7aF5z68LDQ9c5HDg52M7InBE4IjAEYEjAtsI7Jlev29suF+ePvGYzj2dsyvlCOl9RuAAwPcZ3UP3
EYGHEgFQ5YURF8zkZQKhYBeNcPK7vuYbc4UncJcgrr5v5D8teRWIVNquCjca4YD9BM9evTCzayjV
83gDD1uGP/jnRGhGmDC9PeIaVBzYrDQvuljCZk0BnNq6rMC3yF8ZTTE/VD9fmvuVpLPE94eFvpRX
el6WNqUY0TEbNrCZDuwss4VzjSilayNWEgDF4ak7hpPLdbk9kzWKl6TKEq5z3BKNWyanRkuPzqrT
QWWFV14pGlRszXEKVG/0m3iVWjBXHHr0Z7MztrYtASARtiXawk4De+KQXxJ2eqJfULeNCW6WWgZR
yxHtscoWQg6HpCMc7Uf7FxaDW/bYb42Wj/4XPFItiAGmXpT90iuTqf3oTyQwQYgo9MzedQz3yxzg
Os7+e/HAYUNkvDbArvFq6Du2IwJHBI4IHBE4IsDjLJ4UsfdTGHa3nyyZ7hFGPSs4H0zIH72r99yO
DgB8zwE+1B8ReAgRgG0LnCN4YIYzR6iagWStphiLC74yDuQ7wBeifC8ffU8oScSvgI0ghRGV1luO
vbXGXqAI2CX0KP3GdaENsCTQpXOyQX82oA/SEtkDJynxp/4O7bNc8iqZRmBblpFfSEIP82+TBzai
g10MIloHoD4Psg1LVMqlR/za5pyLK08Ll+ZXcCUpB+2FDsOXQq1hh3xUXuWSnTqNDcbA+ZnlC6+x
LKfYkLF84k8DyFylyfbk7GL7jpsxZ9jRAJknGlcpVpLfQ1a65EHy0qlNgeJYxugY25RF2rAQ9AvW
dZ1GHHTW9QK6zpnM1KODxkjs0KCfCBcOj34EFxRgU5IWiLhJTNHWWUXpkZcH17EExADrd8VTC4OH
u8LDAVpDz7VWycIXB8DsNzi2eeB4I5kpHBcnzDHCx3ZE4IjAEYEjAkcEzkSg5vfm+s9+qOW46MkG
P17zhPOppOd+fYngCOz9ReAAwPcX20PzEYEHEwGPC13jUXMmrYACvKL5vRz/DAcoCHf16Lv6xJEW
efZPBsoyxzUQmtEyODagk8e1agu0CY4SbnGW4AmNlzAgmUMzloGdlAtJbdLvfxmHHJKSl4BQnH6C
absUsJn5RumJvttrf2ZJHvkU9kS6bUt7dFZYzsQjo3PTZlCi9wGhjd7pKUhMqGOly/cr2wMqjm7g
sgGbrRk2e3UP233m9PIF3diwXGJKAUASDcVTXpNbsNAikddlJU8uF+xFWFgRQGfqwUHJEFjSsdZh
zzHVLguMmpywI9xlhSXKKD3GtGmzYoj9otYpvXoZQsbyYbP0uHUxb1xIm84IYd2wgjqSfPHz4n6l
7ZVOXTz6tWXwsL/962NS7IZ5YI5dX6vnvmRayXFwROCIwBGBIwJHBDYR2PK9TCzK54gflxt+OMdq
+ankYwYZHdv9ReAAwPcX20PzEYEHEwHQWvCKIDfjlmA1wULCV9oLX/msZJ48jXWeL/i+kWdcBhNb
xwob8z9z3SOAVmG8xFdAL54QPstfYkuYRukR9hPYNrRLhlk/qixKjFzaS9IWxt5qe+5r4lgl2YsY
VWv9mLBySQO8JXgePTpmryLAvRWHtNBQLY4lVmaEzc6V47d14HjmOlW2JLbeE21kXBFhCd45V2xE
ybWTNqtHQKVjraOUKo1acSHHlpNdJinFSjLgEvMpqi+WE3NdJzMsKeqdejFAZcSy9OcobrlWGsIq
WSsvwL1CxQRB8k6PTT/ds9B9BwqUmlOvX72+w1w1u8ZX21lh42sKdctzNJj0m+s8e35vM8DIMB+4
e+VDkvZ8bEcEjggcETgicETgNALN9+aLQTwykgF2yvwO8Oa4zx5Rvc8IHAD4PqN76D4i8EAiABoR
1noFN2v4lLyiMI+RDIyuQG+MeTaJx2jn4O70D/gK5GOEqamhr0RRSo/gCngDLlHyoCz96ZTBG1NY
Y2S1sJARINg7CUZZZSWMmk48pmKuEhOGvI51VmJgPJeVrOZ1FJKzSY3idKzllPIsNivxRWFpHdsX
4GvOXwWj2uDGhFNDjI6Wv/Y0uoZxStjVJoU9+onXtqEjFkTuZUXPLiezjfv6kwYCpT8hSXsaqBX0
y57+AvTb5izaddRe4Evz8HmMXypI1pYlbfPCvca3cOOxUheGSX/rxFq1FnkqGWpTkrIZrx2TXNXM
9sfUXymUR5e5znOMdob7Va05UEK8+qX6igCIEC6W2FFmntVmnWfj+VwLur4DnN89cpaWT4bfATq2
IwJHBI4IHBE4IrAisFv52W8Oyfr60d+zgmuwWM0W5myOXDsiel8ROADwfUX20HtE4AFFoEfbajBq
sHywmsaijMvVXFORvd97NxZ5vjAcjT/4UtGGAhXNOhqVBNEqtAPykTbzlvCBpG8QoECRVFEWkvop
YbOOKjoYZhC4BC+9VxHS7GOAd3CMQmg6hqH1GdkVCEolGn3FMRBOMsrrsgKPPXOK9mYvQ5vOXllO
v5RdgF8ZheisNLlcexfcqS0PM4SBpcHFBcfo3gQikGftaYxblozF4Hhjlq/jYyxZI8nJa+gYdK4P
4qwOwL3K6MhH/KE8kSxjEjNTVqHlkHRK5LK1Kl1540AeKdEacr0uee2qQXP0PlSPQNofAcp5wrDN
rGKdI7qJhjAtfmGzztoLhe4JHSJCv4q2MLM10GMSrUhYmhTLQwVHR4bszC25XzheS665vhRKaJRe
PHBzwq3kODgicETgiMARgSMCmwgwj5f/+MYvT5NeC/o0pUYkJT98BPQ+I3AA4PuM7qH7iMADiQBj
m8EeOX+1MIwiIOh7ocWuDJliZK+wkFINxjhm3LLwYRC/oBTOSlh/hivoz5QB57JcpRiarjHMKg5U
ZkwecCsePzVHF5wmrKUU4JAKKtxL6az2nJAJ4KRUp8RZyfcx8tIGAmyzweRKFxJToo6N6JBMNluG
CcINnURG+C1H2KJcufBRGFJIz5YnUpXmyxo5LEm5WfHM4cr0F1h+sb7gUlClbHiZGZPLtVVkCT62
1KakHUyO3bFN/ZQCAjdAzd4QaXMPAri0t5WrbOY7UuE7nipu1J3SrUSCyf9r5LPeJWSJSr/y2lcV
t5g8bIODDXaF6K0idNpmmPzaoj++v/HLsePf5HAf9xzgOFWrZCF8bEcEjggcETgicERgEwFm/H6u
9x49/tbqEoyCbo53wwn7mRizf6v79Qjp/UXgAMD3F9tD8xGBBxOBWO/X+CTHuxofgnLj+0ZPH33X
oCj6O4XBJGlcmmynTgm9GIgychX+FjSbLCgwQ9n5008oXClBp/YqUenK659RVjGouUaXQSOzi9cq
x2BmnXqaZ1nFKiwB/dqeGLwk/dJpNBV72xPaxEler/TFf9pNcG8462g0e5lNA0RqLKoicpVjFUop
xn4gwIieDGs2FX4Y5eBMg+QOaaRcpmHd1xAeuV6CQ5a/2O+ycAoyvG2LIBMHyi2TYHqxMDSIAda+
409PROdydURl8VBXXpWivfCt9YRaZ48Vs4gS7Ud6XhjxqnVVtJsV18hnqjXHVFs5iDpYelse5ap2
fKyzr1yt2vd2jtflG78Q4pvvA5+kDEXH4RGBIwJHBI4IHBEYEdiu+exHbTDAgYp7RYn5ZWALJPd7
rAJ9/03pAMD3H+OjhCMC3/gIxHq8wjPCG8Iwgh+6yQv0Xjy6fBaDVJ8I3jgd1BQjgYE9Biox11fZ
hX8a8RrLJe6S/AsDJG0Sk5BBDmxwfIjoKn7laklGOzkOWaUoXWeN+mKTAeQWQ6gUS7ojNlnEsMGQ
KdZnEl4yfA3sZCSMHpAVtoUBLxcUjxQXl+yojh2T2JwR7pex3AnPpE2RUboRI7Yljw3wRoNKEesr
Z2WwvYhIStJlwRVH9LDN8YlSlEvCFwveR67L4oqFMLFQMlcZ8JwhrIKUV5rK+PiXcMla6lpqwdLW
mfN1hZNdR2GJ4k+UsApry7y0TQrpYvAc3Yg/1koPGPiZ/QI5u6ZimrSG07+MlZ9VluRjiq/DEm2J
nhQYYOl0uZQZpVtGmiPd2/iub/C6n8V7yZ3Whfba0ank+OeIwBGBIwJHBI4I7CJQaz5fx9ON1xs9
NmKuDSmLB9aazz0uiUFnxyrQ99+cDgB8/zE+Sjgi8I2PQNzcQRemAQV9n2ov4k68pfCV9gYejLmN
WbhmFAOWCNUoo2CPScjkJ42gAC45AhawYUozkIwkjSejOGXXA0U6rwN7Muk3ynpWZRkNJj+JZgk4
hRHLOX77MtFjzCaVbTpr1BQDpC0TFjpjs5SLQZVOGaO91MqXRvJGgMnxki6sa8uTTSUmoFwkVUQ9
LCWm5CxFMnJWGWUYEXDEQqd9T8YYLyRGKS9TPkc7EweiLbFnta6Y5XPkNsfG/MEwd7QVB3C18uIL
XkvG3PViofHlmTUYtYY2Z4mNXJSiCNsYZIjtql/j8GbOwyOXLugb7Qp0rdJVtPoOHLQcrS391px9
CmUt2qJY+6JDr+18E9/bc33PyOSYgujOL7+Of48IHBE4InBE4IhARaD43gs9H3UcD6xkgElhSza4
5wMrqXngI5b3GYEDAN9ndA/dRwQeSAQC1wl/ipoTuNDXfbU2rzBGobLALQQCZCISTyNRDY1ipLFA
GljImC35VcAk6AtQZHlQVmIhKwz0pYMr78FIaLvKshLziCoE1xnpgRKDhyRFCEoUJfaYIczx2Fjr
ctEZe7tCrrY8kiqFaCSuM6sJnxkpxmCJFdvashn7wa5RCoxoWQvoTeLRkjaqbNApCctrZ0k7dWy0
md3P9BcQMTwqq9DEHGN6oBNpS0BKkJQe6XelEOdE4Jaf/RchT/yJ+VXZ6foNVVgoVXhnM/LYZcFg
d8vJHhajd31BOsJQbSZpeWxWLfuAcc4wvT2aPbhfp8Nvp03B5TKnlwOo3fXtX3HC7gFZ60JLpuYA
t57j4IjAEYEjAkcEjgisCOzWfObJ4jcZ9vkMimfiOObpk0/hI5z3GIEDAN9jcA/VRwQeTASuH11o
zLNm/GrMsxk1DVUN7tecZ2BUA9cYHyv4wRhj3+IDm4EPJaCzoDjhE+eKPyOuWOVYKWY749kAStRZ
uFOlqywzfnByUZawnE54H9l1Bg3aW5Kygjk0+o1HkrMzVjbK1d5MZpRyaTyvFBA4DKrxVcyA1VnQ
4HUkMH81ZQTYVERh4NBmnjPkJYOkZOxRrGWlcilLkTEoS25ZB0qkRO1dVv5UodKpvf4cvYyJLSTm
UOURKseNtbjSfqWqREXAXsd6XfgiAaWwGZHGTOZLf3xIBalOJVlx7pHn+V0lCRN/4+Rg0YkMzQDN
lRLpxPOpzzo+aA5Wn5gbD0cPiwY/y1q7FuulqQZdZdIc45+tk7HZyeFLjwxw3IR+FWcddtd78bfM
9Q1zixDONZ8tENXAd4D9moIM8sdA6Gohx79HBI4IHBE4IjAiMOf38tVfXlB4ABU/DN+bKZa5iNFt
6zl1xPSeInAA4HsK7KH2iMBDioA+7asxzxdCR+BSIyVwV6KXC8MFQRRGFxsUxVhfYRXt/VyIFB0I
iVlYW2BR6XFK7JVR6M7wNTYhOp4TKlHpSpGA8WeSijCQhtzBpnIsPUZEQXWCfnVsHCUbYjYyZWkv
eQkYkWYK+kGbWCsZnw2UJQ1GjInnr9ZXdkOPoV1woXT3GtHB2QZ4k0JSFCLtdWx8G1ZpFqtBYMJR
jh2uHACMNklKm/JeGuMZP4dV4N4KjsnTXIM6Ev2TciMg2huj5qzpF+Sskc8Slv3y17FiLnfWoIp2
YuRVpchfwiu/sErW6ixiqgs7lV7Tp2ALIzKODxg4fhmrR4rMvoruleDk7V0sG24DWCK7uetg8p2X
TnQd66/54RwRYN0pFz3uTfwGD2wqGAFOgYF3Mhmc458jAkcEjggcETgisIvA6XeA/UzJ/lN/6Zdx
0fmo4tu/c3+E9D4jcADg+4zuofuIwAOJgJa5CiwK+tWBcI4RC2CVcbZa9YEbfY7yJTRCXMJFQDSA
q/Ia4AVyNl4N/GkUFBvphnawpnGsv0uXaJFc4VlHhaxytWQjIUZZB3ziT4ngLjCn9FgGzaGtLIlj
pUtGklirvVKE7pRi86BhAwGqCIPznI7bOuULVqFf8mD4UVZGwHmZhVv8ZK3p5dJz2DB5xZRip+3R
YZRi5aGYstDD8YwzaFnCVgu/Hdp0/Kwi4MDTr5F9DT7O2izNEulxyzlaG0SNfv0pViBkY2wiGXvZ
I0mOsWdECV906oKAWGeAWzsVldg16Oz0BYB++ctNSpxxbD0BuNxe6z+vucHFA4cMFHEzxtW7sFF6
/DgicETgiMARgQcegR0D7A5i5tokBtZzkHef4ocnGxw88LHdZwQOAHyf0T10HxF4IBFI5NlY8cXy
G0ASTB2jT4EohUKTzBSq0TljEHBdfoPXOC2xEPjTuJoRwsx3DTwjWAVaVqIeLqAsG5Pdq1YL7s3V
kq5ChtWDYwxtcYHJGNsW0Djfxe1VqXPsLoi3kaSRFdQlI5YX6sOvp1ZivyICyvvSyJ90CRABMjpL
IlLyylpjyBw17VJAjM3fBlMKtgRD2uaoF+X1MzZ5XdC7isB4FxT/qhRtHX8LhLU2tYXTEqPo9MW5
gtmWhfKoa1YeOXRgTkZ6B9PuioiW4OqALYfhz5HPDkVj/uxx0NpXVL3lox7tCLUJNRttzHA3jqXE
G3A3UbHqOpP5h3HOkweWDcn9Oj3n/XLszLH8c8k4jluNG/XHjyMCRwSOCBwReKgR6DWf/ZyKh0Xt
r/v5rgeIH1uZ0j228MDHdp8ROADwfUb30H1E4IFEIAg6uxo4R/tL8IWhiAa7GlZBezJaGBAbOEcH
wlcXhljaXxUT+NRdoYJwoC+d0vFVfik3Z/O6rOAqLZxI2BgsbAD1+RGSa0cLMV7l6lYxD9mF5veQ
jFoBbGDpZF8xW2eVbmYVC5MFlS9YaCzakuC6KNdBAKuHkZaU/pjZq5HJiobUGrL28GbI5xgNbu9A
nkDWEDMMTmAp1tfpuc62kWEyq12uhJ9lHBa7bo8S1RtMRgzxy4Zl/4Isv8zjJI1Jsdfh42XWZnhK
urA0TukPbVhC74MwP7HFL2+RIgEsr4iFvxJQuC4zqhf6mBZ6iI9OWSczlmMOc2kLJdb2Csxff2EM
3HgJR+mUuHjdtS602w/zfvtrwHC/rIDV04Cz6OOfIwJHBI4IHBE4ItARaAY4VkXJVB4crPwcW88N
JsV/OcKoshwRvacIHAD4ngJ7qD0i8JAikIiIG7ppzGbnmKrKaNVAVsKKhk+A3pw3K3ACqoEJLBDF
yFgAs9Aj45MDN4JtJO99cpvGjbFdW5v20oYlKsjMsMAPXGV868icYdpQIDOsAkuXzT1SN8GnbFC5
xm+BjlQKiNFFJPtqVBk22OUokVyWTEA7YhLYTOkSfmF7pFmmgvEAio4eo7XTQdmpngWBZ/lie5J9
VTRUCpBS8nakvx2V7Hp4nrYFn6m8slC5sFDH2KCDwqVkTGZbNSid1ILM0B81LkusObszKnFF0jGh
LhJpX9VaWbYn69HdDT1aW6U81sJX0mx/g6/W3mVFzapHQ70Y2lslIwL4AwMTPx0TjJC5ymNbA0Wc
3/51jzuc8I4HPpvuiqGAYzsicETgiMARgSMCIwLme2PQkDbGIvHQYauUxf3WmfwmcAkcMb2nCBwA
+J4Ce6g9IvDAIgDLJ7QTyASQowMhGcchR7qCEnXKmC02coFYwF3CV8JCOisg5OdF9Izq2PI5x9jH
sfZy5co1lq6tEwTYNvTjx+g6OEPJaA9WlAbjzLRTGrosSsFmLAElXhSrWZgtbAbbc7b8Da8vUkNi
ZgcnEKa9Y3a0i0mr8AjvIhqyzTFMtFlncTPWlyal4C6rNDP7F1iODbEpEa8bSxNhIkYW2a9jWGV3
PWA/VmUdNc4XSldsR/rGF/qzqUcij4/4K6sc/2StJSNVFXl6LoinShf6pfTIVe0qulE6boVvX5U9
+hd5iyce1vFi5tOK6G6vOb25vPPghHf8cJTHEtBH33zF7/j3iMARgSMCRwTORoCHxdrTZ1opZFls
cJyL5+PjwRgfgb2/CBwA+P5ie2g+IvCgImBcl9+kMS+XnKSCIKxyza2+UNCFoQm8n9FOoBRQq5CS
cR3CMdr5qlaTBj1qkzzoy3g7NuWyttBz5W5WIy7siRk4ZkpzDqrMs/4sy7grsZwNY82ttfIzeFV7
WYLlWIL92oMJnQuEnHjYuDR4WrlvMVB9sspg5soSCFCG2alYjdllRbmga7Cf9BT6YvXjhRulx6Uk
B2vJ4EKNCRmTnDqxXPJE0pIcLLyqGDr+sPHJ8INLC3VnTBz56OT2QfhOlBztMPLKX9/FfSzBBdnT
0cNOybheQONE6Qmcv6s73OlZ3B5a/8omRYVcpju0JQBqYmb/hBPWyewysIBlku/loNrTZm7wbl3o
7sKf3fml7/j3iMARgSMCRwSOCPBwYdWrOPYjbB7nYKV6DGlF6PUF4JDLl5sjkvcUgQMA31NgD7VH
BB5SBAKZXDwK/s3oLuadGvsFAhHRp/SnBWx01ongK9BmCAsLCSxpLw5TrKOgndg/nwqmV+nSALAB
p/lnpF/U/FU0uKyYdWzEmwyzsW7M+6VcKZRm+Eaj7vzqrzQbhoE2k++V8JUxWHGSOSVY5Q78GWeN
mfvrvolybVVY+zSHJUtS/CqzkQlOrrOFYbIQwAxelT3aXxaX7kIDwtnItBObDZIjPgqgvUskrBQJ
6Kd9jyryQUjqQCU6jBkN2SY9iryslW0+CRMbdmrvyHctRP3KHjmiElEleZVl+5m/vZC28lpbDuR+
UfaTDrp2TXUkLzT1F2ysCOgUSFv1qERZJXnBYBeqUdCR6GPhbY4b987jKIs82RkfB+J1i2Rmfm+P
bZ4HZ4/T6+OfIwJHBI4IHBE4ItARMKMLBg7W10+VHEBU44w+y8lE8e3fGAudD3E/nBgLdmz3FoED
AN9baA/FRwQeTgQCmRg99ijZQLa6fRuuJHUJ6jAtyRjX5B4LMgWjeJ3IGUgMKktu0BgPqJaTaqww
0ZGwltDvxULUue60sl971iiIiHIT/xRDKLXGeGmqlKhcNFshNifHe1njhIXTjNjDhsZsOmsjA5uZ
roxRylIi5fqz5alHGSUJ6jMGztHOsgQ3FU8dEzEdS1KJUtL2gIQdzIwMOul3SFxYMScReXQasScW
tQ1xlspyiawv1cx2jkt39FLGxoSkXWsmuTVEj4NwfuFSTFJKrt3diHfYliXKBL0xvPDocUeDVZ2p
Eeb9Brc8vJwcL68NZ9HvHBcNf+uUU+43V+CsDvslozWx/E5zdM/Tko7tiMARgSMCRwTORKAZYLjf
wQDnc8frKfrR5m8C86ZRkvnIPiJ7bxE4APC9hfZQfETg4UQgh5WCV40Vk1klBA04L4xMkDEyZP5q
MpCGnQIXSgz847+QVy5xwtbJ02LhZMkIfaHTZ4P7lcrrNe6adGTWXjrhM1Xc00SbzQOHSSBwLM9H
VGIqP65qfHIhSZBbe5oRwEdDtcgF7wo+0zEcJjgQncbhzaAGBkZS1l6bDxetqj3R0xm7mei3NXNg
rJixpXT9NGZmA5+veEqzkW1YZ9syPtu4oTns6d4EirMlwOnwyKaKb5ee6NKWtT4IL/CaUogeYbHB
na6DC35ip84brPodYvsnMaHiQrySfCV5s8Q3YmCqIOMQrc1tcjMHWN31n9f3fnueMCtCM4PLWx8s
hcfREYEjAkcEjggcEfADIrtK66mRDHA8KLM/ejG9eqo48eB+v5q2cwDgrybORylHBL7REWDkaoAT
8XvFCi7iV5gHrCWwqrPCRSBDSyZeMgkJlkvWVzjnylkkI3npVykvChGBeI3rolwJiOkV6Ln2SGwl
KuNlfoEpUZOUWyxy6WyhwcVnXuZY6IBYIMCLseazSpHNzhh6pMVWJYJVoQTBEHGt+QQQlTY92JRu
rAiBGUhSZ6VQZ40DI3qXa55z2AC21ObRy4kYrVCjxJMzl4xSkASYSVQxV/SMRfmocq7qjP3ti1F3
Im15JxtA7LLE/RShSnpsW/L2RunJvtrZSMcvImOM+koahELL+OwFEFK1kYH2JUbQHGTY++x30LLP
bgyhyrGKWdyKjN4lGP9sCjZSdKwadylKfyWYLU+VV/VinHy6f2Is3Zu726Nv3l/3TU6YxHf8HWBb
u5FBvqjjpeo4OiJwROCIwBGBIwIVgR5k5OFG8dyJcc7ZIZ5CueYzjzCe3/FkPLZ7j8ABgO89xEcB
RwS++REI/AD2EDoSktFmUJfADMbPSC9XvQJlGXHBCurfHM1rCAcSjtm/Zg5DJxjyWaK1XBdKYuBJ
48M4ACUaVuXMVbOmSTPCQ8JwKlHH0IzGn4F4halkj3TprI6dAheamM24PXNhf4HA5DBlqnhUlW42
lXHLDDBevLfM9kY0YrMXiW99HCYpYo4DyDC4U1mF5QJg7mugvyAEJOmiFwaWzTZVQDEk5YhjG3vG
ZjsyYd4zI3Zt4Eb5pbKIif5UokpRdoeRMcngf1R16TC9MLSMXo69BeitCGiKkZKhdCdm/HVWpVwF
9xtVADZWXu11bJAcONzpYaeOC+XmgaYEG5ryt0e/jtWrR/FJ4QxEHkRQiu9NHhiBHDWA+FaGU8d2
ROCIwBGBIwJHBE4j0Os/62HB4wJ2t7nfeLB6bjBbTlAaKUdU7zMCBwC+z+geuo8IPJwI0GcJsblg
mFKMrKDywJw5AtYYOJCP8NWVwRuIxXryGzzOmzN+dWzUl/yhfhmGxfxeVkIy5gxu0OAnU4ylA62B
BkFulGKMFzplhktPmcZOxu2Zq44To9rTXuUrOWE/2JIpNQ6X+pwnDH4G5aL/MhEmrHUiOnoKulxF
xqGIyNhNYgXiDayIL7Jff1s8hst4l2s+IaZcPlgrSLvEeAYbnVI7iX6pU/ZXdWyEueb9Ojt0ei77
bA0x29meoiEHM+PFhT0iGl0j1P7L6DvQh38jl8Rcs/C9UTvKIgbYTgnHZi13KaeI16ck2Ug4yi2P
wu7kfoPjrWm9cL9N8GYXvjVsZIDxx3ZE4IjAEYEjAkcETiMA69sLSYwHVn9nvh8jOVK6e2/9eDqC
eq8ROADwvYb3UH5E4IFEAIyk/8Fs3LiFdoS+wFQGMMleCtiYO41uUdGAOuM9o4t7IHQAZkkqvRBg
aHCKDmIkreEuuChKB0ligNZPkiSlu6w4FnYSepSAjpVyZRm6ZoF/2ssGlxKWG5txNu1vLCcxrLKb
ASnhM7FQlvgPPhz8GV/W1bE0GAMjEPrLnojSZa3MbMvhY0OP/BKbSomWj9Kvin3VcViZJDCjcxnj
vXhsHdvUwLFE239BtDoIUbrOtqdOjA0vXC5sdkRYZ20GxxmrK5cr2wyGMzJ2Ez48FBJ/+yVtlBCS
l7lamOx5Ujg8XwAqb1K70m9sLGsTVI8uFxXSWFc2SDZ8dMtM3Ou6IKM39b6L+11d7+6Sl3zwwAwo
kIy//Zs9914EayO/lB1HRwSOCBwROCJwRCAfbXPG7/q67zux5nM+ieqBFbOFNeMmh6rFQ+pYYOK+
m9EBgO87wof+IwIPIQK+mzNfN3CdQUuM0RVqMqTM8a6CH+AfHeis9mAhyWgzwNMGkRh6nB7zfo0A
A30ZYiUTqLPGtDEX1BBObDComNmhYGPhamYggyGxJzaVYoNj3SzjooTc0i+rJGn788tJkpEBAl3S
plJkqqFdzuZVis5WiTnJVmdf1OBnleKychYxkMzI9pVkZK37CECnsb90ZMDPxpyBIZWiUvSn0i2Z
84d1jHlYC8azBiTDCyfawLW6VSBMd0MgkyPGHUOWrSYggV0VZOmXhTjevihRVl26XO8Zwwz6ZdBy
9CNgiepCZx0E3CfyqVk4WR89MgJnnnCuZ+ZKf2UzWM07GF3P+5UhUcsuQiUqXVuPfNaBXJkpgOG5
ubu9+d443s4Hpg+eucE9Lys5YWs+Oum3AT1+HRE4InBE4IgAD9v8AjCPoc/8FM61oN1PvVkXGnnS
6Rw/tnuOwAGA7znAh/ojAg8iAuArgRyhHaGRa/80aMm5oxIQ+DBOC+5OMs98oCygNUnG06Hwm+UZ
5RsylgxEJP1oVhEXxnU+DpAmGWcPtSrFJgS6u1xra8EDN7cZCOli8JDY4EQszznAKgvjjQBBoTkr
2EXk6lZ6yLn0wIcqFN+1aS9kCOrDfjanPH4WiDe46IrD4q5VijwS+tXecYv4aG/fwx6O8chdAPDt
2ggIQ6OjFGdBW/joR3P47v6CZOmV1+mBe8He0oMNCgVoU67prI3PkdWqBSW6FnKGsP2Kzbg0Y1Jn
s+ebdmJTc11oV0R+NQpfBHHlAnEzbA7wbJ3KR8e5NqFlvkmk7I1+kYk41B6vk+zFhbXYpvrdQ4VZ
8SB7i+PdzQdOrhhaOL1D07EdETgicETgiMARgRUBd/HyEPSTxctGBPfLy8njOFb362R9+xl0xPEr
iMABgL+CIB9FHBF4CBEo3JWYx5CMlX5zDK2fBEJ3hhnmMIVnrh2aqxqhauSjLVcGLp0SE9OrjXGw
OSs4fvtYaA1JK8s9KcJmOmhM6CxWVFViTAUtCRuc6F3EY2Ny40CQZCIxcB04U9mRHPh2jcruCIAz
5YX2huihTYU6b3okbeZdO25puVTbPLjltXHsyKTXQtpPbYn+l+86xs5Cmwmky/JML09hy3NudvlF
zLNcGSC1PkXM42zXWkUj7JRY2RzzgYke5fov+xoc22gVWvmZeldkrFmsb8wB7lKcDxwusaipQrwE
ZKLfpn9lKe1tld6+uPVUTzyrPbPlIs+1LnTO46p1oanrJISp92M7InBE4IjAEYEjAtsI9PcCerjQ
StFzRWOeP0/WNx9hDEryE/AYXnTfrekAwPcd4UP/EYEHEAEgENhmzfuFrxME0cpGhjE6ZEVlbcnr
GsawOjTU4pojCgN5ZcSoU+YkY72rixpGC0/oJwX8XuBGmEnKFet46eiDA5WuvJaHSkUyhQ1QtfwS
GEwZA7NxLElp8AHcKQg2eUKQHqqE5PECGY6lR3kLg0FTp7yUKErieG1X8LQq15AyUpTL8cksCNnT
RvVx/My9A45GrLrsUHcEwKJhv1FouOBCE3tjts5qDzI3Taotx67vyuoYSkKcPPZIoSPQq1nCS+cn
o6p3IHRW2BNqSszxkeQFEVaKZeiJ0EePtPUKWKHBHQch2WDYJkymVwpePXr060pHMtC1LKRroLbt
t3+jk77nA49v/6qffsMJ7+YMD33H4RGBIwJHBI4IHBHwo62+G+/neD5Esq+8emYjlfeE9QdXfMwB
vu9WdADg+47wof+IwAOIQGJLoZeLGj8MsFSKx7iy5FXgQOFYIUYjQOYAB3oxkAqsC9koJKYU4R8r
zFV/BU0BPx5YFHjbZwOjKq+KM3bNVZdB4zolGduQQJdjYBj43JYAR4NnNupGnhm8oV972aayTE5K
Fk417cQjA0Vmt0Ze6blaXHSOfzZ1GaDdedN3w7/kJ43JswcB2yRpN0H4i1ZtXCqbiaTlhRhDgyxU
TwFhN7DPPgIpkTal284eVxwuyQWjylgnzDgz5vTKBR3YBvoCALoRfM3R1Vkf53pdSiG2Bu2dJceH
u4pzfPjTwv9IaiiYqzt0ukJZGTv3DmbMAVYmtyKdjG7y6h+HE14cr2tPcPe7Pkj22wWGd9qr9Nrg
eHMsd337t9avbh74+vPrnCdM97y/D0yJxwcbVzCPoyMCRwSOCBwR6AjEMyoex2tmrx+D8ZjsUWzI
kJLjmw4G+CtqQwcA/ooCfRRzROCbHIFkYs3mBY4SxjDrqJ9KAH3xF3jnMvnJwKiXRi+go2dGUyBb
eEg4RgPLwBv6ISCkdMO/QNTaS1glWh4cHinssefCyA35qoSUBztVOnRr5HJZjNzOWbKy8zrnzRZe
qlWa0eBCI69BMuxxjnPWsaJhmcSx6FccpN8WgkVB47HasyOWvLAP0nJ816ayjEKn/emvcWZYrlIE
a11K9lA4L/i2meqkr1Uo5VIjrkfyhkBFBp45aqE063ykYAnhLasAw1ki6YB/lS4NRENgVaoo0c1g
9XEY8dIPkn0EQr+JPBfl2/obA0tNoGU8teas2cePnghduzgM5du/Xtg552vpOBbrXC0hZOxFzge2
zfO4tR0HRwSOCBwROCJwRCAjMMlekiolv/2rHljNAa7nS3Sz+jXpYIC/miZ0AOCvJs5HKUcEvukR
gAnMb9U266iUq0Sq4NjYCw0KmVwVgwrmMW7MzlDh3iujO+9BLIFqah2sSBE6BQsJnOgYDOwgJwdr
6JXYqfEzKHRaZUYRLJ10KzgNlCi8VHxm8IfS87IQ+HXxz07JVZSNPEObfAS3u6zE+baWbxoFF/pi
8JZGv1ku6Ff6wYTs9bNTHI7oLZYS6cda0KOijTA2CNMSfyIIDi9sD05OdO16iWNZ65hnlsoIOqUm
YOaRzLrxQSJhnS0cS45kicHJZFEcjIH9gaHUER45OGuONxbWWGuVW33kecD7RDPAr2gnTgT9hm6a
Fpa6nRQJ7BnkcSrmYrFiZ/O6VpLrP1cvfnK/LnFN5UrVxz9HBI4IHBE4InBEoCLQT6vxyJizgqPv
VXOAeb7oVaPmA8eDKRjhfuYeIb2XCBwA+F7Ceig9IvCwIhCgQlhFc32fBkQU6hCQiBmt8L3mJAPz
GIAFdlKS0oVGdOu/Sl6X7/0EzlTGS39EB+R26RSwnAFSrhsc2pM1hS9NJllFWLMKCknpNHCCe4wU
ndVexsgqpcgG7W1/pIOQC6HBzTLQOnldHQkrOm9yzqBNysUSZXG5PRuWkcAg9oB8Mu+ZrSrcm9yv
kXCUJX+xkKegwwhE7xnXIXlljOe4BZOsuLmUmM9sA/jyE1885lu+YZVnZWc6Z52FaCeb7bIY+B2l
+2wOPHa9ZGd2AVo4dmzMMdv0OyiF2GKYYTDDv5+I7tZP/62+DNsZY6E9yjoArYXjgPYAxHVZvGE0
9/vEx/bVHhUY9q8oK1qmypJHKbBwb2RKsjdkvS40VPDExlOGU6nq+OeIwBGBIwJHBI4IdARqDjBd
sbHms54pPAf92OKYWcA8ZXJdaD2JnqyH0RHRe4rAAYDvKbCH2iMCDywCgkaJo8CQ5vqYjwqBGXhJ
p0gB1RTOBOPx3ddXcJs6a2HYyIRhAFE4TOPSnGhqbMkc4B1xGuDtynjMucDVgfSkgWOXkri3Lbc9
ywsZLz2Gf+kRBWnvxMRgskHHWCXNE31hs05RuiOz+Fjryfmx4EOXHhFwHKIsHaBfe2kDw1smjCWq
kgFPEnnHLThPY1pY4oybbeiopgZXEzw8SBtLALrByUubdXYpUa6EjW8TClZdKDnmJINCK1YZNP8M
IOpXASoxWF/Jq5TH8Y3ftESald37NiZ0OqVxLy1K9K9SlHWTriIKpUYpknPts9HvHvG0iyaE95yw
01PGoWgZsqeq458jAkcEjggcETgi0BHYfumXcUZ02uY6z355WAywvwOcPLBS+zl1hPR+InAA4PuJ
66H1iMDDioC5tQApBlHB+prx09Z7UErzhDkntvGwQVeOHL72sQFkpIDfCowJwu00wx9uZv+ae8x0
AUgYS6mlFEOvRsJSnPwwwM8IKonKsh/uMdZYBhBKlXzUXpuJ1l7zWQnhKZiNzWAyV6LieMjDBsNs
J7a05WvzMSOH44loSbjrZFyxzQUlyzoiH4fExz0U6SlW1R5snJaDBvssEZNm5ZWFtpaN0mOT5q08
Z+kTiRIVIvSQy7hXbG1kQqdLpFziJnEaQFhlUA1CBuXGiIBG1wXRJ+7t47DEemShbFChpGSR1cve
n//1fGCIX1vzuOcAR1d9cvjJD7eeisPx7xGBIwJHBI4IHBHIB0w+R/rtpZ6ZzPL1m0Y8ZXjWbOYA
10zgI5T3F4EDAN9fbA/NRwQeTASEjuJWLrQDUhJWubDzAir6A9W8TLKUEa0wkIFzrr03tgmOThnF
agrmKZeOpe2q1o42ak1etPAYjOXkLZMlNj7M7/rqWDJPk0eFxU1EZzTF6OWcniqDVS5ID81yyoxu
rMBkH9M1cKPhWaz5rANlNKuc+N/2i4KOoh2KkAQHKhrESnudVQAxT3sQpkrRT2XHsJ55C7Z39Nhi
3Wb0xI8cQd0CifaJ5ItCziriRSoP+60wEbi01XGy9Kqgq6idqDXFShZaPlAoNWuKNGNig5O1dh0l
ulYpSqc29ay/8henHLEY7awDB4T20EiYtgHnOhl1EOxEvL/O6gq/M12oW8euQSVqZEHWe1f0WM85
y4hScl1oOGG+/UsPgrvqe/1nVs86tiMCRwSOCBwROCJwJgLxODOyZVULP8ryXwaObdng6GDdphxR
vdcIfOv6Wi8lj/7tv//kn33043st6VB+ROAriMA/f/5v/uHfe/+0oP/wZ//xn/yjv/8VGPAwi/jW
//VvGZIZqcY9/iI5zxzDY1wXqM9gMlCT0NelERGgEcxjdIRk4jFAnbJIEtwV96tiSnXsvHkKuNi4
UcXpFGhTmn2W6bXMg2WV5gU4bUni0kJ6yViCYM1eBobEF+W9HOhXAlIrv54Vt6xoSMC+x97HyXs7
Y85Elc06C4DkmFzlS0YGDNaWo7ajIc2Sx0LLhDH4qHQQsrFrWF5IngHJGfOrbbnSpRT3ROSYYR7d
I7xZL67QBu1NJudZrJIlgqNSJS90ICZW2mwPK5zF24DagzCwRFxZOR7eMSG9CWFlxYv0xcdRyjbd
aXSxu4jLQN059/vR8z94rrR3/+a72ue8LKPZnO7rjLk8CW57SjCIt6cEf/rppy//4uV7338PSzLd
3xYOtExjk7yWNknsvWRS/60yp3rA57AH2LOOKYulvLbpjLvDntTp+uoJzAzk5meO90b/SGxfwgbG
hG9lZt4zeojJLBdfpp7XyniN7r2eYfOszZvKuk3mM8fWtZmtQv+c1F2yN+3+ufq9Sxu4i0zW6Wwn
XGu0txokmfSR0mtJ841MjIDYtOe8drZtJqpi9ulwfe1kKmVJnh150Vco+adMqhzpXzTFbu7HX7Tl
t1t4kz2nFlaK0MusccIeN4S6EqNFjWNKuElmpp85pqevLuQoxaVzxeU++jRnyFzp3KB6m3fIGZmz
9bKNf1+V2zLy194vZpEQjbbwdSlT84pn2Z8Ne9Qj+mcf6GlKn111UXeY19ZFNvKq0/TF6zN33o1M
p09Pq176IfKr//qry6eXl88uN/XyutY+29sf/8kfn62FI/G3icC//Nf/DjhwAODfJoxH3rcuAgcA
/lqq5Fv/09+qtaN4Ngt9mdBjlmmiL71ZXhdn6HTQabyvO1dwv0bCKT/zNn4z0ssnjfRLiXMBICPd
P7UPXlfH5v1i9WZLBhKTbbaksNAoUfgQJClhjsGcvBfq9aI1UBZ73pi159g25FnyXnsksEqss2Gh
FFKQjVxwEV+U+CKxdPg19K+3HGNdrTSWSF5lkevSXmM5+iUpXwowp0eFkJNhlqRNgrMlnms1Zp9M
S3wQ9TXeQTfvo9LsOgX55/xqexGzxK8fXVCWq4/5vQxy1hazf605mOE6JkXykW4UOt9WMUN/r+xr
WyJ9xBV/Y8rxOtsAePMWO94ycXe+d2aK3vMe59ueUj79b59eXV2BynLTW5feWX+blH7znm/V0+tZ
FzPyZ2UQnqhgxGHV6S6qZ1HNFyo3+x26A+IcYjl5j6/eirL5td7dgr6mtV/U8lFutpBbLVk1Xh5t
UkDUt7SKibVOW86aa1B6KmVij037nJjNLXYi2/BIbXgn02//XAU3YLzX4LdeTT2v8IXKVtdSXSiJ
YepnXOHgnFu3u8jcruHLnz3bBvr6uuUKmkXm02Qk3SVla3T3QG2St5d/yNTDq7+1Q0cYXXJ08NF1
so5vSpkInK7A6vJL3Du6gfadI1/U/Vtr6NT33V0aqLxB4/jb37pz90TL7B8odH1Wt9fp2fMp53x8
+t2nQr/Rx9ePS+LP9UV69yDM+qpa+PGfHMTkl79eb8p5AOA3H9ND49sQgQMAfy21EAB4rXcllGik
l/iDh6XRo7bo4RaSuSpe0fgkkfB1ftBIYiFv+LRQos5Kg/drPqoEjOvAe0DfeDxr77zxPioo/rTI
XpUrZAsW0llsc7lZVgnnV3xBzqBrEKNVge4C5FNEodDkkElsPKxSLkM4/GqMrZ+XxQ+DWjFDe+eN
mAARnYtlk5Mi1k+cxSqAbpcI/nR6VgFhdJyXfqIE8sR+HSg+l8VgG7oHriOXhWNzNBqHZy+AMX+m
4wUhIqP2ftjr4InBPKS3ghn9IBQkxGuAGgOhFViOAcNWqDHMeo9vTM5bo0CvFFII738ZkwsPsW4A
TF10Db4EAL/3N99jVPPF44vrz6/3byRGCP3ivrhT3loGruAlEoSzeONma3lZ3PGEDtdO5+LxoIBO
ZZTul9qmeTd8b73VEYrdqckVwwkTrgRCfdDEZlynxRtT6Wc5253MYMOSgx28rltPqJpvseePT8vK
hneS13amv+gfeVdZd4tJ8vZNoc8XZZRPbr/49vUyfbvMbAN8/qSjWiPqsw00wKg2MNvnkhmgcXL7
4fVr2+eoqY4S+HaC1VOe8/UYeDBpvicksr2JIUyZyR/eegy+AsPPvrDTlE1P2ewrocjT7XYsWgB4
xWTiGXolTmUqzhk30KPHMqT9dbHTs7aM2vK6GzZy9GdNLnTDi57rG7qtF2ZaTo/J7f7WhTbrl0tv
U+P5YrDp3Zgt4SZ/VzBv6Vm4ub7WXaVkvlC73XDap+15tM/VF0Cf0egduP7sOr/3W5dzpMTz2rH1
dbF57pz0TB0M8E1X6m+T3gD4mAP824TxyHtE4IhARcBPveJIBW/0mL/2MwyoYxIy0Mt1riTMGNd4
DAj5KN08LbgoHpk6LvSVOM0FJWqVmP6kX0rQaZAWdKIxUuJtpUhGqrzxLaVkYnXsjHDCvHbEgTAb
qNiJIMn4K8mY61tYLnNZQ6LishDDYgZyp4B+r4phxipBOzlyWUGUVdImY+SFNBjCJY5VouMTaNCW
w9zmZ4R8HN4ZsSfLfWW1RID4OG7EPGdKO/LJbOtsIVLFSig0aiQf1RUixzxn9roGI3KqQdLtEXO8
01rJyAzHUAbom0yRgfp1NIhS1JoDHpN+9Qe4lQAvYS+Nfj2PV/t+H1Ih+qkICwNrS/SrA1WcjHfK
Z67Q8EKJblHZWYDtMb93vusksh0MGAg5hDUfmDWix6i/VtI8Yco4bg1iydKj+Po1N3Qyx9jvQ32A
GfZqzEPmZ9kz5ZdtbSc2b9e13vui0sspbONnllsfoiQ+K28FoW1zPcSbX/vYx0SgdWYcXMRGpuxs
+Yx5lcWb5ayvjjMfzGxMkjY4gDrW++WquzF6vOu0X9m7crunYFXBtg0QH3yh4ma9rFi59cbPrsrZ
Bmq98Wgng/lc9bttAwlKaUhtjw8Ir96tV0yqVe/aZ8dq34Z7/OpJXbdtO/xAVHskcBxveeP2emlo
FtEje7MBc6VUBFa9WD+lzLIy4O6vaSDBPUER2KWcyjTmzGpDP71FtmSWGMeObrfGPNur+DZbzhdc
uYTR2TKMYR6r+27uDO7SWp7SnLjvoY2b4SgxzyqFGDIoxn+09v45bSCx70idK1N2axFLc6dUzWab
sbX99VqVtjRgiQ1YEeB2Uin7s8h3hKUB+ZlS3s0obSLMPbljzjEaiNI42+xry59PUa1V91b6O/VQ
M+g/Lb1Ssp8Rmc+iduj+y9/0otIR5v9OLXEsju2+InAA4PuK7KH3iMBDioCwDe6CbQxp1heGlC7s
IdBljBRc38SW4FXd/EFuEi5aNVeTMmRiBG92J6swoJQOlCh+VQIi/ZT3Za08jB4VKgGXy/jbHAms
LNeF2PONPz9N5I5tr5wkefCni4h3LOPGOX84lqS2tXFWOsG3bLJHRegs9iv9pWcFKxHjdfDSx1cr
C2BVJ4MxFnizJeGY+wUElUVshlWG07igkzHBlVIc/yxRZWlz3GKTBonKSMkr1JJEM3s8BcnbBlBx
pFsAzqG/Thz+Om7gc4h34s8qWfAhUZZDrQNZqDnS+Q1nPe7lCMBYmFyqtLcB8T5q6CtPXYKPbaaU
iPJtZsMn85Ury8JH4oPBsocD1aBiZb8soo239nwpqTc58A88WB/H+4n1IE+WlKnjnQzyF+9coAR5
3rbzZ7Y064EW8MqfKePjpgtCT9kd6XmlnJPBd3POaT+OtD39k7Wv8Xe39vXIArpYMn5nnb6vKqh0
UmQzueIHy2vPsiomUwbNq6yWKZyZ7/E7GVZMLRkKQk/ELcfAl0y1H2QU7ZSRdOuxTCvZ6JmxQqbq
RXpW3Z3EnDDO+s067bJG/XZbyuCca3u0XgTi7blG5lOViU5rtnamIGPHl0z1C+xSNnpaZsx93aPf
7ks6J7PsZF5rXIl1ITAemxQ8NQO5S0nsWv1cWePV2iUf7a3aKneJ3dhvUhqZq6CIm1tOV+JqgXUf
+OxxzgFuf2OgB/NymxvUuNZqk0Q46nrXI5A3TLcB5JHRsfztb8bSDh2NkNG/eQereNXNbcWnL/l5
96v7ScbTStJfItwptJ+2p49JaU89djdTbH9iNm7TtpkU/MqbcB2fSa+bkmS5V/gxwTWfV0qkb1OI
ybKkxhKn/WVt1FFfF/Zo1Rp2klK+T8vzamq/qCNbG/b0l3srPll31FSv3ty+VM3G/QGdtn+t+VwR
Wza05r5IjoN7iMABgO8hqIfKIwIPLgIGt9qyN9pv+fAe7qUufs+gK9KNgQMM+2x3e3euSBcKemmu
UhLa61gpyGt/vajdfPHV40NAqxGvBITllCLkIxSk5+sokefQplzqTF4olw+wHMSy9lailMU/IK9y
LZ+gzdALHrsxcA5gtiX5VCfX0zXGOBZ8Uol6J8NgXlMkQ+e6dSbmrDfIwOogcMnIX9KdJfLu4gb6
VboMqzeLjoZOvSICyo79uzrC8q6F8nfVI0BdIi43bJA2Pe5dNbJtzewF/Uq/Dp6GyqB/Oy8eea+0
V9TOQL8yn8KjLnwc8lV6Yul40csYBveOL4WrC5Gq3fBekpjBvug40uuYd9lMh7N1iSnD27b+c4va
5Y2fFZ/Uw6tnDQ5ED9BubwMXVHOzrV82tD2nMqhqGRyZtnVxWy4RL9L+nY/4lY1846PrYa9/6eks
Oy59xrmumhnzvU70mKxbvs+MM7140bC54kxFJ0YtirjrNOM/eWz8HTHf1+9JvSQq2/G0zfO7zXQ7
ESPUvsz66lrY17tsqzoNmcGaTqyFTGKz0W4nXqXcmUIl7mW2KbTP0yslG4BbCGdTZpS+kamBshtP
836bV1D43gxn3G7ziqsrvYZIVO1kudwxuBv03od9zYJ50t9xnDJxbnjhX5v7Q9ji6A18eyYyPU6k
2XhfleDGlJ/Xe3OkdR9Ij/xz49E2JZtoy2w5z2zVxejm/adlmHdafX99I9pZmPel5ip9UWQE6sLf
pfQNbZU4vO57HQcdvTiOB0HdCWk//d/gognItOG0xOxfgMudNs+UWRccTzspZab3sVK5OWBtta84
7rZaD6Zuydn2ivudvocvRHhcZa74Y7uvCBwA+L4ie+g9IvCQInBthCaMYfiUayAZjwUquKrntzBV
YZ540AmuCNPC2pn3i7wXZhG117FS6jhGz17lGNroHXdBoLhc38gPl4UYVaYQl/TLqkLOUJEgpShR
+FMaVBbIymhTqC/Kot/dRua6UH5PCHQqbdfxreMsS7lUkFIk/LRYU+m5rJ57l7UmM+vYamMPRpUN
tpCnacZBAvLdhQJiOc4I26+w0+4nPlcEHDFoZJBneleBilKcazHP+GgLiUYcWyDnLUubMXnGxAdZ
X5LEKv+blWIB7aI73AKyCia2I8w6YfHSICOVrnIVT4l6H5jWDYO3uuI34rhR8ROfkmlK0R6xxPaj
6OxnoS6Ituy5LHOTA+z3/jg51wLd8sCKb/NFSXFYnpfI7P4fvDGkATqbEkn5bIdJeOLX0unvD1f7
cbp9X3r8zpr2tP4bZNLZwVWSN22bHHj2npCjOOT5bWR46a7xwSEv++HiCIj3yUVPHy2zfKSs4gBT
/85fxznR44xVxx++9waeOeuo4nbW94zzTmbonz7OGOJjRo2YuDckYkUbIIbFRWdMXK0bmZN2Aq+4
mtBJTJJvHO2BSd1pQ7dnGMVqM5GreLDV5k/GMC/2b4yRbvk2jBT0r/1Yl7ij0Wczr22YeupOki1H
/2h+fga2Ssl7OKl1faUM94due2dliMkYcTrt7/WiWoZKp3cg7S+WL1OaKR08eeSqtZGX/l4/b/CE
WYNTZ184Zxnd5op9Y8wG1l5XykrfpnBxcTYsnLz05IGb493ynIu7hsce2gj7Xv8Jn5zR4K4+67Tu
8yvOtP0d71pXTdZL2QA3mzZMv4q/zf6dE3/hgeO/He8640bb7pRtDDc36tP4b32cbSYfGbSrGhew
Wtr2btxXwXHwpiJwAOA3FclDzxGBhxwB4Rk9qC79MqNj/T026/vUCxpdmNlToqCXUq6Nli8KM4OT
dfYqV2BKJKa3RmM5mJ/QIP2SETRSup4ZoEGVoiIcfCZ8hjhnr3O+cSBYw8vGV4EDZYDRNQtWh/3g
Z+USZhYwAytK5lnOcdUay7mKFbgayGp3onTbA7qWSTHiV+WqFPuVSF6Ws9m15IQVkxeOBuha8mwq
nbhJ0mi2Rx0Hpy2siJ1+8GO/xOlB6GjEsR0JcAikVFmyGf1+xSAaufSUsW7PJbOilEGSfcjoWHtH
LBGRDi4H5+w2EG8ViptjEohXuV4mPxzKZJgdD68lf5UkQI6LNvcrsepoT0/1Ew90NqYKJ8bAm9jT
IxCtwEGLmduODKOgK8JhDTxYfWskvJ0pPe83GuDghOEJi6GyV9EYpkx25PuNHE510QVeMcuRrFPm
u1omFLYMUbNHcIZ2kooZc1ybIIXzHDKg6zRyFspVY5dTpufrQmvAN/q1csf9pi9tW6kN0TmX2EWc
0dPfW3bGlCEmd7FnTClcHG8FM0KEfmKCkXm15s8uqOOZMR9Z8CViPuN5GhPqLqeab/09sbNZo67T
bAOO82wn6NyHfScDji2bw9RK6emgmUJPUNUXbT6KdnPaMMaT9UWmV/dBsnCyMnI8NVBEpDcPRime
o5vytkTHMWuXBtB8afmSt3TPbaYismH4SqT6styyYck0e4x3kj9JWdh+yuB7x2T2CDQbWcw5pcMG
zyitlLqrZIotSf3F8qXvaBjMJGHpO0w94AbHzi2Re2NfMhXJTYr8KQtTTzXL1QaaTa25r8xM7vra
MKitzZpzDjNmjGhk6+qyOldbWzWYbaBqdbX5V3nzycYsOd3wvUWryId+tuFOwYbV0qI7dbRwPyxc
bSmTN17f0Hs+9op/87F1h+8b+4oqtdBxtkWrbfjMuvn3uIZ6qM3YSmzFfNzqu8EfB28wAgcAfoPB
PFQdEXioEchVkYT34tlkPCO0owPthdOUKHzlxLj7A8N8kEzvZfxklHJyRzorXKcUSfk45tNyVqUI
uemn8Uy8d0rSEIi5r/HNIUmqOD1KdAq0BkYSYgQrOmMAde9DpxFdnFUWo7JmpHUcmMpYjoduIkC/
lgHCw075SwRUrjXk2GZ5pzi4LL5RFPJ2Nv4UGbCZtaHZ6nzWgepvOCWNbBQX6WA/49XgSfBRkVEp
HFt/Y9Qcku2zodwhDeYKS1woOKEZcqcWvgVduxbA29qIMw94zrKyF1y0zsDPJ9ovFJp9HMolG6TN
CnvcckS4Xu+euPziS/ul59F3na6zT16WzaOOog0QGbcxaQt7VDu0CiJsx2rOmJ0cPM/t6a7x5NmK
F4r3fni2HUdac3FBofiy53KHTHJ3c34px/CfmA3fuNUjzf3hk5SpuC1+0m4CFUJ+Hm9tuIudpzaE
8a2HsqadHXZkmluuutjzqFOm+KIdN46e6Qs2bHykRbW/BcC6XW3i2f0pjnPqnzFH/4kvNKHl79aG
9Bd8NX0Zviff63aS82C3POomttDLY63gaCS0k+KOkq/brSc85+hONDt50Zvm8e5kmhftuet1TXX8
I+y2J+dAwltur7W8+opBzUbuJ8XiA91iO6VjmAxqVwcxKcab6/F8Sl25eR/YzaluXm76CC9aPQKL
M9zyt5nefRODpwWbZUw6nYsR3rLiwxWa9uPd4I3zLKwpPnJMI58pzW3Oi73ZzrOcbVm453v7rrjl
kGcc0gb0D0+X/W0z9mAz9te1kMJ1o87LSgLxQBn+KgH+tv0lpevuhO+NK8sX5hoB0XaqvprTnrbh
xc7aimrY42PNFd/44iJ2dZHx5Brpuq66yJ67MT+8bzLHwX1E4PgO8H1E9dD5tUXg+AzS1xL6b/1P
f70YXYOixF06Eia8SPYy3mYaZTk91ytuPAmyEkrRXqjmcs3djSfcdSKrRKGSuTKbJz3GUYxMBlgm
38hLqpFYM5bxGmG8pyHKScNexRd3UwYEaNwo5nat46Vj0K/Spc2lhKcqXf8oBczsXDn3FZstn1xu
PKbX7GUwZMxbVl4sVIpxWjpLdu2N5TLRVkXKy4XJkwfGXxWnA6PitMrH+cpubbHJfpVra4NXV7TB
h09z5DNnYU2jLKXL364X+85XiGNrtbYzfNFZmxqrdqkssOhjc+nS6ZRXOgXQdb1Xj3jyxqwsrddF
ZmVPDHz2OKJbbUwFKV/2aPhlm9KrD+X53/lY4u/+zXfXu+x2/KedMm9w+sXUTtGyq6+uFxdBnm/S
5ne4pxdP460x27/dm1948s+MVct84yPzRmrZ4b14crHw6pyX22N0B+JqGL9pt1Myu6KMMBun9XdQ
B3sZl8sc7d+rAZ2Twd2b5FcwTlaZAnk2p8f1jp4zVzSKtr1d+7Z3Tibb5O5Ly3X9Zq8Z7bbXZKZn
QfchkKfzJp8Jyq2UjPnZlI5VdLE55udyLacMz5LBxk1vcObhOPbUzOROOZVZKQ4pQevx27uURt0t
kxypPHXJef3ahjBPaf2VYCNGaiGZzLL8NGW1hJZpX+5wySQ69X06v5dL6fPbxadfMM6hTxm3jF51
eK3xC3dPaX9rWE32WtdoiKyXeMQkt3wmpeuFdkj9Vh1tUnrMRXTO5oAFrpEf//j4DvAd2s0XFDm+
A/wFA3aI/xWJwAGAv5aK+tbf+xs5FjdgzEWt1STUYWCTbKdM01nhqILBiejqHSCew4JMxr2JY42y
AlIaZ8JkJmGrdKOdwGaX9W2bQolgy3gpQV6SIMzSEFhIai8LA0s5cBHIJ5PA5zLVQBGONCxXFnlk
gUB6nfF6rbe0BhgjqbLkkTJSIonaC3miwag7sS4H6C/HwxjyNiYHLUtMVhn5hx5MlWYgLrZJxGW1
2ZHRKYF+4Z8njpWkrJUGGdAHkqwgpCrKqqgC7MMeH6iWA/deBD2LX+Bqap7XvhzTbnCbM4Ed+YiJ
sLGrT1v2XKyXvOxV2GFgv4vE1gdBLKgtKWKE1/vqZXj+gw8k++xvPls4YbBP+T6Kmbybpu4cHmnz
P3v565cX2r57kZNXM+jfnH/k4/Wvr7U9+96zRrkR43oVBrkBZjpK+nn1F1ff7Mi8kTru8D59+hS+
N9tbjclPoBhXQSI3yp39Mrzu395TQxueMokKBt5eeiYqvvNxXiATJXLJnKa0JR4Tu/DnwFdYS5Ob
mH+lEJPibLM6BqQ8m3KKpXfscca2+PMVbRB7e1T3ChKzX8BzTanETknM0win0eC2X2D5m3f15fid
+v4KSO/6DkILLadb1y09eiA0WhdMbw1hWK2F+bQ7fHjHnpSBhOWvRjXniIC6lmSn5nsvjO17bN5a
81mw8WV5R30xin72V96UQqumx2f0+2T9zp6gltnONdjX1+yfRYt7eXZf/V1XcTfUm65r4vzo8fEd
4Godb/Lf4zvAbzKah64jAg8+Au5K19tAfDnWLCLAgQHGvOgECjUM6xGz8Zy4NloWTJKMeVQYQgDn
GkNoJjBm5+qUBNDsXAFOdKwDFWS4FahPpUibz0vJ5y+KWwY3Sv6Fp8Ve2STtQTi2E/OiLOlRccAn
sBNl2YDAoiBw5403DFuYJtEikJRVdrxRaJgE0lNxAreOEqUHLiUCxrp4RyhypSgwJyCWqErAMDLj
hg3SfJXjn6NcNlxzlGK2raJtyZytRy6YmTomJfZW0Om8m0aEiUB3HLh+84u75MKvKyNtN4YoXVlU
p7LBcc5x8jooJE+FhL1VeiPeC5c73zmi1izNAWR1yLiOSI/J3oqtXiq0VwRwZ8wN4x2358LZ03xP
qmOQhl3SR1evhfGefs/Q5Ru6Bf37vady8+r6qn3HfeKvaES6fzI/WSkvr6Nf4JsdmTdS4R1ejSPI
djVm2EZsaxpzI5BskwOXJvodKacyq5dn8p+Nfo02c/5wIb22Z14FDciXtRMZFmpNrAie9/0kOc9O
icva17W3OO51oUmZ95yRkldo3MQSY2wqonoQson6Au/j7MnapbS/vmfu4pyWNMtXSI+7RBbdc1x9
WWjrObHxm/+282DTKh6LQkr1HeC6x+Z9KXTlXddFdfTyLreZD5yXpE8RJbKsO9g4bo50c8crO3P2
71yRePiY6BebXcryl/vn9NdzyPlL+TpeM4dLIFFlaYjI9Lzrto2UUcrypWaeTz3JyY9ceS2AxlsP
dhIx0p2yZGiT28if1k6kxAU5nh3b2k9rR6tY1nLtb+dgb5r38eNNR+CYA/ymI3roOyLwACMQyNDY
JvjYeCYmwgENwrzFW4uOs5s5kUngKCEToxTGr4InSQ9cZw3aKzneuTlr0Ji8XMMPIytKjP2lS1SK
cXXkvcwx1cCh0IPk0xzVHKXP47IHq1bp+CJ/QVkyxnaCCZt9TUuui/WlLB60khdI07HzRgQMyRpL
h82y3xgeZwndLDfLUnZvyQbLHgck7LGGKE7lSqzScyUw2U9evMZ+V1aOFhYWVbo0O7A5mUpxU7ry
Spu8kLz15F5REvfr4DxRhQp/4q9yuYr5NlKusOXIhx4jYTDt/FPKqy3Wdfxim+npux2nCkQ+Z70Q
MRceKbJTFqos2ZPbZlRnzXBbjIdrJGX6G6peSjf4igu3gW/6n9zkdTDIOtZYrhdfak1Mjq9ers14
/3sgkXkjVU94ux36Ioxg5ojc0/WcaZPbEcsd/90oZepr3563o/0Tt3U7H/wndZ2Ef+FDroi0AS50
N8fYXU6zYyjbTPealYa8YLs/q69lruO86/bFWuVWC6RNhv15761crb/0BPrdYvWN/SfxTLSMnp7f
2/OWGTXNzWic5QLpeZ46uVknGe/mbGGul1wloSI2ZFZ86NGjjubcUVueOpE5na0657gyl2HOwZ6z
eWFQ5zeKW165/F9G0o8D5rhO+TaYUpa/85g4cE+eNV4pup9klQ/bls32N2Tai60NaSE1bh51ptzk
e8cw23bX+yhl4121jW4D2Q7nPO3tfOy2Z7YTbKP0OO612VvPav7H0RuOwAGA33BAD3VHBB5iBAS3
kqkTpNHxtVErkfBbAjBs8YpGy5Guh55AkVEQ/GpsYgVJ14MQlCWMBJoVenmaa0HHg1C5XFaOH46H
suGokNuVX08N3gKzqXTwj/fwlmkh1kpSB9bAmOF857Dyzptv+eBhiV3kKOvE0i5r4XD9tDvpl8sl
GlG6bMBfImALwxI92lXilW1AwPHJubVGpNnjoFMOOL0P2gJJotnHueqVkQl6wIECoiEOOq0YZh1Z
OPsdZE/XnRV0f0SmWwnG5/pkYG8lyqnLmqUsHK4a0eZIRr14n2vAYq0ddw+6HfFfvxnT11BvgTUz
mfbjXPFGdV3fryKGbm+xClpZjoWyiu6G8cbfPMkazbhd6zVHcvod2m09AWHTdN/gg6wF13hc24yr
j/qh/Yx1krsvoBZh/gaH5U25RngbA9MyTSMlZkugBYNX82kXd9dtEmZsy+uGnm1LRvmunWehvocg
T83u+Ntkq0pmscS7b/YakcJlpZ45hxzN3IBuYHqXPWiGi3MLRPPUwLW50Vl8cpZCJLcrvc84pNfN
Ctb42LRwrAO84+swKePQGLv54d1Xf7G/fFm+52NoMYebjpXK1YldC3ttdfVl2zhhX5Nd7HZSvGjq
KQYyLWT8cHOn8Vjf8MlZi6Wtc7W2NnjHSGc9Yi3eVaNfrW6m7Dht33ZYeYFbULTYZqS5mnokhecP
z5SzuVrPrM28KhnvPRjvlDlh2olP+oJ3jlm3IqU024/NkTIizPWyiXnF5vj3PiJwAOD7iOqh84jA
A4sAOCowzLXZQv0JYxinBTI0GsnvyhZNxwje6MwWNNIxmOQiAVBAHaWTy+/ZUhNvP0I7L/0NXmXU
I1Dv4s4O6EWSKbXxjq4DKZRmoUTQlArSsZESmBYyNi2UsOFffLf2RQ7exjbWEI6T1hz2yDb5hb9O
D+NVFvtLz+BVIgjNxTHGOycbv4ivK1FcwFTpt3eRxaGLb9WiDaQtX5RX+NZGxgxbpWsvnTpqSUXG
eqIHQRowgNdQO8u4dAZjS2HkBTeCavCo4rYY4ILikUUluloXCe8YZl+DLDTCjHdoGymwHXG+8qh1
KsiQNRYh01kZw3uhTqloKtqNZKJfZBwtn5K1QFBlv461oMMvybxMVYxFj3bigwC9Lp0+lETj2/HP
jQpYSvf22Y9piu15GBtEU9TPyXdxm6lrmYcRkjfpZfNOSaQT5+Jv40Khfe644l0rHW0YXu78WIZO
H0iYmmUP0va16D3HMFSkjDm6aXC1Dd7guU7j7d9XMSxct5+lGbaZvLz9lw2ZDpM8ZpiHTNmzz1W2
tQ1pbXHUs9zlyxz34Ua+j9utKcjPXPuUunAyHU/bo/a9evdWBBSbwZFGeqUgQ4gmY7lSyqpOuZHX
rc6s5Ce3/DCtbuMRbYCYzPWKb7KEdlWO7Ot3y5dOf2kTaX/ffMw5L3vm8baUbP/GrmltccJnY5I1
cjZutOhu4bTYk5Tgw0e9ILNaYHXgduvKZ1xzv3D7VacZ+azm4597icABgO8lrIfSIwIPKwJ6xsSt
24g39sIhwlR64wEFGask1BRYQubCwMywBMwcyFDHRl8BFyWm4+vBAxeG4ZuxoVOSKgWkrUKlxxri
rBFaIMbCujkqWClgaXfOJkIWI6pcKpQ3Ntks83jmYZvrMzC2DUv0ZT1RHPKYymanwJ9hLRHAWsck
Z8MqC9rQ4LMe3JVoOblrW8tI49CpY4W5AN+MAAD/9ElEQVRX5eqndOqgkF4EM1g6i72wjFOA6OEj
XdLyQkV4L5nJ2EdKVUqOVaa+iICytF/4KNscgXzFkfGgX/z1PtCp/5KpVk05CFS9dvSXS0MYi3Cl
kC6HJh7u4yidMDto+V4iqxRGN4l4V7ZJq9aUktvkwcLt4sqYzspbfstkvc41cjHyIfwpODma3dSk
vk/rZiTfIU8UebjxaicPIyxvqurrsszxBcUjKZ4Twe643Nf20ezz7kY+D773jObtF2spi5tIVjrX
S7Gmvo/4sgX3crtwC+mUxRi3nsEAL67MmjNvHWd7s8rkpdseCqLczovkTSk109ISNfeyVuHa9DXA
/m17HyIC3Adgpwf3HuMjJL1l47lWSBdKShki2aw+MkTMoyryxlgpoZNbJSm72baUWDoRi0u1S2FO
LzacnUk7eNTFoLbk+EZx6jyXkvGv64J6DF9IITKzfjtl9YRW9Lqlzbm45X5HGK9j65jD1ranWx6b
D5hteNda7xo70UOQF89ctZNfpXZtsq0UfMS7jkC3wBGTvJpcm1i+UqxwXo/VLI5/33wEDgD85mN6
aDwi8PAiIGym54rwoV3P0bBPfUyKQdTo7881nLrHNNCdUJyeCX5YAtjiEQgmtIZIr31qA0+i38+1
SJcG2xPpT4txVYqeN0NexzHr+GWyryAlVo0ec0SNqK0Tllg6o6jpS8CvUePb43giqhRwNUDUEDdj
Qj7FreNjPA/qzjHPO3nr7xWw8hi/lEv2S0B/Mtjxz20gk6wF9HTtVMzX2a2PM5033YgYcTbaDG02
PpGS0K+DRnp+DcuxAgnzlpycfOHYkHYbwDZagvbf3eJh0pseicJB4IqALck6kg30L7Qvs7XUWyws
h5kK3jysoN56a01UAjllAq582b8fefvS2b/ijOF5fXM44tPf76UKFJb+RrFTvmLzuri/WlFts2lv
8L3dxnbtjZa5ZGpGer8r95zhlXITPwwS9kWSb979Xatu4aVfl9WG722eTRfbOxcgw75euCQX48dx
ccLJjyFD6dw5qxVlSoPnlhyscstsNNA+yyNCN32cKYGNSnN/N6i9mP4mDuTbsPPa7znAvgslR1r9
C2GHo9SxRWfo6Dj3vFx6FtDT0Wgesm9xRKlvev6540ITyRdnS2Cj7uacXsYFNK8bD6PB7e/mA885
z56buuyU5G626rT59LjtHwcbZvhU/ywdO3scwbCzY7vu2PYx5yfTczF47F2UMj67smiZ9nE9ZbjR
nU3heZHjzqr98zXvbpOuu3W9yKoYRJbtpy2kmW14ctrusd1DBA4AfA9BPVQeEXhwEdBbznUtpwze
AP+AfEBfTs81kEBBStEDRmLahNZe1Ehg/SRReoRgrzxoVggH9GKdO04vcayL2H1hOFjHK+txLq0j
nWOJlWKo2atPJ5Yzfo7n1sswIXyRpMvN9bRApMiwATjZY7ldCB+9h0POwd7y4so4UHvwuWzWXjrL
R8ZdZ7mSlCWUhfKLeLAGMtRPxzC0yTw/cNdgcp/FvPjQrs7ayMnrchZ/s45cENg1JfWbGnR6+i6C
QgZTpzYvMbwLinQjUvj/6N3XvuTDElWEMW3ofJn95WDd6kdf6FfpEpZFjYenZKjFeNoGpcsexRYb
lH6ZFZQjogljbDu0cJqy4YGbB2uGqg2+9eBXv/zVRx999P7773/wdz94/i+ep7Xh+1+Rv4qV6zIa
FQfJ53BMYyvy5C6uvf9H7+/+7pLrNhkq9XVRvfrvV88/fq7qUOkffPDBx//0Y2XBktvz3kXmtaWf
EaDLgHiOebynrREZuMc5fmGmvKYNgyJcg0gSs0S5hRsnU9cyId9MXWtQym4N5yljdJcYr9tGp3R9
cZ3uNqdku6oWuE+ZvmyPN6w1N0d6BIxtZpRmNOZsz836xuYUs3aKY6SxZa0x2nab0nezySviZUZV
PkrvCS9KNDZc4rznUErXYM96LcSVdoLJh1V5N+NpMufK7uY/F58c8mppc83nOSu4uVlk1mNiYzlB
WD5y59+mpJ3D60SqdUXg72RuV0qz9NWzE1eT2e/2t6+sVV/lY6dkTE5K2deF6ytaUXuxnYe82klH
lcj0XAB8cVQTt/dXl3f8/Mk1cSS8wQgcAPgNBvNQdUTgwUZAD1Qwng9yKosedOBbUmDnrmo+rWFb
MK5PC9/ooFHfpfOCYSyQ6BRsI51Pa+QzqOwyEXLkkozOSrOPIQZDj8vKLyRZXlv0y6oUW9UfAcaL
mBlryxdzexnf48U71o7O/UVVvLOwJefpInq+cfbxPzN3Ksnr/CpPzsK1p/Fygu8y3g9OzlJo4nA8
0h50zbEEHJnEi2VMjNOT78SfOrJVsenYsc19pVNTZ+cA52ht10JMCXaHQpSrGCoyyqXY0h50Cqyu
FAmDmf3eEPqVd7z16lT0TTil99LHsfXld4xIeaJCnagmpJhIIFCu0i/DjLCEVuGz/SWqsNY2jG1i
YEdkM3NyvTdPfjhHHEw1Nx7/8pe//Omf/fTpd5/+5Cc/ef6vnuv7QHfK9pYJxVtd8XtQkRF+1n+G
7xrzQu9o+yfeEJ7Hd8z+pcV+8qc/efHfX3z0jz/65M8+0V5fcv7Sqt5Uxh5ZAP9zI4tb4xEW+m1c
1+jOJFJrkIWbNjxZKUuGC7yRw9YyEthbpnjOLTAgGLCaqZsypLQMx1zFbJ1SCdi2CR06J+Gp080A
l6rF01bmmTI54XUVt7/N0Poaxzv6EeK4UxyHdEepzcmbr2OeJ8gqZcZqvZPTW8HBC+LjktYpfOxS
kHFK+75b8zkFmnnG8uIqTzlVeFrlyjYgy0mpGl/pPeaFlmBb4qzXhU7fkTEL2v0IlJ5tpmpwcZik
PK7xAtw5Bpvd2tYdpvQv2/oOs2N0sWfyt1u+N2w7l9L2Tzszkv5GcVo1mHx9ozjrzr7EeGnqjv+6
FH57nWpsi//oHWhOuFL47nHOUgYDw6vjET0Xx3ZvEfiWvnEv5f/233/yzz768b2Vcig+IvAVReCf
P/83//DvvX9a2H/4s//4T/7R3/+KjHh4xXzrD/9arbtrXJRr8M5jPfP00BX80A3nwijImI2lmBJT
6RR3fKO+eHD6lQieNqEduZySqE8apK3LAvc6V84rfhp8oxTHC5ywx8soIS1pSWkwDlxjpP0KmBqU
mZczWYgG7Clr8yeGOWNguatY5ym/iMsbIY68rFHWLwqhWWcyqzo20lijuFUK5UqDMCSWOLE9TbYW
SaxCoLz+TGUpztKg0kGelDLQ5u3HtOp+r43IGOtGDYJIq6cgH9tuBpQSvHS/hjkx6uKz+JpRtAQb
g2YHb1klgSc3WBjRwCY3qnDar1aMLIgXLGmmdWlfVRNZwoDnP/hIR8+ePYtsxeuiotEC2tlOZV6+
fHlH4CTu9/rX1x//i4+fPnUlehMVvJQ/efzDH/7w+9///kp859Hl9y41oPfydy/PSl5dXQm8yYZW
Ioytp/nP/vxnL168EMCQa6Ir72jh9PTsseyXPZxaaGr79tmr7L78i7tGZoZC9uunCvrkzz+RC9QO
Lpx19mwisXptKD788MPPXn0mAvjdd999/CSazgwyGk7r4vnz5zM4LYPlXfQv//Mvf/GLX/Bmhaq7
hFdtg7aH8I0YeDcyv/nbRrxjrePQM3ollv4tyo3yJl6llrcYdd+7YfmNzLx74EPL5M2z5A2kY6v7
T49Vbp2NS8OS5vG2q1Ulwm+00P1WN6dEdGtkckbYqwQ3pk3GdSuDI1N+pcB144hRbmsgZW0lc1vK
qIgNCho36rC22cJ5DNay5MrL+OeWh3XUf72ycS1mkW3j1kdAorhRcXsftx53o2qMt+sWWQ8gajkf
Z/52FPWy8/Q0vV4V8r5duDEXLOhR0yd+of/Gx5/byaamdinnLpnlb48yUF3wHaaZMtrnrr66q4ge
Cp398Y8PXLZrVW/g57/81/8OOHAwwG8gmoeKIwIPPgICIfUqEA9IY7Bkfa+NHnVWMqTrfyFSgQEn
Mj45iWIJ+CkeZ3mx8M/8K4waqMm5EuHkg3+NwoXPzBG8IL0Lg8+rnF67cLjOth7nUl7QFOtUwUuE
/XJEVgly9J63VanVKfaG4vGwLA4E9jK02XdkoqdfiPcyEiLZFoa/SlF6o1NJSi3pkgFhEkMwP5LG
7aEZe7TXH8DSBRArNCSHbK8DuxJwy4PwwYoAxazTci3KpR6RJA6KkmCqcDWF2mAMSCTvhB6/1xZG
lCaiPkG/OnsL+g1j/Bd8r4xXE6qYBM1LX4bihkflaWByoWW3Lm+NNPK4+bQFqc/L2Kk7/YGFxABv
5F26UNPHH38sMPbz//Rznf1pbaIlBfACO9Vr9E5SfKnQ74f/4EP9pSfK/qc//fTTTzWmV9lf/LcX
mf1uRr7Glw4X3/utOcDuckiUtbiUO0emmigtJP4UAFkefn3wYbjw04jAWWfPJt4xFOBqaRAS1vjn
T//rp1GQN2rgbF2cynRxCwl8/uhn/+ln16+uNdC9Vb2+ndAOYd5O22SvxDYR4HY8wmKMe2Zm6zSv
2AghjotlIj288P0nj+3VZGgTHflq3cjDGA8NXNF7GcLUvPEOWvg70tW+NtcahmUbmzwtre6LpDQC
2ceZ+bGzDe8Q8uAAI2/Pp+34z3mzhXNWBHo2LB4S5+a6O8Wc5/pr7/Lps06Bcnf8JPic7Nk/dcO3
fDffxRUSbu+K0079lV4PJtfLbs3nroWyfHMHiDtz+htcKEOxpL3fAXb+9hzaOae6UH1aVT1u7W/a
T0zaF+ZsF/e7WlHPmqZfAJl88LmlFc+cdhLnrjjqrll67K8ajMifzAFGf/YTjSjllT7ra4w7mG2s
r4vj4D4icADg+4jqofOIwEOLgOg+PSq0513HeCxT9HKjU9orxbhLfKxZOIuSclW0JPBPUEGYDfwp
1Oe8MXpWKKtRHzLav3AW6RSqeeG8EruI+a6B0ISFdEq5VLpl4ixwSD+NjrKsQkp+v7d8IeEwvhBd
HFwXlpZ+Hcdj0az1tFDaCt0F/yltkgQfCiHbtlwd2tg4Z0TLF8OksMo4k5HbvUoz46LjJUe+207Z
puMwQMbIBiUCtBx/CfNNY8Z795zkOH5Ra0dLktpRKlapdB07jCGpvJfpac6jtirWr1JGRjzGphTH
Lawirx0Jgtc+kgsLhU4lqPp9Zd4rjititxARgsTanjiM8QIh3Cvl+lNI9edqiiKIvyPTrS7eb/we
RjQKaeig56clHh7zJJv7zflacxVotLxuu7iIULz8dRY6xd/92+9CCzO1UoOlP/qnH33wDz6AbBQd
2sI7SbhfcaSQ2GxXfyF/H8VAa2fXTNfXmfZFzruKVVXM54yDoivXaNvsc/kiareyuPDsd9Mvfp51
9mziHUMh4lcAVX8i3qWnh2FPW26pi9vde+9vvxf4+c9+quHuooLvHovJ+kaofYfct8wa57xLR7Lf
tvs4WtFn16A+qm/JdAo4ttZAltgc76BTa0xErfC85kCOlGWt+Su+Oru6BqqRYzkXezT7nj9cKW1t
iDFTtFd4RjORKfs35e7ihkzNl05fPK81c/VM2tNVr8fc12zhMZfEpUfrD/QY42A7Zazlmwyeoxoy
9hhJ4t8pxEc9JpHCJebhMKwvXc/TikPPN0Zm7isyWb9jlnKWOORz9mnN7G2rNqtGE6V8oA/Le95v
t09k5JNTwl+24VG2hJJZM8nHTGC+i5u+V3vOdoKn+NhtoD3SovRjFeis5ZphG+255ief0WBt1E7U
Avr5zyn0ZaTB1JSF6+Y3aqq9s7XIrHujozHXfCa8EmiZXFB65spQHv/cSwQOAHwvYT2UHhF4YBGA
RbwcXKKQiR4VRnFrhV49YF4m95vfm/WjInhOCRs4Ab1y9qbSQSwXAUnWzF6DnJwhLBkjRrKHvItm
VnDgMdlgtUz+TLaBY9fSmmOscoVGSL80rjNyzmedHoT2iCHcOdWWYwO8QOkq+mWi9GZQ4wH61D4K
UctIM5ZhJzboWDHhGGRomVwbTJZLp2V6NnJ4JO9kjCKjvWyWp3Y/AB7pPNfRD7b3S+faK4WOgI6D
zmGV9jMdx7WXfsXTkQkvHOHwTqX7bFQfuN1YNHlpBxCMGgKKquSVJgxfiDeU2IMzGNhvRWG5fXnl
Y6H6J/grVWobekup0hmSHfHRWVulXXLgLiPGpSuvC8xeGPMA9d7f4yFXSp8d8y3Jfpe/H/z+DyT8
s5/9TFRwjFL+2c+6XLK3MUEe/vpa/O2H//jDnYU7SWDzpy8+/fS/fdqSjFJ+/+++Lwysaa76Uy4R
wtrIftPxa70IZytois9c8znZDBBUcSCvVTgF2n4l4kL49SL80k8lnnX2bOLtoehCmQOswc8aYR61
zMhVXx2qIMTO18VWBjpIEPpX//VXXfSP/uhHHz//+L3fe08dEL/4z7+4Syg6b8R2uxb0jhPOd+Xm
iue81h0/XDLBv/Xa5ttRxOH7nPHuW8HirHy2bQuedqy0HAgBTqyuDq6XmdJR3ciUTiKP/rQEm3cc
svvX1hU6fD9jP1fxbhzHZGvnSOli/DZ2TgZ4y/f6xmIfo5IWs5cpzKRoGfg9It/cI70MyHDj3cpn
DAejG6EZ8nPGbPOcWWvNlw4uNK5cojF9OVkLOmSYedsxIc7nUjCpOef0RTVJe4DjLbPzoH9OmfaL
XDMaVY+zrOZs06O2kHZbc7PzeI5sH76vh+AsHQ1EYDwQd/Of02t8KS/JRfbFgdvNjDm+cG8kbu2v
DzolQzdl+vI4Du4hAgcAvoegHiqPCDy4COgdxe/xsfdx8pOkXOQ6wImOkARNXST3mHyvn9es6pTr
ResYNKWHR2GhLAu8hAZ0kiIIqkRQmTc43tgMvZL1tTbOQlAHolNZ14W6OfaptZclUqIUi1E0SC8t
9HOu7WnfxXvL/mA81jufH8ZKEe51Wbw/AVxj096aQaSwxyEDmGxJ4Ld/xp9Kcd5lA5KjdvLYSDUk
5VG83RaSb7DqcIHtwxgs8VliGO+mnFKRbVW1AUF3HYZJWO5qzfZge4Rm6UpH7Bb0i/0dmGaAGRGA
bdhPn0tEqVuXji99Cg1KH1VQxGa8ozQv1G+Nk2vq1XfhcFbAO/LnD9577z3N5g1k+08/0p/GNmd1
tAYM+/zRD37wA71Eib/9yb/6SVrbjjcdZEkp1CBejXnucblKZFKrpgFrZG+Ojr4h+96AbDk3O1JI
ySEO7jc5LNY1rSj1cTXF10Qmxcr9cOGP3hf5y+Bh5gDf5OzZCHTQzodiuCn9CpI6CoSxKUVzsBV8
TdiOUeU31MVO5od/54dC0RrErvnYXbSyf/zRx6oFVdCP/uBHdwqFO1PgXUWg9XFEe45/PuV43aoz
/sXITUxLfaWerqnm7jrviR7cSbTGNeK7U9d7tv+tDFdxY+O6m428s0GisznYWhF32Tyux7Snv987
LJ+Id3raPHbj4SiLEjuSvb5x8XV5drCjnStw+Dadym2d3Z7394fmRbsFdu8bN0Ci3cxh8Zwb/XGD
3dpftbE84ou4JRktoTl/GNHmQudqw368ZkygJdFA3plyq4V5V5k+Mkf6NMWJM26UuPMX+5fkbnb3
XIOAtn2WH97GbRmJDbR8Sm+rps2Dow65jsCuvk7SM56zLqr1Jg9cc4P3bXL6kk3j+OdeInAsgnUv
YT2Ufl0ROBbB+loi/60//BtblHjtuabGJPFw1bGQj1CHKbtY9lmI9DJxI2QjyDlgnvKCdYUYJaMf
ElYWC8TjBJRofg/kBgTKEdHKq3JVomDGpYu7yFeMsERF+FEHN7gGMBudRooUKi9lyRJkAHgcyxI/
MVMAdKeywF0gQ2PaBMmUTrm2mSHZqa19MVoLvO3SQ4P0gAnL8fBd2a0/xydjoRRepi+BfuWL86bl
7QjvWfjCAe44hkt4nq3Qpf2VK/lkFaQU5w1TVSiuqS5cOmOwweRxAP5X+ZUuSUa2q8wz6NfvQ53u
PnUz81fxb9S+eHXVr+MTAwQcnMTnRNi+EMPwm7MXyvX8+x/rTI8fBv0mE0h0xjq6+R7Zo0/NPGh0
7uSvMO6r30Qzis8UDIuvK93bpuDEKk3NehUiihSPBSVc8c73+LEQ/j1F5qyzX00E7i20oVgxDK57
jk/e4d7ZGs8en7beL53SY6Fh1VqPL8bsJ+JidDOgDdSFNlJKRn7BQm9keuU5X+Bg1AQh2QlY1z6h
h02tPs3mtLteFjd+KsNtxHFm/nNAWXdEkhIHfqyA9/b3Ae5ata0IlJ2d0pB7EyUHKqPUeuad7Zbj
2ew6LE48H4G6Hle/yWnK9j7GNdtDfG+/72FOytQ8kUgZa62lzEwBW/advFuOx4d3vWNJtoH2caao
DVA7jK6nTseVQtGNPG/0pdueLZcN0T4HutZQ5Isn1WKRUYpXbOaRRMrG2rLNFrg9V+T9yNukLAvb
Fz+WV67y7o//5I9nEziO30gEehGsAwC/kXgeSt6WCBwA+GupiW/94V8vVOm3HEYOJ0Y1F5dAC1hi
QKu3Cv0KSTCqtkaPhlL9ZSO0BcwxPI68OnaueLS8DOY2xtM+DW3i94RzYl9YN3OBG433gNkaNBtv
NkohL6hY+hsBAhGN6MIpH4eMYV7O2jVqTVytY1B3If8ozsg8vrHEW5T0C9Ubo65vPhkQhlUdKx60
KlFbBSfjqUSjuNxkrf4An9L8IgxIzhzbpEely0fJEG0wNpa8WKPNo3RrbgSe7hvcEudeeyyiqpSu
qauyUyk+5n2XmcAxDzleNiMaJ3PbVpf8jRjYkXEl5J5egGg/jhtjs3OENm9aSpGnhsSKT6T45Tl7
Tx4///0PpSwAcL0cVzz9tlpzJjuxX207JeagjtfilX17pPHMp6c0O/Qm+bunp+Z3Hum7SqIiLy8v
7573C0t+7tHIpwjtJEWaY+Lul4rMLWE56+xXGoEvHLIvkuFzr5HmoK3elptw1+yd2ckM1LFa7LaF
n2KVKHViMAw/uS4W/qzr9Eum1JeH4pbA6NxdyhyVXeNaN0y4sUKi8cIt+xS63rYrWt2eMoMwsVPi
fFZp6kARpXnLmhW+Bat55tytZsLCjOfQyRWHzFxPeL+2c8t0NAqnNa5r5LZPYb3l4lqbtI+U8ne/
/vOtTTttHk1oYUsG7HR/BzKN/VibaspgA3U9+N4bfRnj25dMfTnsxrqz/k1tVsreF2qhVqhe9dI2
z3WqT9asXr63L5LRfxX/jPnw91gF+ovcRu8qewDgu0bqkPurFYEDAH8t9WUGWJvRaSAfQ52193td
vC5A04GywCdgYJAJaOqiAJ6PM12aC/2GjBFObtcFvcA5HQDbkLmMV2PsK2ddROIi4z1sWzYDfQVf
tadcYDBllSSPyWS5wc9KUi5hUUqRvDa92irFGZePRvX5OuWYhA3yV/9gG8fSSV4s8dn0AjNsFePA
rWNs2HO6Vfp6ITuVHNW3waUDi6b9jk/GyrWZFjo9x2MHCZRzgAMA27vAwwxA275/r5gUXg2YDQC2
s8mu+2dz9TnE3W1pfvW3EO+YkS6B62aA+/0bCiiU1hv5JmW79hUM8LnYfmPTnn3vWdXWhn3ixXTy
bw8tMm+kypntfEfOKnEjfUy34OHBdKXkjrU7d39ILITmHbNH31BdKfsrlzJ2fCaJW6C4cMXNsfui
MpMRjbx8QeemcRyvZdRrPPYGCZ/EZKGyvM8UlBpxWL1pNzO9K6pDZvYLEMPV44AYrON2Ts1NvQlU
zWw5UK8rSrNtbDnSvvD3baPaz01tZqXvOg50638t34vM9I6UYkdpO4tN3Y2InuOl73JcOBlOmOB0
veRIgV3tnGOn1xtI1c7yot5PXs/PV/s8GOA3cnfdKTk+g3QfUT10HhF4wBHgDSBQzXWhMrAQmES4
xawsKX5yGdGZwVtrJjWC7bPgpcKu+Z4B48cfb4HGnBMZrtnFvJNRuqDUReZK1ldnhajBljoFqkRn
7ZPOUlnOC7cQKzljW2P49qvygvQWHlMpIsesZI3Etm1JMnf7oS9gRIlYhY9t29O0MLlW40nGe4Oc
GZAcxwaimVfIU8Vh84iqxDLXrhTqlJoqRJo6W1K9HugceZPpdYp2uTSXoxftpMKIx/l+LK+TIlhl
yXCaR8bNPymL94+IkkLRtsnryxqLTs267yP5YYe6kEOYZg4t3/CY0dopRWMyPjDHcIIKesynX0O/
+X/uqyBK/fZG1S30O+ZwfvMD8mYrfUR1ji9tFjfbHu2zaoH4b2ROxwnnHSDvjasGt0h4vbWfnZGb
17UR1yi9rVpXB3dg78HJfWXNFA/GOJHpFDeqxN513Z2Wu5NpnLkQEbNeG+v6xpgpc13obb/DkvF9
Przw4r05UnfMzl3zgbnltu91kJbwvOg/7jn1E/2x/G+Vxan2AoyaKT0DmVm7zCmddm6P52rPEm49
aWr83mum+tCZluQD5SR9lkU9O4vQY7YBpVX0Nv42ji1P865CW51zbu82pze9aJQ71nxuZjstwV/v
w84x21k2dEqw0N7al2ix2Fazmjft06dShhY76rfrKBIdE1JabNNOqtep9WPJsd1HBI4h0PcR1UPn
1xaBgwH+WkL/rT/8ay5Xjw396fknzhMYBpN55UmqxlFJG0rGKIVcOV5aDyQh23ju5CTekBFiBM/o
GSPJl55CDCEshZI3Xo1jlSUkprIkpkIFhGSGVJVVwRaSAtcqdCSrpN/wKeEu9mu7GOyrTUr0q3S7
ljONrT9eSsHkGKNjlx4mOW9O6AWFXntENOU6VkQmNmzGHReEa6x3HauCSUYOKovkHVVQbmBaybed
zriGneOU47BmKSOgvXMx8vmmXCz+LKdy7LFqQVZd5nxjuiFyFrSrO9a7kqdOjIWvVK7KuopVsulB
0PbKJYNgz+6fSKtia7+i/+KzR08UAQXTe3kTGNj7aAOKmwoqL9bYAWyW/KUnTktX1NTz73+ko/kN
oXiDYTVgb8ntzPlyMAzFjWgIdMwBK5BMrm/qpi8V5xzgOVp1IIdF9bzzKOcAP4zIvJEaV3jPMMCD
pbypTWb6aKUrpb/r0+25x4KSwqpvo5r2fC+6gHOINSc2Uta4myK41ujrHpJzciCZOf9zhfHcXN8N
u3t2zmfFCiMn93uaMlnEpRnMWbPcV4/D7p7QM2Y7bufm957O+N1wvHhb9720Z6RkzDsou5icjBtH
cBOlm+eTb1rI9O60FZ2d2ZuPjNEeKmVhNgcn7dm2n1XRJ0fdo9Gs7+y/OFOPhcy7j+OMzGzhu5qy
YZsRDX4M4UX2p4yU1c7P1tS2jqjfDRtfLWfjXc8T7hrcphwM8C0N5kufOhjgLx26I+MRgSMCpxEQ
xgB75LN4s5ZVoF/hNG2CRsAwI1vgIuxrY+DQAWAz6gv0K6wI3NUj0ggWdBoPMCOxVGVsGWXx0lbG
5OhiECZ4Cc0GYzl0VhltTPzJF+dlha2c8WuFwSEbv6XNKtroPdGvcrmUKNF4OKenWmGsz+S8OR8Y
NFv6s2gDqky3SaHfeC+/0OuDCI6iZ/QbncokYrNt4J0jvSDFZ7VLdE0pqo7K1SvQkDcxuR1J8K8S
HeGY52zL8ztGKt1wN+IjB/VHqH3Q60urjqIo6kvo1yTQTehXgsKWYbiEXsZ870C/oHflugoomlid
vgw004pcOvaA9hk1HbOjqR3j5N7S33xf6WQYp1jppGbH5fsZDECYFtr0NvON/1Mk5OxmZHi93fYb
6uKHa1Whb3xY3pSDhHfDVfqq7JTZJgM3egRHMqv01DBCYSCTzbgGZOIWVDJu873uUV0vm7N7DGZ7
lgbb1CixS8+rxj2bSXANycXCmVvbWZ4c71zneY5htncT2UaT07bjb3cy4tmmzFzDuSwMq+DlQIOD
/1zcXSOl6XX08Y1I8tN/pxzv0kx1tmSPm9hpQ4bo8UVi+xv3HNc49yW8w+aZsrhfo8TJFfOIAZul
nZ1SfDIWrvod1rbl6bujR2Lypa4n/dzUb8mgEw52lkItpHd45HHsu5Tlacl3fTkWi+WOCNS9ekWy
+jfPpHBfLy/antkeOiZN3q52zgrhRHtbI8vmLWOf9bj7GvOUGVd0NoXjnzcagYMBfqPhPJR93RE4
GOCvpQb2q0DnXN/rApN6jBmG5XpRIJlCocz7Bd/mOFVj6cAzQzJO8dSUNmnmAM08uyRQ2GYRDoWa
dD6/NkT2p16D6qLykshPm9GUaafHw1j6i1VOC225zsRZNLy0JTYvsTrmxbO8ZkHHc3NMErZ8RsBi
+NhzpJM1ndYaW9Y706h0AnK6VTrIMJe8vqpFrbFcW0UmDMAX6HQjz7BfArYQSM/s6ESbFiAOAX19
7GFmsYnvjZHP9ebXc4AnBo6yrJmxzfDqUZp5qozGdX2f2dau5cHdoxG5CgMHsLisFblIp17kwuXz
77+vo2SAz81snGyw/drww6S8/HWQwFqBeTdR7TT6f0VT9CYnclLb5dNLsAeO5Kv2DVycInP18irC
Ytj8V9T3r8DsDq9WwIJxWuN1J64rLneNjh7zFRdvdspV9gpS3BPm6m7bNr+435bxZbvnx25JiZsD
dwAfjH4lUhbPSWSnzLlY4xdnJrc5UzacZ0eMtZSax+sxHbeu654N+2Tu64YP7Bi6L6C318vc1NO3
i9WMw7n4nMZkh//Pt5+ezzzGsOQIl5tSbpkrXjb3mPO8IRCTk3qfKZMTpsdhtpbsg9iNMZmM6Cm3
f9IT93q/tuMgNteFXZvXQjbUWe/VeqMHoeYA55W7m4+9bbebmjq3dmC389mqDwb4Pu7DxyJY9xHV
Q+fXH4EDAH8tdeBVoItZjaeCkMzAisC5xJ8FYllyeX09iGehcV2yvsIz14ly4U5zNeOnXr1Zr3QC
sRLQZjSb8FUpwqh6+Ig5tAbGSOcay9Jv5Bbo97JyETNnXCOTlQvQaKTKV3xz3qy8w1rrCf7zKpFY
LFn5tF7bQI/tO96pdGxW3njkFYzvxImx9T7h9P6SU8Jmx1AmQfyuFcVA+8bku/WcM5IDgcd7oWwA
we76JkD19brFG6TE4v3GSDj0d31Zp0TAtHFsYMzYs8j69NErRy/W5Va6/QYPr/dCI9XgVOXOZX7o
SJF8Ash3SrxxymCbzWjtWA/85aMn2GMN7GPRLAnTAeFcva51rS7+/Pc/1om1CrTf2xLjYVWEfR3M
tz1OMcrx+tX1ZLqc7Ru0eRFdwbOb3rNxdX/WTSci84rKPrYbIuDw6oMrZ0bM8mWaW8bZgkV3Y5hP
UjbNuKxYWHReg5w9HZdb6RPBLqzeGLXR++0phUuz5UwkMFcq2s3djdvL+DJZXKlfPIWxJ4pbMb0N
2JKB9+q+wdfFLezizJrPI0Qpw+2MG92AxB32HD9Cxr6f9FWTXX5558kIw8fOeG5TuPmkTI1PSeR2
l1Wgz62KvEb8zqZ6CsI7ZevL9G7ht5LZp+Ad/RS16AN8b6yJzOpl7RcP4bkK9FwX+txY5Tl6edVL
N/WuqZOUfOCN2jzvS9ca6zwPX+bq3Mm0b31hzWdaQviup6Iv4envXBf6WAX6Ph4eBwC+j6geOr/+
CBwA+Gupg2CAGcPcc2Vz4K6BEx+qTXxi7LTmrwqcCORcGs/4YK0tXEiYJY5is54EjddFdUrD1aPP
n3lvQAjLlzgQTKvSQZ5gp3gLKm1Xxr2SV14fJwuqY5CkVApKNc60hbFpLyXOxWxYcFdzpMqu84kV
JaPg6LdylTvZRyCvOSXDtGfzMXOnA38qtkL1cl+SwpAOGvNpU1jp7ZfdXBYOVIzjaWHjdnxBg/6k
VgXJksaNLihK95bfWJY97pUIOyXp46B8nRJjzxQT2e/XPv3iZUgjnyOeNlUpGtUc4n6dzQA41Lz/
kBRvSOBtex2vCqUtZwXrbPsC8idWWCi/1JCIlXJSBRfPv/+BTFgM8MAbyefcmoL98016jRAOm7dv
57x5b7+hmkzF6TzPgWEmn0Psb2R47rKq7c0yKL+do7gr16Qx4QzO3K1pvC39dg6ZvC2jL3DGWPQi
k+9uSUo2yjqdcffbxa0tOVM7k1ubvOKtJS49jWxHW8oLsFvC7ei3ZzxKvvEDlpz27Oy4Ly7P2d5o
1ZMBPu0zavYPQwssTd5yujCPb5EJg4clNNTXpmwwJEw4a2L1t6xp83f8WrI1LINXz12lzZTTY6TO
ytwUqzmDlIyvSwkfT/nS+tJs3lV7pHc7c7r2wVmZjsDNvq9ewt2YmsLziw3uu80deX4w57xHTZ5/
8tU3rNoweyJyXENVSnPRjZyVEl/9zZ7f1U42bPZggGntkxNeKXN2+nZd6OzjqPXY8t5O+6x+ooMB
vumO8dukH3OAf5voHXmPCBwR2EUAVKZXBGOhgI7ag1t0IBRnQBJ7vUgZlqxRZBdGXIY6sQdTtRKd
1bE2wRgfB6rRMYiUFws0gNN4UbMBUQpI2LkS/4CsrD9ZX8tkCn5Jm2x2FtBmPPUBY1JLoVKiEg3J
eBNd6Nf6A8jJTiPDsMHoq+fHpgbjyUTj+K4UouFgEsZ4/PP6JQ3aK9raEzHcz9fTtDnyAkd1ltKl
h60lsZkSifl6Z80Q5chnoo397kdYccCewDtZXPxCUpjfx2GDNasQtYdmBSUVx2iQhcLDF/ZL7ngf
/Q68+WGbXFCK0smllwTSVbQstG0ZDQXQMWGlbsZyZ6xcX7t3WV6p+33dx7enREHIeOtRc50SYfDZ
NQ+NtzfPHCZkS2arJ2cXMx+v9NDqOmWOht3pmahsvkv1MfL9FnhW524E6Wsx59SZ6HeMQc34jHI1
XXBn29JQ3Fej6JgvWhjytZZMy/O4LTm79u+086ZSbvVltoEzUa16jB6TbZ1uIt+9QtvWmK0l27Z/
dUuYdNwul6842vBqab2GLUpnizrXGruFp50nMo2plrZxZXWuDQs62vC8ClZkTi3ZfcuXKw5cwfzJ
cgdsH3v+6zWfe54tpTs9Z8/SJvNWua6vvGtVxKIFlkzd/yuG3N8qnufPIlN/67oe80XT2jGPNGPS
KxXvZofWTOP0iF4eZgvjIxGIO3Mdd2ynwRUTzFt3rWnzVmb6svdr61HrXFZV/N2R6XmzI6VrbUVj
zJFekvCu9GhUxDba8L3aQPo149/e0aXa10Kz06NdrSt3O793RczaiH+Xte5vPbO6Ipz3Jezn3tJ7
z2Ke9+ps3sc/9xCBb9+DzkPlEYEjAg8vAvk2pgfARdN5xidgMN77jT0CtYKNG9soi461F2IRIOw9
8koBDbKXGvaNOYVRrT/KEkYC4RR8Cg3OGIN4623JT1+rcK6kBzmQGZTVFopLRDO+kFVnhbtsA6gm
beD4MlTFGGyVa8zZXuN7lg5CwxJJqlzj/JxJ6zNpqg3LFZUpC7/QvCt9pui4SsxcctC4MUrkLDHH
RxVEDJUiL6gjcC8yxNmGsc/aJLxWpU2q9CuZ23zDyFIC08oGKsg6Q02xwdgWiF0ldgtpDca609+U
ueCFygrtYFqOhdv45On1T74DZSTzbaZqzWL1lYtGsNbrIgc7BEvZCNbl4hw1vmZCpmRWrmXmLNDi
D0lfetDfLGLNy53a+uxeZ+mfGjbaembplqU8I3PC7r5Gz7ATBJvyGkN4WtaOOz2ZL/caDLxdOemM
/t1s25OZt3f1ZYzm3dXdbAPNbQY7V/iwWw6tCKQ620nXO4NdkV8yuxTfSzcy3F29zfaTSZRVjPq+
jXVZ5vEyS8mvlmZWWWcv1uW2bOANXgava6R7eWYb3sVwcF+rFk5lmlUL7bl+WJSlUQMRL4+tjbt9
XSlTpq3yWSyMUakdE2zmbF/LKrFl8m7v6pi1Vj+7plogU7I7b8UkSpG2WSI2ew5z2q9jZMqjTOea
avme7z18r0fDNm97VzoxD2383XQcZxWVKUML5h5INPLGHjiur/Rp59SfMnjBldh+VT3OlL2eXV3H
uCHbP9se9sxroS6lXVTJq/acdV25pr8z5p2O/G2+dHxGPe79xfddXffldxzcQwQOAHwPQT1UHhF4
aBEIBPWykIYeQleer2s00rgxnpzX5oENmUDFwdGBc3g5NKoE5Tb/GaueSt74KkYFS4PLCn5Vx0ZQ
yQrqGOQme7p0jpUXCy8SWWVZKlEpwDYdO3vOvAXvvRgIUHokLEOx/MKrNOGLDHYK7PQ6tk6sitJt
Q3gnR2xMdsZTrvI6JdgGFeRAhbzzRt+wzuKvNBhXa+Ns2kxsHcmIjxE7yDmOsVDyLqIlUwM6/boA
Yx9G+phxxdSdDItotx7qVCmuQX/Q0sOhw8RHr1RiHdcbeVnyWfgXeWXsdeiMSNoGVV/8yZJL24xV
kiZFAlIuC1WQWposcQqMsc4wRoDogfBzDW3j9ubwHTyaXSKT+S1HsErbjMw7uS509v1bBn4SYfSs
dXqdPd7q4PdKhpRkxrYyizcbbCRZwXJhbe33KYUVkdlgv1s5zJR8Hc+542wbe2RZJ0hyL3/Kr072
Y3q34+4GLprcSPuY/p7YPyNwGre9/eeiupEZ/G2+8VePRtRm219tYMk0O3fSTs62gdlOGPsNl7VY
phu+r5vtpDlnWvhkj/1Ov2lFtP8p07lqjEMyaW7Dau0p32xht8mRktEYKwmfaauj7yN0bnsuYGjz
SnEEzqeQq9YJWzLNBo+2xBWazCH1VTxhxnabK6wyp5fXO56OlEyfMlVToXnLIkZKM4TSBB9YKXmL
cAoWxoa1xeKSslq7y0oWlGvEna2Th/TNtlaBnmww9x8s575k39edbXpdxy2w2oDveXvGstpq3glL
czP2XVb2/pQXm1rAu76nDR47c7nkFYGMTd2HuzXmYy5Q8aoR7sdTplIW21/37E1k+kqx11kXrqO5
CnTHNtsYtTP5+UrpyKfk7tvOXNLHdj8ROADw/cT10HpE4EFFIDDSM6M+ASThBOOWwDMXhV6EZ4xX
tQXHqJ9CKX79Y8Ymx5xinDNoOSQNtxjzLE41kbaxKOVqT3qs+gt+AyOBToWRjDlzlq/SDaWYGgq3
2bN/A5P7LN9JirPSLw3SDMAXsrKF8V1Z7fHFj8ooxTYAvWAm0xcd2Pf0TgeXiZP9GM7ZqsnbSKdK
sbY1xzjKtp3y2n3wyd/q+CLxdthAzHVkC0NS8rJfXnBsDIzkYoDRYPOYN7tYVkUAhKl0GaYD6lHH
3ljNO4d246NiaBtYD0zlRFQdFdV1MFqPY7QzQwpDG+X6p+ox3smkUMWBby0fYkbCmldMLWfbcDQi
NqprWxisu+RliUylvTka6TXaCCa2rmN68bNfn3RIgGY2QKFbmUaPrS3xsDPme//gRhYqA2M3T2Vm
aTJmcVzMXuOHXUrK29pGXHm8XUloltvMzAYnn3CnU0/r3+lZGib+3HLUs5TX2Db54Tvb/3rbdsz5
juueHONNvG4xbNRRv0kngh2rHFMjwSPBgo42s3hR2xMytIHu3di1tDFSPdoJHLIhTbbbbp8nPTXZ
lmBxT7ncvIeYvy2ZTWufHDJe0D4nL1rjGmb8d1fBZsREM7fEcLS3My1/XBczbnFc8yQjJtTXTKGU
6CxzlMYI6pQf4w42MuN6zKseRlRaqv1s0rkzzD/iUyl5HxgCze9pLaR17dueDNRkesP6st+ccPLb
zZT22RtSlnduOWlb33MGh0yUet+2nfF3er3zt++Zdjl5eNp2DVZakaQvZnL1U2awuG15RoPxz1Mn
PPDk0omMU9qFXQS47rKyOKgrcdVpX5vw/zUugMth+hL26L9ZX4xH2PH2kmmuu+q9ZZBf/o7nVBp3
/PNGI3AA4DcazkPZEYGHGYFEVkAa8Kf2evyApgTkDHcDNRUyDFzEWTCbkXOshiWoY2SbM2yV5QLG
s4m6lZIYWJjnyohR+EfYqXELLxnSKXvAOS4lnlJWC/IM/bYtRu0aZSWGL0vyi006C6YyKmtOLzQ3
SrxM3jWKcDRyRqsKlTbtKdfGBLPt445DYL/KBRNOL4BWUWZd5UfCsUo3itvMa1UEiC3peCpJpRj7
Jetr3xfb47rQRkzY4HJXPSostgQ835qTo5Y8NYtmSnTtRwJ14RKfgDyVwquvrOoSFUxnzB4EB80j
GavnQpIAZqfTtxI1i35pU6B0rL3+ruyGohFkTfH5ig8+Uq6z91avPk3CRFbLLGZsy7kRt+YfWjLx
TJEqyQNUQanTLWchH3iY5uUot/lhRtaVjL3OvOsbxc2e7b4g0szY5DZ7zZVCeqmnZXb2zPRzMo0G
z/LD+DXZv0Qst7LZb0xmxzFuWfFp27KwUdnke/uY2qH9MOuvEew5mT0z1rU824CvtWx7biqg3NUa
Z/uEizttjSXjbiP/tZ5maG0zlvc+WnjPZifXlG+1OwvjTngyv/0c85xtu66mTZxHj8nmipv8PzXI
bMlZmy1T9SWnUqbQICkrfcfuzrOnc4mJUgUKjJ0/x6nkBp2y7hWTTSWe25mxcUXfYebqnM27mUNr
7jGvu+2s1Kk5ZYphDhu4sc8v1jplMsY3sZ3ZonjqSYn+pbV0SnXBNEPOV3zzKuu5zZSomHAPti8r
PsXzt7W7szM9e5dOvr67yYud84poy/sp0Cn9ZGxfKmUzS7y56I7tqS8nKZDh+JtXgWWU3ldcymzH
VhDDY7uPCBwA+D6ieug8IvDAIhAPDN/fzVnlky2OhWyNcnN7muOTJRPzeDlLLiETPx/Mb3i1Z6VI
vnFLnY2OWJeVSNtP2UA15v1AXAF1wDkq+iqRT6SoRLCiNKPHksDOZH3dbRzvhUZuyeIaQQW7+DLX
x4reZbQJD+MXlsgve5FWGX9iW2zaS4PKNZYOr0GGxE0G468RNT3i2sUBndmUpbNKeVrMs3Uyczhn
4Vbp0f2s0i2fRAR6iBLeOZKZIj1WGymyTa8myn6CkFMn6docwzi88J64Pc0U9KekxWOssqxVEC6z
dCmg2eR8Qr+oEZOIg9tGWKUsLnGdxX7CRRN6lrFVotpYxE174qbIu6bm5vY2eS1a4J7z2bJkk1XL
97DB36IeVqqJhUg5x8WdlVkIx7mS9wtnwt/F3zb62o4uRuYs7wraWSzEOM5cc+ZelRWVNtJ3x+nv
ltPbyExedyDMGROsmjbMlPYoy2oWZbCs0+tbIpDouiJ5NkqLh3HMpy/ddpZMoc2zrSLZyMoGjkpu
sNqJ2/NqlJt24nRSFjF1ytnOFK70bm/cOqYeimpyrNrVPldbVFfEQvtnvei2il+DNd0d06ezry9S
4Dl3XPHkbLF28rq7FOoLGVjBvjabFYTNaxt2/F7eKkel9Kp4xUwSUrg7gpl1OtMr5tl+zs3/zLww
tNjc3hXPuUuZPHCW67tg9pT1/GHiMHjRVVZzrUQAprT/qLv6uTmG8x8+Tq87vefE9tWa9dU+7jjh
jsw2Ah3hvAYrMkRp+QvLOs92vSi126GrY3LO3OrX1V1xWO284pB9UpOvnvy5olIxQT9NbpbVQZ4c
L5dAt0NCveGB113hOHrzETgA8JuP6aHxiMCDiwDjaVm4KJ43QhoXCfMCc4qdMzZLZlgoS8fex3hj
5TVOYNYreA/WMYhBJV4FbgnJfJ4mLkp0URA6cgnnSB6kpL/GPDLASDU2Y6E4lmQ8gHyMbSBSCcsG
7WW50tFjv+K7Phxjlc+mNpcVcdDe2J5JquGFAxL93FIlAZViX0B3Ob/X2nKTmNJtQPQxK0o+BUJO
UkIpslySnW40SwrzjeE8QZ7xzSQkHa74oxTkXQtRisx23thkp6sm7FT8lRELfYzvsc62hDlFNFyP
8arxMthaKoIejQim0HXlDcmrrIXoEDHwDs2GrNla3BL4ulXGTWf9l2WFb/kze15eVF1LxlUQtskX
10sYgzZvhAIuyy9Dd0pRfngzcnnjOFkgUrK1V0Gdq3mGm2Wqlv2et5VPbBA1m5ojpccj2JJO4U0u
Md5qRSVzTvOSn+Nvt4jaQU/N6X8h5MU7dbmDUWyuo7nTxYcQjZFrcssZTxeW/EnLz5HbWw2d6wzH
XnNH8eVsWZtcwwsinxHolkNK8aLty2oV5JrtZKR0bd5JZrZYmvEtKd3UG8V1++xLYJcyvUOmo3Q6
WmG08xlJil1RGm1mRbv521GbWWvbOZzRToqnDZ2TU43fI8W/djI5e3Y307XrtC78VeN9K6irLNq7
E1fNklKWr7PbUqK/g6u4S+kZoSN9z+hWm9yvk2w9HefM5fvZfv3nXUzKkf28X9pku9keYa1K6rtE
axhxO62LtuQ8R439Pau/IrBJ2dZv3ivwerfGdWkjJqm5Zk1HULqd8CDruuAJsJ1jnO11sOszJfJW
6amHdrb16DQFjjdHMeCv/0vcy4AoZPpsyXARHds9ReAAwPcU2EPtEYGHFAHwbeAWI6JEkhdGGnpT
B/0KKYGswF2XHg1LolKUrkSxdrzPCaUIQaHh0jNaddbwKflS46sAS0JWhXuZl5tzYnUs/FMaYhIp
mEEpRq3wgZHiffK9slMKZYPKsrGs55zHygXC12ZE1/wwOhtFp20SAyOV45ERHyVvxGggsVAx0Uht
OosGe4GetbfNYSF+caw/5cISRbVyRfR8NjQ4kQjATtNZEAqIjM7KqhdVd1iLJDIcOxrxYsFP6r3q
OtC7G0Ok6PiqCrIOLI+ZwI5DuCygW+0he0ysM4CxasrlRiYZrxLxrjyKGIK67WAMkAbxXlpe2Xyc
8l2DZE98mGdRsuPTdjKU0zxeYeBOyel8Z2XCd1uZrSjRS6TAqnU9OqVZ0MxV3/kEa5ErEG8zM7sU
IgKfdioDNwI/VuOlI0OzxMXKdpROWdn2hbe35Dda5+B1qZssa8cnV/qytufCVawWP7zTeQPXnfJo
PmUs8bftxJ5m/mcu4laRDJmZgoZdytn1k3d6ug2452UxaTOdY9pttt46duuq+1IisRtTuj23J7MF
VgOO+cBsxY6ur6FW3ZEy391pgRmfilv3BCVTV/Ny472/ef5GQZPPr+MNDwzfy/xJan9whnPN5LZ8
wwdilW+e7PvawdldyuI8u2YlIx11xWWbr3ax4X4pZTCoGc/JqZZMRiMfLjlXNr3rcQf4DgferGPz
nzNlrB0949NeL99v4kuLV++ALK+x300u5q7zZEGP/hu24W/IDI502V+1EGe3vPdpSugvmeS9m4Md
cZ41S6xWG6YuVFO2fLHBlRJ29vAoyZzzBe/S38EJ73zH38XPl+W6ZNZVYNwbGyO3a4bLRqbne9cY
8nHVHodvMgIHAH6T0Tx0HRF4oBFY7JmfE8kJzGPeHq4SkSaDKjR7HRFbKz8/Nh4EkoGT9U4m/ANC
1rugdCpRD2MfB6EHZjOWa5aPLw/zgdxAaGgQRnJxsfmAqae50lIjRukEVfJWJxnjybAKNMVGOsdO
byZkc1zikd0aQlzyhVHz/FXLmSvW93Kv8mvJiTCN+sB1EQeHaI3cbk91oFNE4ypfWYibtoyhXchZ
1sSnUGtG/trMc71ht4+RyzizIxPRUIm2JPQoqthJG1AV0AbsXO4lX5ZIUGcJbWzSQ15etkiVQmHg
inDULBgABFh+dS9DkNJ2ivaQs5fxF51VC6l9sX9YmAyPNe/e49uX5LW6dMzvb65OrnUnU3FYvErB
jx2HHO9Mp6zylj9MxuB0DucpF92+tI+9xm/zOWMlpxWHLQYmfXKwE/fucu0YXdfWimrOc6b0Uyaw
53yenYtbNu/Z4GZRuh633nU75A1+sS7Iz3WPR0r2SnTK5NvR7znbtIKpJ1sUXiNDn8tsXdTIjMxo
M4k0GgOXfspaV1aBqNmGs012BCgFrqzb4UhZLb94zmu+wDxtO639uQJ2R2OOyR9zfbPFjlaUNWgm
bc+SdRuAeRsy4UXcJ8sjjjulPe306Tt3tnlFdEpfuTOF43MpxJO/Gb0lv+OcfV9tOzMaM2V8F3dJ
Nvu9k6TuaPNdj4NfnfGZs47Px61iFa20nN14N1nWwdxG65jr5w89ix3dfrMXLpdcG8vnWsrwvURs
693e/nmWGnHzni1kpVDv/Ees8jG64XI3dUqPT9eyZ03vmfnTmpWQlvIu27ifn/F3ROCMTF7nxz/3
EoEDAN9LWA+lRwQeVgRgCJmECfxggDFIUj9hI5OZbPQFaxddopbxX7xGGrfkC6WwnJKsOalCZ2km
NuYSg4G111NKeXVsBEhPMCsMx9nrUmtL9DAKa5UuTAWiVi4hTKyyJfmFJPQYJSYMljEuMchGycsG
pchmpfg9OMfo+qmJOwwGTo4UeZWlRMlc5czVVh5rRNmLiIPy6kCl69gWJiOdL9MVW5cFbsy+gEtH
tfAkVoUGe5M8uVL8UCZvRth+BbWO13Ywjp3e8eErwaHKNZ6IlMg4ekrOEQFCthaLcPkUWcRLh1rL
x0JWF7m2dtaLdYZaZVcdOdRrtjMYWCm152xw3aRIOXsio2P7mKOg49eOXwXfbti8ZNfT0YzSZM+I
G5pPv8Va+VJGP1u/cyW/l2Hc6EnOAeZqt+pv6UkkU+xc8pmFxFJ/2QBCu0kmz875rgPRTTsXC1fv
rytllLW44sI/bU+WteV4V19DMbH9Zt9cbrw34wXvo9Rgpzie+5jANyJT3ONKOedvn+3aa8SYKJe6
29bLeZnBKnf/yC3tJLlE6pe+NtpV88DdZrrVnZWh7jpv18uIAGkzMp0ScYbZnrHdMtj0Weyjuk2Z
Mqs9zPm9k9WE52y03PN+lbJdK5h+hGZK1zHMMGenzA3phGjFmYidpkhX1wUycQdz9Cav275bSd8W
NpzkKZeLbcShbN77WzLT6yVDfE5jso3AWne64zPt172175DTu2oT+S/+Ere+pmZT5BpsDrb8RR4O
P/2NZ0FGe+Pvdp3kJXMyR/psG8hm3yZtOf+sl1nLVeld70RytoR9So9H0BVxazvczOY9md29uOIt
t7/aw+ptrwv4+PeNRuAAwG80nIeyIwIPMwKB5UT3CaUAaS5qBix4+MJrIzsRRBSgVKDuOmf2MvNT
m15q4ws6xn4NX3OeLc/LxsMqUThH+yujJrCiHkiywXAx+muVxZAv9kZZUYTQ1ONHn73g7dAapNOJ
eSzQZWOCbVO6JClaRqoITDV+C9SnXHLckrGBaZWuOIDZnBjalEtxsDZmGucnc7HN9itdOV4RMRdH
b8JaicoyBCqAnNUnT+7IJxML8pSA9g5aalBeWaUSC+0T+UTOhEsWSsa5whrc0bGqTN5J4CprUKOa
wwBjV1ZgfqWflzHaWc7msWy4fnT9NPoFXrnq401PeiwpmVjY2UVE94eEXb+BsVWczLk0aFeQr/xG
IhllqbahU6wmnStm28igi5WCp6RceRS9NdBmckz1mk3qOG5mz3aKcjWmSpmel1u5qkaKVWCeJO3N
ldXoDg2d0qipNeggObFmltyLEVxcXyPINA9ZnN7mm7FGL6SkDUYse5ka+byYCmSKl0h7zDxnTCbL
Zx8TqY5xsPjVjMeep4XvnXl3PLNntKYNrb/GV2dsC91NjuWMv81hwvb0eOlo1VFHZ2OiaHfddY2k
za6X9Ii2wWXoiu7WsrhlWGWzRhuZyRmSd9dOmr2caz7TKqouZq7FPO/sybvQsHCk0M+S7dNqiUla
Wykhg/2k1CzWrAunZNuulr9h17cM/4b1nfzwbix01/iu7ppjbHlqs66srqkzKSPv5tos2jD8b8aP
enEKXmcW3aJbnopjyAwylbJaOONdnbtZ7hTD8i2bvV/zebKLfB94zFNFM/i59YTMTjN3o8mZY23d
pXoJ4n2KxOKRZO+6DVSubjl9O0pOlZZxbj5tRska7MyyPNtfjymoIHdf2LR/+ptcsXTWbTOvNeqO
xKrNriCc6ixZyzZqc2VRd32Fokpp3OddI1xEq53ojK4UIuB7DjI519cpEXDfxDpKG5ntUyZNPf55
oxH41vX1tRT+23//yT/76MdvVPOh7IjA1xCBf/783/zDv/f+acH/4c/+4z/5R3//azDoYRT5rT/8
68WzGXT5pSqH6YIqcy5uhwOspb3RyMqijEIvTu8ZvKhK9lX3Kx0rrx4e1ryYUp7Jft3nGR65JC97
4i5XY6ql39rgD5P1NY6KXN6nzahqJQZgrbOPc60siUm4ca/tzFcJGeAIZImcMhiLA/3V2TDcrhGZ
jIDVwqhHymWBUiuJQgvNIpAMLelUhLMi2W83Tsst+Q0Vikm2MMchUyMIOubCt0LI8exXXcvIK5O3
vEgZedJ9kK8dGOmzUbjgro+fGLtmP4h18znorNOqxJyUSE19FhqS9VVeFSp7vA+se5VfGG6WvgfP
Z09HxyFi+Pz3PlCZz373WfWD1FkClT0CHZ9tCvBjK9OIaIdPdpwkKKVlGhk6dmsO7dQ/NWBQI8M+
nnpulMnQW8OYk5nyv01KjXdd9mznKK73V+wfZeHLjfvGq9sR0c2Y9Xs/86WXL57f2+XuY7uNdpY+
+wLazkL+y8KBwycS3tQgtXxap5Uy2wB1vdrPqcw8W61u3966Ndb87dvbMCj37jKJCfvqqCtj/ktd
nJ5pDLB6H3qu+A79zh6KW45nSy4Of1PX1aLmtTDb2Eqvmlpmb/sXbonzit5pzOnBUa9fd0bQa1Cc
3mq3W5ZvIzPb/OTGa8zzJp4nV9zmuj57xc1WWs+FRJXdw4IWWqARdWzjDtYpe3+JQPs7ahOVs1VQ
RPa84J387e/9tr+31rVy/erqVy+uPr369dV1dw6ea6hfcdrF48eX37189/K9Z5fP9jEZazqse9Ro
J3/8J3/8FVv7EIr7l//63wEHDgD8EKr7Afl4AOCvpbK/9T/+9cXH5sjeCyNJPTLF5hkVa68X1OSH
DZPi/UBoBBxr+eRpG4aZyYyZw5c57rdnq+ZY3OuE1vHuK0kQFOUWTg6d0qB0CfPO5wd5PsVBejaD
uaxplTCVtBV+i6d+57UvAYzBtCBG/AWLorO88+O+UHfVD8bk5rPRwew3+LStUN/CY6TAecoexVPM
ql4bruv7THIBRxIJrMinPfPdhYihzdaKZYWFpg8ivbOy5E51Vva5NnsfiN21HNDXnorXTQ1Cy7LH
3Q0h5q4EyUSEwYHUEWW5DcxeiV6IO4KPDd2WXIMx+l368cL1K80qUbxx9msIqxMNt43shYkSn3//
I2kNAGzlvJesN/izKbyXwPN85v778XZbVfnV/usBeBdaS4wQ3QEdLRnWLtqh8S+XMtstARh4TL/W
W/UWXWxKb1RzKjODOs/Osk5lbi7r1MI3kzK9/lLHe5x52hfjrqbGmRMzEIDzKWMUesrcnLLpj7gB
s53KnEm5GcHSPBK/CefUDTnR5knoAgvdLjNrX5pb/ubLcY0vYD5qs989zmJcGuHd7TLCb4xD1s3o
bbgz3OL4TQNrzViuwQVxn45bYpPbX+2t7ebS2k5aUdX1i5cvPvnlJ2+LkefseP/77z/77jO1EzoL
sDztd+RnH03cCh4//vGfHMTkm6/SAwC/+ZgeGt+GCBwA+GuphW/94d+q4c1AL70HCM8Yh2yIuIsa
kFyIBXSaM4SVUQLXfg5fGtUI5xjj9ShoGN0csdzARsLaKMtF79EvlpifzBG2xrr5UoVV2muTTr8M
MYa505MfpnTwmwuCKdUg3uBCddYwTxuIcbG7oG7llW2CahSk7LY8xugKKyo7oesYurjYWrNTFnoE
ybdfXYrSZaFMsoX5t9MvzSrI4DO//CRJyyTORDOJqDKw4ThZX1cBKJcXRI1zjjHStjq85Jl+aXTt
LoMY927smkhVtU/E0KCyjMoyFI5qkLoutPH/wtJYW70A2YeislQQFfR0sf1hmCwJAP/8+x+ohGfP
nmFqjINljLHfeqVOM+J6dF/K1Gq3L3/98kLbd9Wzb8u/vi1w+K81iuv68ull8jPgih6xzDsiaAeO
tLHHTgb+8wYeNevjrEzhnCXTq/JkLd7K8Z5yxTs+uS1H2xe1c/i7YeNv0tNMV0XyNG6TDYuzM5LA
hh4pSusake/21vW1WDWJNmi/hXNrsZswNjXRZ/nZnCSnSGGs7xwkUqc2zN4X4i1rLO6mR2nHf76O
3T3DbY6xANnSTsYOzPTTi/KU23x9yi7C/Jy9EpXCtaMr8S25M9x0T+o7RvTl9Z2h5iNkrmp7En7b
3Gn7T+v6Z7/85NO/eKFa+MHv//Diu3pevC3b9a9f/uI//1yWv/u9Zz9870ebp8zjC+ab9HOHu0em
PHp0MMD3UYsNgI85wPcR3kPnEYEHFgFWaYrX60KGoF/m/QZ6qbOArkBxhOjKCAom0Mg23swMAkG5
gS0b+TiFgVihWX+BpZxiPTEP2egxy6V06bfaZBeLh1w4VudQJQ2Gi/FGe1lrVoPDpQcECxr3Hr8S
uUmJ8wZg4xXThUIsJ5KUDhWhdGlDRgYbEmvNZ5Az3sVZiRnrwh5jfzK0dNW3pCMM7x3f+1WUHIH4
8hBxrrCAyXOkqI4VWEqEg6XEQtGh0+4k3ysDnCKDA/1SF0qUEiU6gK/kqdFvlO4KDQHtZQlOKa9M
cPRiFPRVrX/m0qPG7SN56S9gAnaMu1bpYndHTGI8NjFTO9FZfJEXskfHPiCFPoLkxp1YW+AQ3s6L
gVzz1kLOZ9kb1Vy/infcp997+rWjXxkjG2SJ7Hl57RZFMBqP7XwcwwLXSOyWca9KIje3QGSyF+Bc
SuIHJKNyK1dFTCmTZ1uRnFHtuYulZ6PNvSG32DDtjLdGbKgpeSsm+EK93+7dbBsjJuDVjEnL7L6s
2+1kO4I0o0rtVHvbRWP1Gc04NFKt2YZp/y1f/VUW/qrFZhBANegpO7MGaw55nnUvyZrNOI6zJ4UZ
rVs7N9eRribGr9Y8RnpeWmczvbvR0fQ9bdbXneNg6RnJ26O9wHL+26ZnECoUIeFWmhqUTi7aA3+V
sqzt7D7IUrr9zFWRHdu3587QLX930HeM1Z5rBvKMGBF4C91p+xMx0h78p5HPcvb7v//DxxdPPwun
3pY/2fP97/9QtsnCvB9WO6fXtVtyXl+dkk/qmyrzSP9tI3AA4N82gkf+IwJHBJL90xtCrsl8mdxv
3MEvDUX0Z/QYoEh/4GRtOgvWZS8ZPcz0INBZ70FTsbe8dtEHT17pJEkIBwQofo8ihAcoV2gKhOZc
yZ2CYwtpoyGtss4oPYBaHCc/KZ1+VGUud9mO92CnOyWxFo1CShwBcGz8YbO0YY8N019yiZRokewF
6GOnJ6sMhpQSa1t8KSbDoGr/tI6JvCMJGo9jAoWkIty9DIWBsRa/AutSnG2OU4as1GakvMzI6ExG
2yUSsahH+jiwoeriiVFryKt0WdvRxlq3B7oVQtIWBraxO12bLdmjA4L1tWfZp2CPsi3JHrVS2k9E
nlGLJT2+u0t++zJl9Gqo98LN63W/QH9NB7KHl/uccWffsZmUtJ/0kXIqX23vJDInceh5vCt6yBRb
GGXVLNwZ4X3MQTUDMWbMp55Tzca6qyyQduk542O2hnV9zTql9IxYXvUVgbyut5HEH/dzNepesc32
XzLbellr7XZdDE9T50yhlVJreQVVSsHjbMmUO7ZZF9nCRz22TpDqxn6XRXpstdYUMrGWb8nnnNUe
vdk8bY0Hbi43+cZaDQsGUttmLih6tms+n5UJbdYAV5b7jhs8rVvgatJOWfGvJreiuk1JC/NuHAqX
NuqibXC5b+Gd4abbVNzBxjWZfUPtqbxxz87bdqNrd9Kw+V3fWF/K98AncTN82/4eO+CycL/etYdN
xTXSbZ5x0d26Nhf08eMNR+AAwG84oIe6IwIPMQKJkbobXo8iPUWvjaAM/BJHvTSCMl4NflJvcjo2
2gl5PSQKRzEquOe7xkLBxrEhhnKpkrxf0hIDu6DYJCyIchWMZaBfsJPRY659JTGBKPBkvLoU1+qM
YY/+5rENA6/mskx457zSkwyzUkom2Vr7pXWkEzdiKhY6DqYdcsx2RIl0W9VcN5J+48+VwAJoyRJF
wEgveg0ULnKxd7lZio3kzXjN7yW2TyMxcKaOnYu500mNUGvCnCpd9dJht2TMc7PBoVkHUqW9LLH9
SduCn4mnSwwxVxyBX/OZfYyP6kPpitZLeFhIm3HosrVI3ng4N9dC+qgiKhqRRWr9NixN6SMeVU4i
tn0X35zdrpFLS36rXrDa98Vu9brQrqDJfIpzcIVF5S5OrFJAdIvndEiTrxurYW9koh5DbMMYG09u
+NKWQXLGv5GkE6eetLAY3UatYf/pt477u77lneTxl1fnPfuKd81SOlfGZzDGgdDy6su4LX/7Uhnr
Bs/xAimJPZPFtUmT2cbIXQyzprarQM+oLuZzXbQR27ThNEq+8DbxnzwtZ9nPVbiRafZ4sKmNjYlS
o9nZuhIDD064GeBsXdK8W+d5pESb7O/B9nj7seZzelQRXqjPXuTPbgODi6ZSTmth1m9WXLdebjKK
ECncWnsV6LfsznDTbWrdLcuXrl/f2+te+ra6k50afQfrB1zUsmrkrfzjjjdHIujYy0P2tZPrQk+Z
vlEeB/cQgQMA30NQD5VHBB5aBJg1ynzL2ATP9PPCBwIMlx6hKgxzmURLcjUXZgjh64RVBGku6zu3
BlSkw3ZGXim02nit914lxhhp5e0/cJr2l0aeEgPr9l6WFJaL7yfVcyngFfjWaC1oRk7JErsAik5w
JduUbvnAbOA6aVP6Y3+bBzwJrnN6PKQlg22y4erR589qxLiLiFLsYOwrgFGikSoYVSOc+YRP4nkh
w0LmMLFMl81c9iWOy5ew1jWy1ogiMtLjGtRkXaYNRy77GHypEnVWeQWDFQd5pFKAqS4i8Inyugbh
/HMMuT2C5WYO8GMJSOw66jS8KL9CQEHQuGjpk4zOOZ70jyQ+7yp27UeNSKdzvaNIvihuWRldNdro
CMBfxk4DrYvqie6TYo3yeH5/lca6ZTWzpt7Of+zXHJu94WObRTz3veLF6dX6wLBq0Q4Kr3Y0ElF3
fGDUK6phw5hVmJpbJm4ItnPL8XZdNNqMhhu1Rmt3v0OvXQwOGSW2zslnLp07PrmqzzeX+p6t28zi
WimifZko/Qb70wb0eMTBjg9PX/ImWOMLmtel9NECV5ukPXe5VYMZZ9J39o/aob9gJ5PeVa4VN2Li
+pqsePD5kxOu9bE6hol+iWevcdX6+7u+zSeXjJ8RtSYW86VnivmxTOm1u2hFk4OdKUTyNEU+KfHx
4oE3FDEPG8rq9jmI37wi1A5bpm8msym+nTeHc1adRqmD9lfDibqZrFv63ejfn3/8iZrZm9rfpT80
49nffO5rBL7X7a2rY92F/mpUw19VKw8A/Fe15g67jwi8TRFwR3ggtOvEeDF41RvzcmOdJCMoVqgy
yVDzS5UXvEeiEJ0krxbjF5p1VnldCiCTN8LIQl50+mcgLqPNHAMsvGQNyUai3/bkt3axTTJosGFw
11GQLAGDgZwvLaAilCIZmx1WyV9nT1bTViUPjMvOFZqlRylip19Yj9IFhgFsssSYMNPRbERNSjK0
4AHZjDbtXTo4Ie2xhaGzU3SMzbIN+9sLu6wqS4AqSRXtWgjQob1s0P5pscoqzoiXngi9K79yrMC6
MV9XB9rrWPhZkkbL+MigRPosqOVEOK4XhZCuh9jjtQ7Arjpnm6PGibNdy8HY6Hdb2oyNJwKFfkOP
W0LWx5rN2Ewgp/bs6MCBcD5v11/b3LNDcWOiR+PYU1aWaGzY0cF/dqxSpucJWznIan1BtAK75hI3
F52jJCpu0TS41kpPDBFUjaclgQNhHbfQIlNIpLgqtI+z7riW8W5wzjPXaS2vs11ua9jORm40W9fd
KKvmBq9yb57JvLFhy42vNjl6ItYKW47h4u5oA/C0Z+f6ZrirbTs+Xe/gWFI2rPi4Flb6WPms5ZPX
hdHqsdB86pWRz/1915bpL+XUTNSQyZvh0tOVknrM4mbLaUtku6/KKL1XHYvbkb+hTQoyxbCtS3j6
yE1stq62jVtrt8y2gTWiyfJX5Y/W0iOGRjx3vr+lHlVj3t0E7jL19xf/4mff/+hHknwje2m7S6HY
m/Pbaf/0rjIC5SRljU1oT4+DNx2BAwC/6Yge+o4IPMQIFP4RY6NtM4pYKRAJQiyXPAW8F5pC0mgn
9kopFMcKxj1nteE0eCk0cJZ3aB1cp+ZEfdhjTB5v85c+Jq+FI4V3a+m5DFAUx0/HKlwlH5Lgruuc
OxrHRteBJI0Jk18ytkykamSYOFkyV7aZlySLgajDX0O4jAPasNDCvIU3m5HgH9uUEZbDwC9ZMqek
DWgY+5wHS6jsUXhRMkqUyowbuWSJbCOSjahtXsdWx68kI+myWXw4erIUffU3KyfrTu7HSTTLYKFT
Y3K29Ii6kwxlET0VrcjbntRA+5H7xFAHjmFstoe8nIpjlUXkczvlzTix4wabJ4wg3Y1k+EJiP/L2
hbJM4bS520xjwuayqC/5BdtAU8zWlf52SvKQ2YqqUrbzXRf/tuOTs++mymJ+ZpW7bCgLm2fe2ba4
zTkHG3Z0svRbv7gK9j62TN55lkzaU2+iy04dnfVrRCw87JgMlL6iVxHuN92k14gGeYvCWjaXqlMW
6EwKPO1g4Fsm37BHjS8mv9rAWZnNFdGjmpsnL2S7rpEpY48a/WZL265DPvlhCW9sqPmQ3Z4XG7zT
PNpVyigSBLO/ystP+dPzzCulJTfxr+ybPhcnps1VX8mQV2MI/b6Bf+nrtzP+lveBuxuQF3vfE/CF
WPE0eRPuvNaeL+0vLWR3Ewub77C99+EP7yB1V5E7asNY5vf2vPpoq1xZI/JrnEXfr5a3x9GbjMAB
gN9kNA9dRwQeagTMyMXNXPsLjwEGWSn9ZWIPxv3GPV1nJWYMyc9I0dukXp5eJuaJVw1OgVjo8gc3
knJhuKY/HThXlCv9nEWbchkaxfhYUiysDUaRs4miVZxOCUeBjrQHNV3lOOfQLxl7mlwlKFTptg2b
01pDL7jZYGNUit0M1lRRUkrjyXgsVje2ZCo9y7LZ0OYRAUmqFOlxbNkyJmBguWD5xKtY2JK2JOAi
eqg1M8yxwjOo3nlZa6pXz4bpxZeYtqQiOCtJ20PPQiKNlyaTpNx9B8F12wBGhss2/UouGkssH6ll
UnLgZo+7HnkboFshbaAGK87Jn7u+qEHiH3wRtaNE20Mb8Jb8W3BU/q9SfG6lbPjhu5E87//R+/pr
/mT3c8+rZFUGpvoyf509QmTbibm1LR/7bLPB25Rqh4kiUgMyNROVKK1SCsKlDJpHJKN0nGo9W55z
U4rjn4iFXL3SMn757Xx5t9M55Kedp/YnauqeAuq9eNplP/1K5VG28JEy9ezbT7euGZPdTOBZUx03
eO8ZsZkia4rnXwxe6cm6rrWmVgv3TWbPNt85ZXK/oYf6ba6YVW1rPDk1vmRq9eZMn/Wry3KuKd0r
Eve1GfeK4s04y389WzvLGVdNX7lTW90C84rw9Z41S+1wBxiM6Gy3bTkxpEcj49kpdbnd8fr95S9/
yT3hV7/81cryZe8Dr7m9nN5VhrXTuxXtO7tD0fH3/vsfffTRp7/69I4RyBZ+54I2ap0r6iKHHRG4
O/VB/OonP//5P/2p/j74QfY58vO1cH0KdBZpu0vGtK9HE3CNsF76OM52xdXaD+7MfPzzhiNwAOA3
HNBD3RGBBxmBi/Wl1uQVhUOEQPQmJ7zhTbNAkwHWj6eJteJ1VpDM7xPMIg4spBQdo9OJoJfEq6Bf
YRjt45GX8DLwlRCXFKLNr918yzdmsQKulEsySjeEC+bE+C25X5UrhVfWaT1xVnmvDb60NzgEWelf
Rvn2WR0mhkSPs4P2A4A5GokSbX+uQaVERcMvaIv31iuWcllPsNM2MnQqo7yQ5SoLj+xLrPXlaGBt
7hU3v0nn8Gz0d3wEqpUFC5UO+nVZ0pneoc3x9yPZ8S7USrTjMa0UHdtTsLE0P1Em6bT9ET3Z7OJk
p37mqGbpV5rKdTqWh8GutWanI9rSrxTVlMVy3jgeWRtMPs0pxwtgeZWeLxOWZPSBt8WYzbVtLRz9
9DZ9wyh2zrfzoNjOmD3L1mulwhNuvV4pcx6v0dfkFcFjGwayZQpDJqvpIe6LYSYX/BKRRHOnnJsr
27wfYsyndVsqPTOlWazyPa0FpTjXZGXhXTdMckepNKx6vyll8sPIbBnjMHTOASYmp/PJndJvuktm
IHNyJTZzAOgjWCVWbAOFNrs7ONuIYa3nvNqz62W1f8vDTd0oQ7knaz5HiscAL+7XKdiT1lZVRgoj
n6EZxxzIrOK5um/cKyzTc5KrFc8W3k19d3CRfWGr5awWVc0p/aXd9hiKYn1TvttMrTidV1bPIa+W
2RfUaw8EgJH5xS9/8VrhexToOPT9oePwRUr95JNPPv7445d/8fKnn/z0i+T7LWQ1l/vxRbb5vred
Qv2TlHc/+AGlPrt8dvFEz4uy4Q55T7sqQttdMlLIbg6w2o/+qyuRcQTJD9d18VsE6Mj6mggcAPho
IkcEjgi8kQjo3g0iMqaKtz0hjYsEk/HTICpxiH6C6PzgSmRrLNfYNVSBVaRNmIe3TKWg/7K4XGfP
s2Az9ID0rgIF5cxkI6Jcy0pnhQBVtlRd+LjwZI7NRoME7FGObZY7zgI2S45R+u1pz60FE8ZGNGSP
Ugw4Q7IKzdHadienkNkYUOWyp0uXHtyXy0SYmMTLrXPp+EWusBVnscFmLGwgMxylxUKrxKtidCWL
PfLU6Wmzy4o4SydvDK5BXh0yzk5P5pl6FjJn76pMthabHVtGBCRXaQxPJOPzv4qw6k5mEG0dd9tQ
ihRqr7yKg2MVYXFswwYleusSc1C0UyRI5AkN/A/MUh0vvssOTN6Mn3f5a/0I98+Xv375k5/85IMP
Pnj/777//F89f/ny5TwbNEptolNe/PcXX6As+jtcKQsvbVcbhj2b7GimNPe185cqbp1b/SDVPa84
Y7vljVOyZ/9Gd8qIMNFu7rrL3TGiyJQlvH3uU/Bia5vmgp6pd3fhhIZuCaTUPn0fKamZW9mIzGRs
4vjcfOm9jEuBOw35Wa6Uj5SUmfJdU5Ur2y3jKntO76lfpIBOq4VP/Zs2P0YQNDMPC7rm9DbfW1wW
bSzt2fG6VeNwd+DhLNFVmWs+411Bi6wdbmWzhY/2mZU7W+yo2c64qbVTbdPaW47rOmof735nkC9X
2v77lT7irU0H2uZdghtAX/66RehGodvFvGPMG4WO8Z3Eu98xMhRcQdUqZoTvriorS7dvf4homfd3
3xcwfvEi7mNx6/tT3/rKzr4r/upXv5J3ujEy9/W1f1i+aTnW9dqMEvj0p7+g3J/98uc/+r0fztvv
xZPHH//Rhz//+Ke/+PiTj9//UD919oO/8/4v/sUn7/7uM/3pgJ9o0IG03aVQ5OF7aTN5PBngOR+Y
9GO7zwgcAPg+o3voPiLwUCIAmm3EomPBmKfF33IWZKJ0QRAkOeYs3J3Twa6BVPTHmy7aYPm06fgq
mUbQ2sJUhQmT7QSXKouLDhvQpp+XxZoWkoxufqXXu3XOZI7HVs1QtaS2BOcyry03Kgv0iEf2ca0a
Zcn0S081WYKPssdRSv7Wp9IXWW5EF2+ojW911g/FkC/ETj9CRljxMXrslIwhlitWTws5IOn4EOow
Bz34RbSxDUtUbmHa7jUPDU6Pt1WVS/Twrv1STp0K4JJrg4WMLDG2D85fzL8tDBZCeqTTMQRv098R
I7d1ljZTcYv1t12nyXuXJdGn3r5YJ07FocuqbfFds2++uSyCAifGOjra7tLfX/H54O9+wF8W+Pmj
n/7pTz/99FO9BX70jz968d9e/PTPfpqNCs3ePtT2Dz7Ui694lTsV51yJT5oRzcgMXgsZkFufzYon
qgRpxSfbFfq7z2XK7NY6Jm/rKY+SWys7W2ZjCTU7bNug3GzhFaXVp1NZKuWmshYvXXVKzsX79WVQ
PGqbs9E5W8WQvEUGNLhi23VUbLm4yngnnuUa4c+UfG/elrjLlYzrKKvZ7GlDo1Nwb9vG2zl2gpA3
nBWxGrN8s/S55vNYmTmvl12KKcews9aFjlqeXHRc6SuFYxrMvFrPpNAAup1k7Z759m+2zzHftdtA
e9020DeRpfsgIzbmBq8epbvdHET/Pn7yWNe47gNSGGxwQXFZvbv8f/rTn+pGIeEPP/gw7hg/XXcM
3Vj0M1K85fFdbOirjIhFree9rte4vtOdZ9zoBHSlStN6lRFLtOkuJ3jPXU4/P/2vn/7whz/UPXB6
oUHg+vnu33w375Nfwv66UO+CRS/ffw/xn//qF+9eXgYJ7E15P/7Rh+89e/ejP3v+/p9++N7vvvvR
jz5U4vOf/+TTqxcf/cEH+tOBfr73j39IFh1I210KzSK237jOldXnVaanzPEd4L7t3vPBAYDvOcCH
+iMCDyICxkXwqwIzyc9cGb1or3S9NhWyDR5GuEX4SlBHOEfHRkrBzV7W/FXJXxXvqvcPSUqzz0II
s5Yy3GnOHC4cu9hF46iQMcSCNdWmV7tgOJVdmkHdssHoN9ccts4wXn/KonQLayM93kGVRSn6o1xw
4EtjmIoDvvPJ3Mht+kJbzk2VPTp+UfJG5sGUgjOJRr3uR4lGgPlNY0UM3402443B5i187lLWmk86
dtG5cnUFLcoyKo6puS6iOV4pD8tdL5rNm4wxCFZ/knUww04gqwzwMePYQ172q1xeH3VAGxDulW06
drWyVrYGS4e8NYeb1IskXRBeg4oz5sRQcVaEjaK1DzbYpUQcqJfaU2KmS5Uj7615j0YOu5QlU/ik
897loF8EW/jqL2TzI3Edz58/14H4n1M9z373mTalCwPfpRS7VmsCDyYHXnTh9uiCKF7OWTbMDynN
fFIwMs1MjlWL0rDd93iLUVxmo5NWOmM++Y1eDVUCNNTOVZAmsVn3vEyZytXsSpc+fT8tvfnPFSUi
CXtcXjfyz7bRPGe3n+Yqdynl7+QJMxquCzfvEBI7Dae6szw5ruZpmy+9JWV+2bhqc8MJFzdLb8ga
7zDXdt5+1zdlJF2+b9hgeK3dXN+zKzzn5bnRk623SkzcFbcQj3xuOFQp2ZbiFuTR4I/9tWcih4XV
bn2bGtx+qWqZVS91LeSc0uZ++xrhKtjN4Vy39NXeX3skv0R4fvbqM3G8ARo/fxQ/x+Wwu/y5Y3Qi
P9ne/dvvvra4WwSyBXabp/UqfvMqu1sButHhyyd//olyCNJ/9E8/+uAffMBd7vrX19oLCWv/3u+9
N7vVlKIsYsID/XLt33GjNtcVE9nusiDz1Se/ogQJ//Q///z93/9h/9SgaB3/5IOPP/nwJxHey2eh
8LNHz3/+iXCy/nSgn0rsLNJ2l0Izw7b9RA8XV+uYW74ZN3HHUBxiXyoCBwD+UmE7Mh0ROCKwiQDY
ZqJZ45bk5YyC4Bv1vIpve0peoMsyAY10rP2lka3BTM/LTVSsFMOzRKRGRIF/QEfa8yppLEQpOS9U
mnWMftINhMBpOZLW6TsmmYnHYY8lAb0bHGVwlTOKQW56HltVYnVnzG/nyncJS4nEwM9KIQL2OvGz
8to8bRElRyMdVxIgU/LtqSWXv/hlO/E6eVQibGAZNsvILKO8VjAvkvbLuKFBkrLBXkRs5ab2SrSG
HDfu2mTZLdmsEliTLFjWqxwZrrToWdA56dRZLLS2KJU4qDrQLEkjWKzV+UDIrsGcCUzF2Z5E9bIf
AoMQGVSA/xsSE5MITtnvd+MNwwa3VqhgHW/5wLv09/frbAsTcf28/N6lDhjvpwGB+pvCiH364lP9
6UDvhXcpjlzMk1zzHvGF/qCMyVameUjyt8yOh2yOVAI9Z5W87v3ZM6jbFNfFRuZsSnKJp5bUu+Z5
fnvHP+/8xfICmaG71pFuDrBTdnFrDJCcub1AZvGQRKzjM45nTM7KdNvLumv+rd7oFwe7LXHXYtGT
vQNDcqY0ym2si81LxqMbMoX005TibOFCs76ayx1f6J0sMY2KFHoZos1sOeFM6W/w0uXR8pW3y+2z
KdMzirc8bUS0ek+yjkrtGgvQtmFn3kbqeMrX7N+N/dhczeAul6pkAu5+9tnl715y+esgIXFh4N3l
zx2jE/XzzO2FbpTr6zvakK1uNxvfraKn6H8hVQhLrYC9Dn72n34m0Cv698N//CFl9a1P2LjHOXPq
h3/wwxjt8uef3LHEdL/bScXfF7j7cG/9e/qjdylXYr8QCfy9Z/1TBK+OP/yzj9/9Bz/gTzJqRx//
wQcvr1/qTwdxk62aunj8OLS9rsSWzzZcYysiLDUTYd1ntmOR0rbjn3uIwAGA7yGoh8ojAg8uAtfZ
E5ssqwBJb34/CKhjcAK2iWfIlcEPGzLsV4LfXI2+cg6nStEG1wcqAymZ64vjwmnJ/l0kZg6e0KUk
Jne5vXZxHAONwFQcq1Db03v6mxtHpc0qEWrL79lrU16zmpFLpQu/KQV868dzRMNRytm8IwIZEnBL
PcvTfv1DLlkIgMTr1mbj0xLsBw0SK/1QLgdN3+bNYeFK0TGcbeUNSUVYlkvzddYdGcGWUQvG3omx
bWqu/o1VpS15deFe5I3eE4tWe0h5BR+/yvdItwuR4vYTGLv9Ao23DLUjmy9XrmwJZc+mTuNtt2eR
xTuZz/KODhOy48cynk1J3X6AdMvUT01/e/fdd3/25z9joKP+VsupJhRDBP/0pxffvXj/R+8vDbcU
51rOF1BeQxmFURi1U8DDKVky6Zd9X2crGtVyUmpTSstULSxOFW2dni2nYjJrbcqcpm9XgeYajFKy
PedVmTg/W8sqZWPDLtfOX+I2IrCqu3zZMeErbtbcsCT0kDLmM8+UbGNTxrqyzWFJz+M185m2IdP2
0FbjLrGt/W3KhmWiRwANI9eG0e2v+JbMxMbJVtFP1KzvPB65aL2Ulb0nXS7cbHNieOY5wOuKmDIV
n801Na6v1TKtJ//K0+X19L3E0kI3vx3TO79LXDeWJZNrfeWteJR789X6y//yS5Xz/fe+j4VxYMq0
vd5d/lpgWeNBGEuig1xbnsZXpXz/+98XcBWlnPeT196jttnD6+1M7Kn8Nbcgq1K5z//Fc92yGAL9
gx/8QPaI/v3Jv/pJX0fc+n7xf/8Ft7729/u/9/0f/J0fqF/gk59+Qht4/V/73vXLFXSH+cMvf/Yp
JiH8k1980j8//OlHv/j0l8//6KNP//QX/Engox998Ox7lx998lx/cfAHHyjxp7/4mSL2y+c/k7a7
FEoROe+X66vaTBzXdRSOu81nSsbu+OdeIvAt9RhJ8b/995/8s49+fC8lHEqPCHyFEfjnz//NP/x7
758W+B/+7D/+k3/0979CQx5WUd/6w79Wo52frTHMSbrqDmNEFKhS2MZUQPK9wnI6pT/JXBjaXSZC
C4xEOnnhPPVsvC7cBerTW6Zw2otH7zwLtBbrCVtnzCwVUjIeZhIp/fRJfpobDDSl16+nNYLagC3+
dEAWcLUkS/9YPTiU5ZrPIEz/zAmrymJPAQDLQTu+cRmE4EIjLEbgOUO40uOUFcoeJuglllAk/VoJ
bg9CG+VoqLI4G3zylc9WiOJYBj+1v22kfQ97pEQFIYzI05rBq59UCqVjm4RVqINPr4RGTWsQO/FM
Fq4k4XiFllVf0dEQcM0cryS3OmHpk+l1BUntY6lVWVQTMdexsjud8dg5f1uJNomZxpJKgP34+e99
qGI1qjAKH9wXPyMc43undjXnRmodl1we2SF445veDKVT3PAX0qxXsafflbPeGhm2iv4yavfRIGOE
zGvohitGbMogNhg8cELyq7PQLr2Vj5REYqPc1Mm4DCwR99jIfGdb2b95O7T+3fti2lY6VzDLmFN/
z7xxbsd7b/zdxbZuUzfJLEQ32tItVdztTTLzeGbZyJyMz89WXe029EyOd46C3nG/A/1GTDwOuXuC
Fm/sSDYGjprV3MWx8jONapaL8Utn3h7dD9X9I9Vrs0mhrX7p/bwu5tUxdaJ8nu0LpIMuf5mf2dcR
EXCLzQHbt1Tq23QqrO3aYZz53Nx3c683ut8yGMB1tZzrz66x86M//yhSfvfyt9R8T9k/81SXj//g
4xwbcnrt9Pe0a5SE5P/4T/74nux5yGr/5b/+d8CBAwA/5GbwDfT9AMBfS6V+6w//Vq35BIYRAnmZ
2DJBI3hSez2fjGQCHenYACaevgVKE+8Z306QA/oNvNqoDxZIqlSWSjTOgZ9MVCwN+pMq6a9yY/2t
y0LLtkRbc5K58rBSjI3BgWiOLR66BQ4pEfuVDh7jLc0oHVo1+VLLpLUDtSYyVIotBxMurGsUvTAt
sa2CCCNWLSbWvQwLYxsBMqo52V1qx5GMmbfuKYBDBh/SaxClFFSOVw2hX8XN70mQOTCr2Ufw+NEr
HwckLtxLj0MgT+pFdRTgxijaecN2Amv0C0/OeHjsYfQ1jHcMkAb5dxvolkaNqH7tYwgTYfySBgdN
P5UepcfB8/c+lKAAcDI/J+v6bNIHWhAATtzo0L/xTYMGpVOLvn4xzZ8/SgBcmG3hnxrpSorjk1Dz
jEzjpdZzNiXbbbHlA2Vh9k2YbVP6xGaNpbc4B6Z05tofb8PUrOku17Ln1K9z1u71lEzYU2jhRpm7
Y84dCmXU8XwPHnN0Fwd7d+zKpbpr28KotfrUZsyz01N+HE/YGfj2dTI3yS+INauY6uuUuAWNFB2e
Q6HIrDqdwBiFlRKe0n5mCig9u+qMaStl1ukXPRYSu9c7w2zp3CV6+8K3Cwck+ywqPhkHolG1/Nq7
0M4S5L+MPa8taScASzxq9qP/5Jh4uPhrtl9cxW38ZHv6R++9Lue587+4evSDOxTqmdvP/+D5F2pX
P/7xQUx+mTq5Pc8BgN98TA+Nb0MEDgD8tdRCMcDXxZ021ydzhEBe1HdiG4+B4vQQKoST2NX4ZCEf
HVsyRwuDRY3HQuez4mCtP4dJG1AVIVNvJEqUbbxJc1yWxIsR+FPI6sJoDQwGXgVbCvs5JVEu2A90
qq0AYRwrcTyYszJsbXcEJD0r37EZd65qLWvlkTH5JhoKgt0FVcoSa9yRbLCsZzYhvUKzgWzpYlC5
iqpLSfqUiihfdDa/GmX4ytzmXB9LRzoLWm4877gRruzjMKylI4AFulefhY+bJc45uu0yyNxINT3S
sb3LCb1daLcf+xK5FCLtQdeUgl8427Wss2E/AFiz7yAPw8XGh/A8PadxBFYyjJl6CzfNFt5wubt2
sm05i+28lRFlZSbam97bNAM2R/nuclVZd5FxXQxg0xxvt+Ed/9zc1C3A6SaZoppP/d1cRJNnPutL
1/cJB66YBAdFz4I3Hc+U5Eh7RagSW+1touuhZ9Mmkdl9WVcS27YagxzOtedEjNXCu+jZ5l8rsxsZ
QVlRXON2avDmlHXV3CQzx+Qj47hFWdZ8dlQC6enLkFlraFFws5qjtSyZal3nc816QQ/XxeDVc7j7
W3hruMEkJmYvprfCokjq+7qB59/ybbaHzx999LOPojp0G7zD9vg/v/zs95++qf0dClRvsx5GZoDH
HTVb+M0pf/zjgwG+S3S/mEwD4GMO8BcL3CF9ROCIwJkIxKsAGAzEaIwE+IkUvZobVfL1o1yD98qI
Tnu/uM93YvQkrjN9Fy9bF34JpBQQqfZgVOtPJlZvopZslnKZy6u8JZObLUQd7zfGWmGJ9rLKmnMP
+i00GN7x8mf5HDBcmG0lNhLGR7wAzulYKS9LiQ5kks6gxHgP95vJbJ58xVmlt4VdFnEbGzLxNmPs
mt9qbu/aHqPr/OqvjBGYrFjlPEZFDxRdCDNsvo65xODVyKuf9pSvSWnTKVjrnP2rlKqdbCcuNCyk
DVg+toRzDoWh+2xj8M+xJTzL1bOzzegsnQjkshjMM6XkEO7gQDjN2zyv+HGs/8yeZQrpSX1bw9v2
J/u21oZXXyRFWJcsM9ecXxqjDfPK3WpmRi4j+mosK4gl9+4cSbxEtEnpeJJSEZ5oJ/H2LtdOc9fa
1DzrtOc8l51Zesv4brBqv0Yn4u9Kd3x6Pq1bVcSk0XX7O0dTT0Z3xmTmuqtMr3fFjEH/t8nLNWGb
b7PKUGcjU/Fflp/IdNvob5nS4ZJXyhgP39dOjhberqiceoQh6wuondItcMnUGrmkzBJnStRL3niX
TFzdtGfuRd22e1VzWuBM76v+7JrPU77uGH2NRBFv223hFntoJ7lKha+Euo6yXt5yd6pCu1Vk0486
ev3fZ9/X8+6zN7W/S4mYRx9W3i2rxXYK9951181nfXp2/PPGI3AMgX7jIT0Ufp0ROBjgryX63/rD
v5EoBeDEmNvEPOCQpuaubWE8fnKYcQAe5ZKMThmP5UxasJlVgWQYQZ0rXQnhCM49XSs5xQPbKC7l
lQWBq5of6+PUYMlmJqNcl56lgFfxQm9R1jNRXKI1zsZzLYdna7awqMjkdZWdF1LrWfNy9RNfpFN7
ILQFev4qqD4c0SlZRXxmLgymCEwtQJiDyZVPuRAz2F7CxER2dnwc1ew4KGt7pbE5/lmFZI9DIVsw
ZEziJQ6SMP7UYdh8tb5mFCk+GzUVeXLgeq74LWeVblNjVLaOZb/HafOVpshoEJ5kvv06jVuMo5Z3
bmAaWZ3zwIlhZf/84vnvfSALLi8vN6NAd7Mft3ODw2IzwL1Kqiv3rdi08ipDoEFEGeFmurY2Tpk1
xhiZHlzQWeY82FMOtnLdVU9eLydlZT9FopdqIeNntpnXpZy6UCQwlsLHgqPWtvX6rjK7nqaThjD1
rJjfVBez7s7JNF6dbDNt8paUfp9umdtTVin1HeAl/6VSwpUt38v7fb7l++zs/ew+lEwnFKc9pFv2
b2l4bfpsA/CfNS8gPeWq3+L5TfT6LrHtfUgqtVvySXt4qxJ0x5jNZrbP1asy1oh+q4yPZq9JN1XX
3MOTAf7exdtmKvY8/otr7Z//6Hlfs9Heej7FDfNTjjnA91GbBwN8H1E9dB4ReKgR6AmfPJO0zVmp
QmKJXoyyAtM2fruq9xugUT296BwNTFfYj5mozNHNVZHqbEApn9U81VAi1CR4BmQyDo9Ne0o3nciY
5wBUpMcTKrFuYDCjL4BWsIXCh0qxSTGXVRr89A1thnzQCPHVXDBeIb0NQ9vpU8aWR8QMWlpblIv9
ZlOZjZwst62NRbbsyy5Xegd6dJAjksTHuRoMZ16lSA8R0CZJpwT61bFtAEMqDvrLXgCloJPIGJwz
izi2C2NvRemqxpYbz8dZodOOm8wLCi0NAJ2CfqNEle8+jlit2m0joS8QyNWd6JcU8LPSUUgLrNqP
CFTvBm3AW67HwxhLet9Z9Wd80XQxaV63E/ik/dvzJ9vB5AuFwufc8IXexXvPtUYZz+kxqMm7Vsrk
M18vM/XQIEg5Wdc0Ldyxc/X13eTlov1vGLxqpr5qBr8XNbjjmUmZPHMxqMsql57r33KMTI40SctD
D2vkInOOXyV9IzO+65u4rmWa8W7mba493meRt8zsqYkFl7ac7Uqp1hspkzEOD1YKrX0vU/znLGtT
OpztsAc9mxQ8+sxfNq6+hjMyfcXNFZhqzMLqoXAVJ5er4PJQoP+C2jeHmbU8UvKe3CkVybjq5UWO
ailVbgN5XcD/I1MFrfvDWHO7ZThLg3x7bgu3WFI3aofR1+hi42nB+bx4S93xdViP3Woz+iKRW4Xv
DG/bn+MpC7lO+/miBqOh5p0Sw87dpE/vltz3ju3NRuAYAv1m43loOyLwUCOwWF/BIUNB5uXqqZTs
rmFMPJ+ujes4FowBt2y31AAm9FMt/hWmMqhjrml/ERdta69TF8U0Cu1QlhIpCxxbPyOXhOt9ukca
J0pHcuQinfeDxfTir03d76dtrUdwBVBXMYljZbYXBCRXw5L9uGxE18ssL3+7RGVTWUKkRMm5cpYy
IIR07Olc0qmNcOmVQnVHrIwhF5KUVcpYUYK1hrimHonJE6VQ+9rTj+BoxzvuVRwn5U5t5iujF76S
PLVsdMpXf8NOp/fQAFhxvMtZvrx6UrO0NOrXtq1lzFzF6ZE0WB48M2Z1Qon0279O5XGvS/TOZxcX
FyCHOPt1bwAz2XPxJOprcVms/TO+kdvYeMcEThl83+QqHgxOjKB9AZnBkaY9zU678yOxDXV3t5S0
wXnX8R3yZgRAU9R+rbCV9V7MJBE462+ylxWlxZVVy8ELkGe2pYmZZzqcz/ymLm1vrlCF/Pa7oJ3S
+jd6DAMyhXZbaziHnkpB50oZa543B8tbOFgi38hZA1n/9feWd9/45Sz/3SCDQmphyVCDtAT+elPp
3Hl2Z9FT8emMbfMmBf0qoXPRmEFNXbqLCDli5QeTP4ybKevsKJezmjf79twZbroz9R1j3QfsY/aV
8CAmqr5A3pIbXbuz7KdDc/xdfvcyKuule2bfKgCsniBZpfcVWTivZW567kudB7vrfVwJx+EbjsAx
BPoNB/RQ9/VG4BgC/bXE/1v/o1aBfpmYk9cJVmb2jb2G2hqPga9ylSleqa9rgShpEGqyHobIBZ4x
jFl7pZBORiMxsYiaegrnGS80KLwqxGu1EIOJzRqH2x5ZEQhNuAjUJw2R5L3Kapv1i+NEAkU2ulxY
1sV769lMXvqkweG2ds2JlUm881kyttIQ6TjCgTFbgC671jByo1+4Ub44YvFyppjITjku94WKy7tV
ulKUblzKGGOGWwf7euk1n71XSsTk6aNXSOKF459rVlPvSuds7/ELdEqN2J1k5jnl+kqd+qkovXz0
GAzfNSudlxkBek+iPeisZAgXcVPLkX6aFgWNyGdb0mteYuznv/eRsl1qyVCIxNrfZZ1bydBt7yr7
Wje/Tgn9Jj4p9rIx/ERoS2a7zjAObM7OsZ1jTHWwZLUusdttjiCllFM9v1VKjZJNPDnGza6ybpIZ
o4I3EZjyPdK1Nd9Hyu1fHtqOoV21du67RO5IMiq76Wy34f6m6LZtf4l2/gXWfKayXeJqD7a5uypC
oFJgWdfVR/a+Ep3rNpl52ZELFFc6cx07uNz5fSZSuiX0Gum3trclv22Hu9aFzRt/v9bbw9nC6cDa
rH0918GuVaBzturbZ3/WtO3M9ubjFy8//dl/+dlbcFM+HzK16B+99/6z7z3LNkOcuZZnzOdd6J3P
fvwnxyrQb74J9hDo/5U+nC31/8t//fT//HvvvflyDo1HBL7aCPw//sv/8n/4H949LfP/8//9//2f
/o//w1drywMq7X/+v/3Pj77z9NFvDL1+o5eeV49+871H3zHW/bbu/E8SAv1GPy8effvVo8/fKSCk
s3p5eWW0+STS9XAWvvrOrx99rlyfP/qNsM13a5zw00ffFk57ogFbj37z65SHM/y2u3xVYoJG/Xry
6NvXj77z6NFvMEAlXgcGjlEvrx5958mj3yjxIvTLwrBcuEtSv370m88fvfPOo9/Qh/z40bdl1X9P
PlMKw0Lp0d93bapeJZTle6FTkkqXg0qPUmSAWarQIGBmGxQBaY5jS6osbbLkHUVMmmWVjZSGd+Sj
0rV/5QjIF2UX9vsLW7XVL23fUS5pljHy8fNHf6l4yioJXwZ6DHm5+ZnjKYgoncK68l21pnIVTJ2l
vr4XqPjbQr9Ctq4R+fiXvw79kpR8olP5qyyyVshWz/Tv2VmlyHLnylr7blQ0RWgXBkjSHknsO3pZ
lI9gYKxSKX/h19nvPvrOq0efqa4VE6VLuaIasNtxvnJ7I0R/EdaC5MNNNzBJovbb+nvn0V9Km1qU
Wojyyp7v/f7/Nu4ST/83T9/5zTuff/tzvYWoLuGOPv/N54+/8/idbwtex9vJO9ok853PH387ZfS+
8uTxkye/E3/vfOcd4c88/p13Ln7nYqbcJDPl4/g7T955svK+Iz3fuXiiTfqtE/n5p3QZqVPah51x
lSlIEThZvvYOpfS/+s2rJfPtRzJS1ymSbOmvOw7e+ct3Pvv2Z9IcMv4vLurflJ7Gur/5TAZ8/nlU
dspID5pBJGCS1tNl3SwjefIq6q1HKY2plP7ZX36WPiKps3prJAKkfOdEximnMpGiPNE+M9cmRW1g
aCbOu7Iitn9ZscXOKVN1sXLRrkomWVbiv0PLeFTp0Q4/d72Ql54IXbOqzW/r8ojWS1udKZ/HDeQR
7Vk1FQdS85vPFaJOCcym7dvRmYKMtCkhrwunBBJ2G+Bs8LvfCT2ZoluEQhg3W7eTx09CgxQ+fpwy
OkBGPrVM3Ct8l1WKidYQpuE4JdqAKzX+dGkrkbPqeVEbcCuaKdHS2BQTtxNSolW4za+UuAlXikng
iJv+U7R/485XYRLFtlN8b5FMpCv+tCXfKyIaio/ut/L3O8kV69pVANQ2gjxWRt3sfkePg7BKm652
lThTIvWcTFQTm7Lq+Oz+21GVUR22JGRI8Z9soBXxR9Vnm3fLCX+JktqqTY0UeWd/Q6frLlqXNMwU
tQHujW57cdt0SlSiic2V8pduDJUSbUMilZJVRooe7SrLd9pMj4bo2vdeLT+v/WobcS3Y/u/+r58+
/a4eXp999pevPlO1vDWbRj4/e/q7v/+//zvv/u/effX5K8YLxLWs6/d3fC2rpSlNd111YP/OxZT5
2+/97bfGj2+OIf/P/9f/GzhwMMDfnEo9PFEEDgb4a2kG3/q//I3iOYVDjIhyvK7RqbucDXEvai2i
+hnmXifPmWtNCXdpE9IT2vT7TfLAOhZGElIFg6mUKzPGHJvh7HWh1krUUI6Uq71s4CVJhSqX9vGw
zqA1u5tdy9bpp3kaGaSfSrFC5pHGDFVhcqwFxSkCOutyk6sEXctO4T2MlC/Gnx77VPbolFOSWpx2
liUBAMVhOp4RGd7/yqko98pzaB3SjPyIeWh2rGz6WD1bKY4Gq0AT4aC1pYcI+CU5GV2lu+tdj/In
4pmdnh7p2AGhxhMEWZ4VuSLFOj322EbqwK2lR2533hgRTcS8pb+ui4ySjolYEfYho7PgYVsuEd6F
QptininPf+9DpfEd4ByHaYMnC4cLXzQlGaeb19M6y+Ddzv7dcpbY7LHT2W/JnvC6OT528Lobpmus
BgT3m2X1zNJGwoM9WzJtwwnvepPMxpcb2NrzMp/VyOEbuOhTHviMHs/xzhHIp7HqFMnov8Ebr3Zy
M6N72pZO65TmehPH+3p++Ka2qrrzl4rSBvhPvl3UX3x1yRu+F1TcN5kGFJUS9jCT9iaZvG7HxUtb
HXU0RUJP3Ezigj3//V7aW936pgwcWuZFf+uZPGHU3GCAA3HY8+aEpYe2NFfq4j5w55R1czYOTE6Y
KLGdRmymb4Jy/sfiumc81y234py33LW28IrMvGaJVaVkO5w8OddFzX9u+79cym1xmFHauT7rfdbX
1sdZ76/h7fH39CvQu5R4eG3iczbXbHuL43Vbyuuu2+S8s52UvvQ45sd3gO9wNXxhkWMRrC8csiPD
EYEjAjdGoJFYvCULgRhvbB72fncJrCI8xgnwp/4u/LjWgVhH0Gy/IgjDGCmFfiM3xtOGnqtCv5G5
dOqY0gvVssYS80XzDR5LbEKkGB+yMfpaWyJMUJxSnM5MV2A8g2zjdc0HoNDE+eVpllIot9FgSnr0
b8hgIegCPO+fOfFVByDVsjlzzVIuN/N78zVLuZROJMu2nkMbMLWxfThcEaCOlIU+C3sdzrYXWOJ0
od+OM/x5qGn061iFX9qjgShdujqoZXknZ50Xk5INlnzVY4TXNR4p1hM1VfbEsfLqlWPEGayL/o5b
4uQRty1uzHfcWoso5xbuRgtv5y4umcaEjGdzIBqx5PGUqTG6Oxkkp/zp8U6Giks+kLxV+konZc5N
bZma75q5eh7ssEQxbPSbemr2bJfe5b7WHgRO7Ukessstm5e/3UpPZYJ7Kt/zQquYnNMzy2o8Fhqm
nlHKXqbj6XqMbYwM39RFz609mcfbQ+hXG2iUte09mW1pzlvmmH3aMFLwZfaMZG+O59Nu5vRiG/N7
6ziu1jnDlmhsZw6njG+Aiawq+C257sxW2LW59Md1Wm0CmZqDyvGNKbQH5LkJexW0tUh7xbNlFrIV
/uc6rbm+5EpsM+IwY7KJQMtUT8G6vnb2WBJTdzHceFcye69nBPqYq9w/L3KVR99+O2LcBzrmeIcl
nlO9/OLOPGq247nub8xL9x1snt2n9N1jzqOu/oiO9qrfXdVvbaY224V2LfzlOp1ttdpntgFqFhnm
wM/WO1OweZcifzvFrWwvw/UycnUMZ1kzzrMN3BRJ5pxzNvP27fI4uIcIHItg3UNQD5VHBB5aBHLN
ZLktDAOKA0EJPhnCNQuXqxNfmL8VBtPfy3hEBk574VwgHz35DL3WWr7XEdScK6vHnUp5Wasl0bku
AelRuvPyfdqFlHR8VSyxecXUD4urp5z+dKAnkFhNSdryeBgJ5oEVdcpnE/36bKTbhcCKeo3wQdip
A8ch8kntS6NKH8Bj55zbBHTlNWcNLGGVQy0xGfEM/ZxC/4vVmwBYDcuxCv3C6q6F8MsINsNlJI+b
EADhHYhXf3gtm5XFZuBX1I72F49eGXMqXbnz21SKgNCs0yHbo1z0XCb1zerW8RZO21CJV7n2VZrr
6gj0Lpmnxb0rlzTbwnjhMwJfq5fRflyitjjuVuc2EF44VuF7tUZwY68iqwAMNhjGbMfWwpNEUHu0
anMRM+9WJuVPZm+Grs5lnWst30IyuU6v86KHlKlzL1Pr/S6ZXgG49MSpnR571pgqYoWMe6Cy9G25
bly2x0zgRqZYZfSgCvkliY+kFHe6ZKbk6fFISf2kUJtT5yy3ZPblnpOZ1ob8WftrrawZt40vk0Wv
Ou32k5Zv5/TOVgGC3acQ86l5plT6GT1jteTU7CVn1zFlnU0pDnlnT0Z7rvmct/rN1cSlx4iDuv9k
Sl2V1U7oOfU9KlnrUhgpfbV2KU5Z+qkp2oA1berOkqT0F1kjpdZ8zqteOSmL/7DcMnnVlG2U5RtO
XTuUziOPr0bfYiG34va0HM8Q9Yxiyfja7HRfUZn32k+B9BdJmPmhbaak73U/2UW1/U2r9Nu+rBZe
3mXKjEBfxRX/dS10St1Xq755GNXdwy2wKzQwsz3qKyUlZ9sgMmgg5v2tXcry+t59Pz9NyfbQMsRy
5pJfrv3Ug4VbGaXM9Zy7dvoOTxXs13yue2xf6Tgynwvp/PHPPUTgAMD3ENRD5RGBBxcBAQ9BSr0K
6GFsFJcMHuDKaDPOgk8koz/hGYEZ4R8hPePDd57lSOZEL8Iwzh7anDG5XB+AfnP8s1FWrg5l9KUt
x9wq70vjH7BxnLCwMRKrQwVbqFwyiU32GPKFjDqb22bl0gPVquJZJrVS7gMURhe+gxDHshCoJnFJ
G6EB3iL9XfvrcjViOTajRFB9kKI667IIaSO9jgDjvbPcZznMO8wiqjrQHvvDAn9NV8eln/jHV5Ht
VHjkOiJQ4aPjlthbdaT4WEMgXvbXMbGavgYVkb0eSkGnssgjompLGIgetkhzhK8wqrS5HjMOZLmo
LyE5DtRdxFnZyG5ToyzXqQzIkQVKp1VIxDAnq7sqK8cC2IDCsckVmEcD7y32oNfIgbOtUaadN0fM
DjTSMovLHQgnAtC8HDzMSMlydylU4eQSK4X0yNUyg2+Jt8/Bi06ZcH7wjTSR5hzItWRq/DPvf20z
udLfLqu96+/KVJx5Y95EoFPQ7GstZWZ/wcy15agT5XQuNFStxXGtgZzv6zCE+Nul3y5DDGeukzWT
u8R+41/11WV1ZG4fCzC44nwPvqGd9FvybJk5trlaxU4m63S0JXo3Fj8W13KkBM8Gh1Ypk/3by/R1
0XysG1hrpjXlW37JRN1N2rNkMDJbdXGYu6uSn32dnp6NsuLyLxmXTiWuqztvy5my+DquheKENy28
uc27MKJTZjDGRHJaku5M21qmrvEVq4oPKX1NbWLSMrr6qv0obY3wrztPjh3YcbyTA+9rvHljUtg7
SuteMbjlzR1m+jtsa8czJl2nyExJ2k+1mZbHfloXWZihkLW25brXlTL8XWMBahzHPiZqD/pvcs7b
muIuFA2s7+c5LWiN6MnKumHN52n/1MOFc2z3FIEDAN9TYA+1RwQeUgR4VgF7tAXOBC+RXp302Zfr
txB6+oMdVS4/uui3zg515wWvQkjGceKWXNmYsdCxCd4YOJFXW028SVaQsjI7x8ZIOZvXKA4eGE61
94ytjXRnig7ma6fIIxWtPYgLrGiFiyk1EotcksR+yaBNqNtIOJCnrPVB+KsD0kG/7hfIXESjIpl6
8EXuK5f20nzlvXwx/oxuakcp3vXVja0U48bAotoLLRNzl6XD6DJ3NNLyKh0sHXuQsGyWHu3tdeyF
RRsb26ioEWrHgUp7SrJHOCdWd2SiRmSY5IV1rQ3cnnFWesfcruXoACJMrFwu9ZXth5bmjJnSraje
yJvPKXSX7Afz4moWX2KJng07WKDuv28ZNCymDsZpm7Jktoho5drywws5N+MxsGV43hzjZGx2MsXS
TMyWeeEb3WhWSkeg9XB2J9Mcdc8oLhSdMSkf95rLl4yhS0E/kW80vlK6rJpNh85lVXOY6Nli6Y3l
XdYtMqf+3lQvjsrEnGHVrSk3tZOVqzjP2ZZW+7x5zELI+Hax2CRfIGvtWRizuPwXw0lK1sWWmVwc
mrNgYeTt+3bcQHwF5l3F1+LNKTFr15TdkqmfqaFsazE8WvKnNsyrsuasLjtHTOY1viIA09v7wRyu
ecJ1lgg3x5vRPpeSUdqWjiPLI2I17kUdvfg8LDFv3zvmaIiHJ3fyoaGY5/7Gb/o1edpqA+l19S6t
lsN1wTgXIjOYUtrkJpJu75nCXaJ9dFuDr17udGvx1UvNpr/D5W5R05cud9N+qoVnO+RmP++HtnBz
Fej3juV2rr1MeZr3k3zQr7uuO1zriqv+tY5P97h9oZSM1fHP/UTgAMD3E9dD6xGBhxUBOl+7M1h4
42mNMQZ7XCQy8ZOlcFfze4WmdLJHxoY2QxdwUWogrNJ2leN+4z27S1d6azACDAimR4/S0QZaEyYU
9hPKsjz2RLpSnuY+2NGnPmuslTZb51rlqxA4XC5v/Lt9IlWXErwrMO96rIalx/PLxL2pR6XIWsuE
cEUv41BeZNd/aTbKHfN+5ctloT6HKG3DflmiCCiG2gQd9dgmwhWNeMHVLF+lSFIxcfQySvpphKwS
cxS08oJ+ZTPWOuDg5FAp9C3M758xBtLG5BjvtgerHOoeMrBs5kXG0Ug+H0xuVZDwxCrySg8uu1Ky
xqk75/Iro6WdUnMOm3vMlLHyTfIJk6UcM/omhxbHY8Zd4kzmHDaHsJOhmW45pcR7zR7vZNysM1eP
eqX+qpQ43spEioO/4SdvT0EDb8DwGycc7IZ/HjIEec+dTj0nfPJCy3XpNhbaM8Nw3djTek79fV0K
GOY0Jiv+HYFTJn/0XKAhuaPh12vGCOxa0a6dwFdvZ96eSekahwGD2Z5zPrf26NSKGLwZ80IHyz2v
i1BaTGyTqL6cV/3G8dmUbpMomTLobM1lSVie9ytfm+Zj0x77leVKXv+Na2rZXIz0ZK1319cmqj0f
eM6F7jER2OM7TbYKy5tQ9nXRXHHLFC+KzCxrE8lJcm6jsfGliOuN71UpiwGe1/6cHzvHFPQIkY4b
N8OW6at75przpbl+HZNwzl2NM86tLeuxfFz3JToiqx4Za+CWVHzpYJU37ZA53qO1n+GEt31nNNes
Na7WXuFsd7/dzYGfMTkpET2buO2+tu1WsaytdjLtp+VkilvYSuk2wz302O4nAgcAvp+4HlqPCDys
CBgdwUMK2CQP6Wca81Gba1Va9PKClHQsHGUEmEhPx2At5QIBas/xdeqPN2zlEl66Wt8NjtcTCeix
Si7QrB/PYcNLa3jqsmwPODZ7o2W5j3OM9FPP+xU+NMzD+CAr9HiSpPbSJg0q3bi9ue4QNqqMbnhC
AQK8Sswco47LgBgSbHvi/UPphnDJWxq2gTCTovGzNiJMnDmWkbxGOObBEhi9x1ntbUkSqlHKZ8nv
OfJpv5Ftwsjr8CsJAdlspPrKRjKmGmRL3UWhSpEMNeiMiX5VfSpXP+WRjYyIqSdCeR1JYWZQLmbH
aGdMkqSNgc/PQOGpbFC6j2kPifZlgxJ1whXKQc6yphTSVbojQzyDVZbd3lzO4iuiiou1oL+//luc
WM0MXCnd60+Em09rvGTmJNNb5pSFoKweTc37UH8r0rY2o2jbM6W53PRp8pNbmdNc+xTkz+UCZ3J2
HcMIteVDBl/c8irXZJAoBb4Lv9DcMm1Jy1TK62Uq2tOXDStFiSc8+ZLhLXmrZ8OLFs5sfmx50S0H
GcYbMy+x67dkdnzsrv2QY7aBDZs3xiZ068r23LHlBtJ1wWXSPGHFIVJOZSqls7SPd0+hLdV9zFdc
s3xtyWAvz9hG/8vZea2Do97U1x25WVrvmA+854qJwE1M+AmfTO/Skjc9nu2cGvGeCOTc4Mnr+v6z
YgVfSsq8UvKhMEY9TN54tm3uPDe09hxTMNt5XxE17mBzjcwxBTXPdvq7vOt74GiHm7nQHYe+x844
uzVmlPpqKtsyGmg+nd8770hVOvcohSLvXWM2b9/NuLJiju6OIecadJSIGCHN9jZayGqBvmZl3kzZ
R9L3hFWz+uRfj1VxbJNd555+bPcTgQMA309cD61HBB5WBIxJwKWBfC59TG892ObCoOixX4fAMH7C
JRMrfGIsB/oN9AVGGimwo4+lmbKMLWN+rEqUfm3uSE7W9NqSKhEgxFk9bwSulB3U7SJAzo08Q9J4
D/KZLdCXZbqU0Gxw1V34yyq8tiMLgTsaORuZ0p9WuTJMESMCKsWoODlq+QVAdQADSxPboNUyPmmi
dDrCWItkTpdV0lXODYbLjboIFYU59Sahcp0rEbvyvozHcXhnzVEvYEjXTqZITDZjudyhRiwcypXi
shKvUrP6/KXSKzJRyz4Og6lfWoV9ocbDBpcbUZU2qtu1Qx9Bdp3UAaA3q45cxNPeRXyQ9DZm9CUH
MuduNXfRHCOsiOeDNeuberZzdDe8n3VuuEHp4Ws6PcfYY/CWjB2I96dRFm9IKZOtevHG8H4hAwc7
58GOscRzXHEf73nX2+WxbTcPdsbElu+50EgbM+KmzOSEe75rReCmmBCf3DfjV7YlK9Uyg+9ajFkz
/7PumsGGNT0rs4vz6brfrt8ZJcZYnrYBYnKmLTUfddpOaLddv3NWanO/vnliP9f65CGTVRuxihRk
3FBp0n2ZrJS+avIOXNcR8r0f2WmN62ypTdv8c1PiSFn2b+cY5xUHe1ZsYeKHwcdyLeQV0aM5ap5n
xrBZuBGx4OUGx7skM0IV/2ZTnVd/2NDObvjnk/QVYWLCes7cuMa4gEypa2cv4ysxryxsGO02I+CU
DV/tXDOF+9UmZXi3IkmU4Mb7KugWOGNYMvMK8q24vCvLMwUc3q2ufMm56KU50CgthJTJu3K1khJf
L17cOykX+m+bK/3t+cDqprUM7Wrdb7c8P801Y9Jxq5aW7U0ixVeT0vftdddVCTY4eelqmXO+8bjA
jsM3H4EDAL/5mB4ajwg8vAgY02pLnvaq1iXmec4pY84c4Sz04idZrmMEzinM40Nv+ufagE17nRV2
kmYdS2Eh0igRTGUgh54ojj15teesNUDPSknIgP3ME7JPU1WEypKkCwr+gVzGe+jncZ563LUPto+z
ohmNxIBq+gsNOijbwJboCc5cmsFmLi6xus1OPhzblIKkZChLFIE1R+kImDTAZUrnu7icCpsdiqwU
BwevpQePNB1arzfYlp4SPUkqVnINSeJmFNqSm1w2SZpApB1bSolgVL2HkWUJFma08csWUlntFO0h
OXyD4dikVOZRLy6d4+h54c2p6pfzkzmBYaDPojkfvhI02IkdY0BBITM5E968d9yRrKmUfAea8+vA
CeYTOBu/zAhlCqxF/K73bHikKdPcxVk96JzsR83oyxKdC52rrJ71N8pKmZ4zPPWUhlOZtBY9vd/x
yUPnRmZXVsdnF1U0u973pfT7ZclkHeHvYOY3lg89jVS7DaSFJzJRelnYnG22yG4DcGiUXmMEAiTP
cQTD5uSQizDMtgQ/3P52ex4p2Z5JMdu5Utwe8ho5nU2KxchUnNfV4cunboZ5gFW+h2xOrfTO1VdZ
pSyZ3VWJ5bQTrK0rt1MW+i2ZFZ/BcK55vFxF1AWam3Ob7CVXW8v4WtuUXhrwelPXJ/eWFeeO0vBl
3YtO6o47w7wvYdXmTlVhTNbRV0HgvVMecnenYn1jWmD723cAfJ/jMpoHrrhlax+RzJTSRpXxq6OX
LYqUYW3Wb9+Fxr1i40tfR9wVz7aZm2Xy/tZ1vfOXcQGtudre5q64nRHddZHxH+1hpmBnpow6JSV7
zbYjZeoqPP598xE4APCbj+mh8YjAg4tAf7Mnx6Y+XXN0k28c2DIQjgCPUoSghM1AZTzkL3LMbYyY
lRL91CZsIHntr8x/KtE/E0v7EdosZQhLwMAvc6kUKgQ0JbXeBy4qVTkumlLQoE22yUjAlcoFP78o
jO1SQrMtSf7Z3f+pGRvcuy8lOgRDRooRY8+5TYhueAbviob8/i36g5qpEFkyV8/WWcWKaEg/6ZKX
zRUHjTFmjeVkmDkF/pRHL0ctWIkW0FZRs/SwB/v94gVGzWOVjj2gYuPhiAw17n1MFVOhDvtGg5Ft
V1YISEwylg0vOHasAr66apJXlwuy3LUZMiUZB44hldJ1pNekxtKgTTK6rOb6koV4bYr0buf0Ji8B
C1EjgeOouccxM7MR1+r7B4NR0dFuFisIh7bQ11m+sXktJAePGk2qrZr88E4mmvGWN4bDmUzv9GVn
1Zxl2uN+7yLja2R513oqArwvzpicpmB5yjRzNWOCttbTow23caPulp5d3e3sLMv3cdvm2qwf21xc
1VG2hLnG7JTpSE4+bcyQbC6uLpkbZmO6RdFE998mhU+rmsorYntdbNp2M7rInMw13Wngp3i8nMc7
LrouN/XYxz7Ouij9yd1xjQyudV1fs97HesVz3ePN/M8TmbRnsK/7daGrZtvHLr3jQMrpvWXFsCMw
I0/teAvOs+9O29sUz5O+X1EKLTZL7PsS95DteJbF8c41kGMYzqrHvlfMaJzq2V9r46ppS7oGM1xV
CnlXDE2oRko8dPb3ZMJC+9y3w7NcNNzvlvnP2qk74fJ33BuXDHfCvh9uef6Mj/jhudY0T5ltrmil
2zWoT+3Pltx3jG7b3dKyao9/7iUCBwC+l7AeSo8IPLAIiHbzIypx3cuc15oM6nVirUA7j30sRKTH
jHKBvrQvLAQnzJd4E+Ho+CKhUZy99vG156CCkXQsDdrr55Uxj3AR6EuWqCzlknmSUSJ59bhS6TqW
zc7SkgGTlP7C3K8BcOA66TG6SwaYdw4QNehdPoIw/ZyOtZexGbRPulC3ysJTyUuAsnSAfrAiNjs9
MaQlg4eRBqO+iPNLawBn6lilKG74dfE0JFUW8uiRLJbYsKgvgSMJP/VcX9vJLOXPpMcV1KVHfQl5
SptRaI6IxqOXUQu9hlaMSFe6SlTtSKHK0p8OwKUOaY7W9s84LvejbGWUSbZ2jRJ3NGCu8mtMUkLc
tK/4Ry2oIKU42sl4G58nz++D6AtwrsIz4XGxIsmPmX/I3vpCy5myXQWa2Yn5flYccjLJoXfxt4sn
AdU069K5it1i3uBklVdKWXWa0gzLYp7NuTS3sHjd4R02wmzMuaY5A214lJKFh6Vt2rnY1GK/eQdF
z+ROQ8825VRmerf0TM2z9C1n3n0H7fssMY+36BpmavHAxKfrrqzd27lb5Xv4G3Vdq2FTL1njjt7S
06tVj7JodVNmw7DVWAOafWqGUSRlsNkrhe97yUsTUzGz1BaeZ+QGN5syRTYSJZRQVno6GOw+i0nr
Oqr5qCnAZdv3Tx9E3ZltbstTv/FVxqS+yNopLQPHCJPW/R2ZUj0g64poZngynPP6mvNLW3Pl2pRO
rrgVV3yGdxmxqh1ca8fXisdx646TK+VVRqJj8tmrDM6KEj53vXCVFmsKo5jXcsvE42m0Ez1zdIvb
tcB3qgXu/G322DpWG8AGR3J5J18YP9X+tne2ge361XX8M1LSO5robI1clXM8QvnLHSZOvVPf2rXl
EUwB0XEXQmb6u5Fxrptk8vqileo/d+bmfZWxFe687pTZKmjbzQZvZCZTvZvVnEE6/rmXCBwA+F7C
eig9IvDAIqBbv7EHjCKrOgWK01NODwnDxUAvetQJF3GsdIMlEF3mBR2hx8I561XalKKzl86r9Mv6
0q/RXaQ8TTxMWSGMVeAx/aO80ik9ftzmWlkSeGYWt/XotPFbvlYaemWnPjKu2+pc95NcpRt8taeJ
Y5UO6sOSeuaHBj0KZYzxZJhqDWGDLYye4LNlgT8VMZXVllCKUhQ3/FXUiKrOuF4SDRq7ggazINfR
mh/r9xUZHD0Ltjm5ZQPOZIC7LGPv5J9VkksHvccxXqto/RnBps2yljg4birOL2lJoUtGRWc03HhC
p/d5TC8DMacsqoMD0rEQ/USpg8+Bo12Yh4glA7D91mW8PA3mNmUml0ufPbxlM6jNmm7nLm5k5nq/
vJ2b2Vts7dAJtzBLyUYIN3JDrsUnT054ciN9DPZovrfYj42/yAxOEqvcxIyf8brttPw+JsgPFH1e
ZhdJa9ox4al5Wy5h2VmybJvlbpntPUrv9jDZ7MGQ72vcCLN9CdtIoXZm3G5tJ3tG8Vwb6LZ6tlUs
xr74qNU+FftmHavNdOPP2iwKLpnMZuRO06vtLZ15JdbcY+ri/9/eVQDIUSztWd89d8tZ7OLugru7
5H9AsIc+XB+QhwQN8HB4uEMSNEgSSIgRIe4ud5e7nPu6/9XdM7OzPnt3ueRIDc1ldqanu/qraqmu
6m5WGcV8hTjiQ6H+8v/yc0m0SpKyCH4KfFpSG6wQxycJggyLT5hwBliJmTz41RomRQFn2PrXFKm8
id/y5WJllNDjd8/KHoCDEB8WnfpYQNPwWTsZvyRP+MXS/nH4OijYxvnyitxhPBAs/ExbDrCRkpbQ
f18DpsvxdlRWi6VtguSJFAHe5iwpr0+KePb6nRvMnvFxgAbR/0XoxViTyKPN6jX8xyzGlDusoont
jwgXT7l46G6QTZj3y6Dp8OBI5ISlExzHTyZF+7PUfivKrdTvRmpvZ5Im+euTw5DPBdzw38OBACrA
hwNVTBMROMYQIB1GC9UtywTNhOmcVEeSekHTKVJqx6PaEa/bUO2FPw2I6S2QGtNVxDRFDYomK+69
zO+xDPGZGQS+EnQh3mbIcoQIoC9BavAt6FRlvCctoXyXQCdV/0g6QJ6gphH6mSYv6JwsF/45YzR9
yyzb/D3VP0kpqP4PuZB5a0oYQYBGY9oy2b05hf6lz/kdnpj+RikX8yLfMtzY22I+fRpRsE7TMvLr
dakWylIml0gz+4AmTm5peQmFEJ/xS5K7qGmLejKvaUMuwiwAnzvlOE+bmALjfgspOk8VUMj0aqC/
jCLAkIGsqY7N6BdLxPOL0cl4AfeCAs8be+FzVky4gbKwOPQTnh6WPsNTKCPEZhIioMFbq2hMZt+A
EGWNJVAkWfsnWg55O4B0bad0L2jJvdRKwL5iT6T58msX2ZhPsPJR5OiWpKLdT9AGpXFINCEOuw+0
Qgj2Ij5fcRwmUsLyZd/6j9J4W5PUo1i0x0psSn4YStMR97gWv/K3ovvKK3iVSxHgy+KPibS84gg+
Akq+cknsMESSqIYcGRNxzacfMiLaQesSpfGlfPc9F6yRvCQw+55EKljrEvCEj8Osc+J/UmukkA6T
VVbxGU/5SiF5wlssxQZQiCOVIlZrREudmI7PGin9ikmg/xNfvoxOQUp9pWNyIkwpSuVWjOOTZFEC
Rbuuv5z76mPwvsHCE95uLFiY/ZCXrghl/BX8NUResBL50It2z7cVIn9FBGgXKcXEr/5KWiex9klL
x5D0axloLeOtoMx6ydJnNZRZJqWtk2gt92+LpGjz9UKKtrgWXUyfNa1CWXiOh38irQUhkfTRKaGc
T1Z8IvCdFFkqA0K98HnEQIcXtOczNf76ec0wg7y0zWQpST1rQsQR23DRHyGUJPPtvNjySOL4cBM6
KPy30xFABbjTIcUEEYFjEIEUWmam7dC/5KwgpunR50xDZjqhuG8w0ZeYtgPRUnjrMVsvyu/2zFSj
HMm3LCZ8An+ZJgNv2V/QqeAG8iI9ls+KKFopidZUxlNFtC8amVmGGQGMeGIdBcpThHWzTH+mBeF3
J2b0QGSmk7N8IQ2mlVElEOjnV/wCDjRZOm8t6G/sHp7Tr8hbes/PDrB7qk7zuNG82CfM3xsufkcu
oJPiwK/mpaog0EbW/QK2kEJ/iR0e6AT9kGnOrBSiLkp5AT7VCXrqWZ1DCWBaK9N1KV94X2iaO7sn
gNPciT8zUAI3QAPVb8lz+MtSoHFICsWEBmaX1vcnKj07pZmXAcZfiifvUwBPauiJxAwNKC8FSvSK
Jw+pALAbPhdGA+UvHxOSpR9C6Zj5BW6law4Z/lJbB33iW+slzl+Ilk+gkBLjW3MrPPHZTxgT/eMw
W4fPVhPKxgL5MpFgtilGsM8ywzQK6aoz9oRqbvxXgl4R4QmJL7UtU19oggyzPcJ/tAr72XXpSNdn
1WRr5ALiQDpSmxK8p5MjPvski++/xjhEHNESxejxR4B/wtATrbsS+x6vl4rf+luAGVbBcaTPWY68
xUZi0eXLK/UXkKTGBCzYFucnJ5I4LH32VaAsCTLAcuT/k9j8mVQSBPgWhtYkJgniamH2HX3C7Ga8
5LA49HOxUkhtkqJ1kc+dxRTi+2yVEZ4I9roQXwlJ8Vxg1ErlRHjikxPxCSAm55xVNl8jSgg961j6
RKynPIaCHZiPI+ImzAGJuPkQY7wQ6h2PrWDDZOn73kqgJmt9Wb3Q8+t+eRmgT3w1haVA4/C10r/W
+9lmBb8Dn41XQIk8YSsdEngEfE+Y74nQCpE4TE4E2ZOuo+ZLxOyfYl0T9s2Gt0R+pPIZ0Foy/orf
itJLnxBMWHyGgCirrE0TeUffik98dU2Mow7az1nYF5qvy3SmKdKez4LksOogYgI5S+3nTE5YkX0p
0z2f2bp33xycZD02ixkYR7Dh+/UdfFXGfw4LAqgAHxZYMVFE4BhDoIYOu0DfAPUMNKgyqmVBD8o0
E/qQ+feSv/AWdCHQoNhYCjqYMuqXC4kwHQk0q10Sp1b2FdXc2CGxzKOYtx5DFi1UlxO0L95Gyp5Q
RUjUdfn1xkx7pLofXPyiU0ikhmh0ZFks6/IgjqDf8pPZ8IRp0UzXpbYUNh1MYlI6yQ0xjvAUEj2T
5UWJJIMMprezUjP9E3IUKOHtulQDF9eyir7N/IdURWdIktxparz9HLIXcGbnFZNdu+AJ4wVVWclz
uKFveasvLTLzcIZlZkzHptPSAvKMTlpeRi3R9iEmvSeBpQnjAPoh4RErHYsAvGNUUf4yjhATBNyD
1k35Tiz5QAMddTEOMmd18qSYShQrNZwkTB7TdKB0lEcEVYYhowRyoVLB9HPe2ZtS6IvJEuFDoIVK
arWgtgWpHYO3VFAtMSCF2J6wlCkLmUXFZ8mhvxiFfJr0l08TE20FEqsvH0PqtStYpfw0T4nW55em
4MNMAJXu+ypSKFDLj1/9dysVaSNpir7Q4spPIc1g6xZva2WMlNrGJfn6MBdRYhZagQvMWuhn85Hg
IMb02XUDvpWmJkmTx0di6eI5JcWE8U76leBW4GfbFC2EUskRZUC2LPmkUeKn4GcvYlIdIJ8ihYLY
+2iTVISZM2fyazIl9kwmmfwlVBlePiXfiiY+aS2QUuKT5ADbuGTdMr+uUphhYWgHcpa99bfK+p6I
9jSRa4LMiLVJrGt+9SucxV5EktVHVnIB5AB5Zs8D2xP/FPwwEWljaQpyBfdExxOfUDlhs06+tiLI
Lk2+CpBV/5XM/J4FbJ5L0ub47iU+CNL2xy9fCQ18HInVNzS2Yu0Q8g2094ocZzEB4+CyhLTqB5TX
H6XQcsLyEluSAFmSehOI1IpWcVYXBNoC0wlHYcAsYZCfgsg1kjLuAi00Nof7X1SADzfCmD4icCwg
QPU3chXzeg5oNbx+C3oI051A/2FvaWQyIZpCtRSqKxK7H9NwIDLVlEgfCBFEvYt9Jfz1ab/sW6o1
sdTISIJpQcxewTQf+i1vyYQf8IRaQsjFiKf6GzPhkidAP1XAGJ2idZF/zmim6RN7LxupUL2Opcae
8BYYShjRjakCBnHIc0ohoQE6VIoDSYoqfiRlMX2WC0OGFYdSyOuTxXy5WOkYPfy3rHTwl37Lykv+
wueQHU2B8Yh05+yJgA9/z1Blz2lq5C+kRmkj3+YINmqmDwspEJsP5SaPj0ADmd0XuS+hk1mD2fnG
vMywATeQSucL2MVoIBZg+oSkzzCkSfGuB3ADVFEw+W8F2eO1YsZNIU3B8OVnB2OmOcFyK8DO29N4
e2xwHEqHzybGi1bQE9E2Itp1xfWBtPhkJMT2eQ6yovhslTQOg8vPUuRvUyXjSLZGTrreVbC98KkJ
elFAHEKH1KYq2j2ka4ClcSSrf/1sqtI40jMzpatbKW78V9LzSKVxqE3IZwFjVjWpDUrAM0QcSTq8
9iLhAo+51G7MNBwppwLW9wqjYd7GK3CBySlvmxLiiOmIguSLI5UBqbyJuYtyGO6JRE54mmn7I9qT
fdIrWJh95RLtw6wW0PDjLz/O/GImvwkQK5eABqubxAon+E0ItZXqhGIiAl/8yivhlEgnkXNmexS4
ycuzKP9MnsU4UsunyC8BAan9TXrPpynhb+ATatILkCUiW4xmhhINfrUyCE8+joSPfq0B37IxGREb
c/89n8VWRYgllSi4p1OtFDFpqcV72iZIy86Xy3/PZ79vmR1VaDek+ItNoo87FBNf7vTeV1OCZJVR
4hMMGtln4xXbXiaxLLWgdpW1t746FdXyD9qjpLyBWLHy+seRtrehEWbWYNEbhUq7L6Z0VYiEL1J5
EK3ZIiYhn7BP/Nai+0sC/upcBBQtLS2Q4uvvfDLt4bs6N2lMDRHoegSmP//anbdeG5zvux98+eB9
t3U9PZgjIoAIIAKIACKACCACiAAigAgccQRmvPw2UwfQAnzEeYEEIAKIACKACCACiAAigAggAogA
IoAIdAUCqAB3BcqYByKACCACiAAigAggAogAIoAIIAKIwBFHABXgI84CJAARQAQQAUQAEUAEEAFE
ABFABBABRKArEEAFuCtQxjwQAUQAEUAEEAFEABFABBABRAARQASOOAKoAB9xFiABiAAigAggAogA
IoAIIAKIACKACCACXYEAKsBdgTLmgQggAogAIoAIIAKIACKACCACiAAicMQRQAX4iLMACUAEEAFE
ABFABBABRAARQAQQAUQAEegKBFAB7gqUMQ9EABFABBABRAARQAQQAUQAEUAEEIEjjgAqwEecBUgA
IoAIIAKIACKACCACiAAigAggAohAVyCACnBXoIx5IAKIACKACCACiAAigAggAogAIoAIHHEEUAE+
4ixAAhABRAARQAQQAUQAEUAEEAFEABFABLoCAVSAuwJlzAMRQAQQAUQAEUAEEAFEABFABBABROCI
I4AK8BFnARKACCACiAAigAggAogAIoAIIAKIACLQFQigAtwVKGMeiAAigAggAogAIoAIIAKIACKA
CCACRxwBVICPOAuQAEQAEUAEEAFEABFABBABRAARQAQQga5AABXgrkAZ80AEEAFEABFABBABRAAR
QAQQAUQAETjiCKACfMRZgAQgAogAIoAIIAKIACKACCACiAAigAh0BQKoAHcFypgHIoAIIAKIACKA
CCACiAAigAggAojAEUcAFeAjzgIkABFABBABRAARQAQQAUQAEUAEEAFEoCsQQAW4K1DGPBABRAAR
QAQQAUQAEUAEEAFEABFABI44AqgAH3EWIAGIACKACCACiAAigAggAogAIoAIIAJdgQAqwF2BMuaB
CCACiAAigAggAogAIoAIIAKIACJwxBFABfiIswAJQAQQAUQAEUAEEAFEABFABBABRAAR6AoEUAHu
CpQxD0QAEUAEEAFEABFABBABRAARQAQQgSOOACrAR5wFSAAigAggAogAIoAIIAKIACKACCACiEBX
IIAKcFegjHkgAogAIoAIIAKIACKACCACiAAigAgccQRQAT7iLEACEAFEABFABBABRAARQAQQAUQA
EUAEugIBVIC7AmXMAxFABBABRAARQAQQAUQAEUAEEAFE4IgjgArwEWcBEoAIIAKIACKACCACiAAi
gAggAogAItAVCKAC3BUoYx6IACKACCACiAAigAggAogAIoAIIAJHHAFUgI84C5AARAARQAQQAUQA
EUAEEAFEABFABBCBrkAAFeCuQBnzQAQQAUQAEUAEEAFEABFABBABRAAROOIIoAJ8xFmABCACiAAi
gAggAogAIoAIIAKIACKACHQFAqgAdwXKmAcigAggAogAIoAIIAKIACKACCACiMARRwAV4CPOAiQA
EUAEEAFEABFABBABRAARQAQQAUSgKxBABbgrUMY8EAFEABFABBABRAARQAQQAUQAEUAEjjgCqAAf
cRYgAYgAIoAIIAKIACKACCACiAAigAggAl2BACrAXYEy5oEIIAKIACKACCACiAAigAggAogAInDE
EUAF+IizAAlABBABRAARQAQQAUQAEUAEEAFEABHoCgRQAe4KlDEPRAARQAQQAUQAEUAEEAFEABFA
BBCBI44AKsBHnAVIACKACCACiAAigAggAogAIoAIIAKIQFcggApwV6CMeSACiAAigAggAogAIoAI
IAKIACKACBxxBFABPuIsQAIQAUQAEUAEEAFEABFABBABRAARQAS6AgFUgLsCZcwDEUAEEAFEABFA
BBABRAARQAQQAUTgiCOACvARZwESgAggAogAIoAIIAKIACKACCACiAAi0BUIoALcFShjHogAIoAI
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
RVoaX6lUltKLKdV4HbMIaLVa0EXHjRsXKwIgcvI/YSow037hb7sVYPj2hRdegNmfqO798mnDmIhA
d0EAZn/gjPeHHnqouxCMdCICiAAiIEUAe3CUh3AIdFYHhzLWvWQsAt9DK8D19fXdq4RI7VGOQEwT
KKIq2+5Ctc8C3O7s8ENEABFABBABRAARQAQQAUQAEegWCIRWgLsF6UgkIhABgXa4QCOeiAAigAgg
AogAIoAIIAKIACLw90YghAL89y4wlu7YQSDWNcDHDjJYUkQAEUAEEAFEABFABBABRODYRCBQAT42
UcBSHzsIRNgE69gBAUuKCCACiAAigAggAogAIoAIHJsIiApw5x+DdGwCiqVGBBABRAARQAQQAUQA
EUAEEAFEABE4yhFABfgoZxCShwggAogAIoAIIAKIACKACCACiAAi0DkI8McgdU5imAoicLQiAC7Q
RytpSBcigAggAogAIoAIIAKIACKACBx2BPhzgF977bXDnhVmgAggAogAIoAIIAKIACKACCACiAAi
gAgcUQSmTp2qiPWk1iNKMGaOCCACiAAigAggAogAIoAIIAKIACKACLQHgdbWVqIAtzU1tedr/AYR
QAQQAUQAEUAEEAFEABFABBABRAAR6A4IJKWlgQKMm2B1B14hjYgAIoAIIAKIACKACCACiAAigAgg
Ah1GABXgDkOICSACiAAigAggAogAIoAIIAKIACKACHQHBFAB7g5cQhoRAUQAEUAEEAFEABFABBAB
RAARQAQ6jAAqwB2GEBNABBABRAARQAQQAUQAEUAEEAFEABHoDgigAtwduIQ0IgKIACKACCACiAAi
gAggAogAIoAIdBgBVIA7DCEmgAggAogAIoAIIAKIACKACCACiAAi0B0QQAW4O3AJaUQEEAFEABFA
BBABRAARQAQQAUQAEegwAqgAdxhCTAARQAQQAUQAEUAEEAFEABFABBABRKA7IIAKcHfgEtKICCAC
iAAigAggAogAIoAIIAKIACLQYQRQAe4whJgAIoAIIAKIACKACCACiAAigAggAohAd0AAFeDuwCWk
ERFABBABRAARQAQQAUQAEUAEEAFEoMMIoALcYQgxAUQAEUAEEAFEABFABBABRAARQAQQge6AACrA
3YFLSCMigAggAogAIoAIIAKIACKACCACiECHEUAFuMMQYgKIACKACCACiAAigAggAogAIoAIIALd
AQFUgLsDl5BGRAARQAQQAUQAEUAEEAFEABFABBCBDiOACnCHIcQEEAFEABFABBABRAARQAQQAUQA
EUAEugMCqAB3By4hjYgAIoAIIAKIACKACCACiAAigAggAh1GABXgDkOICSACiAAigAggAogAIoAI
IAKIACKACHQHBFAB7g5cQhoRAUQAEUAEEAFEABFABBABRAARQAQ6jAAqwB2GEBNABBABRAARQAQQ
AUQAEUAEEAFEABHoDgigAtwduIQ0IgKIACKACCACiAAigAggAogAIoAIdBgBVIA7DCEmgAggAogA
IoAIIAKIACKACCACiAAi0B0QQAW4O3AJaUQEEAFEABFABBABRAARQAQQAUQAEegwAgqv19vW1NTh
dPgE3G7Pyp0HV++q2FFed7CuZV9Vo8XuhHdxOk2fvPTCrJR++RkTBxVNHFCoUqHu3VmoYzqIACKA
CCACiAAigAggAogAIoAIIAKREEhKS2ttbe00BRg03g9+W7do04G4uPhxg3sWZ6fkpCVnpMTHG7Re
L+dye00WW3lNU32beenmUnNb26SB+deeOmJwzxzkEiKACCACiAAigAggAogAIoAIIAKIACJwWBHo
NAV4d2X9458t/HNbeY/s9CtOGTWiT4+89IRE0Hs9Hq+H84D6y3kV5FLCf5xCUV7TUtHY9u2STeu2
Hxjfv8d//nHKwKKsw1pUTBwRQAQQAUQAEUAEEAFEABFABBABROBYRqATFGCH0/XcrKUf/ra+R0bK
eZOHXnfGaKcTnrkdLrfT43GD7guBKMCg9pI/KqUKPJ8NWqVWrdJptVsPNr4y848t+ytvOH3Uv688
QatRH8v8wLIjAogAIoAIIAKIACKACCACiAAigAgcJgQ6qgA3tJpvfOWH3Ycaz50w+P9OG5aeoK9r
MtlcbpfT7fK4wOeZ6r1g8gWzL8cR6y8zAIMarFQrVWqVIjVRn52W8tXCDd8s25KkU3107yWpiYbD
VFpMFhFABBABRAARQAQQAUQAEUAEEAFE4JhFoEMKMKz4vWrGbJ1G8+CUk8f2zztY09xqtoHx1+F0
wOVygfnXDdouBxZflRou8q9SqVApFF7iCQ0/NCoFaMUGtbpXXppXqX74nTnbS6u++vcUdIc+ZiUS
C44IIAKIACKACCACiAAigAggAojAYULApwDHmsHaXQfPfejdkoKsR686JU6rKK9rtYLy67BbbDa7
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
vZS0wzPOAiEDES24WhiRnFyrTA6QmFWVinEVV6y6lDPjGE+sBf52KTYYkajzB6y55cQsd5ZCjRiT
fkLkSGbYIzRZaEJN8LfAb6iFsFwxnKjN6HHGbwthDTMJVvGfBM3E1YzPxMph4HZKAznME8lXzPT2
NufaYJ4Frc12CZmLl8b+z9pFTIrASowWhrkg7YGrlHEFFEN7pzJ1aCiqHE2/F2xHe9lMgTFYDDJh
DY30ROPIQb8oDll7UGtfZVjSrPU944oxgCM9gTSepUz+U0nmL0g+b+osY4+hHrXVXmLsdLHlS4Bi
YX7k4+vHmcaXkDV3QK/AeydlyjJgoZmmnjCOlgxghTN6yhw15Wh+BEetlo96uQQAPat+pE0Adx+4
ZlszHSjjV8bQHDpsf3tn52hPcvjTREbHpHkCvstJXjHyk601+8F/yX5YlGrKt5YBj6oa/U4Tla4y
Vy3f1ee+elqZkso9ojvd+jnMb/eR9lVWI9Olc9eWIrvaMhlLGeX7bNiqbvH21rSXObJMzwJ9m7Rl
Wg2pdstJZu29Mk1fWJ+2c6PJ1aIV2w5s0mtRy5TWDs/Fsq5bHTDwIj3SOh/r2uKOsOYDBrLaaBIs
z3YN6bclalQtTrv3o8drdUOe7Xlv3gKdxfpc+hqPTX9o7RY31IoPs4w1yXUWPY9tVysM6h3Yp43z
rEjLjOcsqwbEUkupedqE6rVca94FQz9J1rFtmhFL7x4Z+FvDRRujthxstbe6L3RLm1i39hniuoya
2np7d5ZqiTItR50rscvrqo1Rr2+Qhn82R93p2fjbY3brdCs+M1cVsaMbjtrCiRjdF/qFPTVc+8+y
QNy/xc+7R7K/VvvCmriNTKdNCnOWJTsLN0+w8hOizbSJPcf1Ru/4bPmbVxaU8lX7YEQwx+v/NXxv
mCFzonl1bamReLvTZEy9UguMAPiVmnMUNlrgSVqAsIxoCuCQk5/gb2d8sxHfq2hbIkzv3qTZUMX9
En1NtQpaeImDxIJgVwhwk0wpfpuxYzOTGJGAzQgOvSsVmcDllGMe5aM8saX2l14gpld1iX1lzCdq
wRFrfZVGRKjXA4s5lIaeX8fZvErbOnnlmGohvjWiU0u1FjeicHGV3++Xm8LbnAxmezUfjJlpEZvK
UUli5pnXEvPtkBWCyWR1wpBTZghPIp8Ln80DcFkV9bS0FyCruTOW7Mk0oo5hH3xdWWlchTMsCZuY
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
+XXoQJQbvAenIaQVvre0OVfENSSYkVZbECoccdq2BjTkrApWv6fOcixMuOC/vEj6Q0ekaUXZLXbG
dqtx2Hpvb4p9sFpOIPkWvyH5aOqM7RSbFOkVPg0+H6f6nFjLCbPMgA1OpsV8S9TVMFTOD32K/Rjw
jWlV6tymW/0HMle537zWOph3qqOcsiES82zkF6fqViTXGmed03Lg5uUkk8dkF12jrRRp12vLt0xm
q+FAMUvoZ5aebUM6W7WF17FVtH/6wGN9YT2HnpP92/nSy+3ccKdudWe3QQx5emNYzE0oK/U9eVW3
9X5i3XK9Q2erxhNYXcModrWXttZ5HTPc3UrFA6flrY+xStxrZc+yvH07XZHPnrwjnI5+b8s0nGFX
3hxjlbf8viZtLztt3WzJSpfMsGfJyXvW9gk9zbWa22xa15bpPC17obVJpG1//Ws9001gmXqSlH2K
X231UcN7uvnPtnfq1tbDuHvCVH81T5LB2bZ8JzMF4mw9Gzv7y27l88zPp0eoWvZPrtW1FAau3im7
oYBtYnTqfieCzVXrrtH59XNbev1rC6S3RL0pk5YvnjmZ8MDejkluOWSzwXIDlOE+z0gVS5xOQn2c
n5bv9BtTr9oCIwB+1RYd5Y0WeIIW4CgCTEe2jZ+0Qawv0wS6/LIrx2xCU6Is7njEj+KQjWScLSNv
lwCofH/SVYzXZT7GADDDOLtgrC+o0SWYXu2h5ehfjCLAuqhlClC6JIdMbhDlGSlKrnUqDhmBxLiK
JSGHkI9z+fxiE1ZfA4+BscRVHB0lH9Shx07IxFeHVRf0X4K53eS0sRnRJRP6t8QUcXwLlAm2hTPc
DJ0l8FOcKnlaXCWmmnwpB7jgSwmeNXUPTVDXHNyp2FFiNX9JWFHBuHaJLDHALm/JZJtjdtwcuEZ9
1TjTkYOoWGKXRCsoIXWwVigPC7C93gta30Om/maD/b1ibbDMPgaGlIWQM3ekMdqiMpDjNqpesTSI
+zUizW8aE2CzFvVmtpSsOKOROYNABGsmhA3Xd6E17+D5Bb03eHYftjICp6lZHXWNVrgP3QrYRDw5
LYr/Cz+TY4971MxJy5cmD+wCqKvYJJkjmb1ivcy8DaJbm7OaowkGj2l/8lT26Y4t67jK5q1jxuSx
yZiZeqqcrMI5QVwkzVVvjS3r1ZVpeNdorzlGXW79+S9ZR5dxGzuBmePy3fHlZYpRrLrW7R7c6SCH
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
6vqwxCXfW9xv3x9oxmO279dMSOf3ZrxT44iiapU+WZRZvNtmoudU55H+pviu/7vz5h1gLlN9cIcO
ju987JJnm6W5gbe3nNFes3bZydun5OB+b+DbQ3Jrrzl/6Hac2t8YbPjbwm7RLjPe3lx62sQUU9gn
e1YRZUxa3Gm1ke9IzRoTn1/ux66UaQ3XZfDbxfK5jk2fYYcpB268Ef0i1wWM+k73MLvVKJa3d2m+
rJfvBsUJu5unrUY3d16ZevDbdeZz49hHv1uuy+jrLNJv4z7f7iczvx317f5ce+bTM6uO1L/tzy98
NeN7bcNCnnW132fCe33nqbOjOlItjjeJ6MF5uvXzu9qo/HnE1J2t/GSa12420bBWQZvjxfXG/dKr
c8FO52DD52sEkizr8OpljLT03M2kt9Y+3mrHsoCczc0RmrcYS7O381OOl/3RSs7iR0pbbf18HAus
APjj2HWVulrgk7IAcSlAi3HLlSDHNvb0cgADmIQltjiimVBM/KQiOC16YPDJJwSndfGc0B+X7xrl
GmdKOJ/9iEE8UBzyAvUZD28y3rmUxfts8SGa3eoxhIKgFbI4L3CXSgRm8/LmOgGL2VQ62dSNqoO8
SOOUBnKCiPwWgmW8ayTdUAoxp6xBaLPht09+onoIXJJxjVOjkBKauy62oTCh68Is0NbGcU0dvgzc
7vQs2sDP5kKMak27JfBmWDUqK7EybKHgilEFt4LrG5yqw5DmbyRATaU/SsE65w32+sKM+oMywbfL
+NDnDeRDMbUgy9Kf68vZevsATAqZ+AW1EVZFgudXrtDEcmwfqT12AqvRaeHLtI9aymifq6avAvey
XEVKPXM7Odui92rmJ+KTV4z0bVbeeWuevsJ95r7428EjJZ/M0neFLSe4QVR+uk+SRqpccmv/jfQ9
3BmbjI8q5zhvsBYLDnmmc1nMZfVyR901dhzszaIuc/2XvJkcMsag5mc6L2f5TpO1m9v229I4/UST
nNeo+LBnxSdPO+J7K+zcy7po32G3nj416e1+oy/l3ukwkbAc26L81u+GlW/Dq12dSGM/t88nl1j+
OdJ3mba/3+EcPS5iJjKdprd1r7tb0+1V70qd+nBUp7XpMsZFhD61riH33rvX7uizqT/rnu4Ugb7u
oPPnfc2FDZh2GDcHpS+U2P1/0r+q7t2Hp2s6xv0HiW1nt108EbJ9d7XF7vpO7wa9XfRkDRtO7jA5
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
ywF8r6iyXNlI3/b3FiNa7Ttklm5iWSe27ed7J6M497HZvuiyW7et7dl9vvGi0S9maVzBOr86LVx+
FRZZrNewd3WbRLm+b3SO3fVN3+v+PMLWM31s0o7L/fBtjUbY2X7i20XntOPOLG5/J4+dszlxX6qb
ktIXtnRPGaciq6zqcXHf6P7vHlrfzQLlh3H/rzQu2u7nnls9Lneugp0eMvNeFz2ul1j7ZnuaWgOi
E56pf8bEfYCP9eRUuwTFR0O7lIwp/3eLT/TPmMCuZefq9Y3BjvuA70iu9Yz1tW6+P7sgpMhWGE5o
xfxxgA+yiPAp0KHPUHYNfWALrAD4Axt0Fbda4FO0AO/muGUDix5oWnxLI/g9QNjziRh8E2IJkPAt
rNgLKqTHjMaBeI4C82wDrRG9GAdeJDYWgiK2KVSDUoygtmL2gKyEjjg9jD9IEB7GxzpQN5cl4Ry7
CxmSi0YuXaLmkImUCOAb8Vd8LBFHQT0ELhIkG4xJiPfTQodraKKiwXwimpywEBcrDoFAgNKTlhEq
M2vNmkoCdUN9fRU/IQoyUajlQ5owcGgIadbWdVddjGypiWodswPSyuchU1vFU0lIRh0VIDsKK8ka
n0EwdvxuddIVbMiHcWPLBTi55hnfUjL2bMOAKF1tRNzuhkChlVcNhE+gfZXuOQhYdbDHDkMZjwzU
jl7hzGHHhQYGaoU3Mi9nBC5peVZN1oj5FBVH+yMj0uQnmkw/i+NNfqC/77Tew8m9efY0zd+PPcPF
4QgJR5oZJ9w4q0rj8ahpENa/sy7y1OI9BvdFbK8ilMC5zJ8MnqpzcU7fzxae8rG93NJn8KKpRtdt
wndZ59xnOMrq5U65L6dZlmur7oiv9L2+We48/a5yXa9I2exsu3X7DNu2tgj6ru/17XqmVkP+gs83
cgi7ad3ErN3DZ6xbfg9fcvpcg+Bw8G83+NvYBwtx5oHdj2ZrHJJjdPxOTm/4Vdqq9I92v8m2fcep
Zgkn7Tv1Ydtn+HnvF+4gwq6RoPXT0XecJuVE+tme26pvOjbTi5rrcubeUrrtbHdo5TZdtnv162rZ
zvPnYoGwZ9cN7ate/K33E6NWukT2+sLA7MXvd+Zz1H3myQnMSpN57+jt4vttr2/aZNLv+l2r8b32
jRk+j53M5Tna8x99ORlU5jIHmztvwwdiVpoK9TUOgeHTf8KvWo9zOxbmdLjutzvCyfeOe3JjpENO
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
sZpfsG/AwtuMR0q3BcpVKXzvMfBwZsTlZANIbRUzsOCOaKApX+qY/u2R6+CjpleDX5JXD56q+ApH
mjrIfbaDawL3Jbdkmuke10hf+ydlpZLTw9bfI12GbVVZMvSZ8nLz9EsedZbeXJy7z2zva5XbON4o
V14XZUkdcnpL3dL+Q/9pXYoLGjZc1Pd90ixtsrRPb5dCDmXDnr60nfnPSGNP7n5ofrVxreOqfSAZ
1J7GYVtymcYx35LmhrxuU+Of4Sczrl7tZVw32k7uWj130i69fZf+3H1y2u/mdrt5/3PYwbxl9fGy
bfbT0Hknr7vge7vvDZlZl0n/Ld7blvejLfu47dnvJ7SeWzDTjz3wzR8iTTKfo02X9yLvEG7eErfE
jCk/rzROMLmn5RPBVtrhh27i0rnCDbFPfC9h9mTHbLKsId8cqe4DkZcT5VKuvivNjAFecsJOOd2d
6xZhjVo8Y+SuEd/PzS6+17uF/V+l7OF3cLzWv/Sp3dS+VdJ7dmhVrbYGPoYFVgD8May6ylwt8IlZ
IHAvEAtAkTEwvo0MEzFGPAAAYjRKxqfQDsPIhfgDwpjCdUZrwRodBOYk8gQsdHrP9TpGOMr4KjB2
NkTMeSesJdWwib2+etoGSidZijBRitCUSnFMMMDSZbC+gnmBzYRLo+4Z5pgAWqlSg8pOmVF04liX
G9IUBhN+cL332Z29AzDAUFj14hRy1pqP1f3En1MbMj90Q4vYnkbjrpqQZFjJtsIlmNroBQG3oPVJ
a9gmYRn9a2vHOWEqgg94DA5ckJWUZBuc8wjykNAh6+smC7zttsi6xLyJ9ZECxre2s+cyBgOM9oJ8
1EJ/Ex9ALrS+fC/5kOAl2p7AGokW49TTRLg4jc4vdX64n9PbeZLk96h3cZgmGH12Meuln7J/BNRH
Ik16VyQ2JxbtG2ncp0K+W2vGp8WcVEsj2072rLrtSn60V0sjlZZprGf2691pJmV1Oc0+36JPUTdZ
F9vNas7r2/VcppE3Vl2i3JmcWVuYT27tFXbo7Vt2SL66mCgGdrZRcfv2pek7e8sxdnKersLcn6Xh
YNsqbO9q3C+SOS/Lne0BVq7sfbvWC2Qp9t7wGZvC/nzT2oTyExSxsx3TDuH/1Xadz8x+ZFRj/V3r
SR0d44ae7n8On8n4Ksv6j35ql9jpS1qzMNyv0lS/NhXZ+/VsvYCF7zp5e94udQpxb81eO3tCzlmU
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
oYYMsEcu7L7fPE5z/AYDc5sTxg5YkOxVXs0bn6DoxSfXnOoN0j55H7J/mTs30vOd6UUy35zvPjY/
Rv5pXNaLnVc2b2OK9k7Gu4K9XM//TzKl3wy869rH5DT//zs7h++Jw6meU5nb2uib49/vvrOfnL4T
9xvzdkSm26VnV/ZadFd9+/yF+W5dMrPtXOqbc150paCkO8O6+0UZrpGb5zebntAjTd1/qtS+jznm
/A3hMTLlGRnK2aCIEbEX5k+ZF6f3keTqCZqReoVMOgfe8XoZ80Fuvr7x/FV+etSsctJe9kiOZ46J
r8GZs/O67h7pY95JGPNNxp1n2Vne3Z6DPuC7XDfZ9obg1jROe6EMzvTuTdbzLI8I3yfdcNRiO330
nabXx3a+76veI6rlfb+1FV2X26Ln41Tk42n/du5JV1wu1rDmug9vc9p+3nO8N4SsWq3jHPxXO1rN
B0fixgeTnofD8n64LJlhZ8+X7scxcv7k3z5+nnb7oHkV346fQXoVUTx0HBE4IuAIeI4u7vdBO3hn
BRoEqgHqEJIJupMkZAB9sc/zuX/fCI8DPV34tqc0H6jnUgtm1fSjkFVm21qn39hudNRZ/xlZ1cuE
ZskKURP5wCQ+/KVfwj4G0UFSD3IepdZvn/2uz9cCvYvjD1YRv1XzpxQ0+NUHFvrVAXqQ9lHPw0g2
JpRMHq4Qg4zMoM0qZXCbXZ1xqtGvbMt7OdKOto4hrts7leLHUYIN9gv/XxQSxilFKSphbblgr1Mc
JglYroBDTJrdfNxOzBbCEpXi7G7HUD2Ex8K6Qb9wsDTQKlirsplf7SBAp/L5wVdgXfUQx80jKb1/
NXC79xGhfmH1cPWwHKHWmMWNK1Vvk53qdtq5UwjBX1e63jL9NiO36FevHLYevi2tTTx1duwdbW2t
MwZYxjodZ/WQzf7S0560xZCZ8t+YdsT01y/cqavKtg0vkcnroKzt130ggU5Tp+uaMopYZIQoNjIF
Cain7LTMJm7SuWQ6VnqVpLz1bGVsZ1pkJ5Nrdtg27Zz6T9KrvarD7NvO+Y6t+5iRzGk/qX5oDb3+
HF/zpl7exYvTNeruS6d65HjHcPU39yvXZdtG2e6fy+btdZHX9G1MVpy94nF7jVjnbLt0+2676t67
PrnrV+1LY+a++pYvFefGORuZ6fvJ6FXHJGXnSgePXOzWPnSOx2vqSu9rOW76Sq+YJMLOGT82fruM
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
CZAACZAACZAACZBAqglQAKeaOPMjARIgARIgARIgARIgARIgARJICwEK4LRgZ6YkQAIkQAIkQAIk
QAIkQAIkQAKpJkABnGrizI8ESIAESIAESIAESIAESIAESCAtBCiA04KdmZIACZAACZAACZAACZAA
CZAACaSaAAVwqokzPxIgARIgARIgARIgARIgARIggbQQoABOC3ZmSgIkQAIkQAIkQAIkQAIkQAIk
kGoCFMCpJs78SIAESIAESIAESIAESIAESIAE0kKAAjgt2JkpCZAACZAACZAACZAACZAACZBAqglQ
AKeaOPMjARIgARIgARIgARIgARIgARJICwEK4LRgZ6YkQAIkQAIkQAIkQAIkQAIkQAKpJkABnGri
zI8ESIAESIAESIAESIAESIAESCAtBCiA04KdmZIACZAACZAACZAACZAACZAACaSaAAVwqokzPxIg
ARIgARIgARIgARIgARIggbQQoABOC3ZmSgL5RcBR7IixwLGnjNGgTJYks1F90PKdpwPzPDyqnzmW
IPNxwUO5GpKP6n/UBKmp0HjdiDd98kphQd6iXpLnDy2TAAmQAAmkkgAFcCppMy8SyFMC/oA/T0vO
YqeDQOa3N3ho4WTm+y9rNV4/402f+rZjXS+p94c5kgAJkAAJJIMABXAyqNImCeQdARk2cVY43W53
y64Wj8eTegT9/f11W+qSl2+y7SfP83gtJxyZjDejGNNnTuQwRodzLFm8/ONNbxeudOVrl/+0QwIk
QAIkkBoCFMCp4cxcSCD3CSB44vP5eg/3uja66urqPCdSrYE79nW07G5JHuhk20+e57RMAiRAAiRA
AiRAAiQgCVAAsyWQAAnYR6BYgfptaWlp29PWuqcVds3GOg4cG6jfWu90Oh0OR+3m2p6enjAnBo8P
Ipwbu4pGyoHjAw0NDdKO3+9v3tkM+9XV1R0dHXrj8A07EaxubGz0jwT7ZtdsqkGAVybDBv4M8yfM
vpn/FvnCDZGv0wnHkMwaupkdONzU1AQjWLCht2NYLjM/US9gjnA9+NfU1CCZtT/awEjrwat6I10H
umAZ9l0uV1dXV7BeTPw388ci3+7ubuk/GpLW48DMvXjLC28N7ZtRsmg/cdkx89+iXRm6BDtm7c3M
H3HIvg5UFk4NbEizZvwtOMswbFgC03LF2R7M+MfbTmAnrvMR6Q3PL+uzht+SAAmQAAlkJgEK4Mys
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
8LGPfawg3je1ptVhZk4CJEACJEACJEACJEACJEACJEACiRC4ePGiEMDD588ncjSPIQESIAESIAES
IAESIAESIAESIIFsILBo6VIIYE6ClQ11RR9JgARIgARIgARIgARIgARIgATmTYACeN4IaYAESIAE
SIAESIAESIAESIAESCAbCFAAZ0Mt0UcSIAESIAESIAESIAESIAESIIF5E6AAnjdCGiABEiABEiAB
EiABEiABEiABEsgGAhTA2VBL9JEESIAESIAESIAESIAESIAESGDeBCiA542QBkiABEiABEiABEiA
BEiABEiABLKBAAVwNtQSfSQBEiABEiABEiABEiABEiABEpg3AQrgeSOkARIgARIgARIgARIgARIg
ARIggWwgQAGcDbVEH0mABEiABEiABEiABEiABEiABOZNgAJ43ghpgARIgARIgARIgARIgARIgARI
IBsIUABnQy3RRxIgARIgARIgARIgARIgARIggXkToACeN0IaIAESIAESIAESIAESIAESIAESyAYC
FMDZUEv0kQRIgARIgARIgARIgARIgARIYN4EKIDnjZAGSIAESIAESIAESIAESIAESIAEsoEABXA2
1BJ9JAESIAESIAESIAESIAESIAESmDcBCuB5I6QBEiABEiABEiABEiABEiABEiCBbCBAAZwNtUQf
SYAESIAESIAESIAESIAESIAE5k2AAnjeCGmABEiABEiABEiABEiABEiABEggGwhQAGdDLdFHEiAB
EiABEiABEiABEiABEiCBeROgAJ43QhogARIgARIgARIgARIgARIgARLIBgIUwNlQS/SRBEiABEiA
BEiABEiABEiABEhg3gQogOeNkAZIgARIgARIgARIgARIgARIgASygQAFcDbUEn0kARIgARIgARIg
ARIgARIgARKYN4GCmZmZ4fPn520naGBqavp/fvvSTwdf/s2Lr730mu/E6XNj45P4bmFZycbVy9av
cF67tuoPX3fFH163vqiI2tsu6rRDAiRAAiRAAiRAAiRAAiRAAiRgRWDR0qUXL160TQBD8R744bEn
B15YuLD8xk0bXCud1UsXVznLyxeUzswogamZkTH/i97zZ4dH//OXJ0eHh//o99Y2bb1+04Zq1hIJ
kAAJkAAJkAAJkAAJkAAJkAAJJJWAbQL4d6fO3vv1I/99/MU1K5fd8o43Xr9xzeplFZXQvdPTM9PK
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
8c9uvfGdl1/8zsvNYL7qwgt3f/7+7e+++s67P3H5BdsFAls86qvfe/WH7rrjsrfsmD+wuON3rv7A
XXdsf+35fvYvad56+tZP/PlO693OP9+99YytQHTLsyovL19r6OJrLrfadpy/XYjk3r99ZN839p16
0kn2lFnsln54/95tZxmRu2znsxX2L/6lETL/fNf2d19+8buvtvoRtBmIOqOLMeYzWO6r3XUfFRbY
GX/SkVjsJeapTjDxig8wVp9ZxkrOwvkN9fMjS290bFBPRALZsHhl98rczp3Sds/RaeqA/9CebJ60
glyO8tFlS0QPAu+1kvhOQtuKK0vfYFm/GTsaFIb3b9ZPL2JiwnoWe6E7PsDiKmCi4hFHApgTPpCe
E/hwol5Q40DAKj6WmF57sOv/2dCbcd657fEa77dSleifKK/IpPCixIW6OCQlW3z/Cr4hmSaWQj53
ZaScvKYEa46EHKis1zBG1t0yempYf+bn3dCZhpYEnZ0ctigERvQkVuPp9MJVrytCO0D+myaM88Xt
8H85LHec9F3HBnsHnJjUq57WBQ3QvW5s6oQHIf2gxNPyYh3re9z1c24aUtpVH5u2K+bzIAq0j6ZE
AuWZLygvfIP72G+JAi3tckyYUaAtJzFhpGtcaGyFCViyIHvpkAxQnP3tYML02OyPPryEsG4rJcEs
p3EdWud+toL+olh/kA7GXZNCoHw5vnKuED6pOaSWz3SOOKdZ81WvrcAhVb+w7mG61f9UwcPlcUo/
XpBhfr/GV0sQE/Z8ixod6ZoPf+DIT7zX2nWRhcS1n7nJXf69gQ97+fD7tf7KZ7hf3mf+5vfLWb31
tOG9IXHwISJ+q+++D7mc09skEjog9nrN9kcIXTXwu4Xc4NyoHP3ivelzb9aAdnXCsGiorYeatZrl
V0zKvd7Jf44OB57xBrCxZf/+/bZgY7pi1//yd/te/E9/9q0X/dqOt7/NEo8+9rhl6rdr166xPOwc
22Pn91x6TxZ7/JYz65/Kt/Jn3vK40ijQ+fkd1FnqKe2WJ7IW1tl+8WCXsFLaqVjT6Dg6yjGpdcKB
I+cA1t2X5jXLm3+vOehact68f+lFZvuT4dpK31dFKoa17G6u9D7F29p2SsMfmBjG7KaNc+efs+3k
YzfbApbZeCcdu2nb6WfImXfhwPzO+3bT3sMuaFrIMJU3Yc0VJfYt7Lvr/7rz6ps+cP0HP2AGp1k+
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
lB4X2vO53TJTP0lX53KKI6V6nTc2PdViHZt3DSqsxUkeMo4C3T2HzYhOYy8X64uftst3FTP/3uqF
4d9bPtKm5vrZvxlcd3A+0sH2GXY72SbFU1V/ddtawyGz7R/beeC086x/jeFtTA3oMQb0NAhKSvdg
nFNt5Bbk0kk+wJav8db4YWQWLRzjTWKTMWmbpP5uo3vQ2k7GatuPEDLN/zbamzJsiHX2MzDb7vLn
OqdMtN3YL2nzrs+4p0pn907TeVbX6LvO99qztDh8G8E+wD0NThiPX3ywHKmzfyPOM6p7v8V/zvTE
B9ju9IoRHVsYyr9XLC6gqeNC16/dp9fPcMp0jnf7HGDZavgGi4f0udweVySBvY8gI6vLuO1M4ByN
tpvv1uj9xvcWeqw9GsPmjm2e9z7TWsv1GHDvO+bCGGl6ZoZMu7+c00sbtejqejLEU9Fca9un7Vsm
8Kf1z5so0hps47nqKruXr/6Mf077G/rmSI5EbhdiaeJ7/dAe5buu5IRreJNj71YqQ+wTD9QCewD8
QM25L2xvgYfSAmA5BUJAsRJaEMuRkfPuzdsr7gGOFxchMEL4MuawXxvYT7zkTmNGYMJPay/mMh4y
9zAT64LVXV1cPPuPXnjms0+v/g5OBgI7SUi2PHOORw1jw7AZUb7RLyzu4BsF8vPdP/7eM596Rmwq
P/DRXT564cqvv4hdytdev3b1119cXji88foN/3rjazduvn4N2PjNf/YNJJ74hcNrL11788tfP7z4
OP5868tfh1arX7j44q8/f+PVt2+8ev2N/+3qEqv/Z87dxJ7nr10Dw0ySufbWnrn4xMd+GYW/+MXn
8SLDkU5QkUh4cbhh/KaLjI/N9gJnqi0IVcVl6TjcmAqduURJRNIGXQnWF5cz9hWiQ1/Q/jrOxpZn
l0umEQXaSBh7oemfxj3PxJyoDrGglwq+xY/6BflAgygK0ZWXK4hwZRqxoG8zmhhsRe9lyADNhvdX
+uh6B7LKhDJc7bYMCiepC/0ZFYw5tj+KZQkbY13uBqefsEhdIdLQEJJAvzlCyA9rHzvrkrbmqL2D
mpnh56YEbOhJkuB3oPo4BilKYO87p3yDs134Zcb9yv8wIpEmixsysRucc6/wDTYvV3xa92ksP8Yt
btlzTX8m1xb3O+WpKOYcs4X16xaj5RlbcAuNy+1nzwZH2ngJ58z50uRUXePMt7Zy3BZfO/Gbrau4
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
xBzU7VGU/rTmimPklNdu6ZacapehJj1SNC52TlrVf44ya9zO+N7O/ermCt26vHnp5Iqj5CnfO683
NekHQcf42P/ngVpgD4AfqDn3he0t8HBawPgTsOQedxzpwCEwcgcro1lurFUgaJO08MkkTAJ/qAV9
H1cbYaW8FRZvOXGA9C9d45KnPvHx1fJgtbr01D8EFsX7WLud4xvImfVql6+Zw/WKu6kXm59y2+3m
9gbp1RJoynhvceXbrz3zb56Bns9ha3SiF7nm+kN5iX39mf/jN5YHB8/9yrNo3dXPX3niF5+48s2r
z/8HJq5+/oUkXaWPP9QZTGaU4AVgfF785pUXv/3a4WOHL/zqC5B4+TMvIP3iN1988TuvhcT7x5e/
+vTlV5++/NWnUP6l1aUrv3rl8ld/w79efvXy5a8+A+/fq59/ljp8583nv3mVOrA01LVMtYXJz9nL
F82RhWl/7ToOT2n4+ooHxq5gth35MAtQJboP5fjUXHQTSsBagwom/4kyddAR8STk7xLlwuyrS9zz
vEQXADnjcs+wIbDkhOrOLXK/xKLm6vN0X+KTWq2Qrcw5x1qGaoxyXJp1sIxAPtGyBgCVgeb4dyBa
APVCbaQFlXn6FL6Rvq0AbFD+gkaLvYtjlhM8mLBBxYJmZebEnO+FkuLBiglJ3tUyFZt0cGvmsuxf
l9wdZ5w9pnTju4IHSy7R3BevTRkq1jln51ecYf3amRxZLfm04py3fE2jdWpmlO8yp7zrqCvzR1tq
LcntbddaJmxuffBtfvKEcjq/VGKjLS4hvz2DtK3mMpkz9Nn2kZ5ylbaA5d3jtud2X7hfIv8EGZe2
o5ydY6BxtmFDjRObzjyt2xjNBM4EEjB/64/HsMdtmjfGbeZT5/KXLs68xrmu7WMsxnbciVl1jZNd
/egSZn00csx9lW3VcTWG6zapRHVu4LSK+SznXooxwoIUe5/+uhHzuQ4Bhoz9gX1EsGTKfzj4W/v6
mgc2J7zt0+scx3k2P5yxnQdnO/XvtTy/xd9arP5VvjuOf56RL7H6Ljhe3U3Iz6fxhO+dc8IeALnz
2R13+97tkeOxnWtY49mioRLPjZl/r3bQ1CCMPm37IGLg1f2ofq9dM/XwjN6vp1mrsT+vau2M8vif
eNrxXBXTG8+TfOTO2htX+b7jS0E1lVaV49uqmOFiaMX6+t+ovftRNx44Ij+3X8P+fmL7xaH/xTN8
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
j5Gvbc/UEAn8qk70Z8qnmVuLuUvjb8FmBIcmTmCcxeoQ0GZITuZ7i08LmRhhyelN+S7LBOdmnjMZ
hp5fKNqZxfBUXSzhhFi7zlfvbskkS8NmmkEqmfvwn7LAYHJmsY531UX5WV1b+liGOlT5jfsNjmWL
057zk42z2l1O8dV6dJwos31uc+k/5W87k2ZsEH1UvJYnx6orxlUbAx7nMQinMhyH5oST5iptI/MM
mbfJ+Dxpj0NyvKyrnS2sWzx6s+vAR6MsGc0pDt8WK7vd3dqnYEa3701Q88Mmu8Y26/WBvXkjjJjP
yN2O+exzfSFfcaElhsuDQ+sxn1XsJD85W1xU5/QynTGccY5uxXmuuM0+rTd8gHF4b8V8xlnCKEaP
u92xoM8sWCCfSOxoyoDjzWdInf3Ln5wv681jPieXHvnNwrXuUDafc79mXM0qt8FW3H7kM0zlxgLu
i+jlTPt5W6Mirsp9K7bAGButhLhzlbNDW0VRdn7c+43Bds480rJH5ox37bWbcXVb8l9oLsq66jKr
bOOUnmGl1GcS89ncdcWL9nnvuDyrq108s3rrLqYVUv/SsPYRVF/sE6dhgT0APg2r7svcW+BhswBw
C16W+A4iQuyrYIZZOKMpTqNazsC9Ri/Ah4WEjaacj2uWKip/5ek+wnhximzVZWHXK8TLd57hrkuD
pDNVpmXA+sYadsoQuaWA41oRWx4sHnWmIahhMP5JN87zDKskbw9eCNiblyyucC+jkia+De9fM8Ap
2b1/7ZbMOFgoDTLLxV3VyNmhOGFcZdTH049sf/HMbJexpT/SzVidkbqlMO0AeRGt6KnluQVONn4M
XL0kwQbT2mVhFcI4z1hBqD7SZCLwrb1t0/LEz1Wjta2+EyYXp9RY36109aC3CXDkGA+jehgfeFib
us0/s1qjUH8D5WJ+eZHc9dDKJ3x6n3bYJfi0aAVnPJ5FTTg082CS6Xzd8Jncirvr8oPrE70w0sl3
WYOIXWxOwN/mCcWJhYytavnkGI02ra3rGultmeJbVIjnly5qlGOZrDTKLK1aCaNG17slE2XWrynj
eqlnXTXzMU5ekbpNS45rZ3Wl3ebyH8YmJVNldh6y27ZLzs52PsEP2eOEOvdYzW579W9ysBNO2P3u
8dPTrjd7IWS8f6Hka69Bjgqvy1BGKz5GWcOvuO7WtvsgxkbGfKYeyfLNub6dft14Us3yzyV31/Yv
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
5Bu00IiP9ZjhuBtkLHH133VX7+HUt4NfTVp0DczjOtujLdh/an3hyWiL9G1eO1r2qeRUTJKjrNGE
sy2Cx2Q+avGqzy/7wByvm/1w9JPCdRd9aeK9EZG+YLnDpuicYkGjrFy7eB7TMRwUL1r6mF93uNi4
r69fOwuNV9cmc1Mv9WNd12LL8Z0ZekqS57QsqnLaTDkgdVGKrs1abqTUPqn1sdM3Oy71da5YbPx6
zxhg3oUqSnaM/4Vq6rhJI0U5izWiQ0nW3WxowjWGNhDzO14A6/a1dDH50GwNZdWlxvRqXkDquqpv
3h9WlN5hqTWf009YLqJVN8f9DtU079hxv8p7uHblVf6uxNZIXWmzWrlKNnUtaCq0I9aX2u9Y87lG
/8aq0YoK9jwjTlitptuXfNDsAyHp/XltCu1HLLe/sfjYivcuuj2uF2AORNVGpUVknM8jL7X/czgI
NAE+HFw710bgwkIAvGInllOmqGuqKVJAcihs2jsNjnHH1yrHeCuSVowHjIZUwdagWCZnxrn4cH0m
W6uZM5+duzJP03txrtQnlC4eyyJ8VSo+uiQvuw7Ms7COtM8lzuhZaq22JjO90sxqewpyBq+xVq2h
haw0h1mMVLHH+lA9tn/iW57jIy4qxVgrZnGmsdUdmjB8ZpSvMXP4zHWkLH/yc8tEZZEnW+1UlrDa
tlcdqx3MiKHlCffweA23PShadOuY1dpisxXrK12X+Mv5NTHAJPxuCZvkz1oZG79qRW5pxXBPHFjt
Tk8wG9k8PEmv5BsqqAbC8UkrXPvx+rzlYLwxju6sOLkx6qrj/HZVAdkKNDFtlQ58sObzSa59hRWw
oPzjfJjBcxjEKH5y4DmmceIVixWDQsGoNih9sOWirsjGNT1662P/+S4e5Vb9dtXGGmCxvvQ6bRk+
LHRgcTbXanS8wca59IqN2zO9rsNc86k2yMd8UNeqe94u1qyG1ho2C31bnGFTnhUHs4l1sL3cUBSd
s63gttG3siZz2oj9Oobz8bChjj3ZhGKp9NEHCjceOljpOdlPqv6zYLNj7kCu55z9s0SbLznwPJch
vVW/4pUTLLf0zPw1bdSX1LLqS54S++sqq8lGrSn+rIuU128y6kzxX5WFPqUUz3lVDY4eO/yJlHEd
zSliuard0qaooIZJ3fnWamu3waGUCrmivo6dYKXK6rapWkgVjEp5iv4JuxVddDqLmXgrlNuj4x8K
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
pjPqdcgZJUI39tns4OonoqaydHp889fdiFyNADNz137zDX5tiuZtSuc5c8bkkfJ2e79cd/Acr4zb
WEtMEEWv3s9bu969KhNz3W/Bz/djkxpaVSZrPlIzVkYHptKT1cwMJEZz8sIp+qfSqn1NWc3nsFMK
C63saP/HS565OhYT3EkVdbU2VqXamDJzrVX2tRgjWLD9UVbOT65jHKnEFma1O4MVIG4DddQGEEfK
KlymiO5uUy8/5Jz2my/LMb+AkbfqZoPD16aMi+tIXPKbapRzfRc3pRwALSca8hefGUsl3z83r2Wp
xn6l/fokJq4mffHp2+647XW/8bqj4eO98uK6r7vu6odeDeQ1OKJe6n2VD9k6giN6fP3zbKC2PweL
QBPgg8WzczsqCDQBvl9a4qJvuTYWXtIALViN1t3NuakMIvXNgRSRK0ZKdiqmZx9SMmMpigUFMwTH
w+tRzIKWomuMmkzYJ74qGFVlsegl+8150eJ7JQd70dHsWU4SlghsrlLLzXTxNCmxzu5YkPRkrLFs
WuhOKLrBGIe6SxXU6Bx8Q8X5rmWn03PtoqQZaMaKBQVRcq80RTxSnBVrLEAcPlkxStHuTeAb4sM6
MQYURv7S5EGwtU8VWatWaXbOLB6rRGWl8X4eu+qLHLad5Sou9+McsMiXMNcCuVK3EeBty81IKM8y
porWRxFRljZJch6FdI5KGAdmodB+oTBj5vPg0vIWL64YBRDX1XgHCkKtORzgaMgxeGKTFG7+OirA
X3i1XLV5sJpjzPdFZIcVcce8UNmIMSLTj9552fZl25dvX4p1Se/Xz+nTp3c+unPXzl1XnbhKs0Cd
V+SMZaWIt0gj3WRTVFPVSXx4k7I6bEKnmlJWNbpVdXdXvddzq56flVfpeanvpMRuql3MqU4kV3Gr
atgYR/CrY/QTp/fqOYF89rdsr9TQ/PqK+QUbNTcVVLnx4ljYpY3+mZpk+GkpYs51koiu3JIyaVb7
0S2LTdWEJ/1zF723zJmvsxIqox59Y55rUNNXr8uhq8dve6cEhneduuuIXPKb7jd5K4AMO+FWrjL1
CvwKJn/UqpP+q4ImFIcm/Op3vBoKMKr1jU95+vbljCc6rz47H73z7e/4RYw3XPvwq7/py59dnzKX
HbsMbVFTXBPWVdkK8OE0dBLgjgE+HIA710bggkLAFFQ8sTSvuLBf55Z4aIFKkZWJdPmqzsAIXAXx
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
2l/+8R9433ff8rM+N/rRL3gBjx79gp+NGdKPfsGN373126sBwzhx6yffEFbk1//6XNbV2pO0rI4v
r2G/OXh8lk19jg/6cktfPrfrTytPdP24kjw9IlWDg36y7/oKpPcQfsaLBh5O+of99mU3vn/rjc+k
7wfxRlFb6QCedG94wxvOst13N8+q00x9ZM8zlu+QA9No8jUve5tepc72pbS8Ep5Hr1v3tumndf/+
63/9r+fQCUJ02sIsmv/Cz1133YV8cJfM3GRTU86hoD7lyCKQfUAeXnbZZZ/Pz710+Gw7zMMf/vBz
K/Gee+752Mc+tuu5j3/uS6990jMf+tsvffcvPPfKavmR1//dJ739G9/9obdY6ntvfNSXPf+KD930
tVuf+OSncL9/3kvf/aEPXWnJ1z3vp57IM+3495DMXOwf79961ieWpb/3l9649azXPX6NU4//hx/6
0Nfc+KjXPFp+fOxjH0FBv/2KX4IHKAj/fu/dW5/65DJDePOprZVSzIFfeuO13/Duy1H5J37DtTf+
0v/2Dx//tV65T0Q+KyUOoNZmazW/e6Wsz7vy2q23/+f/9LHHX7m1AbGtLHHREB/5z7997ZXPdSzO
d2S8bTZ0D0DzTHQxdo73vv71RHGXDjbafesf/sOpV1gbXX7Fo9//zt/+2Mcu3/Oi+It/8S/uadMG
jUAjcF4j8MAHmMyLMGBpv6iLFGBNXlbKHh8jwS/YwlLOT3vMRb9zy2dAe3/5X//c1nffMkKDRwZU
ht/n/37iTy5zthPft/WYi36g/PDde5W/6ffFE/zNf/SG/+O//e9/9uc7D3rYsX//W++6+557Pv3p
zzzy0sd+/UP/5sOPXblJx1P6ykN33QNtPKvO5UFvt/SXfcHrPvQWPmztXw99/uvsrUH/yJ8+8vrX
3wF3hgPvvfHLbvwUnw+zl9MjUhgd/JN90yvQRgQSpMuf9ZYPPREVu/16VXJr8Q6z+xvF7vhbdns+
6Q7kAbfpLXHde8ucVmpQfxjHm57763pCfdn7T+tfPnd7Z1j7Ulovq/PrdWv3pt+z3ScCDAZ7rvcf
Ow/zasB+v+ZrvmZ7e3vBiO5Ntn3ueYcARkCwq94jH3lvQx13IcB6cqPL4aPj//E//sehAnXlc3/h
Q1+H+82THvWyrWsHDX7vz79s66XvDk78td8FmvzO9970tbzNX/vSm/UDk2+H2Asu/M434+y0v+l1
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
AjICBwUC8Q3gg4J0mUgZgSQI9CEEWsZTRkBGQEZARkBGQEZARkBGQEZARuB/G4E4BvD/9gvLb/f7
QSDdNcC/H2TkN5URkBGQEZARkBGQEZARkBGQEfh9IhBtAP8+UZDf+veDQJIkWL8fEOQ3lRGQEZAR
kBGQEZARkBGQEZAR+H0iIBjA+38bpN8noPJbywjICMgIyAjICMgIyAjICMgIyAjICMgI/MYRkA3g
3ziDZPJkBGQEZARkBGQEZARkBGQEZARkBGQEZAT2DwL8Nkj7pzK5FhmB3yoCCIH+rZIm0yUjICMg
IyAjICMgIyAjICMgIyAjcMAR4PcBfuaZZw74o+QHyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAj8
VxG46KKLFOnu1PpfJVh+uIyAjICMgIyAjICMgIyAjICMgIyAjICMgIxAXxCwWCzEALZ2d/flbvke
GQEZARkBGQEZARkBGQEZARkBGQEZARkBGYGDAYGsvDwYwHISrIOBVzKNMgIyAjICMgIyAjICMgIy
AjICMgIyAjIC+4yAbADvM4RyBTICMgIyAjICMgIyAjICMgIyAjICMgIyAgcDArIBfDBwSaZRRkBG
QEZARkBGQEZARkBGQEZARkBGQEZgnxGQDeB9hlCuQEZARkBGQEZARkBGQEZARkBGQEZARkBG4GBA
QDaADwYuyTTKCMgIyAjICMgIyAjICMgIyAjICMgIyAjsMwKyAbzPEMoVyAjICMgIyAjICMgIyAjI
CMgIyAjICMgIHAwIyAbwwcAlmUYZARkBGQEZARkBGQEZARkBGQEZARkBGYF9RkA2gPcZQrkCGQEZ
ARkBGQEZARkBGQEZARkBGQEZARmBgwEB2QA+GLgk0ygjICMgIyAjICMgIyAjICMgIyAjICMgI7DP
CMgG8D5DKFcgIyAjICMgIyAjICMgIyAjICMgIyAjICNwMCAgG8AHA5dkGmUEZARkBGQEZARkBGQE
ZARkBGQEZARkBPYZAdkA3mcI5QpkBGQEZARkBGQEZARkBGQEZARkBGQEZAQOBgRkA/hg4JJMo4yA
jICMgIyAjICMgIyAjICMgIyAjICMwD4jIBvA+wyhXIGMgIyAjICMgIyAjICMgIyAjICMgIyAjMDB
gIBsAB8MXJJplBGQEZARkBGQEZARkBGQEZARkBGQEZAR2GcEZAN4nyGUK5ARkBGQEZARkBGQEZAR
kBGQEZARkBGQETgYEJAN4IOBSzKNMgIyAjICMgIyAjICMgIyAjICMgIyAjIC+4yAbADvM4RyBTIC
MgIyAjICMgIyAjICMgIyAjICMgIyAgcDArIBfDBwSaZRRkBGQEZARkBGQEZARkBGQEZARkBGQEZg
nxGQDeB9hlCuQEZARkBGQEZARkBGQEZARkBGQEZARkBG4GBAQDaADwYuyTTKCMgIyAjICMgIyAjI
CMgIyAjICMgIyAjsMwKyAbzPEMoVyAjICMgIyAjICMgIyAjICMgIyAjICMgIHAwIyAbwwcAlmUYZ
ARkBGQEZARkBGQEZARkBGQEZARkBGYF9RkARCoWs3d37XA9fQSAQXLatfsX2hq117fXt5t3NXU6P
D78ZdZpBZflVRTlDKwpmjKyeMbxKpZJt7/2FulyPjICMgIyAjICMgIyAjICMgIyAjICMgIxAMgSy
8vIsFst+M4Bh8f7nu9UL1tcYjRlTR/XvV5xTkpddkJORYdCGQpw/ELI73XWt3R1Wx08bah1W68wR
FRcfPX5U/xKZSzICMgIyAjICMgIyAjICMgIyAjICMgIyAjICBxSB/WYA72jsuPet+T9vrisvzj/n
qInjB5WX5ZsyYfcGg6EgF4T5y4UU5FDiP06hqGs1N3RZP1m0fvWWmmnDyu/501EjqosO6KvKlcsI
yAjICMgIyAjICMgIyAjICMgIyAjICPyeEdgPBrDX53/kw59e/W5NeUHOKbPGXHLcJJ8P3wW8/oAv
GAzA9kUhBjDMXvJHpVQh8tmgVWrVKp1Wu6m+6+kPfty4p/GyYyf+7dzDtBr175kf8rvLCMgIyAjI
CMgIyAjICMgIyAjICMgIyAgcIAT21QDutDguf/rzHU1dJ08f9cdjxuab9O3ddrc/4PcF/EE/Yp6p
3QuXL9y+HEe8v8wBDDNYqVaq1CpFbqa+OC/nvflrP168MUuneu3mM3MzDQfobeVqZQRkBGQEZARk
BGQEZARkBGQEZARkBGQEfrcI7JMBjBW/5z/+kU6j+et5R04ZVlbf2mNxuOH89fq8OPx+uH8DsHY5
eHxVahzkX6VSoVIoQiQSGh80KgWsYoNaPaAsL6RU3/HSnC21ze/97Tw5HPp3K5Hyi8sIyAjICMgI
yAjICMgIyAjICMgIyAgcIAR6DeB0H7Bqe/3Jt788pLLo7+cfZdQq6totLhi/Xo/T7fa4PTCBqf83
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
+PGf+IlLat0P/sAPXJL8FRfe5Qn+xL/8X37r3/32PjX84i/+4j/5J155+6u/Zp/yLXa1WOC5P+D6
LfFq6euq56Z+7yjQV2Nvts5tgbZAW6At0BZoC7QFLsEC3/1d37XP7yUUejWIAv2+6fvvu/c79fnv
7fOGN/z3b/iON3zHd7zhnnu+45577vn2b7/n2//at/81fO9+wz1/7d/uGy1fDa1vHdsCbYHdLNBL
oHt8tAW24Cfxuf60Ba5VC2D8912gLdAW+AK2wK898a/Wfj/0P//G//yR3/yN3/zfPvZv/l9Xb/M3
PcHRoj/4gwu/9mv/jw/Y99c++IFf++AHP/DBD37wQx/64Ice/9Djj3/oiScef+KJJ37915/48Ic/
/JnP2iqwa/Uh8IXc7gN5wPVb4lU3RPbs9wbAV+89vzVvC7QF2gJtgbZAW6AtsLcFXvyiF+n7ZV/2
4pe+5CX4fvnNL33Fl9/8FS9/2Ve+4stf+MXX71nEr37PdePzPb+6p/yqAEr4C+968jIyXnaWntu7
bNN1xrbAF7YFGgB/Yfdvt64t0BZoC7QF2gJtgbaAWeAFL/iiL77hesBdfm84xi8OXvjCY7sa6Ml3
/YXr7tx6LKPKPvbK//i8AtnL773P/7mvefWffdX/5c/+uT9/25/9mltve9WfufXP/ek/82f/1J++
7U/+qVu/+k/+6T/x1X/qlX/iT37lV71yT77o8lXonG2BtsDRs0AD4KPXJ63RlbDAfqLFf+AH/6vx
+cEP7CfLnjKf/Om/+F9tLsrOXmKVUPIv/vQn96y3CLCSlTyXXo4XOets2u9Tn91rNOMXQ111lhkK
79Mcl9KFC9ndB9VqwVfigus62wJtgefbAkC/N1w/cO+xF95w7IWI/XTDC17wghe+8It30+bJ9/+z
j9z+Ez/8upR53Zvf/PLnW/3d6lt7v0QGuHcYsl1/O/1cTTZRk9/H3fTSn46Xek9ePKD387qxeER+
/vMH/GSHSutegTa2jMJD8XgC7qcptQvWlR/236dVD2qcrh1Ek02ml5Q14nXgXPogeg7vBJeY9ei/
bu2n6/fs9wbAe5qoBdoCsMDv/IPX3fitW7/4dHx+8Sue/J3DNYzV+DUP3FKq3Hrsg6zygz904+v+
wYHV/ju/9itbr3rVR3/l13Yp8VJrvGdo/fTTv3jLA19z440/JN0v8/PBHzLj/71vYPar0jIv+x9/
9TcffNXWqx78zV/9H192mVbYNVvpI6vrK955gGPkMPTtMtsCbYHn0wLXfdF111//gi/+4uuPgft9
IShfoN8bbgAg5ueGG3YFwC//iq/e+shvf2K9vsYOx8dXRtekzYuei9ShrYzeH/o1gPB8dsaB1zU9
IvWcPNgn+yW/An3D38Pbkj+z8dC+74GtB38zUi71jWKDuY7Ikw5P9XwzjAYfeAc/jwVeDa9bB9L1
DYCfx1HVVR1hC+wxQfbJX/uVj77qwfu+PsW+/nu+5+ZLnFRbL06brJ76JJ8X//r331mqfKf/sSGL
Ctn15BoVPvjuB7b+m3e/5Z6PPvDuD07T4VWvSyp0Kfz17/z9f/3gq977rT80lb+Bh1xrpE/+g3ee
TuN/AVnmQAZQFDKb/ebvecstix7dXNsRvi5btbZAW+BgLPBF133RC77oi67/oi8C33v9C74I3/wA
veKvXat53Q//xO0/e+caD16A2Ff8wFf72uhP/MQrWcqT7//tb/mE7jif+ImtH3jFOodhy/jPQuqx
r14vtO+mr729bX5wTdyvPzrXM8DrHqmX9EC8vAdzac8+apsekcp6wE/2za9A+1BPLya3vDzfmfaX
Z6PlSvb9POn2PYj2ELzEMbZGvLb7UmxwoK8KexR21bxu7dn1e/b7dMv7w/60Ba5mC+w53C9f4GUv
v2Xro//xzPoCfudn7vxS/9z5M86jWtpbPpRnMt1K+NBbhviGIj/08AMfvect37NKFVreb33v1kcf
+PMo4y0fwjQvK1KR9vfaD4QmDYbQhx5776v+m2982dffB4j62NrsKzWOzJuLXWjxsu95yz1bpfx1
FtvcOTDGLWmLLwzLbB4edXAEJ795gHm/v2U5KmBMdOnpd8ZwvPyR3znbAm2BtsDW1svf/K8EZoGW
C137qz/2Ax/57sd+xtdGv/zNb+bRy9/8M7FC+uVvfuC7t35r1WEYGbd+4p+EFPH1P7+cuFp7gpbV
+eU16Dcnjy+xqy/zQV9u6cvndj218kTXyZXk6RGpFhz0k33XVyC9h/AzXjTwcNIfdu7PP/DRrfd+
K3U/iDeK2ksH8KT7J//kn1xiv+8unk2nmMbInjmW75DDptHla172Nr1KXepLaXklvIpet55r109x
//7Tf/pPlzEIgnTawiqa/52fc+fOoRzcJbM0ydSUy6iosxxZC+QYkIYnT578Mn6eo8KXOmBe/OIX
X16Nzz777Gc+85ld877qDW+77Y5v/dLfetvjv/yGl1TJ333PN9/x/m96/JO/aKm//sCX//k33fTJ
B79u6w/+8I9wv3/j2x7/5CdfYsn3vvEnb2dOO/4PSGYp9sdHt77tD5a1//qvvHfr2x551RqlXvW3
PvnJr33gyx9+ufT4zGd+FxX91jt+BRqgIvz9689s/dEfLguENn+0tVKLKfAr773tLz5+Ixp/+1+8
7YFf+b/9rVd9nTfuD6KclRqHodYWay1/ZqWu//NLbtt6/7/7t5951Uu2NlhsK2tcdMTv/rvfuu0l
b3BbXO2W8b7ZMDxgmm/FEOPg+PX3vIdW3GWAjX7f+lt/axoV1kc33vTyj37wtz7zmRv3vCj+2B/7
Y3vKtEBboC1wVVvgBV9kNC/cgMX9oi1igLV4WSl7fAwEv3kLoZzvfMV1v/3Y5wF7f/Wf/+zWdz82
XINHAWSGP+J/3/4Ty5It40e2XnHdD5QT371X/ZvOL57gv/Dpf/J////8i//8f+x88YuO/W+/+aFn
nn32c5/7/MuOf8U3fOlfevGxl2zi8ZS+8tBd90Abz6rLedDbLf3tX/nIJ3+RD1v760vf9Ii9NeiP
PPW773nPGagzFPj1B/78A3/E58Os5fSIlI0O/sm+6RVoowXSSDd+2y9+8nY07Mn71MitxTvM7m8U
u9vfitvzSXcgD7hNb4nr3lvmtNKCemIcb3rurxsJ9WXv365/+dztnWHtS2m9rK6u163du37Pfp8A
MBDs5d5/LB/W1QD9fu3Xfu329vYCET2XYjvvVWcBzIBgV72Xvey5ujruAoD15MaQw0fH/+W//JdD
NdRL3vDLn3wt7jd3fPnbt24bMPjX/+Hbt972eGDir/suwOQP/vqDX8fb/G1ve0gnmPwkyF5g4Q/+
AnKn/IOPfNsv3Pvc9f6m75pR+X5LNG2+6XHq+JLXftNtb0/V91vAvuVe8tKvdNndLLa2uDNPfuwr
v2GadNh3rVtbR9gy64YHWvaVL1Vbv+4Nb7B/djXX7q27+eW3/YdP/a6Nuv60BdoC17QFLPzVDS9A
uCuEgNZDE+bQM1THl/D697qf+fwnXvkXXvHgu374dW9eb1SDyD97+0984vP/ygJl4a8H18p9NzH0
AX9+5w8+8b/+wW/83a//8d//o7O/f/H/+5mLn/nc5/7oBde9YOcz//nXPv3Pv/PL3rTLQtbLU+US
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
VhYUYCkI1uFQVxKNEgISAhICEgISAhICEgISAhICEgISAhICB4yApAAfMIRSARICEgISAhICEgIS
AhICEgISAhICEgISAocDApICfDjUkkSjhICEgISAhICEgISAhICEgISAhICEgITAASMgKcAHDKFU
gISAhICEgISAhICEgISAhICEgISAhICEwOGAgKQAHw61JNEoISAhICEgISAhICEgISAhICEgISAh
ICFwwAhICvABQygVICEgISAhICEgISAhICEgISAhICEgISAhcDggICnAh0MtSTRKCEgISAhICEgI
SAhICEgISAhICEgISAgcMAKSAnzAEEoFSAhICEgISAhICEgISAhICEgISAhICEgIHA4ISArw4VBL
Eo0SAhICEgISAhICEgISAhICEgISAhICEgIHjICkAB8whFIBEgISAhICEgISAhICEgISAhICEgIS
AhIChwMCkgJ8ONSSRKOEgISAhICEgISAhICEgISAhICEgISAhMABIyApwAcMoVSAhICEgISAhICE
gISAhICEgISAhICEgITA4YCApAAfDrUk0SghICEgISAhICEgISAhICEgISAhICEgIXDACEgK8AFD
KBUgISAhICEgISAhICEgISAhICEgISAhICFwOCAgKcCHQy1JNEoISAhICEgISAhICEgISAhICEgI
SAhICBwwApICfMAQSgVICEgISAhICEgISAhICEgISAhICEgISAgcDghICvDhUEsSjRICEgISAhIC
EgISAhICEgISAhICEgISAgeMgKQAHzCEUgESAhICEgISAhICEgISAhICEgISAhICEgKHAwKSAnw4
1JJEo4SAhICEgISAhICEgISAhICEgISAhICEwAEjICnABwyhVICEgISAhICEgISAhICEgISAhICE
gISAhMDhgICkAB8OtSTRKCEgISAhICEgISAhICEgISAhICEgISAhcMAISArwAUMoFSAhICEgISAh
ICEgISAhICEgISAhICEgIXA4ICApwIdDLUk0SghICEgISAhICEgISAhICEgISAhICEgIHDAC8mAw
aOnsPOByuAL8/sDKnbWrd9XtqGmtbTXta+xwuL24Z9CqBxRll+VlDC7JmTqsfOqQMqVS0r0PFupS
ORICEgISAhICEgISAhICEgISAhICEgISAvEQSMvKMpvNB00Bhsb75o/rFm2qNBhSJg3v2yc/oyAr
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
Es6kB2iANLkZhB7RZjpFOwQ10E7d0kw+oUG93q/MktI5yNjf6K7eBGW958E/7z4SwDw4doefOz8k
DyD5sMpXBSmZpSJTvx4vMVNHzqWuFu7sRVpAGMfpIGacUccK+VrodilAkHIITNfu5oGxA+ZkLg8g
2THMUfut7XE1pefC+RVEgPo8T/zRQbt1+2zUl+V3jCn5x+jif3xQcvfYsi8Tm5R1ps6nsrJOZdVt
28/57PP2s8b37d+xqJ6Xzi1rXLLlPhsNrFq0b4+ahnoeMZvy+KFHpC7lOrh+3PI65wj22Urm9Q2u
v9Adck2BdxqetIuH3lprZFnS7133v3H1/vtxTzuCl8lx3ZEuEykmLKtBm1xMYRfOxQ/rfXe698Hg
2MXiTqObs3mPpqvTs52jdCmZjPHLuhpeKr4567op/lubwNLHuTYivJOWTN739QPqaupqKusSbYrp
Nb9JGhlWWsRLPdNCIkRMSBWXNSaI/dU1JL5PVE2rfLjPg1t22JLsH2mrJkaq5Hn26jhFQNJSE59/
/jneuo4sIMaLsuDV7fQTwV5SyhQZ3nzzzUmbU5ctnc07OWd1FGkNeybZPJo/5vfy9h2+pVuNtaS4
6Hc/OoQWuyIXgK659sn/NdgKNCXJkrGHf9ijO3tRa1iZQnayI/C7P/7jhOMPoHNEgMnxLSsrIQd4
k0169enTmxa++uPvzgrAAYHLL7+cvNusaJDOISVM6F166aXrOVwjz6m6eqtPXy1oyf+cUP35b48e
ffhuPbp2xnqeTW7kycycM++JZ9/97a+Ob/Li9eECMnnvv//+9OnTSSZJOIn6Uq8xXuFD3gYpbYzj
pR0idTRSGiNdyVzSW3xIyKl7pKBxUus6lORpUD8XORsUzqWB5dSVQJ1c6FKnNx7RN52i4DnBQDjT
3GByM+hFwQQsEWYKnxYwvG6NRpCKT9Ly/PPPkzdFXhOVkeQEY+jgejmnC74tpIhuIXmjLhgSJBp7
3+KCNO6Ry17qfvGFQ7qu0diFzLU+Av987NU3Ppr7xvLdinq2L6lI+ONbMCro+teO6tenvN/W7aL6
6oZfPr/8wePbdi754vVvvppau+M9L3DwL/9cD68IxedUld1HzPPa6ldzLxzV+kVeJ58wW14jS7NI
/NJRaMH9bIIA03Vk8EbNeu/o0cctq11Oq4Ik20TJSlrquShZLgSY3/qbTCYaE7XJaGHU5ruqu3rf
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
qN95nYdntR869g+ffObJfUkfD30u6aMdjz7qN0tpFVvciuveVqX1Xpfi3qIKRp/XilK4zp3X0Nyq
Nc3zVBKnO3ZrKzOU7Ay1pVIo1K9vMVo2WQvQysn919qMzbI0n2F5Y4th7XBahVS/KGkVVWVKd6/F
I+ecdMI6JEACJEACJEACJEACJEACJJAQBOJfACeJPa7wAOBxJWnjL7f+tOFn3W0tJ6SMI/ZrnKDR
jz46+9ix5x/bajFrQh42FCEXuaxKU4zQlUqHKx3hdFk8qdBqY49mlZZUWZm2dGUeLCSt8Yhkn17s
rAVu5eT26u/t9nUnPSvP2E7unSWKlmjtxCjrkAAJkAAJkAAJkAAJkAAJkEBiEoh7AYyH/Q7ufb/x
7KPuunXdXbfegmPmzGTMFTKfjTM2c2wUb4c/OmA5jVI35mWlG64ik9inyFXCNiWtYuf4eJ+7GyLY
WgVbWgvaKtg917dbW+JrURHJ0Ukii1sOwhgaDmaV10mABEiABEiABEiABEiABEggIQnEvQAuvey8
3z7ZseHRpx7e9KQ8UjJy/jacdMRRRxsn7MDwOE5mLF5sMYv9dauxD1YfEqFX18ksYSGIQ88YFnq2
D8nSNZoVT1eBrdm1cnK7+Vn2KmIRHC5r8TxJWLxjIQESIAESIAESIAESIAESIIHpTSDuBXBG2ql3
31ZqPOqeefK5A0ePKTM+LDrug/OOOpB/5GDuzE8Ojj+zd/yK9Xf5TbeQv4p7XaFcCywlsEiKRgq0
ntGM/aRMotbXTOsaY/Kzb460vbXArZzclyKJukOX7dh3yzfT2aPhxRDtQ8VOOmIdEiABEiABEiAB
EiABEiABEoh/AnEvgP2nAPs8X73z5bo/Hnq598O//f3wnn1jPfvGH31DufB3T3/25JNN9VvXpOtb
X0nZKyVw4UZkDYtlvXIN8LaspeadrYyG0rPU5Ge15so+/2Rpa2tWrUTislyyq61BXiSVt815hI9F
5FpbrdxcjAC05pfU8/LCamULU6Dj/7PKEZAACZAACZAACZAACZAACUyQQNLQ0BBMPPRI422VFRO0
FVPN97/33jObN/+mpmZsZCRv9aqSqtvmnnhiTHkYDWfsnh8cjb5i0yYfg2QxLyFuEx9i9dh8zAwf
YzB1H9CQb6Aouxptf2LMfsjuhNwgxPmajvb5/RPiTRKg+jS7f0IebsgNIjc1lpYSwR9+fiN3k0T7
fgjRfsI+Bsk4Y4gDX3LzzY8NDf3bgQPX/+uG6aB+1RRofSfryN2+tEQCJEACJEACJEACJEACJEAC
CUEgYSPACTE7wQeBkK9h3S/2mg64WXVwe3Ffw0kEOO4HyQGQAAmQAAmQAAmQAAmQwHQicPDgwb17
9yYnJx955JF4DJA+dCz3NGLA02+MZ+Qi1eHh4blz595z/4ZbblqLygm4Bng63QlirbKhTHf1O62m
noMlARIgARIgARIgARIgARIIlQAFcKjEWJ8ESIAESIAESIAESIAESIAESCAuCcR9CvRru9947NfP
KYGXrCcp31vxjTOzTo/LKaLToRBgCnQotFiXBEiABEiABEiABEiABOKAAFOgvZME9fu9Fee6rr04
wHH5ivOESGYhARIgARIgARIgARIgARIgARKYxgTiPwV6XDn+2M+s7fzwh3f95NaaWtOBkxVvzDju
2NlBQsTT+A7g0EmABEiABEiABEiABEiABEhgmhCI+xToyupHb1hz0epdH5/y9MNlq6749KzZ+sxh
f7D7H37448tudZ8+5n7kd7XVV02TSZ3OwwwvBRo5FdMZGsdOAiRAAiRAAiRAAiRAAjFOgLtAW0zQ
yOGR557px/H8M2+89PzbR8wQm2KPKMrY2NjkTyceULSorj+sftE0yaqx3fmQOomIkZB6ZGUSIAES
IAESIAESIAESIAESiAqBI444YubMmfjXofX4T4E2DHRMGVt64ZdxzF/e+/g138aV0aTR4dGPx8YC
75HlkNUkVOuvWwTtW5PlLvPtzO58SC5FxEhIPbIyCZAACZAACZAACZAACZAACUSLAHQv0n5zc3Px
r0MNnFACGFzf/3AIx/y9S8555gdf3H7aLxc80PLfJ5/26xO6j+yIFvVI2k2r2InH+u6syDAZtTsf
Ut8RMRJSj6xMAiRAAiRAAiRAAiRAAiRAAlEhINXvF77whZSUlIKCAocaONEEsERb3HH+HX1VR8w9
KvmEo3HgRduxv1z02CJ/8GpUdE2rdsHnnQyYqkXPZRbn1rTqVww5zmpmsW9ln96srClKsFbB7xQ/
CzL12ttduHnYwbtmDRIgARIgARIgARIgARIgARKYCgJQvyhQv/NOOOG0U0/96sKFN950ozwZ2J0E
FMDb3/3dO4ffTT4+ZfSDg2MfYQnwjCRgODblvz7c9do7r5lwpFVscec11KiLdfvrVrsUd9/GQvX1
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
pMbaJdvuAoEX/oS6O1CdyvBifmerPuGIKEqjbDpqTpxUShoUFDbAdnjUgJJh7QhA+Bdv//LGP/MR
ob76KY0i+ohQEWLl/E09eLJMtL0sSiixG2MvQxIcSuhf0fKIi6ezODS0oSKDPxjX49ATFS+K2fWk
WxcxZIz7h5A+0HISorwSLhy6wVLcufhCvVWSgpB7XT/GzEUsNQmVWPTE6h1KiEGBxeuFk8sfF2Oy
cJrzPJ0z7fneIIL8sZ40ix8iWXVqU4KBniurJMJ3Zj1S68iNOd82KwnQo9cNnrMxxtjj93VA3PTd
k9SmqMZVMyMJZm6w5m5z+zD09N9z2mGOlMJzsqJ2NaNmRZBrR+Cd6gbPiWue853yaDwPZdZdeaBl
22O7QlktzOcFU9VcuqyY1kRrVrEWRYfuTQ8S4SHMUOKRxtpDoT0lcZasPww9PK5TxgmeCqgjQ24H
FhcQW0ej9feICOu4HJNkQUOz5TiapYY2xr2b3Ir9vijlZ3AlY0WNDgBD2biadOVAq0MIkDs1B2xe
LQm/7tQ7ROLGgcV5FaC9EbYYAGmDfJCs8WHXiiEtIhG6FglwtcyrFJiwIaPKNUFWfUhRrTH8erEJ
tEkwfIa0i2Ovl0MlLorF1kKzrRnD1EQVAOzDh5NMyrojUiI8BG3YrVXgCTnKEis0CAimK8UfFBKg
xCpcDZOZL+G/QgPM0ikd1YLEC0Y48peFgaTwKOY48nIrOap+OViQnMj86Kva2AnQ3nAhtOjXxstU
5RKJd9E3WJMYLH4BBIw+H+E3QwuxwsAxvdLnn1hXxX00dKZMG3y7mR8uVr5bVoRurwBDX7Fb8GaN
1HsBl71yTypSCI9actehwC1XZquxAIHnWneJeFjw7uLEQa3Bf/EeH+uz0Iu0WuMXAbrlhXW6FscD
dKlh5X6I9styMDrcwF4u6DN5FULOT9wbIgdlHKVkUqXaa782SFD8OgeIW6oG7QUGQgcdIPotFJQ1
Le9BI3GrNI9anEpe/ArdfPIUfslrtKw5G12PWfo0D1IiQIIV4qviNMpSL/riGGIfdL0bAp1/h668
9Ipr6LPbzl144KC6jTa/Nx7VTOyXXtokr9vkd22WVtE3vYlT9vFWTvrmj7x/FKFgcsh5GKYM0/hs
0rK//ulXLjOX/+a6Hbbtsv9eG9K7f2nfHadriCeL6yR6V702DcbIWiridMq3OdL28mRWpZ4yFYOY
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
NLkZhB7RZjpFOwQ10E7d0kw+oUG93q/MktI5yNjf6K7eBGW958E/7z4SwDw4doefOz8kDyD5sMpX
BSmZpSJTvx4vMVNHzqWuFu7sRVpAGMfpIGacUccK+VrodilAkHIITNfu5oGxA+ZkLg8g2THMUfut
7XE1pefC+RVEgPo8T/zRQbt1+2zUl+V3jCn5x+jif3xQcvfYsi8Tm5R1ps6nsrJOZdVt28/57PP2
s8b37d+xqJ6Xzi1rXLLlPhsNrFq0b4+ahnoeMZvy+KFHpC7lOrh+3PI65wj22Urm9Q2uv9Adck2B
dxqetIuH3lprZFnS7133v3H1/vtxTzuCl8lx3ZEuEykmLKtBm1xMYRfOxQ/rfXe698Hg2MXiTqOb
s3mPpqvTs52jdCmZjPHLuhpeKr4567op/lubwNLHuTYivJOWTN739QPqaupqKusSbYrpNb9JGhlW
WsRLPdNCIkRMSBWXNSaI/dU1JL5PVE2rfLjPg1t22JLsH2mrJkaq5Hn26jhFQNJSE59//jneuo4s
IMaLsuDV7fQTwV5SyhQZ3nzzzUmbU5ctnc07OWd1FGkNeybZPJo/5vfy9h2+pVuNtaS46Hc/OoQW
uyIXgK659sn/NdgKNCXJkrGHf9ijO3tRa1iZQnayI/C7P/7jhOMPoHNEgMnxLSsrIQd4k0169enT
mxa++uPvzgrAAYHLL7+cvNusaJDOISVM6F166aXrOVwjz6m6eqtPXy1oyf+cUP35b48effhuPbp2
xnqeTW7kycycM++JZ9/97a+Ob/Li9eECMnnvv//+9OnTSSZJOIn6Uq8xXuFD3gYpbYzjpR0idTRS
GiNdyVzSW3xIyKl7pKBxUus6lORpUD8XORsUzqWB5dSVQJ1c6FKnNx7RN52i4DnBQDjT3GByM+hF
wQQsEWYKnxYwvG6NRpCKT9Ly/PPPkzdFXhOVkeQEY+jgejmnC74tpIhuIXmjLhgSJBp73+KCNO6R
y17qfvGFQ7qu0diFzLU+Av987NU3Ppr7xvLdinq2L6lI+ONbMCro+teO6tenvN/W7aL66oZfPr/8
wePbdi754vVvvppau+M9L3DwL/9cD68IxedUld1HzPPa6ldzLxzV+kVeJ58wW14jS7NI/NJRaMH9
bIIA03Vk8EbNeu/o0cctq11Oq4Ik20TJSlrquShZLgSY3/qbTCYaE7XJaGHU5ruqu3rfvl3bbWms
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
Pdx54B0Xv/jiRPXRnx//2TPJwxPJZ589+Yvjp04mYyfXXHCePhdecP6Fa8znogsvuPjCCy666IKL
L7qw5tyzcz077SPHPOzT239+qT+WurWW/KAPvzOMPf4jF12e1wklcdWffPpL74695+b/qWdCjpeN
zEfk6bI92TMT9l+BnMkr7Wgs9aoTfCIFQuV8Tcn5RlGAfzFPurm6SnM+SHO9t2Qfy3jJy/wheGIR
z/0siPlePkt9Kc0ulXKVfqNd+K9b077kFKz3YgWwdK9scbfffnsR42RSpsAiht4tgSBC/GtveP2f
/WmHY5253/TqTX///nt0cAkUs9giWCNwwWZXUgD1WG/atEl/y62Bp8vVEx9/851f8wM88fEPfTr2
5te/WvN33vonb374Pa/3f3vi43d+fDoTqgt/RyrM1+687dM5k738rZ/e+eZP33bVmzNi+9qd6Sw8
fLAIQ+20mJ8Ykv59U1PW/NDLre7emS5oRgwzTlHorrrt02/eeZdwaSuVWCz26te/OSPxJUQmXD+Z
VayXnpdcXhqu7Dp64vFHrlvH/N+SbjYEhsDSJHB9w8tfdu2166684tK1a2ul9i5co88FF5x/7rnn
VFefdaa2M86YtuSSq5lb1tzdjN+8cc/GW5bbdEA/p4ZDZ+ya1DIjTQWZFf+HJr791//VecsrWp9Y
9ePvTe5/6uRTU7HT55++6OzE+ctOxH7x3OFPfqr/U/2f/tSnP93/6fs+fd9nzOczu+/7zP/Rzr/s
+tRLr8zhuMQ8Fj99W/rha57a1737Nvc8y7NN86APPwHveE/MRRf46YmPfzzjWawnn9HA6ZeNdNJZ
j8gyPdnzvQLNuLqKfqMoyH/hPekuX5d+kcr7kpcmV/C5n90SvBPzvUqV/oqVWYeL63VrllVflAB2
6veXfumXLrjggoKtPc9EvmIF1KILJyD19fWvetWrHJnM/RtuvPHlL3+5Di66Qs08w6dOebO9CzaU
UgIcPXr0937v98qngfWYLlBkTTKRHE1tr3/PVf8w+teb7Dmb/nr0H4xUddvr77/y1W6WjunhTEea
nhiw6a+/8C49xVzwL73uC++6Lk8DUcQZIRX4Q1f+vpfk779LD2QduXMolJDtfgiV5tLf/dSnfjdr
9tDQzvc8fN0bvbz6+bz01W+8LvbpL5los+LZlJViOngoWq/kGayuev3Bt42OpmhNRyxnzu0Jr3vz
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
JeDKjaN+aQJlfiJYRWVYJoIfsMKI4sjD/14CGG2FGDpswJ0nt2iF9jM98vQsdpEnScRHg7PGOHWF
9aCYEf4HE8BACeHkEDia1CNABIS2C7o6cCveyI9FR3AB8bBGyTQapdXmxE5AyF2y85N//q+BNnK6
EAgJIdGDCxS8vmc8R8QtXufGX5dw6AW2coSZ9ys19YwWATHDjSNhg4XSyfQp5PkfAUyb4n8E8P8I
YDEroX/iJJA1kZ1MUOz/CGDxbfz/Zc7/EcD/hd36f5QAJhucYJsTso+F1zi9/D//3N43U3baCAAA
AABJRU5ErkJgggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAGoEDwASAAEACwEPAAcAAwADAAMAAAAEAAgAAACYAAAAngAAAJ4AAACeAAAAngAAAJ4AAACe
AAAAngAAAJ4AAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAB2AgAAdgIAAHYC
AAB2AgAAdgIAAHYCAAB2AgAAdgIAAHYCAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA+AgAANgYA
ADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAA
NgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAAqAAAADYGAAA2
BgAAFgAAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAAuAAAADYGAAA2BgAANgYAADYG
AAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAAGgBAABIAQAANgYAADYGAAA2BgAANgYA
ADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAA
NgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2
BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYG
AAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYA
ADYGAAA2BgAANgYAADYGAACwAwAANgYAADIGAAAYAAAAwAMAANADAADgAwAA8AMAAAAEAAAQBAAA
IAQAADAEAABABAAAUAQAAGAEAABwBAAAgAQAAJAEAADAAwAA0AMAAOADAADwAwAAAAQAABAEAAAy
BgAAKAIAANgBAADoAQAAIAQAADAEAABABAAAUAQAAGAEAABwBAAAgAQAAJAEAADAAwAA0AMAAOAD
AADwAwAAAAQAABAEAAAgBAAAMAQAAEAEAABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQAwAA4AMA
APADAAAABAAAEAQAACAEAAAwBAAAQAQAAFAEAABgBAAAcAQAAIAEAACQBAAAwAMAANADAADgAwAA
8AMAAAAEAAAQBAAAIAQAADAEAABABAAAUAQAAGAEAABwBAAAgAQAAJAEAADAAwAA0AMAAOADAADw
AwAAAAQAABAEAAAgBAAAMAQAAEAEAABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQAwAA4AMAAPAD
AAAABAAAEAQAACAEAAAwBAAAQAQAAFAEAABgBAAAcAQAAIAEAACQBAAAOAEAAFgBAAD4AQAACAIA
ABgCAABWAgAAfgIAACAAAABPSgMAUEoDAFFKAwBfSAEEbUgJQG5ICUBzSAlAdEgJQAAAAABKAABg
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
dA8cvQXfDCZMSRNM8J1KYOihByYPIPktR7N04y8AAAD//wMAUEsDBBQABgAIAAAAIQAN0ZCftgAA
ABsBAAAnAAAAdGhlbWUvdGhlbWUvX3JlbHMvdGhlbWVNYW5hZ2VyLnhtbC5yZWxzhI9NCsIwFIT3
gncIb2/TuhCRJt2I0K3UA4TkNQ02PyRR7O0NriwILodhvplpu5edyRNjMt4xaKoaCDrplXGawW24
7I5AUhZOidk7ZLBggo5vN+0VZ5FLKE0mJFIoLjGYcg4nSpOc0IpU+YCuOKOPVuQio6ZByLvQSPd1
faDxmwF8xSS9YhB71QAZllCa/7P9OBqJZy8fFl3+UUFz2YUFKKLGzOAjm6pMBMpburrE3wAAAP//
AwBQSwECLQAUAAYACAAAACEA6d4Pv/8AAAAcAgAAEwAAAAAAAAAAAAAAAAAAAAAAW0NvbnRlbnRf
VHlwZXNdLnhtbFBLAQItABQABgAIAAAAIQCl1qfnwAAAADYBAAALAAAAAAAAAAAAAAAAADABAABf
cmVscy8ucmVsc1BLAQItABQABgAIAAAAIQBreZYWgwAAAIoAAAAcAAAAAAAAAAAAAAAAABkCAAB0
aGVtZS90aGVtZS90aGVtZU1hbmFnZXIueG1sUEsBAi0AFAAGAAgAAAAhADDdQymoBgAApBsAABYA
AAAAAAAAAAAAAAAA1gIAAHRoZW1lL3RoZW1lL3RoZW1lMS54bWxQSwECLQAUAAYACAAAACEADdGQ
n7YAAAAbAQAAJwAAAAAAAAAAAAAAAACyCQAAdGhlbWUvdGhlbWUvX3JlbHMvdGhlbWVNYW5hZ2Vy
LnhtbC5yZWxzUEsFBgAAAAAFAAUAXQEAAK0KAAAAADw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rp
bmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4NCjxhOmNsck1hcCB4bWxuczphPSJodHRwOi8v
c2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvbWFpbiIgYmcxPSJsdDEi
IHR4MT0iZGsxIiBiZzI9Imx0MiIgdHgyPSJkazIiIGFjY2VudDE9ImFjY2VudDEiIGFjY2VudDI9
ImFjY2VudDIiIGFjY2VudDM9ImFjY2VudDMiIGFjY2VudDQ9ImFjY2VudDQiIGFjY2VudDU9ImFj
Y2VudDUiIGFjY2VudDY9ImFjY2VudDYiIGhsaW5rPSJobGluayIgZm9sSGxpbms9ImZvbEhsaW5r
Ii8+AAAAAP4AAAAMAAAUAAAEAP////8ACAAAkAgAAP0IAAD+CAAABQAAAAcAAAAJAAAAAAgAAN0I
AAD+CAAABgAAAAgAAAAPAADwOAAAAAAABvAYAAAAAgQAAAIAAAABAAAAAQAAAAEAAAACAAAAQAAe
8RAAAAD//wAAAAD/AICAgAD3AAAQAA8AAvCSAAAAEAAI8AgAAAABAAAAAQQAAA8AA/AwAAAADwAE
8CgAAAABAAnwEAAAAAAAAAAAAAAAAAAAAAAAAAACAArwCAAAAAAEAAAFAAAADwAE8EIAAAASAArw
CAAAAAEEAAAADgAAUwAL8B4AAAC/AQAAEADLAQAAAAD/AQAACAAEAwkAAAA/AwEAAQAAABHwBAAA
AAEAAAAAAAAAkAAAAJEAAADHAAAAygAAAAABAAAHAAQABwAcAAcAAAAAAAABAAAHAAAAAAAXAAAA
GAAAAP0AAAAAAQAABAADAAQABwANAAAABAAAAAgAAADlAAAAAAAAAAwAAAAYEBIAkGgYAA1BNgBz
BEsA6mFgANo/cgBrUX8AKVyCANBBhwC/AZUA0ELEAMVPyABsDNYAAAAAAP4AAAAAAQAAAAAAAAEA
AAD/QAOAAQCRAAAAkQAAAAAAAAABAAEAkQAAAAAAAACRAAAAAAAAAAIQAAAAAAAAAP4AAABgAAAQ
AEAAAP//AQAAAAcAVQBuAGsAbgBvAHcAbgD//wEACAAAAAAAAAAAAAAA//8BAAAAAAD//wAAAgD/
/wAAAAD//wAAAgD//wAAAAAFAAAARx6QAQAAAgIGAwUEBQIDBP8qAOBBeADACQAAAAAAAAD/AQAA
AAAAAFQAaQBtAGUAcwAgAE4AZQB3ACAAUgBvAG0AYQBuAAAANRCQAQIABQUBAgEHBgIFBwAAAAAA
AAAQAAAAAAAAAAAAAACAAAAAAFMAeQBtAGIAbwBsAAAAMyKQAQAAAgsGBAICAgICBAMAAAAAAAAA
AAAAAAAAAAABAAAAAAAAAEEAcgBpAGEAbAAAADcukAEAAAIPBQICAgQDAgT/AgDh/6wAQAkAAAAA
AAAAnwEAAAAAAABDAGEAbABpAGIAcgBpAAAAQRKQAQEAAgQFAwUEBgMCBAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAEMAYQBtAGIAcgBpAGEAIABNAGEAdABoAAAAIgAEAHEIiBgA8NACAABoAQAAAAC7
q/qmb6z6pgAAAAAMAKgAAAAlAAAA2QAAAAwAAQAAAAQAA5ABAAAAJQAAANkAAAAMAAEAAAABAAAA
AAAAANECAPAQAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAFoAW0ALQAgYFyMAAAAAAAAAAA
AAAAAAAA/QAAAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAEuDEQDwEAAIAPz9AQAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAhIUAAAAAAJ8P8PAAkkUAAA5AQAAP///3////9/////f////3////9/////f////3/q
YWAAAAQAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAhBAAAAAAAAAAAAAAAAAAAAAAAABAcAAAEAAAA
AAAAAAAAeAAAAHgAAAAAAAAAAAAAAKAFAAAAAAAACwAAAAAAAADcAAAA//8SAAAAAAAAAAAAAAAA
AAAADQBhAG0AcgBpAHMAaABfAHAAYQByAGkAawBoAA0AYQBtAHIAaQBzAGgAXwBwAGEAcgBpAGsA
aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v8AAAYBAgAA
AAAAAAAAAAAAAAAAAAAAAQAAAOCFn/L5T2gQq5EIACsns9kwAAAAKAEAAA0AAAABAAAAcAAAAAQA
AAB4AAAABwAAAJAAAAAIAAAAoAAAAAkAAAC4AAAAEgAAAMQAAAAKAAAA5AAAAAwAAADwAAAADQAA
APwAAAAOAAAACAEAAA8AAAAQAQAAEAAAABgBAAATAAAAIAEAAAIAAADkBAAAHgAAABAAAABhbXJp
c2hfcGFyaWtoAAAAHgAAAAgAAABOb3JtYWwAAB4AAAAQAAAAYW1yaXNoX3BhcmlraAAAAB4AAAAE
AAAAMTIAAB4AAAAYAAAATWljcm9zb2Z0IE9mZmljZSBXb3JkAAAAQAAAAADwJXgXAAAAQAAAAAAW
RN3Tj8wBQAAAAAAGalXrj8wBAwAAAAwAAAADAAAAJQAAAAMAAADZAAAAAwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7/AAAGAQIAAAAAAAAAAAAA
AAAAAAAAAAEAAAAC1c3VnC4bEJOXCAArLPmuMAAAAPwAAAAMAAAAAQAAAGgAAAAPAAAAcAAAAAUA
AACQAAAABgAAAJgAAAARAAAAoAAAABcAAACoAAAACwAAALAAAAAQAAAAuAAAABMAAADAAAAAFgAA
AMgAAAANAAAA0AAAAAwAAADdAAAAAgAAAOQEAAAeAAAAGAAAAFN5bWFudGVjIENvcnBvcmF0aW9u
AAAAAAMAAAABAAAAAwAAAAEAAAADAAAA/QAAAAMAAAAAAA4ACwAAAAAAAAALAAAAAAAAAAsAAAAA
AAAACwAAAAAAAAAeEAAAAQAAAAEAAAAADBAAAAIAAAAeAAAABgAAAFRpdGxlAAMAAAABAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAH
AAAACAAAAAkAAAAKAAAA/v///wwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAABUA
AAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAAIAAAACEAAAAiAAAAIwAA
ACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAALAAAAC0AAAAuAAAALwAAADAAAAAxAAAA
MgAAADMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAA6AAAAOwAAADwAAAA9AAAAPgAAAD8AAABA
AAAAQQAAAEIAAABDAAAARAAAAEUAAABGAAAARwAAAEgAAABJAAAASgAAAEsAAABMAAAATQAAAE4A
AABPAAAAUAAAAFEAAABSAAAAUwAAAFQAAABVAAAAVgAAAFcAAABYAAAAWQAAAFoAAABbAAAAXAAA
AF0AAABeAAAAXwAAAGAAAABhAAAAYgAAAGMAAABkAAAAZQAAAGYAAABnAAAAaAAAAGkAAABqAAAA
awAAAGwAAABtAAAAbgAAAG8AAABwAAAAcQAAAHIAAABzAAAAdAAAAHUAAAB2AAAAdwAAAHgAAAB5
AAAAegAAAHsAAAB8AAAAfQAAAH4AAAB/AAAAgAAAAIEAAACCAAAAgwAAAIQAAACFAAAAhgAAAIcA
AACIAAAAiQAAAIoAAACLAAAAjAAAAI0AAACOAAAAjwAAAJAAAACRAAAAkgAAAJMAAACUAAAAlQAA
AJYAAACXAAAAmAAAAJkAAACaAAAAmwAAAJwAAACdAAAAngAAAJ8AAACgAAAAoQAAAKIAAACjAAAA
pAAAAKUAAACmAAAApwAAAKgAAACpAAAAqgAAAKsAAACsAAAArQAAAK4AAACvAAAAsAAAALEAAACy
AAAAswAAALQAAAC1AAAAtgAAALcAAAC4AAAAuQAAALoAAAC7AAAAvAAAAL0AAAC+AAAAvwAAAMAA
AADBAAAAwgAAAMMAAADEAAAAxQAAAMYAAADHAAAAyAAAAMkAAADKAAAAywAAAMwAAADNAAAAzgAA
AM8AAADQAAAA0QAAANIAAADTAAAA1AAAANUAAADWAAAA1wAAANgAAADZAAAA2gAAANsAAADcAAAA
3QAAAN4AAADfAAAA4AAAAOEAAADiAAAA4wAAAOQAAADlAAAA5gAAAOcAAADoAAAA6QAAAOoAAADr
AAAA7AAAAO0AAADuAAAA7wAAAPAAAADxAAAA8gAAAPMAAAD0AAAA9QAAAPYAAAD3AAAA+AAAAPkA
AAD6AAAA+wAAAPwAAAD9AAAA/gAAAP8AAAAAAQAAAQEAAAIBAAADAQAABAEAAAUBAAAGAQAABwEA
AAgBAAAJAQAACgEAAAsBAAAMAQAADQEAAA4BAAAPAQAAEAEAABEBAAASAQAAEwEAABQBAAAVAQAA
FgEAABcBAAAYAQAAGQEAABoBAAAbAQAAHAEAAB0BAAAeAQAAHwEAACABAAAhAQAAIgEAACMBAAAk
AQAAJQEAACYBAAAnAQAAKAEAACkBAAAqAQAAKwEAACwBAAAtAQAALgEAAC8BAAAwAQAAMQEAADIB
AAAzAQAANAEAADUBAAA2AQAANwEAADgBAAA5AQAAOgEAADsBAAA8AQAAPQEAAD4BAAA/AQAAQAEA
AEEBAABCAQAAQwEAAEQBAABFAQAARgEAAEcBAABIAQAASQEAAEoBAABLAQAATAEAAE0BAABOAQAA
TwEAAFABAABRAQAAUgEAAFMBAABUAQAAVQEAAFYBAABXAQAAWAEAAFkBAABaAQAAWwEAAFwBAABd
AQAAXgEAAF8BAABgAQAAYQEAAGIBAABjAQAAZAEAAGUBAABmAQAAZwEAAGgBAABpAQAAagEAAGsB
AABsAQAAbQEAAG4BAABvAQAAcAEAAHEBAAByAQAAcwEAAHQBAAB1AQAAdgEAAHcBAAB4AQAAeQEA
AHoBAAB7AQAAfAEAAH0BAAB+AQAAfwEAAIABAACBAQAAggEAAIMBAACEAQAAhQEAAIYBAACHAQAA
iAEAAIkBAACKAQAAiwEAAIwBAACNAQAAjgEAAI8BAACQAQAAkQEAAJIBAACTAQAAlAEAAJUBAACW
AQAAlwEAAJgBAACZAQAAmgEAAJsBAACcAQAAnQEAAJ4BAACfAQAAoAEAAKEBAACiAQAAowEAAKQB
AAClAQAApgEAAKcBAACoAQAAqQEAAKoBAACrAQAArAEAAK0BAACuAQAArwEAALABAACxAQAAsgEA
ALMBAAC0AQAAtQEAALYBAAC3AQAAuAEAALkBAAC6AQAAuwEAALwBAAC9AQAAvgEAAL8BAADAAQAA
wQEAAMIBAADDAQAAxAEAAMUBAADGAQAAxwEAAMgBAADJAQAAygEAAMsBAADMAQAAzQEAAM4BAADP
AQAA0AEAANEBAADSAQAA0wEAANQBAADVAQAA1gEAANcBAADYAQAA2QEAANoBAADbAQAA3AEAAN0B
AADeAQAA3wEAAOABAADhAQAA4gEAAOMBAADkAQAA5QEAAOYBAADnAQAA6AEAAOkBAADqAQAA6wEA
AOwBAADtAQAA7gEAAO8BAADwAQAA8QEAAPIBAADzAQAA9AEAAPUBAAD2AQAA9wEAAPgBAAD5AQAA
+gEAAPsBAAD8AQAA/QEAAP4BAAD/AQAAAAIAAAECAAACAgAAAwIAAAQCAAAFAgAABgIAAAcCAAAI
AgAACQIAAAoCAAALAgAADAIAAA0CAAAOAgAADwIAABACAAARAgAAEgIAABMCAAAUAgAAFQIAABYC
AAAXAgAAGAIAABkCAAAaAgAAGwIAABwCAAAdAgAAHgIAAB8CAAAgAgAAIQIAACICAAAjAgAAJAIA
ACUCAAAmAgAAJwIAACgCAAApAgAAKgIAACsCAAAsAgAALQIAAC4CAAAvAgAAMAIAADECAAAyAgAA
MwIAADQCAAA1AgAANgIAADcCAAA4AgAAOQIAADoCAAA7AgAAPAIAAD0CAAA+AgAAPwIAAEACAABB
AgAAQgIAAEMCAABEAgAARQIAAEYCAABHAgAASAIAAEkCAABKAgAASwIAAEwCAABNAgAATgIAAE8C
AABQAgAAUQIAAFICAABTAgAAVAIAAFUCAABWAgAAVwIAAFgCAABZAgAAWgIAAFsCAABcAgAAXQIA
AF4CAABfAgAAYAIAAGECAABiAgAAYwIAAGQCAABlAgAAZgIAAGcCAABoAgAAaQIAAGoCAABrAgAA
bAIAAG0CAABuAgAAbwIAAHACAABxAgAAcgIAAHMCAAB0AgAAdQIAAHYCAAB3AgAAeAIAAHkCAAB6
AgAAewIAAHwCAAB9AgAAfgIAAH8CAACAAgAAgQIAAIICAACDAgAAhAIAAIUCAACGAgAAhwIAAIgC
AACJAgAAigIAAIsCAACMAgAAjQIAAI4CAACPAgAAkAIAAJECAACSAgAAkwIAAJQCAACVAgAAlgIA
AJcCAACYAgAAmQIAAJoCAACbAgAAnAIAAJ0CAACeAgAAnwIAAKACAAChAgAAogIAAKMCAACkAgAA
pQIAAKYCAACnAgAAqAIAAKkCAACqAgAAqwIAAKwCAACtAgAArgIAAK8CAACwAgAAsQIAALICAACz
AgAAtAIAALUCAAC2AgAAtwIAALgCAAC5AgAAugIAALsCAAC8AgAAvQIAAL4CAAC/AgAAwAIAAMEC
AADCAgAAwwIAAMQCAADFAgAAxgIAAMcCAADIAgAAyQIAAMoCAADLAgAAzAIAAM0CAADOAgAAzwIA
ANACAADRAgAA0gIAANMCAADUAgAA1QIAANYCAADXAgAA2AIAANkCAADaAgAA2wIAANwCAADdAgAA
3gIAAN8CAADgAgAA4QIAAOICAADjAgAA5AIAAOUCAADmAgAA5wIAAOgCAADpAgAA6gIAAOsCAADs
AgAA7QIAAO4CAADvAgAA8AIAAPECAADyAgAA8wIAAPQCAAD1AgAA9gIAAPcCAAD4AgAA+QIAAPoC
AAD7AgAA/AIAAP0CAAD+AgAA/wIAAAADAAABAwAAAgMAAAMDAAAEAwAABQMAAAYDAAAHAwAACAMA
AAkDAAAKAwAACwMAAAwDAAANAwAADgMAAA8DAAAQAwAAEQMAABIDAAATAwAAFAMAABUDAAAWAwAA
FwMAABgDAAAZAwAAGgMAABsDAAAcAwAAHQMAAB4DAAAfAwAAIAMAACEDAAAiAwAAIwMAACQDAAAl
AwAAJgMAACcDAAAoAwAAKQMAACoDAAArAwAALAMAAC0DAAAuAwAALwMAADADAAAxAwAAMgMAADMD
AAA0AwAANQMAADYDAAA3AwAAOAMAADkDAAA6AwAAOwMAADwDAAA9AwAAPgMAAD8DAABAAwAAQQMA
AEIDAABDAwAARAMAAEUDAABGAwAARwMAAEgDAABJAwAASgMAAEsDAABMAwAATQMAAE4DAABPAwAA
UAMAAFEDAABSAwAAUwMAAFQDAABVAwAAVgMAAFcDAABYAwAAWQMAAFoDAABbAwAAXAMAAF0DAABe
AwAAXwMAAGADAABhAwAAYgMAAGMDAABkAwAAZQMAAGYDAABnAwAAaAMAAGkDAABqAwAAawMAAGwD
AABtAwAAbgMAAG8DAABwAwAAcQMAAHIDAABzAwAAdAMAAHUDAAB2AwAAdwMAAHgDAAB5AwAAegMA
AHsDAAB8AwAAfQMAAH4DAAB/AwAAgAMAAIEDAACCAwAAgwMAAIQDAACFAwAAhgMAAIcDAACIAwAA
iQMAAIoDAACLAwAAjAMAAI0DAACOAwAAjwMAAJADAACRAwAAkgMAAJMDAACUAwAAlQMAAJYDAACX
AwAAmAMAAJkDAACaAwAAmwMAAJwDAACdAwAAngMAAJ8DAACgAwAAoQMAAKIDAACjAwAApAMAAKUD
AACmAwAApwMAAKgDAACpAwAAqgMAAKsDAACsAwAArQMAAK4DAACvAwAAsAMAALEDAACyAwAAswMA
ALQDAAC1AwAAtgMAALcDAAC4AwAAuQMAALoDAAC7AwAAvAMAAL0DAAC+AwAAvwMAAMADAADBAwAA
wgMAAMMDAADEAwAAxQMAAMYDAADHAwAAyAMAAMkDAADKAwAAywMAAMwDAADNAwAAzgMAAM8DAADQ
AwAA0QMAANIDAADTAwAA1AMAANUDAADWAwAA1wMAANgDAADZAwAA2gMAANsDAADcAwAA3QMAAN4D
AADfAwAA4AMAAOEDAADiAwAA4wMAAOQDAADlAwAA5gMAAOcDAADoAwAA6QMAAOoDAADrAwAA7AMA
AO0DAADuAwAA7wMAAPADAADxAwAA8gMAAPMDAAD0AwAA9QMAAPYDAAD3AwAA+AMAAPkDAAD6AwAA
+wMAAPwDAAD9AwAA/gMAAP8DAAAABAAAAQQAAAIEAAADBAAABAQAAAUEAAAGBAAABwQAAAgEAAAJ
BAAACgQAAAsEAAAMBAAADQQAAA4EAAAPBAAAEAQAABEEAAASBAAAEwQAABQEAAAVBAAAFgQAABcE
AAAYBAAAGQQAABoEAAAbBAAAHAQAAB0EAAAeBAAAHwQAACAEAAAhBAAAIgQAACMEAAAkBAAAJQQA
ACYEAAAnBAAAKAQAACkEAAAqBAAAKwQAACwEAAAtBAAALgQAAC8EAAAwBAAAMQQAADIEAAAzBAAA
NAQAADUEAAA2BAAANwQAADgEAAA5BAAAOgQAADsEAAA8BAAAPQQAAD4EAAA/BAAAQAQAAEEEAABC
BAAAQwQAAEQEAABFBAAARgQAAEcEAABIBAAASQQAAEoEAABLBAAATAQAAE0EAABOBAAATwQAAFAE
AABRBAAAUgQAAFMEAABUBAAAVQQAAFYEAABXBAAAWAQAAFkEAABaBAAAWwQAAFwEAABdBAAAXgQA
AF8EAABgBAAAYQQAAGIEAABjBAAAZAQAAGUEAABmBAAAZwQAAGgEAABpBAAAagQAAGsEAABsBAAA
bQQAAG4EAABvBAAAcAQAAHEEAAByBAAAcwQAAHQEAAB1BAAAdgQAAHcEAAB4BAAAeQQAAHoEAAB7
BAAAfAQAAH0EAAB+BAAAfwQAAIAEAACBBAAAggQAAIMEAACEBAAAhQQAAIYEAACHBAAAiAQAAIkE
AACKBAAAiwQAAIwEAACNBAAAjgQAAI8EAACQBAAAkQQAAJIEAACTBAAAlAQAAJUEAACWBAAAlwQA
AJgEAACZBAAAmgQAAJsEAACcBAAAnQQAAJ4EAACfBAAAoAQAAKEEAACiBAAAowQAAKQEAAClBAAA
pgQAAKcEAACoBAAAqQQAAKoEAACrBAAArAQAAK0EAACuBAAArwQAALAEAACxBAAAsgQAALMEAAC0
BAAAtQQAALYEAAC3BAAAuAQAALkEAAC6BAAAuwQAALwEAAC9BAAAvgQAAL8EAADABAAAwQQAAMIE
AADDBAAAxAQAAMUEAADGBAAAxwQAAMgEAADJBAAAygQAAMsEAADMBAAAzQQAAM4EAADPBAAA0AQA
ANEEAADSBAAA0wQAANQEAADVBAAA1gQAANcEAADYBAAA2QQAANoEAADbBAAA3AQAAN0EAADeBAAA
3wQAAOAEAADhBAAA4gQAAOMEAADkBAAA5QQAAOYEAADnBAAA6AQAAOkEAADqBAAA6wQAAOwEAADt
BAAA7gQAAO8EAADwBAAA8QQAAPIEAADzBAAA9AQAAPUEAAD2BAAA9wQAAPgEAAD5BAAA+gQAAPsE
AAD8BAAA/QQAAP4EAAD/BAAAAAUAAAEFAAACBQAAAwUAAAQFAAAFBQAABgUAAAcFAAAIBQAACQUA
AAoFAAALBQAADAUAAA0FAAAOBQAADwUAABAFAAARBQAAEgUAABMFAAAUBQAAFQUAABYFAAAXBQAA
GAUAABkFAAAaBQAAGwUAABwFAAAdBQAAHgUAAB8FAAAgBQAAIQUAACIFAAAjBQAAJAUAACUFAAAm
BQAAJwUAACgFAAApBQAAKgUAACsFAAAsBQAALQUAAC4FAAAvBQAAMAUAADEFAAAyBQAAMwUAADQF
AAA1BQAANgUAADcFAAA4BQAAOQUAADoFAAA7BQAAPAUAAD0FAAA+BQAAPwUAAEAFAABBBQAAQgUA
AEMFAABEBQAARQUAAEYFAABHBQAASAUAAEkFAABKBQAASwUAAEwFAABNBQAATgUAAE8FAABQBQAA
UQUAAFIFAABTBQAAVAUAAFUFAABWBQAAVwUAAFgFAABZBQAAWgUAAFsFAABcBQAAXQUAAF4FAABf
BQAAYAUAAGEFAABiBQAAYwUAAGQFAABlBQAAZgUAAGcFAABoBQAAaQUAAGoFAABrBQAAbAUAAG0F
AABuBQAAbwUAAHAFAABxBQAAcgUAAHMFAAB0BQAAdQUAAHYFAAB3BQAAeAUAAHkFAAB6BQAAewUA
AHwFAAB9BQAAfgUAAH8FAACABQAAgQUAAIIFAACDBQAAhAUAAIUFAACGBQAAhwUAAIgFAACJBQAA
igUAAIsFAACMBQAAjQUAAI4FAACPBQAAkAUAAJEFAACSBQAAkwUAAJQFAACVBQAAlgUAAJcFAACY
BQAAmQUAAJoFAACbBQAAnAUAAJ0FAACeBQAAnwUAAKAFAAChBQAAogUAAKMFAACkBQAApQUAAKYF
AACnBQAAqAUAAKkFAACqBQAAqwUAAKwFAACtBQAArgUAAK8FAACwBQAAsQUAALIFAACzBQAAtAUA
ALUFAAC2BQAAtwUAALgFAAC5BQAAugUAALsFAAC8BQAAvQUAAL4FAAC/BQAAwAUAAMEFAADCBQAA
wwUAAMQFAADFBQAAxgUAAMcFAADIBQAAyQUAAMoFAADLBQAAzAUAAM0FAADOBQAAzwUAANAFAADR
BQAA0gUAANMFAADUBQAA1QUAANYFAADXBQAA2AUAANkFAADaBQAA2wUAANwFAADdBQAA3gUAAN8F
AADgBQAA4QUAAOIFAADjBQAA5AUAAOUFAADmBQAA5wUAAOgFAADpBQAA6gUAAOsFAADsBQAA7QUA
AO4FAADvBQAA8AUAAPEFAADyBQAA8wUAAPQFAAD1BQAA9gUAAPcFAAD4BQAA+QUAAPoFAAD7BQAA
/AUAAP0FAAD+BQAA/wUAAAAGAAABBgAAAgYAAAMGAAAEBgAABQYAAAYGAAAHBgAACAYAAAkGAAAK
BgAACwYAAAwGAAANBgAADgYAAA8GAAAQBgAAEQYAABIGAAATBgAAFAYAABUGAAAWBgAAFwYAABgG
AAAZBgAAGgYAABsGAAAcBgAAHQYAAB4GAAAfBgAAIAYAACEGAAAiBgAAIwYAACQGAAAlBgAAJgYA
ACcGAAAoBgAAKQYAACoGAAArBgAALAYAAC0GAAAuBgAALwYAADAGAAAxBgAAMgYAADMGAAA0BgAA
NQYAADYGAAA3BgAAOAYAADkGAAA6BgAAOwYAADwGAAA9BgAAPgYAAD8GAABABgAAQQYAAEIGAABD
BgAARAYAAEUGAABGBgAARwYAAEgGAABJBgAASgYAAEsGAABMBgAATQYAAE4GAABPBgAAUAYAAFEG
AABSBgAAUwYAAFQGAABVBgAAVgYAAFcGAABYBgAAWQYAAFoGAABbBgAAXAYAAF0GAABeBgAAXwYA
AGAGAABhBgAAYgYAAGMGAABkBgAAZQYAAGYGAABnBgAAaAYAAGkGAABqBgAAawYAAGwGAABtBgAA
bgYAAG8GAABwBgAAcQYAAHIGAABzBgAAdAYAAHUGAAB2BgAAdwYAAHgGAAB5BgAAegYAAHsGAAB8
BgAAfQYAAH4GAAB/BgAAgAYAAIEGAACCBgAAgwYAAIQGAACFBgAAhgYAAIcGAACIBgAAiQYAAIoG
AACLBgAAjAYAAI0GAACOBgAAjwYAAJAGAACRBgAAkgYAAJMGAACUBgAAlQYAAJYGAACXBgAAmAYA
AJkGAACaBgAAmwYAAJwGAACdBgAAngYAAJ8GAACgBgAAoQYAAKIGAACjBgAApAYAAKUGAACmBgAA
pwYAAKgGAACpBgAAqgYAAKsGAACsBgAArQYAAK4GAACvBgAAsAYAALEGAACyBgAAswYAALQGAAC1
BgAAtgYAALcGAAC4BgAAuQYAALoGAAC7BgAAvAYAAL0GAAC+BgAAvwYAAMAGAADBBgAAwgYAAMMG
AADEBgAAxQYAAMYGAADHBgAAyAYAAMkGAADKBgAAywYAAMwGAADNBgAAzgYAAM8GAADQBgAA0QYA
ANIGAADTBgAA1AYAANUGAADWBgAA1wYAANgGAADZBgAA2gYAANsGAADcBgAA3QYAAN4GAADfBgAA
4AYAAOEGAADiBgAA4wYAAOQGAADlBgAA5gYAAOcGAADoBgAA6QYAAOoGAADrBgAA7AYAAO0GAADu
BgAA7wYAAPAGAADxBgAA8gYAAPMGAAD0BgAA9QYAAPYGAAD3BgAA+AYAAPkGAAD6BgAA+wYAAPwG
AAD9BgAA/gYAAP8GAAAABwAAAQcAAAIHAAADBwAABAcAAAUHAAAGBwAABwcAAAgHAAAJBwAACgcA
AAsHAAAMBwAADQcAAA4HAAAPBwAAEAcAABEHAAASBwAAEwcAABQHAAAVBwAAFgcAABcHAAAYBwAA
GQcAABoHAAAbBwAAHAcAAB0HAAAeBwAAHwcAACAHAAAhBwAAIgcAACMHAAAkBwAAJQcAACYHAAAn
BwAAKAcAACkHAAAqBwAAKwcAACwHAAAtBwAALgcAAC8HAAAwBwAAMQcAADIHAAAzBwAANAcAADUH
AAA2BwAANwcAADgHAAA5BwAAOgcAADsHAAA8BwAAPQcAAD4HAAA/BwAAQAcAAEEHAABCBwAAQwcA
AEQHAABFBwAARgcAAEcHAABIBwAASQcAAEoHAABLBwAATAcAAE0HAABOBwAATwcAAFAHAABRBwAA
UgcAAFMHAABUBwAAVQcAAFYHAABXBwAAWAcAAFkHAABaBwAAWwcAAFwHAABdBwAAXgcAAF8HAABg
BwAAYQcAAGIHAABjBwAAZAcAAGUHAABmBwAAZwcAAGgHAABpBwAAagcAAGsHAABsBwAAbQcAAG4H
AABvBwAAcAcAAHEHAAByBwAAcwcAAHQHAAB1BwAAdgcAAHcHAAB4BwAAeQcAAHoHAAB7BwAAfAcA
AH0HAAB+BwAAfwcAAIAHAACBBwAAggcAAIMHAACEBwAAhQcAAIYHAACHBwAAiAcAAIkHAACKBwAA
iwcAAIwHAACNBwAAjgcAAI8HAACQBwAAkQcAAJIHAACTBwAAlAcAAJUHAACWBwAAlwcAAJgHAACZ
BwAAmgcAAJsHAACcBwAAnQcAAJ4HAACfBwAAoAcAAKEHAACiBwAAowcAAKQHAAClBwAApgcAAKcH
AACoBwAAqQcAAKoHAACrBwAArAcAAK0HAACuBwAArwcAALAHAACxBwAAsgcAALMHAAC0BwAAtQcA
ALYHAAC3BwAAuAcAALkHAAC6BwAAuwcAALwHAAC9BwAAvgcAAL8HAADABwAAwQcAAMIHAADDBwAA
xAcAAMUHAADGBwAAxwcAAMgHAADJBwAAygcAAMsHAADMBwAAzQcAAM4HAADPBwAA0AcAANEHAADS
BwAA0wcAANQHAADVBwAA1gcAANcHAADYBwAA2QcAANoHAADbBwAA3AcAAN0HAADeBwAA3wcAAOAH
AADhBwAA4gcAAOMHAADkBwAA5QcAAOYHAADnBwAA6AcAAOkHAADqBwAA6wcAAOwHAADtBwAA7gcA
AO8HAADwBwAA8QcAAPIHAADzBwAA9AcAAPUHAAD2BwAA9wcAAPgHAAD5BwAA+gcAAPsHAAD8BwAA
/QcAAP4HAAD/BwAAAAgAAAEIAAACCAAAAwgAAAQIAAAFCAAABggAAAcIAAAICAAACQgAAAoIAAAL
CAAADAgAAA0IAAAOCAAADwgAABAIAAARCAAAEggAABMIAAAUCAAAFQgAABYIAAAXCAAAGAgAABkI
AAAaCAAAGwgAABwIAAAdCAAAHggAAB8IAAAgCAAAIQgAACIIAAAjCAAAJAgAACUIAAAmCAAAJwgA
ACgIAAApCAAAKggAACsIAAAsCAAALQgAAC4IAAAvCAAAMAgAADEIAAAyCAAAMwgAADQIAAA1CAAA
NggAADcIAAA4CAAAOQgAADoIAAA7CAAAPAgAAD0IAAA+CAAAPwgAAEAIAABBCAAAQggAAEMIAABE
CAAARQgAAEYIAABHCAAASAgAAEkIAABKCAAASwgAAEwIAABNCAAATggAAE8IAABQCAAAUQgAAFII
AABTCAAAVAgAAFUIAABWCAAAVwgAAFgIAABZCAAAWggAAFsIAABcCAAAXQgAAF4IAABfCAAAYAgA
AGEIAABiCAAAYwgAAGQIAABlCAAAZggAAGcIAABoCAAAaQgAAGoIAABrCAAAbAgAAG0IAABuCAAA
bwgAAHAIAABxCAAAcggAAHMIAAB0CAAAdQgAAHYIAAB3CAAAeAgAAHkIAAB6CAAAewgAAHwIAAB9
CAAAfggAAH8IAACACAAAgQgAAIIIAACDCAAAhAgAAIUIAACGCAAAhwgAAIgIAACJCAAAiggAAIsI
AACMCAAAjQgAAI4IAACPCAAAkAgAAJEIAACSCAAAkwgAAJQIAACVCAAAlggAAJcIAACYCAAAmQgA
AJoIAACbCAAAnAgAAJ0IAACeCAAAnwgAAKAIAAChCAAAoggAAKMIAACkCAAApQgAAKYIAACnCAAA
qAgAAKkIAACqCAAAqwgAAKwIAACtCAAArggAAK8IAACwCAAAsQgAALIIAACzCAAAtAgAALUIAAC2
CAAAtwgAALgIAAC5CAAAuggAALsIAAC8CAAAvQgAAL4IAAC/CAAAwAgAAMEIAADCCAAAwwgAAMQI
AADFCAAAxggAAMcIAADICAAAyQgAAMoIAADLCAAAzAgAAM0IAADOCAAAzwgAANAIAADRCAAA0ggA
ANMIAADUCAAA1QgAANYIAADXCAAA2AgAANkIAADaCAAA2wgAANwIAADdCAAA3ggAAN8IAADgCAAA
4QgAAOIIAADjCAAA5AgAAOUIAADmCAAA5wgAAOgIAADpCAAA6ggAAOsIAADsCAAA7QgAAO4IAADv
CAAA8AgAAPEIAADyCAAA8wgAAPQIAAD1CAAA9ggAAPcIAAD4CAAA+QgAAPoIAAD7CAAA/AgAAP0I
AAD+CAAA/wgAAAAJAAABCQAAAgkAAAMJAAAECQAABQkAAAYJAAAHCQAACAkAAAkJAAAKCQAACwkA
AAwJAAANCQAADgkAAA8JAAAQCQAAEQkAABIJAAATCQAAFAkAABUJAAAWCQAAFwkAABgJAAAZCQAA
GgkAABsJAAAcCQAAHQkAAB4JAAAfCQAAIAkAACEJAAAiCQAAIwkAACQJAAAlCQAAJgkAACcJAAAo
CQAAKQkAACoJAAArCQAALAkAAC0JAAAuCQAALwkAADAJAAAxCQAAMgkAADMJAAA0CQAANQkAADYJ
AAA3CQAAOAkAADkJAAA6CQAAOwkAADwJAAA9CQAAPgkAAD8JAABACQAAQQkAAEIJAABDCQAARAkA
AEUJAABGCQAARwkAAEgJAABJCQAASgkAAEsJAABMCQAATQkAAE4JAABPCQAAUAkAAFEJAABSCQAA
UwkAAFQJAABVCQAAVgkAAFcJAABYCQAAWQkAAFoJAABbCQAAXAkAAF0JAABeCQAAXwkAAGAJAABh
CQAAYgkAAGMJAABkCQAAZQkAAGYJAABnCQAAaAkAAGkJAABqCQAAawkAAGwJAABtCQAAbgkAAG8J
AABwCQAAcQkAAHIJAABzCQAAdAkAAHUJAAB2CQAAdwkAAHgJAAB5CQAAegkAAHsJAAB8CQAAfQkA
AH4JAAB/CQAAgAkAAIEJAACCCQAAgwkAAIQJAACFCQAAhgkAAIcJAACICQAAiQkAAIoJAACLCQAA
jAkAAI0JAACOCQAAjwkAAJAJAACRCQAAkgkAAJMJAACUCQAAlQkAAJYJAACXCQAAmAkAAJkJAACa
CQAAmwkAAJwJAACdCQAAngkAAJ8JAACgCQAAoQkAAKIJAACjCQAApAkAAKUJAACmCQAApwkAAKgJ
AACpCQAAqgkAAKsJAACsCQAArQkAAK4JAACvCQAAsAkAALEJAACyCQAAswkAALQJAAC1CQAAtgkA
ALcJAAC4CQAAuQkAALoJAAC7CQAAvAkAAL0JAAC+CQAAvwkAAMAJAADBCQAAwgkAAMMJAADECQAA
xQkAAMYJAADHCQAAyAkAAMkJAADKCQAAywkAAMwJAADNCQAAzgkAAM8JAADQCQAA0QkAANIJAADT
CQAA1AkAANUJAADWCQAA1wkAANgJAADZCQAA2gkAANsJAADcCQAA3QkAAN4JAADfCQAA4AkAAOEJ
AADiCQAA4wkAAOQJAADlCQAA5gkAAOcJAADoCQAA6QkAAOoJAADrCQAA7AkAAO0JAADuCQAA7wkA
APAJAADxCQAA8gkAAPMJAAD0CQAA9QkAAPYJAAD3CQAA+AkAAPkJAAD6CQAA+wkAAPwJAAD9CQAA
/gkAAP8JAAAACgAAAQoAAAIKAAADCgAABAoAAAUKAAAGCgAABwoAAAgKAAAJCgAACgoAAAsKAAAM
CgAADQoAAA4KAAAPCgAAEAoAABEKAAASCgAAEwoAABQKAAAVCgAAFgoAABcKAAAYCgAAGQoAABoK
AAAbCgAAHAoAAB0KAAAeCgAAHwoAACAKAAAhCgAAIgoAACMKAAAkCgAAJQoAACYKAAAnCgAAKAoA
ACkKAAAqCgAAKwoAACwKAAAtCgAALgoAAC8KAAAwCgAAMQoAADIKAAAzCgAANAoAADUKAAA2CgAA
NwoAADgKAAA5CgAAOgoAADsKAAA8CgAAPQoAAD4KAAA/CgAAQAoAAEEKAABCCgAAQwoAAEQKAABF
CgAARgoAAEcKAABICgAASQoAAEoKAABLCgAATAoAAE0KAABOCgAATwoAAFAKAABRCgAAUgoAAFMK
AABUCgAAVQoAAFYKAABXCgAAWAoAAFkKAABaCgAAWwoAAFwKAABdCgAAXgoAAF8KAABgCgAAYQoA
AGIKAABjCgAAZAoAAGUKAABmCgAAZwoAAGgKAABpCgAAagoAAGsKAABsCgAAbQoAAG4KAABvCgAA
cAoAAHEKAAByCgAAcwoAAHQKAAB1CgAAdgoAAHcKAAB4CgAAeQoAAHoKAAB7CgAAfAoAAH0KAAB+
CgAAfwoAAIAKAACBCgAAggoAAIMKAACECgAAhQoAAIYKAACHCgAAiAoAAIkKAACKCgAAiwoAAIwK
AACNCgAAjgoAAI8KAACQCgAAkQoAAJIKAACTCgAAlAoAAJUKAACWCgAAlwoAAJgKAACZCgAAmgoA
AJsKAACcCgAAnQoAAJ4KAACfCgAAoAoAAKEKAACiCgAAowoAAKQKAAClCgAApgoAAKcKAACoCgAA
qQoAAKoKAACrCgAArAoAAK0KAACuCgAArwoAALAKAACxCgAAsgoAALMKAAC0CgAAtQoAALYKAAC3
CgAAuAoAALkKAAC6CgAAuwoAALwKAAC9CgAAvgoAAL8KAADACgAAwQoAAMIKAADDCgAAxAoAAMUK
AADGCgAAxwoAAMgKAADJCgAAygoAAMsKAADMCgAAzQoAAM4KAADPCgAA0AoAANEKAADSCgAA0woA
ANQKAADVCgAA1goAANcKAADYCgAA2QoAANoKAADbCgAA3AoAAN0KAADeCgAA3woAAOAKAADhCgAA
4goAAOMKAADkCgAA5QoAAOYKAADnCgAA6AoAAOkKAADqCgAA6woAAOwKAADtCgAA7goAAO8KAADw
CgAA8QoAAPIKAADzCgAA9AoAAPUKAAD2CgAA9woAAPgKAAD5CgAA+goAAPsKAAD8CgAA/QoAAP4K
AAD/CgAAAAsAAAELAAACCwAAAwsAAAQLAAAFCwAABgsAAAcLAAAICwAACQsAAAoLAAALCwAADAsA
AA0LAAAOCwAADwsAABALAAARCwAAEgsAABMLAAAUCwAAFQsAABYLAAAXCwAAGAsAABkLAAAaCwAA
GwsAABwLAAAdCwAAHgsAAB8LAAAgCwAAIQsAACILAAAjCwAAJAsAACULAAAmCwAAJwsAACgLAAAp
CwAAKgsAACsLAAAsCwAALQsAAC4LAAAvCwAAMAsAADELAAAyCwAAMwsAADQLAAA1CwAANgsAADcL
AAA4CwAAOQsAADoLAAA7CwAAPAsAAD0LAAA+CwAAPwsAAEALAABBCwAAQgsAAEMLAABECwAARQsA
AEYLAABHCwAASAsAAEkLAABKCwAASwsAAEwLAABNCwAATgsAAE8LAABQCwAAUQsAAFILAABTCwAA
VAsAAFULAABWCwAAVwsAAFgLAABZCwAAWgsAAFsLAABcCwAAXQsAAF4LAABfCwAAYAsAAGELAABi
CwAAYwsAAGQLAABlCwAAZgsAAGcLAABoCwAAaQsAAGoLAABrCwAAbAsAAG0LAABuCwAAbwsAAHAL
AABxCwAAcgsAAHMLAAB0CwAAdQsAAHYLAAB3CwAAeAsAAHkLAAB6CwAAewsAAHwLAAB9CwAAfgsA
AH8LAACACwAAgQsAAIILAACDCwAAhAsAAIULAACGCwAAhwsAAIgLAACJCwAAigsAAIsLAACMCwAA
jQsAAI4LAACPCwAAkAsAAJELAACSCwAAkwsAAJQLAACVCwAAlgsAAJcLAACYCwAAmQsAAJoLAACb
CwAAnAsAAJ0LAACeCwAAnwsAAKALAAChCwAAogsAAKMLAACkCwAApQsAAKYLAACnCwAAqAsAAKkL
AACqCwAAqwsAAKwLAACtCwAArgsAAK8LAACwCwAAsQsAALILAACzCwAAtAsAALULAAC2CwAAtwsA
ALgLAAC5CwAAugsAALsLAAC8CwAAvQsAAL4LAAC/CwAAwAsAAMELAADCCwAAwwsAAMQLAADFCwAA
xgsAAMcLAADICwAAyQsAAMoLAADLCwAAzAsAAM0LAADOCwAAzwsAANALAADRCwAA0gsAANMLAADU
CwAA1QsAANYLAADXCwAA2AsAANkLAADaCwAA2wsAANwLAADdCwAA3gsAAN8LAADgCwAA4QsAAOIL
AADjCwAA5AsAAOULAADmCwAA5wsAAOgLAADpCwAA6gsAAOsLAADsCwAA7QsAAO4LAADvCwAA8AsA
APELAADyCwAA8wsAAPQLAAD1CwAA9gsAAPcLAAD4CwAA+QsAAPoLAAD7CwAA/AsAAP0LAAD+CwAA
/wsAAAAMAAABDAAAAgwAAAMMAAAEDAAABQwAAAYMAAAHDAAACAwAAAkMAAAKDAAACwwAAAwMAAAN
DAAADgwAAA8MAAAQDAAAEQwAABIMAAATDAAAFAwAABUMAAAWDAAAFwwAABgMAAAZDAAAGgwAABsM
AAAcDAAAHQwAAB4MAAAfDAAAIAwAACEMAAAiDAAAIwwAACQMAAAlDAAAJgwAACcMAAAoDAAAKQwA
ACoMAAArDAAALAwAAC0MAAAuDAAALwwAADAMAAAxDAAAMgwAADMMAAA0DAAANQwAADYMAAA3DAAA
OAwAADkMAAA6DAAAOwwAADwMAAA9DAAAPgwAAD8MAABADAAAQQwAAEIMAABDDAAARAwAAEUMAABG
DAAARwwAAEgMAABJDAAASgwAAEsMAABMDAAATQwAAE4MAABPDAAAUAwAAFEMAABSDAAAUwwAAFQM
AABVDAAAVgwAAFcMAABYDAAAWQwAAFoMAABbDAAAXAwAAF0MAABeDAAAXwwAAGAMAABhDAAAYgwA
AGMMAABkDAAAZQwAAGYMAABnDAAAaAwAAGkMAABqDAAAawwAAGwMAABtDAAAbgwAAG8MAABwDAAA
cQwAAHIMAABzDAAAdAwAAHUMAAB2DAAAdwwAAHgMAAB5DAAAegwAAHsMAAB8DAAAfQwAAH4MAAB/
DAAAgAwAAIEMAACCDAAAgwwAAIQMAACFDAAAhgwAAIcMAACIDAAAiQwAAIoMAACLDAAAjAwAAI0M
AACODAAAjwwAAJAMAACRDAAAkgwAAJMMAACUDAAAlQwAAJYMAACXDAAAmAwAAJkMAACaDAAAmwwA
AJwMAACdDAAAngwAAJ8MAACgDAAAoQwAAKIMAACjDAAApAwAAKUMAACmDAAApwwAAKgMAACpDAAA
qgwAAKsMAACsDAAArQwAAK4MAACvDAAAsAwAALEMAACyDAAAswwAALQMAAC1DAAAtgwAALcMAAC4
DAAAuQwAALoMAAC7DAAAvAwAAL0MAAC+DAAAvwwAAMAMAADBDAAAwgwAAMMMAADEDAAAxQwAAMYM
AADHDAAAyAwAAMkMAADKDAAAywwAAMwMAADNDAAAzgwAAM8MAADQDAAA0QwAANIMAADTDAAA1AwA
ANUMAADWDAAA1wwAANgMAADZDAAA2gwAANsMAADcDAAA3QwAAN4MAADfDAAA4AwAAOEMAADiDAAA
4wwAAOQMAADlDAAA5gwAAOcMAADoDAAA6QwAAOoMAADrDAAA7AwAAO0MAADuDAAA7wwAAPAMAADx
DAAA8gwAAPMMAAD0DAAA9QwAAPYMAAD3DAAA+AwAAPkMAAD6DAAA+wwAAPwMAAD9DAAA/gwAAP8M
AAAADQAAAQ0AAAINAAADDQAABA0AAAUNAAAGDQAABw0AAAgNAAAJDQAACg0AAAsNAAAMDQAADQ0A
AA4NAAAPDQAAEA0AABENAAASDQAAEw0AABQNAAAVDQAAFg0AABcNAAAYDQAAGQ0AABoNAAAbDQAA
HA0AAB0NAAAeDQAAHw0AACANAAAhDQAAIg0AACMNAAAkDQAAJQ0AACYNAAAnDQAAKA0AACkNAAAq
DQAAKw0AACwNAAAtDQAALg0AAC8NAAAwDQAAMQ0AADINAAAzDQAANA0AADUNAAA2DQAANw0AADgN
AAA5DQAAOg0AADsNAAA8DQAAPQ0AAD4NAAA/DQAAQA0AAEENAABCDQAAQw0AAEQNAABFDQAARg0A
AEcNAABIDQAASQ0AAEoNAABLDQAATA0AAE0NAABODQAATw0AAFANAABRDQAAUg0AAFMNAABUDQAA
VQ0AAFYNAABXDQAAWA0AAFkNAABaDQAAWw0AAFwNAABdDQAAXg0AAF8NAABgDQAAYQ0AAGINAABj
DQAAZA0AAGUNAABmDQAAZw0AAGgNAABpDQAAag0AAGsNAABsDQAAbQ0AAG4NAABvDQAAcA0AAHEN
AAByDQAAcw0AAHQNAAB1DQAAdg0AAHcNAAB4DQAAeQ0AAHoNAAB7DQAAfA0AAH0NAAB+DQAAfw0A
AIANAACBDQAAgg0AAIMNAACEDQAAhQ0AAIYNAACHDQAAiA0AAIkNAACKDQAAiw0AAIwNAACNDQAA
jg0AAI8NAACQDQAAkQ0AAJINAACTDQAAlA0AAJUNAACWDQAAlw0AAJgNAACZDQAAmg0AAJsNAACc
DQAAnQ0AAJ4NAACfDQAAoA0AAKENAACiDQAAow0AAKQNAAClDQAApg0AAKcNAACoDQAAqQ0AAKoN
AACrDQAArA0AAK0NAACuDQAArw0AALANAACxDQAAsg0AALMNAAC0DQAAtQ0AALYNAAC3DQAAuA0A
ALkNAAC6DQAAuw0AALwNAAC9DQAAvg0AAL8NAADADQAAwQ0AAMINAADDDQAAxA0AAMUNAADGDQAA
xw0AAMgNAADJDQAAyg0AAMsNAADMDQAAzQ0AAM4NAADPDQAA0A0AANENAADSDQAA0w0AANQNAADV
DQAA1g0AANcNAADYDQAA2Q0AANoNAADbDQAA3A0AAN0NAADeDQAA3w0AAOANAADhDQAA4g0AAOMN
AADkDQAA5Q0AAOYNAADnDQAA6A0AAOkNAADqDQAA6w0AAOwNAADtDQAA7g0AAO8NAADwDQAA8Q0A
APINAADzDQAA9A0AAPUNAAD2DQAA9w0AAPgNAAD5DQAA+g0AAPsNAAD8DQAA/Q0AAP4NAAD/DQAA
AA4AAAEOAAACDgAAAw4AAAQOAAAFDgAABg4AAAcOAAAIDgAACQ4AAAoOAAALDgAADA4AAA0OAAAO
DgAADw4AABAOAAARDgAAEg4AABMOAAAUDgAAFQ4AABYOAAAXDgAAGA4AABkOAAAaDgAAGw4AABwO
AAAdDgAAHg4AAB8OAAAgDgAAIQ4AACIOAAAjDgAAJA4AACUOAAAmDgAAJw4AACgOAAApDgAAKg4A
ACsOAAAsDgAALQ4AAC4OAAAvDgAAMA4AADEOAAAyDgAAMw4AADQOAAA1DgAANg4AADcOAAA4DgAA
OQ4AADoOAAA7DgAAPA4AAD0OAAA+DgAAPw4AAEAOAABBDgAAQg4AAEMOAABEDgAARQ4AAEYOAABH
DgAASA4AAEkOAABKDgAASw4AAEwOAABNDgAATg4AAE8OAABQDgAAUQ4AAFIOAABTDgAAVA4AAFUO
AABWDgAAVw4AAFgOAABZDgAAWg4AAFsOAABcDgAAXQ4AAF4OAABfDgAAYA4AAGEOAABiDgAAYw4A
AGQOAABlDgAAZg4AAGcOAABoDgAAaQ4AAGoOAABrDgAAbA4AAG0OAABuDgAAbw4AAHAOAABxDgAA
cg4AAHMOAAB0DgAAdQ4AAHYOAAB3DgAAeA4AAHkOAAB6DgAAew4AAHwOAAB9DgAAfg4AAH8OAACA
DgAAgQ4AAIIOAACDDgAAhA4AAIUOAACGDgAAhw4AAIgOAACJDgAAig4AAIsOAACMDgAAjQ4AAI4O
AACPDgAAkA4AAJEOAACSDgAAkw4AAJQOAACVDgAAlg4AAJcOAACYDgAAmQ4AAJoOAACbDgAAnA4A
AJ0OAACeDgAAnw4AAKAOAAChDgAAog4AAKMOAACkDgAApQ4AAKYOAACnDgAAqA4AAKkOAACqDgAA
qw4AAKwOAACtDgAArg4AAK8OAACwDgAAsQ4AALIOAACzDgAAtA4AALUOAAC2DgAAtw4AALgOAAC5
DgAAug4AALsOAAC8DgAAvQ4AAL4OAAC/DgAAwA4AAMEOAADCDgAAww4AAMQOAADFDgAAxg4AAMcO
AADIDgAAyQ4AAMoOAADLDgAAzA4AAM0OAADODgAAzw4AANAOAADRDgAA0g4AANMOAADUDgAA1Q4A
ANYOAADXDgAA2A4AANkOAADaDgAA2w4AANwOAADdDgAA3g4AAN8OAADgDgAA4Q4AAOIOAADjDgAA
5A4AAOUOAADmDgAA5w4AAOgOAADpDgAA6g4AAOsOAADsDgAA7Q4AAO4OAADvDgAA8A4AAPEOAADy
DgAA8w4AAPQOAAD1DgAA9g4AAPcOAAD4DgAA+Q4AAPoOAAD7DgAA/A4AAP0OAAD+DgAA/w4AAAAP
AAABDwAAAg8AAAMPAAAEDwAABQ8AAAYPAAAHDwAACA8AAAkPAAAKDwAACw8AAAwPAAANDwAADg8A
AA8PAAAQDwAAEQ8AABIPAAATDwAAFA8AABUPAAAWDwAAFw8AABgPAAAZDwAAGg8AABsPAAAcDwAA
HQ8AAB4PAAAfDwAAIA8AACEPAAAiDwAAIw8AACQPAAAlDwAAJg8AACcPAAAoDwAAKQ8AACoPAAAr
DwAALA8AAC0PAAAuDwAALw8AADAPAAAxDwAAMg8AADMPAAA0DwAANQ8AADYPAAA3DwAAOA8AADkP
AAA6DwAAOw8AADwPAAA9DwAAPg8AAD8PAABADwAAQQ8AAEIPAABDDwAARA8AAEUPAABGDwAARw8A
AEgPAABJDwAASg8AAEsPAABMDwAATQ8AAE4PAABPDwAAUA8AAFEPAABSDwAAUw8AAFQPAABVDwAA
Vg8AAFcPAABYDwAAWQ8AAFoPAABbDwAAXA8AAF0PAABeDwAAXw8AAGAPAABhDwAAYg8AAGMPAABk
DwAAZQ8AAGYPAABnDwAAaA8AAGkPAABqDwAAaw8AAGwPAABtDwAAbg8AAG8PAABwDwAAcQ8AAHIP
AABzDwAAdA8AAHUPAAB2DwAAdw8AAHgPAAB5DwAAeg8AAHsPAAB8DwAAfQ8AAH4PAAB/DwAAgA8A
AIEPAACCDwAAgw8AAIQPAACFDwAAhg8AAIcPAACIDwAAiQ8AAIoPAACLDwAAjA8AAI0PAACODwAA
jw8AAJAPAACRDwAAkg8AAJMPAACUDwAAlQ8AAJYPAACXDwAAmA8AAJkPAACaDwAAmw8AAJwPAACd
DwAAng8AAJ8PAACgDwAAoQ8AAKIPAACjDwAApA8AAKUPAACmDwAApw8AAKgPAACpDwAAqg8AAKsP
AACsDwAArQ8AAK4PAACvDwAAsA8AALEPAACyDwAAsw8AALQPAAC1DwAAtg8AALcPAAC4DwAAuQ8A
ALoPAAC7DwAAvA8AAL0PAAC+DwAAvw8AAMAPAADBDwAAwg8AAMMPAADEDwAAxQ8AAMYPAADHDwAA
yA8AAMkPAADKDwAAyw8AAMwPAADNDwAAzg8AAM8PAADQDwAA0Q8AANIPAADTDwAA1A8AANUPAADW
DwAA1w8AANgPAADZDwAA2g8AANsPAADcDwAA3Q8AAN4PAADfDwAA4A8AAOEPAADiDwAA4w8AAOQP
AADlDwAA5g8AAOcPAADoDwAA6Q8AAOoPAADrDwAA7A8AAO0PAADuDwAA7w8AAPAPAADxDwAA8g8A
APMPAAD0DwAA9Q8AAPYPAAD3DwAA+A8AAPkPAAD6DwAA+w8AAPwPAAD9DwAA/g8AAP8PAAAAEAAA
ARAAAAIQAAADEAAABBAAAAUQAAAGEAAABxAAAAgQAAAJEAAAChAAAAsQAAAMEAAADRAAAA4QAAAP
EAAAEBAAABEQAAASEAAAExAAABQQAAAVEAAAFhAAABcQAAAYEAAAGRAAABoQAAAbEAAAHBAAAB0Q
AAAeEAAAHxAAACAQAAAhEAAAIhAAACMQAAAkEAAAJRAAACYQAAAnEAAAKBAAACkQAAAqEAAAKxAA
ACwQAAAtEAAALhAAAC8QAAAwEAAAMRAAADIQAAAzEAAANBAAADUQAAA2EAAANxAAADgQAAA5EAAA
OhAAADsQAAA8EAAAPRAAAD4QAAA/EAAAQBAAAEEQAABCEAAAQxAAAEQQAABFEAAARhAAAEcQAABI
EAAASRAAAEoQAABLEAAATBAAAE0QAABOEAAATxAAAFAQAABREAAAUhAAAFMQAABUEAAAVRAAAFYQ
AABXEAAAWBAAAFkQAABaEAAAWxAAAFwQAABdEAAAXhAAAF8QAABgEAAAYRAAAGIQAABjEAAAZBAA
AGUQAABmEAAAZxAAAGgQAABpEAAAahAAAGsQAABsEAAAbRAAAG4QAABvEAAAcBAAAHEQAAByEAAA
cxAAAHQQAAB1EAAAdhAAAHcQAAB4EAAAeRAAAHoQAAB7EAAAfBAAAH0QAAB+EAAAfxAAAIAQAACB
EAAAghAAAIMQAACEEAAAhRAAAIYQAACHEAAAiBAAAIkQAACKEAAAixAAAIwQAACNEAAAjhAAAI8Q
AACQEAAAkRAAAJIQAACTEAAAlBAAAJUQAACWEAAAlxAAAJgQAACZEAAAmhAAAJsQAACcEAAAnRAA
AJ4QAACfEAAAoBAAAKEQAACiEAAAoxAAAKQQAAClEAAAphAAAKcQAACoEAAAqRAAAKoQAACrEAAA
rBAAAK0QAACuEAAArxAAALAQAACxEAAAshAAALMQAAC0EAAAtRAAALYQAAC3EAAAuBAAALkQAAC6
EAAAuxAAALwQAAC9EAAAvhAAAL8QAADAEAAAwRAAAMIQAADDEAAAxBAAAMUQAADGEAAAxxAAAMgQ
AADJEAAAyhAAAMsQAADMEAAAzRAAAM4QAADPEAAA0BAAANEQAADSEAAA0xAAANQQAADVEAAA1hAA
ANcQAADYEAAA2RAAANoQAADbEAAA3BAAAN0QAADeEAAA3xAAAOAQAADhEAAA4hAAAOMQAADkEAAA
5RAAAOYQAADnEAAA6BAAAOkQAADqEAAA6xAAAOwQAADtEAAA7hAAAO8QAADwEAAA8RAAAPIQAADz
EAAA9BAAAPUQAAD2EAAA9xAAAPgQAAD5EAAA+hAAAPsQAAD8EAAA/RAAAP4QAAD/EAAAABEAAAER
AAACEQAAAxEAAAQRAAAFEQAABhEAAAcRAAAIEQAACREAAAoRAAALEQAADBEAAA0RAAAOEQAADxEA
ABARAAAREQAAEhEAABMRAAAUEQAAFREAABYRAAAXEQAAGBEAABkRAAAaEQAAGxEAABwRAAAdEQAA
HhEAAB8RAAAgEQAAIREAACIRAAAjEQAAJBEAACURAAAmEQAAJxEAACgRAAApEQAAKhEAACsRAAAs
EQAALREAAC4RAAAvEQAAMBEAADERAAAyEQAAMxEAADQRAAA1EQAANhEAADcRAAA4EQAAOREAADoR
AAA7EQAAPBEAAD0RAAA+EQAAPxEAAEARAABBEQAAQhEAAEMRAABEEQAARREAAEYRAABHEQAASBEA
AEkRAABKEQAASxEAAEwRAABNEQAAThEAAE8RAABQEQAAUREAAFIRAABTEQAAVBEAAFURAABWEQAA
VxEAAFgRAABZEQAAWhEAAFsRAABcEQAAXREAAF4RAABfEQAAYBEAAGERAABiEQAAYxEAAGQRAABl
EQAAZhEAAGcRAABoEQAAaREAAGoRAABrEQAAbBEAAG0RAABuEQAAbxEAAHARAABxEQAAchEAAHMR
AAB0EQAAdREAAHYRAAB3EQAAeBEAAHkRAAB6EQAAexEAAHwRAAB9EQAAfhEAAH8RAACAEQAAgREA
AIIRAACDEQAAhBEAAIURAACGEQAAhxEAAIgRAACJEQAAihEAAIsRAACMEQAAjREAAI4RAACPEQAA
kBEAAJERAACSEQAAkxEAAJQRAACVEQAAlhEAAJcRAACYEQAAmREAAJoRAACbEQAAnBEAAJ0RAACe
EQAAnxEAAKARAAChEQAAohEAAKMRAACkEQAApREAAKYRAACnEQAAqBEAAKkRAACqEQAAqxEAAKwR
AACtEQAArhEAAK8RAACwEQAAsREAALIRAACzEQAAtBEAALURAAC2EQAAtxEAALgRAAC5EQAAuhEA
ALsRAAC8EQAAvREAAL4RAAC/EQAAwBEAAMERAADCEQAAwxEAAMQRAADFEQAAxhEAAMcRAADIEQAA
yREAAMoRAADLEQAAzBEAAM0RAADOEQAAzxEAANARAADREQAA0hEAANMRAADUEQAA1REAANYRAADX
EQAA2BEAANkRAADaEQAA2xEAANwRAADdEQAA3hEAAN8RAADgEQAA4REAAOIRAADjEQAA5BEAAOUR
AADmEQAA5xEAAOgRAADpEQAA6hEAAOsRAADsEQAA7REAAO4RAADvEQAA8BEAAPERAADyEQAA8xEA
APQRAAD1EQAA9hEAAPcRAAD4EQAA+REAAPoRAAD7EQAA/BEAAP0RAAD+EQAA/xEAAAASAAABEgAA
AhIAAAMSAAAEEgAABRIAAAYSAAAHEgAACBIAAAkSAAAKEgAACxIAAAwSAAANEgAADhIAAA8SAAAQ
EgAAERIAABISAAATEgAAFBIAABUSAAAWEgAAFxIAABgSAAAZEgAAGhIAABsSAAAcEgAAHRIAAB4S
AAAfEgAAIBIAACESAAAiEgAAIxIAACQSAAAlEgAAJhIAACcSAAAoEgAAKRIAACoSAAArEgAALBIA
AC0SAAAuEgAALxIAADASAAAxEgAAMhIAADMSAAA0EgAANRIAADYSAAA3EgAAOBIAADkSAAA6EgAA
OxIAADwSAAA9EgAAPhIAAD8SAABAEgAAQRIAAEISAABDEgAARBIAAEUSAABGEgAARxIAAEgSAABJ
EgAAShIAAEsSAABMEgAATRIAAE4SAABPEgAAUBIAAFESAABSEgAAUxIAAFQSAABVEgAAVhIAAFcS
AABYEgAAWRIAAFoSAABbEgAAXBIAAF0SAABeEgAAXxIAAGASAABhEgAAYhIAAGMSAABkEgAAZRIA
AGYSAABnEgAAaBIAAGkSAABqEgAAaxIAAGwSAABtEgAAbhIAAG8SAABwEgAAcRIAAHISAABzEgAA
dBIAAHUSAAB2EgAAdxIAAHgSAAB5EgAAehIAAHsSAAB8EgAAfRIAAH4SAAB/EgAAgBIAAIESAACC
EgAAgxIAAIQSAACFEgAAhhIAAIcSAACIEgAAiRIAAIoSAACLEgAAjBIAAI0SAACOEgAAjxIAAJAS
AACREgAAkhIAAJMSAACUEgAAlRIAAJYSAACXEgAAmBIAAJkSAACaEgAAmxIAAJwSAACdEgAAnhIA
AJ8SAACgEgAAoRIAAKISAACjEgAApBIAAKUSAACmEgAApxIAAKgSAACpEgAAqhIAAKsSAACsEgAA
rRIAAK4SAACvEgAAsBIAALESAACyEgAAsxIAALQSAAC1EgAAthIAALcSAAC4EgAAuRIAALoSAAC7
EgAAvBIAAL0SAAC+EgAAvxIAAMASAADBEgAAwhIAAMMSAADEEgAAxRIAAMYSAADHEgAAyBIAAMkS
AADKEgAAyxIAAMwSAADNEgAAzhIAAM8SAADQEgAA0RIAANISAADTEgAA1BIAANUSAADWEgAA1xIA
ANgSAADZEgAA2hIAANsSAADcEgAA3RIAAN4SAADfEgAA4BIAAOESAADiEgAA4xIAAOQSAADlEgAA
5hIAAOcSAADoEgAA6RIAAOoSAADrEgAA7BIAAO0SAADuEgAA7xIAAPASAADxEgAA8hIAAPMSAAD0
EgAA9RIAAPYSAAD3EgAA+BIAAPkSAAD6EgAA+xIAAPwSAAD9EgAA/hIAAP8SAAAAEwAAARMAAAIT
AAADEwAABBMAAAUTAAAGEwAABxMAAAgTAAAJEwAAChMAAAsTAAAMEwAADRMAAA4TAAAPEwAAEBMA
ABETAAASEwAAExMAABQTAAAVEwAAFhMAABcTAAAYEwAAGRMAABoTAAAbEwAAHBMAAB0TAAAeEwAA
HxMAACATAAAhEwAAIhMAACMTAAAkEwAAJRMAACYTAAAnEwAAKBMAACkTAAAqEwAAKxMAACwTAAAt
EwAALhMAAC8TAAAwEwAAMRMAADITAAAzEwAANBMAADUTAAA2EwAANxMAADgTAAA5EwAAOhMAADsT
AAA8EwAAPRMAAD4TAAA/EwAAQBMAAEETAABCEwAAQxMAAEQTAABFEwAARhMAAEcTAABIEwAASRMA
AEoTAABLEwAATBMAAE0TAABOEwAATxMAAFATAABREwAAUhMAAFMTAABUEwAAVRMAAFYTAABXEwAA
WBMAAFkTAABaEwAAWxMAAFwTAABdEwAAXhMAAF8TAABgEwAAYRMAAGITAABjEwAAZBMAAGUTAABm
EwAAZxMAAGgTAABpEwAAahMAAGsTAABsEwAAbRMAAG4TAABvEwAAcBMAAHETAAByEwAAcxMAAHQT
AAB1EwAAdhMAAHcTAAB4EwAAeRMAAHoTAAB7EwAAfBMAAH0TAAB+EwAAfxMAAIATAACBEwAAghMA
AIMTAACEEwAAhRMAAIYTAACHEwAAiBMAAIkTAACKEwAAixMAAIwTAACNEwAAjhMAAI8TAACQEwAA
kRMAAJITAACTEwAAlBMAAJUTAACWEwAAlxMAAJgTAACZEwAAmhMAAJsTAACcEwAAnRMAAJ4TAACf
EwAAoBMAAKETAACiEwAAoxMAAKQTAAClEwAAphMAAKcTAACoEwAAqRMAAKoTAACrEwAArBMAAK0T
AACuEwAArxMAALATAACxEwAAshMAALMTAAC0EwAAtRMAALYTAAC3EwAAuBMAALkTAAC6EwAAuxMA
ALwTAAC9EwAAvhMAAL8TAADAEwAAwRMAAMITAADDEwAAxBMAAMUTAADGEwAAxxMAAMgTAADJEwAA
yhMAAMsTAADMEwAAzRMAAM4TAADPEwAA0BMAANETAADSEwAA0xMAANQTAADVEwAA1hMAANcTAADY
EwAA2RMAANoTAADbEwAA3BMAAN0TAADeEwAA3xMAAOATAADhEwAA4hMAAOMTAADkEwAA5RMAAOYT
AADnEwAA6BMAAOkTAADqEwAA6xMAAOwTAADtEwAA7hMAAO8TAADwEwAA8RMAAPITAADzEwAA9BMA
APUTAAD2EwAA9xMAAPgTAAD5EwAA+hMAAPsTAAD8EwAA/RMAAP4TAAD/EwAAABQAAAEUAAACFAAA
AxQAAAQUAAAFFAAABhQAAAcUAAAIFAAACRQAAAoUAAALFAAADBQAAA0UAAAOFAAADxQAABAUAAAR
FAAAEhQAABMUAAAUFAAAFRQAABYUAAAXFAAAGBQAABkUAAAaFAAAGxQAABwUAAAdFAAAHhQAAB8U
AAAgFAAAIRQAACIUAAAjFAAAJBQAACUUAAAmFAAAJxQAACgUAAApFAAAKhQAACsUAAAsFAAALRQA
AC4UAAAvFAAAMBQAADEUAAAyFAAAMxQAADQUAAA1FAAANhQAADcUAAA4FAAAORQAADoUAAA7FAAA
PBQAAD0UAAA+FAAAPxQAAEAUAABBFAAAQhQAAEMUAABEFAAARRQAAEYUAABHFAAASBQAAEkUAABK
FAAASxQAAEwUAABNFAAAThQAAE8UAABQFAAAURQAAFIUAABTFAAAVBQAAFUUAABWFAAAVxQAAFgU
AABZFAAAWhQAAFsUAABcFAAAXRQAAF4UAABfFAAAYBQAAGEUAABiFAAAYxQAAGQUAABlFAAAZhQA
AGcUAABoFAAAaRQAAGoUAABrFAAAbBQAAG0UAABuFAAAbxQAAHAUAABxFAAAchQAAHMUAAB0FAAA
dRQAAHYUAAB3FAAAeBQAAHkUAAB6FAAAexQAAHwUAAB9FAAAfhQAAH8UAACAFAAAgRQAAIIUAACD
FAAAhBQAAIUUAACGFAAAhxQAAIgUAACJFAAAihQAAIsUAACMFAAAjRQAAI4UAACPFAAAkBQAAJEU
AACSFAAAkxQAAJQUAACVFAAAlhQAAJcUAACYFAAAmRQAAJoUAACbFAAAnBQAAJ0UAACeFAAAnxQA
AKAUAAChFAAAohQAAKMUAACkFAAApRQAAKYUAACnFAAAqBQAAKkUAACqFAAAqxQAAKwUAACtFAAA
rhQAAK8UAACwFAAAsRQAALIUAACzFAAAtBQAALUUAAC2FAAAtxQAALgUAAC5FAAAuhQAALsUAAC8
FAAAvRQAAL4UAAC/FAAAwBQAAMEUAADCFAAAwxQAAMQUAADFFAAAxhQAAMcUAADIFAAAyRQAAMoU
AADLFAAAzBQAAM0UAADOFAAAzxQAANAUAADRFAAA0hQAANMUAADUFAAA1RQAANYUAADXFAAA2BQA
ANkUAADaFAAA2xQAANwUAADdFAAA3hQAAN8UAADgFAAA4RQAAOIUAADjFAAA5BQAAOUUAADmFAAA
5xQAAOgUAADpFAAA6hQAAOsUAADsFAAA7RQAAO4UAADvFAAA8BQAAPEUAADyFAAA8xQAAPQUAAD1
FAAA9hQAAPcUAAD4FAAA+RQAAPoUAAD7FAAA/BQAAP0UAAD+FAAA/xQAAAAVAAABFQAAAhUAAAMV
AAAEFQAABRUAAAYVAAAHFQAACBUAAAkVAAAKFQAACxUAAAwVAAANFQAADhUAAA8VAAAQFQAAERUA
ABIVAAATFQAAFBUAABUVAAAWFQAAFxUAABgVAAAZFQAAGhUAABsVAAAcFQAAHRUAAB4VAAAfFQAA
IBUAACEVAAAiFQAAIxUAACQVAAAlFQAAJhUAACcVAAAoFQAAKRUAACoVAAArFQAALBUAAC0VAAAu
FQAALxUAADAVAAAxFQAAMhUAADMVAAA0FQAANRUAADYVAAA3FQAAOBUAADkVAAA6FQAAOxUAADwV
AAA9FQAAPhUAAD8VAABAFQAAQRUAAEIVAABDFQAARBUAAEUVAABGFQAARxUAAEgVAABJFQAAShUA
AEsVAABMFQAATRUAAE4VAABPFQAAUBUAAFEVAABSFQAAUxUAAFQVAABVFQAAVhUAAFcVAABYFQAA
WRUAAFoVAABbFQAAXBUAAF0VAABeFQAAXxUAAGAVAABhFQAAYhUAAGMVAABkFQAAZRUAAGYVAABn
FQAAaBUAAGkVAABqFQAAaxUAAGwVAABtFQAAbhUAAG8VAABwFQAAcRUAAHIVAABzFQAAdBUAAHUV
AAB2FQAAdxUAAHgVAAB5FQAAehUAAHsVAAB8FQAAfRUAAH4VAAB/FQAAgBUAAIEVAACCFQAAgxUA
AIQVAACFFQAAhhUAAIcVAACIFQAAiRUAAIoVAACLFQAAjBUAAI0VAACOFQAAjxUAAJAVAACRFQAA
khUAAJMVAACUFQAAlRUAAJYVAACXFQAAmBUAAJkVAACaFQAAmxUAAJwVAACdFQAAnhUAAJ8VAACg
FQAAoRUAAKIVAACjFQAApBUAAKUVAACmFQAApxUAAKgVAACpFQAAqhUAAKsVAACsFQAArRUAAK4V
AACvFQAAsBUAALEVAACyFQAAsxUAALQVAAC1FQAAthUAALcVAAC4FQAAuRUAALoVAAC7FQAAvBUA
AL0VAAC+FQAAvxUAAMAVAADBFQAAwhUAAMMVAADEFQAAxRUAAMYVAADHFQAAyBUAAMkVAADKFQAA
yxUAAMwVAADNFQAAzhUAAM8VAADQFQAA0RUAANIVAADTFQAA1BUAANUVAADWFQAA1xUAANgVAADZ
FQAA2hUAANsVAADcFQAA3RUAAN4VAADfFQAA4BUAAOEVAADiFQAA4xUAAOQVAADlFQAA5hUAAOcV
AADoFQAA6RUAAOoVAADrFQAA7BUAAO0VAADuFQAA7xUAAPAVAADxFQAA8hUAAPMVAAD0FQAA9RUA
APYVAAD3FQAA+BUAAPkVAAD6FQAA+xUAAPwVAAD9FQAA/hUAAP8VAAAAFgAAARYAAAIWAAADFgAA
BBYAAAUWAAAGFgAABxYAAAgWAAAJFgAAChYAAAsWAAAMFgAADRYAAA4WAAAPFgAAEBYAABEWAAAS
FgAAExYAABQWAAAVFgAAFhYAABcWAAAYFgAAGRYAABoWAAAbFgAAHBYAAB0WAAAeFgAAHxYAACAW
AAAhFgAAIhYAACMWAAAkFgAAJRYAACYWAAAnFgAAKBYAACkWAAAqFgAAKxYAACwWAAAtFgAALhYA
AC8WAAAwFgAAMRYAADIWAAAzFgAANBYAADUWAAA2FgAANxYAADgWAAA5FgAAOhYAADsWAAA8FgAA
PRYAAD4WAAA/FgAAQBYAAEEWAABCFgAAQxYAAEQWAABFFgAARhYAAEcWAABIFgAASRYAAEoWAABL
FgAATBYAAE0WAABOFgAATxYAAFAWAABRFgAAUhYAAFMWAABUFgAAVRYAAFYWAABXFgAAWBYAAFkW
AABaFgAAWxYAAFwWAABdFgAAXhYAAF8WAABgFgAAYRYAAGIWAABjFgAAZBYAAGUWAABmFgAAZxYA
AGgWAABpFgAAahYAAGsWAABsFgAAbRYAAG4WAABvFgAAcBYAAHEWAAByFgAAcxYAAHQWAAB1FgAA
dhYAAHcWAAB4FgAAeRYAAHoWAAB7FgAAfBYAAH0WAAB+FgAAfxYAAIAWAACBFgAAghYAAIMWAACE
FgAAhRYAAIYWAACHFgAAiBYAAIkWAACKFgAAixYAAIwWAACNFgAAjhYAAI8WAACQFgAAkRYAAJIW
AACTFgAAlBYAAJUWAACWFgAAlxYAAJgWAACZFgAAmhYAAJsWAACcFgAAnRYAAJ4WAACfFgAAoBYA
AKEWAACiFgAAoxYAAKQWAAClFgAAphYAAKcWAACoFgAAqRYAAKoWAACrFgAArBYAAK0WAACuFgAA
rxYAALAWAACxFgAAshYAALMWAAC0FgAAtRYAALYWAAC3FgAAuBYAALkWAAC6FgAAuxYAALwWAAC9
FgAAvhYAAL8WAADAFgAAwRYAAMIWAADDFgAAxBYAAMUWAADGFgAAxxYAAMgWAADJFgAAyhYAAMsW
AADMFgAAzRYAAM4WAADPFgAA0BYAANEWAADSFgAA0xYAANQWAADVFgAA1hYAANcWAADYFgAA2RYA
ANoWAADbFgAA3BYAAN0WAADeFgAA3xYAAOAWAADhFgAA4hYAAOMWAADkFgAA5RYAAOYWAADnFgAA
6BYAAOkWAADqFgAA6xYAAOwWAADtFgAA7hYAAO8WAADwFgAA8RYAAPIWAADzFgAA9BYAAPUWAAD2
FgAA9xYAAPgWAAD5FgAA+hYAAPsWAAD8FgAA/RYAAP4WAAD/FgAAABcAAAEXAAACFwAAAxcAAAQX
AAAFFwAABhcAAAcXAAAIFwAACRcAAAoXAAALFwAADBcAAA0XAAAOFwAADxcAABAXAAARFwAAEhcA
ABMXAAAUFwAAFRcAABYXAAAXFwAAGBcAABkXAAAaFwAAGxcAABwXAAAdFwAAHhcAAB8XAAAgFwAA
IRcAACIXAAAjFwAAJBcAACUXAAAmFwAAJxcAACgXAAApFwAAKhcAACsXAAAsFwAALRcAAC4XAAAv
FwAAMBcAADEXAAAyFwAAMxcAADQXAAA1FwAANhcAADcXAAA4FwAAORcAADoXAAA7FwAAPBcAAD0X
AAA+FwAAPxcAAEAXAABBFwAAQhcAAEMXAABEFwAARRcAAEYXAABHFwAASBcAAEkXAABKFwAASxcA
AEwXAABNFwAAThcAAE8XAABQFwAAURcAAFIXAABTFwAAVBcAAFUXAABWFwAAVxcAAFgXAABZFwAA
WhcAAFsXAABcFwAAXRcAAF4XAABfFwAAYBcAAGEXAABiFwAAYxcAAGQXAABlFwAAZhcAAGcXAABo
FwAAaRcAAGoXAABrFwAAbBcAAG0XAABuFwAAbxcAAHAXAABxFwAAchcAAHMXAAB0FwAAdRcAAHYX
AAB3FwAAeBcAAHkXAAB6FwAAexcAAHwXAAB9FwAAfhcAAH8XAACAFwAAgRcAAIIXAACDFwAAhBcA
AIUXAACGFwAAhxcAAIgXAACJFwAAihcAAIsXAACMFwAAjRcAAI4XAACPFwAAkBcAAJEXAACSFwAA
kxcAAJQXAACVFwAAlhcAAJcXAACYFwAAmRcAAJoXAACbFwAAnBcAAJ0XAACeFwAAnxcAAKAXAACh
FwAAohcAAKMXAACkFwAApRcAAKYXAACnFwAAqBcAAKkXAACqFwAAqxcAAKwXAACtFwAArhcAAK8X
AACwFwAAsRcAALIXAACzFwAAtBcAALUXAAC2FwAAtxcAALgXAAC5FwAAuhcAALsXAAC8FwAAvRcA
AL4XAAC/FwAAwBcAAMEXAADCFwAAwxcAAMQXAADFFwAAxhcAAMcXAADIFwAAyRcAAMoXAADLFwAA
zBcAAM0XAADOFwAAzxcAANAXAADRFwAA0hcAANMXAADUFwAA1RcAANYXAADXFwAA2BcAANkXAADa
FwAA2xcAANwXAADdFwAA3hcAAN8XAADgFwAA4RcAAOIXAADjFwAA5BcAAOUXAADmFwAA5xcAAOgX
AADpFwAA6hcAAOsXAADsFwAA7RcAAO4XAADvFwAA8BcAAPEXAADyFwAA8xcAAPQXAAD1FwAA9hcA
APcXAAD4FwAA+RcAAPoXAAD7FwAA/BcAAP0XAAD+FwAA/xcAAAAYAAABGAAAAhgAAAMYAAAEGAAA
BRgAAAYYAAAHGAAACBgAAAkYAAAKGAAACxgAAAwYAAANGAAADhgAAA8YAAAQGAAAERgAABIYAAAT
GAAAFBgAABUYAAAWGAAAFxgAABgYAAAZGAAAGhgAABsYAAAcGAAAHRgAAB4YAAAfGAAAIBgAACEY
AAAiGAAAIxgAACQYAAAlGAAAJhgAACcYAAAoGAAAKRgAACoYAAArGAAALBgAAC0YAAAuGAAALxgA
ADAYAAAxGAAAMhgAADMYAAA0GAAANRgAADYYAAA3GAAAOBgAADkYAAA6GAAAOxgAADwYAAA9GAAA
PhgAAD8YAABAGAAAQRgAAEIYAABDGAAARBgAAEUYAABGGAAARxgAAEgYAABJGAAAShgAAEsYAABM
GAAATRgAAE4YAABPGAAAUBgAAFEYAABSGAAAUxgAAFQYAABVGAAAVhgAAFcYAABYGAAAWRgAAFoY
AABbGAAAXBgAAF0YAABeGAAAXxgAAGAYAABhGAAAYhgAAGMYAABkGAAAZRgAAGYYAABnGAAAaBgA
AGkYAABqGAAAaxgAAGwYAABtGAAAbhgAAG8YAABwGAAAcRgAAHIYAABzGAAAdBgAAHUYAAB2GAAA
dxgAAHgYAAB5GAAAehgAAHsYAAB8GAAAfRgAAH4YAAB/GAAAgBgAAIEYAACCGAAAgxgAAIQYAACF
GAAAhhgAAIcYAACIGAAAiRgAAIoYAACLGAAAjBgAAI0YAACOGAAAjxgAAJAYAACRGAAAkhgAAJMY
AACUGAAAlRgAAJYYAACXGAAAmBgAAJkYAACaGAAAmxgAAJwYAACdGAAAnhgAAJ8YAACgGAAAoRgA
AKIYAACjGAAApBgAAKUYAACmGAAApxgAAKgYAACpGAAAqhgAAKsYAACsGAAArRgAAK4YAACvGAAA
sBgAALEYAACyGAAAsxgAALQYAAC1GAAAthgAALcYAAC4GAAAuRgAALoYAAC7GAAAvBgAAL0YAAC+
GAAAvxgAAMAYAADBGAAAwhgAAMMYAADEGAAAxRgAAMYYAADHGAAAyBgAAMkYAADKGAAAyxgAAMwY
AADNGAAAzhgAAM8YAADQGAAA0RgAANIYAADTGAAA1BgAANUYAADWGAAA1xgAANgYAADZGAAA2hgA
ANsYAADcGAAA3RgAAN4YAADfGAAA4BgAAOEYAADiGAAA4xgAAOQYAADlGAAA5hgAAOcYAADoGAAA
6RgAAOoYAADrGAAA7BgAAO0YAADuGAAA7xgAAPAYAADxGAAA8hgAAPMYAAD0GAAA9RgAAPYYAAD3
GAAA+BgAAPkYAAD6GAAA+xgAAPwYAAD9GAAA/hgAAP8YAAAAGQAAARkAAAIZAAADGQAABBkAAAUZ
AAAGGQAABxkAAAgZAAAJGQAAChkAAAsZAAAMGQAADRkAAA4ZAAAPGQAAEBkAABEZAAASGQAAExkA
ABQZAAAVGQAAFhkAABcZAAAYGQAAGRkAABoZAAAbGQAAHBkAAB0ZAAAeGQAAHxkAACAZAAAhGQAA
IhkAACMZAAAkGQAAJRkAACYZAAAnGQAAKBkAACkZAAAqGQAAKxkAACwZAAAtGQAALhkAAC8ZAAAw
GQAAMRkAADIZAAAzGQAANBkAADUZAAA2GQAANxkAADgZAAA5GQAAOhkAADsZAAA8GQAAPRkAAD4Z
AAA/GQAAQBkAAEEZAABCGQAAQxkAAEQZAABFGQAARhkAAEcZAABIGQAASRkAAEoZAABLGQAATBkA
AE0ZAABOGQAATxkAAFAZAABRGQAAUhkAAFMZAABUGQAAVRkAAFYZAABXGQAAWBkAAFkZAABaGQAA
WxkAAFwZAABdGQAAXhkAAF8ZAABgGQAAYRkAAGIZAABjGQAAZBkAAGUZAABmGQAAZxkAAGgZAABp
GQAAahkAAGsZAABsGQAAbRkAAG4ZAABvGQAAcBkAAHEZAAByGQAAcxkAAHQZAAB1GQAAdhkAAHcZ
AAB4GQAAeRkAAHoZAAB7GQAAfBkAAH0ZAAB+GQAAfxkAAIAZAACBGQAAghkAAIMZAACEGQAAhRkA
AIYZAACHGQAAiBkAAIkZAACKGQAAixkAAIwZAACNGQAAjhkAAI8ZAACQGQAAkRkAAJIZAACTGQAA
lBkAAJUZAACWGQAAlxkAAJgZAACZGQAAmhkAAJsZAACcGQAAnRkAAJ4ZAACfGQAAoBkAAKEZAACi
GQAAoxkAAKQZAAClGQAAphkAAKcZAACoGQAAqRkAAKoZAACrGQAArBkAAK0ZAACuGQAArxkAALAZ
AACxGQAAshkAALMZAAC0GQAAtRkAALYZAAC3GQAAuBkAALkZAAC6GQAAuxkAALwZAAC9GQAAvhkA
AL8ZAADAGQAAwRkAAMIZAADDGQAAxBkAAMUZAADGGQAAxxkAAMgZAADJGQAAyhkAAMsZAADMGQAA
zRkAAM4ZAADPGQAA0BkAANEZAADSGQAA0xkAANQZAADVGQAA1hkAANcZAADYGQAA2RkAANoZAADb
GQAA3BkAAN0ZAADeGQAA3xkAAOAZAADhGQAA4hkAAOMZAADkGQAA5RkAAOYZAADnGQAA6BkAAOkZ
AADqGQAA6xkAAOwZAADtGQAA7hkAAO8ZAADwGQAA8RkAAPIZAADzGQAA9BkAAPUZAAD2GQAA9xkA
APgZAAD5GQAA+hkAAPsZAAD8GQAA/RkAAP4ZAAD/GQAAABoAAAEaAAACGgAAAxoAAAQaAAAFGgAA
BhoAAAcaAAAIGgAACRoAAAoaAAALGgAADBoAAA0aAAAOGgAADxoAABAaAAARGgAAEhoAABMaAAAU
GgAAFRoAABYaAAAXGgAAGBoAABkaAAAaGgAAGxoAABwaAAAdGgAAHhoAAB8aAAAgGgAAIRoAACIa
AAAjGgAAJBoAACUaAAAmGgAAJxoAACgaAAApGgAAKhoAACsaAAAsGgAALRoAAC4aAAAvGgAAMBoA
ADEaAAAyGgAAMxoAADQaAAA1GgAANhoAADcaAAA4GgAAORoAADoaAAA7GgAAPBoAAD0aAAA+GgAA
PxoAAEAaAABBGgAAQhoAAEMaAABEGgAARRoAAEYaAABHGgAASBoAAEkaAABKGgAASxoAAEwaAABN
GgAAThoAAE8aAABQGgAAURoAAFIaAABTGgAAVBoAAFUaAABWGgAAVxoAAFgaAABZGgAAWhoAAFsa
AABcGgAAXRoAAF4aAABfGgAAYBoAAGEaAABiGgAAYxoAAGQaAABlGgAAZhoAAGcaAABoGgAAaRoA
AGoaAABrGgAAbBoAAG0aAABuGgAAbxoAAHAaAABxGgAAchoAAHMaAAB0GgAAdRoAAHYaAAB3GgAA
eBoAAHkaAAB6GgAAexoAAHwaAAB9GgAAfhoAAH8aAACAGgAAgRoAAIIaAACDGgAAhBoAAIUaAACG
GgAAhxoAAIgaAACJGgAAihoAAIsaAACMGgAAjRoAAI4aAACPGgAAkBoAAJEaAACSGgAAkxoAAJQa
AACVGgAAlhoAAJcaAACYGgAAmRoAAJoaAACbGgAAnBoAAJ0aAACeGgAAnxoAAKAaAAChGgAAohoA
AKMaAACkGgAApRoAAKYaAACnGgAAqBoAAKkaAACqGgAAqxoAAKwaAACtGgAArhoAAK8aAACwGgAA
sRoAALIaAACzGgAAtBoAALUaAAC2GgAAtxoAALgaAAC5GgAAuhoAALsaAAC8GgAAvRoAAL4aAAC/
GgAAwBoAAMEaAADCGgAAwxoAAMQaAADFGgAAxhoAAMcaAADIGgAAyRoAAMoaAADLGgAAzBoAAM0a
AADOGgAAzxoAANAaAADRGgAA0hoAANMaAADUGgAA1RoAANYaAADXGgAA2BoAANkaAADaGgAA2xoA
ANwaAADdGgAA3hoAAN8aAADgGgAA4RoAAOIaAADjGgAA5BoAAOUaAADmGgAA5xoAAOgaAADpGgAA
6hoAAOsaAADsGgAA7RoAAO4aAADvGgAA8BoAAPEaAADyGgAA8xoAAPQaAAD1GgAA9hoAAPcaAAD4
GgAA+RoAAPoaAAD7GgAA/BoAAP0aAAD+GgAA/xoAAAAbAAABGwAAAhsAAAMbAAAEGwAABRsAAAYb
AAAHGwAACBsAAAkbAAAKGwAACxsAAAwbAAANGwAADhsAAA8bAAAQGwAAERsAABIbAAATGwAAFBsA
ABUbAAAWGwAAFxsAABgbAAAZGwAAGhsAABsbAAAcGwAAHRsAAB4bAAAfGwAAIBsAACEbAAAiGwAA
IxsAACQbAAAlGwAAJhsAACcbAAAoGwAAKRsAACobAAArGwAALBsAAC0bAAAuGwAALxsAADAbAAAx
GwAAMhsAADMbAAA0GwAANRsAADYbAAA3GwAAOBsAADkbAAA6GwAAOxsAADwbAAA9GwAAPhsAAD8b
AABAGwAAQRsAAEIbAABDGwAARBsAAEUbAABGGwAARxsAAEgbAABJGwAAShsAAEsbAABMGwAATRsA
AE4bAABPGwAAUBsAAFEbAABSGwAAUxsAAFQbAABVGwAAVhsAAFcbAABYGwAAWRsAAFobAABbGwAA
XBsAAF0bAABeGwAAXxsAAGAbAABhGwAAYhsAAGMbAABkGwAAZRsAAGYbAABnGwAAaBsAAGkbAABq
GwAAaxsAAGwbAABtGwAAbhsAAG8bAABwGwAAcRsAAHIbAABzGwAAdBsAAHUbAAB2GwAAdxsAAHgb
AAB5GwAAehsAAHsbAAB8GwAAfRsAAH4bAAB/GwAAgBsAAIEbAACCGwAAgxsAAIQbAACFGwAAhhsA
AIcbAACIGwAAiRsAAIobAACLGwAAjBsAAI0bAACOGwAAjxsAAJAbAACRGwAAkhsAAJMbAACUGwAA
lRsAAJYbAACXGwAAmBsAAJkbAACaGwAAmxsAAJwbAACdGwAAnhsAAJ8bAACgGwAAoRsAAKIbAACj
GwAApBsAAKUbAACmGwAApxsAAKgbAACpGwAAqhsAAKsbAACsGwAArRsAAK4bAACvGwAAsBsAALEb
AACyGwAAsxsAALQbAAC1GwAAthsAALcbAAC4GwAAuRsAALobAAC7GwAAvBsAAL0bAAC+GwAAvxsA
AMAbAADBGwAAwhsAAMMbAADEGwAAxRsAAMYbAADHGwAAyBsAAMkbAADKGwAAyxsAAMwbAADNGwAA
zhsAAM8bAADQGwAA0RsAANIbAADTGwAA1BsAANUbAADWGwAA1xsAANgbAADZGwAA2hsAANsbAADc
GwAA3RsAAN4bAADfGwAA4BsAAOEbAADiGwAA4xsAAOQbAADlGwAA5hsAAOcbAADoGwAA6RsAAOob
AADrGwAA7BsAAO0bAADuGwAA7xsAAPAbAADxGwAA8hsAAPMbAAD0GwAA9RsAAPYbAAD3GwAA+BsA
APkbAAD6GwAA+xsAAPwbAAD9GwAA/hsAAP8bAAAAHAAAARwAAAIcAAADHAAABBwAAAUcAAAGHAAA
BxwAAAgcAAAJHAAAChwAAAscAAAMHAAADRwAAA4cAAAPHAAAEBwAABEcAAASHAAAExwAABQcAAAV
HAAAFhwAABccAAAYHAAAGRwAABocAAAbHAAAHBwAAB0cAAAeHAAAHxwAACAcAAAhHAAAIhwAACMc
AAAkHAAAJRwAACYcAAAnHAAAKBwAACkcAAAqHAAAKxwAACwcAAAtHAAALhwAAC8cAAAwHAAAMRwA
ADIcAAAzHAAANBwAADUcAAA2HAAANxwAADgcAAA5HAAAOhwAADscAAA8HAAAPRwAAD4cAAA/HAAA
QBwAAEEcAABCHAAAQxwAAEQcAABFHAAARhwAAEccAABIHAAASRwAAEocAABLHAAATBwAAE0cAABO
HAAATxwAAFAcAABRHAAAUhwAAFMcAABUHAAAVRwAAFYcAABXHAAAWBwAAFkcAABaHAAAWxwAAFwc
AABdHAAAXhwAAF8cAABgHAAAYRwAAGIcAABjHAAAZBwAAGUcAABmHAAAZxwAAGgcAABpHAAAahwA
AGscAABsHAAAbRwAAG4cAABvHAAAcBwAAHEcAAByHAAAcxwAAHQcAAB1HAAAdhwAAHccAAB4HAAA
eRwAAHocAAB7HAAAfBwAAH0cAAB+HAAAfxwAAIAcAACBHAAAghwAAIMcAACEHAAAhRwAAIYcAACH
HAAAiBwAAIkcAACKHAAAixwAAIwcAACNHAAAjhwAAI8cAACQHAAAkRwAAJIcAACTHAAAlBwAAJUc
AACWHAAAlxwAAJgcAACZHAAAmhwAAJscAACcHAAAnRwAAJ4cAACfHAAAoBwAAKEcAACiHAAAoxwA
AKQcAAClHAAAphwAAKccAACoHAAAqRwAAKocAACrHAAArBwAAK0cAACuHAAArxwAALAcAACxHAAA
shwAALMcAAC0HAAAtRwAALYcAAC3HAAAuBwAALkcAAC6HAAAuxwAALwcAAC9HAAAvhwAAL8cAADA
HAAAwRwAAMIcAADDHAAAxBwAAMUcAADGHAAAxxwAAMgcAADJHAAAyhwAAMscAADMHAAAzRwAAM4c
AADPHAAA0BwAANEcAADSHAAA0xwAANQcAADVHAAA1hwAANccAADYHAAA2RwAANocAADbHAAA3BwA
AN0cAADeHAAA3xwAAOAcAADhHAAA4hwAAOMcAADkHAAA5RwAAOYcAADnHAAA6BwAAOkcAADqHAAA
6xwAAOwcAADtHAAA7hwAAO8cAADwHAAA8RwAAPIcAADzHAAA9BwAAPUcAAD2HAAA9xwAAPgcAAD5
HAAA+hwAAPscAAD8HAAA/RwAAP4cAAD/HAAAAB0AAAEdAAACHQAAAx0AAAQdAAAFHQAABh0AAAcd
AAAIHQAACR0AAAodAAALHQAADB0AAA0dAAAOHQAADx0AABAdAAARHQAAEh0AABMdAAAUHQAAFR0A
ABYdAAAXHQAAGB0AABkdAAAaHQAAGx0AABwdAAAdHQAAHh0AAB8dAAAgHQAAIR0AACIdAAAjHQAA
JB0AACUdAAAmHQAAJx0AACgdAAApHQAAKh0AACsdAAAsHQAALR0AAC4dAAAvHQAAMB0AADEdAAAy
HQAAMx0AADQdAAA1HQAANh0AADcdAAA4HQAAOR0AADodAAA7HQAAPB0AAD0dAAA+HQAAPx0AAEAd
AABBHQAAQh0AAEMdAABEHQAARR0AAEYdAABHHQAASB0AAEkdAABKHQAASx0AAEwdAABNHQAATh0A
AE8dAABQHQAAUR0AAFIdAABTHQAAVB0AAFUdAABWHQAAVx0AAFgdAABZHQAAWh0AAFsdAABcHQAA
XR0AAF4dAABfHQAAYB0AAGEdAABiHQAAYx0AAGQdAABlHQAAZh0AAGcdAABoHQAAaR0AAGodAABr
HQAAbB0AAG0dAABuHQAAbx0AAHAdAABxHQAAch0AAHMdAAB0HQAAdR0AAHYdAAB3HQAAeB0AAHkd
AAB6HQAAex0AAHwdAAB9HQAAfh0AAH8dAACAHQAAgR0AAIIdAACDHQAAhB0AAIUdAACGHQAAhx0A
AIgdAACJHQAAih0AAIsdAACMHQAAjR0AAI4dAACPHQAAkB0AAJEdAACSHQAAkx0AAJQdAACVHQAA
lh0AAJcdAACYHQAAmR0AAJodAACbHQAAnB0AAJ0dAACeHQAAnx0AAKAdAAChHQAAoh0AAKMdAACk
HQAApR0AAKYdAACnHQAAqB0AAKkdAACqHQAAqx0AAKwdAACtHQAArh0AAK8dAACwHQAAsR0AALId
AACzHQAAtB0AALUdAAC2HQAAtx0AALgdAAC5HQAAuh0AALsdAAC8HQAAvR0AAL4dAAC/HQAAwB0A
AMEdAADCHQAAwx0AAMQdAADFHQAAxh0AAMcdAADIHQAAyR0AAModAADLHQAAzB0AAM0dAADOHQAA
zx0AANAdAADRHQAA0h0AANMdAADUHQAA1R0AANYdAADXHQAA2B0AANkdAADaHQAA2x0AANwdAADd
HQAA3h0AAN8dAADgHQAA4R0AAOIdAADjHQAA5B0AAOUdAADmHQAA5x0AAOgdAADpHQAA6h0AAOsd
AADsHQAA7R0AAO4dAADvHQAA8B0AAPEdAADyHQAA8x0AAPQdAAD1HQAA9h0AAPcdAAD4HQAA+R0A
APodAAD7HQAA/B0AAP0dAAD+HQAA/x0AAAAeAAABHgAAAh4AAAMeAAAEHgAABR4AAAYeAAAHHgAA
CB4AAAkeAAAKHgAACx4AAAweAAANHgAADh4AAA8eAAAQHgAAER4AABIeAAATHgAAFB4AABUeAAAW
HgAAFx4AABgeAAAZHgAAGh4AABseAAAcHgAAHR4AAB4eAAAfHgAAIB4AACEeAAAiHgAAIx4AACQe
AAAlHgAAJh4AACceAAAoHgAAKR4AACoeAAArHgAALB4AAC0eAAAuHgAALx4AADAeAAAxHgAAMh4A
ADMeAAA0HgAANR4AADYeAAA3HgAAOB4AADkeAAA6HgAAOx4AADweAAA9HgAAPh4AAD8eAABAHgAA
QR4AAEIeAABDHgAARB4AAEUeAABGHgAARx4AAEgeAABJHgAASh4AAEseAABMHgAATR4AAE4eAABP
HgAAUB4AAFEeAABSHgAAUx4AAFQeAABVHgAAVh4AAFceAABYHgAAWR4AAFoeAABbHgAAXB4AAF0e
AABeHgAAXx4AAGAeAABhHgAAYh4AAGMeAABkHgAAZR4AAGYeAABnHgAAaB4AAGkeAABqHgAAax4A
AGweAABtHgAAbh4AAG8eAABwHgAAcR4AAHIeAABzHgAAdB4AAHUeAAB2HgAAdx4AAHgeAAB5HgAA
eh4AAHseAAB8HgAAfR4AAH4eAAB/HgAAgB4AAIEeAACCHgAAgx4AAIQeAACFHgAAhh4AAIceAACI
HgAAiR4AAIoeAACLHgAAjB4AAI0eAACOHgAAjx4AAJAeAACRHgAAkh4AAJMeAACUHgAAlR4AAJYe
AACXHgAAmB4AAJkeAACaHgAAmx4AAJweAACdHgAAnh4AAJ8eAACgHgAAoR4AAKIeAACjHgAApB4A
AKUeAACmHgAApx4AAKgeAACpHgAAqh4AAKseAACsHgAArR4AAK4eAACvHgAAsB4AALEeAACyHgAA
sx4AALQeAAC1HgAAth4AALceAAC4HgAAuR4AALoeAAC7HgAAvB4AAL0eAAC+HgAAvx4AAMAeAADB
HgAAwh4AAMMeAADEHgAAxR4AAMYeAADHHgAAyB4AAMkeAADKHgAAyx4AAMweAADNHgAAzh4AAM8e
AADQHgAA0R4AANIeAADTHgAA1B4AANUeAADWHgAA1x4AANgeAADZHgAA2h4AANseAADcHgAA3R4A
AN4eAADfHgAA4B4AAOEeAADiHgAA4x4AAOQeAADlHgAA5h4AAOceAADoHgAA6R4AAOoeAADrHgAA
7B4AAO0eAADuHgAA7x4AAPAeAADxHgAA8h4AAPMeAAD0HgAA9R4AAPYeAAD3HgAA+B4AAPkeAAD6
HgAA+x4AAPweAAD9HgAA/h4AAP8eAAAAHwAAAR8AAAIfAAADHwAABB8AAAUfAAAGHwAABx8AAAgf
AAAJHwAACh8AAAsfAAAMHwAADR8AAA4fAAAPHwAAEB8AABEfAAASHwAAEx8AABQfAAAVHwAAFh8A
ABcfAAAYHwAAGR8AABofAAAbHwAAHB8AAB0fAAAeHwAAHx8AACAfAAAhHwAAIh8AACMfAAAkHwAA
JR8AACYfAAAnHwAAKB8AACkfAAAqHwAAKx8AACwfAAAtHwAALh8AAC8fAAAwHwAAMR8AADIfAAAz
HwAANB8AADUfAAA2HwAANx8AADgfAAA5HwAAOh8AADsfAAA8HwAAPR8AAD4fAAA/HwAAQB8AAEEf
AABCHwAAQx8AAEQfAABFHwAARh8AAEcfAABIHwAASR8AAEofAABLHwAATB8AAE0fAABOHwAATx8A
AFAfAABRHwAAUh8AAFMfAABUHwAAVR8AAFYfAABXHwAAWB8AAFkfAABaHwAAWx8AAFwfAABdHwAA
Xh8AAF8fAABgHwAAYR8AAGIfAABjHwAAZB8AAGUfAABmHwAAZx8AAGgfAABpHwAAah8AAGsfAABs
HwAAbR8AAG4fAABvHwAAcB8AAHEfAAByHwAAcx8AAHQfAAB1HwAAdh8AAHcfAAB4HwAAeR8AAHof
AAB7HwAAfB8AAH0fAAB+HwAAfx8AAIAfAACBHwAAgh8AAIMfAACEHwAAhR8AAIYfAACHHwAAiB8A
AIkfAACKHwAAix8AAIwfAACNHwAAjh8AAI8fAACQHwAAkR8AAJIfAACTHwAAlB8AAJUfAACWHwAA
lx8AAJgfAACZHwAAmh8AAJsfAACcHwAAnR8AAJ4fAACfHwAAoB8AAKEfAACiHwAAox8AAKQfAACl
HwAAph8AAKcfAACoHwAAqR8AAKofAACrHwAArB8AAK0fAACuHwAArx8AALAfAACxHwAAsh8AALMf
AAC0HwAAtR8AALYfAAC3HwAAuB8AALkfAAC6HwAAux8AALwfAAC9HwAAvh8AAL8fAADAHwAAwR8A
AMIfAADDHwAAxB8AAMUfAADGHwAAxx8AAMgfAADJHwAAyh8AAMsfAADMHwAAzR8AAM4fAADPHwAA
0B8AANEfAADSHwAA0x8AANQfAADVHwAA1h8AANcfAADYHwAA2R8AANofAADbHwAA3B8AAN0fAADe
HwAA3x8AAOAfAADhHwAA4h8AAOMfAADkHwAA5R8AAOYfAADnHwAA6B8AAOkfAADqHwAA6x8AAOwf
AADtHwAA7h8AAO8fAADwHwAA8R8AAPIfAADzHwAA9B8AAPUfAAD2HwAA9x8AAPgfAAD5HwAA+h8A
APsfAAD8HwAA/R8AAP4fAAD/HwAAACAAAAEgAAACIAAAAyAAAAQgAAAFIAAABiAAAAcgAAAIIAAA
CSAAAAogAAALIAAADCAAAA0gAAAOIAAADyAAABAgAAARIAAAEiAAABMgAAAUIAAAFSAAABYgAAAX
IAAAGCAAABkgAAAaIAAAGyAAABwgAAAdIAAAHiAAAB8gAAAgIAAAISAAACIgAAAjIAAAJCAAACUg
AAAmIAAAJyAAACggAAApIAAAKiAAACsgAAAsIAAALSAAAC4gAAAvIAAAMCAAADEgAAAyIAAAMyAA
ADQgAAA1IAAANiAAADcgAAA4IAAAOSAAADogAAA7IAAAPCAAAD0gAAA+IAAAPyAAAEAgAABBIAAA
QiAAAEMgAABEIAAARSAAAEYgAABHIAAASCAAAEkgAABKIAAASyAAAEwgAABNIAAATiAAAE8gAABQ
IAAAUSAAAFIgAABTIAAAVCAAAFUgAABWIAAAVyAAAFggAABZIAAAWiAAAFsgAABcIAAAXSAAAF4g
AABfIAAAYCAAAGEgAABiIAAAYyAAAGQgAABlIAAAZiAAAGcgAABoIAAAaSAAAGogAABrIAAAbCAA
AG0gAABuIAAAbyAAAHAgAABxIAAAciAAAHMgAAB0IAAAdSAAAHYgAAB3IAAAeCAAAHkgAAB6IAAA
eyAAAHwgAAB9IAAAfiAAAH8gAACAIAAAgSAAAIIgAACDIAAAhCAAAIUgAACGIAAAhyAAAIggAACJ
IAAAiiAAAIsgAACMIAAAjSAAAI4gAACPIAAAkCAAAJEgAACSIAAAkyAAAJQgAACVIAAAliAAAJcg
AACYIAAAmSAAAJogAACbIAAAnCAAAJ0gAACeIAAAnyAAAKAgAAChIAAAoiAAAKMgAACkIAAApSAA
AKYgAACnIAAAqCAAAKkgAACqIAAAqyAAAKwgAACtIAAAriAAAK8gAACwIAAAsSAAALIgAACzIAAA
tCAAALUgAAC2IAAAtyAAALggAAC5IAAAuiAAALsgAAC8IAAAvSAAAL4gAAC/IAAAwCAAAMEgAADC
IAAAwyAAAMQgAADFIAAAxiAAAMcgAADIIAAAySAAAMogAADLIAAAzCAAAM0gAADOIAAAzyAAANAg
AADRIAAA0iAAANMgAADUIAAA1SAAANYgAADXIAAA2CAAANkgAADaIAAA2yAAANwgAADdIAAA3iAA
AN8gAADgIAAA4SAAAOIgAADjIAAA5CAAAOUgAADmIAAA5yAAAOggAADpIAAA6iAAAOsgAADsIAAA
7SAAAO4gAADvIAAA8CAAAPEgAADyIAAA8yAAAPQgAAD1IAAA9iAAAPcgAAD4IAAA+SAAAPogAAD7
IAAA/CAAAP0gAAD+IAAA/yAAAAAhAAABIQAAAiEAAAMhAAAEIQAABSEAAAYhAAAHIQAACCEAAAkh
AAAKIQAACyEAAAwhAAANIQAADiEAAA8hAAAQIQAAESEAABIhAAATIQAAFCEAABUhAAAWIQAAFyEA
ABghAAAZIQAAGiEAABshAAAcIQAAHSEAAB4hAAAfIQAAICEAACEhAAAiIQAAIyEAACQhAAAlIQAA
JiEAACchAAAoIQAAKSEAACohAAArIQAALCEAAC0hAAAuIQAALyEAADAhAAAxIQAAMiEAADMhAAA0
IQAANSEAADYhAAA3IQAAOCEAADkhAAA6IQAAOyEAADwhAAA9IQAAPiEAAD8hAABAIQAAQSEAAEIh
AABDIQAARCEAAEUhAABGIQAARyEAAEghAABJIQAASiEAAEshAABMIQAATSEAAE4hAABPIQAAUCEA
AFEhAABSIQAAUyEAAFQhAABVIQAAViEAAFchAABYIQAAWSEAAFohAABbIQAAXCEAAF0hAABeIQAA
XyEAAGAhAABhIQAAYiEAAGMhAABkIQAAZSEAAGYhAABnIQAAaCEAAGkhAABqIQAAayEAAGwhAABt
IQAAbiEAAG8hAABwIQAAcSEAAHIhAABzIQAAdCEAAHUhAAB2IQAAdyEAAHghAAB5IQAAeiEAAHsh
AAB8IQAAfSEAAH4hAAB/IQAAgCEAAIEhAACCIQAAgyEAAIQhAACFIQAAhiEAAIchAACIIQAAiSEA
AIohAACLIQAAjCEAAI0hAACOIQAAjyEAAJAhAACRIQAAkiEAAJMhAACUIQAAlSEAAJYhAACXIQAA
mCEAAJkhAACaIQAAmyEAAJwhAACdIQAAniEAAJ8hAACgIQAAoSEAAKIhAACjIQAApCEAAKUhAACm
IQAApyEAAKghAACpIQAAqiEAAKshAACsIQAArSEAAK4hAACvIQAAsCEAALEhAACyIQAAsyEAALQh
AAC1IQAAtiEAALchAAC4IQAAuSEAALohAAC7IQAAvCEAAL0hAAC+IQAAvyEAAMAhAADBIQAAwiEA
AMMhAADEIQAAxSEAAMYhAADHIQAAyCEAAMkhAADKIQAAyyEAAMwhAADNIQAAziEAAM8hAADQIQAA
0SEAANIhAAD+////1CEAANUhAADWIQAA1yEAANghAADZIQAA2iEAANshAADcIQAA3SEAAN4hAADf
IQAA/v///+EhAADiIQAA4yEAAOQhAADlIQAA5iEAAOchAAD+////6SEAAOohAADrIQAA7CEAAO0h
AADuIQAA7yEAAP7////9/////f////3////9/////f////3////9/////f////3////9/////f//
//3////9/////f////3////9/////f////3////9/////f////3////9/////f////3////9////
/f////3////9/////f////3////9/////f////3////9/////f////3////9/////f////3////9
/////f////3////9/////f////3////9/////f////3////9/////f////3////9/////f////3/
///9/////f////3////9/////f////3////9/////f////3////9/////f////3////9/////f//
//3///82IgAA/v////7////+////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
//////////////////////////9SAG8AbwB0ACAARQBuAHQAcgB5AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAFAf//////////AwAAAAYJAgAAAAAAwAAAAAAA
AEYAAAAAAAAAAAAAAADQk+Jg64/MATgiAACAAAAAAAAAAEQAYQB0AGEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAIB////////////////
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAD6OQwAAAAAAMQBUAGEAYgBs
AGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4A
AgEBAAAABgAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTIQAAdBkA
AAAAAABXAG8AcgBkAEQAbwBjAHUAbQBlAG4AdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAGgACAQIAAAAFAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAuFAAAAAAAAAUAUwB1AG0AbQBhAHIAeQBJAG4AZgBvAHIAbQBhAHQAaQBvAG4A
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAIB////////////////AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAA4CEAAAAQAAAAAAAABQBEAG8AYwB1AG0AZQBuAHQAUwB1AG0A
bQBhAHIAeQBJAG4AZgBvAHIAbQBhAHQAaQBvAG4AAAAAAAAAAAAAADgAAgEEAAAA//////////8A
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoIQAAABAAAAAAAAABAEMAbwBtAHAA
TwBiAGoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAC
AP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAQAAAP7/////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
//////////////////////8BAP7/AwoAAP////8GCQIAAAAAAMAAAAAAAABGIAAAAE1pY3Jvc29m
dCBXb3JkIDk3LTIwMDMgRG9jdW1lbnQACgAAAE1TV29yZERvYwAQAAAAV29yZC5Eb2N1bWVudC44
APQ5snEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAA==
--bcaec51dd491a1b5f004b1aec8c3
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-users mailing list
Xen-users@lists.xensource.com
http://lists.xensource.com/xen-users
--bcaec51dd491a1b5f004b1aec8c3--


From xen-devel-bounces@lists.xensource.com Mon Nov 14 11:45:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 11:45:04 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ2Sj-000702-H4; Mon, 14 Nov 2011 11:45:01 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ0l9-0008MS-Cl
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 09:55:55 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1321293352!3488152!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30864 invoked from network); 14 Nov 2011 17:55:52 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 17:55:52 -0000
X-IronPort-AV: E=Sophos;i="4.69,510,1315180800"; 
   d="scan'208";a="8922054"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 17:55:26 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 14 Nov 2011 17:55:26 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RQ0kf-000051-OI; Mon, 14 Nov 2011 17:55:25 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RQ0kf-00040z-NN;
	Mon, 14 Nov 2011 17:55:25 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20161.22029.654901.931472@mariner.uk.xensource.com>
Date: Mon, 14 Nov 2011 17:55:25 +0000
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] [PATCH] BZ 1680: Xend fails to start if
	/var/lib/xend/state/*.xml are empty
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <76391f599433544ecf3f.1320336263@phenom.dumpdata.com>
References: <76391f599433544ecf3f.1320336263@phenom.dumpdata.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: xen-devel@lists.xensource.com, Ian.Campbell@citrix.com,
	m.a.young@durham.ac.uk
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Konrad Rzeszutek Wilk writes ("[Xen-devel] [PATCH] BZ 1680: Xend fails to start if /var/lib/xend/state/*.xml are empty"):
> BZ 1680: Xend fails to start if /var/lib/xend/state/*.xml are empty

We're not really maintaining xend any more but this change is at the
very worst harmless and I have applied it.

Thanks,
Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 11:46:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 11:46:15 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ2Tv-0007PD-5G; Mon, 14 Nov 2011 11:46:15 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ0qB-0000ck-79
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 10:01:11 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1321293661!2176050!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12632 invoked from network); 14 Nov 2011 18:01:03 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-13.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Nov 2011 18:01:03 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAEI0uW7021712
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 14 Nov 2011 18:00:57 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAEI0sFj010412
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 14 Nov 2011 18:00:54 GMT
Received: from abhmt112.oracle.com (abhmt112.oracle.com [141.146.116.64])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAEI0kbw004734; Mon, 14 Nov 2011 12:00:47 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 14 Nov 2011 10:00:46 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id D07E4814B1; Mon, 14 Nov 2011 13:00:45 -0500 (EST)
Date: Mon, 14 Nov 2011 13:00:45 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] Time Change Issue Xen 4.1
Message-ID: <20111114180045.GA14517@phenom.dumpdata.com>
References: <4EBD5AA0.3090906@webanywhere.co.uk>
	<20111111183913.GA9283@phenom.dumpdata.com>
	<4EC0F20D0200007800060B7D@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EC0F20D0200007800060B7D@nat28.tlf.novell.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090206.4EC15759.00BD,ss=1,re=0.000,fgs=0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>, xen-devel@lists.xensource.com,
	keir.xen@gmail.com, Niall Fleming <niall.fleming@webanywhere.co.uk>,
	pbonzini@redhat.com, lersek@redhat.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 09:48:45AM +0000, Jan Beulich wrote:
> >>> On 11.11.11 at 19:39, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
> > On Fri, Nov 11, 2011 at 05:25:52PM +0000, Niall Fleming wrote:
> >> Hi all,
> >> 
> >> Already posted this over in xen-users and Konrad confirms it as a
> >> bug and suggested to repost
> >> it over here!
> > 
> > Laszlo, Paolo, Jan, you guys haven't seen domething like this? It looks
> > like a hypervisor issue where the wallclock time is not really dispursed
> > in the shared_info.
> 
> Hypervisor? Upstream up to and including 3.1 just doesn't issue the
> necessary hypercalls. This was fixed only recently through patches
> from Jeremy. We had a different issue in that respect in the forward
> ported Linux trees, but that got fixed a couple of months ago, too.

Right. With those patches too (he used the xen-settime patch set which has it).
The hypercall is done (and the do_settime gets called) and the results are saved
in the RTC. And the wc_sec and wc_nsec are updated and propagated.

The problem is that wc_sec and wc_nsec are only propagated to the
existing guests.

If you launch a new guest after the 'hwclock', the new guests
retains the old wallclock time.

> 
> This not working in Jeremy's 2.6.32 tree is odd though, but I'm not
> certain which branches the necessary code would on.
> 
> >> 
> >> Issue is that changing the time in dom0 doesn't take effect on the
> >> VMs until a reboot of dom0.
> >> The testing example below illustrates what I mean....
> >> 
> >> Synopsis of testing:
> >> 
> >> Booted the physical machine, date tells me it's 17:15:45. Hwclock agrees.
> >> Booted a VM (using xl as xm seems to be labouring under the
> >> impression that blockdev is missing - it isn't)
> >> The login prompt displays the time as 17:17, which is the expected
> >> behaviour.
> >> Changed the time in dom0 - (date +%T -s 12:00:00), synced to hwclock.
> >> Check that date and hwclock match - they do.
> >> Destroy the VM and recreate.
> >> The login prompt displays the time as 17:22. Unexpected!
> >> 
> >> 
> >> Kernel: I git cloned tag v3.1 from the kernel.org linux.git, and
> >> applied xen-settime patches
> >> Also tested with jeremy-git-xen-next-2.6.32 (.41/.46) without patch,
> >> they wouldn't apply.
> >> Xen: 4.1.1/4.1.2
> >> Distribution: Gentoo
> >> 
> >> It still doesn't work.
> >> 
> >> I've tested that the issue also exists in Debian Squeeze (with
> >> linux-image-3.0.0 from testing as 2.6.32-5 is broken
> >> on my hardware).
> >> -- 
> >> 
> >> *Niall Fleming BSc. (Hons)*
> >> Systems Administrator
> >> Webanywhere Limited
> >> 
> >> Phone: 0800 862 0131 Ext: 203
> >> Web: http://www.webanywhere.co.uk 
> >> 
> >> Aire Valley Business Centre, Lawkholme Lane, Keighley, BD21 3BB
> >> Registered in England with company number 4881346
> > 
> >> _______________________________________________
> >> Xen-devel mailing list
> >> Xen-devel@lists.xensource.com 
> >> http://lists.xensource.com/xen-devel 
> 
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 11:47:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 11:47:03 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ2Ug-0007mt-My; Mon, 14 Nov 2011 11:47:02 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ0s5-0000rS-O5
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 10:03:32 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1321293780!3508007!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29586 invoked from network); 14 Nov 2011 18:03:01 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-13.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Nov 2011 18:03:01 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAEI2e9U026444
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 14 Nov 2011 18:02:41 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAEI2cwE014440
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 14 Nov 2011 18:02:39 GMT
Received: from abhmt113.oracle.com (abhmt113.oracle.com [141.146.116.65])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAEI2XPe006530; Mon, 14 Nov 2011 12:02:33 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 14 Nov 2011 10:02:33 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 7EDE1814B1; Mon, 14 Nov 2011 13:02:32 -0500 (EST)
Date: Mon, 14 Nov 2011 13:02:32 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH] BZ 1680: Xend fails to start if
	/var/lib/xend/state/*.xml are empty
Message-ID: <20111114180232.GA14875@phenom.dumpdata.com>
References: <76391f599433544ecf3f.1320336263@phenom.dumpdata.com>
	<20161.22029.654901.931472@mariner.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20161.22029.654901.931472@mariner.uk.xensource.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090203.4EC157C1.017D,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, Ian.Campbell@citrix.com,
	m.a.young@durham.ac.uk
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 05:55:25PM +0000, Ian Jackson wrote:
> Konrad Rzeszutek Wilk writes ("[Xen-devel] [PATCH] BZ 1680: Xend fails to start if /var/lib/xend/state/*.xml are empty"):
> > BZ 1680: Xend fails to start if /var/lib/xend/state/*.xml are empty
> 
> We're not really maintaining xend any more but this change is at the
> very worst harmless and I have applied it.

Thanks Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 11:47:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 11:47:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ2VW-00089p-G1; Mon, 14 Nov 2011 11:47:54 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQ0sC-0000sR-ID
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 10:03:42 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-14.tower-216.messagelabs.com!1321293789!3508156!1
X-Originating-IP: [208.97.132.145]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25627 invoked from network); 14 Nov 2011 18:03:09 -0000
Received: from caiajhbdcbef.dreamhost.com (HELO homiemail-a22.g.dreamhost.com)
	(208.97.132.145) by server-14.tower-216.messagelabs.com with SMTP;
	14 Nov 2011 18:03:09 -0000
Received: from homiemail-a22.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a22.g.dreamhost.com (Postfix) with ESMTP id 95D4D1A8069;
	Mon, 14 Nov 2011 10:03:08 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:reply-to
	:mime-version:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.org; b=GzvkFcjT2eGywbnwcABFvic/lhNQxHV3cTtGGdCR+xlH
	oocx9q4r0o3RvoxJ6OWZlZsYHaT5e5ry2DgpXorsT5uGHqivh5lFZ+TDj3UwxMmc
	Y8XI65/m8LYKsCF6jhHbXfQcD1S5r0nZoGKxRj+dqteKwERCusvUb21jlkkNelw=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:reply-to:mime-version:content-type:content-transfer-encoding;
	s=lagarcavilla.org; bh=efjUAuAhKRhkous4qB6vPdUPzps=; b=M4kxeECm
	U7BReDre/C8f07eJ141DjjVHaMXPPDmv/uycGo455xVJEa1YZeJMJWiG+d5/pjEw
	iWghZA+7DhupNjq2cWZJUfsWu8kwpCBKeEUeP8zg5A4MHu/pdqowuAVlfVpEUCR4
	uHEq4GcnGYtD8aNJ2vAwBQFCRcT+Kr6oAWY=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a22.g.dreamhost.com (Postfix) with ESMTPA id 1EA6B1A8061; 
	Mon, 14 Nov 2011 10:03:08 -0800 (PST)
Received: from 206.223.182.18 (proxying for 206.223.182.18)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP;
	Mon, 14 Nov 2011 10:03:08 -0800
Message-ID: <4cb5acd8fa013dc40d5063d61296a319.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <20111110125342.GG62117@ocelot.phlegethon.org>
References: <patchbomb.1320788543@xdev.gridcentric.ca>
	<6203a0549d8a1a21753b.1320788545@xdev.gridcentric.ca>
	<20111110125342.GG62117@ocelot.phlegethon.org>
Date: Mon, 14 Nov 2011 10:03:08 -0800
Subject: Re: [Xen-devel] [PATCH 2 of 3] Make p2m lookups fully synchronized
	wrt modifications
From: "Andres Lagar-Cavilla" <andres@lagarcavilla.org>
To: "Tim Deegan" <tim@xen.org>
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, george.dunlap@eu.citrix.com,
	andres@gridcentric.ca, keir.xen@gmail.com, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: andres@lagarcavilla.org
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi there,
> At 16:42 -0500 on 08 Nov (1320770545), Andres Lagar-Cavilla wrote:
>>  xen/arch/x86/mm/mm-locks.h |  13 +++++++------
>>  xen/arch/x86/mm/p2m.c      |  18 +++++++++++++++++-
>>  xen/include/asm-x86/p2m.h  |  39
>> ++++++++++++++++++++++++---------------
>>  3 files changed, 48 insertions(+), 22 deletions(-)
>>
>>
>> We achieve this by locking/unlocking the global p2m_lock in get/put_gf=
n.
>> This brings about a few consequences for the p2m_lock:
>>
>>  - not ordered anymore in mm-locks.h: unshare does get_gfn -> shr_lock=
,
>>    there are code paths that do paging_lock -> get_gfn. All of these
>>    would cause mm-locks.h to panic.
>
> In that case there's a potential deadlock in the sharing code, and
> turning off the safety catches is not an acceptable response to that. :=
)
>
> ISTR you had a plan to get rid of the shr_lock entirely, or am
> I misremembering?
Sharing is actually fine, I can reorder those safely until I get rid of
the shr_lock. Except for sharing audits, which basically lock the whole
hypervisor, and _no one is using at all_.

I have a more fundamental problem with the paging lock. sh_update_cr3 can
be called from a variety of situations. It will walk the four top level
PAE mappings, acquiring the p2m entry for each, with the paging lock held=
.
This is an inversion & deadlock, if I try to synchronize p2m lookups with
the p2m lock.

Any suggestions here? Other than disabling ordering of the p2m lock?

Thanks
Andres

>
> Tim.
>
>>  - the lock is always taken recursively, as there are many paths that
>>    do get_gfn -> p2m_lock
>>
>> Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
>>
>> diff -r a0c55cc5d696 -r 6203a0549d8a xen/arch/x86/mm/mm-locks.h
>> --- a/xen/arch/x86/mm/mm-locks.h
>> +++ b/xen/arch/x86/mm/mm-locks.h
>> @@ -165,14 +165,15 @@ declare_mm_lock(nestedp2m)
>>
>>  /* P2M lock (per-p2m-table)
>>   *
>> - * This protects all updates to the p2m table.  Updates are expected =
to
>> - * be safe against concurrent reads, which do *not* require the lock.
>> */
>> + * This protects all queries and updates to the p2m table. Because
>> queries
>> + * can happen interleaved with other locks in here, we do not enforce
>> + * ordering, and make all locking recursive. */
>>
>> -declare_mm_lock(p2m)
>> -#define p2m_lock(p)           mm_lock(p2m, &(p)->lock)
>> -#define p2m_lock_recursive(p) mm_lock_recursive(p2m, &(p)->lock)
>> -#define p2m_unlock(p)         mm_unlock(&(p)->lock)
>> +#define p2m_lock(p)           spin_lock_recursive(&(p)->lock.lock)
>> +#define p2m_lock_recursive(p) spin_lock_recursive(&(p)->lock.lock)
>> +#define p2m_unlock(p)         spin_unlock_recursive(&(p)->lock.lock)
>>  #define p2m_locked_by_me(p)   mm_locked_by_me(&(p)->lock)
>> +#define gfn_locked_by_me(p,g) mm_locked_by_me(&(p)->lock)
>>
>>  /* Page alloc lock (per-domain)
>>   *
>> diff -r a0c55cc5d696 -r 6203a0549d8a xen/arch/x86/mm/p2m.c
>> --- a/xen/arch/x86/mm/p2m.c
>> +++ b/xen/arch/x86/mm/p2m.c
>> @@ -158,6 +158,9 @@ mfn_t gfn_to_mfn_type_p2m(struct p2m_dom
>>          return _mfn(gfn);
>>      }
>>
>> +    /* Grab the lock here, don't release until put_gfn */
>> +    p2m_lock(p2m);
>> +
>>      mfn =3D p2m->get_entry(p2m, gfn, t, a, q, page_order);
>>
>>  #ifdef __x86_64__
>> @@ -182,6 +185,19 @@ mfn_t gfn_to_mfn_type_p2m(struct p2m_dom
>>      return mfn;
>>  }
>>
>> +void put_gfn(struct domain *d, unsigned long gfn)
>> +{
>> +    struct p2m_domain *p2m =3D p2m_get_hostp2m(d);
>> +
>> +    if ( !p2m || !paging_mode_translate(d) )
>> +        /* Nothing to do in this case */
>> +        return;
>> +
>> +    ASSERT(p2m_locked_by_me(p2m));
>> +
>> +    p2m_unlock(p2m);
>> +}
>> +
>>  int set_p2m_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mf=
n,
>>                    unsigned int page_order, p2m_type_t p2mt,
>> p2m_access_t p2ma)
>>  {
>> @@ -190,7 +206,7 @@ int set_p2m_entry(struct p2m_domain *p2m
>>      unsigned int order;
>>      int rc =3D 1;
>>
>> -    ASSERT(p2m_locked_by_me(p2m));
>> +    ASSERT(gfn_locked_by_me(p2m, gfn));
>>
>>      while ( todo )
>>      {
>> diff -r a0c55cc5d696 -r 6203a0549d8a xen/include/asm-x86/p2m.h
>> --- a/xen/include/asm-x86/p2m.h
>> +++ b/xen/include/asm-x86/p2m.h
>> @@ -305,9 +305,10 @@ struct p2m_domain *p2m_get_p2m(struct vc
>>
>>  #define p2m_get_pagetable(p2m)  ((p2m)->phys_table)
>>
>> -/**** p2m query accessors. After calling any of the variants below, y=
ou
>> - * need to call put_gfn(domain, gfn). If you don't, you'll lock the
>> - * hypervisor. ****/
>> +/**** p2m query accessors. They lock p2m_lock, and thus serialize
>> + * lookups wrt modifications. They _do not_ release the lock on exit.
>> + * After calling any of the variants below, caller needs to use
>> + * put_gfn. ****/
>>
>>  /* Read a particular P2M table, mapping pages as we go.  Most callers
>>   * should _not_ call this directly; use the other get_gfn* functions
>> @@ -349,19 +350,27 @@ static inline unsigned long get_gfn_unty
>>      return INVALID_MFN;
>>  }
>>
>> -/* This is a noop for now. */
>> -static inline void put_gfn(struct domain *d, unsigned long gfn)
>> -{
>> -}
>> +/* Will release the p2m_lock and put the page behind this mapping. */
>> +void put_gfn(struct domain *d, unsigned long gfn);
>>
>> -/* These are identical for now. The intent is to have the caller not
>> worry
>> - * about put_gfn. To only be used in printk's, crash situations, or t=
o
>> - * peek at a type. You're not holding the p2m entry exclsively after
>> calling
>> - * this. */
>> -#define get_gfn_unlocked(d, g, t)         get_gfn_type((d), (g), (t),
>> p2m_alloc)
>> -#define get_gfn_query_unlocked(d, g, t)   get_gfn_type((d), (g), (t),
>> p2m_query)
>> -#define get_gfn_guest_unlocked(d, g, t)   get_gfn_type((d), (g), (t),
>> p2m_guest)
>> -#define get_gfn_unshare_unlocked(d, g, t) get_gfn_type((d), (g), (t),
>> p2m_unshare)
>> +/* The intent is to have the caller not worry about put_gfn. They app=
ly
>> to
>> + * very specific situations: debug printk's, dumps during a domain
>> crash,
>> + * or to peek at a p2m entry/type. Caller is not holding the p2m entr=
y
>> + * exclusively after calling this. */
>> +#define build_unlocked_accessor(name)
>> \
>> +    static inline mfn_t get_gfn ## name ## _unlocked(struct domain *d=
,
>> \
>> +                                                unsigned long gfn,
>> \
>> +                                                p2m_type_t *t)
>> \
>> +    {
>> \
>> +        mfn_t mfn =3D get_gfn ##name (d, gfn, t);
>> \
>> +        put_gfn(d, gfn);
>> \
>> +        return mfn;
>> \
>> +    }
>> +
>> +build_unlocked_accessor()
>> +build_unlocked_accessor(_query)
>> +build_unlocked_accessor(_guest)
>> +build_unlocked_accessor(_unshare)
>>
>>  /* General conversion function from mfn to gfn */
>>  static inline unsigned long mfn_to_gfn(struct domain *d, mfn_t mfn)
>>
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com
>> http://lists.xensource.com/xen-devel
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 11:48:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 11:48:58 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ2WY-0000C8-El; Mon, 14 Nov 2011 11:48:58 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ10x-0002F1-E8
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 10:12:16 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1321294330!3090756!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5287 invoked from network); 14 Nov 2011 18:12:11 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-6.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Nov 2011 18:12:11 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAEIC312004745
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 14 Nov 2011 18:12:04 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAEIC2d1000442
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 14 Nov 2011 18:12:02 GMT
Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAEIBuFb030449; Mon, 14 Nov 2011 12:11:56 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 14 Nov 2011 10:11:55 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id D71E2814B1; Mon, 14 Nov 2011 13:11:54 -0500 (EST)
Date: Mon, 14 Nov 2011 13:11:54 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH V3 07/10] Introduce Xen PCI Passthrough,
	qdevice (1/3)
Message-ID: <20111114181154.GC14875@phenom.dumpdata.com>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
	<1319814456-8158-8-git-send-email-anthony.perard@citrix.com>
	<20111110212840.GA23643@phenom.dumpdata.com>
	<alpine.DEB.2.00.1111111627430.8085@perard.uk.xensource.com>
	<20111111180542.GA6408@phenom.dumpdata.com>
	<alpine.DEB.2.00.1111141101570.3519@kaball-desktop>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <alpine.DEB.2.00.1111141101570.3519@kaball-desktop>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A020205.4EC159F5.0094,ss=1,re=0.000,fgs=0
Cc: Anthony Perard <anthony.perard@citrix.com>, Guy Zana <guy@neocleus.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Allen Kay <allen.m.kay@intel.com>, QEMU-devel <qemu-devel@nongnu.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 11:09:31AM +0000, Stefano Stabellini wrote:
> On Fri, 11 Nov 2011, Konrad Rzeszutek Wilk wrote:
> > > > > +                hw_error("Internal error: Invalid write emulation "
> > > > > +                         "return value[%d]. I/O emulator exit.\n", rc);
> > > >
> > > > Oh. I hadn't realized this, but you are using hw_error. Which is
> > > > calling 'abort'! Yikes. Is there no way to recover from this? Say return 0xfffff?
> > > 
> > > In qemu-xen-traditionnal, it was an exit(1). I do not know the
> > > consequence of a bad write, and I can not return anythings. So I suppose
> > > that the guest would know that somethings wrong only on the next read.
> > > 
> > > Instead of abort();, I can just do nothing and return. Or we could unplug
> > > the device from QEMU.
> > > 
> > > Any preference?
> > 
> > I think this calls for an experiment. If Linux still functions if you completly
> > unplug the device, then I would say unplug it (b/c in most likelyhood the reason
> > you can't write is b/c the host has unplugged the device).
> 
> It would make sense to try to PCI hot-unplug the device, however
> considering that it requires guest support, it cannot be used to safely
> handle an error like this one. Also it requires some interactions that
> might not be possible anymore at this point.
> I would destroy the domain instead, using a graceful shutdown if
> possible. Something similar to libxl_domain_shutdown.

Sounds good, and we should also print something prudent to the log _why_
we just killed the guest.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 11:52:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 11:52:18 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ2Zl-0001Lb-Lq; Mon, 14 Nov 2011 11:52:17 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ15l-0003M9-E5
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 10:17:13 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1321294630!4143185!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14331 invoked from network); 14 Nov 2011 18:17:10 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-12.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 18:17:10 -0000
X-IronPort-AV: E=Sophos;i="4.69,510,1315180800"; 
   d="scan'208";a="8922312"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 18:17:10 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 14 Nov 2011 18:17:10 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RQ15h-0000DI-UK; Mon, 14 Nov 2011 18:17:09 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RQ15h-0001Mc-Tf;
	Mon, 14 Nov 2011 18:17:09 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20161.23333.686802.820120@mariner.uk.xensource.com>
Date: Mon, 14 Nov 2011 18:17:09 +0000
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH 1 of 2 v2] tools/build: create two new
	variables called APPEND_ and
	PREPEND_ to add compile flags at the beginning or at the end of the
	search path
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <8e4ffea9c9d0e41c0887.1318930197@loki>
References: <patchbomb.1318930196@loki> <8e4ffea9c9d0e41c0887.1318930197@loki>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Roger Pau Monne writes ("[Xen-devel] [PATCH 1 of 2 v2] tools/build: create two new variables called APPEND_ and PREPEND_ to add compile flags at the beginning or at the end of the search path"):
> tools/build: create two new variables called APPEND_ and PREPEND_ to add compile flags at the beginning or at the end of the search path.

Thanks, I applied this (after a build test).

Can you please next time keep your commit message within 70 columns,
including the summary line ?  I reformatted for you.

(Your code lines were quite long too but in general we seem to only
mind overly-long lines in some parts of the Xen tree.)

Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>

Thanks,
Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 11:53:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 11:53:15 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ2ah-0001jB-LR; Mon, 14 Nov 2011 11:53:15 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ16e-0003aK-5a
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 10:18:08 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1321294684!1524609!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12494 invoked from network); 14 Nov 2011 18:18:05 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 18:18:05 -0000
X-IronPort-AV: E=Sophos;i="4.69,510,1315180800"; 
   d="scan'208";a="8922328"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 18:18:04 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 14 Nov 2011 18:18:05 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RQ16a-0000Da-Ds; Mon, 14 Nov 2011 18:18:04 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RQ16a-0001N9-DN;
	Mon, 14 Nov 2011 18:18:04 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20161.23388.301859.716549@mariner.uk.xensource.com>
Date: Mon, 14 Nov 2011 18:18:04 +0000
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH v3] tools/check: check for headers and
	libraries in user defined folders
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <f5e0cd9fa6ee923b8524.1319560622@loki.upc.es>
References: <0a720316685a73e2d5ae.1318930198@loki>
	<f5e0cd9fa6ee923b8524.1319560622@loki.upc.es>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Roger Pau Monne writes ("[Xen-devel] [PATCH v3] tools/check: check for headers and libraries in user defined folders"):
> tools/check: check for headers and libraries in user defined folders.

Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 11:54:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 11:54:31 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ2bv-00027X-FU; Mon, 14 Nov 2011 11:54:31 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ18X-0003y5-Tz
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 10:20:15 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1321294764!63148312!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16496 invoked from network); 14 Nov 2011 18:19:25 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-2.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Nov 2011 18:19:25 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAEIJ99E013893
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 14 Nov 2011 18:19:10 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAEIJ8WL014986
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 14 Nov 2011 18:19:08 GMT
Received: from abhmt112.oracle.com (abhmt112.oracle.com [141.146.116.64])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAEIJ31N032710; Mon, 14 Nov 2011 12:19:03 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 14 Nov 2011 10:19:02 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 03A7F814B1; Mon, 14 Nov 2011 13:19:01 -0500 (EST)
Date: Mon, 14 Nov 2011 13:19:01 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Keir Fraser <keir.xen@gmail.com>
Subject: Re: [Xen-devel] Re: Regression in 3.1 causes Xen to use wrong idle
	routine
Message-ID: <20111114181901.GA14966@phenom.dumpdata.com>
References: <CAJvTdK=yAek4sJFXUp=kQSmnuE=HpgefN5Q-GLWhMXo=LhJ-2A@mail.gmail.com>
	<CAE5A7DE.24C94%keir.xen@gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAE5A7DE.24C94%keir.xen@gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090202.4EC15B9E.019A,ss=1,re=0.000,fgs=0
Cc: "linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefan Bader <stefan.bader@canonical.com>, Len Brown <lenb@kernel.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Sun, Nov 13, 2011 at 04:59:10PM +0000, Keir Fraser wrote:
> On 13/11/2011 03:46, "Len Brown" <lenb@kernel.org> wrote:
> 
> >> The problem I see is that select_idle_routine() is called from
> >> arch/x86/kernel/cpu/common.c and since Xen setup does not set pm_idle
> >> anymore, it can cause mwait_idle or amd_e400_idle functions to be selected.
> >> In testing it seem amd_e400_idle in PVM domU at least does not immediately
> >> cause
> >> problems, but mwait_idle just causes crashes. From the reports I have
> >> this may be related to older hypervisors (3.1 and older) not clearing the
> >> mwait
> >> capability. But overall there seems something wrong in the interaction.
> > 
> > Why is Xen advertising X86_FEATURE_MWAIT and then crashing
> > when the dom0 (or other guests) use what it advertises?
> > 
> > What versions of Xen have this bug?
> 
> Xen doesn't advertise MWAIT. Possibly Xen-pv_ops is lying to the rest of the
> kernel via the cpuid pv_ops hook. This would probably be because Xen is

I can't seem to find anything in there advertising the MWAIT feature.

> relying on the OSPM in dom0 kernel to parse out Cx/Px info which Xen itself
> *can* use.

The Cx/Px patches that would parse the Cx/Px and then percolate those up
to the hypervisor are in mainline. So that is not it.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 11:55:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 11:55:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ2dD-0002WH-S2; Mon, 14 Nov 2011 11:55:51 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ1FS-0005WH-8y
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 10:27:15 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1321295229!4165646!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5814 invoked from network); 14 Nov 2011 18:27:11 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-14.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Nov 2011 18:27:11 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAEIR4sK025705
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 14 Nov 2011 18:27:05 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAEIR3A2027852
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 14 Nov 2011 18:27:04 GMT
Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAEIQwSM009055; Mon, 14 Nov 2011 12:26:58 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 14 Nov 2011 10:26:57 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 137DE814B1; Mon, 14 Nov 2011 13:26:57 -0500 (EST)
Date: Mon, 14 Nov 2011 13:26:56 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Len Brown <lenb@kernel.org>, pradeepv@amazon.com
Subject: Re: [Xen-devel] Re: Regression in 3.1 causes Xen to use wrong idle
	routine
Message-ID: <20111114182656.GB14966@phenom.dumpdata.com>
References: <4EA7DFD1.9060608@canonical.com>
	<CAJvTdK=yAek4sJFXUp=kQSmnuE=HpgefN5Q-GLWhMXo=LhJ-2A@mail.gmail.com>
	<20111114143123.GA8317@phenom.dumpdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111114143123.GA8317@phenom.dumpdata.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090208.4EC15D79.0180,ss=1,re=0.000,fgs=0
Cc: "linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefan Bader <stefan.bader@canonical.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 09:31:24AM -0500, Konrad Rzeszutek Wilk wrote:
> Hey Len,
> 
> > > The problem I see is that select_idle_routine() is called from
> > > arch/x86/kernel/cpu/common.c and since Xen setup does not set pm_idle
> > > anymore, it can cause mwait_idle or amd_e400_idle functions to be selected.
> > > In testing it seem amd_e400_idle in PVM domU at least does not immediately cause
> > > problems, but mwait_idle just causes crashes. From the reports I have
> > > this may be related to older hypervisors (3.1 and older) not clearing the mwait
> > > capability. But overall there seems something wrong in the interaction.
> > 
> > Why is Xen advertising X86_FEATURE_MWAIT and then crashing
> > when the dom0 (or other guests) use what it advertises?
> 
> The only case where I've seen this is with Amazon EC2. The other
> newer hypervisors (4.1.1 and such) do not trigger this.
> 
> > 
> > What versions of Xen have this bug?
> 
> Whatever Amazon is using. I think they are RHEL5 based hypervisor.

Vincent,

Would you have ideas of what might be happening? It looks as if some Amazon
instances are advertisting the MWAIT flag but not really supporting it. Any ideas
of what might be going on?

> 
> > 
> > > I am not really sure whether the logic of calling pm_idle() on all errors from
> > > cpuidle_call_idle() is already flawed or the assumption in the Xen patch about
> > > being able to prevent the wrong idle function by turning cpuidle off is incorrect.
> > 
> > The patches above appear to be operating as intended.
> > What wasn't expected, was that some version of Xen is deployed that
> > advertises the MWAIT feature, but crashes when it is used.
> 
> How does that work with AMD? On those machines it ends up calling
> amd_e400_idle instead of the default_idle. Granted it does not "BUG" out
> but it does lead to extra trap-n-emulate (the MSR operation) in to the hypervisor
> which is not good.

.. snip..
> > Working around this Xen bug for a newly compiled Dom0 is insufficient.

It looks to affect PV guests as well.

> > 
> > All guests that also look for MWAIT support w/o asking ACPI
> > (ie. all versions of Linux that use intel_idle, such as the last few
> > Fedora's, RHEL, SLES etc.)
> > will trip over the same Xen bug, even if Dom0 doesn't.

Don't think I answered this one: 

The intel_idle has not been used in those cases b/c the default_idle
had been used instead.

> > 
> > Xen must not advertises MWAIT support if it doesn't have MWAIT support.
> 
> How does work out when we figure MWAIT support from the CPUID?
> Or are you saying that it is correct - if the CPU advertises it, then yes
> advertise it to the Linux kernel?
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 12:04:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 12:04:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ2lK-0003rG-9m; Mon, 14 Nov 2011 12:04:14 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ1QE-0007nu-8I
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 10:38:22 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1321295897!4836626!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2598 invoked from network); 14 Nov 2011 18:38:19 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-2.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Nov 2011 18:38:19 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAEIcFgL007660
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 14 Nov 2011 18:38:16 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAEIcEJo015870
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 14 Nov 2011 18:38:15 GMT
Received: from abhmt107.oracle.com (abhmt107.oracle.com [141.146.116.59])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAEIc9Qk000712; Mon, 14 Nov 2011 12:38:09 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 14 Nov 2011 10:38:09 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 7848B814B1; Mon, 14 Nov 2011 13:38:07 -0500 (EST)
Date: Mon, 14 Nov 2011 13:38:07 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: "jonathanjstevens@gmail.com" <jonathanjstevens@gmail.com>
Subject: Re: [Xen-devel] HVR-4000 DVB can't scan or tune (properly) with Xen
Message-ID: <20111114183807.GA15284@phenom.dumpdata.com>
References: <CAA7M+FD1mis7C1+cU0eCYZHhu96-B-g7_73FjC430fo4CHohvQ@mail.gmail.com>
	<CAA7M+FBP1SAa2cn9Rfsdcde=ruKekq+tVP1Jnj17RK6qrgvfNw@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CAA7M+FBP1SAa2cn9Rfsdcde=ruKekq+tVP1Jnj17RK6qrgvfNw@mail.gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Content-Transfer-Encoding: quoted-printable
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090203.4EC16018.00B3,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Sun, Nov 13, 2011 at 06:47:14PM +0000, jonathanjstevens@gmail.com wrot=
e:
> I've come across and issue and I think it may be Xen related. Hoping
> you can help.
>=20
> I'm trying to use a couple of HVR-4000 with my Xen server.
>=20
> I'm running Fedora 16:
>=20
> Linux mythtvtuner.home 3.1.0-7.fc16.x86_64 #1 SMP Tue Nov 1 21:10:48
> UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
>=20
> and the current packaged Xen is:
>=20
> (XEN) Xen version 4.1.2 (mockbuild@phx2.fedoraproject.org) (gcc
> version 4.6.1 20111003 (Red Hat 4.6.1-10) (GCC) ) Fri Oct 21 21:56:01
> UTC 2011

Excellent. Everything that is new.

>=20
> When I boot without Xen the DVB PCI cards can tune and scan perfectly.
> I also have a USB DVB unit, which can tune and scan regardless of
> whether Xen is running. However when I try to scan and tune with the
> PCI DVB cards it fails.

OK, and you are _not_ passing it to a guest right?

>=20
> >From what I can tell the symptoms are exactly the same as in:
>=20
> http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=3D1786
>=20
> I get the same "filter timeout" messages, and I also see similar
> messages in dmesg
>=20
> [ =A0 26.572693] cx88[1]/1: IRQ loop detected, disabling interrupts
> [ =A0 26.574810] cx88[1]: irq aud [0x1001] dn_risci1* dn_sync*

Great. Can you do a couple of tests:

1). Boot your Linux machine with 'mem=3D3G' and see if that makes the iss=
ue
    disappear.

2). Tell me what is the 'scan' tool you use? Is it there a command
   line version of the tool that triggers this?

3). Or does this happend when you just load the module and it starts
   doing the IRQ loop detected' thingy?

>=20
> I'm running a higher kernel than in the bug resolution though.
>=20
> Any help appreciated!
>=20
> Regards,
> Jon
>=20
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 12:08:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 12:08:48 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ2pi-0004IM-7N; Mon, 14 Nov 2011 12:08:46 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ1Sz-0008Pf-7R
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 10:41:13 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1321296068!3090701!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32090 invoked from network); 14 Nov 2011 18:41:09 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-12.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Nov 2011 18:41:09 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAEIf4AV011783
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 14 Nov 2011 18:41:05 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAEIf30u021093
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 14 Nov 2011 18:41:04 GMT
Received: from abhmt114.oracle.com (abhmt114.oracle.com [141.146.116.66])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAEIewtJ002861; Mon, 14 Nov 2011 12:40:58 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 14 Nov 2011 10:40:58 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 94F2E814B1; Mon, 14 Nov 2011 13:40:57 -0500 (EST)
Date: Mon, 14 Nov 2011 13:40:57 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 2/4] docs/html/hcall: Annotations for two
	hypercalls
Message-ID: <20111114184057.GB15284@phenom.dumpdata.com>
References: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
	<1321212066-10648-3-git-send-email-ian.jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1321212066-10648-3-git-send-email-ian.jackson@eu.citrix.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090208.4EC160C1.009E,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Sun, Nov 13, 2011 at 07:21:04PM +0000, Ian Jackson wrote:
> Add annotations for a couple of the hypercalls:
>  HYPERVISOR_set_trap_table
>  HYPERVISOR_mmu_update

So I've some comments on the affects of what this hypercall expects
in some details. Where would I put those? In the header file or should
I do it somewhere else?


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 12:32:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 12:32:19 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ3CU-0008Q2-Jl; Mon, 14 Nov 2011 12:32:18 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ1xO-0005A6-O2
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 11:12:41 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1321297955!4205269!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14007 invoked from network); 14 Nov 2011 19:12:35 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 19:12:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,510,1315180800"; 
   d="scan'208";a="8922943"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 19:12:34 +0000
Received: from andrewcoop.uk.xensource.com (10.80.2.18) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 14 Nov 2011 19:12:34 +0000
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: fffb6be8b33b912d672d6ff1c2566525a13eed23
Message-ID: <fffb6be8b33b912d672d.1321297953@andrewcoop.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Mon, 14 Nov 2011 19:12:33 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
To: <xen-devel@lists.xensource.com>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>
Subject: [Xen-devel] [PATCH] KEXEC cleanup: IA64 specific functions should
	not live in generic header files
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>

diff -r 0844b17df7a9 -r fffb6be8b33b xen/arch/ia64/xen/crash.c
--- a/xen/arch/ia64/xen/crash.c	Fri Nov 11 18:14:35 2011 +0000
+++ b/xen/arch/ia64/xen/crash.c	Mon Nov 14 19:12:13 2011 +0000
@@ -15,6 +15,7 @@
 #include <linux/hardirq.h>
 #include <linux/smp.h>
 #include <asm/processor.h>
+#include <asm/kexec.h>
 #include <xen/sched.h>
 
 void machine_crash_shutdown(void)
diff -r 0844b17df7a9 -r fffb6be8b33b xen/include/asm-ia64/kexec.h
--- a/xen/include/asm-ia64/kexec.h	Fri Nov 11 18:14:35 2011 +0000
+++ b/xen/include/asm-ia64/kexec.h	Mon Nov 14 19:12:13 2011 +0000
@@ -10,6 +10,7 @@ extern void relocate_new_kernel(unsigned
                                 unsigned long boot_param,
                                 unsigned long dom0_relocate_new_kernel);
 void crash_save_xen_notes(void);
+void kexec_disable_iosapic(void);
 void machine_kexec(xen_kexec_image_t *image);
 unsigned long kdump_find_rsvd_region(unsigned long size,
                                      struct rsvd_region *rsvd_regions, int n);
diff -r 0844b17df7a9 -r fffb6be8b33b xen/include/xen/kexec.h
--- a/xen/include/xen/kexec.h	Fri Nov 11 18:14:35 2011 +0000
+++ b/xen/include/xen/kexec.h	Mon Nov 14 19:12:13 2011 +0000
@@ -31,7 +31,6 @@ void machine_kexec_reserved(xen_kexec_re
 void machine_reboot_kexec(xen_kexec_image_t *image);
 void machine_kexec(xen_kexec_image_t *image);
 void kexec_crash(void);
-void kexec_disable_iosapic(void);
 void kexec_crash_save_cpu(void);
 crash_xen_info_t *kexec_crash_save_info(void);
 void machine_crash_shutdown(void);

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 12:35:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 12:35:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ3G1-00016z-B0; Mon, 14 Nov 2011 12:35:57 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ2Ae-0005a7-2N
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 11:26:20 -0800
X-Env-Sender: swaplinker@gmail.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1321298775!2555499!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8733 invoked from network); 14 Nov 2011 19:26:16 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-13.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 19:26:16 -0000
Received: by vws13 with SMTP id 13so8080573vws.30
	for <xen-devel@lists.xensource.com>;
	Mon, 14 Nov 2011 11:26:15 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:from:date
	:x-google-sender-auth:message-id:subject:to:cc:content-type
	:content-transfer-encoding;
	bh=7oIsLcHGihT99/pLZ/Q2tDZSQjqdH+b+jz4OfzlbPtc=;
	b=HyeCNNWBxVZahcfLsLHGyfsEW6RQo6WtDtwDBjRt7w8FnAX0hLB9tLA55PCH7SRBXi
	oE33H6LmIF2RtiY1AbD0qfcht2zGEnVpgypLJIPLOhTpRxhP3mTytQLmGAu0nIpd0LIM
	Z0fSBBYwUFfyQvvM99JZ15wGi93CO4E+IiLtE=
Received: by 10.52.17.43 with SMTP id l11mr37927089vdd.28.1321298775055; Mon,
	14 Nov 2011 11:26:15 -0800 (PST)
MIME-Version: 1.0
Received: by 10.52.20.142 with HTTP; Mon, 14 Nov 2011 11:25:54 -0800 (PST)
In-Reply-To: <CAE6C6DF.34049%keir@xen.org>
References: <CAE687A1.24CDF%keir.xen@gmail.com> <CAE6C6DF.34049%keir@xen.org>
From: Julian Pidancet <julian.pidancet@gmail.com>
Date: Mon, 14 Nov 2011 19:25:54 +0000
X-Google-Sender-Auth: 3EYDOqamimC9-QG1fji0Vlrt2ZQ
Message-ID: <CAKZ=5EUxqFjFqbMbkLOxMppTfFHxWgw=6bEagF1BCUO4WQx6Aw@mail.gmail.com>
Subject: Re: [Xen-devel] Re: [PATCH] SeaBIOS/Xen: Compute the low RAM memory
	size in the BDA according to the e820
To: Keir Fraser <keir@xen.org>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Kevin O'Connor <kevin@koconnor.net>, seabios@seabios.org,
	xen-devel@lists.xensource.com, ian.campbell@citrix.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 1:23 PM, Keir Fraser <keir@xen.org> wrote:
> On 14/11/2011 08:53, "Keir Fraser" <keir.xen@gmail.com> wrote:
>
>> On 14/11/2011 03:36, "Kevin O'Connor" <kevin@koconnor.net> wrote:
>>
>>> On Xen, the PCI init code isn't used, so assuming this struct doesn't
>>> need to live in real "ram", I think it could live just about anywhere
>>> past the end of ram. =C2=A0Even with pciinit.c, addresses over 0xfc0000=
0
>>> (with the exception of a few bytes for hpet, apic, ioapic, and bios
>>> image) could be used.
>>
>> I suggest we stick it at FC000000, and shift hvmloader's mem_alloc()
>> starting address up by one page to FC001000. The acpi build code will ha=
ve
>> to manually mem_hole_populate_ram() that one page before writing to it. =
This
>> can then be documented in hvmloader/config.h which contains a descriptio=
n
>> of, and defines for, the system memory map. This is by far the easiest
>> solution to this problem; manually crafting an SSDT is a right pain in t=
he
>> arse, whereas this is maybe a 5-line patch.
>
> Like the attached patch (untested), which is a bit larger than anticipate=
d,
> but actually allows code to be net deleted. :-)
>

I just tested your patch with Windows 7 and Linux guest booted from iPXE.

Everything seems to work fine. SeaBIOS reports the following e820:

(XEN) HVM23: e820 map has 6 items:
(XEN) HVM23:   0: 0000000000000000 - 000000000009f400 =3D 1 RAM
(XEN) HVM23:   1: 000000000009f400 - 00000000000a0000 =3D 2 RESERVED
(XEN) HVM23:   2: 00000000000f0000 - 0000000000100000 =3D 2 RESERVED
(XEN) HVM23:   3: 0000000000100000 - 000000003f7ff000 =3D 1 RAM
(XEN) HVM23:   4: 000000003f7ff000 - 000000003f800000 =3D 2 RESERVED
(XEN) HVM23:   5: 00000000fc000000 - 0000000100000000 =3D 2 RESERVED

The ACPI code in Linux reports the right PCI memory window:

[    0.338966] PCI: Using host bridge windows from ACPI; if necessary,
use "pci=3Dnocrs" and report a bug
[    0.340000] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
[    0.341029] pci_root PNP0A03:00: host bridge window [io  0x0000-0x0cf7]
[    0.341965] pci_root PNP0A03:00: host bridge window [io  0x0d00-0xffff]
[    0.342965] pci_root PNP0A03:00: host bridge window [mem
0x000a0000-0x000bffff]
[    0.343965] pci_root PNP0A03:00: host bridge window [mem
0xf0000000-0xfbffffff]

Can you ship it ?

--=20
Julian

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 12:36:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 12:36:48 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ3Gq-0001dI-1G; Mon, 14 Nov 2011 12:36:48 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ2Bj-0005cF-5t
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 11:27:27 -0800
X-Env-Sender: davem@davemloft.net
X-Msg-Ref: server-13.tower-21.messagelabs.com!1321298842!2184517!1
X-Originating-IP: [198.137.202.13]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28346 invoked from network); 14 Nov 2011 19:27:23 -0000
Received: from shards.monkeyblade.net (HELO shards.monkeyblade.net)
	(198.137.202.13)
	by server-13.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Nov 2011 19:27:23 -0000
Received: from localhost (nat-pool-rdu.redhat.com [66.187.233.202])
	(authenticated bits=0)
	by shards.monkeyblade.net (8.14.4/8.14.4) with ESMTP id pAEJRGKr003252
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 14 Nov 2011 11:27:17 -0800
Date: Mon, 14 Nov 2011 14:27:16 -0500 (EST)
Message-Id: <20111114.142716.615003966880410697.davem@davemloft.net>
To: nhorman@tuxdriver.com
From: David Miller <davem@davemloft.net>
In-Reply-To: <1321298544-16434-1-git-send-email-nhorman@tuxdriver.com>
References: <1321298544-16434-1-git-send-email-nhorman@tuxdriver.com>
X-Mailer: Mew version 6.3 on Emacs 23.2 / Mule 6.0 (HANACHIRUSATO)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.6
	(shards.monkeyblade.net [198.137.202.13]);
	Mon, 14 Nov 2011 11:27:18 -0800 (PST)
Cc: netdev@vger.kernel.org, jeremy.fitzhardinge@citrix.com,
	xen-devel@lists.xensource.com, konrad.wilk@oracle.com
Subject: [Xen-devel] Re: [PATCH] Don't allow sharing of tx skbs on
	xen-netfront
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Neil Horman <nhorman@tuxdriver.com>
Date: Mon, 14 Nov 2011 14:22:24 -0500

> It was pointed out to me recently that the xen-netfront driver can't safely
> support shared skbs on transmit, since, while it doesn't maintain skb state
> directly, it does pass a pointer to the skb to the hypervisor via a list, and
> the hypervisor may expect the contents of the skb to remain stable.  Clearing
> the IFF_TX_SKB_SHARING flag after the call to alloc_etherdev to make it safe.
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>

Please put an appropriate prefix into the subject lines of your patch
submissions.  In this case "[PATCH] xen-netfront: ..." would be appropriate.

I've been letting you get away with this for the past few weeks and I've
decided that it's your turn to start getting this right :-)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 12:37:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 12:37:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ3He-00022T-A3; Mon, 14 Nov 2011 12:37:38 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ2G7-0005lI-UZ
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 11:32:02 -0800
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-3.tower-174.messagelabs.com!1321299115!1527247!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19708 invoked from network); 14 Nov 2011 19:31:56 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-3.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Nov 2011 19:31:56 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:f2de:f1ff:fe5c:34ed])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id C744093E8;
	Mon, 14 Nov 2011 11:31:53 -0800 (PST)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 1B18B20248;
	Mon, 14 Nov 2011 11:31:51 -0800 (PST)
Message-ID: <4EC16CA7.70901@goop.org>
Date: Mon, 14 Nov 2011 11:31:51 -0800
From: Jeremy Fitzhardinge <jeremy@goop.org>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Time Change Issue Xen 4.1
References: <4EBD5AA0.3090906@webanywhere.co.uk>
	<20111111183913.GA9283@phenom.dumpdata.com>
	<4EC0F20D0200007800060B7D@nat28.tlf.novell.com>
	<20111114180045.GA14517@phenom.dumpdata.com>
In-Reply-To: <20111114180045.GA14517@phenom.dumpdata.com>
X-Enigmail-Version: 1.3.3
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: xen-devel@lists.xensource.com, Jan Beulich <JBeulich@suse.com>,
	keir.xen@gmail.com, Niall Fleming <niall.fleming@webanywhere.co.uk>,
	pbonzini@redhat.com, lersek@redhat.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/14/2011 10:00 AM, Konrad Rzeszutek Wilk wrote:
> Right. With those patches too (he used the xen-settime patch set which has it).
> The hypercall is done (and the do_settime gets called) and the results are saved
> in the RTC. And the wc_sec and wc_nsec are updated and propagated.
>
> The problem is that wc_sec and wc_nsec are only propagated to the
> existing guests.
>
> If you launch a new guest after the 'hwclock', the new guests
> retains the old wallclock time.

Existing (pvops) guests shouldn't see updated wallclock time, because
they never look at the hypervisor's wallclock after boot time.

It's surprising that new guests don't see the updated wallclock though. 
That sounds like a Xen issue.

    J

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 12:39:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 12:39:24 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ3JM-0002mE-OX; Mon, 14 Nov 2011 12:39:24 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ2sw-0004iG-Fn
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 12:12:11 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1321301521!3101915!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4245 invoked from network); 14 Nov 2011 20:12:02 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-9.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Nov 2011 20:12:02 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAEKBuj2029122
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 14 Nov 2011 20:11:57 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAEKBtVl018575
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 14 Nov 2011 20:11:55 GMT
Received: from abhmt120.oracle.com (abhmt120.oracle.com [141.146.116.72])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAEKBn87005853; Mon, 14 Nov 2011 14:11:49 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 14 Nov 2011 12:11:49 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id E1C308283D; Mon, 14 Nov 2011 15:11:47 -0500 (EST)
Date: Mon, 14 Nov 2011 15:11:47 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Keir Fraser <keir.xen@gmail.com>
Subject: Re: [Xen-devel] Re: Regression in 3.1 causes Xen to use wrong idle
	routine
Message-ID: <20111114201147.GA9994@phenom.dumpdata.com>
References: <CAJvTdK=yAek4sJFXUp=kQSmnuE=HpgefN5Q-GLWhMXo=LhJ-2A@mail.gmail.com>
	<CAE5A7DE.24C94%keir.xen@gmail.com>
	<20111114181901.GA14966@phenom.dumpdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111114181901.GA14966@phenom.dumpdata.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A020206.4EC1760D.00E5,ss=1,re=0.000,fgs=0
Cc: "linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefan Bader <stefan.bader@canonical.com>, Len Brown <lenb@kernel.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 01:19:01PM -0500, Konrad Rzeszutek Wilk wrote:
> On Sun, Nov 13, 2011 at 04:59:10PM +0000, Keir Fraser wrote:
> > On 13/11/2011 03:46, "Len Brown" <lenb@kernel.org> wrote:
> > 
> > >> The problem I see is that select_idle_routine() is called from
> > >> arch/x86/kernel/cpu/common.c and since Xen setup does not set pm_idle
> > >> anymore, it can cause mwait_idle or amd_e400_idle functions to be selected.
> > >> In testing it seem amd_e400_idle in PVM domU at least does not immediately
> > >> cause
> > >> problems, but mwait_idle just causes crashes. From the reports I have
> > >> this may be related to older hypervisors (3.1 and older) not clearing the
> > >> mwait
> > >> capability. But overall there seems something wrong in the interaction.
> > > 
> > > Why is Xen advertising X86_FEATURE_MWAIT and then crashing
> > > when the dom0 (or other guests) use what it advertises?
> > > 
> > > What versions of Xen have this bug?
> > 
> > Xen doesn't advertise MWAIT. Possibly Xen-pv_ops is lying to the rest of the
> > kernel via the cpuid pv_ops hook. This would probably be because Xen is
> 
> I can't seem to find anything in there advertising the MWAIT feature.
> 
> > relying on the OSPM in dom0 kernel to parse out Cx/Px info which Xen itself
> > *can* use.
> 
> The Cx/Px patches that would parse the Cx/Px and then percolate those up
> to the hypervisor are in mainline. So that is not it.

<sigh> I meant to say "are _not_ in mainline". Sorry for the confusion.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 12:40:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 12:40:11 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ3K7-0003B2-Mu; Mon, 14 Nov 2011 12:40:11 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ2xQ-00053d-AC
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 12:16:47 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1321301801!3089414!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9410 invoked from network); 14 Nov 2011 20:16:41 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-11.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 20:16:41 -0000
Received: by wwp14 with SMTP id 14so4693623wwp.24
	for <xen-devel@lists.xensource.com>;
	Mon, 14 Nov 2011 12:16:41 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=vQlmC+zau9kJgAc/eD5CHTSkGo0eT5v/O6xvqh01UPc=;
	b=me5+nosql33M8FH1XLGnok23TmpvqH9qj4y1KeU4OWZ9I4ivXX7SNSQPEa8HSFmu+w
	cgcKI8JkEUQSV/mrvMmEol7OwJAwdiC3kLiAUVuHBAOs4aWNH3M+DicwkM7ukcoRQIEN
	gJ/pEfQS3fk2d9bbqLt3CbHEoyGAHKV5picGg=
Received: by 10.180.19.9 with SMTP id a9mr26950482wie.32.1321301801126;
	Mon, 14 Nov 2011 12:16:41 -0800 (PST)
Received: from [192.168.1.71]
	(host86-129-245-239.range86-129.btcentralplus.com. [86.129.245.239])
	by mx.google.com with ESMTPS id n2sm12985618wiz.16.2011.11.14.12.16.34
	(version=SSLv3 cipher=OTHER); Mon, 14 Nov 2011 12:16:40 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Mon, 14 Nov 2011 20:16:31 +0000
Subject: Re: [Xen-devel] Re: [PATCH] SeaBIOS/Xen: Compute the low RAM memory
	size in the BDA according to the e820
From: Keir Fraser <keir.xen@gmail.com>
To: Julian Pidancet <julian.pidancet@gmail.com>
Message-ID: <CAE7279F.24D77%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] Re: [PATCH] SeaBIOS/Xen: Compute the low RAM memory
	size in the BDA according to the e820
Thread-Index: AcyjCkwuxKJkOOMEKUKhq0lVkS7nBQ==
In-Reply-To: <CAKZ=5EUxqFjFqbMbkLOxMppTfFHxWgw=6bEagF1BCUO4WQx6Aw@mail.gmail.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="ISO-8859-1"
Content-transfer-encoding: quoted-printable
Cc: Kevin O'Connor <kevin@koconnor.net>, seabios@seabios.org,
	xen-devel@lists.xensource.com, ian.campbell@citrix.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 14/11/2011 19:25, "Julian Pidancet" <julian.pidancet@gmail.com> wrote:

> On Mon, Nov 14, 2011 at 1:23 PM, Keir Fraser <keir@xen.org> wrote:
>> On 14/11/2011 08:53, "Keir Fraser" <keir.xen@gmail.com> wrote:
>>=20
>>> On 14/11/2011 03:36, "Kevin O'Connor" <kevin@koconnor.net> wrote:
>>>=20
>>>> On Xen, the PCI init code isn't used, so assuming this struct doesn't
>>>> need to live in real "ram", I think it could live just about anywhere
>>>> past the end of ram. =A0Even with pciinit.c, addresses over 0xfc00000
>>>> (with the exception of a few bytes for hpet, apic, ioapic, and bios
>>>> image) could be used.
>>>=20
>>> I suggest we stick it at FC000000, and shift hvmloader's mem_alloc()
>>> starting address up by one page to FC001000. The acpi build code will h=
ave
>>> to manually mem_hole_populate_ram() that one page before writing to it.=
 This
>>> can then be documented in hvmloader/config.h which contains a descripti=
on
>>> of, and defines for, the system memory map. This is by far the easiest
>>> solution to this problem; manually crafting an SSDT is a right pain in =
the
>>> arse, whereas this is maybe a 5-line patch.
>>=20
>> Like the attached patch (untested), which is a bit larger than anticipat=
ed,
>> but actually allows code to be net deleted. :-)
>>=20
>=20
> I just tested your patch with Windows 7 and Linux guest booted from iPXE.
>=20
> Everything seems to work fine. SeaBIOS reports the following e820:
>=20
> (XEN) HVM23: e820 map has 6 items:
> (XEN) HVM23:   0: 0000000000000000 - 000000000009f400 =3D 1 RAM
> (XEN) HVM23:   1: 000000000009f400 - 00000000000a0000 =3D 2 RESERVED
> (XEN) HVM23:   2: 00000000000f0000 - 0000000000100000 =3D 2 RESERVED
> (XEN) HVM23:   3: 0000000000100000 - 000000003f7ff000 =3D 1 RAM
> (XEN) HVM23:   4: 000000003f7ff000 - 000000003f800000 =3D 2 RESERVED
> (XEN) HVM23:   5: 00000000fc000000 - 0000000100000000 =3D 2 RESERVED
>=20
> The ACPI code in Linux reports the right PCI memory window:
>=20
> [    0.338966] PCI: Using host bridge windows from ACPI; if necessary,
> use "pci=3Dnocrs" and report a bug
> [    0.340000] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
> [    0.341029] pci_root PNP0A03:00: host bridge window [io  0x0000-0x0cf7=
]
> [    0.341965] pci_root PNP0A03:00: host bridge window [io  0x0d00-0xffff=
]
> [    0.342965] pci_root PNP0A03:00: host bridge window [mem
> 0x000a0000-0x000bffff]
> [    0.343965] pci_root PNP0A03:00: host bridge window [mem
> 0xf0000000-0xfbffffff]
>=20
> Can you ship it ?

Done. Xen-unstable:24143

 Thanks,
 Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 13:50:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 13:50:24 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ4Q2-0006yt-N2; Mon, 14 Nov 2011 13:50:22 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQ4Oz-0006lL-KG
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 13:49:17 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-10.tower-174.messagelabs.com!1321307354!1542909!1
X-Originating-IP: [208.97.132.145]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32007 invoked from network); 14 Nov 2011 21:49:14 -0000
Received: from caiajhbdcbef.dreamhost.com (HELO homiemail-a22.g.dreamhost.com)
	(208.97.132.145) by server-10.tower-174.messagelabs.com with SMTP;
	14 Nov 2011 21:49:14 -0000
Received: from homiemail-a22.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a22.g.dreamhost.com (Postfix) with ESMTP id 55B7E1A808B;
	Mon, 14 Nov 2011 13:49:13 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id:date
	:from:to:cc; q=dns; s=lagarcavilla.org; b=F4JNpewn3iY5ClIERo82zX
	hpJ37toKKwgsf7eqM5Vn/xKKxQqPB1lF4VhJ1qjGDsSHgIJDw5dQqRP+kTxv1j2e
	owOvAIbrnvSJ/k1GFAURsMx1ND293FZkZBBhPSItpT0MZS/fuabEcxfEDuC4peQz
	q/U4jtlla3KO5i08v2GRQ=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:date:from:to:cc; s=lagarcavilla.org; bh=tSbFJsEbdp5Q
	QZSEE/yi7atlZXY=; b=o7u+/cMqQCphmqEEav5Kndjct/JBLdikYrDH0sMpxlmf
	k2ZXgxCZEtMjtWEHBl2pu8vnpQ32+C4X7Sgi7RuInGaejXsZnbj5OAfA6UOjF27U
	gPq7k4NMlJPWVADe1f5IqqjMvgpy6ApkVB1CQSUPfLaACI4yUhtmxqL7OY0+6co=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a22.g.dreamhost.com (Postfix) with ESMTPSA id E17501A8089; 
	Mon, 14 Nov 2011 13:49:11 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1321307321@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 14 Nov 2011 16:48:41 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: olaf@aepfle.de, George.Dunlap@eu.citrix.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 0 of 6] P2M various fixes
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This patch series brings about a number of fixes to the p2m code
in anticipation of synchonizing lookups. Specifically:
- Four bug fixes on shadow domctls, setting shared p2m entries,
  and splitting 1GB PoD superpages
- Rework the p2m audit code. Today it does neither compile nor
  apply to ept, so make it compile and move it out of the way
  for most callers, which obviously don't care.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

 xen/arch/x86/mm/p2m-pod.c   |    1 -
 xen/arch/x86/mm/p2m-pt.c    |    9 +-
 xen/arch/x86/mm/p2m.c       |    5 +-
 xen/arch/x86/mm/hap/hap.c   |    1 +
 tools/libxc/xc_domain.c     |    6 +-
 xen/arch/x86/domctl.c       |   24 +++++++
 xen/arch/x86/mm/p2m-ept.c   |    1 +
 xen/arch/x86/mm/p2m-pod.c   |    5 -
 xen/arch/x86/mm/p2m-pt.c    |  137 +++++++------------------------------------
 xen/arch/x86/mm/p2m.c       |  124 ++++++++++++++++++++++++++++++++++++---
 xen/include/asm-x86/p2m.h   |   11 ++-
 xen/include/public/domctl.h |   12 +++
 tools/libxc/xc_domain.c     |   22 +++++++
 tools/libxc/xenctrl.h       |   27 ++++++++
 14 files changed, 241 insertions(+), 144 deletions(-)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 13:51:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 13:51:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ4R5-0007MQ-I3; Mon, 14 Nov 2011 13:51:27 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQ4P1-0006lP-5T
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 13:49:19 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-13.tower-27.messagelabs.com!1321307337!48249746!1
X-Originating-IP: [208.97.132.207]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3017 invoked from network); 14 Nov 2011 21:48:57 -0000
Received: from caiajhbdccah.dreamhost.com (HELO homiemail-a22.g.dreamhost.com)
	(208.97.132.207) by server-13.tower-27.messagelabs.com with SMTP;
	14 Nov 2011 21:48:57 -0000
Received: from homiemail-a22.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a22.g.dreamhost.com (Postfix) with ESMTP id AB6361A808D;
	Mon, 14 Nov 2011 13:49:14 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=Z8yEgCdOXwt0gv1+ERryfCL1SO2D/Q6a7CAfcZ3Ewnca
	5m+oTGmtt7PuIOU/ocI869s/BDD94sN3bawxdepbdxaLkXIpwdM1YUGNqx3H+pz0
	kc49Ht+xsj/6lDtL0B9WipmqIQ1+ljVmt7T4Pr+5cWe5Bn2aQKwqUHdTSWzK1sI=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=lO/Uuxx8oUH7LuA+81b+hjpF69Q=; b=uECcC0kspdh
	dN10UhSxz0JEAb0idgOlbz4dhx9WC3xiPTioKWu1988gIgJVN+X6jFsKQlZgCvJA
	/r5B1+BqwT+eAnu4h6RMlvQyN61tRA37l0dcwWl+dQWeWqDXz/5DHIFTW4iI18iG
	d5wltFkkk9l3A9ckWXwvenc6dAp4DOD8=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a22.g.dreamhost.com (Postfix) with ESMTPSA id 864581A8089; 
	Mon, 14 Nov 2011 13:49:13 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: d9a344a5c1e375befd241339c2621f39810dfc83
Message-Id: <d9a344a5c1e375befd24.1321307322@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1321307321@xdev.gridcentric.ca>
References: <patchbomb.1321307321@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 14 Nov 2011 16:48:42 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: olaf@aepfle.de, George.Dunlap@eu.citrix.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 1 of 6] The PoD code may split a 1GB superpage
 in a potentially unlocked way
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 xen/arch/x86/mm/p2m-pod.c |  1 -
 xen/arch/x86/mm/p2m-pt.c  |  9 ++++++---
 2 files changed, 6 insertions(+), 4 deletions(-)


The path p2m-lookup -> p2m-pt->get_entry -> 1GB PoD superpage ->
pod_demand_populate ends in the pod code performing a p2m_set_entry with
no locks held (in order to split the 1GB superpage into 512 2MB ones)

Further, it calls p2m_unlock after that, which will break the spinlock.

This patch attempts to fix that.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r 0844b17df7a9 -r d9a344a5c1e3 xen/arch/x86/mm/p2m-pod.c
--- a/xen/arch/x86/mm/p2m-pod.c
+++ b/xen/arch/x86/mm/p2m-pod.c
@@ -987,7 +987,6 @@ p2m_pod_demand_populate(struct p2m_domai
         set_p2m_entry(p2m, gfn_aligned, _mfn(0), PAGE_ORDER_2M,
                       p2m_populate_on_demand, p2m->default_access);
         audit_p2m(p2m, 1);
-        p2m_unlock(p2m);
         return 0;
     }
 
diff -r 0844b17df7a9 -r d9a344a5c1e3 xen/arch/x86/mm/p2m-pt.c
--- a/xen/arch/x86/mm/p2m-pt.c
+++ b/xen/arch/x86/mm/p2m-pt.c
@@ -542,10 +542,11 @@ pod_retry_l3:
             /* The read has succeeded, so we know that mapping exists */
             if ( q != p2m_query )
             {
-                if ( !p2m_pod_demand_populate(p2m, gfn, PAGE_ORDER_1G, q) )
+                if ( !p2m_pod_check_and_populate(p2m, gfn,
+                                      (l1_pgentry_t *) &l3e, PAGE_ORDER_1G, q) )
                     goto pod_retry_l3;
                 p2mt = p2m_invalid;
-                printk("%s: Allocate 1GB failed!\n", __func__);
+                gdprintk(XENLOG_ERR, "%s: Allocate 1GB failed!\n", __func__);
                 goto out;
             }
             else
@@ -743,8 +744,10 @@ pod_retry_l3:
             {
                 if ( q != p2m_query )
                 {
-                    if ( !p2m_pod_demand_populate(p2m, gfn, PAGE_ORDER_1G, q) )
+                    if ( !p2m_pod_check_and_populate(p2m, gfn,
+                                      (l1_pgentry_t *) l3e, PAGE_ORDER_1G, q) )
                         goto pod_retry_l3;
+                    gdprintk(XENLOG_ERR, "%s: Allocate 1GB failed!\n", __func__);
                 }
                 else
                     *t = p2m_populate_on_demand;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 13:52:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 13:52:26 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ4S2-0007ju-Hr; Mon, 14 Nov 2011 13:52:26 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQ4P2-0006lh-1t
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 13:49:20 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-8.tower-174.messagelabs.com!1321307356!1528772!1
X-Originating-IP: [208.97.132.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17154 invoked from network); 14 Nov 2011 21:49:16 -0000
Received: from caiajhbdcbhh.dreamhost.com (HELO homiemail-a22.g.dreamhost.com)
	(208.97.132.177) by server-8.tower-174.messagelabs.com with SMTP;
	14 Nov 2011 21:49:16 -0000
Received: from homiemail-a22.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a22.g.dreamhost.com (Postfix) with ESMTP id C9F751A808E;
	Mon, 14 Nov 2011 13:49:15 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=ojBN5mloZgVkHKXhkKCl7b2AQCOFVp/wRvMY0dIm2w86
	PgHy2o0y6QJsYg/E0dCS0sU7ouRSebkCUMn0zHV9QgstteX/Knwsbu+27I4U4d6M
	xdmY7xf1hTANJpEQDE6tYTB8DyoJLAQJrdM4WO3qTGUJvMxGYzbNi6zdEmiUe58=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=ohExxsamZHYo3G3255OV5pJvLKI=; b=sD0a3CfHWRw
	oE3RDS8C1yTjHcTTAfMXVwVs1DfsuVpfSY4HGUaP1l7XVoxhd/TtJZkjDwirNsvW
	1sbO3YSoBKeg09YcooyQH8xXiCSWmff+WRSLRSIU/3/BV//wH5CQQDKOzI0Zn9+x
	MHjkb78RgzQeAq6gwAN+CiW6btk0Cl2E=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a22.g.dreamhost.com (Postfix) with ESMTPSA id E4F4E1A8089; 
	Mon, 14 Nov 2011 13:49:14 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 1ef55d87b4590ff9a8ccc303f1b8bd54d8c25250
Message-Id: <1ef55d87b4590ff9a8cc.1321307323@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1321307321@xdev.gridcentric.ca>
References: <patchbomb.1321307321@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 14 Nov 2011 16:48:43 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: olaf@aepfle.de, George.Dunlap@eu.citrix.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 2 of 6] Fix handling of m2p map in
	set_shared_p2m_entry
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 xen/arch/x86/mm/p2m.c |  5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)


When updating a p2m mapping to shared, previous code
unconditionally set the m2p entry for the old mfn to invalid.
We now check that the old mfn does not remain shared.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r d9a344a5c1e3 -r 1ef55d87b459 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -714,8 +714,9 @@ set_shared_p2m_entry(struct domain *d, u
      * sharable first */
     ASSERT(p2m_is_shared(ot));
     ASSERT(mfn_valid(omfn));
-    /* XXX: M2P translations have to be handled properly for shared pages */
-    set_gpfn_from_mfn(mfn_x(omfn), INVALID_M2P_ENTRY);
+    if ( ((mfn_to_page(omfn)->u.inuse.type_info & PGT_type_mask) 
+                    != PGT_shared_page) )
+        set_gpfn_from_mfn(mfn_x(omfn), INVALID_M2P_ENTRY);
 
     P2M_DEBUG("set shared %lx %lx\n", gfn, mfn_x(mfn));
     rc = set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_shared, p2m->default_access);

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 13:53:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 13:53:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ4Sn-00087D-AX; Mon, 14 Nov 2011 13:53:13 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQ4P3-0006lm-0k
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 13:49:22 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-7.tower-216.messagelabs.com!1321307357!3526119!1
X-Originating-IP: [208.97.132.207]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28375 invoked from network); 14 Nov 2011 21:49:17 -0000
Received: from caiajhbdccah.dreamhost.com (HELO homiemail-a22.g.dreamhost.com)
	(208.97.132.207) by server-7.tower-216.messagelabs.com with SMTP;
	14 Nov 2011 21:49:17 -0000
Received: from homiemail-a22.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a22.g.dreamhost.com (Postfix) with ESMTP id 1976C1A808B;
	Mon, 14 Nov 2011 13:49:17 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=W/l89CRbM7LUv9iOe0+MIBDVbMXpdNiSOT6LBCcanM60
	2KT9i/HFi0qKG/9bOKESXIRNKTDP7KJESVs9EQ9P7uztDQwBCweLLJNlcHewst6i
	HPjIuaBcossmWVT62oL65f468bxpfxtur/DrsPCCdnygpLcvBMHw7q70nZgNO1U=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=AsBKcCtRWaGTRCiqkLvfiL8EkjE=; b=L+xfbQozXei
	Sybd/iTT+VezoyywDKlEX+flAJPg9Fxr+ij62D1lXUxMP5zX76R9hvie8u4+e+e8
	73WeDR5XinWDj51/FNM8ih8amITR7RtZ4LOLOLB48wXTDjPJymeuFN4egcGt/N/e
	phqRZQJt8MNdsEwDzUh5S7qkmg7fQdms=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a22.g.dreamhost.com (Postfix) with ESMTPSA id 0F4741A8089; 
	Mon, 14 Nov 2011 13:49:15 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 43dd4fdbf53935a4256835f0592fffc55a9b1951
Message-Id: <43dd4fdbf53935a42568.1321307324@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1321307321@xdev.gridcentric.ca>
References: <patchbomb.1321307321@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 14 Nov 2011 16:48:44 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: olaf@aepfle.de, George.Dunlap@eu.citrix.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 3 of 6] Make HAP log dirty disable return the
	correct rc
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 xen/arch/x86/mm/hap/hap.c |  1 +
 1 files changed, 1 insertions(+), 0 deletions(-)


Disabling log dirty mode in HAP always returns -EINVAL. Make it
return the correct rc on success.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r 1ef55d87b459 -r 43dd4fdbf539 xen/arch/x86/mm/hap/hap.c
--- a/xen/arch/x86/mm/hap/hap.c
+++ b/xen/arch/x86/mm/hap/hap.c
@@ -709,6 +709,7 @@ int hap_domctl(struct domain *d, xen_dom
         return rc;
     case XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION:
         sc->mb = hap_get_allocation(d);
+    case XEN_DOMCTL_SHADOW_OP_OFF:
         return 0;
     default:
         HAP_ERROR("Bad hap domctl op %u\n", sc->op);

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 13:54:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 13:54:04 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ4Tc-0008Uc-BX; Mon, 14 Nov 2011 13:54:04 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQ4P4-0006lr-Mb
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 13:49:23 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-3.tower-174.messagelabs.com!1321307359!1537671!1
X-Originating-IP: [208.97.132.145]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9240 invoked from network); 14 Nov 2011 21:49:19 -0000
Received: from caiajhbdcbef.dreamhost.com (HELO homiemail-a22.g.dreamhost.com)
	(208.97.132.145) by server-3.tower-174.messagelabs.com with SMTP;
	14 Nov 2011 21:49:19 -0000
Received: from homiemail-a22.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a22.g.dreamhost.com (Postfix) with ESMTP id B2E691A808D;
	Mon, 14 Nov 2011 13:49:18 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=IXslYFgqIyAoJDGNtzPPT1SSkUMmkySaibPoDHtx1uaS
	eoyRJ6bMZJhrK0ckhX6Y5mwIc8OtlM8E34tHHnYC4dCa5DYlOKZh89S8dxm9ddpj
	8ewoy1TUlyawDiHZA+VbJDL7WLP9szEltcJdm1jAHri1IrGeUkTcxNX83iqUT/o=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=UCgQGfavCe+pefGhF8nkwIW/LwE=; b=GnStGLclJGk
	KxuaseK850EciiUJCmNGhmwL8yaxWkE06aK79Ws7DgrUIBzmq1LPEt1jdzKm1kkn
	XhYWg2+GrGJBZmEP/xrLp+sto+jJEtVYe4mQR2OfFEdeTiKqp/NvRpuF1xaM4C+n
	kzVi1WcC9ksMDOmVPBp1WwB+WjtlVz1c=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a22.g.dreamhost.com (Postfix) with ESMTPSA id 7C8201A8089; 
	Mon, 14 Nov 2011 13:49:17 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: f11528df1df311f0d57981cec67b655cd7be9419
Message-Id: <f11528df1df311f0d579.1321307325@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1321307321@xdev.gridcentric.ca>
References: <patchbomb.1321307321@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 14 Nov 2011 16:48:45 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: olaf@aepfle.de, George.Dunlap@eu.citrix.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 4 of 6] When passing no bitmap for the shadow
 log dirty bitmap clean up, we should not get EFAULT
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 tools/libxc/xc_domain.c |  2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)


This is due to a stale check for guest_handle_null in the hypervisor, which doesn't
necessarily work with the hypercall buffers.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r 43dd4fdbf539 -r f11528df1df3 tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c
+++ b/tools/libxc/xc_domain.c
@@ -430,6 +430,8 @@ int xc_shadow_control(xc_interface *xch,
     DECLARE_DOMCTL;
     DECLARE_HYPERCALL_BUFFER_ARGUMENT(dirty_bitmap);
 
+    memset(&domctl, 0, sizeof(domctl));
+
     domctl.cmd = XEN_DOMCTL_shadow_op;
     domctl.domain = (domid_t)domid;
     domctl.u.shadow_op.op     = sop;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 13:54:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 13:54:56 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ4US-0000QS-Ap; Mon, 14 Nov 2011 13:54:56 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQ4P8-0006m1-C5
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 13:49:28 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-15.tower-21.messagelabs.com!1321307362!4174622!1
X-Originating-IP: [208.97.132.66]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20200 invoked from network); 14 Nov 2011 21:49:22 -0000
Received: from caiajhbdcagg.dreamhost.com (HELO homiemail-a22.g.dreamhost.com)
	(208.97.132.66) by server-15.tower-21.messagelabs.com with SMTP;
	14 Nov 2011 21:49:22 -0000
Received: from homiemail-a22.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a22.g.dreamhost.com (Postfix) with ESMTP id 358731A808D;
	Mon, 14 Nov 2011 13:49:21 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=rjg3SH9Y5vrh31TBDOmYUbY5qMigoVHI2JiU0REcKzZv
	QQT3IkDLhMkeLAcSDyR+KGDuv7wlcSIWPr/d0dj3XwEX2bTEhi/zrjbOnLcaXjKL
	Hqy6312IECF6nkqvnk5xpqHySf58hI8G55XZgOCLiLRx7y1/DbABfjnncwQZOIk=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=7+fAybNqMfXBFuFEvOUqraK7CPk=; b=hP1986VRJtv
	jVIB8lRC/POinLxriNDXbQh0Lpzs8J/Pwrx6yMom8uxWiqCblidsb0ZAnzh1V+ef
	Qf6mOLv36hqze0RnDzGgz1C6597eWgte6ZlAnO85WHeL2yxHS+02n51gO5JsbDNc
	futphOdspDEIXQrlpn/xHIe6auR3sjqc=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a22.g.dreamhost.com (Postfix) with ESMTPSA id 646381A8089; 
	Mon, 14 Nov 2011 13:49:20 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 1f9e4cde0093d785dee3a2804b167ba228faf017
Message-Id: <1f9e4cde0093d785dee3.1321307327@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1321307321@xdev.gridcentric.ca>
References: <patchbomb.1321307321@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 14 Nov 2011 16:48:47 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: olaf@aepfle.de, George.Dunlap@eu.citrix.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 6 of 6] Add libxc wrapper for p2m audit domctl
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 tools/libxc/xc_domain.c |  22 ++++++++++++++++++++++
 tools/libxc/xenctrl.h   |  27 +++++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 0 deletions(-)


Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r 764e0872dd4f -r 1f9e4cde0093 tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c
+++ b/tools/libxc/xc_domain.c
@@ -1472,6 +1472,28 @@ int xc_domain_debug_control(xc_interface
     return do_domctl(xc, &domctl);
 }
 
+int xc_domain_p2m_audit(xc_interface *xch, 
+                        uint32_t domid,
+                        uint64_t *orphans_debug,
+                        uint64_t *orphans_invalid,
+                        uint64_t *m2p_bad,   
+                        uint64_t *p2m_bad)
+{
+    DECLARE_DOMCTL;
+    int rc;
+
+    domctl.cmd = XEN_DOMCTL_audit_p2m;
+    domctl.domain = domid;
+    rc = do_domctl(xch, &domctl);
+
+    *orphans_debug      = domctl.u.audit_p2m.orphans_debug;
+    *orphans_invalid    = domctl.u.audit_p2m.orphans_invalid;
+    *m2p_bad            = domctl.u.audit_p2m.m2p_bad;
+    *p2m_bad            = domctl.u.audit_p2m.p2m_bad;
+
+    return rc;
+}
+
 int xc_domain_set_access_required(xc_interface *xch,
                                   uint32_t domid,
                                   unsigned int required)
diff -r 764e0872dd4f -r 1f9e4cde0093 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h
+++ b/tools/libxc/xenctrl.h
@@ -712,6 +712,33 @@ int xc_domain_setdebugging(xc_interface 
                            unsigned int enable);
 
 /**
+ * This function audits the (top level) p2m of a domain 
+ * and returns the different error counts, if any.
+ *
+ * @parm xch a handle to an open hypervisor interface
+ * @parm domid the domain id whose top level p2m we 
+ *       want to audit
+ * @parm orphans_debug count of m2p entries for valid
+ *       domain pages containing a debug value
+ * @parm orphans_invalid count of m2p entries for valid
+ *       domain pages containing an invalid value
+ * @parm m2p_bad count of m2p entries mismatching the
+ *       associated p2m entry for this domain
+ * @parm p2m_bad count of p2m entries for this domain
+ *       mismatching the associated m2p entry
+ * return 0 on success, -1 on failure
+ * errno values on failure include: 
+ *          -ENOSYS: not implemented
+ *          -EFAULT: could not copy results back to guest
+ */
+int xc_domain_p2m_audit(xc_interface *xch,
+				        uint32_t domid,
+                        uint64_t *orphans_debug,
+                        uint64_t *orphans_invalid,
+                        uint64_t *m2p_bad,   
+                        uint64_t *p2m_bad);
+
+/**
  * This function sets or clears the requirement that an access memory
  * event listener is required on the domain.
  *

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 13:55:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 13:55:59 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ4VS-0000oY-HJ; Mon, 14 Nov 2011 13:55:59 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQ4P7-0006m0-PH
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 13:49:27 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-8.tower-21.messagelabs.com!1321307361!4218124!1
X-Originating-IP: [208.97.132.81]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12639 invoked from network); 14 Nov 2011 21:49:21 -0000
Received: from caiajhbdcaib.dreamhost.com (HELO homiemail-a22.g.dreamhost.com)
	(208.97.132.81) by server-8.tower-21.messagelabs.com with SMTP;
	14 Nov 2011 21:49:21 -0000
Received: from homiemail-a22.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a22.g.dreamhost.com (Postfix) with ESMTP id 31DF81A808B;
	Mon, 14 Nov 2011 13:49:20 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=SaNaHvlt4UAxJdlJfVtWuoe4czwk3N+2nwRING8qrWZ/
	qsxmcGboKPAeANZ+Bz3aK3Cn0OA0IuwtwiFfAHN4O5Ss8+JaWHXg21ZuLzjcsJFI
	25k8m8ZkgZSLlB6DtW9N2+d16kxw03J9IIw2VTAhUaObfhfQMhoK2Ql4NSY/lJc=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=6JtxFoQnw2L8KcTuAAE2mWODHhk=; b=KBFqsDI1lFE
	u7ZXVbaEJJPPI5DVWhw+J5Q30CKLODUkWl1pAUc3dS2virz6Hshxvh8R2H7cRVGr
	tF/fpTf9KUnbgXA2YmyYvC4O1WqnFHae98aKTHRgiwdDNZDu7i64mMRc1U4x2OKX
	BBlmBx/kwT9yt7yrz34eenjpmI41UyH4=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a22.g.dreamhost.com (Postfix) with ESMTPSA id F21EB1A8089; 
	Mon, 14 Nov 2011 13:49:18 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 764e0872dd4f50c70fbc11d96508ea57ff88b0c2
Message-Id: <764e0872dd4f50c70fbc.1321307326@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1321307321@xdev.gridcentric.ca>
References: <patchbomb.1321307321@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 14 Nov 2011 16:48:46 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: olaf@aepfle.de, George.Dunlap@eu.citrix.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 5 of 6] Rework stale p2m auditing
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 xen/arch/x86/domctl.c       |   24 +++++++
 xen/arch/x86/mm/p2m-ept.c   |    1 +
 xen/arch/x86/mm/p2m-pod.c   |    5 -
 xen/arch/x86/mm/p2m-pt.c    |  137 +++++++------------------------------------
 xen/arch/x86/mm/p2m.c       |  124 ++++++++++++++++++++++++++++++++++++---
 xen/include/asm-x86/p2m.h   |   11 ++-
 xen/include/public/domctl.h |   12 +++
 7 files changed, 180 insertions(+), 134 deletions(-)


The p2m audit code doesn't even compile, let alone work. It also
partially supports ept. Make it:

- compile
- lay groundwork for eventual ept support
- move out of the way of all calls and turn it into a domctl. It's
  obviously not being used by anybody presently.
- enable it via said domctl

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r f11528df1df3 -r 764e0872dd4f xen/arch/x86/domctl.c
--- a/xen/arch/x86/domctl.c
+++ b/xen/arch/x86/domctl.c
@@ -1449,6 +1449,30 @@ long arch_do_domctl(
     break;
 #endif /* __x86_64__ */
 
+    case XEN_DOMCTL_audit_p2m:
+    {
+        struct domain *d;
+
+        ret = -ESRCH;
+        d = rcu_lock_domain_by_id(domctl->domain);
+        if ( d != NULL )
+        {
+#if P2M_AUDIT
+            audit_p2m(d,
+                      &domctl->u.audit_p2m.orphans_debug,
+                      &domctl->u.audit_p2m.orphans_invalid,
+                      &domctl->u.audit_p2m.m2p_bad,
+                      &domctl->u.audit_p2m.p2m_bad);
+            ret = (copy_to_guest(u_domctl, domctl, 1)) ?
+                    -EFAULT : 0;
+#else
+            ret = -ENOSYS;
+#endif /* P2M_AUDIT */
+            rcu_unlock_domain(d);
+        }
+    }
+    break;
+
     case XEN_DOMCTL_set_access_required:
     {
         struct domain *d;
diff -r f11528df1df3 -r 764e0872dd4f xen/arch/x86/mm/p2m-ept.c
--- a/xen/arch/x86/mm/p2m-ept.c
+++ b/xen/arch/x86/mm/p2m-ept.c
@@ -817,6 +817,7 @@ void ept_p2m_init(struct p2m_domain *p2m
     p2m->set_entry = ept_set_entry;
     p2m->get_entry = ept_get_entry;
     p2m->change_entry_type_global = ept_change_entry_type_global;
+    p2m->audit_p2m = NULL;
 }
 
 static void ept_dump_p2m_table(unsigned char key)
diff -r f11528df1df3 -r 764e0872dd4f xen/arch/x86/mm/p2m-pod.c
--- a/xen/arch/x86/mm/p2m-pod.c
+++ b/xen/arch/x86/mm/p2m-pod.c
@@ -522,7 +522,6 @@ p2m_pod_decrease_reservation(struct doma
     steal_for_cache =  ( p2m->pod.entry_count > p2m->pod.count );
 
     p2m_lock(p2m);
-    audit_p2m(p2m, 1);
 
     if ( unlikely(d->is_dying) )
         goto out_unlock;
@@ -616,7 +615,6 @@ out_entry_check:
     }
 
 out_unlock:
-    audit_p2m(p2m, 1);
     p2m_unlock(p2m);
 
 out:
@@ -986,7 +984,6 @@ p2m_pod_demand_populate(struct p2m_domai
          */
         set_p2m_entry(p2m, gfn_aligned, _mfn(0), PAGE_ORDER_2M,
                       p2m_populate_on_demand, p2m->default_access);
-        audit_p2m(p2m, 1);
         return 0;
     }
 
@@ -1108,7 +1105,6 @@ guest_physmap_mark_populate_on_demand(st
         return rc;
 
     p2m_lock(p2m);
-    audit_p2m(p2m, 1);
 
     P2M_DEBUG("mark pod gfn=%#lx\n", gfn);
 
@@ -1142,7 +1138,6 @@ guest_physmap_mark_populate_on_demand(st
         BUG_ON(p2m->pod.entry_count < 0);
     }
 
-    audit_p2m(p2m, 1);
     p2m_unlock(p2m);
 
 out:
diff -r f11528df1df3 -r 764e0872dd4f xen/arch/x86/mm/p2m-pt.c
--- a/xen/arch/x86/mm/p2m-pt.c
+++ b/xen/arch/x86/mm/p2m-pt.c
@@ -483,7 +483,6 @@ static int p2m_pod_check_and_populate(st
     /* This is called from the p2m lookups, which can happen with or 
      * without the lock hed. */
     p2m_lock_recursive(p2m);
-    audit_p2m(p2m, 1);
 
     /* Check to make sure this is still PoD */
     if ( p2m_flags_to_type(l1e_get_flags(*p2m_entry)) != p2m_populate_on_demand )
@@ -494,7 +493,6 @@ static int p2m_pod_check_and_populate(st
 
     r = p2m_pod_demand_populate(p2m, gfn, order, q);
 
-    audit_p2m(p2m, 1);
     p2m_unlock(p2m);
 
     return r;
@@ -975,118 +973,23 @@ static void p2m_change_type_global(struc
 
 }
 
-/* Set up the p2m function pointers for pagetable format */
-void p2m_pt_init(struct p2m_domain *p2m)
+#if P2M_AUDIT
+long p2m_pt_audit_p2m(struct p2m_domain *p2m)
 {
-    p2m->set_entry = p2m_set_entry;
-    p2m->get_entry = p2m_gfn_to_mfn;
-    p2m->change_entry_type_global = p2m_change_type_global;
-    p2m->write_p2m_entry = paging_write_p2m_entry;
-}
-
-
-#if P2M_AUDIT
-/* strict_m2p == 0 allows m2p mappings that don'#t match the p2m. 
- * It's intended for add_to_physmap, when the domain has just been allocated 
- * new mfns that might have stale m2p entries from previous owners */
-void audit_p2m(struct p2m_domain *p2m, int strict_m2p)
-{
-    struct page_info *page;
-    struct domain *od;
-    unsigned long mfn, gfn, m2pfn, lp2mfn = 0;
     int entry_count = 0;
-    mfn_t p2mfn;
-    unsigned long orphans_d = 0, orphans_i = 0, mpbad = 0, pmbad = 0;
+    unsigned long pmbad = 0;
+    unsigned long mfn, gfn, m2pfn;
     int test_linear;
-    p2m_type_t type;
     struct domain *d = p2m->domain;
 
-    if ( !paging_mode_translate(d) )
-        return;
-
-    //P2M_PRINTK("p2m audit starts\n");
+    ASSERT(p2m_locked_by_me(p2m));
 
     test_linear = ( (d == current->domain)
                     && !pagetable_is_null(current->arch.monitor_table) );
     if ( test_linear )
         flush_tlb_local();
 
-    spin_lock(&d->page_alloc_lock);
-
-    /* Audit part one: walk the domain's page allocation list, checking
-     * the m2p entries. */
-    page_list_for_each ( page, &d->page_list )
-    {
-        mfn = mfn_x(page_to_mfn(page));
-
-        // P2M_PRINTK("auditing guest page, mfn=%#lx\n", mfn);
-
-        od = page_get_owner(page);
-
-        if ( od != d )
-        {
-            P2M_PRINTK("wrong owner %#lx -> %p(%u) != %p(%u)\n",
-                       mfn, od, (od?od->domain_id:-1), d, d->domain_id);
-            continue;
-        }
-
-        gfn = get_gpfn_from_mfn(mfn);
-        if ( gfn == INVALID_M2P_ENTRY )
-        {
-            orphans_i++;
-            //P2M_PRINTK("orphaned guest page: mfn=%#lx has invalid gfn\n",
-            //               mfn);
-            continue;
-        }
-
-        if ( gfn == 0x55555555 || gfn == 0x5555555555555555 )
-        {
-            orphans_d++;
-            //P2M_PRINTK("orphaned guest page: mfn=%#lx has debug gfn\n",
-            //               mfn);
-            continue;
-        }
-
-        if ( gfn == SHARED_M2P_ENTRY )
-        {
-            P2M_PRINTK("shared mfn (%lx) on domain page list!\n",
-                    mfn);
-            continue;
-        }
-
-        p2mfn = gfn_to_mfn_type_p2m(p2m, gfn, &type, p2m_query);
-        if ( strict_m2p && mfn_x(p2mfn) != mfn )
-        {
-            mpbad++;
-            P2M_PRINTK("map mismatch mfn %#lx -> gfn %#lx -> mfn %#lx"
-                       " (-> gfn %#lx)\n",
-                       mfn, gfn, mfn_x(p2mfn),
-                       (mfn_valid(p2mfn)
-                        ? get_gpfn_from_mfn(mfn_x(p2mfn))
-                        : -1u));
-            /* This m2p entry is stale: the domain has another frame in
-             * this physical slot.  No great disaster, but for neatness,
-             * blow away the m2p entry. */
-            set_gpfn_from_mfn(mfn, INVALID_M2P_ENTRY);
-        }
-
-        if ( test_linear && (gfn <= p2m->max_mapped_pfn) )
-        {
-            lp2mfn = mfn_x(gfn_to_mfn_type_p2m(p2m, gfn, &type, p2m_query));
-            if ( lp2mfn != mfn_x(p2mfn) )
-            {
-                P2M_PRINTK("linear mismatch gfn %#lx -> mfn %#lx "
-                           "(!= mfn %#lx)\n", gfn, lp2mfn, mfn_x(p2mfn));
-            }
-        }
-
-        // P2M_PRINTK("OK: mfn=%#lx, gfn=%#lx, p2mfn=%#lx, lp2mfn=%#lx\n",
-        //                mfn, gfn, mfn_x(p2mfn), lp2mfn);
-    }
-
-    spin_unlock(&d->page_alloc_lock);
-
-    /* Audit part two: walk the domain's p2m table, checking the entries. */
+    /* Audit part one: walk the domain's p2m table, checking the entries. */
     if ( pagetable_get_pfn(p2m_get_pagetable(p2m)) != 0 )
     {
         l2_pgentry_t *l2e;
@@ -1239,17 +1142,23 @@ void audit_p2m(struct p2m_domain *p2m, i
                entry_count);
         BUG();
     }
-        
-    //P2M_PRINTK("p2m audit complete\n");
-    //if ( orphans_i | orphans_d | mpbad | pmbad )
-    //    P2M_PRINTK("p2m audit found %lu orphans (%lu inval %lu debug)\n",
-    //                   orphans_i + orphans_d, orphans_i, orphans_d);
-    if ( mpbad | pmbad )
-    {
-        P2M_PRINTK("p2m audit found %lu odd p2m, %lu bad m2p entries\n",
-                   pmbad, mpbad);
-        WARN();
-    }
+
+    return pmbad;
 }
 #endif /* P2M_AUDIT */
 
+/* Set up the p2m function pointers for pagetable format */
+void p2m_pt_init(struct p2m_domain *p2m)
+{
+    p2m->set_entry = p2m_set_entry;
+    p2m->get_entry = p2m_gfn_to_mfn;
+    p2m->change_entry_type_global = p2m_change_type_global;
+    p2m->write_p2m_entry = paging_write_p2m_entry;
+#if P2M_AUDIT
+    p2m->audit_p2m = p2m_pt_audit_p2m;
+#else
+    p2m->audit_p2m = NULL;
+#endif
+}
+
+
diff -r f11528df1df3 -r 764e0872dd4f xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -439,9 +439,7 @@ guest_physmap_remove_page(struct domain 
 {
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
     p2m_lock(p2m);
-    audit_p2m(p2m, 1);
     p2m_remove_page(p2m, gfn, mfn, page_order);
-    audit_p2m(p2m, 1);
     p2m_unlock(p2m);
 }
 
@@ -482,7 +480,6 @@ guest_physmap_add_entry(struct domain *d
         return rc;
 
     p2m_lock(p2m);
-    audit_p2m(p2m, 0);
 
     P2M_DEBUG("adding gfn=%#lx mfn=%#lx\n", gfn, mfn);
 
@@ -566,7 +563,6 @@ guest_physmap_add_entry(struct domain *d
         }
     }
 
-    audit_p2m(p2m, 1);
     p2m_unlock(p2m);
 
     return rc;
@@ -656,7 +652,6 @@ set_mmio_p2m_entry(struct domain *d, uns
 
     P2M_DEBUG("set mmio %lx %lx\n", gfn, mfn_x(mfn));
     rc = set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_mmio_direct, p2m->default_access);
-    audit_p2m(p2m, 1);
     p2m_unlock(p2m);
     if ( 0 == rc )
         gdprintk(XENLOG_ERR,
@@ -688,7 +683,6 @@ clear_mmio_p2m_entry(struct domain *d, u
         goto out;
     }
     rc = set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), PAGE_ORDER_4K, p2m_invalid, p2m->default_access);
-    audit_p2m(p2m, 1);
 
 out:
     p2m_unlock(p2m);
@@ -785,7 +779,6 @@ int p2m_mem_paging_nominate(struct domai
 
     /* Fix p2m entry */
     set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_paging_out, a);
-    audit_p2m(p2m, 1);
     ret = 0;
 
  out:
@@ -852,7 +845,6 @@ int p2m_mem_paging_evict(struct domain *
 
     /* Remove mapping from p2m table */
     set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), PAGE_ORDER_4K, p2m_ram_paged, a);
-    audit_p2m(p2m, 1);
 
     /* Clear content before returning the page to Xen */
     scrub_one_page(page);
@@ -946,7 +938,6 @@ void p2m_mem_paging_populate(struct doma
             req.flags |= MEM_EVENT_FLAG_EVICT_FAIL;
 
         set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_paging_in_start, a);
-        audit_p2m(p2m, 1);
     }
     p2m_unlock(p2m);
 
@@ -1014,7 +1005,6 @@ int p2m_mem_paging_prep(struct domain *d
 
     /* Fix p2m mapping */
     set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_paging_in, a);
-    audit_p2m(p2m, 1);
 
     atomic_dec(&d->paged_pages);
 
@@ -1063,7 +1053,6 @@ void p2m_mem_paging_resume(struct domain
         {
             set_p2m_entry(p2m, rsp.gfn, mfn, PAGE_ORDER_4K, p2m_ram_rw, a);
             set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
-            audit_p2m(p2m, 1);
         }
         p2m_unlock(p2m);
     }
@@ -1425,6 +1414,119 @@ unsigned long paging_gva_to_gfn(struct v
     return hostmode->gva_to_gfn(v, hostp2m, va, pfec);
 }
 
+/*** Audit ***/
+
+#if P2M_AUDIT
+void audit_p2m(struct domain *d,
+                uint64_t *orphans_debug,
+                uint64_t *orphans_invalid,
+                uint64_t *m2p_bad,
+                uint64_t *p2m_bad)
+{
+    struct page_info *page;
+    struct domain *od;
+    unsigned long mfn, gfn;
+    mfn_t p2mfn;
+    unsigned long orphans_d = 0, orphans_i = 0, mpbad = 0, pmbad = 0;
+    p2m_access_t p2ma;
+    p2m_type_t type;
+    struct p2m_domain *p2m = p2m_get_hostp2m(d);
+
+    if ( !paging_mode_translate(d) )
+        goto out_p2m_audit;
+
+    P2M_PRINTK("p2m audit starts\n");
+
+    p2m_lock(p2m);
+
+    if (p2m->audit_p2m)
+        pmbad = p2m->audit_p2m(p2m);
+
+    /* Audit part two: walk the domain's page allocation list, checking
+     * the m2p entries. */
+    spin_lock(&d->page_alloc_lock);
+    page_list_for_each ( page, &d->page_list )
+    {
+        mfn = mfn_x(page_to_mfn(page));
+
+        P2M_PRINTK("auditing guest page, mfn=%#lx\n", mfn);
+
+        od = page_get_owner(page);
+
+        if ( od != d )
+        {
+            P2M_PRINTK("wrong owner %#lx -> %p(%u) != %p(%u)\n",
+                       mfn, od, (od?od->domain_id:-1), d, d->domain_id);
+            continue;
+        }
+
+        gfn = get_gpfn_from_mfn(mfn);
+        if ( gfn == INVALID_M2P_ENTRY )
+        {
+            orphans_i++;
+            P2M_PRINTK("orphaned guest page: mfn=%#lx has invalid gfn\n",
+                           mfn);
+            continue;
+        }
+
+        if ( gfn == 0x55555555 || gfn == 0x5555555555555555 )
+        {
+            orphans_d++;
+            P2M_PRINTK("orphaned guest page: mfn=%#lx has debug gfn\n",
+                           mfn);
+            continue;
+        }
+
+        if ( gfn == SHARED_M2P_ENTRY )
+        {
+            P2M_PRINTK("shared mfn (%lx) on domain page list!\n",
+                    mfn);
+            continue;
+        }
+
+        p2mfn = get_gfn_type_access(p2m, gfn, &type, &p2ma, p2m_query, NULL);
+        if ( mfn_x(p2mfn) != mfn )
+        {
+            mpbad++;
+            P2M_PRINTK("map mismatch mfn %#lx -> gfn %#lx -> mfn %#lx"
+                       " (-> gfn %#lx)\n",
+                       mfn, gfn, mfn_x(p2mfn),
+                       (mfn_valid(p2mfn)
+                        ? get_gpfn_from_mfn(mfn_x(p2mfn))
+                        : -1u));
+            /* This m2p entry is stale: the domain has another frame in
+             * this physical slot.  No great disaster, but for neatness,
+             * blow away the m2p entry. */
+            set_gpfn_from_mfn(mfn, INVALID_M2P_ENTRY);
+        }
+        __put_gfn(p2m, gfn);
+
+        P2M_PRINTK("OK: mfn=%#lx, gfn=%#lx, p2mfn=%#lx, lp2mfn=%#lx\n",
+                       mfn, gfn, mfn_x(p2mfn), lp2mfn);
+    }
+    spin_unlock(&d->page_alloc_lock);
+
+    p2m_unlock(p2m);
+ 
+    P2M_PRINTK("p2m audit complete\n");
+    if ( orphans_i | orphans_d | mpbad | pmbad )
+        P2M_PRINTK("p2m audit found %lu orphans (%lu inval %lu debug)\n",
+                       orphans_i + orphans_d, orphans_i, orphans_d);
+    if ( mpbad | pmbad )
+    {
+        P2M_PRINTK("p2m audit found %lu odd p2m, %lu bad m2p entries\n",
+                   pmbad, mpbad);
+        WARN();
+    }
+
+out_p2m_audit:
+    *orphans_debug      = (uint64_t) orphans_d;
+    *orphans_invalid    = (uint64_t) orphans_i;
+    *m2p_bad            = (uint64_t) mpbad;
+    *p2m_bad            = (uint64_t) pmbad;
+}
+#endif /* P2M_AUDIT */
+
 /*
  * Local variables:
  * mode: C
diff -r f11528df1df3 -r 764e0872dd4f xen/include/asm-x86/p2m.h
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -244,6 +244,7 @@ struct p2m_domain {
                                           unsigned long gfn, l1_pgentry_t *p,
                                           mfn_t table_mfn, l1_pgentry_t new,
                                           unsigned int level);
+    long               (*audit_p2m)(struct p2m_domain *p2m);
 
     /* Default P2M access type for each page in the the domain: new pages,
      * swapped in pages, cleared pages, and pages that are ambiquously
@@ -558,13 +559,15 @@ int set_p2m_entry(struct p2m_domain *p2m
 extern void p2m_pt_init(struct p2m_domain *p2m);
 
 /* Debugging and auditing of the P2M code? */
-#define P2M_AUDIT     0
+#define P2M_AUDIT     1
 #define P2M_DEBUGGING 0
 
 #if P2M_AUDIT
-extern void audit_p2m(struct p2m_domain *p2m, int strict_m2p);
-#else
-# define audit_p2m(_p2m, _m2p) do { (void)(_p2m),(_m2p); } while (0)
+extern void audit_p2m(struct domain *d,
+                        uint64_t *orphans_debug,
+                        uint64_t *orphans_invalid,
+                        uint64_t *m2p_bad,
+                        uint64_t *p2m_bad);
 #endif /* P2M_AUDIT */
 
 /* Printouts */
diff -r f11528df1df3 -r 764e0872dd4f xen/include/public/domctl.h
--- a/xen/include/public/domctl.h
+++ b/xen/include/public/domctl.h
@@ -800,6 +800,16 @@ struct xen_domctl_mem_sharing_op {
 typedef struct xen_domctl_mem_sharing_op xen_domctl_mem_sharing_op_t;
 DEFINE_XEN_GUEST_HANDLE(xen_domctl_mem_sharing_op_t);
 
+struct xen_domctl_audit_p2m {
+    /* OUT error counts */
+    uint64_t orphans_debug;
+    uint64_t orphans_invalid;
+    uint64_t m2p_bad;
+    uint64_t p2m_bad;
+};
+typedef struct xen_domctl_audit_p2m xen_domctl_audit_p2m_t;
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_audit_p2m_t);
+
 #if defined(__i386__) || defined(__x86_64__)
 /* XEN_DOMCTL_setvcpuextstate */
 /* XEN_DOMCTL_getvcpuextstate */
@@ -898,6 +908,7 @@ struct xen_domctl {
 #define XEN_DOMCTL_setvcpuextstate               62
 #define XEN_DOMCTL_getvcpuextstate               63
 #define XEN_DOMCTL_set_access_required           64
+#define XEN_DOMCTL_audit_p2m                     65
 #define XEN_DOMCTL_gdbsx_guestmemio            1000
 #define XEN_DOMCTL_gdbsx_pausevcpu             1001
 #define XEN_DOMCTL_gdbsx_unpausevcpu           1002
@@ -951,6 +962,7 @@ struct xen_domctl {
         struct xen_domctl_vcpuextstate      vcpuextstate;
 #endif
         struct xen_domctl_set_access_required access_required;
+        struct xen_domctl_audit_p2m         audit_p2m;
         struct xen_domctl_gdbsx_memio       gdbsx_guest_memio;
         struct xen_domctl_gdbsx_pauseunp_vcpu gdbsx_pauseunp_vcpu;
         struct xen_domctl_gdbsx_domstatus   gdbsx_domstatus;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 14:06:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 14:06:45 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ4ft-0002og-29; Mon, 14 Nov 2011 14:06:45 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQ4Tw-0000Bb-G8
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 13:54:25 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-4.tower-182.messagelabs.com!1321307661!3099811!1
X-Originating-IP: [208.97.132.66]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9501 invoked from network); 14 Nov 2011 21:54:21 -0000
Received: from caiajhbdcagg.dreamhost.com (HELO homiemail-a21.g.dreamhost.com)
	(208.97.132.66) by server-4.tower-182.messagelabs.com with SMTP;
	14 Nov 2011 21:54:21 -0000
Received: from homiemail-a21.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a21.g.dreamhost.com (Postfix) with ESMTP id A1F8B300072;
	Mon, 14 Nov 2011 13:54:20 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id:date
	:from:to:cc; q=dns; s=lagarcavilla.org; b=vmaRQqv/gA38rnVOqUu2e6
	59y48m2uKpixM9nLi0qRxCmKs5lWX81a6/fWDhUk6VCKWW+mm43d94zhz8qinjp3
	Z7qWX+Zvz3ZRowWYmSNZ7/z0izBQ7M4xLWNvPXb8z1Ndkp0F7/DiJqCLnbeVWFN2
	mVovycDg7a8UXq6jJ6H8U=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:date:from:to:cc; s=lagarcavilla.org; bh=9isBF+wFMocF
	XMNDuzR++nrMwVM=; b=gcfv2AaYnB3S5xdJR62NFgRS5lqObIdGAne519zYdxJ5
	9U0XV0QlM1PY6dyEpuinn2kemHu4e+q5eb7Pv5LuvMRuj6bZ2c0bckoRLo4S8r0n
	u7v201VSFJjChdAG8TJ6EkrbQmvX4Jwz1ravnUXhOMQ+p+l2nVx1hM/zyyhy7H0=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a21.g.dreamhost.com (Postfix) with ESMTPSA id 4F7C0300064; 
	Mon, 14 Nov 2011 13:54:20 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1321307631@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 14 Nov 2011 16:53:51 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: andres@gridcentric.ca, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 0 of 2] Fixes for cross-compiling 32 bit tools
	on 64 bit host
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Using this patch series, we routinely compile the entire toolstack 
in 32 bit mode on a 64 bit box, no erros or warnings (compilatio-/
linking-related). Please apply.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Signed-off-by: Adin Scannell <adin@scannell.ca>

 config/x86_32.mk                 |  1 +
 config/x86_64.mk                 |  1 +
 tools/Makefile                   |  8 +++++++-
 tools/blktap/drivers/Makefile    |  1 +
 tools/blktap2/vhd/lib/Makefile   |  1 +
 tools/debugger/gdbsx/Makefile    |  2 +-
 tools/libaio/src/Makefile        |  2 +-
 tools/libfsimage/common/Makefile |  4 ++--
 8 files changed, 15 insertions(+), 5 deletions(-)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 14:09:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 14:09:12 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ4iE-0003Dz-UM; Mon, 14 Nov 2011 14:09:11 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQ4Tx-0000C6-AZ
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 13:54:25 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-7.tower-216.messagelabs.com!1321307661!3526494!1
X-Originating-IP: [208.97.132.202]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8788 invoked from network); 14 Nov 2011 21:54:22 -0000
Received: from caiajhbdccac.dreamhost.com (HELO homiemail-a21.g.dreamhost.com)
	(208.97.132.202) by server-7.tower-216.messagelabs.com with SMTP;
	14 Nov 2011 21:54:22 -0000
Received: from homiemail-a21.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a21.g.dreamhost.com (Postfix) with ESMTP id 40A89300079;
	Mon, 14 Nov 2011 13:54:21 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=YEmGvrVVmAHNUooIjaYqZE3kiH3cyx+1t+XZEhfvYJCY
	TqAm6ul3m8T5+GLSDwXwJfhRRA/2sc9EgZRSNnBZWeU0uaXcYhognN0Y73tV+T/c
	AL3GKlSRT0Y3hKsu/YR19jRzHgvMBm5rX6PaGqzMtrddzz+UkJK7YNN6VbPlwI8=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=qgBiSXacx3YSColozUylLgTCNr4=; b=VDlQHFIzmpb
	6/ofPM7MeJ1MKqWxVhMJkvdOTy/jKC8CIUHPNJwWZtwWQEZ3GYSL95KISKcq7KEV
	gmsf4yQgq4TWxz2mn4lsz7OyrrIGx2RTFnM/JCxWUiqTK4bKjH+7OpkKdSRlBKG1
	XjknDRfCsNOMH8duLVGdpdbPXK/j3bAQ=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a21.g.dreamhost.com (Postfix) with ESMTPSA id D29BA300064; 
	Mon, 14 Nov 2011 13:54:20 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: bf47f7aaf6694e6318dc7408604b47735dae6e37
Message-Id: <bf47f7aaf6694e6318dc.1321307632@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1321307631@xdev.gridcentric.ca>
References: <patchbomb.1321307631@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 14 Nov 2011 16:53:52 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: andres@gridcentric.ca, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 1 of 2] Add linker flags to makefile rules to
 enable cross compiling
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 config/x86_32.mk |  1 +
 config/x86_64.mk |  1 +
 2 files changed, 2 insertions(+), 0 deletions(-)


For cross-compiling, the link step must also include necessary architecture
flags (otherwise there's a mismatch between input objects and the output we're
trying to produce).

Signed-off-by: Adin Scannell <adin@scannell.ca>

diff -r 1f9e4cde0093 -r bf47f7aaf669 config/x86_32.mk
--- a/config/x86_32.mk
+++ b/config/x86_32.mk
@@ -8,6 +8,7 @@ CONFIG_XCUTILS := y
 CONFIG_IOEMU := y
 
 CFLAGS += -m32 -march=i686
+LDFLAGS += -m32 -march=i686
 
 # Use only if calling $(LD) directly.
 LDFLAGS_DIRECT_OpenBSD = _obsd
diff -r 1f9e4cde0093 -r bf47f7aaf669 config/x86_64.mk
--- a/config/x86_64.mk
+++ b/config/x86_64.mk
@@ -9,6 +9,7 @@ CONFIG_XCUTILS := y
 CONFIG_IOEMU := y
 
 CFLAGS += -m64
+LDFLAGS += -m64
 
 LIBLEAFDIR = $(LIBLEAFDIR_x86_64)
 LIBDIR = $(LIBDIR_x86_64)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 14:13:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 14:13:42 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ4ma-0003ff-PV; Mon, 14 Nov 2011 14:13:40 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQ4Ty-0000Cp-VC
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 13:54:27 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-10.tower-21.messagelabs.com!1321307662!4104583!1
X-Originating-IP: [208.97.132.81]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17181 invoked from network); 14 Nov 2011 21:54:22 -0000
Received: from caiajhbdcaib.dreamhost.com (HELO homiemail-a21.g.dreamhost.com)
	(208.97.132.81) by server-10.tower-21.messagelabs.com with SMTP;
	14 Nov 2011 21:54:22 -0000
Received: from homiemail-a21.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a21.g.dreamhost.com (Postfix) with ESMTP id BFD15300072;
	Mon, 14 Nov 2011 13:54:21 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=LrpsXmM295dA2b5d7qm91YXHSPnlvPcHaNM3bqRubED8
	3dr08NBgdoKoNoLe00VwkqIU0KGogZFX11iUUtBNFTX8vkTfIqHdf3ZvdZ8Leigh
	80f/cFsKaLKdM/cBSnzKeywikHHeAWaU5FF/WZBxYN4PzknU9L2geF4rv1vD6Lo=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=QgEW/gLaWNQhRUYgvlUfy5kWsDU=; b=a4LMcc5VSLX
	tuVjE46t5Iz/z/uAQebQbjH2XBG7q365AvKWVdkwQaE7IAS4rnvP6OmZSWGTKrso
	bPNLJbXGWHvamzRGgSuL2j4QS0jBh4xMyaE0EgSt2g3cof2c3hqzV8YtjLGyHd/0
	ff4QRqzQucX+CN3bjpjs1+rgynLoiPTg=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a21.g.dreamhost.com (Postfix) with ESMTPSA id 6D4AC300064; 
	Mon, 14 Nov 2011 13:54:21 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 19a5a2cddad32321f53b0d36617c25e5ab13112d
Message-Id: <19a5a2cddad32321f53b.1321307633@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1321307631@xdev.gridcentric.ca>
References: <patchbomb.1321307631@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 14 Nov 2011 16:53:53 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: andres@gridcentric.ca, adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 2 of 2] Fixes for cross-compiling 32-bit tools
	on 64-bit host
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 tools/Makefile                   |  8 +++++++-
 tools/blktap/drivers/Makefile    |  1 +
 tools/blktap2/vhd/lib/Makefile   |  1 +
 tools/debugger/gdbsx/Makefile    |  2 +-
 tools/libaio/src/Makefile        |  2 +-
 tools/libfsimage/common/Makefile |  4 ++--
 6 files changed, 13 insertions(+), 5 deletions(-)


With this patch a full 32 bit build of the tool set is possible
on a 64 bit host. No errors or warnigns.

Signed-off-by: Adin Scannell <adin@scannell.ca>
Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r bf47f7aaf669 -r 19a5a2cddad3 tools/Makefile
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -74,7 +74,13 @@ distclean: subdirs-distclean
 	rm -rf ioemu-dir ioemu-remote
 
 ifneq ($(XEN_COMPILE_ARCH),$(XEN_TARGET_ARCH))
-IOEMU_CONFIGURE_CROSS ?= --cpu=$(XEN_TARGET_ARCH) \
+ifeq ($(XEN_TARGET_ARCH),x86_32)
+# The qemu build uses i386 instead of x86_32.
+IOEMU_CONFIGURE_CPU ?= --cpu=i386
+else
+IOEMU_CONFIGURE_CPU ?= --cpu=$(XEN_TARGET_ARCH)
+endif
+IOEMU_CONFIGURE_CROSS ?= $(IOEMU_CONFIGURE_CPU) \
 			 --cross-prefix=$(CROSS_COMPILE) \
 			 --interp-prefix=$(CROSS_SYS_ROOT)
 endif
diff -r bf47f7aaf669 -r 19a5a2cddad3 tools/blktap/drivers/Makefile
--- a/tools/blktap/drivers/Makefile
+++ b/tools/blktap/drivers/Makefile
@@ -14,6 +14,7 @@ CFLAGS   += $(CFLAGS_libxenstore)
 CFLAGS   += -I $(LIBAIO_DIR)
 CFLAGS   += -I $(MEMSHR_DIR)
 CFLAGS   += -D_GNU_SOURCE
+CFLAGS   += -D_FILE_OFFSET_BITS=64
 
 ifeq ($(shell . ./check_gcrypt $(CC)),yes)
 CFLAGS += -DUSE_GCRYPT
diff -r bf47f7aaf669 -r 19a5a2cddad3 tools/blktap2/vhd/lib/Makefile
--- a/tools/blktap2/vhd/lib/Makefile
+++ b/tools/blktap2/vhd/lib/Makefile
@@ -18,6 +18,7 @@ CFLAGS          += -I../../include
 CFLAGS          += -D_GNU_SOURCE
 CFLAGS          += -fPIC
 CFLAGS          += -g
+CFLAGS          += -D_FILE_OFFSET_BITS=64
 
 ifeq ($(CONFIG_Linux),y)
 LIBS            := -luuid
diff -r bf47f7aaf669 -r 19a5a2cddad3 tools/debugger/gdbsx/Makefile
--- a/tools/debugger/gdbsx/Makefile
+++ b/tools/debugger/gdbsx/Makefile
@@ -18,7 +18,7 @@ install: all
 	$(INSTALL_PROG) gdbsx $(DESTDIR)$(SBINDIR)/gdbsx
 
 gdbsx: gx/gx_all.a xg/xg_all.a 
-	$(CC) -o $@ $^
+	$(CC) $(LDFLAGS) -o $@ $^
 
 xg/xg_all.a:
 	$(MAKE) -C xg
diff -r bf47f7aaf669 -r 19a5a2cddad3 tools/libaio/src/Makefile
--- a/tools/libaio/src/Makefile
+++ b/tools/libaio/src/Makefile
@@ -6,7 +6,7 @@ includedir=$(prefix)/include
 libdir=$(prefix)/lib
 
 ARCH := $(shell uname -m | sed -e s/i.86/i386/)
-CFLAGS = -nostdlib -nostartfiles -Wall -I. -g -fomit-frame-pointer -O2 -fPIC
+CFLAGS := $(CFLAGS) -nostdlib -nostartfiles -Wall -I. -g -fomit-frame-pointer -O2 -fPIC
 SO_CFLAGS=-shared $(CFLAGS)
 L_CFLAGS=$(CFLAGS)
 LINK_FLAGS=
diff -r bf47f7aaf669 -r 19a5a2cddad3 tools/libfsimage/common/Makefile
--- a/tools/libfsimage/common/Makefile
+++ b/tools/libfsimage/common/Makefile
@@ -4,8 +4,8 @@ include $(XEN_ROOT)/tools/Rules.mk
 MAJOR = 1.0
 MINOR = 0
 
-LDFLAGS-$(CONFIG_SunOS) = -Wl,-M -Wl,mapfile-SunOS
-LDFLAGS-$(CONFIG_Linux) = -Wl,mapfile-GNU
+LDFLAGS-$(CONFIG_SunOS) := $(LDFLAGS) -Wl,-M -Wl,mapfile-SunOS
+LDFLAGS-$(CONFIG_Linux) := $(LDFLAGS) -Wl,mapfile-GNU
 LDFLAGS = $(LDFLAGS-y)
 
 LIB_SRCS-y = fsimage.c fsimage_plugin.c fsimage_grub.c

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 14:16:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 14:16:33 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ4pN-0004An-Ap; Mon, 14 Nov 2011 14:16:33 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQ4Yh-0001aZ-ET
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 13:59:23 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-14.tower-182.messagelabs.com!1321307956!3094899!1
X-Originating-IP: [208.97.132.145]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12764 invoked from network); 14 Nov 2011 21:59:16 -0000
Received: from caiajhbdcbef.dreamhost.com (HELO homiemail-a18.g.dreamhost.com)
	(208.97.132.145) by server-14.tower-182.messagelabs.com with SMTP;
	14 Nov 2011 21:59:16 -0000
Received: from homiemail-a18.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a18.g.dreamhost.com (Postfix) with ESMTP id 1898D25006C;
	Mon, 14 Nov 2011 13:59:15 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id:date
	:from:to:cc; q=dns; s=lagarcavilla.org; b=Ep4BdcOGel66d5KWg1dfdb
	osD7wpnBMRZvonNo2iOYSqas5me021Xr9tYbn6l8zpWfx5+dw/0xz8NHjnFgfDpS
	p6e79hXfvcm77IO1XVDghNoaLdLVcJx37pZYbRJoljomI8DGOZL2aOO98cmwH4dz
	MCrS/cpE7g8wGFH0DBjcE=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:date:from:to:cc; s=lagarcavilla.org; bh=mo8fm69xY+pJ
	1wRH6cp05rhTE4E=; b=gQpYNA8cDsjlrLClmgJsPVF0bh7y63T2DJBUL3t4KStC
	9FsxaB+H49Z60UXY+O9ylQJlHKVOfTw8VkO/G63+O/vodBNu6aK6kriKfL2JOLlB
	miTI1rFdrrDoWf4/Xi/0ZhuX6Kzgo+gdbexz4S1atpT12uYG3SMZx/ERkOpIjFQ=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a18.g.dreamhost.com (Postfix) with ESMTPSA id 6941E250069; 
	Mon, 14 Nov 2011 13:59:14 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1321307910@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 14 Nov 2011 16:58:30 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: andres@gridcentric.ca, keir.xen@gmail.com, tim@xen.org, olaf@aepfle.de,
	adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 0 of 4] Mem event handling improvements
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Several improvements to the mem event interface are included in this 
series. Most notably:

- The ability to trigger resume actions in the hypervisor via an
  event channel kick, as opposed to a domctl. Less locking and more
  batching.

- Improvements to the management of the mem event ring. Improvements 
  on return codes, vcpu pause semantics, and handling of corner 
  cases.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Signed-off-by: Adin Scannell <adin@scannell.ca>
Signed-off-by: Keir Fraser <keir@xen.org>

 xen/arch/x86/hvm/hvm.c          |   21 +++-
 xen/arch/x86/mm/mem_event.c     |  173 +++++++++++++++++++++++++++++----------
 xen/arch/x86/mm/mem_sharing.c   |   27 ++++-
 xen/arch/x86/mm/p2m.c           |  100 ++++++++++++----------
 xen/include/asm-x86/mem_event.h |   16 ++-
 xen/include/xen/sched.h         |    5 +-
 xen/arch/ia64/vmx/vmx_init.c    |    2 +-
 xen/arch/x86/hvm/hvm.c          |    5 +-
 xen/arch/x86/mm/mem_event.c     |    3 +-
 xen/common/event_channel.c      |   75 +++++++++++++---
 xen/include/xen/event.h         |    5 +-
 xen/include/xen/sched.h         |    2 +-
 xen/arch/x86/mm/mem_access.c    |    3 +-
 xen/arch/x86/mm/p2m.c           |    3 +-
 xen/include/asm-x86/p2m.h       |    2 +-
 xen/arch/x86/mm/mem_event.c     |   26 ++++-
 16 files changed, 324 insertions(+), 144 deletions(-)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 14:18:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 14:18:05 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ4qr-0004Yw-IT; Mon, 14 Nov 2011 14:18:05 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQ4Yl-0001bD-3h
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 13:59:26 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-9.tower-21.messagelabs.com!1321307959!4096001!1
X-Originating-IP: [208.97.132.81]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24946 invoked from network); 14 Nov 2011 21:59:19 -0000
Received: from caiajhbdcaib.dreamhost.com (HELO homiemail-a18.g.dreamhost.com)
	(208.97.132.81) by server-9.tower-21.messagelabs.com with SMTP;
	14 Nov 2011 21:59:19 -0000
Received: from homiemail-a18.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a18.g.dreamhost.com (Postfix) with ESMTP id 8B199250069;
	Mon, 14 Nov 2011 13:59:18 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=Z/XFkbnYwSZ7SXZoLaMlI73uQedldOVTm4fvZOUEtqOg
	2GnLXv+jBAShmB3l19nd0n8oWXqCJUDwPSDDFee+sqg6/MrisoyPmwVm1PDfSGAA
	rLGGKNGWXyvtBQkVDrh1hd0zuztliFnutK4qCNzVX45Pqc8dcNb6ZxZiIayq/v0=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=Vl3GfIwuWEPW54WfjiSsQBSP64A=; b=ZMJYgrF+oWd
	RV7cxwwa8u6LeWaHmLeSLV3iUFIxSP6+/ZyHWbNLR53H17mXembQ8xwRB+YIp0qw
	CRyikBUdLPcyGj7IlQAw7cbb9a3MaJhpgB89z2wxE68xeVsRgXB99Kwm7OBEsyMe
	HBSIr5U3DpTWKplmrqrzDzV6G7L72FCY=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a18.g.dreamhost.com (Postfix) with ESMTPSA id A821C25006B; 
	Mon, 14 Nov 2011 13:59:17 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 106296812c3f8981d4b66ba83a25213a724d03f9
Message-Id: <106296812c3f8981d4b6.1321307913@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1321307910@xdev.gridcentric.ca>
References: <patchbomb.1321307910@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 14 Nov 2011 16:58:33 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: andres@gridcentric.ca, keir.xen@gmail.com, tim@xen.org, olaf@aepfle.de,
	adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 3 of 4] Make the prototype of
	p2m_mem_access_resume consistent
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 xen/arch/x86/mm/mem_access.c |  3 +--
 xen/arch/x86/mm/p2m.c        |  3 +--
 xen/include/asm-x86/p2m.h    |  2 +-
 3 files changed, 3 insertions(+), 5 deletions(-)


Signed-off-by: Adin Scannell <adin@scannell.ca>
Signed-off-by: Keir Fraser <keir@xen.org>
Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r b3cdfb5b76d0 -r 106296812c3f xen/arch/x86/mm/mem_access.c
--- a/xen/arch/x86/mm/mem_access.c
+++ b/xen/arch/x86/mm/mem_access.c
@@ -29,13 +29,12 @@ int mem_access_domctl(struct domain *d, 
                       XEN_GUEST_HANDLE(void) u_domctl)
 {
     int rc;
-    struct p2m_domain *p2m = p2m_get_hostp2m(d);
 
     switch( mec->op )
     {
     case XEN_DOMCTL_MEM_EVENT_OP_ACCESS_RESUME:
     {
-        p2m_mem_access_resume(p2m);
+        p2m_mem_access_resume(d);
         rc = 0;
     }
     break;
diff -r b3cdfb5b76d0 -r 106296812c3f xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -1150,9 +1150,8 @@ void p2m_mem_access_check(unsigned long 
     /* VCPU paused */
 }
 
-void p2m_mem_access_resume(struct p2m_domain *p2m)
+void p2m_mem_access_resume(struct domain *d)
 {
-    struct domain *d = p2m->domain;
     mem_event_response_t rsp;
 
     /* Pull all responses off the ring */
diff -r b3cdfb5b76d0 -r 106296812c3f xen/include/asm-x86/p2m.h
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -493,7 +493,7 @@ static inline void p2m_mem_paging_popula
 void p2m_mem_access_check(unsigned long gpa, bool_t gla_valid, unsigned long gla, 
                           bool_t access_r, bool_t access_w, bool_t access_x);
 /* Resumes the running of the VCPU, restarting the last instruction */
-void p2m_mem_access_resume(struct p2m_domain *p2m);
+void p2m_mem_access_resume(struct domain *d);
 
 /* Set access type for a region of pfns.
  * If start_pfn == -1ul, sets the default access type */

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 14:20:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 14:20:30 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ4tB-0004xN-Le; Mon, 14 Nov 2011 14:20:29 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQ4Yj-0001b6-KK
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 13:59:27 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-2.tower-27.messagelabs.com!1321307920!63165779!1
X-Originating-IP: [208.97.132.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 637 invoked from network); 14 Nov 2011 21:58:40 -0000
Received: from caiajhbdcbhh.dreamhost.com (HELO homiemail-a18.g.dreamhost.com)
	(208.97.132.177) by server-2.tower-27.messagelabs.com with SMTP;
	14 Nov 2011 21:58:40 -0000
Received: from homiemail-a18.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a18.g.dreamhost.com (Postfix) with ESMTP id 696C225006C;
	Mon, 14 Nov 2011 13:59:17 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=R25s1sGSDqXPe8sNPR51xqW+qGLOEHypjESy+svQ5JhD
	o+xfvxGRXyp23CHbGkyvkdYNGYtRhfw8PCCVwHWkKzq0Ps4DOMaVmMPo5EXoJGLO
	Gte8a5yUFALaCWK/Td5tdqnw5RZXemmjjTX92FYM62JGqYtk+mht8qoFqxyOx90=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=SpZD0PTOQOBRAP/Rrsyx56dqnhg=; b=lVWBsifpdkE
	8HkQBhrA0Xq73wjmFX41Lz4CBXSM9jV398ZUe1QFpV5CFcW1P4AOf712w0E7J3/S
	5CHBFF3Oav0ECccp5UgiT02f30Qu8UormXdQNjr7RpJ7uA/RE6XSQmcsqwisLi96
	/eGmzSOuzhWxFjCHum1h0CqU/jCd5TBI=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a18.g.dreamhost.com (Postfix) with ESMTPSA id 7A3D825006B; 
	Mon, 14 Nov 2011 13:59:16 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: b3cdfb5b76d0bb00e2b46b0f75722a26c4554336
Message-Id: <b3cdfb5b76d0bb00e2b4.1321307912@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1321307910@xdev.gridcentric.ca>
References: <patchbomb.1321307910@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 14 Nov 2011 16:58:32 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: andres@gridcentric.ca, keir.xen@gmail.com, tim@xen.org, olaf@aepfle.de,
	adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 2 of 4] Create a generic callback mechanism for
 Xen-bound event channels
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 xen/arch/ia64/vmx/vmx_init.c |   2 +-
 xen/arch/x86/hvm/hvm.c       |   5 +-
 xen/arch/x86/mm/mem_event.c  |   3 +-
 xen/common/event_channel.c   |  75 ++++++++++++++++++++++++++++++++++---------
 xen/include/xen/event.h      |   5 ++-
 xen/include/xen/sched.h      |   2 +-
 6 files changed, 69 insertions(+), 23 deletions(-)


For event channels for which Xen is the consumer, there currently is
a single action. With this patch, we allow event channel creators to
specify a generic callback (or no callback). Because the expectation
is that there will be few callbacks, they are stored in a small table.

Signed-off-by: Adin Scannell <adin@scannell.ca>
Signed-off-by: Keir Fraser <keir@xen.org>
Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r ee909e5a9d85 -r b3cdfb5b76d0 xen/arch/ia64/vmx/vmx_init.c
--- a/xen/arch/ia64/vmx/vmx_init.c
+++ b/xen/arch/ia64/vmx/vmx_init.c
@@ -377,7 +377,7 @@ vmx_vcpu_initialise(struct vcpu *v)
 {
 	struct vmx_ioreq_page *iorp = &v->domain->arch.hvm_domain.ioreq;
 
-	int rc = alloc_unbound_xen_event_channel(v, 0);
+	int rc = alloc_unbound_xen_event_channel(v, 0, NULL);
 	if (rc < 0)
 		return rc;
 	v->arch.arch_vmx.xen_port = rc;
diff -r ee909e5a9d85 -r b3cdfb5b76d0 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -979,7 +979,7 @@ int hvm_vcpu_initialise(struct vcpu *v)
         goto fail3;
 
     /* Create ioreq event channel. */
-    rc = alloc_unbound_xen_event_channel(v, 0);
+    rc = alloc_unbound_xen_event_channel(v, 0, NULL);
     if ( rc < 0 )
         goto fail4;
 
@@ -3531,7 +3531,8 @@ long do_hvm_op(unsigned long op, XEN_GUE
                 for_each_vcpu ( d, v )
                 {
                     int old_port, new_port;
-                    new_port = alloc_unbound_xen_event_channel(v, a.value);
+                    new_port = alloc_unbound_xen_event_channel(
+                        v, a.value, NULL);
                     if ( new_port < 0 )
                     {
                         rc = new_port;
diff -r ee909e5a9d85 -r b3cdfb5b76d0 xen/arch/x86/mm/mem_event.c
--- a/xen/arch/x86/mm/mem_event.c
+++ b/xen/arch/x86/mm/mem_event.c
@@ -96,7 +96,8 @@ static int mem_event_enable(struct domai
 
     /* Allocate event channel */
     rc = alloc_unbound_xen_event_channel(d->vcpu[0],
-                                         current->domain->domain_id);
+                                         current->domain->domain_id,
+                                         NULL);
     if ( rc < 0 )
         goto err;
 
diff -r ee909e5a9d85 -r b3cdfb5b76d0 xen/common/event_channel.c
--- a/xen/common/event_channel.c
+++ b/xen/common/event_channel.c
@@ -57,6 +57,51 @@
         goto out;                                                   \
     } while ( 0 )
 
+#define consumer_is_xen(e) (!!(e)->xen_consumer)
+
+/*
+ * The function alloc_unbound_xen_event_channel() allows an arbitrary
+ * notifier function to be specified. However, very few unique functions
+ * are specified in practice, so to prevent bloating the evtchn structure
+ * with a pointer, we stash them dynamically in a small lookup array which
+ * can be indexed by a small integer.
+ */
+static xen_event_channel_notification_t xen_consumers[8];
+
+/* Default notification action: wake up from wait_on_xen_event_channel(). */
+static void default_xen_notification_fn(struct vcpu *v, unsigned int port)
+{
+    /* Consumer needs notification only if blocked. */
+    if ( test_and_clear_bit(_VPF_blocked_in_xen, &v->pause_flags) )
+        vcpu_wake(v);
+}
+
+/*
+ * Given a notification function, return the value to stash in
+ * the evtchn->xen_consumer field.
+ */
+static uint8_t get_xen_consumer(xen_event_channel_notification_t fn)
+{
+    unsigned int i;
+
+    if ( fn == NULL )
+        fn = default_xen_notification_fn;
+
+    for ( i = 0; i < ARRAY_SIZE(xen_consumers); i++ )
+    {
+        if ( xen_consumers[i] == NULL )
+            xen_consumers[i] = fn;
+        if ( xen_consumers[i] == fn )
+            break;
+    }
+
+    BUG_ON(i >= ARRAY_SIZE(xen_consumers));
+    return i+1;
+}
+
+/* Get the notification function for a given Xen-bound event channel. */
+#define xen_notification_fn(e) (xen_consumers[(e)->xen_consumer-1])
+
 static int evtchn_set_pending(struct vcpu *v, int port);
 
 static int virq_is_global(int virq)
@@ -395,7 +440,7 @@ static long __evtchn_close(struct domain
     chn1 = evtchn_from_port(d1, port1);
 
     /* Guest cannot close a Xen-attached event channel. */
-    if ( unlikely(chn1->consumer_is_xen) )
+    if ( unlikely(consumer_is_xen(chn1)) )
     {
         rc = -EINVAL;
         goto out;
@@ -533,7 +578,7 @@ int evtchn_send(struct domain *d, unsign
     lchn = evtchn_from_port(ld, lport);
 
     /* Guest cannot send via a Xen-attached event channel. */
-    if ( unlikely(lchn->consumer_is_xen) )
+    if ( unlikely(consumer_is_xen(lchn)) )
     {
         spin_unlock(&ld->event_lock);
         return -EINVAL;
@@ -550,13 +595,8 @@ int evtchn_send(struct domain *d, unsign
         rport = lchn->u.interdomain.remote_port;
         rchn  = evtchn_from_port(rd, rport);
         rvcpu = rd->vcpu[rchn->notify_vcpu_id];
-        if ( rchn->consumer_is_xen )
-        {
-            /* Xen consumers need notification only if they are blocked. */
-            if ( test_and_clear_bit(_VPF_blocked_in_xen,
-                                    &rvcpu->pause_flags) )
-                vcpu_wake(rvcpu);
-        }
+        if ( consumer_is_xen(rchn) )
+            (*xen_notification_fn(rchn))(rvcpu, rport);
         else
         {
             evtchn_set_pending(rvcpu, rport);
@@ -783,7 +823,7 @@ long evtchn_bind_vcpu(unsigned int port,
     chn = evtchn_from_port(d, port);
 
     /* Guest cannot re-bind a Xen-attached event channel. */
-    if ( unlikely(chn->consumer_is_xen) )
+    if ( unlikely(consumer_is_xen(chn)) )
     {
         rc = -EINVAL;
         goto out;
@@ -994,7 +1034,8 @@ long do_event_channel_op(int cmd, XEN_GU
 
 
 int alloc_unbound_xen_event_channel(
-    struct vcpu *local_vcpu, domid_t remote_domid)
+    struct vcpu *local_vcpu, domid_t remote_domid,
+    xen_event_channel_notification_t notification_fn)
 {
     struct evtchn *chn;
     struct domain *d = local_vcpu->domain;
@@ -1007,7 +1048,7 @@ int alloc_unbound_xen_event_channel(
     chn = evtchn_from_port(d, port);
 
     chn->state = ECS_UNBOUND;
-    chn->consumer_is_xen = 1;
+    chn->xen_consumer = get_xen_consumer(notification_fn);
     chn->notify_vcpu_id = local_vcpu->vcpu_id;
     chn->u.unbound.remote_domid = remote_domid;
 
@@ -1034,8 +1075,8 @@ void free_xen_event_channel(
 
     BUG_ON(!port_is_valid(d, port));
     chn = evtchn_from_port(d, port);
-    BUG_ON(!chn->consumer_is_xen);
-    chn->consumer_is_xen = 0;
+    BUG_ON(!consumer_is_xen(chn));
+    chn->xen_consumer = 0;
 
     spin_unlock(&d->event_lock);
 
@@ -1059,7 +1100,7 @@ void notify_via_xen_event_channel(struct
 
     ASSERT(port_is_valid(ld, lport));
     lchn = evtchn_from_port(ld, lport);
-    ASSERT(lchn->consumer_is_xen);
+    ASSERT(consumer_is_xen(lchn));
 
     if ( likely(lchn->state == ECS_INTERDOMAIN) )
     {
@@ -1102,7 +1143,7 @@ void evtchn_destroy(struct domain *d)
     /* Close all existing event channels. */
     for ( i = 0; port_is_valid(d, i); i++ )
     {
-        evtchn_from_port(d, i)->consumer_is_xen = 0;
+        evtchn_from_port(d, i)->xen_consumer = 0;
         (void)__evtchn_close(d, i);
     }
 
@@ -1188,7 +1229,7 @@ static void domain_dump_evtchn_info(stru
             printk(" v=%d", chn->u.virq);
             break;
         }
-        printk(" x=%d\n", chn->consumer_is_xen);
+        printk(" x=%d\n", chn->xen_consumer);
     }
 
     spin_unlock(&d->event_lock);
diff -r ee909e5a9d85 -r b3cdfb5b76d0 xen/include/xen/event.h
--- a/xen/include/xen/event.h
+++ b/xen/include/xen/event.h
@@ -51,8 +51,11 @@ int evtchn_unmask(unsigned int port);
 void evtchn_move_pirqs(struct vcpu *v);
 
 /* Allocate/free a Xen-attached event channel port. */
+typedef void (*xen_event_channel_notification_t)(
+    struct vcpu *v, unsigned int port);
 int alloc_unbound_xen_event_channel(
-    struct vcpu *local_vcpu, domid_t remote_domid);
+    struct vcpu *local_vcpu, domid_t remote_domid,
+    xen_event_channel_notification_t notification_fn);
 void free_xen_event_channel(
     struct vcpu *local_vcpu, int port);
 
diff -r ee909e5a9d85 -r b3cdfb5b76d0 xen/include/xen/sched.h
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -47,7 +47,7 @@ struct evtchn
 #define ECS_VIRQ         5 /* Channel is bound to a virtual IRQ line.        */
 #define ECS_IPI          6 /* Channel is bound to a virtual IPI line.        */
     u8  state;             /* ECS_* */
-    u8  consumer_is_xen;   /* Consumed by Xen or by guest? */
+    u8  xen_consumer;      /* Consumer in Xen, if any? (0 = send to guest) */
     u16 notify_vcpu_id;    /* VCPU for local delivery notification */
     union {
         struct {

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 14:21:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 14:21:48 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ4uS-0005Kc-2v; Mon, 14 Nov 2011 14:21:48 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQ4Yi-0001at-HR
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 13:59:26 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-12.tower-27.messagelabs.com!1321307933!44564632!1
X-Originating-IP: [208.97.132.5]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15962 invoked from network); 14 Nov 2011 21:58:53 -0000
Received: from mailbigip.dreamhost.com (HELO homiemail-a18.g.dreamhost.com)
	(208.97.132.5) by server-12.tower-27.messagelabs.com with SMTP;
	14 Nov 2011 21:58:53 -0000
Received: from homiemail-a18.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a18.g.dreamhost.com (Postfix) with ESMTP id 4D622250069;
	Mon, 14 Nov 2011 13:59:16 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=V87jRvFGzqg5MhjKATX+I4RkXTh8GDEAN1VRSiTY0KSv
	4FaZjbiGDeII0aie1smCkKRZvFmfqvvy5bx6E07t+eLvDCQ8u28cegoUw8Pbzt06
	IKhaALIMl4GKsJ5rUgpg0tsvsnODOEiF1Db226CGVzawqlXUlkB+GUqtAGGiZOM=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=/Xspo3gCw7ktYM+6ObtBFUgd4yk=; b=PoYxbp2ZzmB
	27NFZsBIIfrLbVqM7t9qhQawlLnK1ioYDkrk64K5M3pE8H6oF6mbeh9tgnDno/Bl
	P+sDEfteJjIGFzWkk6eT4wgBOmUMjYYkSPbbHUClrmPagv6oTIcDlix7pkuA5Jgh
	ephB8E2yn+zAbQen9rSNTsd01r4fnjFc=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a18.g.dreamhost.com (Postfix) with ESMTPSA id 4F86B250071; 
	Mon, 14 Nov 2011 13:59:15 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: ee909e5a9d8555d7dd4d0157838d39be4ccdad7b
Message-Id: <ee909e5a9d8555d7dd4d.1321307911@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1321307910@xdev.gridcentric.ca>
References: <patchbomb.1321307910@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 14 Nov 2011 16:58:31 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: andres@gridcentric.ca, keir.xen@gmail.com, tim@xen.org, olaf@aepfle.de,
	adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 1 of 4] Improve ring management for memory events
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 xen/arch/x86/hvm/hvm.c          |   21 +++-
 xen/arch/x86/mm/mem_event.c     |  173 +++++++++++++++++++++++++++++----------
 xen/arch/x86/mm/mem_sharing.c   |   27 ++++-
 xen/arch/x86/mm/p2m.c           |  100 ++++++++++++----------
 xen/include/asm-x86/mem_event.h |   16 ++-
 xen/include/xen/sched.h         |    5 +-
 6 files changed, 232 insertions(+), 110 deletions(-)


The memevent code currently has a mechanism for reserving space in the ring
before putting an event, but each caller must individually ensure that the
vCPUs are correctly paused if no space is available.

This fixes that issue by reversing the semantics, we ensure that enough space
is always left for one event per vCPU in the ring.  If this constraint will
be violated by the current vCPU putting another request in the ring, we pause
it after putting the current event.

If no foreign mappings cause mem events, then no mem events will be lost.
Because events caused by foreign mapping are effectively unbound, we cannot
guarantee with certainty lack of event loss.

Additionally, we ensure that no events are lost by Xen as a consumer if multiple
responses land on the ring for a single domctl. While the current domctl-based
notifications to Xen disallow batching, this is required for later patches.

Finally, mark_and_pause_vcpus was misleading, beacause it wasn't strictly
pausing the vcpu's, rather sending them to sleep. Change to actual
vcpu_pause, which protects wakeups via an atomic count. This is useful when
an event pauses a vcpu and the vcpu gets mark and paused due to ring congestion.

Signed-off-by: Adin Scannell <adin@scannell.ca>
Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r 19a5a2cddad3 -r ee909e5a9d85 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -4077,7 +4077,6 @@ static int hvm_memory_event_traps(long p
     struct vcpu* v = current;
     struct domain *d = v->domain;
     mem_event_request_t req;
-    int rc;
 
     if ( !(p & HVMPME_MODE_MASK) ) 
         return 0;
@@ -4085,10 +4084,6 @@ static int hvm_memory_event_traps(long p
     if ( (p & HVMPME_onchangeonly) && (value == old) )
         return 1;
     
-    rc = mem_event_check_ring(d, &d->mem_access);
-    if ( rc )
-        return rc;
-    
     memset(&req, 0, sizeof(req));
     req.type = MEM_EVENT_TYPE_ACCESS;
     req.reason = reason;
@@ -4108,7 +4103,21 @@ static int hvm_memory_event_traps(long p
         req.gla_valid = 1;
     }
     
-    mem_event_put_request(d, &d->mem_access, &req);
+    if ( mem_event_put_request(d, &d->mem_access, &req) )
+    {
+        /* rc == -ENOSYS
+         * If there was no ring to send the event, then simply unpause the
+         * vcpu (if we had previously paused it). It will retry the 
+         * instruction (with the exception "handled") and go on
+         * rc == -EBUSY
+         * If the ring is full, the vcpu has been marked and paused,
+         * so we also need to unpause it (if we had previously paused
+         * it). Once the consumer depletes the ring, the vcpu will be
+         * woken up and will retry. The consumer may have lost this
+         * exception, though. */
+        if ( req.flags & MEM_EVENT_FLAG_VCPU_PAUSED ) 
+            vcpu_unpause(v);
+    }
     
     return 1;
 }
diff -r 19a5a2cddad3 -r ee909e5a9d85 xen/arch/x86/mm/mem_event.c
--- a/xen/arch/x86/mm/mem_event.c
+++ b/xen/arch/x86/mm/mem_event.c
@@ -91,6 +91,9 @@ static int mem_event_enable(struct domai
     put_gfn(dom_mem_event, ring_gfn);
     put_gfn(dom_mem_event, shared_gfn); 
 
+    /* Set the number of currently blocked vCPUs to 0. */
+    med->blocked = 0;
+
     /* Allocate event channel */
     rc = alloc_unbound_xen_event_channel(d->vcpu[0],
                                          current->domain->domain_id);
@@ -108,7 +111,7 @@ static int mem_event_enable(struct domai
     mem_event_ring_lock_init(med);
 
     /* Wake any VCPUs paused for memory events */
-    mem_event_unpause_vcpus(d);
+    mem_event_unpause_vcpus(d, med);
 
     return 0;
 
@@ -133,31 +136,83 @@ static int mem_event_disable(struct mem_
     return 0;
 }
 
-void mem_event_put_request(struct domain *d, struct mem_event_domain *med, mem_event_request_t *req)
+static inline int mem_event_ring_free(struct domain *d, struct mem_event_domain *med)
 {
+    int free_requests;
+
+    free_requests = RING_FREE_REQUESTS(&med->front_ring);
+    if ( unlikely(free_requests < d->max_vcpus) )
+    {
+        /* This may happen during normal operation (hopefully not often). */
+        gdprintk(XENLOG_INFO, "mem_event request slots for domain %d: %d\n",
+                               d->domain_id, free_requests);
+    }
+
+    return free_requests;
+}
+
+/* Return values
+ * zero: success
+ * -ENOSYS: no ring
+ * -EAGAIN: ring is full and the event has not been transmitted.
+ *          Only foreign vcpu's get EAGAIN
+ * -EBUSY: guest vcpu has been paused due to ring congestion
+ */ 
+int mem_event_put_request(struct domain *d, struct mem_event_domain *med, mem_event_request_t *req)
+{
+    int ret = 0;
     mem_event_front_ring_t *front_ring;
     RING_IDX req_prod;
 
+    if ( mem_event_check_ring(d, med) )
+        return -ENOSYS;
+
     mem_event_ring_lock(med);
 
-    front_ring = &med->front_ring;
-    req_prod = front_ring->req_prod_pvt;
+    if ( mem_event_ring_free(d, med) == 0 )
+    {
+        /* This *may* happen, but only when foreign mappings generate events. */
+        gdprintk(XENLOG_WARNING, "possible lost mem_event for domain %d\n",
+                                 d->domain_id);
+        ret = -EAGAIN;
+    }
+    else
+    {
+        front_ring = &med->front_ring;
+        req_prod = front_ring->req_prod_pvt;
 
-    /* Copy request */
-    memcpy(RING_GET_REQUEST(front_ring, req_prod), req, sizeof(*req));
-    req_prod++;
+        /* Copy request */
+        memcpy(RING_GET_REQUEST(front_ring, req_prod), req, sizeof(*req));
+        req_prod++;
 
-    /* Update ring */
-    med->req_producers--;
-    front_ring->req_prod_pvt = req_prod;
-    RING_PUSH_REQUESTS(front_ring);
+        /* Update ring */
+        front_ring->req_prod_pvt = req_prod;
+        RING_PUSH_REQUESTS(front_ring);
+    }
+
+    /*
+     * We ensure that each vcpu can put at least *one* event -- because some
+     * events are not repeatable, such as dropping a page.  This will ensure no
+     * vCPU is left with an event that they must place on the ring, but cannot.
+     * They will be paused after the event is placed.
+     * See large comment below in mem_event_unpause_vcpus().
+     */
+    if ( current->domain == d &&
+        mem_event_ring_free(d, med) < d->max_vcpus )
+    {
+        mem_event_mark_and_pause(current, med);
+        /* For guest vcpu, overwrite EAGAIN */
+        ret = -EBUSY;
+    }
 
     mem_event_ring_unlock(med);
 
     notify_via_xen_event_channel(d, med->xen_port);
+
+    return ret;
 }
 
-void mem_event_get_response(struct mem_event_domain *med, mem_event_response_t *rsp)
+int mem_event_get_response(struct domain *d, struct mem_event_domain *med, mem_event_response_t *rsp)
 {
     mem_event_front_ring_t *front_ring;
     RING_IDX rsp_cons;
@@ -167,6 +222,12 @@ void mem_event_get_response(struct mem_e
     front_ring = &med->front_ring;
     rsp_cons = front_ring->rsp_cons;
 
+    if ( !RING_HAS_UNCONSUMED_RESPONSES(front_ring) )
+    {
+        mem_event_ring_unlock(med);
+        return 0;
+    }
+
     /* Copy response */
     memcpy(rsp, RING_GET_RESPONSE(front_ring, rsp_cons), sizeof(*rsp));
     rsp_cons++;
@@ -176,54 +237,74 @@ void mem_event_get_response(struct mem_e
     front_ring->sring->rsp_event = rsp_cons + 1;
 
     mem_event_ring_unlock(med);
+
+    return 1;
 }
 
-void mem_event_unpause_vcpus(struct domain *d)
+void mem_event_unpause_vcpus(struct domain *d, struct mem_event_domain *med)
 {
     struct vcpu *v;
+    int free, i, j, k;
+    int online = d->max_vcpus;
 
+    if ( !med->blocked )
+        return;
+
+    mem_event_ring_lock(med);
+    free = mem_event_ring_free(d, med);
+
+    /*
+     * We ensure that we only have vCPUs online if there are enough free slots
+     * for their memory events to be processed.  This will ensure that no
+     * memory events are lost (due to the fact that certain types of events
+     * cannot be replayed, we need to ensure that there is space in the ring
+     * for when they are hit). 
+     * See large comment above in mem_event_put_request().
+     */
     for_each_vcpu ( d, v )
-        if ( test_and_clear_bit(_VPF_mem_event, &v->pause_flags) )
-            vcpu_wake(v);
+        if ( test_bit(_VPF_mem_event, &v->pause_flags) )
+            online--;
+
+    /* We remember which vcpu last woke up to avoid scanning always linearly
+     * from xero and starving higher-numbered vcpus under high load */
+    if ( d->vcpu )
+    {
+        for (i = med->last_vcpu_wake_up + 1, j = 0; j < d->max_vcpus; i++, j++)
+        {
+            k = i % d->max_vcpus;
+            v = d->vcpu[k];
+            if ( !v ) continue;
+
+            if ( !(med->blocked) || online >= free )
+                break;
+            if ( test_and_clear_bit(_VPF_mem_event, &v->pause_flags) )
+            {
+                vcpu_unpause(v);
+                online++;
+                med->blocked--;
+                med->last_vcpu_wake_up = k;
+            }
+        }
+    }
+
+    mem_event_ring_unlock(med);
 }
 
-void mem_event_mark_and_pause(struct vcpu *v)
+void mem_event_mark_and_pause(struct vcpu *v, struct mem_event_domain *med)
 {
-    set_bit(_VPF_mem_event, &v->pause_flags);
-    vcpu_sleep_nosync(v);
-}
-
-void mem_event_put_req_producers(struct mem_event_domain *med)
-{
-    mem_event_ring_lock(med);
-    med->req_producers--;
-    mem_event_ring_unlock(med);
+    if ( !test_and_set_bit(_VPF_mem_event, &v->pause_flags) )
+    {
+        vcpu_pause_nosync(v);
+        med->blocked++;
+    }
 }
 
 int mem_event_check_ring(struct domain *d, struct mem_event_domain *med)
 {
-    struct vcpu *curr = current;
-    int free_requests;
-    int ring_full = 1;
+    if ( !med->ring_page )
+        return -ENOSYS;
 
-    if ( !med->ring_page )
-        return -1;
-
-    mem_event_ring_lock(med);
-
-    free_requests = RING_FREE_REQUESTS(&med->front_ring);
-    if ( med->req_producers < free_requests )
-    {
-        med->req_producers++;
-        ring_full = 0;
-    }
-
-    if ( ring_full && (curr->domain == d) )
-        mem_event_mark_and_pause(curr);
-
-    mem_event_ring_unlock(med);
-
-    return ring_full;
+    return 0;
 }
 
 int mem_event_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec,
diff -r 19a5a2cddad3 -r ee909e5a9d85 xen/arch/x86/mm/mem_sharing.c
--- a/xen/arch/x86/mm/mem_sharing.c
+++ b/xen/arch/x86/mm/mem_sharing.c
@@ -281,12 +281,19 @@ static struct page_info* mem_sharing_all
     vcpu_pause_nosync(v);
     req.flags |= MEM_EVENT_FLAG_VCPU_PAUSED;
 
-    if(mem_event_check_ring(d, &d->mem_share)) return page;
-
     req.gfn = gfn;
     req.p2mt = p2m_ram_shared;
     req.vcpu_id = v->vcpu_id;
-    mem_event_put_request(d, &d->mem_share, &req);
+
+    /* If there is no ring, and we're out of memory, then
+     * there is no way out. */
+    if ( mem_event_put_request(d, &d->mem_share, &req) == -ENOSYS )
+    {
+        gdprintk(XENLOG_ERR, 
+                 "Failed alloc on unshare path for %hu and no ring "
+                 "to upcall\n", d->domain_id);
+        domain_crash(d);
+    }
 
     return page;
 }
@@ -300,12 +307,16 @@ int mem_sharing_sharing_resume(struct do
 {
     mem_event_response_t rsp;
 
-    /* Get request off the ring */
-    mem_event_get_response(&d->mem_share, &rsp);
+    /* Get all requests off the ring */
+    while ( mem_event_get_response(d, &d->mem_share, &rsp) )
+    {
+        /* Unpause domain/vcpu */
+        if ( rsp.flags & MEM_EVENT_FLAG_VCPU_PAUSED )
+            vcpu_unpause(d->vcpu[rsp.vcpu_id]);
+    }
 
-    /* Unpause domain/vcpu */
-    if( rsp.flags & MEM_EVENT_FLAG_VCPU_PAUSED )
-        vcpu_unpause(d->vcpu[rsp.vcpu_id]);
+    /* Unpause any domains that were paused because the ring was full */
+    mem_event_unpause_vcpus(d, &d->mem_paging);
 
     return 0;
 }
diff -r 19a5a2cddad3 -r ee909e5a9d85 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -877,7 +877,7 @@ void p2m_mem_paging_drop_page(struct dom
     struct vcpu *v = current;
     mem_event_request_t req;
 
-    /* Check that there's space on the ring for this request */
+    /* Check that there's a paging listener who cares about this */
     if ( mem_event_check_ring(d, &d->mem_paging) == 0)
     {
         /* Send release notification to pager */
@@ -886,7 +886,8 @@ void p2m_mem_paging_drop_page(struct dom
         req.gfn = gfn;
         req.vcpu_id = v->vcpu_id;
 
-        mem_event_put_request(d, &d->mem_paging, &req);
+        /* If the event is lost, tough bananas */
+        (void)mem_event_put_request(d, &d->mem_paging, &req);
     }
 }
 
@@ -920,9 +921,14 @@ void p2m_mem_paging_populate(struct doma
     mfn_t mfn;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
 
-    /* Check that there's space on the ring for this request */
+    /* We're paging. There should be a ring */
     if ( mem_event_check_ring(d, &d->mem_paging) )
+    {
+        gdprintk(XENLOG_ERR, "Domain %hu paging gfn %lx yet no ring "
+                    "in place\n", d->domain_id, gfn);
+        domain_crash(d);
         return;
+    }
 
     memset(&req, 0, sizeof(req));
     req.type = MEM_EVENT_TYPE_PAGING;
@@ -951,7 +957,6 @@ void p2m_mem_paging_populate(struct doma
     else if ( p2mt != p2m_ram_paging_out && p2mt != p2m_ram_paged )
     {
         /* gfn is already on its way back and vcpu is not paused */
-        mem_event_put_req_producers(&d->mem_paging);
         return;
     }
 
@@ -960,7 +965,14 @@ void p2m_mem_paging_populate(struct doma
     req.p2mt = p2mt;
     req.vcpu_id = v->vcpu_id;
 
-    mem_event_put_request(d, &d->mem_paging, &req);
+    if ( mem_event_put_request(d, &d->mem_paging, &req) == -EBUSY)
+    {
+        /* The ring is full, so we unpause the vcpu (if we had paused
+         * it), and let it retry, once the consumer has made some space
+         * in the ring. Checks when pausing ensure this is a guest vcpu */
+        if ( req.flags & MEM_EVENT_FLAG_VCPU_PAUSED )
+            vcpu_unpause(v);
+    }
 }
 
 /**
@@ -1038,31 +1050,32 @@ void p2m_mem_paging_resume(struct domain
     p2m_access_t a;
     mfn_t mfn;
 
-    /* Pull the response off the ring */
-    mem_event_get_response(&d->mem_paging, &rsp);
+    /* Pull all responses off the ring */
+    while( mem_event_get_response(d, &d->mem_paging, &rsp) )
+    {
+        /* Fix p2m entry if the page was not dropped */
+        if ( !(rsp.flags & MEM_EVENT_FLAG_DROP_PAGE) )
+        {
+            p2m_lock(p2m);
+            mfn = p2m->get_entry(p2m, rsp.gfn, &p2mt, &a, p2m_query, NULL);
+            /* Allow only pages which were prepared properly, or pages which
+             * were nominated but not evicted */
+            if ( mfn_valid(mfn) && 
+                 (p2mt == p2m_ram_paging_in || p2mt == p2m_ram_paging_in_start) )
+            {
+                set_p2m_entry(p2m, rsp.gfn, mfn, PAGE_ORDER_4K, p2m_ram_rw, a);
+                set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
+            }
+            p2m_unlock(p2m);
+        }
 
-    /* Fix p2m entry if the page was not dropped */
-    if ( !(rsp.flags & MEM_EVENT_FLAG_DROP_PAGE) )
-    {
-        p2m_lock(p2m);
-        mfn = p2m->get_entry(p2m, rsp.gfn, &p2mt, &a, p2m_query, NULL);
-        /* Allow only pages which were prepared properly, or pages which
-         * were nominated but not evicted */
-        if ( mfn_valid(mfn) && 
-             (p2mt == p2m_ram_paging_in || p2mt == p2m_ram_paging_in_start) )
-        {
-            set_p2m_entry(p2m, rsp.gfn, mfn, PAGE_ORDER_4K, p2m_ram_rw, a);
-            set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
-        }
-        p2m_unlock(p2m);
+        /* Unpause domain */
+        if ( rsp.flags & MEM_EVENT_FLAG_VCPU_PAUSED )
+            vcpu_unpause(d->vcpu[rsp.vcpu_id]);
     }
 
-    /* Unpause domain */
-    if ( rsp.flags & MEM_EVENT_FLAG_VCPU_PAUSED )
-        vcpu_unpause(d->vcpu[rsp.vcpu_id]);
-
     /* Unpause any domains that were paused because the ring was full */
-    mem_event_unpause_vcpus(d);
+    mem_event_unpause_vcpus(d, &d->mem_paging);
 }
 
 void p2m_mem_access_check(unsigned long gpa, bool_t gla_valid, unsigned long gla, 
@@ -1073,7 +1086,6 @@ void p2m_mem_access_check(unsigned long 
     unsigned long gfn = gpa >> PAGE_SHIFT;
     struct domain *d = v->domain;    
     struct p2m_domain* p2m = p2m_get_hostp2m(d);
-    int res;
     mfn_t mfn;
     p2m_type_t p2mt;
     p2m_access_t p2ma;
@@ -1091,17 +1103,14 @@ void p2m_mem_access_check(unsigned long 
     p2m_unlock(p2m);
 
     /* Otherwise, check if there is a memory event listener, and send the message along */
-    res = mem_event_check_ring(d, &d->mem_access);
-    if ( res < 0 ) 
+    if ( mem_event_check_ring(d, &d->mem_access) == -ENOSYS ) 
     {
         /* No listener */
         if ( p2m->access_required ) 
         {
-            printk(XENLOG_INFO 
-                   "Memory access permissions failure, no mem_event listener: pausing VCPU %d, dom %d\n",
-                   v->vcpu_id, d->domain_id);
-
-            mem_event_mark_and_pause(v);
+            gdprintk(XENLOG_INFO, "Memory access permissions failure, no mem_event "
+                     "listener VCPU %d, dom %d\n", v->vcpu_id, d->domain_id);
+            domain_crash(v->domain);
         }
         else
         {
@@ -1113,8 +1122,6 @@ void p2m_mem_access_check(unsigned long 
 
         return;
     }
-    else if ( res > 0 )
-        return;  /* No space in buffer; VCPU paused */
 
     memset(&req, 0, sizeof(req));
     req.type = MEM_EVENT_TYPE_ACCESS;
@@ -1135,9 +1142,12 @@ void p2m_mem_access_check(unsigned long 
     
     req.vcpu_id = v->vcpu_id;
 
-    mem_event_put_request(d, &d->mem_access, &req);
+    /* If the ring was busy, this guest vcpu got marked and paused (again), so 
+     * we can remove our unconditional vcpu pause. */
+    if ( mem_event_put_request(d, &d->mem_access, &req) == -EBUSY )
+        vcpu_unpause(v);
 
-    /* VCPU paused, mem event request sent */
+    /* VCPU paused */
 }
 
 void p2m_mem_access_resume(struct p2m_domain *p2m)
@@ -1145,15 +1155,17 @@ void p2m_mem_access_resume(struct p2m_do
     struct domain *d = p2m->domain;
     mem_event_response_t rsp;
 
-    mem_event_get_response(&d->mem_access, &rsp);
-
-    /* Unpause domain */
-    if ( rsp.flags & MEM_EVENT_FLAG_VCPU_PAUSED )
-        vcpu_unpause(d->vcpu[rsp.vcpu_id]);
+    /* Pull all responses off the ring */
+    while( mem_event_get_response(d, &d->mem_access, &rsp) )
+    {
+        /* Unpause domain */
+        if ( rsp.flags & MEM_EVENT_FLAG_VCPU_PAUSED )
+            vcpu_unpause(d->vcpu[rsp.vcpu_id]);
+    }
 
     /* Unpause any domains that were paused because the ring was full or no listener 
      * was available */
-    mem_event_unpause_vcpus(d);
+    mem_event_unpause_vcpus(d, &d->mem_access);
 }
 
 
diff -r 19a5a2cddad3 -r ee909e5a9d85 xen/include/asm-x86/mem_event.h
--- a/xen/include/asm-x86/mem_event.h
+++ b/xen/include/asm-x86/mem_event.h
@@ -25,12 +25,18 @@
 #define __MEM_EVENT_H__
 
 /* Pauses VCPU while marking pause flag for mem event */
-void mem_event_mark_and_pause(struct vcpu *v);
+void mem_event_mark_and_pause(struct vcpu *v, struct mem_event_domain *med);
 int mem_event_check_ring(struct domain *d, struct mem_event_domain *med);
-void mem_event_put_req_producers(struct mem_event_domain *med);
-void mem_event_put_request(struct domain *d, struct mem_event_domain *med, mem_event_request_t *req);
-void mem_event_get_response(struct mem_event_domain *med, mem_event_response_t *rsp);
-void mem_event_unpause_vcpus(struct domain *d);
+void mem_event_unpause_vcpus(struct domain *d, struct mem_event_domain *med);
+
+/* Returns 0 on success, -ENOSYS if there is no ring, -EBUSY if there is 
+ * a ring or no space. FOr success or -EBUSY. the vCPU is left blocked to 
+ * ensure that the ring does not lose events.  In general, put_request should 
+ * not fail, as it attempts to ensure that each vCPU can put at least one req. */
+int mem_event_put_request(struct domain *d, struct mem_event_domain *med,
+                            mem_event_request_t *req);
+int mem_event_get_response(struct domain *d, struct mem_event_domain *med,
+                            mem_event_response_t *rsp);
 
 int mem_event_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec,
                      XEN_GUEST_HANDLE(void) u_domctl);
diff -r 19a5a2cddad3 -r ee909e5a9d85 xen/include/xen/sched.h
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -183,13 +183,16 @@ struct mem_event_domain
 {
     /* ring lock */
     spinlock_t ring_lock;
-    unsigned int req_producers;
     /* shared page */
     mem_event_shared_page_t *shared_page;
     /* shared ring page */
     void *ring_page;
     /* front-end ring */
     mem_event_front_ring_t front_ring;
+    /* the number of vCPUs blocked */
+    unsigned int blocked;
+    /* The last vcpu woken up */
+    unsigned int last_vcpu_wake_up;
     /* event channel port (vcpu0 only) */
     int xen_port;
 };

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 14:22:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 14:22:46 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ4vN-0005hm-Sw; Mon, 14 Nov 2011 14:22:45 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQ4Yl-0001bG-3g
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 13:59:25 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-2.tower-27.messagelabs.com!1321307920!63165779!2
X-Originating-IP: [208.97.132.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 667 invoked from network); 14 Nov 2011 21:58:42 -0000
Received: from caiajhbdcbhh.dreamhost.com (HELO homiemail-a18.g.dreamhost.com)
	(208.97.132.177) by server-2.tower-27.messagelabs.com with SMTP;
	14 Nov 2011 21:58:42 -0000
Received: from homiemail-a18.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a18.g.dreamhost.com (Postfix) with ESMTP id 756BB25006C;
	Mon, 14 Nov 2011 13:59:19 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=content-type
	:mime-version:content-transfer-encoding:subject:message-id
	:in-reply-to:references:date:from:to:cc; q=dns; s=
	lagarcavilla.org; b=Jmi3pfBp3QdudzB5joDMzGEv5sebOkwLo3O9pI+d4X4C
	BMoPwXQhMGYJGZnlNaCIQsuxbkL8oaoFoOVPsYOysp6d2RsNa9tpN7X8e2JVqg5A
	QJx7LeUje+e9ne4Pz7cC8MXmfcKCmrZvdhLaALqRim+IgZemuFBYK0RTZ1wmcKE=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	content-type:mime-version:content-transfer-encoding:subject
	:message-id:in-reply-to:references:date:from:to:cc; s=
	lagarcavilla.org; bh=RM9Ozy8iq9r48zpG9J4y1HsXk8k=; b=s7QDLV83SzR
	2BmsPrcw3ciGm5hgmzPKESMiJxgVlIFJ0EtDx45gWIrc6uDmi07lCRZFMn0RMH6A
	onH1hHRDwhHqIEI+rV8LISe79i9jIGuyYvj/pzLaJUsKI6MNjEf4OykvyI9gF0H7
	61qno7Hv6zeShOJS5l/VhozdOaoofDRE=
Received: from xdev.gridcentric.ca (unknown [206.223.182.18])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	(Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a18.g.dreamhost.com (Postfix) with ESMTPSA id B5CA925006B; 
	Mon, 14 Nov 2011 13:59:18 -0800 (PST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 08a6ea63be98345790dbcbf3f79c8f47176bf83b
Message-Id: <08a6ea63be98345790db.1321307914@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1321307910@xdev.gridcentric.ca>
References: <patchbomb.1321307910@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Mon, 14 Nov 2011 16:58:34 -0500
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
Cc: andres@gridcentric.ca, keir.xen@gmail.com, tim@xen.org, olaf@aepfle.de,
	adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 4 of 4] Allow memevent responses to be signaled
 via the event channel
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 xen/arch/x86/mm/mem_event.c |  26 ++++++++++++++++++++------
 1 files changed, 20 insertions(+), 6 deletions(-)


Don't require a separate domctl to notify the memevent interface that an event
has occured.  This domctl can be taxing, particularly when you are scaling
events and paging to many domains across a single system.  Instead, we use the
existing event channel to signal when we place something in the ring (as per
normal ring operation).

Signed-off-by: Adin Scannell <adin@scannell.ca>
Signed-off-by: Keir Fraser <keir@xen.org>
Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r 106296812c3f -r 08a6ea63be98 xen/arch/x86/mm/mem_event.c
--- a/xen/arch/x86/mm/mem_event.c
+++ b/xen/arch/x86/mm/mem_event.c
@@ -37,9 +37,11 @@
 #define mem_event_ring_lock(_med)       spin_lock(&(_med)->ring_lock)
 #define mem_event_ring_unlock(_med)     spin_unlock(&(_med)->ring_lock)
 
-static int mem_event_enable(struct domain *d,
-                            xen_domctl_mem_event_op_t *mec,
-                            struct mem_event_domain *med)
+static int mem_event_enable(
+    struct domain *d,
+    xen_domctl_mem_event_op_t *mec,
+    struct mem_event_domain *med,
+    xen_event_channel_notification_t notification_fn)
 {
     int rc;
     struct domain *dom_mem_event = current->domain;
@@ -97,7 +99,7 @@ static int mem_event_enable(struct domai
     /* Allocate event channel */
     rc = alloc_unbound_xen_event_channel(d->vcpu[0],
                                          current->domain->domain_id,
-                                         NULL);
+                                         notification_fn);
     if ( rc < 0 )
         goto err;
 
@@ -308,6 +310,18 @@ int mem_event_check_ring(struct domain *
     return 0;
 }
 
+/* Registered with Xen-bound event channel for incoming notifications. */
+static void mem_paging_notification(struct vcpu *v, unsigned int port)
+{
+    p2m_mem_paging_resume(v->domain);
+}
+
+/* Registered with Xen-bound event channel for incoming notifications. */
+static void mem_access_notification(struct vcpu *v, unsigned int port)
+{
+    p2m_mem_access_resume(v->domain);
+}
+
 int mem_event_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec,
                      XEN_GUEST_HANDLE(void) u_domctl)
 {
@@ -369,7 +383,7 @@ int mem_event_domctl(struct domain *d, x
             if ( p2m->pod.entry_count )
                 break;
 
-            rc = mem_event_enable(d, mec, med);
+            rc = mem_event_enable(d, mec, med, mem_paging_notification);
         }
         break;
 
@@ -408,7 +422,7 @@ int mem_event_domctl(struct domain *d, x
             if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL )
                 break;
 
-            rc = mem_event_enable(d, mec, med);
+            rc = mem_event_enable(d, mec, med, mem_access_notification);
         }
         break;
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 14:53:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 14:53:47 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5PP-0000P7-Mg; Mon, 14 Nov 2011 14:53:47 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ5OZ-0000Bg-8x
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 14:52:55 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1321311171!1550006!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10141 invoked from network); 14 Nov 2011 22:52:52 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 22:52:52 -0000
X-IronPort-AV: E=Sophos;i="4.69,511,1315180800"; 
   d="scan'208";a="8924655"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Nov 2011 22:52:51 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Mon, 14 Nov 2011 22:52:51 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RQ5OV-0001k8-16;
	Mon, 14 Nov 2011 22:52:51 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RQ5OU-0006Rb-Nt;
	Mon, 14 Nov 2011 22:52:50 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9766-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 14 Nov 2011 22:52:50 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9766: tolerable FAIL - PUSHED
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9766 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9766/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10       fail    like 9765
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  ca618f5deec2
baseline version:
 xen                  0844b17df7a9

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Anthony Low <shinji@pikopiko.org>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Keir Fraser <keir@xen.org>
  Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
  Olaf Hering <olaf@aepfle.de>
  Roger Pau Monne <roger.pau@entel.upc.edu>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Pushing revision :

+ branch=xen-unstable
+ revision=ca618f5deec2
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x '!=' x/export/home/osstest/repos/lock ']'
++ OSSTEST_REPOS_LOCK_LOCKED=/export/home/osstest/repos/lock
++ exec with-lock-ex -w /export/home/osstest/repos/lock ./ap-push xen-unstable ca618f5deec2
+ branch=xen-unstable
+ revision=ca618f5deec2
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x/export/home/osstest/repos/lock '!=' x/export/home/osstest/repos/lock ']'
+ : xen@xenbits.xensource.com
+ : xen@xenbits.xensource.com:git/linux-pvops
+ : master
+ : tested/2.6.39.x
+ case "$branch" in
+ cd /export/home/osstest/repos/xen-unstable.hg
+ hg push -r ca618f5deec2 ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
pushing to ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 5 changesets with 23 changes to 22 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 14:56:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 14:56:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5ST-00017K-A3; Mon, 14 Nov 2011 14:56:57 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ5Rq-0000up-LC
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 14:56:18 -0800
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-7.tower-27.messagelabs.com!1321311334!56784603!1
X-Originating-IP: [198.162.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23259 invoked from network); 14 Nov 2011 22:55:36 -0000
Received: from unknown (HELO athos.nss.cs.ubc.ca) (198.162.52.240)
	by server-7.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Nov 2011 22:55:36 -0000
Received: from athos.nss.cs.ubc.ca (localhost [127.0.0.1])
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Debian-9.1ubuntu1) with ESMTP id
	pAEMu6Zr024663; Mon, 14 Nov 2011 14:56:06 -0800
Received: (from root@localhost)
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Submit) id pAEMu6P6024660;
	Mon, 14 Nov 2011 14:56:06 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1321311101@athos.nss.cs.ubc.ca>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Mon, 14 Nov 2011 14:51:41 -0800
From: rshriram@cs.ubc.ca
To: xen-devel@lists.xensource.com
Cc: brendan@cs.ubc.ca, ian.jackson@eu.citrix.com, ian.campbell@citrix.com
Subject: [Xen-devel] [PATCH 0 of 3 V7] libxc: checkpoint compression
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This patch series adds checkpoint compression functionality, while
running under Remus.

Changes since last version:
1. renamed page_aligned_alloc to xc_memalign and declare it as a global
   function in xenctrl.h, instead of declaring it in xc_private.h

Shriram

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 14:58:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 14:58:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5U4-0001YY-Qo; Mon, 14 Nov 2011 14:58:36 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ5Rq-0000uq-RC
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 14:56:19 -0800
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-5.tower-21.messagelabs.com!1321311373!2634685!1
X-Originating-IP: [198.162.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1534 invoked from network); 14 Nov 2011 22:56:15 -0000
Received: from unknown (HELO athos.nss.cs.ubc.ca) (198.162.52.240)
	by server-5.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Nov 2011 22:56:15 -0000
Received: from athos.nss.cs.ubc.ca (localhost [127.0.0.1])
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Debian-9.1ubuntu1) with ESMTP id
	pAEMu6pR024670; Mon, 14 Nov 2011 14:56:06 -0800
Received: (from root@localhost)
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Submit) id pAEMu6Ns024667;
	Mon, 14 Nov 2011 14:56:06 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 7e992e479411201fb9a0356f6f27966de7d48967
Message-Id: <7e992e479411201fb9a0.1321311102@athos.nss.cs.ubc.ca>
In-Reply-To: <patchbomb.1321311101@athos.nss.cs.ubc.ca>
References: <patchbomb.1321311101@athos.nss.cs.ubc.ca>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Mon, 14 Nov 2011 14:51:42 -0800
From: rshriram@cs.ubc.ca
To: xen-devel@lists.xensource.com
Cc: brendan@cs.ubc.ca, ian.jackson@eu.citrix.com, ian.campbell@citrix.com
Subject: [Xen-devel] [PATCH 1 of 3 V7] tools/libxc: introduce xc_memalign in
	xc_{minios, linux, solaris, netbsd}.c
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Shriram Rajagopalan <rshriram@cs.ubc.ca>
# Date 1321309573 28800
# Node ID 7e992e479411201fb9a0356f6f27966de7d48967
# Parent  54a5e994a241a506900ee0e197bb42e5f1d8e759
tools/libxc: introduce xc_memalign in xc_{minios,linux,solaris,netbsd}.c

Move (page aligned) buffer allocations in {os}_privcmd_alloc_hypercall_buffer
into a global function xc_memalign. This API is also used by Remus
compression code to allocate compression caches that need to be page aligned.

Signed-off-by: Shriram Rajagopalan <rshriram@cs.ubc.ca>

diff -r 54a5e994a241 -r 7e992e479411 tools/libxc/xc_linux.c
--- a/tools/libxc/xc_linux.c	Wed Nov 02 17:09:09 2011 +0000
+++ b/tools/libxc/xc_linux.c	Mon Nov 14 14:26:13 2011 -0800
@@ -55,6 +55,18 @@
     errno = saved_errno;
 }
 
+void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
+{
+    int ret;
+    void *ptr;
+
+    ret = posix_memalign(&ptr, alignment, size);
+    if (ret != 0 || !ptr)
+        return NULL;
+
+    return ptr;
+}
+
 /*
  * Local variables:
  * mode: C
diff -r 54a5e994a241 -r 7e992e479411 tools/libxc/xc_linux_osdep.c
--- a/tools/libxc/xc_linux_osdep.c	Wed Nov 02 17:09:09 2011 +0000
+++ b/tools/libxc/xc_linux_osdep.c	Mon Nov 14 14:26:13 2011 -0800
@@ -91,10 +91,9 @@
 {
     size_t size = npages * XC_PAGE_SIZE;
     void *p;
-    int ret;
 
-    ret = posix_memalign(&p, XC_PAGE_SIZE, size);
-    if (ret != 0 || !p)
+    p = xc_memalign(xch, XC_PAGE_SIZE, size);
+    if (!p)
         return NULL;
 
     if ( mlock(p, size) < 0 )
diff -r 54a5e994a241 -r 7e992e479411 tools/libxc/xc_minios.c
--- a/tools/libxc/xc_minios.c	Wed Nov 02 17:09:09 2011 +0000
+++ b/tools/libxc/xc_minios.c	Mon Nov 14 14:26:13 2011 -0800
@@ -73,7 +73,7 @@
 
 static void *minios_privcmd_alloc_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, int npages)
 {
-    return memalign(PAGE_SIZE, npages * PAGE_SIZE);
+    return xc_memalign(xch, PAGE_SIZE, npages * PAGE_SIZE);
 }
 
 static void minios_privcmd_free_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, void *ptr, int npages)
@@ -437,6 +437,11 @@
         fsync(fd);
 }
 
+void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
+{
+    return memalign(alignment, size);
+}
+
 static xc_osdep_handle minios_gnttab_open(xc_gnttab *xcg)
 {
     int fd = alloc_fd(FTYPE_GNTMAP);
diff -r 54a5e994a241 -r 7e992e479411 tools/libxc/xc_netbsd.c
--- a/tools/libxc/xc_netbsd.c	Wed Nov 02 17:09:09 2011 +0000
+++ b/tools/libxc/xc_netbsd.c	Mon Nov 14 14:26:13 2011 -0800
@@ -71,8 +71,9 @@
 static void *netbsd_privcmd_alloc_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, int npages)
 {
     size_t size = npages * XC_PAGE_SIZE;
-    void *p = valloc(size);
+    void *p;
 
+    p = xc_memalign(xch, XC_PAGE_SIZE, size);
     if (!p)
         return NULL;
 
@@ -378,6 +379,11 @@
     errno = saved_errno;
 }
 
+void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
+{
+    return valloc(size);
+}
+
 static struct xc_osdep_ops *netbsd_osdep_init(xc_interface *xch, enum xc_osdep_type type)
 {
     switch ( type )
diff -r 54a5e994a241 -r 7e992e479411 tools/libxc/xc_solaris.c
--- a/tools/libxc/xc_solaris.c	Wed Nov 02 17:09:09 2011 +0000
+++ b/tools/libxc/xc_solaris.c	Mon Nov 14 14:26:13 2011 -0800
@@ -70,7 +70,7 @@
 
 static void *solaris_privcmd_alloc_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, int npages)
 {
-    return memalign(XC_PAGE_SIZE, npages * XC_PAGE_SIZE);
+    return xc_memalign(xch, XC_PAGE_SIZE, npages * XC_PAGE_SIZE);
 }
 
 static void solaris_privcmd_free_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, void *ptr, int npages)
@@ -314,6 +314,11 @@
     // TODO: Implement for Solaris!
 }
 
+void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
+{
+    return memalign(alignment, size);
+}
+
 static struct xc_osdep_ops *solaris_osdep_init(xc_interface *xch, enum xc_osdep_type type)
 {
     switch ( type )
diff -r 54a5e994a241 -r 7e992e479411 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h	Wed Nov 02 17:09:09 2011 +0000
+++ b/tools/libxc/xenctrl.h	Mon Nov 14 14:26:13 2011 -0800
@@ -1129,6 +1129,8 @@
                       uint64_t *time,
                       xc_hypercall_buffer_t *data);
 
+void *xc_memalign(xc_interface *xch, size_t alignment, size_t size);
+
 /**
  * Memory maps a range within one domain to a local address range.  Mappings
  * should be unmapped with munmap and should follow the same rules as mmap

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:02:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:02:47 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5Y6-0001yx-SZ; Mon, 14 Nov 2011 15:02:46 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ5Rr-0000uv-Ai
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 14:56:19 -0800
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-4.tower-216.messagelabs.com!1321311374!3511490!1
X-Originating-IP: [198.162.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2249 invoked from network); 14 Nov 2011 22:56:16 -0000
Received: from unknown (HELO athos.nss.cs.ubc.ca) (198.162.52.240)
	by server-4.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Nov 2011 22:56:16 -0000
Received: from athos.nss.cs.ubc.ca (localhost [127.0.0.1])
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Debian-9.1ubuntu1) with ESMTP id
	pAEMu69m024684; Mon, 14 Nov 2011 14:56:06 -0800
Received: (from root@localhost)
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Submit) id pAEMu6Bu024681;
	Mon, 14 Nov 2011 14:56:06 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 50316e043a2144831c1fa7cf2d96de8df4796f68
Message-Id: <50316e043a2144831c1f.1321311104@athos.nss.cs.ubc.ca>
In-Reply-To: <patchbomb.1321311101@athos.nss.cs.ubc.ca>
References: <patchbomb.1321311101@athos.nss.cs.ubc.ca>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Mon, 14 Nov 2011 14:51:44 -0800
From: rshriram@cs.ubc.ca
To: xen-devel@lists.xensource.com
Cc: brendan@cs.ubc.ca, ian.jackson@eu.citrix.com, ian.campbell@citrix.com
Subject: [Xen-devel] [PATCH 3 of 3 V7] remus: command line switch to
	enable/disable checkpoint compression
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Shriram Rajagopalan <rshriram@cs.ubc.ca>
# Date 1321309631 28800
# Node ID 50316e043a2144831c1fa7cf2d96de8df4796f68
# Parent  71d482d5f9aeba050454aa0130c4280090ea8e28
remus: command line switch to enable/disable checkpoint compression

Add a command line switch to remus script that allows the user to
enable or disable checkpoint compression in the libxc code.

Signed-off-by: Shriram Rajagopalan <rshriram@cs.ubc.ca>

diff -r 71d482d5f9ae -r 50316e043a21 tools/python/xen/lowlevel/checkpoint/checkpoint.c
--- a/tools/python/xen/lowlevel/checkpoint/checkpoint.c	Mon Nov 14 14:27:09 2011 -0800
+++ b/tools/python/xen/lowlevel/checkpoint/checkpoint.c	Mon Nov 14 14:27:11 2011 -0800
@@ -104,13 +104,14 @@
   PyObject* postcopy_cb = NULL;
   PyObject* checkpoint_cb = NULL;
   unsigned int interval = 0;
+  unsigned int flags = 0;
 
   int fd;
   struct save_callbacks callbacks;
   int rc;
 
-  if (!PyArg_ParseTuple(args, "O|OOOI", &iofile, &suspend_cb, &postcopy_cb,
-                       &checkpoint_cb, &interval))
+  if (!PyArg_ParseTuple(args, "O|OOOII", &iofile, &suspend_cb, &postcopy_cb,
+			&checkpoint_cb, &interval, &flags))
     return NULL;
 
   self->interval = interval;
@@ -160,7 +161,7 @@
   callbacks.data = self;
 
   self->threadstate = PyEval_SaveThread();
-  rc = checkpoint_start(&self->cps, fd, &callbacks);
+  rc = checkpoint_start(&self->cps, fd, &callbacks, flags);
   PyEval_RestoreThread(self->threadstate);
 
   if (rc < 0) {
diff -r 71d482d5f9ae -r 50316e043a21 tools/python/xen/lowlevel/checkpoint/checkpoint.h
--- a/tools/python/xen/lowlevel/checkpoint/checkpoint.h	Mon Nov 14 14:27:09 2011 -0800
+++ b/tools/python/xen/lowlevel/checkpoint/checkpoint.h	Mon Nov 14 14:27:11 2011 -0800
@@ -40,13 +40,15 @@
     timer_t timer;
 } checkpoint_state;
 
+#define CHECKPOINT_FLAGS_COMPRESSION 1
 char* checkpoint_error(checkpoint_state* s);
 
 void checkpoint_init(checkpoint_state* s);
 int checkpoint_open(checkpoint_state* s, unsigned int domid);
 void checkpoint_close(checkpoint_state* s);
 int checkpoint_start(checkpoint_state* s, int fd,
-                    struct save_callbacks* callbacks);
+		     struct save_callbacks* callbacks,
+		     unsigned int remus_flags);
 int checkpoint_suspend(checkpoint_state* s);
 int checkpoint_resume(checkpoint_state* s);
 int checkpoint_postflush(checkpoint_state* s);
diff -r 71d482d5f9ae -r 50316e043a21 tools/python/xen/lowlevel/checkpoint/libcheckpoint.c
--- a/tools/python/xen/lowlevel/checkpoint/libcheckpoint.c	Mon Nov 14 14:27:09 2011 -0800
+++ b/tools/python/xen/lowlevel/checkpoint/libcheckpoint.c	Mon Nov 14 14:27:11 2011 -0800
@@ -170,7 +170,8 @@
 }
 
 int checkpoint_start(checkpoint_state* s, int fd,
-                    struct save_callbacks* callbacks)
+		     struct save_callbacks* callbacks,
+		     unsigned int remus_flags)
 {
     int hvm, rc;
     int flags = XCFLAGS_LIVE;
@@ -188,6 +189,8 @@
        if (switch_qemu_logdirty(s, 1))
            return -1;
     }
+    if (remus_flags & CHECKPOINT_FLAGS_COMPRESSION)
+      flags |= XCFLAGS_CHECKPOINT_COMPRESS;
 
     callbacks->switch_qemu_logdirty = noop_switch_logdirty;
 
diff -r 71d482d5f9ae -r 50316e043a21 tools/python/xen/remus/save.py
--- a/tools/python/xen/remus/save.py	Mon Nov 14 14:27:09 2011 -0800
+++ b/tools/python/xen/remus/save.py	Mon Nov 14 14:27:11 2011 -0800
@@ -133,7 +133,7 @@
 
 class Saver(object):
     def __init__(self, domid, fd, suspendcb=None, resumecb=None,
-                 checkpointcb=None, interval=0):
+                 checkpointcb=None, interval=0, flags=0):
         """Create a Saver object for taking guest checkpoints.
         domid:        name, number or UUID of a running domain
         fd:           a stream to which checkpoint data will be written.
@@ -141,12 +141,14 @@
         resumecb:     callback invoked before guest resumes
         checkpointcb: callback invoked when a checkpoint is complete. Return
                       True to take another checkpoint, or False to stop.
+        flags:        Remus flags to be passed to xc_domain_save
         """
         self.fd = fd
         self.suspendcb = suspendcb
         self.resumecb = resumecb
         self.checkpointcb = checkpointcb
         self.interval = interval
+        self.flags = flags
 
         self.vm = vm.VM(domid)
 
@@ -164,7 +166,8 @@
             try:
                 self.checkpointer.open(self.vm.domid)
                 self.checkpointer.start(self.fd, self.suspendcb, self.resumecb,
-                                        self.checkpointcb, self.interval)
+                                        self.checkpointcb, self.interval,
+                                        self.flags)
             except xen.lowlevel.checkpoint.error, e:
                 raise CheckpointError(e)
         finally:
diff -r 71d482d5f9ae -r 50316e043a21 tools/remus/remus
--- a/tools/remus/remus	Mon Nov 14 14:27:09 2011 -0800
+++ b/tools/remus/remus	Mon Nov 14 14:27:11 2011 -0800
@@ -16,6 +16,9 @@
 class CfgException(Exception): pass
 
 class Cfg(object):
+
+    REMUS_FLAGS_COMPRESSION = 1
+
     def __init__(self):
         # must be set
         self.domid = 0
@@ -25,6 +28,7 @@
         self.port = XendOptions.instance().get_xend_relocation_port()
         self.interval = 200
         self.netbuffer = True
+        self.flags = self.REMUS_FLAGS_COMPRESSION
         self.timer = False
 
         parser = optparse.OptionParser()
@@ -38,6 +42,8 @@
                           help='replicate to /dev/null (no disk checkpoints, only memory & net buffering)')
         parser.add_option('', '--no-net', dest='nonet', action='store_true',
                           help='run without net buffering (benchmark option)')
+        parser.add_option('', '--no-compression', dest='nocompress', action='store_true',
+                          help='run without checkpoint compression')
         parser.add_option('', '--timer', dest='timer', action='store_true',
                           help='force pause at checkpoint interval (experimental)')
         self.parser = parser
@@ -56,6 +62,8 @@
             self.nullremus = True
         if opts.nonet:
             self.netbuffer = False
+        if opts.nocompress:
+            self.flags &= ~self.REMUS_FLAGS_COMPRESSION
         if opts.timer:
             self.timer = True
 
@@ -190,7 +198,7 @@
     rc = 0
 
     checkpointer = save.Saver(cfg.domid, fd, postsuspend, preresume, commit,
-                              interval)
+                              interval, cfg.flags)
 
     try:
         checkpointer.start()

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:05:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:05:33 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5al-0002O4-Nc; Mon, 14 Nov 2011 15:05:31 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ5Rr-0000uu-7w
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 14:56:20 -0800
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-13.tower-182.messagelabs.com!1321311374!2570855!1
X-Originating-IP: [198.162.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27355 invoked from network); 14 Nov 2011 22:56:15 -0000
Received: from unknown (HELO athos.nss.cs.ubc.ca) (198.162.52.240)
	by server-13.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Nov 2011 22:56:15 -0000
Received: from athos.nss.cs.ubc.ca (localhost [127.0.0.1])
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Debian-9.1ubuntu1) with ESMTP id
	pAEMu6qd024677; Mon, 14 Nov 2011 14:56:06 -0800
Received: (from root@localhost)
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Submit) id pAEMu6PA024674;
	Mon, 14 Nov 2011 14:56:06 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 71d482d5f9aeba050454aa0130c4280090ea8e28
Message-Id: <71d482d5f9aeba050454.1321311103@athos.nss.cs.ubc.ca>
In-Reply-To: <patchbomb.1321311101@athos.nss.cs.ubc.ca>
References: <patchbomb.1321311101@athos.nss.cs.ubc.ca>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Mon, 14 Nov 2011 14:51:43 -0800
From: rshriram@cs.ubc.ca
To: xen-devel@lists.xensource.com
Cc: brendan@cs.ubc.ca, ian.jackson@eu.citrix.com, ian.campbell@citrix.com
Subject: [Xen-devel] [PATCH 2 of 3 V7] tools/libxc: Remus Checkpoint
	Compression
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Shriram Rajagopalan <rshriram@cs.ubc.ca>
# Date 1321309629 28800
# Node ID 71d482d5f9aeba050454aa0130c4280090ea8e28
# Parent  7e992e479411201fb9a0356f6f27966de7d48967
tools/libxc: Remus Checkpoint Compression

Instead of sending dirty pages of guest memory as-is, use a simple compression
algorithm that sends a RLE-encoded XOR of the page against its last sent copy.
A small LRU cache is used to hold recently dirtied pages. Pagetable pages are
sent as-is, as they are canonicalized at sender side and uncanonicalized at
receiver.

Signed-off-by: Shriram Rajagopalan <rshriram@cs.ubc.ca>

diff -r 7e992e479411 -r 71d482d5f9ae tools/libxc/Makefile
--- a/tools/libxc/Makefile	Mon Nov 14 14:26:13 2011 -0800
+++ b/tools/libxc/Makefile	Mon Nov 14 14:27:09 2011 -0800
@@ -42,7 +42,7 @@
 GUEST_SRCS-y :=
 GUEST_SRCS-y += xg_private.c xc_suspend.c
 GUEST_SRCS-$(CONFIG_MIGRATE) += xc_domain_restore.c xc_domain_save.c
-GUEST_SRCS-$(CONFIG_MIGRATE) += xc_offline_page.c
+GUEST_SRCS-$(CONFIG_MIGRATE) += xc_offline_page.c xc_compression.c
 GUEST_SRCS-$(CONFIG_HVM) += xc_hvm_build.c
 
 vpath %.c ../../xen/common/libelf
diff -r 7e992e479411 -r 71d482d5f9ae tools/libxc/xc_compression.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxc/xc_compression.c	Mon Nov 14 14:27:09 2011 -0800
@@ -0,0 +1,552 @@
+/******************************************************************************
+ * xc_compression.c
+ *
+ * Checkpoint Compression using Page Delta Algorithm.
+ * - A LRU cache of recently dirtied guest pages is maintained.
+ * - For each dirty guest page in the checkpoint, if a previous version of the
+ * page exists in the cache, XOR both pages and send the non-zero sections
+ * to the receiver. The cache is then updated with the newer copy of guest page.
+ * - The receiver will XOR the non-zero sections against its copy of the guest
+ * page, thereby bringing the guest page up-to-date with the sender side.
+ *
+ * Copyright (c) 2011 Shriram Rajagopalan (rshriram@cs.ubc.ca).
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <inttypes.h>
+#include <errno.h>
+#include "xc_private.h"
+#include "xenctrl.h"
+#include "xg_save_restore.h"
+#include "xg_private.h"
+#include "xc_dom.h"
+
+/* Page Cache for Delta Compression*/
+#define DELTA_CACHE_SIZE (XC_PAGE_SIZE * 8192)
+
+/* Internal page buffer to hold dirty pages of a checkpoint,
+ * to be compressed after the domain is resumed for execution.
+ */
+#define PAGE_BUFFER_SIZE (XC_PAGE_SIZE * 8192)
+
+struct cache_page
+{
+    char *page;
+    xen_pfn_t pfn;
+    struct cache_page *next;
+    struct cache_page *prev;
+};
+
+struct compression_ctx
+{
+    /* compression buffer - holds compressed data */
+    char *compbuf;
+    unsigned long compbuf_size;
+    unsigned long compbuf_pos;
+
+    /* Page buffer to hold pages to be compressed */
+    char *inputbuf;
+    /* pfns of pages to be compressed */
+    xen_pfn_t *sendbuf_pfns;
+    unsigned int pfns_len;
+    unsigned int pfns_index;
+
+    /* Compression Cache (LRU) */
+    char *cache_base;
+    struct cache_page **pfn2cache;
+    struct cache_page *cache;
+    struct cache_page *page_list_head;
+    struct cache_page *page_list_tail;
+    unsigned long dom_pfnlist_size;
+};
+
+#define RUNFLAG 0
+#define SKIPFLAG ((char)128)
+#define FLAGMASK SKIPFLAG
+#define LENMASK ((char)127)
+
+/*
+ * see xg_save_restore.h for details on the compressed stream format.
+ * delta size = 4 bytes.
+ * run header = 1 byte (1 bit for runtype, 7bits for run length).
+ *  i.e maximum size of a run = 127 * 4 = 508 bytes.
+ * Worst case compression: Entire page has changed.
+ * In the worst case, the size of the compressed page is
+ *  8 runs of 508 bytes + 1 run of 32 bytes + 9 run headers 
+ *  = 4105 bytes.
+ * We could detect this worst case and send the entire page with a
+ * FULL_PAGE marker, reducing the total size to 4097 bytes. The cost
+ * of this size reduction is an additional memcpy, on top of two previous
+ * memcpy (to the compressed stream and the cache page in the for loop).
+ *
+ * We might as well sacrifice an extra 8 bytes instead of a memcpy.
+ */
+#define WORST_COMP_PAGE_SIZE (XC_PAGE_SIZE + 9)
+
+/*
+ * A zero length skip indicates full page.
+ */
+#define EMPTY_PAGE 0
+#define FULL_PAGE SKIPFLAG
+#define FULL_PAGE_SIZE (XC_PAGE_SIZE + 1)
+#define MAX_DELTAS (XC_PAGE_SIZE/sizeof(uint32_t))
+
+/*
+ * Add a pagetable page or a new page (uncached)
+ * if srcpage is a pagetable page, cache_page is null.
+ * if srcpage is a page that was not previously in the cache,
+ *  cache_page points to a free page slot in the cache where
+ *  this new page can be copied to.
+ */
+static int add_full_page(comp_ctx *ctx, char *srcpage, char *cache_page)
+{
+    char *dest = (ctx->compbuf + ctx->compbuf_pos);
+
+    if ( (ctx->compbuf_pos + FULL_PAGE_SIZE) > ctx->compbuf_size)
+        return -1;
+
+    if (cache_page)
+        memcpy(cache_page, srcpage, XC_PAGE_SIZE);
+    dest[0] = FULL_PAGE;
+    memcpy(&dest[1], srcpage, XC_PAGE_SIZE);
+    ctx->compbuf_pos += FULL_PAGE_SIZE;
+
+    return FULL_PAGE_SIZE;
+}
+
+static int compress_page(comp_ctx *ctx, char *srcpage, char *cache_page)
+{
+    char *dest = (ctx->compbuf + ctx->compbuf_pos);
+    uint32_t *new, *old;
+
+    int off, runptr = 0;
+    int wascopying = 0, copying = 0, bytes_skipped = 0;
+    int complen = 0, pageoff = 0, runbytes = 0;
+
+    char runlen = 0;
+
+    if ( (ctx->compbuf_pos + WORST_COMP_PAGE_SIZE) > ctx->compbuf_size)
+        return -1;
+
+    /*
+     * There are no alignment issues here since srcpage is
+     * domU's page passed from xc_domain_save and cache_page is
+     * a ptr to cache page (cache is page aligned).
+     */
+    new = (uint32_t*)srcpage;
+    old = (uint32_t*)cache_page;
+
+    for (off = 0; off <= MAX_DELTAS; off++)
+    {
+        /*
+         * At (off == MAX_DELTAS), we are processing the last run
+         * in the page. Since there is no XORing, make wascopying != copying
+         * to satisfy the if-block below.
+         */
+        copying = ((off < MAX_DELTAS) ? (old[off] != new[off]) : !wascopying);
+
+        if (runlen)
+        {
+            /* switching between run types or current run is full */
+            if ( (wascopying != copying) || (runlen == LENMASK) )
+            {
+                runbytes = runlen * sizeof(uint32_t);
+                runlen |= (wascopying ? RUNFLAG : SKIPFLAG);
+                dest[complen++] = runlen;
+
+                if (wascopying) /* RUNFLAG */
+                {
+                    pageoff = runptr * sizeof(uint32_t);
+                    memcpy(dest + complen, srcpage + pageoff, runbytes);
+                    memcpy(cache_page + pageoff, srcpage + pageoff, runbytes);
+                    complen += runbytes;
+                }
+                else /* SKIPFLAG */
+                {
+                    bytes_skipped += runbytes;
+                }
+
+                runlen = 0;
+                runptr = off;
+            }
+        }
+        runlen++;
+        wascopying = copying;
+    }
+
+    /*
+     * Check for empty page.
+     */
+    if (bytes_skipped == XC_PAGE_SIZE)
+    {
+        complen = 1;
+        dest[0] = EMPTY_PAGE;
+    }
+    ctx->compbuf_pos += complen;
+
+    return complen;
+}
+
+static
+char *get_cache_page(comp_ctx *ctx, xen_pfn_t pfn,
+                     int *israw)
+{
+    struct cache_page *item = NULL;
+
+    item = ctx->pfn2cache[pfn];
+
+    if (!item)
+    {
+        *israw = 1;
+
+        /* If the list is full, evict a page from the tail end. */
+        item = ctx->page_list_tail;
+        if (item->pfn != INVALID_P2M_ENTRY)
+            ctx->pfn2cache[item->pfn] = NULL;
+
+        item->pfn = pfn;
+        ctx->pfn2cache[pfn] = item;
+    }
+        
+    /* 	if requested item is in cache move to head of list */
+    if (item != ctx->page_list_head)
+    {
+        if (item == ctx->page_list_tail)
+        {
+            /* item at tail of list. */
+            ctx->page_list_tail = item->prev;
+            (ctx->page_list_tail)->next = NULL;
+        }
+        else
+        {
+            /* item in middle of list */
+            item->prev->next = item->next;
+            item->next->prev = item->prev;
+        }
+
+        item->prev = NULL;
+        item->next = ctx->page_list_head;
+        (ctx->page_list_head)->prev = item;
+        ctx->page_list_head = item;
+    }
+
+    return (ctx->page_list_head)->page;
+}
+
+/* Remove pagetable pages from cache and move to tail, as free pages */
+static
+void invalidate_cache_page(comp_ctx *ctx, xen_pfn_t pfn)
+{
+    struct cache_page *item = NULL;
+
+    item = ctx->pfn2cache[pfn];
+    if (item)
+    {
+        if (item != ctx->page_list_tail)
+        {
+            /* item at head of list */
+            if (item == ctx->page_list_head)
+            {
+                ctx->page_list_head = (ctx->page_list_head)->next;
+                (ctx->page_list_head)->prev = NULL;
+            }
+            else /* item in middle of list */
+            {            
+                item->prev->next = item->next;
+                item->next->prev = item->prev;
+            }
+
+            item->next = NULL;
+            item->prev = ctx->page_list_tail;
+            (ctx->page_list_tail)->next = item;
+            ctx->page_list_tail = item;
+        }
+        ctx->pfn2cache[pfn] = NULL;
+        (ctx->page_list_tail)->pfn = INVALID_P2M_ENTRY;
+    }
+}
+
+int xc_compression_add_page(xc_interface *xch, comp_ctx *ctx,
+                            char *page, xen_pfn_t pfn, int israw)
+{
+    if (pfn > ctx->dom_pfnlist_size)
+    {
+        ERROR("Invalid pfn passed into "
+              "xc_compression_add_page %" PRIpfn "\n", pfn);
+        return -2;
+    }
+
+    /* pagetable page */
+    if (israw)
+        invalidate_cache_page(ctx, pfn);
+    ctx->sendbuf_pfns[ctx->pfns_len] = israw ? INVALID_P2M_ENTRY : pfn;
+    memcpy(ctx->inputbuf + ctx->pfns_len * XC_PAGE_SIZE, page, XC_PAGE_SIZE);
+    ctx->pfns_len++;
+
+    /* check if we have run out of space. If so,
+     * we need to synchronously compress the pages and flush them out
+     */
+    if (ctx->pfns_len == NRPAGES(PAGE_BUFFER_SIZE))
+        return -1;
+    return 0;
+}
+
+int xc_compression_compress_pages(xc_interface *xch, comp_ctx *ctx,
+                                  char *compbuf, unsigned long compbuf_size,
+                                  unsigned long *compbuf_len)
+{
+    char *cache_copy = NULL, *current_page = NULL;
+    int israw, rc = 1;
+
+    if (!ctx->pfns_len || (ctx->pfns_index == ctx->pfns_len)) {
+        ctx->pfns_len = ctx->pfns_index = 0;
+        return 0;
+    }
+
+    ctx->compbuf_pos = 0;
+    ctx->compbuf = compbuf;
+    ctx->compbuf_size = compbuf_size;
+
+    for (; ctx->pfns_index < ctx->pfns_len; ctx->pfns_index++)
+    {
+        israw = 0;
+        cache_copy = NULL;
+        current_page = ctx->inputbuf + ctx->pfns_index * XC_PAGE_SIZE;
+
+        if (ctx->sendbuf_pfns[ctx->pfns_index] == INVALID_P2M_ENTRY)
+            israw = 1;
+        else
+            cache_copy = get_cache_page(ctx,
+                                        ctx->sendbuf_pfns[ctx->pfns_index],
+                                        &israw);
+
+        if (israw)
+            rc = (add_full_page(ctx, current_page, cache_copy) >= 0);
+        else
+            rc = (compress_page(ctx, current_page, cache_copy) >= 0);
+
+        if ( !rc )
+        {
+            /* Out of space in outbuf! flush and come back */
+            rc = -1;
+            break;
+        }
+    }
+    if (compbuf_len)
+        *compbuf_len = ctx->compbuf_pos;
+
+    return rc;
+}
+
+inline
+void xc_compression_reset_pagebuf(xc_interface *xch, comp_ctx *ctx)
+{
+    ctx->pfns_index = ctx->pfns_len = 0;
+}
+
+int xc_compression_uncompress_page(xc_interface *xch, char *compbuf,
+                                   unsigned long compbuf_size,
+                                   unsigned long *compbuf_pos, char *destpage)
+{
+    unsigned long pos;
+    unsigned int len = 0, pagepos = 0;
+    char flag;
+
+    pos = *compbuf_pos;
+    if (pos >= compbuf_size)
+    {
+        ERROR("Out of bounds exception in compression buffer (a):"
+              "read ptr:%lu, bufsize = %lu\n",
+              *compbuf_pos, compbuf_size);
+        return -1;
+    }
+
+    switch (compbuf[pos])
+    {
+    case EMPTY_PAGE:
+        pos++;
+        break;
+
+    case FULL_PAGE:
+        {
+            /* Check if the input buffer has 4KB of data */
+            if ((pos + FULL_PAGE_SIZE) > compbuf_size)
+            {
+                ERROR("Out of bounds exception in compression buffer (b):"
+                      "read ptr = %lu, bufsize = %lu\n",
+                      *compbuf_pos, compbuf_size);
+                return -1;
+            }
+            memcpy(destpage, &compbuf[pos + 1], XC_PAGE_SIZE);
+            pos += FULL_PAGE_SIZE;
+        }
+        break;
+
+    default: /* Normal page with one or more runs */
+        {
+            do
+            {
+                flag = compbuf[pos] & FLAGMASK;
+                len = (compbuf[pos] & LENMASK) * sizeof(uint32_t);
+                /* Sanity Check: Zero-length runs are allowed only for
+                 * FULL_PAGE and EMPTY_PAGE.
+                 */
+                if (!len)
+                {
+                    ERROR("Zero length run encountered for normal page: "
+                          "buffer (d):read ptr = %lu, flag = %u, "
+                          "bufsize = %lu, pagepos = %u\n",
+                          pos, (unsigned int)flag, compbuf_size, pagepos);
+                    return -1;
+                }
+
+                pos++;
+                if (flag == RUNFLAG)
+                {
+                    /* Check if the input buffer has len bytes of data
+                     * and whether it would fit in the destination page.
+                     */
+                    if (((pos + len) > compbuf_size)
+                        || ((pagepos + len) > XC_PAGE_SIZE))
+                    {
+                        ERROR("Out of bounds exception in compression "
+                              "buffer (c):read ptr = %lu, runlen = %u, "
+                              "bufsize = %lu, pagepos = %u\n",
+                              pos, len, compbuf_size, pagepos);
+                        return -1;
+                    }
+                    memcpy(&destpage[pagepos], &compbuf[pos], len);
+                    pos += len;
+                }
+                pagepos += len;
+            } while ((pagepos < XC_PAGE_SIZE) && (pos < compbuf_size));
+
+            /* Make sure we have copied/skipped 4KB worth of data */
+            if (pagepos != XC_PAGE_SIZE)
+            {
+                ERROR("Invalid data in compression buffer:"
+                      "read ptr = %lu, bufsize = %lu, pagepos = %u\n",
+                      pos, compbuf_size, pagepos);
+                return -1;
+            }
+        }
+    }
+    *compbuf_pos = pos;
+    return 0;
+}
+
+void xc_compression_free_context(xc_interface *xch, comp_ctx *ctx)
+{
+    if (!ctx) return;
+
+    if (ctx->inputbuf)
+        free(ctx->inputbuf);
+    if (ctx->sendbuf_pfns)
+        free(ctx->sendbuf_pfns);
+    if (ctx->cache_base)
+        free(ctx->cache_base);
+    if (ctx->pfn2cache)
+        free(ctx->pfn2cache);
+    if (ctx->cache)
+        free(ctx->cache);
+    free(ctx);
+}
+
+comp_ctx *xc_compression_create_context(xc_interface *xch,
+                                        unsigned long p2m_size)
+{
+    unsigned long i;
+    comp_ctx *ctx = NULL;
+    unsigned long num_cache_pages = DELTA_CACHE_SIZE/XC_PAGE_SIZE;
+
+    ctx = (comp_ctx *)malloc(sizeof(comp_ctx));
+    if (!ctx)
+    {
+        ERROR("Failed to allocate compression_ctx\n");
+        goto error;
+    }
+    memset(ctx, 0, sizeof(comp_ctx));
+
+    ctx->inputbuf = xc_memalign(xch, XC_PAGE_SIZE, PAGE_BUFFER_SIZE);
+    if (!ctx->inputbuf)
+    {
+        ERROR("Failed to allocate page buffer\n");
+        goto error;
+    }
+
+    ctx->cache_base = xc_memalign(xch, XC_PAGE_SIZE, DELTA_CACHE_SIZE);
+    if (!ctx->cache_base)
+    {
+        ERROR("Failed to allocate delta cache\n");
+        goto error;
+    }
+
+    ctx->sendbuf_pfns = malloc(NRPAGES(PAGE_BUFFER_SIZE) *
+                               sizeof(xen_pfn_t));
+    if (!ctx->sendbuf_pfns)
+    {
+        ERROR("Could not alloc sendbuf_pfns\n");
+        goto error;
+    }
+    memset(ctx->sendbuf_pfns, -1,
+           NRPAGES(PAGE_BUFFER_SIZE) * sizeof(xen_pfn_t));
+
+    ctx->pfn2cache = calloc(p2m_size, sizeof(struct cache_page *));
+    if (!ctx->pfn2cache)
+    {
+        ERROR("Could not alloc pfn2cache map\n");
+        goto error;
+    }
+
+    ctx->cache = malloc(num_cache_pages * sizeof(struct cache_page));
+    if (!ctx->cache)
+    {
+        ERROR("Could not alloc compression cache\n");
+        goto error;
+    }
+
+    for (i = 0; i < num_cache_pages; i++)
+    {
+        ctx->cache[i].pfn = INVALID_P2M_ENTRY;
+        ctx->cache[i].page = ctx->cache_base + i * XC_PAGE_SIZE;
+        ctx->cache[i].prev = (i == 0) ? NULL : &(ctx->cache[i - 1]);
+        ctx->cache[i].next = ((i+1) == num_cache_pages)? NULL :
+            &(ctx->cache[i + 1]);
+    }
+    ctx->page_list_head = &(ctx->cache[0]);
+    ctx->page_list_tail = &(ctx->cache[num_cache_pages -1]);
+    ctx->dom_pfnlist_size = p2m_size;
+
+    return ctx;
+error:
+    xc_compression_free_context(xch, ctx);
+    return NULL;
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r 7e992e479411 -r 71d482d5f9ae tools/libxc/xc_domain_restore.c
--- a/tools/libxc/xc_domain_restore.c	Mon Nov 14 14:26:13 2011 -0800
+++ b/tools/libxc/xc_domain_restore.c	Mon Nov 14 14:27:09 2011 -0800
@@ -43,6 +43,7 @@
     xen_pfn_t *p2m_batch; /* A table of P2M mappings in the current region.  */
     int completed; /* Set when a consistent image is available */
     int last_checkpoint; /* Set when we should commit to the current checkpoint when it completes. */
+    int compressing; /* Set when sender signals that pages would be sent compressed (for Remus) */
     struct domain_info_context dinfo;
 };
 
@@ -663,6 +664,10 @@
     /* pages is of length nr_physpages, pfn_types is of length nr_pages */
     unsigned int nr_physpages, nr_pages;
 
+    /* checkpoint compression state */
+    int compressing;
+    unsigned long compbuf_pos, compbuf_size;
+
     /* Types of the pfns in the current region */
     unsigned long* pfn_types;
 
@@ -700,6 +705,7 @@
 {
     int count, countpages, oldcount, i;
     void* ptmp;
+    unsigned long compbuf_size;
 
     if ( RDEXACT(fd, &count, sizeof(count)) )
     {
@@ -809,6 +815,40 @@
         }
         return pagebuf_get_one(xch, ctx, buf, fd, dom);
 
+    case XC_SAVE_ID_ENABLE_COMPRESSION:
+        /* We cannot set compression flag directly in pagebuf structure,
+         * since this pagebuf still has uncompressed pages that are yet to
+         * be applied. We enable the compression field in pagebuf structure
+         * after receiving the first tailbuf.
+         */
+        ctx->compressing = 1;
+        // DPRINTF("compression flag received");
+        return pagebuf_get_one(xch, ctx, buf, fd, dom);
+
+    case XC_SAVE_ID_COMPRESSED_DATA:
+
+        /* read the length of compressed chunk coming in */
+        if ( RDEXACT(fd, &compbuf_size, sizeof(unsigned long)) )
+        {
+            PERROR("Error when reading compbuf_size");
+            return -1;
+        }
+        if (!compbuf_size) return 1;
+
+        buf->compbuf_size += compbuf_size;
+        if (!(ptmp = realloc(buf->pages, buf->compbuf_size))) {
+            ERROR("Could not (re)allocate compression buffer");
+            return -1;
+        }
+        buf->pages = ptmp;
+
+        if ( RDEXACT(fd, buf->pages + (buf->compbuf_size - compbuf_size),
+                     compbuf_size) ) {
+            PERROR("Error when reading compression buffer");
+            return -1;
+        }
+        return compbuf_size;
+
     default:
         if ( (count > MAX_BATCH_SIZE) || (count < 0) ) {
             ERROR("Max batch size exceeded (%d). Giving up.", count);
@@ -846,6 +886,13 @@
     if (!countpages)
         return count;
 
+    /* If Remus Checkpoint Compression is turned on, we will only be
+     * receiving the pfn lists now. The compressed pages will come in later,
+     * following a <XC_SAVE_ID_COMPRESSED_DATA, compressedChunkSize> tuple.
+     */
+    if (buf->compressing)
+        return pagebuf_get_one(xch, ctx, buf, fd, dom);
+
     oldcount = buf->nr_physpages;
     buf->nr_physpages += countpages;
     if (!buf->pages) {
@@ -874,6 +921,7 @@
     int rc;
 
     buf->nr_physpages = buf->nr_pages = 0;
+    buf->compbuf_pos = buf->compbuf_size = 0;
 
     do {
         rc = pagebuf_get_one(xch, ctx, buf, fd, dom);
@@ -1091,7 +1139,21 @@
         /* In verify mode, we use a copy; otherwise we work in place */
         page = pagebuf->verify ? (void *)buf : (region_base + i*PAGE_SIZE);
 
-        memcpy(page, pagebuf->pages + (curpage + curbatch) * PAGE_SIZE, PAGE_SIZE);
+        /* Remus - page decompression */
+        if (pagebuf->compressing)
+        {
+            if (xc_compression_uncompress_page(xch, pagebuf->pages,
+                                               pagebuf->compbuf_size,
+                                               &pagebuf->compbuf_pos,
+                                               (char *)page))
+            {
+                ERROR("Failed to uncompress page (pfn=%lx)\n", pfn);
+                goto err_mapped;
+            }
+        }
+        else
+            memcpy(page, pagebuf->pages + (curpage + curbatch) * PAGE_SIZE,
+                   PAGE_SIZE);
 
         pagetype &= XEN_DOMCTL_PFINFO_LTABTYPE_MASK;
 
@@ -1353,6 +1415,7 @@
 
         if ( !ctx->completed ) {
             pagebuf.nr_physpages = pagebuf.nr_pages = 0;
+            pagebuf.compbuf_pos = pagebuf.compbuf_size = 0;
             if ( pagebuf_get_one(xch, ctx, &pagebuf, io_fd, dom) < 0 ) {
                 PERROR("Error when reading batch");
                 goto out;
@@ -1395,6 +1458,7 @@
         }
 
         pagebuf.nr_physpages = pagebuf.nr_pages = 0;
+        pagebuf.compbuf_pos = pagebuf.compbuf_size = 0;
 
         n += j; /* crude stats */
 
@@ -1438,6 +1502,13 @@
          */
         if ( !ctx->last_checkpoint )
             fcntl(io_fd, F_SETFL, orig_io_fd_flags | O_NONBLOCK);
+
+        /*
+         * If sender had sent enable compression flag, switch to compressed
+         * checkpoints mode once the first checkpoint is received.
+         */
+        if (ctx->compressing)
+            pagebuf.compressing = 1;
     }
 
     if (pagebuf.acpi_ioport_location == 1) {
diff -r 7e992e479411 -r 71d482d5f9ae tools/libxc/xc_domain_save.c
--- a/tools/libxc/xc_domain_save.c	Mon Nov 14 14:26:13 2011 -0800
+++ b/tools/libxc/xc_domain_save.c	Mon Nov 14 14:27:09 2011 -0800
@@ -218,6 +218,56 @@
         return noncached_write(xch, ob, fd, buf, len);
 }
 
+static int write_compressed(xc_interface *xch, comp_ctx *compress_ctx,
+                            int dobuf, struct outbuf* ob, int fd)
+{
+    int rc = 0;
+    int header = sizeof(int) + sizeof(unsigned long);
+    int marker = XC_SAVE_ID_COMPRESSED_DATA;
+    unsigned long compbuf_len = 0;
+
+    do
+    {
+        /* check for available space (atleast 8k) */
+        if ((ob->pos + header + XC_PAGE_SIZE * 2) > ob->size)
+        {
+            if (outbuf_flush(xch, ob, fd) < 0)
+            {
+                ERROR("Error when flushing outbuf intermediate");
+                return -1;
+            }
+        }
+
+        rc = xc_compression_compress_pages(xch, compress_ctx,
+                                           ob->buf + ob->pos + header,
+                                           ob->size - ob->pos - header,
+                                           &compbuf_len);
+        if (!rc)
+            return 0;
+
+        if (outbuf_hardwrite(xch, ob, fd, &marker, sizeof(marker)) < 0)
+        {
+            PERROR("Error when writing marker (errno %d)", errno);
+            return -1;
+        }
+
+        if (outbuf_hardwrite(xch, ob, fd, &compbuf_len, sizeof(compbuf_len)) < 0)
+        {
+            PERROR("Error when writing compbuf_len (errno %d)", errno);
+            return -1;
+        }
+
+        ob->pos += (size_t) compbuf_len;
+        if (!dobuf && outbuf_flush(xch, ob, fd) < 0)
+        {
+            ERROR("Error when writing compressed chunk");
+            return -1;
+        }
+    } while (rc != 0);
+
+    return 0;
+}
+
 struct time_stats {
     struct timeval wall;
     long long d0_cpu, d1_cpu;
@@ -815,11 +865,35 @@
 
     unsigned long mfn;
 
-    struct outbuf ob;
+    /* Without checkpoint compression, the dirty pages, pfn arrays
+     * and tailbuf (vcpu ctx, shared info page, etc.)  are written
+     * directly to outbuf. All of this is done while the domain is
+     * suspended.
+     *
+     * When checkpoint compression is enabled, the dirty pages are
+     * buffered, compressed "after" the domain is resumed and then
+     * written to outbuf. Since tailbuf data are collected while a
+     * domain is suspended, they cannot be directly written to the
+     * outbuf as there is no dirty page data preceeding tailbuf.
+     *
+     * So,two output buffers are maintained. Tailbuf data goes into
+     * ob_tailbuf. The dirty pages are compressed after resuming the
+     * domain and written to ob_pagebuf. ob_tailbuf is then appended
+     * to ob_pagebuf and finally flushed out.
+     */
+    struct outbuf ob_pagebuf, ob_tailbuf, *ob = NULL;
     struct save_ctx _ctx;
     struct save_ctx *ctx = &_ctx;
     struct domain_info_context *dinfo = &ctx->dinfo;
 
+    /* Compression context */
+    comp_ctx *compress_ctx= NULL;
+    /* Even if XCFLAGS_CHECKPOINT_COMPRESS is set, we enable compression only
+     * after sending XC_SAVE_ID_ENABLE_COMPRESSION and the tailbuf for
+     * first time.
+     */
+    int compressing = 0;
+
     int completed = 0;
 
     if ( hvm && !callbacks->switch_qemu_logdirty )
@@ -829,7 +903,7 @@
         return 1;
     }
 
-    outbuf_init(xch, &ob, OUTBUF_SIZE);
+    outbuf_init(xch, &ob_pagebuf, OUTBUF_SIZE);
 
     memset(ctx, 0, sizeof(*ctx));
 
@@ -917,6 +991,16 @@
         }
     }
 
+    if ( flags & XCFLAGS_CHECKPOINT_COMPRESS )
+    {
+        if (!(compress_ctx = xc_compression_create_context(xch, dinfo->p2m_size)))
+        {
+            ERROR("Failed to create compression context");
+            goto out;
+        }
+        outbuf_init(xch, &ob_tailbuf, OUTBUF_SIZE/4);
+    }
+
     last_iter = !live;
 
     /* pretend we sent all the pages last iteration */
@@ -1025,9 +1109,11 @@
     }
 
   copypages:
-#define wrexact(fd, buf, len) write_buffer(xch, last_iter, &ob, (fd), (buf), (len))
-#define wruncached(fd, live, buf, len) write_uncached(xch, last_iter, &ob, (fd), (buf), (len))
+#define wrexact(fd, buf, len) write_buffer(xch, last_iter, ob, (fd), (buf), (len))
+#define wruncached(fd, live, buf, len) write_uncached(xch, last_iter, ob, (fd), (buf), (len))
+#define wrcompressed(fd) write_compressed(xch, compress_ctx, last_iter, ob, (fd))
 
+    ob = &ob_pagebuf; /* Holds pfn_types, pages/compressed pages */
     /* Now write out each data page, canonicalising page tables as we go... */
     for ( ; ; )
     {
@@ -1270,7 +1356,7 @@
                 {
                     /* If the page is not a normal data page, write out any
                        run of pages we may have previously acumulated */
-                    if ( run )
+                    if ( !compressing && run )
                     {
                         if ( wruncached(io_fd, live,
                                        (char*)region_base+(PAGE_SIZE*(j-run)), 
@@ -1305,7 +1391,41 @@
                         goto out;
                     }
 
-                    if ( wruncached(io_fd, live, page, PAGE_SIZE) != PAGE_SIZE )
+                    if (compressing)
+                    {
+                        int c_err;
+                        /* Mark pagetable page to be sent uncompressed */
+                        c_err = xc_compression_add_page(xch, compress_ctx, page,
+                                                        pfn, 1 /* raw page */);
+                        if (c_err == -2) /* OOB PFN */
+                        {
+                            ERROR("Could not add pagetable page "
+                                  "(pfn:%" PRIpfn "to page buffer\n", pfn);
+                            goto out;
+                        }
+
+                        if (c_err == -1)
+                        {
+                            /*
+                             * We are out of buffer space to hold dirty
+                             * pages. Compress and flush the current buffer
+                             * to make space. This is a corner case, that
+                             * slows down checkpointing as the compression
+                             * happens while domain is suspended. Happens
+                             * seldom and if you find this occuring
+                             * frequently, increase the PAGE_BUFFER_SIZE
+                             * in xc_compression.c.
+                             */
+                            if (wrcompressed(io_fd) < 0)
+                            {
+                                ERROR("Error when writing compressed"
+                                      " data (4b)\n");
+                                goto out;
+                            }
+                        }
+                    }
+                    else if ( wruncached(io_fd, live, page,
+                                         PAGE_SIZE) != PAGE_SIZE )
                     {
                         PERROR("Error when writing to state file (4b)"
                               " (errno %d)", errno);
@@ -1315,7 +1435,34 @@
                 else
                 {
                     /* We have a normal page: accumulate it for writing. */
-                    run++;
+                    if (compressing)
+                    {
+                        int c_err;
+                        /* For checkpoint compression, accumulate the page in the
+                         * page buffer, to be compressed later.
+                         */
+                        c_err = xc_compression_add_page(xch, compress_ctx, spage,
+                                                        pfn, 0 /* not raw page */);
+
+                        if (c_err == -2) /* OOB PFN */
+                        {
+                            ERROR("Could not add page "
+                                  "(pfn:%" PRIpfn "to page buffer\n", pfn);
+                            goto out;
+                        }
+
+                        if (c_err == -1)
+                        {
+                            if (wrcompressed(io_fd) < 0)
+                            {
+                                ERROR("Error when writing compressed"
+                                      " data (4c)\n");
+                                goto out;
+                            }
+                        }
+                    }
+                    else
+                        run++;
                 }
             } /* end of the write out for this batch */
 
@@ -1423,6 +1570,15 @@
 
     DPRINTF("All memory is saved\n");
 
+    /* After last_iter, buffer the rest of pagebuf & tailbuf data into a
+     * separate output buffer and flush it after the compressed page chunks.
+     */
+    if (compressing)
+    {
+        ob = &ob_tailbuf;
+        ob->pos = 0;
+    }
+
     {
         struct {
             int id;
@@ -1522,6 +1678,25 @@
         }
     }
 
+    /* Enable compression logic on both sides by sending this
+     * one time marker.
+     * NOTE: We could have simplified this procedure by sending
+     * the enable/disable compression flag before the beginning of
+     * the main for loop. But this would break compatibility for
+     * live migration code, with older versions of xen. So we have
+     * to enable it after the last_iter, when the XC_SAVE_ID_*
+     * elements are sent.
+     */
+    if (!compressing && (flags & XCFLAGS_CHECKPOINT_COMPRESS))
+    {
+        i = XC_SAVE_ID_ENABLE_COMPRESSION;
+        if ( wrexact(io_fd, &i, sizeof(int)) )
+        {
+            PERROR("Error when writing enable_compression marker");
+            goto out;
+        }
+    }
+
     /* Zero terminate */
     i = 0;
     if ( wrexact(io_fd, &i, sizeof(int)) )
@@ -1766,14 +1941,38 @@
     if ( !rc && callbacks->postcopy )
         callbacks->postcopy(callbacks->data);
 
+    /* guest has been resumed. Now we can compress data
+     * at our own pace.
+     */
+    if (!rc && compressing)
+    {
+        ob = &ob_pagebuf;
+        if (wrcompressed(io_fd) < 0)
+        {
+            ERROR("Error when writing compressed data, after postcopy\n");
+            rc = 1;
+            goto out;
+        }
+        /* Append the tailbuf data to the main outbuf */
+        if ( wrexact(io_fd, ob_tailbuf.buf, ob_tailbuf.pos) )
+        {
+            rc = 1;
+            PERROR("Error when copying tailbuf into outbuf");
+            goto out;
+        }
+    }
+
     /* Flush last write and discard cache for file. */
-    if ( outbuf_flush(xch, &ob, io_fd) < 0 ) {
+    if ( outbuf_flush(xch, ob, io_fd) < 0 ) {
         PERROR("Error when flushing output buffer");
         rc = 1;
     }
 
     discard_file_cache(xch, io_fd, 1 /* flush */);
 
+    /* Enable compression now, finally */
+    compressing = (flags & XCFLAGS_CHECKPOINT_COMPRESS);
+
     /* checkpoint_cb can spend arbitrarily long in between rounds */
     if (!rc && callbacks->checkpoint &&
         callbacks->checkpoint(callbacks->data) > 0)
@@ -1815,6 +2014,9 @@
             DPRINTF("Warning - couldn't disable qemu log-dirty mode");
     }
 
+    if (compress_ctx)
+        xc_compression_free_context(xch, compress_ctx);
+
     if ( live_shinfo )
         munmap(live_shinfo, PAGE_SIZE);
 
diff -r 7e992e479411 -r 71d482d5f9ae tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h	Mon Nov 14 14:26:13 2011 -0800
+++ b/tools/libxc/xenctrl.h	Mon Nov 14 14:27:09 2011 -0800
@@ -1910,4 +1910,64 @@
                         int verbose);
 /* Useful for callers who also use libelf. */
 
+/**
+ * Checkpoint Compression
+ */
+typedef struct compression_ctx comp_ctx;
+comp_ctx *xc_compression_create_context(xc_interface *xch,
+					unsigned long p2m_size);
+void xc_compression_free_context(xc_interface *xch, comp_ctx *ctx);
+
+/**
+ * Add a page to compression page buffer, to be compressed later.
+ *
+ * returns 0 if the page was successfully added to the page buffer
+ *
+ * returns -1 if there is no space in buffer. In this case, the
+ *  application should call xc_compression_compress_pages to compress
+ *  the buffer (or atleast part of it), thereby freeing some space in
+ *  the page buffer.
+ *
+ * returns -2 if the pfn is out of bounds, where the bound is p2m_size
+ *  parameter passed during xc_compression_create_context.
+ */
+int xc_compression_add_page(xc_interface *xch, comp_ctx *ctx, char *page,
+			    unsigned long pfn, int israw);
+
+/**
+ * Delta compress pages in the compression buffer and inserts the
+ * compressed data into the supplied compression buffer compbuf, whose
+ * size is compbuf_size.
+ * After compression, the pages are copied to the internal LRU cache.
+ *
+ * This function compresses as many pages as possible into the
+ * supplied compression buffer. It maintains an internal iterator to
+ * keep track of pages in the input buffer that are yet to be compressed.
+ *
+ * returns -1 if the compression buffer has run out of space.  
+ * returns 1 on success.
+ * returns 0 if no more pages are left to be compressed.
+ *  When the return value is non-zero, compbuf_len indicates the actual
+ *  amount of data present in compbuf (<=compbuf_size).
+ */
+int xc_compression_compress_pages(xc_interface *xch, comp_ctx *ctx,
+				  char *compbuf, unsigned long compbuf_size,
+				  unsigned long *compbuf_len);
+
+/**
+ * Resets the internal page buffer that holds dirty pages before compression.
+ * Also resets the iterators.
+ */
+void xc_compression_reset_pagebuf(xc_interface *xch, comp_ctx *ctx);
+
+/**
+ * Caller must supply the compression buffer (compbuf),
+ * its size (compbuf_size) and a reference to index variable (compbuf_pos)
+ * that is used internally. Each call pulls out one page from the compressed
+ * chunk and copies it to dest.
+ */
+int xc_compression_uncompress_page(xc_interface *xch, char *compbuf,
+				   unsigned long compbuf_size,
+				   unsigned long *compbuf_pos, char *dest);
+
 #endif /* XENCTRL_H */
diff -r 7e992e479411 -r 71d482d5f9ae tools/libxc/xenguest.h
--- a/tools/libxc/xenguest.h	Mon Nov 14 14:26:13 2011 -0800
+++ b/tools/libxc/xenguest.h	Mon Nov 14 14:27:09 2011 -0800
@@ -27,6 +27,7 @@
 #define XCFLAGS_DEBUG     2
 #define XCFLAGS_HVM       4
 #define XCFLAGS_STDVGA    8
+#define XCFLAGS_CHECKPOINT_COMPRESS    16
 #define X86_64_B_SIZE   64 
 #define X86_32_B_SIZE   32
 
diff -r 7e992e479411 -r 71d482d5f9ae tools/libxc/xg_save_restore.h
--- a/tools/libxc/xg_save_restore.h	Mon Nov 14 14:26:13 2011 -0800
+++ b/tools/libxc/xg_save_restore.h	Mon Nov 14 14:27:09 2011 -0800
@@ -67,7 +67,7 @@
  *
  *   consists of p2m_size bytes comprising an array of xen_pfn_t sized entries.
  *
- * BODY PHASE
+ * BODY PHASE - Format A (for live migration or Remus without compression)
  * ----------
  *
  * A series of chunks with a common header:
@@ -87,6 +87,122 @@
  *
  * If chunk type is 0 then body phase is complete.
  *
+ *
+ * BODY PHASE - Format B (for Remus with compression)
+ * ----------
+ *
+ * A series of chunks with a common header:
+ *   int              : chunk type
+ *
+ * If the chunk type is +ve then chunk contains array of PFNs corresponding
+ * to guest memory and type contains the number of PFNs in the batch:
+ *
+ *     unsigned long[]  : PFN array, length == number of pages in batch
+ *                        Each entry consists of XEN_DOMCTL_PFINFO_*
+ *                        in bits 31-28 and the PFN number in bits 27-0.
+ *
+ * If the chunk type is -ve then chunk consists of one of a number of
+ * metadata types.  See definitions of XC_SAVE_ID_* below.
+ *
+ * If the chunk type is -ve and equals XC_SAVE_ID_COMPRESSED_DATA, then the
+ * chunk consists of compressed page data, in the following format:
+ *
+ *     unsigned long        : Size of the compressed chunk to follow
+ *     compressed data :      variable length data of size indicated above.
+ *                            This chunk consists of compressed page data.
+ *                            The number of pages in one chunk depends on
+ *                            the amount of space available in the sender's
+ *                            output buffer.
+ *
+ * Format of compressed data:
+ *   compressed_data = <deltas>*
+ *   delta           = <marker, run*>
+ *   marker          = (RUNFLAG|SKIPFLAG) bitwise-or RUNLEN [1 byte marker]
+ *   RUNFLAG         = 0
+ *   SKIPFLAG        = 1 << 7
+ *   RUNLEN          = 7-bit unsigned value indicating number of WORDS in the run
+ *   run             = string of bytes of length sizeof(WORD) * RUNLEN
+ *
+ *    If marker contains RUNFLAG, then RUNLEN * sizeof(WORD) bytes of data following
+ *   the marker is copied into the target page at the appropriate offset indicated by
+ *   the offset_ptr
+ *    If marker contains SKIPFLAG, then the offset_ptr is advanced
+ *   by RUNLEN * sizeof(WORD).
+ *
+ * If chunk type is 0 then body phase is complete.
+ *
+ * There can be one or more chunks with type XC_SAVE_ID_COMPRESSED_DATA,
+ * containing compressed pages. The compressed chunks are collated to form
+ * one single compressed chunk for the entire iteration. The number of pages
+ * present in this final compressed chunk will be equal to the total number
+ * of valid PFNs specified by the +ve chunks.
+ *
+ * At the sender side, compressed pages are inserted into the output stream
+ * in the same order as they would have been if compression logic was absent.
+ *
+ * Until last iteration, the BODY is sent in Format A, to maintain live
+ * migration compatibility with receivers of older Xen versions.
+ * At the last iteration, if Remus compression was enabled, the sender sends
+ * a trigger, XC_SAVE_ID_ENABLE_COMPRESSION to tell the receiver to parse the
+ * BODY in Format B from the next iteration onwards.
+ *
+ * An example sequence of chunks received in Format B:
+ *     +16                              +ve chunk
+ *     unsigned long[16]                PFN array
+ *     +100                             +ve chunk
+ *     unsigned long[100]               PFN array
+ *     +50                              +ve chunk
+ *     unsigned long[50]                PFN array
+ *
+ *     XC_SAVE_ID_COMPRESSED_DATA       TAG
+ *       N                              Length of compressed data
+ *       N bytes of DATA                Decompresses to 166 pages
+ *
+ *     XC_SAVE_ID_*                     other xc save chunks
+ *     0                                END BODY TAG
+ *
+ * Corner case with checkpoint compression:
+ *     At sender side, after pausing the domain, dirty pages are usually
+ *   copied out to a temporary buffer. After the domain is resumed,
+ *   compression is done and the compressed chunk(s) are sent, followed by
+ *   other XC_SAVE_ID_* chunks.
+ *     If the temporary buffer gets full while scanning for dirty pages,
+ *   the sender stops buffering of dirty pages, compresses the temporary
+ *   buffer and sends the compressed data with XC_SAVE_ID_COMPRESSED_DATA.
+ *   The sender then resumes the buffering of dirty pages and continues
+ *   scanning for the dirty pages.
+ *     For e.g., assume that the temporary buffer can hold 4096 pages and
+ *   there are 5000 dirty pages. The following is the sequence of chunks
+ *   that the receiver will see:
+ *
+ *     +1024                       +ve chunk
+ *     unsigned long[1024]         PFN array
+ *     +1024                       +ve chunk
+ *     unsigned long[1024]         PFN array
+ *     +1024                       +ve chunk
+ *     unsigned long[1024]         PFN array
+ *     +1024                       +ve chunk
+ *     unsigned long[1024]         PFN array
+ *
+ *     XC_SAVE_ID_COMPRESSED_DATA  TAG
+ *      N                          Length of compressed data
+ *      N bytes of DATA            Decompresses to 4096 pages
+ *
+ *     +4                          +ve chunk
+ *     unsigned long[4]            PFN array
+ *
+ *     XC_SAVE_ID_COMPRESSED_DATA  TAG
+ *      M                          Length of compressed data
+ *      M bytes of DATA            Decompresses to 4 pages
+ *
+ *     XC_SAVE_ID_*                other xc save chunks
+ *     0                           END BODY TAG
+ *
+ *     In other words, XC_SAVE_ID_COMPRESSED_DATA can be interleaved with
+ *   +ve chunks arbitrarily. But at the receiver end, the following condition
+ *   always holds true until the end of BODY PHASE:
+ *    num(PFN entries +ve chunks) >= num(pages received in compressed form)
+ *
  * TAIL PHASE
  * ----------
  *
@@ -134,6 +250,8 @@
 #define XC_SAVE_ID_HVM_CONSOLE_PFN    -8 /* (HVM-only) */
 #define XC_SAVE_ID_LAST_CHECKPOINT    -9 /* Commit to restoring after completion of current iteration. */
 #define XC_SAVE_ID_HVM_ACPI_IOPORTS_LOCATION -10
+#define XC_SAVE_ID_COMPRESSED_DATA    -11 /* Marker to indicate arrival of compressed data */
+#define XC_SAVE_ID_ENABLE_COMPRESSION -12 /* Marker to enable compression logic at receiver side */
 
 /*
 ** We process save/restore/migrate in batches of pages; the below

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:14:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:14:16 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5jE-0002z7-FQ; Mon, 14 Nov 2011 15:14:16 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ2Gs-0005nP-Og
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 11:32:47 -0800
X-Env-Sender: nhorman@tuxdriver.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1321299162!4161151!1
X-Originating-IP: [70.61.120.58]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8241 invoked from network); 14 Nov 2011 19:32:43 -0000
Received: from charlotte.tuxdriver.com (HELO smtp.tuxdriver.com) (70.61.120.58)
	by server-16.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Nov 2011 19:32:43 -0000
Received: from hmsreliant.think-freely.org
	([2001:470:8:a08:7aac:c0ff:fec2:933b] helo=localhost)
	by smtp.tuxdriver.com with esmtpsa (TLSv1:AES128-SHA:128) (Exim 4.63)
	(envelope-from <nhorman@tuxdriver.com>)
	id 1RQ2Gg-0001Kw-GN; Mon, 14 Nov 2011 14:32:36 -0500
Date: Mon, 14 Nov 2011 14:32:33 -0500
From: Neil Horman <nhorman@tuxdriver.com>
To: David Miller <davem@davemloft.net>
Message-ID: <20111114193233.GD27284@hmsreliant.think-freely.org>
References: <1321298544-16434-1-git-send-email-nhorman@tuxdriver.com>
	<20111114.142716.615003966880410697.davem@davemloft.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111114.142716.615003966880410697.davem@davemloft.net>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Spam-Score: -2.6 (--)
X-Spam-Status: No
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:24 -0800
Cc: netdev@vger.kernel.org, jeremy.fitzhardinge@citrix.com,
	xen-devel@lists.xensource.com, konrad.wilk@oracle.com
Subject: [Xen-devel] Re: [PATCH] Don't allow sharing of tx skbs on
	xen-netfront
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 02:27:16PM -0500, David Miller wrote:
> From: Neil Horman <nhorman@tuxdriver.com>
> Date: Mon, 14 Nov 2011 14:22:24 -0500
> 
> > It was pointed out to me recently that the xen-netfront driver can't safely
> > support shared skbs on transmit, since, while it doesn't maintain skb state
> > directly, it does pass a pointer to the skb to the hypervisor via a list, and
> > the hypervisor may expect the contents of the skb to remain stable.  Clearing
> > the IFF_TX_SKB_SHARING flag after the call to alloc_etherdev to make it safe.
> > 
> > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> 
> Please put an appropriate prefix into the subject lines of your patch
> submissions.  In this case "[PATCH] xen-netfront: ..." would be appropriate.
> 
> I've been letting you get away with this for the past few weeks and I've
> decided that it's your turn to start getting this right :-)
Jeez Dave, I got it right on the cgroups post, you want consistency now
too?  :).

Apologies, I need to consult a checklist for myself prior to sending stuff.

Best
Neil



> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:16:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:16:00 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5ku-0003Mq-Gg; Mon, 14 Nov 2011 15:16:00 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJr1v-0000bA-0D
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 11:19:47 -0700
X-Env-Sender: sboyd@codeaurora.org
X-Msg-Ref: server-11.tower-21.messagelabs.com!1319825982!2050733!1
X-Originating-IP: [199.106.114.254]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17635 invoked from network); 28 Oct 2011 18:19:43 -0000
Received: from wolverine01.qualcomm.com (HELO wolverine01.qualcomm.com)
	(199.106.114.254)
	by server-11.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 28 Oct 2011 18:19:43 -0000
X-IronPort-AV: E=McAfee;i="5400,1158,6513"; a="131812278"
Received: from pdmz-css-vrrp.qualcomm.com (HELO mostmsg01.qualcomm.com)
	([199.106.114.130])
	by wolverine01.qualcomm.com with ESMTP/TLS/ADH-AES256-SHA;
	28 Oct 2011 11:19:41 -0700
Received: from [10.46.164.20] (pdmz-snip-v218.qualcomm.com [192.168.218.1])
	by mostmsg01.qualcomm.com (Postfix) with ESMTPA id 6E68410004A2;
	Fri, 28 Oct 2011 11:19:41 -0700 (PDT)
Message-ID: <4EAAF23C.8050102@codeaurora.org>
Date: Fri, 28 Oct 2011 11:19:40 -0700
From: Stephen Boyd <sboyd@codeaurora.org>
User-Agent: Mozilla/5.0 (X11; Linux i686 on x86_64;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: Joe Perches <joe@perches.com>
References: <20111027173527.GA23839@phenom.dumpdata.com>
	<1319751802-27013-1-git-send-email-miche@google.com>
	<1319770558.2529.20.camel@Joe-Laptop>
In-Reply-To: <1319770558.2529.20.camel@Joe-Laptop>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:28 -0800
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Greg Kroah-Hartman <gregkh@suse.de>, Miche Baker-Harvey <miche@google.com>,
	linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org,
	Anton Blanchard <anton@samba.org>, Amit Shah <amit.shah@redhat.com>
Subject: [Xen-devel] Re: [PATCH] VirtioConsole support.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 10/27/11 19:55, Joe Perches wrote:
>
> @@ -845,6 +857,19 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
>  	kref_init(&hp->kref);
>  
>  	INIT_WORK(&hp->tty_resize, hvc_set_winsz);
> +	/*
> +	 * make each console its own struct console.
> +	 * No need to do allocation and copy under lock.
> +	 */
> +	cp = kzalloc(sizeof(*cp), GFP_KERNEL);
> +	if (!cp) {
> +		kfree(hp);
> +		mutex_unlock(&hvc_ports_mutex);
> +		return ERR_PTR(-ENOMEM);
> +	}
> +	memcpy(cp, &hvc_console, sizeof(*cp));
> The kzalloc should be kmalloc as the allocated
> memory is immediately overwritten.

Even better would be kmemdup().

-- 
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:17:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:17:26 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5mI-0003la-Cw; Mon, 14 Nov 2011 15:17:26 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKcjn-0000YP-So; Sun, 30 Oct 2011 14:16:16 -0700
X-Env-Sender: mail.baruchi@gmail.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320009347!50775729!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22500 invoked from network); 30 Oct 2011 21:15:48 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2011 21:15:48 -0000
Received: by vws13 with SMTP id 13so107743vws.30
	for <multiple recipients>; Sun, 30 Oct 2011 14:16:11 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=AQdEAgO9Z0GZuihcTg03aodZMkwnGeM11t6dZLnJcKE=;
	b=Aj9emYu+eWJDwMxHwzg4KYF02I1Nw8EUfsnbcvSu5SvC6fypgKxnsfNA7fK/DFsfjd
	vyVyGP9IHgwwGSNx6MtSANS7pYMeU1B1gHHqciSk0l1Lt3O51yxmQ5qfiiWk/LDpRd6h
	wgq4Vp6ZTShD31+m6aE7lZ/CB+K1eBadJS1Dc=
MIME-Version: 1.0
Received: by 10.52.100.70 with SMTP id ew6mr2876967vdb.49.1320009371136; Sun,
	30 Oct 2011 14:16:11 -0700 (PDT)
Received: by 10.52.187.103 with HTTP; Sun, 30 Oct 2011 14:16:11 -0700 (PDT)
Date: Sun, 30 Oct 2011 19:16:11 -0200
Message-ID: <CAAiDW_SQ+UnVK1Xvwk1S_24tf9BcC5BEH0WcMC104R32c1_4TQ@mail.gmail.com>
From: Artur Baruchi <mail.baruchi@gmail.com>
To: Xen-devel@lists.xensource.com, xen-users <Xen-users@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-1
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:33 -0800
Cc: 
Subject: [Xen-devel] Module Error
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi.

Im writing a kernel module to extract some information from kernel,
the module is working really fine in an AMD (AMD Athlon(tm) 64 X2 Dual
Core Processor 3800+), but, when trying to run the module in a i7
(Intel(R) Core(TM) i7 CPU 930 @ 2.80GHz) Im facing some strange errors
(see below). The kernel versions are just the same on both machines
(2.6.34.10-0.2-xen #1 SMP x86_64 x86_64 x86_64 GNU/Linux). The
difference are the amount of memory AND processor vendor. I noted that
the line of code that hangs my machine is this one:

if(end->host==NULL) {

The end->host points to an Inode type (end is an address_space type).
If I remove this line, the module works (but, obviously, do not return
what I want). I tried the same code in a kernel without xen
(2.6.34.10-0.2-desktop #1 SMP x86_64 x86_64 x86_64 GNU/Linux) and
worked fine, so I suppose that this error is due to something in Xen
running in a intel processor (I tried the module in an intel quad, and
got the same error). Follow some outputs:

The error stack:
Oct 28 23:40:35 goku kernel: [ 4472.129718] BUG: unable to handle
kernel paging request at 000003d600000004
Oct 28 23:40:35 goku kernel: [ 4472.129933] IP: [<ffffffffa08d118c>]
get_files+0x6c/0x220 [pagecache]
Oct 28 23:40:35 goku kernel: [ 4472.130098] PGD 0
Oct 28 23:40:35 goku kernel: [ 4472.130250] Oops: 0000 [#4] SMP
Oct 28 23:40:35 goku kernel: [ 4472.130452] last sysfs file:
/sys/devices/system/cpu/cpu7/online
Oct 28 23:40:35 goku kernel: [ 4472.130562] CPU 0
Oct 28 23:40:35 goku kernel: [ 4472.130615] Modules linked in:
pagecache ocfs2_dlmfs ocfs2_stack_o2cb ocfs2_dlm ocfs2_nodemanager
ocfs2_stackglue configfs drbd crc32c libcrc32c bridge stp llc nfsd
lockd nfs_acl snd_pcm_oss auth_rpcgss snd_mixer_oss usbbk gntdev netbk
blkbk blkback_pagemap blktap domctl xenbus_be snd_seq evtchn
snd_seq_device sunrpc exportfs edd fuse loop snd_hda_codec_realtek
firewire_ohci snd_hda_intel firewire_core snd_hda_codec crc_itu_t
snd_hwdep snd_pcm snd_timer ohci1394 iTCO_wdt snd soundcore sr_mod
xhci_hcd ieee1394 i2c_i801 iTCO_vendor_support pcspkr snd_page_alloc
sg r8169 wmi serio_raw ext4 jbd2 crc16 linear uhci_hcd sd_mod nouveau
ehci_hcd ttm drm_kms_helper usbcore drm agpgart i2c_algo_bit i2c_core
button dm_snapshot dm_mod xenblk cdrom xennet fan processor ata_piix
ahci pata_jmicron ata_generic libata scsi_mod thermal thermal_sys
hwmon
Oct 28 23:40:35 goku kernel: [ 4472.132037]
Oct 28 23:40:35 goku kernel: [ 4472.132037] Pid: 4641, comm: cat
Tainted: G      D    2.6.34.10-0.2-xen #1 X58A-UD3R/X58A-UD3R
Oct 28 23:40:35 goku kernel: [ 4472.132037] RIP:
e030:[<ffffffffa08d118c>]  [<ffffffffa08d118c>] get_files+0x6c/0x220
[pagecache]
Oct 28 23:40:35 goku kernel: [ 4472.132037] RSP: e02b:ffff8801ded93c88
 EFLAGS: 00010246
Oct 28 23:40:35 goku kernel: [ 4472.132037] RAX: 8000000004000400 RBX:
ffff8801e8ea5bd0 RCX: 0000000000000001
Oct 28 23:40:35 goku kernel: [ 4472.132037] RDX: ffff8801efc8c7e8 RSI:
ffffffffa08d15c0 RDI: ffff8801e8ea4c28
Oct 28 23:40:35 goku kernel: [ 4472.132037] RBP: 0000000000000001 R08:
ffff8801eed81e00 R09: 0000000000000000
Oct 28 23:40:35 goku kernel: [ 4472.132037] R10: ffff8801e8ea5c00 R11:
0000000000000000 R12: 00000000001e6000
Oct 28 23:40:35 goku kernel: [ 4472.132037] R13: 0000000006a50000 R14:
ffff8801e8ea5b88 R15: 000003d600000004
Oct 28 23:40:35 goku kernel: [ 4472.132037] FS:
00007fcb81c3b700(0000) GS:ffff88000200b000(0000)
knlGS:0000000000000000
Oct 28 23:40:35 goku kernel: [ 4472.132037] CS:  e033 DS: 0000 ES:
0000 CR0: 0000000080050033
Oct 28 23:40:35 goku kernel: [ 4472.132037] CR2: 000003d600000004 CR3:
00000001edecf000 CR4: 0000000000002660
Oct 28 23:40:35 goku kernel: [ 4472.132037] DR0: 0000000000000000 DR1:
0000000000000000 DR2: 0000000000000000
Oct 28 23:40:35 goku kernel: [ 4472.132037] DR3: 0000000000000000 DR6:
00000000ffff0ff0 DR7: 0000000000000400
Oct 28 23:40:35 goku kernel: [ 4472.132037] Process cat (pid: 4641,
threadinfo ffff8801ded92000, task ffff8801eedfa780)
Oct 28 23:40:35 goku kernel: [ 4472.132037] Stack:
Oct 28 23:40:35 goku kernel: [ 4472.132037]  0000000101baa5b4
0000000200000002 0000000000000000 ffff8801f16ffae8
Oct 28 23:40:35 goku kernel: [ 4472.132037] <0> 0000000000000000
ffff8801ee7c6500 ffff8801efd32bc0 ffff8801e45de2d0
Oct 28 23:40:35 goku kernel: [ 4472.132037] <0> ffff8801ee7c6500
ffff8801f05d80f8 ffffffff801314f0 ffffffffa08d1349
Oct 28 23:40:35 goku kernel: [ 4472.132037] Call Trace:
Oct 28 23:40:35 goku kernel: [ 4472.132037]  [<ffffffffa08d1349>]
cache_open+0x9/0x20 [pagecache]
Oct 28 23:40:35 goku kernel: [ 4472.132037]  [<ffffffff8016c529>]
proc_reg_open+0xb9/0x240
Oct 28 23:40:35 goku kernel: [ 4472.132037]  [<ffffffff8011060b>]
__dentry_open+0xeb/0x340
Oct 28 23:40:35 goku kernel: [ 4472.132037]  [<ffffffff801206a8>]
finish_open+0xe8/0x1c0
Oct 28 23:40:35 goku kernel: [ 4472.132037]  [<ffffffff80120f40>]
do_filp_open+0x1a0/0x630
Oct 28 23:40:35 goku kernel: [ 4472.132037]  [<ffffffff8011214a>]
do_sys_open+0x6a/0x140
Oct 28 23:40:35 goku kernel: [ 4472.132037]  [<ffffffff80007438>]
system_call_fastpath+0x16/0x1b
Oct 28 23:40:35 goku kernel: [ 4472.132037]  [<00007fcb817a7130>] 0x7fcb817a7130
Oct 28 23:40:35 goku kernel: [ 4472.132037] Code: 03 05 69 9d f9 df 4c
8b 78 18 4d 85 ff 0f 84 9c 00 00 00 41 f6 c7 01 0f 85 92 00 00 00 48
8b 00 a9 00 00 02 00 0f 85 84 00 00 00 <49> 8b 1f 48 85 db 0f 84 78 00
00 00 48 83 7b 40 00 74 71 4c 8b
Oct 28 23:40:35 goku kernel: [ 4472.132037] RIP  [<ffffffffa08d118c>]
get_files+0x6c/0x220 [pagecache]
Oct 28 23:40:35 goku kernel: [ 4472.132037]  RSP <ffff8801ded93c88>
Oct 28 23:40:35 goku kernel: [ 4472.132037] CR2: 000003d600000004
Oct 28 23:40:35 goku kernel: [ 4472.143966] ---[ end trace a998217447e12d1d ]---

Peace of code (simplified):
int init_module () {

	unsigned long pfn;
	struct inode *ino;
	unsigned char * c;
	struct address_space *end;
	struct dentry *dentry;
	int fl;

	struct filepage * temp;
	struct filepage *pos;

	for (pfn = 0; pfn < num_physpages; pfn++) {
		struct page *page;
		if (!pfn_valid(pfn))
			continue;
		page = pfn_to_page(pfn);
				if((page->mapping!=NULL) && (!PageAnon(page)) && (!PageSwapCache(page))) {
						end = page->mapping;
						if(end->host==NULL) {  <- without this line, no hangs, but the
module returns wrong data to me...
							printk(KERN_INFO "Cool... found an valid inode \n");
						}
				}				
					
	}
return 0;
}

Thanks in advance.

Att.
Artur Baruchi

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:18:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:18:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5nI-00048z-86; Mon, 14 Nov 2011 15:18:28 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKmeK-0004Ef-7O
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 00:51:16 -0700
X-Env-Sender: rusty@ozlabs.org
X-Msg-Ref: server-4.tower-216.messagelabs.com!1320047470!1632234!1
X-Originating-IP: [203.10.76.45]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30407 invoked from network); 31 Oct 2011 07:51:13 -0000
Received: from ozlabs.org (HELO ozlabs.org) (203.10.76.45)
	by server-4.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 31 Oct 2011 07:51:13 -0000
Received: by ozlabs.org (Postfix, from userid 1011)
	id E17DDB6F7B; Mon, 31 Oct 2011 18:51:07 +1100 (EST)
From: Rusty Russell <rusty@ozlabs.org>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, miche@google.com,
	gregkh@suse.de, linux-kernel@vger.kernel.org
In-Reply-To: <20111027053007.GA32765@phenom.dumpdata.com>
References: <20111027053007.GA32765@phenom.dumpdata.com>
User-Agent: Notmuch/0.6.1-1 (http://notmuchmail.org) Emacs/23.3.1
	(i686-pc-linux-gnu)
Date: Mon, 31 Oct 2011 18:18:26 +1030
Message-ID: <87d3ddppo5.fsf@rustcorp.com.au>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:30 -0800
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: Regression: patch " hvc_console: display printk
	messages on console." causing infinite loop with 3.2-rc0 + Xen.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 27 Oct 2011 01:30:08 -0400, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
Non-text part: multipart/mixed
> Hey Miche.
> 
> The git commit 361162459f62dc0826b82c9690a741a940f457f0:
> 
>     hvc_console: display printk messages on console.
> 
> is causing an infinite loop when booting Linux under Xen, as so:

lguest too.

This is not a concurrency problem: the issue seems to be that calling
register_console() twice on the same struct console is a bad idea.

Simple fix which works here (might be completely wrong):

diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c
--- a/drivers/tty/hvc/hvc_console.c
+++ b/drivers/tty/hvc/hvc_console.c
@@ -197,6 +197,8 @@ static int __init hvc_console_setup(stru
 	return 0;
 }
 
+static bool console_registered = false;
+
 static struct console hvc_console = {
 	.name		= "hvc",
 	.write		= hvc_console_print,
@@ -224,6 +226,7 @@ static struct console hvc_console = {
 static int __init hvc_console_init(void)
 {
 	register_console(&hvc_console);
+	console_registered = true;
 	return 0;
 }
 console_initcall(hvc_console_init);
@@ -279,8 +282,10 @@ int hvc_instantiate(uint32_t vtermno, in
 	 * now (setup won't fail at this point).  It's ok to just
 	 * call register again if previously .setup failed.
 	 */
-	if (index == hvc_console.index)
+	if (index == hvc_console.index && !console_registered) {
 		register_console(&hvc_console);
+		console_registered = true;
+	}
 
 	return 0;
 }
@@ -868,7 +873,10 @@ struct hvc_struct *hvc_alloc(uint32_t vt
 
 	list_add_tail(&(hp->next), &hvc_structs);
 	spin_unlock(&hvc_structs_lock);
-	register_console(&hvc_console);
+	if (!console_registered) {
+		register_console(&hvc_console);
+		console_registered = true;
+	}
 
 	return hp;
 }
@@ -880,6 +888,7 @@ int hvc_remove(struct hvc_struct *hp)
 	struct tty_struct *tty;
 
 	unregister_console(&hvc_console);
+	console_registered = false;
 	spin_lock_irqsave(&hp->lock, flags);
 	tty = tty_kref_get(hp->tty);
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:19:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:19:19 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5o7-0004WY-3E; Mon, 14 Nov 2011 15:19:19 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RKob0-0004VB-Qj
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 02:55:59 -0700
X-Env-Sender: amit.shah@redhat.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1320054954!1325102!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29533 invoked from network); 31 Oct 2011 09:55:55 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-6.tower-182.messagelabs.com with SMTP;
	31 Oct 2011 09:55:55 -0000
Received: from int-mx02.intmail.prod.int.phx2.redhat.com
	(int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p9V9tnCZ020548
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 31 Oct 2011 05:55:49 -0400
Received: from localhost ([10.3.113.6])
	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id p9V9tjFt017405; Mon, 31 Oct 2011 05:55:47 -0400
Date: Mon, 31 Oct 2011 15:25:44 +0530
From: Amit Shah <amit.shah@redhat.com>
To: Miche Baker-Harvey <miche@google.com>
Message-ID: <20111031095544.GB3557@amit-x200.redhat.com>
References: <20111027173527.GA23839@phenom.dumpdata.com>
	<1319740793-2187-1-git-send-email-miche@google.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319740793-2187-1-git-send-email-miche@google.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:35 -0800
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Greg Kroah-Hartman <gregkh@suse.de>, linux-kernel@vger.kernel.org,
	virtualization@lists.linux-foundation.org,
	Anton Blanchard <anton@samba.org>
Subject: [Xen-devel] Re: [PATCH] VirtioConsole support.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On (Thu) 27 Oct 2011 [11:39:53], Miche Baker-Harvey wrote:
> Multiple HVC console terminals enabled.
> 
> Serialize device and port open and initialization.  Added a mutex
> which gates the handling of control messages in virtio_console.c.
> This includes adding and removing ports, and making opened ports be
> consoles.  Extended the use of the prvdata spinlock to cover some missed
> modifications to prvdata.next_vtermno.
> 
> I also added a mutex in hvc_console::hvc_alloc() to coordinate waiting
> for the driver to be ready, and for the one-time call to hvc_init().  It
> had been the case that this was sometimes being called mulitple times, and
> partially setup state was being used by the second caller of hvc_alloc().
> 
> Make separate struct console* for each new port.  There was a single static
> struct console* hvc_console, to be used for early printk.  We aren't doing
> early printk, but more importantly, there is no code to multiplex on that
> one console.  Multiple virtio_console ports were "sharing" this, which was
> disasterous since both the index and the flags for the console are stored
> there. The console struct is remembered in the hvc_struct, and it is
> deallocated when the hvc_struct is deallocated.
> 
> ------------------
> 
> Konrad, thanks for trying this out on Xen.
> This is working in my KVM environment, letting me start multiple
> virtio_consoles with getty's on them, but I'm really not sure how
> all the console pieces fit together yet.  Feedback is welcome.
> 
> Signed-off-by: Miche Baker-Harvey <miche@google.com>
> ---
>  drivers/char/virtio_console.c |   22 +++++++++++++++++++---
>  drivers/tty/hvc/hvc_console.c |   39 +++++++++++++++++++++++++++++++++------
>  drivers/tty/hvc/hvc_console.h |    1 +
>  3 files changed, 53 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
> index fb68b12..e819d46 100644
> --- a/drivers/char/virtio_console.c
> +++ b/drivers/char/virtio_console.c
> @@ -24,6 +24,7 @@
>  #include <linux/fs.h>
>  #include <linux/init.h>
>  #include <linux/list.h>
> +#include <linux/mutex.h>
>  #include <linux/poll.h>
>  #include <linux/sched.h>
>  #include <linux/slab.h>
> @@ -95,6 +96,11 @@ struct console {
>  	u32 vtermno;
>  };
>  
> +/* serialize the handling of control messages, which includes
> + * the initialization of the virtio_consoles.
> + */

Comments in this file are of the type

/*
 * ...
 */

(others below are fine.)

> +static DEFINE_MUTEX(virtio_console_mutex);
> +
>  struct port_buffer {
>  	char *buf;
>  
> @@ -979,8 +985,14 @@ int init_port_console(struct port *port)
>  	 * pointers.  The final argument is the output buffer size: we
>  	 * can do any size, so we put PAGE_SIZE here.
>  	 */
> -	port->cons.vtermno = pdrvdata.next_vtermno;
> +	spin_lock_irq(&pdrvdata_lock);
> +	port->cons.vtermno = pdrvdata.next_vtermno++;
> +	spin_unlock_irq(&pdrvdata_lock);

This needs to be decremented in case of an error below, or you just
need the locking around the existing usage.

>  
> +	/*
> +	 * xxx Use index 0 for now assuming there is no early HVC, since
> +	 * we don't support it.
> +	 */

correction: x86 doesn't have early HVC console support yet, but s390
(and likely ppc) use this today.

I think it's safe to use 0 for the early console, it's not likely we
have anything else using hvc consoles till this point.

>  	port->cons.hvc = hvc_alloc(port->cons.vtermno, 0, &hv_ops, PAGE_SIZE);
>  	if (IS_ERR(port->cons.hvc)) {
>  		ret = PTR_ERR(port->cons.hvc);
> @@ -990,7 +1002,6 @@ int init_port_console(struct port *port)
>  		return ret;
>  	}
>  	spin_lock_irq(&pdrvdata_lock);
> -	pdrvdata.next_vtermno++;
>  	list_add_tail(&port->cons.list, &pdrvdata.consoles);
>  	spin_unlock_irq(&pdrvdata_lock);
>  	port->guest_connected = true;
> @@ -1317,7 +1328,6 @@ static void handle_control_message(struct ports_device *portdev,
>  	int err;
>  
>  	cpkt = (struct virtio_console_control *)(buf->buf + buf->offset);
> -

unrelated, please drop.

>  	port = find_port_by_id(portdev, cpkt->id);
>  	if (!port && cpkt->event != VIRTIO_CONSOLE_PORT_ADD) {
>  		/* No valid header at start of buffer.  Drop it. */
> @@ -1326,6 +1336,11 @@ static void handle_control_message(struct ports_device *portdev,
>  		return;
>  	}
>  
> +	/*
> +	 * These are rare initialization-time events that should be
> +	 * serialized.
> +	 */
> +	mutex_lock(&virtio_console_mutex);
>  	switch (cpkt->event) {
>  	case VIRTIO_CONSOLE_PORT_ADD:
>  		if (port) {
> @@ -1429,6 +1444,7 @@ static void handle_control_message(struct ports_device *portdev,
>  		}
>  		break;
>  	}
> +	mutex_unlock(&virtio_console_mutex);

Not really rare init-time events; ports can be hot-plugged.

BTW what does serialising just these add events gain us?  I think if
this is necessary, the mutex might be necessary for other operations
too.

I'll leave the review of hvc_console bits to others.

Overall, I think you need to split this patch up into 3-4 parts, one
fixing the spinlock usage around next_vtermno above, another adding
the mutex, and the others dealing with hvc_console.c.

Thanks,
		Amit

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:20:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:20:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5p6-0004ub-9g; Mon, 14 Nov 2011 15:20:20 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKxbi-0006d8-Cw
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 12:33:20 -0700
X-Env-Sender: j.glisse@gmail.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1320089594!2392204!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10222 invoked from network); 31 Oct 2011 19:33:15 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-8.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	31 Oct 2011 19:33:15 -0000
Received: by qabg1 with SMTP id g1so8221890qab.30
	for <xen-devel@lists.xensource.com>;
	Mon, 31 Oct 2011 12:33:13 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=date:from:to:cc:subject:message-id:references:mime-version
	:content-type:content-disposition:content-transfer-encoding
	:in-reply-to:user-agent;
	bh=GKn5kn7vw0YFp9+TKLcc6EZVm4cz14t7DKcVTku5w94=;
	b=CjG/J7GLM5sOfvpOd4zF+RKggNV8BeWVsHLK7WPLqM+iXrIqeIdc4puf6JBGaMg5PG
	GrIZgNib5xaMOabAVjcJl9sBcpAjxfg/9ERROxTdkfzsXNJ4YO+nnQcBeU3EXcJEvFbw
	Md+TDk/mqTLjEHQGLh9BP73P8eis+4U+lJw6w=
Received: by 10.224.206.132 with SMTP id fu4mr12687571qab.20.1320089593818;
	Mon, 31 Oct 2011 12:33:13 -0700 (PDT)
Received: from homer.localdomain (nat-pool-rdu.redhat.com. [66.187.233.202])
	by mx.google.com with ESMTPS id bh18sm31563405qab.8.2011.10.31.12.33.10
	(version=TLSv1/SSLv3 cipher=OTHER);
	Mon, 31 Oct 2011 12:33:11 -0700 (PDT)
Date: Mon, 31 Oct 2011 15:37:22 -0400
From: Jerome Glisse <j.glisse@gmail.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Message-ID: <20111031193722.GB3036@homer.localdomain>
References: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
	<1319062772-2793-9-git-send-email-konrad.wilk@oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <1319062772-2793-9-git-send-email-konrad.wilk@oracle.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:25 -0800
Cc: thellstrom@vmware.com, xen-devel@lists.xensource.com, thomas@shipmail.org,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	j.glisse@redhat.com, airlied@redhat.com, bskeggs@redhat.com
Subject: [Xen-devel] Re: [PATCH 08/11] ttm: Provide DMA aware TTM page pool
	code.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Oct 19, 2011 at 06:19:29PM -0400, Konrad Rzeszutek Wilk wrote:
> In TTM world the pages for the graphic drivers are kept in three different
> pools: write combined, uncached, and cached (write-back). When the pages
> are used by the graphic driver the graphic adapter via its built in MMU
> (or AGP) programs these pages in. The programming requires the virtual address
> (from the graphic adapter perspective) and the physical address (either System RAM
> or the memory on the card) which is obtained using the pci_map_* calls (which does the
> virtual to physical - or bus address translation). During the graphic application's
> "life" those pages can be shuffled around, swapped out to disk, moved from the
> VRAM to System RAM or vice-versa. This all works with the existing TTM pool code
> - except when we want to use the software IOTLB (SWIOTLB) code to "map" the physical
> addresses to the graphic adapter MMU. We end up programming the bounce buffer's
> physical address instead of the TTM pool memory's and get a non-worky driver.
> There are two solutions:
> 1) using the DMA API to allocate pages that are screened by the DMA API, or
> 2) using the pci_sync_* calls to copy the pages from the bounce-buffer and back.
> 
> This patch fixes the issue by allocating pages using the DMA API. The second
> is a viable option - but it has performance drawbacks and potential correctness
> issues - think of the write cache page being bounced (SWIOTLB->TTM), the
> WC is set on the TTM page and the copy from SWIOTLB not making it to the TTM
> page until the page has been recycled in the pool (and used by another application).
> 
> The bounce buffer does not get activated often - only in cases where we have
> a 32-bit capable card and we want to use a page that is allocated above the
> 4GB limit. The bounce buffer offers the solution of copying the contents
> of that 4GB page to an location below 4GB and then back when the operation has been
> completed (or vice-versa). This is done by using the 'pci_sync_*' calls.
> Note: If you look carefully enough in the existing TTM page pool code you will
> notice the GFP_DMA32 flag is used  - which should guarantee that the provided page
> is under 4GB. It certainly is the case, except this gets ignored in two cases:
>  - If user specifies 'swiotlb=force' which bounces _every_ page.
>  - If user is using a Xen's PV Linux guest (which uses the SWIOTLB and the
>    underlaying PFN's aren't necessarily under 4GB).
> 
> To not have this extra copying done the other option is to allocate the pages
> using the DMA API so that there is not need to map the page and perform the
> expensive 'pci_sync_*' calls.
> 
> This DMA API capable TTM pool requires for this the 'struct device' to
> properly call the DMA API. It also has to track the virtual and bus address of
> the page being handed out in case it ends up being swapped out or de-allocated -
> to make sure it is de-allocated using the proper's 'struct device'.
> 
> Implementation wise the code keeps two lists: one that is attached to the
> 'struct device' (via the dev->dma_pools list) and a global one to be used when
> the 'struct device' is unavailable (think shrinker code). The global list can
> iterate over all of the 'struct device' and its associated dma_pool. The list
> in dev->dma_pools can only iterate the device's dma_pool.
>                                                             /[struct device_pool]\
>         /---------------------------------------------------| dev                |
>        /                                            +-------| dma_pool           |
>  /-----+------\                                    /        \--------------------/
>  |struct device|     /-->[struct dma_pool for WC]</         /[struct device_pool]\
>  | dma_pools   +----+                                     /-| dev                |
>  |  ...        |    \--->[struct dma_pool for uncached]<-/--| dma_pool           |
>  \-----+------/                                         /   \--------------------/
>         \----------------------------------------------/
> [Two pools associated with the device (WC and UC), and the parallel list
> containing the 'struct dev' and 'struct dma_pool' entries]
> 
> The maximum amount of dma pools a device can have is six: write-combined,
> uncached, and cached; then there are the DMA32 variants which are:
> write-combined dma32, uncached dma32, and cached dma32.
> 
> Currently this code only gets activated when any variant of the SWIOTLB IOMMU
> code is running (Intel without VT-d, AMD without GART, IBM Calgary and Xen PV
> with PCI devices).
> 
> Tested-by: Michel Dänzer <michel@daenzer.net>
> [v1: Using swiotlb_nr_tbl instead of swiotlb_enabled]
> [v2: Major overhaul - added 'inuse_list' to seperate used from inuse and reorder
> the order of lists to get better performance.]
> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> ---
>  drivers/gpu/drm/ttm/Makefile             |    3 +
>  drivers/gpu/drm/ttm/ttm_memory.c         |    2 +
>  drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 1394 ++++++++++++++++++++++++++++++
>  include/drm/ttm/ttm_page_alloc.h         |   31 +
>  4 files changed, 1430 insertions(+), 0 deletions(-)
>  create mode 100644 drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
> 
> diff --git a/drivers/gpu/drm/ttm/Makefile b/drivers/gpu/drm/ttm/Makefile
> index f3cf6f0..8300bc0 100644
> --- a/drivers/gpu/drm/ttm/Makefile
> +++ b/drivers/gpu/drm/ttm/Makefile
> @@ -7,4 +7,7 @@ ttm-y := ttm_agp_backend.o ttm_memory.o ttm_tt.o ttm_bo.o \
>  	ttm_object.o ttm_lock.o ttm_execbuf_util.o ttm_page_alloc.o \
>  	ttm_bo_manager.o
>  
> +ifeq ($(CONFIG_SWIOTLB),y)
> +ttm-y += ttm_page_alloc_dma.o
> +endif
>  obj-$(CONFIG_DRM_TTM) += ttm.o
> diff --git a/drivers/gpu/drm/ttm/ttm_memory.c b/drivers/gpu/drm/ttm/ttm_memory.c
> index e70ddd8..6d24fe2 100644
> --- a/drivers/gpu/drm/ttm/ttm_memory.c
> +++ b/drivers/gpu/drm/ttm/ttm_memory.c
> @@ -395,6 +395,7 @@ int ttm_mem_global_init(struct ttm_mem_global *glob)
>  		       zone->name, (unsigned long long) zone->max_mem >> 10);
>  	}
>  	ttm_page_alloc_init(glob, glob->zone_kernel->max_mem/(2*PAGE_SIZE));
> +	ttm_dma_page_alloc_init(glob, glob->zone_kernel->max_mem/(2*PAGE_SIZE));
>  	return 0;
>  out_no_zone:
>  	ttm_mem_global_release(glob);
> @@ -410,6 +411,7 @@ void ttm_mem_global_release(struct ttm_mem_global *glob)
>  	/* let the page allocator first stop the shrink work. */
>  	ttm_page_alloc_fini();
>  
> +	ttm_dma_page_alloc_fini();
>  	flush_workqueue(glob->swap_queue);
>  	destroy_workqueue(glob->swap_queue);
>  	glob->swap_queue = NULL;
> diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
> new file mode 100644
> index 0000000..d6d8240
> --- /dev/null
> +++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
> @@ -0,0 +1,1394 @@
> +/*
> + * Copyright 2011 (c) Oracle Corp.
> +
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sub license,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the
> + * next paragraph) shall be included in all copies or substantial portions
> + * of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> + * DEALINGS IN THE SOFTWARE.
> + *
> + * Author: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> + */
> +
> +/*
> + * A simple DMA pool losely based on dmapool.c. It has certain advantages
> + * over the DMA pools:
> + * - Pool collects resently freed pages for reuse (and hooks up to
> + *   the shrinker).
> + * - Tracks currently in use pages
> + * - Tracks whether the page is UC, WB or cached (and reverts to WB
> + *   when freed).
> + */
> +
> +#include <linux/dma-mapping.h>
> +#include <linux/list.h>
> +#include <linux/seq_file.h> /* for seq_printf */
> +#include <linux/slab.h>
> +#include <linux/spinlock.h>
> +#include <linux/highmem.h>
> +#include <linux/mm_types.h>
> +#include <linux/module.h>
> +#include <linux/mm.h>
> +#include <linux/atomic.h>
> +#include <linux/device.h>
> +#include <linux/kthread.h>
> +#include "ttm/ttm_bo_driver.h"
> +#include "ttm/ttm_page_alloc.h"
> +#ifdef TTM_HAS_AGP
> +#include <asm/agp.h>
> +#endif
> +
> +#define NUM_PAGES_TO_ALLOC		(PAGE_SIZE/sizeof(struct page *))
> +#define SMALL_ALLOCATION		16
> +#define FREE_ALL_PAGES			(~0U)
> +/* times are in msecs */
> +#define IS_UNDEFINED			(0)
> +#define IS_WC				(1<<1)
> +#define IS_UC				(1<<2)
> +#define IS_CACHED			(1<<3)
> +#define IS_DMA32			(1<<4)
> +
> +enum pool_type {
> +	POOL_IS_UNDEFINED,
> +	POOL_IS_WC = IS_WC,
> +	POOL_IS_UC = IS_UC,
> +	POOL_IS_CACHED = IS_CACHED,
> +	POOL_IS_WC_DMA32 = IS_WC | IS_DMA32,
> +	POOL_IS_UC_DMA32 = IS_UC | IS_DMA32,
> +	POOL_IS_CACHED_DMA32 = IS_CACHED | IS_DMA32,
> +};
> +/*
> + * The pool structure. There are usually six pools:
> + *  - generic (not restricted to DMA32):
> + *      - write combined, uncached, cached.
> + *  - dma32 (up to 2^32 - so up 4GB):
> + *      - write combined, uncached, cached.
> + * for each 'struct device'. The 'cached' is for pages that are actively used.
> + * The other ones can be shrunk by the shrinker API if neccessary.
> + * @pools: The 'struct device->dma_pools' link.
> + * @type: Type of the pool
> + * @lock: Protects the inuse_list and free_list from concurrnet access. Must be
> + * used with irqsave/irqrestore variants because pool allocator maybe called
> + * from delayed work.
> + * @inuse_list: Pool of pages that are in use. The order is very important and
> + *   it is in the order that the TTM pages that are put back are in.
> + * @free_list: Pool of pages that are free to be used. No order requirements.
> + * @dev: The device that is associated with these pools.
> + * @size: Size used during DMA allocation.
> + * @npages_free: Count of available pages for re-use.
> + * @npages_in_use: Count of pages that are in use (each of them
> + *   is marked in_use.
> + * @nfrees: Stats when pool is shrinking.
> + * @nrefills: Stats when the pool is grown.
> + * @gfp_flags: Flags to pass for alloc_page.
> + * @fill_lock: Allows only one pool fill operation at time.
> + * @name: Name of the pool.
> + * @dev_name: Name derieved from dev - similar to how dev_info works.
> + *   Used during shutdown as the dev_info during release is unavailable.
> + */
> +struct dma_pool {
> +	struct list_head pools; /* The 'struct device->dma_pools link */
> +	enum pool_type type;
> +	spinlock_t lock;
> +	struct list_head inuse_list;
> +	struct list_head free_list;
> +	struct device *dev;
> +	unsigned size;
> +	unsigned npages_free;
> +	unsigned npages_in_use;
> +	unsigned long nfrees; /* Stats when shrunk. */
> +	unsigned long nrefills; /* Stats when grown. */
> +	gfp_t gfp_flags;
> +	bool fill_lock;
> +	char name[13]; /* "cached dma32" */
> +	char dev_name[64]; /* Constructed from dev */
> +};
> +
> +/*
> + * The accounting page keeping track of the allocated page along with
> + * the DMA address.
> + * @page_list: The link to the 'page_list' in 'struct dma_pool'.
> + * @vaddr: The virtual address of the page
> + * @dma: The bus address of the page. If the page is not allocated
> + *   via the DMA API, it will be -1.
> + * @in_use: Set to true if in use. Should not be freed.
> + */
> +struct dma_page {
> +	struct list_head page_list;
> +	void *vaddr;
> +	struct page *p;
> +	dma_addr_t dma;
> +};
> +
> +/*
> + * Limits for the pool. They are handled without locks because only place where
> + * they may change is in sysfs store. They won't have immediate effect anyway
> + * so forcing serialization to access them is pointless.
> + */
> +
> +struct ttm_pool_opts {
> +	unsigned	alloc_size;
> +	unsigned	max_size;
> +	unsigned	small;
> +};
> +
> +/*
> + * Contains the list of all of the 'struct device' and their corresponding
> + * DMA pools. Guarded by _mutex->lock.
> + * @pools: The link to 'struct ttm_pool_manager->pools'
> + * @dev: The 'struct device' associated with the 'pool'
> + * @pool: The 'struct dma_pool' associated with the 'dev'
> + */
> +struct device_pools {
> +	struct list_head pools;
> +	struct device *dev;
> +	struct dma_pool *pool;
> +};
> +
> +/*
> + * struct ttm_pool_manager - Holds memory pools for fast allocation
> + *
> + * @lock: Lock used when adding/removing from pools
> + * @pools: List of 'struct device' and 'struct dma_pool' tuples.
> + * @options: Limits for the pool.
> + * @npools: Total amount of pools in existence.
> + * @shrinker: The structure used by [un|]register_shrinker
> + */
> +struct ttm_pool_manager {
> +	struct mutex		lock;
> +	struct list_head	pools;
> +	struct ttm_pool_opts	options;
> +	unsigned		npools;
> +	struct shrinker		mm_shrink;
> +	struct kobject		kobj;
> +};
> +
> +static struct ttm_pool_manager *_manager;
> +
> +static struct attribute ttm_page_pool_max = {
> +	.name = "pool_max_size",
> +	.mode = S_IRUGO | S_IWUSR
> +};
> +static struct attribute ttm_page_pool_small = {
> +	.name = "pool_small_allocation",
> +	.mode = S_IRUGO | S_IWUSR
> +};
> +static struct attribute ttm_page_pool_alloc_size = {
> +	.name = "pool_allocation_size",
> +	.mode = S_IRUGO | S_IWUSR
> +};
> +
> +static struct attribute *ttm_pool_attrs[] = {
> +	&ttm_page_pool_max,
> +	&ttm_page_pool_small,
> +	&ttm_page_pool_alloc_size,
> +	NULL
> +};
> +
> +static void ttm_pool_kobj_release(struct kobject *kobj)
> +{
> +	struct ttm_pool_manager *m =
> +		container_of(kobj, struct ttm_pool_manager, kobj);
> +	kfree(m);
> +}
> +
> +static ssize_t ttm_pool_store(struct kobject *kobj, struct attribute *attr,
> +			      const char *buffer, size_t size)
> +{
> +	struct ttm_pool_manager *m =
> +		container_of(kobj, struct ttm_pool_manager, kobj);
> +	int chars;
> +	unsigned val;
> +	chars = sscanf(buffer, "%u", &val);
> +	if (chars == 0)
> +		return size;
> +
> +	/* Convert kb to number of pages */
> +	val = val / (PAGE_SIZE >> 10);
> +
> +	if (attr == &ttm_page_pool_max)
> +		m->options.max_size = val;
> +	else if (attr == &ttm_page_pool_small)
> +		m->options.small = val;
> +	else if (attr == &ttm_page_pool_alloc_size) {
> +		if (val > NUM_PAGES_TO_ALLOC*8) {
> +			printk(KERN_ERR TTM_PFX
> +			       "Setting allocation size to %lu "
> +			       "is not allowed. Recommended size is "
> +			       "%lu\n",
> +			       NUM_PAGES_TO_ALLOC*(PAGE_SIZE >> 7),
> +			       NUM_PAGES_TO_ALLOC*(PAGE_SIZE >> 10));
> +			return size;
> +		} else if (val > NUM_PAGES_TO_ALLOC) {
> +			printk(KERN_WARNING TTM_PFX
> +			       "Setting allocation size to "
> +			       "larger than %lu is not recommended.\n",
> +			       NUM_PAGES_TO_ALLOC*(PAGE_SIZE >> 10));
> +		}
> +		m->options.alloc_size = val;
> +	}
> +
> +	return size;
> +}
> +
> +static ssize_t ttm_pool_show(struct kobject *kobj, struct attribute *attr,
> +			     char *buffer)
> +{
> +	struct ttm_pool_manager *m =
> +		container_of(kobj, struct ttm_pool_manager, kobj);
> +	unsigned val = 0;
> +
> +	if (attr == &ttm_page_pool_max)
> +		val = m->options.max_size;
> +	else if (attr == &ttm_page_pool_small)
> +		val = m->options.small;
> +	else if (attr == &ttm_page_pool_alloc_size)
> +		val = m->options.alloc_size;
> +
> +	val = val * (PAGE_SIZE >> 10);
> +
> +	return snprintf(buffer, PAGE_SIZE, "%u\n", val);
> +}
> +
> +static const struct sysfs_ops ttm_pool_sysfs_ops = {
> +	.show = &ttm_pool_show,
> +	.store = &ttm_pool_store,
> +};
> +
> +static struct kobj_type ttm_pool_kobj_type = {
> +	.release = &ttm_pool_kobj_release,
> +	.sysfs_ops = &ttm_pool_sysfs_ops,
> +	.default_attrs = ttm_pool_attrs,
> +};
> +
> +#ifndef CONFIG_X86
> +static int set_pages_array_wb(struct page **pages, int addrinarray)
> +{
> +#ifdef TTM_HAS_AGP
> +	int i;
> +
> +	for (i = 0; i < addrinarray; i++)
> +		unmap_page_from_agp(pages[i]);
> +#endif
> +	return 0;
> +}
> +
> +static int set_pages_array_wc(struct page **pages, int addrinarray)
> +{
> +#ifdef TTM_HAS_AGP
> +	int i;
> +
> +	for (i = 0; i < addrinarray; i++)
> +		map_page_into_agp(pages[i]);
> +#endif
> +	return 0;
> +}
> +
> +static int set_pages_array_uc(struct page **pages, int addrinarray)
> +{
> +#ifdef TTM_HAS_AGP
> +	int i;
> +
> +	for (i = 0; i < addrinarray; i++)
> +		map_page_into_agp(pages[i]);
> +#endif
> +	return 0;
> +}
> +#endif /* for !CONFIG_X86 */
> +
> +static int ttm_set_pages_caching(struct dma_pool *pool,
> +				 struct page **pages, unsigned cpages)
> +{
> +	int r = 0;
> +	/* Set page caching */
> +	if (pool->type & IS_UC) {
> +		r = set_pages_array_uc(pages, cpages);
> +		if (r)
> +			pr_err(TTM_PFX
> +			       "%s: Failed to set %d pages to uc!\n",
> +			       pool->dev_name, cpages);
> +	}
> +	if (pool->type & IS_WC) {
> +		r = set_pages_array_wc(pages, cpages);
> +		if (r)
> +			pr_err(TTM_PFX
> +			       "%s: Failed to set %d pages to wc!\n",
> +			       pool->dev_name, cpages);
> +	}
> +	return r;
> +}
> +
> +static void __ttm_dma_free_page(struct dma_pool *pool, struct dma_page *d_page)
> +{
> +	dma_addr_t dma = d_page->dma;
> +	dma_free_coherent(pool->dev, pool->size, d_page->vaddr, dma);
> +
> +	kfree(d_page);
> +	d_page = NULL;
> +}
> +static struct dma_page *__ttm_dma_alloc_page(struct dma_pool *pool)
> +{
> +	struct dma_page *d_page;
> +
> +	d_page = kmalloc(sizeof(struct dma_page), GFP_KERNEL);
> +	if (!d_page)
> +		return NULL;
> +
> +	d_page->vaddr = dma_alloc_coherent(pool->dev, pool->size,
> +					   &d_page->dma,
> +					   pool->gfp_flags);
> +	d_page->p = virt_to_page(d_page->vaddr);
> +	if (!d_page->vaddr) {
> +		kfree(d_page);
> +		d_page = NULL;
> +	}

Move d_page->p = virt_to_page(d_page->vaddr); after if (!d_page->vaddr)
block.

> +	return d_page;
> +}
> +static enum pool_type ttm_to_type(int flags, enum ttm_caching_state cstate)
> +{
> +	enum pool_type type = IS_UNDEFINED;
> +
> +	if (flags & TTM_PAGE_FLAG_DMA32)
> +		type |= IS_DMA32;
> +	if (cstate == tt_cached)
> +		type |= IS_CACHED;
> +	else if (cstate == tt_uncached)
> +		type |= IS_UC;
> +	else
> +		type |= IS_WC;
> +
> +	return type;
> +}
> +static void ttm_pool_update_free_locked(struct dma_pool *pool,
> +					unsigned freed_pages)
> +{
> +	pool->npages_free -= freed_pages;
> +	pool->nfrees += freed_pages;
> +
> +}
> +/* set memory back to wb and free the pages. */
> +static void ttm_dma_pages_put(struct dma_pool *pool, struct list_head *d_pages,
> +			struct page *pages[], unsigned npages)
> +{
> +	struct dma_page *d_page, *tmp;
> +
> +	if (npages && set_pages_array_wb(pages, npages))
> +		pr_err(TTM_PFX "%s: Failed to set %d pages to wb!\n",
> +			pool->dev_name, npages);
> +
> +	if (npages > 1) {
> +		pr_debug("%s: (%s:%d) Freeing %d pages at once (lockless).\n",
> +			pool->dev_name, pool->name, current->pid, npages);
> +	}
> +
> +	list_for_each_entry_safe(d_page, tmp, d_pages, page_list) {
> +		list_del(&d_page->page_list);
> +		__ttm_dma_free_page(pool, d_page);
> +	}
> +}
> +/*
> + * Free pages from pool.
> + *
> + * To prevent hogging the ttm_swap process we only free NUM_PAGES_TO_ALLOC
> + * number of pages in one go.
> + *
> + * @pool: to free the pages from
> + * @nr_free: If set to true will free all pages in pool
> + **/
> +static unsigned ttm_dma_page_pool_free(struct dma_pool *pool, unsigned nr_free)
> +{
> +	unsigned long irq_flags;
> +	struct dma_page *dma_p, *tmp;
> +	struct page **pages_to_free;
> +	struct list_head d_pages;
> +	unsigned freed_pages = 0,
> +		 npages_to_free = nr_free;
> +
> +	if (NUM_PAGES_TO_ALLOC < nr_free)
> +		npages_to_free = NUM_PAGES_TO_ALLOC;
> +#if 0
> +	if (nr_free > 1) {
> +		pr_debug("%s: (%s:%d) Attempting to free %d (%d) pages\n",
> +			pool->dev_name, pool->name, current->pid,
> +			npages_to_free, nr_free);
> +	}
> +#endif
> +	pages_to_free = kmalloc(npages_to_free * sizeof(struct page *),
> +			GFP_KERNEL);
> +
> +	if (!pages_to_free) {
> +		pr_err(TTM_PFX
> +		       "%s: Failed to allocate memory for pool free operation.\n",
> +			pool->dev_name);
> +		return 0;
> +	}
> +	INIT_LIST_HEAD(&d_pages);
> +restart:
> +	spin_lock_irqsave(&pool->lock, irq_flags);
> +
> +	/* We picking the oldest ones off the list */
> +	list_for_each_entry_safe_reverse(dma_p, tmp, &pool->free_list,
> +					 page_list) {
> +		if (freed_pages >= npages_to_free)
> +			break;
> +
> +		/* Move the dma_page from one list to another. */
> +		list_move(&dma_p->page_list, &d_pages);
> +
> +		pages_to_free[freed_pages++] = dma_p->p;
> +		/* We can only remove NUM_PAGES_TO_ALLOC at a time. */
> +		if (freed_pages >= NUM_PAGES_TO_ALLOC) {
> +
> +			ttm_pool_update_free_locked(pool, freed_pages);
> +			/**
> +			 * Because changing page caching is costly
> +			 * we unlock the pool to prevent stalling.
> +			 */
> +			spin_unlock_irqrestore(&pool->lock, irq_flags);
> +
> +			ttm_dma_pages_put(pool, &d_pages, pages_to_free,
> +				      freed_pages);
> +
> +			INIT_LIST_HEAD(&d_pages);
> +
> +			if (likely(nr_free != FREE_ALL_PAGES))
> +				nr_free -= freed_pages;
> +
> +			if (NUM_PAGES_TO_ALLOC >= nr_free)
> +				npages_to_free = nr_free;
> +			else
> +				npages_to_free = NUM_PAGES_TO_ALLOC;
> +
> +			freed_pages = 0;
> +
> +			/* free all so restart the processing */
> +			if (nr_free)
> +				goto restart;
> +
> +			/* Not allowed to fall through or break because
> +			 * following context is inside spinlock while we are
> +			 * outside here.
> +			 */
> +			goto out;
> +
> +		}
> +	}
> +
> +	/* remove range of pages from the pool */
> +	if (freed_pages) {
> +		ttm_pool_update_free_locked(pool, freed_pages);
> +		nr_free -= freed_pages;
> +	}
> +
> +	spin_unlock_irqrestore(&pool->lock, irq_flags);
> +
> +	if (freed_pages)
> +		ttm_dma_pages_put(pool, &d_pages, pages_to_free, freed_pages);
> +out:
> +	kfree(pages_to_free);
> +	return nr_free;
> +}
> +
> +static void ttm_dma_free_pool(struct device *dev, enum pool_type type)
> +{
> +	struct device_pools *p;
> +	struct dma_pool *pool;
> +	struct dma_page *d_page, *d_tmp;
> +
> +	if (!dev)
> +		return;
> +
> +	mutex_lock(&_manager->lock);
> +	list_for_each_entry_reverse(p, &_manager->pools, pools) {
> +		if (p->dev != dev)
> +			continue;
> +		pool = p->pool;
> +		if (pool->type != type)
> +			continue;
> +
> +		list_del(&p->pools);
> +		kfree(p);
> +		_manager->npools--;
> +		break;
> +	}
> +	list_for_each_entry_reverse(pool, &dev->dma_pools, pools) {
> +		unsigned long irq_save;
> +		if (pool->type != type)
> +			continue;
> +		/* Takes a spinlock.. */
> +		ttm_dma_page_pool_free(pool, FREE_ALL_PAGES);
> +		/* .. but afterwards we can take it too */
> +		spin_lock_irqsave(&pool->lock, irq_save);
> +		list_for_each_entry_safe(d_page, d_tmp, &pool->inuse_list,
> +					 page_list) {
> +			pr_err("%s: (%s:%d) %p (%p DMA:0x%lx) busy!\n",
> +				pool->dev_name, pool->name,
> +				current->pid, d_page->vaddr,
> +				virt_to_page(d_page->vaddr),
> +				(unsigned long)d_page->dma);
> +			list_del(&d_page->page_list);
> +			kfree(d_page);
> +			pool->npages_in_use--;
> +		}
> +		spin_unlock_irqrestore(&pool->lock, irq_save);
> +		WARN_ON(((pool->npages_in_use + pool->npages_free) != 0));
> +		/* This code path is called after _all_ references to the
> +		 * struct device has been dropped - so nobody should be
> +		 * touching it. In case somebody is trying to _add_ we are
> +		 * guarded by the mutex. */
> +		list_del(&pool->pools);
> +		kfree(pool);
> +		break;
> +	}
> +	mutex_unlock(&_manager->lock);
> +}
> +/*
> + * On free-ing of the 'struct device' this deconstructor is run.
> + * Albeit the pool might have already been freed earlier.
> + */
> +static void ttm_dma_pool_release(struct device *dev, void *res)
> +{
> +	struct dma_pool *pool = *(struct dma_pool **)res;
> +
> +	if (pool)
> +		ttm_dma_free_pool(dev, pool->type);
> +}
> +
> +static int ttm_dma_pool_match(struct device *dev, void *res, void *match_data)
> +{
> +	return *(struct dma_pool **)res == match_data;
> +}
> +
> +static struct dma_pool *ttm_dma_pool_init(struct device *dev, gfp_t flags,
> +					  enum pool_type type)
> +{
> +	char *n[] = {"wc", "uc", "cached", " dma32", "unknown",};
> +	enum pool_type t[] = {IS_WC, IS_UC, IS_CACHED, IS_DMA32, IS_UNDEFINED};
> +	struct device_pools *sec_pool = NULL;
> +	struct dma_pool *pool = NULL, **ptr;
> +	unsigned i;
> +	int ret = -ENODEV;
> +	char *p;
> +
> +	if (!dev)
> +		return NULL;
> +
> +	ptr = devres_alloc(ttm_dma_pool_release, sizeof(*ptr), GFP_KERNEL);
> +	if (!ptr)
> +		return NULL;
> +
> +	ret = -ENOMEM;
> +
> +	pool = kmalloc_node(sizeof(struct dma_pool), GFP_KERNEL,
> +			    dev_to_node(dev));
> +	if (!pool)
> +		goto err_mem;
> +
> +	sec_pool = kmalloc_node(sizeof(struct device_pools), GFP_KERNEL,
> +				dev_to_node(dev));
> +	if (!sec_pool)
> +		goto err_mem;
> +
> +	INIT_LIST_HEAD(&sec_pool->pools);
> +	sec_pool->dev = dev;
> +	sec_pool->pool =  pool;
> +
> +	INIT_LIST_HEAD(&pool->free_list);
> +	INIT_LIST_HEAD(&pool->inuse_list);
> +	INIT_LIST_HEAD(&pool->pools);
> +	spin_lock_init(&pool->lock);
> +	pool->dev = dev;
> +	pool->npages_free = pool->npages_in_use = 0;
> +	pool->nfrees = 0;
> +	pool->gfp_flags = flags;
> +	pool->size = PAGE_SIZE;
> +	pool->type = type;
> +	pool->nrefills = 0;
> +	pool->fill_lock = false;
> +	p = pool->name;
> +	for (i = 0; i < 5; i++) {
> +		if (type & t[i]) {
> +			p += snprintf(p, sizeof(pool->name) - (p - pool->name),
> +				      "%s", n[i]);
> +		}
> +	}
> +	*p = 0;
> +	/* We copy the name for pr_ calls b/c when dma_pool_destroy is called
> +	 * - the kobj->name has already been deallocated.*/
> +	snprintf(pool->dev_name, sizeof(pool->dev_name), "%s %s",
> +		 dev_driver_string(dev), dev_name(dev));
> +	mutex_lock(&_manager->lock);
> +	/* You can get the dma_pool from either the global: */
> +	list_add(&sec_pool->pools, &_manager->pools);
> +	_manager->npools++;
> +	/* or from 'struct device': */
> +	list_add(&pool->pools, &dev->dma_pools);
> +	mutex_unlock(&_manager->lock);
> +
> +	*ptr = pool;
> +	devres_add(dev, ptr);
> +
> +	return pool;
> +err_mem:
> +	devres_free(ptr);
> +	kfree(sec_pool);
> +	kfree(pool);
> +	return ERR_PTR(ret);
> +}
> +static struct dma_pool *ttm_dma_find_pool(struct device *dev,
> +					  enum pool_type type)
> +{
> +	struct dma_pool *pool, *tmp, *found = NULL;
> +
> +	if (type == IS_UNDEFINED)
> +		return found;
> +	/* NB: We iterate on the 'struct dev' which has no spinlock, but
> +	 * it does have a kref which we have taken. */

I fail to see where we kref dev.

> +	list_for_each_entry_safe(pool, tmp, &dev->dma_pools, pools) {
> +		if (pool->type != type)
> +			continue;
> +		found = pool;
> +		break;
> +	}
> +	return found;
> +}
> +
> +/*
> + * Free pages the pages that failed to change the caching state. If there
> + * are pages that have changed their caching state already put them to the
> + * pool.
> + */
> +static void ttm_dma_handle_caching_state_failure(struct dma_pool *pool,
> +						 struct list_head *d_pages,
> +						 struct page **failed_pages,
> +						 unsigned cpages)
> +{
> +	struct dma_page *d_page, *tmp;
> +	struct page *p;
> +	unsigned i = 0;
> +
> +	p = failed_pages[0];
> +	if (!p)
> +		return;
> +	/* Find the failed page. */
> +	list_for_each_entry_safe(d_page, tmp, d_pages, page_list) {
> +		if (d_page->p != p)
> +			continue;
> +		/* .. and then progress over the full list. */
> +		list_del(&d_page->page_list);
> +		__ttm_dma_free_page(pool, d_page);
> +		if (++i < cpages)
> +			p = failed_pages[i];
> +		else
> +			break;
> +	}
> +
> +}
> +/*
> + * Allocate 'count' pages, and put 'need' number of them on the
> + * 'pages' and as well on the 'dma_address' starting at 'dma_offset' offset.
> + * The full list of pages should also be on 'd_pages'.
> + * We return zero for success, and negative numbers as errors.
> + */
> +static int ttm_dma_pool_alloc_new_pages(struct dma_pool *pool,
> +					struct list_head *d_pages,
> +					unsigned count)
> +{
> +	struct page **caching_array;
> +	struct dma_page *dma_p;
> +	struct page *p;
> +	int r = 0;
> +	unsigned i, cpages;
> +	unsigned max_cpages = min(count,
> +			(unsigned)(PAGE_SIZE/sizeof(struct page *)));
> +
> +	/* allocate array for page caching change */
> +	caching_array = kmalloc(max_cpages*sizeof(struct page *), GFP_KERNEL);
> +
> +	if (!caching_array) {
> +		pr_err(TTM_PFX
> +		       "%s: Unable to allocate table for new pages.",
> +			pool->dev_name);
> +		return -ENOMEM;
> +	}
> +
> +	if (count > 1) {
> +		pr_debug("%s: (%s:%d) Getting %d pages\n",
> +			pool->dev_name, pool->name, current->pid,
> +			count);
> +	}
> +
> +	for (i = 0, cpages = 0; i < count; ++i) {
> +		dma_p = __ttm_dma_alloc_page(pool);
> +		if (!dma_p) {
> +			pr_err(TTM_PFX "%s: Unable to get page %u.\n",
> +				pool->dev_name, i);
> +
> +			/* store already allocated pages in the pool after
> +			 * setting the caching state */
> +			if (cpages) {
> +				r = ttm_set_pages_caching(pool, caching_array,
> +							  cpages);
> +				if (r)
> +					ttm_dma_handle_caching_state_failure(
> +						pool, d_pages, caching_array,
> +						cpages);
> +			}
> +			r = -ENOMEM;
> +			goto out;
> +		}
> +		p = dma_p->p;
> +#ifdef CONFIG_HIGHMEM
> +		/* gfp flags of highmem page should never be dma32 so we
> +		 * we should be fine in such case
> +		 */
> +		if (!PageHighMem(p))
> +#endif
> +		{
> +			caching_array[cpages++] = p;
> +			if (cpages == max_cpages) {
> +				/* Note: Cannot hold the spinlock */
> +				r = ttm_set_pages_caching(pool, caching_array,
> +						 cpages);
> +				if (r) {
> +					ttm_dma_handle_caching_state_failure(
> +						pool, d_pages, caching_array,
> +						cpages);
> +					goto out;
> +				}
> +				cpages = 0;
> +			}
> +		}
> +		list_add(&dma_p->page_list, d_pages);
> +	}
> +
> +	if (cpages) {
> +		r = ttm_set_pages_caching(pool, caching_array, cpages);
> +		if (r)
> +			ttm_dma_handle_caching_state_failure(pool, d_pages,
> +					caching_array, cpages);
> +	}
> +out:
> +	kfree(caching_array);
> +	return r;
> +}
> +static bool ttm_dma_iterate_reverse(struct dma_pool *pool,
> +				    struct dma_page *d_page,
> +				    struct page *p)
> +{
> +
> +	/* Note: When TTM layer gets pages - it gets them one page at a time
> +	 * and puts them on an array (so most recently allocated page is at
> +	 * at the back). The inuse_list is a copy of those pages, but in the
> +	 * exact opposite order. This is b/c when TTM puts pages back, it
> +	 * constructs a stack with the oldest element on the top. Hence the
> +	 * inuse_list is constructed with the same order so that it will
> +	 * efficiently be matched against the stack.
> +	 * But, just in case the pages are not in that order, we double check
> +	 * the 'pages' against our inuse_list in case we have to go in reverse.
> +	 */
> +	struct page *p_next;
> +	struct dma_page *tmp;
> +
> +	tmp = list_entry(d_page->page_list.prev, struct dma_page, page_list);
> +	if (&tmp->page_list != &pool->inuse_list) {
> +		p_next = list_entry(p->lru.next, struct page, lru);
> +		if (tmp->p == p_next)
> +			return true;
> +	}
> +	return false;
> +}
> +
> +/*
> + * Iterate forward (or backwards if 'reverse' is true) by one element
> + * in the pool->in_use list. We use 'd_page' as the starting point.
> + * The 'd_page' upon completion of the iteration, is moved to the
> + * 'd_pages' list.
> + */
> +static struct dma_page *ttm_dma_iterate_next(struct dma_pool *pool,
> +					     struct dma_page *d_page,
> +					     struct list_head *d_pages,
> +					     bool reverse)
> +{
> +	struct dma_page *next = NULL;
> +
> +	if (unlikely(reverse)) {
> +		if (&d_page->page_list != &pool->inuse_list)
> +			next = list_entry(d_page->page_list.prev,
> +					  struct dma_page,
> +					  page_list);
> +		list_move(&d_page->page_list, d_pages);
> +	} else {
> +		if (&d_page->page_list != &pool->inuse_list)
> +			next = list_entry(d_page->page_list.next,
> +					  struct dma_page,
> +					  page_list);
> +		list_move_tail(&d_page->page_list, d_pages);
> +	}
> +	return next;
> +}
> +/*
> + * Iterate forward (or backwards if 'reverse' is true), looking
> + * for page 'p' in the pool->inuse_list, starting at 'start'.
> + */
> +static struct dma_page *ttm_dma_iterate_forward(struct dma_pool *pool,
> +						struct dma_page *start,
> +						struct page *p,
> +						bool reverse)
> +{
> +	struct dma_page *tmp = start;
> +
> +	if (unlikely(reverse)) {
> +		list_for_each_entry_continue_reverse(tmp, &pool->inuse_list,
> +						     page_list) {
> +			if (p == tmp->p)
> +				return tmp;
> +		}
> +	} else {
> +		list_for_each_entry_continue(tmp, &pool->inuse_list,
> +					     page_list) {
> +			if (p == tmp->p)
> +				return tmp;
> +		}
> +	}
> +	return NULL;
> +}
> +/*
> + * Recycle (or delete) the 'pages' that are on the 'pool'.
> + * @pool: The pool that the pages are associated with.
> + * @pages: The list of pages we are done with.
> + * @page_count: Count of how many pages (or zero if all).
> + * @erase: Instead of recycling - just free them.
> + */
> +static unsigned int ttm_dma_put_pages_in_pool(struct dma_pool *pool,
> +					      struct list_head *pages,
> +					      unsigned page_count,
> +					      bool erase)
> +{
> +	unsigned long uninitialized_var(irq_flags);
> +	struct list_head uninitialized_var(d_pages);
> +	struct page **uninitialized_var(array_pages);
> +	unsigned uninitialized_var(freed_pages);
> +	struct page *p, *tmp;
> +	unsigned count = 0;
> +	struct dma_page *d_tmp, *d_page = NULL;
> +	bool rev = false;
> +	if (unlikely(WARN_ON(list_empty(pages))))
> +		return 0;
> +
> +	if (page_count == 0) {
> +		list_for_each_entry(p, pages, lru)
> +			++page_count;
> +
> +	}
> +	if (page_count > 1) {
> +		pr_debug("%s: (%s:%d) %s %d pages\n",
> +			pool->dev_name, pool->name, current->pid,
> +			erase ? "Destroying" : "Recycling", page_count);
> +	}
> +
> +	/* d_pages is the list of 'struct dma_page' */
> +	INIT_LIST_HEAD(&d_pages);
> +
> +	if (erase) {
> +		/* and pages_to_free is used for cache reset */
> +		array_pages = kmalloc(page_count * sizeof(struct page *),
> +				GFP_KERNEL);
> +		if (!array_pages) {
> +			dev_err(pool->dev, TTM_PFX
> +			"Failed to allocate memory for pool free operation.\n");
> +			return 0;
> +		}
> +		freed_pages = 0;
> +	}
> +
> +	/* Find the first page of the "chunk" of pages. */
> +	p = list_first_entry(pages, struct page, lru);
> +	spin_lock_irqsave(&pool->lock, irq_flags);
> +restart:
> +	list_for_each_entry(d_tmp, &pool->inuse_list, page_list) {
> +		if (p == d_tmp->p) {
> +			d_page = d_tmp;
> +			break;
> +		}
> +	}
> +	/* The pages are _not_ in this pool. */
> +	if (!d_page) {
> +		spin_unlock_irqrestore(&pool->lock, irq_flags);
> +		return 0;
> +	}
> +	rev = ttm_dma_iterate_reverse(pool, d_page, p);
> +	if (rev)
> +		pr_debug("%s: (%s:%d) Traversing %d in reverse order\n",
> +			pool->dev_name, pool->name, current->pid, page_count);
> +	/* Continue iterating on both lists. */
> +	list_for_each_entry_safe(p, tmp, pages, lru) {
> +		if (d_page->p != p && count != page_count) {
> +			/* Yikes! The inuse stack is swiss cheese. Have to
> +			   start looking.*/
> +			d_page = ttm_dma_iterate_forward(pool, d_page, p, rev);
> +			if (!d_page)
> +				goto restart;
> +		}
> +		/* Do not advance past what we were asked to delete. */
> +		if (d_page->p != p)
> +			break;
> +		list_del(&p->lru);
> +
> +		if (erase)
> +			array_pages[freed_pages++] = d_page->p;
> +		d_page = ttm_dma_iterate_next(pool, d_page, &d_pages, rev);
> +		if (!d_page)
> +			break;
> +		count++;
> +		/* Check if we should iterate. */
> +		if (count == page_count)
> +			break;
> +	}
> +	if (!erase) /* And stick 'em on the free pool. */
> +		list_splice(&d_pages, &pool->free_list);
> +
> +	spin_unlock_irqrestore(&pool->lock, irq_flags);
> +
> +	if (erase) {
> +		/* Note: The caller of us updates the pool accounting. */
> +		ttm_dma_pages_put(pool, &d_pages, array_pages /* to set WB */,
> +				  freed_pages);
> +		kfree(array_pages);
> +	}
> +	if (count > 1) {
> +		pr_debug("%s: (%s:%d) %d/%d pages %s pool.\n",
> +			pool->dev_name, pool->name, current->pid,
> +			count, page_count,
> +			erase ? "erased from inuse" : "put in free");
> +	}
> +	return count;
> +}
> +/*
> + * @return count of pages still required to fulfill the request.
> +*/
> +static int ttm_dma_page_pool_fill_locked(struct dma_pool *pool,
> +					 unsigned count,
> +					 unsigned long *irq_flags)
> +{
> +	int r = count;
> +
> +	if (pool->fill_lock)
> +		return r;
> +
> +	pool->fill_lock = true;
> +	if (count < _manager->options.small &&
> +	    count > pool->npages_free) {
> +		struct list_head d_pages;
> +		unsigned alloc_size =  _manager->options.alloc_size;
> +
> +		INIT_LIST_HEAD(&d_pages);
> +
> +		spin_unlock_irqrestore(&pool->lock, *irq_flags);
> +
> +		/* Returns how many more are neccessary to fulfill the
> +		 * request. */
> +		r = ttm_dma_pool_alloc_new_pages(pool, &d_pages, alloc_size);
> +
> +		spin_lock_irqsave(&pool->lock, *irq_flags);
> +		if (!r) {
> +			/* Add the fresh to the end.. */
> +			list_splice(&d_pages, &pool->free_list);
> +			++pool->nrefills;
> +			pool->npages_free += alloc_size;
> +		} else {
> +			struct dma_page *d_page;
> +			unsigned cpages = 0;
> +
> +			pr_err(TTM_PFX "%s: Failed to fill %s pool (r:%d)!\n",
> +				pool->dev_name, pool->name, r);
> +
> +			list_for_each_entry(d_page, &d_pages, page_list) {
> +				cpages++;
> +			}
> +			list_splice_tail(&d_pages, &pool->free_list);
> +			pool->npages_free += cpages;
> +		}
> +	}
> +	pool->fill_lock = false;
> +	return r;
> +
> +}
> +
> +/*
> + * @return count of pages still required to fulfill the request.
> + * The populate list is actually a stack (not that is matters as TTM
> + * allocates one page at a time.
> + */
> +static int ttm_dma_pool_get_pages(struct dma_pool *pool,
> +				  struct list_head *pages,
> +				  dma_addr_t *dma_address, unsigned count)
> +{
> +	unsigned long irq_flags;
> +	int r;
> +	unsigned i;
> +	struct dma_page *d_page, *tmp;
> +	struct list_head d_pages;
> +
> +	spin_lock_irqsave(&pool->lock, irq_flags);
> +	r = ttm_dma_page_pool_fill_locked(pool, count, &irq_flags);
> +	if (r < 0) {
> +		pr_debug("%s: (%s:%d) Asked for %d, got %d %s.\n",
> +			pool->dev_name, pool->name, current->pid, count, r,
> +			(r < 0) ? "err:" : "pages");
> +		goto out;
> +	}
> +	if (!pool->npages_free)
> +		goto out;
> +	if (count > 1) {
> +		pr_debug("%s: (%s:%d) Looking in free list for %d pages. "\
> +			 "(have %d pages free)\n",
> +			 pool->dev_name, pool->name, current->pid, count,
> +			 pool->npages_free);
> +	}
> +	i = 0;
> +	/* We are holding the spinlock.. */
> +	INIT_LIST_HEAD(&d_pages);
> +	/* Note: The  the 'pages' (and inuse_list) is expected to be a stack,
> +	 * so we put the entries in the right order (and on the inuse list
> +	 * in the reverse order to compenstate for freeing - which inverts the
> +	 * 'pages' order).
> +	 */
> +	list_for_each_entry_safe(d_page, tmp, &pool->free_list, page_list) {
> +		list_add_tail(&d_page->p->lru, pages);
> +		dma_address[i++] = d_page->dma;
> +		list_move(&d_page->page_list, &d_pages);
> +		if (i == count)
> +			break;
> +	}
> +	/* Note: The 'inuse_list' must have the same order as the 'pages'
> +	 * to be effective when pages are put back. And since 'pages' is
> +	 * as stack, ergo inuse_list is a stack too. */
> +	list_splice(&d_pages, &pool->inuse_list);
> +	count -= i;
> +	pool->npages_in_use += i;
> +	pool->npages_free -= i;
> +out:
> +	spin_unlock_irqrestore(&pool->lock, irq_flags);
> +	if (count)
> +		pr_debug("%s: (%s:%d) Need %d more.\n",
> +			pool->dev_name, pool->name, current->pid, count);
> +	return count;
> +}
> +/*
> + * On success pages list will hold count number of correctly
> + * cached pages. On failure will hold the negative return value (-ENOMEM, etc).
> + */
> +int ttm_dma_get_pages(struct ttm_tt *ttm, struct list_head *pages,
> +		      unsigned count, dma_addr_t *dma_address)
> +
> +{
> +	int r = -ENOMEM;
> +	struct dma_pool *pool;
> +	gfp_t gfp_flags;
> +	enum pool_type type;
> +	struct device *dev = ttm->be->dev;
> +
> +	type = ttm_to_type(ttm->page_flags, ttm->caching_state);
> +
> +	if (ttm->page_flags & TTM_PAGE_FLAG_DMA32)
> +		gfp_flags = GFP_USER | GFP_DMA32;
> +	else
> +		gfp_flags = GFP_HIGHUSER;
> +
> +	if (ttm->page_flags & TTM_PAGE_FLAG_ZERO_ALLOC)
> +		gfp_flags |= __GFP_ZERO;
> +
> +	pool = ttm_dma_find_pool(dev, type);
> +	if (!pool) {
> +		pool = ttm_dma_pool_init(dev, gfp_flags, type);
> +		if (IS_ERR_OR_NULL(pool))
> +			return -ENOMEM;
> +	}
> +#if 0
> +	if (count > 1) {
> +		pr_debug("%s (%s:%d) Attempting to get %d pages type %x\n",
> +			pool->dev_name, pool->name, current->pid, count,
> +			cstate);
> +	}
> +#endif
> +	/* Take pages out of a pool (if applicable) */
> +	r = ttm_dma_pool_get_pages(pool, pages, dma_address, count);
> +	/* clear the pages coming from the pool if requested */
> +	if (ttm->page_flags & TTM_PAGE_FLAG_ZERO_ALLOC) {
> +		struct page *p;
> +		list_for_each_entry(p, pages, lru) {
> +			clear_page(page_address(p));
> +		}
> +	}
> +	/* If pool didn't have enough pages allocate new one. */
> +	if (r > 0) {
> +		struct list_head d_pages;
> +		unsigned pages_need = r;
> +		unsigned long irq_flags;
> +
> +		INIT_LIST_HEAD(&d_pages);
> +
> +		/* Note, we are running without locking here..
> +		 * and we have to manually add the stack to the inuse pool. */
> +		r = ttm_dma_pool_alloc_new_pages(pool, &d_pages, pages_need);
> +
> +		if (r == 0) {
> +			struct dma_page *d_page;
> +			int i = count - 1;
> +
> +			/* Since the pages are directly going to the inuse_list
> +			 * which is stack based, lets treat it as a stack.
> +			 */
> +			list_for_each_entry(d_page,  &d_pages, page_list) {
> +				list_add(&d_page->p->lru, pages);
> +				BUG_ON(i < 0);
> +				dma_address[i--] = d_page->dma;
> +			}
> +			spin_lock_irqsave(&pool->lock, irq_flags);
> +			pool->npages_in_use += pages_need;
> +			list_splice(&d_pages, &pool->inuse_list);
> +			spin_unlock_irqrestore(&pool->lock, irq_flags);
> +		} else {
> +			/* If there is any pages in the list put them back to
> +			 * the pool. */
> +			pr_err(TTM_PFX
> +			       "%s: Failed to allocate extra pages "
> +			       "for large request.",
> +				pool->dev_name);
> +			spin_lock_irqsave(&pool->lock, irq_flags);
> +			pool->npages_free += r;
> +			/* We don't care about ordering on the free_list. */
> +			list_splice(&d_pages, &pool->free_list);
> +			spin_unlock_irqrestore(&pool->lock, irq_flags);
> +			return count;
> +		}
> +	}
> +	return r;
> +}
> +
> +/* Get good estimation how many pages are free in pools */
> +static int ttm_dma_pool_get_num_unused_pages(void)
> +{
> +	struct device_pools *p;
> +	unsigned total = 0;
> +
> +	mutex_lock(&_manager->lock);
> +	list_for_each_entry(p, &_manager->pools, pools) {
> +		if (p)
> +			total += p->pool->npages_free;
> +	}
> +	mutex_unlock(&_manager->lock);
> +	return total;
> +}
> +
> +/* Put all pages in pages list to correct pool to wait for reuse */
> +void ttm_dma_put_pages(struct ttm_tt *ttm, struct list_head *pages,
> +		       unsigned page_count, dma_addr_t *dma_address)
> +{
> +	struct dma_pool *pool;
> +	enum pool_type type;
> +	bool is_cached = false;
> +	unsigned count = 0, i;
> +	unsigned long irq_flags;
> +	struct device *dev = ttm->be->dev;
> +
> +	if (list_empty(pages))
> +		return;
> +
> +	type = ttm_to_type(ttm->page_flags, ttm->caching_state);
> +	pool = ttm_dma_find_pool(dev, type);
> +	if (!pool) {
> +		WARN_ON(!pool);
> +		return;
> +	}
> +	is_cached = (ttm_dma_find_pool(pool->dev,
> +		     ttm_to_type(ttm->page_flags, tt_cached)) == pool);
> +
> +	if (page_count > 1) {
> +		dev_dbg(pool->dev, "(%s:%d) Attempting to %s %d pages.\n",
> +			pool->name, current->pid,
> +			(is_cached) ?  "destroy" : "recycle", page_count);
> +	}
> +
> +	count = ttm_dma_put_pages_in_pool(pool, pages, page_count, is_cached);
> +
> +	for (i = 0; i < count; i++)
> +		dma_address[i] = 0;
> +
> +	spin_lock_irqsave(&pool->lock, irq_flags);
> +	pool->npages_in_use -= count;
> +	if (is_cached)
> +		pool->nfrees += count;
> +	else
> +		pool->npages_free += count;
> +	spin_unlock_irqrestore(&pool->lock, irq_flags);
> +
> +	page_count -= count;
> +	WARN(page_count != 0,
> +		"Only freed %d page(s) in %s. Could not free the other %d!\n",
> +		count, pool->name, page_count);
> +
> +	page_count = 0;
> +	if (pool->npages_free > _manager->options.max_size) {
> +		page_count = pool->npages_free - _manager->options.max_size;
> +		if (page_count < NUM_PAGES_TO_ALLOC)
> +			page_count = NUM_PAGES_TO_ALLOC;
> +	}
> +	if (page_count)
> +		ttm_dma_page_pool_free(pool, page_count);
> +}
> +
> +/**
> + * Callback for mm to request pool to reduce number of page held.
> + */
> +static int ttm_dma_pool_mm_shrink(struct shrinker *shrink,
> +				  struct shrink_control *sc)
> +{
> +	static atomic_t start_pool = ATOMIC_INIT(0);
> +	unsigned idx = 0;
> +	unsigned pool_offset = atomic_add_return(1, &start_pool);
> +	unsigned shrink_pages = sc->nr_to_scan;
> +	struct device_pools *p;
> +
> +	if (list_empty(&_manager->pools))
> +		return 0;
> +
> +	mutex_lock(&_manager->lock);
> +	pool_offset = pool_offset % _manager->npools;
> +	list_for_each_entry(p, &_manager->pools, pools) {
> +		unsigned nr_free;
> +
> +		if (!p && !p->dev)
> +			continue;
> +		if (shrink_pages == 0)
> +			break;
> +		/* Do it in round-robin fashion. */
> +		if (++idx < pool_offset)
> +			continue;
> +		nr_free = shrink_pages;
> +		shrink_pages = ttm_dma_page_pool_free(p->pool, nr_free);
> +		pr_debug("%s: (%s:%d) Asked to shrink %d, have %d more to go\n",
> +			p->pool->dev_name, p->pool->name, current->pid, nr_free,
> +			shrink_pages);
> +	}
> +	mutex_unlock(&_manager->lock);
> +	/* return estimated number of unused pages in pool */
> +	return ttm_dma_pool_get_num_unused_pages();
> +}
> +
> +static void ttm_dma_pool_mm_shrink_init(struct ttm_pool_manager *manager)
> +{
> +	manager->mm_shrink.shrink = &ttm_dma_pool_mm_shrink;
> +	manager->mm_shrink.seeks = 1;
> +	register_shrinker(&manager->mm_shrink);
> +}
> +static void ttm_dma_pool_mm_shrink_fini(struct ttm_pool_manager *manager)
> +{
> +	unregister_shrinker(&manager->mm_shrink);
> +}
> +int ttm_dma_page_alloc_init(struct ttm_mem_global *glob,
> +				   unsigned max_pages)
> +{
> +	int ret = -ENOMEM;
> +
> +	WARN_ON(_manager);
> +
> +	printk(KERN_INFO TTM_PFX "Initializing DMA pool allocator.\n");
> +
> +	_manager = kzalloc(sizeof(*_manager), GFP_KERNEL);
> +	if (!_manager)
> +		goto err_manager;
> +
> +	mutex_init(&_manager->lock);
> +	INIT_LIST_HEAD(&_manager->pools);
> +
> +	_manager->options.max_size = max_pages;
> +	_manager->options.small = SMALL_ALLOCATION;
> +	_manager->options.alloc_size = NUM_PAGES_TO_ALLOC;
> +
> +	/* This takes care of auto-freeing the _manager */
> +	ret = kobject_init_and_add(&_manager->kobj, &ttm_pool_kobj_type,
> +				   &glob->kobj, "dma_pool");
> +	if (unlikely(ret != 0)) {
> +		kobject_put(&_manager->kobj);
> +		goto err;
> +	}
> +	ttm_dma_pool_mm_shrink_init(_manager);
> +	return 0;
> +err_manager:
> +	kfree(_manager);
> +	_manager = NULL;
> +err:
> +	return ret;
> +}
> +void ttm_dma_page_alloc_fini(void)
> +{
> +	struct device_pools *p, *t;
> +
> +	printk(KERN_INFO TTM_PFX "Finalizing DMA pool allocator.\n");
> +	ttm_dma_pool_mm_shrink_fini(_manager);
> +
> +	list_for_each_entry_safe_reverse(p, t, &_manager->pools, pools) {
> +		dev_dbg(p->dev, "(%s:%d) Freeing.\n", p->pool->name,
> +			current->pid);
> +		WARN_ON(devres_destroy(p->dev, ttm_dma_pool_release,
> +			ttm_dma_pool_match, p->pool));
> +		ttm_dma_free_pool(p->dev, p->pool->type);
> +	}
> +	kobject_put(&_manager->kobj);
> +	_manager = NULL;
> +}
> +
> +int ttm_dma_page_alloc_debugfs(struct seq_file *m, void *data)
> +{
> +	struct device_pools *p;
> +	struct dma_pool *pool = NULL;
> +	char *h[] = {"pool", "refills", "pages freed", "inuse", "available",
> +		     "name", "virt", "busaddr"};
> +
> +	if (!_manager) {
> +		seq_printf(m, "No pool allocator running.\n");
> +		return 0;
> +	}
> +	seq_printf(m, "%13s %12s %13s %8s %8s %8s\n",
> +		   h[0], h[1], h[2], h[3], h[4], h[5]);
> +	mutex_lock(&_manager->lock);
> +	list_for_each_entry(p, &_manager->pools, pools) {
> +		struct device *dev = p->dev;
> +		if (!dev)
> +			continue;
> +		pool = p->pool;
> +		seq_printf(m, "%13s %12ld %13ld %8d %8d %8s\n",
> +				pool->name, pool->nrefills,
> +				pool->nfrees, pool->npages_in_use,
> +				pool->npages_free,
> +				pool->dev_name);
> +	}
> +	mutex_unlock(&_manager->lock);
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(ttm_dma_page_alloc_debugfs);
> +bool ttm_dma_override(struct ttm_backend_func *be)
> +{
> +	if (swiotlb_nr_tbl() && be) {
> +		be->get_pages = &ttm_dma_get_pages;
> +		be->put_pages = &ttm_dma_put_pages;
> +		return true;
> +	}
> +	return false;
> +}
> +EXPORT_SYMBOL_GPL(ttm_dma_override);
> diff --git a/include/drm/ttm/ttm_page_alloc.h b/include/drm/ttm/ttm_page_alloc.h
> index 0aaac39..9c52fb7 100644
> --- a/include/drm/ttm/ttm_page_alloc.h
> +++ b/include/drm/ttm/ttm_page_alloc.h
> @@ -29,6 +29,37 @@
>  #include "ttm_bo_driver.h"
>  #include "ttm_memory.h"
>  
> +#ifdef CONFIG_SWIOTLB
> +extern bool ttm_dma_override(struct ttm_backend_func *be);
> +
> +/**
> + * Initialize pool allocator.
> + */
> +int ttm_dma_page_alloc_init(struct ttm_mem_global *glob, unsigned max_pages);
> +/**
> + * Free pool allocator.
> + */
> +void ttm_dma_page_alloc_fini(void);
> +/**
> + * Output the state of pools to debugfs file
> + */
> +extern int ttm_dma_page_alloc_debugfs(struct seq_file *m, void *data);
> +#else
> +static inline bool ttm_dma_override(struct ttm_backend_func *be)
> +{
> +	return false;
> +}
> +static inline int ttm_dma_page_alloc_init(struct ttm_mem_global *glob,
> +					  unsigned max_pages)
> +{
> +	return -ENODEV;
> +}
> +static inline void ttm_dma_page_alloc_fini(void) { return; }
> +static inline int ttm_dma_page_alloc_debugfs(struct seq_file *m, void *data)
> +{
> +	return 0;
> +}
> +#endif
>  /**
>   * Get count number of pages from pool to pages list.
>   *
> -- 
> 1.7.6.4
> 

See comment above, otherwise:
Reviewed-by: Jerome Glisse <jglisse@redhat.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:21:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:21:24 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5q8-0005IJ-2H; Mon, 14 Nov 2011 15:21:24 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKzvV-0005b9-2R
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 15:02:02 -0700
X-Env-Sender: j.glisse@gmail.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1320098507!1424324!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11311 invoked from network); 31 Oct 2011 22:01:48 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-10.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	31 Oct 2011 22:01:48 -0000
Received: by vcbfo13 with SMTP id fo13so469421vcb.30
	for <xen-devel@lists.xensource.com>;
	Mon, 31 Oct 2011 15:01:47 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=date:from:to:cc:subject:message-id:references:mime-version
	:content-type:content-disposition:in-reply-to:user-agent;
	bh=UbO7M2nNjlnmRwg5iIHQSRpyO9Ot6mZWmLyG5CXWzoE=;
	b=vU3NT41qrpSuy1szQsAaxoBhK4x3xzoWwZiTWT500zTEPNWGrYnJrwjtqjxkh2NKTn
	R/OhWc/uXUutFsJSkmXuk/NRnuiLy4F2AVVXj9Utn72CWEAygfBuNdkdgV+wveqj21mP
	gsdcpDO/Ku3vG0XUyIEw6Y2zCUet4XnQ0zaus=
Received: by 10.220.151.195 with SMTP id d3mr2699742vcw.27.1320098507602;
	Mon, 31 Oct 2011 15:01:47 -0700 (PDT)
Received: from homer.localdomain (nat-pool-rdu.redhat.com. [66.187.233.202])
	by mx.google.com with ESMTPS id gw4sm11747455vdb.10.2011.10.31.15.01.45
	(version=TLSv1/SSLv3 cipher=OTHER);
	Mon, 31 Oct 2011 15:01:46 -0700 (PDT)
Date: Mon, 31 Oct 2011 18:05:57 -0400
From: Jerome Glisse <j.glisse@gmail.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Message-ID: <20111031220557.GD3036@homer.localdomain>
References: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:25 -0800
Cc: thellstrom@vmware.com, xen-devel@lists.xensource.com, thomas@shipmail.org,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	j.glisse@redhat.com, airlied@redhat.com, bskeggs@redhat.com
Subject: [Xen-devel] Re: [PATCH] TTM DMA pool v2.1
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Oct 19, 2011 at 06:19:21PM -0400, Konrad Rzeszutek Wilk wrote:
> [.. and this is what I said in v1 post]:
> 
> Way back in January this patchset:
> http://lists.freedesktop.org/archives/dri-devel/2011-January/006905.html
> was merged in, but pieces of it had to be reverted b/c they did not
> work properly under PowerPC, ARM, and when swapping out pages to disk.
> 
> After a bit of discussion on the mailing list
> http://marc.info/?i=4D769726.2030307@shipmail.org I started working on it, but
> got waylaid by other things .. and finally I am able to post the RFC patches.
> 
> There was a lot of discussion about it and I am not sure if I captured
> everybody's thoughts - if I did not - that is _not_ intentional - it has just
> been quite some time..
> 
> Anyhow .. the patches explore what the "lib/dmapool.c" does - which is to have a
> DMA pool that the device has associated with. I kind of married that code
> along with drivers/gpu/drm/ttm/ttm_page_alloc.c to create a TTM DMA pool code.
> The end result is DMA pool with extra features: can do write-combine, uncached,
> writeback (and tracks them and sets back to WB when freed); tracks "cached"
> pages that don't really need to be returned to a pool; and hooks up to
> the shrinker code so that the pools can be shrunk.
> 
> If you guys think this set of patches make sense  - my future plans were
>  1) Get this in large crowd of testing .. and if it works for a kernel release
>  2) to move a bulk of this in the lib/dmapool.c (I spoke with Matthew Wilcox
>     about it and he is OK as long as I don't introduce performance regressions).
> 
> But before I do any of that a second set of eyes taking a look at these
> patches would be most welcome.
> 
> In regards to testing, I've been running them non-stop for the last month.
> (and found some issues which I've fixed up) - and been quite happy with how
> they work.
> 
> Michel (thanks!) took a spin of the patches on his PowerPC and they did not
> cause any regressions (wheew).
> 
> The patches are also located in a git tree:
> 

Reviewed the patch series, looks good, already sent comment on
one of the patch. I am on the same side of Thomas for dma stuff,
lately i have been working on GPU virtual memory address space
and i believe having driver allocating the ttm_tt and merging
more stuff in the backend make sense, after all the backend
has better knowledge on both cache preference and dma mask.

So far my idea is to merge ttm_tt & ttm_backend, simplify the
backend function to bind/unbind/destroy where bind is
responsible to allocate or not a ttm_tt and pages that goes
along with it. I will try to sketch up patches for all this
in next few days.

Reviewed-by: Jerome Glisse <jglisse@redhat.com>

Cheers,
Jerome Glisse

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:22:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:22:11 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5qt-0005fR-G1; Mon, 14 Nov 2011 15:22:11 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLFOu-0005ri-Dc
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 07:33:16 -0700
X-Env-Sender: j.glisse@gmail.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1320157992!2475474!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6674 invoked from network); 1 Nov 2011 14:33:12 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-12.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 14:33:12 -0000
Received: by vcbfo13 with SMTP id fo13so1257569vcb.30
	for <xen-devel@lists.xensource.com>;
	Tue, 01 Nov 2011 07:33:11 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=date:from:to:cc:subject:message-id:references:mime-version
	:content-type:content-disposition:in-reply-to:user-agent;
	bh=q/TcToYr6/n4QK/Ok4dZci26ncSny7W4L3PB3uxZ5Wk=;
	b=GkZUlFwzz7A7Y1k6p5T9Yjf8lT4dr9RCOJDk3tT/8WEmlXZIheh6kDu+Fl1zG1p2Gq
	8sRnC7XGcqHDLlvOi52c5RegW82MZS/KtFXlxd5MLggW8hKzatvhbe/1YwVKGu7B1ZVU
	7kbxiPioqoiA4FSxHf3SGWiOAFc/TJkQU48nA=
Received: by 10.220.192.204 with SMTP id dr12mr251678vcb.170.1320157991521;
	Tue, 01 Nov 2011 07:33:11 -0700 (PDT)
Received: from homer.localdomain (nat-pool-rdu.redhat.com. [66.187.233.202])
	by mx.google.com with ESMTPS id il5sm11292860vdb.7.2011.11.01.07.33.09
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 01 Nov 2011 07:33:10 -0700 (PDT)
Date: Tue, 1 Nov 2011 10:37:15 -0400
From: Jerome Glisse <j.glisse@gmail.com>
To: Thomas Hellstrom <thomas@shipmail.org>
Message-ID: <20111101143715.GA8631@homer.localdomain>
References: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
	<1319062772-2793-7-git-send-email-konrad.wilk@oracle.com>
	<4EA28FA6.7000006@shipmail.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EA28FA6.7000006@shipmail.org>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:25 -0800
Cc: thellstrom@vmware.com, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	j.glisse@redhat.com, airlied@redhat.com, bskeggs@redhat.com
Subject: [Xen-devel] Re: [PATCH 06/11] ttm/driver: Expand ttm_backend_func
 to include two overrides for TTM page pool.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Sat, Oct 22, 2011 at 11:40:54AM +0200, Thomas Hellstrom wrote:
> Konrad,
> 
> I was hoping that we could get rid of the dma_address shuffling into
> core TTM,
> like I mentioned in the review. From what I can tell it's now only
> used in the backend and
> core ttm doesn't care about it.
> 
> Is there a particular reason we're still passing it around?
> 
> Thanks,
> /Thomas
> 

I am working on patchset on top of this that will move dma handling
back to driver and mostly out of ttm (the page alloc helper will
still do dma stuff on behalf of driver) So if my patchset is acceptable
the dma situation is transionary.

Cheers,
Jerome

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:22:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:22:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5rd-000621-Po; Mon, 14 Nov 2011 15:22:57 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLFg0-0006EF-G5
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 07:50:57 -0700
X-Env-Sender: thellstrom@vmware.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1320159052!1002481!1
X-Originating-IP: [65.115.85.69]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5606 invoked from network); 1 Nov 2011 14:50:53 -0000
Received: from smtp-outbound-1.vmware.com (HELO smtp-outbound-1.vmware.com)
	(65.115.85.69) by server-13.tower-182.messagelabs.com with SMTP;
	1 Nov 2011 14:50:53 -0000
Received: from mailhost3.vmware.com (mailhost3.vmware.com [10.16.27.45])
	by smtp-outbound-1.vmware.com (Postfix) with ESMTP id F2AB326008;
	Tue,  1 Nov 2011 07:50:51 -0700 (PDT)
Received: from linlap1.home.shipmail.org (unknown [10.23.99.61])
	by mailhost3.vmware.com (Postfix) with ESMTP id F021DCDA0A;
	Tue,  1 Nov 2011 07:50:48 -0700 (PDT)
Message-ID: <4EB006B8.8080001@vmware.com>
Date: Tue, 01 Nov 2011 15:48:24 +0100
From: Thomas Hellstrom <thellstrom@vmware.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.1.10) Gecko/20100624 Mandriva/3.0.5-0.1mdv2009.1 (2009.1)
	Thunderbird/3.0.5
MIME-Version: 1.0
To: Jerome Glisse <j.glisse@gmail.com>
References: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
	<1319062772-2793-7-git-send-email-konrad.wilk@oracle.com>
	<4EA28FA6.7000006@shipmail.org>
	<20111101143715.GA8631@homer.localdomain>
In-Reply-To: <20111101143715.GA8631@homer.localdomain>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:26 -0800
Cc: xen-devel@lists.xensource.com, Thomas Hellstrom <thomas@shipmail.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	j.glisse@redhat.com, airlied@redhat.com, bskeggs@redhat.com
Subject: [Xen-devel] Re: [PATCH 06/11] ttm/driver: Expand ttm_backend_func
 to include two overrides for TTM page pool.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/01/2011 03:37 PM, Jerome Glisse wrote:
> On Sat, Oct 22, 2011 at 11:40:54AM +0200, Thomas Hellstrom wrote:
>    
>> Konrad,
>>
>> I was hoping that we could get rid of the dma_address shuffling into
>> core TTM,
>> like I mentioned in the review. From what I can tell it's now only
>> used in the backend and
>> core ttm doesn't care about it.
>>
>> Is there a particular reason we're still passing it around?
>>
>> Thanks,
>> /Thomas
>>
>>      
> I am working on patchset on top of this that will move dma handling
> back to driver and mostly out of ttm (the page alloc helper will
> still do dma stuff on behalf of driver) So if my patchset is acceptable
> the dma situation is transionary.
>
> Cheers,
> Jerome
>    
Cool.

Thanks, Jerome.

/Thomas


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:23:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:23:47 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5sR-0006PT-6T; Mon, 14 Nov 2011 15:23:47 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RLJWq-0005QT-Hq
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 11:57:46 -0700
X-Env-Sender: J.Mason@cputech.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1320173861!537863!1
X-Originating-IP: [207.115.36.128]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15025 invoked from network); 1 Nov 2011 18:57:41 -0000
Received: from nlpi114.sbcis.sbc.com (HELO nlpi114.prodigy.net)
	(207.115.36.128) by server-13.tower-21.messagelabs.com with SMTP;
	1 Nov 2011 18:57:41 -0000
Received: from c4exch02.cputech.int (67-114-201-137.cputech.com
	[67.114.201.137] (may be forged))
	by nlpi114.prodigy.net (8.14.4 biz_spool_out_ldap/8.14.4) with ESMTP id
	pA1IvdNs021246
	for <xen-devel@lists.xensource.com>; Tue, 1 Nov 2011 13:57:40 -0500
X-MimeOLE: Produced By Microsoft Exchange V6.5
Content-class: urn:content-classes:message
MIME-Version: 1.0
Date: Tue, 1 Nov 2011 11:57:38 -0700
Message-ID: <405637EA6E87EE4F870F38B671F126AC030DEB9D@c4exch02.cputech.int>
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
Thread-Topic: xen4.1.1 and linux 3.1-rc4
Thread-Index: AcyYyCAtjMV3rBDeS0azry9X6QtZZw==
From: "Jeff Mason" <J.Mason@cputech.com>
To: <xen-devel@lists.xensource.com>
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:29 -0800
Subject: [Xen-devel] xen4.1.1 and linux 3.1-rc4
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1732633994=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.

--===============1732633994==
Content-class: urn:content-classes:message
Content-Type: multipart/alternative;
	boundary="----_=_NextPart_001_01CC98C8.20638B49"

This is a multi-part message in MIME format.

------_=_NextPart_001_01CC98C8.20638B49
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

I am trying to compile/run xen/linux using xen4.1.1 and linux 3.1-rc4 as
dom0.  These are the latest stable(*1, *2) releases as far as I can
tell.  Most of the email/documentation imply that I should be using the
'jeremy' kernel but other email/docs imply that all of these fixes are
now folded into Linux 3.1-rc4.

=20

My question is:

=20

Can I expect xen4.1.1 and linux 3.1-rc4 as DOM0 to work correctly?  My
current problem is that xend fails to start up (hangs).  I get the
RTNETLINK problem but all of the solutions I could find have been
applied.

=20

Thank you in advance

=20

Jeff

=20

*1) I tried xen4.1.2 but it failed with handle_irq_event_percpu error.
I could only find a patch that was appropriate for xen 4.1.1 and used it
to remove the error.

*2) The newest 3.1-rc4 kernel would not run due to kernel bug 42412
<http://lists.freedesktop.org/archives/dri-devel/2011-September/014125.h
tml>  about nouveau not working on older GEForce2 cards.  I got around
this by putting 'nomodeset' on the linux boot command line.

=20

Jeff Mason

Principal Engineer

CPU Technology

1500 Kansas Ave, Suite 3D

Longmont, CO 80501

720-204-6361

jmason@cputech.com

=20


------_=_NextPart_001_01CC98C8.20638B49
Content-Type: text/html;
	charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

<html xmlns:v=3D"urn:schemas-microsoft-com:vml" =
xmlns:o=3D"urn:schemas-microsoft-com:office:office" =
xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
xmlns:dt=3D"uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" =
xmlns:m=3D"http://schemas.microsoft.com/office/2004/12/omml" =
xmlns=3D"http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=3DContent-Type content=3D"text/html; =
charset=3Dus-ascii">
<meta name=3DGenerator content=3D"Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0in;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
	{mso-style-priority:99;
	color:blue;
	text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
	{mso-style-priority:99;
	color:purple;
	text-decoration:underline;}
span.EmailStyle17
	{mso-style-type:personal-compose;
	font-family:"Calibri","sans-serif";
	color:windowtext;}
.MsoChpDefault
	{mso-style-type:export-only;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
	{page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext=3D"edit" spidmax=3D"1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext=3D"edit">
  <o:idmap v:ext=3D"edit" data=3D"1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=3DEN-US link=3Dblue vlink=3Dpurple>

<div class=3DSection1>

<p class=3DMsoNormal>I am trying to compile/run xen/linux using xen4.1.1 =
and
linux 3.1-rc4 as dom0.&nbsp; These are the latest stable(*1, *2) =
releases as
far as I can tell.&nbsp; Most of the email/documentation imply that I =
should be
using the 'jeremy' kernel but other email/docs imply that all of these =
fixes
are now folded into Linux 3.1-rc4.<o:p></o:p></p>

<p class=3DMsoNormal><o:p>&nbsp;</o:p></p>

<p class=3DMsoNormal>My question is:<o:p></o:p></p>

<p class=3DMsoNormal><o:p>&nbsp;</o:p></p>

<p class=3DMsoNormal>Can I expect xen4.1.1 and linux 3.1-rc4 as DOM0 to =
work
correctly?&nbsp; My current problem is that xend fails to start up =
(hangs).&nbsp;
I get the RTNETLINK problem but all of the solutions I could find have =
been
applied.<o:p></o:p></p>

<p class=3DMsoNormal><o:p>&nbsp;</o:p></p>

<p class=3DMsoNormal>Thank you in advance<o:p></o:p></p>

<p class=3DMsoNormal><o:p>&nbsp;</o:p></p>

<p class=3DMsoNormal>Jeff<o:p></o:p></p>

<p class=3DMsoNormal><o:p>&nbsp;</o:p></p>

<p class=3DMsoNormal>*1) I tried xen4.1.2 but it failed with =
handle_irq_event_percpu
error.&nbsp; I could only find a patch that was appropriate for xen =
4.1.1 and
used it to remove the error.<o:p></o:p></p>

<p class=3DMsoNormal>*2) The newest 3.1-rc4 kernel would not run due to =
<a
href=3D"http://lists.freedesktop.org/archives/dri-devel/2011-September/01=
4125.html">kernel
bug 42412</a> about nouveau not working on older GEForce2 cards.&nbsp; I =
got
around this by putting 'nomodeset' on the linux boot command =
line.<o:p></o:p></p>

<p class=3DMsoNormal><o:p>&nbsp;</o:p></p>

<p class=3DMsoNormal>Jeff Mason<o:p></o:p></p>

<p class=3DMsoNormal>Principal Engineer<o:p></o:p></p>

<p class=3DMsoNormal>CPU Technology<o:p></o:p></p>

<p class=3DMsoNormal>1500 Kansas Ave, Suite 3D<o:p></o:p></p>

<p class=3DMsoNormal>Longmont, CO 80501<o:p></o:p></p>

<p class=3DMsoNormal>720-204-6361<o:p></o:p></p>

<p class=3DMsoNormal>jmason@cputech.com<o:p></o:p></p>

<p class=3DMsoNormal><o:p>&nbsp;</o:p></p>

</div>

</body>

</html>

------_=_NextPart_001_01CC98C8.20638B49--


--===============1732633994==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1732633994==--


From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:24:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:24:35 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5tD-0006n1-Es; Mon, 14 Nov 2011 15:24:35 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLK1k-0003Oz-BG
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 12:29:40 -0700
X-Env-Sender: themartininf@gmail.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1320175754!42937460!1
X-Originating-IP: [216.139.236.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13218 invoked from network); 1 Nov 2011 19:29:15 -0000
Received: from sam.nabble.com (HELO sam.nabble.com) (216.139.236.26)
	by server-12.tower-27.messagelabs.com with AES256-SHA encrypted SMTP;
	1 Nov 2011 19:29:15 -0000
Received: from [192.168.236.26] (helo=sam.nabble.com)
	by sam.nabble.com with esmtp (Exim 4.72)
	(envelope-from <themartininf@gmail.com>) id 1RLK1f-0006IQ-0Q
	for xen-devel@lists.xensource.com; Tue, 01 Nov 2011 12:29:35 -0700
Date: Tue, 1 Nov 2011 12:29:35 -0700 (PDT)
From: idexbsd <themartininf@gmail.com>
To: xen-devel@lists.xensource.com
Message-ID: <1320175775004-4956104.post@n5.nabble.com>
In-Reply-To: <4EA713AD.7000808@it-infrastrukturen.com>
References: <4EA713AD.7000808@it-infrastrukturen.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:33 -0800
Subject: [Xen-devel] Re: Docs: How to create and install CentOS PVMs with xe
 CLI on XCP 1.1
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hello, 

As you've obtained "Local \ LVM \ SR \ DB-VM-pool." 

You used lvcreate then "xe sr-create"?

--
View this message in context: http://xen.1045712.n5.nabble.com/Docs-How-to-create-and-install-CentOS-PVMs-with-xe-CLI-on-XCP-1-1-tp4937495p4956104.html
Sent from the Xen - Dev mailing list archive at Nabble.com.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:25:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:25:19 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5tu-0007A7-Oa; Mon, 14 Nov 2011 15:25:18 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLd7B-0008KQ-PH
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 08:52:34 -0700
X-Env-Sender: themartininf@gmail.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1320249149!1110233!1
X-Originating-IP: [216.139.236.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27301 invoked from network); 2 Nov 2011 15:52:30 -0000
Received: from sam.nabble.com (HELO sam.nabble.com) (216.139.236.26)
	by server-5.tower-21.messagelabs.com with AES256-SHA encrypted SMTP;
	2 Nov 2011 15:52:30 -0000
Received: from [192.168.236.26] (helo=sam.nabble.com)
	by sam.nabble.com with esmtp (Exim 4.72)
	(envelope-from <themartininf@gmail.com>) id 1RLd76-0006vy-1Q
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 08:52:28 -0700
Date: Wed, 2 Nov 2011 08:52:28 -0700 (PDT)
From: idexbsd <themartininf@gmail.com>
To: xen-devel@lists.xensource.com
Message-ID: <1320249148036-4958431.post@n5.nabble.com>
In-Reply-To: <4EA713AD.7000808@it-infrastrukturen.com>
References: <4EA713AD.7000808@it-infrastrukturen.com>
MIME-Version: 1.0
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:33 -0800
Subject: [Xen-devel] Re: Docs: How to create and install CentOS PVMs with xe
 CLI on XCP 1.1
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============2056294172=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============2056294172==
Content-Type: multipart/alternative; 
	boundary="----=_Part_924_30631912.1320249148037"

------=_Part_924_30631912.1320249148037
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

*SOLUTION:* 
I have modified the logical volume, then its size Resize to finally create
the "Local  LVM SR DB-VM-pool."

*NEW PROBLEM:* 
He has been a new problem, in the step of giving confirmation to write the
changes to the partition where you are installing centos, vncviewer
disconnects and I can not reconnect.

Are you sure that the version 6 of the centos6 can be virtualized in the XCP
1.1??

You have completed the installation?

--
View this message in context: http://xen.1045712.n5.nabble.com/Docs-How-to-create-and-install-CentOS-PVMs-with-xe-CLI-on-XCP-1-1-tp4937495p4958431.html
Sent from the Xen - Dev mailing list archive at Nabble.com.
------=_Part_924_30631912.1320249148037
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit

<b>SOLUTION:</b> 
I have modified the logical volume, then its size Resize to finally create the "Local  LVM SR DB-VM-pool."

<b>NEW PROBLEM:</b> 
He has been a new problem, in the step of giving confirmation to write the changes to the partition where you are installing centos, vncviewer disconnects and I can not reconnect.

Are you sure that the version 6 of the centos6 can be virtualized in the XCP 1.1??

You have completed the installation?
	
<br/><hr align="left" width="300" />
View this message in context: <a href="http://xen.1045712.n5.nabble.com/Docs-How-to-create-and-install-CentOS-PVMs-with-xe-CLI-on-XCP-1-1-tp4937495p4958431.html">Re: Docs: How to create and install CentOS PVMs with xe CLI on XCP 1.1</a><br/>
Sent from the <a href="http://xen.1045712.n5.nabble.com/Xen-Dev-f2473738.html">Xen - Dev mailing list archive</a> at Nabble.com.<br/>
------=_Part_924_30631912.1320249148037--


--===============2056294172==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============2056294172==--


From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:26:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:26:05 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5ue-0007Xu-US; Mon, 14 Nov 2011 15:26:04 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLj9v-0001Cw-Aw
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 15:19:47 -0700
X-Env-Sender: miche@google.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1320272383!2724384!1
X-Originating-IP: [216.239.44.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7107 invoked from network); 2 Nov 2011 22:19:44 -0000
Received: from smtp-out.google.com (HELO smtp-out.google.com) (216.239.44.51)
	by server-6.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 2 Nov 2011 22:19:44 -0000
Received: from hpaq2.eem.corp.google.com (hpaq2.eem.corp.google.com
	[172.25.149.2]) by smtp-out.google.com with ESMTP id pA2MJF2A003518;
	Wed, 2 Nov 2011 15:19:15 -0700
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta;
	t=1320272364; bh=5r+FUJjaaKpresG3L5OcyXa2bKU=;
	h=Subject:To:From:Date:Message-ID:MIME-Version:Content-Type:
	Content-Transfer-Encoding;
	b=BMXifEwZbqMCiIvtbqqrDtjiqAxZQ28OCygZlVpgQ1bCst8c++PZkm0/RSb+in0oT
	2lXkdJ8NV4Txx4fOfdCGQ==
DomainKey-Signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns;
	h=subject:to:from:date:message-id:user-agent:mime-version:
	content-type:content-transfer-encoding;
	b=W28QLSPdnf+Eb1M/emmLgvdmIJ/dak1RfcWVLYUsAC2yotl3G+AXc3cm1CFybUx9F
	AnNGghZmHIQcMQOGP8scg==
Received: from miche.sea.corp.google.com (miche.sea.corp.google.com
	[172.31.71.52])
	by hpaq2.eem.corp.google.com with ESMTP id pA2MJ7MY024400;
	Wed, 2 Nov 2011 15:19:07 -0700
Received: from miche.sea.corp.google.com (localhost [IPv6:::1])
	by miche.sea.corp.google.com (Postfix) with ESMTP id A254020309;
	Wed,  2 Nov 2011 15:19:06 -0700 (PDT)
To: Stephen Rothwell <sfr@canb.auug.org.au>,
	Greg Kroah-Hartman <gregkh@suse.de>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Rusty Russell <rusty@rustcorp.com.au>,
	Miche Baker-Harvey <miche@google.com>, linux-kernel@vger.kernel.org,
	Mike Waychison <mikew@google.com>, xen-devel@lists.xensource.com,
	Anton Blanchard <anton@samba.org>, Amit Shah <amit.shah@redhat.com>,
	virtualization@lists.linux-foundation.org,
	ppc-dev <linuxppc-dev@lists.ozlabs.org>
From: Miche Baker-Harvey <miche@google.com>
Date: Wed, 02 Nov 2011 15:19:06 -0700
Message-ID: <20111102221905.9722.62090.stgit@miche.sea.corp.google.com>
User-Agent: StGit/0.15
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:33 -0800
Cc: 
Subject: [Xen-devel] [PATCH RFC 0/3] Support multiple VirtioConsoles.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This patchset applies to linux-next/next-20111102.

This series implements support for multiple virtio_consoles using KVM.

This patchset addresses several issues associated with trying to
establish multiple virtio consoles. 

I'm trying to start a guest via KVM that supports multiple virtual
consoles, with getty's on each, and with some being console devices.

These patches let me establish more than one VirtioConsole (I'm
running eight at the moment), and enable console output appearing on
one of them.  It still doesn't successfully generate console output on
multiple VirtioConsoles.

Let me apologise for my last patch having gotten into Linus' tree, and
leaving other people to deal with crashes.  I had meant to be asking
for guidance, but I didn't mark it as "RFC".

This series reflects the input from Konrad Rzeszutek, Amit Shah, Stephen
Boyd, and Rusty Russell.  I think we do have to limit hvc_alloc() to one
thread.

I would appreciate any comments or feedback, or accept if appropriate.

Thanks,
Miche Baker-Harvey

---

Miche Baker-Harvey (3):
      virtio_console:  Fix locking of vtermno.
      hvc_init():  Enforce one-time initialization.
      Use separate struct console structure for each hvc_console.


 drivers/char/virtio_console.c |    9 ++++++---
 drivers/tty/hvc/hvc_console.c |   33 +++++++++++++++++++++++++++++++--
 drivers/tty/hvc/hvc_console.h |    1 +
 3 files changed, 38 insertions(+), 5 deletions(-)

-- 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:26:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:26:49 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5vN-0007uY-IM; Mon, 14 Nov 2011 15:26:49 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLkp5-0005v2-9u
	for xen-devel@lists.xensource.com; Wed, 02 Nov 2011 17:06:24 -0700
X-Env-Sender: rusty@ozlabs.org
X-Msg-Ref: server-15.tower-21.messagelabs.com!1320278777!2697682!1
X-Originating-IP: [203.10.76.45]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14323 invoked from network); 3 Nov 2011 00:06:19 -0000
Received: from ozlabs.org (HELO ozlabs.org) (203.10.76.45)
	by server-15.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Nov 2011 00:06:19 -0000
Received: by ozlabs.org (Postfix, from userid 1011)
	id 05937B6F94; Thu,  3 Nov 2011 11:06:14 +1100 (EST)
From: Rusty Russell <rusty@ozlabs.org>
To: Stephen Boyd <sboyd@codeaurora.org>, Joe Perches <joe@perches.com>
In-Reply-To: <4EAAF23C.8050102@codeaurora.org>
References: <20111027173527.GA23839@phenom.dumpdata.com>
	<1319751802-27013-1-git-send-email-miche@google.com>
	<1319770558.2529.20.camel@Joe-Laptop>
	<4EAAF23C.8050102@codeaurora.org>
User-Agent: Notmuch/0.6.1-1 (http://notmuchmail.org) Emacs/23.3.1
	(i686-pc-linux-gnu)
Date: Thu, 03 Nov 2011 08:32:13 +1030
Message-ID: <87k47itc7u.fsf@rustcorp.com.au>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:30 -0800
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Greg Kroah-Hartman <gregkh@suse.de>, Miche Baker-Harvey <miche@google.com>,
	linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org,
	Christian Borntraeger <borntraeger@de.ibm.com>,
	Hendrik Brueckner <brueckner@linux.vnet.ibm.com>,
	Anton Blanchard <anton@samba.org>, Amit Shah <amit.shah@redhat.com>
Subject: [Xen-devel] Re: [PATCH] VirtioConsole support.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, 28 Oct 2011 11:19:40 -0700, Stephen Boyd <sboyd@codeaurora.org> wrote:
> Even better would be kmemdup().

OK, this driver is horribly unloved, and ugly.  Noone claims to really
understand it, but people keep poking it.

Ben, Christian, can you figure out what's going on?  Is it time for a
complete rewrite?

Thanks,
Rusty.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:27:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:27:36 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5w8-0008Hs-69; Mon, 14 Nov 2011 15:27:36 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLsq2-0006ze-GS; Thu, 03 Nov 2011 01:39:54 -0700
X-Env-Sender: fbcyborg@gmail.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1320309590!2122121!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10629 invoked from network); 3 Nov 2011 08:39:51 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 08:39:51 -0000
Received: by vcbfk14 with SMTP id fk14so217245vcb.30
	for <multiple recipients>; Thu, 03 Nov 2011 01:39:50 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:from:date:message-id:subject:to
	:cc:content-type;
	bh=FjhgXXTbkIaAQBAZvTW/P9u6kjg6oQ/A3EZ2mM2SSuw=;
	b=B+BCWeQtME+Of/XK9Hmnu2acjKkLiw1tAy5L1U5dws2qx+FBDHGolwiZJSwwWquJx5
	XUNYja+J1wEW2JRKNg7mZZsLr1JJhks+ajbLynYBl7hD3TJthIyHr+4cw3iYoCU3r3kj
	KI+qrh2F1CJr2qyZ4WqiWhg1XLu1cVFfqqJI8=
Received: by 10.52.33.50 with SMTP id o18mr8528831vdi.42.1320309590086; Thu,
	03 Nov 2011 01:39:50 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.52.185.231 with HTTP; Thu, 3 Nov 2011 01:39:29 -0700 (PDT)
In-Reply-To: <alpine.DEB.2.00.1111030645070.3519@kaball-desktop>
References: <1758215.SCbitK4oVy@dell4550>
	<1320058232.23193.59.camel@zakaz.uk.xensource.com>
	<alpine.DEB.2.00.1111030645070.3519@kaball-desktop>
From: Flavio <fbcyborg@gmail.com>
Date: Thu, 3 Nov 2011 09:39:29 +0100
Message-ID: <CAP8Jb=paAsq754ermXsjytD3a3mgwELwtDdHNAoq7su8GLO_qg@mail.gmail.com>
Subject: Re: [Xen-users] Re: [Xen-devel] Problems with 'xl create winxp' (hvm)
	on xen 4.1.2 (also affects GPLPV)
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Content-Type: text/plain; charset=ISO-8859-1
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:32 -0800
Cc: jim burns <jim_burn@bellsouth.net>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 3 November 2011 07:46, Stefano Stabellini
<stefano.stabellini@eu.citrix.com> wrote:
> On Mon, 31 Oct 2011, Ian Campbell wrote:
>> > 3) Specifying vncviewer=1/vncconsole=1 in your config (don't remember which
>> > works - I use both) will automatically start a vnc viewer for you when you 'xm
>> > create' an hvm domain. (Sadly, this never worked for a pv domain. You have to
>> > use the xm/xl vncviewer domainname command.) This does not work with 'xl
>> > create'.
>>
>> I think this is just a missing feature.
>>
>
> Nope, it should work. IanJ implemented this feature a while back.
I doesn't work to me using xl. I am obliged to do xl vncviewer <domain_id>
once the domU has started.
-- 
Flavio

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:28:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:28:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5wr-0000DZ-JQ; Mon, 14 Nov 2011 15:28:21 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RLwaS-0001k8-8b
	for xen-devel@lists.xensource.com; Thu, 03 Nov 2011 05:40:04 -0700
X-Env-Sender: borntraeger@de.ibm.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1320323896!2146499!1
X-Originating-IP: [194.196.100.163]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32123 invoked from network); 3 Nov 2011 12:38:16 -0000
Received: from mtagate3.uk.ibm.com (HELO mtagate3.uk.ibm.com) (194.196.100.163)
	by server-16.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Nov 2011 12:38:16 -0000
Received: from d06nrmr1507.portsmouth.uk.ibm.com
	(d06nrmr1507.portsmouth.uk.ibm.com [9.149.38.233])
	by mtagate3.uk.ibm.com (8.13.1/8.13.1) with ESMTP id pA3CcFXC012504
	for <xen-devel@lists.xensource.com>; Thu, 3 Nov 2011 12:38:15 GMT
Received: from d06av08.portsmouth.uk.ibm.com (d06av08.portsmouth.uk.ibm.com
	[9.149.37.249])
	by d06nrmr1507.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with
	ESMTP id pA3CcEP32134254
	for <xen-devel@lists.xensource.com>; Thu, 3 Nov 2011 12:38:15 GMT
Received: from d06av08.portsmouth.uk.ibm.com (loopback [127.0.0.1])
	by d06av08.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with
	ESMTP id pA3CcDcv017004
	for <xen-devel@lists.xensource.com>; Thu, 3 Nov 2011 12:38:14 GMT
Received: from [9.152.224.64] (dyn-9-152-224-64.boeblingen.de.ibm.com
	[9.152.224.64])
	by d06av08.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with
	ESMTP id pA3CcCYU016959; Thu, 3 Nov 2011 12:38:12 GMT
Message-ID: <4EB28B37.8030301@de.ibm.com>
Date: Thu, 03 Nov 2011 13:38:15 +0100
From: Christian Borntraeger <borntraeger@de.ibm.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Rusty Russell <rusty@ozlabs.org>
References: <20111027173527.GA23839@phenom.dumpdata.com>
	<1319751802-27013-1-git-send-email-miche@google.com>
	<1319770558.2529.20.camel@Joe-Laptop>
	<4EAAF23C.8050102@codeaurora.org> <87k47itc7u.fsf@rustcorp.com.au>
In-Reply-To: <87k47itc7u.fsf@rustcorp.com.au>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:31 -0800
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Stephen Boyd <sboyd@codeaurora.org>, Greg Kroah-Hartman <gregkh@suse.de>,
	Miche Baker-Harvey <miche@google.com>, linux-kernel@vger.kernel.org,
	virtualization@lists.linux-foundation.org,
	Amit Shah <amit.shah@redhat.com>,
	Hendrik Brueckner <brueckner@linux.vnet.ibm.com>,
	Anton Blanchard <anton@samba.org>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Joe Perches <joe@perches.com>
Subject: [Xen-devel] Re: [PATCH] VirtioConsole support.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 02/11/11 23:02, Rusty Russell wrote:
> Ben, Christian, can you figure out what's going on?  Is it time for a
> complete rewrite?

You are talking about hvc console? Yes it has so many users that it is now
something like a console/tty layer extension, but it was never designed to be
one. 

I think the hardest part would be to get all users together (for testing and
requirements) and then to find someone that is actually doing that rework. Dont
know if the pain level is already that high?

Christian

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:29:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:29:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5xe-0000bq-Ky; Mon, 14 Nov 2011 15:29:10 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RLxfF-0006Me-SP; Thu, 03 Nov 2011 06:49:06 -0700
X-Env-Sender: evammg@gmail.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1320328141!2161561!1
X-Originating-IP: [209.85.216.178]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14448 invoked from network); 3 Nov 2011 13:49:02 -0000
Received: from mail-qy0-f178.google.com (HELO mail-qy0-f178.google.com)
	(209.85.216.178)
	by server-6.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Nov 2011 13:49:02 -0000
Received: by qyg14 with SMTP id 14so405356qyg.9
	for <multiple recipients>; Thu, 03 Nov 2011 06:49:01 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:from:date:message-id:subject:to
	:cc:content-type;
	bh=fSbGdWLgg3jIFd3fCs3u2M7sDlO5R/P7PQIhg0CgBUc=;
	b=HNvkeWucGHYA3VNOOPFZgreWx+KgSUBUrh77GtD/Nr0pTeczCmPFzRw1W4bmEfeySu
	1DVIINJa2hbR2PrYBjf4jI+Pc8Fac63FTBWV8TcoBnrwpchx6glKoBYOv4xFKHVu2MY7
	hHWC3UsG/ZgdQEKOvCD7T2763ncoYujTTNoLg=
Received: by 10.50.181.225 with SMTP id dz1mr4336579igc.30.1320328141051; Thu,
	03 Nov 2011 06:49:01 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.50.161.133 with HTTP; Thu, 3 Nov 2011 06:48:40 -0700 (PDT)
In-Reply-To: <4EA96956.4070300@xen.org>
References: <4EA96956.4070300@xen.org>
From: eva <evammg@gmail.com>
Date: Thu, 3 Nov 2011 14:48:40 +0100
Message-ID: <CAN-hevnvCFT3bCX9+_tsmVCG0TD0JRbFC9kD4Ae4dFVZySgKCg@mail.gmail.com>
To: Lars Kurth <lars.kurth@xen.org>
Content-Type: text/plain; charset=ISO-8859-1
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:34 -0800
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>
Subject: [Xen-devel] Re: [Xen-users] Xen Document Day : Thank You!
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 27 October 2011 16:23, Lars Kurth <lars.kurth@xen.org> wrote:
>
> Hi everybody!
> I wanted to thank you for helping out with the document day. As far as I can see, we got quite a bit of stuff done:t, etc.
>
> [...]
>
> What did surprise me, is how little documentation for users there actually is on the Wiki. I thought we were in bad shape, but not that bad. Have to think about how to address this.
>
> We are also working on setting up a new wiki and then find a way to start migrating content over. It may make sense to have regular document days. Any views?
>
> Regards
> Lars
>

Hello,

My name is Eva and I am a newbie to Xen. The purpose is to make Xen
works in our data center, as part of a research in the Ministry of
Science in Spain, and hopefully move forward if things going as
expected.

So I am concerned about the documentation. I have created a twitter
account for this:

http://twitter.com/xenspain

to post all the documentation related with Xen in Spanish when
possible. Anyone that wants me to post articles in this twitter
account, please just email me.

Translating the documentation into Spanish is going to be a hard work,
so if there's anyone that wants to help, it'll be welcome.

So, at this point, I wonder where to post the translations. Maybe the
bet the best place is the Xen wiki site. But I dont know if you guys
agree or if you are ready now for this change.

I'd like to translate not just the documentation of the wiki, but also
any article I consider relevant on the web, like this one:

http://blogs.oracle.com/wim/entry/linux_mainline_contains_all_the

If no place is made for the spanish translation at the xen wiki, then
I'll create a site to place the translations. No problem, just let me
know what suits you the best.


Regards

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:31:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:31:26 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ5zp-00010q-KB; Mon, 14 Nov 2011 15:31:26 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMKJq-0003hH-1t
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 07:00:59 -0700
X-Env-Sender: yujiageng734@gmail.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1320415224!2948651!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28358 invoked from network); 4 Nov 2011 14:00:25 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-4.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 14:00:25 -0000
Received: by qabg1 with SMTP id g1so2962943qab.30
	for <xen-devel@lists.xensource.com>;
	Fri, 04 Nov 2011 07:00:23 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type;
	bh=OQnqXIsZjyEkttVd23cdtpdjhhv+pwAitkUtFkhWvDM=;
	b=M/fvY9rtpbUqAplCkbvJW33gnn4i7dDcyaFQV49qkhi1/8+RVUCfa5W2qDKeqp8vX1
	BOCPYFqYFOg+kDvWTKdRYm/3DYrT/9UN2Oeaxm7NZnCtrr/ByIIuErQtCjjs70ZdG/hq
	qC5JeWVL98ZVB00nEjrbpsO4DcstOk86gNkIE=
MIME-Version: 1.0
Received: by 10.42.156.9 with SMTP id x9mr15196945icw.42.1320415222889; Fri,
	04 Nov 2011 07:00:22 -0700 (PDT)
Received: by 10.42.179.67 with HTTP; Fri, 4 Nov 2011 07:00:22 -0700 (PDT)
In-Reply-To: <alpine.DEB.2.00.1109151110020.12963@kaball-desktop>
References: <alpine.DEB.2.00.1109021401000.12963@kaball-desktop>
	<CA8694A1.20379%keir.xen@gmail.com>
	<CAJ0pt17eoZbEnmziLaSd1Cxi+sU90rJ-c8TSgt+ikE3wZj1jhA@mail.gmail.com>
	<alpine.DEB.2.00.1109151110020.12963@kaball-desktop>
Date: Fri, 4 Nov 2011 22:00:22 +0800
Message-ID: <CAJ0pt147o57wwZBowRVQzCS2nBcSbfH0GgsVZEoyJzz49CZ8UQ@mail.gmail.com>
Subject: Re: [Xen-devel] Re: Linux Stubdom Problem
From: Jiageng Yu <yujiageng734@gmail.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Content-Type: multipart/mixed; boundary=90e6ba61387050ffad04b0e920a4
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:43 -0800
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, Tim Deegan <tim@xen.org>,
	Ian Campbell <Ian.Campbell@eu.citrix.com>,
	Keir Fraser <keir.xen@gmail.com>,
	Anthony PERARD <anthony.perard@gmail.com>,
	Samuel Thibault <samuel.thibault@ens-lyon.org>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--90e6ba61387050ffad04b0e920a4
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

2011/9/15 Stefano Stabellini <stefano.stabellini@eu.citrix.com>:
> On Wed, 14 Sep 2011, Jiageng Yu wrote:
>> Hi Stefano,
>>
>> =C2=A0 =C2=A0 =C2=A0I just have a prototype of vram mapping and test it =
now. The
>> implementation of linux-stubdom kernel part is as follows.
>> xen_remap_domain_mfn_range2 function maps foreign dom's physical
>> address into linux kernel space. It is similar to
>> xen_remap_domain_mfn_range. But xen_remap_domain_mfn_range is used to
>> map foreign pages into linux user space.
>>
>> =C2=A0 =C2=A0 But the page info seems wrong after executing xen_remap_do=
main_mfn_range2.
>>
>> =C2=A0 =C2=A0 struct page *page=3Dpfn_to_page(vmalloc_to_pfn(info->fb));
>>
>> =C2=A0 =C2=A0 The page->_count =3D 0xc2c2c2c2. It is very strange.
>>
>> =C2=A0 =C2=A0 Did I do the right thing?
>>
>
> use page_address instead of pfn_to_page to find the struct page
>
>
>> =C2=A0 =C2=A0 Greeting.
>>
>> Jiageng Yu.
>>
>>
>> diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
>> index 204e3ba..72a7808 100644
>> --- a/arch/x86/xen/mmu.c
>> +++ b/arch/x86/xen/mmu.c
>> @@ -2693,6 +2693,73 @@ out:
>> =C2=A0}
>> =C2=A0EXPORT_SYMBOL_GPL(xen_remap_domain_mfn_range);
>>
>> +int xen_remap_domain_mfn_range2(unsigned long addr,unsigned long gpfn,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int nr, unsigne=
d domid)
>> +{
>> + =C2=A0 =C2=A0struct remap_data rmd;
>> + =C2=A0 =C2=A0struct mmu_update mmu_update[REMAP_BATCH_SIZE];
>> + =C2=A0 =C2=A0int level,i,batch,nr_page =3D nr;
>> + =C2=A0 =C2=A0unsigned long range;
>> + =C2=A0 =C2=A0int err =3D 0;
>> + =C2=A0 =C2=A0unsigned long vaddr,base_addr =3D addr;
>> + =C2=A0 =C2=A0pte_t pte,*ptep;
>> +
>> + =C2=A0 =C2=A0rmd.mfn =3D gpfn;
>> + =C2=A0 =C2=A0rmd.prot =3D __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_AC=
CESSED |
>> _PAGE_IOMAP);
>> +
>> + =C2=A0 =C2=A0while(nr_page) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0batch =3D min(REMAP_BATCH_SIZE, nr);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0range =3D (unsigned long)batch << PAGE_SHIF=
T;
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0rmd.mmu_update =3D mmu_update;
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0for(i=3D0; i < batch; i++){
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pte =3D pte_mkspecial(pfn_pte=
(rmd.mfn++, rmd.prot));
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0vaddr =3D base_addr + i*PAGE_=
SIZE;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ptep =3D lookup_address(vaddr=
, &level);
>
> you need to check if ptep is valid here and the level is PG_LEVEL_4K
>
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0rmd.mmu_update->ptr =3D arbit=
rary_virt_to_machine(ptep).maddr |
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0MMU_NO=
RMAL_PT_UPDATE;
>
> you can use pte_mfn(*ptep) instead of arbitrary_virt_to_machine
>
>
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0rmd.mmu_update->val =3D pte_v=
al_ma(pte);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0rmd.mmu_update++;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0err =3D -EFAULT;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if(HYPERVISOR_mmu_update(mmu_update, batch,=
 NULL, domid) < 0)
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0nr_page -=3D batch;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0base_addr +=3D range;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0err =3D 0;
>> +
>> + =C2=A0 =C2=A0base_addr =3D addr;
>> + =C2=A0 =C2=A0for(i=3D0; i < nr; i++){
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0vaddr =3D base_addr + i*PAGE_SIZE;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0set_phys_to_machine(vmalloc_to_pfn(vaddr),
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0arbitrary_virt_=
to_machine(vaddr).maddr >> PAGE_SHIFT);
>> + =C2=A0 =C2=A0}
>
> The second argument (mfn) to set_phys_to_machine is wrong:
> arbitrary_virt_to_machine ends up calling virt_to_machine if
> virt_addr_valid. You need to manually call pte_mfn:
>
> /* the ptep content has been updated by Xen so we can lookup the foreign
> =C2=A0* mfn from the pte now */
> pte =3D lookup_address(vaddr, &level);
> BUG_ON(pte =3D=3D NULL);
> offset =3D vaddr & ~PAGE_MASK;
> mfn =3D XMADDR(((phys_addr_t)pte_mfn(*pte) << PAGE_SHIFT) + offset);
>
>
>> +
>> +out:
>> + =C2=A0 =C2=A0 flush_tlb_all();
>> + =C2=A0 =C2=A0 return err;
>> +}
>> +EXPORT_SYMBOL_GPL(xen_remap_domain_mfn_range2);
>
> the name should be changed to xen_remap_foreign_gpfn_range
>
>
>> =C2=A0#ifdef CONFIG_XEN_PVHVM
>> =C2=A0static void xen_hvm_exit_mmap(struct mm_struct *mm)
>> =C2=A0{
>> diff --git a/drivers/video/xen-fbfront.c b/drivers/video/xen-fbfront.c
>> index dc72563..82da2ee 100644
>> --- a/drivers/video/xen-fbfront.c
>> +++ b/drivers/video/xen-fbfront.c
>> @@ -25,8 +25,12 @@
>> =C2=A0#include <linux/module.h>
>> =C2=A0#include <linux/vmalloc.h>
>> =C2=A0#include <linux/mm.h>
>> +#include <linux/sched.h>
>> +#include <asm/pgtable.h>
>> +#include <asm/page.h>
>>
>> =C2=A0#include <asm/xen/hypervisor.h>
>> +#include <asm/xen/page.h>
>>
>> =C2=A0#include <xen/xen.h>
>> =C2=A0#include <xen/events.h>
>> @@ -34,6 +38,7 @@
>> =C2=A0#include <xen/interface/io/fbif.h>
>> =C2=A0#include <xen/interface/io/protocols.h>
>> =C2=A0#include <xen/xenbus.h>
>> +#include <xen/xen-ops.h>
>>
>> =C2=A0struct xenfb_info {
>> =C2=A0 =C2=A0 =C2=A0 unsigned char =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *f=
b;
>> @@ -62,6 +67,12 @@ module_param_array(video, int, NULL, 0);
>> =C2=A0MODULE_PARM_DESC(video,
>> =C2=A0 =C2=A0 =C2=A0 "Video memory size in MB, width, height in pixels (=
default 2,800,600)");
>>
>> +static unsigned long foreign_vaddr =3D 0;
>> +module_param(foreign_vaddr, ulong, S_IRUGO);
>> +
>> +static unsigned long foreign_domid =3D 0;
>> +module_param(foreign_domid, ulong, S_IRUGO);
>> +
>> =C2=A0static void xenfb_make_preferred_console(void);
>> =C2=A0static int xenfb_remove(struct xenbus_device *);
>> =C2=A0static void xenfb_init_shared_page(struct xenfb_info *, struct fb_=
info *);
>> @@ -398,7 +408,17 @@ static int __devinit xenfb_probe(struct xenbus_devi=
ce *dev,
>> =C2=A0 =C2=A0 =C2=A0 if (info->fb =3D=3D NULL)
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto error_nomem;
>> =C2=A0 =C2=A0 =C2=A0 memset(info->fb, 0, fb_size);
>> -
>> + =C2=A0 =C2=A0if((foreign_vaddr !=3D 0) && (foreign_domid !=3D 0)){
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D xen_remap_domain_mfn_range2((unsign=
ed long)(info->fb),
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0foreign_vaddr >> PAG=
E_SHIFT,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fb_size >> PAGE_SHIF=
T, foreign_domid);
>
> you should rename foreign_vaddr to foreign_gpfn and pass the gpfn value
> that is the ram_addr (page shifted) passed to xen_ram_alloc in qemu.
>
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if(ret < 0){
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0printk("Can not remap vram of=
 hvm guest.\n");
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto error;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> =C2=A0 =C2=A0 =C2=A0 info->nr_pages =3D (fb_size + PAGE_SIZE - 1) >> PAG=
E_SHIFT;
>>
>> =C2=A0 =C2=A0 =C2=A0 info->mfns =3D vmalloc(sizeof(unsigned long) * info=
->nr_pages);
>> diff --git a/include/xen/xen-ops.h b/include/xen/xen-ops.h
>> index 4349e89..1554531 100644
>> --- a/include/xen/xen-ops.h
>> +++ b/include/xen/xen-ops.h
>> @@ -20,6 +20,10 @@ int xen_remap_domain_mfn_range(struct vm_area_struct =
*vma,
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned long mfn, int nr,
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pgprot_t prot, unsigned domid);
>>
>> +int xen_remap_domain_mfn_range2(unsigned long addr,unsigned long mfn,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int nr, unsigne=
d domid);
>> =C2=A0extern unsigned long *xen_contiguous_bitmap;
>> =C2=A0int xen_create_contiguous_region(unsigned long vstart, unsigned in=
t order,
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned int address_bits);
>>
>

Hi Stefano,

   Good news! We have the basic Linux based stubdom now, as shown in
attached figures. It can run, but the keyboard and network drivers
still need to be tested.

   In my recent work, I found the pte_mkspecial() (in linux stubdom
kernel) returned invalid value when I tried to map some memory spaces
into linux based stubdom from hvm guest.

pte_mkspecial()
       ->pte_set_flags()
               ->native_pte_val()
               ->native_make_pte()

  According to my test, the root cause of the problem is native_xxx
functions. The patch is as follows. But I think hardcoding is not a
good way to handle the problem. Maybe you can give me some
suggestions.

  Best Regards!

Jiageng Yu.


diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
index 204e3ba..c995139 100644
--- a/arch/x86/xen/mmu.c
+++ b/arch/x86/xen/mmu.c
@@ -2639,12 +2640,23 @@ static int remap_area_mfn_pte_fn(pte_t *ptep,
pgtable_t token,
 				 unsigned long addr, void *data)
 {
 	struct remap_data *rmd =3D data;
-	pte_t pte =3D pte_mkspecial(pfn_pte(rmd->mfn++, rmd->prot));
+    if(((rmd->mfn & 0xfffffff0) =3D=3D 0xc0) ||
+            ((rmd->mfn & 0xfffffff0) =3D=3D 0x90) ||
+                ((rmd->mfn & 0xfffffff0) =3D=3D 0x00) ||
+                    ((rmd->mfn & 0xfffffff0) =3D=3D 0x70) ||
+                        ((rmd->mfn & 0xfffffff0) =3D=3D 0x10)){
+	    pte_t pte =3D pfn_pte(rmd->mfn++, rmd->prot);
+	    rmd->mmu_update->val =3D pte_val(pte);
+    }else{
+	    pte_t pte =3D pte_mkspecial(pfn_pte(rmd->mfn++, rmd->prot));
+	    rmd->mmu_update->val =3D pte_val_ma(pte);
+    }

 	rmd->mmu_update->ptr =3D arbitrary_virt_to_machine(ptep).maddr;
-	rmd->mmu_update->val =3D pte_val_ma(pte);
 	rmd->mmu_update++;
-
 	return 0;
 }

--90e6ba61387050ffad04b0e920a4
Content-Type: image/png; name="Screenshot-QEMU (fedora14-dm)-1.png"
Content-Disposition: attachment; 
	filename="Screenshot-QEMU (fedora14-dm)-1.png"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gul92de20

iVBORw0KGgoAAAANSUhEUgAAAyYAAAJwCAYAAAB8l3VsAAAABHNCSVQICAgIfAhkiAAAABl0RVh0
U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AACAASURBVHic7d17dJx3fefxz0jyNXZiO3bs
OPfEhISQQC5cCgkEKJRbS09btmab0m4oFA7dAxRCS9qFbZemLS1doJTLtnQbTs9iKG23V9gGSMsl
QAM0gSSQe0Kudny/yZY00v6h2JZkXUbySF/Jeb3OyYk18+g3v2c0euZ5z/PMqJFRrLzyfQOjXQ4A
AHCkNv/5OxsjL+sa+sWBINn8zNfO1JwAAOCodsFpq9s+5g++9bWcc8lz59S4PavWHfx6ZTLYHUMC
5WCYrLzyfQNbLn5NkqTR7G37ZAAA4Imou5nM7+9p65iNvp45N+7QxjjQHSuTgQNx0pUMRsnWC1+d
Rn9fWycAAABPdN3NpLPNL/w3mr1zbtzRWmPrha/OyisH46Rr6MIAAEB77Wsmi/vavaPfM+fGnag3
ulZe+b6B7ee9Mo1ma0dLTv7i301pMg++6FVT+j6Ao9UvXbAsH/3RE/OWLz2aj9y07eDlP3raMfnj
F67Jmcvmp6ORPP2T9+TWzfundBvnrVyQm157ZpJk3h99vy3znm2OdB0vP2Vxrnv1afnITdvyli89
2u7pAaS7mTTbvqPfWzLuGUs709FI7tnZzIFPy2okOXlJZzobyX27mmOOO1ZvbD/vlVl5ZQa6kqTR
P7kV+qlXv3RSy//NX31+0rcBMFmnHDsv73nOmrz4jCVZtagrj3X35Yv37c5v3bAx9+84dK5szzsu
GPX75//hd4ddP5Dk/D+/PXdsHYyCJ69YkO9e+eQ0xlj+wr+4I7du3jfmZUMtnteR337OquzY38xf
fHdzGv39B6/7kxcNRsn1P9ydWzbvy9Y9+6Z8qm2jv3PIv2duO/zpnzgtz1q7OGuXzEsy9v3Q0Ug+
/+ozc/mpS8ZdbjxHuo7/dv+OfPexffnlpy3Ln3x7U+7cNrUIBBjLvmbS7G3vNrijOfhekFbGPW1p
V1522sJ87ZH9+d6W8Zcfb9yzjuvKT5w6L/0DyU2bB/KvD+1PI8kLTl6Y84+fl85G8jf39OW+nYc/
Z3U0eybcRg+GSYtHS4b68g23trTc855zXqZ6GwCtOvXY+bnhiidl1eKufPvRvfn7O7bnGScekyvO
W56Xnrk0z7n2B8PiJEn+z61bs7X70LZp5HaqkeRXnr4ib7nugSTJmy88MUM/2/Cw5fubLV2WJD93
/sqsWtyVv7xla/bt7xk27hnL5idJrvrCA/neY90H5zIVjf5Dr1wdyXZ4Xkcjvf2tf5L8s9cuzo2P
7MlPPGnZwXmMdvtXPXtNLj35mGHznew827GOn/3+1lzwvLX5lQtX5K2P/7wB2qavJ/3TcGSj1XGf
f+LC9PY1c/HKzty8ce+Ux927fyB9zfm5a3tvzl8+L/3NrjSSPGVZR+7cui/rls3L3n096e87/KjJ
eEdMDug6OIEWvfHy/vzaLz49P7h0XhpJGo1GBgYG0mg0kkYjjTTSMeTfZ57+pJzw2D/nPW2uRICh
3nPpqVm1uCv/fNf2/PRnbs9ABl+N/+tXPzkvW7cs73numrzuH+4e9j3vv+HB3Pr4jn9y+M7/1u6+
XPHUFXn39fenkeSK81Zka3dfViwafHveyG3n4EZ34suS5MfXHZsk+er924ddv+/qZx3897euPDdJ
svCabx687I0Xr86bLlmdM5cvzPbuvnz2+1vzG9f/MHt7B4+4LOzqyEdffkZ+8pwVeXBnT/7kxkOn
Jh24nUaStzzrxLzhohNyynELsnlvbz5z65a8598ezL6+/mHzeOcX7s/rL1qds5YvzOLfHZzHS85c
lt954Sk5Y9mCLJrXka17+3LdvTty1Rfuz5a9g086Z3zoO8PGGe1+uOTEY/Luy07M//jyg/mty08Z
9/4aqpV1PHC7/+36B/KmS1Znfmcj77ju/ixd0Jn//rzB23r7dfdlw61bkiRfuW978ry1ecVZx+Zt
n/d8BbRZs3daTrlqddyu9GfHvv4cO79jwuXHG/eB7b35zqONPH3Vwty5dV8uWDH4QtpdW/dl3bL5
+dYje/PQztGPereyfZ/SqVxJ0tHoSBpJI42kMZBGGmk0DkXJwWUOTMapXMA0evEZgzv6H7/xoaS/
N40Mnor18RsfysvWLcuLzjj2sO3QO569JluGHDG56l/uGXb9X9z0aH71R07OL5y/IkmyZH5n3n/D
g3n7c05Ocvh2rdHf19JlSXLRmsGjBHdt2T3s+g//+8P5lWeuTZJ86nubsqX70Pf/12edlPe9+PQ8
sqsnn7xpY85ffUzedMnqrFrcmZ//mx8kSd592el5zVNX5rE9vfnyfdvzrueuHTKXwXHe9iMn55oX
nZpt3X259qaN+dEzl+Utzzoxxy/qzOv//o5h8/zty0/JX9+2OTc/emieJy3pyKbdPfnGAzuTJJee
dmz+81NX5piuRtZ/dvT3eIy8H5bM78wnf3Jdbvjhzvzh1+4/FCZj3F9DtbKOB7z+ohNy88bdedm6
FfnYK87Mxt09+eZDO/PyJ63IH7/sjPztbRvT0xzI7Y8Nrsupxy3IyoXJlr2es4D2aUxHmDz+8btj
jXv+qoV59trF6WwkKxY0sr27mRULOvP6py5NcyD5xsN7873HDo+Iicb94r070t9s5uknLMwdWwdf
3Fu3bH6+/eieXP/D3ePPd7pO5eroGDwikoNP/43BfzY60tEYPJIy9PVHp3IB0+n4xYPvZXh0R/ew
7c2jOwc3misXzztsO/Sa808Y9vU7Pzd8p/yz39uYKy44IW+85MQkycbdPfnrWzYeCpOR27XRTkMa
49Sk5Y8fddnd3TPs+nd+7o6DYfL+r96f2zbtObglffMzBudx0yO7sq+3Lzc/sivPPGlpfvopK/PW
f2xka3dv1j91VZLkqs/fmc/csilfeeoJ+Yuffsqw+b7xkjVJkrd/7s5s+N7GPG3Nknz9ly/Ja85f
lXf88x3Zuf/QfN79xXvy4W88OPj9j1/2yW8/lId3dOeZJx2bYxd25ZZHd+fclYvzwjOXjb2tH3E/
fODH1mXZws685H/floG+vlGX+4OXrhs2xFWfvytJWlrHA971L3fluru2ZtO7LsvCro5cfd3d+dwd
W7L1N56XpfM7c/rSeblzy97s3nvotIPj5zeydZfnLKCNmr3TcyrXOONeftLy7Orpy86+/mzb25M9
vf25c8vgtm1RV0cuP2lRbn5k16THbSRJf18G+vsz0Bzcdvb39yfNvgz09Wask36n5VSug4M/fqrW
4Klcj3/9+BGSwX+PDBOvPgHTZ8ve3qxeMj+rF3fkliHbmzWLB7dL27oPP4T8jA9/PbdtOvTqzshT
uXp7evJn//5grn7B4Cc+/c71d6e359D7VA6M1+wfSGdHI10DzTSavenqODRSX+/oh6637e3NCUvm
59iusbePjWbfsOtOOnZBkuRlZx8/fLkkJx3TkW27e7P6mMHD6ndu2pVGszd3PbZryHiDY61dOjjO
7Rt3ptHsze0bdyRJOhuNrFnUyK4hRwtuuHfLYfP78Kuekv9y8UmHzXfp/M6W1+XnnrYm923rzodf
+aRhy33gZevyiW89mM9899G8+VknD7vunf80eDSmlXU84O7HdmVP975hX+/ff+jN7fMz+DM7bsG8
g5dt273XcxbQVo1m77S8+X28ca+/d3uec/KSLFrQkeULO3P3tv0567h52bavmWb/QK6/d/uo3zve
uI0kLz7zuJx//ILc/tienH38wgwMJHc8tifnr1yY/mYzX7x3x6hx0tHKxwUnmdKnvTQaHYcC5PH3
mAyNlYOneR1Y3h9vBKbRF+58LD934Ul53cVr86U7NiYZPKv09c8Y3Ln94p2bD9sONQaa426bGgPN
fOKb9+Udzzs9SfKJb96flY/vFCeHtmsP7tiX05YvykUnHpNbHt6WC9celyTpHxjII9t3D3tz9gHf
eWhHXvrkVTn7+IW54d7R5zByfg89fjuv/+x386mbHjp4+SnLFuWB7d1pJNm4e3/WHrswZx+/IDc/
1JcnrVhw2Hwf3rkvpy5blHNWLszND23Nuccfe3C+G3fuHXabPb2H/0Gs1zxt8MjNG/76u/n0zQ/n
8jOPz9/94jOG3cZE65Ikpy9flNOXLxp22aWnL8+X79mSRn9flvzm54aP8fj/W1nHA/qbfcMuG/n1
gXmdc/zSJMn927qzdXf3lD9sAGBU45wadd6qxXnWyUvT2Th8y9M3MJBvPLgr33/s8Desd07wHpNv
Pbg933pwe5LkV555YvqbzWzavT8f/vdHxp3qeOOeffyiXLBqYW7fvCdPWrEwNz60M40kT19zTO7Y
vCdPP2FR7t6yO3dtPfwUsc4x/sDiUFM+YtLR0fF4hCTNgYk/qcWrT8B0uuZfbsuPnb0qrzpvTa5/
w7Nz08M7cvHJy3LRycuyY19vfvcL3z9sO/Srl56erXsPHQH5tX+8Zdj1jWZvNu3YnZd87KtJksd2
7M6qhUuHXZ8kn/6PB/LOF56d//nj5+XnLzwp560ZXObvb30ke7v3jbqT+0+3PpyXPnlVLj1tWa79
5j2jLHH4GwX/9Ov35L0vPy8ffNV5+dF1K7K3p5kLTjw2q49dmHN/77okyV/d/FDectlZed/Lz83z
Tl+eVz5lzWHz/bNv3JvffulT8oevODfPPfW4vOjswVPaPn3TQ9m9d/hO+WhvVnx0576cvmJx3vDM
U/LcU4/Lj52z+rDb+NirLxz2Pe950bps39ebN/7VfyRJlr7r74ddv+t3fyJJ8qwPXJ/bNu4aNwxa
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
wgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIE
AAAoJ0wAAIBywgQAACgnTAAAgHLCBzRFVQAABkVJREFUBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQA
ACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAo
J0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdM
AACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAA
gHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBy
wgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIE
AAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAA
KCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgn
TAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wA
AIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACA
csIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLC
BAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQA
ACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAo
J0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdM
AACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAA
gHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBy
wgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIE
AAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAA
KCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgn
TAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wA
AIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACA
csIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLC
BAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQA
ACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAo
J0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdM
AACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAA
gHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBy
wgQAACgnTAAAgHLCBAAAKCdMAACAcsIEAAAoJ0wAAIBywgQAACgnTAAAgHLCBAAAKCdMAACAcsIE
AAAo1zX0i5Wve3/VPAAAgCcwR0wAAIByg0dMBprF0wAAAJ7I/j+22NsNuYisfgAAAABJRU5ErkJg
gg==
--90e6ba61387050ffad04b0e920a4
Content-Type: image/png; name="Screenshot-QEMU (fedora14-dm)-2.png"
Content-Disposition: attachment; 
	filename="Screenshot-QEMU (fedora14-dm)-2.png"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gul92hye1

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
hSpy/Zxf4GWxNr4/t4qRkWEPtbMjmo+2yK4fSQnybg3M6ty3dHTGgqwH27ncEUvaDx51z9u6KIwn
0CHY4BxbupakJ3EGxNkVAh+mz7McgDjYcPG7Ax1/lgGL3lbz/voWWRYeXdD+VocBaFD4PhO/+7zU
k6TWLrVy8fpMaN4xKFsi+C2QUVWtq1ZXMyYlOWn592Hb2Gx+15Wk96V1zI5p/ZeyKM7SeUsWz6kf
ocidlVLh1cZVdQI3zy+D5sQ1Ju7SpbatDszc2rmuXzdg8g21MBQOQqpiuxZtfYd5OjbAWRjPNsH5
nf3WIK3p/XhcOXMRWGzlkgxrCayJV5dJ4nPsqc/qKbpnO73JllXwHvDRZY9cutakW/lM7WFDfFzX
uuXzzrQlnbNXEtVv2Q93883Kxewsd8lKLVq658xLB2L0PEXkatsiKGCYIlu+aA1MdoROW2kti+0x
tCVkR7guXX9+Pg7OXGx7Y0uW5uVn/7ky22QBEgA1y7wCS2j1cj0Jj8npigJyAhRu6P2ocb7Bp7Bd
oMBten2T7loUlie/a6xrU7hW6kXE3HgYIxkSfeYfv653ErD4eF4TG0IGpWpsw2JOCq9R9P778PjB
elgII1u5OIfauciosIWLxVYv3psJ44d/bhN2pdvAdxv5z7Y2JcDR6VFmbM2sXFeSwE7SlfgaqYHx
de5Zh9eM1XBwsmrFOjEonhzvtsFeD0+Pbdji8u6H8VrSmdyYku+rGzD5hhryRGYp76p0HexIdOty
sNO1jpnWZPVMfYCXzjGryx2ZuXfpuDUH7/mze+o7whZnieq6v6U5mVn66rmU8N4BpTT3jB3ZC1Re
/vXX5ma/AwuzNq5UBCkzd6/Z+1XXCFusGpmS1Gbk4/iZTIWK4KLq3O5Fhy6+w8EI9SBs39JxATyy
qjwBFGlUdI3CdbcsXr7DyckraU70/ufn4+AS5myHHL8GxkRj7s+uXwQ0j/fjz5efPfiS9sIssgsd
Y6E1OBvizl0uandWRu9Ivy3lZiUJ7XlP7Vx8d3IEY2sXwUQa52NSG5dfS1bCzl4kHYo7ann7lgMK
/jkej/X++qGFYPZJmvvu4X7RmxC4eMvXKtNEv2lHgvwy/niMoY2qjglITEoCCTPhfXoujU06EQrS
Z8zNjM3h90lzuxamK7aBdev/bM0S4d1CmM+IQREz4kL4VAQwh8PYhuXMCa+5CJ6WwVU3kHLtugGT
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
--90e6ba61387050ffad04b0e920a4
Content-Type: image/png; name="Screenshot-QEMU (fedora14-dm)-3.png"
Content-Disposition: attachment; 
	filename="Screenshot-QEMU (fedora14-dm)-3.png"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gul92jml2

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
AgAApBMmAABAOmECAACkEyYAAEA6YQIAAKQTJgAAQDphAgAApBMmAABAOmECAACkEyYAAEA6YQIA
AKQTJgAAQDphAgAApBMmAABAOmECAACkEyYAAEA6YQIAAKQTJgAAQDphAgAApBMmAABAOmECAACk
EyYAAEA6YQIAAKQTJgAAQDphAgAApBMmAABAOmECAACkEyYAAEA6YQIAAKQTJgAAQDphAgAApBMm
AABAOmECAACkEyYAAEA6YQIAAKQTJgAAQDphAgAApBMmAABAOmECAACkEyYAAEA6YQIAAKQTJgAA
QDphAgAApBMmAABAOmECAACkEyYAAEA6YQIAAKQTJgAAQDphAgAApBMmAABAOmECAACkEyYAAEA6
YQIAAKQTJgAAQDphAgAApBMmAABAOmECAACkEyYAAEA6YQIAAKQTJgAAQDphAgAApBMmAABAOmEC
AACkEyYAAEA6YQIAAKQTJgAAQDphAgAApBMmAABAOmECAACkEyYAAEA6YQIAAKQTJgAAQDphAgAA
pBMmAABAOmECAACkEyYAAEA6YQIAAKQTJgAAQDphAgAApBMmAABAOmECAACkEyYAAEA6YQIAAKQT
JgAAQDphAgAApBMmAABAOmECAACkEyYAAEA6YQIAAKQTJgAAQDphAgAApBMmAABAOmECAACkEyYA
AEA6YQIAAKQTJgAAQDphAgAApBMmAABAOmECAACkEyYAAEA6YQIAAKQTJgAAQDphAgAApBMmAABA
OmECAACkEyYAAEA6YQIAAKQTJgAAQDphAgAApBMmAABAOmECAACkEyYAAEA6YQIAAKSryx7ASKxc
uXLI+1asWHHA8xztPKrRZF7vnnUbbr3KnW40y+v/s5r9HI/k9S532ko8f5V6DQCA6ldVe0x6b7ys
WLGiIhszB+sG0WRd71LxOprpyp1P/+ez/89qtpGMYTzH27OsSr0eAED1qqowGcxE2OhjYpgoUXKw
qPSHA+IEAA5uVXUoV38rV64cdONosA2cwTaghtsQGm4+vTdMSx3+UonDeka7rANdXqn5lLNeo5nP
UPMaTjkbuEM9j1mGew77x89QMdT/Z2K4aDrQqCrnZ3C4n1UAgN6qdo/JUBuVvTeKekdL/+lHsuE2
1HyG2lgcbGOz1FjKUc6yyl334ZQ7n5E8x0NNV6kxl2Mi7uGoxHr3fw7L+dk+0Oe51HPYe95j/ZoC
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
nTABAADSCRMAACCdMAEAANIJEwAAIJ0wAQAA0gkTAAAgnTABAADSCRMAACCdMAEAANIJEwAAIJ0w
AQAA0gkTAAAgnTABAADSCRMAACCdMAEAANIJEwAAIJ0wAQAA0gkTAAAgnTABAADSCRMAACCdMAEA
ANIJEwAAIJ0wAQAA0gkTAAAgnTABAADSCRMAACCdMAEAANIJEwAAIJ0wAQAA0gkTAAAgnTABAADS
CRMAACCdMAEAANIJEwAAIJ0wAQAA0gkTAAAgnTABAADSCRMAACCdMAEAANIJEwAAIJ0wAQAA0gkT
AAAgnTABAADSCRMAACCdMAEAANIJEwAAIJ0wAQAA0gkTAAAgnTABAADSCRMAACCdMAEAANIJEwAA
IJ0wAQAA0gkTAAAgnTABAADSCRMAACCdMAEAANIJEwAAIJ0wAQAA0gkTAAAgnTABAADSCRMAACCd
MAEAANIJEwAAIJ0wAQAA0gkTAAAgnTABAADSCRMAACCdMAEAANIJEwAAIJ0wAQAA0gkTAAAgnTAB
AADSCRMAACCdMAEAANIJEwAAIJ0wAQAA0gkTAAAgnTABAADSCRMAACCdMAEAANIJEwAAIJ0wAQAA
0gkTAAAgnTABAADSCRMAACCdMAEAANIJEwAAIJ0wAQAA0gkTAAAgnTABAADSCRMAACCdMAEAANIJ
EwAAIJ0wAQAA0gkTAAAgnTABAADSCRMAACCdMAEAANIJEwAAIJ0wAQAA0gkTAAAgnTABAADSCRMA
ACCdMAEAANIJEwAAIJ0wAQAA0gkTAAAgnTABAADSCRMAACCdMAEAANIJEwAAIJ0wAQAA0gkTAAAg
nTABAADSCRMAACCdMAEAANIJEwAAIJ0wAQAA0gkTAAAgnTABAADSCRMAACCdMAEAANIJEwAAIJ0w
AQAA0gkTAAAgnTABAADSCRMAACCdMAEAANLV9f6m6cqbssYBAAAcxOwxAQAA0nXvMekqJg8DAAA4
mP1//xB35dQOUmcAAAAASUVORK5CYII=
--90e6ba61387050ffad04b0e920a4
Content-Type: image/png; name="Screenshot-root@localhost_~-char-hvm.png"
Content-Disposition: attachment; 
	filename="Screenshot-root@localhost_~-char-hvm.png"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gul92lk13

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
gg==
--90e6ba61387050ffad04b0e920a4
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--90e6ba61387050ffad04b0e920a4--


From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:33:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:33:17 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ61d-0001P3-6m; Mon, 14 Nov 2011 15:33:17 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMOQu-0003cM-Cv
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 11:24:04 -0700
X-Env-Sender: dan.carpenter@oracle.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1320431039!1978222!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8486 invoked from network); 4 Nov 2011 18:24:01 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-14.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 4 Nov 2011 18:24:01 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA4INnEr020398
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 4 Nov 2011 18:23:53 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA4INk2D017911
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 4 Nov 2011 18:23:49 GMT
Received: from abhmt108.oracle.com (abhmt108.oracle.com [141.146.116.60])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA4INfOU017359; Fri, 4 Nov 2011 13:23:41 -0500
Received: from elgon.mountain (/41.139.221.94)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 04 Nov 2011 11:23:40 -0700
Date: Fri, 4 Nov 2011 21:23:32 +0300
From: Dan Carpenter <dan.carpenter@oracle.com>
To: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Message-ID: <20111104182332.GC5796@elgon.mountain>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090201.4EB42DBA.0015,ss=1,re=0.000,fgs=0
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:29 -0800
Cc: kernel-janitors@vger.kernel.org, xen-devel@lists.xensource.com,
	virtualization@lists.linux-foundation.org,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [patch] xen-gntdev: integer overflow in
	gntdev_alloc_map()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

The multiplications here can overflow resulting in smaller buffer
sizes than expected.  "count" comes from a copy_from_user().

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>

diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
index 880798a..2f3c363 100644
--- a/drivers/xen/gntdev.c
+++ b/drivers/xen/gntdev.c
@@ -114,11 +114,11 @@ static struct grant_map *gntdev_alloc_map(struct gntdev_priv *priv, int count)
 	if (NULL == add)
 		return NULL;
 
-	add->grants    = kzalloc(sizeof(add->grants[0])    * count, GFP_KERNEL);
-	add->map_ops   = kzalloc(sizeof(add->map_ops[0])   * count, GFP_KERNEL);
-	add->unmap_ops = kzalloc(sizeof(add->unmap_ops[0]) * count, GFP_KERNEL);
-	add->kmap_ops  = kzalloc(sizeof(add->kmap_ops[0])  * count, GFP_KERNEL);
-	add->pages     = kzalloc(sizeof(add->pages[0])     * count, GFP_KERNEL);
+	add->grants    = kcalloc(count, sizeof(add->grants[0]), GFP_KERNEL);
+	add->map_ops   = kcalloc(count, sizeof(add->map_ops[0]), GFP_KERNEL);
+	add->unmap_ops = kcalloc(count, sizeof(add->unmap_ops[0]), GFP_KERNEL);
+	add->kmap_ops  = kcalloc(count, sizeof(add->kmap_ops[0]), GFP_KERNEL);
+	add->pages     = kcalloc(count, sizeof(add->pages[0]), GFP_KERNEL);
 	if (NULL == add->grants    ||
 	    NULL == add->map_ops   ||
 	    NULL == add->unmap_ops ||

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:34:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:34:04 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ62O-0001mO-Nr; Mon, 14 Nov 2011 15:34:04 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMORK-0003dG-Gx
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 11:24:30 -0700
X-Env-Sender: dan.carpenter@oracle.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1320431065!2998642!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31675 invoked from network); 4 Nov 2011 18:24:27 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Nov 2011 18:24:27 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA4IOMgo015389
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 4 Nov 2011 18:24:23 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA4IOLZW029158
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 4 Nov 2011 18:24:22 GMT
Received: from abhmt101.oracle.com (abhmt101.oracle.com [141.146.116.53])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA4IOGlJ017704; Fri, 4 Nov 2011 13:24:16 -0500
Received: from elgon.mountain (/41.139.221.94)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 04 Nov 2011 11:24:16 -0700
Date: Fri, 4 Nov 2011 21:24:08 +0300
From: Dan Carpenter <dan.carpenter@oracle.com>
To: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Message-ID: <20111104182408.GD5796@elgon.mountain>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090203.4EB42DD7.0150,ss=1,re=0.000,fgs=0
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:29 -0800
Cc: kernel-janitors@vger.kernel.org, xen-devel@lists.xensource.com,
	virtualization@lists.linux-foundation.org,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [patch 1/2] xen-gntalloc: integer overflow in
	gntalloc_ioctl_alloc()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 32 bit systems a high value of op.count could lead to an integer
overflow in the kzalloc() and gref_ids would be smaller than
expected.  If the you triggered another integer overflow in
"if (gref_size + op.count > limit)" then you'd probably get memory
corruption inside add_grefs().

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>

diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
index f6832f4..23c60cf 100644
--- a/drivers/xen/gntalloc.c
+++ b/drivers/xen/gntalloc.c
@@ -280,7 +280,7 @@ static long gntalloc_ioctl_alloc(struct gntalloc_file_private_data *priv,
 		goto out;
 	}
 
-	gref_ids = kzalloc(sizeof(gref_ids[0]) * op.count, GFP_TEMPORARY);
+	gref_ids = kcalloc(op.count, sizeof(gref_ids[0]), GFP_TEMPORARY);
 	if (!gref_ids) {
 		rc = -ENOMEM;
 		goto out;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:34:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:34:47 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ635-000291-CG; Mon, 14 Nov 2011 15:34:47 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMORm-0003dj-9z
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 11:24:58 -0700
X-Env-Sender: dan.carpenter@oracle.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1320431093!1982045!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25035 invoked from network); 4 Nov 2011 18:24:55 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-8.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Nov 2011 18:24:55 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pA4IOpK1015837
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 4 Nov 2011 18:24:51 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pA4IOoMZ029890
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 4 Nov 2011 18:24:50 GMT
Received: from abhmt102.oracle.com (abhmt102.oracle.com [141.146.116.54])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pA4IOifj018468; Fri, 4 Nov 2011 13:24:44 -0500
Received: from elgon.mountain (/41.139.221.94)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 04 Nov 2011 11:24:44 -0700
Date: Fri, 4 Nov 2011 21:24:36 +0300
From: Dan Carpenter <dan.carpenter@oracle.com>
To: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Message-ID: <20111104182436.GE5796@elgon.mountain>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090203.4EB42DF4.0013,ss=1,re=0.000,fgs=0
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:29 -0800
Cc: kernel-janitors@vger.kernel.org, xen-devel@lists.xensource.com,
	virtualization@lists.linux-foundation.org,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [patch 2/2] xen-gntalloc: signedness bug in add_grefs()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

gref->gref_id is unsigned so the error handling didn't work.
gnttab_grant_foreign_access() returns an int type, so we can add a
cast here, and it doesn't cause any problems.
gnttab_grant_foreign_access() can return a variety of errors
including -ENOSPC, -ENOSYS and -ENOMEM.

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>

diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
index 23c60cf..e1c4c6e 100644
--- a/drivers/xen/gntalloc.c
+++ b/drivers/xen/gntalloc.c
@@ -135,7 +135,7 @@ static int add_grefs(struct ioctl_gntalloc_alloc_gref *op,
 		/* Grant foreign access to the page. */
 		gref->gref_id = gnttab_grant_foreign_access(op->domid,
 			pfn_to_mfn(page_to_pfn(gref->page)), readonly);
-		if (gref->gref_id < 0) {
+		if ((int)gref->gref_id < 0) {
 			rc = gref->gref_id;
 			goto undo;
 		}

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:35:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:35:37 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ63s-0002WM-Uc; Mon, 14 Nov 2011 15:35:36 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMOTs-0003gX-1k
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 11:27:10 -0700
X-Env-Sender: j.glisse@gmail.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1320431223!1985233!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3511 invoked from network); 4 Nov 2011 18:27:04 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-10.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 18:27:04 -0000
Received: by vcbfk14 with SMTP id fk14so2154909vcb.30
	for <xen-devel@lists.xensource.com>;
	Fri, 04 Nov 2011 11:27:03 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=date:from:to:cc:subject:message-id:references:mime-version
	:content-type:content-disposition:in-reply-to:user-agent;
	bh=pj4iUdwR4PLQt42sc+g2h2AQ/m+kemUsEuzMf/krUcc=;
	b=cNdFZ81I8NQf6Vv0eS0zyFyTNK8ry1SsSzYXRTdM5kR5tGoouSHzBs5uv3/BpCCTub
	xSoE7Lsefds9zuJRxESgD/WNC8AVSSXiN2+EWl9WE8dbxrbxbLbw0wiLlk2qBnnGQj2I
	L33u7dfBtTML+0MK3DmJVCqvZLsCA24KoyGQE=
Received: by 10.220.210.195 with SMTP id gl3mr1236850vcb.5.1320431223624;
	Fri, 04 Nov 2011 11:27:03 -0700 (PDT)
Received: from homer.localdomain (nat-pool-rdu.redhat.com. [66.187.233.202])
	by mx.google.com with ESMTPS id ha1sm14774593vdb.17.2011.11.04.11.27.01
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 04 Nov 2011 11:27:02 -0700 (PDT)
Date: Fri, 4 Nov 2011 14:31:10 -0400
From: Jerome Glisse <j.glisse@gmail.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Message-ID: <20111104183110.GC2015@homer.localdomain>
References: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:25 -0800
Cc: thellstrom@vmware.com, xen-devel@lists.xensource.com, thomas@shipmail.org,
	linux-kernel@vger.kernel.org, jglisse@redhat.com,
	bskeggs@redhat.com, airlied@redhat.com
Subject: [Xen-devel] Re: [PATCH] TTM DMA pool v2.2 or [GIT PULL]
 (stable/ttm.dma_pool.v2.3) for 3.3
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 01, 2011 at 02:47:21PM -0400, Konrad Rzeszutek Wilk wrote:
> I am not sure what the right way to patches in Dave tree is for Linux 3.3, so I
> am posting the patches and also providing the means of doing a git pull.
> 
> The git tree is:
> 
> git pull git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git stable/ttm.dma_pool.v2.3
> 
> 
> Oh, and Thomas, should I add your Ack on the patches as well? I think it was an implied
> Ack, but I do not want to presume. If so, I can respin this with your Ack shortly.
> 
> and it has since v2.1: https://lwn.net/Articles/463815/
>  - Fixed bugs/mistakes pointed out by Jerome
>  - Added Review-by: Jereme Glisse
> Since v2.0: [not posted]
>  - Redid the registration/override to be tightly integrated with the
>    'struct ttm_backend_func' per Thomas's suggestion.
> Since v1.9: [not posted]
>  - Performance improvements - it was doing O(n^2) instead of O(n) on certain
>    workloads.
> Since v1.8: [lwn.net/Articles/458724/]
>  - Removed swiotlb_enabled and used swiotlb_nr_tbl.
>  - Added callback for changing cache types.
> Since v1.7: [https://lkml.org/lkml/2011/8/30/460]
>  - Fixed checking the DMA address in radeon/nouveau code.
> Since v1: [http://lwn.net/Articles/456246/]
>  - Ran it through the gauntlet of SubmitChecklist and fixed issues
>  - Made radeon/nouveau driver set coherent_dma (which is required for dmapool)
> 
> [.. and this is what I said in v1 post]:
> 
> Way back in January this patchset:
> http://lists.freedesktop.org/archives/dri-devel/2011-January/006905.html
> was merged in, but pieces of it had to be reverted b/c they did not
> work properly under PowerPC, ARM, and when swapping out pages to disk.
> 
> After a bit of discussion on the mailing list
> http://marc.info/?i=4D769726.2030307@shipmail.org I started working on it, but
> got waylaid by other things .. and finally I am able to post the RFC patches.
> 
> There was a lot of discussion about it and I am not sure if I captured
> everybody's thoughts - if I did not - that is _not_ intentional - it has just
> been quite some time..
> 
> Anyhow .. the patches explore what the "lib/dmapool.c" does - which is to have a
> DMA pool that the device has associated with. I kind of married that code
> along with drivers/gpu/drm/ttm/ttm_page_alloc.c to create a TTM DMA pool code.
> The end result is DMA pool with extra features: can do write-combine, uncached,
> writeback (and tracks them and sets back to WB when freed); tracks "cached"
> pages that don't really need to be returned to a pool; and hooks up to
> the shrinker code so that the pools can be shrunk.
> 
> If you guys think this set of patches make sense  - my future plans were
>  1) Get this in large crowd of testing .. and if it works for a kernel release
>  2) to move a bulk of this in the lib/dmapool.c (I spoke with Matthew Wilcox
>     about it and he is OK as long as I don't introduce performance regressions).
> 
> In regards to testing, I've been running them non-stop for the last two months.
> (and found some issues which I've fixed up) - and been quite happy with how
> they work.
> 
> Michel (thanks!) took a spin of the patches on his PowerPC and they did not
> cause any regressions (wheew).
> 
> The patches are also located in a git tree:
> 
> git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git stable/ttm.dma_pool.v2.3
> 

On what hw did you tested ? With and without xen ? Here radeon
that doesn't need dma32 doesn't work when forcing swiotlb which
kind of expected i guess. Should we expose if swiotlb is enabled
forced so we use dma pool in such case ?

Cheers,
Jerome

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:36:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:36:26 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ64g-0002uB-CG; Mon, 14 Nov 2011 15:36:26 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RMPJx-0005Zs-Cq
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 12:20:57 -0700
X-Env-Sender: j.glisse@gmail.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1320434443!1985338!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32628 invoked from network); 4 Nov 2011 19:20:53 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-9.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Nov 2011 19:20:53 -0000
Received: by vcbfk14 with SMTP id fk14so2216235vcb.30
	for <xen-devel@lists.xensource.com>;
	Fri, 04 Nov 2011 12:20:43 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=date:from:to:cc:subject:message-id:references:mime-version
	:content-type:content-disposition:in-reply-to:user-agent;
	bh=wvKCS8L1qAuT2dimtxPKsbYD6HXnB8eTUgZETX09Pzg=;
	b=Xn9LyFNHSaUkUwLP/u1rprpSlHd8tJSsQ+uOB0PqdlXFy9oC5qHRad4K/N2jXEDjTi
	zOJPVEiSPMfUMGck57ECULFb1qkF58OH+J3HT7caxMF/DhlA5utLCFABixXJFN914K1R
	5eJz6FAVGW2iu0Ie5vu0m6HeaaVJ20F3XVnA8=
Received: by 10.52.28.141 with SMTP id b13mr16153596vdh.128.1320434443544;
	Fri, 04 Nov 2011 12:20:43 -0700 (PDT)
Received: from homer.localdomain (nat-pool-rdu.redhat.com. [66.187.233.202])
	by mx.google.com with ESMTPS id c20sm15042221vdt.6.2011.11.04.12.20.41
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 04 Nov 2011 12:20:42 -0700 (PDT)
Date: Fri, 4 Nov 2011 15:24:51 -0400
From: Jerome Glisse <j.glisse@gmail.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Message-ID: <20111104192451.GE2015@homer.localdomain>
References: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
	<20111104183110.GC2015@homer.localdomain>
	<20111104184453.GB1616@phenom.dumpdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111104184453.GB1616@phenom.dumpdata.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:25 -0800
Cc: thellstrom@vmware.com, xen-devel@lists.xensource.com, thomas@shipmail.org,
	linux-kernel@vger.kernel.org, jglisse@redhat.com,
	bskeggs@redhat.com, airlied@redhat.com
Subject: [Xen-devel] Re: [PATCH] TTM DMA pool v2.2 or [GIT PULL]
 (stable/ttm.dma_pool.v2.3) for 3.3
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, Nov 04, 2011 at 02:44:53PM -0400, Konrad Rzeszutek Wilk wrote:
> > > git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git stable/ttm.dma_pool.v2.3
> > > 
> > 
> > On what hw did you tested ? With and without xen ? Here radeon
> 
> On AMD and Intel. And with both Nvidia and Radeon cards.
> 64-bit cards (I have a patch where I forced the 64-bit card to use
> the TTM DMA pool code to test) and 32-bit cards (ATI ES1000)
> 
> On baremetal and Xen. Um, Fedora Core 16 as distro.
> 
> Oh, and I also tried PPC (Power Mac 4) but could not get it to boot
> the 3.1 kernel. Something with the LILO grub loader did not work.
> 
> > that doesn't need dma32 doesn't work when forcing swiotlb which
> > kind of expected i guess. Should we expose if swiotlb is enabled
> 
> You did 'swiotlb=force' ?
> > forced so we use dma pool in such case ?

Issue is that when booted without force swiotlb_nr_tlb still return
positive thus we endup using the dma pool path.

Cheers,
Jerome

> Hm, it shoudl have enabled itself. The swiotlb_nr_tlb would return some
> contents and we would.. Oh, you mean you did a 64-bit card _and_
> did swiotlb=force. And since the rdev->dma32 was set to zero it
> did _not_ use the TTM DMA pool.
> 
> Right. I did not do it initially just so that I could limit the scope
> in case I messed up something in the code. But the code has the
> 'no_dma' parameter, so it can easily turn off the DMA TTM code.
> 
> So, to answer your question - sure, we can ignore the rdev_dma32 and
> just use the the swiotlb_nr_tlb to check.
> 
> BTW, thank you for taking a spin with these patches and rebasing them
> on top of yours. I am going to start testing them and reviewing the
> latest batch you sent on Monday.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:37:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:37:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ65Z-0003Hj-QG; Mon, 14 Nov 2011 15:37:21 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RMQiM-0000rr-2g
	for xen-devel@lists.xensource.com; Fri, 04 Nov 2011 13:50:14 -0700
X-Env-Sender: jglisse@redhat.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1320439809!2970264!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15022 invoked from network); 4 Nov 2011 20:50:10 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-11.tower-21.messagelabs.com with SMTP;
	4 Nov 2011 20:50:10 -0000
Received: from int-mx10.intmail.prod.int.phx2.redhat.com
	(int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id pA4Ko8p8018549
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 4 Nov 2011 16:50:08 -0400
Received: from homer.localdomain (dhcp-10-16-62-41.boston.devel.redhat.com
	[10.16.62.41])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id pA4Ko5Y4023815
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO);
	Fri, 4 Nov 2011 16:50:07 -0400
Date: Fri, 4 Nov 2011 16:54:17 -0400
From: Jerome Glisse <jglisse@redhat.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Message-ID: <20111104205417.GF2015@homer.localdomain>
References: <1320173252-2812-1-git-send-email-konrad.wilk@oracle.com>
	<20111104183110.GC2015@homer.localdomain>
	<20111104184453.GB1616@phenom.dumpdata.com>
	<20111104192451.GE2015@homer.localdomain>
	<20111104194102.GA15923@phenom.dumpdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111104194102.GA15923@phenom.dumpdata.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:43 -0800
Cc: thellstrom@vmware.com, xen-devel@lists.xensource.com, thomas@shipmail.org,
	linux-kernel@vger.kernel.org, bskeggs@redhat.com,
	Jerome Glisse <j.glisse@gmail.com>, airlied@redhat.com
Subject: [Xen-devel] Re: [PATCH] TTM DMA pool v2.2 or [GIT PULL]
 (stable/ttm.dma_pool.v2.3) for 3.3
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, Nov 04, 2011 at 03:41:03PM -0400, Konrad Rzeszutek Wilk wrote:
> On Fri, Nov 04, 2011 at 03:24:51PM -0400, Jerome Glisse wrote:
> > On Fri, Nov 04, 2011 at 02:44:53PM -0400, Konrad Rzeszutek Wilk wrote:
> > > > > git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git stable/ttm.dma_pool.v2.3
> > > > > 
> > > > 
> > > > On what hw did you tested ? With and without xen ? Here radeon
> > > 
> > > On AMD and Intel. And with both Nvidia and Radeon cards.
> > > 64-bit cards (I have a patch where I forced the 64-bit card to use
> > > the TTM DMA pool code to test) and 32-bit cards (ATI ES1000)
> > > 
> > > On baremetal and Xen. Um, Fedora Core 16 as distro.
> > > 
> > > Oh, and I also tried PPC (Power Mac 4) but could not get it to boot
> > > the 3.1 kernel. Something with the LILO grub loader did not work.
> > > 
> > > > that doesn't need dma32 doesn't work when forcing swiotlb which
> > > > kind of expected i guess. Should we expose if swiotlb is enabled
> > > 
> > > You did 'swiotlb=force' ?
> > > > forced so we use dma pool in such case ?
> > 
> > Issue is that when booted without force swiotlb_nr_tlb still return
> > positive thus we endup using the dma pool path.
> 
> Did " Using software bounce buffering for IO (SWIOTLB)" or "software IO TLB at"
> show up in the dmesg output? You might have to run it with 'debug loglevel=8'?
> Presumarily yes, since the code "swiotlb: Expose.." sets
>   io_tlb_nslabs = 0
> 
> if there is no need for it. And since io_tlb_nslabs is set, then the code
> did start.
> 
> Some AMD boxes with the AMD-Vi chipset enable the SWIOTLB b/c not all of
> the PCI devices are on the IOMMU chipset path. The Intel VT-d does the same
> thing.
> 
> Hmm, I think the reason for those devices to turn SWIOTLB on is that they
> are not comfortable handling 32-bit devices, and the TTM DMA pool code would
> only turn itself on when the radeon|nouveau was 32-bit _and_ SWIOTLB was enabled.
> 
> .. Testing the patches you posted on my AMD box.

Yes, swiotlb was enabled (bounce buffer message) thing is when force is
not set usual ttm memory page allocation works properly ie on pci map
no bounce buffer is use, but when force is set it does use a bounce
This is due to :
if (dma_capable(dev, dev_addr, size) && !swiotlb_force)
in swiotlb_map_page, i am not sure how much the force argument is
usefull.

Anyway i did few benchmark and it seems that the dma allocator isn't
slower than the other page allocator. But this is limited testing
(openarena, nexuiz running on composited desktop with firefox).

Cheers,
Jerome

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:38:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:38:15 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ66R-0003fa-R1; Mon, 14 Nov 2011 15:38:15 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNL43-0000R2-Et
	for xen-devel@lists.xensource.com; Mon, 07 Nov 2011 01:00:43 -0800
X-Env-Sender: lczerner@redhat.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1320656419!2511279!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5985 invoked from network); 7 Nov 2011 09:00:19 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-4.tower-216.messagelabs.com with SMTP;
	7 Nov 2011 09:00:19 -0000
Received: from int-mx10.intmail.prod.int.phx2.redhat.com
	(int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id pA790HcH012151
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 7 Nov 2011 04:00:18 -0500
Received: from vpn1-4-216.ams2.redhat.com (vpn1-4-216.ams2.redhat.com
	[10.36.4.216])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id pA790DE9003046
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 7 Nov 2011 04:00:16 -0500
Date: Mon, 7 Nov 2011 10:00:13 +0100 (CET)
From: Lukas Czerner <lczerner@redhat.com>
X-X-Sender: lukas@dhcp-27-109.brq.redhat.com
To: Li Dongyang <lidongyang@novell.com>
In-Reply-To: <1320654866-12457-1-git-send-email-lidongyang@novell.com>
Message-ID: <alpine.LFD.2.00.1111070958410.5434@dhcp-27-109.brq.redhat.com>
References: <1320654866-12457-1-git-send-email-lidongyang@novell.com>
User-Agent: Alpine 2.00 (LFD 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:28 -0800
Cc: lczerner@redhat.com, xen-devel@lists.xensource.com, konrad.wilk@oracle.com
Subject: [Xen-devel] Re: [PATCH] xen-blkback: convert hole punching to
 discard request on loop devices
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, 7 Nov 2011, Li Dongyang wrote:

> As of dfaa2ef68e80c378e610e3c8c536f1c239e8d3ef, loop devices support
> discard request now. We could just issue a discard request, and
> the loop driver will punch the hole for us, so we don't need to touch
> the internals of loop device and punch the hole ourselves, Thanks.

Nice, the patch looks good to me.

Thanks!
-Lukas

> 
> Signed-off-by: Li Dongyang <lidongyang@novell.com>
> ---
>  drivers/block/xen-blkback/blkback.c |   21 +++------------------
>  1 files changed, 3 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
> index 15ec4db..ad365a7 100644
> --- a/drivers/block/xen-blkback/blkback.c
> +++ b/drivers/block/xen-blkback/blkback.c
> @@ -39,9 +39,6 @@
>  #include <linux/list.h>
>  #include <linux/delay.h>
>  #include <linux/freezer.h>
> -#include <linux/loop.h>
> -#include <linux/falloc.h>
> -#include <linux/fs.h>
>  
>  #include <xen/events.h>
>  #include <xen/page.h>
> @@ -422,25 +419,13 @@ static void xen_blk_discard(struct xen_blkif *blkif, struct blkif_request *req)
>  	int status = BLKIF_RSP_OKAY;
>  	struct block_device *bdev = blkif->vbd.bdev;
>  
> -	if (blkif->blk_backend_type == BLKIF_BACKEND_PHY)
> -		/* just forward the discard request */
> +	if (blkif->blk_backend_type == BLKIF_BACKEND_PHY ||
> +	    blkif->blk_backend_type == BLKIF_BACKEND_FILE)
>  		err = blkdev_issue_discard(bdev,
>  				req->u.discard.sector_number,
>  				req->u.discard.nr_sectors,
>  				GFP_KERNEL, 0);
> -	else if (blkif->blk_backend_type == BLKIF_BACKEND_FILE) {
> -		/* punch a hole in the backing file */
> -		struct loop_device *lo = bdev->bd_disk->private_data;
> -		struct file *file = lo->lo_backing_file;
> -
> -		if (file->f_op->fallocate)
> -			err = file->f_op->fallocate(file,
> -				FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE,
> -				req->u.discard.sector_number << 9,
> -				req->u.discard.nr_sectors << 9);
> -		else
> -			err = -EOPNOTSUPP;
> -	} else
> +	else
>  		err = -EOPNOTSUPP;
>  
>  	if (err == -EOPNOTSUPP) {
> 

-- 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:39:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:39:12 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ67M-00043b-0e; Mon, 14 Nov 2011 15:39:12 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNjQR-0003Cn-Mc
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 03:01:44 -0800
X-Env-Sender: amit.shah@redhat.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1320750063!710525!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14001 invoked from network); 8 Nov 2011 11:01:03 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-4.tower-174.messagelabs.com with SMTP;
	8 Nov 2011 11:01:03 -0000
Received: from int-mx10.intmail.prod.int.phx2.redhat.com
	(int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id pA8B0WIQ005823
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 8 Nov 2011 06:00:32 -0500
Received: from localhost (ovpn-113-42.phx2.redhat.com [10.3.113.42])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id pA8B0Ssl012539; Tue, 8 Nov 2011 06:00:30 -0500
Date: Tue, 8 Nov 2011 16:30:27 +0530
From: Amit Shah <amit.shah@redhat.com>
To: Miche Baker-Harvey <miche@google.com>
Message-ID: <20111108110027.GF2068@amit-x200.redhat.com>
References: <20111102221905.9722.62090.stgit@miche.sea.corp.google.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111102221905.9722.62090.stgit@miche.sea.corp.google.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:35 -0800
Cc: Stephen Rothwell <sfr@canb.auug.org.au>,
	Greg Kroah-Hartman <gregkh@suse.de>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Rusty Russell <rusty@rustcorp.com.au>,
	linux-kernel@vger.kernel.org, Mike Waychison <mikew@google.com>,
	xen-devel@lists.xensource.com, Anton Blanchard <anton@samba.org>,
	virtualization@lists.linux-foundation.org,
	ppc-dev <linuxppc-dev@lists.ozlabs.org>
Subject: [Xen-devel] Re: [PATCH RFC 0/3] Support multiple VirtioConsoles.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On (Wed) 02 Nov 2011 [15:19:06], Miche Baker-Harvey wrote:
> This patchset applies to linux-next/next-20111102.

Did you forget to send out the patches?  I don't see anything on any
of the lists nor my inbox.

		Amit

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:40:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:40:04 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ68C-0004Rk-6m; Mon, 14 Nov 2011 15:40:04 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RNlEJ-00028C-HB
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 04:56:43 -0800
X-Env-Sender: 327801865@qq.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1320756976!51397223!1
X-Originating-IP: [64.71.138.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13612 invoked from network); 8 Nov 2011 12:56:16 -0000
Received: from smtpbg52.qq.com (HELO smtpbg52.qq.com) (64.71.138.43)
	by server-8.tower-27.messagelabs.com with SMTP;
	8 Nov 2011 12:56:16 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s0907;
	t=1320756998; bh=A0RpCG46YBDRMLu1UYd2E/b6skSkgLLzp0ceSui3k70=;
	h=X-QQ-mid:Received:X-QQ-SSF:Date:From:To:Subject:Message-ID:
	X-mailer:Mime-Version:Content-Type:X-Antivirus:X-Antivirus-Status;
	b=Nwt5ru/QXY7F5+euP/Hfjy18lVcacejhjgmd87YB4uloD1toad2abIxfrSqaGNnmZ
	HIPnuwFx13IBD96KCSilXnacfW+S1/oimlrKmoWCWt5Ik03DUHbl2qa1/V0RJvf
X-QQ-mid: esmtp1t1320756996t374t29753
Received: from MaYao-Optiplex990 (unknown [124.205.18.226])
	by esmtp4.qq.com (ESMTP) with 
	id ; Tue, 08 Nov 2011 20:56:35 +0800 (CST)
X-QQ-SSF: 00000000000000F0FG600F000000000
Date: Tue, 8 Nov 2011 20:56:35 +0800
From: "327801865" <327801865@qq.com>
To: "community.manager" <community.manager@xen.orgl>,
	"xen-devel" <xen-devel@lists.xensource.com>
Message-ID: <201111082056301848024@qq.com>
X-mailer: Foxmail 6, 15, 201, 22 [cn]
Mime-Version: 1.0
X-Antivirus: avast! (VPS 111108-0, 2011/11/08), Outbound message
X-Antivirus-Status: Clean
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:34 -0800
Cc: 
Subject: [Xen-devel] PV-on-HVM hypercall problem
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1355252956=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


This is a multi-part message in MIME format.

--===============1355252956==
Content-Type: multipart/alternative;
	boundary="=====003_Dragon137716728726_====="


This is a multi-part message in MIME format.

--=====003_Dragon137716728726_=====
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: 7bit

Hi everyone:
    I'm doing some development based on PV-on-HVM source.Have modified the code in unmodified_drivers, When I map one HVM domU memory page to another domU by HYPERVISOR_grant_table_op, it returns an error code "-38"(function no implement), in another way, one HVM domU can't map another's menory page.
    I wonder wheather you can give me a hand about this problem. Or some valuable advice.
Thanks in advance.

2011-11-08 



327801865 

--=====003_Dragon137716728726_=====
Content-Type: text/html;
	charset="us-ascii"
Content-Transfer-Encoding: 7bit

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content="text/html; charset=us-ascii" http-equiv=Content-Type>
<META name=GENERATOR content="MSHTML 9.00.8112.16437"><LINK rel=stylesheet 
href="BLOCKQUOTE{margin-Top: 0px; margin-Bottom: 0px; margin-Left: 2em}"></HEAD>
<BODY style="MARGIN: 10px; FONT-FAMILY: verdana; FONT-SIZE: 10pt">
<DIV><FONT size=2 face=Verdana>Hi everyone:</FONT></DIV>
<DIV>&nbsp;&nbsp;&nbsp; I'm doing some development based on PV-on-HVM 
source.Have modified the code in&nbsp;unmodified_drivers, When I map one HVM 
domU memory page to another domU by HYPERVISOR_grant_table_op, it returns an 
error code "-38"(function no implement), in another way, one HVM domU can't map 
another's menory page.</DIV>
<DIV>&nbsp;&nbsp;&nbsp; I wonder wheather you can give me a hand about this 
problem. Or some valuable advice.</DIV>
<DIV>Thanks in advance.</DIV>
<DIV><FONT size=2 face=Verdana></FONT>&nbsp;</DIV>
<DIV align=left><FONT color=#c0c0c0 size=2 face=Verdana>2011-11-08 
</FONT></DIV><FONT size=2 face=Verdana>
<HR style="WIDTH: 122px; HEIGHT: 2px" align=left SIZE=2>

<DIV><FONT color=#c0c0c0 size=2 face=Verdana><SPAN>327801865</SPAN> 
</FONT></DIV></FONT></BODY></HTML>

--=====003_Dragon137716728726_=====--



--===============1355252956==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1355252956==--



From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:40:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:40:55 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ690-0004oZ-Ub; Mon, 14 Nov 2011 15:40:55 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNrMY-0005d8-VR
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 11:29:39 -0800
X-Env-Sender: miche@google.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1320780538!56024153!1
X-Originating-IP: [74.125.121.67]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22683 invoked from network); 8 Nov 2011 19:28:58 -0000
Received: from smtp-out.google.com (HELO smtp-out.google.com) (74.125.121.67)
	by server-7.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 19:28:58 -0000
Received: from wpaz13.hot.corp.google.com (wpaz13.hot.corp.google.com
	[172.24.198.77]) by smtp-out.google.com with ESMTP id pA8JTYGM024849
	for <xen-devel@lists.xensource.com>; Tue, 8 Nov 2011 11:29:35 -0800
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta;
	t=1320780575; bh=IV67FTU9rzU6J/UEOxWlFDBd3CE=;
	h=Subject:To:From:Date:Message-ID:MIME-Version:Content-Type:
	Content-Transfer-Encoding;
	b=s+H4KMI+9Pz3xdtjjwJdociMgjW2whtebpdYznOWUXiKEeO6JWbv57vsE242sLN+w
	+yv7ZSavPM08XLoZvK9ng==
DomainKey-Signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns;
	h=subject:to:from:date:message-id:user-agent:mime-version:
	content-type:content-transfer-encoding:x-system-of-record;
	b=WaTG7jQHJJusk7h7Lt7mFXx/ggnExyLNuyDoi/nzZjyycLJFjg6GeMe1uN5YD5f/Y
	9CBEws5uOPOqfOeEXz4zw==
Received: from miche.sea.corp.google.com (miche.sea.corp.google.com
	[172.31.71.52])
	by wpaz13.hot.corp.google.com with ESMTP id pA8JTXUS009968
	for <xen-devel@lists.xensource.com>; Tue, 8 Nov 2011 11:29:33 -0800
Received: from miche.sea.corp.google.com (localhost [IPv6:::1])
	by miche.sea.corp.google.com (Postfix) with ESMTP id 2AE5320509
	for <xen-devel@lists.xensource.com>;
	Tue,  8 Nov 2011 11:29:33 -0800 (PST)
To: xen-devel@lists.xensource.com
From: Miche Baker-Harvey <miche@google.com>
Date: Tue, 08 Nov 2011 11:29:33 -0800
Message-ID: <20111108192932.30528.88994.stgit@miche.sea.corp.google.com>
User-Agent: StGit/0.15
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
X-System-Of-Record: true
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:33 -0800
Subject: [Xen-devel] [PATCH RFC v2 0/3] Support multiple VirtioConsoles.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

(Amit pointed out that the patches never went out. This is a resend of
the series meant to go out on 11/2/2011; I've marked it "v2".)  

This patchset applies to linux-next/next-20111102.

This series implements support for multiple virtio_consoles using KVM.

This patchset addresses several issues associated with trying to
establish multiple virtio consoles. 

I'm trying to start a guest via KVM that supports multiple virtual
consoles, with getty's on each, and with some being console devices.

These patches let me establish more than one VirtioConsole (I'm
running eight at the moment), and enable console output appearing on
one of them.  It still doesn't successfully generate console output on
multiple VirtioConsoles.

Let me apologise for my last patch having gotten into Linus' tree, and
leaving other people to deal with crashes.  I had meant to be asking
for guidance, but I didn't mark it as "RFC".

This series reflects the input from Konrad Rzeszutek, Amit Shah, Stephen
Boyd, and Rusty Russell.  I think we do have to limit hvc_alloc() to one
thread.

I would appreciate any comments or feedback, or accept if appropriate.

Thanks,
Miche Baker-Harvey

---

Miche Baker-Harvey (3):
      virtio_console:  Fix locking of vtermno.
      hvc_init():  Enforce one-time initialization.
      Use separate struct console structure for each hvc_console.


 drivers/char/virtio_console.c |    9 ++++++---
 drivers/tty/hvc/hvc_console.c |   33 +++++++++++++++++++++++++++++++--
 drivers/tty/hvc/hvc_console.h |    1 +
 3 files changed, 38 insertions(+), 5 deletions(-)

-- 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:42:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:42:06 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ6AA-0005Co-ED; Mon, 14 Nov 2011 15:42:06 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNrMe-0005dE-G6
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 11:29:44 -0800
X-Env-Sender: miche@google.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1320780580!2772233!1
X-Originating-IP: [216.239.44.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9218 invoked from network); 8 Nov 2011 19:29:41 -0000
Received: from smtp-out.google.com (HELO smtp-out.google.com) (216.239.44.51)
	by server-3.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 19:29:41 -0000
Received: from wpaz33.hot.corp.google.com (wpaz33.hot.corp.google.com
	[172.24.198.97]) by smtp-out.google.com with ESMTP id pA8JTdvo028058
	for <xen-devel@lists.xensource.com>; Tue, 8 Nov 2011 11:29:39 -0800
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta;
	t=1320780579; bh=GlhtrWTykXbYchBGd1i5vetoUOE=;
	h=Subject:To:From:Date:Message-ID:In-Reply-To:References:
	MIME-Version:Content-Type:Content-Transfer-Encoding;
	b=vOLjhRJXidIBPEugaDd1TPRAWUOrFILKoi33n/bISNRrqunGNMUuEt8oWugnhrgyQ
	E1hfy3Mqr/Li/rUfbSEhg==
DomainKey-Signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns;
	h=subject:to:from:date:message-id:in-reply-to:references:
	user-agent:mime-version:content-type:
	content-transfer-encoding:x-system-of-record;
	b=jsn0D6y8ISuX9AVX/HK8FdeEXyM5q2MplyhCWwlKW4ttbJ7wxPMkx0Qv38/Tbt1XQ
	wLojKOw2jghFKElTXMeqQ==
Received: from miche.sea.corp.google.com (miche.sea.corp.google.com
	[172.31.71.52])
	by wpaz33.hot.corp.google.com with ESMTP id pA8JTcFO019931
	for <xen-devel@lists.xensource.com>; Tue, 8 Nov 2011 11:29:38 -0800
Received: from miche.sea.corp.google.com (localhost [IPv6:::1])
	by miche.sea.corp.google.com (Postfix) with ESMTP id 515C020253
	for <xen-devel@lists.xensource.com>;
	Tue,  8 Nov 2011 11:29:38 -0800 (PST)
To: xen-devel@lists.xensource.com
From: Miche Baker-Harvey <miche@google.com>
Date: Tue, 08 Nov 2011 11:29:38 -0800
Message-ID: <20111108192938.30528.57281.stgit@miche.sea.corp.google.com>
In-Reply-To: <20111108192932.30528.88994.stgit@miche.sea.corp.google.com>
References: <20111108192932.30528.88994.stgit@miche.sea.corp.google.com>
User-Agent: StGit/0.15
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
X-System-Of-Record: true
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:33 -0800
Subject: [Xen-devel] [PATCH v2 1/3] virtio_console: Fix locking of vtermno.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Some modifications of vtermno were not done under the spinlock.

Moved assignment from vtermno and increment of vtermno together,
putting both under the spinlock.  Revert vtermno on failure.

Signed-off-by: Miche Baker-Harvey <miche@google.com>
---
 drivers/char/virtio_console.c |    9 ++++++---
 1 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 8e3c46d..9722e76 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -987,18 +987,21 @@ int init_port_console(struct port *port)
 	 * pointers.  The final argument is the output buffer size: we
 	 * can do any size, so we put PAGE_SIZE here.
 	 */
-	port->cons.vtermno = pdrvdata.next_vtermno;
+	spin_lock_irq(&pdrvdata_lock);
+	port->cons.vtermno = pdrvdata.next_vtermno++;
+	spin_unlock_irq(&pdrvdata_lock);
 
 	port->cons.hvc = hvc_alloc(port->cons.vtermno, 0, &hv_ops, PAGE_SIZE);
+	spin_lock_irq(&pdrvdata_lock);
 	if (IS_ERR(port->cons.hvc)) {
 		ret = PTR_ERR(port->cons.hvc);
 		dev_err(port->dev,
 			"error %d allocating hvc for port\n", ret);
 		port->cons.hvc = NULL;
+		port->cons.vtermno = pdrvdata.next_vtermno--;
+		spin_unlock_irq(&pdrvdata_lock);
 		return ret;
 	}
-	spin_lock_irq(&pdrvdata_lock);
-	pdrvdata.next_vtermno++;
 	list_add_tail(&port->cons.list, &pdrvdata.consoles);
 	spin_unlock_irq(&pdrvdata_lock);
 	port->guest_connected = true;


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:43:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:43:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ6BU-0005da-8E; Mon, 14 Nov 2011 15:43:28 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNrMj-0005dT-KV
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 11:29:50 -0800
X-Env-Sender: miche@google.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1320780586!781998!1
X-Originating-IP: [74.125.121.67]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22414 invoked from network); 8 Nov 2011 19:29:46 -0000
Received: from smtp-out.google.com (HELO smtp-out.google.com) (74.125.121.67)
	by server-6.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 19:29:46 -0000
Received: from wpaz24.hot.corp.google.com (wpaz24.hot.corp.google.com
	[172.24.198.88]) by smtp-out.google.com with ESMTP id pA8JTjg7003040
	for <xen-devel@lists.xensource.com>; Tue, 8 Nov 2011 11:29:45 -0800
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta;
	t=1320780585; bh=SHfKR5wjANGLr1Amuy+0WF0U3b4=;
	h=Subject:To:From:Date:Message-ID:In-Reply-To:References:
	MIME-Version:Content-Type:Content-Transfer-Encoding;
	b=TrQn/WX78tGMBXMMjGaRSZDylMPdR66/+fxF4zQCQCCFSRt8U7DAASVPTJ5stY5Lt
	qByKN8UlfiWzxQizfOr+A==
DomainKey-Signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns;
	h=subject:to:from:date:message-id:in-reply-to:references:
	user-agent:mime-version:content-type:
	content-transfer-encoding:x-system-of-record;
	b=qrNAvTQlUlq4lxNMMRWyI5mSjg/uyFi0w8rxwZmH0esPMhYh8LdNyuC3Niof3uU3z
	Sjr9woQJB0u9MI8qRliJw==
Received: from miche.sea.corp.google.com (miche.sea.corp.google.com
	[172.31.71.52])
	by wpaz24.hot.corp.google.com with ESMTP id pA8JTieY027332
	for <xen-devel@lists.xensource.com>; Tue, 8 Nov 2011 11:29:44 -0800
Received: from miche.sea.corp.google.com (localhost [IPv6:::1])
	by miche.sea.corp.google.com (Postfix) with ESMTP id A79AF20253
	for <xen-devel@lists.xensource.com>;
	Tue,  8 Nov 2011 11:29:43 -0800 (PST)
To: xen-devel@lists.xensource.com
From: Miche Baker-Harvey <miche@google.com>
Date: Tue, 08 Nov 2011 11:29:43 -0800
Message-ID: <20111108192943.30528.92786.stgit@miche.sea.corp.google.com>
In-Reply-To: <20111108192932.30528.88994.stgit@miche.sea.corp.google.com>
References: <20111108192932.30528.88994.stgit@miche.sea.corp.google.com>
User-Agent: StGit/0.15
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
X-System-Of-Record: true
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:33 -0800
Subject: [Xen-devel] [PATCH v2 2/3] hvc_init(): Enforce one-time
	initialization.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

hvc_init() must only be called once, and no thread should continue with hvc_alloc()
until after initialization is complete.  The original code does not enforce either
of these requirements.  A new mutex limits entry to hvc_init() to a single thread,
and blocks all later comers until it has completed.

This patch fixes multiple crash symptoms.

Signed-off-by: Miche Baker-Harvey <miche@google.com>
---
 drivers/tty/hvc/hvc_console.c |   13 +++++++++++--
 1 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c
index b6b2d18..09a6159 100644
--- a/drivers/tty/hvc/hvc_console.c
+++ b/drivers/tty/hvc/hvc_console.c
@@ -29,8 +29,9 @@
 #include <linux/kernel.h>
 #include <linux/kthread.h>
 #include <linux/list.h>
-#include <linux/module.h>
 #include <linux/major.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
 #include <linux/sysrq.h>
 #include <linux/tty.h>
 #include <linux/tty_flip.h>
@@ -84,6 +85,10 @@ static LIST_HEAD(hvc_structs);
  * list traversal.
  */
 static DEFINE_SPINLOCK(hvc_structs_lock);
+/*
+ * only one task does allocation at a time.
+ */
+static DEFINE_MUTEX(hvc_ports_mutex);
 
 /*
  * This value is used to assign a tty->index value to a hvc_struct based
@@ -825,11 +830,15 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
 	int i;
 
 	/* We wait until a driver actually comes along */
+	mutex_lock(&hvc_ports_mutex);
 	if (!hvc_driver) {
 		int err = hvc_init();
-		if (err)
+		if (err) {
+			mutex_unlock(&hvc_ports_mutex);
 			return ERR_PTR(err);
+		}
 	}
+	mutex_unlock(&hvc_ports_mutex);
 
 	hp = kzalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size,
 			GFP_KERNEL);


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:44:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:44:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ6CR-00060y-78; Mon, 14 Nov 2011 15:44:27 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNrMp-0005dl-Uq
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 11:29:56 -0800
X-Env-Sender: miche@google.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1320780591!777318!1
X-Originating-IP: [216.239.44.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14675 invoked from network); 8 Nov 2011 19:29:52 -0000
Received: from smtp-out.google.com (HELO smtp-out.google.com) (216.239.44.51)
	by server-8.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 19:29:52 -0000
Received: from hpaq5.eem.corp.google.com (hpaq5.eem.corp.google.com
	[172.25.149.5]) by smtp-out.google.com with ESMTP id pA8JToQp000905
	for <xen-devel@lists.xensource.com>; Tue, 8 Nov 2011 11:29:51 -0800
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta;
	t=1320780591; bh=cWzqN3bwKRfgplU+HRIjmhZZLAU=;
	h=Subject:To:From:Date:Message-ID:In-Reply-To:References:
	MIME-Version:Content-Type:Content-Transfer-Encoding;
	b=VTOL6yGKWMUo9et6rfPSB+FBu9tqBTCDxJHldlWOg4HK2wABVJRca69XIRWPmemuQ
	/tDodSGQP/L478mqaEF3g==
DomainKey-Signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns;
	h=subject:to:from:date:message-id:in-reply-to:references:
	user-agent:mime-version:content-type:
	content-transfer-encoding:x-system-of-record;
	b=rUj4DNkKdW5beXsYsKqsGpjPeVuxlC9PyeZXIu4EZw4ldFU8ytrk4mTHl6Bkr8v2b
	U7+1NPUs/s4jHUml2xIng==
Received: from miche.sea.corp.google.com (miche.sea.corp.google.com
	[172.31.71.52])
	by hpaq5.eem.corp.google.com with ESMTP id pA8JTnci013863
	for <xen-devel@lists.xensource.com>; Tue, 8 Nov 2011 11:29:49 -0800
Received: from miche.sea.corp.google.com (localhost [IPv6:::1])
	by miche.sea.corp.google.com (Postfix) with ESMTP id D8FFF20253
	for <xen-devel@lists.xensource.com>;
	Tue,  8 Nov 2011 11:29:48 -0800 (PST)
To: xen-devel@lists.xensource.com
From: Miche Baker-Harvey <miche@google.com>
Date: Tue, 08 Nov 2011 11:29:48 -0800
Message-ID: <20111108192948.30528.35337.stgit@miche.sea.corp.google.com>
In-Reply-To: <20111108192932.30528.88994.stgit@miche.sea.corp.google.com>
References: <20111108192932.30528.88994.stgit@miche.sea.corp.google.com>
User-Agent: StGit/0.15
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
X-System-Of-Record: true
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:33 -0800
Subject: [Xen-devel] [PATCH v2 3/3] Use separate struct console structure
	for each hvc_console.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

It is possible to make any virtio_console port be a console
by sending VIRITO_CONSOLE_CONSOLE_PORT.  But hvc_alloc was
using a single struct console hvc_console, which contains
both an index and flags which are per-port.

This adds a separate struct console for each virtio_console
that is CONSOLE_PORT.

Signed-off-by: Miche Baker-Harvey <miche@google.com>
---
 drivers/tty/hvc/hvc_console.c |   20 ++++++++++++++++++++
 drivers/tty/hvc/hvc_console.h |    1 +
 2 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c
index 09a6159..24a84d6 100644
--- a/drivers/tty/hvc/hvc_console.c
+++ b/drivers/tty/hvc/hvc_console.c
@@ -247,6 +247,7 @@ static void destroy_hvc_struct(struct kref *kref)
 
 	spin_unlock(&hvc_structs_lock);
 
+	kfree(hp->hvc_console);
 	kfree(hp);
 }
 
@@ -827,6 +828,7 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
 			     int outbuf_size)
 {
 	struct hvc_struct *hp;
+	struct console *cp;
 	int i;
 
 	/* We wait until a driver actually comes along */
@@ -854,6 +856,17 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
 	kref_init(&hp->kref);
 
 	INIT_WORK(&hp->tty_resize, hvc_set_winsz);
+	/*
+	 * Make each console its own struct console.
+	 */
+	cp = kmemdup(&hvc_console, sizeof(*cp), GFP_KERNEL);
+	if (!cp) {
+		kfree(hp);
+		return ERR_PTR(-ENOMEM);
+	}
+
+	hp->hvc_console = cp;
+
 	spin_lock_init(&hp->lock);
 	spin_lock(&hvc_structs_lock);
 
@@ -872,8 +885,13 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
 
 	hp->index = i;
 
+	cp->index = i;
+	vtermnos[i] = vtermno;
+	cons_ops[i] = ops;
+
 	list_add_tail(&(hp->next), &hvc_structs);
 	spin_unlock(&hvc_structs_lock);
+	register_console(cp);
 
 	return hp;
 }
@@ -884,6 +902,8 @@ int hvc_remove(struct hvc_struct *hp)
 	unsigned long flags;
 	struct tty_struct *tty;
 
+	BUG_ON(!hp->hvc_console);
+	unregister_console(hp->hvc_console);
 	spin_lock_irqsave(&hp->lock, flags);
 	tty = tty_kref_get(hp->tty);
 
diff --git a/drivers/tty/hvc/hvc_console.h b/drivers/tty/hvc/hvc_console.h
index c335a14..2d20ab7 100644
--- a/drivers/tty/hvc/hvc_console.h
+++ b/drivers/tty/hvc/hvc_console.h
@@ -58,6 +58,7 @@ struct hvc_struct {
 	const struct hv_ops *ops;
 	int irq_requested;
 	int data;
+	struct console *hvc_console;
 	struct winsize ws;
 	struct work_struct tty_resize;
 	struct list_head next;


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:45:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:45:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ6DL-0006RG-PU; Mon, 14 Nov 2011 15:45:23 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNtTy-0000wr-OM
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 13:45:27 -0800
X-Env-Sender: miche@google.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1320788723!2761850!1
X-Originating-IP: [74.125.121.67]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12589 invoked from network); 8 Nov 2011 21:45:23 -0000
Received: from smtp-out.google.com (HELO smtp-out.google.com) (74.125.121.67)
	by server-4.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 21:45:23 -0000
Received: from wpaz13.hot.corp.google.com (wpaz13.hot.corp.google.com
	[172.24.198.77]) by smtp-out.google.com with ESMTP id pA8Lj8wC014334;
	Tue, 8 Nov 2011 13:45:08 -0800
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta;
	t=1320788708; bh=GlhtrWTykXbYchBGd1i5vetoUOE=;
	h=Subject:To:From:Cc:Date:Message-ID:In-Reply-To:References:
	MIME-Version:Content-Type:Content-Transfer-Encoding;
	b=YUk9RBzWs9eRUbQz9GXJDmDaPx9Hc8Z0aqGN5ixMt3zNJc7tlj8Gmth0ZVYJAS1Vv
	KPTMIbGryU2crIF3v4Ntw==
DomainKey-Signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns;
	h=subject:to:from:cc:date:message-id:in-reply-to:references:
	user-agent:mime-version:content-type:
	content-transfer-encoding:x-system-of-record;
	b=Yka+gWPHnJJ3u7tiR1sJcGswXHdDrDu6lCR0TK8S1qFa9yTdELsg2h8vIq7lASu+9
	rm4H5/gq4fev9zsmMTCdA==
Received: from miche.sea.corp.google.com (miche.sea.corp.google.com
	[172.31.71.52])
	by wpaz13.hot.corp.google.com with ESMTP id pA8LixNT017260;
	Tue, 8 Nov 2011 13:44:59 -0800
Received: from miche.sea.corp.google.com (localhost [IPv6:::1])
	by miche.sea.corp.google.com (Postfix) with ESMTP id 29EFA20509;
	Tue,  8 Nov 2011 13:44:59 -0800 (PST)
To: Greg Kroah-Hartman <gregkh@suse.de>
From: Miche Baker-Harvey <miche@google.com>
Date: Tue, 08 Nov 2011 13:44:58 -0800
Message-ID: <20111108214458.28884.86759.stgit@miche.sea.corp.google.com>
In-Reply-To: <20111108214452.28884.14840.stgit@miche.sea.corp.google.com>
References: <20111108214452.28884.14840.stgit@miche.sea.corp.google.com>
User-Agent: StGit/0.15
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
X-System-Of-Record: true
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:33 -0800
Cc: Stephen Rothwell <sfr@canb.auug.org.au>, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Rusty Russell <rusty@rustcorp.com.au>, linux-kernel@vger.kernel.org,
	virtualization@lists.linux-foundation.org,
	Anton Blanchard <anton@samba.org>, Amit Shah <amit.shah@redhat.com>,
	Mike Waychison <mikew@google.com>, ppc-dev <linuxppc-dev@lists.ozlabs.org>,
	Eric Northrup <digitaleric@google.com>
Subject: [Xen-devel] [PATCH v3 1/3] virtio_console: Fix locking of vtermno.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Some modifications of vtermno were not done under the spinlock.

Moved assignment from vtermno and increment of vtermno together,
putting both under the spinlock.  Revert vtermno on failure.

Signed-off-by: Miche Baker-Harvey <miche@google.com>
---
 drivers/char/virtio_console.c |    9 ++++++---
 1 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 8e3c46d..9722e76 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -987,18 +987,21 @@ int init_port_console(struct port *port)
 	 * pointers.  The final argument is the output buffer size: we
 	 * can do any size, so we put PAGE_SIZE here.
 	 */
-	port->cons.vtermno = pdrvdata.next_vtermno;
+	spin_lock_irq(&pdrvdata_lock);
+	port->cons.vtermno = pdrvdata.next_vtermno++;
+	spin_unlock_irq(&pdrvdata_lock);
 
 	port->cons.hvc = hvc_alloc(port->cons.vtermno, 0, &hv_ops, PAGE_SIZE);
+	spin_lock_irq(&pdrvdata_lock);
 	if (IS_ERR(port->cons.hvc)) {
 		ret = PTR_ERR(port->cons.hvc);
 		dev_err(port->dev,
 			"error %d allocating hvc for port\n", ret);
 		port->cons.hvc = NULL;
+		port->cons.vtermno = pdrvdata.next_vtermno--;
+		spin_unlock_irq(&pdrvdata_lock);
 		return ret;
 	}
-	spin_lock_irq(&pdrvdata_lock);
-	pdrvdata.next_vtermno++;
 	list_add_tail(&port->cons.list, &pdrvdata.consoles);
 	spin_unlock_irq(&pdrvdata_lock);
 	port->guest_connected = true;


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:46:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:46:19 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ6EF-0006or-Rv; Mon, 14 Nov 2011 15:46:19 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNtTy-0000ws-Pt
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 13:45:27 -0800
X-Env-Sender: miche@google.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1320788723!3415529!1
X-Originating-IP: [74.125.121.67]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29985 invoked from network); 8 Nov 2011 21:45:23 -0000
Received: from smtp-out.google.com (HELO smtp-out.google.com) (74.125.121.67)
	by server-14.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 21:45:23 -0000
Received: from hpaq14.eem.corp.google.com (hpaq14.eem.corp.google.com
	[172.25.149.14]) by smtp-out.google.com with ESMTP id pA8Lj4ke029685;
	Tue, 8 Nov 2011 13:45:04 -0800
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta;
	t=1320788705; bh=dlxXLEUaWtxJigPRF/Ra4bMzmjI=;
	h=Subject:To:From:Cc:Date:Message-ID:MIME-Version:Content-Type:
	Content-Transfer-Encoding;
	b=sRRuT+n1NDYJ2sZ3sjmHZbf6gD/z6Zp30RAt5WDVC4QFGJCXQL9/rtDvZ7JN/7O8J
	YblH0rGm+AStb703inrsw==
DomainKey-Signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns;
	h=subject:to:from:cc:date:message-id:user-agent:
	mime-version:content-type:content-transfer-encoding:x-system-of-record; 
	b=oTWEtYo0zZIhpsNlXzDgYkrQNTiFQXgz/gGlSaFBV/gC5lkvXgzFJ9xQAOLfyukoX
	HpjNdMZNKM+MotXkx/PHg==
Received: from miche.sea.corp.google.com (miche.sea.corp.google.com
	[172.31.71.52])
	by hpaq14.eem.corp.google.com with ESMTP id pA8LisPi029103;
	Tue, 8 Nov 2011 13:44:54 -0800
Received: from miche.sea.corp.google.com (localhost [IPv6:::1])
	by miche.sea.corp.google.com (Postfix) with ESMTP id B933D203B4;
	Tue,  8 Nov 2011 13:44:53 -0800 (PST)
To: Greg Kroah-Hartman <gregkh@suse.de>
From: Miche Baker-Harvey <miche@google.com>
Date: Tue, 08 Nov 2011 13:44:53 -0800
Message-ID: <20111108214452.28884.14840.stgit@miche.sea.corp.google.com>
User-Agent: StGit/0.15
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
X-System-Of-Record: true
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:33 -0800
Cc: Stephen Rothwell <sfr@canb.auug.org.au>, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Rusty Russell <rusty@rustcorp.com.au>, linux-kernel@vger.kernel.org,
	virtualization@lists.linux-foundation.org,
	Anton Blanchard <anton@samba.org>, Amit Shah <amit.shah@redhat.com>,
	Mike Waychison <mikew@google.com>, ppc-dev <linuxppc-dev@lists.ozlabs.org>,
	Eric Northrup <digitaleric@google.com>
Subject: [Xen-devel] [PATCH RFC v3 0/3] Support multiple VirtioConsoles.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

(Amit pointed out that the patches never went out. This was a resend of
the series meant to go out on 11/2/2011; Now it's a resend of the mail this
morning, with everyone copied on the same mail.  So sorry for the spam!
This is v3.)

This patchset applies to linux-next/next-20111102.

This series implements support for multiple virtio_consoles using KVM.

This patchset addresses several issues associated with trying to
establish multiple virtio consoles. 

I'm trying to start a guest via KVM that supports multiple virtual
consoles, with getty's on each, and with some being console devices.

These patches let me establish more than one VirtioConsole (I'm
running eight at the moment), and enable console output appearing on
one of them.  It still doesn't successfully generate console output on
multiple VirtioConsoles.

Let me apologise for my last patch having gotten into Linus' tree, and
leaving other people to deal with crashes.  I had meant to be asking
for guidance, but I didn't mark it as "RFC".

This series reflects the input from Konrad Rzeszutek, Amit Shah, Stephen
Boyd, and Rusty Russell.  I think we do have to limit hvc_alloc() to one
thread.

I would appreciate any comments or feedback, or accept if appropriate.

Thanks,
Miche Baker-Harvey

---

Miche Baker-Harvey (3):
      virtio_console:  Fix locking of vtermno.
      hvc_init():  Enforce one-time initialization.
      Use separate struct console structure for each hvc_console.


 drivers/char/virtio_console.c |    9 ++++++---
 drivers/tty/hvc/hvc_console.c |   33 +++++++++++++++++++++++++++++++--
 drivers/tty/hvc/hvc_console.h |    1 +
 3 files changed, 38 insertions(+), 5 deletions(-)

-- 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:47:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:47:07 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ6F1-0007CF-4W; Mon, 14 Nov 2011 15:47:07 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNtTz-0000xF-JG
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 13:45:27 -0800
X-Env-Sender: miche@google.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1320788723!789471!1
X-Originating-IP: [216.239.44.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20756 invoked from network); 8 Nov 2011 21:45:24 -0000
Received: from smtp-out.google.com (HELO smtp-out.google.com) (216.239.44.51)
	by server-14.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 21:45:24 -0000
Received: from hpaq5.eem.corp.google.com (hpaq5.eem.corp.google.com
	[172.25.149.5]) by smtp-out.google.com with ESMTP id pA8Lj9Pl005473;
	Tue, 8 Nov 2011 13:45:09 -0800
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta;
	t=1320788709; bh=SHfKR5wjANGLr1Amuy+0WF0U3b4=;
	h=Subject:To:From:Cc:Date:Message-ID:In-Reply-To:References:
	MIME-Version:Content-Type:Content-Transfer-Encoding;
	b=hpg4NVKRarZF1Je5snObVDCvN/oKPYE6XzBtFXWr8Frt5xEzcWbs0u0GtgKV4aTaI
	2W50cJ37OtGWaUYtxaNsA==
DomainKey-Signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns;
	h=subject:to:from:cc:date:message-id:in-reply-to:references:
	user-agent:mime-version:content-type:
	content-transfer-encoding:x-system-of-record;
	b=P2IJWqoLbOEGDxmchgpN04TOce/xKtFioi9STfTf+cbmwQI92q6t14ZNOCBfb3Vkg
	XCbvBVVzZSbglsMs9uKrg==
Received: from miche.sea.corp.google.com (miche.sea.corp.google.com
	[172.31.71.52])
	by hpaq5.eem.corp.google.com with ESMTP id pA8Lj5Wl017240;
	Tue, 8 Nov 2011 13:45:06 -0800
Received: from miche.sea.corp.google.com (localhost [IPv6:::1])
	by miche.sea.corp.google.com (Postfix) with ESMTP id 9B406203B4;
	Tue,  8 Nov 2011 13:45:04 -0800 (PST)
To: Greg Kroah-Hartman <gregkh@suse.de>
From: Miche Baker-Harvey <miche@google.com>
Date: Tue, 08 Nov 2011 13:45:04 -0800
Message-ID: <20111108214504.28884.61814.stgit@miche.sea.corp.google.com>
In-Reply-To: <20111108214452.28884.14840.stgit@miche.sea.corp.google.com>
References: <20111108214452.28884.14840.stgit@miche.sea.corp.google.com>
User-Agent: StGit/0.15
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
X-System-Of-Record: true
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:33 -0800
Cc: Stephen Rothwell <sfr@canb.auug.org.au>, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Rusty Russell <rusty@rustcorp.com.au>, linux-kernel@vger.kernel.org,
	virtualization@lists.linux-foundation.org,
	Anton Blanchard <anton@samba.org>, Amit Shah <amit.shah@redhat.com>,
	Mike Waychison <mikew@google.com>, ppc-dev <linuxppc-dev@lists.ozlabs.org>,
	Eric Northrup <digitaleric@google.com>
Subject: [Xen-devel] [PATCH v3 2/3] hvc_init(): Enforce one-time
	initialization.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

hvc_init() must only be called once, and no thread should continue with hvc_alloc()
until after initialization is complete.  The original code does not enforce either
of these requirements.  A new mutex limits entry to hvc_init() to a single thread,
and blocks all later comers until it has completed.

This patch fixes multiple crash symptoms.

Signed-off-by: Miche Baker-Harvey <miche@google.com>
---
 drivers/tty/hvc/hvc_console.c |   13 +++++++++++--
 1 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c
index b6b2d18..09a6159 100644
--- a/drivers/tty/hvc/hvc_console.c
+++ b/drivers/tty/hvc/hvc_console.c
@@ -29,8 +29,9 @@
 #include <linux/kernel.h>
 #include <linux/kthread.h>
 #include <linux/list.h>
-#include <linux/module.h>
 #include <linux/major.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
 #include <linux/sysrq.h>
 #include <linux/tty.h>
 #include <linux/tty_flip.h>
@@ -84,6 +85,10 @@ static LIST_HEAD(hvc_structs);
  * list traversal.
  */
 static DEFINE_SPINLOCK(hvc_structs_lock);
+/*
+ * only one task does allocation at a time.
+ */
+static DEFINE_MUTEX(hvc_ports_mutex);
 
 /*
  * This value is used to assign a tty->index value to a hvc_struct based
@@ -825,11 +830,15 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
 	int i;
 
 	/* We wait until a driver actually comes along */
+	mutex_lock(&hvc_ports_mutex);
 	if (!hvc_driver) {
 		int err = hvc_init();
-		if (err)
+		if (err) {
+			mutex_unlock(&hvc_ports_mutex);
 			return ERR_PTR(err);
+		}
 	}
+	mutex_unlock(&hvc_ports_mutex);
 
 	hp = kzalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size,
 			GFP_KERNEL);


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:47:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:47:55 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ6Fn-0007Z1-RU; Mon, 14 Nov 2011 15:47:55 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RNtU4-0000yb-FJ
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 13:45:33 -0800
X-Env-Sender: miche@google.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1320788728!791721!1
X-Originating-IP: [216.239.44.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12628 invoked from network); 8 Nov 2011 21:45:29 -0000
Received: from smtp-out.google.com (HELO smtp-out.google.com) (216.239.44.51)
	by server-6.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Nov 2011 21:45:29 -0000
Received: from hpaq1.eem.corp.google.com (hpaq1.eem.corp.google.com
	[172.25.149.1]) by smtp-out.google.com with ESMTP id pA8LjDda021864;
	Tue, 8 Nov 2011 13:45:14 -0800
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta;
	t=1320788714; bh=cWzqN3bwKRfgplU+HRIjmhZZLAU=;
	h=Subject:To:From:Cc:Date:Message-ID:In-Reply-To:References:
	MIME-Version:Content-Type:Content-Transfer-Encoding;
	b=i9QLknw1WW1l+7ZCfoni2vgeu/YGMbD59/pKAFQ03brWCIFRxqt9o9Sj64hpHif+N
	JqeCRHfD2WaJVs0x1PDiw==
DomainKey-Signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns;
	h=subject:to:from:cc:date:message-id:in-reply-to:references:
	user-agent:mime-version:content-type:
	content-transfer-encoding:x-system-of-record;
	b=am5STUlkrsvXkZ6RHvxMbQIPSOkaRnguiEHGYFgwRGqcXF8F0+yubE/x72o3AHKjo
	bmlNbdimOvOxR4Sn3bMGg==
Received: from miche.sea.corp.google.com (miche.sea.corp.google.com
	[172.31.71.52])
	by hpaq1.eem.corp.google.com with ESMTP id pA8LjASM011908;
	Tue, 8 Nov 2011 13:45:10 -0800
Received: from miche.sea.corp.google.com (localhost [IPv6:::1])
	by miche.sea.corp.google.com (Postfix) with ESMTP id F05DA203B4;
	Tue,  8 Nov 2011 13:45:09 -0800 (PST)
To: Greg Kroah-Hartman <gregkh@suse.de>
From: Miche Baker-Harvey <miche@google.com>
Date: Tue, 08 Nov 2011 13:45:09 -0800
Message-ID: <20111108214509.28884.98169.stgit@miche.sea.corp.google.com>
In-Reply-To: <20111108214452.28884.14840.stgit@miche.sea.corp.google.com>
References: <20111108214452.28884.14840.stgit@miche.sea.corp.google.com>
User-Agent: StGit/0.15
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
X-System-Of-Record: true
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:33 -0800
Cc: Stephen Rothwell <sfr@canb.auug.org.au>, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Rusty Russell <rusty@rustcorp.com.au>, linux-kernel@vger.kernel.org,
	virtualization@lists.linux-foundation.org,
	Anton Blanchard <anton@samba.org>, Amit Shah <amit.shah@redhat.com>,
	Mike Waychison <mikew@google.com>, ppc-dev <linuxppc-dev@lists.ozlabs.org>,
	Eric Northrup <digitaleric@google.com>
Subject: [Xen-devel] [PATCH v3 3/3] Use separate struct console structure
	for each hvc_console.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

It is possible to make any virtio_console port be a console
by sending VIRITO_CONSOLE_CONSOLE_PORT.  But hvc_alloc was
using a single struct console hvc_console, which contains
both an index and flags which are per-port.

This adds a separate struct console for each virtio_console
that is CONSOLE_PORT.

Signed-off-by: Miche Baker-Harvey <miche@google.com>
---
 drivers/tty/hvc/hvc_console.c |   20 ++++++++++++++++++++
 drivers/tty/hvc/hvc_console.h |    1 +
 2 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c
index 09a6159..24a84d6 100644
--- a/drivers/tty/hvc/hvc_console.c
+++ b/drivers/tty/hvc/hvc_console.c
@@ -247,6 +247,7 @@ static void destroy_hvc_struct(struct kref *kref)
 
 	spin_unlock(&hvc_structs_lock);
 
+	kfree(hp->hvc_console);
 	kfree(hp);
 }
 
@@ -827,6 +828,7 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
 			     int outbuf_size)
 {
 	struct hvc_struct *hp;
+	struct console *cp;
 	int i;
 
 	/* We wait until a driver actually comes along */
@@ -854,6 +856,17 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
 	kref_init(&hp->kref);
 
 	INIT_WORK(&hp->tty_resize, hvc_set_winsz);
+	/*
+	 * Make each console its own struct console.
+	 */
+	cp = kmemdup(&hvc_console, sizeof(*cp), GFP_KERNEL);
+	if (!cp) {
+		kfree(hp);
+		return ERR_PTR(-ENOMEM);
+	}
+
+	hp->hvc_console = cp;
+
 	spin_lock_init(&hp->lock);
 	spin_lock(&hvc_structs_lock);
 
@@ -872,8 +885,13 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
 
 	hp->index = i;
 
+	cp->index = i;
+	vtermnos[i] = vtermno;
+	cons_ops[i] = ops;
+
 	list_add_tail(&(hp->next), &hvc_structs);
 	spin_unlock(&hvc_structs_lock);
+	register_console(cp);
 
 	return hp;
 }
@@ -884,6 +902,8 @@ int hvc_remove(struct hvc_struct *hp)
 	unsigned long flags;
 	struct tty_struct *tty;
 
+	BUG_ON(!hp->hvc_console);
+	unregister_console(hp->hvc_console);
 	spin_lock_irqsave(&hp->lock, flags);
 	tty = tty_kref_get(hp->tty);
 
diff --git a/drivers/tty/hvc/hvc_console.h b/drivers/tty/hvc/hvc_console.h
index c335a14..2d20ab7 100644
--- a/drivers/tty/hvc/hvc_console.h
+++ b/drivers/tty/hvc/hvc_console.h
@@ -58,6 +58,7 @@ struct hvc_struct {
 	const struct hv_ops *ops;
 	int irq_requested;
 	int data;
+	struct console *hvc_console;
 	struct winsize ws;
 	struct work_struct tty_resize;
 	struct list_head next;


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:49:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:49:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ6HI-0007yA-Fi; Mon, 14 Nov 2011 15:49:28 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO2WG-0005Dk-Bb
	for xen-devel@lists.xensource.com; Tue, 08 Nov 2011 23:24:24 -0800
X-Env-Sender: michael@ellerman.id.au
X-Msg-Ref: server-12.tower-27.messagelabs.com!1320823435!43843174!1
X-Originating-IP: [203.10.76.45]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16053 invoked from network); 9 Nov 2011 07:23:58 -0000
Received: from ozlabs.org (HELO ozlabs.org) (203.10.76.45)
	by server-12.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 07:23:58 -0000
Received: from [127.0.0.1] (localhost [IPv6:::1])
	by ozlabs.org (Postfix) with ESMTP id 63A781007D7;
	Wed,  9 Nov 2011 18:24:13 +1100 (EST)
From: Michael Ellerman <michael@ellerman.id.au>
To: Miche Baker-Harvey <miche@google.com>
In-Reply-To: <20111108214504.28884.61814.stgit@miche.sea.corp.google.com>
References: <20111108214452.28884.14840.stgit@miche.sea.corp.google.com>
	<20111108214504.28884.61814.stgit@miche.sea.corp.google.com>
Date: Wed, 09 Nov 2011 18:24:12 +1100
Message-ID: <1320823452.9376.31.camel@concordia>
Mime-Version: 1.0
X-Mailer: Evolution 2.30.3 
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:31 -0800
Cc: Stephen Rothwell <sfr@canb.auug.org.au>, Mike,
	Greg Kroah-Hartman <gregkh@suse.de>, Wilk <konrad.wilk@oracle.com>,
	Rusty Russell <rusty@rustcorp.com.au>, linux-kernel@vger.kernel.org,
	virtualization@lists.linux-foundation.org,
	xen-devel@lists.xensource.com, Anton Blanchard <anton@samba.org>,
	Konrad, Amit Shah <amit.shah@redhat.com>, Waychison <mikew@google.com>,
	ppc-dev <linuxppc-dev@lists.ozlabs.org>, Eric,
	Northrup <digitaleric@google.com>
Subject: [Xen-devel] Re: [PATCH v3 2/3] hvc_init(): Enforce one-time
	initialization.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: michael@ellerman.id.au
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0924355838=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============0924355838==
Content-Type: multipart/signed; micalg="pgp-sha1";
	protocol="application/pgp-signature";
	boundary="=-3wlTs2+aNijJKtMncx1A"


--=-3wlTs2+aNijJKtMncx1A
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Tue, 2011-11-08 at 13:45 -0800, Miche Baker-Harvey wrote:
> hvc_init() must only be called once, and no thread should continue with h=
vc_alloc()
> until after initialization is complete.  The original code does not enfor=
ce either
> of these requirements.  A new mutex limits entry to hvc_init() to a singl=
e thread,
> and blocks all later comers until it has completed.
>=20
> This patch fixes multiple crash symptoms.

Hi Miche,

A few nit-picky comments below ..

> @@ -84,6 +85,10 @@ static LIST_HEAD(hvc_structs);
>   * list traversal.
>   */
>  static DEFINE_SPINLOCK(hvc_structs_lock);
> +/*
> + * only one task does allocation at a time.
> + */
> +static DEFINE_MUTEX(hvc_ports_mutex);

The comment is wrong, isn't it? Only one task does _init_ at a time.
Once the driver is initialised allocs can run concurrently.

So shouldn't it be called hvc_init_mutex ?

> @@ -825,11 +830,15 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int =
data,
>  	int i;
> =20
>  	/* We wait until a driver actually comes along */
> +	mutex_lock(&hvc_ports_mutex);
>  	if (!hvc_driver) {
>  		int err =3D hvc_init();
> -		if (err)
> +		if (err) {
> +			mutex_unlock(&hvc_ports_mutex);
>  			return ERR_PTR(err);
> +		}
>  	}
> +	mutex_unlock(&hvc_ports_mutex);
> =20
>  	hp =3D kzalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size,
>  			GFP_KERNEL);

It'd be cleaner I think to do all the locking in hvc_init(). That's safe
as long as you recheck !hvc_driver in hvc_init() with the lock held.

cheers


--=-3wlTs2+aNijJKtMncx1A
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)

iEYEABECAAYFAk66KpwACgkQdSjSd0sB4dKSVgCeMFezuF3zVrIQ9OJdHh8MukP2
KtcAnRLc243qSYELFwz+KCQLEI9qqD9Y
=l0OT
-----END PGP SIGNATURE-----

--=-3wlTs2+aNijJKtMncx1A--



--===============0924355838==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0924355838==--



From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:50:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:50:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ6IP-0008Ml-OY; Mon, 14 Nov 2011 15:50:37 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO39u-0006GO-AL
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 00:05:32 -0800
X-Env-Sender: michael@ellerman.id.au
X-Msg-Ref: server-14.tower-216.messagelabs.com!1320825915!2815462!1
X-Originating-IP: [203.10.76.45]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11437 invoked from network); 9 Nov 2011 08:05:18 -0000
Received: from ozlabs.org (HELO ozlabs.org) (203.10.76.45)
	by server-14.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 9 Nov 2011 08:05:18 -0000
Received: from [127.0.0.1] (localhost [IPv6:::1])
	by ozlabs.org (Postfix) with ESMTP id 5BB1AB6F89;
	Wed,  9 Nov 2011 19:05:13 +1100 (EST)
From: Michael Ellerman <michael@ellerman.id.au>
To: Miche Baker-Harvey <miche@google.com>
In-Reply-To: <20111108214509.28884.98169.stgit@miche.sea.corp.google.com>
References: <20111108214452.28884.14840.stgit@miche.sea.corp.google.com>
	<20111108214509.28884.98169.stgit@miche.sea.corp.google.com>
Date: Wed, 09 Nov 2011 19:05:12 +1100
Message-ID: <1320825912.9376.72.camel@concordia>
Mime-Version: 1.0
X-Mailer: Evolution 2.30.3 
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:32 -0800
Cc: Stephen Rothwell <sfr@canb.auug.org.au>, Mike,
	Greg Kroah-Hartman <gregkh@suse.de>, Wilk <konrad.wilk@oracle.com>,
	Rusty Russell <rusty@rustcorp.com.au>, linux-kernel@vger.kernel.org,
	virtualization@lists.linux-foundation.org,
	xen-devel@lists.xensource.com, Anton Blanchard <anton@samba.org>,
	Konrad, Amit Shah <amit.shah@redhat.com>, Waychison <mikew@google.com>,
	ppc-dev <linuxppc-dev@lists.ozlabs.org>, Eric,
	Northrup <digitaleric@google.com>
Subject: [Xen-devel] Re: [PATCH v3 3/3] Use separate struct console
 structure for each hvc_console.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: michael@ellerman.id.au
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1734904774=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============1734904774==
Content-Type: multipart/signed; micalg="pgp-sha1";
	protocol="application/pgp-signature";
	boundary="=-d4UMUQr8j6a6R6ANBKiZ"


--=-d4UMUQr8j6a6R6ANBKiZ
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Tue, 2011-11-08 at 13:45 -0800, Miche Baker-Harvey wrote:
> It is possible to make any virtio_console port be a console
> by sending VIRITO_CONSOLE_CONSOLE_PORT.  But hvc_alloc was
> using a single struct console hvc_console, which contains
> both an index and flags which are per-port.
>=20
> This adds a separate struct console for each virtio_console
> that is CONSOLE_PORT.

Hi Miche,

I'm testing this on powerpc and unfortunately it's working a little _too
well_. I end up with two struct consoles registered and so I get every
line of output twice :)

The problem is that we're registering two struct consoles. The first
obviously is hvc_console, either in hvc_console_init(), or in my case
from hvc_instantiate().

Then we register the allocated one in hvc_alloc(). But because they both
point back to the same hardware you get duplicate output.

We _do_ want to register a console early, in either/both
hvc_console_init() and hvc_instantiate(), because we want to have
console during boot prior to when hvc_alloc() gets called.

I think maybe we should be checking in hvc_alloc() whether we already
have hvc_console associated with the vtermno and if so we use
hvc_console instead of allocating a new one.

Patch below to do that, and works for me, but it's a bit of a hack,
there must be a better solution.

Finally I'm not sure how your patch affects the code in hvc_poll() which
checks hvc_console.index to do the SYSRQ hack.

cheers

diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c
index fff35da..b249195 100644
--- a/drivers/tty/hvc/hvc_console.c
+++ b/drivers/tty/hvc/hvc_console.c
@@ -815,13 +815,15 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int da=
ta,
        kref_init(&hp->kref);
=20
        INIT_WORK(&hp->tty_resize, hvc_set_winsz);
-       /*
-        * Make each console its own struct console.
-        */
-       cp =3D kmemdup(&hvc_console, sizeof(*cp), GFP_KERNEL);
-       if (!cp) {
-               kfree(hp);
-               return ERR_PTR(-ENOMEM);
+
+       if (hvc_console.index >=3D 0 && vtermnos[hvc_console.index] =3D=3D =
hp->vtermno)
+               cp =3D &hvc_console;
+       else {
+               cp =3D kmemdup(&hvc_console, sizeof(*cp), GFP_KERNEL);
+               if (!cp) {
+                       kfree(hp);
+                       return ERR_PTR(-ENOMEM);
+               }
        }
=20
        hp->hvc_console =3D cp;
@@ -850,7 +852,9 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data=
,
=20
        list_add_tail(&(hp->next), &hvc_structs);
        spin_unlock(&hvc_structs_lock);
-       register_console(cp);
+
+       if (cp !=3D &hvc_console)
+               register_console(cp);
=20
        return hp;
 }


--=-d4UMUQr8j6a6R6ANBKiZ
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)

iEYEABECAAYFAk66NDgACgkQdSjSd0sB4dJg5ACgjHqUujtNJ9SiPUAhWVHc6sv7
Y5AAnRuekB5kaSUrzXaxayeTwFqR49UT
=Ticb
-----END PGP SIGNATURE-----

--=-d4UMUQr8j6a6R6ANBKiZ--



--===============1734904774==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1734904774==--



From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:51:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:51:39 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ6JP-0000JV-Ia; Mon, 14 Nov 2011 15:51:39 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO5GZ-0000tH-AO
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 02:20:25 -0800
X-Env-Sender: deepthi@linux.vnet.ibm.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1320834018!844674!1
X-Originating-IP: [32.97.182.145]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17511 invoked from network); 9 Nov 2011 10:20:18 -0000
Received: from e5.ny.us.ibm.com (HELO e5.ny.us.ibm.com) (32.97.182.145)
	by server-8.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 10:20:18 -0000
Received: from /spool/local
	by e5.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only!
	Violators will be prosecuted
	for <xen-devel@lists.xensource.com> from <deepthi@linux.vnet.ibm.com>; 
	Wed, 9 Nov 2011 05:20:15 -0500
Received: from d01relay06.pok.ibm.com ([9.56.227.116])
	by e5.ny.us.ibm.com ([192.168.1.105]) with IBM ESMTP SMTP Gateway:
	Authorized Use Only! Violators will be prosecuted; 
	Wed, 9 Nov 2011 05:19:57 -0500
Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216])
	by d01relay06.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	pA9AJuhU3055826
	for <xen-devel@lists.xensource.com>; Wed, 9 Nov 2011 05:19:56 -0500
Received: from d01av02.pok.ibm.com (loopback [127.0.0.1])
	by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	pA9AJssf011889
	for <xen-devel@lists.xensource.com>; Wed, 9 Nov 2011 08:19:56 -0200
Received: from [9.124.35.218] ([9.124.35.218])
	by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	pA9AJoGt011529; Wed, 9 Nov 2011 08:19:51 -0200
Message-ID: <4EBA53C5.9040603@linux.vnet.ibm.com>
Date: Wed, 09 Nov 2011 15:49:49 +0530
From: Deepthi Dharwar <deepthi@linux.vnet.ibm.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.17) Gecko/20110424 Thunderbird/3.1.10
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
References: <1320786914-10541-1-git-send-email-konrad.wilk@oracle.com>
	<1320786914-10541-2-git-send-email-konrad.wilk@oracle.com>
In-Reply-To: <1320786914-10541-2-git-send-email-konrad.wilk@oracle.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
x-cbid: 11110910-5930-0000-0000-0000011E43AC
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:26 -0800
Cc: len.brown@intel.com, jeremy@goop.org, xen-devel@lists.xensource.com,
	x86@kernel.org, linux-kernel@vger.kernel.org, stable@kernel.org,
	mingo@redhat.com, bp@alien8.de, hpa@zytor.com, tj@kernel.org,
	tglx@linutronix.de, trenn@suse.de
Subject: [Xen-devel] 
 Re: [PATCH 1/3] cpuidle: If disable_cpuidle() is called, set pm_idle
 to default_idle.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wednesday 09 November 2011 02:45 AM, Konrad Rzeszutek Wilk wrote:
> . however we ignore the disable_cpuidle() directive and
> in select_idle_routine() set it to type preferred by the CPU.
> 
> This is a regression introduced by
> 
>  commit a0bfa1373859e9d11dc92561a8667588803e42d8
>  Author: Len Brown <len.brown@intel.com>
>  Date:   Fri Apr 1 19:34:59 2011 -0400
> 
>      cpuidle: stop depending on pm_idle
> 
> specifically this patch:
> 
>  commit d91ee5863b71e8c90eaf6035bff3078a85e2e7b5
>  Author: Len Brown <len.brown@intel.com>
>  Date:   Fri Apr 1 18:28:35 2011 -0400
> 
>      cpuidle: replace xen access to x86 pm_idle and default_idle
> 
>      ..scribble on pm_idle and access default_idle,
>     have it simply disable_cpuidle() so acpi_idle will not load and
>     architecture default HLT will be used.
> 
> .. but the default HLT does not get used. Instead we end up in the
> situation that select_idle_routine() is called from arch/x86/kernel/cpu/common.c
> and if we called cpuidle_disable(), then the pm_idle is not set, and
> we end up setting pm_idle to mwait_idle or amd_e400_idle.
> 
> This patch uses the cpuidle_disabled() functionality and
> makes select_idle_routine() adhere to that.
> 
> Reported-by: Stefan Bader <stefan.bader@canonical.com>
> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> 
> CC: Thomas Gleixner <tglx@linutronix.de>
> CC: Ingo Molnar <mingo@redhat.com>
> CC: "H. Peter Anvin" <hpa@zytor.com>
> CC: x86@kernel.org
> CC: Len Brown <len.brown@intel.com>
> CC: Borislav Petkov <bp@alien8.de>
> CC: Tejun Heo <tj@kernel.org>
> CC: Thomas Renninger <trenn@suse.de>
> CC: stable@kernel.org
> ---
>  arch/x86/kernel/process.c |    5 +++++
>  include/linux/cpuidle.h   |    2 ++
>  2 files changed, 7 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
> index e7e3b01..1f7f8c8 100644
> --- a/arch/x86/kernel/process.c
> +++ b/arch/x86/kernel/process.c
> @@ -14,6 +14,7 @@
>  #include <linux/utsname.h>
>  #include <trace/events/power.h>
>  #include <linux/hw_breakpoint.h>
> +#include <linux/cpuidle.h>
>  #include <asm/cpu.h>
>  #include <asm/system.h>
>  #include <asm/apic.h>
> @@ -587,6 +588,10 @@ void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c)
>  	if (pm_idle)
>  		return;
> 
> +	if (cpuidle_disabled()) {
> +		pm_idle = default_idle;
> +		return;
> +	}


The above check is needed to initialise pm_idle to default_idle if
cpuidle is disabled but this requirement here is Zen specific. 
On other architectures, if cpuidle is disabled on boot then we 
rather would want mwait_idle or amd_e400_idle to be enabled than 
default_idle. Can we make this check Zen specific ? 

...  if(ZEN_ARCH && cpuidle_disabled()) ... 




>  	if (cpu_has(c, X86_FEATURE_MWAIT) && mwait_usable(c)) {
>  		/*
>  		 * One CPU supports mwait => All CPUs supports mwait
> diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h
> index b51629e..123fe9e 100644
> --- a/include/linux/cpuidle.h
> +++ b/include/linux/cpuidle.h
> @@ -122,6 +122,7 @@ struct cpuidle_driver {
>  };
> 
>  #ifdef CONFIG_CPU_IDLE
> +extern int cpuidle_disabled(void);
>  extern void disable_cpuidle(void);
>  extern int cpuidle_idle_call(void);
> 
> @@ -137,6 +138,7 @@ extern int cpuidle_enable_device(struct cpuidle_device *dev);
>  extern void cpuidle_disable_device(struct cpuidle_device *dev);
> 
>  #else
> +static inline int cpuidle_disabled(void) { return 1; }
>  static inline void disable_cpuidle(void) { }
>  static inline int cpuidle_idle_call(void) { return -ENODEV; }
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:52:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:52:30 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ6KE-0000hW-7B; Mon, 14 Nov 2011 15:52:30 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RO5l5-0001qe-6L
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 02:51:55 -0800
X-Env-Sender: deepthi@linux.vnet.ibm.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1320835910!1504072!1
X-Originating-IP: [32.97.110.149]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12829 invoked from network); 9 Nov 2011 10:51:52 -0000
Received: from e31.co.us.ibm.com (HELO e31.co.us.ibm.com) (32.97.110.149)
	by server-13.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Nov 2011 10:51:52 -0000
Received: from /spool/local
	by e31.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only!
	Violators will be prosecuted
	for <xen-devel@lists.xensource.com> from <deepthi@linux.vnet.ibm.com>; 
	Wed, 9 Nov 2011 03:51:50 -0700
Received: from d03relay03.boulder.ibm.com ([9.17.195.228])
	by e31.co.us.ibm.com ([192.168.1.131]) with IBM ESMTP SMTP Gateway:
	Authorized Use Only! Violators will be prosecuted; 
	Wed, 9 Nov 2011 03:51:48 -0700
Received: from d03av03.boulder.ibm.com (d03av03.boulder.ibm.com [9.17.195.169])
	by d03relay03.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	pA9AplLP167874
	for <xen-devel@lists.xensource.com>; Wed, 9 Nov 2011 03:51:47 -0700
Received: from d03av03.boulder.ibm.com (loopback [127.0.0.1])
	by d03av03.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP
	id pA9ApjwR000357
	for <xen-devel@lists.xensource.com>; Wed, 9 Nov 2011 03:51:47 -0700
Received: from [9.124.35.218] ([9.124.35.218])
	by d03av03.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	pA9Apfn5032644; Wed, 9 Nov 2011 03:51:41 -0700
Message-ID: <4EBA5B3B.6010308@linux.vnet.ibm.com>
Date: Wed, 09 Nov 2011 16:21:39 +0530
From: Deepthi Dharwar <deepthi@linux.vnet.ibm.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.17) Gecko/20110424 Thunderbird/3.1.10
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
References: <1320786914-10541-1-git-send-email-konrad.wilk@oracle.com>
	<1320786914-10541-2-git-send-email-konrad.wilk@oracle.com>
	<4EBA53C5.9040603@linux.vnet.ibm.com>
In-Reply-To: <4EBA53C5.9040603@linux.vnet.ibm.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
x-cbid: 11110910-7282-0000-0000-0000038BB558
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:26 -0800
Cc: len.brown@intel.com, jeremy@goop.org, xen-devel@lists.xensource.com,
	x86@kernel.org, linux-kernel@vger.kernel.org, stable@kernel.org,
	mingo@redhat.com, bp@alien8.de, hpa@zytor.com, tj@kernel.org,
	tglx@linutronix.de, trenn@suse.de
Subject: [Xen-devel] 
 Re: [PATCH 1/3] cpuidle: If disable_cpuidle() is called, set pm_idle
 to default_idle.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Just correcting the typo s/zen/xen/g .

On Wednesday 09 November 2011 03:49 PM, Deepthi Dharwar wrote:
> On Wednesday 09 November 2011 02:45 AM, Konrad Rzeszutek Wilk wrote:
>> . however we ignore the disable_cpuidle() directive and
>> in select_idle_routine() set it to type preferred by the CPU.
>>
>> This is a regression introduced by
>>
>>  commit a0bfa1373859e9d11dc92561a8667588803e42d8
>>  Author: Len Brown <len.brown@intel.com>
>>  Date:   Fri Apr 1 19:34:59 2011 -0400
>>
>>      cpuidle: stop depending on pm_idle
>>
>> specifically this patch:
>>
>>  commit d91ee5863b71e8c90eaf6035bff3078a85e2e7b5
>>  Author: Len Brown <len.brown@intel.com>
>>  Date:   Fri Apr 1 18:28:35 2011 -0400
>>
>>      cpuidle: replace xen access to x86 pm_idle and default_idle
>>
>>      ..scribble on pm_idle and access default_idle,
>>     have it simply disable_cpuidle() so acpi_idle will not load and
>>     architecture default HLT will be used.
>>
>> .. but the default HLT does not get used. Instead we end up in the
>> situation that select_idle_routine() is called from arch/x86/kernel/cpu/common.c
>> and if we called cpuidle_disable(), then the pm_idle is not set, and
>> we end up setting pm_idle to mwait_idle or amd_e400_idle.
>>
>> This patch uses the cpuidle_disabled() functionality and
>> makes select_idle_routine() adhere to that.
>>
>> Reported-by: Stefan Bader <stefan.bader@canonical.com>
>> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
>>
>> CC: Thomas Gleixner <tglx@linutronix.de>
>> CC: Ingo Molnar <mingo@redhat.com>
>> CC: "H. Peter Anvin" <hpa@zytor.com>
>> CC: x86@kernel.org
>> CC: Len Brown <len.brown@intel.com>
>> CC: Borislav Petkov <bp@alien8.de>
>> CC: Tejun Heo <tj@kernel.org>
>> CC: Thomas Renninger <trenn@suse.de>
>> CC: stable@kernel.org
>> ---
>>  arch/x86/kernel/process.c |    5 +++++
>>  include/linux/cpuidle.h   |    2 ++
>>  2 files changed, 7 insertions(+), 0 deletions(-)
>>
>> diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
>> index e7e3b01..1f7f8c8 100644
>> --- a/arch/x86/kernel/process.c
>> +++ b/arch/x86/kernel/process.c
>> @@ -14,6 +14,7 @@
>>  #include <linux/utsname.h>
>>  #include <trace/events/power.h>
>>  #include <linux/hw_breakpoint.h>
>> +#include <linux/cpuidle.h>
>>  #include <asm/cpu.h>
>>  #include <asm/system.h>
>>  #include <asm/apic.h>
>> @@ -587,6 +588,10 @@ void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c)
>>  	if (pm_idle)
>>  		return;
>>
>> +	if (cpuidle_disabled()) {
>> +		pm_idle = default_idle;
>> +		return;
>> +	}
> 
> 
> The above check is needed to initialise pm_idle to default_idle if
> cpuidle is disabled but this requirement here is xen specific. 
> On other architectures, if cpuidle is disabled on boot then we 
> rather would want mwait_idle or amd_e400_idle to be enabled than 
> default_idle. Can we make this check xen specific ? 
> 
> ...  if(XEN_ARCH && cpuidle_disabled()) ... 
> 
> 
> 
> 
>>  	if (cpu_has(c, X86_FEATURE_MWAIT) && mwait_usable(c)) {
>>  		/*
>>  		 * One CPU supports mwait => All CPUs supports mwait
>> diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h
>> index b51629e..123fe9e 100644
>> --- a/include/linux/cpuidle.h
>> +++ b/include/linux/cpuidle.h
>> @@ -122,6 +122,7 @@ struct cpuidle_driver {
>>  };
>>
>>  #ifdef CONFIG_CPU_IDLE
>> +extern int cpuidle_disabled(void);
>>  extern void disable_cpuidle(void);
>>  extern int cpuidle_idle_call(void);
>>
>> @@ -137,6 +138,7 @@ extern int cpuidle_enable_device(struct cpuidle_device *dev);
>>  extern void cpuidle_disable_device(struct cpuidle_device *dev);
>>
>>  #else
>> +static inline int cpuidle_disabled(void) { return 1; }
>>  static inline void disable_cpuidle(void) { }
>>  static inline int cpuidle_idle_call(void) { return -ENODEV; }
>>
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:53:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:53:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ6L9-00017x-3m; Mon, 14 Nov 2011 15:53:27 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1ROP6M-00040D-52
	for xen-devel@lists.xensource.com; Wed, 09 Nov 2011 23:31:11 -0800
X-Env-Sender: lczerner@redhat.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1320910266!2544729!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6884 invoked from network); 10 Nov 2011 07:31:06 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-9.tower-182.messagelabs.com with SMTP;
	10 Nov 2011 07:31:06 -0000
Received: from int-mx01.intmail.prod.int.phx2.redhat.com
	(int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id pAA7V4V8000627
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 10 Nov 2011 02:31:05 -0500
Received: from dhcp-1-248.brq.redhat.com (dhcp-1-248.brq.redhat.com
	[10.34.1.248])
	by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id pAA7V2Y2029013
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 10 Nov 2011 02:31:03 -0500
Date: Thu, 10 Nov 2011 08:31:01 +0100 (CET)
From: Lukas Czerner <lczerner@redhat.com>
X-X-Sender: lukas@dhcp-27-109.brq.redhat.com
To: Li Dongyang <lidongyang@novell.com>
Subject: Re: [Xen-devel] [PATCH] xen-blkback: convert hole punching to discard
	request on loop devices
In-Reply-To: <CAKH3R48pwdciySkzTnzV3GKBNmBJOEb-PUA3JTTCM2VNkww-KQ@mail.gmail.com>
Message-ID: <alpine.LFD.2.00.1111100822420.5081@dhcp-27-109.brq.redhat.com>
References: <1320654866-12457-1-git-send-email-lidongyang@novell.com>
	<20111108162614.GA18361@phenom.dumpdata.com>
	<CAKH3R48ni0GeginUZCvQvwOf6e1oaEC_hfGD+BjKkw7dKD6YFg@mail.gmail.com>
	<CAKH3R48pwdciySkzTnzV3GKBNmBJOEb-PUA3JTTCM2VNkww-KQ@mail.gmail.com>
User-Agent: Alpine 2.00 (LFD 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: MULTIPART/MIXED; BOUNDARY="8323328-1947163460-1320910264=:5081"
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:28 -0800
Cc: lczerner@redhat.com, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.

--8323328-1947163460-1320910264=:5081
Content-Type: TEXT/PLAIN; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT

On Thu, 10 Nov 2011, Li Dongyang wrote:

> What am bit not sure is the secure_discard, since you've added the
> sec_discard to your tree,
> I'm wondering if we should treat hole punching as a secure discard to guest.
> Lukas, why u didn't add QUEUE_FLAG_SECDISCARD in your commit? is there
> something need to
> do with loop driver to have that flag? Thanks

Hi,

IIRC secure discard is almost the same as the "regular" discard, except
all sectors previously used for this data (moved by garbage collector)
are discarded as well. That is something only hardware can do, so I do
not think we should support this in loop driver. We would not be doing
anything different from "regular" discard anyway - that means just send
punch hole to the file system.

So I think that there is no reason secure discard should be supported by
loop driver, since there is nothing more "secure" about it.

Thanks!
-Lukas

> 
> On Wed, Nov 9, 2011 at 5:17 PM, Li Dongyang <lidongyang@novell.com> wrote:
> > On Wed, Nov 9, 2011 at 12:26 AM, Konrad Rzeszutek Wilk
> > <konrad.wilk@oracle.com> wrote:
> >> On Mon, Nov 07, 2011 at 04:34:26PM +0800, Li Dongyang wrote:
> >>> As of dfaa2ef68e80c378e610e3c8c536f1c239e8d3ef, loop devices support
> >>> discard request now. We could just issue a discard request, and
> >>> the loop driver will punch the hole for us, so we don't need to touch
> >>> the internals of loop device and punch the hole ourselves, Thanks.
> >>
> >> Can I ask you to do two things:
> >>  1). Look in whether we can just eliminate the BLKIF_BACKEND_FILE altogether?
> > I think we still need that flag, as for other type of backing dev, we
> > will figure it out and send back a EOPNOTSUPP.
> >>  2). Rebase this on top #devel/for-jens-3.3 (git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git)
> > no problem
> >>
> >> Thanks!
> >>>
> >>> Signed-off-by: Li Dongyang <lidongyang@novell.com>
> >>> ---
> >>>  drivers/block/xen-blkback/blkback.c |   21 +++------------------
> >>>  1 files changed, 3 insertions(+), 18 deletions(-)
> >>>
> >>> diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
> >>> index 15ec4db..ad365a7 100644
> >>> --- a/drivers/block/xen-blkback/blkback.c
> >>> +++ b/drivers/block/xen-blkback/blkback.c
> >>> @@ -39,9 +39,6 @@
> >>>  #include <linux/list.h>
> >>>  #include <linux/delay.h>
> >>>  #include <linux/freezer.h>
> >>> -#include <linux/loop.h>
> >>> -#include <linux/falloc.h>
> >>> -#include <linux/fs.h>
> >>>
> >>>  #include <xen/events.h>
> >>>  #include <xen/page.h>
> >>> @@ -422,25 +419,13 @@ static void xen_blk_discard(struct xen_blkif *blkif, struct blkif_request *req)
> >>>       int status = BLKIF_RSP_OKAY;
> >>>       struct block_device *bdev = blkif->vbd.bdev;
> >>>
> >>> -     if (blkif->blk_backend_type == BLKIF_BACKEND_PHY)
> >>> -             /* just forward the discard request */
> >>> +     if (blkif->blk_backend_type == BLKIF_BACKEND_PHY ||
> >>> +         blkif->blk_backend_type == BLKIF_BACKEND_FILE)
> >>>               err = blkdev_issue_discard(bdev,
> >>>                               req->u.discard.sector_number,
> >>>                               req->u.discard.nr_sectors,
> >>>                               GFP_KERNEL, 0);
> >>> -     else if (blkif->blk_backend_type == BLKIF_BACKEND_FILE) {
> >>> -             /* punch a hole in the backing file */
> >>> -             struct loop_device *lo = bdev->bd_disk->private_data;
> >>> -             struct file *file = lo->lo_backing_file;
> >>> -
> >>> -             if (file->f_op->fallocate)
> >>> -                     err = file->f_op->fallocate(file,
> >>> -                             FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE,
> >>> -                             req->u.discard.sector_number << 9,
> >>> -                             req->u.discard.nr_sectors << 9);
> >>> -             else
> >>> -                     err = -EOPNOTSUPP;
> >>> -     } else
> >>> +     else
> >>>               err = -EOPNOTSUPP;
> >>>
> >>>       if (err == -EOPNOTSUPP) {
> >>> --
> >>> 1.7.7
> >>>
> >>>
> >>> _______________________________________________
> >>> Xen-devel mailing list
> >>> Xen-devel@lists.xensource.com
> >>> http://lists.xensource.com/xen-devel
> >>
> >
> 

-- 
--8323328-1947163460-1320910264=:5081
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--8323328-1947163460-1320910264=:5081--


From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:54:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:54:16 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ6Lv-0001XL-F8; Mon, 14 Nov 2011 15:54:15 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROVez-0005Ya-8J
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 06:31:21 -0800
X-Env-Sender: Bob.Jung@mandiant.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1320935477!3032054!1
X-Originating-IP: [165.212.64.22]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24307 invoked from network); 10 Nov 2011 14:31:18 -0000
Received: from gateout02.mbox.net (HELO gateout02.mbox.net) (165.212.64.22)
	by server-5.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 14:31:18 -0000
Received: from gateout02.mbox.net (gwo2-lo [127.0.0.1])
	by gateout02.mbox.net (Postfix) with ESMTP id 70DA44BD65D
	for <xen-devel@lists.xensource.com>;
	Thu, 10 Nov 2011 14:31:16 +0000 (GMT)
X-USANET-Received: from gateout02.mbox.net [127.0.0.1] by gateout02.mbox.net
	via mtad (C8.MAIN.3.72B) 
	with ESMTP id 883PkJofo6080Mo2; Thu, 10 Nov 2011 14:31:14 -0000
Received: from S1HUB5.EXCHPROD.USA.NET [165.212.120.254] by gateout02.mbox.net
	via smtad (C8.MAIN.3.72B) 
	with ESMTPS id XID799PkJofo6974Xo2; Thu, 10 Nov 2011 14:31:14 -0000
X-USANET-Source: 165.212.120.254 IN Bob.Jung@mandiant.com
	S1HUB5.EXCHPROD.USA.NET
X-USANET-MsgId: XID799PkJofo6974Xo2
Received: from MBX3.EXCHPROD.USA.NET ([10.120.221.32]) by
	S1HUB5.EXCHPROD.USA.NET ([10.120.220.35]) with mapi; Thu, 10 Nov 2011
	14:31:10 +0000
From: Bob Jung <Bob.Jung@mandiant.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Thu, 10 Nov 2011 14:31:09 +0000
Thread-Topic: programmatic breakpoint for a guest?
Thread-Index: AcyftWPLW27kwvRDSpi9xgzMaicvYw==
Message-ID: <292208AB-4390-495B-8D33-604D0554FFA6@mandiant.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:30 -0800
Subject: [Xen-devel] programmatic breakpoint for a guest?
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com




Hi there,

Sorry I'm not sure if this is the correct mailing list for this question - =
I already tried tools and didn't get any replies - please let me know if I =
should repost somewhere else.  =20


Anyways, I've been using some of the API's in libxc to look at memory of a =
guest using the *xc_interface functions.

I was wondering - is there a way using libxc or some other api's to set and=
 respond to breakpoints on a guest vm?  If so are there any examples out th=
ere?  The ability to single step would also be useful in my situation. =20

Note - I'm NOT talking about connecting to a guest with a gdb client - I wa=
nt to do this programmatically

Thanks!
-Bob=

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:55:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:55:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ6Mz-0001xh-FW; Mon, 14 Nov 2011 15:55:21 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROcEc-0005r5-Pb
	for xen-devel@lists.xensource.com; Thu, 10 Nov 2011 13:32:35 -0800
X-Env-Sender: oor@cs.cmu.edu
X-Msg-Ref: server-11.tower-27.messagelabs.com!1320960737!45172521!1
X-Originating-IP: [128.2.217.198]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19740 invoked from network); 10 Nov 2011 21:32:18 -0000
Received: from smtp03.srv.cs.cmu.edu (HELO smtp03.srv.cs.cmu.edu)
	(128.2.217.198)
	by server-11.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Nov 2011 21:32:18 -0000
Received: from webmail.cs.cmu.edu (TOMENTOSA.SRV.CS.CMU.EDU [128.2.172.30])
	by smtp03.srv.cs.cmu.edu (8.13.6/8.13.6) with ESMTP id pAALWSX2022172
	for <xen-devel@lists.xensource.com>;
	Thu, 10 Nov 2011 16:32:28 -0500 (EST)
Received: from 128.2.134.97
	(SquirrelMail authenticated user oor/mail@CS.CMU.EDU)
	by webmail.cs.cmu.edu with HTTP;
	Thu, 10 Nov 2011 16:32:28 -0500 (EST)
Message-ID: <50434.128.2.134.97.1320960748.squirrel@webmail.cs.cmu.edu>
Date: Thu, 10 Nov 2011 16:32:28 -0500 (EST)
From: "Olatunji Ruwase" <oor@cs.cmu.edu>
To: xen-devel@lists.xensource.com
User-Agent: SquirrelMail/1.5.1
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: 8bit
References: 
In-Reply-To: 
X-Scanned-By: mimedefang-cmuscs on 128.2.217.198
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:34 -0800
Subject: [Xen-devel] Trapping I/O accesses of a driver domain
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi,
 I am a graduate student working on dynamic correctness checking of kernel
 mode device drivers. I want to detect/trap accesses from a Linux driver
 to device accessible locations (e.g ioremap'd, dma_* locations), and
 I am exploring the possibility of using Xen for this. I am using x86 PV
 Xen-3.3 with a dom0 and driver domU both running linux-2.6.18-xen. For
 various reasons HVM Xen is not suitable for my work.

 The idea is to use page faults to detect the I/O accesses of the driver
 by marking the affected pages not present in the page tables. For
 ioremap'd pages, this seems pretty straightforward since the ptes are
 marked with _PAGE_IO before they are passed to Xen. And so it seems
 modifying do_mmu_update () to detect and mark such ptes not present should
 work. Is this a reasonable approach ?.

 Detecting accesses to dma mapped (dma_alloc_coherent, dma_map_single)
 locations seems more difficult because, as far as I can tell there is no
 hypercall informing Xen that the locations are used for I/O. I am probably
 misunderstanding how this works and would appreciate clarifications.

 Thank you,

tunji








_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:56:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:56:42 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ6OH-0002NT-Rx; Mon, 14 Nov 2011 15:56:41 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1ROpUq-0000iN-V4
	for xen-devel@lists.xensource.com; Fri, 11 Nov 2011 03:42:13 -0800
X-Env-Sender: deepthi@linux.vnet.ibm.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1321011611!43951037!1
X-Originating-IP: [32.97.110.149]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5061 invoked from network); 11 Nov 2011 11:40:12 -0000
Received: from e31.co.us.ibm.com (HELO e31.co.us.ibm.com) (32.97.110.149)
	by server-14.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 11 Nov 2011 11:40:12 -0000
Received: from /spool/local
	by e31.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only!
	Violators will be prosecuted
	for <xen-devel@lists.xensource.com> from <deepthi@linux.vnet.ibm.com>; 
	Fri, 11 Nov 2011 04:42:08 -0700
Received: from d03relay01.boulder.ibm.com ([9.17.195.226])
	by e31.co.us.ibm.com ([192.168.1.131]) with IBM ESMTP SMTP Gateway:
	Authorized Use Only! Violators will be prosecuted; 
	Fri, 11 Nov 2011 04:42:06 -0700
Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170])
	by d03relay01.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	pABBg2Js216248
	for <xen-devel@lists.xensource.com>; Fri, 11 Nov 2011 04:42:02 -0700
Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1])
	by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP
	id pABBg04Z008879
	for <xen-devel@lists.xensource.com>; Fri, 11 Nov 2011 04:42:01 -0700
Received: from [9.77.207.241] ([9.77.207.241])
	by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	pABBfrYt008224; Fri, 11 Nov 2011 04:41:54 -0700
Message-ID: <4EBD09FF.4030002@linux.vnet.ibm.com>
Date: Fri, 11 Nov 2011 17:11:51 +0530
From: Deepthi Dharwar <deepthi@linux.vnet.ibm.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.17) Gecko/20110424 Thunderbird/3.1.10
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
References: <1320786914-10541-1-git-send-email-konrad.wilk@oracle.com>
	<1320786914-10541-2-git-send-email-konrad.wilk@oracle.com>
	<4EBA53C5.9040603@linux.vnet.ibm.com>
	<20111109144440.GB8410@phenom.dumpdata.com>
In-Reply-To: <20111109144440.GB8410@phenom.dumpdata.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
x-cbid: 11111111-7282-0000-0000-000003A87345
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:26 -0800
Cc: len.brown@intel.com, jeremy@goop.org, xen-devel@lists.xensource.com,
	x86@kernel.org, linux-kernel@vger.kernel.org, stable@kernel.org,
	mingo@redhat.com, bp@alien8.de, hpa@zytor.com, tj@kernel.org,
	tglx@linutronix.de, trenn@suse.de
Subject: [Xen-devel] 
 Re: [PATCH 1/3] cpuidle: If disable_cpuidle() is called, set pm_idle
 to default_idle.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com



On Wednesday 09 November 2011 08:14 PM, Konrad Rzeszutek Wilk wrote:
> . snip..
>>>
>>>      ..scribble on pm_idle and access default_idle,
>>>     have it simply disable_cpuidle() so acpi_idle will not load and
>>>     architecture default HLT will be used.
>>>
>>> .. but the default HLT does not get used. Instead we end up in the
> 
> Hey Deepthi,
> 
>>> +	if (cpuidle_disabled()) {
>>> +		pm_idle = default_idle;
>>> +		return;
>>> +	}
>>
>>
>> The above check is needed to initialise pm_idle to default_idle if
>> cpuidle is disabled but this requirement here is Zen specific. 
>> On other architectures, if cpuidle is disabled on boot then we 
>> rather would want mwait_idle or amd_e400_idle to be enabled than 
>> default_idle. Can we make this check Zen specific ? 
> 
> We do? Why? I would have thought that if you want to disable the cpuidle
> you would want the default_idle. 

Well I was with a view that if cpuidle is disabled, mwait and arm_e400
would take precedence over default_idle. But if is ok to have default_idle instead,
then go ahead. 

> Perhaps there is another way do this is:
> 
> diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
> index becd6d9..04b10a4 100644
> --- a/drivers/cpuidle/cpuidle.c
> +++ b/drivers/cpuidle/cpuidle.c
> @@ -38,6 +38,7 @@ int cpuidle_disabled(void)
>  void disable_cpuidle(void)
>  {
>  	off = 1;
> +	pm_idle = default_idle;
>  }
> 
Brining pm_idle pointer back to cpuidle code is going a step back coz
we wanted to complete remove using pm_idle going forward. As having 
a pointer exported into various files is not a good thing. That's the 
reason we started the clean up in the first place :) 

> which would do almost the same thing as this patch (well, except
> that if you run cpuidle.off=1 you still end up with amd_e400_idle
> instead of default_idle, so it is not the complete solution).
> 
>>
>> ...  if(ZEN_ARCH && cpuidle_disabled()) ... 
> 
> That would not work very well. For one thing you would need to call
> 'xen_domain()', and pull in a lots of header files. Second of, it
> looks quite ugly and kernel folks like pretty code.
> 
Yes, I agree to this. 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 15:57:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 15:57:59 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ6PX-0002uJ-8H; Mon, 14 Nov 2011 15:57:59 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RPr6q-0005wa-7K
	for xen-devel@lists.xensource.com; Sun, 13 Nov 2011 23:37:40 -0800
X-Env-Sender: r.marek@assembler.cz
X-Msg-Ref: server-16.tower-216.messagelabs.com!1321256255!3375314!1
X-Originating-IP: [82.208.32.68]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26588 invoked from network); 14 Nov 2011 07:37:35 -0000
Received: from ms.trustica.cz (HELO ms.trustica.cz) (82.208.32.68)
	by server-16.tower-216.messagelabs.com with SMTP;
	14 Nov 2011 07:37:35 -0000
Received: from localhost (localhost [127.0.0.1])
	by ms.trustica.cz (Postfix) with ESMTP id 9A87D33A53F;
	Mon, 14 Nov 2011 08:37:34 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at ms.trustica.cz
X-Spam-Flag: NO
X-Spam-Score: -4.058
X-Spam-Level: 
X-Spam-Status: No, score=-4.058 tagged_above=-500 required=3.8
	tests=[ALL_TRUSTED=-1.8, AWL=0.341, BAYES_00=-2.599]
Received: from ms.trustica.cz ([127.0.0.1])
	by localhost (ms.trustica.cz [127.0.0.1]) (amavisd-new, port 10024)
	with ESMTP id XNiGWpAC6LVY; Mon, 14 Nov 2011 08:37:34 +0100 (CET)
Received: from [192.168.37.253] (ip-85-160-81-133.eurotel.cz [85.160.81.133])
	(Authenticated sender: r.marek@assembler.cz)
	by ms.trustica.cz (Postfix) with ESMTPSA id 6B96433A4E2;
	Mon, 14 Nov 2011 08:37:21 +0100 (CET)
Message-ID: <4EC0C529.8010701@assembler.cz>
Date: Mon, 14 Nov 2011 08:37:13 +0100
From: Rudolf Marek <r.marek@assembler.cz>
User-Agent: Mozilla/5.0 (X11; Linux i686;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: Julian Pidancet <julian.pidancet@gmail.com>
References: <71d1cedea5b7f4c303c1b0d2a6e8c1520e843776.1321235039.git.julian.pidancet@gmail.com>
	<20111114011136.GA22894@morn.localdomain>
	<CAKZ=5EX7EvWLC=yASOy-Jn+aZoBpp+KwxAiNaEL5vguz86_=YA@mail.gmail.com>
	<20111114020948.GA27111@morn.localdomain>
	<CAKZ=5EXTweprSr+e_cDF0BJfs-orBr9h8hoKLiSJNVT4uE_utg@mail.gmail.com>
	<20111114033618.GA30104@morn.localdomain>
In-Reply-To: <20111114033618.GA30104@morn.localdomain>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:35 -0800
Cc: Kevin O'Connor <kevin@koconnor.net>, seabios@seabios.org,
	xen-devel@lists.xensource.com, ian.campbell@citrix.com
Subject: [Xen-devel] Re: [SeaBIOS] [PATCH] SeaBIOS/Xen: Compute the low RAM
 memory size in the BDA according to the e820
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> Unfortunately, there aren't very many places to put a hardcoded
> address.  The safest thing is probably to dynamically generate an SSDT
> with a pointer - then the DSDT can use the pointer instead of a
> hardcoded address.  This is more work, however.

You can even create an "OEM" ACPI table, with std ACPI header, but with custom 
data inside. OS will ignore it and as bonus you will have it with checksum.

Thanks
Rudolf

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 16:36:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 16:36:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ70V-0004SX-Nz; Mon, 14 Nov 2011 16:36:11 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RPvCs-0001tf-9B; Mon, 14 Nov 2011 04:00:18 -0800
X-Env-Sender: mail.baruchi@gmail.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1321271888!44232761!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 926 invoked from network); 14 Nov 2011 11:58:09 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Nov 2011 11:58:09 -0000
Received: by vcbfk13 with SMTP id fk13so7427299vcb.30
	for <multiple recipients>; Mon, 14 Nov 2011 04:00:05 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:content-type:content-transfer-encoding;
	bh=ZkARXBMk9koOjjO3yjOvP1F0XIUzUyY+LCnKlh2HMr0=;
	b=GMF0WHsAiFwsoGlDim3qADPn0brKyS3X0URDNLJZUf/TmjX5v6XOEGh+Dx6WU0rwSW
	y5Kw8+zw9cYXaVIqVI8j/VA/U067l4aUDJgNTpZoTViO8bhRE5qYnEIZpXA8uc0UMM1p
	XDtyxmGlzHB51CpxGzXItsNpbiv84GFrgdqIo=
MIME-Version: 1.0
Received: by 10.52.33.239 with SMTP id u15mr33908394vdi.49.1321272005400; Mon,
	14 Nov 2011 04:00:05 -0800 (PST)
Received: by 10.52.187.103 with HTTP; Mon, 14 Nov 2011 04:00:05 -0800 (PST)
In-Reply-To: <CAAiDW_SQ+UnVK1Xvwk1S_24tf9BcC5BEH0WcMC104R32c1_4TQ@mail.gmail.com>
References: <CAAiDW_SQ+UnVK1Xvwk1S_24tf9BcC5BEH0WcMC104R32c1_4TQ@mail.gmail.com>
Date: Mon, 14 Nov 2011 10:00:05 -0200
Message-ID: <CAAiDW_TnnDs01ELaZ_gnjX6HbYnciQEeXCPex02rezuYnyKRig@mail.gmail.com>
From: Artur Baruchi <mail.baruchi@gmail.com>
To: Xen-devel@lists.xensource.com, xen-users <Xen-users@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:33 -0800
Cc: 
Subject: [Xen-devel] Re: Module Error
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hello Guys.


Just to know. I found a workaround for this issue.

I don't know why, but when running my device driver in a system with
more than 2 cpus AND running with xen kernel, the driver hangs. The
workaround consist in limiting the amount of CPUs during the boot:

    kernel /xen.gz vgamode=3D0x317 vgamode=3D0x317 vgamode=3D0x317
vgamode=3D0x317 maxcpus=3D2

After that, the module could run without problems.

Thanks in advance.

Att.
Artur Baruchi




On Sun, Oct 30, 2011 at 7:16 PM, Artur Baruchi <mail.baruchi@gmail.com> wro=
te:
> Hi.
>
> Im writing a kernel module to extract some information from kernel,
> the module is working really fine in an AMD (AMD Athlon(tm) 64 X2 Dual
> Core Processor 3800+), but, when trying to run the module in a i7
> (Intel(R) Core(TM) i7 CPU 930 @ 2.80GHz) Im facing some strange errors
> (see below). The kernel versions are just the same on both machines
> (2.6.34.10-0.2-xen #1 SMP x86_64 x86_64 x86_64 GNU/Linux). The
> difference are the amount of memory AND processor vendor. I noted that
> the line of code that hangs my machine is this one:
>
> if(end->host=3D=3DNULL) {
>
> The end->host points to an Inode type (end is an address_space type).
> If I remove this line, the module works (but, obviously, do not return
> what I want). I tried the same code in a kernel without xen
> (2.6.34.10-0.2-desktop #1 SMP x86_64 x86_64 x86_64 GNU/Linux) and
> worked fine, so I suppose that this error is due to something in Xen
> running in a intel processor (I tried the module in an intel quad, and
> got the same error). Follow some outputs:
>
> The error stack:
> Oct 28 23:40:35 goku kernel: [ 4472.129718] BUG: unable to handle
> kernel paging request at 000003d600000004
> Oct 28 23:40:35 goku kernel: [ 4472.129933] IP: [<ffffffffa08d118c>]
> get_files+0x6c/0x220 [pagecache]
> Oct 28 23:40:35 goku kernel: [ 4472.130098] PGD 0
> Oct 28 23:40:35 goku kernel: [ 4472.130250] Oops: 0000 [#4] SMP
> Oct 28 23:40:35 goku kernel: [ 4472.130452] last sysfs file:
> /sys/devices/system/cpu/cpu7/online
> Oct 28 23:40:35 goku kernel: [ 4472.130562] CPU 0
> Oct 28 23:40:35 goku kernel: [ 4472.130615] Modules linked in:
> pagecache ocfs2_dlmfs ocfs2_stack_o2cb ocfs2_dlm ocfs2_nodemanager
> ocfs2_stackglue configfs drbd crc32c libcrc32c bridge stp llc nfsd
> lockd nfs_acl snd_pcm_oss auth_rpcgss snd_mixer_oss usbbk gntdev netbk
> blkbk blkback_pagemap blktap domctl xenbus_be snd_seq evtchn
> snd_seq_device sunrpc exportfs edd fuse loop snd_hda_codec_realtek
> firewire_ohci snd_hda_intel firewire_core snd_hda_codec crc_itu_t
> snd_hwdep snd_pcm snd_timer ohci1394 iTCO_wdt snd soundcore sr_mod
> xhci_hcd ieee1394 i2c_i801 iTCO_vendor_support pcspkr snd_page_alloc
> sg r8169 wmi serio_raw ext4 jbd2 crc16 linear uhci_hcd sd_mod nouveau
> ehci_hcd ttm drm_kms_helper usbcore drm agpgart i2c_algo_bit i2c_core
> button dm_snapshot dm_mod xenblk cdrom xennet fan processor ata_piix
> ahci pata_jmicron ata_generic libata scsi_mod thermal thermal_sys
> hwmon
> Oct 28 23:40:35 goku kernel: [ 4472.132037]
> Oct 28 23:40:35 goku kernel: [ 4472.132037] Pid: 4641, comm: cat
> Tainted: G =A0 =A0 =A0D =A0 =A02.6.34.10-0.2-xen #1 X58A-UD3R/X58A-UD3R
> Oct 28 23:40:35 goku kernel: [ 4472.132037] RIP:
> e030:[<ffffffffa08d118c>] =A0[<ffffffffa08d118c>] get_files+0x6c/0x220
> [pagecache]
> Oct 28 23:40:35 goku kernel: [ 4472.132037] RSP: e02b:ffff8801ded93c88
> =A0EFLAGS: 00010246
> Oct 28 23:40:35 goku kernel: [ 4472.132037] RAX: 8000000004000400 RBX:
> ffff8801e8ea5bd0 RCX: 0000000000000001
> Oct 28 23:40:35 goku kernel: [ 4472.132037] RDX: ffff8801efc8c7e8 RSI:
> ffffffffa08d15c0 RDI: ffff8801e8ea4c28
> Oct 28 23:40:35 goku kernel: [ 4472.132037] RBP: 0000000000000001 R08:
> ffff8801eed81e00 R09: 0000000000000000
> Oct 28 23:40:35 goku kernel: [ 4472.132037] R10: ffff8801e8ea5c00 R11:
> 0000000000000000 R12: 00000000001e6000
> Oct 28 23:40:35 goku kernel: [ 4472.132037] R13: 0000000006a50000 R14:
> ffff8801e8ea5b88 R15: 000003d600000004
> Oct 28 23:40:35 goku kernel: [ 4472.132037] FS:
> 00007fcb81c3b700(0000) GS:ffff88000200b000(0000)
> knlGS:0000000000000000
> Oct 28 23:40:35 goku kernel: [ 4472.132037] CS: =A0e033 DS: 0000 ES:
> 0000 CR0: 0000000080050033
> Oct 28 23:40:35 goku kernel: [ 4472.132037] CR2: 000003d600000004 CR3:
> 00000001edecf000 CR4: 0000000000002660
> Oct 28 23:40:35 goku kernel: [ 4472.132037] DR0: 0000000000000000 DR1:
> 0000000000000000 DR2: 0000000000000000
> Oct 28 23:40:35 goku kernel: [ 4472.132037] DR3: 0000000000000000 DR6:
> 00000000ffff0ff0 DR7: 0000000000000400
> Oct 28 23:40:35 goku kernel: [ 4472.132037] Process cat (pid: 4641,
> threadinfo ffff8801ded92000, task ffff8801eedfa780)
> Oct 28 23:40:35 goku kernel: [ 4472.132037] Stack:
> Oct 28 23:40:35 goku kernel: [ 4472.132037] =A00000000101baa5b4
> 0000000200000002 0000000000000000 ffff8801f16ffae8
> Oct 28 23:40:35 goku kernel: [ 4472.132037] <0> 0000000000000000
> ffff8801ee7c6500 ffff8801efd32bc0 ffff8801e45de2d0
> Oct 28 23:40:35 goku kernel: [ 4472.132037] <0> ffff8801ee7c6500
> ffff8801f05d80f8 ffffffff801314f0 ffffffffa08d1349
> Oct 28 23:40:35 goku kernel: [ 4472.132037] Call Trace:
> Oct 28 23:40:35 goku kernel: [ 4472.132037] =A0[<ffffffffa08d1349>]
> cache_open+0x9/0x20 [pagecache]
> Oct 28 23:40:35 goku kernel: [ 4472.132037] =A0[<ffffffff8016c529>]
> proc_reg_open+0xb9/0x240
> Oct 28 23:40:35 goku kernel: [ 4472.132037] =A0[<ffffffff8011060b>]
> __dentry_open+0xeb/0x340
> Oct 28 23:40:35 goku kernel: [ 4472.132037] =A0[<ffffffff801206a8>]
> finish_open+0xe8/0x1c0
> Oct 28 23:40:35 goku kernel: [ 4472.132037] =A0[<ffffffff80120f40>]
> do_filp_open+0x1a0/0x630
> Oct 28 23:40:35 goku kernel: [ 4472.132037] =A0[<ffffffff8011214a>]
> do_sys_open+0x6a/0x140
> Oct 28 23:40:35 goku kernel: [ 4472.132037] =A0[<ffffffff80007438>]
> system_call_fastpath+0x16/0x1b
> Oct 28 23:40:35 goku kernel: [ 4472.132037] =A0[<00007fcb817a7130>] 0x7fc=
b817a7130
> Oct 28 23:40:35 goku kernel: [ 4472.132037] Code: 03 05 69 9d f9 df 4c
> 8b 78 18 4d 85 ff 0f 84 9c 00 00 00 41 f6 c7 01 0f 85 92 00 00 00 48
> 8b 00 a9 00 00 02 00 0f 85 84 00 00 00 <49> 8b 1f 48 85 db 0f 84 78 00
> 00 00 48 83 7b 40 00 74 71 4c 8b
> Oct 28 23:40:35 goku kernel: [ 4472.132037] RIP =A0[<ffffffffa08d118c>]
> get_files+0x6c/0x220 [pagecache]
> Oct 28 23:40:35 goku kernel: [ 4472.132037] =A0RSP <ffff8801ded93c88>
> Oct 28 23:40:35 goku kernel: [ 4472.132037] CR2: 000003d600000004
> Oct 28 23:40:35 goku kernel: [ 4472.143966] ---[ end trace a998217447e12d=
1d ]---
>
> Peace of code (simplified):
> int init_module () {
>
> =A0 =A0 =A0 =A0unsigned long pfn;
> =A0 =A0 =A0 =A0struct inode *ino;
> =A0 =A0 =A0 =A0unsigned char * c;
> =A0 =A0 =A0 =A0struct address_space *end;
> =A0 =A0 =A0 =A0struct dentry *dentry;
> =A0 =A0 =A0 =A0int fl;
>
> =A0 =A0 =A0 =A0struct filepage * temp;
> =A0 =A0 =A0 =A0struct filepage *pos;
>
> =A0 =A0 =A0 =A0for (pfn =3D 0; pfn < num_physpages; pfn++) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct page *page;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (!pfn_valid(pfn))
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0continue;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0page =3D pfn_to_page(pfn);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if((page->=
mapping!=3DNULL) && (!PageAnon(page)) && (!PageSwapCache(page))) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0end =3D page->mapping;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0if(end->host=3D=3DNULL) { =A0<- without this line, n=
o hangs, but the
> module returns wrong data to me...
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0printk(KERN_INFO "Cool... found an v=
alid inode \n");
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0}
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0}
>
> =A0 =A0 =A0 =A0}
> return 0;
> }
>
> Thanks in advance.
>
> Att.
> Artur Baruchi
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 16:38:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 16:38:00 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ72F-0004rL-6D; Mon, 14 Nov 2011 16:37:59 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ27B-0005TK-OM
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 11:22:47 -0800
X-Env-Sender: nhorman@tuxdriver.com
X-Msg-Ref: server-16.tower-174.messagelabs.com!1321298560!1534439!1
X-Originating-IP: [70.61.120.58]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10413 invoked from network); 14 Nov 2011 19:22:41 -0000
Received: from charlotte.tuxdriver.com (HELO smtp.tuxdriver.com) (70.61.120.58)
	by server-16.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Nov 2011 19:22:41 -0000
Received: from hmsreliant.think-freely.org
	([2001:470:8:a08:7aac:c0ff:fec2:933b] helo=localhost)
	by smtp.tuxdriver.com with esmtpsa (TLSv1:AES128-SHA:128) (Exim 4.63)
	(envelope-from <nhorman@tuxdriver.com>)
	id 1RQ26w-0001Gj-DF; Mon, 14 Nov 2011 14:22:32 -0500
From: Neil Horman <nhorman@tuxdriver.com>
To: netdev@vger.kernel.org
Date: Mon, 14 Nov 2011 14:22:24 -0500
Message-Id: <1321298544-16434-1-git-send-email-nhorman@tuxdriver.com>
X-Mailer: git-send-email 1.7.6.4
X-Spam-Score: -2.6 (--)
X-Spam-Status: No
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:10:24 -0800
Cc: xen-devel@lists.xensource.com,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>,
	Neil Horman <nhorman@tuxdriver.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH] Don't allow sharing of tx skbs on xen-netfront
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

It was pointed out to me recently that the xen-netfront driver can't safely
support shared skbs on transmit, since, while it doesn't maintain skb state
directly, it does pass a pointer to the skb to the hypervisor via a list, and
the hypervisor may expect the contents of the skb to remain stable.  Clearing
the IFF_TX_SKB_SHARING flag after the call to alloc_etherdev to make it safe.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: "David S. Miller" <davem@davemloft.net>
CC: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
CC: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
CC: xen-devel@lists.xensource.com
---
 drivers/net/xen-netfront.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index 226faab..fb1077b 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -1252,6 +1252,12 @@ static struct net_device * __devinit xennet_create_dev(struct xenbus_device *dev
 		return ERR_PTR(-ENOMEM);
 	}
 
+	/*
+	 * Since frames remain on a queue after a return from xennet_start_xmit,
+	 * we can't support tx shared skbs
+	 */
+	netdev->priv_flags &= ~IFF_TX_SKB_SHARING;
+
 	np                   = netdev_priv(netdev);
 	np->xbdev            = dev;
 
-- 
1.7.6.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 16:39:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 16:39:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ73f-0005GZ-29; Mon, 14 Nov 2011 16:39:27 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ5IM-0008UV-Qi
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 14:46:31 -0800
X-Env-Sender: jthomas@islinc.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1321310749!63168426!1
X-Originating-IP: [207.97.245.131]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19810 invoked from network); 14 Nov 2011 22:45:49 -0000
Received: from smtp131.iad.emailsrvr.com (HELO smtp131.iad.emailsrvr.com)
	(207.97.245.131)
	by server-2.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Nov 2011 22:45:49 -0000
Received: from smtp33.relay.iad1a.emailsrvr.com (localhost.localdomain
	[127.0.0.1])
	by smtp33.relay.iad1a.emailsrvr.com (SMTP Server) with ESMTP id
	6EC9630725 for <xen-devel@lists.xensource.com>;
	Mon, 14 Nov 2011 17:46:26 -0500 (EST)
X-SMTPDoctor-Processed: csmtpprox 2.7.4
Received: from localhost (localhost.localdomain [127.0.0.1])
	by smtp33.relay.iad1a.emailsrvr.com (SMTP Server) with ESMTP id
	6C72230701 for <xen-devel@lists.xensource.com>;
	Mon, 14 Nov 2011 17:46:26 -0500 (EST)
X-Virus-Scanned: OK
Received: by smtp33.relay.iad1a.emailsrvr.com (Authenticated sender:
	jthomas-AT-islinc.com) with ESMTPSA id 19C653072C
	for <xen-devel@lists.xensource.com>;
	Mon, 14 Nov 2011 17:46:25 -0500 (EST)
From: "Jason Thomas" <jthomas@islinc.com>
To: <xen-devel@lists.xensource.com>
Date: Mon, 14 Nov 2011 14:46:25 -0800
Message-ID: <007501cca31f$3e4b55e0$bae201a0$@com>
MIME-Version: 1.0
X-Mailer: Microsoft Office Outlook 12.0
Thread-Index: AcyjHz1+TTbnpVE8SeyMW2JqZ6il0Q==
Content-Language: en-us
X-Mailman-Approved-At: Mon, 14 Nov 2011 15:12:11 -0800
Subject: [Xen-devel] x86 versus 64 bit emulation complexity
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1163047647=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.

--===============1163047647==
Content-Type: multipart/alternative;
	boundary="----=_NextPart_000_0076_01CCA2DC.302815E0"
Content-Language: en-us

This is a multi-part message in MIME format.

------=_NextPart_000_0076_01CCA2DC.302815E0
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: 7bit

This is a general question about the complexity of emulating a 32 bit x86
environment compared to a 64 bit environment. What are the differences
between the two types. Does one require much more code/complexity to emulate
compared with the other? 



CONFIDENTIALITY NOTICE: This e-mail message, including any attachments, is for the sole use of the intended recipient(s) and may contain confidential and privileged information. Any unauthorized review, use, disclosure or distribution is prohibited. If you are not the intended recipient, please contact the sender by reply e-mail and destroy all copies of the original message.
------=_NextPart_000_0076_01CCA2DC.302815E0
Content-Type: text/html;
	charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

<html xmlns:v=3D"urn:schemas-microsoft-com:vml" xmlns:o=3D"urn:schemas-micr=
osoft-com:office:office" xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
xmlns:m=3D"http://schemas.microsoft.com/office/2004/12/omml" xmlns=3D"http:=
//www.w3.org/TR/REC-html40"><head><META HTTP-EQUIV=3D"Content-Type" CONTENT=
=3D"text/html; charset=3Dus-ascii"><meta name=3DGenerator content=3D"Micros=
oft Word 12 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0in;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
	{mso-style-priority:99;
	color:blue;
	text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
	{mso-style-priority:99;
	color:purple;
	text-decoration:underline;}
span.EmailStyle17
	{mso-style-type:personal-compose;
	font-family:"Calibri","sans-serif";
	color:windowtext;}
..MsoChpDefault
	{mso-style-type:export-only;}
@page WordSection1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
	{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext=3D"edit" spidmax=3D"1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext=3D"edit">
<o:idmap v:ext=3D"edit" data=3D"1" />
</o:shapelayout></xml><![endif]--></head><body lang=3DEN-US link=3Dblue vli=
nk=3Dpurple><div class=3DWordSection1><p class=3DMsoNormal>This is a genera=
l question about the complexity of emulating a 32 bit x86 environment compa=
red to a 64 bit environment. What are the differences between the two types=
. Does one require much more code/complexity to emulate compared with the o=
ther? <o:p></o:p></p></div>
</P><BR>
<P><SPAN lang=3Dzh-cn><FONT face=3DGaramond size=3D2><STRONG>CONFIDENTIALIT=
Y 
NOTICE:</STRONG>This e-mail message, including any attachments, is for the =
sole use of the intended recipient(s) and may contain confidential and priv=
ileged information. Any unauthorized review, use, disclosure or distributio=
n is prohibited. If you are not the intended recipient, please contact the =
sender by reply e-mail and destroy all copies of the original message. 
</SPAN></FONT> 
</FONT></P></DIV>
<DIV dir=3Dltr align=3Dleft><BR></DIV></BODY></HTML>
</body></html>
------=_NextPart_000_0076_01CCA2DC.302815E0--



--===============1163047647==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1163047647==--



From xen-devel-bounces@lists.xensource.com Mon Nov 14 17:02:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 17:02:30 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ7Py-0000sQ-92; Mon, 14 Nov 2011 17:02:30 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ7Gm-0007d1-RC
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 16:53:01 -0800
X-Env-Sender: jonathanjstevens@gmail.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1321318376!3110386!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4378 invoked from network); 15 Nov 2011 00:52:57 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 00:52:57 -0000
Received: by vws13 with SMTP id 13so8469220vws.30
	for <xen-devel@lists.xensource.com>;
	Mon, 14 Nov 2011 16:52:56 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:content-type:content-transfer-encoding;
	bh=hb8pTKUwxR81qqo+Ht1NCyJZfKpaEmqXMJzaUlRbDxA=;
	b=ByZOZ2tDk4+rrMo7RN2EE/Y+A/sEqkQkaUr4TFcSAJTDMQA7LMSYCgprJfOP7TibV/
	oaVyCPTDDqRRFaow2+aHWsnR9iBd0cRohrei0ZV8HgBmdamo/ps8ASRma8CcruyvlNDd
	o4zdydClz9p10Lr9gGJt1Zsu3PKsBoPYl2s3c=
MIME-Version: 1.0
Received: by 10.52.22.170 with SMTP id e10mr14557217vdf.75.1321318376343; Mon,
	14 Nov 2011 16:52:56 -0800 (PST)
Received: by 10.220.187.13 with HTTP; Mon, 14 Nov 2011 16:52:56 -0800 (PST)
In-Reply-To: <20111114183807.GA15284@phenom.dumpdata.com>
References: <CAA7M+FD1mis7C1+cU0eCYZHhu96-B-g7_73FjC430fo4CHohvQ@mail.gmail.com>
	<CAA7M+FBP1SAa2cn9Rfsdcde=ruKekq+tVP1Jnj17RK6qrgvfNw@mail.gmail.com>
	<20111114183807.GA15284@phenom.dumpdata.com>
Date: Tue, 15 Nov 2011 00:52:56 +0000
Message-ID: <CAA7M+FCKCqHfBwkx7LUe6qH-_z4E+vZ2rwKi013MZxdT4GfKnw@mail.gmail.com>
Subject: Re: [Xen-devel] HVR-4000 DVB can't scan or tune (properly) with Xen
From: "jonathanjstevens@gmail.com" <jonathanjstevens@gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>
> Excellent. Everything that is new.

Shiney. :)

>
>>
>> When I boot without Xen the DVB PCI cards can tune and scan perfectly.
>> I also have a USB DVB unit, which can tune and scan regardless of
>> whether Xen is running. However when I try to scan and tune with the
>> PCI DVB cards it fails.
>
> OK, and you are _not_ passing it to a guest right?

Indeed not, this is in dom0. I do not have IOMMU so my dvb stuff will
run in dom0.


>>
>> [ =A0 26.572693] cx88[1]/1: IRQ loop detected, disabling interrupts
>> [ =A0 26.574810] cx88[1]: irq aud [0x1001] dn_risci1* dn_sync*
>
> Great. Can you do a couple of tests:

Certainly. However, first I will say that I have made the above
messages go away. I had been trying various boot options based on what
I had been reading on net. I was using irqpoll at the time that those
messages appeared. Removing irqpoll has stopped them from occurring.
Hopefully that is useful information in itself.

>
> 1). Boot your Linux machine with 'mem=3D3G' and see if that makes the iss=
ue
> =A0 =A0disappear.

I have tried mem=3D2G and 4G (not 3 but I will if you think it'll be differ=
ent).
I have also been trying with ballooning disabled, and with dom0_mem=3D2G / =
4G
I also tried swiotlb=3D65762
I have tried most combinations of the above - but not necessarily all.


>
> 2). Tell me what is the 'scan' tool you use? Is it there a command
> =A0 line version of the tool that triggers this?
>
I've been using as many as I can try.
Mainly it's the F16 provided scandvb, which I think is just a renamed
dvbscan and also w_scan.
I've also tried mplayer, xine, kaffeine, and mythtv. I haven't got vlc
to compile yet...

I think I have a bit more information for you after today's hacking about.
First off there was a kernel update, so I'm now at

Linux mythtvtuner.home 3.1.1-1.fc16.x86_64 #1 SMP Fri Nov 11 21:47:56
UTC 2011 x86_64 x86_64 x86_64 GNU/Linux


>From what I can see I think in fact the tuning works OK, but there is
some sort of issue getting at the streams once tuned.
e.g. tzap will get a lock OK
> tzap -a 1 -f 1 -d 1 -c ~/tzap.channels.conf "BBC ONE(BBC)"
using '/dev/dvb/adapter1/frontend1' and '/dev/dvb/adapter1/demux1'
tuning to 650000000 Hz
video pid 0x0065, audio pid 0x0066
status 01 | signal 5151 | snr 8000 | ber 00003fff | unc 00000000 |
status 1f | signal 4e4e | snr ffff | ber 00000000 | unc 00000000 | FE_HAS_L=
OCK
status 1f | signal 4e4e | snr ffff | ber 00000000 | unc 00000000 | FE_HAS_L=
OCK


I don't know if the following is useful?

root@mythtvtuner jon]# strace -f -v scandvb -a 1 -f1 -d 0 -5 -v -v -v
~jon/dvbscan.channels.conf
execve("/usr/bin/scandvb", ["scandvb", "-a", "1", "-f1", "-d", "0",
"-5", "-v", "-v", "-v", "/home/jon/dvbscan.channels.conf"],
["XDG_SESSION_ID=3D69", "HOSTNAME=3Dmythtvtuner.home", "SHELL=3D/bin/bash",
"TERM=3Dxterm", "HISTSIZE=3D1000", "SSH_CLIENT=3D192.168.2.179 48391 2"...,
"SSH_TTY=3D/dev/pts/7", "USER=3Djon",
"LS_COLORS=3Drs=3D0:di=3D01;34:ln=3D01;36"...,
"PATH=3D/usr/lib64/ccache:/usr/loca"..., "MAIL=3D/var/spool/mail/jon",
"PWD=3D/home/jon", "XMODIFIERS=3D@im=3Dnone", "LANG=3Den_US.UTF-8",
"KDE_IS_PRELINKED=3D1", "KDEDIRS=3D/usr", "HISTCONTROL=3Dignoredups",
"HOME=3D/root", "SHLVL=3D2", "LOGNAME=3Djon", "CVS_RSH=3Dssh",
"SSH_CONNECTION=3D192.168.2.179 483"...,
"LESSOPEN=3D||/usr/bin/lesspipe.sh "...,
"XDG_RUNTIME_DIR=3D/run/user/jon", "_=3D/usr/bin/strace"]) =3D 0
brk(0)                                  =3D 0x20fe000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) =3D 0x7ff5ccd7a000
access("/etc/ld.so.preload", R_OK)      =3D -1 ENOENT (No such file or dire=
ctory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) =3D 3
fstat(3, {st_dev=3Dmakedev(253, 1), st_ino=3D132752, st_mode=3DS_IFREG|0644=
,
st_nlink=3D1, st_uid=3D0, st_gid=3D0, st_blksize=3D4096, st_blocks=3D224,
st_size=3D112482, st_atime=3D2011/11/14-12:23:08,
st_mtime=3D2011/11/14-12:23:06, st_ctime=3D2011/11/14-12:23:06}) =3D 0
mmap(NULL, 112482, PROT_READ, MAP_PRIVATE, 3, 0) =3D 0x7ff5ccd5e000
close(3)                                =3D 0
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) =3D 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\27\2\2008\0\0\0=
"...,
832) =3D 832
fstat(3, {st_dev=3Dmakedev(253, 1), st_ino=3D157705, st_mode=3DS_IFREG|0755=
,
st_nlink=3D1, st_uid=3D0, st_gid=3D0, st_blksize=3D4096, st_blocks=3D4032,
st_size=3D2063512, st_atime=3D2011/11/14-23:30:01,
st_mtime=3D2011/10/26-20:57:26, st_ctime=3D2011/11/09-23:29:49}) =3D 0
mmap(0x3880000000, 3884344, PROT_READ|PROT_EXEC,
MAP_PRIVATE|MAP_DENYWRITE, 3, 0) =3D 0x3880000000
mprotect(0x38801aa000, 2097152, PROT_NONE) =3D 0
mmap(0x38803aa000, 24576, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1aa000) =3D 0x38803aa000
mmap(0x38803b0000, 17720, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) =3D 0x38803b0000
close(3)                                =3D 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) =3D 0x7ff5ccd5d000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) =3D 0x7ff5ccd5c000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) =3D 0x7ff5ccd5b000
arch_prctl(ARCH_SET_FS, 0x7ff5ccd5c700) =3D 0
mprotect(0x38803aa000, 16384, PROT_READ) =3D 0
mprotect(0x387fe21000, 4096, PROT_READ) =3D 0
munmap(0x7ff5ccd5e000, 112482)          =3D 0
write(2, "scanning /home/jon/dvbscan.chann"..., 41scanning
/home/jon/dvbscan.channels.conf
) =3D 41
write(2, "using '/dev/dvb/adapter1/fronten"..., 67using
'/dev/dvb/adapter1/frontend1' and '/dev/dvb/adapter1/demux0'
) =3D 67
open("/dev/dvb/adapter1/frontend1", O_RDWR) =3D 3
ioctl(3, FE_GET_INFO, 0x60a640)         =3D 0
rt_sigaction(SIGINT, {0x403300, [INT], SA_RESTORER|SA_RESTART,
0x3880036320}, {SIG_DFL, [], 0}, 8) =3D 0
brk(0)                                  =3D 0x20fe000
brk(0x211f000)                          =3D 0x211f000
brk(0)                                  =3D 0x211f000
open("/home/jon/dvbscan.channels.conf", O_RDONLY) =3D 4
fstat(4, {st_dev=3Dmakedev(253, 16), st_ino=3D1704027,
st_mode=3DS_IFREG|0664, st_nlink=3D1, st_uid=3D1000, st_gid=3D1000,
st_blksize=3D4096, st_blocks=3D8, st_size=3D1028,
st_atime=3D2011/11/14-15:05:46, st_mtime=3D2011/11/10-23:05:38,
st_ctime=3D2011/11/10-23:05:38}) =3D 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) =3D 0x7ff5ccd79000
read(4, "#-------------------------------"..., 4096) =3D 1028
write(2, "initial transponder 650000000 0 "..., 44initial transponder
650000000 0 9 9 6 2 4 4
) =3D 44
write(2, "initial transponder 754000000 0 "..., 44initial transponder
754000000 0 3 9 3 1 0 0
) =3D 44
write(2, "initial transponder 794000000 0 "..., 44initial transponder
794000000 0 2 9 3 1 0 0
) =3D 44
write(2, "initial transponder 738000000 0 "..., 44initial transponder
738000000 0 2 9 3 1 0 0
) =3D 44
write(2, "initial transponder 690000000 0 "..., 44initial transponder
690000000 0 2 9 3 1 0 0
) =3D 44
write(2, "initial transponder 722000000 0 "..., 44initial transponder
722000000 0 2 9 3 1 0 0
) =3D 44
write(2, "initial transponder 706000000 0 "..., 44initial transponder
706000000 0 9 9 6 2 4 4
) =3D 44
write(2, "initial transponder 842000000 0 "..., 44initial transponder
842000000 0 9 9 6 2 4 4
) =3D 44
read(4, "", 4096)                       =3D 0
close(4)                                =3D 0
munmap(0x7ff5ccd79000, 4096)            =3D 0
write(2, ">>> tune to: ", 13>>> tune to: )           =3D 13
write(2, "650000000:", 10650000000:)              =3D 10
write(2, "INVERSION_AUTO:", 15INVERSION_AUTO:)         =3D 15
write(2, "BANDWIDTH_8_MHZ:", 16BANDWIDTH_8_MHZ:)        =3D 16
write(2, "FEC_AUTO:", 9FEC_AUTO:)                =3D 9
write(2, "FEC_AUTO:", 9FEC_AUTO:)                =3D 9
write(2, "QAM_AUTO:", 9QAM_AUTO:)                =3D 9
write(2, "TRANSMISSION_MODE_AUTO:", 23TRANSMISSION_MODE_AUTO:) =3D 23
write(2, "GUARD_INTERVAL_AUTO:", 20GUARD_INTERVAL_AUTO:)    =3D 20
write(2, "HIERARCHY_AUTO", 14HIERARCHY_AUTO)          =3D 14
write(2, "\n", 1
)                       =3D 1
ioctl(3, FE_SET_FRONTEND, 0x7fffe82681c0) =3D 0
nanosleep({0, 200000000}, NULL)         =3D 0
ioctl(3, FE_READ_STATUS, 0x7fffe82681ec) =3D 0
write(2, ">>> tuning status =3D=3D 0x01\n", 26>>> tuning status =3D=3D 0x01
) =3D 26
nanosleep({0, 200000000}, NULL)         =3D 0
ioctl(3, FE_READ_STATUS, 0x7fffe82681ec) =3D 0
write(2, ">>> tuning status =3D=3D 0x1f\n", 26>>> tuning status =3D=3D 0x1f
) =3D 26
open("/dev/dvb/adapter1/demux0", O_RDWR|O_NONBLOCK) =3D 4
ioctl(4, DMX_SET_FILTER, 0x7fffe8266fc0) =3D 0
open("/dev/dvb/adapter1/demux0", O_RDWR|O_NONBLOCK) =3D 5
ioctl(5, DMX_SET_FILTER, 0x7fffe8266fc0) =3D 0
open("/dev/dvb/adapter1/demux0", O_RDWR|O_NONBLOCK) =3D 6
ioctl(6, DMX_SET_FILTER, 0x7fffe8266fc0) =3D 0
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
write(2, "WARNING: filter timeout pid 0x00"..., 35WARNING: filter
timeout pid 0x0011
) =3D 35
ioctl(5, DMX_STOP, 0x38803b0a80)        =3D 0
close(5)                                =3D 0
poll([{fd=3D6, events=3DPOLLIN}, {fd=3D4, events=3DPOLLIN}], 2, 1000) =3D 0=
 (Timeout)
write(2, "WARNING: filter timeout pid 0x00"..., 35WARNING: filter
timeout pid 0x0000
) =3D 35
ioctl(4, DMX_STOP, 0x38803b0a80)        =3D 0
close(4)                                =3D 0
poll([{fd=3D6, events=3DPOLLIN}], 1, 1000)  =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}], 1, 1000)  =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}], 1, 1000)  =3D 0 (Timeout)
poll([{fd=3D6, events=3DPOLLIN}], 1, 1000^C <unfinished ...>

etc...

Occasionally the POLLIN doesn't timeout (since kernel upgrade), but
the data can't seem to be interpreted (my guess) and I can't find what
makes this occur (and I can't seem to make it happen right now
annoyingly!).
I don't want to bombard you with unwanted diags but can capture more
fully similar to above if useful?



> 3). Or does this happend when you just load the module and it starts
> =A0 doing the IRQ loop detected' thingy?

Not entirely sure, can recreate by turning irqpoll back on and testing
if you want? From memory there were very few of the
>> [ =A0 26.572693] cx88[1]/1: IRQ loop detected, disabling interrupts

but lots and lots of:
>> [ =A0 26.574810] cx88[1]: irq aud [0x1001] dn_risci1* dn_sync*


Thanks very much for looking into this.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 17:44:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 17:44:50 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ84w-0002k0-GZ; Mon, 14 Nov 2011 17:44:50 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ83y-0002XK-8U
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 17:43:50 -0800
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-6.tower-21.messagelabs.com!1321321425!4226453!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6640 invoked from network); 15 Nov 2011 01:43:47 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-6.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 15 Nov 2011 01:43:47 -0000
Received: from saboo.goop.org (c-67-164-98-198.hsd1.ca.comcast.net
	[67.164.98.198]) (Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id EFD773D2;
	Mon, 14 Nov 2011 17:43:44 -0800 (PST)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id E4AB12092E;
	Mon, 14 Nov 2011 17:43:42 -0800 (PST)
Message-ID: <4EC1C3CE.3070105@goop.org>
Date: Mon, 14 Nov 2011 17:43:42 -0800
From: Jeremy Fitzhardinge <jeremy@goop.org>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: Jason Thomas <jthomas@islinc.com>
Subject: Re: [Xen-devel] x86 versus 64 bit emulation complexity
References: <007501cca31f$3e4b55e0$bae201a0$@com>
In-Reply-To: <007501cca31f$3e4b55e0$bae201a0$@com>
X-Enigmail-Version: 1.3.3
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/14/2011 02:46 PM, Jason Thomas wrote:
>
> This is a general question about the complexity of emulating a 32 bit
> x86 environment compared to a 64 bit environment. What are the
> differences between the two types. Does one require much more
> code/complexity to emulate compared with the other?
>

That's not really on-topic for this list, unless you have a specific
question about Xen.

    J

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 18:18:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 18:18:49 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQ8bo-0003gt-K4; Mon, 14 Nov 2011 18:18:48 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQ8ac-0003Ty-U6
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 18:17:36 -0800
X-Env-Sender: todd.deshane.xen@gmail.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1321323450!3526361!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9016 invoked from network); 15 Nov 2011 02:17:31 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-15.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 02:17:31 -0000
Received: by iaby12 with SMTP id y12so6436538iab.30
	for <xen-devel@lists.xensource.com>;
	Mon, 14 Nov 2011 18:17:30 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:from:date
	:x-google-sender-auth:message-id:subject:to:cc:content-type;
	bh=GXP1Xhb0ItN6O968hEsspvvGpzRVM/LKUAFMnTMD/tk=;
	b=RlctZ27vMdk9wT/XLxhaYZzSSPIf+wYRMT6ck/p4DhMRqCem9z885VGDwYJLtESL+t
	D6wsYmiseOt6WELSq7SXlEbWQ8VkEYMfOmBvprIZlpe+O7KFJdmk/FAq5t7iSUe75jR+
	ZCvuFR1er3mqMhwmTAu2P4kvbvWsA1xZEhacY=
Received: by 10.231.48.142 with SMTP id r14mr5909132ibf.5.1321323450143; Mon,
	14 Nov 2011 18:17:30 -0800 (PST)
MIME-Version: 1.0
Received: by 10.231.205.195 with HTTP; Mon, 14 Nov 2011 18:17:09 -0800 (PST)
In-Reply-To: <007501cca31f$3e4b55e0$bae201a0$@com>
References: <007501cca31f$3e4b55e0$bae201a0$@com>
From: Todd Deshane <todd.deshane@xen.org>
Date: Mon, 14 Nov 2011 21:17:09 -0500
X-Google-Sender-Auth: mlX-Qb2WsiS5v14HJyrn9e_Fcws
Message-ID: <CAMrPLWLO=Aw7+7Jys0RdPDXvNdiihYC3S-WcfQNT3L5B_HPNqQ@mail.gmail.com>
Subject: Re: [Xen-devel] x86 versus 64 bit emulation complexity
To: Jason Thomas <jthomas@islinc.com>
Content-Type: text/plain; charset=ISO-8859-1
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 5:46 PM, Jason Thomas <jthomas@islinc.com> wrote:
> This is a general question about the complexity of emulating a 32 bit x86
> environment compared to a 64 bit environment. What are the differences
> between the two types. Does one require much more code/complexity to emulate
> compared with the other?
>

Please see:
http://wiki.xen.org/wiki/AskingXenDevelQuestions

Thanks,
Todd

-- 
Todd Deshane
http://www.linkedin.com/in/deshantm
http://www.xen.org/community/xenday11.html
http://cloudstack.org/about-cloudstack/cloudstack-events/viewevent/29-build-an-open-source-cloud-day-boston.html

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 21:00:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 21:00:30 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQB8I-0002bA-Ni; Mon, 14 Nov 2011 21:00:30 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQB7S-0002Nh-HS
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 20:59:39 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1321333175!4218353!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6411 invoked from network); 15 Nov 2011 04:59:35 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 04:59:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,513,1315180800"; 
   d="scan'208";a="8928570"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 04:59:35 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 15 Nov 2011 04:59:35 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RQB7O-0003m0-Os;
	Tue, 15 Nov 2011 04:59:34 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RQB7O-00016R-8G;
	Tue, 15 Nov 2011 04:59:34 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9767-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 15 Nov 2011 04:59:34 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9767: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9767 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9767/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf      5 xen-boot                   fail REGR. vs. 9766

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  848049b14ec7
baseline version:
 xen                  ca618f5deec2

------------------------------------------------------------
People who touched revisions under test:
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Keir Fraser <keir@xen.org>
  Roger Pau Monne <roger.pau@entel.upc.edu>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24143:848049b14ec7
tag:         tip
user:        Keir Fraser <keir@xen.org>
date:        Mon Nov 14 20:15:35 2011 +0000
    
    hvmloader: Move acpi_info structure out from low memory.
    
    This avoids a conflict with SeaBIOS's memory management. Moreover
    there is no reason that acp_info must live below 1MB, and moving it
    out actually simplifies our code.
    
    Signed-off-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24142:ca618f5deec2
user:        Roger Pau Monne <roger.pau@entel.upc.edu>
date:        Mon Nov 14 18:17:44 2011 +0000
    
    tools/check: check for headers and libraries in user defined folders.
    
    Parse EXTRA_INCLUDES, EXTRA_LIB, PREPEND_INCLUDES, PREPEND_LIB,
    APPEND_INCLUDES, APPEND_LIB during checks, to search for required
    files.
    
    Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 21:07:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 21:07:09 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQBEi-00036M-4u; Mon, 14 Nov 2011 21:07:08 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQBE5-0002tu-L6
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 21:06:29 -0800
X-Env-Sender: wangwangkang@gmail.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1321333586!3451598!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1662 invoked from network); 15 Nov 2011 05:06:26 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 05:06:26 -0000
Received: by wyg24 with SMTP id 24so55648wyg.30
	for <xen-devel@lists.xensource.com>;
	Mon, 14 Nov 2011 21:06:25 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=RJJ+oFicOkpTJmGqfmc2cG8wjxSSvIsYdvSDRHDjcOk=;
	b=rDuKrbnR/9xuiPwIUXwMpt/bntAYb/ygv+ADoE+85EQyjltax6SsCYXklsbO3i3IB7
	aaGxCuHkC8cQrehTjmD4veAqzE8r6XizPHpB5naMVcES2fGdK9eD3/52xoXB9ocM4L5m
	TTXaZiLpJGhE5AMA0u/GYP6ojxnhxVBaFr8PU=
MIME-Version: 1.0
Received: by 10.216.177.208 with SMTP id d58mr547786wem.105.1321333585580;
	Mon, 14 Nov 2011 21:06:25 -0800 (PST)
Received: by 10.216.82.15 with HTTP; Mon, 14 Nov 2011 21:06:25 -0800 (PST)
Date: Tue, 15 Nov 2011 00:06:25 -0500
Message-ID: <CAMTrTqUup+6W80fTW_gsk62Bu0un-0G9MJKkVsnZ0LYV6nOniA@mail.gmail.com>
From: Steven <wangwangkang@gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1
Subject: [Xen-devel] Get MFN from the pv linux guest
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Dear All,
I am trying get the machine frame number of the corresponding
pseudo-physical page number in a PV Linux guest.
Could anyone suggest which data structure I have to take a look? Thanks.

- Steven

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 23:26:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 23:26:20 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQDPP-0005nc-Bq; Mon, 14 Nov 2011 23:26:19 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQDOR-0005b1-QE
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 23:25:20 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1321341915!4132975!1
X-Originating-IP: [80.70.172.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5597 invoked from network); 15 Nov 2011 07:25:15 -0000
Received: from dgate10.ts.fujitsu.com (HELO dgate10.ts.fujitsu.com)
	(80.70.172.49)
	by server-9.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 07:25:15 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Message-ID:Date:From:Organization:
	User-Agent:MIME-Version:To:Subject:Content-Type:
	Content-Transfer-Encoding;
	b=cYWw64M33GPHcGafdLSumGfm6g4Sfac3ZAng7uTTd8FZyFfxoPv4XzCF
	Pj7i+Ee4ErDxZeHglNlZyyjGCeGk6luk0epfat84XlvxILXnlgbD8kPzO
	W2BbkD8wdD2ArG2fhFvj3iCasH0BnfPOpirOiWcxLlb++6HZ8/n1tSUJh
	D2Eh9WqFRbSjl7ku16IUYwAaHbQXY7GoecuFHlzAdSWciThrZVfx2d8Ua
	AzR8fAVr9EE/Pzjy4ML8kSCOcSWoL;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1321341915; x=1352877915;
	h=message-id:date:from:mime-version:to:subject:
	content-transfer-encoding;
	bh=GxSi5rn7SpWyfJ9OECVaDZXYylj1oVN5lY/K0X3wTqU=;
	b=BYEnCY0cnq9f4Pexau9gccuhwjLx9RRKY5r3pLon8cc7w0pnFh9zUD9v
	D5/cUE/ls2DI7jhQqSJVgYTT2m81q6AH9Xmea5oJtB3lhC08OemwMs38S
	JtGD4OLLfe0GP4MidDgIbCWEbLQpO4OpCjAH+0U4KZeY3Wq7fCfN1QPKZ
	jSCq8L5b/NdSbVXA54pzRTZXCa4A7eXHjWuJekywlwI1NPcUdVaFL3cnp
	CNPsYLd516F7h/t4JufARyjqXvfMO;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,513,1315173600"; d="scan'208";a="93066890"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate10u.abg.fsc.net with ESMTP; 15 Nov 2011 08:25:14 +0100
X-IronPort-AV: E=Sophos;i="4.69,513,1315173600"; d="scan'208";a="123062240"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 15 Nov 2011 08:25:14 +0100
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id 749D63E524F
	for <xen-devel@lists.xensource.com>;
	Tue, 15 Nov 2011 08:25:14 +0100 (CET)
Message-ID: <4EC213DA.7060405@ts.fujitsu.com>
Date: Tue, 15 Nov 2011 08:25:14 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
Organization: Fujitsu Technology Solutions
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20111010 Iceowl/1.0b2 Icedove/3.1.15
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Subject: [Xen-devel] xen-unstable/staging: qemu git file corrupt
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi,

when I try to build xen-unstable/staging (cs 24143) tools via

make tools

I get:

...
got 1b6bfb99c2b55ff2e35ab61caf307dad3aebc82a
got efd594c960330cc3eee44e65f5fee258c798e610
got ccc9677505c0dd2c6c5054e73a42cef2d25687b4
got 86a2a2a59a8b76117b221c712ba0a156d21441c9
error: File efd594c960330cc3eee44e65f5fee258c798e610 
(http://xenbits.xensource.com/git-http/qemu-xen-unstable.git/objects/8a/d9c9e46bb1fea94e589c0ae062dab921ad86a5) 
corrupt
error: Unable to find 8ad9c9e46bb1fea94e589c0ae062dab921ad86a5 under 
http://xenbits.xensource.com/git-http/qemu-xen-unstable.git
Cannot obtain needed blob 8ad9c9e46bb1fea94e589c0ae062dab921ad86a5
while processing commit 249139f4e6e9ff8dfd2086d4e3fdfda8b1c53bac.
fatal: Fetch failed.
make[1]: *** [ioemu-dir-find] Error 128
make[1]: Leaving directory `/root/xen-staging.hg/tools'
make: *** [tools/ioemu-dir] Error 2

Something seems to be broken...


Juergen

-- 
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: juergen.gross@ts.fujitsu.com
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 23:40:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 23:40:45 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQDdN-0006Pf-12; Mon, 14 Nov 2011 23:40:45 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQDcY-0006Cv-E8
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 23:39:54 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-16.tower-174.messagelabs.com!1321342791!1587604!1
X-Originating-IP: [80.70.172.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18144 invoked from network); 15 Nov 2011 07:39:51 -0000
Received: from dgate10.ts.fujitsu.com (HELO dgate10.ts.fujitsu.com)
	(80.70.172.49)
	by server-16.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 07:39:51 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Message-ID:Date:From:Organization:
	User-Agent:MIME-Version:To:CC:Subject:Content-Type:
	Content-Transfer-Encoding;
	b=VKB5ReLHxs27AEzrHwqapS2z/xOyrzNKBnQAsHaM3nVbg77WNfkorml8
	fmetgPkJyXlV+iydrdICFylrBbf8YmaN0aUxJU1mNVZ5LQNdKkcGhidVp
	1P6sYA+k4XJ9RKs5KePe3xjr6/NGOWO5ozBq8cn5OCKz+tJbNcQyG+mch
	EeyU7bF4gvsDzu7yNeuv3M86huDCYWkVhPSr0ejbURf6+iYnXVGHdlBaY
	XhqZpUEF0JABQrXiYfHh3j9bx3H64;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1321342791; x=1352878791;
	h=message-id:date:from:mime-version:to:cc:subject:
	content-transfer-encoding;
	bh=qG8FuLRSZwve4IIOgx/vodxtGWQVnxRkDG1cHG4n+nw=;
	b=F/Q2n+XaMNZiTeaIG47vN4Uye7e+ZNmK0KkadvJHwpt9Hg74Ra8EXaGc
	lE/0+HX3gqyHSGLevJm5fAkZIbybRebEeSvGoC3a8MEOLtg8YDbIJ37cr
	I/HGzVfDXZeNau+brmdb5e9ka+lzrV66qBK68cWQumqsjHh8rvH7Qjt8V
	19QbB9qojKzAGryVfTCZIvJi5zg4xd3its2by/1+YCdkxy5m4tVWJ75ux
	f/YgIhJVI9VrLujht9WJVI1U2TTRB;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,513,1315173600"; d="scan'208";a="93068742"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate10u.abg.fsc.net with ESMTP; 15 Nov 2011 08:39:51 +0100
X-IronPort-AV: E=Sophos;i="4.69,513,1315173600"; d="scan'208";a="123063241"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 15 Nov 2011 08:39:51 +0100
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id 106139F6BB;
	Tue, 15 Nov 2011 08:39:51 +0100 (CET)
Message-ID: <4EC21747.5020500@ts.fujitsu.com>
Date: Tue, 15 Nov 2011 08:39:51 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
Organization: Fujitsu Technology Solutions
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20111010 Iceowl/1.0b2 Icedove/3.1.15
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Jan Beulich <JBeulich@novell.com>
Subject: [Xen-devel] poweroff -f in dom0 panics xen
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi,

on my test system (SLES11 SP1 dom0 with 2.6.32 kernel and current xen unstable)
the hypervisor panics when I enter

poweroff -f

in dom0:

(XEN) irq.c:1914: dom0: forcing unbind of pirq 278
(XEN) irq.c:1914: dom0: forcing unbind of pirq 279
(XEN) irq.c:1914: dom0: forcing unbind of pirq 280
(XEN) irq.c:1914: dom0: forcing unbind of pirq 290
(XEN) irq.c:1914: dom0: forcing unbind of pirq 291
(XEN) irq.c:1914: dom0: forcing unbind of pirq 292
(XEN) irq.c:1914: dom0: forcing unbind of pirq 293
(XEN) irq.c:1914: dom0: forcing unbind of pirq 294
[69430.691940] Power down.
(XEN) Preparing system for ACPI S5 state.
(XEN) Disabling non-boot CPUs ...
(XEN) Broke affinity for irq 8
(XEN) Xen BUG at smpboot.c:858
(XEN) ----[ Xen-4.2-unstable  x86_64  debug=y  Tainted:    C ]----
(XEN) CPU:    1
(XEN) RIP:    e008:[<ffff82c48017b45a>] __cpu_disable+0x367/0x398
(XEN) RFLAGS: 0000000000010286   CONTEXT: hypervisor
(XEN) rax: 00000000fffffff5   rbx: 0000000000000004   rcx: ffff82c4802f5c40
(XEN) rdx: ffff83033ea9ff18   rsi: 0000000000000004   rdi: ffff83033eb00478
(XEN) rbp: ffff83033ea9fe40   rsp: ffff83033ea9fe00   r8:  0000000000000004
(XEN) r9:  000000000000003f   r10: 00000000fffffffc   r11: 0000000000000001
(XEN) r12: ffff82c4802f6ad0   r13: ffff82c4802f6ad0   r14: 0000000000000001
(XEN) r15: ffff82c4802dbc60   cr0: 000000008005003b   cr4: 00000000000026b0
(XEN) cr3: 00000000bf4ac000   cr2: 0000000000624710
(XEN) ds: 002b   es: 002b   fs: 0000   gs: 0000   ss: e010   cs: e008
(XEN) Xen stack trace from rsp=ffff83033ea9fe00:
(XEN)    0000000000000001 0000000100000001 0000000400000001 0000000000000003
(XEN)    ffff82c4802d07e4 ffff83033ea9ff18 ffff82c4802d07e8 ffff82c4802d07ec
(XEN)    ffff83033ea9fe50 ffff82c480100dd7 ffff83033ea9fe90 ffff82c4801253c0
(XEN)    ffff83033ea9fe70 ffff83033eaa60c0 ffff83033eaa60c0 0000000000000001
(XEN)    ffff83033eaa6068 ffff83033eaa6040 ffff83033ea9feb0 ffff82c480126c85
(XEN)    ffff83033eaa60f0 ffff83033eaa6110 ffff83033ea9fee0 ffff82c480126dba
(XEN)    ffff83033ea9ff18 ffff83033ea9ff18 ffff82c480257380 ffff83033ea9ff18
(XEN)    ffff83033ea9ff10 ffff82c4801591d5 0000000000000000 ffff8300bf2fe000
(XEN)    ffff8300bf2fe000 00000000001e8480 ffff83033ea9fe00 0000000000000000
(XEN)    0000000000000000 0000000000000000 0000000000000000 ffffffff8062e020
(XEN)    ffff8800bf91dfd8 0000000000000246 00000000deadbeef 0000000000000001
(XEN)    ffff8800bf91c000 0000000000000000 ffffffff8000330a 00000000deadbeef
(XEN)    00000000deadbeef 00000000deadbeef 0000010000000000 ffffffff8000330a
(XEN)    000000000000e033 0000000000000246 ffff8800bf91df18 000000000000e02b
(XEN)    000000000000beef 000000000000beef 000000000000beef 000000000000beef
(XEN)    0000000000000001 ffff8300bf2fe000 0000003ebe7b0400 0000000000000000
(XEN) Xen call trace:
(XEN)    [<ffff82c48017b45a>] __cpu_disable+0x367/0x398
(XEN)    [<ffff82c480100dd7>] take_cpu_down+0x43/0x4a
(XEN)    [<ffff82c4801253c0>] stopmachine_action+0xb3/0xd8
(XEN)    [<ffff82c480126c85>] do_tasklet_work+0x8e/0xc6
(XEN)    [<ffff82c480126dba>] do_tasklet+0x6d/0x9d
(XEN)    [<ffff82c4801591d5>] idle_loop+0x74/0x7b
(XEN)
(XEN)
(XEN) ****************************************
(XEN) Panic on CPU 1:
(XEN) Xen BUG at smpboot.c:858
(XEN) ****************************************
(XEN)
(XEN) Reboot in five seconds...


Juergen

-- 
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: juergen.gross@ts.fujitsu.com
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Nov 14 23:50:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 14 Nov 2011 23:50:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQDml-0006w8-FW; Mon, 14 Nov 2011 23:50:27 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQDlo-0006jM-2b
	for xen-devel@lists.xensource.com; Mon, 14 Nov 2011 23:49:28 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1321343361!3533907!1
X-Originating-IP: [80.70.172.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13280 invoked from network); 15 Nov 2011 07:49:22 -0000
Received: from dgate10.ts.fujitsu.com (HELO dgate10.ts.fujitsu.com)
	(80.70.172.49)
	by server-16.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 07:49:22 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Message-ID:Date:From:Organization:
	User-Agent:MIME-Version:To:CC:Subject:References:
	In-Reply-To:Content-Type:Content-Transfer-Encoding;
	b=MAkDS21frGUNHYkhn2wWVQp1kCGDjT5qlFCH4RuMfbgzzHw0pJRuzlA7
	kBFJgDTAnmM8FAKFddybtx07/zH0ReVs4FxYv9V9vjVwD5/UzY6UPRkb0
	oUSsyC6HC3ajRqlWq267R73C0AXg2Dqj0F5YpJEnQEGSVTgACe5qPlalv
	k+ootmtE+N2pswf/WV9lsz8kozrjIo1uAMv2gOg+q8WnFsBXc/GWN3iZW
	nRu6BQZUzBSM7pIC7yB0dHwm4BspG;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1321343362; x=1352879362;
	h=message-id:date:from:mime-version:to:cc:subject:
	references:in-reply-to:content-transfer-encoding;
	bh=ZpbT9V2jlvoPeFzBWSNhLb6j+Beoe8XSfHJW16+0Bdw=;
	b=AHYzQ5CkC51BH2LhKLw4g+WZTU+RSiMojEpl7sVJIOwsH6l90kfZtJv+
	osAYQmD6yYh+DrJBokfBngYPOGnv7NjZic4eb2MQ2LJI0nIpKUZqmCF97
	He9Vm6UQm54eAOS58mb6ulhKvv6AI+hBUnQYV2IerE1YTYnzQ6ikDLsJO
	kf1ecIJcGI5OkGj4KzQb0mjzOMm83cSkeB9UoEF0XID+OGrwQByVDbcrA
	C1bLa88pgLm9mt8BoTa+q6zlAytff;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,513,1315173600"; d="scan'208";a="93070096"
Received: from abgdgate40u.abg.fsc.net ([172.25.138.90])
	by dgate10u.abg.fsc.net with ESMTP; 15 Nov 2011 08:49:22 +0100
X-IronPort-AV: E=Sophos;i="4.69,512,1315173600"; d="scan'208";a="123463496"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate40u.abg.fsc.net with ESMTP; 15 Nov 2011 08:49:21 +0100
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id 8A27095AB5E;
	Tue, 15 Nov 2011 08:49:21 +0100 (CET)
Message-ID: <4EC21981.10003@ts.fujitsu.com>
Date: Tue, 15 Nov 2011 08:49:21 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
Organization: Fujitsu Technology Solutions
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20111010 Iceowl/1.0b2 Icedove/3.1.15
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: Re: [Xen-devel] poweroff -f in dom0 panics xen
References: <4EC21747.5020500@ts.fujitsu.com>
In-Reply-To: <4EC21747.5020500@ts.fujitsu.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Jan Beulich <JBeulich@novell.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Sorry for the noise, I had still credit2 enabled. Seems to be the same
problem as credit2/cpupools...


Juergen

On 11/15/2011 08:39 AM, Juergen Gross wrote:
> Hi,
>
> on my test system (SLES11 SP1 dom0 with 2.6.32 kernel and current xen unstable)
> the hypervisor panics when I enter
>
> poweroff -f
>
> in dom0:
>
> (XEN) irq.c:1914: dom0: forcing unbind of pirq 278
> (XEN) irq.c:1914: dom0: forcing unbind of pirq 279
> (XEN) irq.c:1914: dom0: forcing unbind of pirq 280
> (XEN) irq.c:1914: dom0: forcing unbind of pirq 290
> (XEN) irq.c:1914: dom0: forcing unbind of pirq 291
> (XEN) irq.c:1914: dom0: forcing unbind of pirq 292
> (XEN) irq.c:1914: dom0: forcing unbind of pirq 293
> (XEN) irq.c:1914: dom0: forcing unbind of pirq 294
> [69430.691940] Power down.
> (XEN) Preparing system for ACPI S5 state.
> (XEN) Disabling non-boot CPUs ...
> (XEN) Broke affinity for irq 8
> (XEN) Xen BUG at smpboot.c:858
> (XEN) ----[ Xen-4.2-unstable  x86_64  debug=y  Tainted:    C ]----
> (XEN) CPU:    1
> (XEN) RIP:    e008:[<ffff82c48017b45a>] __cpu_disable+0x367/0x398
> (XEN) RFLAGS: 0000000000010286   CONTEXT: hypervisor
> (XEN) rax: 00000000fffffff5   rbx: 0000000000000004   rcx: ffff82c4802f5c40
> (XEN) rdx: ffff83033ea9ff18   rsi: 0000000000000004   rdi: ffff83033eb00478
> (XEN) rbp: ffff83033ea9fe40   rsp: ffff83033ea9fe00   r8:  0000000000000004
> (XEN) r9:  000000000000003f   r10: 00000000fffffffc   r11: 0000000000000001
> (XEN) r12: ffff82c4802f6ad0   r13: ffff82c4802f6ad0   r14: 0000000000000001
> (XEN) r15: ffff82c4802dbc60   cr0: 000000008005003b   cr4: 00000000000026b0
> (XEN) cr3: 00000000bf4ac000   cr2: 0000000000624710
> (XEN) ds: 002b   es: 002b   fs: 0000   gs: 0000   ss: e010   cs: e008
> (XEN) Xen stack trace from rsp=ffff83033ea9fe00:
> (XEN)    0000000000000001 0000000100000001 0000000400000001 0000000000000003
> (XEN)    ffff82c4802d07e4 ffff83033ea9ff18 ffff82c4802d07e8 ffff82c4802d07ec
> (XEN)    ffff83033ea9fe50 ffff82c480100dd7 ffff83033ea9fe90 ffff82c4801253c0
> (XEN)    ffff83033ea9fe70 ffff83033eaa60c0 ffff83033eaa60c0 0000000000000001
> (XEN)    ffff83033eaa6068 ffff83033eaa6040 ffff83033ea9feb0 ffff82c480126c85
> (XEN)    ffff83033eaa60f0 ffff83033eaa6110 ffff83033ea9fee0 ffff82c480126dba
> (XEN)    ffff83033ea9ff18 ffff83033ea9ff18 ffff82c480257380 ffff83033ea9ff18
> (XEN)    ffff83033ea9ff10 ffff82c4801591d5 0000000000000000 ffff8300bf2fe000
> (XEN)    ffff8300bf2fe000 00000000001e8480 ffff83033ea9fe00 0000000000000000
> (XEN)    0000000000000000 0000000000000000 0000000000000000 ffffffff8062e020
> (XEN)    ffff8800bf91dfd8 0000000000000246 00000000deadbeef 0000000000000001
> (XEN)    ffff8800bf91c000 0000000000000000 ffffffff8000330a 00000000deadbeef
> (XEN)    00000000deadbeef 00000000deadbeef 0000010000000000 ffffffff8000330a
> (XEN)    000000000000e033 0000000000000246 ffff8800bf91df18 000000000000e02b
> (XEN)    000000000000beef 000000000000beef 000000000000beef 000000000000beef
> (XEN)    0000000000000001 ffff8300bf2fe000 0000003ebe7b0400 0000000000000000
> (XEN) Xen call trace:
> (XEN)    [<ffff82c48017b45a>] __cpu_disable+0x367/0x398
> (XEN)    [<ffff82c480100dd7>] take_cpu_down+0x43/0x4a
> (XEN)    [<ffff82c4801253c0>] stopmachine_action+0xb3/0xd8
> (XEN)    [<ffff82c480126c85>] do_tasklet_work+0x8e/0xc6
> (XEN)    [<ffff82c480126dba>] do_tasklet+0x6d/0x9d
> (XEN)    [<ffff82c4801591d5>] idle_loop+0x74/0x7b
> (XEN)
> (XEN)
> (XEN) ****************************************
> (XEN) Panic on CPU 1:
> (XEN) Xen BUG at smpboot.c:858
> (XEN) ****************************************
> (XEN)
> (XEN) Reboot in five seconds...
>
>
> Juergen
>


-- 
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: juergen.gross@ts.fujitsu.com
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 00:49:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 00:49:55 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQEiJ-0000Zd-Lv; Tue, 15 Nov 2011 00:49:55 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQEhX-0000Mu-BR
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 00:49:07 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1321346944!3510155!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3639 invoked from network); 15 Nov 2011 08:49:04 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 08:49:04 -0000
X-IronPort-AV: E=Sophos;i="4.69,513,1315180800"; 
   d="scan'208";a="8933144"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 08:49:04 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Tue, 15 Nov 2011 08:49:04 +0000
Subject: Re: [Xen-devel] Get MFN from the pv linux guest
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Steven <wangwangkang@gmail.com>
Date: Tue, 15 Nov 2011 08:49:03 +0000
In-Reply-To: <CAMTrTqUup+6W80fTW_gsk62Bu0un-0G9MJKkVsnZ0LYV6nOniA@mail.gmail.com>
References: <CAMTrTqUup+6W80fTW_gsk62Bu0un-0G9MJKkVsnZ0LYV6nOniA@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1321346944.3664.99.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-11-15 at 05:06 +0000, Steven wrote:
> Dear All,
> I am trying get the machine frame number of the corresponding
> pseudo-physical page number in a PV Linux guest.
> Could anyone suggest which data structure I have to take a look? Thanks.

You need to look up in the p2m table. This is maintained by the guest OS
so the method for accessing it is a bit kernel specific but there is
generally a function like pfn_to_mfn() or so.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 00:52:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 00:52:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQEkY-0000yr-KT; Tue, 15 Nov 2011 00:52:14 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQEjw-0000mM-4Z
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 00:51:36 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1321347079!55037581!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10637 invoked from network); 15 Nov 2011 08:51:19 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 08:51:19 -0000
X-IronPort-AV: E=Sophos;i="4.69,513,1315180800"; 
   d="scan'208";a="8933220"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 08:51:32 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Tue, 15 Nov 2011 08:51:32 +0000
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "rshriram@cs.ubc.ca" <rshriram@cs.ubc.ca>
Date: Tue, 15 Nov 2011 08:51:32 +0000
In-Reply-To: <7e992e479411201fb9a0.1321311102@athos.nss.cs.ubc.ca>
References: <patchbomb.1321311101@athos.nss.cs.ubc.ca>
	<7e992e479411201fb9a0.1321311102@athos.nss.cs.ubc.ca>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1321347092.3664.100.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "brendan@cs.ubc.ca" <brendan@cs.ubc.ca>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, Ian
	Jackson <Ian.Jackson@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH 1 of 3 V7] tools/libxc: introduce
 xc_memalign in xc_{minios, linux, solaris, netbsd}.c
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, 2011-11-14 at 22:51 +0000, rshriram@cs.ubc.ca wrote:
> # HG changeset patch
> # User Shriram Rajagopalan <rshriram@cs.ubc.ca>
> # Date 1321309573 28800
> # Node ID 7e992e479411201fb9a0356f6f27966de7d48967
> # Parent  54a5e994a241a506900ee0e197bb42e5f1d8e759
> tools/libxc: introduce xc_memalign in xc_{minios,linux,solaris,netbsd}.c
> 
> Move (page aligned) buffer allocations in {os}_privcmd_alloc_hypercall_buffer
> into a global function xc_memalign. This API is also used by Remus
> compression code to allocate compression caches that need to be page aligned.
> 
> Signed-off-by: Shriram Rajagopalan <rshriram@cs.ubc.ca>
Acked-by: Ian Campbell <ian.campbell@citrix.com>

> 
> diff -r 54a5e994a241 -r 7e992e479411 tools/libxc/xc_linux.c
> --- a/tools/libxc/xc_linux.c	Wed Nov 02 17:09:09 2011 +0000
> +++ b/tools/libxc/xc_linux.c	Mon Nov 14 14:26:13 2011 -0800
> @@ -55,6 +55,18 @@
>      errno = saved_errno;
>  }
>  
> +void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
> +{
> +    int ret;
> +    void *ptr;
> +
> +    ret = posix_memalign(&ptr, alignment, size);
> +    if (ret != 0 || !ptr)
> +        return NULL;
> +
> +    return ptr;
> +}
> +
>  /*
>   * Local variables:
>   * mode: C
> diff -r 54a5e994a241 -r 7e992e479411 tools/libxc/xc_linux_osdep.c
> --- a/tools/libxc/xc_linux_osdep.c	Wed Nov 02 17:09:09 2011 +0000
> +++ b/tools/libxc/xc_linux_osdep.c	Mon Nov 14 14:26:13 2011 -0800
> @@ -91,10 +91,9 @@
>  {
>      size_t size = npages * XC_PAGE_SIZE;
>      void *p;
> -    int ret;
>  
> -    ret = posix_memalign(&p, XC_PAGE_SIZE, size);
> -    if (ret != 0 || !p)
> +    p = xc_memalign(xch, XC_PAGE_SIZE, size);
> +    if (!p)
>          return NULL;
>  
>      if ( mlock(p, size) < 0 )
> diff -r 54a5e994a241 -r 7e992e479411 tools/libxc/xc_minios.c
> --- a/tools/libxc/xc_minios.c	Wed Nov 02 17:09:09 2011 +0000
> +++ b/tools/libxc/xc_minios.c	Mon Nov 14 14:26:13 2011 -0800
> @@ -73,7 +73,7 @@
>  
>  static void *minios_privcmd_alloc_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, int npages)
>  {
> -    return memalign(PAGE_SIZE, npages * PAGE_SIZE);
> +    return xc_memalign(xch, PAGE_SIZE, npages * PAGE_SIZE);
>  }
>  
>  static void minios_privcmd_free_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, void *ptr, int npages)
> @@ -437,6 +437,11 @@
>          fsync(fd);
>  }
>  
> +void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
> +{
> +    return memalign(alignment, size);
> +}
> +
>  static xc_osdep_handle minios_gnttab_open(xc_gnttab *xcg)
>  {
>      int fd = alloc_fd(FTYPE_GNTMAP);
> diff -r 54a5e994a241 -r 7e992e479411 tools/libxc/xc_netbsd.c
> --- a/tools/libxc/xc_netbsd.c	Wed Nov 02 17:09:09 2011 +0000
> +++ b/tools/libxc/xc_netbsd.c	Mon Nov 14 14:26:13 2011 -0800
> @@ -71,8 +71,9 @@
>  static void *netbsd_privcmd_alloc_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, int npages)
>  {
>      size_t size = npages * XC_PAGE_SIZE;
> -    void *p = valloc(size);
> +    void *p;
>  
> +    p = xc_memalign(xch, XC_PAGE_SIZE, size);
>      if (!p)
>          return NULL;
>  
> @@ -378,6 +379,11 @@
>      errno = saved_errno;
>  }
>  
> +void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
> +{
> +    return valloc(size);
> +}
> +
>  static struct xc_osdep_ops *netbsd_osdep_init(xc_interface *xch, enum xc_osdep_type type)
>  {
>      switch ( type )
> diff -r 54a5e994a241 -r 7e992e479411 tools/libxc/xc_solaris.c
> --- a/tools/libxc/xc_solaris.c	Wed Nov 02 17:09:09 2011 +0000
> +++ b/tools/libxc/xc_solaris.c	Mon Nov 14 14:26:13 2011 -0800
> @@ -70,7 +70,7 @@
>  
>  static void *solaris_privcmd_alloc_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, int npages)
>  {
> -    return memalign(XC_PAGE_SIZE, npages * XC_PAGE_SIZE);
> +    return xc_memalign(xch, XC_PAGE_SIZE, npages * XC_PAGE_SIZE);
>  }
>  
>  static void solaris_privcmd_free_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, void *ptr, int npages)
> @@ -314,6 +314,11 @@
>      // TODO: Implement for Solaris!
>  }
>  
> +void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
> +{
> +    return memalign(alignment, size);
> +}
> +
>  static struct xc_osdep_ops *solaris_osdep_init(xc_interface *xch, enum xc_osdep_type type)
>  {
>      switch ( type )
> diff -r 54a5e994a241 -r 7e992e479411 tools/libxc/xenctrl.h
> --- a/tools/libxc/xenctrl.h	Wed Nov 02 17:09:09 2011 +0000
> +++ b/tools/libxc/xenctrl.h	Mon Nov 14 14:26:13 2011 -0800
> @@ -1129,6 +1129,8 @@
>                        uint64_t *time,
>                        xc_hypercall_buffer_t *data);
>  
> +void *xc_memalign(xc_interface *xch, size_t alignment, size_t size);
> +
>  /**
>   * Memory maps a range within one domain to a local address range.  Mappings
>   * should be unmapped with munmap and should follow the same rules as mmap



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 00:56:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 00:56:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQEp7-0001Q3-7f; Tue, 15 Nov 2011 00:56:57 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQEoK-0001Du-Df
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 00:56:08 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1321347364!4231706!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1282 invoked from network); 15 Nov 2011 08:56:05 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 08:56:05 -0000
X-IronPort-AV: E=Sophos;i="4.69,513,1315180800"; 
   d="scan'208";a="8933321"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 08:55:51 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Tue, 15 Nov 2011 08:55:51 +0000
Subject: Re: [Xen-devel] [PATCH 1 of 2] Add linker flags to makefile rules
	to enable cross compiling
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Date: Tue, 15 Nov 2011 08:55:51 +0000
In-Reply-To: <bf47f7aaf6694e6318dc.1321307632@xdev.gridcentric.ca>
References: <patchbomb.1321307631@xdev.gridcentric.ca>
	<bf47f7aaf6694e6318dc.1321307632@xdev.gridcentric.ca>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1321347351.3664.104.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "andres@gridcentric.ca" <andres@gridcentric.ca>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"adin@gridcentric.ca" <adin@gridcentric.ca>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, 2011-11-14 at 21:53 +0000, Andres Lagar-Cavilla wrote:
> config/x86_32.mk |  1 +
>  config/x86_64.mk |  1 +
>  2 files changed, 2 insertions(+), 0 deletions(-)
> 
> 
> For cross-compiling, the link step must also include necessary architecture
> flags (otherwise there's a mismatch between input objects and the output we're
> trying to produce).
> 
> Signed-off-by: Adin Scannell <adin@scannell.ca>
> 
> diff -r 1f9e4cde0093 -r bf47f7aaf669 config/x86_32.mk
> --- a/config/x86_32.mk
> +++ b/config/x86_32.mk
> @@ -8,6 +8,7 @@ CONFIG_XCUTILS := y
>  CONFIG_IOEMU := y
>  
>  CFLAGS += -m32 -march=i686
> +LDFLAGS += -m32 -march=i686

I think when Adin posted this we determined that it only worked by
coincidence, since when we invoke ld directly it is as
        ld $(LDFLAGS) -melf_x86_64
so while -m32 -march= are unknown to ld the -nelf_xx (which is a valid
ld option) takes precedence and things work ok.

The consensus then was that we need to split LDFLAGS-for-gcc-as-linker
from LDFLAGS-for-ld-directly into two variables. See Jan's response in
<4E844703020000780005868E@nat28.tlf.novell.com>.

Ian.

>  
>  # Use only if calling $(LD) directly.
>  LDFLAGS_DIRECT_OpenBSD = _obsd
> diff -r 1f9e4cde0093 -r bf47f7aaf669 config/x86_64.mk
> --- a/config/x86_64.mk
> +++ b/config/x86_64.mk
> @@ -9,6 +9,7 @@ CONFIG_XCUTILS := y
>  CONFIG_IOEMU := y
>  
>  CFLAGS += -m64
> +LDFLAGS += -m64
>  
>  LIBLEAFDIR = $(LIBLEAFDIR_x86_64)
>  LIBDIR = $(LIBDIR_x86_64)
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 01:12:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 01:12:04 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQF3i-00021y-WD; Tue, 15 Nov 2011 01:12:03 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQF2X-0001pH-Pr; Tue, 15 Nov 2011 01:10:51 -0800
X-Env-Sender: evammg@gmail.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1321348245!3150798!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6447 invoked from network); 15 Nov 2011 09:10:46 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-11.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 09:10:46 -0000
Received: by ggnk1 with SMTP id k1so3201686ggn.30
	for <multiple recipients>; Tue, 15 Nov 2011 01:10:45 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:from:date:message-id:subject:to
	:cc:content-type;
	bh=28h6DBWDZsyTS3vpAPyx93e3ASN62KMmdVoBYhw+2RI=;
	b=Tg30Qr6BlXBbwPhD+UxVDk7WdbdR88g6hlakXVtHaPndn2isb1v+WdvAbaQMlJHapf
	9TPRZ9IIf3UBlLpEH6gGjNwcNDl9UMCPwSh5dAlMEfkxvaxkn0dBFyEVpmu9CKW22Ofi
	IjjgQpvpSuxhUeKgPiO4rv/ycKAsMjkFlUvg4=
Received: by 10.50.180.193 with SMTP id dq1mr11979816igc.34.1321348245062;
	Tue, 15 Nov 2011 01:10:45 -0800 (PST)
MIME-Version: 1.0
Received: by 10.50.184.234 with HTTP; Tue, 15 Nov 2011 01:10:24 -0800 (PST)
In-Reply-To: <CAN-hevnvCFT3bCX9+_tsmVCG0TD0JRbFC9kD4Ae4dFVZySgKCg@mail.gmail.com>
References: <4EA96956.4070300@xen.org>
	<CAN-hevnvCFT3bCX9+_tsmVCG0TD0JRbFC9kD4Ae4dFVZySgKCg@mail.gmail.com>
From: eva <evammg@gmail.com>
Date: Tue, 15 Nov 2011 10:10:24 +0100
Message-ID: <CAN-hev=SoCViRZwM9TV7E+_-zesCuaTWDXBsm0ooEZY-iLRHRQ@mail.gmail.com>
To: Lars Kurth <lars.kurth@xen.org>
Content-Type: text/plain; charset=ISO-8859-1
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>
Subject: [Xen-devel] Re: [Xen-users] Xen Document Day : Thank You!
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 3 November 2011 14:48, eva <evammg@gmail.com> wrote:
>
> On 27 October 2011 16:23, Lars Kurth <lars.kurth@xen.org> wrote:
> >
> > Hi everybody!
> > I wanted to thank you for helping out with the document day. As far as I can see, we got quite a bit of stuff done:t, etc.
> >
> > [...]
> >
> > What did surprise me, is how little documentation for users there actually is on the Wiki. I thought we were in bad shape, but not that bad. Have to think about how to address this.
> >
> > We are also working on setting up a new wiki and then find a way to start migrating content over. It may make sense to have regular document days. Any views?
> >
> > Regards
> > Lars
> >
>
> Hello,
>
> My name is Eva and I am a newbie to Xen. The purpose is to make Xen
> works in our data center, as part of a research in the Ministry of
> Science in Spain, and hopefully move forward if things going as
> expected.
>
> So I am concerned about the documentation. I have created a twitter
> account for this:
>
> http://twitter.com/xenspain
>
> to post all the documentation related with Xen in Spanish when
> possible. Anyone that wants me to post articles in this twitter
> account, please just email me.
>
> Translating the documentation into Spanish is going to be a hard work,
> so if there's anyone that wants to help, it'll be welcome.
>
> So, at this point, I wonder where to post the translations. Maybe the
> bet the best place is the Xen wiki site. But I dont know if you guys
> agree or if you are ready now for this change.
>
> I'd like to translate not just the documentation of the wiki, but also
> any article I consider relevant on the web, like this one:
>
> http://blogs.oracle.com/wim/entry/linux_mainline_contains_all_the
>
> If no place is made for the spanish translation at the xen wiki, then
> I'll create a site to place the translations. No problem, just let me
> know what suits you the best.
>
>
> Regards

Hello,

As I said, I have started working on the documentation in Spanish.
I have decided to separte the articles from what is considered
"proper" documentation.
For the articles translated, I have just created a blog on blogger:

http://xenspain.blogspot.com/

For the documentation, I have created a repository on github and I
have uploaded the documentation to readthedocs:

http://readthedocs.org/docs/xenspain/en/latest/

I am aware you just changed the wiki. What I will probably do, is a
mix of both new and old wiki, translating some things from the old
wiki and some others from the new one, into Spanish.

Just letin' you know

Regards

Eva

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 02:08:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 02:08:47 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQFwb-0005HX-Lp; Tue, 15 Nov 2011 02:08:45 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQFtz-00052Y-Fj
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 02:06:20 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1321351558!3590478!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27620 invoked from network); 15 Nov 2011 10:05:58 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 10:05:58 -0000
X-IronPort-AV: E=Sophos;i="4.69,514,1315180800"; 
   d="scan'208";a="8935236"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 10:05:36 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Tue, 15 Nov 2011 10:05:36 +0000
Subject: Re: [Xen-devel] xen-unstable/staging: qemu git file corrupt
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Juergen Gross <juergen.gross@ts.fujitsu.com>
Date: Tue, 15 Nov 2011 10:05:36 +0000
In-Reply-To: <4EC213DA.7060405@ts.fujitsu.com>
References: <4EC213DA.7060405@ts.fujitsu.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1321351536.3664.110.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-11-15 at 07:25 +0000, Juergen Gross wrote:
> error: File efd594c960330cc3eee44e65f5fee258c798e610 
> (http://xenbits.xensource.com/git-http/qemu-xen-unstable.git/objects/8a/d9c9e46bb1fea94e589c0ae062dab921ad86a5) 
> corrupt
> error: Unable to find 8ad9c9e46bb1fea94e589c0ae062dab921ad86a5 under 
> http://xenbits.xensource.com/git-http/qemu-xen-unstable.git
> Cannot obtain needed blob 8ad9c9e46bb1fea94e589c0ae062dab921ad86a5
> while processing commit 249139f4e6e9ff8dfd2086d4e3fdfda8b1c53bac.
> fatal: Fetch failed.

Seems ok to me right now, via both http:// and git://. a transient issue
or problem on your end perhaps?

Ian.




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 02:34:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 02:34:18 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQGLK-00084h-LE; Tue, 15 Nov 2011 02:34:18 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQGKj-0007qP-Gq
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 02:33:41 -0800
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1321353217!3176948!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19117 invoked from network); 15 Nov 2011 10:33:38 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 10:33:38 -0000
Received: by ggnk1 with SMTP id k1so3330258ggn.30
	for <xen-devel@lists.xensource.com>;
	Tue, 15 Nov 2011 02:33:36 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:cc:content-type
	:content-transfer-encoding;
	bh=3iLEwYd+76nF0W8qqcMZU1AjkzOL7tsMmO4/DZXRdfA=;
	b=Y9Q+RaT5sQju3qNbtC/dRTY1pUrK4eyYrEOV3U2sx2VSaxlyQA+eBxV4Pl7hpjp1Ev
	Cc+iN2bCHTwetbQMF2YLpjNY4shKf0OJ5KIInMI0b2uFV9nr2zi3TCCTNXVCE4QJF75f
	+nR0P5t+UBkUPtgfbNU9d8reis0uqGnSaWPLE=
MIME-Version: 1.0
Received: by 10.50.169.1 with SMTP id aa1mr27966445igc.9.1321353216249; Tue,
	15 Nov 2011 02:33:36 -0800 (PST)
Received: by 10.231.169.13 with HTTP; Tue, 15 Nov 2011 02:33:36 -0800 (PST)
In-Reply-To: <43dd4fdbf53935a42568.1321307324@xdev.gridcentric.ca>
References: <patchbomb.1321307321@xdev.gridcentric.ca>
	<43dd4fdbf53935a42568.1321307324@xdev.gridcentric.ca>
Date: Tue, 15 Nov 2011 10:33:36 +0000
X-Google-Sender-Auth: Lwz5-kcpgdc7NgOXhkxhREIBLp0
Message-ID: <CAFLBxZZi9vr5qyeSGNDmMOcmqrPkYDE5DQkMByBHOapYUYxyBw@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 3 of 6] Make HAP log dirty disable return the
	correct rc
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 9:48 PM, Andres Lagar-Cavilla
<andres@lagarcavilla.org> wrote:
> =A0xen/arch/x86/mm/hap/hap.c | =A01 +
> =A01 files changed, 1 insertions(+), 0 deletions(-)
>
>
> Disabling log dirty mode in HAP always returns -EINVAL. Make it
> return the correct rc on success.
>
> Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
>
> diff -r 1ef55d87b459 -r 43dd4fdbf539 xen/arch/x86/mm/hap/hap.c
> --- a/xen/arch/x86/mm/hap/hap.c
> +++ b/xen/arch/x86/mm/hap/hap.c
> @@ -709,6 +709,7 @@ int hap_domctl(struct domain *d, xen_dom
> =A0 =A0 =A0 =A0 return rc;
> =A0 =A0 case XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION:
> =A0 =A0 =A0 =A0 sc->mb =3D hap_get_allocation(d);
> + =A0 =A0case XEN_DOMCTL_SHADOW_OP_OFF:
> =A0 =A0 =A0 =A0 return 0;
> =A0 =A0 default:
> =A0 =A0 =A0 =A0 HAP_ERROR("Bad hap domctl op %u\n", sc->op);

I think you should always put "/* FALLTHRU */" when you're falling
through from one case statement to the next.  Or just "return 0" for
the case above and let the compiler optimize it.

 -George

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 02:35:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 02:35:20 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQGMK-0008SK-09; Tue, 15 Nov 2011 02:35:20 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQGKl-0007qQ-7y
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 02:33:44 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1321353219!1610930!1
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29967 invoked from network); 15 Nov 2011 10:33:39 -0000
Received: from dgate20.ts.fujitsu.com (HELO dgate20.ts.fujitsu.com)
	(80.70.172.51)
	by server-7.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 10:33:39 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Message-ID:Date:From:Organization:
	User-Agent:MIME-Version:To:CC:Subject:References:
	In-Reply-To:Content-Type:Content-Transfer-Encoding;
	b=YPbLuIj8RtY0lGDTERmYAAbOuB7Z4vtY7wcexIp3b34ezOKyaEtNywOG
	8KxkYMGyXAJIWHvBTr/IUH0JuWnMogdIj9ZJpmiXkCMP0TCaUQgb8PpBx
	4FYs8pZeHZ3lFx/SnXHe//dlIWhxGJ1wAqAQXgI1x0RnubXnaucbTiOc3
	rBf6jXbs708X/SgNeAjr2vVpi31s1ntvtLaTQonNkbJd2OaDoj8e9UAdt
	AFA6tdNqhI69UaRWlC/JRd0Nr0grL;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1321353220; x=1352889220;
	h=message-id:date:from:mime-version:to:cc:subject:
	references:in-reply-to:content-transfer-encoding;
	bh=2haFArKK8UV7j3KZkyAXcC3RzBuMkGMPt5N1yq0DIIY=;
	b=q71lgNW5jVv/xHswnCnW9eqDWsTgUlz48du0wIJ/c9h0VyrBddA94W00
	Gp4GrdFwLZvNMgRNtD+6vH4wNlMLuTHM0fNWNFTmgwueLPh0cr2sLn7FT
	Ws0vIsCU6KlVNpONwGXc9L0Z8cOjGNjrW3qs00ugo7Jy5VzWTTPOj8m+a
	VS9fuIL1mHM0G+LmpwKEN11g5urJU4tgRHElualTwQ6G5E8mvG21iqWa2
	ldLNdHw4sNKBJdmCD9i2Av8FvjTRd;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,514,1315173600"; d="scan'208";a="79025731"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate20u.abg.fsc.net with ESMTP; 15 Nov 2011 11:33:39 +0100
X-IronPort-AV: E=Sophos;i="4.69,514,1315173600"; d="scan'208";a="123079391"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 15 Nov 2011 11:33:39 +0100
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id 0FB8B3E524F;
	Tue, 15 Nov 2011 11:33:39 +0100 (CET)
Message-ID: <4EC24003.907@ts.fujitsu.com>
Date: Tue, 15 Nov 2011 11:33:39 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
Organization: Fujitsu Technology Solutions
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20111010 Iceowl/1.0b2 Icedove/3.1.15
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] xen-unstable/staging: qemu git file corrupt
References: <4EC213DA.7060405@ts.fujitsu.com>
	<1321351536.3664.110.camel@zakaz.uk.xensource.com>
In-Reply-To: <1321351536.3664.110.camel@zakaz.uk.xensource.com>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/15/2011 11:05 AM, Ian Campbell wrote:
> On Tue, 2011-11-15 at 07:25 +0000, Juergen Gross wrote:
>> error: File efd594c960330cc3eee44e65f5fee258c798e610
>> (http://xenbits.xensource.com/git-http/qemu-xen-unstable.git/objects/8a/d9c9e46bb1fea94e589c0ae062dab921ad86a5)
>> corrupt
>> error: Unable to find 8ad9c9e46bb1fea94e589c0ae062dab921ad86a5 under
>> http://xenbits.xensource.com/git-http/qemu-xen-unstable.git
>> Cannot obtain needed blob 8ad9c9e46bb1fea94e589c0ae062dab921ad86a5
>> while processing commit 249139f4e6e9ff8dfd2086d4e3fdfda8b1c53bac.
>> fatal: Fetch failed.
> Seems ok to me right now, via both http:// and git://. a transient issue
> or problem on your end perhaps?

Strange. The problem occurs always at the same line. I have to use http:// via
a proxy. A test with another proxy (slower connection) works.

So it IS a problem on my end, but finding it will be hard, I guess.

Thanks for checking!


Juergen

-- 
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: juergen.gross@ts.fujitsu.com
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 03:14:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 03:14:25 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQGy7-0001Fz-Gz; Tue, 15 Nov 2011 03:14:23 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQGuH-0000zk-Li
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 03:10:28 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1321355422!4257149!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31466 invoked from network); 15 Nov 2011 11:10:22 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-11.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 15 Nov 2011 11:10:22 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 15 Nov 2011 11:10:21 +0000
Message-Id: <4EC256AD02000078000610C4@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 15 Nov 2011 11:10:21 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Andrew Cooper" <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: prevent vector sharing within
	IO-APICs
References: <4EBD54B80200007800060776@nat28.tlf.novell.com>
	<4EBD579F.70901@citrix.com>
	<4EC0E6010200007800060B29@nat28.tlf.novell.com>
	<4EC11EAB.80400@citrix.com>
	<4EC131B60200007800060C9B@nat28.tlf.novell.com>
	<4EC13367.9080209@citrix.com>
	<4EC14FFE0200007800060D18@nat28.tlf.novell.com>
	<4EC150EC.3020100@citrix.com>
In-Reply-To: <4EC150EC.3020100@citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 14.11.11 at 18:33, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
> On 14/11/11 16:29, Jan Beulich wrote:
>>>>> On 14.11.11 at 16:27, Andrew Cooper <andrew.cooper3@citrix.com> =
wrote:
>>> On 14/11/11 14:20, Jan Beulich wrote:
>>>> I'm having some more fundamental problem with this original change
>>>> of yours: The assignment of the new vector happens in the context
>>>> of move_native_irq(), which gets called *after* doing the manual
>>>> EOI (and hence also *after* the vector !=3D desc->arch.vector check).
>>>> How does that do what it is supposed to?
>>>>
>>>> (Below the [untested] patch that I would propose to do what I =
described
>>>> above, pending your clarification regarding the original change.)
>>>>
>>>> Jan
>>> Are you sure?  I was under the impression that for safety, you have to
>>> move the IRQ before ack'ing it at the local APIC, to prevent another =
IRQ
>>> coming in while you are updating the structures.
>> Just take another look at end_level_ioapic_irq().
>=20
> If it makes a difference, I was debugging the issue on boxes without
> x2APIC, so there was no direct EOI support.  Given the number of times

Directed EOI has nothing to do with x2apic.

> the code conditionally returns depending on direct_eoi_enabled, I would
> not be surprised if there are two separate codepaths.
>...
>> But the crucial thing is that desc->arch.vector gets written during =
step 2,
>> and hence the condition around the EOI can never be true unless an
>> interrupt surfaces in the window between the EOI in step 2 and the
>> disabling of it in move_native_irq(). Was it just this special case =
that
>> your original change addressed (the change description doesn't hint in
>> that direction).
>=20
> Given that the bug was certainly a timing issue, and most of the time
> the IRQ migrated, everything worked fine, It is quite possible that it
> was a new IRQ appearing in that window.  Having said that, even if a new
> IRQ arrived, its remote IRR should not be set until the LAPIC has acked
> it, at which point we should be in the IRQ handler for it which seems
> rather hard if we are still in the handler for the previous IRQ.=20

No - the LAPIC acking the IO-APIC request doesn't mean the IRQ
is already in the process of being handled by software. In particular,
while the first IRQ is in progress, the IRR bit could get set by a
second interrupt instance between the EOI and the disabling (in
move_native_irq()), bit EFLAGS.IF would still be zero. Once sti (or
an equivalent thereof) would get executed, that second interrupt
would get delivered from the LAPIC to the execution unit, and the
mask-and-ack would invoke irq_complete_move(), which in turn
might send the cleanup IPI (which in turn wouldn't get delivered
until EFLAGS.IF became 1 again). Depending on whether the IPI
arrives before or after end_level_ioapic_irq() runs for this second
interrupt instance, the vectors may or may appear to be out of
sync (and here the description of your original change seems
wrong - you're using the new vector, not the old one, as you
want to make sure that the vector written actually matches the
already updated RTE(s)).

> Perhaps there is a weird interaction whereby acking a masked level
> interrupt doesn't reset the IRR.
>=20
> I have to admit that the logic seems a bit broken, and it certainly
> seems to be more complicated than it needs to be.
>=20
>>> An alternative to 3) can occur when using the IRQ_MOVE_CLEANUP_VECTOR
>>> IPI which looks through all pending cleanups on the current pcpu and
>>> cleans them up.
>>>
>>> Anyway, it was certainly the case that I saw the RTE being updated
>>> before the EOI was sent, which is why I had to change the
>>> hw_irq_controler.end interface to include the vector from the pending
>>> EOI stack, so end_level_ioapic_irq could EOI the new vector if it was
>>> different from the vector the lapic saw.
>> That's another thing I would want to revert: There really shouldn't be
>> a need to pass in the old vector, as it is getting stored in
>> __assign_irq_vector(). If the value wasn't valid anymore at the point
>> we'd need it, we'd have a more severe problem - the vector gets
>> marked as not in use by smp_irq_move_cleanup_interrupt(), and
>> hence it wouldn't be valid anymore to play with it (read: EOI it) as
>> it may have got re-used already. As vector_irq[] gets updated there
>> too, that should result in "No irq handler for vector ...", but it =
would
>> not make it into end_level_ioapic_irq() in such a case.
>>
>> Jan
>=20
> That is fair enough.  When I submitted this patch, irq_cfg did not have
> old_vector in it - I added old_vector in a later patch.  I really should
> have remembered that I could then revert the change to the interface.

The point is that we need to be sure that ->arch.old_vector is still valid
at this point. Yesterday I though I convinced myself that it would be,
but today I'm again not certain anymore.

Jan

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 03:40:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 03:40:01 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQHMu-00023h-Ip; Tue, 15 Nov 2011 03:40:00 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQHMC-0001rf-O2
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 03:39:17 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1321357152!1624706!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23862 invoked from network); 15 Nov 2011 11:39:13 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-15.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 11:39:13 -0000
X-IronPort-AV: E=Sophos;i="4.69,514,1315195200"; d="scan'208";a="19105473"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 06:39:11 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Tue, 15 Nov 2011 06:39:11 -0500
Received: from cosworth.uk.xensource.com (cosworth.uk.xensource.com
	[10.80.16.52])	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	pAFBdA4F018396;	Tue, 15 Nov 2011 03:39:10 -0800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 3cfb8f2c4ce898414279d7162206be812584bd5b
Message-ID: <3cfb8f2c4ce898414279.1321357149@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 15 Nov 2011 11:39:09 +0000
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH] xen: avoid crash enabling turbo mode
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1321356497 0
# Node ID 3cfb8f2c4ce898414279d7162206be812584bd5b
# Parent  955a6c07dc5e9c55316d1678b2b7cc4313f4fd57
xen: avoid crash enabling turbo mode

On a system which has not had P-state information pushed down into the
hypervisor running "xenpm enable-turbo-mode" will reliably crash the host.

(XEN) PM OP 38 on CPU0
(XEN) ----[ Xen-4.2-unstable  x86_64  debug=y  Not tainted ]----
(XEN) CPU:    0
(XEN) RIP:    e008:[<ffff82c48013ceed>] cpufreq_enable_turbo+0x1d/0x29
(XEN) RFLAGS: 0000000000010297   CONTEXT: hypervisor
(XEN) rax: 0000000000000000   rbx: ffff82c48029fe40   rcx: 0000000000000000
(XEN) rdx: 0000000000000000   rsi: 000000000000000a   rdi: 0000000000000000
(XEN) rbp: ffff82c48029fd08   rsp: ffff82c48029fd08   r8:  0000000000000004
(XEN) r9:  0000000000000000   r10: 00000000fffffffd   r11: ffff82c480218f20
(XEN) r12: ffff830106e720b0   r13: 0000000000000000   r14: ffff82c4802bff80
(XEN) r15: ffff82c48025c0e4   cr0: 000000008005003b   cr4: 00000000000026f0
(XEN) cr3: 000000011f459000   cr2: 0000000000000051
(XEN) ds: 007b   es: 007b   fs: 00d8   gs: 0033   ss: 0000   cs: e008
(XEN) Xen stack trace from rsp=ffff82c48029fd08:
(XEN)    ffff82c48029fdb8 ffff82c48014c427 ffff82c48029fd98 ffff82c48016b2d6
(XEN)    ffff82c48029fdb8 ffff82c48029fd60 00000000001196c5 0000000116bbe025
(XEN)    0000000116bbe025 ffff8301196c5338 ffff82f6022d77c0 0000000000000000
(XEN)    ffff82f60205edf0 0000000000000000 0000000000000000 ffff8300dffba000
(XEN)    ffff82c48029fdb8 ffff82c48029ff18 0000000008050004 0000000000000000
(XEN)    ffff82c4802bff80 ffff82c48025c0e4 ffff82c48029fef8 ffff82c480124fd8
(XEN)    0000000000000000 ffff83011f48c000 0000000116bbe025 0000000000000025
(XEN)    ffff82c48029fe28 0000000080167722 ffff82c48029ff08 ffff83011f48c000
(XEN)    ffff82f60232d8a0 ffff8300dffba000 ffff83011f48c000 ffff82f60232d8a0
(XEN)    ffff82c48029fed8 ffff82c48017296a 000000080000000c 0000000000000026
(XEN)    bfb338b000000000 bfb33874bfb33868 b78988f800000000 0000008800000000
(XEN)    b787a6e0b78533a0 ffffffff00000001 080487aeb7897ff4 bfb3389000000001
(XEN)    b7898ab0b7889626 0000000100000000 0000000000000001 0804867800000001
(XEN)    000000000804e998 00000000b78533a0 bfb33e70bfb33a7c 0000000000000000
(XEN)    0000000000000000 ffff8300dffba000 0000000000000000 0000000000000000
(XEN)    0000000000000000 0000000000000000 00007d3b7fd600c7 ffff82c48021511e
(XEN)    00000000c1002467 0000000000000023 0000000000000000 0000000000000000
(XEN)    0000000000000000 0000000000000000 00000000dbf5bef8 0000000008050004
(XEN)    0000000000000000 0000000000000000 0000000000000000 0000000000000000
(XEN)    0000000000000023 00000000bfb33874 00000000bfb33868 0000000000000000
(XEN) Xen call trace:
(XEN)    [<ffff82c48013ceed>] cpufreq_enable_turbo+0x1d/0x29
(XEN)    [<ffff82c48014c427>] do_pm_op+0x884/0x8e7
(XEN)    [<ffff82c480124fd8>] do_sysctl+0x6d8/0x9f0
(XEN)    [<ffff82c48021511e>] compat_hypercall+0xae/0x107
(XEN)
(XEN) Pagetable walk from 0000000000000051:
(XEN)  L4[0x000] = 0000000116dbc027 000000000001bd22
(XEN)  L3[0x000] = 0000000119ba8027 000000000001eb36
(XEN)  L2[0x000] = 0000000000000000 ffffffffffffffff
(XEN)
(XEN) ****************************************
(XEN) Panic on CPU 0:
(XEN) FATAL PAGE FAULT
(XEN) [error_code=0000]
(XEN) Faulting linear address: 0000000000000051
(XEN) ****************************************
(XEN)

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: Winston Wang <winston.l.wang@intel.com>
Cc: Gang Wei <gang.wei@intel.com>
Cc: Mark Langsdorf <mark.langsdorf@amd.com>
Cc: Jan Beulich <jbeulich@suse.com>

diff -r 955a6c07dc5e -r 3cfb8f2c4ce8 xen/drivers/cpufreq/utility.c
--- a/xen/drivers/cpufreq/utility.c	Tue Oct 18 10:33:32 2011 +0100
+++ b/xen/drivers/cpufreq/utility.c	Tue Nov 15 11:28:17 2011 +0000
@@ -396,7 +396,7 @@ void cpufreq_enable_turbo(int cpuid)
     struct cpufreq_policy *policy;
 
     policy = per_cpu(cpufreq_cpu_policy, cpuid);
-    if (policy->turbo != CPUFREQ_TURBO_UNSUPPORTED)
+    if (policy && policy->turbo != CPUFREQ_TURBO_UNSUPPORTED)
         policy->turbo = CPUFREQ_TURBO_ENABLED;
 }
 
@@ -405,7 +405,7 @@ void cpufreq_disable_turbo(int cpuid)
     struct cpufreq_policy *policy;
 
     policy = per_cpu(cpufreq_cpu_policy, cpuid);
-    if (policy->turbo != CPUFREQ_TURBO_UNSUPPORTED)
+    if (policy && policy->turbo != CPUFREQ_TURBO_UNSUPPORTED)
         policy->turbo = CPUFREQ_TURBO_DISABLED;
 }
 
@@ -414,7 +414,7 @@ int cpufreq_get_turbo_status(int cpuid)
     struct cpufreq_policy *policy;
 
     policy = per_cpu(cpufreq_cpu_policy, cpuid);
-    return policy->turbo;
+    return policy && policy->turbo;
 }
 
 /*********************************************************************

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 04:17:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 04:17:36 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQHxF-00039n-Si; Tue, 15 Nov 2011 04:17:34 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQHuU-0002uO-8Q
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 04:15:38 -0800
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1321359277!1621262!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16798 invoked from network); 15 Nov 2011 12:14:38 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-2.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 12:14:38 -0000
Received: by ggnk1 with SMTP id k1so3462582ggn.30
	for <xen-devel@lists.xensource.com>;
	Tue, 15 Nov 2011 04:14:37 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:cc:content-type
	:content-transfer-encoding;
	bh=BCZADOl8l8Q4gdl2fOl8VL3HIGmNQYmW0NEzkbE7lmw=;
	b=W0Zj+FRvxeSZ57Qjbo0w8BWmYJHskH9xz/JYqNIr9Tzut54uB4QB5ED3CozroTMAHm
	7WqEG0AmHgVqECzQtURjg5ZH4fnwWslPNiv7H0l+OfvnxIsOyQzWbtSdIyAnXNf+BQRW
	wqwsd//O8qLvCV4C3DaLgit2YxoicXwl46FyY=
MIME-Version: 1.0
Received: by 10.50.149.165 with SMTP id ub5mr19940332igb.23.1321359277033;
	Tue, 15 Nov 2011 04:14:37 -0800 (PST)
Received: by 10.231.169.13 with HTTP; Tue, 15 Nov 2011 04:14:36 -0800 (PST)
In-Reply-To: <764e0872dd4f50c70fbc.1321307326@xdev.gridcentric.ca>
References: <patchbomb.1321307321@xdev.gridcentric.ca>
	<764e0872dd4f50c70fbc.1321307326@xdev.gridcentric.ca>
Date: Tue, 15 Nov 2011 12:14:36 +0000
X-Google-Sender-Auth: Xw0XriOPu65JB1dWwIz7KKlC72Y
Message-ID: <CAFLBxZY4omZnfOUAV5OtOmANWdy+WqbefngHStA8QnGYm573nw@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 5 of 6] Rework stale p2m auditing
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 9:48 PM, Andres Lagar-Cavilla
<andres@lagarcavilla.org> wrote:
> =A0xen/arch/x86/domctl.c =A0 =A0 =A0 | =A0 24 +++++++
> =A0xen/arch/x86/mm/p2m-ept.c =A0 | =A0 =A01 +
> =A0xen/arch/x86/mm/p2m-pod.c =A0 | =A0 =A05 -
> =A0xen/arch/x86/mm/p2m-pt.c =A0 =A0| =A0137 +++++++----------------------=
--------------
> =A0xen/arch/x86/mm/p2m.c =A0 =A0 =A0 | =A0124 +++++++++++++++++++++++++++=
+++++++++---
> =A0xen/include/asm-x86/p2m.h =A0 | =A0 11 ++-
> =A0xen/include/public/domctl.h | =A0 12 +++
> =A07 files changed, 180 insertions(+), 134 deletions(-)
>
>
> The p2m audit code doesn't even compile, let alone work. It also
> partially supports ept. Make it:
>
> - compile
> - lay groundwork for eventual ept support

This stuff looks good (haven't reviewed it in detail), but...

> - move out of the way of all calls and turn it into a domctl. It's
> =A0obviously not being used by anybody presently.
> - enable it via said domctl

..the idea with having audit_p2m() sprinkled around the code was to
help narrow down what bit of code was screwing up the p2m table.  I'm
not sure switching it to a domctl will really help debugging in the
future.  How were you envisioning this would be used?

>
> Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
>
> diff -r f11528df1df3 -r 764e0872dd4f xen/arch/x86/domctl.c
> --- a/xen/arch/x86/domctl.c
> +++ b/xen/arch/x86/domctl.c
> @@ -1449,6 +1449,30 @@ long arch_do_domctl(
> =A0 =A0 break;
> =A0#endif /* __x86_64__ */
>
> + =A0 =A0case XEN_DOMCTL_audit_p2m:
> + =A0 =A0{
> + =A0 =A0 =A0 =A0struct domain *d;
> +
> + =A0 =A0 =A0 =A0ret =3D -ESRCH;
> + =A0 =A0 =A0 =A0d =3D rcu_lock_domain_by_id(domctl->domain);
> + =A0 =A0 =A0 =A0if ( d !=3D NULL )
> + =A0 =A0 =A0 =A0{
> +#if P2M_AUDIT
> + =A0 =A0 =A0 =A0 =A0 =A0audit_p2m(d,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&domctl->u.audit_p2m.orphans=
_debug,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&domctl->u.audit_p2m.orphans=
_invalid,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&domctl->u.audit_p2m.m2p_bad=
,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&domctl->u.audit_p2m.p2m_bad=
);
> + =A0 =A0 =A0 =A0 =A0 =A0ret =3D (copy_to_guest(u_domctl, domctl, 1)) ?
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0-EFAULT : 0;
> +#else
> + =A0 =A0 =A0 =A0 =A0 =A0ret =3D -ENOSYS;
> +#endif /* P2M_AUDIT */
> + =A0 =A0 =A0 =A0 =A0 =A0rcu_unlock_domain(d);
> + =A0 =A0 =A0 =A0}
> + =A0 =A0}
> + =A0 =A0break;
> +
> =A0 =A0 case XEN_DOMCTL_set_access_required:
> =A0 =A0 {
> =A0 =A0 =A0 =A0 struct domain *d;
> diff -r f11528df1df3 -r 764e0872dd4f xen/arch/x86/mm/p2m-ept.c
> --- a/xen/arch/x86/mm/p2m-ept.c
> +++ b/xen/arch/x86/mm/p2m-ept.c
> @@ -817,6 +817,7 @@ void ept_p2m_init(struct p2m_domain *p2m
> =A0 =A0 p2m->set_entry =3D ept_set_entry;
> =A0 =A0 p2m->get_entry =3D ept_get_entry;
> =A0 =A0 p2m->change_entry_type_global =3D ept_change_entry_type_global;
> + =A0 =A0p2m->audit_p2m =3D NULL;
> =A0}
>
> =A0static void ept_dump_p2m_table(unsigned char key)
> diff -r f11528df1df3 -r 764e0872dd4f xen/arch/x86/mm/p2m-pod.c
> --- a/xen/arch/x86/mm/p2m-pod.c
> +++ b/xen/arch/x86/mm/p2m-pod.c
> @@ -522,7 +522,6 @@ p2m_pod_decrease_reservation(struct doma
> =A0 =A0 steal_for_cache =3D =A0( p2m->pod.entry_count > p2m->pod.count );
>
> =A0 =A0 p2m_lock(p2m);
> - =A0 =A0audit_p2m(p2m, 1);
>
> =A0 =A0 if ( unlikely(d->is_dying) )
> =A0 =A0 =A0 =A0 goto out_unlock;
> @@ -616,7 +615,6 @@ out_entry_check:
> =A0 =A0 }
>
> =A0out_unlock:
> - =A0 =A0audit_p2m(p2m, 1);
> =A0 =A0 p2m_unlock(p2m);
>
> =A0out:
> @@ -986,7 +984,6 @@ p2m_pod_demand_populate(struct p2m_domai
> =A0 =A0 =A0 =A0 =A0*/
> =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gfn_aligned, _mfn(0), PAGE_ORDER_2M,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 p2m_populate_on_demand, p2m->=
default_access);
> - =A0 =A0 =A0 =A0audit_p2m(p2m, 1);
> =A0 =A0 =A0 =A0 return 0;
> =A0 =A0 }
>
> @@ -1108,7 +1105,6 @@ guest_physmap_mark_populate_on_demand(st
> =A0 =A0 =A0 =A0 return rc;
>
> =A0 =A0 p2m_lock(p2m);
> - =A0 =A0audit_p2m(p2m, 1);
>
> =A0 =A0 P2M_DEBUG("mark pod gfn=3D%#lx\n", gfn);
>
> @@ -1142,7 +1138,6 @@ guest_physmap_mark_populate_on_demand(st
> =A0 =A0 =A0 =A0 BUG_ON(p2m->pod.entry_count < 0);
> =A0 =A0 }
>
> - =A0 =A0audit_p2m(p2m, 1);
> =A0 =A0 p2m_unlock(p2m);
>
> =A0out:
> diff -r f11528df1df3 -r 764e0872dd4f xen/arch/x86/mm/p2m-pt.c
> --- a/xen/arch/x86/mm/p2m-pt.c
> +++ b/xen/arch/x86/mm/p2m-pt.c
> @@ -483,7 +483,6 @@ static int p2m_pod_check_and_populate(st
> =A0 =A0 /* This is called from the p2m lookups, which can happen with or
> =A0 =A0 =A0* without the lock hed. */
> =A0 =A0 p2m_lock_recursive(p2m);
> - =A0 =A0audit_p2m(p2m, 1);
>
> =A0 =A0 /* Check to make sure this is still PoD */
> =A0 =A0 if ( p2m_flags_to_type(l1e_get_flags(*p2m_entry)) !=3D p2m_popula=
te_on_demand )
> @@ -494,7 +493,6 @@ static int p2m_pod_check_and_populate(st
>
> =A0 =A0 r =3D p2m_pod_demand_populate(p2m, gfn, order, q);
>
> - =A0 =A0audit_p2m(p2m, 1);
> =A0 =A0 p2m_unlock(p2m);
>
> =A0 =A0 return r;
> @@ -975,118 +973,23 @@ static void p2m_change_type_global(struc
>
> =A0}
>
> -/* Set up the p2m function pointers for pagetable format */
> -void p2m_pt_init(struct p2m_domain *p2m)
> +#if P2M_AUDIT
> +long p2m_pt_audit_p2m(struct p2m_domain *p2m)
> =A0{
> - =A0 =A0p2m->set_entry =3D p2m_set_entry;
> - =A0 =A0p2m->get_entry =3D p2m_gfn_to_mfn;
> - =A0 =A0p2m->change_entry_type_global =3D p2m_change_type_global;
> - =A0 =A0p2m->write_p2m_entry =3D paging_write_p2m_entry;
> -}
> -
> -
> -#if P2M_AUDIT
> -/* strict_m2p =3D=3D 0 allows m2p mappings that don'#t match the p2m.
> - * It's intended for add_to_physmap, when the domain has just been alloc=
ated
> - * new mfns that might have stale m2p entries from previous owners */
> -void audit_p2m(struct p2m_domain *p2m, int strict_m2p)
> -{
> - =A0 =A0struct page_info *page;
> - =A0 =A0struct domain *od;
> - =A0 =A0unsigned long mfn, gfn, m2pfn, lp2mfn =3D 0;
> =A0 =A0 int entry_count =3D 0;
> - =A0 =A0mfn_t p2mfn;
> - =A0 =A0unsigned long orphans_d =3D 0, orphans_i =3D 0, mpbad =3D 0, pmb=
ad =3D 0;
> + =A0 =A0unsigned long pmbad =3D 0;
> + =A0 =A0unsigned long mfn, gfn, m2pfn;
> =A0 =A0 int test_linear;
> - =A0 =A0p2m_type_t type;
> =A0 =A0 struct domain *d =3D p2m->domain;
>
> - =A0 =A0if ( !paging_mode_translate(d) )
> - =A0 =A0 =A0 =A0return;
> -
> - =A0 =A0//P2M_PRINTK("p2m audit starts\n");
> + =A0 =A0ASSERT(p2m_locked_by_me(p2m));
>
> =A0 =A0 test_linear =3D ( (d =3D=3D current->domain)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 && !pagetable_is_null(current->ar=
ch.monitor_table) );
> =A0 =A0 if ( test_linear )
> =A0 =A0 =A0 =A0 flush_tlb_local();
>
> - =A0 =A0spin_lock(&d->page_alloc_lock);
> -
> - =A0 =A0/* Audit part one: walk the domain's page allocation list, check=
ing
> - =A0 =A0 * the m2p entries. */
> - =A0 =A0page_list_for_each ( page, &d->page_list )
> - =A0 =A0{
> - =A0 =A0 =A0 =A0mfn =3D mfn_x(page_to_mfn(page));
> -
> - =A0 =A0 =A0 =A0// P2M_PRINTK("auditing guest page, mfn=3D%#lx\n", mfn);
> -
> - =A0 =A0 =A0 =A0od =3D page_get_owner(page);
> -
> - =A0 =A0 =A0 =A0if ( od !=3D d )
> - =A0 =A0 =A0 =A0{
> - =A0 =A0 =A0 =A0 =A0 =A0P2M_PRINTK("wrong owner %#lx -> %p(%u) !=3D %p(%=
u)\n",
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn, od, (od?od->domain_id:=
-1), d, d->domain_id);
> - =A0 =A0 =A0 =A0 =A0 =A0continue;
> - =A0 =A0 =A0 =A0}
> -
> - =A0 =A0 =A0 =A0gfn =3D get_gpfn_from_mfn(mfn);
> - =A0 =A0 =A0 =A0if ( gfn =3D=3D INVALID_M2P_ENTRY )
> - =A0 =A0 =A0 =A0{
> - =A0 =A0 =A0 =A0 =A0 =A0orphans_i++;
> - =A0 =A0 =A0 =A0 =A0 =A0//P2M_PRINTK("orphaned guest page: mfn=3D%#lx ha=
s invalid gfn\n",
> - =A0 =A0 =A0 =A0 =A0 =A0// =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn);
> - =A0 =A0 =A0 =A0 =A0 =A0continue;
> - =A0 =A0 =A0 =A0}
> -
> - =A0 =A0 =A0 =A0if ( gfn =3D=3D 0x55555555 || gfn =3D=3D 0x5555555555555=
555 )
> - =A0 =A0 =A0 =A0{
> - =A0 =A0 =A0 =A0 =A0 =A0orphans_d++;
> - =A0 =A0 =A0 =A0 =A0 =A0//P2M_PRINTK("orphaned guest page: mfn=3D%#lx ha=
s debug gfn\n",
> - =A0 =A0 =A0 =A0 =A0 =A0// =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn);
> - =A0 =A0 =A0 =A0 =A0 =A0continue;
> - =A0 =A0 =A0 =A0}
> -
> - =A0 =A0 =A0 =A0if ( gfn =3D=3D SHARED_M2P_ENTRY )
> - =A0 =A0 =A0 =A0{
> - =A0 =A0 =A0 =A0 =A0 =A0P2M_PRINTK("shared mfn (%lx) on domain page list=
!\n",
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0mfn);
> - =A0 =A0 =A0 =A0 =A0 =A0continue;
> - =A0 =A0 =A0 =A0}
> -
> - =A0 =A0 =A0 =A0p2mfn =3D gfn_to_mfn_type_p2m(p2m, gfn, &type, p2m_query=
);
> - =A0 =A0 =A0 =A0if ( strict_m2p && mfn_x(p2mfn) !=3D mfn )
> - =A0 =A0 =A0 =A0{
> - =A0 =A0 =A0 =A0 =A0 =A0mpbad++;
> - =A0 =A0 =A0 =A0 =A0 =A0P2M_PRINTK("map mismatch mfn %#lx -> gfn %#lx ->=
 mfn %#lx"
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 " (-> gfn %#lx)\n",
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn, gfn, mfn_x(p2mfn),
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (mfn_valid(p2mfn)
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0? get_gpfn_from_mfn(mfn_=
x(p2mfn))
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0: -1u));
> - =A0 =A0 =A0 =A0 =A0 =A0/* This m2p entry is stale: the domain has anoth=
er frame in
> - =A0 =A0 =A0 =A0 =A0 =A0 * this physical slot. =A0No great disaster, but=
 for neatness,
> - =A0 =A0 =A0 =A0 =A0 =A0 * blow away the m2p entry. */
> - =A0 =A0 =A0 =A0 =A0 =A0set_gpfn_from_mfn(mfn, INVALID_M2P_ENTRY);
> - =A0 =A0 =A0 =A0}
> -
> - =A0 =A0 =A0 =A0if ( test_linear && (gfn <=3D p2m->max_mapped_pfn) )
> - =A0 =A0 =A0 =A0{
> - =A0 =A0 =A0 =A0 =A0 =A0lp2mfn =3D mfn_x(gfn_to_mfn_type_p2m(p2m, gfn, &=
type, p2m_query));
> - =A0 =A0 =A0 =A0 =A0 =A0if ( lp2mfn !=3D mfn_x(p2mfn) )
> - =A0 =A0 =A0 =A0 =A0 =A0{
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0P2M_PRINTK("linear mismatch gfn %#lx -> =
mfn %#lx "
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "(!=3D mfn %#lx)\n"=
, gfn, lp2mfn, mfn_x(p2mfn));
> - =A0 =A0 =A0 =A0 =A0 =A0}
> - =A0 =A0 =A0 =A0}
> -
> - =A0 =A0 =A0 =A0// P2M_PRINTK("OK: mfn=3D%#lx, gfn=3D%#lx, p2mfn=3D%#lx,=
 lp2mfn=3D%#lx\n",
> - =A0 =A0 =A0 =A0// =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0mfn, gfn, mfn_x(p2mfn)=
, lp2mfn);
> - =A0 =A0}
> -
> - =A0 =A0spin_unlock(&d->page_alloc_lock);
> -
> - =A0 =A0/* Audit part two: walk the domain's p2m table, checking the ent=
ries. */
> + =A0 =A0/* Audit part one: walk the domain's p2m table, checking the ent=
ries. */
> =A0 =A0 if ( pagetable_get_pfn(p2m_get_pagetable(p2m)) !=3D 0 )
> =A0 =A0 {
> =A0 =A0 =A0 =A0 l2_pgentry_t *l2e;
> @@ -1239,17 +1142,23 @@ void audit_p2m(struct p2m_domain *p2m, i
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0entry_count);
> =A0 =A0 =A0 =A0 BUG();
> =A0 =A0 }
> -
> - =A0 =A0//P2M_PRINTK("p2m audit complete\n");
> - =A0 =A0//if ( orphans_i | orphans_d | mpbad | pmbad )
> - =A0 =A0// =A0 =A0P2M_PRINTK("p2m audit found %lu orphans (%lu inval %lu=
 debug)\n",
> - =A0 =A0// =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 orphans_i + orphans_d, or=
phans_i, orphans_d);
> - =A0 =A0if ( mpbad | pmbad )
> - =A0 =A0{
> - =A0 =A0 =A0 =A0P2M_PRINTK("p2m audit found %lu odd p2m, %lu bad m2p ent=
ries\n",
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 pmbad, mpbad);
> - =A0 =A0 =A0 =A0WARN();
> - =A0 =A0}
> +
> + =A0 =A0return pmbad;
> =A0}
> =A0#endif /* P2M_AUDIT */
>
> +/* Set up the p2m function pointers for pagetable format */
> +void p2m_pt_init(struct p2m_domain *p2m)
> +{
> + =A0 =A0p2m->set_entry =3D p2m_set_entry;
> + =A0 =A0p2m->get_entry =3D p2m_gfn_to_mfn;
> + =A0 =A0p2m->change_entry_type_global =3D p2m_change_type_global;
> + =A0 =A0p2m->write_p2m_entry =3D paging_write_p2m_entry;
> +#if P2M_AUDIT
> + =A0 =A0p2m->audit_p2m =3D p2m_pt_audit_p2m;
> +#else
> + =A0 =A0p2m->audit_p2m =3D NULL;
> +#endif
> +}
> +
> +
> diff -r f11528df1df3 -r 764e0872dd4f xen/arch/x86/mm/p2m.c
> --- a/xen/arch/x86/mm/p2m.c
> +++ b/xen/arch/x86/mm/p2m.c
> @@ -439,9 +439,7 @@ guest_physmap_remove_page(struct domain
> =A0{
> =A0 =A0 struct p2m_domain *p2m =3D p2m_get_hostp2m(d);
> =A0 =A0 p2m_lock(p2m);
> - =A0 =A0audit_p2m(p2m, 1);
> =A0 =A0 p2m_remove_page(p2m, gfn, mfn, page_order);
> - =A0 =A0audit_p2m(p2m, 1);
> =A0 =A0 p2m_unlock(p2m);
> =A0}
>
> @@ -482,7 +480,6 @@ guest_physmap_add_entry(struct domain *d
> =A0 =A0 =A0 =A0 return rc;
>
> =A0 =A0 p2m_lock(p2m);
> - =A0 =A0audit_p2m(p2m, 0);
>
> =A0 =A0 P2M_DEBUG("adding gfn=3D%#lx mfn=3D%#lx\n", gfn, mfn);
>
> @@ -566,7 +563,6 @@ guest_physmap_add_entry(struct domain *d
> =A0 =A0 =A0 =A0 }
> =A0 =A0 }
>
> - =A0 =A0audit_p2m(p2m, 1);
> =A0 =A0 p2m_unlock(p2m);
>
> =A0 =A0 return rc;
> @@ -656,7 +652,6 @@ set_mmio_p2m_entry(struct domain *d, uns
>
> =A0 =A0 P2M_DEBUG("set mmio %lx %lx\n", gfn, mfn_x(mfn));
> =A0 =A0 rc =3D set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_mmio_direc=
t, p2m->default_access);
> - =A0 =A0audit_p2m(p2m, 1);
> =A0 =A0 p2m_unlock(p2m);
> =A0 =A0 if ( 0 =3D=3D rc )
> =A0 =A0 =A0 =A0 gdprintk(XENLOG_ERR,
> @@ -688,7 +683,6 @@ clear_mmio_p2m_entry(struct domain *d, u
> =A0 =A0 =A0 =A0 goto out;
> =A0 =A0 }
> =A0 =A0 rc =3D set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), PAGE_ORDER_4K, =
p2m_invalid, p2m->default_access);
> - =A0 =A0audit_p2m(p2m, 1);
>
> =A0out:
> =A0 =A0 p2m_unlock(p2m);
> @@ -785,7 +779,6 @@ int p2m_mem_paging_nominate(struct domai
>
> =A0 =A0 /* Fix p2m entry */
> =A0 =A0 set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_paging_out, a=
);
> - =A0 =A0audit_p2m(p2m, 1);
> =A0 =A0 ret =3D 0;
>
> =A0out:
> @@ -852,7 +845,6 @@ int p2m_mem_paging_evict(struct domain *
>
> =A0 =A0 /* Remove mapping from p2m table */
> =A0 =A0 set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), PAGE_ORDER_4K, p2m_ram=
_paged, a);
> - =A0 =A0audit_p2m(p2m, 1);
>
> =A0 =A0 /* Clear content before returning the page to Xen */
> =A0 =A0 scrub_one_page(page);
> @@ -946,7 +938,6 @@ void p2m_mem_paging_populate(struct doma
> =A0 =A0 =A0 =A0 =A0 =A0 req.flags |=3D MEM_EVENT_FLAG_EVICT_FAIL;
>
> =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_pagin=
g_in_start, a);
> - =A0 =A0 =A0 =A0audit_p2m(p2m, 1);
> =A0 =A0 }
> =A0 =A0 p2m_unlock(p2m);
>
> @@ -1014,7 +1005,6 @@ int p2m_mem_paging_prep(struct domain *d
>
> =A0 =A0 /* Fix p2m mapping */
> =A0 =A0 set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_paging_in, a)=
;
> - =A0 =A0audit_p2m(p2m, 1);
>
> =A0 =A0 atomic_dec(&d->paged_pages);
>
> @@ -1063,7 +1053,6 @@ void p2m_mem_paging_resume(struct domain
> =A0 =A0 =A0 =A0 {
> =A0 =A0 =A0 =A0 =A0 =A0 set_p2m_entry(p2m, rsp.gfn, mfn, PAGE_ORDER_4K, p=
2m_ram_rw, a);
> =A0 =A0 =A0 =A0 =A0 =A0 set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
> - =A0 =A0 =A0 =A0 =A0 =A0audit_p2m(p2m, 1);
> =A0 =A0 =A0 =A0 }
> =A0 =A0 =A0 =A0 p2m_unlock(p2m);
> =A0 =A0 }
> @@ -1425,6 +1414,119 @@ unsigned long paging_gva_to_gfn(struct v
> =A0 =A0 return hostmode->gva_to_gfn(v, hostp2m, va, pfec);
> =A0}
>
> +/*** Audit ***/
> +
> +#if P2M_AUDIT
> +void audit_p2m(struct domain *d,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0uint64_t *orphans_debug,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0uint64_t *orphans_invalid,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0uint64_t *m2p_bad,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0uint64_t *p2m_bad)
> +{
> + =A0 =A0struct page_info *page;
> + =A0 =A0struct domain *od;
> + =A0 =A0unsigned long mfn, gfn;
> + =A0 =A0mfn_t p2mfn;
> + =A0 =A0unsigned long orphans_d =3D 0, orphans_i =3D 0, mpbad =3D 0, pmb=
ad =3D 0;
> + =A0 =A0p2m_access_t p2ma;
> + =A0 =A0p2m_type_t type;
> + =A0 =A0struct p2m_domain *p2m =3D p2m_get_hostp2m(d);
> +
> + =A0 =A0if ( !paging_mode_translate(d) )
> + =A0 =A0 =A0 =A0goto out_p2m_audit;
> +
> + =A0 =A0P2M_PRINTK("p2m audit starts\n");
> +
> + =A0 =A0p2m_lock(p2m);
> +
> + =A0 =A0if (p2m->audit_p2m)
> + =A0 =A0 =A0 =A0pmbad =3D p2m->audit_p2m(p2m);
> +
> + =A0 =A0/* Audit part two: walk the domain's page allocation list, check=
ing
> + =A0 =A0 * the m2p entries. */
> + =A0 =A0spin_lock(&d->page_alloc_lock);
> + =A0 =A0page_list_for_each ( page, &d->page_list )
> + =A0 =A0{
> + =A0 =A0 =A0 =A0mfn =3D mfn_x(page_to_mfn(page));
> +
> + =A0 =A0 =A0 =A0P2M_PRINTK("auditing guest page, mfn=3D%#lx\n", mfn);
> +
> + =A0 =A0 =A0 =A0od =3D page_get_owner(page);
> +
> + =A0 =A0 =A0 =A0if ( od !=3D d )
> + =A0 =A0 =A0 =A0{
> + =A0 =A0 =A0 =A0 =A0 =A0P2M_PRINTK("wrong owner %#lx -> %p(%u) !=3D %p(%=
u)\n",
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn, od, (od?od->domain_id:=
-1), d, d->domain_id);
> + =A0 =A0 =A0 =A0 =A0 =A0continue;
> + =A0 =A0 =A0 =A0}
> +
> + =A0 =A0 =A0 =A0gfn =3D get_gpfn_from_mfn(mfn);
> + =A0 =A0 =A0 =A0if ( gfn =3D=3D INVALID_M2P_ENTRY )
> + =A0 =A0 =A0 =A0{
> + =A0 =A0 =A0 =A0 =A0 =A0orphans_i++;
> + =A0 =A0 =A0 =A0 =A0 =A0P2M_PRINTK("orphaned guest page: mfn=3D%#lx has =
invalid gfn\n",
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn);
> + =A0 =A0 =A0 =A0 =A0 =A0continue;
> + =A0 =A0 =A0 =A0}
> +
> + =A0 =A0 =A0 =A0if ( gfn =3D=3D 0x55555555 || gfn =3D=3D 0x5555555555555=
555 )
> + =A0 =A0 =A0 =A0{
> + =A0 =A0 =A0 =A0 =A0 =A0orphans_d++;
> + =A0 =A0 =A0 =A0 =A0 =A0P2M_PRINTK("orphaned guest page: mfn=3D%#lx has =
debug gfn\n",
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn);
> + =A0 =A0 =A0 =A0 =A0 =A0continue;
> + =A0 =A0 =A0 =A0}
> +
> + =A0 =A0 =A0 =A0if ( gfn =3D=3D SHARED_M2P_ENTRY )
> + =A0 =A0 =A0 =A0{
> + =A0 =A0 =A0 =A0 =A0 =A0P2M_PRINTK("shared mfn (%lx) on domain page list=
!\n",
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0mfn);
> + =A0 =A0 =A0 =A0 =A0 =A0continue;
> + =A0 =A0 =A0 =A0}
> +
> + =A0 =A0 =A0 =A0p2mfn =3D get_gfn_type_access(p2m, gfn, &type, &p2ma, p2=
m_query, NULL);
> + =A0 =A0 =A0 =A0if ( mfn_x(p2mfn) !=3D mfn )
> + =A0 =A0 =A0 =A0{
> + =A0 =A0 =A0 =A0 =A0 =A0mpbad++;
> + =A0 =A0 =A0 =A0 =A0 =A0P2M_PRINTK("map mismatch mfn %#lx -> gfn %#lx ->=
 mfn %#lx"
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 " (-> gfn %#lx)\n",
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn, gfn, mfn_x(p2mfn),
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (mfn_valid(p2mfn)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0? get_gpfn_from_mfn(mfn_=
x(p2mfn))
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0: -1u));
> + =A0 =A0 =A0 =A0 =A0 =A0/* This m2p entry is stale: the domain has anoth=
er frame in
> + =A0 =A0 =A0 =A0 =A0 =A0 * this physical slot. =A0No great disaster, but=
 for neatness,
> + =A0 =A0 =A0 =A0 =A0 =A0 * blow away the m2p entry. */
> + =A0 =A0 =A0 =A0 =A0 =A0set_gpfn_from_mfn(mfn, INVALID_M2P_ENTRY);
> + =A0 =A0 =A0 =A0}
> + =A0 =A0 =A0 =A0__put_gfn(p2m, gfn);
> +
> + =A0 =A0 =A0 =A0P2M_PRINTK("OK: mfn=3D%#lx, gfn=3D%#lx, p2mfn=3D%#lx, lp=
2mfn=3D%#lx\n",
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn, gfn, mfn_x(p2mfn), lp2=
mfn);
> + =A0 =A0}
> + =A0 =A0spin_unlock(&d->page_alloc_lock);
> +
> + =A0 =A0p2m_unlock(p2m);
> +
> + =A0 =A0P2M_PRINTK("p2m audit complete\n");
> + =A0 =A0if ( orphans_i | orphans_d | mpbad | pmbad )
> + =A0 =A0 =A0 =A0P2M_PRINTK("p2m audit found %lu orphans (%lu inval %lu d=
ebug)\n",
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 orphans_i + orphans_d, orph=
ans_i, orphans_d);
> + =A0 =A0if ( mpbad | pmbad )
> + =A0 =A0{
> + =A0 =A0 =A0 =A0P2M_PRINTK("p2m audit found %lu odd p2m, %lu bad m2p ent=
ries\n",
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 pmbad, mpbad);
> + =A0 =A0 =A0 =A0WARN();
> + =A0 =A0}
> +
> +out_p2m_audit:
> + =A0 =A0*orphans_debug =A0 =A0 =A0=3D (uint64_t) orphans_d;
> + =A0 =A0*orphans_invalid =A0 =A0=3D (uint64_t) orphans_i;
> + =A0 =A0*m2p_bad =A0 =A0 =A0 =A0 =A0 =A0=3D (uint64_t) mpbad;
> + =A0 =A0*p2m_bad =A0 =A0 =A0 =A0 =A0 =A0=3D (uint64_t) pmbad;
> +}
> +#endif /* P2M_AUDIT */
> +
> =A0/*
> =A0* Local variables:
> =A0* mode: C
> diff -r f11528df1df3 -r 764e0872dd4f xen/include/asm-x86/p2m.h
> --- a/xen/include/asm-x86/p2m.h
> +++ b/xen/include/asm-x86/p2m.h
> @@ -244,6 +244,7 @@ struct p2m_domain {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 unsigned long gfn, l1_pgentry_t *p,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 mfn_t table_mfn, l1_pgentry_t new,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 unsigned int level);
> + =A0 =A0long =A0 =A0 =A0 =A0 =A0 =A0 =A0 (*audit_p2m)(struct p2m_domain =
*p2m);
>
> =A0 =A0 /* Default P2M access type for each page in the the domain: new p=
ages,
> =A0 =A0 =A0* swapped in pages, cleared pages, and pages that are ambiquou=
sly
> @@ -558,13 +559,15 @@ int set_p2m_entry(struct p2m_domain *p2m
> =A0extern void p2m_pt_init(struct p2m_domain *p2m);
>
> =A0/* Debugging and auditing of the P2M code? */
> -#define P2M_AUDIT =A0 =A0 0
> +#define P2M_AUDIT =A0 =A0 1
> =A0#define P2M_DEBUGGING 0
>
> =A0#if P2M_AUDIT
> -extern void audit_p2m(struct p2m_domain *p2m, int strict_m2p);
> -#else
> -# define audit_p2m(_p2m, _m2p) do { (void)(_p2m),(_m2p); } while (0)
> +extern void audit_p2m(struct domain *d,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0uint64_t *orphans_debug,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0uint64_t *orphans_invali=
d,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0uint64_t *m2p_bad,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0uint64_t *p2m_bad);
> =A0#endif /* P2M_AUDIT */
>
> =A0/* Printouts */
> diff -r f11528df1df3 -r 764e0872dd4f xen/include/public/domctl.h
> --- a/xen/include/public/domctl.h
> +++ b/xen/include/public/domctl.h
> @@ -800,6 +800,16 @@ struct xen_domctl_mem_sharing_op {
> =A0typedef struct xen_domctl_mem_sharing_op xen_domctl_mem_sharing_op_t;
> =A0DEFINE_XEN_GUEST_HANDLE(xen_domctl_mem_sharing_op_t);
>
> +struct xen_domctl_audit_p2m {
> + =A0 =A0/* OUT error counts */
> + =A0 =A0uint64_t orphans_debug;
> + =A0 =A0uint64_t orphans_invalid;
> + =A0 =A0uint64_t m2p_bad;
> + =A0 =A0uint64_t p2m_bad;
> +};
> +typedef struct xen_domctl_audit_p2m xen_domctl_audit_p2m_t;
> +DEFINE_XEN_GUEST_HANDLE(xen_domctl_audit_p2m_t);
> +
> =A0#if defined(__i386__) || defined(__x86_64__)
> =A0/* XEN_DOMCTL_setvcpuextstate */
> =A0/* XEN_DOMCTL_getvcpuextstate */
> @@ -898,6 +908,7 @@ struct xen_domctl {
> =A0#define XEN_DOMCTL_setvcpuextstate =A0 =A0 =A0 =A0 =A0 =A0 =A0 62
> =A0#define XEN_DOMCTL_getvcpuextstate =A0 =A0 =A0 =A0 =A0 =A0 =A0 63
> =A0#define XEN_DOMCTL_set_access_required =A0 =A0 =A0 =A0 =A0 64
> +#define XEN_DOMCTL_audit_p2m =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 65
> =A0#define XEN_DOMCTL_gdbsx_guestmemio =A0 =A0 =A0 =A0 =A0 =A01000
> =A0#define XEN_DOMCTL_gdbsx_pausevcpu =A0 =A0 =A0 =A0 =A0 =A0 1001
> =A0#define XEN_DOMCTL_gdbsx_unpausevcpu =A0 =A0 =A0 =A0 =A0 1002
> @@ -951,6 +962,7 @@ struct xen_domctl {
> =A0 =A0 =A0 =A0 struct xen_domctl_vcpuextstate =A0 =A0 =A0vcpuextstate;
> =A0#endif
> =A0 =A0 =A0 =A0 struct xen_domctl_set_access_required access_required;
> + =A0 =A0 =A0 =A0struct xen_domctl_audit_p2m =A0 =A0 =A0 =A0 audit_p2m;
> =A0 =A0 =A0 =A0 struct xen_domctl_gdbsx_memio =A0 =A0 =A0 gdbsx_guest_mem=
io;
> =A0 =A0 =A0 =A0 struct xen_domctl_gdbsx_pauseunp_vcpu gdbsx_pauseunp_vcpu=
;
> =A0 =A0 =A0 =A0 struct xen_domctl_gdbsx_domstatus =A0 gdbsx_domstatus;
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 04:45:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 04:45:40 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQIOR-00046d-G7; Tue, 15 Nov 2011 04:45:39 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQINa-0003ty-2W
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 04:44:46 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1321361050!43992295!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15854 invoked from network); 15 Nov 2011 12:44:11 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 12:44:11 -0000
X-IronPort-AV: E=Sophos;i="4.69,515,1315195200"; d="scan'208";a="19106974"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 07:44:41 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX01.citrite.net
	(10.13.107.65) with Microsoft SMTP Server id 8.3.137.0; Tue, 15 Nov 2011
	07:44:40 -0500
Message-ID: <4EC25EB8.6050808@citrix.com>
Date: Tue, 15 Nov 2011 12:44:40 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: prevent vector sharing within	
	IO-APICs
References: <4EBD54B80200007800060776@nat28.tlf.novell.com>
	<4EBD579F.70901@citrix.com>
	<4EC0E6010200007800060B29@nat28.tlf.novell.com>
	<4EC11EAB.80400@citrix.com>
	<4EC131B60200007800060C9B@nat28.tlf.novell.com>
	<4EC13367.9080209@citrix.com>
	<4EC14FFE0200007800060D18@nat28.tlf.novell.com>
	<4EC150EC.3020100@citrix.com>
	<4EC256AD02000078000610C4@nat28.tlf.novell.com>
In-Reply-To: <4EC256AD02000078000610C4@nat28.tlf.novell.com>
X-Enigmail-Version: 1.1.2
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 15/11/11 11:10, Jan Beulich wrote:
>>>> On 14.11.11 at 18:33, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
>> On 14/11/11 16:29, Jan Beulich wrote:
>>>>>> On 14.11.11 at 16:27, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
>>>> On 14/11/11 14:20, Jan Beulich wrote:
>>>>> I'm having some more fundamental problem with this original change
>>>>> of yours: The assignment of the new vector happens in the context
>>>>> of move_native_irq(), which gets called *after* doing the manual
>>>>> EOI (and hence also *after* the vector != desc->arch.vector check).
>>>>> How does that do what it is supposed to?
>>>>>
>>>>> (Below the [untested] patch that I would propose to do what I described
>>>>> above, pending your clarification regarding the original change.)
>>>>>
>>>>> Jan
>>>> Are you sure?  I was under the impression that for safety, you have to
>>>> move the IRQ before ack'ing it at the local APIC, to prevent another IRQ
>>>> coming in while you are updating the structures.
>>> Just take another look at end_level_ioapic_irq().
>> If it makes a difference, I was debugging the issue on boxes without
>> x2APIC, so there was no direct EOI support.  Given the number of times
> Directed EOI has nothing to do with x2apic.

The manual (http://www.naic.edu/~phil/software/intel/318148.pdf) implies
that only x2APIC hardware has DirectEOI support, even though it is
usable in both xAPIC and x2APIC mode if bit 24 of the LAPIC version
register is set.

Irrespective of the implication, I discovered when profiling the code
that DirectEOI was not supported on the box in question.

>> the code conditionally returns depending on direct_eoi_enabled, I would
>> not be surprised if there are two separate codepaths.
>> ...
>>> But the crucial thing is that desc->arch.vector gets written during step 2,
>>> and hence the condition around the EOI can never be true unless an
>>> interrupt surfaces in the window between the EOI in step 2 and the
>>> disabling of it in move_native_irq(). Was it just this special case that
>>> your original change addressed (the change description doesn't hint in
>>> that direction).
>> Given that the bug was certainly a timing issue, and most of the time
>> the IRQ migrated, everything worked fine, It is quite possible that it
>> was a new IRQ appearing in that window.  Having said that, even if a new
>> IRQ arrived, its remote IRR should not be set until the LAPIC has acked
>> it, at which point we should be in the IRQ handler for it which seems
>> rather hard if we are still in the handler for the previous IRQ. 
> No - the LAPIC acking the IO-APIC request doesn't mean the IRQ
> is already in the process of being handled by software. In particular,
> while the first IRQ is in progress, the IRR bit could get set by a
> second interrupt instance between the EOI and the disabling (in
> move_native_irq()), bit EFLAGS.IF would still be zero. Once sti (or
> an equivalent thereof) would get executed, that second interrupt
> would get delivered from the LAPIC to the execution unit, and the
> mask-and-ack would invoke irq_complete_move(), which in turn
> might send the cleanup IPI (which in turn wouldn't get delivered
> until EFLAGS.IF became 1 again). Depending on whether the IPI
> arrives before or after end_level_ioapic_irq() runs for this second
> interrupt instance, the vectors may or may appear to be out of
> sync (and here the description of your original change seems
> wrong - you're using the new vector, not the old one, as you
> want to make sure that the vector written actually matches the
> already updated RTE(s)).

If this is the case, we really should not be sending an EOI to line
level interrupts until we have actually serviced them (and moved them if
relevant)  The IRR should not be cleared until we are able to service a
new interrupt from the source.

Rereading my comment in the patch, it is wrong.  The comment should read
/* Manually EOI the new vector if we have migrated while servicing */ or
something equivalent.

>> Perhaps there is a weird interaction whereby acking a masked level
>> interrupt doesn't reset the IRR.
>>
>> I have to admit that the logic seems a bit broken, and it certainly
>> seems to be more complicated than it needs to be.
>>
>>>> An alternative to 3) can occur when using the IRQ_MOVE_CLEANUP_VECTOR
>>>> IPI which looks through all pending cleanups on the current pcpu and
>>>> cleans them up.
>>>>
>>>> Anyway, it was certainly the case that I saw the RTE being updated
>>>> before the EOI was sent, which is why I had to change the
>>>> hw_irq_controler.end interface to include the vector from the pending
>>>> EOI stack, so end_level_ioapic_irq could EOI the new vector if it was
>>>> different from the vector the lapic saw.
>>> That's another thing I would want to revert: There really shouldn't be
>>> a need to pass in the old vector, as it is getting stored in
>>> __assign_irq_vector(). If the value wasn't valid anymore at the point
>>> we'd need it, we'd have a more severe problem - the vector gets
>>> marked as not in use by smp_irq_move_cleanup_interrupt(), and
>>> hence it wouldn't be valid anymore to play with it (read: EOI it) as
>>> it may have got re-used already. As vector_irq[] gets updated there
>>> too, that should result in "No irq handler for vector ...", but it would
>>> not make it into end_level_ioapic_irq() in such a case.
>>>
>>> Jan
>> That is fair enough.  When I submitted this patch, irq_cfg did not have
>> old_vector in it - I added old_vector in a later patch.  I really should
>> have remembered that I could then revert the change to the interface.
> The point is that we need to be sure that ->arch.old_vector is still valid
> at this point. Yesterday I though I convinced myself that it would be,
> but today I'm again not certain anymore.
>
> Jan

If your description of the case causing the bug above is correct, then
->arch.old_vector may not be valid at this point because of other
processors taking a new interrupt and calling the cleanup code.  I am
struggling to work out whether that race condition is possible or not.

One option would be to try it and see if the bug reoccurs - I still have
access to the server which would reproduce the Line Level EOI bug.

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 05:05:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 05:05:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQIhz-0004sw-Bq; Tue, 15 Nov 2011 05:05:51 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQIfu-0004YL-Cv
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 05:03:57 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1321362214!3623064!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1343 invoked from network); 15 Nov 2011 13:03:35 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-14.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 15 Nov 2011 13:03:35 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 15 Nov 2011 13:03:34 +0000
Message-Id: <4EC27134020000780006112C@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 15 Nov 2011 13:03:32 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Keir Fraser" <keir@xen.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] x86 emulator and new isa additions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi Keir,

so far the convention seems to be to assume that guest attempts to
execute instructions not supported by the underlying CPU would never
make it into the emulator. Is that really correct (in particular in the
context of real mode emulation, where it's not just single instructions
that get emulated)?

>From earlier work on the emulation code I seem to recall that it's mainly
the testing code that didn't like use of cpu_has_xyz in conditionals. I
would suppose that simply adding respective feature detection (and
boolean variables) to the testing code should get us around this
problem. Or would you see any better alternative?

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 05:09:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 05:09:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQIlu-0005Io-Ce; Tue, 15 Nov 2011 05:09:54 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQIlS-00056w-Bp
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 05:09:26 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1321362563!3629353!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24789 invoked from network); 15 Nov 2011 13:09:23 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 15 Nov 2011 13:09:23 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 15 Nov 2011 13:09:23 +0000
Message-Id: <4EC272910200007800061136@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 15 Nov 2011 13:09:21 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Andrew Cooper" <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] [PATCH] x86/IRQ: prevent vector sharing within
	IO-APICs
References: <4EBD54B80200007800060776@nat28.tlf.novell.com>
	<4EBD579F.70901@citrix.com>
	<4EC0E6010200007800060B29@nat28.tlf.novell.com>
	<4EC11EAB.80400@citrix.com>
	<4EC131B60200007800060C9B@nat28.tlf.novell.com>
	<4EC13367.9080209@citrix.com>
	<4EC14FFE0200007800060D18@nat28.tlf.novell.com>
	<4EC150EC.3020100@citrix.com>
	<4EC256AD02000078000610C4@nat28.tlf.novell.com>
	<4EC25EB8.6050808@citrix.com>
In-Reply-To: <4EC25EB8.6050808@citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 15.11.11 at 13:44, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
> One option would be to try it and see if the bug reoccurs - I still have
> access to the server which would reproduce the Line Level EOI bug.

That would be much appreciated (perhaps after the two pending patches
went in).

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 05:14:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 05:14:49 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQIqf-0005ja-Dq; Tue, 15 Nov 2011 05:14:49 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQIq9-0005XZ-VZ
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 05:14:18 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1321362854!1638411!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18860 invoked from network); 15 Nov 2011 13:14:14 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-6.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 15 Nov 2011 13:14:14 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 15 Nov 2011 13:14:13 +0000
Message-Id: <4EC273B40200007800061145@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 15 Nov 2011 13:14:12 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part351AB4B4.0__="
Subject: [Xen-devel] [PATCH] x86/IO-APIC: refine EOI-ing of migrating level
	interrupts
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part351AB4B4.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Rather than going through all IO-APICs and calling io_apic_eoi_vector()
for the vector in question, just use eoi_IO_APIC_irq().

This in turn allows to eliminate quite a bit of other code.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -69,10 +69,6 @@ int __read_mostly nr_ioapics;
=20
 #define ioapic_has_eoi_reg(apic) (mp_ioapics[(apic)].mpc_apicver >=3D =
0x20)
=20
-#define io_apic_eoi_vector(apic, vector) io_apic_eoi((apic), (vector), =
-1)
-#define io_apic_eoi_pin(apic, pin) io_apic_eoi((apic), -1, (pin))
-
-
 /*
  * This is performance-critical, we want to do it O(1)
  *
@@ -213,21 +209,18 @@ static void ioapic_write_entry(
     spin_unlock_irqrestore(&ioapic_lock, flags);
 }
=20
-/* EOI an IO-APIC entry.  One of vector or pin may be -1, indicating that
- * it should be worked out using the other.  This function expect that =
the
- * ioapic_lock is taken, and interrupts are disabled (or there is a good =
reason
- * not to), and that if both pin and vector are passed, that they refer =
to the
+/* EOI an IO-APIC entry.  Vector may be -1, indicating that it should be
+ * worked out using the pin.  This function expects that the ioapic_lock =
is
+ * being held, and interrupts are disabled (or there is a good reason not
+ * to), and that if both pin and vector are passed, that they refer to =
the
  * same redirection entry in the IO-APIC. */
 static void __io_apic_eoi(unsigned int apic, unsigned int vector, =
unsigned int pin)
 {
-    /* Ensure some useful information is passed in */
-    BUG_ON( (vector =3D=3D -1 && pin =3D=3D -1) );
-   =20
     /* Prefer the use of the EOI register if available */
     if ( ioapic_has_eoi_reg(apic) )
     {
         /* If vector is unknown, read it from the IO-APIC */
-        if ( vector =3D=3D -1 )
+        if ( vector =3D=3D IRQ_VECTOR_UNASSIGNED )
             vector =3D __ioapic_read_entry(apic, pin, TRUE).vector;
=20
         *(IO_APIC_BASE(apic)+16) =3D vector;
@@ -239,42 +232,6 @@ static void __io_apic_eoi(unsigned int a
         struct IO_APIC_route_entry entry;
         bool_t need_to_unmask =3D 0;
=20
-        /* If pin is unknown, search for it */
-        if ( pin =3D=3D -1 )
-        {
-            unsigned int p;
-            for ( p =3D 0; p < nr_ioapic_entries[apic]; ++p )
-            {
-                entry =3D __ioapic_read_entry(apic, p, TRUE);
-                if ( entry.vector =3D=3D vector )
-                {
-                    pin =3D p;
-                    /* break; */
-
-                    /* Here should be a break out of the loop, but at =
the=20
-                     * Xen code doesn't actually prevent multiple IO-APIC
-                     * entries being assigned the same vector, so EOI all
-                     * pins which have the correct vector.
-                     *
-                     * Remove the following code when the above assertion
-                     * is fulfilled. */
-                    __io_apic_eoi(apic, vector, p);
-                }
-            }
-           =20
-            /* If search fails, nothing to do */
-
-            /* if ( pin =3D=3D -1 ) */
-
-            /* Because the loop wasn't broken out of (see comment above),
-             * all relevant pins have been EOI, so we can always return.
-             *=20
-             * Re-instate the if statement above when the Xen logic has =
been
-             * fixed.*/
-
-            return;
-        }
-
         entry =3D __ioapic_read_entry(apic, pin, TRUE);
=20
         if ( ! entry.mask )
@@ -301,17 +258,6 @@ static void __io_apic_eoi(unsigned int a
     }
 }
=20
-/* EOI an IO-APIC entry.  One of vector or pin may be -1, indicating that
- * it should be worked out using the other.  This function disables =
interrupts
- * and takes the ioapic_lock */
-static void io_apic_eoi(unsigned int apic, unsigned int vector, unsigned =
int pin)
-{
-    unsigned int flags;
-    spin_lock_irqsave(&ioapic_lock, flags);
-    __io_apic_eoi(apic, vector, pin);
-    spin_unlock_irqrestore(&ioapic_lock, flags);
-}
-
 /*
  * Saves all the IO-APIC RTE's
  */
@@ -1693,11 +1639,7 @@ static void end_level_ioapic_irq(struct=20
=20
     /* Manually EOI the old vector if we are moving to the new */
     if ( vector && i !=3D vector )
-    {
-        int ioapic;
-        for (ioapic =3D 0; ioapic < nr_ioapics; ioapic++)
-            io_apic_eoi_vector(ioapic, i);
-    }
+        eoi_IO_APIC_irq(desc);
=20
     v =3D apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
=20



--=__Part351AB4B4.0__=
Content-Type: text/plain; name="x86-ioapic-EOI-after-migration.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="x86-ioapic-EOI-after-migration.patch"

x86/IO-APIC: refine EOI-ing of migrating level interrupts=0A=0ARather than =
going through all IO-APICs and calling io_apic_eoi_vector()=0Afor the =
vector in question, just use eoi_IO_APIC_irq().=0A=0AThis in turn allows =
to eliminate quite a bit of other code.=0A=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- a/xen/arch/x86/io_apic.c=0A+++ b/xen/arch/x86/=
io_apic.c=0A@@ -69,10 +69,6 @@ int __read_mostly nr_ioapics;=0A =0A =
#define ioapic_has_eoi_reg(apic) (mp_ioapics[(apic)].mpc_apicver >=3D =
0x20)=0A =0A-#define io_apic_eoi_vector(apic, vector) io_apic_eoi((apic), =
(vector), -1)=0A-#define io_apic_eoi_pin(apic, pin) io_apic_eoi((apic), =
-1, (pin))=0A-=0A-=0A /*=0A  * This is performance-critical, we want to do =
it O(1)=0A  *=0A@@ -213,21 +209,18 @@ static void ioapic_write_entry(=0A   =
  spin_unlock_irqrestore(&ioapic_lock, flags);=0A }=0A =0A-/* EOI an =
IO-APIC entry.  One of vector or pin may be -1, indicating that=0A- * it =
should be worked out using the other.  This function expect that the=0A- * =
ioapic_lock is taken, and interrupts are disabled (or there is a good =
reason=0A- * not to), and that if both pin and vector are passed, that =
they refer to the=0A+/* EOI an IO-APIC entry.  Vector may be -1, indicating=
 that it should be=0A+ * worked out using the pin.  This function expects =
that the ioapic_lock is=0A+ * being held, and interrupts are disabled (or =
there is a good reason not=0A+ * to), and that if both pin and vector are =
passed, that they refer to the=0A  * same redirection entry in the =
IO-APIC. */=0A static void __io_apic_eoi(unsigned int apic, unsigned int =
vector, unsigned int pin)=0A {=0A-    /* Ensure some useful information is =
passed in */=0A-    BUG_ON( (vector =3D=3D -1 && pin =3D=3D -1) );=0A-    =
=0A     /* Prefer the use of the EOI register if available */=0A     if ( =
ioapic_has_eoi_reg(apic) )=0A     {=0A         /* If vector is unknown, =
read it from the IO-APIC */=0A-        if ( vector =3D=3D -1 )=0A+        =
if ( vector =3D=3D IRQ_VECTOR_UNASSIGNED )=0A             vector =3D =
__ioapic_read_entry(apic, pin, TRUE).vector;=0A =0A         *(IO_APIC_BASE(=
apic)+16) =3D vector;=0A@@ -239,42 +232,6 @@ static void __io_apic_eoi(unsi=
gned int a=0A         struct IO_APIC_route_entry entry;=0A         bool_t =
need_to_unmask =3D 0;=0A =0A-        /* If pin is unknown, search for it =
*/=0A-        if ( pin =3D=3D -1 )=0A-        {=0A-            unsigned =
int p;=0A-            for ( p =3D 0; p < nr_ioapic_entries[apic]; ++p =
)=0A-            {=0A-                entry =3D __ioapic_read_entry(apic, =
p, TRUE);=0A-                if ( entry.vector =3D=3D vector )=0A-         =
       {=0A-                    pin =3D p;=0A-                    /* =
break; */=0A-=0A-                    /* Here should be a break out of the =
loop, but at the =0A-                     * Xen code doesn't actually =
prevent multiple IO-APIC=0A-                     * entries being assigned =
the same vector, so EOI all=0A-                     * pins which have the =
correct vector.=0A-                     *=0A-                     * Remove =
the following code when the above assertion=0A-                     * is =
fulfilled. */=0A-                    __io_apic_eoi(apic, vector, p);=0A-   =
             }=0A-            }=0A-            =0A-            /* If =
search fails, nothing to do */=0A-=0A-            /* if ( pin =3D=3D -1 ) =
*/=0A-=0A-            /* Because the loop wasn't broken out of (see =
comment above),=0A-             * all relevant pins have been EOI, so we =
can always return.=0A-             * =0A-             * Re-instate the if =
statement above when the Xen logic has been=0A-             * fixed.*/=0A-=
=0A-            return;=0A-        }=0A-=0A         entry =3D __ioapic_read=
_entry(apic, pin, TRUE);=0A =0A         if ( ! entry.mask )=0A@@ -301,17 =
+258,6 @@ static void __io_apic_eoi(unsigned int a=0A     }=0A }=0A =0A-/* =
EOI an IO-APIC entry.  One of vector or pin may be -1, indicating that=0A- =
* it should be worked out using the other.  This function disables =
interrupts=0A- * and takes the ioapic_lock */=0A-static void io_apic_eoi(un=
signed int apic, unsigned int vector, unsigned int pin)=0A-{=0A-    =
unsigned int flags;=0A-    spin_lock_irqsave(&ioapic_lock, flags);=0A-    =
__io_apic_eoi(apic, vector, pin);=0A-    spin_unlock_irqrestore(&ioapic_loc=
k, flags);=0A-}=0A-=0A /*=0A  * Saves all the IO-APIC RTE's=0A  */=0A@@ =
-1693,11 +1639,7 @@ static void end_level_ioapic_irq(struct =0A =0A     /* =
Manually EOI the old vector if we are moving to the new */=0A     if ( =
vector && i !=3D vector )=0A-    {=0A-        int ioapic;=0A-        for =
(ioapic =3D 0; ioapic < nr_ioapics; ioapic++)=0A-            io_apic_eoi_ve=
ctor(ioapic, i);=0A-    }=0A+        eoi_IO_APIC_irq(desc);=0A =0A     v =
=3D apic_read(APIC_TMR + ((i & ~0x1f) >> 1));=0A =0A
--=__Part351AB4B4.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part351AB4B4.0__=--


From xen-devel-bounces@lists.xensource.com Tue Nov 15 05:20:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 05:20:36 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQIwG-0006Cz-Lp; Tue, 15 Nov 2011 05:20:36 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQIvJ-000603-EP
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 05:19:37 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1321363142!43998730!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8001 invoked from network); 15 Nov 2011 13:19:03 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 13:19:03 -0000
X-IronPort-AV: E=Sophos;i="4.69,515,1315195200"; d="scan'208";a="170635311"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 08:19:32 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX01.citrite.net
	(10.13.107.65) with Microsoft SMTP Server id 8.3.137.0; Tue, 15 Nov 2011
	08:19:32 -0500
Message-ID: <4EC266E3.50706@citrix.com>
Date: Tue, 15 Nov 2011 13:19:31 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: <xen-devel@lists.xensource.com>, Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH] x86/IO-APIC: refine EOI-ing of migrating
	level	interrupts
References: <4EC273B40200007800061145@nat28.tlf.novell.com>
In-Reply-To: <4EC273B40200007800061145@nat28.tlf.novell.com>
X-Enigmail-Version: 1.1.2
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 15/11/11 13:14, Jan Beulich wrote:
> Rather than going through all IO-APICs and calling io_apic_eoi_vector()
> for the vector in question, just use eoi_IO_APIC_irq().
>
> This in turn allows to eliminate quite a bit of other code.
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>
> --- a/xen/arch/x86/io_apic.c
> +++ b/xen/arch/x86/io_apic.c
> @@ -69,10 +69,6 @@ int __read_mostly nr_ioapics;
>  
>  #define ioapic_has_eoi_reg(apic) (mp_ioapics[(apic)].mpc_apicver >= 0x20)
>  
> -#define io_apic_eoi_vector(apic, vector) io_apic_eoi((apic), (vector), -1)
> -#define io_apic_eoi_pin(apic, pin) io_apic_eoi((apic), -1, (pin))
> -
> -
>  /*
>   * This is performance-critical, we want to do it O(1)
>   *
> @@ -213,21 +209,18 @@ static void ioapic_write_entry(
>      spin_unlock_irqrestore(&ioapic_lock, flags);
>  }
>  
> -/* EOI an IO-APIC entry.  One of vector or pin may be -1, indicating that
> - * it should be worked out using the other.  This function expect that the
> - * ioapic_lock is taken, and interrupts are disabled (or there is a good reason
> - * not to), and that if both pin and vector are passed, that they refer to the
> +/* EOI an IO-APIC entry.  Vector may be -1, indicating that it should be
> + * worked out using the pin.  This function expects that the ioapic_lock is
> + * being held, and interrupts are disabled (or there is a good reason not
> + * to), and that if both pin and vector are passed, that they refer to the
>   * same redirection entry in the IO-APIC. */
>  static void __io_apic_eoi(unsigned int apic, unsigned int vector, unsigned int pin)
>  {
> -    /* Ensure some useful information is passed in */
> -    BUG_ON( (vector == -1 && pin == -1) );
> -    
>      /* Prefer the use of the EOI register if available */
>      if ( ioapic_has_eoi_reg(apic) )
>      {
>          /* If vector is unknown, read it from the IO-APIC */
> -        if ( vector == -1 )
> +        if ( vector == IRQ_VECTOR_UNASSIGNED )

Quick style query:  I consider IRQ_VECTOR_UNASSIGNED logically different
from passing -1 in as a value for vector, even though they are the are
the same value.  Is it sensible to mix them?

~Andrew

>              vector = __ioapic_read_entry(apic, pin, TRUE).vector;
>  
>          *(IO_APIC_BASE(apic)+16) = vector;
> @@ -239,42 +232,6 @@ static void __io_apic_eoi(unsigned int a
>          struct IO_APIC_route_entry entry;
>          bool_t need_to_unmask = 0;
>  
> -        /* If pin is unknown, search for it */
> -        if ( pin == -1 )
> -        {
> -            unsigned int p;
> -            for ( p = 0; p < nr_ioapic_entries[apic]; ++p )
> -            {
> -                entry = __ioapic_read_entry(apic, p, TRUE);
> -                if ( entry.vector == vector )
> -                {
> -                    pin = p;
> -                    /* break; */
> -
> -                    /* Here should be a break out of the loop, but at the 
> -                     * Xen code doesn't actually prevent multiple IO-APIC
> -                     * entries being assigned the same vector, so EOI all
> -                     * pins which have the correct vector.
> -                     *
> -                     * Remove the following code when the above assertion
> -                     * is fulfilled. */
> -                    __io_apic_eoi(apic, vector, p);
> -                }
> -            }
> -            
> -            /* If search fails, nothing to do */
> -
> -            /* if ( pin == -1 ) */
> -
> -            /* Because the loop wasn't broken out of (see comment above),
> -             * all relevant pins have been EOI, so we can always return.
> -             * 
> -             * Re-instate the if statement above when the Xen logic has been
> -             * fixed.*/
> -
> -            return;
> -        }
> -
>          entry = __ioapic_read_entry(apic, pin, TRUE);
>  
>          if ( ! entry.mask )
> @@ -301,17 +258,6 @@ static void __io_apic_eoi(unsigned int a
>      }
>  }
>  
> -/* EOI an IO-APIC entry.  One of vector or pin may be -1, indicating that
> - * it should be worked out using the other.  This function disables interrupts
> - * and takes the ioapic_lock */
> -static void io_apic_eoi(unsigned int apic, unsigned int vector, unsigned int pin)
> -{
> -    unsigned int flags;
> -    spin_lock_irqsave(&ioapic_lock, flags);
> -    __io_apic_eoi(apic, vector, pin);
> -    spin_unlock_irqrestore(&ioapic_lock, flags);
> -}
> -
>  /*
>   * Saves all the IO-APIC RTE's
>   */
> @@ -1693,11 +1639,7 @@ static void end_level_ioapic_irq(struct 
>  
>      /* Manually EOI the old vector if we are moving to the new */
>      if ( vector && i != vector )
> -    {
> -        int ioapic;
> -        for (ioapic = 0; ioapic < nr_ioapics; ioapic++)
> -            io_apic_eoi_vector(ioapic, i);
> -    }
> +        eoi_IO_APIC_irq(desc);
>  
>      v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
>  
>
>

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-users-bounces@lists.xensource.com Tue Nov 15 05:26:38 2011
Return-path: <xen-users-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 05:26:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQJ26-0006rl-0t; Tue, 15 Nov 2011 05:26:38 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQJ1A-0006Xi-PJ; Tue, 15 Nov 2011 05:25:41 -0800
X-Env-Sender: eross@corp.locatrix.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1321363537!3612581!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22918 invoked from network); 15 Nov 2011 13:25:37 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-15.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 13:25:37 -0000
Received: by wyg24 with SMTP id 24so598119wyg.30
	for <multiple recipients>; Tue, 15 Nov 2011 05:25:37 -0800 (PST)
Received: by 10.180.85.161 with SMTP id i1mr30334173wiz.17.1321363537096; Tue,
	15 Nov 2011 05:25:37 -0800 (PST)
MIME-Version: 1.0
Received: by 10.180.88.132 with HTTP; Tue, 15 Nov 2011 05:25:16 -0800 (PST)
In-Reply-To: <20111111150013.GA4712@phenom.dumpdata.com>
References: <4EBD03EA.9070907@xen.org>
	<20111111150013.GA4712@phenom.dumpdata.com>
From: Andrew Eross <eross@locatrix.com>
Date: Tue, 15 Nov 2011 11:25:16 -0200
Message-ID: <CAL_tfFeUsDO1oAoKeWHLBJG0CHDf8A19mvjNX+zJCXfVdmfd3w@mail.gmail.com>
Subject: Re: [Xen-users] Re: [Xen-API] Another Xen Doc Day, Nov 29 or Dec 12
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Content-Type: text/plain; charset=ISO-8859-1
Cc: "xen-api@lists.xensource.com" <xen-api@lists.xensource.com>,
	xen-arm@lists.xensource.com, Lars Kurth <lars.kurth@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>
X-BeenThere: xen-users@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen user discussion <xen-users.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-users>,
	<mailto:xen-users-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-users@lists.xensource.com>
List-Help: <mailto:xen-users-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-users>,
	<mailto:xen-users-request@lists.xensource.com?subject=subscribe>
Sender: xen-users-bounces@lists.xensource.com
Errors-To: xen-users-bounces@lists.xensource.com

+1 Nov 29

On Fri, Nov 11, 2011 at 1:00 PM, Konrad Rzeszutek Wilk
<konrad.wilk@oracle.com> wrote:
>
> On Fri, Nov 11, 2011 at 11:15:54AM +0000, Lars Kurth wrote:
> > Hi,
> >
> > Given that the last Xen Document day was a real success, I wanted to
> > propose another Xen Document day. Ideas of what to work on:
> > - Continue some of the work stared by the dev community (more man
> > pages, etc.)
> > - Clean up pages in the new Wiki
> > - I am also happy to be on stand-by to help anybody who wants to
> > know how to use the new Wiki effectively
> >
> > Please vote on date preferences by voting
> > +1 <your preferred date>
>
> +1 Nov 29
>
> _______________________________________________
> Xen-users mailing list
> Xen-users@lists.xensource.com
> http://lists.xensource.com/xen-users

_______________________________________________
Xen-users mailing list
Xen-users@lists.xensource.com
http://lists.xensource.com/xen-users

From xen-devel-bounces@lists.xensource.com Tue Nov 15 05:28:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 05:28:43 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQJ47-0007SE-Oc; Tue, 15 Nov 2011 05:28:43 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQJ3O-0007Fc-Bm
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 05:27:58 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1321363674!4275437!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9036 invoked from network); 15 Nov 2011 13:27:55 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-16.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 15 Nov 2011 13:27:55 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 15 Nov 2011 13:27:54 +0000
Message-Id: <4EC276E90200007800061160@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 15 Nov 2011 13:27:53 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Andrew Cooper" <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] [PATCH] x86/IO-APIC: refine EOI-ing of
	migrating level interrupts
References: <4EC273B40200007800061145@nat28.tlf.novell.com>
	<4EC266E3.50706@citrix.com>
In-Reply-To: <4EC266E3.50706@citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 15.11.11 at 14:19, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
> On 15/11/11 13:14, Jan Beulich wrote:
>>      if ( ioapic_has_eoi_reg(apic) )
>>      {
>>          /* If vector is unknown, read it from the IO-APIC */
>> -        if ( vector =3D=3D -1 )
>> +        if ( vector =3D=3D IRQ_VECTOR_UNASSIGNED )
>=20
> Quick style query:  I consider IRQ_VECTOR_UNASSIGNED logically different
> from passing -1 in as a value for vector, even though they are the are
> the same value.  Is it sensible to mix them?

I view it quite the other way around: One should explicitly pass
IRQ_VECTOR_UNASSIGNED when passing a literal value (which
currently doesn't happen anyway. Primarily because passing
desc->arch.vector or desc->arch.old_vector could happen to also
hold this very value.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 05:31:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 05:31:37 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQJ6v-0007rY-1H; Tue, 15 Nov 2011 05:31:37 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQJ6O-0007fc-V2
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 05:31:05 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1321363861!3200105!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13163 invoked from network); 15 Nov 2011 13:31:02 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-11.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 13:31:02 -0000
Received: by wwp14 with SMTP id 14so5620358wwp.24
	for <xen-devel@lists.xensource.com>;
	Tue, 15 Nov 2011 05:31:01 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=k1K1imS9AgCVqoulBBpN9o2G7HyTqbmVygHEWHZ+nb4=;
	b=LEyR7wYtWkehG28NgAyb3DP3uGKIehr5okKV0GHLNhAG1rXN542A7U/d/3loCX8u4P
	tFiZrcCV8JCs7HcMAZqFq/IsU6XDlr/9nhiD1hNPNet2FrHSq7wyzt68yWlMUcSHLZOD
	dmSqK2pVZYOHDE7Ah5u3EbMaYv4UkkirytQz4=
Received: by 10.227.203.147 with SMTP id fi19mr8534940wbb.14.1321363861702;
	Tue, 15 Nov 2011 05:31:01 -0800 (PST)
Received: from [192.168.1.3] (host86-129-245-239.range86-129.btcentralplus.com.
	[86.129.245.239])
	by mx.google.com with ESMTPS id em4sm28841518wbb.20.2011.11.15.05.31.00
	(version=SSLv3 cipher=OTHER); Tue, 15 Nov 2011 05:31:01 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Tue, 15 Nov 2011 13:30:53 +0000
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <CAE81A0D.341A9%keir@xen.org>
Thread-Topic: x86 emulator and new isa additions
Thread-Index: AcyjmswDdqnGiDtQ8kKGmJ6jaBeHJw==
In-Reply-To: <4EC27134020000780006112C@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: x86 emulator and new isa additions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 15/11/2011 13:03, "Jan Beulich" <JBeulich@suse.com> wrote:

> Hi Keir,
> 
> so far the convention seems to be to assume that guest attempts to
> execute instructions not supported by the underlying CPU would never
> make it into the emulator. Is that really correct (in particular in the
> context of real mode emulation, where it's not just single instructions
> that get emulated)?
> 
> From earlier work on the emulation code I seem to recall that it's mainly
> the testing code that didn't like use of cpu_has_xyz in conditionals. I
> would suppose that simply adding respective feature detection (and
> boolean variables) to the testing code should get us around this
> problem. Or would you see any better alternative?

I'm fine to have further feature checks in the emulator, but I would like to
keep the emulator core clean. And indeed the emulator probably ought to act
based on features advertised to the *guest* rather than the *host*?

So, properly, I think the fact we already have a cpuid callback ought to be
sufficient to implement all the cpu_has functionality that the emulator
could want, perhaps hidden behind some helper/abstraction functions/macros.

The question would then be whether that is fast enough. My guess is it would
be, and I'd rather do it that way, or close to that way, in the first
instance at least, and then optimise later if we see the need.

 -- Keir

> Jan
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 05:36:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 05:36:41 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQJBp-0008Kn-0W; Tue, 15 Nov 2011 05:36:41 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQJB8-00087n-7k
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 05:35:58 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1321364153!3201013!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28717 invoked from network); 15 Nov 2011 13:35:55 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-11.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 13:35:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,515,1315195200"; d="scan'208";a="170637601"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 08:35:29 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX02.citrite.net
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Tue, 15 Nov 2011
	08:35:29 -0500
Message-ID: <4EC26A9F.8050501@citrix.com>
Date: Tue, 15 Nov 2011 13:35:27 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH] x86/IO-APIC: refine EOI-ing of	 migrating
	level interrupts
References: <4EC273B40200007800061145@nat28.tlf.novell.com>
	<4EC266E3.50706@citrix.com>
	<4EC276E90200007800061160@nat28.tlf.novell.com>
In-Reply-To: <4EC276E90200007800061160@nat28.tlf.novell.com>
X-Enigmail-Version: 1.1.2
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 15/11/11 13:27, Jan Beulich wrote:
>>>> On 15.11.11 at 14:19, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
>> On 15/11/11 13:14, Jan Beulich wrote:
>>>      if ( ioapic_has_eoi_reg(apic) )
>>>      {
>>>          /* If vector is unknown, read it from the IO-APIC */
>>> -        if ( vector == -1 )
>>> +        if ( vector == IRQ_VECTOR_UNASSIGNED )
>> Quick style query:  I consider IRQ_VECTOR_UNASSIGNED logically different
>> from passing -1 in as a value for vector, even though they are the are
>> the same value.  Is it sensible to mix them?
> I view it quite the other way around: One should explicitly pass
> IRQ_VECTOR_UNASSIGNED when passing a literal value (which
> currently doesn't happen anyway. Primarily because passing
> desc->arch.vector or desc->arch.old_vector could happen to also
> hold this very value.
>
> Jan

Ok.

Do you want any other patches to be tested on the problem server?

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 05:43:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 05:43:50 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQJIk-0000NF-Ja; Tue, 15 Nov 2011 05:43:50 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQJI4-0000As-PR
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 05:43:09 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1321364551!45986227!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11289 invoked from network); 15 Nov 2011 13:42:31 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 15 Nov 2011 13:42:31 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 15 Nov 2011 13:43:05 +0000
Message-Id: <4EC27A780200007800061193@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 15 Nov 2011 13:43:04 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Andrew Cooper" <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] [PATCH] x86/IO-APIC: refine EOI-ing of
	migrating level interrupts
References: <4EC273B40200007800061145@nat28.tlf.novell.com>
	<4EC266E3.50706@citrix.com>
	<4EC276E90200007800061160@nat28.tlf.novell.com>
	<4EC26A9F.8050501@citrix.com>
In-Reply-To: <4EC26A9F.8050501@citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 15.11.11 at 14:35, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
> On 15/11/11 13:27, Jan Beulich wrote:
>>>>> On 15.11.11 at 14:19, Andrew Cooper <andrew.cooper3@citrix.com> =
wrote:
>>> On 15/11/11 13:14, Jan Beulich wrote:
>>>>      if ( ioapic_has_eoi_reg(apic) )
>>>>      {
>>>>          /* If vector is unknown, read it from the IO-APIC */
>>>> -        if ( vector =3D=3D -1 )
>>>> +        if ( vector =3D=3D IRQ_VECTOR_UNASSIGNED )
>>> Quick style query:  I consider IRQ_VECTOR_UNASSIGNED logically =
different
>>> from passing -1 in as a value for vector, even though they are the are
>>> the same value.  Is it sensible to mix them?
>> I view it quite the other way around: One should explicitly pass
>> IRQ_VECTOR_UNASSIGNED when passing a literal value (which
>> currently doesn't happen anyway. Primarily because passing
>> desc->arch.vector or desc->arch.old_vector could happen to also
>> hold this very value.
>>
>> Jan
>=20
> Ok.
>=20
> Do you want any other patches to be tested on the problem server?

While not directly related, throwing in "x86/IRQ: prevent vector
sharing within IO-APICs" (which I want to apply only after this one)
would certainly be good.

Plus of course the experimental, yet to be written, use of
desc->arch.old_vector in end_level_io_apic_irq() (which anyway
should be done only after a good run with the above included).

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 05:53:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 05:53:08 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQJRj-0000uu-8w; Tue, 15 Nov 2011 05:53:07 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQJR7-0000iN-HS
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 05:52:29 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1321365118!48548662!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27656 invoked from network); 15 Nov 2011 13:51:59 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 13:51:59 -0000
X-IronPort-AV: E=Sophos;i="4.69,515,1315195200"; d="scan'208";a="19109238"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 08:52:24 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Tue, 15 Nov 2011 08:52:25 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pAFDqHIq019132;
	Tue, 15 Nov 2011 05:52:18 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Tue, 15 Nov 2011 13:53:10 +0000
Message-ID: <1321365190-601-1-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
MIME-Version: 1.0
Content-Type: text/plain
Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Stefano.Stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH] xen: introduce HVM_PARAM_BUFIOREQ_EVTCHN
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Introduce an event channel for buffered io event notifications,
advertise the port number using an hvm param.
This way the device model is not forced to check the buffered io page
for data several times a second for the entire life of the VM (buffered
io is mostly used for stdvga emulation in Xen that is switched off after
the guest goes into graphical mode).

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 xen/arch/x86/hvm/hvm.c          |   10 ++++++++++
 xen/arch/x86/hvm/io.c           |    2 ++
 xen/include/public/hvm/params.h |    3 ++-
 3 files changed, 14 insertions(+), 1 deletions(-)

diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index ab7763b..dc01537 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -972,6 +972,16 @@ int hvm_vcpu_initialise(struct vcpu *v)
 
     /* Register ioreq event channel. */
     v->arch.hvm_vcpu.xen_port = rc;
+
+    if ( v->vcpu_id == 0 )
+    {
+        /* Create bufioreq event channel. */
+        rc = alloc_unbound_xen_event_channel(v, 0);
+        if ( rc < 0 )
+            goto fail2;
+        v->domain->arch.hvm_domain.params[HVM_PARAM_BUFIOREQ_EVTCHN] = rc;
+    }
+
     spin_lock(&v->domain->arch.hvm_domain.ioreq.lock);
     if ( v->domain->arch.hvm_domain.ioreq.va != NULL )
         get_ioreq(v)->vp_eport = v->arch.hvm_vcpu.xen_port;
diff --git a/xen/arch/x86/hvm/io.c b/xen/arch/x86/hvm/io.c
index 7ebefc7..41a2ede 100644
--- a/xen/arch/x86/hvm/io.c
+++ b/xen/arch/x86/hvm/io.c
@@ -118,6 +118,8 @@ int hvm_buffered_io_send(ioreq_t *p)
     wmb();
     pg->write_pointer += qw ? 2 : 1;
 
+    notify_via_xen_event_channel(v->domain,
+            v->domain->arch.hvm_domain.params[HVM_PARAM_BUFIOREQ_EVTCHN]);
     spin_unlock(&iorp->lock);
     
     return 1;
diff --git a/xen/include/public/hvm/params.h b/xen/include/public/hvm/params.h
index 1c5a1a9..6699788 100644
--- a/xen/include/public/hvm/params.h
+++ b/xen/include/public/hvm/params.h
@@ -52,6 +52,7 @@
 #define HVM_PARAM_IOREQ_PFN    5
 
 #define HVM_PARAM_BUFIOREQ_PFN 6
+#define HVM_PARAM_BUFIOREQ_EVTCHN 26
 
 #ifdef __ia64__
 
@@ -141,6 +142,6 @@
 /* Boolean: Enable nestedhvm (hvm only) */
 #define HVM_PARAM_NESTEDHVM    24
 
-#define HVM_NR_PARAMS          26
+#define HVM_NR_PARAMS          27
 
 #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 05:54:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 05:54:11 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQJSl-0001J6-P1; Tue, 15 Nov 2011 05:54:11 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQJRy-0000yu-Lw
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 05:53:23 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1321365174!52324719!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 528 invoked from network); 15 Nov 2011 13:52:55 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-8.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 15 Nov 2011 13:52:55 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 15 Nov 2011 13:53:19 +0000
Message-Id: <4EC27CDC02000078000611A1@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 15 Nov 2011 13:53:16 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Keir Fraser" <keir@xen.org>
References: <4EC27134020000780006112C@nat28.tlf.novell.com>
	<CAE81A0D.341A9%keir@xen.org>
In-Reply-To: <CAE81A0D.341A9%keir@xen.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: x86 emulator and new isa additions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 15.11.11 at 14:30, Keir Fraser <keir@xen.org> wrote:
> On 15/11/2011 13:03, "Jan Beulich" <JBeulich@suse.com> wrote:
>=20
>> Hi Keir,
>>=20
>> so far the convention seems to be to assume that guest attempts to
>> execute instructions not supported by the underlying CPU would never
>> make it into the emulator. Is that really correct (in particular in the
>> context of real mode emulation, where it's not just single instructions
>> that get emulated)?
>>=20
>> From earlier work on the emulation code I seem to recall that it's =
mainly
>> the testing code that didn't like use of cpu_has_xyz in conditionals. I
>> would suppose that simply adding respective feature detection (and
>> boolean variables) to the testing code should get us around this
>> problem. Or would you see any better alternative?
>=20
> I'm fine to have further feature checks in the emulator, but I would =
like to
> keep the emulator core clean. And indeed the emulator probably ought to =
act
> based on features advertised to the *guest* rather than the *host*?

That's a good point.

> So, properly, I think the fact we already have a cpuid callback ought to =
be
> sufficient to implement all the cpu_has functionality that the emulator
> could want, perhaps hidden behind some helper/abstraction functions/macro=
s.

Which may make it necessary to add cpuid callbacks to all emulator
users (seems like only hvm currently has one). But it indeed looks like
the right route to go, so I'll look into doing so.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 06:12:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 06:12:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQJkt-00036j-JM; Tue, 15 Nov 2011 06:12:56 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQJjk-0002sj-Qh
	for Xen-devel@lists.xensource.com; Tue, 15 Nov 2011 06:11:45 -0800
X-Env-Sender: bward@sigovs.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1321366299!3631088!1
X-Originating-IP: [64.18.1.208]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32714 invoked from network); 15 Nov 2011 14:11:41 -0000
Received: from exprod6og107.obsmtp.com (HELO exprod6og107.obsmtp.com)
	(64.18.1.208)
	by server-8.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 15 Nov 2011 14:11:41 -0000
Received: from mail-vx0-f179.google.com ([209.85.220.179]) (using TLSv1) by
	exprod6ob107.postini.com ([64.18.5.12]) with SMTP
	ID DSNKTsJzGzZagoHJ/inZHP6pZtwjxrGnL+rd@postini.com;
	Tue, 15 Nov 2011 06:11:41 PST
Received: by vcbfy13 with SMTP id fy13so6241111vcb.10
	for <Xen-devel@lists.xensource.com>;
	Tue, 15 Nov 2011 06:11:38 -0800 (PST)
Received: by 10.224.182.1 with SMTP id ca1mr12341444qab.33.1321366298384; Tue,
	15 Nov 2011 06:11:38 -0800 (PST)
From: Brandon Ward <bward@sigovs.com>
MIME-Version: 1.0
X-Mailer: Microsoft Office Outlook 12.0
Thread-Index: AcyjoHkIPFknu4gTRoyuFMogvOUmTg==
Date: Tue, 15 Nov 2011 09:11:30 -0500
Message-ID: <937dd0bd73221d9faa7bcd13207b8295@mail.gmail.com>
To: Xen-devel@lists.xensource.com
Cc: 
Subject: [Xen-devel] unsubscribe
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============2131199148=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============2131199148==
Content-Type: multipart/alternative; boundary=20cf30363f0fd5585d04b1c69042

--20cf30363f0fd5585d04b1c69042
Content-Type: text/plain; charset=ISO-8859-1



--20cf30363f0fd5585d04b1c69042
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset=
=3Dus-ascii"><meta name=3D"Generator" content=3D"Microsoft Word 12 (filtere=
d medium)"><style><!--
/* Font Definitions */
@font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0in;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
	{mso-style-priority:99;
	color:blue;
	text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
	{mso-style-priority:99;
	color:purple;
	text-decoration:underline;}
span.EmailStyle17
	{mso-style-type:personal-compose;
	font-family:"Calibri","sans-serif";
	color:windowtext;}
.MsoChpDefault
	{mso-style-type:export-only;}
@page WordSection1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
	{page:WordSection1;}
--></style></head><body lang=3D"EN-US" link=3D"blue" vlink=3D"purple"><div =
class=3D"WordSection1"><p class=3D"MsoNormal">=A0</p></div></body></html>

--20cf30363f0fd5585d04b1c69042--


--===============2131199148==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============2131199148==--


From xen-devel-bounces@lists.xensource.com Tue Nov 15 06:29:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 06:29:45 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQK1B-0004Ty-9C; Tue, 15 Nov 2011 06:29:45 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQJzP-0004Fp-PD; Tue, 15 Nov 2011 06:27:56 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1321367271!2742835!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4435 invoked from network); 15 Nov 2011 14:27:52 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-5.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 15 Nov 2011 14:27:52 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAFERn06011957
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 15 Nov 2011 14:27:50 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAFERmSb014465
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 15 Nov 2011 14:27:49 GMT
Received: from abhmt119.oracle.com (abhmt119.oracle.com [141.146.116.71])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAFERh6B009065; Tue, 15 Nov 2011 08:27:43 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 15 Nov 2011 06:27:43 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 823B98283A; Tue, 15 Nov 2011 09:27:40 -0500 (EST)
Date: Tue, 15 Nov 2011 09:27:40 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Artur Baruchi <mail.baruchi@gmail.com>
Subject: Re: [Xen-devel] Module Error
Message-ID: <20111115142740.GA22675@phenom.dumpdata.com>
References: <CAAiDW_SQ+UnVK1Xvwk1S_24tf9BcC5BEH0WcMC104R32c1_4TQ@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAAiDW_SQ+UnVK1Xvwk1S_24tf9BcC5BEH0WcMC104R32c1_4TQ@mail.gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090201.4EC276E6.00A9,ss=1,re=0.000,fgs=0
Cc: Xen-devel@lists.xensource.com, xen-users <Xen-users@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Sun, Oct 30, 2011 at 07:16:11PM -0200, Artur Baruchi wrote:
> Hi.
> 
> Im writing a kernel module to extract some information from kernel,
> the module is working really fine in an AMD (AMD Athlon(tm) 64 X2 Dual
> Core Processor 3800+), but, when trying to run the module in a i7
> (Intel(R) Core(TM) i7 CPU 930 @ 2.80GHz) Im facing some strange errors
> (see below). The kernel versions are just the same on both machines
> (2.6.34.10-0.2-xen #1 SMP x86_64 x86_64 x86_64 GNU/Linux). The
> difference are the amount of memory AND processor vendor. I noted that
> the line of code that hangs my machine is this one:
> 
> if(end->host==NULL) {

That sounds like a lazy PTE setting issue. Meaning that the PTE write
hadn't been actually flushed, but not sure.

What happens if you run with 3.1 kernel? Do you get the same problem?

> 
> The end->host points to an Inode type (end is an address_space type).
> If I remove this line, the module works (but, obviously, do not return
> what I want). I tried the same code in a kernel without xen
> (2.6.34.10-0.2-desktop #1 SMP x86_64 x86_64 x86_64 GNU/Linux) and
> worked fine, so I suppose that this error is due to something in Xen
> running in a intel processor (I tried the module in an intel quad, and
> got the same error). Follow some outputs:
> 
> The error stack:
> Oct 28 23:40:35 goku kernel: [ 4472.129718] BUG: unable to handle
> kernel paging request at 000003d600000004
> Oct 28 23:40:35 goku kernel: [ 4472.129933] IP: [<ffffffffa08d118c>]
> get_files+0x6c/0x220 [pagecache]
> Oct 28 23:40:35 goku kernel: [ 4472.130098] PGD 0
> Oct 28 23:40:35 goku kernel: [ 4472.130250] Oops: 0000 [#4] SMP
> Oct 28 23:40:35 goku kernel: [ 4472.130452] last sysfs file:
> /sys/devices/system/cpu/cpu7/online
> Oct 28 23:40:35 goku kernel: [ 4472.130562] CPU 0
> Oct 28 23:40:35 goku kernel: [ 4472.130615] Modules linked in:
> pagecache ocfs2_dlmfs ocfs2_stack_o2cb ocfs2_dlm ocfs2_nodemanager
> ocfs2_stackglue configfs drbd crc32c libcrc32c bridge stp llc nfsd
> lockd nfs_acl snd_pcm_oss auth_rpcgss snd_mixer_oss usbbk gntdev netbk
> blkbk blkback_pagemap blktap domctl xenbus_be snd_seq evtchn
> snd_seq_device sunrpc exportfs edd fuse loop snd_hda_codec_realtek
> firewire_ohci snd_hda_intel firewire_core snd_hda_codec crc_itu_t
> snd_hwdep snd_pcm snd_timer ohci1394 iTCO_wdt snd soundcore sr_mod
> xhci_hcd ieee1394 i2c_i801 iTCO_vendor_support pcspkr snd_page_alloc
> sg r8169 wmi serio_raw ext4 jbd2 crc16 linear uhci_hcd sd_mod nouveau
> ehci_hcd ttm drm_kms_helper usbcore drm agpgart i2c_algo_bit i2c_core
> button dm_snapshot dm_mod xenblk cdrom xennet fan processor ata_piix
> ahci pata_jmicron ata_generic libata scsi_mod thermal thermal_sys
> hwmon
> Oct 28 23:40:35 goku kernel: [ 4472.132037]
> Oct 28 23:40:35 goku kernel: [ 4472.132037] Pid: 4641, comm: cat
> Tainted: G      D    2.6.34.10-0.2-xen #1 X58A-UD3R/X58A-UD3R
> Oct 28 23:40:35 goku kernel: [ 4472.132037] RIP:
> e030:[<ffffffffa08d118c>]  [<ffffffffa08d118c>] get_files+0x6c/0x220
> [pagecache]
> Oct 28 23:40:35 goku kernel: [ 4472.132037] RSP: e02b:ffff8801ded93c88
>  EFLAGS: 00010246
> Oct 28 23:40:35 goku kernel: [ 4472.132037] RAX: 8000000004000400 RBX:
> ffff8801e8ea5bd0 RCX: 0000000000000001
> Oct 28 23:40:35 goku kernel: [ 4472.132037] RDX: ffff8801efc8c7e8 RSI:
> ffffffffa08d15c0 RDI: ffff8801e8ea4c28
> Oct 28 23:40:35 goku kernel: [ 4472.132037] RBP: 0000000000000001 R08:
> ffff8801eed81e00 R09: 0000000000000000
> Oct 28 23:40:35 goku kernel: [ 4472.132037] R10: ffff8801e8ea5c00 R11:
> 0000000000000000 R12: 00000000001e6000
> Oct 28 23:40:35 goku kernel: [ 4472.132037] R13: 0000000006a50000 R14:
> ffff8801e8ea5b88 R15: 000003d600000004
> Oct 28 23:40:35 goku kernel: [ 4472.132037] FS:
> 00007fcb81c3b700(0000) GS:ffff88000200b000(0000)
> knlGS:0000000000000000
> Oct 28 23:40:35 goku kernel: [ 4472.132037] CS:  e033 DS: 0000 ES:
> 0000 CR0: 0000000080050033
> Oct 28 23:40:35 goku kernel: [ 4472.132037] CR2: 000003d600000004 CR3:
> 00000001edecf000 CR4: 0000000000002660
> Oct 28 23:40:35 goku kernel: [ 4472.132037] DR0: 0000000000000000 DR1:
> 0000000000000000 DR2: 0000000000000000
> Oct 28 23:40:35 goku kernel: [ 4472.132037] DR3: 0000000000000000 DR6:
> 00000000ffff0ff0 DR7: 0000000000000400
> Oct 28 23:40:35 goku kernel: [ 4472.132037] Process cat (pid: 4641,
> threadinfo ffff8801ded92000, task ffff8801eedfa780)
> Oct 28 23:40:35 goku kernel: [ 4472.132037] Stack:
> Oct 28 23:40:35 goku kernel: [ 4472.132037]  0000000101baa5b4
> 0000000200000002 0000000000000000 ffff8801f16ffae8
> Oct 28 23:40:35 goku kernel: [ 4472.132037] <0> 0000000000000000
> ffff8801ee7c6500 ffff8801efd32bc0 ffff8801e45de2d0
> Oct 28 23:40:35 goku kernel: [ 4472.132037] <0> ffff8801ee7c6500
> ffff8801f05d80f8 ffffffff801314f0 ffffffffa08d1349
> Oct 28 23:40:35 goku kernel: [ 4472.132037] Call Trace:
> Oct 28 23:40:35 goku kernel: [ 4472.132037]  [<ffffffffa08d1349>]
> cache_open+0x9/0x20 [pagecache]
> Oct 28 23:40:35 goku kernel: [ 4472.132037]  [<ffffffff8016c529>]
> proc_reg_open+0xb9/0x240
> Oct 28 23:40:35 goku kernel: [ 4472.132037]  [<ffffffff8011060b>]
> __dentry_open+0xeb/0x340
> Oct 28 23:40:35 goku kernel: [ 4472.132037]  [<ffffffff801206a8>]
> finish_open+0xe8/0x1c0
> Oct 28 23:40:35 goku kernel: [ 4472.132037]  [<ffffffff80120f40>]
> do_filp_open+0x1a0/0x630
> Oct 28 23:40:35 goku kernel: [ 4472.132037]  [<ffffffff8011214a>]
> do_sys_open+0x6a/0x140
> Oct 28 23:40:35 goku kernel: [ 4472.132037]  [<ffffffff80007438>]
> system_call_fastpath+0x16/0x1b
> Oct 28 23:40:35 goku kernel: [ 4472.132037]  [<00007fcb817a7130>] 0x7fcb817a7130
> Oct 28 23:40:35 goku kernel: [ 4472.132037] Code: 03 05 69 9d f9 df 4c
> 8b 78 18 4d 85 ff 0f 84 9c 00 00 00 41 f6 c7 01 0f 85 92 00 00 00 48
> 8b 00 a9 00 00 02 00 0f 85 84 00 00 00 <49> 8b 1f 48 85 db 0f 84 78 00
> 00 00 48 83 7b 40 00 74 71 4c 8b
> Oct 28 23:40:35 goku kernel: [ 4472.132037] RIP  [<ffffffffa08d118c>]
> get_files+0x6c/0x220 [pagecache]
> Oct 28 23:40:35 goku kernel: [ 4472.132037]  RSP <ffff8801ded93c88>
> Oct 28 23:40:35 goku kernel: [ 4472.132037] CR2: 000003d600000004
> Oct 28 23:40:35 goku kernel: [ 4472.143966] ---[ end trace a998217447e12d1d ]---
> 
> Peace of code (simplified):
> int init_module () {
> 
> 	unsigned long pfn;
> 	struct inode *ino;
> 	unsigned char * c;
> 	struct address_space *end;
> 	struct dentry *dentry;
> 	int fl;
> 
> 	struct filepage * temp;
> 	struct filepage *pos;
> 
> 	for (pfn = 0; pfn < num_physpages; pfn++) {
> 		struct page *page;
> 		if (!pfn_valid(pfn))
> 			continue;
> 		page = pfn_to_page(pfn);
> 				if((page->mapping!=NULL) && (!PageAnon(page)) && (!PageSwapCache(page))) {
> 						end = page->mapping;
> 						if(end->host==NULL) {  <- without this line, no hangs, but the
> module returns wrong data to me...
> 							printk(KERN_INFO "Cool... found an valid inode \n");
> 						}
> 				}				
> 					
> 	}
> return 0;
> }
> 
> Thanks in advance.
> 
> Att.
> Artur Baruchi
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 06:34:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 06:34:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQK5V-0005kQ-VE; Tue, 15 Nov 2011 06:34:13 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQK38-00050q-4Q
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 06:31:46 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1321367501!3572652!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18013 invoked from network); 15 Nov 2011 14:31:42 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-11.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 15 Nov 2011 14:31:42 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAFEVd5k022509
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 15 Nov 2011 14:31:40 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAFEVcfe021496
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 15 Nov 2011 14:31:39 GMT
Received: from abhmt105.oracle.com (abhmt105.oracle.com [141.146.116.57])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAFEVXlf029115; Tue, 15 Nov 2011 08:31:33 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 15 Nov 2011 06:31:33 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 73C808283A; Tue, 15 Nov 2011 09:31:32 -0500 (EST)
Date: Tue, 15 Nov 2011 09:31:32 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: "jonathanjstevens@gmail.com" <jonathanjstevens@gmail.com>
Subject: Re: [Xen-devel] HVR-4000 DVB can't scan or tune (properly) with Xen
Message-ID: <20111115143131.GB22675@phenom.dumpdata.com>
References: <CAA7M+FD1mis7C1+cU0eCYZHhu96-B-g7_73FjC430fo4CHohvQ@mail.gmail.com>
	<CAA7M+FBP1SAa2cn9Rfsdcde=ruKekq+tVP1Jnj17RK6qrgvfNw@mail.gmail.com>
	<20111114183807.GA15284@phenom.dumpdata.com>
	<CAA7M+FCKCqHfBwkx7LUe6qH-_z4E+vZ2rwKi013MZxdT4GfKnw@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CAA7M+FCKCqHfBwkx7LUe6qH-_z4E+vZ2rwKi013MZxdT4GfKnw@mail.gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Content-Transfer-Encoding: quoted-printable
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090208.4EC277CC.01A0,ss=1,re=-2.300,fgs=0
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 15, 2011 at 12:52:56AM +0000, jonathanjstevens@gmail.com wrot=
e:
> >
> > Excellent. Everything that is new.
>=20
> Shiney. :)
>=20
> >
> >>
> >> When I boot without Xen the DVB PCI cards can tune and scan perfectl=
y.
> >> I also have a USB DVB unit, which can tune and scan regardless of
> >> whether Xen is running. However when I try to scan and tune with the
> >> PCI DVB cards it fails.
> >
> > OK, and you are _not_ passing it to a guest right?
>=20
> Indeed not, this is in dom0. I do not have IOMMU so my dvb stuff will
> run in dom0.
>=20
>=20
> >>
> >> [ =A0 26.572693] cx88[1]/1: IRQ loop detected, disabling interrupts
> >> [ =A0 26.574810] cx88[1]: irq aud [0x1001] dn_risci1* dn_sync*
> >
> > Great. Can you do a couple of tests:
>=20
> Certainly. However, first I will say that I have made the above
> messages go away. I had been trying various boot options based on what
> I had been reading on net. I was using irqpoll at the time that those
> messages appeared. Removing irqpoll has stopped them from occurring.
> Hopefully that is useful information in itself.

Why did pick irqpoll? Was there something in the past that was hanging on=
 your box.

>=20
> >
> > 1). Boot your Linux machine with 'mem=3D3G' and see if that makes the=
 issue
> > =A0 =A0disappear.
>=20
> I have tried mem=3D2G and 4G (not 3 but I will if you think it'll be di=
fferent).
> I have also been trying with ballooning disabled, and with dom0_mem=3D2=
G / 4G
> I also tried swiotlb=3D65762
> I have tried most combinations of the above - but not necessarily all.

And all fail? Was this with the irqpoll option?
Is this a two socket box?

>=20
>=20
> >
> > 2). Tell me what is the 'scan' tool you use? Is it there a command
> > =A0 line version of the tool that triggers this?
> >
> I've been using as many as I can try.
> Mainly it's the F16 provided scandvb, which I think is just a renamed
> dvbscan and also w_scan.
> I've also tried mplayer, xine, kaffeine, and mythtv. I haven't got vlc
> to compile yet...

rpmfusion has a version of it built for F16.

>=20
> I think I have a bit more information for you after today's hacking abo=
ut.
> First off there was a kernel update, so I'm now at
>=20
> Linux mythtvtuner.home 3.1.1-1.fc16.x86_64 #1 SMP Fri Nov 11 21:47:56
> UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
>=20
>=20
> >From what I can see I think in fact the tuning works OK, but there is
> some sort of issue getting at the streams once tuned.
> e.g. tzap will get a lock OK
> > tzap -a 1 -f 1 -d 1 -c ~/tzap.channels.conf "BBC ONE(BBC)"
> using '/dev/dvb/adapter1/frontend1' and '/dev/dvb/adapter1/demux1'
> tuning to 650000000 Hz
> video pid 0x0065, audio pid 0x0066
> status 01 | signal 5151 | snr 8000 | ber 00003fff | unc 00000000 |
> status 1f | signal 4e4e | snr ffff | ber 00000000 | unc 00000000 | FE_H=
AS_LOCK
> status 1f | signal 4e4e | snr ffff | ber 00000000 | unc 00000000 | FE_H=
AS_LOCK
>=20
>=20
> I don't know if the following is useful?
>=20
> root@mythtvtuner jon]# strace -f -v scandvb -a 1 -f1 -d 0 -5 -v -v -v
> ~jon/dvbscan.channels.conf
> execve("/usr/bin/scandvb", ["scandvb", "-a", "1", "-f1", "-d", "0",
> "-5", "-v", "-v", "-v", "/home/jon/dvbscan.channels.conf"],
> ["XDG_SESSION_ID=3D69", "HOSTNAME=3Dmythtvtuner.home", "SHELL=3D/bin/ba=
sh",
> "TERM=3Dxterm", "HISTSIZE=3D1000", "SSH_CLIENT=3D192.168.2.179 48391 2"=
...,
> "SSH_TTY=3D/dev/pts/7", "USER=3Djon",
> "LS_COLORS=3Drs=3D0:di=3D01;34:ln=3D01;36"...,
> "PATH=3D/usr/lib64/ccache:/usr/loca"..., "MAIL=3D/var/spool/mail/jon",
> "PWD=3D/home/jon", "XMODIFIERS=3D@im=3Dnone", "LANG=3Den_US.UTF-8",
> "KDE_IS_PRELINKED=3D1", "KDEDIRS=3D/usr", "HISTCONTROL=3Dignoredups",
> "HOME=3D/root", "SHLVL=3D2", "LOGNAME=3Djon", "CVS_RSH=3Dssh",
> "SSH_CONNECTION=3D192.168.2.179 483"...,
> "LESSOPEN=3D||/usr/bin/lesspipe.sh "...,
> "XDG_RUNTIME_DIR=3D/run/user/jon", "_=3D/usr/bin/strace"]) =3D 0
> brk(0)                                  =3D 0x20fe000
> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) =3D 0x7ff5ccd7a000
> access("/etc/ld.so.preload", R_OK)      =3D -1 ENOENT (No such file or =
directory)
> open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) =3D 3
> fstat(3, {st_dev=3Dmakedev(253, 1), st_ino=3D132752, st_mode=3DS_IFREG|=
0644,
> st_nlink=3D1, st_uid=3D0, st_gid=3D0, st_blksize=3D4096, st_blocks=3D22=
4,
> st_size=3D112482, st_atime=3D2011/11/14-12:23:08,
> st_mtime=3D2011/11/14-12:23:06, st_ctime=3D2011/11/14-12:23:06}) =3D 0
> mmap(NULL, 112482, PROT_READ, MAP_PRIVATE, 3, 0) =3D 0x7ff5ccd5e000
> close(3)                                =3D 0
> open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) =3D 3
> read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\27\2\2008\0=
\0\0"...,
> 832) =3D 832
> fstat(3, {st_dev=3Dmakedev(253, 1), st_ino=3D157705, st_mode=3DS_IFREG|=
0755,
> st_nlink=3D1, st_uid=3D0, st_gid=3D0, st_blksize=3D4096, st_blocks=3D40=
32,
> st_size=3D2063512, st_atime=3D2011/11/14-23:30:01,
> st_mtime=3D2011/10/26-20:57:26, st_ctime=3D2011/11/09-23:29:49}) =3D 0
> mmap(0x3880000000, 3884344, PROT_READ|PROT_EXEC,
> MAP_PRIVATE|MAP_DENYWRITE, 3, 0) =3D 0x3880000000
> mprotect(0x38801aa000, 2097152, PROT_NONE) =3D 0
> mmap(0x38803aa000, 24576, PROT_READ|PROT_WRITE,
> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1aa000) =3D 0x38803aa000
> mmap(0x38803b0000, 17720, PROT_READ|PROT_WRITE,
> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) =3D 0x38803b0000
> close(3)                                =3D 0
> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) =3D 0x7ff5ccd5d000
> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) =3D 0x7ff5ccd5c000
> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) =3D 0x7ff5ccd5b000
> arch_prctl(ARCH_SET_FS, 0x7ff5ccd5c700) =3D 0
> mprotect(0x38803aa000, 16384, PROT_READ) =3D 0
> mprotect(0x387fe21000, 4096, PROT_READ) =3D 0
> munmap(0x7ff5ccd5e000, 112482)          =3D 0
> write(2, "scanning /home/jon/dvbscan.chann"..., 41scanning
> /home/jon/dvbscan.channels.conf
> ) =3D 41
> write(2, "using '/dev/dvb/adapter1/fronten"..., 67using
> '/dev/dvb/adapter1/frontend1' and '/dev/dvb/adapter1/demux0'
> ) =3D 67
> open("/dev/dvb/adapter1/frontend1", O_RDWR) =3D 3
> ioctl(3, FE_GET_INFO, 0x60a640)         =3D 0
> rt_sigaction(SIGINT, {0x403300, [INT], SA_RESTORER|SA_RESTART,
> 0x3880036320}, {SIG_DFL, [], 0}, 8) =3D 0
> brk(0)                                  =3D 0x20fe000
> brk(0x211f000)                          =3D 0x211f000
> brk(0)                                  =3D 0x211f000
> open("/home/jon/dvbscan.channels.conf", O_RDONLY) =3D 4
> fstat(4, {st_dev=3Dmakedev(253, 16), st_ino=3D1704027,
> st_mode=3DS_IFREG|0664, st_nlink=3D1, st_uid=3D1000, st_gid=3D1000,
> st_blksize=3D4096, st_blocks=3D8, st_size=3D1028,
> st_atime=3D2011/11/14-15:05:46, st_mtime=3D2011/11/10-23:05:38,
> st_ctime=3D2011/11/10-23:05:38}) =3D 0
> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) =3D 0x7ff5ccd79000
> read(4, "#-------------------------------"..., 4096) =3D 1028
> write(2, "initial transponder 650000000 0 "..., 44initial transponder
> 650000000 0 9 9 6 2 4 4
> ) =3D 44
> write(2, "initial transponder 754000000 0 "..., 44initial transponder
> 754000000 0 3 9 3 1 0 0
> ) =3D 44
> write(2, "initial transponder 794000000 0 "..., 44initial transponder
> 794000000 0 2 9 3 1 0 0
> ) =3D 44
> write(2, "initial transponder 738000000 0 "..., 44initial transponder
> 738000000 0 2 9 3 1 0 0
> ) =3D 44
> write(2, "initial transponder 690000000 0 "..., 44initial transponder
> 690000000 0 2 9 3 1 0 0
> ) =3D 44
> write(2, "initial transponder 722000000 0 "..., 44initial transponder
> 722000000 0 2 9 3 1 0 0
> ) =3D 44
> write(2, "initial transponder 706000000 0 "..., 44initial transponder
> 706000000 0 9 9 6 2 4 4
> ) =3D 44
> write(2, "initial transponder 842000000 0 "..., 44initial transponder
> 842000000 0 9 9 6 2 4 4
> ) =3D 44
> read(4, "", 4096)                       =3D 0
> close(4)                                =3D 0
> munmap(0x7ff5ccd79000, 4096)            =3D 0
> write(2, ">>> tune to: ", 13>>> tune to: )           =3D 13
> write(2, "650000000:", 10650000000:)              =3D 10
> write(2, "INVERSION_AUTO:", 15INVERSION_AUTO:)         =3D 15
> write(2, "BANDWIDTH_8_MHZ:", 16BANDWIDTH_8_MHZ:)        =3D 16
> write(2, "FEC_AUTO:", 9FEC_AUTO:)                =3D 9
> write(2, "FEC_AUTO:", 9FEC_AUTO:)                =3D 9
> write(2, "QAM_AUTO:", 9QAM_AUTO:)                =3D 9
> write(2, "TRANSMISSION_MODE_AUTO:", 23TRANSMISSION_MODE_AUTO:) =3D 23
> write(2, "GUARD_INTERVAL_AUTO:", 20GUARD_INTERVAL_AUTO:)    =3D 20
> write(2, "HIERARCHY_AUTO", 14HIERARCHY_AUTO)          =3D 14
> write(2, "\n", 1
> )                       =3D 1
> ioctl(3, FE_SET_FRONTEND, 0x7fffe82681c0) =3D 0
> nanosleep({0, 200000000}, NULL)         =3D 0
> ioctl(3, FE_READ_STATUS, 0x7fffe82681ec) =3D 0
> write(2, ">>> tuning status =3D=3D 0x01\n", 26>>> tuning status =3D=3D =
0x01
> ) =3D 26
> nanosleep({0, 200000000}, NULL)         =3D 0
> ioctl(3, FE_READ_STATUS, 0x7fffe82681ec) =3D 0
> write(2, ">>> tuning status =3D=3D 0x1f\n", 26>>> tuning status =3D=3D =
0x1f
> ) =3D 26
> open("/dev/dvb/adapter1/demux0", O_RDWR|O_NONBLOCK) =3D 4
> ioctl(4, DMX_SET_FILTER, 0x7fffe8266fc0) =3D 0
> open("/dev/dvb/adapter1/demux0", O_RDWR|O_NONBLOCK) =3D 5
> ioctl(5, DMX_SET_FILTER, 0x7fffe8266fc0) =3D 0
> open("/dev/dvb/adapter1/demux0", O_RDWR|O_NONBLOCK) =3D 6
> ioctl(6, DMX_SET_FILTER, 0x7fffe8266fc0) =3D 0
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D5, events=3DPOLLIN}, {fd=3D4,
> events=3DPOLLIN}], 3, 1000) =3D 0 (Timeout)
> write(2, "WARNING: filter timeout pid 0x00"..., 35WARNING: filter
> timeout pid 0x0011
> ) =3D 35
> ioctl(5, DMX_STOP, 0x38803b0a80)        =3D 0
> close(5)                                =3D 0
> poll([{fd=3D6, events=3DPOLLIN}, {fd=3D4, events=3DPOLLIN}], 2, 1000) =3D=
 0 (Timeout)
> write(2, "WARNING: filter timeout pid 0x00"..., 35WARNING: filter
> timeout pid 0x0000
> ) =3D 35
> ioctl(4, DMX_STOP, 0x38803b0a80)        =3D 0
> close(4)                                =3D 0
> poll([{fd=3D6, events=3DPOLLIN}], 1, 1000)  =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}], 1, 1000)  =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}], 1, 1000)  =3D 0 (Timeout)
> poll([{fd=3D6, events=3DPOLLIN}], 1, 1000^C <unfinished ...>
>=20
> etc...
>=20
> Occasionally the POLLIN doesn't timeout (since kernel upgrade), but
> the data can't seem to be interpreted (my guess) and I can't find what
> makes this occur (and I can't seem to make it happen right now
> annoyingly!).
> I don't want to bombard you with unwanted diags but can capture more
> fully similar to above if useful?
>=20
>=20
>=20
> > 3). Or does this happend when you just load the module and it starts
> > =A0 doing the IRQ loop detected' thingy?
>=20
> Not entirely sure, can recreate by turning irqpoll back on and testing
> if you want? From memory there were very few of the
> >> [ =A0 26.572693] cx88[1]/1: IRQ loop detected, disabling interrupts
>=20
> but lots and lots of:
> >> [ =A0 26.574810] cx88[1]: irq aud [0x1001] dn_risci1* dn_sync*


Well, that one is the worry some one. It reads as if it can't get the
interrupts fast enough, which would be worrysome.

I think I need to look at the code itself to get a better understanding
of where that 'irq aud ..' is.


Are there cheap versions of these DVB cards? I've only Hauppage PV-150 wh=
ich
works for me, but that is not a DVB type card.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 06:41:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 06:41:41 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQKCj-0006ST-9M; Tue, 15 Nov 2011 06:41:41 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQKBy-0006Fk-5q
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 06:40:54 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1321368049!3224578!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14287 invoked from network); 15 Nov 2011 14:40:50 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-9.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 15 Nov 2011 14:40:50 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAFEeI3S002968
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 15 Nov 2011 14:40:19 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAFEeG2d004854
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 15 Nov 2011 14:40:18 GMT
Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAFEe64r003867; Tue, 15 Nov 2011 08:40:06 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 15 Nov 2011 06:40:06 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id E5C8F8283A; Tue, 15 Nov 2011 09:40:04 -0500 (EST)
Date: Tue, 15 Nov 2011 09:40:04 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Deepthi Dharwar <deepthi@linux.vnet.ibm.com>
Subject: Re: [Xen-devel] Re: [PATCH 1/3] cpuidle: If disable_cpuidle() is
	called, set pm_idle to default_idle.
Message-ID: <20111115144004.GE22675@phenom.dumpdata.com>
References: <1320786914-10541-1-git-send-email-konrad.wilk@oracle.com>
	<1320786914-10541-2-git-send-email-konrad.wilk@oracle.com>
	<4EBA53C5.9040603@linux.vnet.ibm.com>
	<20111109144440.GB8410@phenom.dumpdata.com>
	<4EBD09FF.4030002@linux.vnet.ibm.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EBD09FF.4030002@linux.vnet.ibm.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090205.4EC279D4.00F3,ss=1,re=0.000,fgs=0
Cc: len.brown@intel.com, jeremy@goop.org, xen-devel@lists.xensource.com,
	x86@kernel.org, linux-kernel@vger.kernel.org, trenn@suse.de,
	mingo@redhat.com, bp@alien8.de, hpa@zytor.com, tj@kernel.org,
	tglx@linutronix.de, stable@kernel.org
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> Well I was with a view that if cpuidle is disabled, mwait and arm_e400
> would take precedence over default_idle. But if is ok to have default_idle instead,
> then go ahead. 
> 
> > Perhaps there is another way do this is:
> > 
> > diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
> > index becd6d9..04b10a4 100644
> > --- a/drivers/cpuidle/cpuidle.c
> > +++ b/drivers/cpuidle/cpuidle.c
> > @@ -38,6 +38,7 @@ int cpuidle_disabled(void)
> >  void disable_cpuidle(void)
> >  {
> >  	off = 1;
> > +	pm_idle = default_idle;
> >  }
> > 
> Brining pm_idle pointer back to cpuidle code is going a step back coz
> we wanted to complete remove using pm_idle going forward. As having 
> a pointer exported into various files is not a good thing. That's the 
> reason we started the clean up in the first place :) 

Perhaps then something along these lines, where we still set default_idle
but don't fiddle with the pm_idle (and can still rip out the
EXPORT_SYMBOL_GPL(default_idle) in 2012):

(Hadn't tested this yet).

diff --git a/arch/x86/include/asm/system.h b/arch/x86/include/asm/system.h
index c2ff2a1..2d2f01c 100644
--- a/arch/x86/include/asm/system.h
+++ b/arch/x86/include/asm/system.h
@@ -401,6 +401,7 @@ extern unsigned long arch_align_stack(unsigned long sp);
 extern void free_init_pages(char *what, unsigned long begin, unsigned long end);
 
 void default_idle(void);
+bool set_pm_idle_to_default(void);
 
 void stop_this_cpu(void *dummy);
 
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index e7e3b01..bfb113f 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -403,6 +403,14 @@ void default_idle(void)
 EXPORT_SYMBOL(default_idle);
 #endif
 
+bool set_pm_idle_to_default()
+{
+	if (!pm_idle) {
+		pm_idle = default_idle;
+		return true;
+	}
+	return false;
+}
 void stop_this_cpu(void *dummy)
 {
 	local_irq_disable();
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c
index 46d6d21..7506181 100644
--- a/arch/x86/xen/setup.c
+++ b/arch/x86/xen/setup.c
@@ -448,6 +448,6 @@ void __init xen_arch_setup(void)
 #endif
 	disable_cpuidle();
 	boot_option_idle_override = IDLE_HALT;
-
+	WARN_ON(!set_pm_idle_to_default());
 	fiddle_vdso();
 }

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 06:49:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 06:49:02 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQKJp-0008JA-T4; Tue, 15 Nov 2011 06:49:01 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQKI5-0007kV-3M
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 06:47:14 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1321368392!63281839!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20337 invoked from network); 15 Nov 2011 14:46:32 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 14:46:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,515,1315180800"; 
   d="scan'208";a="8943455"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 14:47:10 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 15 Nov 2011 14:47:09 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RQKI1-00070C-Lu; Tue, 15 Nov 2011 14:47:09 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RQKI1-0002Hu-II;
	Tue, 15 Nov 2011 14:47:09 +0000
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Message-ID: <20162.31597.556145.478476@mariner.uk.xensource.com>
Date: Tue, 15 Nov 2011 14:47:09 +0000
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] [PATCH 2/4] docs/html/hcall: Annotations for two
	hypercalls
In-Reply-To: <20111114184057.GB15284@phenom.dumpdata.com>
References: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
	<1321212066-10648-3-git-send-email-ian.jackson@eu.citrix.com>
	<20111114184057.GB15284@phenom.dumpdata.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Konrad Rzeszutek Wilk writes ("Re: [Xen-devel] [PATCH 2/4] docs/html/hcall: Annotations for two hypercalls"):
> On Sun, Nov 13, 2011 at 07:21:04PM +0000, Ian Jackson wrote:
> > Add annotations for a couple of the hypercalls:
> >  HYPERVISOR_set_trap_table
> >  HYPERVISOR_mmu_update
> 
> So I've some comments on the affects of what this hypercall expects
> in some details. Where would I put those? In the header file or should
> I do it somewhere else?

In the header file.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 06:50:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 06:50:03 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQKKp-0000Fn-FY; Tue, 15 Nov 2011 06:50:03 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQKIX-0007uN-V4
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 06:47:42 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1321368458!1658935!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2547 invoked from network); 15 Nov 2011 14:47:38 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 14:47:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,515,1315180800"; 
   d="scan'208";a="8943463"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 14:47:38 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 15 Nov 2011 14:47:37 +0000
Date: Tue, 15 Nov 2011 14:48:17 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: <qemu-devel@nongnu.org>
Message-ID: <alpine.DEB.2.00.1111151354000.3519@kaball-desktop>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: xen-devel@lists.xensource.com, Alexander Graf <agraf@suse.de>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH 0/4] prevent Qemu from waking up needlessly
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi all,
this small patch series prevents Qemu from waking up needlessly on Xen
several times a second in order to check some timers.

The first two patches stop Qemu from emulating the RTC and the PIT on
Xen, that are both already emulated in the hypervisor and consume
precious cpu cycles because they need qemu-timers to work.

The third patch makes use of a new mechanism to receive buffered io
event notifications from Xen, so that Qemu doesn't need to check the
buffered io page for data 10 times a sec for the entire life of the VM.

Finally the last patch increases the default select timeout to 1h:
nothing should rely on the select timeout to be 1sec, so we might as
well increase it to 1h.


Stefano Stabellini (4):
      xen: introduce mc146818rtcxen
      xen: do not initialize the interval timer emulator
      xen: introduce an event channel for buffered io event notifications
      qemu_calculate_timeout: increase minimum timeout to 1h

 hw/mc146818rtc.c |   36 +++++++++++++++++++++++++++++++++++-
 hw/pc.c          |    7 +++++--
 qemu-timer.c     |    2 +-
 xen-all.c        |   38 ++++++++++++++++++++++++++++++++------
 4 files changed, 73 insertions(+), 10 deletions(-)


A git tree based on v1.0-rc2 is available here:

git://xenbits.xen.org/people/sstabellini/qemu-dm.git timers-1.0-rc2

Cheers,

Stefano

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 06:53:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 06:53:00 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQKNg-0001L6-8X; Tue, 15 Nov 2011 06:53:00 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQKLH-0000Q6-4w
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 06:50:31 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1321368626!4272900!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26522 invoked from network); 15 Nov 2011 14:50:27 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 14:50:27 -0000
X-IronPort-AV: E=Sophos;i="4.69,515,1315195200"; d="scan'208";a="19111201"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 09:50:26 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.65) with Microsoft SMTP Server id
	8.3.137.0; Tue, 15 Nov 2011 09:50:26 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pAFEoIWY019245;
	Tue, 15 Nov 2011 06:50:19 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Tue, 15 Nov 2011 14:51:08 +0000
Message-ID: <1321368671-1134-1-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <alpine.DEB.2.00.1111151354000.3519@kaball-desktop>
References: <alpine.DEB.2.00.1111151354000.3519@kaball-desktop>
MIME-Version: 1.0
Content-Type: text/plain
Cc: qemu-devel@nongnu.org,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	agraf@suse.de, Stefano.Stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 1/4] xen: introduce mc146818rtcxen
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Xen doesn't need full RTC emulation in Qemu because the RTC is already
emulated by the hypervisor. In particular we want to avoid the timers
initialization so that Qemu doesn't need to wake up needlessly.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 hw/mc146818rtc.c |   36 +++++++++++++++++++++++++++++++++++-
 1 files changed, 35 insertions(+), 1 deletions(-)

diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
index 2aaca2f..91242d0 100644
--- a/hw/mc146818rtc.c
+++ b/hw/mc146818rtc.c
@@ -28,6 +28,7 @@
 #include "apic.h"
 #include "isa.h"
 #include "mc146818rtc.h"
+#include "arch_init.h"
 
 //#define DEBUG_CMOS
 //#define DEBUG_COALESCED
@@ -614,6 +615,17 @@ static const MemoryRegionOps cmos_ops = {
     .old_portio = cmos_portio
 };
 
+static int rtcxen_initfn(ISADevice *dev)
+{
+    int base = 0x70;
+    RTCState *s = DO_UPCAST(RTCState, dev, dev);
+
+    memory_region_init_io(&s->io, &cmos_ops, s, "rtc", 2);
+    isa_register_ioport(dev, &s->io, base);
+
+    return 0;
+}
+
 static int rtc_initfn(ISADevice *dev)
 {
     RTCState *s = DO_UPCAST(RTCState, dev, dev);
@@ -655,7 +667,11 @@ ISADevice *rtc_init(int base_year, qemu_irq intercept_irq)
     ISADevice *dev;
     RTCState *s;
 
-    dev = isa_create("mc146818rtc");
+    if (xen_available()) {
+        dev = isa_create("mc146818rtcxen");
+    } else {
+        dev = isa_create("mc146818rtc");
+    }
     s = DO_UPCAST(RTCState, dev, dev);
     qdev_prop_set_int32(&dev->qdev, "base_year", base_year);
     qdev_init_nofail(&dev->qdev);
@@ -684,3 +700,21 @@ static void mc146818rtc_register(void)
     isa_qdev_register(&mc146818rtc_info);
 }
 device_init(mc146818rtc_register)
+
+static ISADeviceInfo mc146818rtcxen_info = {
+    .qdev.name     = "mc146818rtcxen",
+    .qdev.size     = sizeof(RTCState),
+    .qdev.no_user  = 1,
+    .qdev.vmsd     = &vmstate_rtc,
+    .init          = rtcxen_initfn,
+    .qdev.props    = (Property[]) {
+        DEFINE_PROP_INT32("base_year", RTCState, base_year, 1980),
+        DEFINE_PROP_END_OF_LIST(),
+    }
+};
+
+static void mc146818rtcxen_register(void)
+{
+    isa_qdev_register(&mc146818rtcxen_info);
+}
+device_init(mc146818rtcxen_register)
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 06:54:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 06:54:08 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQKOm-0001pj-1t; Tue, 15 Nov 2011 06:54:08 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQKLM-0000Rw-4L
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 06:50:36 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1321368626!4272900!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27048 invoked from network); 15 Nov 2011 14:50:33 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 14:50:33 -0000
X-IronPort-AV: E=Sophos;i="4.69,515,1315195200"; d="scan'208";a="19111203"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 09:50:32 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.65) with Microsoft SMTP Server id
	8.3.137.0; Tue, 15 Nov 2011 09:50:32 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pAFEoIWZ019245;
	Tue, 15 Nov 2011 06:50:21 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Tue, 15 Nov 2011 14:51:09 +0000
Message-ID: <1321368671-1134-2-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <alpine.DEB.2.00.1111151354000.3519@kaball-desktop>
References: <alpine.DEB.2.00.1111151354000.3519@kaball-desktop>
MIME-Version: 1.0
Content-Type: text/plain
Cc: qemu-devel@nongnu.org,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	agraf@suse.de, Stefano.Stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 2/4] xen: do not initialize the interval timer
	emulator
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

PIT is emulated by the hypervisor so we don't need to emulate it in Qemu:
this patch prevents Qemu from waking up needlessly at PIT_FREQ on Xen.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 hw/pc.c |    7 +++++--
 1 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/hw/pc.c b/hw/pc.c
index 33778fe..a0ae981 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -43,6 +43,7 @@
 #include "ui/qemu-spice.h"
 #include "memory.h"
 #include "exec-memory.h"
+#include "arch_init.h"
 
 /* output Bochs bios info messages */
 //#define DEBUG_BIOS
@@ -1121,7 +1122,7 @@ void pc_basic_device_init(qemu_irq *gsi,
     DriveInfo *fd[MAX_FD];
     qemu_irq rtc_irq = NULL;
     qemu_irq *a20_line;
-    ISADevice *i8042, *port92, *vmmouse, *pit;
+    ISADevice *i8042, *port92, *vmmouse, *pit = NULL;
     qemu_irq *cpu_exit_irq;
 
     register_ioport_write(0x80, 1, 1, ioport80_write, NULL);
@@ -1142,7 +1143,9 @@ void pc_basic_device_init(qemu_irq *gsi,
 
     qemu_register_boot_set(pc_boot_set, *rtc_state);
 
-    pit = pit_init(0x40, 0);
+    if (!xen_available()) {
+        pit = pit_init(0x40, 0);
+    }
     pcspk_init(pit);
 
     for(i = 0; i < MAX_SERIAL_PORTS; i++) {
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 06:55:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 06:55:04 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQKPg-0002DX-Bh; Tue, 15 Nov 2011 06:55:04 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQKLO-0000St-Ty
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 06:50:39 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1321368626!4272900!3
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27276 invoked from network); 15 Nov 2011 14:50:35 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 14:50:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,515,1315195200"; d="scan'208";a="19111204"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 09:50:35 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.65) with Microsoft SMTP Server id
	8.3.137.0; Tue, 15 Nov 2011 09:50:35 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pAFEoIWb019245;
	Tue, 15 Nov 2011 06:50:23 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Tue, 15 Nov 2011 14:51:11 +0000
Message-ID: <1321368671-1134-4-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <alpine.DEB.2.00.1111151354000.3519@kaball-desktop>
References: <alpine.DEB.2.00.1111151354000.3519@kaball-desktop>
MIME-Version: 1.0
Content-Type: text/plain
Cc: qemu-devel@nongnu.org,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	agraf@suse.de, Stefano.Stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 4/4] qemu_calculate_timeout: increase minimum
	timeout to 1h
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

There is no reason why the minimum timeout should be 1sec, it could
easily be 1h and we would safe lots of cpu cycles.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 qemu-timer.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/qemu-timer.c b/qemu-timer.c
index cd026c6..3a9987e 100644
--- a/qemu-timer.c
+++ b/qemu-timer.c
@@ -846,6 +846,6 @@ fail:
 
 int qemu_calculate_timeout(void)
 {
-    return 1000;
+    return 1000*60*60;
 }
 
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 06:55:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 06:55:59 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQKQZ-0002ab-JF; Tue, 15 Nov 2011 06:55:59 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQKLl-0000aV-0a
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 06:51:01 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1321368655!1661270!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12580 invoked from network); 15 Nov 2011 14:50:57 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-11.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 14:50:57 -0000
X-IronPort-AV: E=Sophos;i="4.69,515,1315195200"; d="scan'208";a="170650310"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 09:50:34 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.65) with Microsoft SMTP Server id
	8.3.137.0; Tue, 15 Nov 2011 09:50:33 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pAFEoIWa019245;
	Tue, 15 Nov 2011 06:50:22 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Tue, 15 Nov 2011 14:51:10 +0000
Message-ID: <1321368671-1134-3-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <alpine.DEB.2.00.1111151354000.3519@kaball-desktop>
References: <alpine.DEB.2.00.1111151354000.3519@kaball-desktop>
MIME-Version: 1.0
Content-Type: text/plain
Cc: qemu-devel@nongnu.org,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	agraf@suse.de, Stefano.Stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH 3/4] xen: introduce an event channel for
	buffered io event notifications
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Use the newly introduced HVM_PARAM_BUFIOREQ_EVTCHN to receive
notifications for buffered io events.
After the first notification is received leave the event channel masked
and setup a timer to process the rest of the batch.
Once we have completed processing the batch, unmask the event channel
and delete the timer.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 xen-all.c |   38 ++++++++++++++++++++++++++++++++------
 1 files changed, 32 insertions(+), 6 deletions(-)

diff --git a/xen-all.c b/xen-all.c
index b5e28ab..b28d7e7 100644
--- a/xen-all.c
+++ b/xen-all.c
@@ -70,6 +70,8 @@ typedef struct XenIOState {
     QEMUTimer *buffered_io_timer;
     /* the evtchn port for polling the notification, */
     evtchn_port_t *ioreq_local_port;
+    /* evtchn local port for buffered io */
+    evtchn_port_t bufioreq_local_port;
     /* the evtchn fd for polling */
     XenEvtchn xce_handle;
     /* which vcpu we are serving */
@@ -516,6 +518,12 @@ static ioreq_t *cpu_get_ioreq(XenIOState *state)
     evtchn_port_t port;
 
     port = xc_evtchn_pending(state->xce_handle);
+    if (port == state->bufioreq_local_port) {
+        qemu_mod_timer(state->buffered_io_timer,
+                BUFFER_IO_MAX_DELAY + qemu_get_clock_ms(rt_clock));
+        return NULL;
+    }
+
     if (port != -1) {
         for (i = 0; i < smp_cpus; i++) {
             if (state->ioreq_local_port[i] == port) {
@@ -664,16 +672,18 @@ static void handle_ioreq(ioreq_t *req)
     }
 }
 
-static void handle_buffered_iopage(XenIOState *state)
+static int handle_buffered_iopage(XenIOState *state)
 {
     buf_ioreq_t *buf_req = NULL;
     ioreq_t req;
     int qw;
 
     if (!state->buffered_io_page) {
-        return;
+        return 0;
     }
 
+    memset(&req, 0x00, sizeof(req));
+
     while (state->buffered_io_page->read_pointer != state->buffered_io_page->write_pointer) {
         buf_req = &state->buffered_io_page->buf_ioreq[
             state->buffered_io_page->read_pointer % IOREQ_BUFFER_SLOT_NUM];
@@ -698,15 +708,21 @@ static void handle_buffered_iopage(XenIOState *state)
         xen_mb();
         state->buffered_io_page->read_pointer += qw ? 2 : 1;
     }
+
+    return req.count;
 }
 
 static void handle_buffered_io(void *opaque)
 {
     XenIOState *state = opaque;
 
-    handle_buffered_iopage(state);
-    qemu_mod_timer(state->buffered_io_timer,
-                   BUFFER_IO_MAX_DELAY + qemu_get_clock_ms(rt_clock));
+    if (handle_buffered_iopage(state)) {
+        qemu_mod_timer(state->buffered_io_timer,
+                BUFFER_IO_MAX_DELAY + qemu_get_clock_ms(rt_clock));
+    } else {
+        qemu_del_timer(state->buffered_io_timer);
+        xc_evtchn_unmask(state->xce_handle, state->bufioreq_local_port);
+    }
 }
 
 static void cpu_handle_ioreq(void *opaque)
@@ -836,7 +852,6 @@ static void xen_main_loop_prepare(XenIOState *state)
 
     state->buffered_io_timer = qemu_new_timer_ms(rt_clock, handle_buffered_io,
                                                  state);
-    qemu_mod_timer(state->buffered_io_timer, qemu_get_clock_ms(rt_clock));
 
     if (evtchn_fd != -1) {
         qemu_set_fd_handler(evtchn_fd, cpu_handle_ioreq, NULL, state);
@@ -888,6 +903,7 @@ int xen_hvm_init(void)
 {
     int i, rc;
     unsigned long ioreq_pfn;
+    unsigned long bufioreq_evtchn;
     XenIOState *state;
 
     state = g_malloc0(sizeof (XenIOState));
@@ -937,6 +953,16 @@ int xen_hvm_init(void)
         state->ioreq_local_port[i] = rc;
     }
 
+    xc_get_hvm_param(xen_xc, xen_domid, HVM_PARAM_BUFIOREQ_EVTCHN,
+            &bufioreq_evtchn);
+    rc = xc_evtchn_bind_interdomain(state->xce_handle, xen_domid,
+            (uint32_t)bufioreq_evtchn);
+    if (rc == -1) {
+        fprintf(stderr, "bind interdomain ioctl error %d\n", errno);
+        return -1;
+    }
+    state->bufioreq_local_port = rc;
+
     /* Init RAM management */
     xen_map_cache_init();
     xen_ram_init(ram_size);
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 06:56:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 06:56:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQKRV-0002yR-2z; Tue, 15 Nov 2011 06:56:57 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQKOq-0001r3-Lt
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 06:54:13 -0800
X-Env-Sender: anthony@codemonkey.ws
X-Msg-Ref: server-3.tower-21.messagelabs.com!1321368848!4344731!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4828 invoked from network); 15 Nov 2011 14:54:09 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-3.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 14:54:09 -0000
Received: by vcbfl13 with SMTP id fl13so460712vcb.30
	for <xen-devel@lists.xensource.com>;
	Tue, 15 Nov 2011 06:54:08 -0800 (PST)
Received: by 10.220.148.211 with SMTP id q19mr2942909vcv.93.1321368848167;
	Tue, 15 Nov 2011 06:54:08 -0800 (PST)
Received: from [192.168.0.103] (cpe-70-123-132-139.austin.res.rr.com.
	[70.123.132.139])
	by mx.google.com with ESMTPS id t20sm37169223vdi.10.2011.11.15.06.54.06
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 15 Nov 2011 06:54:07 -0800 (PST)
Message-ID: <4EC27D0D.3040204@codemonkey.ws>
Date: Tue, 15 Nov 2011 08:54:05 -0600
From: Anthony Liguori <anthony@codemonkey.ws>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.21) Gecko/20110831 Lightning/1.0b2 Thunderbird/3.1.13
MIME-Version: 1.0
To: stefano.stabellini@eu.citrix.com
References: <alpine.DEB.2.00.1111151354000.3519@kaball-desktop>
	<1321368671-1134-1-git-send-email-stefano.stabellini@eu.citrix.com>
In-Reply-To: <1321368671-1134-1-git-send-email-stefano.stabellini@eu.citrix.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: xen-devel@lists.xensource.com, qemu-devel@nongnu.org, agraf@suse.de
Subject: [Xen-devel] Re: [Qemu-devel] [PATCH 1/4] xen: introduce
	mc146818rtcxen
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/15/2011 08:51 AM, stefano.stabellini@eu.citrix.com wrote:
> From: Stefano Stabellini<stefano.stabellini@eu.citrix.com>
>
> Xen doesn't need full RTC emulation in Qemu because the RTC is already
> emulated by the hypervisor. In particular we want to avoid the timers
> initialization so that Qemu doesn't need to wake up needlessly.
>
> Signed-off-by: Stefano Stabellini<stefano.stabellini@eu.citrix.com>

Yuck.  There's got to be a better way to do this.

I think it would be better to name timers and then in Xen specific machine code, 
disable the RTC timers.

Regards,

Anthony Liguori

> ---
>   hw/mc146818rtc.c |   36 +++++++++++++++++++++++++++++++++++-
>   1 files changed, 35 insertions(+), 1 deletions(-)
>
> diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
> index 2aaca2f..91242d0 100644
> --- a/hw/mc146818rtc.c
> +++ b/hw/mc146818rtc.c
> @@ -28,6 +28,7 @@
>   #include "apic.h"
>   #include "isa.h"
>   #include "mc146818rtc.h"
> +#include "arch_init.h"
>
>   //#define DEBUG_CMOS
>   //#define DEBUG_COALESCED
> @@ -614,6 +615,17 @@ static const MemoryRegionOps cmos_ops = {
>       .old_portio = cmos_portio
>   };
>
> +static int rtcxen_initfn(ISADevice *dev)
> +{
> +    int base = 0x70;
> +    RTCState *s = DO_UPCAST(RTCState, dev, dev);
> +
> +    memory_region_init_io(&s->io,&cmos_ops, s, "rtc", 2);
> +    isa_register_ioport(dev,&s->io, base);
> +
> +    return 0;
> +}
> +
>   static int rtc_initfn(ISADevice *dev)
>   {
>       RTCState *s = DO_UPCAST(RTCState, dev, dev);
> @@ -655,7 +667,11 @@ ISADevice *rtc_init(int base_year, qemu_irq intercept_irq)
>       ISADevice *dev;
>       RTCState *s;
>
> -    dev = isa_create("mc146818rtc");
> +    if (xen_available()) {
> +        dev = isa_create("mc146818rtcxen");
> +    } else {
> +        dev = isa_create("mc146818rtc");
> +    }
>       s = DO_UPCAST(RTCState, dev, dev);
>       qdev_prop_set_int32(&dev->qdev, "base_year", base_year);
>       qdev_init_nofail(&dev->qdev);
> @@ -684,3 +700,21 @@ static void mc146818rtc_register(void)
>       isa_qdev_register(&mc146818rtc_info);
>   }
>   device_init(mc146818rtc_register)
> +
> +static ISADeviceInfo mc146818rtcxen_info = {
> +    .qdev.name     = "mc146818rtcxen",
> +    .qdev.size     = sizeof(RTCState),
> +    .qdev.no_user  = 1,
> +    .qdev.vmsd     =&vmstate_rtc,
> +    .init          = rtcxen_initfn,
> +    .qdev.props    = (Property[]) {
> +        DEFINE_PROP_INT32("base_year", RTCState, base_year, 1980),
> +        DEFINE_PROP_END_OF_LIST(),
> +    }
> +};
> +
> +static void mc146818rtcxen_register(void)
> +{
> +    isa_qdev_register(&mc146818rtcxen_info);
> +}
> +device_init(mc146818rtcxen_register)


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 07:04:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 07:04:00 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQKYJ-0003UW-V8; Tue, 15 Nov 2011 07:03:59 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQKV8-0003FN-S3
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 07:01:12 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1321369236!3578451!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2921 invoked from network); 15 Nov 2011 15:00:37 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-11.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 15 Nov 2011 15:00:37 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAFF0WU0027144
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 15 Nov 2011 15:00:33 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAFF0V5d008479
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 15 Nov 2011 15:00:32 GMT
Received: from abhmt107.oracle.com (abhmt107.oracle.com [141.146.116.59])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAFF0Pq3020733; Tue, 15 Nov 2011 09:00:26 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 15 Nov 2011 07:00:25 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id E87A68283A; Tue, 15 Nov 2011 10:00:24 -0500 (EST)
Date: Tue, 15 Nov 2011 10:00:24 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 2/4] docs/html/hcall: Annotations for two
	hypercalls
Message-ID: <20111115150024.GA21174@phenom.dumpdata.com>
References: <1321212066-10648-1-git-send-email-ian.jackson@eu.citrix.com>
	<1321212066-10648-3-git-send-email-ian.jackson@eu.citrix.com>
	<20111114184057.GB15284@phenom.dumpdata.com>
	<20162.31597.556145.478476@mariner.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20162.31597.556145.478476@mariner.uk.xensource.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090204.4EC27E91.0186,ss=1,re=0.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 15, 2011 at 02:47:09PM +0000, Ian Jackson wrote:
> Konrad Rzeszutek Wilk writes ("Re: [Xen-devel] [PATCH 2/4] docs/html/hcall: Annotations for two hypercalls"):
> > On Sun, Nov 13, 2011 at 07:21:04PM +0000, Ian Jackson wrote:
> > > Add annotations for a couple of the hypercalls:
> > >  HYPERVISOR_set_trap_table
> > >  HYPERVISOR_mmu_update
> > 
> > So I've some comments on the affects of what this hypercall expects
> > in some details. Where would I put those? In the header file or should
> > I do it somewhere else?
> 
> In the header file.

Is it OK if it runs on for pages?

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 07:06:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 07:06:17 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQKaX-0003tJ-Bo; Tue, 15 Nov 2011 07:06:17 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQKYY-0003X8-HJ
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 07:04:15 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1321369447!4225614!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27361 invoked from network); 15 Nov 2011 15:04:07 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 15:04:07 -0000
X-IronPort-AV: E=Sophos;i="4.69,515,1315180800"; 
   d="scan'208";a="8944091"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 15:04:06 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 15 Nov 2011 15:04:06 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RQKYQ-00075k-9g;
	Tue, 15 Nov 2011 15:04:06 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RQKYQ-0003Db-94;
	Tue, 15 Nov 2011 15:04:06 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9789-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 15 Nov 2011 15:04:06 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9789: tolerable FAIL - PUSHED
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9789 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9789/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  848049b14ec7
baseline version:
 xen                  ca618f5deec2

------------------------------------------------------------
People who touched revisions under test:
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Keir Fraser <keir@xen.org>
  Roger Pau Monne <roger.pau@entel.upc.edu>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     pass    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Pushing revision :

+ branch=xen-unstable
+ revision=848049b14ec7
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x '!=' x/export/home/osstest/repos/lock ']'
++ OSSTEST_REPOS_LOCK_LOCKED=/export/home/osstest/repos/lock
++ exec with-lock-ex -w /export/home/osstest/repos/lock ./ap-push xen-unstable 848049b14ec7
+ branch=xen-unstable
+ revision=848049b14ec7
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x/export/home/osstest/repos/lock '!=' x/export/home/osstest/repos/lock ']'
+ : xen@xenbits.xensource.com
+ : xen@xenbits.xensource.com:git/linux-pvops
+ : master
+ : tested/2.6.39.x
+ case "$branch" in
+ cd /export/home/osstest/repos/xen-unstable.hg
+ hg push -r 848049b14ec7 ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
pushing to ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 6 changes to 6 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 07:39:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 07:39:50 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQL6z-0004or-G3; Tue, 15 Nov 2011 07:39:49 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQL6A-0004cF-Dl
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 07:38:59 -0800
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-13.tower-21.messagelabs.com!1321371534!2322407!1
X-Originating-IP: [208.97.132.74]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19058 invoked from network); 15 Nov 2011 15:38:54 -0000
Received: from caiajhbdcahe.dreamhost.com (HELO homiemail-a75.g.dreamhost.com)
	(208.97.132.74) by server-13.tower-21.messagelabs.com with SMTP;
	15 Nov 2011 15:38:54 -0000
Received: from homiemail-a75.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a75.g.dreamhost.com (Postfix) with ESMTP id B71945EC088;
	Tue, 15 Nov 2011 07:38:53 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=message-id
	:in-reply-to:references:date:subject:from:to:cc:reply-to
	:mime-version:content-type:content-transfer-encoding; q=dns; s=
	lagarcavilla.org; b=oquLydWP5UhWlgDCgDAcFh2Ex6WUKOhdiubz/vEL+z0i
	ZCyjo+OARBQ1y3nVW/y7pnIB3gy2+1dJ+swEQTxNxy5CaP1NHUvUwgfQoTw/MPwt
	rBphTQjfzi9dH6Fqb7UYjG1oFjHj3avER/uN+rIBPOliuhToqDuTFClgrdMDG5E=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=lagarcavilla.org; h=
	message-id:in-reply-to:references:date:subject:from:to:cc
	:reply-to:mime-version:content-type:content-transfer-encoding;
	s=lagarcavilla.org; bh=7gDVYlD4beNERiPa0+zacsGz4XY=; b=T8pXZQAu
	6yk8d0TP9Zn3FxFcBTseEKgK7AP704JBaRfAQQxHRRI5pcgBgh4gQbH4z1mHwpjM
	toUPziv5+jwVWfEcEe4BtJtik4Ihwy2KLI5Niy4jaQKQYaVc/EheCFNJu3tht1Rq
	dKGBCqKUn7KlUZTjmflnBYnxWlRighl2ADg=
Received: from webmail.lagarcavilla.org (ahfbbjcaiaae.dreamhost.com
	[75.119.208.4]) (Authenticated sender: andres@lagarcavilla.com)
	by homiemail-a75.g.dreamhost.com (Postfix) with ESMTPA id 52BDD5EC07C; 
	Tue, 15 Nov 2011 07:38:53 -0800 (PST)
Received: from 206.223.182.18 (proxying for 206.223.182.18)
	(SquirrelMail authenticated user andres@lagarcavilla.com)
	by webmail.lagarcavilla.org with HTTP;
	Tue, 15 Nov 2011 07:38:53 -0800
Message-ID: <f82fa54d47272f2857cb854ef9f6797a.squirrel@webmail.lagarcavilla.org>
In-Reply-To: <CAFLBxZY4omZnfOUAV5OtOmANWdy+WqbefngHStA8QnGYm573nw@mail.gmail.com>
References: <patchbomb.1321307321@xdev.gridcentric.ca>
	<764e0872dd4f50c70fbc.1321307326@xdev.gridcentric.ca>
	<CAFLBxZY4omZnfOUAV5OtOmANWdy+WqbefngHStA8QnGYm573nw@mail.gmail.com>
Date: Tue, 15 Nov 2011 07:38:53 -0800
Subject: Re: [Xen-devel] [PATCH 5 of 6] Rework stale p2m auditing
From: "Andres Lagar-Cavilla" <andres@lagarcavilla.org>
To: "George Dunlap" <George.Dunlap@eu.citrix.com>
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com,
	Andres Lagar-Cavilla <andres@lagarcavilla.org>, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: andres@lagarcavilla.org
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Well, clearly that code has bit-rotted considerably and long ago. So
whatever purpose it served, no one is in need of it presently.

My intention is to call the p2m audit domctl during runtime. You could
turn on sharing, do some sharing operations, and then audit the p2m. The
pager could periodically audit via a domctl for debugging purposes. libxl
debug builds could audit the p2m before or after xl mem-set. Etc...

More subtly, if we transition to fine-grained p2m locks, auditing the p2m
will negate most benefits, and introduce the non-trivial complexity of
promoting fine-grained locks.

Andres

> On Mon, Nov 14, 2011 at 9:48 PM, Andres Lagar-Cavilla
> <andres@lagarcavilla.org> wrote:
>> =A0xen/arch/x86/domctl.c =A0 =A0 =A0 | =A0 24 +++++++
>> =A0xen/arch/x86/mm/p2m-ept.c =A0 | =A0 =A01 +
>> =A0xen/arch/x86/mm/p2m-pod.c =A0 | =A0 =A05 -
>> =A0xen/arch/x86/mm/p2m-pt.c =A0 =A0| =A0137
>> +++++++------------------------------------
>> =A0xen/arch/x86/mm/p2m.c =A0 =A0 =A0 | =A0124
>> ++++++++++++++++++++++++++++++++++++---
>> =A0xen/include/asm-x86/p2m.h =A0 | =A0 11 ++-
>> =A0xen/include/public/domctl.h | =A0 12 +++
>> =A07 files changed, 180 insertions(+), 134 deletions(-)
>>
>>
>> The p2m audit code doesn't even compile, let alone work. It also
>> partially supports ept. Make it:
>>
>> - compile
>> - lay groundwork for eventual ept support
>
> This stuff looks good (haven't reviewed it in detail), but...
>
>> - move out of the way of all calls and turn it into a domctl. It's
>> =A0obviously not being used by anybody presently.
>> - enable it via said domctl
>
> ..the idea with having audit_p2m() sprinkled around the code was to
> help narrow down what bit of code was screwing up the p2m table.  I'm
> not sure switching it to a domctl will really help debugging in the
> future.  How were you envisioning this would be used?
>
>>
>> Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
>>
>> diff -r f11528df1df3 -r 764e0872dd4f xen/arch/x86/domctl.c
>> --- a/xen/arch/x86/domctl.c
>> +++ b/xen/arch/x86/domctl.c
>> @@ -1449,6 +1449,30 @@ long arch_do_domctl(
>> =A0 =A0 break;
>> =A0#endif /* __x86_64__ */
>>
>> + =A0 =A0case XEN_DOMCTL_audit_p2m:
>> + =A0 =A0{
>> + =A0 =A0 =A0 =A0struct domain *d;
>> +
>> + =A0 =A0 =A0 =A0ret =3D -ESRCH;
>> + =A0 =A0 =A0 =A0d =3D rcu_lock_domain_by_id(domctl->domain);
>> + =A0 =A0 =A0 =A0if ( d !=3D NULL )
>> + =A0 =A0 =A0 =A0{
>> +#if P2M_AUDIT
>> + =A0 =A0 =A0 =A0 =A0 =A0audit_p2m(d,
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&domctl->u.audit_p2m.orph=
ans_debug,
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&domctl->u.audit_p2m.orph=
ans_invalid,
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&domctl->u.audit_p2m.m2p_=
bad,
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&domctl->u.audit_p2m.p2m_=
bad);
>> + =A0 =A0 =A0 =A0 =A0 =A0ret =3D (copy_to_guest(u_domctl, domctl, 1)) =
?
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0-EFAULT : 0;
>> +#else
>> + =A0 =A0 =A0 =A0 =A0 =A0ret =3D -ENOSYS;
>> +#endif /* P2M_AUDIT */
>> + =A0 =A0 =A0 =A0 =A0 =A0rcu_unlock_domain(d);
>> + =A0 =A0 =A0 =A0}
>> + =A0 =A0}
>> + =A0 =A0break;
>> +
>> =A0 =A0 case XEN_DOMCTL_set_access_required:
>> =A0 =A0 {
>> =A0 =A0 =A0 =A0 struct domain *d;
>> diff -r f11528df1df3 -r 764e0872dd4f xen/arch/x86/mm/p2m-ept.c
>> --- a/xen/arch/x86/mm/p2m-ept.c
>> +++ b/xen/arch/x86/mm/p2m-ept.c
>> @@ -817,6 +817,7 @@ void ept_p2m_init(struct p2m_domain *p2m
>> =A0 =A0 p2m->set_entry =3D ept_set_entry;
>> =A0 =A0 p2m->get_entry =3D ept_get_entry;
>> =A0 =A0 p2m->change_entry_type_global =3D ept_change_entry_type_global=
;
>> + =A0 =A0p2m->audit_p2m =3D NULL;
>> =A0}
>>
>> =A0static void ept_dump_p2m_table(unsigned char key)
>> diff -r f11528df1df3 -r 764e0872dd4f xen/arch/x86/mm/p2m-pod.c
>> --- a/xen/arch/x86/mm/p2m-pod.c
>> +++ b/xen/arch/x86/mm/p2m-pod.c
>> @@ -522,7 +522,6 @@ p2m_pod_decrease_reservation(struct doma
>> =A0 =A0 steal_for_cache =3D =A0( p2m->pod.entry_count > p2m->pod.count=
 );
>>
>> =A0 =A0 p2m_lock(p2m);
>> - =A0 =A0audit_p2m(p2m, 1);
>>
>> =A0 =A0 if ( unlikely(d->is_dying) )
>> =A0 =A0 =A0 =A0 goto out_unlock;
>> @@ -616,7 +615,6 @@ out_entry_check:
>> =A0 =A0 }
>>
>> =A0out_unlock:
>> - =A0 =A0audit_p2m(p2m, 1);
>> =A0 =A0 p2m_unlock(p2m);
>>
>> =A0out:
>> @@ -986,7 +984,6 @@ p2m_pod_demand_populate(struct p2m_domai
>> =A0 =A0 =A0 =A0 =A0*/
>> =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gfn_aligned, _mfn(0), PAGE_ORDER_2M=
,
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 p2m_populate_on_demand, p2=
m->default_access);
>> - =A0 =A0 =A0 =A0audit_p2m(p2m, 1);
>> =A0 =A0 =A0 =A0 return 0;
>> =A0 =A0 }
>>
>> @@ -1108,7 +1105,6 @@ guest_physmap_mark_populate_on_demand(st
>> =A0 =A0 =A0 =A0 return rc;
>>
>> =A0 =A0 p2m_lock(p2m);
>> - =A0 =A0audit_p2m(p2m, 1);
>>
>> =A0 =A0 P2M_DEBUG("mark pod gfn=3D%#lx\n", gfn);
>>
>> @@ -1142,7 +1138,6 @@ guest_physmap_mark_populate_on_demand(st
>> =A0 =A0 =A0 =A0 BUG_ON(p2m->pod.entry_count < 0);
>> =A0 =A0 }
>>
>> - =A0 =A0audit_p2m(p2m, 1);
>> =A0 =A0 p2m_unlock(p2m);
>>
>> =A0out:
>> diff -r f11528df1df3 -r 764e0872dd4f xen/arch/x86/mm/p2m-pt.c
>> --- a/xen/arch/x86/mm/p2m-pt.c
>> +++ b/xen/arch/x86/mm/p2m-pt.c
>> @@ -483,7 +483,6 @@ static int p2m_pod_check_and_populate(st
>> =A0 =A0 /* This is called from the p2m lookups, which can happen with =
or
>> =A0 =A0 =A0* without the lock hed. */
>> =A0 =A0 p2m_lock_recursive(p2m);
>> - =A0 =A0audit_p2m(p2m, 1);
>>
>> =A0 =A0 /* Check to make sure this is still PoD */
>> =A0 =A0 if ( p2m_flags_to_type(l1e_get_flags(*p2m_entry)) !=3D
>> p2m_populate_on_demand )
>> @@ -494,7 +493,6 @@ static int p2m_pod_check_and_populate(st
>>
>> =A0 =A0 r =3D p2m_pod_demand_populate(p2m, gfn, order, q);
>>
>> - =A0 =A0audit_p2m(p2m, 1);
>> =A0 =A0 p2m_unlock(p2m);
>>
>> =A0 =A0 return r;
>> @@ -975,118 +973,23 @@ static void p2m_change_type_global(struc
>>
>> =A0}
>>
>> -/* Set up the p2m function pointers for pagetable format */
>> -void p2m_pt_init(struct p2m_domain *p2m)
>> +#if P2M_AUDIT
>> +long p2m_pt_audit_p2m(struct p2m_domain *p2m)
>> =A0{
>> - =A0 =A0p2m->set_entry =3D p2m_set_entry;
>> - =A0 =A0p2m->get_entry =3D p2m_gfn_to_mfn;
>> - =A0 =A0p2m->change_entry_type_global =3D p2m_change_type_global;
>> - =A0 =A0p2m->write_p2m_entry =3D paging_write_p2m_entry;
>> -}
>> -
>> -
>> -#if P2M_AUDIT
>> -/* strict_m2p =3D=3D 0 allows m2p mappings that don'#t match the p2m.
>> - * It's intended for add_to_physmap, when the domain has just been
>> allocated
>> - * new mfns that might have stale m2p entries from previous owners */
>> -void audit_p2m(struct p2m_domain *p2m, int strict_m2p)
>> -{
>> - =A0 =A0struct page_info *page;
>> - =A0 =A0struct domain *od;
>> - =A0 =A0unsigned long mfn, gfn, m2pfn, lp2mfn =3D 0;
>> =A0 =A0 int entry_count =3D 0;
>> - =A0 =A0mfn_t p2mfn;
>> - =A0 =A0unsigned long orphans_d =3D 0, orphans_i =3D 0, mpbad =3D 0, =
pmbad =3D 0;
>> + =A0 =A0unsigned long pmbad =3D 0;
>> + =A0 =A0unsigned long mfn, gfn, m2pfn;
>> =A0 =A0 int test_linear;
>> - =A0 =A0p2m_type_t type;
>> =A0 =A0 struct domain *d =3D p2m->domain;
>>
>> - =A0 =A0if ( !paging_mode_translate(d) )
>> - =A0 =A0 =A0 =A0return;
>> -
>> - =A0 =A0//P2M_PRINTK("p2m audit starts\n");
>> + =A0 =A0ASSERT(p2m_locked_by_me(p2m));
>>
>> =A0 =A0 test_linear =3D ( (d =3D=3D current->domain)
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 && !pagetable_is_null(current-=
>arch.monitor_table)
>> );
>> =A0 =A0 if ( test_linear )
>> =A0 =A0 =A0 =A0 flush_tlb_local();
>>
>> - =A0 =A0spin_lock(&d->page_alloc_lock);
>> -
>> - =A0 =A0/* Audit part one: walk the domain's page allocation list, ch=
ecking
>> - =A0 =A0 * the m2p entries. */
>> - =A0 =A0page_list_for_each ( page, &d->page_list )
>> - =A0 =A0{
>> - =A0 =A0 =A0 =A0mfn =3D mfn_x(page_to_mfn(page));
>> -
>> - =A0 =A0 =A0 =A0// P2M_PRINTK("auditing guest page, mfn=3D%#lx\n", mf=
n);
>> -
>> - =A0 =A0 =A0 =A0od =3D page_get_owner(page);
>> -
>> - =A0 =A0 =A0 =A0if ( od !=3D d )
>> - =A0 =A0 =A0 =A0{
>> - =A0 =A0 =A0 =A0 =A0 =A0P2M_PRINTK("wrong owner %#lx -> %p(%u) !=3D %=
p(%u)\n",
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn, od, (od?od->domain_=
id:-1), d,
>> d->domain_id);
>> - =A0 =A0 =A0 =A0 =A0 =A0continue;
>> - =A0 =A0 =A0 =A0}
>> -
>> - =A0 =A0 =A0 =A0gfn =3D get_gpfn_from_mfn(mfn);
>> - =A0 =A0 =A0 =A0if ( gfn =3D=3D INVALID_M2P_ENTRY )
>> - =A0 =A0 =A0 =A0{
>> - =A0 =A0 =A0 =A0 =A0 =A0orphans_i++;
>> - =A0 =A0 =A0 =A0 =A0 =A0//P2M_PRINTK("orphaned guest page: mfn=3D%#lx=
 has invalid
>> gfn\n",
>> - =A0 =A0 =A0 =A0 =A0 =A0// =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn);
>> - =A0 =A0 =A0 =A0 =A0 =A0continue;
>> - =A0 =A0 =A0 =A0}
>> -
>> - =A0 =A0 =A0 =A0if ( gfn =3D=3D 0x55555555 || gfn =3D=3D 0x5555555555=
555555 )
>> - =A0 =A0 =A0 =A0{
>> - =A0 =A0 =A0 =A0 =A0 =A0orphans_d++;
>> - =A0 =A0 =A0 =A0 =A0 =A0//P2M_PRINTK("orphaned guest page: mfn=3D%#lx=
 has debug
>> gfn\n",
>> - =A0 =A0 =A0 =A0 =A0 =A0// =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn);
>> - =A0 =A0 =A0 =A0 =A0 =A0continue;
>> - =A0 =A0 =A0 =A0}
>> -
>> - =A0 =A0 =A0 =A0if ( gfn =3D=3D SHARED_M2P_ENTRY )
>> - =A0 =A0 =A0 =A0{
>> - =A0 =A0 =A0 =A0 =A0 =A0P2M_PRINTK("shared mfn (%lx) on domain page l=
ist!\n",
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0mfn);
>> - =A0 =A0 =A0 =A0 =A0 =A0continue;
>> - =A0 =A0 =A0 =A0}
>> -
>> - =A0 =A0 =A0 =A0p2mfn =3D gfn_to_mfn_type_p2m(p2m, gfn, &type, p2m_qu=
ery);
>> - =A0 =A0 =A0 =A0if ( strict_m2p && mfn_x(p2mfn) !=3D mfn )
>> - =A0 =A0 =A0 =A0{
>> - =A0 =A0 =A0 =A0 =A0 =A0mpbad++;
>> - =A0 =A0 =A0 =A0 =A0 =A0P2M_PRINTK("map mismatch mfn %#lx -> gfn %#lx=
 -> mfn %#lx"
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 " (-> gfn %#lx)\n",
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn, gfn, mfn_x(p2mfn),
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (mfn_valid(p2mfn)
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0? get_gpfn_from_mfn(m=
fn_x(p2mfn))
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0: -1u));
>> - =A0 =A0 =A0 =A0 =A0 =A0/* This m2p entry is stale: the domain has an=
other frame in
>> - =A0 =A0 =A0 =A0 =A0 =A0 * this physical slot. =A0No great disaster, =
but for
>> neatness,
>> - =A0 =A0 =A0 =A0 =A0 =A0 * blow away the m2p entry. */
>> - =A0 =A0 =A0 =A0 =A0 =A0set_gpfn_from_mfn(mfn, INVALID_M2P_ENTRY);
>> - =A0 =A0 =A0 =A0}
>> -
>> - =A0 =A0 =A0 =A0if ( test_linear && (gfn <=3D p2m->max_mapped_pfn) )
>> - =A0 =A0 =A0 =A0{
>> - =A0 =A0 =A0 =A0 =A0 =A0lp2mfn =3D mfn_x(gfn_to_mfn_type_p2m(p2m, gfn=
, &type,
>> p2m_query));
>> - =A0 =A0 =A0 =A0 =A0 =A0if ( lp2mfn !=3D mfn_x(p2mfn) )
>> - =A0 =A0 =A0 =A0 =A0 =A0{
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0P2M_PRINTK("linear mismatch gfn %#lx =
-> mfn %#lx "
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "(!=3D mfn %#lx)=
\n", gfn, lp2mfn,
>> mfn_x(p2mfn));
>> - =A0 =A0 =A0 =A0 =A0 =A0}
>> - =A0 =A0 =A0 =A0}
>> -
>> - =A0 =A0 =A0 =A0// P2M_PRINTK("OK: mfn=3D%#lx, gfn=3D%#lx, p2mfn=3D%#=
lx,
>> lp2mfn=3D%#lx\n",
>> - =A0 =A0 =A0 =A0// =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0mfn, gfn, mfn_x(p2m=
fn), lp2mfn);
>> - =A0 =A0}
>> -
>> - =A0 =A0spin_unlock(&d->page_alloc_lock);
>> -
>> - =A0 =A0/* Audit part two: walk the domain's p2m table, checking the
>> entries. */
>> + =A0 =A0/* Audit part one: walk the domain's p2m table, checking the
>> entries. */
>> =A0 =A0 if ( pagetable_get_pfn(p2m_get_pagetable(p2m)) !=3D 0 )
>> =A0 =A0 {
>> =A0 =A0 =A0 =A0 l2_pgentry_t *l2e;
>> @@ -1239,17 +1142,23 @@ void audit_p2m(struct p2m_domain *p2m, i
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0entry_count);
>> =A0 =A0 =A0 =A0 BUG();
>> =A0 =A0 }
>> -
>> - =A0 =A0//P2M_PRINTK("p2m audit complete\n");
>> - =A0 =A0//if ( orphans_i | orphans_d | mpbad | pmbad )
>> - =A0 =A0// =A0 =A0P2M_PRINTK("p2m audit found %lu orphans (%lu inval =
%lu
>> debug)\n",
>> - =A0 =A0// =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 orphans_i + orphans_d,=
 orphans_i, orphans_d);
>> - =A0 =A0if ( mpbad | pmbad )
>> - =A0 =A0{
>> - =A0 =A0 =A0 =A0P2M_PRINTK("p2m audit found %lu odd p2m, %lu bad m2p
>> entries\n",
>> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 pmbad, mpbad);
>> - =A0 =A0 =A0 =A0WARN();
>> - =A0 =A0}
>> +
>> + =A0 =A0return pmbad;
>> =A0}
>> =A0#endif /* P2M_AUDIT */
>>
>> +/* Set up the p2m function pointers for pagetable format */
>> +void p2m_pt_init(struct p2m_domain *p2m)
>> +{
>> + =A0 =A0p2m->set_entry =3D p2m_set_entry;
>> + =A0 =A0p2m->get_entry =3D p2m_gfn_to_mfn;
>> + =A0 =A0p2m->change_entry_type_global =3D p2m_change_type_global;
>> + =A0 =A0p2m->write_p2m_entry =3D paging_write_p2m_entry;
>> +#if P2M_AUDIT
>> + =A0 =A0p2m->audit_p2m =3D p2m_pt_audit_p2m;
>> +#else
>> + =A0 =A0p2m->audit_p2m =3D NULL;
>> +#endif
>> +}
>> +
>> +
>> diff -r f11528df1df3 -r 764e0872dd4f xen/arch/x86/mm/p2m.c
>> --- a/xen/arch/x86/mm/p2m.c
>> +++ b/xen/arch/x86/mm/p2m.c
>> @@ -439,9 +439,7 @@ guest_physmap_remove_page(struct domain
>> =A0{
>> =A0 =A0 struct p2m_domain *p2m =3D p2m_get_hostp2m(d);
>> =A0 =A0 p2m_lock(p2m);
>> - =A0 =A0audit_p2m(p2m, 1);
>> =A0 =A0 p2m_remove_page(p2m, gfn, mfn, page_order);
>> - =A0 =A0audit_p2m(p2m, 1);
>> =A0 =A0 p2m_unlock(p2m);
>> =A0}
>>
>> @@ -482,7 +480,6 @@ guest_physmap_add_entry(struct domain *d
>> =A0 =A0 =A0 =A0 return rc;
>>
>> =A0 =A0 p2m_lock(p2m);
>> - =A0 =A0audit_p2m(p2m, 0);
>>
>> =A0 =A0 P2M_DEBUG("adding gfn=3D%#lx mfn=3D%#lx\n", gfn, mfn);
>>
>> @@ -566,7 +563,6 @@ guest_physmap_add_entry(struct domain *d
>> =A0 =A0 =A0 =A0 }
>> =A0 =A0 }
>>
>> - =A0 =A0audit_p2m(p2m, 1);
>> =A0 =A0 p2m_unlock(p2m);
>>
>> =A0 =A0 return rc;
>> @@ -656,7 +652,6 @@ set_mmio_p2m_entry(struct domain *d, uns
>>
>> =A0 =A0 P2M_DEBUG("set mmio %lx %lx\n", gfn, mfn_x(mfn));
>> =A0 =A0 rc =3D set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_mmio_di=
rect,
>> p2m->default_access);
>> - =A0 =A0audit_p2m(p2m, 1);
>> =A0 =A0 p2m_unlock(p2m);
>> =A0 =A0 if ( 0 =3D=3D rc )
>> =A0 =A0 =A0 =A0 gdprintk(XENLOG_ERR,
>> @@ -688,7 +683,6 @@ clear_mmio_p2m_entry(struct domain *d, u
>> =A0 =A0 =A0 =A0 goto out;
>> =A0 =A0 }
>> =A0 =A0 rc =3D set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), PAGE_ORDER_4=
K,
>> p2m_invalid, p2m->default_access);
>> - =A0 =A0audit_p2m(p2m, 1);
>>
>> =A0out:
>> =A0 =A0 p2m_unlock(p2m);
>> @@ -785,7 +779,6 @@ int p2m_mem_paging_nominate(struct domai
>>
>> =A0 =A0 /* Fix p2m entry */
>> =A0 =A0 set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_paging_out=
, a);
>> - =A0 =A0audit_p2m(p2m, 1);
>> =A0 =A0 ret =3D 0;
>>
>> =A0out:
>> @@ -852,7 +845,6 @@ int p2m_mem_paging_evict(struct domain *
>>
>> =A0 =A0 /* Remove mapping from p2m table */
>> =A0 =A0 set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), PAGE_ORDER_4K,
>> p2m_ram_paged, a);
>> - =A0 =A0audit_p2m(p2m, 1);
>>
>> =A0 =A0 /* Clear content before returning the page to Xen */
>> =A0 =A0 scrub_one_page(page);
>> @@ -946,7 +938,6 @@ void p2m_mem_paging_populate(struct doma
>> =A0 =A0 =A0 =A0 =A0 =A0 req.flags |=3D MEM_EVENT_FLAG_EVICT_FAIL;
>>
>> =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K,
>> p2m_ram_paging_in_start, a);
>> - =A0 =A0 =A0 =A0audit_p2m(p2m, 1);
>> =A0 =A0 }
>> =A0 =A0 p2m_unlock(p2m);
>>
>> @@ -1014,7 +1005,6 @@ int p2m_mem_paging_prep(struct domain *d
>>
>> =A0 =A0 /* Fix p2m mapping */
>> =A0 =A0 set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_paging_in,=
 a);
>> - =A0 =A0audit_p2m(p2m, 1);
>>
>> =A0 =A0 atomic_dec(&d->paged_pages);
>>
>> @@ -1063,7 +1053,6 @@ void p2m_mem_paging_resume(struct domain
>> =A0 =A0 =A0 =A0 {
>> =A0 =A0 =A0 =A0 =A0 =A0 set_p2m_entry(p2m, rsp.gfn, mfn, PAGE_ORDER_4K=
, p2m_ram_rw,
>> a);
>> =A0 =A0 =A0 =A0 =A0 =A0 set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
>> - =A0 =A0 =A0 =A0 =A0 =A0audit_p2m(p2m, 1);
>> =A0 =A0 =A0 =A0 }
>> =A0 =A0 =A0 =A0 p2m_unlock(p2m);
>> =A0 =A0 }
>> @@ -1425,6 +1414,119 @@ unsigned long paging_gva_to_gfn(struct v
>> =A0 =A0 return hostmode->gva_to_gfn(v, hostp2m, va, pfec);
>> =A0}
>>
>> +/*** Audit ***/
>> +
>> +#if P2M_AUDIT
>> +void audit_p2m(struct domain *d,
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0uint64_t *orphans_debug,
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0uint64_t *orphans_invalid,
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0uint64_t *m2p_bad,
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0uint64_t *p2m_bad)
>> +{
>> + =A0 =A0struct page_info *page;
>> + =A0 =A0struct domain *od;
>> + =A0 =A0unsigned long mfn, gfn;
>> + =A0 =A0mfn_t p2mfn;
>> + =A0 =A0unsigned long orphans_d =3D 0, orphans_i =3D 0, mpbad =3D 0, =
pmbad =3D 0;
>> + =A0 =A0p2m_access_t p2ma;
>> + =A0 =A0p2m_type_t type;
>> + =A0 =A0struct p2m_domain *p2m =3D p2m_get_hostp2m(d);
>> +
>> + =A0 =A0if ( !paging_mode_translate(d) )
>> + =A0 =A0 =A0 =A0goto out_p2m_audit;
>> +
>> + =A0 =A0P2M_PRINTK("p2m audit starts\n");
>> +
>> + =A0 =A0p2m_lock(p2m);
>> +
>> + =A0 =A0if (p2m->audit_p2m)
>> + =A0 =A0 =A0 =A0pmbad =3D p2m->audit_p2m(p2m);
>> +
>> + =A0 =A0/* Audit part two: walk the domain's page allocation list, ch=
ecking
>> + =A0 =A0 * the m2p entries. */
>> + =A0 =A0spin_lock(&d->page_alloc_lock);
>> + =A0 =A0page_list_for_each ( page, &d->page_list )
>> + =A0 =A0{
>> + =A0 =A0 =A0 =A0mfn =3D mfn_x(page_to_mfn(page));
>> +
>> + =A0 =A0 =A0 =A0P2M_PRINTK("auditing guest page, mfn=3D%#lx\n", mfn);
>> +
>> + =A0 =A0 =A0 =A0od =3D page_get_owner(page);
>> +
>> + =A0 =A0 =A0 =A0if ( od !=3D d )
>> + =A0 =A0 =A0 =A0{
>> + =A0 =A0 =A0 =A0 =A0 =A0P2M_PRINTK("wrong owner %#lx -> %p(%u) !=3D %=
p(%u)\n",
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn, od, (od?od->domain_=
id:-1), d,
>> d->domain_id);
>> + =A0 =A0 =A0 =A0 =A0 =A0continue;
>> + =A0 =A0 =A0 =A0}
>> +
>> + =A0 =A0 =A0 =A0gfn =3D get_gpfn_from_mfn(mfn);
>> + =A0 =A0 =A0 =A0if ( gfn =3D=3D INVALID_M2P_ENTRY )
>> + =A0 =A0 =A0 =A0{
>> + =A0 =A0 =A0 =A0 =A0 =A0orphans_i++;
>> + =A0 =A0 =A0 =A0 =A0 =A0P2M_PRINTK("orphaned guest page: mfn=3D%#lx h=
as invalid
>> gfn\n",
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn);
>> + =A0 =A0 =A0 =A0 =A0 =A0continue;
>> + =A0 =A0 =A0 =A0}
>> +
>> + =A0 =A0 =A0 =A0if ( gfn =3D=3D 0x55555555 || gfn =3D=3D 0x5555555555=
555555 )
>> + =A0 =A0 =A0 =A0{
>> + =A0 =A0 =A0 =A0 =A0 =A0orphans_d++;
>> + =A0 =A0 =A0 =A0 =A0 =A0P2M_PRINTK("orphaned guest page: mfn=3D%#lx h=
as debug gfn\n",
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn);
>> + =A0 =A0 =A0 =A0 =A0 =A0continue;
>> + =A0 =A0 =A0 =A0}
>> +
>> + =A0 =A0 =A0 =A0if ( gfn =3D=3D SHARED_M2P_ENTRY )
>> + =A0 =A0 =A0 =A0{
>> + =A0 =A0 =A0 =A0 =A0 =A0P2M_PRINTK("shared mfn (%lx) on domain page l=
ist!\n",
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0mfn);
>> + =A0 =A0 =A0 =A0 =A0 =A0continue;
>> + =A0 =A0 =A0 =A0}
>> +
>> + =A0 =A0 =A0 =A0p2mfn =3D get_gfn_type_access(p2m, gfn, &type, &p2ma,=
 p2m_query,
>> NULL);
>> + =A0 =A0 =A0 =A0if ( mfn_x(p2mfn) !=3D mfn )
>> + =A0 =A0 =A0 =A0{
>> + =A0 =A0 =A0 =A0 =A0 =A0mpbad++;
>> + =A0 =A0 =A0 =A0 =A0 =A0P2M_PRINTK("map mismatch mfn %#lx -> gfn %#lx=
 -> mfn %#lx"
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 " (-> gfn %#lx)\n",
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn, gfn, mfn_x(p2mfn),
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (mfn_valid(p2mfn)
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0? get_gpfn_from_mfn(m=
fn_x(p2mfn))
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0: -1u));
>> + =A0 =A0 =A0 =A0 =A0 =A0/* This m2p entry is stale: the domain has an=
other frame in
>> + =A0 =A0 =A0 =A0 =A0 =A0 * this physical slot. =A0No great disaster, =
but for
>> neatness,
>> + =A0 =A0 =A0 =A0 =A0 =A0 * blow away the m2p entry. */
>> + =A0 =A0 =A0 =A0 =A0 =A0set_gpfn_from_mfn(mfn, INVALID_M2P_ENTRY);
>> + =A0 =A0 =A0 =A0}
>> + =A0 =A0 =A0 =A0__put_gfn(p2m, gfn);
>> +
>> + =A0 =A0 =A0 =A0P2M_PRINTK("OK: mfn=3D%#lx, gfn=3D%#lx, p2mfn=3D%#lx,=
 lp2mfn=3D%#lx\n",
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mfn, gfn, mfn_x(p2mfn), =
lp2mfn);
>> + =A0 =A0}
>> + =A0 =A0spin_unlock(&d->page_alloc_lock);
>> +
>> + =A0 =A0p2m_unlock(p2m);
>> +
>> + =A0 =A0P2M_PRINTK("p2m audit complete\n");
>> + =A0 =A0if ( orphans_i | orphans_d | mpbad | pmbad )
>> + =A0 =A0 =A0 =A0P2M_PRINTK("p2m audit found %lu orphans (%lu inval %l=
u
>> debug)\n",
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 orphans_i + orphans_d, o=
rphans_i, orphans_d);
>> + =A0 =A0if ( mpbad | pmbad )
>> + =A0 =A0{
>> + =A0 =A0 =A0 =A0P2M_PRINTK("p2m audit found %lu odd p2m, %lu bad m2p
>> entries\n",
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 pmbad, mpbad);
>> + =A0 =A0 =A0 =A0WARN();
>> + =A0 =A0}
>> +
>> +out_p2m_audit:
>> + =A0 =A0*orphans_debug =A0 =A0 =A0=3D (uint64_t) orphans_d;
>> + =A0 =A0*orphans_invalid =A0 =A0=3D (uint64_t) orphans_i;
>> + =A0 =A0*m2p_bad =A0 =A0 =A0 =A0 =A0 =A0=3D (uint64_t) mpbad;
>> + =A0 =A0*p2m_bad =A0 =A0 =A0 =A0 =A0 =A0=3D (uint64_t) pmbad;
>> +}
>> +#endif /* P2M_AUDIT */
>> +
>> =A0/*
>> =A0* Local variables:
>> =A0* mode: C
>> diff -r f11528df1df3 -r 764e0872dd4f xen/include/asm-x86/p2m.h
>> --- a/xen/include/asm-x86/p2m.h
>> +++ b/xen/include/asm-x86/p2m.h
>> @@ -244,6 +244,7 @@ struct p2m_domain {
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 =A0 unsigned long gfn,
>> l1_pgentry_t *p,
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 =A0 mfn_t table_mfn, l1_pgentry_t
>> new,
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 =A0 unsigned int level);
>> + =A0 =A0long =A0 =A0 =A0 =A0 =A0 =A0 =A0 (*audit_p2m)(struct p2m_doma=
in *p2m);
>>
>> =A0 =A0 /* Default P2M access type for each page in the the domain: ne=
w
>> pages,
>> =A0 =A0 =A0* swapped in pages, cleared pages, and pages that are ambiq=
uously
>> @@ -558,13 +559,15 @@ int set_p2m_entry(struct p2m_domain *p2m
>> =A0extern void p2m_pt_init(struct p2m_domain *p2m);
>>
>> =A0/* Debugging and auditing of the P2M code? */
>> -#define P2M_AUDIT =A0 =A0 0
>> +#define P2M_AUDIT =A0 =A0 1
>> =A0#define P2M_DEBUGGING 0
>>
>> =A0#if P2M_AUDIT
>> -extern void audit_p2m(struct p2m_domain *p2m, int strict_m2p);
>> -#else
>> -# define audit_p2m(_p2m, _m2p) do { (void)(_p2m),(_m2p); } while (0)
>> +extern void audit_p2m(struct domain *d,
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0uint64_t *orphans_deb=
ug,
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0uint64_t *orphans_inv=
alid,
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0uint64_t *m2p_bad,
>> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0uint64_t *p2m_bad);
>> =A0#endif /* P2M_AUDIT */
>>
>> =A0/* Printouts */
>> diff -r f11528df1df3 -r 764e0872dd4f xen/include/public/domctl.h
>> --- a/xen/include/public/domctl.h
>> +++ b/xen/include/public/domctl.h
>> @@ -800,6 +800,16 @@ struct xen_domctl_mem_sharing_op {
>> =A0typedef struct xen_domctl_mem_sharing_op xen_domctl_mem_sharing_op_=
t;
>> =A0DEFINE_XEN_GUEST_HANDLE(xen_domctl_mem_sharing_op_t);
>>
>> +struct xen_domctl_audit_p2m {
>> + =A0 =A0/* OUT error counts */
>> + =A0 =A0uint64_t orphans_debug;
>> + =A0 =A0uint64_t orphans_invalid;
>> + =A0 =A0uint64_t m2p_bad;
>> + =A0 =A0uint64_t p2m_bad;
>> +};
>> +typedef struct xen_domctl_audit_p2m xen_domctl_audit_p2m_t;
>> +DEFINE_XEN_GUEST_HANDLE(xen_domctl_audit_p2m_t);
>> +
>> =A0#if defined(__i386__) || defined(__x86_64__)
>> =A0/* XEN_DOMCTL_setvcpuextstate */
>> =A0/* XEN_DOMCTL_getvcpuextstate */
>> @@ -898,6 +908,7 @@ struct xen_domctl {
>> =A0#define XEN_DOMCTL_setvcpuextstate =A0 =A0 =A0 =A0 =A0 =A0 =A0 62
>> =A0#define XEN_DOMCTL_getvcpuextstate =A0 =A0 =A0 =A0 =A0 =A0 =A0 63
>> =A0#define XEN_DOMCTL_set_access_required =A0 =A0 =A0 =A0 =A0 64
>> +#define XEN_DOMCTL_audit_p2m =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
65
>> =A0#define XEN_DOMCTL_gdbsx_guestmemio =A0 =A0 =A0 =A0 =A0 =A01000
>> =A0#define XEN_DOMCTL_gdbsx_pausevcpu =A0 =A0 =A0 =A0 =A0 =A0 1001
>> =A0#define XEN_DOMCTL_gdbsx_unpausevcpu =A0 =A0 =A0 =A0 =A0 1002
>> @@ -951,6 +962,7 @@ struct xen_domctl {
>> =A0 =A0 =A0 =A0 struct xen_domctl_vcpuextstate =A0 =A0 =A0vcpuextstate=
;
>> =A0#endif
>> =A0 =A0 =A0 =A0 struct xen_domctl_set_access_required access_required;
>> + =A0 =A0 =A0 =A0struct xen_domctl_audit_p2m =A0 =A0 =A0 =A0 audit_p2m=
;
>> =A0 =A0 =A0 =A0 struct xen_domctl_gdbsx_memio =A0 =A0 =A0 gdbsx_guest_=
memio;
>> =A0 =A0 =A0 =A0 struct xen_domctl_gdbsx_pauseunp_vcpu gdbsx_pauseunp_v=
cpu;
>> =A0 =A0 =A0 =A0 struct xen_domctl_gdbsx_domstatus =A0 gdbsx_domstatus;
>>
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com
>> http://lists.xensource.com/xen-devel
>>
>



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 07:41:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 07:41:31 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQL8c-0005LP-SG; Tue, 15 Nov 2011 07:41:30 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQL7L-0004tl-3A
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 07:40:15 -0800
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1321371604!4311108!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6938 invoked from network); 15 Nov 2011 15:40:05 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 15:40:05 -0000
Received: by iaby12 with SMTP id y12so7545172iab.30
	for <xen-devel@lists.xensource.com>;
	Tue, 15 Nov 2011 07:40:01 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:cc:content-type
	:content-transfer-encoding;
	bh=52M7QgxKwWX1YCe+XZov/p97AV4L4U5ljCMD/Ob2v4c=;
	b=IBeVhsyA3DHQgwc5VUHJmq3npwZqESiQ+WIGxhX970PWZcfOoBk8kh40bml8WATsP4
	CHRmgv7N48MwbGWZlwpmaUIJDcZ4ONGG5AQIaTB6FnHCxpMBT+j3UYgQDhKV5tsqar/5
	Uk1Sw5K9+2vwxnFCpfsI75Nloq292AmlV+ErQ=
MIME-Version: 1.0
Received: by 10.50.17.197 with SMTP id q5mr28998518igd.2.1321371599960; Tue,
	15 Nov 2011 07:39:59 -0800 (PST)
Received: by 10.231.169.13 with HTTP; Tue, 15 Nov 2011 07:39:59 -0800 (PST)
In-Reply-To: <d9a344a5c1e375befd24.1321307322@xdev.gridcentric.ca>
References: <patchbomb.1321307321@xdev.gridcentric.ca>
	<d9a344a5c1e375befd24.1321307322@xdev.gridcentric.ca>
Date: Tue, 15 Nov 2011 15:39:59 +0000
X-Google-Sender-Auth: Tq5n_2BRFWxOElSiz08E2EDz-ts
Message-ID: <CAFLBxZYJuXAkdr=8eJM8eHEki5x+x2qz1vga4eQx-msD+VZXxw@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 1 of 6] The PoD code may split a 1GB superpage
	in a potentially unlocked way
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: olaf@aepfle.de, xen-devel@lists.xensource.com, andres@gridcentric.ca,
	tim@xen.org, keir.xen@gmail.com, adin@gridcentric.ca
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

(Including xen-devel in my reply...)

On Mon, Nov 14, 2011 at 9:48 PM, Andres Lagar-Cavilla
<andres@lagarcavilla.org> wrote:
> =A0xen/arch/x86/mm/p2m-pod.c | =A01 -
> =A0xen/arch/x86/mm/p2m-pt.c =A0| =A09 ++++++---
> =A02 files changed, 6 insertions(+), 4 deletions(-)
>
>
> The path p2m-lookup -> p2m-pt->get_entry -> 1GB PoD superpage ->
> pod_demand_populate ends in the pod code performing a p2m_set_entry with
> no locks held (in order to split the 1GB superpage into 512 2MB ones)
>
> Further, it calls p2m_unlock after that, which will break the spinlock.

Yeah, not sure how this got to be the way it did... good catch.

Acked-by: George Dunlap <george.dunlap@eu.citrix.com>

>
> This patch attempts to fix that.
>
> Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
>
> diff -r 0844b17df7a9 -r d9a344a5c1e3 xen/arch/x86/mm/p2m-pod.c
> --- a/xen/arch/x86/mm/p2m-pod.c
> +++ b/xen/arch/x86/mm/p2m-pod.c
> @@ -987,7 +987,6 @@ p2m_pod_demand_populate(struct p2m_domai
> =A0 =A0 =A0 =A0 set_p2m_entry(p2m, gfn_aligned, _mfn(0), PAGE_ORDER_2M,
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 p2m_populate_on_demand, p2m->=
default_access);
> =A0 =A0 =A0 =A0 audit_p2m(p2m, 1);
> - =A0 =A0 =A0 =A0p2m_unlock(p2m);
> =A0 =A0 =A0 =A0 return 0;
> =A0 =A0 }
>
> diff -r 0844b17df7a9 -r d9a344a5c1e3 xen/arch/x86/mm/p2m-pt.c
> --- a/xen/arch/x86/mm/p2m-pt.c
> +++ b/xen/arch/x86/mm/p2m-pt.c
> @@ -542,10 +542,11 @@ pod_retry_l3:
> =A0 =A0 =A0 =A0 =A0 =A0 /* The read has succeeded, so we know that mappin=
g exists */
> =A0 =A0 =A0 =A0 =A0 =A0 if ( q !=3D p2m_query )
> =A0 =A0 =A0 =A0 =A0 =A0 {
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if ( !p2m_pod_demand_populate(p2m, gfn, =
PAGE_ORDER_1G, q) )
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if ( !p2m_pod_check_and_populate(p2m, gf=
n,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0(l1_pgentry_t *) &l3e, PAGE_ORDER_1G, q) )
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto pod_retry_l3;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 p2mt =3D p2m_invalid;
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0printk("%s: Allocate 1GB failed!\n", __f=
unc__);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gdprintk(XENLOG_ERR, "%s: Allocate 1GB f=
ailed!\n", __func__);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto out;
> =A0 =A0 =A0 =A0 =A0 =A0 }
> =A0 =A0 =A0 =A0 =A0 =A0 else
> @@ -743,8 +744,10 @@ pod_retry_l3:
> =A0 =A0 =A0 =A0 =A0 =A0 {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ( q !=3D p2m_query )
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 {
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if ( !p2m_pod_demand_populate(p2=
m, gfn, PAGE_ORDER_1G, q) )
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if ( !p2m_pod_check_and_populate=
(p2m, gfn,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0(l1_pgentry_t *) l3e, PAGE_ORDER_1G, q) )
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto pod_retry_l3;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gdprintk(XENLOG_ERR, "%s: Alloca=
te 1GB failed!\n", __func__);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 else
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 *t =3D p2m_populate_on_demand;
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 07:49:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 07:49:22 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQLGE-0005tx-0V; Tue, 15 Nov 2011 07:49:22 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQLFb-0005gx-3n
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 07:48:43 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1321372092!48571651!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1891 invoked from network); 15 Nov 2011 15:48:13 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 15:48:13 -0000
Received: by wwp14 with SMTP id 14so5829360wwp.24
	for <xen-devel@lists.xensource.com>;
	Tue, 15 Nov 2011 07:48:39 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=0OKWGQqxMwW69YpKVRFC+sUlMXfiWeysiJCfYkTUn78=;
	b=dV/GBUtQX6/qw5AdWLPCVL1bni270UGBCUM7V7WqbrOFvuLTuo9gg7nG7l47AUvi0b
	lzNxznEWrZ04hs7j40OGO/ZR+v31d5njWNO09d8V9W6ugt9dp5Jt5j3aZR2jgCluYR4l
	t0z+8WQS8KEezz/vly1Oa/X9T2PwOlA5oYSvs=
Received: by 10.216.163.149 with SMTP id a21mr445721wel.86.1321372119444;
	Tue, 15 Nov 2011 07:48:39 -0800 (PST)
Received: from [192.168.1.71]
	(host86-129-245-239.range86-129.btcentralplus.com. [86.129.245.239])
	by mx.google.com with ESMTPS id ff6sm29277916wbb.10.2011.11.15.07.48.37
	(version=SSLv3 cipher=OTHER); Tue, 15 Nov 2011 07:48:38 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Tue, 15 Nov 2011 15:48:35 +0000
From: Keir Fraser <keir.xen@gmail.com>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <CAE83A53.24EC4%keir.xen@gmail.com>
Thread-Topic: x86 emulator and new isa additions
Thread-Index: AcyjrgiNgkXeLuDetEOymM7xLuKM4w==
In-Reply-To: <4EC27CDC02000078000611A1@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: x86 emulator and new isa additions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 15/11/2011 13:53, "Jan Beulich" <JBeulich@suse.com> wrote:

>> So, properly, I think the fact we already have a cpuid callback ought to be
>> sufficient to implement all the cpu_has functionality that the emulator
>> could want, perhaps hidden behind some helper/abstraction functions/macros.
> 
> Which may make it necessary to add cpuid callbacks to all emulator
> users (seems like only hvm currently has one). But it indeed looks like
> the right route to go, so I'll look into doing so.

Yes, probably. The CPUID emulation backend is similar across both PV and
HVM, so there shouldn't be much per-user shimming to be done.

 -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 08:02:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 08:02:44 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQLT9-0007DW-S8; Tue, 15 Nov 2011 08:02:43 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQLQP-0006yN-EI
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 07:59:55 -0800
X-Env-Sender: jonathanjstevens@gmail.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1321372789!4302632!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29448 invoked from network); 15 Nov 2011 15:59:50 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-16.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 15:59:50 -0000
Received: by vws13 with SMTP id 13so9778086vws.30
	for <xen-devel@lists.xensource.com>;
	Tue, 15 Nov 2011 07:59:49 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:content-type:content-transfer-encoding;
	bh=OzDQ9mmcw3CbRdTVY7REF9RwDfRU+rb7XCWdpTu0t48=;
	b=g96Ne9uCZg5+gnQTBTQJLXHcgAl1EeN5TJli9JZpzt8jG6pK1+y2rDmQv4u9IQ265Q
	TpJrjHQrWgBO9oFk4WGpAYKJx91l1POf1KblP4hl1NrUQJ2Sxtvey0z3jY97FuqpRblc
	41T3zU4rzezkujgu2J1hWvhAVm5+eoba1x9Zk=
MIME-Version: 1.0
Received: by 10.52.89.3 with SMTP id bk3mr17388869vdb.92.1321372789043; Tue,
	15 Nov 2011 07:59:49 -0800 (PST)
Received: by 10.220.187.13 with HTTP; Tue, 15 Nov 2011 07:59:49 -0800 (PST)
In-Reply-To: <20111115143131.GB22675@phenom.dumpdata.com>
References: <CAA7M+FD1mis7C1+cU0eCYZHhu96-B-g7_73FjC430fo4CHohvQ@mail.gmail.com>
	<CAA7M+FBP1SAa2cn9Rfsdcde=ruKekq+tVP1Jnj17RK6qrgvfNw@mail.gmail.com>
	<20111114183807.GA15284@phenom.dumpdata.com>
	<CAA7M+FCKCqHfBwkx7LUe6qH-_z4E+vZ2rwKi013MZxdT4GfKnw@mail.gmail.com>
	<20111115143131.GB22675@phenom.dumpdata.com>
Date: Tue, 15 Nov 2011 15:59:49 +0000
Message-ID: <CAA7M+FAHWsY=B1VZ9RrU3HymFN4C+hxjkzYJJ_g8F1Zhi47n9A@mail.gmail.com>
Subject: Re: [Xen-devel] HVR-4000 DVB can't scan or tune (properly) with Xen
From: "jonathanjstevens@gmail.com" <jonathanjstevens@gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>
> Why did pick irqpoll? Was there something in the past that was hanging on=
 your box.

It was mentioned in one of the possibly related bug reports I came
across when trying to figure out what was wrong. Purely added to try
to solve the issue in hand.

>> > 1). Boot your Linux machine with 'mem=3D3G' and see if that makes the =
issue
>> > =A0 =A0disappear.
>>
>> I have tried mem=3D2G and 4G (not 3 but I will if you think it'll be dif=
ferent).
>> I have also been trying with ballooning disabled, and with dom0_mem=3D2G=
 / 4G
>> I also tried swiotlb=3D65762
>> I have tried most combinations of the above - but not necessarily all.
>
> And all fail? Was this with the irqpoll option?
> Is this a two socket box?

Yes. Yes.
No.

> rpmfusion has a version of it built for F16.
Thanks.

>
>
> Well, that one is the worry some one. It reads as if it can't get the
> interrupts fast enough, which would be worrysome.
>
> I think I need to look at the code itself to get a better understanding
> of where that 'irq aud ..' is.
>
>
> Are there cheap versions of these DVB cards? I've only Hauppage PV-150 wh=
ich
> works for me, but that is not a DVB type card.
>

Hrm.. Not sure about that. I have another machine here which I might
be able to setup on a DMZ (I work in networks so the home net is
fairly well defended...) and give you remote (ssh) access to. I've got
a spare drive so I could install a fresh system on and I could put one
of the HVR-4000 cards in there. It's reasonably similar hardware, so
you'd be welcome to use and abuse it as a test bed if you like. Would
save you having to buy a card and I'd feel like I was helping :) Would
that be useful? I guess it wouldn't do any harm to try this on another
motherboard/CPU anyway.... I've seen "Sandybridge" cause some odd
issues...

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 08:11:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 08:11:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQLbz-0008T2-9j; Tue, 15 Nov 2011 08:11:51 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQLag-0008Fv-P1
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 08:10:31 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1321373309!44446703!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7354 invoked from network); 15 Nov 2011 16:08:29 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 16:08:29 -0000
Received: by wyg24 with SMTP id 24so841019wyg.30
	for <xen-devel@lists.xensource.com>;
	Tue, 15 Nov 2011 08:10:27 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=touwQKaz0nwjBMKajm+HZR3ie3F52WiWXxbr0UU0ML4=;
	b=qLEfkF7Ci7XlHRJvN+2UADUi8/5zsAdcGPLkV517h2CGaMNUVkBUKwYE4nmyh2/AkK
	DPcQAkyfKQPJXiQXi16r5ThcuZ2K0bgs3Ged3ASeF44xXBG+jnVJp83c5hxuEvnWPiQm
	xDieKpgZ70AgV1G/fr6wK9OizlheSLFyl1VWg=
Received: by 10.181.13.84 with SMTP id ew20mr30935301wid.58.1321373427611;
	Tue, 15 Nov 2011 08:10:27 -0800 (PST)
Received: from [192.168.1.3] (host86-129-245-239.range86-129.btcentralplus.com.
	[86.129.245.239])
	by mx.google.com with ESMTPS id j5sm14624120wix.20.2011.11.15.08.10.25
	(version=SSLv3 cipher=OTHER); Tue, 15 Nov 2011 08:10:26 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Tue, 15 Nov 2011 16:10:22 +0000
Subject: Re: [Xen-devel] [PATCH] xen: introduce HVM_PARAM_BUFIOREQ_EVTCHN
From: Keir Fraser <keir@xen.org>
To: Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	<xen-devel@lists.xensource.com>
Message-ID: <CAE83F6E.341D8%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] xen: introduce HVM_PARAM_BUFIOREQ_EVTCHN
Thread-Index: AcyjsROVss10EYSJekuTMbrN8CG/LA==
In-Reply-To: <1321365190-601-1-git-send-email-stefano.stabellini@eu.citrix.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 15/11/2011 13:53, "Stefano Stabellini" <Stefano.Stabellini@eu.citrix.com>
wrote:

> From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> 
> Introduce an event channel for buffered io event notifications,
> advertise the port number using an hvm param.
> This way the device model is not forced to check the buffered io page
> for data several times a second for the entire life of the VM (buffered
> io is mostly used for stdvga emulation in Xen that is switched off after
> the guest goes into graphical mode).

It doesn't look like this evtchn can be allocated and specified from outside
the hypervisor. Hence HVMOP_set_param(BUFIOREQ_EVTCHN) should fail with
-EINVAL or similar.

 -- Keir

> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> ---
>  xen/arch/x86/hvm/hvm.c          |   10 ++++++++++
>  xen/arch/x86/hvm/io.c           |    2 ++
>  xen/include/public/hvm/params.h |    3 ++-
>  3 files changed, 14 insertions(+), 1 deletions(-)
> 
> diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
> index ab7763b..dc01537 100644
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -972,6 +972,16 @@ int hvm_vcpu_initialise(struct vcpu *v)
>  
>      /* Register ioreq event channel. */
>      v->arch.hvm_vcpu.xen_port = rc;
> +
> +    if ( v->vcpu_id == 0 )
> +    {
> +        /* Create bufioreq event channel. */
> +        rc = alloc_unbound_xen_event_channel(v, 0);
> +        if ( rc < 0 )
> +            goto fail2;
> +        v->domain->arch.hvm_domain.params[HVM_PARAM_BUFIOREQ_EVTCHN] = rc;
> +    }
> +
>      spin_lock(&v->domain->arch.hvm_domain.ioreq.lock);
>      if ( v->domain->arch.hvm_domain.ioreq.va != NULL )
>          get_ioreq(v)->vp_eport = v->arch.hvm_vcpu.xen_port;
> diff --git a/xen/arch/x86/hvm/io.c b/xen/arch/x86/hvm/io.c
> index 7ebefc7..41a2ede 100644
> --- a/xen/arch/x86/hvm/io.c
> +++ b/xen/arch/x86/hvm/io.c
> @@ -118,6 +118,8 @@ int hvm_buffered_io_send(ioreq_t *p)
>      wmb();
>      pg->write_pointer += qw ? 2 : 1;
>  
> +    notify_via_xen_event_channel(v->domain,
> +            v->domain->arch.hvm_domain.params[HVM_PARAM_BUFIOREQ_EVTCHN]);
>      spin_unlock(&iorp->lock);
>      
>      return 1;
> diff --git a/xen/include/public/hvm/params.h b/xen/include/public/hvm/params.h
> index 1c5a1a9..6699788 100644
> --- a/xen/include/public/hvm/params.h
> +++ b/xen/include/public/hvm/params.h
> @@ -52,6 +52,7 @@
>  #define HVM_PARAM_IOREQ_PFN    5
>  
>  #define HVM_PARAM_BUFIOREQ_PFN 6
> +#define HVM_PARAM_BUFIOREQ_EVTCHN 26
>  
>  #ifdef __ia64__
>  
> @@ -141,6 +142,6 @@
>  /* Boolean: Enable nestedhvm (hvm only) */
>  #define HVM_PARAM_NESTEDHVM    24
>  
> -#define HVM_NR_PARAMS          26
> +#define HVM_NR_PARAMS          27
>  
>  #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 08:57:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 08:57:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQMJt-0005W0-KI; Tue, 15 Nov 2011 08:57:13 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQMJJ-0005IT-UN
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 08:56:38 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1321376194!3655190!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29505 invoked from network); 15 Nov 2011 16:56:34 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 16:56:34 -0000
X-IronPort-AV: E=Sophos;i="4.69,516,1315180800"; 
   d="scan'208";a="8946934"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 16:56:34 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 15 Nov 2011 16:56:34 +0000
Date: Tue, 15 Nov 2011 16:57:13 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Anthony Liguori <anthony@codemonkey.ws>
In-Reply-To: <4EC27D0D.3040204@codemonkey.ws>
Message-ID: <alpine.DEB.2.00.1111151457450.3519@kaball-desktop>
References: <alpine.DEB.2.00.1111151354000.3519@kaball-desktop>
	<1321368671-1134-1-git-send-email-stefano.stabellini@eu.citrix.com>
	<4EC27D0D.3040204@codemonkey.ws>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "agraf@suse.de" <agraf@suse.de>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [Qemu-devel] [PATCH 1/4] xen: introduce
	mc146818rtcxen
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 15 Nov 2011, Anthony Liguori wrote:
> On 11/15/2011 08:51 AM, stefano.stabellini@eu.citrix.com wrote:
> > From: Stefano Stabellini<stefano.stabellini@eu.citrix.com>
> >
> > Xen doesn't need full RTC emulation in Qemu because the RTC is already
> > emulated by the hypervisor. In particular we want to avoid the timers
> > initialization so that Qemu doesn't need to wake up needlessly.
> >
> > Signed-off-by: Stefano Stabellini<stefano.stabellini@eu.citrix.com>
> 
> Yuck.  There's got to be a better way to do this.

Yeah, it is pretty ugly, I was hoping in some good suggestions to
improve this patch :)


> I think it would be better to name timers and then in Xen specific machine code, 
> disable the RTC timers.

Good idea!
I was thinking that I could implement an rtc_stop function in
mc146818rtc.c that stops and frees the timers.

Now the problem is that from xen-all.c I cannot easily find the
ISADevice instance to pass to rtc_stop. Do you think it would be
reasonable to call rtc_stop from pc_basic_device_init, inside the same
if (!xen_available()) introduce by the next patch?

Otherwise I could implement functions to walk the isa bus, similarly to
pci_for_each_device.


This is just an example:

diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
index 2aaca2f..568c540 100644
--- a/hw/mc146818rtc.c
+++ b/hw/mc146818rtc.c
@@ -667,6 +667,28 @@ ISADevice *rtc_init(int base_year, qemu_irq intercept_irq)
     return dev;
 }
 
+void rtc_stop(ISADevice *dev)
+{
+    RTCState *s = DO_UPCAST(RTCState, dev, dev);
+
+    qemu_del_timer(s->periodic_timer);
+    qemu_del_timer(s->second_timer);
+    qemu_del_timer(s->second_timer2);
+#ifdef TARGET_I386
+    if (rtc_td_hack) {
+        qemu_del_timer(s->coalesced_timer);
+    }
+#endif
+    qemu_free_timer(s->periodic_timer);
+    qemu_free_timer(s->second_timer);
+    qemu_free_timer(s->second_timer2);
+#ifdef TARGET_I386
+    if (rtc_td_hack) {
+        qemu_free_timer(s->coalesced_timer);
+    }
+#endif
+}
+
 static ISADeviceInfo mc146818rtc_info = {
     .qdev.name     = "mc146818rtc",
     .qdev.size     = sizeof(RTCState),
diff --git a/hw/mc146818rtc.h b/hw/mc146818rtc.h
index 575968c..aa2b8ab 100644
--- a/hw/mc146818rtc.h
+++ b/hw/mc146818rtc.h
@@ -8,5 +8,6 @@
 ISADevice *rtc_init(int base_year, qemu_irq intercept_irq);
 void rtc_set_memory(ISADevice *dev, int addr, int val);
 void rtc_set_date(ISADevice *dev, const struct tm *tm);
+void rtc_stop(ISADevice *dev);
 
 #endif /* !MC146818RTC_H */
diff --git a/hw/pc.c b/hw/pc.c
index a0ae981..d734f75 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -1145,6 +1145,8 @@ void pc_basic_device_init(qemu_irq *gsi,
 
     if (!xen_available()) {
         pit = pit_init(0x40, 0);
+    } else {
+        rtc_stop(*rtc_state);
     }
     pcspk_init(pit);
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 08:59:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 08:59:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQMMT-0005wx-Of; Tue, 15 Nov 2011 08:59:53 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQMJu-0005Vz-M7
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 08:57:15 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1321376231!3241643!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22937 invoked from network); 15 Nov 2011 16:57:11 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 16:57:11 -0000
X-IronPort-AV: E=Sophos;i="4.69,516,1315180800"; 
   d="scan'208";a="8946949"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 16:57:10 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 15 Nov 2011 16:57:10 +0000
Date: Tue, 15 Nov 2011 16:57:49 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Keir Fraser <keir@xen.org>
Subject: Re: [Xen-devel] [PATCH] xen: introduce HVM_PARAM_BUFIOREQ_EVTCHN
In-Reply-To: <CAE83F6E.341D8%keir@xen.org>
Message-ID: <alpine.DEB.2.00.1111151657370.3519@kaball-desktop>
References: <CAE83F6E.341D8%keir@xen.org>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 15 Nov 2011, Keir Fraser wrote:
> On 15/11/2011 13:53, "Stefano Stabellini" <Stefano.Stabellini@eu.citrix.com>
> wrote:
> 
> > From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> > 
> > Introduce an event channel for buffered io event notifications,
> > advertise the port number using an hvm param.
> > This way the device model is not forced to check the buffered io page
> > for data several times a second for the entire life of the VM (buffered
> > io is mostly used for stdvga emulation in Xen that is switched off after
> > the guest goes into graphical mode).
> 
> It doesn't look like this evtchn can be allocated and specified from outside
> the hypervisor. Hence HVMOP_set_param(BUFIOREQ_EVTCHN) should fail with
> -EINVAL or similar.

Yes, good idea.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 09:15:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 09:15:37 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQMbg-0006a3-Lv; Tue, 15 Nov 2011 09:15:36 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQMa7-0006MS-6H
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 09:13:59 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1321377235!3249403!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16053 invoked from network); 15 Nov 2011 17:13:55 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 17:13:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,516,1315180800"; 
   d="scan'208";a="8947440"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 17:13:55 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Tue, 15 Nov 2011 17:13:55 +0000
Subject: Re: [Xen-devel] [PATCH 3/4] xen: introduce an event channel for
	buffered io event notifications
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "stefano.stabellini@eu.citrix.com" <stefano.stabellini@eu.citrix.com>
Date: Tue, 15 Nov 2011 17:13:55 +0000
In-Reply-To: <1321368671-1134-3-git-send-email-stefano.stabellini@eu.citrix.com>
References: <alpine.DEB.2.00.1111151354000.3519@kaball-desktop>
	<1321368671-1134-3-git-send-email-stefano.stabellini@eu.citrix.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1321377235.3664.151.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
	"agraf@suse.de" <agraf@suse.de>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-11-15 at 14:51 +0000, stefano.stabellini@eu.citrix.com
wrote:
> From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> 
> Use the newly introduced HVM_PARAM_BUFIOREQ_EVTCHN to receive
> notifications for buffered io events.
> After the first notification is received leave the event channel masked
> and setup a timer to process the rest of the batch.
> Once we have completed processing the batch, unmask the event channel
> and delete the timer.
> 
> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> ---
>  xen-all.c |   38 ++++++++++++++++++++++++++++++++------
>  1 files changed, 32 insertions(+), 6 deletions(-)
> 
> diff --git a/xen-all.c b/xen-all.c
> index b5e28ab..b28d7e7 100644
> --- a/xen-all.c
> +++ b/xen-all.c
> @@ -70,6 +70,8 @@ typedef struct XenIOState {
>      QEMUTimer *buffered_io_timer;
>      /* the evtchn port for polling the notification, */
>      evtchn_port_t *ioreq_local_port;
> +    /* evtchn local port for buffered io */
> +    evtchn_port_t bufioreq_local_port;
>      /* the evtchn fd for polling */
>      XenEvtchn xce_handle;
>      /* which vcpu we are serving */
> @@ -516,6 +518,12 @@ static ioreq_t *cpu_get_ioreq(XenIOState *state)
>      evtchn_port_t port;
>  
>      port = xc_evtchn_pending(state->xce_handle);
> +    if (port == state->bufioreq_local_port) {
> +        qemu_mod_timer(state->buffered_io_timer,
> +                BUFFER_IO_MAX_DELAY + qemu_get_clock_ms(rt_clock));
> +        return NULL;
> +    }
> +
>      if (port != -1) {
>          for (i = 0; i < smp_cpus; i++) {
>              if (state->ioreq_local_port[i] == port) {
> @@ -664,16 +672,18 @@ static void handle_ioreq(ioreq_t *req)
>      }
>  }
>  
> -static void handle_buffered_iopage(XenIOState *state)
> +static int handle_buffered_iopage(XenIOState *state)
>  {
>      buf_ioreq_t *buf_req = NULL;
>      ioreq_t req;
>      int qw;
>  
>      if (!state->buffered_io_page) {
> -        return;
> +        return 0;
>      }
>  
> +    memset(&req, 0x00, sizeof(req));
> +
>      while (state->buffered_io_page->read_pointer != state->buffered_io_page->write_pointer) {
>          buf_req = &state->buffered_io_page->buf_ioreq[
>              state->buffered_io_page->read_pointer % IOREQ_BUFFER_SLOT_NUM];
> @@ -698,15 +708,21 @@ static void handle_buffered_iopage(XenIOState *state)
>          xen_mb();
>          state->buffered_io_page->read_pointer += qw ? 2 : 1;
>      }
> +
> +    return req.count;
>  }
>  
>  static void handle_buffered_io(void *opaque)
>  {
>      XenIOState *state = opaque;
>  
> -    handle_buffered_iopage(state);
> -    qemu_mod_timer(state->buffered_io_timer,
> -                   BUFFER_IO_MAX_DELAY + qemu_get_clock_ms(rt_clock));
> +    if (handle_buffered_iopage(state)) {
> +        qemu_mod_timer(state->buffered_io_timer,
> +                BUFFER_IO_MAX_DELAY + qemu_get_clock_ms(rt_clock));
> +    } else {
> +        qemu_del_timer(state->buffered_io_timer);
> +        xc_evtchn_unmask(state->xce_handle, state->bufioreq_local_port);
> +    }
>  }
>  
>  static void cpu_handle_ioreq(void *opaque)
> @@ -836,7 +852,6 @@ static void xen_main_loop_prepare(XenIOState *state)
>  
>      state->buffered_io_timer = qemu_new_timer_ms(rt_clock, handle_buffered_io,
>                                                   state);
> -    qemu_mod_timer(state->buffered_io_timer, qemu_get_clock_ms(rt_clock));
>  
>      if (evtchn_fd != -1) {
>          qemu_set_fd_handler(evtchn_fd, cpu_handle_ioreq, NULL, state);
> @@ -888,6 +903,7 @@ int xen_hvm_init(void)
>  {
>      int i, rc;
>      unsigned long ioreq_pfn;
> +    unsigned long bufioreq_evtchn;
>      XenIOState *state;
>  
>      state = g_malloc0(sizeof (XenIOState));
> @@ -937,6 +953,16 @@ int xen_hvm_init(void)
>          state->ioreq_local_port[i] = rc;
>      }
>  
> +    xc_get_hvm_param(xen_xc, xen_domid, HVM_PARAM_BUFIOREQ_EVTCHN,
> +            &bufioreq_evtchn);
> +    rc = xc_evtchn_bind_interdomain(state->xce_handle, xen_domid,
> +            (uint32_t)bufioreq_evtchn);
> +    if (rc == -1) {
> +        fprintf(stderr, "bind interdomain ioctl error %d\n", errno);
> +        return -1;
> +    }
> +    state->bufioreq_local_port = rc;

Does this fallback gracefully on hypervisors which don't have this new
hvm param? It doesn't look like it but perhaps I'm missing something.

> +
>      /* Init RAM management */
>      xen_map_cache_init();
>      xen_ram_init(ram_size);



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 09:21:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 09:21:06 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQMh0-0007Fq-Is; Tue, 15 Nov 2011 09:21:06 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQMgB-00072q-8L
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 09:20:15 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1321377612!3646943!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22638 invoked from network); 15 Nov 2011 17:20:12 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 17:20:12 -0000
X-IronPort-AV: E=Sophos;i="4.69,516,1315180800"; 
   d="scan'208";a="8947694"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 17:20:11 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 15 Nov 2011 17:20:11 +0000
Date: Tue, 15 Nov 2011 17:20:51 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 3/4] xen: introduce an event channel for
	buffered io event notifications
In-Reply-To: <1321377235.3664.151.camel@zakaz.uk.xensource.com>
Message-ID: <alpine.DEB.2.00.1111151716340.3519@kaball-desktop>
References: <alpine.DEB.2.00.1111151354000.3519@kaball-desktop>
	<1321368671-1134-3-git-send-email-stefano.stabellini@eu.citrix.com>
	<1321377235.3664.151.camel@zakaz.uk.xensource.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "agraf@suse.de" <agraf@suse.de>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 15 Nov 2011, Ian Campbell wrote:
> > +    xc_get_hvm_param(xen_xc, xen_domid, HVM_PARAM_BUFIOREQ_EVTCHN,
> > +            &bufioreq_evtchn);
> > +    rc = xc_evtchn_bind_interdomain(state->xce_handle, xen_domid,
> > +            (uint32_t)bufioreq_evtchn);
> > +    if (rc == -1) {
> > +        fprintf(stderr, "bind interdomain ioctl error %d\n", errno);
> > +        return -1;
> > +    }
> > +    state->bufioreq_local_port = rc;
> 
> Does this fallback gracefully on hypervisors which don't have this new
> hvm param? It doesn't look like it but perhaps I'm missing something.

No, it does not.
However upstream Qemu doesn't work very well with Xen 4.1 anyway, the
first Xen release that is going to support it will be Xen 4.2 that
should have this feature.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 09:25:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 09:25:53 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQMlc-0007oq-8y; Tue, 15 Nov 2011 09:25:52 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQMkx-0007ct-VT
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 09:25:12 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1321377908!4298603!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2737 invoked from network); 15 Nov 2011 17:25:08 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 17:25:08 -0000
X-IronPort-AV: E=Sophos;i="4.69,516,1315180800"; 
   d="scan'208";a="8947799"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 17:25:08 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Tue, 15 Nov 2011 17:25:07 +0000
Subject: Re: [Xen-devel] [PATCH 3/4] xen: introduce an event channel for
	buffered io event notifications
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Date: Tue, 15 Nov 2011 17:24:58 +0000
In-Reply-To: <alpine.DEB.2.00.1111151716340.3519@kaball-desktop>
References: <alpine.DEB.2.00.1111151354000.3519@kaball-desktop>
	<1321368671-1134-3-git-send-email-stefano.stabellini@eu.citrix.com>
	<1321377235.3664.151.camel@zakaz.uk.xensource.com>
	<alpine.DEB.2.00.1111151716340.3519@kaball-desktop>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1321377907.3664.160.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
	"agraf@suse.de" <agraf@suse.de>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-11-15 at 17:20 +0000, Stefano Stabellini wrote:
> On Tue, 15 Nov 2011, Ian Campbell wrote:
> > > +    xc_get_hvm_param(xen_xc, xen_domid, HVM_PARAM_BUFIOREQ_EVTCHN,
> > > +            &bufioreq_evtchn);
> > > +    rc = xc_evtchn_bind_interdomain(state->xce_handle, xen_domid,
> > > +            (uint32_t)bufioreq_evtchn);
> > > +    if (rc == -1) {
> > > +        fprintf(stderr, "bind interdomain ioctl error %d\n", errno);
> > > +        return -1;
> > > +    }
> > > +    state->bufioreq_local_port = rc;
> > 
> > Does this fallback gracefully on hypervisors which don't have this new
> > hvm param? It doesn't look like it but perhaps I'm missing something.
> 
> No, it does not.
> However upstream Qemu doesn't work very well with Xen 4.1 anyway, the
> first Xen release that is going to support it will be Xen 4.2 that
> should have this feature.

In which case I think you need to handle the resultant error from
xc_get_hvm_param() gracefully with a suitable error message which says
something along those lines.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 10:02:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 10:02:33 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQNL5-0000P7-MP; Tue, 15 Nov 2011 10:02:31 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQNHm-00009r-BX
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 09:59:07 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1321379943!3252240!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9534 invoked from network); 15 Nov 2011 17:59:03 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 17:59:03 -0000
X-IronPort-AV: E=Sophos;i="4.69,516,1315180800"; 
   d="scan'208";a="8948361"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 17:59:03 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 15 Nov 2011 17:59:02 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RQNHi-000830-IN;
	Tue, 15 Nov 2011 17:59:02 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RQNHi-0005ub-CP;
	Tue, 15 Nov 2011 17:59:02 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9799-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 15 Nov 2011 17:59:02 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9799: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9799 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9799/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10     fail REGR. vs. 9789

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  fd3567cafe1c
baseline version:
 xen                  848049b14ec7

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Ian Campbell <ian.campbell@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24146:fd3567cafe1c
tag:         tip
user:        Andrew Cooper <andrew.cooper3@citrix.com>
date:        Tue Nov 15 14:50:18 2011 +0100
    
    KEXEC cleanup: IA64 specific functions should not live in generic header files
    
    Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
    Committed-by: Jan Beulich <jbeulich@suse.com>
    
    
changeset:   24145:967845cb565b
user:        Jan Beulich <jbeulich@suse.com>
date:        Tue Nov 15 14:47:41 2011 +0100
    
    ia64: fix the build
    
    This addresses all remaining build problems introduced over the last
    several months.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    
    
changeset:   24144:cd3ef25f207a
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Tue Nov 15 14:24:38 2011 +0100
    
    xen: avoid crash enabling turbo mode
    
    On a system which has not had P-state information pushed down into the
    hypervisor running "xenpm enable-turbo-mode" will reliably crash the host.
    
    (XEN) PM OP 38 on CPU0
    (XEN) ----[ Xen-4.2-unstable  x86_64  debug=y  Not tainted ]----
    (XEN) CPU:    0
    (XEN) RIP:    e008:[<ffff82c48013ceed>] cpufreq_enable_turbo+0x1d/0x29
    (XEN) RFLAGS: 0000000000010297   CONTEXT: hypervisor
    (XEN) rax: 0000000000000000   rbx: ffff82c48029fe40   rcx: 0000000000000000
    (XEN) rdx: 0000000000000000   rsi: 000000000000000a   rdi: 0000000000000000
    (XEN) rbp: ffff82c48029fd08   rsp: ffff82c48029fd08   r8:  0000000000000004
    (XEN) r9:  0000000000000000   r10: 00000000fffffffd   r11: ffff82c480218f20
    (XEN) r12: ffff830106e720b0   r13: 0000000000000000   r14: ffff82c4802bff80
    (XEN) r15: ffff82c48025c0e4   cr0: 000000008005003b   cr4: 00000000000026f0
    (XEN) cr3: 000000011f459000   cr2: 0000000000000051
    (XEN) ds: 007b   es: 007b   fs: 00d8   gs: 0033   ss: 0000   cs: e008
    (XEN) Xen stack trace from rsp=ffff82c48029fd08:
    (XEN)    ffff82c48029fdb8 ffff82c48014c427 ffff82c48029fd98 ffff82c48016b2d6
    (XEN)    ffff82c48029fdb8 ffff82c48029fd60 00000000001196c5 0000000116bbe025
    (XEN)    0000000116bbe025 ffff8301196c5338 ffff82f6022d77c0 0000000000000000
    (XEN)    ffff82f60205edf0 0000000000000000 0000000000000000 ffff8300dffba000
    (XEN)    ffff82c48029fdb8 ffff82c48029ff18 0000000008050004 0000000000000000
    (XEN)    ffff82c4802bff80 ffff82c48025c0e4 ffff82c48029fef8 ffff82c480124fd8
    (XEN)    0000000000000000 ffff83011f48c000 0000000116bbe025 0000000000000025
    (XEN)    ffff82c48029fe28 0000000080167722 ffff82c48029ff08 ffff83011f48c000
    (XEN)    ffff82f60232d8a0 ffff8300dffba000 ffff83011f48c000 ffff82f60232d8a0
    (XEN)    ffff82c48029fed8 ffff82c48017296a 000000080000000c 0000000000000026
    (XEN)    bfb338b000000000 bfb33874bfb33868 b78988f800000000 0000008800000000
    (XEN)    b787a6e0b78533a0 ffffffff00000001 080487aeb7897ff4 bfb3389000000001
    (XEN)    b7898ab0b7889626 0000000100000000 0000000000000001 0804867800000001
    (XEN)    000000000804e998 00000000b78533a0 bfb33e70bfb33a7c 0000000000000000
    (XEN)    0000000000000000 ffff8300dffba000 0000000000000000 0000000000000000
    (XEN)    0000000000000000 0000000000000000 00007d3b7fd600c7 ffff82c48021511e
    (XEN)    00000000c1002467 0000000000000023 0000000000000000 0000000000000000
    (XEN)    0000000000000000 0000000000000000 00000000dbf5bef8 0000000008050004
    (XEN)    0000000000000000 0000000000000000 0000000000000000 0000000000000000
    (XEN)    0000000000000023 00000000bfb33874 00000000bfb33868 0000000000000000
    (XEN) Xen call trace:
    (XEN)    [<ffff82c48013ceed>] cpufreq_enable_turbo+0x1d/0x29
    (XEN)    [<ffff82c48014c427>] do_pm_op+0x884/0x8e7
    (XEN)    [<ffff82c480124fd8>] do_sysctl+0x6d8/0x9f0
    (XEN)    [<ffff82c48021511e>] compat_hypercall+0xae/0x107
    (XEN)
    (XEN) Pagetable walk from 0000000000000051:
    (XEN)  L4[0x000] = 0000000116dbc027 000000000001bd22
    (XEN)  L3[0x000] = 0000000119ba8027 000000000001eb36
    (XEN)  L2[0x000] = 0000000000000000 ffffffffffffffff
    (XEN)
    (XEN) ****************************************
    (XEN) Panic on CPU 0:
    (XEN) FATAL PAGE FAULT
    (XEN) [error_code=0000]
    (XEN) Faulting linear address: 0000000000000051
    (XEN) ****************************************
    (XEN)
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Jan Beulich <jbeulich@suse.com>
    
    
changeset:   24143:848049b14ec7
user:        Keir Fraser <keir@xen.org>
date:        Mon Nov 14 20:15:35 2011 +0000
    
    hvmloader: Move acpi_info structure out from low memory.
    
    This avoids a conflict with SeaBIOS's memory management. Moreover
    there is no reason that acp_info must live below 1MB, and moving it
    out actually simplifies our code.
    
    Signed-off-by: Keir Fraser <keir@xen.org>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 12:50:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 12:50:05 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQPxF-00051f-HM; Tue, 15 Nov 2011 12:50:05 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQPwX-0004pR-3t
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 12:49:21 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-16.tower-182.messagelabs.com!1321390157!3256519!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20268 invoked from network); 15 Nov 2011 20:49:18 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-16.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 20:49:18 -0000
X-IronPort-AV: E=Sophos;i="4.69,517,1315180800"; 
   d="scan'208";a="8950414"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Nov 2011 20:49:17 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Tue, 15 Nov 2011 20:49:17 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RQPwT-0000YB-Cs;
	Tue, 15 Nov 2011 20:49:17 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RQPwT-0001XZ-C1;
	Tue, 15 Nov 2011 20:49:17 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9800-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 15 Nov 2011 20:49:17 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9800: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9800 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9800/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10     fail REGR. vs. 9789

Tests which are failing intermittently (not blocking):
 test-amd64-i386-xl-win-vcpus1 12 guest-localmigrate/x10      fail pass in 9799
 test-amd64-i386-win           7 windows-install              fail pass in 9799

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop            fail in 9799 never pass
 test-amd64-i386-win          16 leak-check/check       fail in 9799 never pass

version targeted for testing:
 xen                  fd3567cafe1c
baseline version:
 xen                  848049b14ec7

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Ian Campbell <ian.campbell@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24146:fd3567cafe1c
tag:         tip
user:        Andrew Cooper <andrew.cooper3@citrix.com>
date:        Tue Nov 15 14:50:18 2011 +0100
    
    KEXEC cleanup: IA64 specific functions should not live in generic header files
    
    Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
    Committed-by: Jan Beulich <jbeulich@suse.com>
    
    
changeset:   24145:967845cb565b
user:        Jan Beulich <jbeulich@suse.com>
date:        Tue Nov 15 14:47:41 2011 +0100
    
    ia64: fix the build
    
    This addresses all remaining build problems introduced over the last
    several months.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    
    
changeset:   24144:cd3ef25f207a
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Tue Nov 15 14:24:38 2011 +0100
    
    xen: avoid crash enabling turbo mode
    
    On a system which has not had P-state information pushed down into the
    hypervisor running "xenpm enable-turbo-mode" will reliably crash the host.
    
    (XEN) PM OP 38 on CPU0
    (XEN) ----[ Xen-4.2-unstable  x86_64  debug=y  Not tainted ]----
    (XEN) CPU:    0
    (XEN) RIP:    e008:[<ffff82c48013ceed>] cpufreq_enable_turbo+0x1d/0x29
    (XEN) RFLAGS: 0000000000010297   CONTEXT: hypervisor
    (XEN) rax: 0000000000000000   rbx: ffff82c48029fe40   rcx: 0000000000000000
    (XEN) rdx: 0000000000000000   rsi: 000000000000000a   rdi: 0000000000000000
    (XEN) rbp: ffff82c48029fd08   rsp: ffff82c48029fd08   r8:  0000000000000004
    (XEN) r9:  0000000000000000   r10: 00000000fffffffd   r11: ffff82c480218f20
    (XEN) r12: ffff830106e720b0   r13: 0000000000000000   r14: ffff82c4802bff80
    (XEN) r15: ffff82c48025c0e4   cr0: 000000008005003b   cr4: 00000000000026f0
    (XEN) cr3: 000000011f459000   cr2: 0000000000000051
    (XEN) ds: 007b   es: 007b   fs: 00d8   gs: 0033   ss: 0000   cs: e008
    (XEN) Xen stack trace from rsp=ffff82c48029fd08:
    (XEN)    ffff82c48029fdb8 ffff82c48014c427 ffff82c48029fd98 ffff82c48016b2d6
    (XEN)    ffff82c48029fdb8 ffff82c48029fd60 00000000001196c5 0000000116bbe025
    (XEN)    0000000116bbe025 ffff8301196c5338 ffff82f6022d77c0 0000000000000000
    (XEN)    ffff82f60205edf0 0000000000000000 0000000000000000 ffff8300dffba000
    (XEN)    ffff82c48029fdb8 ffff82c48029ff18 0000000008050004 0000000000000000
    (XEN)    ffff82c4802bff80 ffff82c48025c0e4 ffff82c48029fef8 ffff82c480124fd8
    (XEN)    0000000000000000 ffff83011f48c000 0000000116bbe025 0000000000000025
    (XEN)    ffff82c48029fe28 0000000080167722 ffff82c48029ff08 ffff83011f48c000
    (XEN)    ffff82f60232d8a0 ffff8300dffba000 ffff83011f48c000 ffff82f60232d8a0
    (XEN)    ffff82c48029fed8 ffff82c48017296a 000000080000000c 0000000000000026
    (XEN)    bfb338b000000000 bfb33874bfb33868 b78988f800000000 0000008800000000
    (XEN)    b787a6e0b78533a0 ffffffff00000001 080487aeb7897ff4 bfb3389000000001
    (XEN)    b7898ab0b7889626 0000000100000000 0000000000000001 0804867800000001
    (XEN)    000000000804e998 00000000b78533a0 bfb33e70bfb33a7c 0000000000000000
    (XEN)    0000000000000000 ffff8300dffba000 0000000000000000 0000000000000000
    (XEN)    0000000000000000 0000000000000000 00007d3b7fd600c7 ffff82c48021511e
    (XEN)    00000000c1002467 0000000000000023 0000000000000000 0000000000000000
    (XEN)    0000000000000000 0000000000000000 00000000dbf5bef8 0000000008050004
    (XEN)    0000000000000000 0000000000000000 0000000000000000 0000000000000000
    (XEN)    0000000000000023 00000000bfb33874 00000000bfb33868 0000000000000000
    (XEN) Xen call trace:
    (XEN)    [<ffff82c48013ceed>] cpufreq_enable_turbo+0x1d/0x29
    (XEN)    [<ffff82c48014c427>] do_pm_op+0x884/0x8e7
    (XEN)    [<ffff82c480124fd8>] do_sysctl+0x6d8/0x9f0
    (XEN)    [<ffff82c48021511e>] compat_hypercall+0xae/0x107
    (XEN)
    (XEN) Pagetable walk from 0000000000000051:
    (XEN)  L4[0x000] = 0000000116dbc027 000000000001bd22
    (XEN)  L3[0x000] = 0000000119ba8027 000000000001eb36
    (XEN)  L2[0x000] = 0000000000000000 ffffffffffffffff
    (XEN)
    (XEN) ****************************************
    (XEN) Panic on CPU 0:
    (XEN) FATAL PAGE FAULT
    (XEN) [error_code=0000]
    (XEN) Faulting linear address: 0000000000000051
    (XEN) ****************************************
    (XEN)
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Jan Beulich <jbeulich@suse.com>
    
    
changeset:   24143:848049b14ec7
user:        Keir Fraser <keir@xen.org>
date:        Mon Nov 14 20:15:35 2011 +0000
    
    hvmloader: Move acpi_info structure out from low memory.
    
    This avoids a conflict with SeaBIOS's memory management. Moreover
    there is no reason that acp_info must live below 1MB, and moving it
    out actually simplifies our code.
    
    Signed-off-by: Keir Fraser <keir@xen.org>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 13:33:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 13:33:19 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQQd5-0006jn-1h; Tue, 15 Nov 2011 13:33:19 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQQcD-0006WN-JS
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 13:32:26 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1321392710!44061118!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24352 invoked from network); 15 Nov 2011 21:31:51 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-10.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 15 Nov 2011 21:31:51 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAFLVlZa004893
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 15 Nov 2011 21:31:48 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAFLVkKf016937
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 15 Nov 2011 21:31:46 GMT
Received: from abhmt110.oracle.com (abhmt110.oracle.com [141.146.116.62])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAFLVepH011984; Tue, 15 Nov 2011 15:31:40 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 15 Nov 2011 13:31:40 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id A8E328283D; Tue, 15 Nov 2011 16:31:38 -0500 (EST)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, rjw@sisk.pl, tglx@linutronix.de,
	x86@kernel.org, hpa@zytor.com, len.brown@intel.com,
	joseph.cihula@intel.com, linux-pm@lists.linux-foundation.org,
	tboot-devel@lists.sourceforge.net, linux-acpi@vger.kernel.org,
	liang.tang@oracle.com
Date: Tue, 15 Nov 2011 16:31:04 -0500
Message-Id: <1321392671-9128-1-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.7.1
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090205.4EC2DA45.0057,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] ACPI cleanup's and enablement for Xen ACPI S3
	[v3]
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Attached is an [v3] set of patches to enable S3 to work with the Xen hypervisor.

Changes since v2: [https://lkml.org/lkml/2011/9/29/408]
 - Moved tboot_sleep out to the osl.c code.
 - Dropped some patches.
since the RFC posting [http://comments.gmane.org/gmane.linux.acpi.devel/50701]:
 - Per review comments added: __unused__ attribute, support for PM1A/B if more than 16-bit,
   copyright/license.
 - Added support for PHYSDEVOP_restore_msi_ext call.

The first two patches can be considered independently as cleanup - they move
the tboot_sleep out of the ACPI code and move it in the OS part. That is
the OSPM code changes required.

The more complex ones are in the ACPI x86 code. I was not sure how to
post the patches so I grouped in the "functionality" parts.

1). Use the acpi_os_prepare_sleep to register a variant of it. The reason
    for the need for this is explained in more details below. The patches are:

 [PATCH 1/7] x86, acpi, tboot: Have a ACPI os prepare sleep instead
 [PATCH 2/7] tboot: Add return values for tboot_sleep
 [PATCH 3/7] xen/acpi/sleep: Enable ACPI sleep via the

2). Expand x86_msi_ops. Every time we resume, we end up calling write_msi_irq
    to resume the MSI vectors. But when using Xen, we would write the MSI
    vectors using the other x86_msi_ops - hence we expand the x86_msi_ops
    indirection mechanism to take resume in account. The paches are:

 [PATCH 4/7] x86: Expand the x86_msi_ops to have a restore MSIs.
 [PATCH 5/7] xen/pci: Utilize the restore_msi_irqs hook.
3). Make acpi_suspend_lowlevel be a function pointer instead of a function.
    Details of why we want to omit the lowlevel values is explained below.
    Originally I was thinking that perhaps doing it via a registration
    function would be better? But not sure what folks leanings are
    in this case. The patches are:

 [PATCH 6/7] x86/acpi/sleep: Provide registration for
 [PATCH 7/7] xen/acpi/sleep: Register to the acpi_suspend_lowlevel a

Details of what I said in the first postings:

The Xen ACPI S3 functionality requires help from the Linux kernel. The Linux
kernel does the ACPI "stuff" and tells the hypervisor to do the low-level
stuff (such as program the IOAPIC, setup vectors, etc). Naturally do it correctly
the Xen hypervisor must be programmed with correct values that are extracted
as part of parsing the ACPI.

The ACPI code used during suspend is mostly all in hwsleep.c and there is one
particular case where 'hwsleep.c' is calling in the tboot.c code. This is replaced
by making the call go through the OS part of the ACPI code. The reason for
doing this is two fold: 1) cleanup, 2) for Xen case, it needs to make a hypercall
so that the hypervisor can write the PM1A/PM1B bits.

The major difficulties we hit was with 'acpi_suspend_lowlevel' - which tweaks
a lot of lowlevel values and some of them are not properly handled by Xen.
Liang Tang has figured which ones of them we trip over (read below) - and he
suggested that perhaps we can provide a registration mechanism to abstract
this away. The reason for all of this is that Linux does not talk to the
BIOS directly - instead it simply walks through the necessary ACPI methods
and then issues hypercall to Xen which then further completes the remaining
suspend steps.

So the attached patches do exactly that - there are two entry points
in the ACPI.

 1). For S3: acpi_suspend_lowlevel -> .. lots of code -> acpi_enter_sleep_state
 2). For S1/S4/S5: acpi_enter_sleep_state

The first naive idea was of abstracting away in the 'acpi_enter_sleep_state'
function the tboot_sleep code so that we can use it too. And low-behold - it
worked splendidly for powering off (S5 I believe)

For S3 that did not work - during suspend the hypervisor tripped over when
saving cr8. During resume it tripped over at restoring the cr3, cr8, idt,
and gdt values.

When I posted the RFC, the feedback I got was to use a higher upper
interface to make the call to the hypervisor. Instead of doing it at the
lower pv-ops case for cr3, cr8, idt, gdt, etc. The code is much nicer
this way, I've to say.

Anyhow, please take a look!

The patches are also located at

git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git devel/acpi-s3.v5

Konrad Rzeszutek Wilk (5):
      tboot: Add return values for tboot_sleep
      xen/acpi/sleep: Enable ACPI sleep via the acpi_os_prepare_sleep_register
      x86: Expand the x86_msi_ops to have a restore MSIs.
      x86/acpi/sleep: Provide registration for acpi_suspend_lowlevel
      xen/acpi/sleep: Register to the acpi_suspend_lowlevel a callback.

Tang Liang (2):
      x86, acpi, tboot: Have a ACPI os prepare sleep instead of calling tboot_sleep.
      xen/pci: Utilize the restore_msi_irqs hook.

 arch/x86/include/asm/acpi.h     |    2 +-
 arch/x86/include/asm/pci.h      |    9 +++++
 arch/x86/include/asm/x86_init.h |    1 +
 arch/x86/kernel/acpi/boot.c     |    2 +
 arch/x86/kernel/acpi/sleep.c    |    4 +-
 arch/x86/kernel/acpi/sleep.h    |    2 +
 arch/x86/kernel/tboot.c         |   18 ++++++++--
 arch/x86/kernel/x86_init.c      |    1 +
 arch/x86/pci/xen.c              |   27 ++++++++++++++
 arch/x86/xen/enlighten.c        |    3 ++
 drivers/acpi/acpica/hwsleep.c   |    7 ++--
 drivers/acpi/osl.c              |   19 ++++++++++
 drivers/acpi/sleep.c            |    2 +
 drivers/pci/msi.c               |   29 ++++++++++++++-
 drivers/xen/Makefile            |    2 +-
 drivers/xen/acpi.c              |   62 ++++++++++++++++++++++++++++++++
 include/acpi/acpiosxf.h         |    6 +++
 include/linux/tboot.h           |    3 --
 include/xen/acpi.h              |   74 +++++++++++++++++++++++++++++++++++++++
 include/xen/interface/physdev.h |    7 ++++
 20 files changed, 265 insertions(+), 15 deletions(-)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 13:34:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 13:34:36 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQQeK-00077M-70; Tue, 15 Nov 2011 13:34:36 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQQcD-0006WO-Us
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 13:32:26 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1321392741!3666388!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13936 invoked from network); 15 Nov 2011 21:32:22 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-4.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 15 Nov 2011 21:32:22 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAFLVlMq004886
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 15 Nov 2011 21:31:48 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAFLVkIL012799
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 15 Nov 2011 21:31:46 GMT
Received: from abhmt108.oracle.com (abhmt108.oracle.com [141.146.116.60])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAFLVew7012012; Tue, 15 Nov 2011 15:31:40 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 15 Nov 2011 13:31:40 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id CD99B82840; Tue, 15 Nov 2011 16:31:38 -0500 (EST)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, rjw@sisk.pl, tglx@linutronix.de,
	x86@kernel.org, hpa@zytor.com, len.brown@intel.com,
	joseph.cihula@intel.com, linux-pm@lists.linux-foundation.org,
	tboot-devel@lists.sourceforge.net, linux-acpi@vger.kernel.org,
	liang.tang@oracle.com
Date: Tue, 15 Nov 2011 16:31:07 -0500
Message-Id: <1321392671-9128-4-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.7.1
In-Reply-To: <1321392671-9128-1-git-send-email-konrad.wilk@oracle.com>
References: <1321392671-9128-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090208.4EC2DA44.017A,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 3/7] xen/acpi/sleep: Enable ACPI sleep via the
	acpi_os_prepare_sleep_register
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Provide the registration callback to call in the Xen's
ACPI sleep functionality. This means that during S3/S5
we make a hypercall XENPF_enter_acpi_sleep with the
proper PM1A/PM1B registers.

Based of Ke Yu's <ke.yu@intel.com> initial idea.
[ From http://xenbits.xensource.com/linux-2.6.18-xen.hg
change c68699484a65 ]

[v1: Added Copyright and license]
[v2: Added check if PM1A/B the 16-bits MSB contain something. The spec
     only uses 16-bits but might have more in future]
Signed-off-by: Liang Tang <liang.tang@oracle.com>
[v1: Improved the git commit description]
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 arch/x86/xen/enlighten.c |    3 ++
 drivers/xen/Makefile     |    2 +-
 drivers/xen/acpi.c       |   62 ++++++++++++++++++++++++++++++++++++++++++++++
 include/xen/acpi.h       |   59 +++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 125 insertions(+), 1 deletions(-)
 create mode 100644 drivers/xen/acpi.c
 create mode 100644 include/xen/acpi.h

diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index da8afd5..bb0c864 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -42,6 +42,7 @@
 #include <xen/page.h>
 #include <xen/hvm.h>
 #include <xen/hvc-console.h>
+#include <xen/acpi.h>
 
 #include <asm/paravirt.h>
 #include <asm/apic.h>
@@ -1277,6 +1278,8 @@ asmlinkage void __init xen_start_kernel(void)
 
 		/* Make sure ACS will be enabled */
 		pci_request_acs();
+
+		xen_acpi_sleep_register();
 	}
 		
 
diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile
index 974fffd..0435996 100644
--- a/drivers/xen/Makefile
+++ b/drivers/xen/Makefile
@@ -17,7 +17,7 @@ obj-$(CONFIG_XEN_SYS_HYPERVISOR)	+= sys-hypervisor.o
 obj-$(CONFIG_XEN_PVHVM)			+= platform-pci.o
 obj-$(CONFIG_XEN_TMEM)			+= tmem.o
 obj-$(CONFIG_SWIOTLB_XEN)		+= swiotlb-xen.o
-obj-$(CONFIG_XEN_DOM0)			+= pci.o
+obj-$(CONFIG_XEN_DOM0)			+= pci.o acpi.o
 obj-$(CONFIG_XEN_PCIDEV_BACKEND)	+= xen-pciback/
 
 xen-evtchn-y				:= evtchn.o
diff --git a/drivers/xen/acpi.c b/drivers/xen/acpi.c
new file mode 100644
index 0000000..9f81a0f
--- /dev/null
+++ b/drivers/xen/acpi.c
@@ -0,0 +1,62 @@
+/******************************************************************************
+ * acpi.c
+ * acpi file for domain 0 kernel
+ *
+ * Copyright (c) 2011 Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+ * Copyright (c) 2011 Yu Ke ke.yu@intel.com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation; or, when distributed
+ * separately from the Linux kernel or incorporated into other
+ * software packages, subject to the following license:
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this source file (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy, modify,
+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include <xen/acpi.h>
+#include <xen/interface/platform.h>
+#include <asm/xen/hypercall.h>
+#include <asm/xen/hypervisor.h>
+
+acpi_status xen_acpi_notify_hypervisor_state(u8 sleep_state,
+				     u32 pm1a_cnt, u32 pm1b_cnt)
+{
+	struct xen_platform_op op = {
+		.cmd = XENPF_enter_acpi_sleep,
+		.interface_version = XENPF_INTERFACE_VERSION,
+		.u = {
+			.enter_acpi_sleep = {
+				.pm1a_cnt_val = (u16)pm1a_cnt,
+				.pm1b_cnt_val = (u16)pm1b_cnt,
+				.sleep_state = sleep_state,
+			},
+		},
+	};
+
+	if ((pm1a_cnt & 0xffff0000) || (pm1b_cnt & 0xffff0000)) {
+		WARN(1, "Using more than 16bits of PM1A/B 0x%x/0x%x!"
+		     "Email xen-devel@lists.xensource.com  Thank you.\n", \
+		     pm1a_cnt, pm1b_cnt);
+		return AE_ERROR;
+	}
+
+	HYPERVISOR_dom0_op(&op);
+	return AE_ERROR;
+}
diff --git a/include/xen/acpi.h b/include/xen/acpi.h
new file mode 100644
index 0000000..69a6890
--- /dev/null
+++ b/include/xen/acpi.h
@@ -0,0 +1,59 @@
+/******************************************************************************
+ * acpi.h
+ * acpi file for domain 0 kernel
+ *
+ * Copyright (c) 2011 Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+ * Copyright (c) 2011 Yu Ke <ke.yu@intel.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation; or, when distributed
+ * separately from the Linux kernel or incorporated into other
+ * software packages, subject to the following license:
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this source file (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy, modify,
+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#ifndef _XEN_ACPI_H
+#define _XEN_ACPI_H
+
+#include <linux/types.h>
+
+#ifdef CONFIG_XEN_DOM0
+#include <asm/xen/hypervisor.h>
+#include <xen/xen.h>
+#include <linux/acpi.h>
+#include <acpi/acpiosxf.h>
+
+acpi_status xen_acpi_notify_hypervisor_state(u8 sleep_state,
+				     u32 pm1a_cnt, u32 pm1b_cnd);
+
+static inline void xen_acpi_sleep_register(void)
+{
+	if (xen_initial_domain())
+		acpi_os_prepare_sleep_register(
+			&xen_acpi_notify_hypervisor_state);
+}
+#else
+static inline void xen_acpi_sleep_register(void)
+{
+}
+#endif
+
+#endif	/* _XEN_ACPI_H */
-- 
1.7.7.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 13:35:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 13:35:33 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQQfF-0007V0-5i; Tue, 15 Nov 2011 13:35:33 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQQcG-0006WU-Pt
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 13:32:29 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1321392714!53236460!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27809 invoked from network); 15 Nov 2011 21:31:55 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-5.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 15 Nov 2011 21:31:55 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAFLVmEG008498
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 15 Nov 2011 21:31:49 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAFLVlNp012839
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 15 Nov 2011 21:31:48 GMT
Received: from abhmt109.oracle.com (abhmt109.oracle.com [141.146.116.61])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAFLVfK0029088; Tue, 15 Nov 2011 15:31:42 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 15 Nov 2011 13:31:41 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id EFE8082843; Tue, 15 Nov 2011 16:31:38 -0500 (EST)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, rjw@sisk.pl, tglx@linutronix.de,
	x86@kernel.org, hpa@zytor.com, len.brown@intel.com,
	joseph.cihula@intel.com, linux-pm@lists.linux-foundation.org,
	tboot-devel@lists.sourceforge.net, linux-acpi@vger.kernel.org,
	liang.tang@oracle.com
Date: Tue, 15 Nov 2011 16:31:10 -0500
Message-Id: <1321392671-9128-7-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.7.1
In-Reply-To: <1321392671-9128-1-git-send-email-konrad.wilk@oracle.com>
References: <1321392671-9128-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090203.4EC2DA46.0022,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 6/7] x86/acpi/sleep: Provide registration for
	acpi_suspend_lowlevel
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Which by default will be x86_acpi_suspend_lowlevel.
This registration allows us to register another callback
if there is a need to use another platform specific callback.

Signed-off-by: Liang Tang <liang.tang@oracle.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 arch/x86/include/asm/acpi.h  |    2 +-
 arch/x86/kernel/acpi/boot.c  |    2 ++
 arch/x86/kernel/acpi/sleep.c |    4 ++--
 arch/x86/kernel/acpi/sleep.h |    2 ++
 drivers/acpi/sleep.c         |    2 ++
 5 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h
index 610001d..68cf060 100644
--- a/arch/x86/include/asm/acpi.h
+++ b/arch/x86/include/asm/acpi.h
@@ -115,7 +115,7 @@ static inline void acpi_disable_pci(void)
 }
 
 /* Low-level suspend routine. */
-extern int acpi_suspend_lowlevel(void);
+extern int (*acpi_suspend_lowlevel)(void);
 
 extern const unsigned char acpi_wakeup_code[];
 #define acpi_wakeup_address (__pa(TRAMPOLINE_SYM(acpi_wakeup_code)))
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 4558f0d..eb85e88 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -44,6 +44,7 @@
 #include <asm/mpspec.h>
 #include <asm/smp.h>
 
+#include "sleep.h" /* To include x86_acpi_suspend_lowlevel */
 static int __initdata acpi_force = 0;
 u32 acpi_rsdt_forced;
 int acpi_disabled;
@@ -552,6 +553,7 @@ static int acpi_register_gsi_ioapic(struct device *dev, u32 gsi,
 int (*__acpi_register_gsi)(struct device *dev, u32 gsi,
 			   int trigger, int polarity) = acpi_register_gsi_pic;
 
+int (*acpi_suspend_lowlevel)(void) = x86_acpi_suspend_lowlevel;
 /*
  * success: return IRQ number (>=0)
  * failure: return < 0
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
index 103b6ab..4d2d0b1 100644
--- a/arch/x86/kernel/acpi/sleep.c
+++ b/arch/x86/kernel/acpi/sleep.c
@@ -25,12 +25,12 @@ static char temp_stack[4096];
 #endif
 
 /**
- * acpi_suspend_lowlevel - save kernel state
+ * x86_acpi_suspend_lowlevel - save kernel state
  *
  * Create an identity mapped page table and copy the wakeup routine to
  * low memory.
  */
-int acpi_suspend_lowlevel(void)
+int x86_acpi_suspend_lowlevel(void)
 {
 	struct wakeup_header *header;
 	/* address in low memory of the wakeup routine. */
diff --git a/arch/x86/kernel/acpi/sleep.h b/arch/x86/kernel/acpi/sleep.h
index 416d4be..4d3feb5 100644
--- a/arch/x86/kernel/acpi/sleep.h
+++ b/arch/x86/kernel/acpi/sleep.h
@@ -13,3 +13,5 @@ extern unsigned long acpi_copy_wakeup_routine(unsigned long);
 extern void wakeup_long64(void);
 
 extern void do_suspend_lowlevel(void);
+
+extern int x86_acpi_suspend_lowlevel(void);
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
index 6d9a3ab..b8b26e8 100644
--- a/drivers/acpi/sleep.c
+++ b/drivers/acpi/sleep.c
@@ -254,6 +254,8 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
 		break;
 
 	case ACPI_STATE_S3:
+		if (!acpi_suspend_lowlevel)
+			return -ENODEV;
 		error = acpi_suspend_lowlevel();
 		if (error)
 			return error;
-- 
1.7.7.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 13:36:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 13:36:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQQg3-0007sK-6g; Tue, 15 Nov 2011 13:36:23 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQQcH-0006Wd-BY
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 13:32:29 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1321392744!1704296!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25356 invoked from network); 15 Nov 2011 21:32:26 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-14.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 15 Nov 2011 21:32:26 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAFLVl0G008481
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 15 Nov 2011 21:31:48 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAFLVk6H015510
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 15 Nov 2011 21:31:46 GMT
Received: from abhmt113.oracle.com (abhmt113.oracle.com [141.146.116.65])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAFLVeO9025120; Tue, 15 Nov 2011 15:31:40 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 15 Nov 2011 13:31:40 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id B5C5A8283E; Tue, 15 Nov 2011 16:31:38 -0500 (EST)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, rjw@sisk.pl, tglx@linutronix.de,
	x86@kernel.org, hpa@zytor.com, len.brown@intel.com,
	joseph.cihula@intel.com, linux-pm@lists.linux-foundation.org,
	tboot-devel@lists.sourceforge.net, linux-acpi@vger.kernel.org,
	liang.tang@oracle.com
Date: Tue, 15 Nov 2011 16:31:05 -0500
Message-Id: <1321392671-9128-2-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.7.1
In-Reply-To: <1321392671-9128-1-git-send-email-konrad.wilk@oracle.com>
References: <1321392671-9128-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090201.4EC2DA45.0076,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 1/7] x86, acpi,
	tboot: Have a ACPI os prepare sleep instead of calling tboot_sleep.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Tang Liang <liang.tang@oracle.com>

The ACPI suspend path makes a call to tboot_sleep right before
it writes the PM1A, PM1B values. We replace the direct call to
tboot via an registration callback similar to __acpi_register_gsi.

As part of this, the tboot_sleep need only to register with the
acpi_os_prepare_sleep_register and if it not (on IA64) then it simply
won't be called.

We can also remove the tboot_sleep declerations.

[v1: Added __attribute__ ((unused))]
[v2: Introduced a wrapper instead of changing tboot_sleep return values]
Signed-off-by: Tang Liang <liang.tang@oracle.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 arch/x86/kernel/tboot.c       |    9 +++++++++
 drivers/acpi/acpica/hwsleep.c |    7 ++++---
 drivers/acpi/osl.c            |   19 +++++++++++++++++++
 include/acpi/acpiosxf.h       |    6 ++++++
 include/linux/tboot.h         |    3 ---
 5 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kernel/tboot.c b/arch/x86/kernel/tboot.c
index e2410e2..751d673 100644
--- a/arch/x86/kernel/tboot.c
+++ b/arch/x86/kernel/tboot.c
@@ -31,6 +31,7 @@
 #include <linux/pfn.h>
 #include <linux/mm.h>
 #include <linux/tboot.h>
+#include <acpi/acpiosxf.h>
 
 #include <asm/trampoline.h>
 #include <asm/processor.h>
@@ -297,6 +298,12 @@ void tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control)
 
 	tboot_shutdown(acpi_shutdown_map[sleep_state]);
 }
+static acpi_status tboot_sleep_wrapper(u8 sleep_state, u32 pm1a_control,
+		u32 pm1b_control)
+{
+	tboot_sleep(sleep_state, pm1a_control, pm1b_control);
+	return AE_OK;
+}
 
 static atomic_t ap_wfs_count;
 
@@ -345,6 +352,8 @@ static __init int tboot_late_init(void)
 
 	atomic_set(&ap_wfs_count, 0);
 	register_hotcpu_notifier(&tboot_cpu_notifier);
+
+	acpi_os_prepare_sleep_register(&tboot_sleep_wrapper);
 	return 0;
 }
 
diff --git a/drivers/acpi/acpica/hwsleep.c b/drivers/acpi/acpica/hwsleep.c
index d52da30..b10bc90 100644
--- a/drivers/acpi/acpica/hwsleep.c
+++ b/drivers/acpi/acpica/hwsleep.c
@@ -45,7 +45,6 @@
 #include <acpi/acpi.h>
 #include "accommon.h"
 #include "actables.h"
-#include <linux/tboot.h>
 #include <linux/module.h>
 
 #define _COMPONENT          ACPI_HARDWARE
@@ -344,8 +343,10 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
 
 	ACPI_FLUSH_CPU_CACHE();
 
-	tboot_sleep(sleep_state, pm1a_control, pm1b_control);
-
+	status = acpi_os_prepare_sleep(sleep_state, pm1a_control,
+				 pm1b_control);
+	if (ACPI_FAILURE(status))
+		return_ACPI_STATUS(status);
 	/* Write #2: Write both SLP_TYP + SLP_EN */
 
 	status = acpi_hw_write_pm1_control(pm1a_control, pm1b_control);
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
index f31c5c5..40daa68 100644
--- a/drivers/acpi/osl.c
+++ b/drivers/acpi/osl.c
@@ -1659,3 +1659,22 @@ acpi_status acpi_os_terminate(void)
 
 	return AE_OK;
 }
+
+acpi_status (*__acpi_os_prepare_sleep)(u8 sleep_state, u32 pm1a_ctrl,
+				       u32 pm1b_ctrl);
+
+acpi_status acpi_os_prepare_sleep(u8 sleep_state, u32 pm1a_control,
+		u32 pm1b_control)
+{
+	if (__acpi_os_prepare_sleep)
+		return __acpi_os_prepare_sleep(sleep_state, pm1a_control,
+					       pm1b_control);
+	else
+		return	AE_OK;
+}
+
+void acpi_os_prepare_sleep_register(acpi_status (*func)(u8 sleep_state,
+		 u32 pm1a_ctrl,	u32 pm1b_ctrl))
+{
+	__acpi_os_prepare_sleep = func;
+}
diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h
index 83062ed..ebde1e1 100644
--- a/include/acpi/acpiosxf.h
+++ b/include/acpi/acpiosxf.h
@@ -108,6 +108,12 @@ void acpi_os_delete_lock(acpi_spinlock handle);
 
 acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock handle);
 
+void acpi_os_prepare_sleep_register(acpi_status (*func)(u8 sleep_state,
+				    u32 pm1a_ctrl, u32 pm1b_ctrl));
+
+acpi_status acpi_os_prepare_sleep(u8 sleep_state, u32 pm1a_control,
+				  u32 pm1b_control);
+
 void acpi_os_release_lock(acpi_spinlock handle, acpi_cpu_flags flags);
 
 /*
diff --git a/include/linux/tboot.h b/include/linux/tboot.h
index 1dba6ee..d57732d 100644
--- a/include/linux/tboot.h
+++ b/include/linux/tboot.h
@@ -143,7 +143,6 @@ static inline int tboot_enabled(void)
 
 extern void tboot_probe(void);
 extern void tboot_shutdown(u32 shutdown_type);
-extern void tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control);
 extern struct acpi_table_header *tboot_get_dmar_table(
 				      struct acpi_table_header *dmar_tbl);
 extern int tboot_force_iommu(void);
@@ -153,8 +152,6 @@ extern int tboot_force_iommu(void);
 #define tboot_enabled()			0
 #define tboot_probe()			do { } while (0)
 #define tboot_shutdown(shutdown_type)	do { } while (0)
-#define tboot_sleep(sleep_state, pm1a_control, pm1b_control)	\
-					do { } while (0)
 #define tboot_get_dmar_table(dmar_tbl)	(dmar_tbl)
 #define tboot_force_iommu()		0
 
-- 
1.7.7.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 13:37:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 13:37:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQQh5-0008Lq-Sn; Tue, 15 Nov 2011 13:37:27 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQQcI-0006We-8B
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 13:32:31 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1321392745!3666393!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13984 invoked from network); 15 Nov 2011 21:32:27 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-4.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 15 Nov 2011 21:32:27 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAFLVlgW008482
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 15 Nov 2011 21:31:48 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAFLVkPh014562
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 15 Nov 2011 21:31:46 GMT
Received: from abhmt118.oracle.com (abhmt118.oracle.com [141.146.116.70])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAFLVert025117; Tue, 15 Nov 2011 15:31:40 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 15 Nov 2011 13:31:40 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id C0DFC8283F; Tue, 15 Nov 2011 16:31:38 -0500 (EST)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, rjw@sisk.pl, tglx@linutronix.de,
	x86@kernel.org, hpa@zytor.com, len.brown@intel.com,
	joseph.cihula@intel.com, linux-pm@lists.linux-foundation.org,
	tboot-devel@lists.sourceforge.net, linux-acpi@vger.kernel.org,
	liang.tang@oracle.com
Date: Tue, 15 Nov 2011 16:31:06 -0500
Message-Id: <1321392671-9128-3-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.7.1
In-Reply-To: <1321392671-9128-1-git-send-email-konrad.wilk@oracle.com>
References: <1321392671-9128-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090203.4EC2DA45.0038,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 2/7] tboot: Add return values for tboot_sleep
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

. as appropiately. As tboot_sleep now returns values, we are free
to remove the tboot_sleep_wrapper function altogether.

Suggested-by: "Rafael J. Wysocki" <rjw@sisk.pl>
CC: Joseph Cihula <joseph.cihula@intel.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 arch/x86/kernel/tboot.c |   11 +++++++----
 1 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kernel/tboot.c b/arch/x86/kernel/tboot.c
index 751d673..5ab5362 100644
--- a/arch/x86/kernel/tboot.c
+++ b/arch/x86/kernel/tboot.c
@@ -273,7 +273,8 @@ static void tboot_copy_fadt(const struct acpi_table_fadt *fadt)
 		offsetof(struct acpi_table_facs, firmware_waking_vector);
 }
 
-void tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control)
+static acpi_status tboot_sleep(u8 sleep_state, u32 pm1a_control,
+			       u32 pm1b_control)
 {
 	static u32 acpi_shutdown_map[ACPI_S_STATE_COUNT] = {
 		/* S0,1,2: */ -1, -1, -1,
@@ -282,7 +283,7 @@ void tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control)
 		/* S5: */ TB_SHUTDOWN_S5 };
 
 	if (!tboot_enabled())
-		return;
+		return AE_OK;
 
 	tboot_copy_fadt(&acpi_gbl_FADT);
 	tboot->acpi_sinfo.pm1a_cnt_val = pm1a_control;
@@ -293,10 +294,12 @@ void tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control)
 	if (sleep_state >= ACPI_S_STATE_COUNT ||
 	    acpi_shutdown_map[sleep_state] == -1) {
 		pr_warning("unsupported sleep state 0x%x\n", sleep_state);
-		return;
+		return AE_ERROR;
 	}
 
 	tboot_shutdown(acpi_shutdown_map[sleep_state]);
+
+	return AE_OK;
 }
 static acpi_status tboot_sleep_wrapper(u8 sleep_state, u32 pm1a_control,
 		u32 pm1b_control)
@@ -353,7 +356,7 @@ static __init int tboot_late_init(void)
 	atomic_set(&ap_wfs_count, 0);
 	register_hotcpu_notifier(&tboot_cpu_notifier);
 
-	acpi_os_prepare_sleep_register(&tboot_sleep_wrapper);
+	acpi_os_prepare_sleep_register(&tboot_sleep);
 	return 0;
 }
 
-- 
1.7.7.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 13:38:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 13:38:16 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQQhr-0000He-Td; Tue, 15 Nov 2011 13:38:15 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQQcK-0006X6-4I
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 13:32:32 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1321392747!1703486!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18032 invoked from network); 15 Nov 2011 21:32:28 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-7.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 15 Nov 2011 21:32:28 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAFLVlZu004898
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 15 Nov 2011 21:31:48 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAFLVlYj015529
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 15 Nov 2011 21:31:47 GMT
Received: from abhmt106.oracle.com (abhmt106.oracle.com [141.146.116.58])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAFLVfoO025138; Tue, 15 Nov 2011 15:31:41 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 15 Nov 2011 13:31:41 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id E50E982842; Tue, 15 Nov 2011 16:31:38 -0500 (EST)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, rjw@sisk.pl, tglx@linutronix.de,
	x86@kernel.org, hpa@zytor.com, len.brown@intel.com,
	joseph.cihula@intel.com, linux-pm@lists.linux-foundation.org,
	tboot-devel@lists.sourceforge.net, linux-acpi@vger.kernel.org,
	liang.tang@oracle.com
Date: Tue, 15 Nov 2011 16:31:09 -0500
Message-Id: <1321392671-9128-6-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.7.1
In-Reply-To: <1321392671-9128-1-git-send-email-konrad.wilk@oracle.com>
References: <1321392671-9128-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090205.4EC2DA45.002F,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 5/7] xen/pci: Utilize the restore_msi_irqs hook.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Tang Liang <liang.tang@oracle.com>

to make a hypercall to restore the vectors in the MSI/MSI-X
configuration space.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 arch/x86/pci/xen.c              |   27 +++++++++++++++++++++++++++
 include/xen/interface/physdev.h |    7 +++++++
 2 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c
index 492ade8..249a5ae 100644
--- a/arch/x86/pci/xen.c
+++ b/arch/x86/pci/xen.c
@@ -324,6 +324,32 @@ static int xen_initdom_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
 out:
 	return ret;
 }
+
+static void xen_initdom_restore_msi_irqs(struct pci_dev *dev, int irq)
+{
+	int ret = 0;
+
+	if (pci_seg_supported) {
+		struct physdev_pci_device restore_ext;
+
+		restore_ext.seg = pci_domain_nr(dev->bus);
+		restore_ext.bus = dev->bus->number;
+		restore_ext.devfn = dev->devfn;
+		ret = HYPERVISOR_physdev_op(PHYSDEVOP_restore_msi_ext,
+					&restore_ext);
+		if (ret == -ENOSYS)
+			pci_seg_supported = false;
+		WARN(ret && ret != -ENOSYS, "restore_msi_ext -> %d\n", ret);
+	}
+	if (!pci_seg_supported) {
+		struct physdev_restore_msi restore;
+
+		restore.bus = dev->bus->number;
+		restore.devfn = dev->devfn;
+		ret = HYPERVISOR_physdev_op(PHYSDEVOP_restore_msi, &restore);
+		WARN(ret && ret != -ENOSYS, "restore_msi -> %d\n", ret);
+	}
+}
 #endif
 
 static void xen_teardown_msi_irqs(struct pci_dev *dev)
@@ -446,6 +472,7 @@ int __init pci_xen_initial_domain(void)
 #ifdef CONFIG_PCI_MSI
 	x86_msi.setup_msi_irqs = xen_initdom_setup_msi_irqs;
 	x86_msi.teardown_msi_irq = xen_teardown_msi_irq;
+	x86_msi.restore_msi_irqs = xen_initdom_restore_msi_irqs;
 #endif
 	xen_setup_acpi_sci();
 	__acpi_register_gsi = acpi_register_gsi_xen;
diff --git a/include/xen/interface/physdev.h b/include/xen/interface/physdev.h
index c1080d9..0c28989 100644
--- a/include/xen/interface/physdev.h
+++ b/include/xen/interface/physdev.h
@@ -145,6 +145,13 @@ struct physdev_manage_pci {
 	uint8_t devfn;
 };
 
+#define PHYSDEVOP_restore_msi            19
+struct physdev_restore_msi {
+	/* IN */
+	uint8_t bus;
+	uint8_t devfn;
+};
+
 #define PHYSDEVOP_manage_pci_add_ext	20
 struct physdev_manage_pci_ext {
 	/* IN */
-- 
1.7.7.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 13:39:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 13:39:20 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQQiu-0000fy-Mh; Tue, 15 Nov 2011 13:39:20 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQQcJ-0006Wn-0N
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 13:32:31 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1321392746!4258424!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6059 invoked from network); 15 Nov 2011 21:32:27 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-9.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 15 Nov 2011 21:32:27 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAFLVmuE008485
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 15 Nov 2011 21:31:48 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAFLVlfK016969
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 15 Nov 2011 21:31:47 GMT
Received: from abhmt102.oracle.com (abhmt102.oracle.com [141.146.116.54])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAFLVgFk012027; Tue, 15 Nov 2011 15:31:42 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 15 Nov 2011 13:31:41 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 0806D82844; Tue, 15 Nov 2011 16:31:39 -0500 (EST)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, rjw@sisk.pl, tglx@linutronix.de,
	x86@kernel.org, hpa@zytor.com, len.brown@intel.com,
	joseph.cihula@intel.com, linux-pm@lists.linux-foundation.org,
	tboot-devel@lists.sourceforge.net, linux-acpi@vger.kernel.org,
	liang.tang@oracle.com
Date: Tue, 15 Nov 2011 16:31:11 -0500
Message-Id: <1321392671-9128-8-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.7.1
In-Reply-To: <1321392671-9128-1-git-send-email-konrad.wilk@oracle.com>
References: <1321392671-9128-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090203.4EC2DA45.003D,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 7/7] xen/acpi/sleep: Register to the
	acpi_suspend_lowlevel a callback.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

We piggyback on "x86/acpi: Provide registration for acpi_suspend_lowlevel."
to register a Xen version of the callback. The callback does not
do anything special - except it omits the x86_acpi_suspend_lowlevel.
It does that b/c during suspend it tries to save cr8 values (which
the hypervisor does not support), and then on resume path the
cr3, cr8, idt, and gdt are all resumed which clashes with what
the hypervisor has set up for the guest.

Signed-off-by: Liang Tang <liang.tang@oracle.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 include/xen/acpi.h |   17 ++++++++++++++++-
 1 files changed, 16 insertions(+), 1 deletions(-)

diff --git a/include/xen/acpi.h b/include/xen/acpi.h
index 69a6890..832b5e5 100644
--- a/include/xen/acpi.h
+++ b/include/xen/acpi.h
@@ -44,11 +44,26 @@
 acpi_status xen_acpi_notify_hypervisor_state(u8 sleep_state,
 				     u32 pm1a_cnt, u32 pm1b_cnd);
 
+static inline int xen_acpi_suspend_lowlevel(void)
+{
+	/*
+	* Xen will save and restore CPU context, so
+	* we can skip that and just go straight to
+	* the suspend.
+	*/
+	acpi_enter_sleep_state(ACPI_STATE_S3);
+	return 0;
+}
+
+
 static inline void xen_acpi_sleep_register(void)
 {
-	if (xen_initial_domain())
+	if (xen_initial_domain()){
 		acpi_os_prepare_sleep_register(
 			&xen_acpi_notify_hypervisor_state);
+
+		acpi_suspend_lowlevel = xen_acpi_suspend_lowlevel;
+	}
 }
 #else
 static inline void xen_acpi_sleep_register(void)
-- 
1.7.7.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 13:40:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 13:40:41 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQQkD-00013i-3a; Tue, 15 Nov 2011 13:40:41 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQQcK-0006XB-Fe
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 13:32:32 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1321392717!57366503!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5960 invoked from network); 15 Nov 2011 21:31:58 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-6.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 15 Nov 2011 21:31:58 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAFLVlFc004891
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 15 Nov 2011 21:31:48 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAFLVkdZ014574
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 15 Nov 2011 21:31:47 GMT
Received: from abhmt115.oracle.com (abhmt115.oracle.com [141.146.116.67])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAFLVeqg029043; Tue, 15 Nov 2011 15:31:40 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 15 Nov 2011 13:31:40 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id D9E6D82841; Tue, 15 Nov 2011 16:31:38 -0500 (EST)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, rjw@sisk.pl, tglx@linutronix.de,
	x86@kernel.org, hpa@zytor.com, len.brown@intel.com,
	joseph.cihula@intel.com, linux-pm@lists.linux-foundation.org,
	tboot-devel@lists.sourceforge.net, linux-acpi@vger.kernel.org,
	liang.tang@oracle.com
Date: Tue, 15 Nov 2011 16:31:08 -0500
Message-Id: <1321392671-9128-5-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.7.1
In-Reply-To: <1321392671-9128-1-git-send-email-konrad.wilk@oracle.com>
References: <1321392671-9128-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090209.4EC2DA45.006B,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 4/7] x86: Expand the x86_msi_ops to have a
	restore MSIs.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

The MSI restore function will become a function pointer in an
x86_msi_ops struct. It defaults to the implementation in the
io_apic.c and msi.c. We piggyback on the indirection mechanism
introduced by "x86: Introduce x86_msi_ops".

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 arch/x86/include/asm/pci.h      |    9 +++++++++
 arch/x86/include/asm/x86_init.h |    1 +
 arch/x86/kernel/x86_init.c      |    1 +
 drivers/pci/msi.c               |   29 +++++++++++++++++++++++++++--
 4 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h
index d498943..df75d07 100644
--- a/arch/x86/include/asm/pci.h
+++ b/arch/x86/include/asm/pci.h
@@ -112,19 +112,28 @@ static inline void x86_teardown_msi_irq(unsigned int irq)
 {
 	x86_msi.teardown_msi_irq(irq);
 }
+static inline void x86_restore_msi_irqs(struct pci_dev *dev, int irq)
+{
+	x86_msi.restore_msi_irqs(dev, irq);
+}
 #define arch_setup_msi_irqs x86_setup_msi_irqs
 #define arch_teardown_msi_irqs x86_teardown_msi_irqs
 #define arch_teardown_msi_irq x86_teardown_msi_irq
+#define arch_restore_msi_irqs x86_restore_msi_irqs
 /* implemented in arch/x86/kernel/apic/io_apic. */
 int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
 void native_teardown_msi_irq(unsigned int irq);
+void native_restore_msi_irqs(struct pci_dev *dev, int irq);
 /* default to the implementation in drivers/lib/msi.c */
 #define HAVE_DEFAULT_MSI_TEARDOWN_IRQS
+#define HAVE_DEFAULT_MSI_RESTORE_IRQS
 void default_teardown_msi_irqs(struct pci_dev *dev);
+void default_restore_msi_irqs(struct pci_dev *dev, int irq);
 #else
 #define native_setup_msi_irqs		NULL
 #define native_teardown_msi_irq		NULL
 #define default_teardown_msi_irqs	NULL
+#define default_restore_msi_irqs	NULL
 #endif
 
 #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys)
diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h
index d3d8590..7af18be 100644
--- a/arch/x86/include/asm/x86_init.h
+++ b/arch/x86/include/asm/x86_init.h
@@ -174,6 +174,7 @@ struct x86_msi_ops {
 	int (*setup_msi_irqs)(struct pci_dev *dev, int nvec, int type);
 	void (*teardown_msi_irq)(unsigned int irq);
 	void (*teardown_msi_irqs)(struct pci_dev *dev);
+	void (*restore_msi_irqs)(struct pci_dev *dev, int irq);
 };
 
 extern struct x86_init_ops x86_init;
diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c
index 6f164bd..bd1fe10 100644
--- a/arch/x86/kernel/x86_init.c
+++ b/arch/x86/kernel/x86_init.c
@@ -110,4 +110,5 @@ struct x86_msi_ops x86_msi = {
 	.setup_msi_irqs = native_setup_msi_irqs,
 	.teardown_msi_irq = native_teardown_msi_irq,
 	.teardown_msi_irqs = default_teardown_msi_irqs,
+	.restore_msi_irqs = default_restore_msi_irqs,
 };
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 0e6d04d..ba2ea4e 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -86,6 +86,31 @@ void default_teardown_msi_irqs(struct pci_dev *dev)
 }
 #endif
 
+#ifndef arch_restore_msi_irqs
+# define arch_restore_msi_irqs default_restore_msi_irqs
+# define HAVE_DEFAULT_MSI_RESTORE_IRQS
+#endif
+
+#ifdef HAVE_DEFAULT_MSI_RESTORE_IRQS
+void default_restore_msi_irqs(struct pci_dev *dev, int irq)
+{
+	struct msi_desc *entry;
+
+	entry = NULL;
+	if (dev->msix_enabled) {
+		list_for_each_entry(entry, &dev->msi_list, list) {
+			if (irq == entry->irq)
+				break;
+		}
+	} else if (dev->msi_enabled)  {
+		entry = irq_get_msi_desc(irq);
+	}
+
+	if (entry)
+		write_msi_msg(irq, &entry->msg);
+}
+#endif
+
 static void msi_set_enable(struct pci_dev *dev, int pos, int enable)
 {
 	u16 control;
@@ -360,7 +385,7 @@ static void __pci_restore_msi_state(struct pci_dev *dev)
 
 	pci_intx_for_msi(dev, 0);
 	msi_set_enable(dev, pos, 0);
-	write_msi_msg(dev->irq, &entry->msg);
+	arch_restore_msi_irqs(dev, dev->irq);
 
 	pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &control);
 	msi_mask_irq(entry, msi_capable_mask(control), entry->masked);
@@ -388,7 +413,7 @@ static void __pci_restore_msix_state(struct pci_dev *dev)
 	pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control);
 
 	list_for_each_entry(entry, &dev->msi_list, list) {
-		write_msi_msg(entry->irq, &entry->msg);
+		arch_restore_msi_irqs(dev, entry->irq);
 		msix_mask_irq(entry, entry->masked);
 	}
 
-- 
1.7.7.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 16:09:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 16:09:59 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQT4g-0006as-Uv; Tue, 15 Nov 2011 16:09:58 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQT3f-0006O3-SP
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 16:08:56 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1321402132!1712835!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9701 invoked from network); 16 Nov 2011 00:08:52 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 00:08:52 -0000
X-IronPort-AV: E=Sophos;i="4.69,517,1315180800"; 
   d="scan'208";a="8952627"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 00:08:52 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 16 Nov 2011 00:08:51 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RQT3b-0001dX-MS;
	Wed, 16 Nov 2011 00:08:51 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RQT3b-0001y0-HL;
	Wed, 16 Nov 2011 00:08:51 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9802-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 16 Nov 2011 00:08:51 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9802: tolerable FAIL - PUSHED
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9802 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9802/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  fd3567cafe1c
baseline version:
 xen                  848049b14ec7

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Ian Campbell <ian.campbell@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     pass    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Pushing revision :

+ branch=xen-unstable
+ revision=fd3567cafe1c
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x '!=' x/export/home/osstest/repos/lock ']'
++ OSSTEST_REPOS_LOCK_LOCKED=/export/home/osstest/repos/lock
++ exec with-lock-ex -w /export/home/osstest/repos/lock ./ap-push xen-unstable fd3567cafe1c
+ branch=xen-unstable
+ revision=fd3567cafe1c
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x/export/home/osstest/repos/lock '!=' x/export/home/osstest/repos/lock ']'
+ : xen@xenbits.xensource.com
+ : xen@xenbits.xensource.com:git/linux-pvops
+ : master
+ : tested/2.6.39.x
+ case "$branch" in
+ cd /export/home/osstest/repos/xen-unstable.hg
+ hg push -r fd3567cafe1c ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
pushing to ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 3 changesets with 41 changes to 41 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Nov 15 17:19:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 17:19:22 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQU9q-0008Vj-39; Tue, 15 Nov 2011 17:19:22 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQNUZ-0000kO-3g
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 10:12:20 -0800
X-Env-Sender: jethomas100@gmail.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1321380734!4323276!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22844 invoked from network); 15 Nov 2011 18:12:15 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-15.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Nov 2011 18:12:15 -0000
Received: by iaby12 with SMTP id y12so7761730iab.30
	for <xen-devel@lists.xensource.com>;
	Tue, 15 Nov 2011 10:12:14 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=Bq4Q7jdlTcAm1Kd94A+AYAsEZYiFLd6LrZWuqeg7ivY=;
	b=X92wOp0+HOBNSXGj9pBfv0Q55Cmxxhi8aMmuGdY4pmJ2ySyILTPqrxRzh8qRs0hOEc
	IcuDv6jptQ1br6lGofdkV5MILhHkLdxPcgstpfImkS8zldtm9fNX04q4Tt9A5yvgAMcW
	oxTgZ4bEy+vyz+rYc8rmnpvocvBFNpEKeaBbA=
MIME-Version: 1.0
Received: by 10.50.88.199 with SMTP id bi7mr29132127igb.45.1321380734268; Tue,
	15 Nov 2011 10:12:14 -0800 (PST)
Received: by 10.50.186.195 with HTTP; Tue, 15 Nov 2011 10:12:14 -0800 (PST)
Date: Tue, 15 Nov 2011 10:12:14 -0800
Message-ID: <CABKwQ+pT7LFqmnfGoK5YVsmzqomYjnA6t0jr=RyTVoTjFUDNLw@mail.gmail.com>
From: Jason Thomas <jethomas100@gmail.com>
To: xen-devel@lists.xensource.com
X-Mailman-Approved-At: Tue, 15 Nov 2011 17:18:26 -0800
Subject: [Xen-devel] VMM Architecture documentation
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1943635598=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1943635598==
Content-Type: multipart/alternative; boundary=e89a8f3ba0db47762504b1c9eda2

--e89a8f3ba0db47762504b1c9eda2
Content-Type: text/plain; charset=ISO-8859-1

I am looking for a low level description of the VMM architecture, if one
exists. Specifically which modules are required for 32 bit guests and which
are needed for 64 bit guests. Does this exist or do I have to sift through
the source code to find the differences?

--e89a8f3ba0db47762504b1c9eda2
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

I am looking for a low level description of the VMM architecture, if one ex=
ists. Specifically which modules are required for 32 bit guests and which a=
re needed for 64 bit guests. Does this exist or do I have to sift through t=
he source code to find the differences?<br>

--e89a8f3ba0db47762504b1c9eda2--


--===============1943635598==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1943635598==--


From xen-devel-bounces@lists.xensource.com Tue Nov 15 17:20:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 17:20:30 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQUAw-0000Rg-CN; Tue, 15 Nov 2011 17:20:30 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQODQ-0001TH-Ar
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 10:58:46 -0800
X-Env-Sender: jthomas@islinc.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1321383514!2347598!1
X-Originating-IP: [67.192.241.121]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18802 invoked from network); 15 Nov 2011 18:58:35 -0000
Received: from smtp121.dfw.emailsrvr.com (HELO smtp121.dfw.emailsrvr.com)
	(67.192.241.121)
	by server-13.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 15 Nov 2011 18:58:35 -0000
Received: from smtp22.relay.dfw1a.emailsrvr.com (localhost.localdomain
	[127.0.0.1])
	by smtp22.relay.dfw1a.emailsrvr.com (SMTP Server) with ESMTP id
	36A69170202 for <xen-devel@lists.xensource.com>;
	Tue, 15 Nov 2011 13:58:34 -0500 (EST)
X-SMTPDoctor-Processed: csmtpprox 2.7.4
Received: from localhost (localhost.localdomain [127.0.0.1])
	by smtp22.relay.dfw1a.emailsrvr.com (SMTP Server) with ESMTP id
	34B3F1701FB for <xen-devel@lists.xensource.com>;
	Tue, 15 Nov 2011 13:58:34 -0500 (EST)
X-Virus-Scanned: OK
Received: by smtp22.relay.dfw1a.emailsrvr.com (Authenticated sender:
	jthomas-AT-islinc.com) with ESMTPSA id E893B1701F9
	for <xen-devel@lists.xensource.com>;
	Tue, 15 Nov 2011 13:58:33 -0500 (EST)
From: "Jason Thomas" <jthomas@islinc.com>
To: <xen-devel@lists.xensource.com>
Date: Tue, 15 Nov 2011 10:58:34 -0800
Message-ID: <007d01cca3c8$93abd380$bb037a80$@com>
MIME-Version: 1.0
X-Mailer: Microsoft Office Outlook 12.0
Thread-Index: AcyjyJMAJiz/HFmDSFeRQKhkpwqmdg==
Content-Language: en-us
X-Mailman-Approved-At: Tue, 15 Nov 2011 17:18:26 -0800
Subject: [Xen-devel] VMM Architecture documentation
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1442173503=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.

--===============1442173503==
Content-Type: multipart/alternative;
	boundary="----=_NextPart_000_007E_01CCA385.85889380"
Content-Language: en-us

This is a multi-part message in MIME format.

------=_NextPart_000_007E_01CCA385.85889380
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: 7bit

I am looking for a low level description of the VMM architecture, if one
exists. Specifically which modules are required for 32 bit guests and which
are needed for 64 bit guests. Does this exist or do I have to sift through
the source code to find the differences?

 

Jason



CONFIDENTIALITY NOTICE: This e-mail message, including any attachments, is for the sole use of the intended recipient(s) and may contain confidential and privileged information. Any unauthorized review, use, disclosure or distribution is prohibited. If you are not the intended recipient, please contact the sender by reply e-mail and destroy all copies of the original message.
------=_NextPart_000_007E_01CCA385.85889380
Content-Type: text/html;
	charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

<html xmlns:v=3D"urn:schemas-microsoft-com:vml" xmlns:o=3D"urn:schemas-micr=
osoft-com:office:office" xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
xmlns:m=3D"http://schemas.microsoft.com/office/2004/12/omml" xmlns=3D"http:=
//www.w3.org/TR/REC-html40"><head><META HTTP-EQUIV=3D"Content-Type" CONTENT=
=3D"text/html; charset=3Dus-ascii"><meta name=3DGenerator content=3D"Micros=
oft Word 12 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0in;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
	{mso-style-priority:99;
	color:blue;
	text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
	{mso-style-priority:99;
	color:purple;
	text-decoration:underline;}
span.EmailStyle17
	{mso-style-type:personal-compose;
	font-family:"Calibri","sans-serif";
	color:windowtext;}
..MsoChpDefault
	{mso-style-type:export-only;}
@page WordSection1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
	{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext=3D"edit" spidmax=3D"1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext=3D"edit">
<o:idmap v:ext=3D"edit" data=3D"1" />
</o:shapelayout></xml><![endif]--></head><body lang=3DEN-US link=3Dblue vli=
nk=3Dpurple><div class=3DWordSection1><p class=3DMsoNormal>I am looking for=
 a low level description of the VMM architecture, if one exists. Specifical=
ly which modules are required for 32 bit guests and which are needed for 64=
 bit guests. Does this exist or do I have to sift through the source code t=
o find the differences?<o:p></o:p></p><p class=3DMsoNormal><o:p>&nbsp;</o:p=
></p><p class=3DMsoNormal>Jason<o:p></o:p></p></div>
</P><BR>
<P><SPAN lang=3Dzh-cn><FONT face=3DGaramond size=3D2><STRONG>CONFIDENTIALIT=
Y 
NOTICE:</STRONG>This e-mail message, including any attachments, is for the =
sole use of the intended recipient(s) and may contain confidential and priv=
ileged information. Any unauthorized review, use, disclosure or distributio=
n is prohibited. If you are not the intended recipient, please contact the =
sender by reply e-mail and destroy all copies of the original message. 
</SPAN></FONT> 
</FONT></P></DIV>
<DIV dir=3Dltr align=3Dleft><BR></DIV></BODY></HTML>
</body></html>
------=_NextPart_000_007E_01CCA385.85889380--



--===============1442173503==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1442173503==--



From xen-devel-bounces@lists.xensource.com Tue Nov 15 19:41:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 19:41:24 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQWNI-0004TL-Ai; Tue, 15 Nov 2011 19:41:24 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQWMW-0004Go-Ev
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 19:40:36 -0800
X-Env-Sender: superwushu@gmail.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1321414831!3290268!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12729 invoked from network); 16 Nov 2011 03:40:33 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 03:40:33 -0000
Received: by ggnk1 with SMTP id k1so4712277ggn.30
	for <xen-devel@lists.xensource.com>;
	Tue, 15 Nov 2011 19:40:31 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:from:date:message-id:subject:to:content-type;
	bh=TPO3S70lU+8y8Qqm4mDIo8cvLh9vtxGRIHtFddTkGFE=;
	b=vDDsEhmcGWqZjOHBfvLNjpWggL+SfwhRQ5vpPIyWtg8gnrMqsdBmfJnU86c20I1eZZ
	agTM/nCPJ5F1D+sGoGnmMly7WZqXdvTY8pp3OGb7VT2tNGU6kCmvGHv5dN+khrklNhuq
	6i2LY7lcHBqIEFTyf4eD1BjlZ1E4pG5cfCY7s=
Received: by 10.146.92.19 with SMTP id p19mr4436374yab.7.1321414831531; Tue,
	15 Nov 2011 19:40:31 -0800 (PST)
MIME-Version: 1.0
Received: by 10.147.38.6 with HTTP; Tue, 15 Nov 2011 19:40:07 -0800 (PST)
From: Shu Wu <superwushu@gmail.com>
Date: Wed, 16 Nov 2011 11:40:07 +0800
Message-ID: <CAJqfKE+psJxdOtLDag4x3KkVV6OysinSJbq8xYRGhv5_mEBL8w@mail.gmail.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] default value of extra_dom0_irqs
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0443428468=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0443428468==
Content-Type: multipart/alternative; boundary=000e0cd30338a265f104b1d1ddb7

--000e0cd30338a265f104b1d1ddb7
Content-Type: text/plain; charset=ISO-8859-1

Hi, folks, I have a question about the default number of PIRQs of Domain 0
in Xen 4.x. I encountered a problem that cciss.ko, the HP Smart Array
driver, freezed and had the system hanged at booting time. The server is HP
Proliant DL385G5p and run a CentOS 5.6 dom0 with Xen 4.1.1. However
everything goes well when with Xen 3.0.3 which CentOS had officially
integrated in. We upgraded to Xen 4.x so as to make use of Remus.

I debugged and guessed that an IRQ of the HP RAID controller missing but
could not figure out why. At last I compiled and tried and all revisions
from 3.4.3 (r19995) to 4.0.0 (r20789), using a binary search method in
about 10 times, and located some changes between r20142 and r20143 were the
point. The code changes were:

-static unsigned int extra_dom0_irqs, extra_domU_irqs = 8;
+static unsigned int extra_dom0_irqs = 256, extra_domU_irqs = 32;
 static void __init parse_extra_guest_irqs(const char *s)
 {
     if ( isdigit(*s) )
@@ -253,9 +253,11 @@
         d->is_paused_by_controller = 1;
         atomic_inc(&d->pause_count);

-        d->nr_pirqs = (nr_irqs_gsi +
-                       (domid ? extra_domU_irqs :
-                        extra_dom0_irqs ?: nr_irqs_gsi));
+        if ( domid )
+            d->nr_pirqs = nr_irqs_gsi + extra_domU_irqs;
+        else
+            d->nr_pirqs = nr_irqs_gsi + extra_dom0_irqs;

         d->pirq_to_evtchn = xmalloc_array(u16, d->nr_pirqs);
         d->pirq_mask = xmalloc_array(
             unsigned long, BITS_TO_LONGS(d->nr_pirqs));


In the changes I noticed the extra_dom0_irqs, which should be 0 by default
in r20142, was set to 256 in r20143, and caused default number of Dom0's
nr_pirq to exceed 256. Maybe this prevent IRQ of HP RAID controller, I
don't quite know about, though. After I set it to 32 (the same number as
extra_guest_irqs) the cciss.ko worked well. Although I could set this value
by "extra_guest_irqs=32,32" in boot param, there are still problem:
1. The argument for dom0 extra irqs, the one after the comma, is
undocumented.
2. What is the reason of the magic number 256 for Dom0, and 32 for DomU in
Xen 4.x by default? nr_irqs_gsi is only 16 on x64 arch, but the total
nr_pirq would be more than 256. The magic number still exists in the newest
code. This is bad hardcode and may cause very elusive fault for newbie
user, maybe you can have a better solution.

Cheers,

Wu Shu

--000e0cd30338a265f104b1d1ddb7
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hi, folks, I have a question about the default number of PIRQs of Domain 0 =
in Xen 4.x. I encountered a problem that cciss.ko, the HP Smart Array drive=
r, freezed and had the system hanged at booting time. The server is=A0HP Pr=
oliant DL385G5p and=A0run a CentOS 5.6 dom0 with Xen 4.1.1. However everyth=
ing goes well when with Xen 3.0.3 which CentOS had officially integrated in=
. We upgraded to Xen 4.x so as to make use of Remus.<div>

<br></div><div>I debugged and guessed that an IRQ of the HP RAID controller=
=A0missing=A0but could not figure out why. At last I=A0compiled and tried=
=A0and all revisions from 3.4.3 (r19995) to 4.0.0 (r20789), using a binary =
search method in about 10 times, and located some changes between r20142 an=
d r20143 were the point. The code changes were:</div>

<div><br></div><div><div><font class=3D"Apple-style-span" face=3D"&#39;cour=
ier new&#39;, monospace" style=3D"background-color: rgb(204, 204, 255);">-s=
tatic unsigned int extra_dom0_irqs, extra_domU_irqs =3D 8;</font></div><div=
><font class=3D"Apple-style-span" face=3D"&#39;courier new&#39;, monospace"=
 style=3D"background-color: rgb(204, 204, 255);">+static unsigned int extra=
_dom0_irqs =3D 256, extra_domU_irqs =3D 32;</font></div>

<div><font class=3D"Apple-style-span" face=3D"&#39;courier new&#39;, monosp=
ace">=A0static void __init parse_extra_guest_irqs(const char *s)</font></di=
v><div><font class=3D"Apple-style-span" face=3D"&#39;courier new&#39;, mono=
space">=A0{</font></div>

<div><font class=3D"Apple-style-span" face=3D"&#39;courier new&#39;, monosp=
ace">=A0 =A0 =A0if ( isdigit(*s) )</font></div><div><font class=3D"Apple-st=
yle-span" face=3D"&#39;courier new&#39;, monospace">@@ -253,9 +253,11 @@</f=
ont></div>

<div><font class=3D"Apple-style-span" face=3D"&#39;courier new&#39;, monosp=
ace">=A0 =A0 =A0 =A0 =A0d-&gt;is_paused_by_controller =3D 1;</font></div><d=
iv><font class=3D"Apple-style-span" face=3D"&#39;courier new&#39;, monospac=
e">=A0 =A0 =A0 =A0 =A0atomic_inc(&amp;d-&gt;pause_count);</font></div>

<div><font class=3D"Apple-style-span" face=3D"&#39;courier new&#39;, monosp=
ace">=A0</font></div><div><font class=3D"Apple-style-span" face=3D"&#39;cou=
rier new&#39;, monospace" style=3D"background-color: rgb(204, 204, 255);">-=
 =A0 =A0 =A0 =A0d-&gt;nr_pirqs =3D (nr_irqs_gsi +</font></div>

<div><font class=3D"Apple-style-span" face=3D"&#39;courier new&#39;, monosp=
ace" style=3D"background-color: rgb(204, 204, 255);">- =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0 (domid ? extra_domU_irqs :</font></div><div><font c=
lass=3D"Apple-style-span" face=3D"&#39;courier new&#39;, monospace" style=
=3D"background-color: rgb(204, 204, 255);">- =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0extra_dom0_irqs ?: nr_irqs_gsi));</font></div>

<div><font class=3D"Apple-style-span" face=3D"&#39;courier new&#39;, monosp=
ace" style=3D"background-color: rgb(204, 204, 255);">+ =A0 =A0 =A0 =A0if ( =
domid )</font></div><div><font class=3D"Apple-style-span" face=3D"&#39;cour=
ier new&#39;, monospace" style=3D"background-color: rgb(204, 204, 255);">+ =
=A0 =A0 =A0 =A0 =A0 =A0d-&gt;nr_pirqs =3D nr_irqs_gsi + extra_domU_irqs;</f=
ont></div>

<div><font class=3D"Apple-style-span" face=3D"&#39;courier new&#39;, monosp=
ace" style=3D"background-color: rgb(204, 204, 255);">+ =A0 =A0 =A0 =A0else<=
/font></div><div><font class=3D"Apple-style-span" face=3D"&#39;courier new&=
#39;, monospace" style=3D"background-color: rgb(204, 204, 255);">+ =A0 =A0 =
=A0 =A0 =A0 =A0d-&gt;nr_pirqs =3D nr_irqs_gsi + extra_dom0_irqs;</font></di=
v>

<div><font class=3D"Apple-style-span" face=3D"&#39;courier new&#39;, monosp=
ace"><br></font></div><div><font class=3D"Apple-style-span" face=3D"&#39;co=
urier new&#39;, monospace">=A0 =A0 =A0 =A0 =A0d-&gt;pirq_to_evtchn =3D xmal=
loc_array(u16, d-&gt;nr_pirqs);</font></div>

<div><font class=3D"Apple-style-span" face=3D"&#39;courier new&#39;, monosp=
ace">=A0 =A0 =A0 =A0 =A0d-&gt;pirq_mask =3D xmalloc_array(</font></div><div=
><font class=3D"Apple-style-span" face=3D"&#39;courier new&#39;, monospace"=
>=A0 =A0 =A0 =A0 =A0 =A0 =A0unsigned long, BITS_TO_LONGS(d-&gt;nr_pirqs));<=
/font></div>

</div><div><br></div><div><br></div><div>In the changes I noticed the extra=
_dom0_irqs, which should be 0 by default in r20142, was set to 256 in r2014=
3, and caused default number of Dom0&#39;s nr_pirq to exceed 256. Maybe thi=
s prevent IRQ of HP RAID controller, I don&#39;t quite know about, though. =
After I set it to 32 (the same number as extra_guest_irqs) the cciss.ko wor=
ked well. Although I could set this value by &quot;extra_guest_irqs=3D32,32=
&quot; in boot param, there are still problem:</div>

<div>1. The argument for dom0 extra irqs, the one after the comma, is undoc=
umented.</div><div>2. What is the reason of the magic number 256 for Dom0, =
and 32 for DomU in Xen 4.x by default? nr_irqs_gsi is only 16 on x64 arch, =
but the total nr_pirq would be more than 256. The magic number still exists=
 in the newest code. This is bad hardcode and may cause very elusive fault =
for newbie user, maybe you can have a better solution.</div>

<div><br></div><div>Cheers,</div><div><br></div><div>Wu Shu</div><div><br><=
/div><div><br></div>

--000e0cd30338a265f104b1d1ddb7--


--===============0443428468==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0443428468==--


From xen-devel-bounces@lists.xensource.com Tue Nov 15 20:54:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 15 Nov 2011 20:54:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQXVy-00061W-MI; Tue, 15 Nov 2011 20:54:26 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQXVA-0005oz-57
	for xen-devel@lists.xensource.com; Tue, 15 Nov 2011 20:53:37 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1321419212!4291982!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29977 invoked from network); 16 Nov 2011 04:53:32 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 04:53:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,519,1315180800"; 
   d="scan'208";a="8953570"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 04:53:32 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 16 Nov 2011 04:53:32 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RQXV5-0003CZ-My;
	Wed, 16 Nov 2011 04:53:31 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RQXV5-0001qZ-Dy;
	Wed, 16 Nov 2011 04:53:31 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9803-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 16 Nov 2011 04:53:31 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9803: tolerable FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9803 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9803/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf      5 xen-boot                     fail pass in 9802

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  fd3567cafe1c
baseline version:
 xen                  fd3567cafe1c

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Published tested tree is already up to date.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 04:35:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 04:35:39 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQeiJ-0007hV-5P; Wed, 16 Nov 2011 04:35:39 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQehU-0007US-16
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 04:34:48 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1321446884!1792216!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22545 invoked from network); 16 Nov 2011 12:34:45 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-7.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 16 Nov 2011 12:34:45 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 16 Nov 2011 11:52:56 +0000
Message-Id: <4EC3B2270200007800061469@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 
Date: Wed, 16 Nov 2011 11:52:55 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Shu Wu" <superwushu@gmail.com>
Subject: Re: [Xen-devel] default value of extra_dom0_irqs
References: <CAJqfKE+psJxdOtLDag4x3KkVV6OysinSJbq8xYRGhv5_mEBL8w@mail.gmail.com>
In-Reply-To: <CAJqfKE+psJxdOtLDag4x3KkVV6OysinSJbq8xYRGhv5_mEBL8w@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 16.11.11 at 04:40, Shu Wu <superwushu@gmail.com> wrote:
> In the changes I noticed the extra_dom0_irqs, which should be 0 by =
default
> in r20142, was set to 256 in r20143, and caused default number of Dom0's
> nr_pirq to exceed 256. Maybe this prevent IRQ of HP RAID controller, I
> don't quite know about, though. After I set it to 32 (the same number as
> extra_guest_irqs) the cciss.ko worked well. Although I could set this =
value
> by "extra_guest_irqs=3D32,32" in boot param, there are still problem:

That would hint at the IRQ number (presumably an MSI one) getting
stored in too narrow a field somewhere in the kernel.

> 1. The argument for dom0 extra irqs, the one after the comma, is
> undocumented.

Feel free to submit a patch to update the respective documentation.
But for your purpose you don't even need the second value afaiu.

> 2. What is the reason of the magic number 256 for Dom0, and 32 for DomU =
in
> Xen 4.x by default?

They're not magic in any way; if they're found to be too small for a
significant portion of systems, they could get bumped (but not
lowered).

> nr_irqs_gsi is only 16 on x64 arch, but the total

That you speak of one particular system. Most that I work with have
larger values.

> nr_pirq would be more than 256. The magic number still exists in the =
newest
> code. This is bad hardcode and may cause very elusive fault for newbie
> user, maybe you can have a better solution.

The problem is that we can't judge reasonable for everyone values
here. As long as they serve a majority, we're fine with requiring the
few remaining systems to be run with a command line override.

Speaking of which, one option possible after work that happened over
the last couple of months would be to get rid of ->nr_pirqs altogether,
using nr_irqs again instead. That would make things only worse for your
case though, as you wouldn't then have a way to override the system
determined values.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 04:47:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 04:47:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQetV-0008He-IL; Wed, 16 Nov 2011 04:47:13 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQese-00084l-VA
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 04:46:21 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1321443976!4337012!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27886 invoked from network); 16 Nov 2011 11:46:18 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-9.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 11:46:18 -0000
X-IronPort-AV: E=Sophos;i="4.69,520,1315195200"; d="scan'208";a="170792716"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 06:46:15 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.66) with Microsoft SMTP Server id
	8.3.137.0; Wed, 16 Nov 2011 06:46:16 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pAGBjemD021849;
	Wed, 16 Nov 2011 03:46:07 -0800
From: <stefano.stabellini@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Wed, 16 Nov 2011 11:46:33 +0000
Message-ID: <1321443993-8724-1-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
MIME-Version: 1.0
Content-Type: text/plain
Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>, keir@xen.org,
	Stefano.Stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH v2] xen: introduce HVM_PARAM_BUFIOREQ_EVTCHN
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Introduce an event channel for buffered io event notifications,
advertise the port number using an hvm param.
This way the device model is not forced to check the buffered io page
for data several times a second for the entire life of the VM (buffered
io is mostly used for stdvga emulation in Xen that is switched off after
the guest goes into graphical mode).


Changes in v2:

- return -EINVAL to callers that try to set HVM_PARAM_BUFIOREQ_EVTCHN
from outside the hypervisor.


Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 xen/arch/x86/hvm/hvm.c          |   13 +++++++++++++
 xen/arch/x86/hvm/io.c           |    2 ++
 xen/include/public/hvm/params.h |    3 ++-
 3 files changed, 17 insertions(+), 1 deletions(-)

diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index ab7763b..86627f6 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -972,6 +972,16 @@ int hvm_vcpu_initialise(struct vcpu *v)
 
     /* Register ioreq event channel. */
     v->arch.hvm_vcpu.xen_port = rc;
+
+    if ( v->vcpu_id == 0 )
+    {
+        /* Create bufioreq event channel. */
+        rc = alloc_unbound_xen_event_channel(v, 0);
+        if ( rc < 0 )
+            goto fail2;
+        v->domain->arch.hvm_domain.params[HVM_PARAM_BUFIOREQ_EVTCHN] = rc;
+    }
+
     spin_lock(&v->domain->arch.hvm_domain.ioreq.lock);
     if ( v->domain->arch.hvm_domain.ioreq.va != NULL )
         get_ioreq(v)->vp_eport = v->arch.hvm_vcpu.xen_port;
@@ -3543,6 +3553,9 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg)
                         if ( rc == 0 )
                             rc = nestedhvm_vcpu_initialise(v);
                 break;
+            case HVM_PARAM_BUFIOREQ_EVTCHN:
+                rc = -EINVAL;
+                break;
             }
 
             if ( rc == 0 ) 
diff --git a/xen/arch/x86/hvm/io.c b/xen/arch/x86/hvm/io.c
index 7ebefc7..41a2ede 100644
--- a/xen/arch/x86/hvm/io.c
+++ b/xen/arch/x86/hvm/io.c
@@ -118,6 +118,8 @@ int hvm_buffered_io_send(ioreq_t *p)
     wmb();
     pg->write_pointer += qw ? 2 : 1;
 
+    notify_via_xen_event_channel(v->domain,
+            v->domain->arch.hvm_domain.params[HVM_PARAM_BUFIOREQ_EVTCHN]);
     spin_unlock(&iorp->lock);
     
     return 1;
diff --git a/xen/include/public/hvm/params.h b/xen/include/public/hvm/params.h
index 1c5a1a9..6699788 100644
--- a/xen/include/public/hvm/params.h
+++ b/xen/include/public/hvm/params.h
@@ -52,6 +52,7 @@
 #define HVM_PARAM_IOREQ_PFN    5
 
 #define HVM_PARAM_BUFIOREQ_PFN 6
+#define HVM_PARAM_BUFIOREQ_EVTCHN 26
 
 #ifdef __ia64__
 
@@ -141,6 +142,6 @@
 /* Boolean: Enable nestedhvm (hvm only) */
 #define HVM_PARAM_NESTEDHVM    24
 
-#define HVM_NR_PARAMS          26
+#define HVM_NR_PARAMS          27
 
 #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */
-- 
1.7.2.3


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 04:56:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 04:56:53 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQf2q-0000U3-Nb; Wed, 16 Nov 2011 04:56:52 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQf23-0000GY-NS
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 04:56:04 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1321448159!3363685!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9546 invoked from network); 16 Nov 2011 12:56:00 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-9.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 16 Nov 2011 12:56:00 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAGCttLr023517
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 16 Nov 2011 12:55:55 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAGCtrHC007055
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 16 Nov 2011 12:55:53 GMT
Received: from abhmt105.oracle.com (abhmt105.oracle.com [141.146.116.57])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAGCtkYC004350; Wed, 16 Nov 2011 06:55:46 -0600
Received: from [221.220.250.42] (/221.220.250.42)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 16 Nov 2011 04:55:45 -0800
Message-ID: <4EC3B2CB.8030607@oracle.com>
Date: Wed, 16 Nov 2011 20:55:39 +0800
From: annie li <annie.li@oracle.com>
Organization: Oracle Corporation
User-Agent: Thunderbird 1.5.0.9 (Windows/20061207)
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	linux-kernel@vger.kernel.org,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, jeremy@goop.org
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090202.4EC3B2DC.005E,ss=1,re=0.000,fgs=0
Cc: Kurt Hackel <Kurt.Hackel@oracle.com>,
	Paul Durrant <paul.durrant@citrix.com>, Ian.Campbell@citrix.com
Subject: [Xen-devel] Improved patches of upstreaming grant table version 2
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1914037903=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============1914037903==
Content-Type: multipart/alternative;
	boundary="------------020502060500090308000905"

This is a multi-part message in MIME format.
--------------020502060500090308000905
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

Hi

The following patches introduce and implement grant table version 2. 
They are improved from my previous patches and based on v3.2.0-rc1+.

Descriptions for those patches:

1. In those patches, the grant table code supports both grant table v1 
and v2 version, v2 is an extension from v1. Grant table of guest domain 
can be either v1 or v2 version, and every grant table entry on one guest 
should be the same version.

2. Full page structure of grant table v2 play the same role as grant 
table v1. Although full page structure is different from v1, grant table 
2 is totally backwards compatible with v1. Grant table is shared between 
guest and Xen, domu and dom0 all have their own grant table shared with 
Xen, and their grant table version should be set before any grants are 
activated. When domu grants an entry to dom0 to map a frame, following 
are steps:
* domu introduces a grant entry by reference
* domu informs dom0 the gref
* dom0 sends hypercall to map frame through this reference, Xen copy 
shared entry to active entry and update frame
* dom0 does its work and release the frame, Xen releases the entry.
* domu redo those steps for a new cycle.

Xen mapping process can be found in function __gnttab_map_grant_ref in 
link: 
http://xenbits.xen.org/hg/xen-4.1-testing.hg/file/81e39a4978ea/xen/common/grant_table.c#l2172 


3. If dom0 supports grant table v2, guests run on it can either supports 
v1 or v2. Xen is responsible to judge what version the guests are using. 
This is implemented in link: 
http://xenbits.xen.org/hg/xen-4.1-testing.hg/file/81e39a4978ea/xen/common/grant_table.c#l2172. 
Key word is:  rd->grant_table->gt_version.

4. Grant table v2 has been supported by Xen for a long time, and receiver-side copying mechanism bases on this implementation. Netback and netfront driver can pick up this new feature to get better network performance and better CPU accounting.

Thanks
Annie

--------------020502060500090308000905
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body bgcolor="#ffffff" text="#000000">
<div class="moz-text-html" lang="x-unicode">
<div class="moz-text-flowed"
 style="font-family: -moz-fixed; font-size: 13px;" lang="x-unicode">Hi <br>
<br>
The following patches introduce and implement grant table version 2.
They are improved from my previous patches and based on v3.2.0-rc1+. <br>
<br>
Descriptions for those patches: <br>
<br>
1. In those patches, the grant table code supports both grant table v1
and v2 version, v2 is an extension from v1. Grant table of guest domain
can be either v1 or v2 version, and every grant table entry on one
guest should be the same version. <br>
<br>
2. Full page structure of grant table v2 play the same role as grant
table v1. Although full page structure is different from v1, grant
table 2 is totally backwards compatible with v1. Grant table is shared
between guest and Xen, domu and dom0 all have their own grant table
shared with Xen, and their grant table version should be set before any
grants are activated. When domu grants an entry to dom0 to map a frame,
following are steps: <br>
* domu introduces a grant entry by reference <br>
* domu informs dom0 the gref <br>
* dom0 sends hypercall to map frame through this reference, Xen copy
shared entry to active entry and update frame <br>
* dom0 does its work and release the frame, Xen releases the entry. <br>
* domu redo those steps for a new cycle. <br>
<br>
Xen mapping process can be found in function __gnttab_map_grant_ref in
link: <a class="moz-txt-link-freetext"
 href="http://xenbits.xen.org/hg/xen-4.1-testing.hg/file/81e39a4978ea/xen/common/grant_table.c#l2172">http://xenbits.xen.org/hg/xen-4.1-testing.hg/file/81e39a4978ea/xen/common/grant_table.c#l2172</a>
<br>
<br>
3. If dom0 supports grant table v2, guests run on it can either
supports v1 or v2. Xen is responsible to judge what version the guests
are using. This is implemented in link: <a
 class="moz-txt-link-freetext"
 href="http://xenbits.xen.org/hg/xen-4.1-testing.hg/file/81e39a4978ea/xen/common/grant_table.c#l2172">http://xenbits.xen.org/hg/xen-4.1-testing.hg/file/81e39a4978ea/xen/common/grant_table.c#l2172</a>.
Key word is:Â  rd-&gt;grant_table-&gt;gt_version. <br>
<br>
<pre wrap="">4. Grant table v2 has been supported by Xen for a long time, and<span
 class="moz-txt-citetags"> </span>receiver-side copying mechanism bases on this implementation.<span
 class="moz-txt-citetags"> </span>Netback and netfront driver can pick up this new feature to<span
 class="moz-txt-citetags"> </span>get better network performance and better CPU accounting.
</pre>
Thanks <br>
Annie<br>
</div>
</div>
</body>
</html>

--------------020502060500090308000905--


--===============1914037903==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1914037903==--


From xen-devel-bounces@lists.xensource.com Wed Nov 16 04:59:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 04:59:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQf5i-0000ut-1c; Wed, 16 Nov 2011 04:59:50 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQf35-0000Yg-7D
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 04:57:08 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1321441791!44134462!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10847 invoked from network); 16 Nov 2011 11:09:52 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 11:09:52 -0000
X-IronPort-AV: E=Sophos;i="4.69,520,1315195200"; d="scan'208,217";a="19142405"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 06:10:22 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX01.citrite.net
	(10.13.107.65) with Microsoft SMTP Server id 8.3.137.0; Wed, 16 Nov 2011
	06:10:21 -0500
Message-ID: <4EC39A09.8040104@citrix.com>
Date: Wed, 16 Nov 2011 11:10:01 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: <xen-devel@lists.xensource.com>
Subject: Re: [Xen-devel] default value of extra_dom0_irqs
References: <CAJqfKE+psJxdOtLDag4x3KkVV6OysinSJbq8xYRGhv5_mEBL8w@mail.gmail.com>
In-Reply-To: <CAJqfKE+psJxdOtLDag4x3KkVV6OysinSJbq8xYRGhv5_mEBL8w@mail.gmail.com>
X-Enigmail-Version: 1.1.2
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0320673974=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0320673974==
Content-Type: multipart/alternative;
	boundary="------------050707000605070301040609"

--------------050707000605070301040609
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit

On 16/11/11 03:40, Shu Wu wrote:
> Hi, folks, I have a question about the default number of PIRQs of
> Domain 0 in Xen 4.x. I encountered a problem that cciss.ko, the HP
> Smart Array driver, freezed and had the system hanged at booting time.
> The server is HP Proliant DL385G5p and run a CentOS 5.6 dom0 with Xen
> 4.1.1. However everything goes well when with Xen 3.0.3 which CentOS
> had officially integrated in. We upgraded to Xen 4.x so as to make use
> of Remus.
>
> I debugged and guessed that an IRQ of the HP RAID
> controller missing but could not figure out why. At last I compiled
> and tried and all revisions from 3.4.3 (r19995) to 4.0.0 (r20789),
> using a binary search method in about 10 times, and located some
> changes between r20142 and r20143 were the point. The code changes were:
>
> -static unsigned int extra_dom0_irqs, extra_domU_irqs = 8;
> +static unsigned int extra_dom0_irqs = 256, extra_domU_irqs = 32;
>  static void __init parse_extra_guest_irqs(const char *s)
>  {
>      if ( isdigit(*s) )
> @@ -253,9 +253,11 @@
>          d->is_paused_by_controller = 1;
>          atomic_inc(&d->pause_count);
>  
> -        d->nr_pirqs = (nr_irqs_gsi +
> -                       (domid ? extra_domU_irqs :
> -                        extra_dom0_irqs ?: nr_irqs_gsi));
> +        if ( domid )
> +            d->nr_pirqs = nr_irqs_gsi + extra_domU_irqs;
> +        else
> +            d->nr_pirqs = nr_irqs_gsi + extra_dom0_irqs;
>
>          d->pirq_to_evtchn = xmalloc_array(u16, d->nr_pirqs);
>          d->pirq_mask = xmalloc_array(
>              unsigned long, BITS_TO_LONGS(d->nr_pirqs));
>
>
> In the changes I noticed the extra_dom0_irqs, which should be 0 by
> default in r20142, was set to 256 in r20143, and caused default number
> of Dom0's nr_pirq to exceed 256. Maybe this prevent IRQ of HP RAID
> controller, I don't quite know about, though. After I set it to 32
> (the same number as extra_guest_irqs) the cciss.ko worked well.
> Although I could set this value by "extra_guest_irqs=32,32" in boot
> param, there are still problem:
> 1. The argument for dom0 extra irqs, the one after the comma, is
> undocumented.
> 2. What is the reason of the magic number 256 for Dom0, and 32 for
> DomU in Xen 4.x by default? nr_irqs_gsi is only 16 on x64 arch, but
> the total nr_pirq would be more than 256. The magic number still
> exists in the newest code. This is bad hardcode and may cause very
> elusive fault for newbie user, maybe you can have a better solution.
>

I doubt that this is relevant.  dom0 uses the paravirtualized interface
meaning it does not use real interrupts.

To start with, could you boot on Xen-4.1.1 and use the Xen debug keys on
the serial console to dump the interrupt bindings ('i'), MSI state ('M')
and PCI devices ('Q').  It would be useful if you could identify which
PCI device the HPSA controller is, and depending on where your kernel
crashes, /proc/interrupts would be very useful.

> Cheers,
>
> Wu Shu
>
>

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


--------------050707000605070301040609
Content-Type: text/html; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#ffffff" text="#000000">
    On 16/11/11 03:40, Shu Wu wrote:
    <blockquote
cite="mid:CAJqfKE+psJxdOtLDag4x3KkVV6OysinSJbq8xYRGhv5_mEBL8w@mail.gmail.com"
      type="cite">Hi, folks, I have a question about the default number
      of PIRQs of Domain 0 in Xen 4.x. I encountered a problem that
      cciss.ko, the HP Smart Array driver, freezed and had the system
      hanged at booting time. The server is&nbsp;HP Proliant DL385G5p and&nbsp;run
      a CentOS 5.6 dom0 with Xen 4.1.1. However everything goes well
      when with Xen 3.0.3 which CentOS had officially integrated in. We
      upgraded to Xen 4.x so as to make use of Remus.
      <div>
        <br>
      </div>
      <div>I debugged and guessed that an IRQ of the HP RAID
        controller&nbsp;missing&nbsp;but could not figure out why. At last
        I&nbsp;compiled and tried&nbsp;and all revisions from 3.4.3 (r19995) to
        4.0.0 (r20789), using a binary search method in about 10 times,
        and located some changes between r20142 and r20143 were the
        point. The code changes were:</div>
      <div><br>
      </div>
      <div>
        <div><font class="Apple-style-span" style="background-color:
            rgb(204, 204, 255);" face="'courier new', monospace">-static
            unsigned int extra_dom0_irqs, extra_domU_irqs = 8;</font></div>
        <div><font class="Apple-style-span" style="background-color:
            rgb(204, 204, 255);" face="'courier new', monospace">+static
            unsigned int extra_dom0_irqs = 256, extra_domU_irqs = 32;</font></div>
        <div><font class="Apple-style-span" face="'courier new',
            monospace">&nbsp;static void __init parse_extra_guest_irqs(const
            char *s)</font></div>
        <div><font class="Apple-style-span" face="'courier new',
            monospace">&nbsp;{</font></div>
        <div><font class="Apple-style-span" face="'courier new',
            monospace">&nbsp; &nbsp; &nbsp;if ( isdigit(*s) )</font></div>
        <div><font class="Apple-style-span" face="'courier new',
            monospace">@@ -253,9 +253,11 @@</font></div>
        <div><font class="Apple-style-span" face="'courier new',
            monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;d-&gt;is_paused_by_controller = 1;</font></div>
        <div><font class="Apple-style-span" face="'courier new',
            monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;atomic_inc(&amp;d-&gt;pause_count);</font></div>
        <div><font class="Apple-style-span" face="'courier new',
            monospace">&nbsp;</font></div>
        <div><font class="Apple-style-span" style="background-color:
            rgb(204, 204, 255);" face="'courier new', monospace">- &nbsp; &nbsp; &nbsp;
            &nbsp;d-&gt;nr_pirqs = (nr_irqs_gsi +</font></div>
        <div><font class="Apple-style-span" style="background-color:
            rgb(204, 204, 255);" face="'courier new', monospace">- &nbsp; &nbsp; &nbsp;
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (domid ? extra_domU_irqs :</font></div>
        <div><font class="Apple-style-span" style="background-color:
            rgb(204, 204, 255);" face="'courier new', monospace">- &nbsp; &nbsp; &nbsp;
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;extra_dom0_irqs ?: nr_irqs_gsi));</font></div>
        <div><font class="Apple-style-span" style="background-color:
            rgb(204, 204, 255);" face="'courier new', monospace">+ &nbsp; &nbsp; &nbsp;
            &nbsp;if ( domid )</font></div>
        <div><font class="Apple-style-span" style="background-color:
            rgb(204, 204, 255);" face="'courier new', monospace">+ &nbsp; &nbsp; &nbsp;
            &nbsp; &nbsp; &nbsp;d-&gt;nr_pirqs = nr_irqs_gsi + extra_domU_irqs;</font></div>
        <div><font class="Apple-style-span" style="background-color:
            rgb(204, 204, 255);" face="'courier new', monospace">+ &nbsp; &nbsp; &nbsp;
            &nbsp;else</font></div>
        <div><font class="Apple-style-span" style="background-color:
            rgb(204, 204, 255);" face="'courier new', monospace">+ &nbsp; &nbsp; &nbsp;
            &nbsp; &nbsp; &nbsp;d-&gt;nr_pirqs = nr_irqs_gsi + extra_dom0_irqs;</font></div>
        <div><font class="Apple-style-span" face="'courier new',
            monospace"><br>
          </font></div>
        <div><font class="Apple-style-span" face="'courier new',
            monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;d-&gt;pirq_to_evtchn =
            xmalloc_array(u16, d-&gt;nr_pirqs);</font></div>
        <div><font class="Apple-style-span" face="'courier new',
            monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;d-&gt;pirq_mask = xmalloc_array(</font></div>
        <div><font class="Apple-style-span" face="'courier new',
            monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;unsigned long,
            BITS_TO_LONGS(d-&gt;nr_pirqs));</font></div>
      </div>
      <div><br>
      </div>
      <div><br>
      </div>
      <div>In the changes I noticed the extra_dom0_irqs, which should be
        0 by default in r20142, was set to 256 in r20143, and caused
        default number of Dom0's nr_pirq to exceed 256. Maybe this
        prevent IRQ of HP RAID controller, I don't quite know about,
        though. After I set it to 32 (the same number as
        extra_guest_irqs) the cciss.ko worked well. Although I could set
        this value by "extra_guest_irqs=32,32" in boot param, there are
        still problem:</div>
      <div>1. The argument for dom0 extra irqs, the one after the comma,
        is undocumented.</div>
      <div>2. What is the reason of the magic number 256 for Dom0, and
        32 for DomU in Xen 4.x by default? nr_irqs_gsi is only 16 on x64
        arch, but the total nr_pirq would be more than 256. The magic
        number still exists in the newest code. This is bad hardcode and
        may cause very elusive fault for newbie user, maybe you can have
        a better solution.</div>
      <div><br>
      </div>
    </blockquote>
    <br>
    I doubt that this is relevant.&nbsp; dom0 uses the paravirtualized
    interface meaning it does not use real interrupts.<br>
    <br>
    To start with, could you boot on Xen-4.1.1 and use the Xen debug
    keys on the serial console to dump the interrupt bindings ('i'), MSI
    state ('M') and PCI devices ('Q').&nbsp; It would be useful if you could
    identify which PCI device the HPSA controller is, and depending on
    where your kernel crashes, /proc/interrupts would be very useful.<br>
    <br>
    <blockquote
cite="mid:CAJqfKE+psJxdOtLDag4x3KkVV6OysinSJbq8xYRGhv5_mEBL8w@mail.gmail.com"
      type="cite">
      <div>Cheers,</div>
      <div><br>
      </div>
      <div>Wu Shu</div>
      <div><br>
      </div>
      <div><br>
      </div>
    </blockquote>
    <br>
    <pre class="moz-signature" cols="72">-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, <a class="moz-txt-link-freetext" href="http://www.citrix.com">http://www.citrix.com</a></pre>
  </body>
</html>

--------------050707000605070301040609--


--===============0320673974==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0320673974==--


From xen-devel-bounces@lists.xensource.com Wed Nov 16 05:02:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 05:02:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQf8f-0001KH-AR; Wed, 16 Nov 2011 05:02:53 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQf6U-00013G-Ko
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 05:00:39 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1321448434!1796262!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7012 invoked from network); 16 Nov 2011 13:00:35 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-12.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 13:00:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,521,1315195200"; d="scan'208";a="170799573"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 08:00:33 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX02.citrite.net
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Wed, 16 Nov 2011
	08:00:33 -0500
Message-ID: <4EC3B3F0.9090608@citrix.com>
Date: Wed, 16 Nov 2011 13:00:32 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: <xen-devel@lists.xensource.com>
Subject: Re: [Xen-devel] default value of extra_dom0_irqs
References: <CAJqfKE+psJxdOtLDag4x3KkVV6OysinSJbq8xYRGhv5_mEBL8w@mail.gmail.com>
	<4EC3B2270200007800061469@nat28.tlf.novell.com>
In-Reply-To: <4EC3B2270200007800061469@nat28.tlf.novell.com>
X-Enigmail-Version: 1.1.2
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 16/11/11 11:52, Jan Beulich wrote:
>>>> On 16.11.11 at 04:40, Shu Wu <superwushu@gmail.com> wrote:
>> In the changes I noticed the extra_dom0_irqs, which should be 0 by default
>> in r20142, was set to 256 in r20143, and caused default number of Dom0's
>> nr_pirq to exceed 256. Maybe this prevent IRQ of HP RAID controller, I
>> don't quite know about, though. After I set it to 32 (the same number as
>> extra_guest_irqs) the cciss.ko worked well. Although I could set this value
>> by "extra_guest_irqs=32,32" in boot param, there are still problem:
> That would hint at the IRQ number (presumably an MSI one) getting
> stored in too narrow a field somewhere in the kernel.

Is your kernel being built with per-cpu IDTs, or is it with one shared IDT?

~Andrew

>> 1. The argument for dom0 extra irqs, the one after the comma, is
>> undocumented.
> Feel free to submit a patch to update the respective documentation.
> But for your purpose you don't even need the second value afaiu.
>
>> 2. What is the reason of the magic number 256 for Dom0, and 32 for DomU in
>> Xen 4.x by default?
> They're not magic in any way; if they're found to be too small for a
> significant portion of systems, they could get bumped (but not
> lowered).
>
>> nr_irqs_gsi is only 16 on x64 arch, but the total
> That you speak of one particular system. Most that I work with have
> larger values.
>
>> nr_pirq would be more than 256. The magic number still exists in the newest
>> code. This is bad hardcode and may cause very elusive fault for newbie
>> user, maybe you can have a better solution.
> The problem is that we can't judge reasonable for everyone values
> here. As long as they serve a majority, we're fine with requiring the
> few remaining systems to be run with a command line override.
>
> Speaking of which, one option possible after work that happened over
> the last couple of months would be to get rid of ->nr_pirqs altogether,
> using nr_irqs again instead. That would make things only worse for your
> case though, as you wouldn't then have a way to override the system
> determined values.
>
> Jan
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 05:12:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 05:12:34 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQfI1-0001qd-41; Wed, 16 Nov 2011 05:12:33 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQfG7-0001cv-BF
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 05:10:38 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1321449029!1807743!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30691 invoked from network); 16 Nov 2011 13:10:31 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-4.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 16 Nov 2011 13:10:31 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAGDAOn7008979
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 16 Nov 2011 13:10:27 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAGDAN3a002214
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 16 Nov 2011 13:10:24 GMT
Received: from abhmt110.oracle.com (abhmt110.oracle.com [141.146.116.62])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAGDAI9I014014; Wed, 16 Nov 2011 07:10:18 -0600
Received: from [221.220.250.42] (/221.220.250.42)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 16 Nov 2011 05:10:17 -0800
Message-ID: <4EC3B62F.6080702@oracle.com>
Date: Wed, 16 Nov 2011 21:10:07 +0800
From: annie li <annie.li@oracle.com>
Organization: Oracle Corporation
User-Agent: Thunderbird 1.5.0.9 (Windows/20061207)
MIME-Version: 1.0
To: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	konrad.wilk@oracle.com, jeremy@goop.org
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090206.4EC3B643.00E3,ss=1,re=0.000,fgs=0
Cc: Kurt.Hackel@oracle.com, paul.durrant@citrix.com, Ian.Campbell@citrix.com
Subject: [Xen-devel] Improved patches of upstreaming grant table version 2
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1546216247=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============1546216247==
Content-Type: multipart/alternative;
	boundary="------------020408050209040909090102"

This is a multi-part message in MIME format.
--------------020408050209040909090102
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit


Hi

(My former email was rejected by linux-kernel@vger.kernel.org, so 
re-sending it)
The following patches introduce and implement grant table version 2. 
They are improved from my previous patches and based on v3.2.0-rc1+.

Descriptions for those patches:

1. In those patches, the grant table code supports both grant table v1 
and v2 version, v2 is an extension from v1. Grant table of guest domain 
can be either v1 or v2 version, and every grant table entry on one guest 
should be the same version.

2. Full page structure of grant table v2 play the same role as grant 
table v1. Although full page structure is different from v1, grant table 
2 is totally backwards compatible with v1. Grant table is shared between 
guest and Xen, domu and dom0 all have their own grant table shared with 
Xen, and their grant table version should be set before any grants are 
activated. When domu grants an entry to dom0 to map a frame, following 
are steps:
* domu introduces a grant entry by reference
* domu informs dom0 the gref
* dom0 sends hypercall to map frame through this reference, Xen copy 
shared entry to active entry and update frame
* dom0 does its work and release the frame, Xen releases the entry.
* domu redo those steps for a new cycle.

Xen mapping process can be found in function __gnttab_map_grant_ref in 
Xen code: xen/common/grant_table.c

3. If dom0 supports grant table v2, guests run on it can either supports 
v1 or v2. Xen is responsible to judge what version the guests are using. 
This is implemented in Xen code: xen/common/grant_table.c. Key word is:  
rd->grant_table->gt_version.

4. Grant table v2 has been supported by Xen for a long time, and receiver-side copying mechanism bases on this implementation. Netback and netfront driver can pick up this new feature to get better network performance and better CPU accounting.

Thanks
Annie

--------------020408050209040909090102
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=UTF-8" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
<br>
Hi <br>
<div class="moz-text-html" lang="x-unicode">
<div class="moz-text-html" lang="x-unicode">
<div class="moz-text-flowed"
 style="font-family: -moz-fixed; font-size: 13px;" lang="x-unicode"><br>
(My former email was rejected by <a class="moz-txt-link-abbreviated" href="mailto:linux-kernel@vger.kernel.org">linux-kernel@vger.kernel.org</a>, so
re-sending it)<br>
The following patches introduce and implement grant table version 2.
They are improved from my previous patches and based on v3.2.0-rc1+. <br>
<br>
Descriptions for those patches: <br>
<br>
1. In those patches, the grant table code supports both grant table v1
and v2 version, v2 is an extension from v1. Grant table of guest domain
can be either v1 or v2 version, and every grant table entry on one
guest should be the same version. <br>
<br>
2. Full page structure of grant table v2 play the same role as grant
table v1. Although full page structure is different from v1, grant
table 2 is totally backwards compatible with v1. Grant table is shared
between guest and Xen, domu and dom0 all have their own grant table
shared with Xen, and their grant table version should be set before any
grants are activated. When domu grants an entry to dom0 to map a frame,
following are steps: <br>
* domu introduces a grant entry by reference <br>
* domu informs dom0 the gref <br>
* dom0 sends hypercall to map frame through this reference, Xen copy
shared entry to active entry and update frame <br>
* dom0 does its work and release the frame, Xen releases the entry. <br>
* domu redo those steps for a new cycle. <br>
<br>
Xen mapping process can be found in function __gnttab_map_grant_ref in
Xen code: xen/common/grant_table.c<br>
<br>
3. If dom0 supports grant table v2, guests run on it can either
supports v1 or v2. Xen is responsible to judge what version the guests
are using. This is implemented in Xen code: xen/common/grant_table.c.
Key word is:Â  rd-&gt;grant_table-&gt;gt_version. <br>
<br>
<pre wrap="">4. Grant table v2 has been supported by Xen for a long time, and receiver-side copying mechanism bases on this implementation. Netback and netfront driver can pick up this new feature to get better network performance and better CPU accounting.
</pre>
Thanks <br>
Annie<br>
</div>
</div>
</div>
</body>
</html>

--------------020408050209040909090102--


--===============1546216247==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1546216247==--


From xen-devel-bounces@lists.xensource.com Wed Nov 16 05:25:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 05:25:19 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQfUM-0002Vf-6x; Wed, 16 Nov 2011 05:25:18 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQfSx-0002Hs-JC
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 05:23:51 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1321449787!57043614!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23316 invoked from network); 16 Nov 2011 13:23:08 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-7.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 16 Nov 2011 13:23:08 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAGDNfSb018706
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 16 Nov 2011 13:23:41 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAGDNd6K026408
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 16 Nov 2011 13:23:40 GMT
Received: from abhmt114.oracle.com (abhmt114.oracle.com [141.146.116.66])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAGDNY85023074; Wed, 16 Nov 2011 07:23:34 -0600
Received: from [10.154.33.136] (/10.154.33.136)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 16 Nov 2011 05:23:34 -0800
Message-ID: <4EC3B94C.1040103@oracle.com>
Date: Wed, 16 Nov 2011 21:23:24 +0800
From: annie li <annie.li@oracle.com>
Organization: Oracle Corporation
User-Agent: Thunderbird 1.5.0.9 (Windows/20061207)
MIME-Version: 1.0
To: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	konrad.wilk@oracle.com, jeremy@goop.org
Subject: Re: [Xen-devel] Improved patches of upstreaming grant table version 2
References: <4EC3B62F.6080702@oracle.com>
In-Reply-To: <4EC3B62F.6080702@oracle.com>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090206.4EC3B95E.005F,ss=1,re=0.000,fgs=0
Cc: Kurt.Hackel@oracle.com, paul.durrant@citrix.com, Ian.Campbell@citrix.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Diff:

 arch/x86/xen/grant-table.c          |   42 ++++-
 drivers/xen/grant-table.c           |  355 
++++++++++++++++++++++++++++++----
 include/xen/grant_table.h           |   10 +-
 include/xen/interface/grant_table.h |  167 ++++++++++++++++-
 include/xen/interface/xen.h         |    2 +
 5 files changed, 521 insertions(+), 55 deletions(-)


Short log:

Annie Li (3):
      xen/granttable: Introducing grant table V2 stucture
      xen/granttable: Grant tables V2 implementation
      xen/granttable: Keep code format clean

Thanks
Annie

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 05:34:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 05:34:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQfd0-0003hl-7B; Wed, 16 Nov 2011 05:34:14 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQfc4-0003UQ-As
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 05:33:16 -0800
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-15.tower-182.messagelabs.com!1321450392!3364184!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10905 invoked from network); 16 Nov 2011 13:33:13 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-15.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 16 Nov 2011 13:33:13 -0000
X-Originating-Ip: [194.89.68.22]
Received: from ydin.reaktio.net (reaktio.net [194.89.68.22])
	by smtp.tele.fi (Postfix) with ESMTP id F37442F92;
	Wed, 16 Nov 2011 15:33:11 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 01E6420058; Wed, 16 Nov 2011 15:33:10 +0200 (EET)
Date: Wed, 16 Nov 2011 15:33:10 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek nic problems
	(eth0 8139cp transmit queue timed out)
Message-ID: <20111116133310.GH12984@reaktio.net>
References: <CAD88F26.24242%keir.xen@gmail.com>
	<alpine.DEB.2.00.1111071153230.3519@kaball-desktop>
	<20111108112421.GU12984@reaktio.net>
	<20111111070250.GZ12984@reaktio.net>
	<m2n.s.1RQ0WH-146660@chiark.greenend.org.uk>
	<20161.21535.456074.757497@mariner.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <20161.21535.456074.757497@mariner.uk.xensource.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: "xen@lists.fedoraproject.org" <xen@lists.fedoraproject.org>,
	Keir Fraser <keir.xen@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 05:47:11PM +0000, Ian Jackson wrote:
> Pasi Kärkkäinen writes ("Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek nic problems (eth0 8139cp transmit queue timed out)"):
> > So please go ahead and commit the fix to xen-4.1-testing.hg.
> 
> Keir, will you do this ?  If you prefer I can do it, but I need the
> blessing of a hypervisor maintainer.
> 

Ping? 


-- Pasi


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 05:45:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 05:45:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQfnl-0004I0-2x; Wed, 16 Nov 2011 05:45:21 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQfmc-00044Y-49
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 05:44:10 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1321451046!4445184!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29229 invoked from network); 16 Nov 2011 13:44:07 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-11.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 16 Nov 2011 13:44:07 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 16 Nov 2011 13:44:06 +0000
Message-Id: <4EC3CC3502000078000614B7@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 
Date: Wed, 16 Nov 2011 13:44:05 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Andrew Cooper" <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] default value of extra_dom0_irqs
References: <CAJqfKE+psJxdOtLDag4x3KkVV6OysinSJbq8xYRGhv5_mEBL8w@mail.gmail.com>
	<4EC3B2270200007800061469@nat28.tlf.novell.com>
	<4EC3B3F0.9090608@citrix.com>
In-Reply-To: <4EC3B3F0.9090608@citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 16.11.11 at 14:00, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
> On 16/11/11 11:52, Jan Beulich wrote:
>>>>> On 16.11.11 at 04:40, Shu Wu <superwushu@gmail.com> wrote:
>>> In the changes I noticed the extra_dom0_irqs, which should be 0 by =
default
>>> in r20142, was set to 256 in r20143, and caused default number of =
Dom0's
>>> nr_pirq to exceed 256. Maybe this prevent IRQ of HP RAID controller, I
>>> don't quite know about, though. After I set it to 32 (the same number =
as
>>> extra_guest_irqs) the cciss.ko worked well. Although I could set this =
value
>>> by "extra_guest_irqs=3D32,32" in boot param, there are still problem:
>> That would hint at the IRQ number (presumably an MSI one) getting
>> stored in too narrow a field somewhere in the kernel.
>=20
> Is your kernel being built with per-cpu IDTs, or is it with one shared =
IDT?

pv kernels don't have any IDT.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 05:46:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 05:46:34 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQfov-0004g5-S3; Wed, 16 Nov 2011 05:46:33 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQfnK-0004Cc-Gf
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 05:44:55 -0800
X-Env-Sender: glguida@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1321451059!53337955!1
X-Originating-IP: [209.85.213.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30071 invoked from network); 16 Nov 2011 13:44:20 -0000
Received: from mail-yx0-f171.google.com (HELO mail-yx0-f171.google.com)
	(209.85.213.171)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 13:44:20 -0000
Received: by yenl7 with SMTP id l7so5279427yen.30
	for <xen-devel@lists.xensource.com>;
	Wed, 16 Nov 2011 05:44:50 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:cc:content-type;
	bh=2c9j/pqqVCFRyHhScU9eZgki2AOLV6vjDuAc1OHeacE=;
	b=v5PU5yS9e1c0i8vWEsCnVeVs/IN9i7w0Nk7rzNX8snchsXgrT/7u94Xou3MusgCoK/
	FeBbbIYuJGw0y7Vk96j6lXmjthnPcNsbOnInWArYn7U9g2n4RTvnShMTgcXhJo04JarQ
	6JAtFzBRGEDdZENYzSEW/8aUmjzAHObWCH61Y=
MIME-Version: 1.0
Received: by 10.100.243.9 with SMTP id q9mr10123857anh.52.1321451090052; Wed,
	16 Nov 2011 05:44:50 -0800 (PST)
Received: by 10.100.107.4 with HTTP; Wed, 16 Nov 2011 05:44:50 -0800 (PST)
Date: Wed, 16 Nov 2011 05:44:50 -0800
Message-ID: <CAKpvNa2tp7Ha=8kOsYyTjnWyo46YPQU678iS9aq=CfbzDOf17A@mail.gmail.com>
From: Gianluca Guida <glguida@gmail.com>
To: xen-devel@lists.xensource.com, Keir Fraser <keir@xen.org>
Content-Type: text/plain; charset=ISO-8859-1
Cc: Tim Deegan <tim@xen.org>, Jan Beulich <JBeulich@suse.com>,
	Gianluca Guida <gianluca.guida@citrix.com>
Subject: [Xen-devel] [PATCH] [shadow] Disable higher level pagetables early
 unshadow only when the "process dying" hypercall is used.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This patch fixes a performance problem in fully virtualized guests.

Should be backported to xen-4.0 and xen-4.1. This patch applies (with
slightly different offsets) to all three versions.

Signed-off-by: Gianluca Guida <gianluca.guida@citrix.com>
Tested-by: Jan Beulich <jbeulich@suse.com>

diff -r 068d3d55ce6e xen/arch/x86/mm/shadow/multi.c
--- a/xen/arch/x86/mm/shadow/multi.c    Tue Nov 01 19:03:38 2011 +0000
+++ b/xen/arch/x86/mm/shadow/multi.c    Wed Nov 16 14:30:57 2011 -0800
@@ -2723,8 +2723,9 @@
            || ( !v->domain->arch.paging.shadow.pagetable_dying_op
                 &&
v->arch.paging.shadow.last_emulated_mfn_for_unshadow == mfn_x(gmfn) )
)
          && sh_mfn_is_a_page_table(gmfn)
-         && !(mfn_to_page(gmfn)->shadow_flags
-              & (SHF_L2_32|SHF_L2_PAE|SHF_L2H_PAE|SHF_L4_64)) )
+         && (!v->domain->arch.paging.shadow.pagetable_dying_op ||
+             !(mfn_to_page(gmfn)->shadow_flags
+               & (SHF_L2_32|SHF_L2_PAE|SHF_L2H_PAE|SHF_L4_64))) )
     {
         perfc_incr(shadow_early_unshadow);
         sh_remove_shadows(v, gmfn, 1, 0 /* Fast, can fail to unshadow */ );

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 05:47:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 05:47:43 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQfq2-00053s-Q2; Wed, 16 Nov 2011 05:47:42 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQfpa-0004rq-C8
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 05:47:14 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1321451230!1806026!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21701 invoked from network); 16 Nov 2011 13:47:11 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-14.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 16 Nov 2011 13:47:11 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 16 Nov 2011 13:47:09 +0000
Message-Id: <4EC3CCEE02000078000614C5@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 
Date: Wed, 16 Nov 2011 13:47:10 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part95BA15CE.0__="
Subject: [Xen-devel] [PATCH] x86-64/test_x86_emulate: fix blowfish test
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part95BA15CE.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

x86-64/test_x86_emulate: fix blowfish test

Incorrect register usage in the _start() wrapper caused the 64-bit
execution emulation to fail.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/tools/tests/x86_emulator/blowfish.c
+++ b/tools/tests/x86_emulator/blowfish.c
@@ -30,7 +30,7 @@ asm (
 #else
     "shlq $32,%rdx; movl %eax,%edi; orq %rdx,%rdi; "
     "call blowfish_test; "
-    "movq %rax,%rdi; movl %eax,%eax; shrq $32,%rdx; "
+    "movq %rax,%rdx; movl %eax,%eax; shrq $32,%rdx; "
 #endif
     "ret"
     );




--=__Part95BA15CE.0__=
Content-Type: text/plain; name="test-x86-emul-blowfish-x86_64.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="test-x86-emul-blowfish-x86_64.patch"

x86-64/test_x86_emulate: fix blowfish test=0A=0AIncorrect register usage =
in the _start() wrapper caused the 64-bit=0Aexecution emulation to =
fail.=0A=0ASigned-off-by: Jan Beulich <jbeulich@suse.com>=0A=0A--- =
a/tools/tests/x86_emulator/blowfish.c=0A+++ b/tools/tests/x86_emulator/blow=
fish.c=0A@@ -30,7 +30,7 @@ asm (=0A #else=0A     "shlq $32,%rdx; movl =
%eax,%edi; orq %rdx,%rdi; "=0A     "call blowfish_test; "=0A-    "movq =
%rax,%rdi; movl %eax,%eax; shrq $32,%rdx; "=0A+    "movq %rax,%rdx; movl =
%eax,%eax; shrq $32,%rdx; "=0A #endif=0A     "ret"=0A     );=0A
--=__Part95BA15CE.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part95BA15CE.0__=--


From xen-devel-bounces@lists.xensource.com Wed Nov 16 05:49:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 05:49:15 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQfrW-0005TQ-Ty; Wed, 16 Nov 2011 05:49:14 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQfqx-0005GV-Q1
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 05:48:40 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1321451291!44833097!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3098 invoked from network); 16 Nov 2011 13:48:12 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-12.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 16 Nov 2011 13:48:12 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAGDmVtU017933
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 16 Nov 2011 13:48:32 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAGDmUEq007140
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 16 Nov 2011 13:48:30 GMT
Received: from abhmt103.oracle.com (abhmt103.oracle.com [141.146.116.55])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAGDmOCA014787; Wed, 16 Nov 2011 07:48:24 -0600
Received: from annie2.cn.oracle.com.com (/10.182.37.169)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 16 Nov 2011 05:48:24 -0800
From: annie.li@oracle.com
To: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	konrad.wilk@oracle.com, jeremy@goop.org
Date: Wed, 16 Nov 2011 21:48:24 +0800
Message-Id: <1321451304-13559-1-git-send-email-annie.li@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <4EC3B62F.6080702@oracle.com>
References: <4EC3B62F.6080702@oracle.com>
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090203.4EC3BF30.00F1,ss=1,re=-2.300,fgs=0
Cc: kurt.hackel@oracle.com, annie.li@oracle.com, paul.durrant@citrix.com,
	Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH 1/3] xen/granttable: Introducing grant table V2
	stucture
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Annie Li <annie.li@oracle.com>

This patch introduces new structures of grant table V2, grant table V2 is an
extension from V1. Grant table is shared between guest and Xen, and Xen is
responsible to do corresponding work for grant operations, such as: figure
out guest's grant table version, perform different actions based on
different grant table version, etc. Although full-page structure of V2
is different from V1, it play the same role as V1.

Signed-off-by: Annie Li <annie.li@oracle.com>
---
 arch/x86/xen/grant-table.c          |    7 +-
 drivers/xen/grant-table.c           |  181 +++++++++++++++++++++++++++--------
 include/xen/grant_table.h           |    4 +-
 include/xen/interface/grant_table.h |  167 +++++++++++++++++++++++++++++++-
 include/xen/interface/xen.h         |    2 +
 5 files changed, 311 insertions(+), 50 deletions(-)

diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c
index 6bbfd7a..c6ab2e7 100644
--- a/arch/x86/xen/grant-table.c
+++ b/arch/x86/xen/grant-table.c
@@ -64,10 +64,10 @@ static int unmap_pte_fn(pte_t *pte, struct page *pmd_page,
 
 int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
 			   unsigned long max_nr_gframes,
-			   struct grant_entry **__shared)
+			   void **__shared)
 {
 	int rc;
-	struct grant_entry *shared = *__shared;
+	void *shared = *__shared;
 
 	if (shared == NULL) {
 		struct vm_struct *area =
@@ -83,8 +83,7 @@ int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
 	return rc;
 }
 
-void arch_gnttab_unmap_shared(struct grant_entry *shared,
-			      unsigned long nr_gframes)
+void arch_gnttab_unmap_shared(void *shared, unsigned long nr_gframes)
 {
 	apply_to_page_range(&init_mm, (unsigned long)shared,
 			    PAGE_SIZE * nr_gframes, unmap_pte_fn, NULL);
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
index bf1c094..1bd9d5f 100644
--- a/drivers/xen/grant-table.c
+++ b/drivers/xen/grant-table.c
@@ -53,7 +53,7 @@
 /* External tools reserve first few grant table entries. */
 #define NR_RESERVED_ENTRIES 8
 #define GNTTAB_LIST_END 0xffffffff
-#define GREFS_PER_GRANT_FRAME (PAGE_SIZE / sizeof(struct grant_entry))
+#define GREFS_PER_GRANT_FRAME (PAGE_SIZE / sizeof(struct grant_entry_v1))
 
 static grant_ref_t **gnttab_list;
 static unsigned int nr_grant_frames;
@@ -64,7 +64,61 @@ static DEFINE_SPINLOCK(gnttab_list_lock);
 unsigned long xen_hvm_resume_frames;
 EXPORT_SYMBOL_GPL(xen_hvm_resume_frames);
 
-static struct grant_entry *shared;
+static union {
+	struct grant_entry_v1 *v1;
+	void *addr;
+} gnttab_shared;
+
+/*This is a structure of function pointers for grant table*/
+static struct {
+	/*
+	 * Mapping a list of frames for storing grant entries. First input
+	 * parameter is used to storing grant table address when grant table
+	 * being setup, second parameter is the number of frames to map grant
+	 * table. Returning GNTST_okay means success and negative value means
+	 * failure.
+	 */
+	int (*map_frames)(unsigned long *, unsigned int);
+	/*
+	 * Release a list of frames which are mapped in map_frames for grant
+	 * entry status.
+	 */
+	void (*unmap_frames)(void);
+	/*
+	 * Introducing a valid entry into the grant table, granting the frame
+	 * of this grant entry to domain for accessing, or transfering, or
+	 * transitively accessing. First input parameter is reference of this
+	 * introduced grant entry, second one is domid of granted domain, third
+	 * one is the frame to be granted, and the last one is status of the
+	 * grant entry to be updated.
+	 */
+	void (*update_entry)(grant_ref_t, domid_t, unsigned long, unsigned);
+	/*
+	 * Stop granting a grant entry to domain for accessing. First input
+	 * parameter is reference of a grant entry whose grant access will be
+	 * stopped, second one is not in use now. If the grant entry is
+	 * currently mapped for reading or writing, just return failure(==0)
+	 * directly and don't tear down the grant access. Otherwise, stop grant
+	 * access for this entry and return success(==1).
+	 */
+	int (*end_foreign_access_ref)(grant_ref_t, int);
+	/*
+	 * Stop granting a grant entry to domain for transfer. If tranfer has
+	 * not started, just reclaim the grant entry and return failure(==0).
+	 * Otherwise, wait for the transfer to complete and then return the
+	 * frame.
+	 */
+	unsigned long (*end_foreign_transfer_ref)(grant_ref_t);
+	/*
+	 * Query the status of a grant entry. Input parameter is reference of
+	 * queried grant entry, return value is the status of queried entry.
+	 * Detailed status(writing/reading) can be gotten from the return value
+	 * by bit operations.
+	 */
+	int (*query_foreign_access)(grant_ref_t);
+} gnttab_interface;
+
+static int grant_table_version;
 
 static struct gnttab_free_callback *gnttab_free_callback_list;
 
@@ -142,23 +196,23 @@ static void put_free_entry(grant_ref_t ref)
 	spin_unlock_irqrestore(&gnttab_list_lock, flags);
 }
 
-static void update_grant_entry(grant_ref_t ref, domid_t domid,
-			       unsigned long frame, unsigned flags)
+/*
+ * Introducing a valid entry into the grant table:
+ *  1. Write ent->domid.
+ *  2. Write ent->frame:
+ *      GTF_permit_access:   Frame to which access is permitted.
+ *      GTF_accept_transfer: Pseudo-phys frame slot being filled by new
+ *                           frame, or zero if none.
+ *  3. Write memory barrier (WMB).
+ *  4. Write ent->flags, inc. valid type.
+ */
+static void update_grant_entry_v1(grant_ref_t ref, domid_t domid,
+				  unsigned long frame, unsigned flags)
 {
-	/*
-	 * Introducing a valid entry into the grant table:
-	 *  1. Write ent->domid.
-	 *  2. Write ent->frame:
-	 *      GTF_permit_access:   Frame to which access is permitted.
-	 *      GTF_accept_transfer: Pseudo-phys frame slot being filled by new
-	 *                           frame, or zero if none.
-	 *  3. Write memory barrier (WMB).
-	 *  4. Write ent->flags, inc. valid type.
-	 */
-	shared[ref].frame = frame;
-	shared[ref].domid = domid;
+	gnttab_shared.v1[ref].domid = domid;
+	gnttab_shared.v1[ref].frame = frame;
 	wmb();
-	shared[ref].flags = flags;
+	gnttab_shared.v1[ref].flags = flags;
 }
 
 /*
@@ -167,7 +221,7 @@ static void update_grant_entry(grant_ref_t ref, domid_t domid,
 void gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t domid,
 				     unsigned long frame, int readonly)
 {
-	update_grant_entry(ref, domid, frame,
+	gnttab_interface.update_entry(ref, domid, frame,
 			   GTF_permit_access | (readonly ? GTF_readonly : 0));
 }
 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_ref);
@@ -187,31 +241,40 @@ int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
 }
 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access);
 
-int gnttab_query_foreign_access(grant_ref_t ref)
+static int gnttab_query_foreign_access_v1(grant_ref_t ref)
 {
-	u16 nflags;
-
-	nflags = shared[ref].flags;
+	return gnttab_shared.v1[ref].flags & (GTF_reading|GTF_writing);
+}
 
-	return nflags & (GTF_reading|GTF_writing);
+int gnttab_query_foreign_access(grant_ref_t ref)
+{
+	return gnttab_interface.query_foreign_access(ref);
 }
 EXPORT_SYMBOL_GPL(gnttab_query_foreign_access);
 
-int gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly)
+static int gnttab_end_foreign_access_ref_v1(grant_ref_t ref, int readonly)
 {
 	u16 flags, nflags;
+	u16 *pflags;
 
-	nflags = shared[ref].flags;
+	pflags = &gnttab_shared.v1[ref].flags;
+	nflags = *pflags;
 	do {
 		flags = nflags;
 		if (flags & (GTF_reading|GTF_writing)) {
 			printk(KERN_ALERT "WARNING: g.e. still in use!\n");
 			return 0;
 		}
-	} while ((nflags = sync_cmpxchg(&shared[ref].flags, flags, 0)) != flags);
+	} while ((nflags = sync_cmpxchg(&gnttab_shared.v1[ref].flags, flags, 0))
+			!= flags);
 
 	return 1;
 }
+
+int gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly)
+{
+	return gnttab_interface.end_foreign_access_ref(ref, readonly);
+}
 EXPORT_SYMBOL_GPL(gnttab_end_foreign_access_ref);
 
 void gnttab_end_foreign_access(grant_ref_t ref, int readonly,
@@ -246,37 +309,45 @@ EXPORT_SYMBOL_GPL(gnttab_grant_foreign_transfer);
 void gnttab_grant_foreign_transfer_ref(grant_ref_t ref, domid_t domid,
 				       unsigned long pfn)
 {
-	update_grant_entry(ref, domid, pfn, GTF_accept_transfer);
+	gnttab_interface.update_entry(ref, domid, pfn, GTF_accept_transfer);
 }
 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_transfer_ref);
 
-unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref)
+static unsigned long gnttab_end_foreign_transfer_ref_v1(grant_ref_t ref)
 {
 	unsigned long frame;
 	u16           flags;
+	u16          *pflags;
+
+	pflags = &gnttab_shared.v1[ref].flags;
 
 	/*
 	 * If a transfer is not even yet started, try to reclaim the grant
 	 * reference and return failure (== 0).
 	 */
-	while (!((flags = shared[ref].flags) & GTF_transfer_committed)) {
-		if (sync_cmpxchg(&shared[ref].flags, flags, 0) == flags)
+	while (!((flags = *pflags) & GTF_transfer_committed)) {
+		if (sync_cmpxchg(pflags, flags, 0) == flags)
 			return 0;
 		cpu_relax();
 	}
 
 	/* If a transfer is in progress then wait until it is completed. */
 	while (!(flags & GTF_transfer_completed)) {
-		flags = shared[ref].flags;
+		flags = *pflags;
 		cpu_relax();
 	}
 
 	rmb();	/* Read the frame number /after/ reading completion status. */
-	frame = shared[ref].frame;
+	frame = gnttab_shared.v1[ref].frame;
 	BUG_ON(frame == 0);
 
 	return frame;
 }
+
+unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref)
+{
+	return gnttab_interface.end_foreign_transfer_ref(ref);
+}
 EXPORT_SYMBOL_GPL(gnttab_end_foreign_transfer_ref);
 
 unsigned long gnttab_end_foreign_transfer(grant_ref_t ref)
@@ -520,6 +591,23 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
 }
 EXPORT_SYMBOL_GPL(gnttab_unmap_refs);
 
+static int gnttab_map_frames_v1(unsigned long *frames, unsigned int nr_gframes)
+{
+	int rc;
+
+	rc = arch_gnttab_map_shared(frames, nr_gframes,
+				    gnttab_max_grant_frames(),
+				    &gnttab_shared.addr);
+	BUG_ON(rc);
+
+	return 0;
+}
+
+static void gnttab_unmap_frames_v1(void)
+{
+	arch_gnttab_unmap_shared(gnttab_shared.addr, nr_grant_frames);
+}
+
 static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
 {
 	struct gnttab_setup_table setup;
@@ -567,19 +655,33 @@ static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
 
 	BUG_ON(rc || setup.status);
 
-	rc = arch_gnttab_map_shared(frames, nr_gframes, gnttab_max_grant_frames(),
-				    &shared);
-	BUG_ON(rc);
+	rc = gnttab_interface.map_frames(frames, nr_gframes);
 
 	kfree(frames);
 
 	return 0;
 }
 
+static void gnttab_request_version(void)
+{
+	grant_table_version = 1;
+	gnttab_interface.map_frames = gnttab_map_frames_v1;
+	gnttab_interface.unmap_frames = gnttab_unmap_frames_v1;
+	gnttab_interface.update_entry = update_grant_entry_v1;
+	gnttab_interface.end_foreign_access_ref =
+					gnttab_end_foreign_access_ref_v1;
+	gnttab_interface.end_foreign_transfer_ref =
+					gnttab_end_foreign_transfer_ref_v1;
+	gnttab_interface.query_foreign_access = gnttab_query_foreign_access_v1;
+	printk(KERN_INFO "Grant tables using version %d layout.\n",
+		grant_table_version);
+}
+
 int gnttab_resume(void)
 {
 	unsigned int max_nr_gframes;
 
+	gnttab_request_version();
 	max_nr_gframes = gnttab_max_grant_frames();
 	if (max_nr_gframes < nr_grant_frames)
 		return -ENOSYS;
@@ -587,9 +689,10 @@ int gnttab_resume(void)
 	if (xen_pv_domain())
 		return gnttab_map(0, nr_grant_frames - 1);
 
-	if (!shared) {
-		shared = ioremap(xen_hvm_resume_frames, PAGE_SIZE * max_nr_gframes);
-		if (shared == NULL) {
+	if (gnttab_shared.addr == NULL) {
+		gnttab_shared.addr = ioremap(xen_hvm_resume_frames,
+						PAGE_SIZE * max_nr_gframes);
+		if (gnttab_shared.addr == NULL) {
 			printk(KERN_WARNING
 					"Failed to ioremap gnttab share frames!");
 			return -ENOMEM;
@@ -603,7 +706,7 @@ int gnttab_resume(void)
 
 int gnttab_suspend(void)
 {
-	arch_gnttab_unmap_shared(shared, nr_grant_frames);
+	gnttab_interface.unmap_frames();
 	return 0;
 }
 
diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
index 11e2dfc..c7a40f8 100644
--- a/include/xen/grant_table.h
+++ b/include/xen/grant_table.h
@@ -145,8 +145,8 @@ gnttab_set_unmap_op(struct gnttab_unmap_grant_ref *unmap, phys_addr_t addr,
 
 int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
 			   unsigned long max_nr_gframes,
-			   struct grant_entry **__shared);
-void arch_gnttab_unmap_shared(struct grant_entry *shared,
+			   void **__shared);
+void arch_gnttab_unmap_shared(void *shared,
 			      unsigned long nr_gframes);
 
 extern unsigned long xen_hvm_resume_frames;
diff --git a/include/xen/interface/grant_table.h b/include/xen/interface/grant_table.h
index 39e5717..a17d844 100644
--- a/include/xen/interface/grant_table.h
+++ b/include/xen/interface/grant_table.h
@@ -85,12 +85,22 @@
  */
 
 /*
+ * Reference to a grant entry in a specified domain's grant table.
+ */
+typedef uint32_t grant_ref_t;
+
+/*
  * A grant table comprises a packed array of grant entries in one or more
  * page frames shared between Xen and a guest.
  * [XEN]: This field is written by Xen and read by the sharing guest.
  * [GST]: This field is written by the guest and read by Xen.
  */
-struct grant_entry {
+
+/*
+ * Version 1 of the grant table entry structure is maintained purely
+ * for backwards compatibility.  New guests should use version 2.
+ */
+struct grant_entry_v1 {
     /* GTF_xxx: various type and flag information.  [XEN,GST] */
     uint16_t flags;
     /* The domain being granted foreign privileges. [GST] */
@@ -108,10 +118,13 @@ struct grant_entry {
  *  GTF_permit_access: Allow @domid to map/access @frame.
  *  GTF_accept_transfer: Allow @domid to transfer ownership of one page frame
  *                       to this guest. Xen writes the page number to @frame.
+ *  GTF_transitive: Allow @domid to transitively access a subrange of
+ *                  @trans_grant in @trans_domid.  No mappings are allowed.
  */
 #define GTF_invalid         (0U<<0)
 #define GTF_permit_access   (1U<<0)
 #define GTF_accept_transfer (2U<<0)
+#define GTF_transitive      (3U<<0)
 #define GTF_type_mask       (3U<<0)
 
 /*
@@ -119,6 +132,9 @@ struct grant_entry {
  *  GTF_readonly: Restrict @domid to read-only mappings and accesses. [GST]
  *  GTF_reading: Grant entry is currently mapped for reading by @domid. [XEN]
  *  GTF_writing: Grant entry is currently mapped for writing by @domid. [XEN]
+ *  GTF_sub_page: Grant access to only a subrange of the page.  @domid
+ *                will only be allowed to copy from the grant, and not
+ *                map it. [GST]
  */
 #define _GTF_readonly       (2)
 #define GTF_readonly        (1U<<_GTF_readonly)
@@ -126,6 +142,8 @@ struct grant_entry {
 #define GTF_reading         (1U<<_GTF_reading)
 #define _GTF_writing        (4)
 #define GTF_writing         (1U<<_GTF_writing)
+#define _GTF_sub_page       (8)
+#define GTF_sub_page        (1U<<_GTF_sub_page)
 
 /*
  * Subflags for GTF_accept_transfer:
@@ -142,15 +160,81 @@ struct grant_entry {
 #define _GTF_transfer_completed (3)
 #define GTF_transfer_completed  (1U<<_GTF_transfer_completed)
 
+/*
+ * Version 2 grant table entries.  These fulfil the same role as
+ * version 1 entries, but can represent more complicated operations.
+ * Any given domain will have either a version 1 or a version 2 table,
+ * and every entry in the table will be the same version.
+ *
+ * The interface by which domains use grant references does not depend
+ * on the grant table version in use by the other domain.
+ */
 
-/***********************************
- * GRANT TABLE QUERIES AND USES
+/*
+ * Version 1 and version 2 grant entries share a common prefix.  The
+ * fields of the prefix are documented as part of struct
+ * grant_entry_v1.
  */
+struct grant_entry_header {
+    uint16_t flags;
+    domid_t  domid;
+};
 
 /*
- * Reference to a grant entry in a specified domain's grant table.
+ * Version 2 of the grant entry structure, here is an union because three
+ * different types are suppotted: full_page, sub_page and transitive.
+ */
+union grant_entry_v2 {
+    struct grant_entry_header hdr;
+
+    /*
+     * This member is used for V1-style full page grants, where either:
+     *
+     * -- hdr.type is GTF_accept_transfer, or
+     * -- hdr.type is GTF_permit_access and GTF_sub_page is not set.
+     *
+     * In that case, the frame field has the same semantics as the
+     * field of the same name in the V1 entry structure.
+     */
+    struct {
+	struct grant_entry_header hdr;
+	uint32_t pad0;
+	uint64_t frame;
+    } full_page;
+
+    /*
+     * If the grant type is GTF_grant_access and GTF_sub_page is set,
+     * @domid is allowed to access bytes [@page_off,@page_off+@length)
+     * in frame @frame.
+     */
+    struct {
+	struct grant_entry_header hdr;
+	uint16_t page_off;
+	uint16_t length;
+	uint64_t frame;
+    } sub_page;
+
+    /*
+     * If the grant is GTF_transitive, @domid is allowed to use the
+     * grant @gref in domain @trans_domid, as if it was the local
+     * domain.  Obviously, the transitive access must be compatible
+     * with the original grant.
+     */
+    struct {
+	struct grant_entry_header hdr;
+	domid_t trans_domid;
+	uint16_t pad0;
+	grant_ref_t gref;
+    } transitive;
+
+    uint32_t __spacer[4]; /* Pad to a power of two */
+};
+
+typedef uint16_t grant_status_t;
+
+/***********************************
+ * GRANT TABLE QUERIES AND USES
  */
-typedef uint32_t grant_ref_t;
 
 /*
  * Handle to track a mapping created via a grant reference.
@@ -322,6 +406,79 @@ struct gnttab_query_size {
 DEFINE_GUEST_HANDLE_STRUCT(gnttab_query_size);
 
 /*
+ * GNTTABOP_unmap_and_replace: Destroy one or more grant-reference mappings
+ * tracked by <handle> but atomically replace the page table entry with one
+ * pointing to the machine address under <new_addr>.  <new_addr> will be
+ * redirected to the null entry.
+ * NOTES:
+ *  1. The call may fail in an undefined manner if either mapping is not
+ *     tracked by <handle>.
+ *  2. After executing a batch of unmaps, it is guaranteed that no stale
+ *     mappings will remain in the device or host TLBs.
+ */
+#define GNTTABOP_unmap_and_replace    7
+struct gnttab_unmap_and_replace {
+    /* IN parameters. */
+    uint64_t host_addr;
+    uint64_t new_addr;
+    grant_handle_t handle;
+    /* OUT parameters. */
+    int16_t  status;              /* GNTST_* */
+};
+DEFINE_GUEST_HANDLE_STRUCT(gnttab_unmap_and_replace);
+
+/*
+ * GNTTABOP_set_version: Request a particular version of the grant
+ * table shared table structure.  This operation can only be performed
+ * once in any given domain.  It must be performed before any grants
+ * are activated; otherwise, the domain will be stuck with version 1.
+ * The only defined versions are 1 and 2.
+ */
+#define GNTTABOP_set_version          8
+struct gnttab_set_version {
+    /* IN parameters */
+    uint32_t version;
+};
+DEFINE_GUEST_HANDLE_STRUCT(gnttab_set_version);
+
+/*
+ * GNTTABOP_get_status_frames: Get the list of frames used to store grant
+ * status for <dom>. In grant format version 2, the status is separated
+ * from the other shared grant fields to allow more efficient synchronization
+ * using barriers instead of atomic cmpexch operations.
+ * <nr_frames> specify the size of vector <frame_list>.
+ * The frame addresses are returned in the <frame_list>.
+ * Only <nr_frames> addresses are returned, even if the table is larger.
+ * NOTES:
+ *  1. <dom> may be specified as DOMID_SELF.
+ *  2. Only a sufficiently-privileged domain may specify <dom> != DOMID_SELF.
+ */
+#define GNTTABOP_get_status_frames     9
+struct gnttab_get_status_frames {
+    /* IN parameters. */
+    uint32_t nr_frames;
+    domid_t  dom;
+    /* OUT parameters. */
+    int16_t  status;              /* GNTST_* */
+    GUEST_HANDLE(uint64_t) frame_list;
+};
+DEFINE_GUEST_HANDLE_STRUCT(gnttab_get_status_frames);
+
+/*
+ * GNTTABOP_get_version: Get the grant table version which is in
+ * effect for domain <dom>.
+ */
+#define GNTTABOP_get_version          10
+struct gnttab_get_version {
+    /* IN parameters */
+    domid_t dom;
+    uint16_t pad;
+    /* OUT parameters */
+    uint32_t version;
+};
+DEFINE_GUEST_HANDLE_STRUCT(gnttab_get_version);
+
+/*
  * Bitfield values for update_pin_status.flags.
  */
  /* Map the grant entry for access by I/O devices. */
diff --git a/include/xen/interface/xen.h b/include/xen/interface/xen.h
index 6a6e914..710afe0 100644
--- a/include/xen/interface/xen.h
+++ b/include/xen/interface/xen.h
@@ -523,6 +523,8 @@ struct tmem_op {
 	} u;
 };
 
+DEFINE_GUEST_HANDLE(uint64_t);
+
 #else /* __ASSEMBLY__ */
 
 /* In assembly code we cannot use C numeric constant suffixes. */
-- 
1.7.6.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 05:50:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 05:50:26 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQfsg-0005xs-4o; Wed, 16 Nov 2011 05:50:26 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQfrx-0005da-2V
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 05:49:42 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1321451376!4491648!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19926 invoked from network); 16 Nov 2011 13:49:37 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 16 Nov 2011 13:49:37 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAGDnW6Q019186
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 16 Nov 2011 13:49:33 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAGDnVIK025700
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 16 Nov 2011 13:49:32 GMT
Received: from abhmt112.oracle.com (abhmt112.oracle.com [141.146.116.64])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAGDnPIZ008722; Wed, 16 Nov 2011 07:49:25 -0600
Received: from annie2.cn.oracle.com.com (/10.182.37.169)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 16 Nov 2011 05:49:25 -0800
From: annie.li@oracle.com
To: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	konrad.wilk@oracle.com, jeremy@goop.org
Date: Wed, 16 Nov 2011 21:49:32 +0800
Message-Id: <1321451372-13596-1-git-send-email-annie.li@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <4EC3B62F.6080702@oracle.com>
References: <4EC3B62F.6080702@oracle.com>
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090203.4EC3BF6E.0002,ss=1,re=-2.300,fgs=0
Cc: kurt.hackel@oracle.com, annie.li@oracle.com, paul.durrant@citrix.com,
	Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH 2/3] xen/granttable: Grant tables V2
	implementation
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Annie Li <annie.li@oracle.com>

Receiver-side copying of packets is based on this implementation, it gives
better performance and better CPU accounting. It totally supports three types:
full-page, sub-page and transitive grants.

However this patch does not cover sub-page and transitive grants, it mainly
focus on Full-page part and implements grant table V2 interfaces corresponding
to what already exists in grant table V1, such as: grant table V2
initialization, mapping, releasing and exported interfaces.

Each guest can only supports one type of grant table type, every entry in grant
table should be the same version. It is necessary to set V1 or V2 version before
initializing the grant table.

Grant table exported interfaces of V2 are same with those of V1, Xen is
responsible to judge what grant table version guests are using in every grant
operation.

V2 fulfills the same role of V1, and it is totally backwards compitable with V1.
If dom0 support grant table V2, the guests runing on it can run with either V1
or V2.

Signed-off-by: Annie Li <annie.li@oracle.com>
---
 arch/x86/xen/grant-table.c |   37 +++++++++-
 drivers/xen/grant-table.c  |  187 +++++++++++++++++++++++++++++++++++++++++--
 include/xen/grant_table.h  |    6 +-
 3 files changed, 218 insertions(+), 12 deletions(-)

diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c
index c6ab2e7..510fca0 100644
--- a/arch/x86/xen/grant-table.c
+++ b/arch/x86/xen/grant-table.c
@@ -54,6 +54,20 @@ static int map_pte_fn(pte_t *pte, struct page *pmd_page,
 	return 0;
 }
 
+/*
+ * This function is used to map shared frames to store grant status. It is
+ * different from map_pte_fn above, the frames type here is uint64_t.
+ */
+static int map_pte_fn_status(pte_t *pte, struct page *pmd_page,
+			     unsigned long addr, void *data)
+{
+	uint64_t **frames = (uint64_t **)data;
+
+	set_pte_at(&init_mm, addr, pte, mfn_pte((*frames)[0], PAGE_KERNEL));
+	(*frames)++;
+	return 0;
+}
+
 static int unmap_pte_fn(pte_t *pte, struct page *pmd_page,
 			unsigned long addr, void *data)
 {
@@ -83,7 +97,28 @@ int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
 	return rc;
 }
 
-void arch_gnttab_unmap_shared(void *shared, unsigned long nr_gframes)
+int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_gframes,
+			   unsigned long max_nr_gframes,
+			   grant_status_t **__shared)
+{
+	int rc;
+	grant_status_t *shared = *__shared;
+
+	if (shared == NULL) {
+		struct vm_struct *area =
+			alloc_vm_area(PAGE_SIZE * max_nr_gframes);
+		BUG_ON(area == NULL);
+		shared = area->addr;
+		*__shared = shared;
+	}
+
+	rc = apply_to_page_range(&init_mm, (unsigned long)shared,
+				 PAGE_SIZE * nr_gframes,
+				 map_pte_fn_status, &frames);
+	return rc;
+}
+
+void arch_gnttab_unmap(void *shared, unsigned long nr_gframes)
 {
 	apply_to_page_range(&init_mm, (unsigned long)shared,
 			    PAGE_SIZE * nr_gframes, unmap_pte_fn, NULL);
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
index 1bd9d5f..0b412ce 100644
--- a/drivers/xen/grant-table.c
+++ b/drivers/xen/grant-table.c
@@ -44,6 +44,7 @@
 #include <xen/page.h>
 #include <xen/grant_table.h>
 #include <xen/interface/memory.h>
+#include <xen/hvc-console.h>
 #include <asm/xen/hypercall.h>
 
 #include <asm/pgtable.h>
@@ -53,7 +54,10 @@
 /* External tools reserve first few grant table entries. */
 #define NR_RESERVED_ENTRIES 8
 #define GNTTAB_LIST_END 0xffffffff
-#define GREFS_PER_GRANT_FRAME (PAGE_SIZE / sizeof(struct grant_entry_v1))
+#define GREFS_PER_GRANT_FRAME \
+(grant_table_version == 1 ?                      \
+ (PAGE_SIZE / sizeof(struct grant_entry_v1)) :   \
+ (PAGE_SIZE / sizeof(union grant_entry_v2)))
 
 static grant_ref_t **gnttab_list;
 static unsigned int nr_grant_frames;
@@ -66,6 +70,7 @@ EXPORT_SYMBOL_GPL(xen_hvm_resume_frames);
 
 static union {
 	struct grant_entry_v1 *v1;
+	union grant_entry_v2 *v2;
 	void *addr;
 } gnttab_shared;
 
@@ -118,6 +123,9 @@ static struct {
 	int (*query_foreign_access)(grant_ref_t);
 } gnttab_interface;
 
+/*This reflects status of grant entries, so act as a global value*/
+static grant_status_t *grstatus;
+
 static int grant_table_version;
 
 static struct gnttab_free_callback *gnttab_free_callback_list;
@@ -125,6 +133,7 @@ static struct gnttab_free_callback *gnttab_free_callback_list;
 static int gnttab_expand(unsigned int req_entries);
 
 #define RPP (PAGE_SIZE / sizeof(grant_ref_t))
+#define SPP (PAGE_SIZE / sizeof(grant_status_t))
 
 static inline grant_ref_t *__gnttab_entry(grant_ref_t entry)
 {
@@ -197,6 +206,7 @@ static void put_free_entry(grant_ref_t ref)
 }
 
 /*
+ * Following comments apply to update_grant_entry_v1 and update_grant_entry_v2.
  * Introducing a valid entry into the grant table:
  *  1. Write ent->domid.
  *  2. Write ent->frame:
@@ -215,6 +225,15 @@ static void update_grant_entry_v1(grant_ref_t ref, domid_t domid,
 	gnttab_shared.v1[ref].flags = flags;
 }
 
+static void update_grant_entry_v2(grant_ref_t ref, domid_t domid,
+				  unsigned long frame, unsigned flags)
+{
+	gnttab_shared.v2[ref].hdr.domid = domid;
+	gnttab_shared.v2[ref].full_page.frame = frame;
+	wmb();
+	gnttab_shared.v2[ref].hdr.flags = GTF_permit_access | flags;
+}
+
 /*
  * Public grant-issuing interface functions
  */
@@ -246,6 +265,11 @@ static int gnttab_query_foreign_access_v1(grant_ref_t ref)
 	return gnttab_shared.v1[ref].flags & (GTF_reading|GTF_writing);
 }
 
+static int gnttab_query_foreign_access_v2(grant_ref_t ref)
+{
+	return grstatus[ref] & (GTF_reading|GTF_writing);
+}
+
 int gnttab_query_foreign_access(grant_ref_t ref)
 {
 	return gnttab_interface.query_foreign_access(ref);
@@ -271,6 +295,29 @@ static int gnttab_end_foreign_access_ref_v1(grant_ref_t ref, int readonly)
 	return 1;
 }
 
+static int gnttab_end_foreign_access_ref_v2(grant_ref_t ref, int readonly)
+{
+	gnttab_shared.v2[ref].hdr.flags = 0;
+	mb();
+	if (grstatus[ref] & (GTF_reading|GTF_writing)) {
+		return 0;
+	} else {
+		/* The read of grstatus needs to have acquire
+		semantics.  On x86, reads already have
+		that, and we just need to protect against
+		compiler reorderings.  On other
+		architectures we may need a full
+		barrier. */
+#ifdef CONFIG_X86
+		barrier();
+#else
+		mb();
+#endif
+		}
+
+	return 1;
+}
+
 int gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly)
 {
 	return gnttab_interface.end_foreign_access_ref(ref, readonly);
@@ -344,6 +391,37 @@ static unsigned long gnttab_end_foreign_transfer_ref_v1(grant_ref_t ref)
 	return frame;
 }
 
+static unsigned long gnttab_end_foreign_transfer_ref_v2(grant_ref_t ref)
+{
+	unsigned long frame;
+	u16           flags;
+	u16          *pflags;
+
+	pflags = &gnttab_shared.v2[ref].hdr.flags;
+
+	/*
+	 * If a transfer is not even yet started, try to reclaim the grant
+	 * reference and return failure (== 0).
+	 */
+	while (!((flags = *pflags) & GTF_transfer_committed)) {
+		if (sync_cmpxchg(pflags, flags, 0) == flags)
+			return 0;
+		cpu_relax();
+	}
+
+	/* If a transfer is in progress then wait until it is completed. */
+	while (!(flags & GTF_transfer_completed)) {
+		flags = *pflags;
+		cpu_relax();
+	}
+
+	rmb();  /* Read the frame number /after/ reading completion status. */
+	frame = gnttab_shared.v2[ref].full_page.frame;
+	BUG_ON(frame == 0);
+
+	return frame;
+}
+
 unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref)
 {
 	return gnttab_interface.end_foreign_transfer_ref(ref);
@@ -591,6 +669,11 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
 }
 EXPORT_SYMBOL_GPL(gnttab_unmap_refs);
 
+static unsigned nr_status_frames(unsigned nr_grant_frames)
+{
+	return (nr_grant_frames * GREFS_PER_GRANT_FRAME + SPP - 1) / SPP;
+}
+
 static int gnttab_map_frames_v1(unsigned long *frames, unsigned int nr_gframes)
 {
 	int rc;
@@ -605,7 +688,56 @@ static int gnttab_map_frames_v1(unsigned long *frames, unsigned int nr_gframes)
 
 static void gnttab_unmap_frames_v1(void)
 {
-	arch_gnttab_unmap_shared(gnttab_shared.addr, nr_grant_frames);
+	arch_gnttab_unmap(gnttab_shared.addr, nr_grant_frames);
+}
+
+static int gnttab_map_frames_v2(unsigned long *frames, unsigned int nr_gframes)
+{
+	uint64_t *sframes;
+	unsigned int nr_sframes;
+	struct gnttab_get_status_frames getframes;
+	int rc;
+
+	nr_sframes = nr_status_frames(nr_gframes);
+
+	/* No need for kzalloc as it is initialized in following hypercall
+	 * GNTTABOP_get_status_frames.
+	 */
+	sframes = kmalloc(nr_sframes  * sizeof(uint64_t), GFP_ATOMIC);
+	if (!sframes)
+		return -ENOMEM;
+
+	getframes.dom        = DOMID_SELF;
+	getframes.nr_frames  = nr_sframes;
+	set_xen_guest_handle(getframes.frame_list, sframes);
+
+	rc = HYPERVISOR_grant_table_op(GNTTABOP_get_status_frames,
+				       &getframes, 1);
+	if (rc == -ENOSYS) {
+		kfree(sframes);
+		return -ENOSYS;
+	}
+
+	BUG_ON(rc || getframes.status);
+
+	rc = arch_gnttab_map_status(sframes, nr_sframes,
+				    nr_status_frames(gnttab_max_grant_frames()),
+				    &grstatus);
+	BUG_ON(rc);
+	kfree(sframes);
+
+	rc = arch_gnttab_map_shared(frames, nr_gframes,
+				    gnttab_max_grant_frames(),
+				    &gnttab_shared.addr);
+	BUG_ON(rc);
+
+	return 0;
+}
+
+static void gnttab_unmap_frames_v2(void)
+{
+	arch_gnttab_unmap(gnttab_shared.addr, nr_grant_frames);
+	arch_gnttab_unmap(grstatus, nr_status_frames(nr_grant_frames));
 }
 
 static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
@@ -639,6 +771,9 @@ static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
 		return rc;
 	}
 
+	/* No need for kzalloc as it is initialized in following hypercall
+	 * GNTTABOP_setup_table.
+	 */
 	frames = kmalloc(nr_gframes * sizeof(unsigned long), GFP_ATOMIC);
 	if (!frames)
 		return -ENOMEM;
@@ -659,20 +794,54 @@ static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
 
 	kfree(frames);
 
+	if (rc < 0)
+		return rc;
 	return 0;
 }
 
 static void gnttab_request_version(void)
 {
-	grant_table_version = 1;
-	gnttab_interface.map_frames = gnttab_map_frames_v1;
-	gnttab_interface.unmap_frames = gnttab_unmap_frames_v1;
-	gnttab_interface.update_entry = update_grant_entry_v1;
-	gnttab_interface.end_foreign_access_ref =
+	int rc;
+	struct gnttab_set_version gsv;
+	const char *str = "we need grant tables version 2, but only version 1 is available\n";
+
+	gsv.version = 2;
+	rc = HYPERVISOR_grant_table_op(GNTTABOP_set_version, &gsv, 1);
+	if (rc == 0) {
+		grant_table_version = 2;
+		gnttab_interface.map_frames = gnttab_map_frames_v2;
+		gnttab_interface.unmap_frames = gnttab_unmap_frames_v2;
+		gnttab_interface.update_entry = update_grant_entry_v2;
+		gnttab_interface.end_foreign_access_ref =
+					gnttab_end_foreign_access_ref_v2;
+		gnttab_interface.end_foreign_transfer_ref =
+					gnttab_end_foreign_transfer_ref_v2;
+		gnttab_interface.query_foreign_access =
+					gnttab_query_foreign_access_v2;
+	} else {
+		if (grant_table_version == 2) {
+			/*
+			 * If we've already used version 2 features,
+			 * but then suddenly discover that they're not
+			 * available (e.g. migrating to an older
+			 * version of Xen), almost unbounded badness
+			 * can happen.
+			 */
+			xen_raw_printk(str);
+			panic(str);
+		}
+		grant_table_version = 1;
+		gnttab_interface.map_frames = gnttab_map_frames_v1;
+		gnttab_interface.unmap_frames = gnttab_unmap_frames_v1;
+		gnttab_interface.update_entry = update_grant_entry_v1;
+		gnttab_interface.end_foreign_access_ref =
 					gnttab_end_foreign_access_ref_v1;
-	gnttab_interface.end_foreign_transfer_ref =
+		gnttab_interface.end_foreign_transfer_ref =
 					gnttab_end_foreign_transfer_ref_v1;
-	gnttab_interface.query_foreign_access = gnttab_query_foreign_access_v1;
+		gnttab_interface.query_foreign_access =
+					gnttab_query_foreign_access_v1;
+
+	}
 	printk(KERN_INFO "Grant tables using version %d layout.\n",
 		grant_table_version);
 }
diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
index c7a40f8..5494c40 100644
--- a/include/xen/grant_table.h
+++ b/include/xen/grant_table.h
@@ -146,8 +146,10 @@ gnttab_set_unmap_op(struct gnttab_unmap_grant_ref *unmap, phys_addr_t addr,
 int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
 			   unsigned long max_nr_gframes,
 			   void **__shared);
-void arch_gnttab_unmap_shared(void *shared,
-			      unsigned long nr_gframes);
+int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_gframes,
+			   unsigned long max_nr_gframes,
+			   grant_status_t **__shared);
+void arch_gnttab_unmap(void *shared, unsigned long nr_gframes);
 
 extern unsigned long xen_hvm_resume_frames;
 unsigned int gnttab_max_grant_frames(void);
-- 
1.7.6.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 05:51:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 05:51:31 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQftj-0006MS-Ot; Wed, 16 Nov 2011 05:51:31 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQfsu-00062P-VB
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 05:50:41 -0800
X-Env-Sender: annie.li@oracle.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1321451436!1812141!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23359 invoked from network); 16 Nov 2011 13:50:37 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-9.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 16 Nov 2011 13:50:37 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAGDoUtJ026351
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 16 Nov 2011 13:50:31 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAGDoT7P027448
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 16 Nov 2011 13:50:30 GMT
Received: from abhmt106.oracle.com (abhmt106.oracle.com [141.146.116.58])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAGDoOJc009478; Wed, 16 Nov 2011 07:50:24 -0600
Received: from annie2.cn.oracle.com.com (/10.182.37.169)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 16 Nov 2011 05:50:23 -0800
From: annie.li@oracle.com
To: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	konrad.wilk@oracle.com, jeremy@goop.org
Date: Wed, 16 Nov 2011 21:50:31 +0800
Message-Id: <1321451431-13632-1-git-send-email-annie.li@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <4EC3B62F.6080702@oracle.com>
References: <4EC3B62F.6080702@oracle.com>
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090208.4EC3BFA9.0021,ss=1,re=0.000,fgs=0
Cc: kurt.hackel@oracle.com, annie.li@oracle.com, paul.durrant@citrix.com,
	Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH 3/3] xen/granttable: Keep code format clean
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Annie Li <annie.li@oracle.com>

Signed-off-by: Annie Li <annie.li@oracle.com>
---
 drivers/xen/grant-table.c |    7 +++----
 include/xen/grant_table.h |    2 +-
 2 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
index 0b412ce..a7eabb0 100644
--- a/drivers/xen/grant-table.c
+++ b/drivers/xen/grant-table.c
@@ -50,7 +50,6 @@
 #include <asm/pgtable.h>
 #include <asm/sync_bitops.h>
 
-
 /* External tools reserve first few grant table entries. */
 #define NR_RESERVED_ENTRIES 8
 #define GNTTAB_LIST_END 0xffffffff
@@ -597,8 +596,8 @@ unsigned int gnttab_max_grant_frames(void)
 EXPORT_SYMBOL_GPL(gnttab_max_grant_frames);
 
 int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,
-			struct gnttab_map_grant_ref *kmap_ops,
-			struct page **pages, unsigned int count)
+		    struct gnttab_map_grant_ref *kmap_ops,
+		    struct page **pages, unsigned int count)
 {
 	int i, ret;
 	pte_t *pte;
@@ -648,7 +647,7 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,
 EXPORT_SYMBOL_GPL(gnttab_map_refs);
 
 int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
-		struct page **pages, unsigned int count)
+		      struct page **pages, unsigned int count)
 {
 	int i, ret;
 
diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
index 5494c40..fea4954 100644
--- a/include/xen/grant_table.h
+++ b/include/xen/grant_table.h
@@ -157,7 +157,7 @@ unsigned int gnttab_max_grant_frames(void);
 #define gnttab_map_vaddr(map) ((void *)(map.host_virt_addr))
 
 int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,
-			struct gnttab_map_grant_ref *kmap_ops,
+		    struct gnttab_map_grant_ref *kmap_ops,
 		    struct page **pages, unsigned int count);
 int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
 		      struct page **pages, unsigned int count);
-- 
1.7.6.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 06:03:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 06:03:03 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQg4q-0006ys-9j; Wed, 16 Nov 2011 06:03:00 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQg1O-0006jB-J2
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 05:59:28 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1321451963!3368885!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8916 invoked from network); 16 Nov 2011 13:59:23 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-4.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 16 Nov 2011 13:59:23 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 16 Nov 2011 13:59:22 +0000
Message-Id: <4EC3CFCA02000078000614F2@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 
Date: Wed, 16 Nov 2011 13:59:22 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Subject: [Xen-devel] [PATCH 0/2] x86: emulator improvements
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

1: x86/emulator: add feature checks for newer instructions
2: x86/emulator: generalize movq emulation (SSE2 and AVX variants)

Signed-off-by: Jan Beulich <jbeulich@suse.com>


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 06:04:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 06:04:54 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQg6f-0007OR-8X; Wed, 16 Nov 2011 06:04:53 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQg1q-0006jO-NO
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 05:59:58 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1321451952!63433813!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11762 invoked from network); 16 Nov 2011 13:59:12 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-2.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 16 Nov 2011 13:59:12 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 16 Nov 2011 13:59:50 +0000
Message-Id: <4EC3CFE702000078000614F6@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 
Date: Wed, 16 Nov 2011 13:59:51 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__PartE3CC63C7.0__="
Subject: [Xen-devel] [PATCH 1/2] x86/emulator: add feature checks for newer
 instructions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__PartE3CC63C7.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Certain instructions were introduced only after the i686 or original
x86-64 architecture, so we should not try to emulate them if the guest
is not seeing the respective feature enabled (or, worse, if the
underlying hardware doesn't support them). This affects fisttp, movnti,
and cmpxchg16b.

Also add a "run" target to the test code makefile, to simplify building
and running.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/tools/tests/x86_emulator/Makefile
+++ b/tools/tests/x86_emulator/Makefile
@@ -7,6 +7,9 @@ TARGET :=3D test_x86_emulator
 .PHONY: all
 all: $(TARGET)
=20
+run: $(TARGET)
+	./$(TARGET)
+
 .PHONY: blowfish.h
 blowfish.h:
 	rm -f blowfish.bin
@@ -38,7 +41,7 @@ x86_emulate:
 	[ -L x86_emulate ] || ln -sf $(XEN_ROOT)/xen/arch/x86/x86_emulate =
.
=20
 x86_emulate.o: x86_emulate.c x86_emulate
-	$(HOSTCC) $(HOSTCFLAGS) -I$(XEN_ROOT)/xen/include -c -o $@ $<
+	$(HOSTCC) $(HOSTCFLAGS) -I$(XEN_ROOT)/xen/include -imacros =
asm-x86/cpufeature.h -c -o $@ $<
=20
 test_x86_emulator.o: test_x86_emulator.c blowfish.h x86_emulate
 	$(HOSTCC) $(HOSTCFLAGS) -I$(XEN_ROOT)/xen/include -c -o $@ $<
--- a/tools/tests/x86_emulator/x86_emulate.c
+++ b/tools/tests/x86_emulator/x86_emulate.c
@@ -1,7 +1,13 @@
+#include <stdbool.h>
 #include <stddef.h>
 #include <stdint.h>
+#include <stdlib.h>
 #include <string.h>
 #include <public/xen.h>
=20
+typedef bool bool_t;
+
+#define BUG() abort()
+
 #include "x86_emulate/x86_emulate.h"
 #include "x86_emulate/x86_emulate.c"
--- a/xen/arch/x86/x86_emulate.c
+++ b/xen/arch/x86/x86_emulate.c
@@ -9,6 +9,7 @@
  *    Keir Fraser <keir@xen.org>
  */
=20
+#include <asm/cpufeature.h>
 #include <asm/x86_emulate.h>
=20
 /* Avoid namespace pollution. */
--- a/xen/arch/x86/x86_emulate/x86_emulate.c
+++ b/xen/arch/x86/x86_emulate/x86_emulate.c
@@ -932,6 +932,50 @@ static int ioport_access_check(
     return ops->inject_hw_exception(EXC_GP, 0, ctxt) ? : X86EMUL_EXCEPTION=
;
 }
=20
+#define EAX 0
+#define ECX 1
+#define EDX 2
+#define EBX 3
+
+static bool_t vcpu_has(
+    unsigned int eax,
+    unsigned int ecx,
+    unsigned int reg,
+    unsigned int bit,
+    struct x86_emulate_ctxt *ctxt,
+    const struct x86_emulate_ops *ops)
+{
+    unsigned int edx, ebx;
+    int rc =3D X86EMUL_OKAY;
+
+    fail_if(!ops->cpuid);
+    rc =3D ops->cpuid(&eax, &ebx, &ecx, &edx, ctxt);
+    if ( rc =3D=3D X86EMUL_OKAY )
+    {
+        switch ( reg )
+        {
+        case EAX: reg =3D eax; break;
+        case EBX: reg =3D ebx; break;
+        case ECX: reg =3D ecx; break;
+        case EDX: reg =3D edx; break;
+        default: BUG();
+        }
+        if ( !(reg & (1U << bit)) )
+            rc =3D ~X86EMUL_OKAY;
+    }
+
+ done:
+    return rc =3D=3D X86EMUL_OKAY;
+}
+
+#define vcpu_must_have(leaf, subleaf, reg, feature) \
+    generate_exception_if(!vcpu_has(leaf, subleaf, reg, \
+                                    X86_FEATURE_##feature % 32, \
+                                    ctxt, ops), EXC_UD, -1)
+#define vcpu_must_have_sse2() vcpu_must_have(1, 0, EDX, XMM2)
+#define vcpu_must_have_sse3() vcpu_must_have(1, 0, ECX, XMM3)
+#define vcpu_must_have_cx16() vcpu_must_have(1, 0, ECX, CX16)
+
 static int
 in_realmode(
     struct x86_emulate_ctxt *ctxt,
@@ -2738,6 +2782,7 @@ x86_emulate(
                 emulate_fpu_insn_memsrc("fildl", src.val);
                 break;
             case 1: /* fisttp m32i */
+                vcpu_must_have_sse3();
                 ea.bytes =3D 4;
                 dst =3D ea;
                 dst.type =3D OP_MEM;
@@ -2846,6 +2891,7 @@ x86_emulate(
                 emulate_fpu_insn_memsrc("fldl", src.val);
                 break;
             case 1: /* fisttp m64i */
+                vcpu_must_have_sse3();
                 ea.bytes =3D 8;
                 dst =3D ea;
                 dst.type =3D OP_MEM;
@@ -2953,6 +2999,7 @@ x86_emulate(
                 emulate_fpu_insn_memsrc("filds", src.val);
                 break;
             case 1: /* fisttp m16i */
+                vcpu_must_have_sse3();
                 ea.bytes =3D 2;
                 dst =3D ea;
                 dst.type =3D OP_MEM;
@@ -4141,6 +4188,7 @@ x86_emulate(
=20
     case 0xc3: /* movnti */
         /* Ignore the non-temporal hint for now. */
+        vcpu_must_have_sse2();
         generate_exception_if(dst.bytes <=3D 2, EXC_UD, -1);
         dst.val =3D src.val;
         break;
@@ -4151,6 +4199,8 @@ x86_emulate(
=20
         generate_exception_if((modrm_reg & 7) !=3D 1, EXC_UD, -1);
         generate_exception_if(ea.type !=3D OP_MEM, EXC_UD, -1);
+        if ( op_bytes =3D=3D 8 )
+            vcpu_must_have_cx16();
         op_bytes *=3D 2;
=20
         /* Get actual old value. */



--=__PartE3CC63C7.0__=
Content-Type: text/plain; name="x86-emul-feature-checks.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="x86-emul-feature-checks.patch"

x86/emulator: add feature checks for newer instructions=0A=0ACertain =
instructions were introduced only after the i686 or original=0Ax86-64 =
architecture, so we should not try to emulate them if the guest=0Ais not =
seeing the respective feature enabled (or, worse, if the=0Aunderlying =
hardware doesn't support them). This affects fisttp, movnti,=0Aand =
cmpxchg16b.=0A=0AAlso add a "run" target to the test code makefile, to =
simplify building=0Aand running.=0A=0ASigned-off-by: Jan Beulich <jbeulich@=
suse.com>=0A=0A--- a/tools/tests/x86_emulator/Makefile=0A+++ b/tools/tests/=
x86_emulator/Makefile=0A@@ -7,6 +7,9 @@ TARGET :=3D test_x86_emulator=0A =
.PHONY: all=0A all: $(TARGET)=0A =0A+run: $(TARGET)=0A+	./$(TARGET)=0A+=0A =
.PHONY: blowfish.h=0A blowfish.h:=0A 	rm -f blowfish.bin=0A@@ -38,7 =
+41,7 @@ x86_emulate:=0A 	[ -L x86_emulate ] || ln -sf $(XEN_ROOT)/xe=
n/arch/x86/x86_emulate .=0A =0A x86_emulate.o: x86_emulate.c x86_emulate=0A=
-	$(HOSTCC) $(HOSTCFLAGS) -I$(XEN_ROOT)/xen/include -c -o $@ $<=0A+	=
$(HOSTCC) $(HOSTCFLAGS) -I$(XEN_ROOT)/xen/include -imacros asm-x86/cpufeatu=
re.h -c -o $@ $<=0A =0A test_x86_emulator.o: test_x86_emulator.c blowfish.h=
 x86_emulate=0A 	$(HOSTCC) $(HOSTCFLAGS) -I$(XEN_ROOT)/xen/include =
-c -o $@ $<=0A--- a/tools/tests/x86_emulator/x86_emulate.c=0A+++ b/tools/te=
sts/x86_emulator/x86_emulate.c=0A@@ -1,7 +1,13 @@=0A+#include <stdbool.h>=
=0A #include <stddef.h>=0A #include <stdint.h>=0A+#include <stdlib.h>=0A =
#include <string.h>=0A #include <public/xen.h>=0A =0A+typedef bool =
bool_t;=0A+=0A+#define BUG() abort()=0A+=0A #include "x86_emulate/x86_emula=
te.h"=0A #include "x86_emulate/x86_emulate.c"=0A--- a/xen/arch/x86/x86_emul=
ate.c=0A+++ b/xen/arch/x86/x86_emulate.c=0A@@ -9,6 +9,7 @@=0A  *    Keir =
Fraser <keir@xen.org>=0A  */=0A =0A+#include <asm/cpufeature.h>=0A =
#include <asm/x86_emulate.h>=0A =0A /* Avoid namespace pollution. */=0A--- =
a/xen/arch/x86/x86_emulate/x86_emulate.c=0A+++ b/xen/arch/x86/x86_emulate/x=
86_emulate.c=0A@@ -932,6 +932,50 @@ static int ioport_access_check(=0A     =
return ops->inject_hw_exception(EXC_GP, 0, ctxt) ? : X86EMUL_EXCEPTION;=0A =
}=0A =0A+#define EAX 0=0A+#define ECX 1=0A+#define EDX 2=0A+#define EBX =
3=0A+=0A+static bool_t vcpu_has(=0A+    unsigned int eax,=0A+    unsigned =
int ecx,=0A+    unsigned int reg,=0A+    unsigned int bit,=0A+    struct =
x86_emulate_ctxt *ctxt,=0A+    const struct x86_emulate_ops *ops)=0A+{=0A+ =
   unsigned int edx, ebx;=0A+    int rc =3D X86EMUL_OKAY;=0A+=0A+    =
fail_if(!ops->cpuid);=0A+    rc =3D ops->cpuid(&eax, &ebx, &ecx, &edx, =
ctxt);=0A+    if ( rc =3D=3D X86EMUL_OKAY )=0A+    {=0A+        switch ( =
reg )=0A+        {=0A+        case EAX: reg =3D eax; break;=0A+        =
case EBX: reg =3D ebx; break;=0A+        case ECX: reg =3D ecx; break;=0A+ =
       case EDX: reg =3D edx; break;=0A+        default: BUG();=0A+        =
}=0A+        if ( !(reg & (1U << bit)) )=0A+            rc =3D ~X86EMUL_OKA=
Y;=0A+    }=0A+=0A+ done:=0A+    return rc =3D=3D X86EMUL_OKAY;=0A+}=0A+=0A=
+#define vcpu_must_have(leaf, subleaf, reg, feature) \=0A+    generate_exce=
ption_if(!vcpu_has(leaf, subleaf, reg, \=0A+                               =
     X86_FEATURE_##feature % 32, \=0A+                                    =
ctxt, ops), EXC_UD, -1)=0A+#define vcpu_must_have_sse2() vcpu_must_have(1, =
0, EDX, XMM2)=0A+#define vcpu_must_have_sse3() vcpu_must_have(1, 0, ECX, =
XMM3)=0A+#define vcpu_must_have_cx16() vcpu_must_have(1, 0, ECX, =
CX16)=0A+=0A static int=0A in_realmode(=0A     struct x86_emulate_ctxt =
*ctxt,=0A@@ -2738,6 +2782,7 @@ x86_emulate(=0A                 emulate_fpu_=
insn_memsrc("fildl", src.val);=0A                 break;=0A             =
case 1: /* fisttp m32i */=0A+                vcpu_must_have_sse3();=0A     =
            ea.bytes =3D 4;=0A                 dst =3D ea;=0A              =
   dst.type =3D OP_MEM;=0A@@ -2846,6 +2891,7 @@ x86_emulate(=0A            =
     emulate_fpu_insn_memsrc("fldl", src.val);=0A                 =
break;=0A             case 1: /* fisttp m64i */=0A+                =
vcpu_must_have_sse3();=0A                 ea.bytes =3D 8;=0A               =
  dst =3D ea;=0A                 dst.type =3D OP_MEM;=0A@@ -2953,6 +2999,7 =
@@ x86_emulate(=0A                 emulate_fpu_insn_memsrc("filds", =
src.val);=0A                 break;=0A             case 1: /* fisttp m16i =
*/=0A+                vcpu_must_have_sse3();=0A                 ea.bytes =
=3D 2;=0A                 dst =3D ea;=0A                 dst.type =3D =
OP_MEM;=0A@@ -4141,6 +4188,7 @@ x86_emulate(=0A =0A     case 0xc3: /* =
movnti */=0A         /* Ignore the non-temporal hint for now. */=0A+       =
 vcpu_must_have_sse2();=0A         generate_exception_if(dst.bytes <=3D 2, =
EXC_UD, -1);=0A         dst.val =3D src.val;=0A         break;=0A@@ =
-4151,6 +4199,8 @@ x86_emulate(=0A =0A         generate_exception_if((modrm=
_reg & 7) !=3D 1, EXC_UD, -1);=0A         generate_exception_if(ea.type =
!=3D OP_MEM, EXC_UD, -1);=0A+        if ( op_bytes =3D=3D 8 )=0A+          =
  vcpu_must_have_cx16();=0A         op_bytes *=3D 2;=0A =0A         /* Get =
actual old value. */=0A
--=__PartE3CC63C7.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__PartE3CC63C7.0__=--


From xen-devel-bounces@lists.xensource.com Wed Nov 16 06:07:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 06:07:15 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQg8w-0007tZ-G6; Wed, 16 Nov 2011 06:07:14 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQg2Z-0006kB-0e
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 06:01:15 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1321451997!52484247!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19726 invoked from network); 16 Nov 2011 13:59:57 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-8.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 16 Nov 2011 13:59:57 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 16 Nov 2011 14:00:21 +0000
Message-Id: <4EC3D00602000078000614FC@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 
Date: Wed, 16 Nov 2011 14:00:22 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__PartC2ED42E6.0__="
Subject: [Xen-devel] [PATCH 2/2] x86/emulator: generalize movq emulation
 (SSE2 and AVX variants)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__PartC2ED42E6.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Extend the existing movq emulation to also support its SSE2 and AVX
variants, the latter implying the addition of VEX decoding. Fold the
read and write cases (as most of the logic is identical), and add
movntq and variants (as they're very similar).

Extend the testing code to also exercise these instructions.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/tools/tests/x86_emulator/test_x86_emulator.c
+++ b/tools/tests/x86_emulator/test_x86_emulator.c
@@ -1,3 +1,5 @@
+#include <errno.h>
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -53,11 +55,84 @@ static int cmpxchg(
     return X86EMUL_OKAY;
 }
=20
+static int cpuid(
+    unsigned int *eax,
+    unsigned int *ebx,
+    unsigned int *ecx,
+    unsigned int *edx,
+    struct x86_emulate_ctxt *ctxt)
+{
+    asm ("cpuid" : "+a" (*eax), "+c" (*ecx), "=3Dd" (*edx), "=3Db" =
(*ebx));
+    return X86EMUL_OKAY;
+}
+
+#define cpu_has_mmx ({ \
+    unsigned int eax =3D 1, ecx =3D 0, edx; \
+    cpuid(&eax, &ecx, &ecx, &edx, NULL); \
+    (edx & (1U << 23)) !=3D 0; \
+})
+
+#define cpu_has_sse ({ \
+    unsigned int eax =3D 1, ecx =3D 0, edx; \
+    cpuid(&eax, &ecx, &ecx, &edx, NULL); \
+    (edx & (1U << 25)) !=3D 0; \
+})
+
+#define cpu_has_sse2 ({ \
+    unsigned int eax =3D 1, ecx =3D 0, edx; \
+    cpuid(&eax, &ecx, &ecx, &edx, NULL); \
+    (edx & (1U << 26)) !=3D 0; \
+})
+
+static inline uint64_t xgetbv(uint32_t xcr)
+{
+    uint64_t res;
+
+    asm ( ".byte 0x0f, 0x01, 0xd0" : "=3DA" (res) : "c" (xcr) );
+
+    return res;
+}
+
+#define cpu_has_avx ({ \
+    unsigned int eax =3D 1, ecx =3D 0, edx; \
+    cpuid(&eax, &edx, &ecx, &edx, NULL); \
+    if ( !(ecx & (1U << 27)) || (xgetbv(0) & 6) !=3D 6 ) \
+        ecx =3D 0; \
+    (ecx & (1U << 28)) !=3D 0; \
+})
+
+int get_fpu(
+    void (*exception_callback)(void *, struct cpu_user_regs *),
+    void *exception_callback_arg,
+    enum x86_emulate_fpu_type type,
+    struct x86_emulate_ctxt *ctxt)
+{
+    switch ( type )
+    {
+    case X86EMUL_FPU_fpu:
+        break;
+    case X86EMUL_FPU_ymm:
+        if ( cpu_has_avx )
+            break;
+    case X86EMUL_FPU_xmm:
+        if ( cpu_has_sse )
+            break;
+    case X86EMUL_FPU_mmx:
+        if ( cpu_has_mmx )
+            break;
+    default:
+        return X86EMUL_UNHANDLEABLE;
+    }
+    return X86EMUL_OKAY;
+}
+
 static struct x86_emulate_ops emulops =3D {
     .read       =3D read,
     .insn_fetch =3D read,
     .write      =3D write,
     .cmpxchg    =3D cmpxchg,
+    .cpuid      =3D cpuid,
+    .get_fpu    =3D get_fpu,
 };
=20
 int main(int argc, char **argv)
@@ -66,6 +141,8 @@ int main(int argc, char **argv)
     struct cpu_user_regs regs;
     char *instr;
     unsigned int *res, i, j;
+    unsigned long sp;
+    bool stack_exec;
     int rc;
 #ifndef __x86_64__
     unsigned int bcdres_native, bcdres_emul;
@@ -85,6 +162,16 @@ int main(int argc, char **argv)
     }
     instr =3D (char *)res + 0x100;
=20
+#ifdef __x86_64__
+    asm ("movq %%rsp, %0" : "=3Dg" (sp));
+#else
+    asm ("movl %%esp, %0" : "=3Dg" (sp));
+#endif
+    stack_exec =3D mprotect((void *)(sp & -0x1000L) - (MMAP_SZ - 0x1000),
+                          MMAP_SZ, PROT_READ|PROT_WRITE|PROT_EXEC) =3D=3D =
0;
+    if ( !stack_exec )
+        printf("Warning: Stack could not be made executable (%d).\n", =
errno);
+
     printf("%-40s", "Testing addl %%ecx,(%%eax)...");
     instr[0] =3D 0x01; instr[1] =3D 0x08;
     regs.eflags =3D 0x200;
@@ -442,6 +529,108 @@ int main(int argc, char **argv)
     printf("skipped\n");
 #endif
=20
+    printf("%-40s", "Testing movq %mm3,(%ecx)...");
+    if ( stack_exec && cpu_has_mmx )
+    {
+        extern const unsigned char movq_to_mem[];
+
+        asm volatile ( "pcmpeqb %%mm3, %%mm3\n"
+                       ".pushsection .test, \"a\", @progbits\n"
+                       "movq_to_mem: movq %%mm3, (%0)\n"
+                       ".popsection" :: "c" (NULL) );
+
+        memcpy(instr, movq_to_mem, 15);
+        memset(res, 0x33, 64);
+        memset(res + 8, 0xff, 8);
+        regs.eip    =3D (unsigned long)&instr[0];
+        regs.ecx    =3D (unsigned long)res;
+        rc =3D x86_emulate(&ctxt, &emulops);
+        if ( (rc !=3D X86EMUL_OKAY) ||
+             memcmp(res, res + 8, 32) )
+            goto fail;
+        printf("okay\n");
+    }
+    else
+        printf("skipped\n");
+
+    printf("%-40s", "Testing movq (%edx),%mm5...");
+    if ( stack_exec && cpu_has_mmx )
+    {
+        extern const unsigned char movq_from_mem[];
+
+        asm volatile ( "pcmpgtb %%mm5, %%mm5\n"
+                       ".pushsection .test, \"a\", @progbits\n"
+                       "movq_from_mem: movq (%0), %%mm5\n"
+                       ".popsection" :: "d" (NULL) );
+
+        memcpy(instr, movq_from_mem, 15);
+        regs.eip    =3D (unsigned long)&instr[0];
+        regs.ecx    =3D 0;
+        regs.edx    =3D (unsigned long)res;
+        rc =3D x86_emulate(&ctxt, &emulops);
+        if ( rc !=3D X86EMUL_OKAY )
+            goto fail;
+        asm ( "pcmpeqb %%mm3, %%mm3\n\t"
+              "pcmpeqb %%mm5, %%mm3\n\t"
+              "pmovmskb %%mm3, %0" : "=3Dr" (rc) );
+        if ( rc !=3D 0xff )
+            goto fail;
+        printf("okay\n");
+    }
+    else
+        printf("skipped\n");
+
+    printf("%-40s", "Testing movdqu %xmm2,(%ecx)...");
+    if ( stack_exec && cpu_has_sse2 )
+    {
+        extern const unsigned char movdqu_to_mem[];
+
+        asm volatile ( "pcmpeqb %%xmm2, %%xmm2\n"
+                       ".pushsection .test, \"a\", @progbits\n"
+                       "movdqu_to_mem: movdqu %%xmm2, (%0)\n"
+                       ".popsection" :: "c" (NULL) );
+
+        memcpy(instr, movdqu_to_mem, 15);
+        memset(res, 0x55, 64);
+        memset(res + 8, 0xff, 16);
+        regs.eip    =3D (unsigned long)&instr[0];
+        regs.ecx    =3D (unsigned long)res;
+        rc =3D x86_emulate(&ctxt, &emulops);
+        if ( (rc !=3D X86EMUL_OKAY) ||
+             memcmp(res, res + 8, 32) )
+            goto fail;
+        printf("okay\n");
+    }
+    else
+        printf("skipped\n");
+
+    printf("%-40s", "Testing movdqu (%edx),%xmm4...");
+    if ( stack_exec && cpu_has_sse2 )
+    {
+        extern const unsigned char movdqu_from_mem[];
+
+        asm volatile ( "pcmpgtb %%xmm4, %%xmm4\n"
+                       ".pushsection .test, \"a\", @progbits\n"
+                       "movdqu_from_mem: movdqu (%0), %%xmm4\n"
+                       ".popsection" :: "d" (NULL) );
+
+        memcpy(instr, movdqu_from_mem, 15);
+        regs.eip    =3D (unsigned long)&instr[0];
+        regs.ecx    =3D 0;
+        regs.edx    =3D (unsigned long)res;
+        rc =3D x86_emulate(&ctxt, &emulops);
+        if ( rc !=3D X86EMUL_OKAY )
+            goto fail;
+        asm ( "pcmpeqb %%xmm2, %%xmm2\n\t"
+              "pcmpeqb %%xmm4, %%xmm2\n\t"
+              "pmovmskb %%xmm2, %0" : "=3Dr" (rc) );
+        if ( rc !=3D 0xffff )
+            goto fail;
+        printf("okay\n");
+    }
+    else
+        printf("skipped\n");
+
     for ( j =3D 1; j <=3D 2; j++ )
     {
 #if defined(__i386__)
--- a/tools/tests/x86_emulator/x86_emulate.c
+++ b/tools/tests/x86_emulator/x86_emulate.c
@@ -9,5 +9,10 @@ typedef bool bool_t;
=20
 #define BUG() abort()
=20
+#define DEFINE_PER_CPU(type, var) type this_cpu_##var
+#define this_cpu(var) this_cpu_##var
+
+#define vm86_mode(regs) 0
+
 #include "x86_emulate/x86_emulate.h"
 #include "x86_emulate/x86_emulate.c"
--- a/xen/arch/x86/hvm/emulate.c
+++ b/xen/arch/x86/hvm/emulate.c
@@ -16,6 +16,7 @@
 #include <xen/paging.h>
 #include <xen/trace.h>
 #include <asm/event.h>
+#include <asm/xstate.h>
 #include <asm/hvm/emulate.h>
 #include <asm/hvm/hvm.h>
 #include <asm/hvm/trace.h>
@@ -905,6 +906,20 @@ static int hvmemul_get_fpu(
         if ( !cpu_has_mmx )
             return X86EMUL_UNHANDLEABLE;
         break;
+    case X86EMUL_FPU_xmm:
+        if ( !cpu_has_xmm ||
+             (curr->arch.hvm_vcpu.guest_cr[0] & X86_CR0_EM) ||
+             !(curr->arch.hvm_vcpu.guest_cr[4] & X86_CR4_OSFXSR) )
+            return X86EMUL_UNHANDLEABLE;
+        break;
+    case X86EMUL_FPU_ymm:
+        if ( !(curr->arch.hvm_vcpu.guest_cr[0] & X86_CR0_PE) ||
+             vm86_mode(ctxt->regs) ||
+             !(curr->arch.hvm_vcpu.guest_cr[4] & X86_CR4_OSXSAVE) ||
+             !(curr->arch.xcr0 & XSTATE_SSE) ||
+             !(curr->arch.xcr0 & XSTATE_YMM) )
+            return X86EMUL_UNHANDLEABLE;
+        break;
     default:
         return X86EMUL_UNHANDLEABLE;
     }
--- a/xen/arch/x86/x86_emulate/x86_emulate.c
+++ b/xen/arch/x86/x86_emulate/x86_emulate.c
@@ -253,6 +253,47 @@ static uint8_t twobyte_table[256] =3D {
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 };
=20
+#define REX_PREFIX 0x40
+#define REX_B 0x01
+#define REX_X 0x02
+#define REX_R 0x04
+#define REX_W 0x08
+
+#define vex_none 0
+
+enum vex_opcx {
+    vex_0f =3D vex_none + 1,
+    vex_0f38,
+    vex_0f3a,
+};
+
+enum vex_pfx {
+    vex_66 =3D vex_none + 1,
+    vex_f3,
+    vex_f2
+};
+
+union vex {
+    uint8_t raw[2];
+    struct {
+        uint8_t opcx:5;
+        uint8_t b:1;
+        uint8_t x:1;
+        uint8_t r:1;
+        uint8_t pfx:2;
+        uint8_t l:1;
+        uint8_t reg:4;
+        uint8_t w:1;
+    };
+};
+
+#define copy_REX_VEX(ptr, rex, vex) do { \
+    if ( (vex).opcx !=3D vex_none ) \
+        ptr[0] =3D 0xc4, ptr[1] =3D (vex).raw[0], ptr[2] =3D (vex).raw[1];=
 \
+    else if ( mode_64bit() ) \
+        ptr[1] =3D rex | REX_PREFIX; \
+} while (0)
+
 /* Type, address-of, and value of an instruction's operand. */
 struct operand {
     enum { OP_REG, OP_MEM, OP_IMM, OP_NONE } type;
@@ -281,6 +322,18 @@ struct operand {
     };
 };
=20
+typedef union {
+    uint64_t mmx;
+    uint64_t __attribute__ ((aligned(16))) xmm[2];
+    uint64_t __attribute__ ((aligned(32))) ymm[4];
+} mmval_t;
+
+/*
+ * While alignment gets specified above, this doesn't get honored by the
+ * compiler for automatic variables. Thus use a per-CPU variable instead.
+ */
+static DEFINE_PER_CPU(mmval_t, mmval);
+
 /* MSRs. */
 #define MSR_TSC          0x00000010
 #define MSR_SYSENTER_CS  0x00000174
@@ -972,9 +1025,12 @@ static bool_t vcpu_has(
     generate_exception_if(!vcpu_has(leaf, subleaf, reg, \
                                     X86_FEATURE_##feature % 32, \
                                     ctxt, ops), EXC_UD, -1)
+#define vcpu_must_have_mmx()  vcpu_must_have(1, 0, EDX, MMX)
+#define vcpu_must_have_sse()  vcpu_must_have(1, 0, EDX, XMM)
 #define vcpu_must_have_sse2() vcpu_must_have(1, 0, EDX, XMM2)
 #define vcpu_must_have_sse3() vcpu_must_have(1, 0, ECX, XMM3)
 #define vcpu_must_have_cx16() vcpu_must_have(1, 0, ECX, CX16)
+#define vcpu_must_have_avx()  vcpu_must_have(1, 0, ECX, AVX)
=20
 static int
 in_realmode(
@@ -1255,6 +1311,7 @@ x86_emulate(
=20
     uint8_t b, d, sib, sib_index, sib_base, twobyte =3D 0, rex_prefix =3D =
0;
     uint8_t modrm =3D 0, modrm_mod =3D 0, modrm_reg =3D 0, modrm_rm =3D =
0;
+    union vex vex =3D {};
     unsigned int op_bytes, def_op_bytes, ad_bytes, def_ad_bytes;
 #define REPE_PREFIX  1
 #define REPNE_PREFIX 2
@@ -1287,6 +1344,7 @@ x86_emulate(
         {
         case 0x66: /* operand-size override */
             op_bytes =3D def_op_bytes ^ 6;
+            vex.pfx =3D vex_66;
             break;
         case 0x67: /* address-size override */
             ad_bytes =3D def_ad_bytes ^ (mode_64bit() ? 12 : 6);
@@ -1314,9 +1372,11 @@ x86_emulate(
             break;
         case 0xf2: /* REPNE/REPNZ */
             rep_prefix =3D REPNE_PREFIX;
+            vex.pfx =3D vex_f2;
             break;
         case 0xf3: /* REP/REPE/REPZ */
             rep_prefix =3D REPE_PREFIX;
+            vex.pfx =3D vex_f3;
             break;
         case 0x40 ... 0x4f: /* REX */
             if ( !mode_64bit() )
@@ -1360,6 +1420,70 @@ x86_emulate(
     {
         modrm =3D insn_fetch_type(uint8_t);
         modrm_mod =3D (modrm & 0xc0) >> 6;
+
+        if ( !twobyte && (b & ~1) =3D=3D 0xc4 )
+            switch ( def_ad_bytes )
+            {
+            default:
+                BUG();
+            case 2:
+                if ( in_realmode(ctxt, ops) || vm86_mode(&_regs) )
+                    break;
+                /* fall through */
+            case 4:
+                if ( modrm_mod !=3D 3 )
+                    break;
+                /* fall through */
+            case 8:
+                /* VEX */
+                generate_exception_if(rex_prefix || vex.pfx, EXC_UD, -1);
+
+                vex.raw[0] =3D b;
+                if ( b & 1 )
+                {
+                    vex.raw[1] =3D b;
+                    vex.opcx =3D vex_0f;
+                    vex.x =3D 1;
+                    vex.b =3D 1;
+                    vex.w =3D 0;
+                }
+                else
+                {
+                    vex.raw[1] =3D insn_fetch_type(uint8_t);
+                    if ( mode_64bit() )
+                    {
+                        if ( !vex.b )
+                            rex_prefix |=3D REX_B;
+                        if ( !vex.x )
+                            rex_prefix |=3D REX_X;
+                        if ( vex.w )
+                        {
+                            rex_prefix |=3D REX_W;
+                            op_bytes =3D 8;
+                        }
+                    }
+                }
+                vex.reg ^=3D 0xf;
+                if ( !mode_64bit() )
+                    vex.reg &=3D 0x7;
+                else if ( !vex.r )
+                    rex_prefix |=3D REX_R;
+
+                fail_if(vex.opcx !=3D vex_0f);
+                twobyte =3D 1;
+                b =3D insn_fetch_type(uint8_t);
+                d =3D twobyte_table[b];
+
+                /* Unrecognised? */
+                if ( d =3D=3D 0 )
+                    goto cannot_emulate;
+
+                modrm =3D insn_fetch_type(uint8_t);
+                modrm_mod =3D (modrm & 0xc0) >> 6;
+
+                break;
+            }
+
         modrm_reg =3D ((rex_prefix & 4) << 1) | ((modrm & 0x38) >> 3);
         modrm_rm  =3D modrm & 0x07;
=20
@@ -3917,44 +4041,77 @@ x86_emulate(
         break;
     }
=20
-    case 0x6f: /* movq mm/m64,mm */ {
-        uint8_t stub[] =3D { 0x0f, 0x6f, modrm, 0xc3 };
+    case 0x6f: /* movq mm/m64,mm */
+               /* {,v}movdq{a,u} xmm/m128,xmm */
+               /* vmovdq{a,u} ymm/m256,ymm */
+    case 0x7f: /* movq mm,mm/m64 */
+               /* {,v}movdq{a,u} xmm,xmm/m128 */
+               /* vmovdq{a,u} ymm,ymm/m256 */
+    case 0xe7: /* movntq mm,mm/m64 */
+               /* {,v}movntdq xmm,xmm/m128 */
+               /* vmovntdq{a,u} ymm,ymm/m256 */
+    {
+        uint8_t stub[] =3D { 0x3e, 0x3e, 0x0f, b, modrm, 0xc3 };
         struct fpu_insn_ctxt fic =3D { .insn_bytes =3D sizeof(stub)-1 };
-        uint64_t val;
-        if ( ea.type =3D=3D OP_MEM )
+
+        if ( vex.opcx =3D=3D vex_none )
         {
-            unsigned long lval, hval;
-            if ( (rc =3D read_ulong(ea.mem.seg, ea.mem.off+0,
-                                  &lval, 4, ctxt, ops)) ||
-                 (rc =3D read_ulong(ea.mem.seg, ea.mem.off+4,
-                                  &hval, 4, ctxt, ops)) )
-                goto done;
-            val =3D ((uint64_t)hval << 32) | (uint32_t)lval;
-            stub[2] =3D modrm & 0x38; /* movq (%eax),%mmN */
+            switch ( vex.pfx )
+            {
+            case vex_f3:
+                fail_if(b =3D=3D 0xe7);
+                /* fall through */
+            case vex_66:
+                vcpu_must_have_sse2();
+                stub[0] =3D 0x66; /* movdqa */
+                get_fpu(X86EMUL_FPU_xmm, &fic);
+                ea.bytes =3D 16;
+                break;
+            case vex_none:
+                if ( b !=3D 0xe7 )
+                    vcpu_must_have_mmx();
+                else
+                    vcpu_must_have_sse();
+                get_fpu(X86EMUL_FPU_mmx, &fic);
+                ea.bytes =3D 8;
+                break;
+            default:
+                goto cannot_emulate;
+            }
+        }
+        else
+        {
+            fail_if(vex.opcx !=3D vex_0f || vex.reg ||
+                    (vex.pfx !=3D vex_66 && (vex.pfx !=3D vex_f3 || b =
=3D=3D 0xe7)));
+            vcpu_must_have_avx();
+            get_fpu(X86EMUL_FPU_ymm, &fic);
+            ea.bytes =3D 16 << vex.l;
         }
-        get_fpu(X86EMUL_FPU_mmx, &fic);
-        asm volatile ( "call *%0" : : "r" (stub), "a" (&val) : "memory" =
);
-        put_fpu(&fic);
-        break;
-    }
-
-    case 0x7f: /* movq mm,mm/m64 */ {
-        uint8_t stub[] =3D { 0x0f, 0x7f, modrm, 0xc3 };
-        struct fpu_insn_ctxt fic =3D { .insn_bytes =3D sizeof(stub)-1 };
-        uint64_t val;
-        if ( ea.type =3D=3D OP_MEM )
-            stub[2] =3D modrm & 0x38; /* movq %mmN,(%eax) */
-        get_fpu(X86EMUL_FPU_mmx, &fic);
-        asm volatile ( "call *%0" : : "r" (stub), "a" (&val) : "memory" =
);
-        put_fpu(&fic);
         if ( ea.type =3D=3D OP_MEM )
         {
-            unsigned long lval =3D (uint32_t)val, hval =3D (uint32_t)(val =
>> 32);
-            if ( (rc =3D ops->write(ea.mem.seg, ea.mem.off+0, &lval, 4, =
ctxt)) ||
-                 (rc =3D ops->write(ea.mem.seg, ea.mem.off+4, &hval, 4, =
ctxt)) )
-                goto done;
+            /* XXX
+            generate_exception_if(vex.pfx =3D=3D vex_66 &&
+                                  (ops->ea(ea.mem.seg, ea.mem.off)
+                                   & (ea.bytes - 1)), EXC_GP, 0); */
+            if ( b =3D=3D 0x6f )
+                rc =3D ops->read(ea.mem.seg, ea.mem.off+0, &this_cpu(mmval=
),
+                               ea.bytes, ctxt);
+            /* convert memory operand to (%rAX) */
+            rex_prefix &=3D ~REX_B;
+            vex.b =3D 1;
+            stub[4] &=3D 0x38;
+        }
+        if ( !rc )
+        {
+           copy_REX_VEX(stub, rex_prefix, vex);
+           asm volatile ( "call *%0" : : "r" (stub), "a" (&this_cpu(mmval)=
)
+                                     : "memory" );
         }
-        break;
+        put_fpu(&fic);
+        if ( b !=3D 0x6f && ea.type =3D=3D OP_MEM )
+            rc =3D ops->write(ea.mem.seg, ea.mem.off, &this_cpu(mmval),
+                            ea.bytes, ctxt);
+        goto done;
     }
=20
     case 0x80 ... 0x8f: /* jcc (near) */ {
--- a/xen/arch/x86/x86_emulate/x86_emulate.h
+++ b/xen/arch/x86/x86_emulate/x86_emulate.h
@@ -99,7 +99,9 @@ struct segment_register {
 /* FPU sub-types which may be requested via ->get_fpu(). */
 enum x86_emulate_fpu_type {
     X86EMUL_FPU_fpu, /* Standard FPU coprocessor instruction set */
-    X86EMUL_FPU_mmx  /* MMX instruction set (%mm0-%mm7) */
+    X86EMUL_FPU_mmx, /* MMX instruction set (%mm0-%mm7) */
+    X86EMUL_FPU_xmm, /* SSE instruction set (%xmm0-%xmm7/15) */
+    X86EMUL_FPU_ymm  /* AVX/XOP instruction set (%ymm0-%ymm7/15) */
 };
=20
 /*
--- a/xen/arch/x86/x86_emulate.c
+++ b/xen/arch/x86/x86_emulate.c
@@ -10,9 +10,11 @@
  */
=20
 #include <asm/cpufeature.h>
+#include <asm/processor.h>
 #include <asm/x86_emulate.h>
=20
 /* Avoid namespace pollution. */
 #undef cmpxchg
+#undef cpuid
=20
 #include "x86_emulate/x86_emulate.c"
--- a/xen/include/asm-x86/cpufeature.h
+++ b/xen/include/asm-x86/cpufeature.h
@@ -218,7 +218,7 @@
 #define cpu_has_x2apic          boot_cpu_has(X86_FEATURE_X2APIC)
=20
 #define cpu_has_xsave           boot_cpu_has(X86_FEATURE_XSAVE)
-
+#define cpu_has_avx             boot_cpu_has(X86_FEATURE_AVX)
 #define cpu_has_lwp             boot_cpu_has(X86_FEATURE_LWP)
=20
 #define cpu_has_arch_perfmon    boot_cpu_has(X86_FEATURE_ARCH_PERFMON)



--=__PartC2ED42E6.0__=
Content-Type: text/plain; name="x86-emul-mm-mov.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="x86-emul-mm-mov.patch"

x86/emulator: generalize movq emulation (SSE2 and AVX variants)=0A=0AExtend=
 the existing movq emulation to also support its SSE2 and AVX=0Avariants, =
the latter implying the addition of VEX decoding. Fold the=0Aread and =
write cases (as most of the logic is identical), and add=0Amovntq and =
variants (as they're very similar).=0A=0AExtend the testing code to also =
exercise these instructions.=0A=0ASigned-off-by: Jan Beulich <jbeulich@suse=
.com>=0A=0A--- a/tools/tests/x86_emulator/test_x86_emulator.c=0A+++ =
b/tools/tests/x86_emulator/test_x86_emulator.c=0A@@ -1,3 +1,5 @@=0A+#includ=
e <errno.h>=0A+#include <stdbool.h>=0A #include <stdio.h>=0A #include =
<stdlib.h>=0A #include <string.h>=0A@@ -53,11 +55,84 @@ static int =
cmpxchg(=0A     return X86EMUL_OKAY;=0A }=0A =0A+static int cpuid(=0A+    =
unsigned int *eax,=0A+    unsigned int *ebx,=0A+    unsigned int *ecx,=0A+ =
   unsigned int *edx,=0A+    struct x86_emulate_ctxt *ctxt)=0A+{=0A+    =
asm ("cpuid" : "+a" (*eax), "+c" (*ecx), "=3Dd" (*edx), "=3Db" (*ebx));=0A+=
    return X86EMUL_OKAY;=0A+}=0A+=0A+#define cpu_has_mmx ({ \=0A+    =
unsigned int eax =3D 1, ecx =3D 0, edx; \=0A+    cpuid(&eax, &ecx, &ecx, =
&edx, NULL); \=0A+    (edx & (1U << 23)) !=3D 0; \=0A+})=0A+=0A+#define =
cpu_has_sse ({ \=0A+    unsigned int eax =3D 1, ecx =3D 0, edx; \=0A+    =
cpuid(&eax, &ecx, &ecx, &edx, NULL); \=0A+    (edx & (1U << 25)) !=3D 0; =
\=0A+})=0A+=0A+#define cpu_has_sse2 ({ \=0A+    unsigned int eax =3D 1, =
ecx =3D 0, edx; \=0A+    cpuid(&eax, &ecx, &ecx, &edx, NULL); \=0A+    =
(edx & (1U << 26)) !=3D 0; \=0A+})=0A+=0A+static inline uint64_t xgetbv(uin=
t32_t xcr)=0A+{=0A+    uint64_t res;=0A+=0A+    asm ( ".byte 0x0f, 0x01, =
0xd0" : "=3DA" (res) : "c" (xcr) );=0A+=0A+    return res;=0A+}=0A+=0A+#def=
ine cpu_has_avx ({ \=0A+    unsigned int eax =3D 1, ecx =3D 0, edx; \=0A+  =
  cpuid(&eax, &edx, &ecx, &edx, NULL); \=0A+    if ( !(ecx & (1U << 27)) =
|| (xgetbv(0) & 6) !=3D 6 ) \=0A+        ecx =3D 0; \=0A+    (ecx & (1U << =
28)) !=3D 0; \=0A+})=0A+=0A+int get_fpu(=0A+    void (*exception_callback)(=
void *, struct cpu_user_regs *),=0A+    void *exception_callback_arg,=0A+  =
  enum x86_emulate_fpu_type type,=0A+    struct x86_emulate_ctxt *ctxt)=0A+=
{=0A+    switch ( type )=0A+    {=0A+    case X86EMUL_FPU_fpu:=0A+        =
break;=0A+    case X86EMUL_FPU_ymm:=0A+        if ( cpu_has_avx )=0A+      =
      break;=0A+    case X86EMUL_FPU_xmm:=0A+        if ( cpu_has_sse =
)=0A+            break;=0A+    case X86EMUL_FPU_mmx:=0A+        if ( =
cpu_has_mmx )=0A+            break;=0A+    default:=0A+        return =
X86EMUL_UNHANDLEABLE;=0A+    }=0A+    return X86EMUL_OKAY;=0A+}=0A+=0A =
static struct x86_emulate_ops emulops =3D {=0A     .read       =3D =
read,=0A     .insn_fetch =3D read,=0A     .write      =3D write,=0A     =
.cmpxchg    =3D cmpxchg,=0A+    .cpuid      =3D cpuid,=0A+    .get_fpu    =
=3D get_fpu,=0A };=0A =0A int main(int argc, char **argv)=0A@@ -66,6 =
+141,8 @@ int main(int argc, char **argv)=0A     struct cpu_user_regs =
regs;=0A     char *instr;=0A     unsigned int *res, i, j;=0A+    unsigned =
long sp;=0A+    bool stack_exec;=0A     int rc;=0A #ifndef __x86_64__=0A   =
  unsigned int bcdres_native, bcdres_emul;=0A@@ -85,6 +162,16 @@ int =
main(int argc, char **argv)=0A     }=0A     instr =3D (char *)res + =
0x100;=0A =0A+#ifdef __x86_64__=0A+    asm ("movq %%rsp, %0" : "=3Dg" =
(sp));=0A+#else=0A+    asm ("movl %%esp, %0" : "=3Dg" (sp));=0A+#endif=0A+ =
   stack_exec =3D mprotect((void *)(sp & -0x1000L) - (MMAP_SZ - 0x1000),=0A=
+                          MMAP_SZ, PROT_READ|PROT_WRITE|PROT_EXEC) =3D=3D =
0;=0A+    if ( !stack_exec )=0A+        printf("Warning: Stack could not =
be made executable (%d).\n", errno);=0A+=0A     printf("%-40s", "Testing =
addl %%ecx,(%%eax)...");=0A     instr[0] =3D 0x01; instr[1] =3D 0x08;=0A   =
  regs.eflags =3D 0x200;=0A@@ -442,6 +529,108 @@ int main(int argc, char =
**argv)=0A     printf("skipped\n");=0A #endif=0A =0A+    printf("%-40s", =
"Testing movq %mm3,(%ecx)...");=0A+    if ( stack_exec && cpu_has_mmx =
)=0A+    {=0A+        extern const unsigned char movq_to_mem[];=0A+=0A+    =
    asm volatile ( "pcmpeqb %%mm3, %%mm3\n"=0A+                       =
".pushsection .test, \"a\", @progbits\n"=0A+                       =
"movq_to_mem: movq %%mm3, (%0)\n"=0A+                       ".popsection" =
:: "c" (NULL) );=0A+=0A+        memcpy(instr, movq_to_mem, 15);=0A+        =
memset(res, 0x33, 64);=0A+        memset(res + 8, 0xff, 8);=0A+        =
regs.eip    =3D (unsigned long)&instr[0];=0A+        regs.ecx    =3D =
(unsigned long)res;=0A+        rc =3D x86_emulate(&ctxt, &emulops);=0A+    =
    if ( (rc !=3D X86EMUL_OKAY) ||=0A+             memcmp(res, res + 8, =
32) )=0A+            goto fail;=0A+        printf("okay\n");=0A+    }=0A+  =
  else=0A+        printf("skipped\n");=0A+=0A+    printf("%-40s", "Testing =
movq (%edx),%mm5...");=0A+    if ( stack_exec && cpu_has_mmx )=0A+    =
{=0A+        extern const unsigned char movq_from_mem[];=0A+=0A+        =
asm volatile ( "pcmpgtb %%mm5, %%mm5\n"=0A+                       =
".pushsection .test, \"a\", @progbits\n"=0A+                       =
"movq_from_mem: movq (%0), %%mm5\n"=0A+                       ".popsection"=
 :: "d" (NULL) );=0A+=0A+        memcpy(instr, movq_from_mem, 15);=0A+     =
   regs.eip    =3D (unsigned long)&instr[0];=0A+        regs.ecx    =3D =
0;=0A+        regs.edx    =3D (unsigned long)res;=0A+        rc =3D =
x86_emulate(&ctxt, &emulops);=0A+        if ( rc !=3D X86EMUL_OKAY )=0A+   =
         goto fail;=0A+        asm ( "pcmpeqb %%mm3, %%mm3\n\t"=0A+        =
      "pcmpeqb %%mm5, %%mm3\n\t"=0A+              "pmovmskb %%mm3, %0" : =
"=3Dr" (rc) );=0A+        if ( rc !=3D 0xff )=0A+            goto =
fail;=0A+        printf("okay\n");=0A+    }=0A+    else=0A+        =
printf("skipped\n");=0A+=0A+    printf("%-40s", "Testing movdqu %xmm2,(%ecx=
)...");=0A+    if ( stack_exec && cpu_has_sse2 )=0A+    {=0A+        =
extern const unsigned char movdqu_to_mem[];=0A+=0A+        asm volatile ( =
"pcmpeqb %%xmm2, %%xmm2\n"=0A+                       ".pushsection .test, =
\"a\", @progbits\n"=0A+                       "movdqu_to_mem: movdqu =
%%xmm2, (%0)\n"=0A+                       ".popsection" :: "c" (NULL) =
);=0A+=0A+        memcpy(instr, movdqu_to_mem, 15);=0A+        memset(res, =
0x55, 64);=0A+        memset(res + 8, 0xff, 16);=0A+        regs.eip    =
=3D (unsigned long)&instr[0];=0A+        regs.ecx    =3D (unsigned =
long)res;=0A+        rc =3D x86_emulate(&ctxt, &emulops);=0A+        if ( =
(rc !=3D X86EMUL_OKAY) ||=0A+             memcmp(res, res + 8, 32) )=0A+   =
         goto fail;=0A+        printf("okay\n");=0A+    }=0A+    else=0A+  =
      printf("skipped\n");=0A+=0A+    printf("%-40s", "Testing movdqu =
(%edx),%xmm4...");=0A+    if ( stack_exec && cpu_has_sse2 )=0A+    {=0A+   =
     extern const unsigned char movdqu_from_mem[];=0A+=0A+        asm =
volatile ( "pcmpgtb %%xmm4, %%xmm4\n"=0A+                       ".pushsecti=
on .test, \"a\", @progbits\n"=0A+                       "movdqu_from_mem: =
movdqu (%0), %%xmm4\n"=0A+                       ".popsection" :: "d" =
(NULL) );=0A+=0A+        memcpy(instr, movdqu_from_mem, 15);=0A+        =
regs.eip    =3D (unsigned long)&instr[0];=0A+        regs.ecx    =3D =
0;=0A+        regs.edx    =3D (unsigned long)res;=0A+        rc =3D =
x86_emulate(&ctxt, &emulops);=0A+        if ( rc !=3D X86EMUL_OKAY )=0A+   =
         goto fail;=0A+        asm ( "pcmpeqb %%xmm2, %%xmm2\n\t"=0A+      =
        "pcmpeqb %%xmm4, %%xmm2\n\t"=0A+              "pmovmskb %%xmm2, =
%0" : "=3Dr" (rc) );=0A+        if ( rc !=3D 0xffff )=0A+            goto =
fail;=0A+        printf("okay\n");=0A+    }=0A+    else=0A+        =
printf("skipped\n");=0A+=0A     for ( j =3D 1; j <=3D 2; j++ )=0A     {=0A =
#if defined(__i386__)=0A--- a/tools/tests/x86_emulator/x86_emulate.c=0A+++ =
b/tools/tests/x86_emulator/x86_emulate.c=0A@@ -9,5 +9,10 @@ typedef bool =
bool_t;=0A =0A #define BUG() abort()=0A =0A+#define DEFINE_PER_CPU(type, =
var) type this_cpu_##var=0A+#define this_cpu(var) this_cpu_##var=0A+=0A+#de=
fine vm86_mode(regs) 0=0A+=0A #include "x86_emulate/x86_emulate.h"=0A =
#include "x86_emulate/x86_emulate.c"=0A--- a/xen/arch/x86/hvm/emulate.c=0A+=
++ b/xen/arch/x86/hvm/emulate.c=0A@@ -16,6 +16,7 @@=0A #include <xen/paging=
.h>=0A #include <xen/trace.h>=0A #include <asm/event.h>=0A+#include =
<asm/xstate.h>=0A #include <asm/hvm/emulate.h>=0A #include <asm/hvm/hvm.h>=
=0A #include <asm/hvm/trace.h>=0A@@ -905,6 +906,20 @@ static int hvmemul_ge=
t_fpu(=0A         if ( !cpu_has_mmx )=0A             return X86EMUL_UNHANDL=
EABLE;=0A         break;=0A+    case X86EMUL_FPU_xmm:=0A+        if ( =
!cpu_has_xmm ||=0A+             (curr->arch.hvm_vcpu.guest_cr[0] & =
X86_CR0_EM) ||=0A+             !(curr->arch.hvm_vcpu.guest_cr[4] & =
X86_CR4_OSFXSR) )=0A+            return X86EMUL_UNHANDLEABLE;=0A+        =
break;=0A+    case X86EMUL_FPU_ymm:=0A+        if ( !(curr->arch.hvm_vcpu.g=
uest_cr[0] & X86_CR0_PE) ||=0A+             vm86_mode(ctxt->regs) ||=0A+   =
          !(curr->arch.hvm_vcpu.guest_cr[4] & X86_CR4_OSXSAVE) ||=0A+      =
       !(curr->arch.xcr0 & XSTATE_SSE) ||=0A+             !(curr->arch.xcr0=
 & XSTATE_YMM) )=0A+            return X86EMUL_UNHANDLEABLE;=0A+        =
break;=0A     default:=0A         return X86EMUL_UNHANDLEABLE;=0A     =
}=0A--- a/xen/arch/x86/x86_emulate/x86_emulate.c=0A+++ b/xen/arch/x86/x86_e=
mulate/x86_emulate.c=0A@@ -253,6 +253,47 @@ static uint8_t twobyte_table[25=
6] =3D {=0A     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0=0A };=0A =
=0A+#define REX_PREFIX 0x40=0A+#define REX_B 0x01=0A+#define REX_X =
0x02=0A+#define REX_R 0x04=0A+#define REX_W 0x08=0A+=0A+#define vex_none =
0=0A+=0A+enum vex_opcx {=0A+    vex_0f =3D vex_none + 1,=0A+    =
vex_0f38,=0A+    vex_0f3a,=0A+};=0A+=0A+enum vex_pfx {=0A+    vex_66 =3D =
vex_none + 1,=0A+    vex_f3,=0A+    vex_f2=0A+};=0A+=0A+union vex {=0A+    =
uint8_t raw[2];=0A+    struct {=0A+        uint8_t opcx:5;=0A+        =
uint8_t b:1;=0A+        uint8_t x:1;=0A+        uint8_t r:1;=0A+        =
uint8_t pfx:2;=0A+        uint8_t l:1;=0A+        uint8_t reg:4;=0A+       =
 uint8_t w:1;=0A+    };=0A+};=0A+=0A+#define copy_REX_VEX(ptr, rex, vex) =
do { \=0A+    if ( (vex).opcx !=3D vex_none ) \=0A+        ptr[0] =3D =
0xc4, ptr[1] =3D (vex).raw[0], ptr[2] =3D (vex).raw[1]; \=0A+    else if ( =
mode_64bit() ) \=0A+        ptr[1] =3D rex | REX_PREFIX; \=0A+} while =
(0)=0A+=0A /* Type, address-of, and value of an instruction's operand. =
*/=0A struct operand {=0A     enum { OP_REG, OP_MEM, OP_IMM, OP_NONE } =
type;=0A@@ -281,6 +322,18 @@ struct operand {=0A     };=0A };=0A =0A+typede=
f union {=0A+    uint64_t mmx;=0A+    uint64_t __attribute__ ((aligned(16))=
) xmm[2];=0A+    uint64_t __attribute__ ((aligned(32))) ymm[4];=0A+} =
mmval_t;=0A+=0A+/*=0A+ * While alignment gets specified above, this =
doesn't get honored by the=0A+ * compiler for automatic variables. Thus =
use a per-CPU variable instead.=0A+ */=0A+static DEFINE_PER_CPU(mmval_t, =
mmval);=0A+=0A /* MSRs. */=0A #define MSR_TSC          0x00000010=0A =
#define MSR_SYSENTER_CS  0x00000174=0A@@ -972,9 +1025,12 @@ static bool_t =
vcpu_has(=0A     generate_exception_if(!vcpu_has(leaf, subleaf, reg, \=0A  =
                                   X86_FEATURE_##feature % 32, \=0A        =
                             ctxt, ops), EXC_UD, -1)=0A+#define vcpu_must_h=
ave_mmx()  vcpu_must_have(1, 0, EDX, MMX)=0A+#define vcpu_must_have_sse()  =
vcpu_must_have(1, 0, EDX, XMM)=0A #define vcpu_must_have_sse2() vcpu_must_h=
ave(1, 0, EDX, XMM2)=0A #define vcpu_must_have_sse3() vcpu_must_have(1, 0, =
ECX, XMM3)=0A #define vcpu_must_have_cx16() vcpu_must_have(1, 0, ECX, =
CX16)=0A+#define vcpu_must_have_avx()  vcpu_must_have(1, 0, ECX, AVX)=0A =
=0A static int=0A in_realmode(=0A@@ -1255,6 +1311,7 @@ x86_emulate(=0A =0A =
    uint8_t b, d, sib, sib_index, sib_base, twobyte =3D 0, rex_prefix =3D =
0;=0A     uint8_t modrm =3D 0, modrm_mod =3D 0, modrm_reg =3D 0, modrm_rm =
=3D 0;=0A+    union vex vex =3D {};=0A     unsigned int op_bytes, =
def_op_bytes, ad_bytes, def_ad_bytes;=0A #define REPE_PREFIX  1=0A #define =
REPNE_PREFIX 2=0A@@ -1287,6 +1344,7 @@ x86_emulate(=0A         {=0A        =
 case 0x66: /* operand-size override */=0A             op_bytes =3D =
def_op_bytes ^ 6;=0A+            vex.pfx =3D vex_66;=0A             =
break;=0A         case 0x67: /* address-size override */=0A             =
ad_bytes =3D def_ad_bytes ^ (mode_64bit() ? 12 : 6);=0A@@ -1314,9 +1372,11 =
@@ x86_emulate(=0A             break;=0A         case 0xf2: /* REPNE/REPNZ =
*/=0A             rep_prefix =3D REPNE_PREFIX;=0A+            vex.pfx =3D =
vex_f2;=0A             break;=0A         case 0xf3: /* REP/REPE/REPZ */=0A =
            rep_prefix =3D REPE_PREFIX;=0A+            vex.pfx =3D =
vex_f3;=0A             break;=0A         case 0x40 ... 0x4f: /* REX */=0A  =
           if ( !mode_64bit() )=0A@@ -1360,6 +1420,70 @@ x86_emulate(=0A   =
  {=0A         modrm =3D insn_fetch_type(uint8_t);=0A         modrm_mod =
=3D (modrm & 0xc0) >> 6;=0A+=0A+        if ( !twobyte && (b & ~1) =3D=3D =
0xc4 )=0A+            switch ( def_ad_bytes )=0A+            {=0A+         =
   default:=0A+                BUG();=0A+            case 2:=0A+           =
     if ( in_realmode(ctxt, ops) || vm86_mode(&_regs) )=0A+                =
    break;=0A+                /* fall through */=0A+            case =
4:=0A+                if ( modrm_mod !=3D 3 )=0A+                    =
break;=0A+                /* fall through */=0A+            case 8:=0A+    =
            /* VEX */=0A+                generate_exception_if(rex_prefix =
|| vex.pfx, EXC_UD, -1);=0A+=0A+                vex.raw[0] =3D b;=0A+      =
          if ( b & 1 )=0A+                {=0A+                    =
vex.raw[1] =3D b;=0A+                    vex.opcx =3D vex_0f;=0A+          =
          vex.x =3D 1;=0A+                    vex.b =3D 1;=0A+             =
       vex.w =3D 0;=0A+                }=0A+                else=0A+       =
         {=0A+                    vex.raw[1] =3D insn_fetch_type(uint8_t);=
=0A+                    if ( mode_64bit() )=0A+                    {=0A+   =
                     if ( !vex.b )=0A+                            =
rex_prefix |=3D REX_B;=0A+                        if ( !vex.x )=0A+        =
                    rex_prefix |=3D REX_X;=0A+                        if ( =
vex.w )=0A+                        {=0A+                            =
rex_prefix |=3D REX_W;=0A+                            op_bytes =3D 8;=0A+  =
                      }=0A+                    }=0A+                }=0A+  =
              vex.reg ^=3D 0xf;=0A+                if ( !mode_64bit() =
)=0A+                    vex.reg &=3D 0x7;=0A+                else if ( =
!vex.r )=0A+                    rex_prefix |=3D REX_R;=0A+=0A+             =
   fail_if(vex.opcx !=3D vex_0f);=0A+                twobyte =3D 1;=0A+    =
            b =3D insn_fetch_type(uint8_t);=0A+                d =3D =
twobyte_table[b];=0A+=0A+                /* Unrecognised? */=0A+           =
     if ( d =3D=3D 0 )=0A+                    goto cannot_emulate;=0A+=0A+ =
               modrm =3D insn_fetch_type(uint8_t);=0A+                =
modrm_mod =3D (modrm & 0xc0) >> 6;=0A+=0A+                break;=0A+       =
     }=0A+=0A         modrm_reg =3D ((rex_prefix & 4) << 1) | ((modrm & =
0x38) >> 3);=0A         modrm_rm  =3D modrm & 0x07;=0A =0A@@ -3917,44 =
+4041,77 @@ x86_emulate(=0A         break;=0A     }=0A =0A-    case 0x6f: =
/* movq mm/m64,mm */ {=0A-        uint8_t stub[] =3D { 0x0f, 0x6f, modrm, =
0xc3 };=0A+    case 0x6f: /* movq mm/m64,mm */=0A+               /* =
{,v}movdq{a,u} xmm/m128,xmm */=0A+               /* vmovdq{a,u} ymm/m256,ym=
m */=0A+    case 0x7f: /* movq mm,mm/m64 */=0A+               /* {,v}movdq{=
a,u} xmm,xmm/m128 */=0A+               /* vmovdq{a,u} ymm,ymm/m256 */=0A+  =
  case 0xe7: /* movntq mm,mm/m64 */=0A+               /* {,v}movntdq =
xmm,xmm/m128 */=0A+               /* vmovntdq{a,u} ymm,ymm/m256 */=0A+    =
{=0A+        uint8_t stub[] =3D { 0x3e, 0x3e, 0x0f, b, modrm, 0xc3 };=0A   =
      struct fpu_insn_ctxt fic =3D { .insn_bytes =3D sizeof(stub)-1 };=0A- =
       uint64_t val;=0A-        if ( ea.type =3D=3D OP_MEM )=0A+=0A+       =
 if ( vex.opcx =3D=3D vex_none )=0A         {=0A-            unsigned long =
lval, hval;=0A-            if ( (rc =3D read_ulong(ea.mem.seg, ea.mem.off+0=
,=0A-                                  &lval, 4, ctxt, ops)) ||=0A-        =
         (rc =3D read_ulong(ea.mem.seg, ea.mem.off+4,=0A-                  =
                &hval, 4, ctxt, ops)) )=0A-                goto done;=0A-  =
          val =3D ((uint64_t)hval << 32) | (uint32_t)lval;=0A-            =
stub[2] =3D modrm & 0x38; /* movq (%eax),%mmN */=0A+            switch ( =
vex.pfx )=0A+            {=0A+            case vex_f3:=0A+                =
fail_if(b =3D=3D 0xe7);=0A+                /* fall through */=0A+          =
  case vex_66:=0A+                vcpu_must_have_sse2();=0A+               =
 stub[0] =3D 0x66; /* movdqa */=0A+                get_fpu(X86EMUL_FPU_xmm,=
 &fic);=0A+                ea.bytes =3D 16;=0A+                break;=0A+  =
          case vex_none:=0A+                if ( b !=3D 0xe7 )=0A+         =
           vcpu_must_have_mmx();=0A+                else=0A+               =
     vcpu_must_have_sse();=0A+                get_fpu(X86EMUL_FPU_mmx, =
&fic);=0A+                ea.bytes =3D 8;=0A+                break;=0A+    =
        default:=0A+                goto cannot_emulate;=0A+            =
}=0A+        }=0A+        else=0A+        {=0A+            fail_if(vex.opcx=
 !=3D vex_0f || vex.reg ||=0A+                    (vex.pfx !=3D vex_66 && =
(vex.pfx !=3D vex_f3 || b =3D=3D 0xe7)));=0A+            vcpu_must_have_avx=
();=0A+            get_fpu(X86EMUL_FPU_ymm, &fic);=0A+            ea.bytes =
=3D 16 << vex.l;=0A         }=0A-        get_fpu(X86EMUL_FPU_mmx, =
&fic);=0A-        asm volatile ( "call *%0" : : "r" (stub), "a" (&val) : =
"memory" );=0A-        put_fpu(&fic);=0A-        break;=0A-    }=0A-=0A-   =
 case 0x7f: /* movq mm,mm/m64 */ {=0A-        uint8_t stub[] =3D { 0x0f, =
0x7f, modrm, 0xc3 };=0A-        struct fpu_insn_ctxt fic =3D { .insn_bytes =
=3D sizeof(stub)-1 };=0A-        uint64_t val;=0A-        if ( ea.type =
=3D=3D OP_MEM )=0A-            stub[2] =3D modrm & 0x38; /* movq %mmN,(%eax=
) */=0A-        get_fpu(X86EMUL_FPU_mmx, &fic);=0A-        asm volatile ( =
"call *%0" : : "r" (stub), "a" (&val) : "memory" );=0A-        put_fpu(&fic=
);=0A         if ( ea.type =3D=3D OP_MEM )=0A         {=0A-            =
unsigned long lval =3D (uint32_t)val, hval =3D (uint32_t)(val >> 32);=0A-  =
          if ( (rc =3D ops->write(ea.mem.seg, ea.mem.off+0, &lval, 4, =
ctxt)) ||=0A-                 (rc =3D ops->write(ea.mem.seg, ea.mem.off+4, =
&hval, 4, ctxt)) )=0A-                goto done;=0A+            /* XXX=0A+ =
           generate_exception_if(vex.pfx =3D=3D vex_66 &&=0A+              =
                    (ops->ea(ea.mem.seg, ea.mem.off)=0A+                   =
                & (ea.bytes - 1)), EXC_GP, 0); */=0A+            if ( b =
=3D=3D 0x6f )=0A+                rc =3D ops->read(ea.mem.seg, ea.mem.off+0,=
 &this_cpu(mmval),=0A+                               ea.bytes, ctxt);=0A+  =
          /* convert memory operand to (%rAX) */=0A+            rex_prefix =
&=3D ~REX_B;=0A+            vex.b =3D 1;=0A+            stub[4] &=3D =
0x38;=0A+        }=0A+        if ( !rc )=0A+        {=0A+           =
copy_REX_VEX(stub, rex_prefix, vex);=0A+           asm volatile ( "call =
*%0" : : "r" (stub), "a" (&this_cpu(mmval))=0A+                            =
         : "memory" );=0A         }=0A-        break;=0A+        put_fpu(&f=
ic);=0A+        if ( b !=3D 0x6f && ea.type =3D=3D OP_MEM )=0A+            =
rc =3D ops->write(ea.mem.seg, ea.mem.off, &this_cpu(mmval),=0A+            =
                ea.bytes, ctxt);=0A+        goto done;=0A     }=0A =0A     =
case 0x80 ... 0x8f: /* jcc (near) */ {=0A--- a/xen/arch/x86/x86_emulate/x86=
_emulate.h=0A+++ b/xen/arch/x86/x86_emulate/x86_emulate.h=0A@@ -99,7 +99,9 =
@@ struct segment_register {=0A /* FPU sub-types which may be requested =
via ->get_fpu(). */=0A enum x86_emulate_fpu_type {=0A     X86EMUL_FPU_fpu, =
/* Standard FPU coprocessor instruction set */=0A-    X86EMUL_FPU_mmx  /* =
MMX instruction set (%mm0-%mm7) */=0A+    X86EMUL_FPU_mmx, /* MMX =
instruction set (%mm0-%mm7) */=0A+    X86EMUL_FPU_xmm, /* SSE instruction =
set (%xmm0-%xmm7/15) */=0A+    X86EMUL_FPU_ymm  /* AVX/XOP instruction set =
(%ymm0-%ymm7/15) */=0A };=0A =0A /*=0A--- a/xen/arch/x86/x86_emulate.c=0A++=
+ b/xen/arch/x86/x86_emulate.c=0A@@ -10,9 +10,11 @@=0A  */=0A =0A #include =
<asm/cpufeature.h>=0A+#include <asm/processor.h>=0A #include <asm/x86_emula=
te.h>=0A =0A /* Avoid namespace pollution. */=0A #undef cmpxchg=0A+#undef =
cpuid=0A =0A #include "x86_emulate/x86_emulate.c"=0A--- a/xen/include/asm-x=
86/cpufeature.h=0A+++ b/xen/include/asm-x86/cpufeature.h=0A@@ -218,7 =
+218,7 @@=0A #define cpu_has_x2apic          boot_cpu_has(X86_FEATURE_X2API=
C)=0A =0A #define cpu_has_xsave           boot_cpu_has(X86_FEATURE_XSAVE)=
=0A-=0A+#define cpu_has_avx             boot_cpu_has(X86_FEATURE_AVX)=0A =
#define cpu_has_lwp             boot_cpu_has(X86_FEATURE_LWP)=0A =0A =
#define cpu_has_arch_perfmon    boot_cpu_has(X86_FEATURE_ARCH_PERFMON)=0A
--=__PartC2ED42E6.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__PartC2ED42E6.0__=--


From xen-devel-bounces@lists.xensource.com Wed Nov 16 06:19:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 06:19:47 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQgL4-00006a-6S; Wed, 16 Nov 2011 06:19:46 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQgIc-0008K5-Jv
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 06:17:25 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1321453000!53345044!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31002 invoked from network); 16 Nov 2011 14:16:40 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-5.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 16 Nov 2011 14:16:40 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 16 Nov 2011 14:17:11 +0000
Message-Id: <4EC3D3980200007800061518@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 
Date: Wed, 16 Nov 2011 14:15:36 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: Re: [Xen-devel] [PATCH 0/2] x86: emulator improvements
References: <4EC3CFCA02000078000614F2@nat28.tlf.novell.com>
In-Reply-To: <4EC3CFCA02000078000614F2@nat28.tlf.novell.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 16.11.11 at 14:59, "Jan Beulich" <JBeulich@suse.com> wrote:
> 1: x86/emulator: add feature checks for newer instructions
> 2: x86/emulator: generalize movq emulation (SSE2 and AVX variants)
>=20
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

If this is acceptable, I'm planning to add support for {,v}mov{a,u}p{s,d}
and {,v}movntp{s,d} (plus the respective opcode variants, even though
I think we only really need full width loads and stores for the next =
little
while) to deal with reports like in
http://lists.xensource.com/archives/html/xen-devel/2011-10/msg00296.html.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 06:27:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 06:27:11 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQgSF-0000bV-H0; Wed, 16 Nov 2011 06:27:11 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQgRX-0000Of-MJ
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 06:26:28 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1321453556!48716099!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16434 invoked from network); 16 Nov 2011 14:25:57 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-4.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 16 Nov 2011 14:25:57 -0000
Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAGEQH92005759
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 16 Nov 2011 14:26:19 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAGEQDUA009159
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 16 Nov 2011 14:26:14 GMT
Received: from abhmt119.oracle.com (abhmt119.oracle.com [141.146.116.71])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAGEQ5cK016245; Wed, 16 Nov 2011 08:26:06 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 16 Nov 2011 06:26:05 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id B3ED981488; Wed, 16 Nov 2011 09:26:04 -0500 (EST)
Date: Wed, 16 Nov 2011 09:26:04 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Subject: Re: [Xen-devel] Time Change Issue Xen 4.1
Message-ID: <20111116142604.GA7476@phenom.dumpdata.com>
References: <4EBD5AA0.3090906@webanywhere.co.uk>
	<20111111183913.GA9283@phenom.dumpdata.com>
	<4EC0F20D0200007800060B7D@nat28.tlf.novell.com>
	<20111114180045.GA14517@phenom.dumpdata.com>
	<4EC16CA7.70901@goop.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EC16CA7.70901@goop.org>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090208.4EC3C80C.0128,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, Jan Beulich <JBeulich@suse.com>,
	keir.xen@gmail.com, Niall Fleming <niall.fleming@webanywhere.co.uk>,
	pbonzini@redhat.com, lersek@redhat.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Nov 14, 2011 at 11:31:51AM -0800, Jeremy Fitzhardinge wrote:
> On 11/14/2011 10:00 AM, Konrad Rzeszutek Wilk wrote:
> > Right. With those patches too (he used the xen-settime patch set which has it).
> > The hypercall is done (and the do_settime gets called) and the results are saved
> > in the RTC. And the wc_sec and wc_nsec are updated and propagated.
> >
> > The problem is that wc_sec and wc_nsec are only propagated to the
> > existing guests.
> >
> > If you launch a new guest after the 'hwclock', the new guests
> > retains the old wallclock time.
> 
> Existing (pvops) guests shouldn't see updated wallclock time, because
> they never look at the hypervisor's wallclock after boot time.
> 
> It's surprising that new guests don't see the updated wallclock though. 
> That sounds like a Xen issue.

<nods> That is what I think is happening here.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 06:28:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 06:28:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQgTP-0000zD-42; Wed, 16 Nov 2011 06:28:23 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQgSu-0000mJ-EX
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 06:27:53 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1321453667!1813164!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23446 invoked from network); 16 Nov 2011 14:27:49 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-7.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 16 Nov 2011 14:27:49 -0000
Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAGERj1k007787
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 16 Nov 2011 14:27:46 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAGERiTw020767
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 16 Nov 2011 14:27:44 GMT
Received: from abhmt106.oracle.com (abhmt106.oracle.com [141.146.116.58])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAGERdH1005507; Wed, 16 Nov 2011 08:27:39 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 16 Nov 2011 06:27:38 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 308C481488; Wed, 16 Nov 2011 09:27:38 -0500 (EST)
Date: Wed, 16 Nov 2011 09:27:38 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: 327801865 <327801865@qq.com>
Subject: Re: [Xen-devel] PV-on-HVM hypercall problem
Message-ID: <20111116142738.GB7476@phenom.dumpdata.com>
References: <201111082056301848024@qq.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <201111082056301848024@qq.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090205.4EC3C862.0129,ss=1,re=0.000,fgs=0
Cc: xen-devel <xen-devel@lists.xensource.com>,
	"community.manager" <community.manager@xen.orgl>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 08, 2011 at 08:56:35PM +0800, 327801865 wrote:
> Hi everyone:
>     I'm doing some development based on PV-on-HVM source.Have modified the code in unmodified_drivers, When I map one HVM domU memory page to another domU by HYPERVISOR_grant_table_op, it returns an error code "-38"(function no implement), in another way, one HVM domU can't map another's menory page.


Can you map pages with PV Dom0?

>     I wonder wheather you can give me a hand about this problem. Or some valuable advice.
> Thanks in advance.
> 
> 2011-11-08 
> 
> 
> 
> 327801865 

> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 06:59:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 06:59:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQgxv-0001wP-T9; Wed, 16 Nov 2011 06:59:56 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQgvp-0001hx-En
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 06:57:45 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1321455460!4454122!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 407 invoked from network); 16 Nov 2011 14:57:41 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-15.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 16 Nov 2011 14:57:41 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAGEvc0e023267
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 16 Nov 2011 14:57:39 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAGEvbf7008974
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 16 Nov 2011 14:57:37 GMT
Received: from abhmt109.oracle.com (abhmt109.oracle.com [141.146.116.61])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAGEvVbJ004325; Wed, 16 Nov 2011 08:57:31 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 16 Nov 2011 06:57:31 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 6688C81488; Wed, 16 Nov 2011 09:57:30 -0500 (EST)
Date: Wed, 16 Nov 2011 09:57:30 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Pavel =?utf-8?Q?Mat=C4=9Bja?= <pavel@netsafe.cz>,
	Ben Guthro <ben.guthro@virtualcomputer.com>, tom.goetz@virtualcomputer.com
Subject: Re: [Xen-devel] ioperm problem
Message-ID: <20111116145730.GA11502@phenom.dumpdata.com>
References: <201111132219.07211.pavel@netsafe.cz>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <201111132219.07211.pavel@netsafe.cz>
User-Agent: Mutt/1.5.21 (2010-09-15)
Content-Transfer-Encoding: quoted-printable
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090206.4EC3CF63.00D4,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Sun, Nov 13, 2011 at 10:19:06PM +0100, Pavel Mat=C4=9Bja wrote:
> Hi,
> I'm trying to port AMD VGA passthru patch to the latest XEN and vanila =
kernel=20
> and I got SIGSEGV in
>=20
> static void ati_hw_out(uint16_t hport, uint32_t data)
> {
>     ioperm(gfx_info.host_pio_base, gfx_info.pio_size, 1);   =20
>     asm volatile ("out %1, %0"::"Nd"(hport),"a"(data));
>     ioperm(gfx_info.host_pio_base, gfx_info.pio_size, 0);
> }

Does it work under baremetal?

What is the host_pio_base?

Is the host_pio_base part of the permitted IO ports? (you can
see that if you run 'xl debug-keys q' and it should show you something
like this:

(XEN) Rangesets belonging to domain 1:
(XEN)     I/O Ports  { b400-b41f, b800-b81f }
(XEN)     Interrupts { 18-19, 54-55 }
(XEN)     I/O Memory { fe940-fe9ff }
(XEN) Memory pages belonging to domain 1:

(you can get that from xm dmesg).

As you can see, the b400->b41f are allowed in the domain 1. Is your
host_pio_base in there?


>=20
> I tried old 2.6.32 XEN kernel and there is no such problem.
> It looks related to arch/x86/kernel/ioport.c but I'm not sure.
> Is anyone here familiar with that code?

Yes, and I think I saw somebody ask me about that too.

Lets rope them in this converstation - they got it to work
but my memory is foggy at what was required.

Ben, Thomas,

I remember you guys had a tough time with vd86 which did something simila=
r
and it ultimately was due to to /dev/mem not passing in VM_IO. But the
ioperm/outb sounds familiar too. Was there a missing hypercall when
forking/copying the ioperm bitmap?

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 07:08:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 07:08:25 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQh68-0002SJ-E3; Wed, 16 Nov 2011 07:08:25 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQgyX-00022X-He
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 07:00:37 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1321455629!1821711!1
X-Originating-IP: [74.125.82.41]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13482 invoked from network); 16 Nov 2011 15:00:30 -0000
Received: from mail-ww0-f41.google.com (HELO mail-ww0-f41.google.com)
	(74.125.82.41)
	by server-11.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 15:00:30 -0000
Received: by wwf25 with SMTP id 25so8001904wwf.0
	for <xen-devel@lists.xensource.com>;
	Wed, 16 Nov 2011 07:00:29 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=wZ6jmCsv094IC5zeKCW/IvGIR4HqRRzgrXgYMzQTRG8=;
	b=sqlPQYa5K8/RK4cphokPn/puoPw1L0H9m3OmJ6eh9Hk+/AnAp6qcNtrU+y/5vckMeJ
	ffyu1YfVPXjxKNZhXhVRK/i1FLTfuZoXfAegVdn/Pd/Oz2M6Bm9yS8JDtXvdyQosOrC4
	57qNT+tVzLV8rIwxOUkAbWb0Aj1TCa55gcY/Q=
Received: by 10.216.81.208 with SMTP id m58mr7562131wee.87.1321455629863;
	Wed, 16 Nov 2011 07:00:29 -0800 (PST)
Received: from [192.168.1.71]
	(host86-129-245-239.range86-129.btcentralplus.com. [86.129.245.239])
	by mx.google.com with ESMTPS id eu16sm33048979wbb.7.2011.11.16.07.00.27
	(version=SSLv3 cipher=OTHER); Wed, 16 Nov 2011 07:00:28 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Wed, 16 Nov 2011 15:00:25 +0000
Subject: Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek nic problems
	(eth0 8139cp transmit queue timed out)
From: Keir Fraser <keir.xen@gmail.com>
To: Pasi =?ISO-8859-1?B?S+Rya2vkaW5lbg==?= <pasik@iki.fi>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
Message-ID: <CAE98089.24FFA%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek nic problems
	(eth0 8139cp transmit queue timed out)
Thread-Index: AcykcHhjI8a0wPFgy0OB/fL4JIhOSw==
In-Reply-To: <20111116133310.GH12984@reaktio.net>
Mime-version: 1.0
Content-type: text/plain;
	charset="ISO-8859-1"
Content-transfer-encoding: quoted-printable
Cc: "xen@lists.fedoraproject.org" <xen@lists.fedoraproject.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 16/11/2011 13:33, "Pasi K=E4rkk=E4inen" <pasik@iki.fi> wrote:

> On Mon, Nov 14, 2011 at 05:47:11PM +0000, Ian Jackson wrote:
>> Pasi K=E4rkk=E4inen writes ("Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest rea=
ltek
>> nic problems (eth0 8139cp transmit queue timed out)"):
>>> So please go ahead and commit the fix to xen-4.1-testing.hg.
>>=20
>> Keir, will you do this ?  If you prefer I can do it, but I need the
>> blessing of a hypervisor maintainer.
>>=20
>=20
> Ping?=20

I responded on 3rd November:

"This looks like a backport of Stefano's xen-unstable c/s 24007. I would
like him to submit/ack the backport, as it is not a trivial backport of the
xen-unstable patch."

 -- Keir

>=20
> -- Pasi
>=20



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 07:54:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 07:54:35 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQhon-0004In-KR; Wed, 16 Nov 2011 07:54:33 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQho8-000464-8r
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 07:53:52 -0800
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-14.tower-21.messagelabs.com!1321458828!4471480!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17645 invoked from network); 16 Nov 2011 15:53:49 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-14.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 16 Nov 2011 15:53:49 -0000
X-Originating-Ip: [194.89.68.22]
Received: from ydin.reaktio.net (reaktio.net [194.89.68.22])
	by smtp.tele.fi (Postfix) with ESMTP id E49322912;
	Wed, 16 Nov 2011 17:53:47 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id BE1F120058; Wed, 16 Nov 2011 17:53:47 +0200 (EET)
Date: Wed, 16 Nov 2011 17:53:47 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Keir Fraser <keir.xen@gmail.com>
Subject: Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek nic problems
	(eth0 8139cp transmit queue timed out)
Message-ID: <20111116155347.GI12984@reaktio.net>
References: <20111116133310.GH12984@reaktio.net>
	<CAE98089.24FFA%keir.xen@gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <CAE98089.24FFA%keir.xen@gmail.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: "xen@lists.fedoraproject.org" <xen@lists.fedoraproject.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Nov 16, 2011 at 03:00:25PM +0000, Keir Fraser wrote:
> On 16/11/2011 13:33, "Pasi Kärkkäinen" <pasik@iki.fi> wrote:
> 
> > On Mon, Nov 14, 2011 at 05:47:11PM +0000, Ian Jackson wrote:
> >> Pasi Kärkkäinen writes ("Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek
> >> nic problems (eth0 8139cp transmit queue timed out)"):
> >>> So please go ahead and commit the fix to xen-4.1-testing.hg.
> >> 
> >> Keir, will you do this ?  If you prefer I can do it, but I need the
> >> blessing of a hypervisor maintainer.
> >> 
> > 
> > Ping? 
> 
> I responded on 3rd November:
> 
> "This looks like a backport of Stefano's xen-unstable c/s 24007. I would
> like him to submit/ack the backport, as it is not a trivial backport of the
> xen-unstable patch."
> 

Stefano already submitted a new patch for this..

-- Pasi


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-api-bounces@lists.xensource.com Wed Nov 16 08:02:28 2011
Return-path: <xen-api-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 08:02:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQhwR-0004hU-RT; Wed, 16 Nov 2011 08:02:28 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQhtW-0004bH-6E; Wed, 16 Nov 2011 07:59:29 -0800
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1321459133!53014731!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12962 invoked from network); 16 Nov 2011 15:58:55 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 15:58:55 -0000
Received: by ggnk1 with SMTP id k1so5700923ggn.30
	for <multiple recipients>; Wed, 16 Nov 2011 07:59:20 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:message-id:date:from:user-agent:mime-version:cc:subject
	:references:in-reply-to:content-type:content-transfer-encoding;
	bh=8czRoT1QbP4Z+obD1YCkoMdyB8YK04lxMsZnb0AeGKs=;
	b=e2YXGP7lV/sLZV5m7FI+mlbMoKMM8K/sDKzTwaR1ryd4d8r0No9AV4YDr7LaKblNGO
	57nGkRHaLb3urwCcgiW24QVw4cuZNcVJYAj3o/RqcniGV7wPAyCm3LuaALLnMN+xqrFv
	ZrIkyzPSnWVdRqpPnwADfTcmDz3ckBv6djulg=
Received: by 10.236.180.101 with SMTP id i65mr2537393yhm.21.1321459160625;
	Wed, 16 Nov 2011 07:59:20 -0800 (PST)
Received: from [172.16.25.10] ([189.2.73.34])
	by mx.google.com with ESMTPS id 36sm3818808anz.2.2011.11.16.07.59.17
	(version=SSLv3 cipher=OTHER); Wed, 16 Nov 2011 07:59:19 -0800 (PST)
Message-ID: <4EC3DDCE.9020506@xen.org>
Date: Wed, 16 Nov 2011 13:59:10 -0200
From: Lars Kurth <lars.kurth@xen.org>
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20111105 Thunderbird/8.0
MIME-Version: 1.0
Subject: Re: [Xen-users] Re: [Xen-API] Another Xen Doc Day, Nov 29 or Dec
 12
References: <4EBD03EA.9070907@xen.org>
	<20111111150013.GA4712@phenom.dumpdata.com>
	<CAL_tfFeUsDO1oAoKeWHLBJG0CHDf8A19mvjNX+zJCXfVdmfd3w@mail.gmail.com>
In-Reply-To: <CAL_tfFeUsDO1oAoKeWHLBJG0CHDf8A19mvjNX+zJCXfVdmfd3w@mail.gmail.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: xen-arm@lists.xensource.com,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	"xen-api@lists.xensource.com" <xen-api@lists.xensource.com>
X-BeenThere: xen-api@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Discussion of API issues surrounding Xen <xen-api.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>,
	<mailto:xen-api-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-api@lists.xensource.com>
List-Help: <mailto:xen-api-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>,
	<mailto:xen-api-request@lists.xensource.com?subject=subscribe>
Sender: xen-api-bounces@lists.xensource.com
Errors-To: xen-api-bounces@lists.xensource.com

So far we had two votes for Nov 29th
Any others?
Lars

On 15/11/2011 11:25, Andrew Eross wrote:
> +1 Nov 29
>
> On Fri, Nov 11, 2011 at 1:00 PM, Konrad Rzeszutek Wilk
> <konrad.wilk@oracle.com>  wrote:
>> On Fri, Nov 11, 2011 at 11:15:54AM +0000, Lars Kurth wrote:
>>> Hi,
>>>
>>> Given that the last Xen Document day was a real success, I wanted to
>>> propose another Xen Document day. Ideas of what to work on:
>>> - Continue some of the work stared by the dev community (more man
>>> pages, etc.)
>>> - Clean up pages in the new Wiki
>>> - I am also happy to be on stand-by to help anybody who wants to
>>> know how to use the new Wiki effectively
>>>
>>> Please vote on date preferences by voting
>>> +1<your preferred date>
>> +1 Nov 29
>>
>> _______________________________________________
>> Xen-users mailing list
>> Xen-users@lists.xensource.com
>> http://lists.xensource.com/xen-users


_______________________________________________
xen-api mailing list
xen-api@lists.xensource.com
http://lists.xensource.com/mailman/listinfo/xen-api

From xen-devel-bounces@lists.xensource.com Wed Nov 16 08:13:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 08:13:49 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQi7Q-0006Ev-Cw; Wed, 16 Nov 2011 08:13:48 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQhvN-0004dI-0O
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 08:01:46 -0800
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-12.tower-27.messagelabs.com!1321459252!44859872!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23913 invoked from network); 16 Nov 2011 16:00:53 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-12.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 16 Nov 2011 16:00:53 -0000
X-Originating-Ip: [194.89.68.22]
Received: from ydin.reaktio.net (reaktio.net [194.89.68.22])
	by smtp.tele.fi (Postfix) with ESMTP id 70C662A30;
	Wed, 16 Nov 2011 18:01:15 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 4D29B20058; Wed, 16 Nov 2011 18:01:15 +0200 (EET)
Date: Wed, 16 Nov 2011 18:01:15 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Keir Fraser <keir.xen@gmail.com>
Subject: Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek nic problems
	(eth0 8139cp transmit queue timed out)
Message-ID: <20111116160115.GJ12984@reaktio.net>
References: <20111116133310.GH12984@reaktio.net>
	<CAE98089.24FFA%keir.xen@gmail.com>
	<20111116155347.GI12984@reaktio.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <20111116155347.GI12984@reaktio.net>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: "xen@lists.fedoraproject.org" <xen@lists.fedoraproject.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Nov 16, 2011 at 05:53:47PM +0200, Pasi Kärkkäinen wrote:
> On Wed, Nov 16, 2011 at 03:00:25PM +0000, Keir Fraser wrote:
> > On 16/11/2011 13:33, "Pasi Kärkkäinen" <pasik@iki.fi> wrote:
> > 
> > > On Mon, Nov 14, 2011 at 05:47:11PM +0000, Ian Jackson wrote:
> > >> Pasi Kärkkäinen writes ("Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek
> > >> nic problems (eth0 8139cp transmit queue timed out)"):
> > >>> So please go ahead and commit the fix to xen-4.1-testing.hg.
> > >> 
> > >> Keir, will you do this ?  If you prefer I can do it, but I need the
> > >> blessing of a hypervisor maintainer.
> > >> 
> > > 
> > > Ping? 
> > 
> > I responded on 3rd November:
> > 
> > "This looks like a backport of Stefano's xen-unstable c/s 24007. I would
> > like him to submit/ack the backport, as it is not a trivial backport of the
> > xen-unstable patch."
> > 
> 
> Stefano already submitted a new patch for this..
> 

.. which is here (Nov 7th): http://lists.xensource.com/archives/html/xen-devel/2011-11/msg00321.html

Both Konrad and I tested that patch with Xen 4.1.2, and it fixes the bug.

-- Pasi


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 08:15:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 08:15:53 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQi9Q-0006dT-KF; Wed, 16 Nov 2011 08:15:52 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQhyO-0004vz-5i
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 08:04:29 -0800
X-Env-Sender: m.a.young@durham.ac.uk
X-Msg-Ref: server-4.tower-182.messagelabs.com!1321459464!3392044!1
X-Originating-IP: [129.234.248.2]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11557 invoked from network); 16 Nov 2011 16:04:25 -0000
Received: from hermes2.dur.ac.uk (HELO hermes2.dur.ac.uk) (129.234.248.2)
	by server-4.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 16 Nov 2011 16:04:25 -0000
Received: from smtphost3.dur.ac.uk (smtphost3.dur.ac.uk [129.234.252.3])
	by hermes2.dur.ac.uk (8.13.8/8.13.7) with ESMTP id pAGG3vY0029204;
	Wed, 16 Nov 2011 16:04:01 GMT
Received: from algedi.dur.ac.uk (algedi.dur.ac.uk [129.234.2.28])
	by smtphost3.dur.ac.uk (8.13.8/8.13.7) with ESMTP id pAGG3eMD010265
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 16 Nov 2011 16:03:40 GMT
Received: from algedi.dur.ac.uk (localhost [127.0.0.1])
	by algedi.dur.ac.uk (8.14.4+Sun/8.11.1) with ESMTP id pAGG3eTe024884;
	Wed, 16 Nov 2011 16:03:40 GMT
Received: from localhost (dcl0may@localhost)
	by algedi.dur.ac.uk (8.14.4+Sun/8.14.4/Submit) with ESMTP id
	pAGG3cTx024881; Wed, 16 Nov 2011 16:03:38 GMT
Date: Wed, 16 Nov 2011 16:03:37 +0000 (GMT)
From: M A Young <m.a.young@durham.ac.uk>
To: Keir Fraser <keir.xen@gmail.com>
Subject: Re: [Fedora-xen] [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek
	nic problems	(eth0 8139cp transmit queue timed out)
In-Reply-To: <20111116155347.GI12984@reaktio.net>
Message-ID: <alpine.GSO.2.00.1111161559150.24508@algedi.dur.ac.uk>
References: <20111116133310.GH12984@reaktio.net>
	<CAE98089.24FFA%keir.xen@gmail.com>
	<20111116155347.GI12984@reaktio.net>
User-Agent: Alpine 2.00 (GSO 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: MULTIPART/MIXED;
	boundary="-559023410-862728993-1321459317=:24508"
Content-ID: <alpine.GSO.2.00.1111161602080.24508@algedi.dur.ac.uk>
X-DurhamAcUk-MailScanner: Found to be clean, Found to be clean
X-DurhamAcUk-MailScanner-ID: pAGG3vY0029204
Cc: "xen@lists.fedoraproject.org" <xen@lists.fedoraproject.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.

---559023410-862728993-1321459317=:24508
Content-Type: TEXT/PLAIN; format=flowed; charset=ISO-8859-15
Content-Transfer-Encoding: 8BIT
Content-ID: <alpine.GSO.2.00.1111161602081.24508@algedi.dur.ac.uk>

On Wed, 16 Nov 2011, Pasi Kärkkäinen wrote:

> On Wed, Nov 16, 2011 at 03:00:25PM +0000, Keir Fraser wrote:
>> I responded on 3rd November:
>> 
>> "This looks like a backport of Stefano's xen-unstable c/s 24007. I would
>> like him to submit/ack the backport, as it is not a trivial backport of the
>> xen-unstable patch."
>> 
>
> Stefano already submitted a new patch for this..

The patch we have been testing is from this email
http://lists.xensource.com/archives/html/xen-devel/2011-11/msg00321.html
from Stephano.

 	Michael Young
---559023410-862728993-1321459317=:24508
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

---559023410-862728993-1321459317=:24508--


From xen-devel-bounces@lists.xensource.com Wed Nov 16 08:18:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 08:18:37 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQiC4-00079F-4H; Wed, 16 Nov 2011 08:18:36 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQi2M-0005Sz-7a
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 08:08:56 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1321459710!4393099!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18015 invoked from network); 16 Nov 2011 16:08:30 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 16:08:30 -0000
X-IronPort-AV: E=Sophos;i="4.69,521,1315180800"; 
   d="scan'208";a="8967617"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 16:08:30 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Wed, 16 Nov 2011 16:08:31 +0000
Subject: Re: [Xen-devel] reg dom0 console
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Prasad B <netlogic.xen@gmail.com>
Date: Wed, 16 Nov 2011 16:08:30 +0000
In-Reply-To: <CAPw52B9c475fYmbT5e41OcLmbTyOkxPbzG6sa9pJKjDAbH=yqQ@mail.gmail.com>
References: <CAPw52B9wm-2VfRcLRhRBgpjDmgwU5LqNryZ0pLpNALF+eYpitQ@mail.gmail.com>
	<1317884089.24742.9.camel@dagon.hellion.org.uk>
	<CAPw52B_-K5Hy+Wo3UnarYoAb85WLhxTb4KtfByMPpL5_g+COVQ@mail.gmail.com>
	<1318411454.21903.606.camel@zakaz.uk.xensource.com>
	<CAPw52B9EEg_xHbFOCQmHDmW0evi0F6kFkronYSAAjz6ifXx72Q@mail.gmail.com>
	<1320743395.955.44.camel@zakaz.uk.xensource.com>
	<CAPw52B9c475fYmbT5e41OcLmbTyOkxPbzG6sa9pJKjDAbH=yqQ@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1321459710.3664.194.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: xen-devel <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


On Wed, 2011-11-16 at 00:59 +0000, Prasad B wrote:
> One question as we work on domU. What is the console infrastructure
> used to connect to domU ? To login into domU and see domU's output.
> From what I gather, "xl" itself is capable of attaching to a domain's
> console and used for IO. So, "xl" is all is needed to talk to domU ?

xl just execs /usr/lib/xen/bin/xenconsole to talk to the console.

xenconsole is just a client for xenconsoled which is the daemon which
actually consumes guest consoles. The source for both is in
tools/console. 

My memory is fuzzy but IIRC the toolstack writes the
keys /local/domain/<DOMID>/console/{ring-ref,port} to xenstore which
xenconsoled picks up in order to communicate with the domain. The guest
gets its end of things from the startinfo.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 08:27:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 08:27:43 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQiKt-0007ie-5o; Wed, 16 Nov 2011 08:27:43 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQiJQ-0007VX-3E
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 08:26:15 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1321460738!57499195!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31597 invoked from network); 16 Nov 2011 16:25:38 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 16:25:38 -0000
Received: by wwp14 with SMTP id 14so914319wwp.24
	for <xen-devel@lists.xensource.com>;
	Wed, 16 Nov 2011 08:26:09 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=V2QdqzepkW1th0bjr7BMkLh5flCNP2OScE+XllJzLEg=;
	b=jtdA19CaEabckbd6vWaTrL/vk+WFv5TlK5zoVMiGxRihShq05RcgkJ6H9PYSWicvfh
	Bt4o3iPDOX7FCi3fJfN6TnqUMgLnxMaLmyToV4i+5WXkHl5Y7ukEpIkgz2B9Wbcj/SjB
	nUbQkQ4IXFCUkMlNQ0rhQQV9gnqgOGjgev9GY=
Received: by 10.227.207.205 with SMTP id fz13mr22095785wbb.0.1321460768841;
	Wed, 16 Nov 2011 08:26:08 -0800 (PST)
Received: from [192.168.1.3] (host86-129-245-239.range86-129.btcentralplus.com.
	[86.129.245.239]) by mx.google.com with ESMTPS id
	en13sm33276814wbb.22.2011.11.16.08.26.06
	(version=SSLv3 cipher=OTHER); Wed, 16 Nov 2011 08:26:07 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Wed, 16 Nov 2011 16:25:59 +0000
Subject: Re: [Xen-devel] [PATCH 2/2] x86/emulator: generalize movq emulation
	(SSE2 and AVX variants)
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CAE99497.342DA%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH 2/2] x86/emulator: generalize movq emulation
	(SSE2 and AVX variants)
Thread-Index: AcykfGx+PpuAFAnEI0mY+7BYvqEBYA==
In-Reply-To: <4EC3D00602000078000614FC@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 16/11/2011 14:00, "Jan Beulich" <JBeulich@suse.com> wrote:

> Extend the existing movq emulation to also support its SSE2 and AVX
> variants, the latter implying the addition of VEX decoding. Fold the
> read and write cases (as most of the logic is identical), and add
> movntq and variants (as they're very similar).
> 
> Extend the testing code to also exercise these instructions.

I checked in your other patches, although I split them up and revised them
in some cases.

This one is broadly okay too, but:

 1. Don't import vm86_mode(). x86_emulate already does eflags&EFLG_VM in
some places. And that's fairly self documenting so just carry on with that.

 2. Don't import DEFINE_PER_CPU/this_cpu. I understand it works around a
critical issue but it's *so* nasty. I would rather define a nasty private
macro for declaring aligned space on the stack, like, for example:
   char __mmval[64], *mmval = (__mmval + 31) & ~32;
(suitably cleaned up, macroised, and made compilable of course ;-)

 3. There's a XXX'ed chunk of code in the middle of the patch. No
explanation. Remove it, or comment it, or something.

Note that I changed the vcpu_must_have stuff when I check it in, so those
bits will need fixup in this patch too. In particular, I don't bother
importing cpufeature.h -- the leaf/reg are already open coded with no macro
abstraction, so I see no harm in open-coding the bit number either. They
won't change and the vcpu_must_have_xxx macro name is sufficient
documentation in itself.

 -- Keir

> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> 
> --- a/tools/tests/x86_emulator/test_x86_emulator.c
> +++ b/tools/tests/x86_emulator/test_x86_emulator.c
> @@ -1,3 +1,5 @@
> +#include <errno.h>
> +#include <stdbool.h>
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <string.h>
> @@ -53,11 +55,84 @@ static int cmpxchg(
>      return X86EMUL_OKAY;
>  }
>  
> +static int cpuid(
> +    unsigned int *eax,
> +    unsigned int *ebx,
> +    unsigned int *ecx,
> +    unsigned int *edx,
> +    struct x86_emulate_ctxt *ctxt)
> +{
> +    asm ("cpuid" : "+a" (*eax), "+c" (*ecx), "=d" (*edx), "=b" (*ebx));
> +    return X86EMUL_OKAY;
> +}
> +
> +#define cpu_has_mmx ({ \
> +    unsigned int eax = 1, ecx = 0, edx; \
> +    cpuid(&eax, &ecx, &ecx, &edx, NULL); \
> +    (edx & (1U << 23)) != 0; \
> +})
> +
> +#define cpu_has_sse ({ \
> +    unsigned int eax = 1, ecx = 0, edx; \
> +    cpuid(&eax, &ecx, &ecx, &edx, NULL); \
> +    (edx & (1U << 25)) != 0; \
> +})
> +
> +#define cpu_has_sse2 ({ \
> +    unsigned int eax = 1, ecx = 0, edx; \
> +    cpuid(&eax, &ecx, &ecx, &edx, NULL); \
> +    (edx & (1U << 26)) != 0; \
> +})
> +
> +static inline uint64_t xgetbv(uint32_t xcr)
> +{
> +    uint64_t res;
> +
> +    asm ( ".byte 0x0f, 0x01, 0xd0" : "=A" (res) : "c" (xcr) );
> +
> +    return res;
> +}
> +
> +#define cpu_has_avx ({ \
> +    unsigned int eax = 1, ecx = 0, edx; \
> +    cpuid(&eax, &edx, &ecx, &edx, NULL); \
> +    if ( !(ecx & (1U << 27)) || (xgetbv(0) & 6) != 6 ) \
> +        ecx = 0; \
> +    (ecx & (1U << 28)) != 0; \
> +})
> +
> +int get_fpu(
> +    void (*exception_callback)(void *, struct cpu_user_regs *),
> +    void *exception_callback_arg,
> +    enum x86_emulate_fpu_type type,
> +    struct x86_emulate_ctxt *ctxt)
> +{
> +    switch ( type )
> +    {
> +    case X86EMUL_FPU_fpu:
> +        break;
> +    case X86EMUL_FPU_ymm:
> +        if ( cpu_has_avx )
> +            break;
> +    case X86EMUL_FPU_xmm:
> +        if ( cpu_has_sse )
> +            break;
> +    case X86EMUL_FPU_mmx:
> +        if ( cpu_has_mmx )
> +            break;
> +    default:
> +        return X86EMUL_UNHANDLEABLE;
> +    }
> +    return X86EMUL_OKAY;
> +}
> +
>  static struct x86_emulate_ops emulops = {
>      .read       = read,
>      .insn_fetch = read,
>      .write      = write,
>      .cmpxchg    = cmpxchg,
> +    .cpuid      = cpuid,
> +    .get_fpu    = get_fpu,
>  };
>  
>  int main(int argc, char **argv)
> @@ -66,6 +141,8 @@ int main(int argc, char **argv)
>      struct cpu_user_regs regs;
>      char *instr;
>      unsigned int *res, i, j;
> +    unsigned long sp;
> +    bool stack_exec;
>      int rc;
>  #ifndef __x86_64__
>      unsigned int bcdres_native, bcdres_emul;
> @@ -85,6 +162,16 @@ int main(int argc, char **argv)
>      }
>      instr = (char *)res + 0x100;
>  
> +#ifdef __x86_64__
> +    asm ("movq %%rsp, %0" : "=g" (sp));
> +#else
> +    asm ("movl %%esp, %0" : "=g" (sp));
> +#endif
> +    stack_exec = mprotect((void *)(sp & -0x1000L) - (MMAP_SZ - 0x1000),
> +                          MMAP_SZ, PROT_READ|PROT_WRITE|PROT_EXEC) == 0;
> +    if ( !stack_exec )
> +        printf("Warning: Stack could not be made executable (%d).\n", errno);
> +
>      printf("%-40s", "Testing addl %%ecx,(%%eax)...");
>      instr[0] = 0x01; instr[1] = 0x08;
>      regs.eflags = 0x200;
> @@ -442,6 +529,108 @@ int main(int argc, char **argv)
>      printf("skipped\n");
>  #endif
>  
> +    printf("%-40s", "Testing movq %mm3,(%ecx)...");
> +    if ( stack_exec && cpu_has_mmx )
> +    {
> +        extern const unsigned char movq_to_mem[];
> +
> +        asm volatile ( "pcmpeqb %%mm3, %%mm3\n"
> +                       ".pushsection .test, \"a\", @progbits\n"
> +                       "movq_to_mem: movq %%mm3, (%0)\n"
> +                       ".popsection" :: "c" (NULL) );
> +
> +        memcpy(instr, movq_to_mem, 15);
> +        memset(res, 0x33, 64);
> +        memset(res + 8, 0xff, 8);
> +        regs.eip    = (unsigned long)&instr[0];
> +        regs.ecx    = (unsigned long)res;
> +        rc = x86_emulate(&ctxt, &emulops);
> +        if ( (rc != X86EMUL_OKAY) ||
> +             memcmp(res, res + 8, 32) )
> +            goto fail;
> +        printf("okay\n");
> +    }
> +    else
> +        printf("skipped\n");
> +
> +    printf("%-40s", "Testing movq (%edx),%mm5...");
> +    if ( stack_exec && cpu_has_mmx )
> +    {
> +        extern const unsigned char movq_from_mem[];
> +
> +        asm volatile ( "pcmpgtb %%mm5, %%mm5\n"
> +                       ".pushsection .test, \"a\", @progbits\n"
> +                       "movq_from_mem: movq (%0), %%mm5\n"
> +                       ".popsection" :: "d" (NULL) );
> +
> +        memcpy(instr, movq_from_mem, 15);
> +        regs.eip    = (unsigned long)&instr[0];
> +        regs.ecx    = 0;
> +        regs.edx    = (unsigned long)res;
> +        rc = x86_emulate(&ctxt, &emulops);
> +        if ( rc != X86EMUL_OKAY )
> +            goto fail;
> +        asm ( "pcmpeqb %%mm3, %%mm3\n\t"
> +              "pcmpeqb %%mm5, %%mm3\n\t"
> +              "pmovmskb %%mm3, %0" : "=r" (rc) );
> +        if ( rc != 0xff )
> +            goto fail;
> +        printf("okay\n");
> +    }
> +    else
> +        printf("skipped\n");
> +
> +    printf("%-40s", "Testing movdqu %xmm2,(%ecx)...");
> +    if ( stack_exec && cpu_has_sse2 )
> +    {
> +        extern const unsigned char movdqu_to_mem[];
> +
> +        asm volatile ( "pcmpeqb %%xmm2, %%xmm2\n"
> +                       ".pushsection .test, \"a\", @progbits\n"
> +                       "movdqu_to_mem: movdqu %%xmm2, (%0)\n"
> +                       ".popsection" :: "c" (NULL) );
> +
> +        memcpy(instr, movdqu_to_mem, 15);
> +        memset(res, 0x55, 64);
> +        memset(res + 8, 0xff, 16);
> +        regs.eip    = (unsigned long)&instr[0];
> +        regs.ecx    = (unsigned long)res;
> +        rc = x86_emulate(&ctxt, &emulops);
> +        if ( (rc != X86EMUL_OKAY) ||
> +             memcmp(res, res + 8, 32) )
> +            goto fail;
> +        printf("okay\n");
> +    }
> +    else
> +        printf("skipped\n");
> +
> +    printf("%-40s", "Testing movdqu (%edx),%xmm4...");
> +    if ( stack_exec && cpu_has_sse2 )
> +    {
> +        extern const unsigned char movdqu_from_mem[];
> +
> +        asm volatile ( "pcmpgtb %%xmm4, %%xmm4\n"
> +                       ".pushsection .test, \"a\", @progbits\n"
> +                       "movdqu_from_mem: movdqu (%0), %%xmm4\n"
> +                       ".popsection" :: "d" (NULL) );
> +
> +        memcpy(instr, movdqu_from_mem, 15);
> +        regs.eip    = (unsigned long)&instr[0];
> +        regs.ecx    = 0;
> +        regs.edx    = (unsigned long)res;
> +        rc = x86_emulate(&ctxt, &emulops);
> +        if ( rc != X86EMUL_OKAY )
> +            goto fail;
> +        asm ( "pcmpeqb %%xmm2, %%xmm2\n\t"
> +              "pcmpeqb %%xmm4, %%xmm2\n\t"
> +              "pmovmskb %%xmm2, %0" : "=r" (rc) );
> +        if ( rc != 0xffff )
> +            goto fail;
> +        printf("okay\n");
> +    }
> +    else
> +        printf("skipped\n");
> +
>      for ( j = 1; j <= 2; j++ )
>      {
>  #if defined(__i386__)
> --- a/tools/tests/x86_emulator/x86_emulate.c
> +++ b/tools/tests/x86_emulator/x86_emulate.c
> @@ -9,5 +9,10 @@ typedef bool bool_t;
>  
>  #define BUG() abort()
>  
> +#define DEFINE_PER_CPU(type, var) type this_cpu_##var
> +#define this_cpu(var) this_cpu_##var
> +
> +#define vm86_mode(regs) 0
> +
>  #include "x86_emulate/x86_emulate.h"
>  #include "x86_emulate/x86_emulate.c"
> --- a/xen/arch/x86/hvm/emulate.c
> +++ b/xen/arch/x86/hvm/emulate.c
> @@ -16,6 +16,7 @@
>  #include <xen/paging.h>
>  #include <xen/trace.h>
>  #include <asm/event.h>
> +#include <asm/xstate.h>
>  #include <asm/hvm/emulate.h>
>  #include <asm/hvm/hvm.h>
>  #include <asm/hvm/trace.h>
> @@ -905,6 +906,20 @@ static int hvmemul_get_fpu(
>          if ( !cpu_has_mmx )
>              return X86EMUL_UNHANDLEABLE;
>          break;
> +    case X86EMUL_FPU_xmm:
> +        if ( !cpu_has_xmm ||
> +             (curr->arch.hvm_vcpu.guest_cr[0] & X86_CR0_EM) ||
> +             !(curr->arch.hvm_vcpu.guest_cr[4] & X86_CR4_OSFXSR) )
> +            return X86EMUL_UNHANDLEABLE;
> +        break;
> +    case X86EMUL_FPU_ymm:
> +        if ( !(curr->arch.hvm_vcpu.guest_cr[0] & X86_CR0_PE) ||
> +             vm86_mode(ctxt->regs) ||
> +             !(curr->arch.hvm_vcpu.guest_cr[4] & X86_CR4_OSXSAVE) ||
> +             !(curr->arch.xcr0 & XSTATE_SSE) ||
> +             !(curr->arch.xcr0 & XSTATE_YMM) )
> +            return X86EMUL_UNHANDLEABLE;
> +        break;
>      default:
>          return X86EMUL_UNHANDLEABLE;
>      }
> --- a/xen/arch/x86/x86_emulate/x86_emulate.c
> +++ b/xen/arch/x86/x86_emulate/x86_emulate.c
> @@ -253,6 +253,47 @@ static uint8_t twobyte_table[256] = {
>      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
>  };
>  
> +#define REX_PREFIX 0x40
> +#define REX_B 0x01
> +#define REX_X 0x02
> +#define REX_R 0x04
> +#define REX_W 0x08
> +
> +#define vex_none 0
> +
> +enum vex_opcx {
> +    vex_0f = vex_none + 1,
> +    vex_0f38,
> +    vex_0f3a,
> +};
> +
> +enum vex_pfx {
> +    vex_66 = vex_none + 1,
> +    vex_f3,
> +    vex_f2
> +};
> +
> +union vex {
> +    uint8_t raw[2];
> +    struct {
> +        uint8_t opcx:5;
> +        uint8_t b:1;
> +        uint8_t x:1;
> +        uint8_t r:1;
> +        uint8_t pfx:2;
> +        uint8_t l:1;
> +        uint8_t reg:4;
> +        uint8_t w:1;
> +    };
> +};
> +
> +#define copy_REX_VEX(ptr, rex, vex) do { \
> +    if ( (vex).opcx != vex_none ) \
> +        ptr[0] = 0xc4, ptr[1] = (vex).raw[0], ptr[2] = (vex).raw[1]; \
> +    else if ( mode_64bit() ) \
> +        ptr[1] = rex | REX_PREFIX; \
> +} while (0)
> +
>  /* Type, address-of, and value of an instruction's operand. */
>  struct operand {
>      enum { OP_REG, OP_MEM, OP_IMM, OP_NONE } type;
> @@ -281,6 +322,18 @@ struct operand {
>      };
>  };
>  
> +typedef union {
> +    uint64_t mmx;
> +    uint64_t __attribute__ ((aligned(16))) xmm[2];
> +    uint64_t __attribute__ ((aligned(32))) ymm[4];
> +} mmval_t;
> +
> +/*
> + * While alignment gets specified above, this doesn't get honored by the
> + * compiler for automatic variables. Thus use a per-CPU variable instead.
> + */
> +static DEFINE_PER_CPU(mmval_t, mmval);
> +
>  /* MSRs. */
>  #define MSR_TSC          0x00000010
>  #define MSR_SYSENTER_CS  0x00000174
> @@ -972,9 +1025,12 @@ static bool_t vcpu_has(
>      generate_exception_if(!vcpu_has(leaf, subleaf, reg, \
>                                      X86_FEATURE_##feature % 32, \
>                                      ctxt, ops), EXC_UD, -1)
> +#define vcpu_must_have_mmx()  vcpu_must_have(1, 0, EDX, MMX)
> +#define vcpu_must_have_sse()  vcpu_must_have(1, 0, EDX, XMM)
>  #define vcpu_must_have_sse2() vcpu_must_have(1, 0, EDX, XMM2)
>  #define vcpu_must_have_sse3() vcpu_must_have(1, 0, ECX, XMM3)
>  #define vcpu_must_have_cx16() vcpu_must_have(1, 0, ECX, CX16)
> +#define vcpu_must_have_avx()  vcpu_must_have(1, 0, ECX, AVX)
>  
>  static int
>  in_realmode(
> @@ -1255,6 +1311,7 @@ x86_emulate(
>  
>      uint8_t b, d, sib, sib_index, sib_base, twobyte = 0, rex_prefix = 0;
>      uint8_t modrm = 0, modrm_mod = 0, modrm_reg = 0, modrm_rm = 0;
> +    union vex vex = {};
>      unsigned int op_bytes, def_op_bytes, ad_bytes, def_ad_bytes;
>  #define REPE_PREFIX  1
>  #define REPNE_PREFIX 2
> @@ -1287,6 +1344,7 @@ x86_emulate(
>          {
>          case 0x66: /* operand-size override */
>              op_bytes = def_op_bytes ^ 6;
> +            vex.pfx = vex_66;
>              break;
>          case 0x67: /* address-size override */
>              ad_bytes = def_ad_bytes ^ (mode_64bit() ? 12 : 6);
> @@ -1314,9 +1372,11 @@ x86_emulate(
>              break;
>          case 0xf2: /* REPNE/REPNZ */
>              rep_prefix = REPNE_PREFIX;
> +            vex.pfx = vex_f2;
>              break;
>          case 0xf3: /* REP/REPE/REPZ */
>              rep_prefix = REPE_PREFIX;
> +            vex.pfx = vex_f3;
>              break;
>          case 0x40 ... 0x4f: /* REX */
>              if ( !mode_64bit() )
> @@ -1360,6 +1420,70 @@ x86_emulate(
>      {
>          modrm = insn_fetch_type(uint8_t);
>          modrm_mod = (modrm & 0xc0) >> 6;
> +
> +        if ( !twobyte && (b & ~1) == 0xc4 )
> +            switch ( def_ad_bytes )
> +            {
> +            default:
> +                BUG();
> +            case 2:
> +                if ( in_realmode(ctxt, ops) || vm86_mode(&_regs) )
> +                    break;
> +                /* fall through */
> +            case 4:
> +                if ( modrm_mod != 3 )
> +                    break;
> +                /* fall through */
> +            case 8:
> +                /* VEX */
> +                generate_exception_if(rex_prefix || vex.pfx, EXC_UD, -1);
> +
> +                vex.raw[0] = b;
> +                if ( b & 1 )
> +                {
> +                    vex.raw[1] = b;
> +                    vex.opcx = vex_0f;
> +                    vex.x = 1;
> +                    vex.b = 1;
> +                    vex.w = 0;
> +                }
> +                else
> +                {
> +                    vex.raw[1] = insn_fetch_type(uint8_t);
> +                    if ( mode_64bit() )
> +                    {
> +                        if ( !vex.b )
> +                            rex_prefix |= REX_B;
> +                        if ( !vex.x )
> +                            rex_prefix |= REX_X;
> +                        if ( vex.w )
> +                        {
> +                            rex_prefix |= REX_W;
> +                            op_bytes = 8;
> +                        }
> +                    }
> +                }
> +                vex.reg ^= 0xf;
> +                if ( !mode_64bit() )
> +                    vex.reg &= 0x7;
> +                else if ( !vex.r )
> +                    rex_prefix |= REX_R;
> +
> +                fail_if(vex.opcx != vex_0f);
> +                twobyte = 1;
> +                b = insn_fetch_type(uint8_t);
> +                d = twobyte_table[b];
> +
> +                /* Unrecognised? */
> +                if ( d == 0 )
> +                    goto cannot_emulate;
> +
> +                modrm = insn_fetch_type(uint8_t);
> +                modrm_mod = (modrm & 0xc0) >> 6;
> +
> +                break;
> +            }
> +
>          modrm_reg = ((rex_prefix & 4) << 1) | ((modrm & 0x38) >> 3);
>          modrm_rm  = modrm & 0x07;
>  
> @@ -3917,44 +4041,77 @@ x86_emulate(
>          break;
>      }
>  
> -    case 0x6f: /* movq mm/m64,mm */ {
> -        uint8_t stub[] = { 0x0f, 0x6f, modrm, 0xc3 };
> +    case 0x6f: /* movq mm/m64,mm */
> +               /* {,v}movdq{a,u} xmm/m128,xmm */
> +               /* vmovdq{a,u} ymm/m256,ymm */
> +    case 0x7f: /* movq mm,mm/m64 */
> +               /* {,v}movdq{a,u} xmm,xmm/m128 */
> +               /* vmovdq{a,u} ymm,ymm/m256 */
> +    case 0xe7: /* movntq mm,mm/m64 */
> +               /* {,v}movntdq xmm,xmm/m128 */
> +               /* vmovntdq{a,u} ymm,ymm/m256 */
> +    {
> +        uint8_t stub[] = { 0x3e, 0x3e, 0x0f, b, modrm, 0xc3 };
>          struct fpu_insn_ctxt fic = { .insn_bytes = sizeof(stub)-1 };
> -        uint64_t val;
> -        if ( ea.type == OP_MEM )
> +
> +        if ( vex.opcx == vex_none )
>          {
> -            unsigned long lval, hval;
> -            if ( (rc = read_ulong(ea.mem.seg, ea.mem.off+0,
> -                                  &lval, 4, ctxt, ops)) ||
> -                 (rc = read_ulong(ea.mem.seg, ea.mem.off+4,
> -                                  &hval, 4, ctxt, ops)) )
> -                goto done;
> -            val = ((uint64_t)hval << 32) | (uint32_t)lval;
> -            stub[2] = modrm & 0x38; /* movq (%eax),%mmN */
> +            switch ( vex.pfx )
> +            {
> +            case vex_f3:
> +                fail_if(b == 0xe7);
> +                /* fall through */
> +            case vex_66:
> +                vcpu_must_have_sse2();
> +                stub[0] = 0x66; /* movdqa */
> +                get_fpu(X86EMUL_FPU_xmm, &fic);
> +                ea.bytes = 16;
> +                break;
> +            case vex_none:
> +                if ( b != 0xe7 )
> +                    vcpu_must_have_mmx();
> +                else
> +                    vcpu_must_have_sse();
> +                get_fpu(X86EMUL_FPU_mmx, &fic);
> +                ea.bytes = 8;
> +                break;
> +            default:
> +                goto cannot_emulate;
> +            }
> +        }
> +        else
> +        {
> +            fail_if(vex.opcx != vex_0f || vex.reg ||
> +                    (vex.pfx != vex_66 && (vex.pfx != vex_f3 || b == 0xe7)));
> +            vcpu_must_have_avx();
> +            get_fpu(X86EMUL_FPU_ymm, &fic);
> +            ea.bytes = 16 << vex.l;
>          }
> -        get_fpu(X86EMUL_FPU_mmx, &fic);
> -        asm volatile ( "call *%0" : : "r" (stub), "a" (&val) : "memory" );
> -        put_fpu(&fic);
> -        break;
> -    }
> -
> -    case 0x7f: /* movq mm,mm/m64 */ {
> -        uint8_t stub[] = { 0x0f, 0x7f, modrm, 0xc3 };
> -        struct fpu_insn_ctxt fic = { .insn_bytes = sizeof(stub)-1 };
> -        uint64_t val;
> -        if ( ea.type == OP_MEM )
> -            stub[2] = modrm & 0x38; /* movq %mmN,(%eax) */
> -        get_fpu(X86EMUL_FPU_mmx, &fic);
> -        asm volatile ( "call *%0" : : "r" (stub), "a" (&val) : "memory" );
> -        put_fpu(&fic);
>          if ( ea.type == OP_MEM )
>          {
> -            unsigned long lval = (uint32_t)val, hval = (uint32_t)(val >> 32);
> -            if ( (rc = ops->write(ea.mem.seg, ea.mem.off+0, &lval, 4, ctxt))
> ||
> -                 (rc = ops->write(ea.mem.seg, ea.mem.off+4, &hval, 4, ctxt))
> )
> -                goto done;
> +            /* XXX
> +            generate_exception_if(vex.pfx == vex_66 &&
> +                                  (ops->ea(ea.mem.seg, ea.mem.off)
> +                                   & (ea.bytes - 1)), EXC_GP, 0); */
> +            if ( b == 0x6f )
> +                rc = ops->read(ea.mem.seg, ea.mem.off+0, &this_cpu(mmval),
> +                               ea.bytes, ctxt);
> +            /* convert memory operand to (%rAX) */
> +            rex_prefix &= ~REX_B;
> +            vex.b = 1;
> +            stub[4] &= 0x38;
> +        }
> +        if ( !rc )
> +        {
> +           copy_REX_VEX(stub, rex_prefix, vex);
> +           asm volatile ( "call *%0" : : "r" (stub), "a" (&this_cpu(mmval))
> +                                     : "memory" );
>          }
> -        break;
> +        put_fpu(&fic);
> +        if ( b != 0x6f && ea.type == OP_MEM )
> +            rc = ops->write(ea.mem.seg, ea.mem.off, &this_cpu(mmval),
> +                            ea.bytes, ctxt);
> +        goto done;
>      }
>  
>      case 0x80 ... 0x8f: /* jcc (near) */ {
> --- a/xen/arch/x86/x86_emulate/x86_emulate.h
> +++ b/xen/arch/x86/x86_emulate/x86_emulate.h
> @@ -99,7 +99,9 @@ struct segment_register {
>  /* FPU sub-types which may be requested via ->get_fpu(). */
>  enum x86_emulate_fpu_type {
>      X86EMUL_FPU_fpu, /* Standard FPU coprocessor instruction set */
> -    X86EMUL_FPU_mmx  /* MMX instruction set (%mm0-%mm7) */
> +    X86EMUL_FPU_mmx, /* MMX instruction set (%mm0-%mm7) */
> +    X86EMUL_FPU_xmm, /* SSE instruction set (%xmm0-%xmm7/15) */
> +    X86EMUL_FPU_ymm  /* AVX/XOP instruction set (%ymm0-%ymm7/15) */
>  };
>  
>  /*
> --- a/xen/arch/x86/x86_emulate.c
> +++ b/xen/arch/x86/x86_emulate.c
> @@ -10,9 +10,11 @@
>   */
>  
>  #include <asm/cpufeature.h>
> +#include <asm/processor.h>
>  #include <asm/x86_emulate.h>
>  
>  /* Avoid namespace pollution. */
>  #undef cmpxchg
> +#undef cpuid
>  
>  #include "x86_emulate/x86_emulate.c"
> --- a/xen/include/asm-x86/cpufeature.h
> +++ b/xen/include/asm-x86/cpufeature.h
> @@ -218,7 +218,7 @@
>  #define cpu_has_x2apic          boot_cpu_has(X86_FEATURE_X2APIC)
>  
>  #define cpu_has_xsave           boot_cpu_has(X86_FEATURE_XSAVE)
> -
> +#define cpu_has_avx             boot_cpu_has(X86_FEATURE_AVX)
>  #define cpu_has_lwp             boot_cpu_has(X86_FEATURE_LWP)
>  
>  #define cpu_has_arch_perfmon    boot_cpu_has(X86_FEATURE_ARCH_PERFMON)
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 08:28:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 08:28:58 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQiM5-00086K-Vn; Wed, 16 Nov 2011 08:28:58 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQiJz-0007We-7X
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 08:26:48 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1321460769!46177985!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20291 invoked from network); 16 Nov 2011 16:26:09 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 16:26:09 -0000
Received: by wwp14 with SMTP id 14so915259wwp.24
	for <xen-devel@lists.xensource.com>;
	Wed, 16 Nov 2011 08:26:44 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=icqjskIp3oOrEoz4rr8OBxwwaBCjBxrxyEy0Vro4qFE=;
	b=OMRrgBLk7eQkCgKT4dyp7P+Dlesh5sK2F2YjDYMY1lDqpDEk7ycqvelECsjSVLvcxu
	un1v1FYvIRnA5uu84PsZP+LXS6+noIUy2N0b/vMOKSPxg9T4Yke3Ak+6MrE8kDkbVD/o
	9vBSjN9FY/giWkr966uc6B6RIS1lvV96o2+K0=
Received: by 10.216.14.162 with SMTP id d34mr706680wed.43.1321460804088;
	Wed, 16 Nov 2011 08:26:44 -0800 (PST)
Received: from [192.168.1.3] (host86-129-245-239.range86-129.btcentralplus.com.
	[86.129.245.239])
	by mx.google.com with ESMTPS id a27sm33288622wbp.16.2011.11.16.08.26.42
	(version=SSLv3 cipher=OTHER); Wed, 16 Nov 2011 08:26:43 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Wed, 16 Nov 2011 16:26:37 +0000
Subject: Re: [Xen-devel] [PATCH 0/2] x86: emulator improvements
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CAE994BD.342DB%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH 0/2] x86: emulator improvements
Thread-Index: AcykfIMkzILmbtY+HkyvlJ+ZE9hx0A==
In-Reply-To: <4EC3D3980200007800061518@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 16/11/2011 14:15, "Jan Beulich" <JBeulich@suse.com> wrote:

>>>> On 16.11.11 at 14:59, "Jan Beulich" <JBeulich@suse.com> wrote:
>> 1: x86/emulator: add feature checks for newer instructions
>> 2: x86/emulator: generalize movq emulation (SSE2 and AVX variants)
>> 
>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> 
> If this is acceptable, I'm planning to add support for {,v}mov{a,u}p{s,d}
> and {,v}movntp{s,d} (plus the respective opcode variants, even though
> I think we only really need full width loads and stores for the next little
> while) to deal with reports like in
> http://lists.xensource.com/archives/html/xen-devel/2011-10/msg00296.html.

Absolutely fine in principle. I'm only quibbling over details in your
current patch 2/2.

 -- Keir

> Jan
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 08:35:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 08:35:36 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQiSW-0000FH-G2; Wed, 16 Nov 2011 08:35:36 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQiS4-0008VE-Jr
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 08:35:08 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1321461305!1836166!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27265 invoked from network); 16 Nov 2011 16:35:05 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-14.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 16:35:05 -0000
Received: by wwp14 with SMTP id 14so929197wwp.24
	for <xen-devel@lists.xensource.com>;
	Wed, 16 Nov 2011 08:35:05 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=UTxQ7wY8PdL6teyKY8ks4D4/kQKln1C/meP2tSQy304=;
	b=hY2V4WTBFv+A8Ke0lyWzbwXH6CQN997rJQsG9VRHOxOE6D1rwNvZc4REvJeUY5pYHM
	SIz3DiT+zZwrqf3esmjJPZqSutNW6azjl4mYm+Q3LwSGokojIQCtEDu16P7IV91UaA6C
	ZQLmNVY2ItKLZy+NAO0D4FImze2AqUCKTAPdQ=
Received: by 10.180.93.168 with SMTP id cv8mr36835753wib.36.1321461305043;
	Wed, 16 Nov 2011 08:35:05 -0800 (PST)
Received: from [192.168.1.3] (host86-129-245-239.range86-129.btcentralplus.com.
	[86.129.245.239]) by mx.google.com with ESMTPS id
	hn15sm16660294wib.22.2011.11.16.08.35.03
	(version=SSLv3 cipher=OTHER); Wed, 16 Nov 2011 08:35:04 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Wed, 16 Nov 2011 16:34:56 +0000
Subject: Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek nic problems
	(eth0 8139cp transmit queue timed out)
From: Keir Fraser <keir@xen.org>
To: Pasi =?ISO-8859-1?B?S+Rya2vkaW5lbg==?= <pasik@iki.fi>
Message-ID: <CAE996B0.34330%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek nic problems
	(eth0 8139cp transmit queue timed out)
Thread-Index: AcykfayRCAUruYZtcUe1wUuMPvJEYA==
In-Reply-To: <20111116155347.GI12984@reaktio.net>
Mime-version: 1.0
Content-type: text/plain;
	charset="ISO-8859-1"
Content-transfer-encoding: quoted-printable
Cc: "xen@lists.fedoraproject.org" <xen@lists.fedoraproject.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 16/11/2011 15:53, "Pasi K=E4rkk=E4inen" <pasik@iki.fi> wrote:

> On Wed, Nov 16, 2011 at 03:00:25PM +0000, Keir Fraser wrote:
>> On 16/11/2011 13:33, "Pasi K=E4rkk=E4inen" <pasik@iki.fi> wrote:
>>=20
>>> On Mon, Nov 14, 2011 at 05:47:11PM +0000, Ian Jackson wrote:
>>>> Pasi K=E4rkk=E4inen writes ("Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest
>>>> realtek
>>>> nic problems (eth0 8139cp transmit queue timed out)"):
>>>>> So please go ahead and commit the fix to xen-4.1-testing.hg.
>>>>=20
>>>> Keir, will you do this ?  If you prefer I can do it, but I need the
>>>> blessing of a hypervisor maintainer.
>>>>=20
>>>=20
>>> Ping?=20
>>=20
>> I responded on 3rd November:
>>=20
>> "This looks like a backport of Stefano's xen-unstable c/s 24007. I would
>> like him to submit/ack the backport, as it is not a trivial backport of =
the
>> xen-unstable patch."
>>=20
>=20
> Stefano already submitted a new patch for this..

So he did. I've now applied it to xen-4.1-testing.

 -- Keir

> -- Pasi
>=20



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 08:45:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 08:45:37 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQicD-0000oG-Ft; Wed, 16 Nov 2011 08:45:37 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQibU-0000bL-Sl
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 08:44:53 -0800
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-3.tower-174.messagelabs.com!1321461889!1773457!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9527 invoked from network); 16 Nov 2011 16:44:49 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-3.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 16 Nov 2011 16:44:49 -0000
X-Originating-Ip: [194.89.68.22]
Received: from ydin.reaktio.net (reaktio.net [194.89.68.22])
	by smtp.tele.fi (Postfix) with ESMTP id 6B8002F9E;
	Wed, 16 Nov 2011 18:44:48 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 42FA620058; Wed, 16 Nov 2011 18:44:48 +0200 (EET)
Date: Wed, 16 Nov 2011 18:44:48 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Keir Fraser <keir@xen.org>
Subject: Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest realtek nic problems
	(eth0 8139cp transmit queue timed out)
Message-ID: <20111116164448.GK12984@reaktio.net>
References: <20111116155347.GI12984@reaktio.net> <CAE996B0.34330%keir@xen.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <CAE996B0.34330%keir@xen.org>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: "xen@lists.fedoraproject.org" <xen@lists.fedoraproject.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Nov 16, 2011 at 04:34:56PM +0000, Keir Fraser wrote:
> On 16/11/2011 15:53, "Pasi Kärkkäinen" <pasik@iki.fi> wrote:
> 
> > On Wed, Nov 16, 2011 at 03:00:25PM +0000, Keir Fraser wrote:
> >> On 16/11/2011 13:33, "Pasi Kärkkäinen" <pasik@iki.fi> wrote:
> >> 
> >>> On Mon, Nov 14, 2011 at 05:47:11PM +0000, Ian Jackson wrote:
> >>>> Pasi Kärkkäinen writes ("Re: [Xen-devel] [PATCH] Xen 4.1.2 HVM guest
> >>>> realtek
> >>>> nic problems (eth0 8139cp transmit queue timed out)"):
> >>>>> So please go ahead and commit the fix to xen-4.1-testing.hg.
> >>>> 
> >>>> Keir, will you do this ?  If you prefer I can do it, but I need the
> >>>> blessing of a hypervisor maintainer.
> >>>> 
> >>> 
> >>> Ping? 
> >> 
> >> I responded on 3rd November:
> >> 
> >> "This looks like a backport of Stefano's xen-unstable c/s 24007. I would
> >> like him to submit/ack the backport, as it is not a trivial backport of the
> >> xen-unstable patch."
> >> 
> > 
> > Stefano already submitted a new patch for this..
> 
> So he did. I've now applied it to xen-4.1-testing.
> 

Great, thanks!

-- Pasi


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 09:04:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 09:04:44 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQiuh-0001Yp-Do; Wed, 16 Nov 2011 09:04:43 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQiqw-0001IX-10
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 09:01:29 -0800
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1321462812!44204247!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12705 invoked from network); 16 Nov 2011 17:00:13 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-10.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 16 Nov 2011 17:00:13 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAGH0fP5011698
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 16 Nov 2011 17:00:42 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAGH0fsB019980
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 16 Nov 2011 17:00:41 GMT
Received: from abhmt110.oracle.com (abhmt110.oracle.com [141.146.116.62])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAGH0Za3006054; Wed, 16 Nov 2011 11:00:35 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 16 Nov 2011 09:00:35 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id ADBAE81489; Wed, 16 Nov 2011 12:00:34 -0500 (EST)
Date: Wed, 16 Nov 2011 12:00:34 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Jason Thomas <jethomas100@gmail.com>
Subject: Re: [Xen-devel] VMM Architecture documentation
Message-ID: <20111116170034.GC2793@phenom.dumpdata.com>
References: <CABKwQ+pT7LFqmnfGoK5YVsmzqomYjnA6t0jr=RyTVoTjFUDNLw@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CABKwQ+pT7LFqmnfGoK5YVsmzqomYjnA6t0jr=RyTVoTjFUDNLw@mail.gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090203.4EC3EC3A.00AC,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Nov 15, 2011 at 10:12:14AM -0800, Jason Thomas wrote:
> I am looking for a low level description of the VMM architecture, if one
> exists. Specifically which modules are required for 32 bit guests and which
> are needed for 64 bit guests. Does this exist or do I have to sift through
> the source code to find the differences?

We are kind of working through to make that easier to read.

But I am not actually sure what you mean by 'modules'?

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 09:33:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 09:33:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQjMf-00036b-Cb; Wed, 16 Nov 2011 09:33:37 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQjDc-0002N6-9T
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 09:24:16 -0800
X-Env-Sender: volker.eckert@citrix.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1321464253!4477920!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14790 invoked from network); 16 Nov 2011 17:24:13 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 17:24:13 -0000
X-IronPort-AV: E=Sophos;i="4.69,522,1315180800"; 
   d="scan'208";a="8969747"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 17:24:12 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 16 Nov 2011 17:24:12 +0000
Received: from dhcp-70.cam.xci-test.com ([10.80.251.70])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<volker.eckert@citrix.com>)	id 1RQjDY-0007Nq-9S	for
	xen-devel@lists.xensource.com; Wed, 16 Nov 2011 17:24:12 +0000
Message-ID: <4EC3F0C1.9050309@citrix.com>
Date: Wed, 16 Nov 2011 17:20:01 +0000
From: Volker Eckert <volker.eckert@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.1.16) Gecko/20111004 Icedove/3.0.11
MIME-Version: 1.0
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset="ISO-8859-1"; format=flowed
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Wed, 16 Nov 2011 09:32:45 -0800
Subject: [Xen-devel] ELF header data types / elfstructs.h, Elf64_Half,
	Elf64_Quarter
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

hi,

according to two ELF standard documents, namely
http://downloads.openwatcom.org/ftp/devel/docs/elf-64-gen.pdf
and
http://ftp.parisc-linux.org/docs/arch/elf-64-hp.pdf

Elf64_Half should be uint16_t and not uint32_t as it is currently 
defined in elfstructs.h

i guess this is, because Elf.._Half is supposed to mean 'half a word' 
(whatever that was at that time) and not 'half of 64 bits' like the name 
could suggest.

in that context i'd suggest replacing occurences of Elf64_Quarter with 
Elf64_Half and removing its definition - but as it is not defined in the 
standard it is more of a cosmetic issue.

please find a patch against xen-unstable below - i hope this is 
acceptable(?). as i'm not subscribed to the list please CC me in 
replies, thanks!

volker


p. s.: i think there is a check for Python.h missing in some configure.in






diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c
index 906e3a2..4d7b8e0 100644
--- a/tools/libxc/xc_dom_elfloader.c
+++ b/tools/libxc/xc_dom_elfloader.c
@@ -237,7 +237,7 @@ static int xc_dom_load_elf_symtab(struct 
xc_dom_image *dom,

          /* Name is NULL. */
          if ( elf_64bit(&syms) )
-            *(Elf64_Half*)(&shdr->e64.sh_name) = 0;
+            *(Elf64_Word*)(&shdr->e64.sh_name) = 0;
          else
              *(Elf32_Word*)(&shdr->e32.sh_name) = 0;
      }
diff --git a/xen/include/xen/elfstructs.h b/xen/include/xen/elfstructs.h
index 62f9399..1c46cd4 100644
--- a/xen/include/xen/elfstructs.h
+++ b/xen/include/xen/elfstructs.h
@@ -44,7 +44,7 @@ typedef uint32_t      Elf64_Word;
  typedef int64_t                Elf64_Sxword;
  typedef uint64_t       Elf64_Xword;

-typedef uint32_t       Elf64_Half;
+typedef uint16_t       Elf64_Half;
  typedef uint16_t       Elf64_Quarter;

  /*
@@ -129,11 +129,11 @@ typedef struct {
         unsigned char   e_ident[EI_NIDENT];     /* Id bytes */
         Elf64_Quarter   e_type;                 /* file type */
         Elf64_Quarter   e_machine;              /* machine type */
-       Elf64_Half      e_version;              /* version number */
+       Elf64_Word      e_version;              /* version number */
         Elf64_Addr      e_entry;                /* entry point */
         Elf64_Off       e_phoff;                /* Program hdr offset */
         Elf64_Off       e_shoff;                /* Section hdr offset */
-       Elf64_Half      e_flags;                /* Processor flags */
+       Elf64_Word      e_flags;                /* Processor flags */
         Elf64_Quarter   e_ehsize;               /* sizeof ehdr */
         Elf64_Quarter   e_phentsize;            /* Program header entry 
size */
         Elf64_Quarter   e_phnum;                /* Number of program 
headers */
@@ -202,14 +202,14 @@ typedef struct {
  } Elf32_Shdr;

  typedef struct {
-       Elf64_Half      sh_name;        /* section name */
-       Elf64_Half      sh_type;        /* section type */
+       Elf64_Word      sh_name;        /* section name */
+       Elf64_Word      sh_type;        /* section type */
         Elf64_Xword     sh_flags;       /* section flags */
         Elf64_Addr      sh_addr;        /* virtual address */
         Elf64_Off       sh_offset;      /* file offset */
         Elf64_Xword     sh_size;        /* section size */
-       Elf64_Half      sh_link;        /* link to another */
-       Elf64_Half      sh_info;        /* misc info */
+       Elf64_Word      sh_link;        /* link to another */
+       Elf64_Word      sh_info;        /* misc info */
         Elf64_Xword     sh_addralign;   /* memory alignment */
         Elf64_Xword     sh_entsize;     /* table entry size */
  } Elf64_Shdr;
@@ -284,7 +284,7 @@ typedef struct elf32_sym {
  } Elf32_Sym;

  typedef struct {
-       Elf64_Half      st_name;        /* Symbol name index in str table */
+       Elf64_Word      st_name;        /* Symbol name index in str table */
         Elf_Byte        st_info;        /* type / binding attrs */
         Elf_Byte        st_other;       /* unused */
         Elf64_Quarter   st_shndx;       /* section index of symbol */
@@ -368,8 +368,8 @@ typedef struct {
  } Elf32_Phdr;

  typedef struct {
-       Elf64_Half      p_type;         /* entry type */
-       Elf64_Half      p_flags;        /* flags */
+       Elf64_Word      p_type;         /* entry type */
+       Elf64_Word      p_flags;        /* flags */
         Elf64_Off       p_offset;       /* offset */
         Elf64_Addr      p_vaddr;        /* virtual address */
         Elf64_Addr      p_paddr;        /* physical address */
@@ -458,9 +458,9 @@ typedef struct {
  } Elf32_Note;

  typedef struct {
-       Elf64_Half namesz;
-       Elf64_Half descsz;
-       Elf64_Half type;
+       Elf64_Word namesz;
+       Elf64_Word descsz;
+       Elf64_Word type;
  } Elf64_Note;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 09:43:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 09:43:09 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQjVt-0003e5-C7; Wed, 16 Nov 2011 09:43:09 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQjUz-0003RA-Al
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 09:42:13 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1321465298!57512684!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30116 invoked from network); 16 Nov 2011 17:41:39 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 17:41:39 -0000
X-IronPort-AV: E=Sophos;i="4.69,522,1315195200"; d="scan'208";a="170851131"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 12:42:08 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX01.citrite.net
	(10.13.107.65) with Microsoft SMTP Server id 8.3.137.0; Wed, 16 Nov 2011
	12:42:07 -0500
Message-ID: <4EC3F5EF.5050908@citrix.com>
Date: Wed, 16 Nov 2011 17:42:07 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Volker Eckert <volker.eckert@citrix.com>
Subject: Re: [Xen-devel] ELF header data types / elfstructs.h, Elf64_Half,
	Elf64_Quarter
References: <4EC3F0C1.9050309@citrix.com>
In-Reply-To: <4EC3F0C1.9050309@citrix.com>
X-Enigmail-Version: 1.1.2
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 16/11/11 17:20, Volker Eckert wrote:
> hi,
>
> according to two ELF standard documents, namely
> http://downloads.openwatcom.org/ftp/devel/docs/elf-64-gen.pdf
> and
> http://ftp.parisc-linux.org/docs/arch/elf-64-hp.pdf
>
> Elf64_Half should be uint16_t and not uint32_t as it is currently 
> defined in elfstructs.h

This agrees with /usr/include/linux/elf.h so it is probably a good idea
to fix.

> i guess this is, because Elf.._Half is supposed to mean 'half a word' 
> (whatever that was at that time) and not 'half of 64 bits' like the name 
> could suggest.
>
> in that context i'd suggest replacing occurences of Elf64_Quarter with 
> Elf64_Half and removing its definition - but as it is not defined in the 
> standard it is more of a cosmetic issue.
>
> please find a patch against xen-unstable below - i hope this is 
> acceptable(?). as i'm not subscribed to the list please CC me in 
> replies, thanks!

Please read http://wiki.xen.org/wiki/SubmittingXenPatches

Specifically, you need to make a declaration of origin.

It is a good idea to attach your patch as a file as quite a few mail
clients mangle whitespace of the email text.  Also, being on the
xen-devel mailing list is a Very Good Idea.

> volker
>
>
> p. s.: i think there is a check for Python.h missing in some configure.in
>
>
>
>
>
>
> diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c
> index 906e3a2..4d7b8e0 100644
> --- a/tools/libxc/xc_dom_elfloader.c
> +++ b/tools/libxc/xc_dom_elfloader.c
> @@ -237,7 +237,7 @@ static int xc_dom_load_elf_symtab(struct 
> xc_dom_image *dom,
>
>           /* Name is NULL. */
>           if ( elf_64bit(&syms) )
> -            *(Elf64_Half*)(&shdr->e64.sh_name) = 0;
> +            *(Elf64_Word*)(&shdr->e64.sh_name) = 0;
>           else
>               *(Elf32_Word*)(&shdr->e32.sh_name) = 0;
>       }
> diff --git a/xen/include/xen/elfstructs.h b/xen/include/xen/elfstructs.h
> index 62f9399..1c46cd4 100644
> --- a/xen/include/xen/elfstructs.h
> +++ b/xen/include/xen/elfstructs.h
> @@ -44,7 +44,7 @@ typedef uint32_t      Elf64_Word;
>   typedef int64_t                Elf64_Sxword;
>   typedef uint64_t       Elf64_Xword;
>
> -typedef uint32_t       Elf64_Half;
> +typedef uint16_t       Elf64_Half;
>   typedef uint16_t       Elf64_Quarter;
>
>   /*
> @@ -129,11 +129,11 @@ typedef struct {
>          unsigned char   e_ident[EI_NIDENT];     /* Id bytes */
>          Elf64_Quarter   e_type;                 /* file type */
>          Elf64_Quarter   e_machine;              /* machine type */
> -       Elf64_Half      e_version;              /* version number */
> +       Elf64_Word      e_version;              /* version number */
>          Elf64_Addr      e_entry;                /* entry point */
>          Elf64_Off       e_phoff;                /* Program hdr offset */
>          Elf64_Off       e_shoff;                /* Section hdr offset */
> -       Elf64_Half      e_flags;                /* Processor flags */
> +       Elf64_Word      e_flags;                /* Processor flags */
>          Elf64_Quarter   e_ehsize;               /* sizeof ehdr */
>          Elf64_Quarter   e_phentsize;            /* Program header entry 
> size */
>          Elf64_Quarter   e_phnum;                /* Number of program 
> headers */
> @@ -202,14 +202,14 @@ typedef struct {
>   } Elf32_Shdr;
>
>   typedef struct {
> -       Elf64_Half      sh_name;        /* section name */
> -       Elf64_Half      sh_type;        /* section type */
> +       Elf64_Word      sh_name;        /* section name */
> +       Elf64_Word      sh_type;        /* section type */
>          Elf64_Xword     sh_flags;       /* section flags */
>          Elf64_Addr      sh_addr;        /* virtual address */
>          Elf64_Off       sh_offset;      /* file offset */
>          Elf64_Xword     sh_size;        /* section size */
> -       Elf64_Half      sh_link;        /* link to another */
> -       Elf64_Half      sh_info;        /* misc info */
> +       Elf64_Word      sh_link;        /* link to another */
> +       Elf64_Word      sh_info;        /* misc info */
>          Elf64_Xword     sh_addralign;   /* memory alignment */
>          Elf64_Xword     sh_entsize;     /* table entry size */
>   } Elf64_Shdr;
> @@ -284,7 +284,7 @@ typedef struct elf32_sym {
>   } Elf32_Sym;
>
>   typedef struct {
> -       Elf64_Half      st_name;        /* Symbol name index in str table */
> +       Elf64_Word      st_name;        /* Symbol name index in str table */
>          Elf_Byte        st_info;        /* type / binding attrs */
>          Elf_Byte        st_other;       /* unused */
>          Elf64_Quarter   st_shndx;       /* section index of symbol */
> @@ -368,8 +368,8 @@ typedef struct {
>   } Elf32_Phdr;
>
>   typedef struct {
> -       Elf64_Half      p_type;         /* entry type */
> -       Elf64_Half      p_flags;        /* flags */
> +       Elf64_Word      p_type;         /* entry type */
> +       Elf64_Word      p_flags;        /* flags */
>          Elf64_Off       p_offset;       /* offset */
>          Elf64_Addr      p_vaddr;        /* virtual address */
>          Elf64_Addr      p_paddr;        /* physical address */
> @@ -458,9 +458,9 @@ typedef struct {
>   } Elf32_Note;
>
>   typedef struct {
> -       Elf64_Half namesz;
> -       Elf64_Half descsz;
> -       Elf64_Half type;
> +       Elf64_Word namesz;
> +       Elf64_Word descsz;
> +       Elf64_Word type;
>   } Elf64_Note;
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 09:45:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 09:45:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQjYI-000435-Bp; Wed, 16 Nov 2011 09:45:38 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQjXL-0003qG-J6
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 09:44:40 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1321465475!1781727!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3912 invoked from network); 16 Nov 2011 17:44:36 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 17:44:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,522,1315195200"; d="scan'208";a="170851517"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 12:44:34 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX01.citrite.net
	(10.13.107.65) with Microsoft SMTP Server id 8.3.137.0; Wed, 16 Nov 2011
	12:44:34 -0500
Message-ID: <4EC3F681.4050304@citrix.com>
Date: Wed, 16 Nov 2011 17:44:33 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Volker Eckert <volker.eckert@citrix.com>
Subject: Re: [Xen-devel] ELF header data types / elfstructs.h, Elf64_Half,
	Elf64_Quarter
References: <4EC3F0C1.9050309@citrix.com> <4EC3F5EF.5050908@citrix.com>
In-Reply-To: <4EC3F5EF.5050908@citrix.com>
X-Enigmail-Version: 1.1.2
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com



On 16/11/11 17:42, Andrew Cooper wrote:
> On 16/11/11 17:20, Volker Eckert wrote:
>> hi,
>>
>> according to two ELF standard documents, namely
>> http://downloads.openwatcom.org/ftp/devel/docs/elf-64-gen.pdf
>> and
>> http://ftp.parisc-linux.org/docs/arch/elf-64-hp.pdf
>>
>> Elf64_Half should be uint16_t and not uint32_t as it is currently 
>> defined in elfstructs.h
> This agrees with /usr/include/linux/elf.h so it is probably a good idea
> to fix.
>
>> i guess this is, because Elf.._Half is supposed to mean 'half a word' 
>> (whatever that was at that time) and not 'half of 64 bits' like the name 
>> could suggest.
>>
>> in that context i'd suggest replacing occurences of Elf64_Quarter with 
>> Elf64_Half and removing its definition - but as it is not defined in the 
>> standard it is more of a cosmetic issue.
>>
>> please find a patch against xen-unstable below - i hope this is 
>> acceptable(?). as i'm not subscribed to the list please CC me in 
>> replies, thanks!
> Please read http://wiki.xen.org/wiki/SubmittingXenPatches
>
> Specifically, you need to make a declaration of origin.
>
> It is a good idea to attach your patch as a file as quite a few mail
> clients mangle whitespace of the email text.  Also, being on the
> xen-devel mailing list is a Very Good Idea.

P.S. Please match the whitespace conventions of the file you are working
in, which you have not done in your submitted patch.

~Andrew

>> volker
>>
>>
>> p. s.: i think there is a check for Python.h missing in some configure.in
>>
>>
>>
>>
>>
>>
>> diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c
>> index 906e3a2..4d7b8e0 100644
>> --- a/tools/libxc/xc_dom_elfloader.c
>> +++ b/tools/libxc/xc_dom_elfloader.c
>> @@ -237,7 +237,7 @@ static int xc_dom_load_elf_symtab(struct 
>> xc_dom_image *dom,
>>
>>           /* Name is NULL. */
>>           if ( elf_64bit(&syms) )
>> -            *(Elf64_Half*)(&shdr->e64.sh_name) = 0;
>> +            *(Elf64_Word*)(&shdr->e64.sh_name) = 0;
>>           else
>>               *(Elf32_Word*)(&shdr->e32.sh_name) = 0;
>>       }
>> diff --git a/xen/include/xen/elfstructs.h b/xen/include/xen/elfstructs.h
>> index 62f9399..1c46cd4 100644
>> --- a/xen/include/xen/elfstructs.h
>> +++ b/xen/include/xen/elfstructs.h
>> @@ -44,7 +44,7 @@ typedef uint32_t      Elf64_Word;
>>   typedef int64_t                Elf64_Sxword;
>>   typedef uint64_t       Elf64_Xword;
>>
>> -typedef uint32_t       Elf64_Half;
>> +typedef uint16_t       Elf64_Half;
>>   typedef uint16_t       Elf64_Quarter;
>>
>>   /*
>> @@ -129,11 +129,11 @@ typedef struct {
>>          unsigned char   e_ident[EI_NIDENT];     /* Id bytes */
>>          Elf64_Quarter   e_type;                 /* file type */
>>          Elf64_Quarter   e_machine;              /* machine type */
>> -       Elf64_Half      e_version;              /* version number */
>> +       Elf64_Word      e_version;              /* version number */
>>          Elf64_Addr      e_entry;                /* entry point */
>>          Elf64_Off       e_phoff;                /* Program hdr offset */
>>          Elf64_Off       e_shoff;                /* Section hdr offset */
>> -       Elf64_Half      e_flags;                /* Processor flags */
>> +       Elf64_Word      e_flags;                /* Processor flags */
>>          Elf64_Quarter   e_ehsize;               /* sizeof ehdr */
>>          Elf64_Quarter   e_phentsize;            /* Program header entry 
>> size */
>>          Elf64_Quarter   e_phnum;                /* Number of program 
>> headers */
>> @@ -202,14 +202,14 @@ typedef struct {
>>   } Elf32_Shdr;
>>
>>   typedef struct {
>> -       Elf64_Half      sh_name;        /* section name */
>> -       Elf64_Half      sh_type;        /* section type */
>> +       Elf64_Word      sh_name;        /* section name */
>> +       Elf64_Word      sh_type;        /* section type */
>>          Elf64_Xword     sh_flags;       /* section flags */
>>          Elf64_Addr      sh_addr;        /* virtual address */
>>          Elf64_Off       sh_offset;      /* file offset */
>>          Elf64_Xword     sh_size;        /* section size */
>> -       Elf64_Half      sh_link;        /* link to another */
>> -       Elf64_Half      sh_info;        /* misc info */
>> +       Elf64_Word      sh_link;        /* link to another */
>> +       Elf64_Word      sh_info;        /* misc info */
>>          Elf64_Xword     sh_addralign;   /* memory alignment */
>>          Elf64_Xword     sh_entsize;     /* table entry size */
>>   } Elf64_Shdr;
>> @@ -284,7 +284,7 @@ typedef struct elf32_sym {
>>   } Elf32_Sym;
>>
>>   typedef struct {
>> -       Elf64_Half      st_name;        /* Symbol name index in str table */
>> +       Elf64_Word      st_name;        /* Symbol name index in str table */
>>          Elf_Byte        st_info;        /* type / binding attrs */
>>          Elf_Byte        st_other;       /* unused */
>>          Elf64_Quarter   st_shndx;       /* section index of symbol */
>> @@ -368,8 +368,8 @@ typedef struct {
>>   } Elf32_Phdr;
>>
>>   typedef struct {
>> -       Elf64_Half      p_type;         /* entry type */
>> -       Elf64_Half      p_flags;        /* flags */
>> +       Elf64_Word      p_type;         /* entry type */
>> +       Elf64_Word      p_flags;        /* flags */
>>          Elf64_Off       p_offset;       /* offset */
>>          Elf64_Addr      p_vaddr;        /* virtual address */
>>          Elf64_Addr      p_paddr;        /* physical address */
>> @@ -458,9 +458,9 @@ typedef struct {
>>   } Elf32_Note;
>>
>>   typedef struct {
>> -       Elf64_Half namesz;
>> -       Elf64_Half descsz;
>> -       Elf64_Half type;
>> +       Elf64_Word namesz;
>> +       Elf64_Word descsz;
>> +       Elf64_Word type;
>>   } Elf64_Note;
>>
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com
>> http://lists.xensource.com/xen-devel

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 10:17:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 10:17:47 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQk3O-0005ew-D4; Wed, 16 Nov 2011 10:17:46 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQk2M-0005SE-AX
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 10:16:42 -0800
X-Env-Sender: volker.eckert@citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1321467371!53037051!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10128 invoked from network); 16 Nov 2011 18:16:11 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 18:16:11 -0000
X-IronPort-AV: E=Sophos;i="4.69,522,1315180800"; 
   d="scan'208";a="8970772"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 18:16:38 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 16 Nov 2011 18:16:37 +0000
Received: from dhcp-70.cam.xci-test.com ([10.80.251.70])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<volker.eckert@citrix.com>)	id 1RQk2H-0007fo-MX	for
	xen-devel@lists.xensource.com; Wed, 16 Nov 2011 18:16:37 +0000
Message-ID: <4EC3FD0A.4010105@citrix.com>
Date: Wed, 16 Nov 2011 18:12:26 +0000
From: Volker Eckert <volker.eckert@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.1.16) Gecko/20111004 Icedove/3.0.11
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: Re: [Xen-devel] ELF header data types / elfstructs.h, Elf64_Half,
	Elf64_Quarter
References: <4EC3F0C1.9050309@citrix.com> <4EC3F5EF.5050908@citrix.com>
	<4EC3F681.4050304@citrix.com>
In-Reply-To: <4EC3F681.4050304@citrix.com>
Content-Type: multipart/mixed; boundary="------------070006070302080703070103"
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------070006070302080703070103
Content-Type: text/plain; charset="ISO-8859-1"; format=flowed
Content-Transfer-Encoding: 7bit

Andrew, thank you for the prompt reply.

>> Please read http://wiki.xen.org/wiki/SubmittingXenPatches
>>
>> Specifically, you need to make a declaration of origin.

please find the patch attached in a separate file, with a declaration of 
origin. i don't have hg installed, so it is still created using git. the 
wiki page doesn't say anything about hg being the exclusive way for 
patch submissions so i hope that is acceptable.


>> It is a good idea to attach your patch as a file as quite a few mail
>> clients mangle whitespace of the email text.

done, sorry about that.


> P.S. Please match the whitespace conventions of the file you are working
> in, which you have not done in your submitted patch.

i guess they got mangled by the mailer(?)

as i only replaced parts of words i didn't change any whitespace - it 
was and still is 4 spaces per indentation inside xc_dom_elfloader.c and 
tabs for the rest of the files, which i just checked. unless i am 
missing something...

--------------070006070302080703070103
Content-Type: text/x-patch; name="elf64_half.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="elf64_half.patch"

Elf64_Half is a uint16_t according to the ELF standard

Signed-off-by: Volker Eckert <volker.eckert@citrix.com>

diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c
index 906e3a2..4d7b8e0 100644
--- a/tools/libxc/xc_dom_elfloader.c
+++ b/tools/libxc/xc_dom_elfloader.c
@@ -237,7 +237,7 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom,
 
         /* Name is NULL. */
         if ( elf_64bit(&syms) )
-            *(Elf64_Half*)(&shdr->e64.sh_name) = 0;
+            *(Elf64_Word*)(&shdr->e64.sh_name) = 0;
         else
             *(Elf32_Word*)(&shdr->e32.sh_name) = 0;
     }
diff --git a/xen/include/xen/elfstructs.h b/xen/include/xen/elfstructs.h
index 62f9399..1c46cd4 100644
--- a/xen/include/xen/elfstructs.h
+++ b/xen/include/xen/elfstructs.h
@@ -44,7 +44,7 @@ typedef uint32_t	Elf64_Word;
 typedef int64_t		Elf64_Sxword;
 typedef uint64_t	Elf64_Xword;
 
-typedef uint32_t	Elf64_Half;
+typedef uint16_t	Elf64_Half;
 typedef uint16_t	Elf64_Quarter;
 
 /*
@@ -129,11 +129,11 @@ typedef struct {
 	unsigned char	e_ident[EI_NIDENT];	/* Id bytes */
 	Elf64_Quarter	e_type;			/* file type */
 	Elf64_Quarter	e_machine;		/* machine type */
-	Elf64_Half	e_version;		/* version number */
+	Elf64_Word	e_version;		/* version number */
 	Elf64_Addr	e_entry;		/* entry point */
 	Elf64_Off	e_phoff;		/* Program hdr offset */
 	Elf64_Off	e_shoff;		/* Section hdr offset */
-	Elf64_Half	e_flags;		/* Processor flags */
+	Elf64_Word	e_flags;		/* Processor flags */
 	Elf64_Quarter	e_ehsize;		/* sizeof ehdr */
 	Elf64_Quarter	e_phentsize;		/* Program header entry size */
 	Elf64_Quarter	e_phnum;		/* Number of program headers */
@@ -202,14 +202,14 @@ typedef struct {
 } Elf32_Shdr;
 
 typedef struct {
-	Elf64_Half	sh_name;	/* section name */
-	Elf64_Half	sh_type;	/* section type */
+	Elf64_Word	sh_name;	/* section name */
+	Elf64_Word	sh_type;	/* section type */
 	Elf64_Xword	sh_flags;	/* section flags */
 	Elf64_Addr	sh_addr;	/* virtual address */
 	Elf64_Off	sh_offset;	/* file offset */
 	Elf64_Xword	sh_size;	/* section size */
-	Elf64_Half	sh_link;	/* link to another */
-	Elf64_Half	sh_info;	/* misc info */
+	Elf64_Word	sh_link;	/* link to another */
+	Elf64_Word	sh_info;	/* misc info */
 	Elf64_Xword	sh_addralign;	/* memory alignment */
 	Elf64_Xword	sh_entsize;	/* table entry size */
 } Elf64_Shdr;
@@ -284,7 +284,7 @@ typedef struct elf32_sym {
 } Elf32_Sym;
 
 typedef struct {
-	Elf64_Half	st_name;	/* Symbol name index in str table */
+	Elf64_Word	st_name;	/* Symbol name index in str table */
 	Elf_Byte	st_info;	/* type / binding attrs */
 	Elf_Byte	st_other;	/* unused */
 	Elf64_Quarter	st_shndx;	/* section index of symbol */
@@ -368,8 +368,8 @@ typedef struct {
 } Elf32_Phdr;
 
 typedef struct {
-	Elf64_Half	p_type;		/* entry type */
-	Elf64_Half	p_flags;	/* flags */
+	Elf64_Word	p_type;		/* entry type */
+	Elf64_Word	p_flags;	/* flags */
 	Elf64_Off	p_offset;	/* offset */
 	Elf64_Addr	p_vaddr;	/* virtual address */
 	Elf64_Addr	p_paddr;	/* physical address */
@@ -458,9 +458,9 @@ typedef struct {
 } Elf32_Note;
 
 typedef struct {
-	Elf64_Half namesz;
-	Elf64_Half descsz;
-	Elf64_Half type;
+	Elf64_Word namesz;
+	Elf64_Word descsz;
+	Elf64_Word type;
 } Elf64_Note;
 
 

--------------070006070302080703070103
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------070006070302080703070103--


From xen-devel-bounces@lists.xensource.com Wed Nov 16 10:23:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 10:23:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQk93-0006mk-3y; Wed, 16 Nov 2011 10:23:37 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQk8R-0006a1-Nf
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 10:23:00 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1321467749!48756750!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9852 invoked from network); 16 Nov 2011 18:22:29 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 18:22:29 -0000
Received: by wyg24 with SMTP id 24so1090099wyg.30
	for <xen-devel@lists.xensource.com>;
	Wed, 16 Nov 2011 10:22:56 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=0+rbIRi6AJrBlw3+U9dtJrqt6NyNM8hjdDORMlsvypQ=;
	b=G9Tu3Aud10oBZp6EVhnbvgHL5MbtK5JuIy9VUbpZYSlL0FnhpjIuUJyyZ4qbKs5Qb7
	E2dwBlBJTfm18fhCcc7oEYERQSf/KW1EaBU+iuVTMpnMOxCvXS5iQ/fHCNKGaLK0xfrc
	iodDArv13C2Mf7TkWBE1hx10Xd45dsbmE+HR4=
Received: by 10.180.89.5 with SMTP id bk5mr37383570wib.60.1321467776588;
	Wed, 16 Nov 2011 10:22:56 -0800 (PST)
Received: from [192.168.1.3] (host86-129-245-239.range86-129.btcentralplus.com.
	[86.129.245.239])
	by mx.google.com with ESMTPS id j5sm16850107wix.20.2011.11.16.10.22.55
	(version=SSLv3 cipher=OTHER); Wed, 16 Nov 2011 10:22:56 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Wed, 16 Nov 2011 18:22:53 +0000
Subject: Re: [Xen-devel] ELF header data types / elfstructs.h, Elf64_Half,
	Elf64_Quarter
From: Keir Fraser <keir@xen.org>
To: Volker Eckert <volker.eckert@citrix.com>, <xen-devel@lists.xensource.com>
Message-ID: <CAE9AFFD.3435B%keir@xen.org>
Thread-Topic: [Xen-devel] ELF header data types / elfstructs.h, Elf64_Half,
	Elf64_Quarter
Thread-Index: AcykjMEpMuMCj92T6Eeb8tSieXy5Dg==
In-Reply-To: <4EC3F0C1.9050309@citrix.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 16/11/2011 17:20, "Volker Eckert" <volker.eckert@citrix.com> wrote:

> hi,
> 
> according to two ELF standard documents, namely
> http://downloads.openwatcom.org/ftp/devel/docs/elf-64-gen.pdf
> and
> http://ftp.parisc-linux.org/docs/arch/elf-64-hp.pdf
> 
> Elf64_Half should be uint16_t and not uint32_t as it is currently
> defined in elfstructs.h
> 
> i guess this is, because Elf.._Half is supposed to mean 'half a word'
> (whatever that was at that time) and not 'half of 64 bits' like the name
> could suggest.
> 
> in that context i'd suggest replacing occurences of Elf64_Quarter with
> Elf64_Half and removing its definition - but as it is not defined in the
> standard it is more of a cosmetic issue.
> 
> please find a patch against xen-unstable below - i hope this is
> acceptable(?). as i'm not subscribed to the list please CC me in
> replies, thanks!

Yes, but in fact it could go further because Elf64_Quarter is not needed,
nor defined in the spec.

I have gone through the spec and done the further fixups.

The complete patch is now in xen-unstable as c/s 24154.

 Thanks!
 Keir

> volker
> 
> 
> p. s.: i think there is a check for Python.h missing in some configure.in
> 
> 
> 
> 
> 
> 
> diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c
> index 906e3a2..4d7b8e0 100644
> --- a/tools/libxc/xc_dom_elfloader.c
> +++ b/tools/libxc/xc_dom_elfloader.c
> @@ -237,7 +237,7 @@ static int xc_dom_load_elf_symtab(struct
> xc_dom_image *dom,
> 
>           /* Name is NULL. */
>           if ( elf_64bit(&syms) )
> -            *(Elf64_Half*)(&shdr->e64.sh_name) = 0;
> +            *(Elf64_Word*)(&shdr->e64.sh_name) = 0;
>           else
>               *(Elf32_Word*)(&shdr->e32.sh_name) = 0;
>       }
> diff --git a/xen/include/xen/elfstructs.h b/xen/include/xen/elfstructs.h
> index 62f9399..1c46cd4 100644
> --- a/xen/include/xen/elfstructs.h
> +++ b/xen/include/xen/elfstructs.h
> @@ -44,7 +44,7 @@ typedef uint32_t      Elf64_Word;
>   typedef int64_t                Elf64_Sxword;
>   typedef uint64_t       Elf64_Xword;
> 
> -typedef uint32_t       Elf64_Half;
> +typedef uint16_t       Elf64_Half;
>   typedef uint16_t       Elf64_Quarter;
> 
>   /*
> @@ -129,11 +129,11 @@ typedef struct {
>          unsigned char   e_ident[EI_NIDENT];     /* Id bytes */
>          Elf64_Quarter   e_type;                 /* file type */
>          Elf64_Quarter   e_machine;              /* machine type */
> -       Elf64_Half      e_version;              /* version number */
> +       Elf64_Word      e_version;              /* version number */
>          Elf64_Addr      e_entry;                /* entry point */
>          Elf64_Off       e_phoff;                /* Program hdr offset */
>          Elf64_Off       e_shoff;                /* Section hdr offset */
> -       Elf64_Half      e_flags;                /* Processor flags */
> +       Elf64_Word      e_flags;                /* Processor flags */
>          Elf64_Quarter   e_ehsize;               /* sizeof ehdr */
>          Elf64_Quarter   e_phentsize;            /* Program header entry
> size */
>          Elf64_Quarter   e_phnum;                /* Number of program
> headers */
> @@ -202,14 +202,14 @@ typedef struct {
>   } Elf32_Shdr;
> 
>   typedef struct {
> -       Elf64_Half      sh_name;        /* section name */
> -       Elf64_Half      sh_type;        /* section type */
> +       Elf64_Word      sh_name;        /* section name */
> +       Elf64_Word      sh_type;        /* section type */
>          Elf64_Xword     sh_flags;       /* section flags */
>          Elf64_Addr      sh_addr;        /* virtual address */
>          Elf64_Off       sh_offset;      /* file offset */
>          Elf64_Xword     sh_size;        /* section size */
> -       Elf64_Half      sh_link;        /* link to another */
> -       Elf64_Half      sh_info;        /* misc info */
> +       Elf64_Word      sh_link;        /* link to another */
> +       Elf64_Word      sh_info;        /* misc info */
>          Elf64_Xword     sh_addralign;   /* memory alignment */
>          Elf64_Xword     sh_entsize;     /* table entry size */
>   } Elf64_Shdr;
> @@ -284,7 +284,7 @@ typedef struct elf32_sym {
>   } Elf32_Sym;
> 
>   typedef struct {
> -       Elf64_Half      st_name;        /* Symbol name index in str table */
> +       Elf64_Word      st_name;        /* Symbol name index in str table */
>          Elf_Byte        st_info;        /* type / binding attrs */
>          Elf_Byte        st_other;       /* unused */
>          Elf64_Quarter   st_shndx;       /* section index of symbol */
> @@ -368,8 +368,8 @@ typedef struct {
>   } Elf32_Phdr;
> 
>   typedef struct {
> -       Elf64_Half      p_type;         /* entry type */
> -       Elf64_Half      p_flags;        /* flags */
> +       Elf64_Word      p_type;         /* entry type */
> +       Elf64_Word      p_flags;        /* flags */
>          Elf64_Off       p_offset;       /* offset */
>          Elf64_Addr      p_vaddr;        /* virtual address */
>          Elf64_Addr      p_paddr;        /* physical address */
> @@ -458,9 +458,9 @@ typedef struct {
>   } Elf32_Note;
> 
>   typedef struct {
> -       Elf64_Half namesz;
> -       Elf64_Half descsz;
> -       Elf64_Half type;
> +       Elf64_Word namesz;
> +       Elf64_Word descsz;
> +       Elf64_Word type;
>   } Elf64_Note;
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 10:26:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 10:26:53 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQkCC-0007Bx-T8; Wed, 16 Nov 2011 10:26:52 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQkBo-00070N-OD
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 10:26:29 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1321467958!53038260!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27076 invoked from network); 16 Nov 2011 18:25:58 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 18:25:58 -0000
Received: by wwp14 with SMTP id 14so1091584wwp.24
	for <xen-devel@lists.xensource.com>;
	Wed, 16 Nov 2011 10:26:25 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=RSzgU0V4xU34pV4q/9+tJkk6oTuBkm3yovyteQF3wRs=;
	b=ch7bOuwk0bWV9pNf6EPFQEWUGmAcydYmNkk097JWPGk9otczpItLlxFHMsGbRFAIzt
	uZINguVQho1S9goIZ9F29tF0iEhahchTbtLlfNZ25aWqMVnkX1pmam5yPkGwz/oFFuL/
	60dZwqxiDhCj1wspqzsS9bdl4Qqa9xoqNkNdk=
Received: by 10.181.12.39 with SMTP id en7mr36658190wid.40.1321467985526;
	Wed, 16 Nov 2011 10:26:25 -0800 (PST)
Received: from [192.168.1.3] (host86-129-245-239.range86-129.btcentralplus.com.
	[86.129.245.239])
	by mx.google.com with ESMTPS id dy1sm16856949wib.18.2011.11.16.10.26.22
	(version=SSLv3 cipher=OTHER); Wed, 16 Nov 2011 10:26:24 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Wed, 16 Nov 2011 18:26:17 +0000
Subject: Re: [Xen-devel] ELF header data types / elfstructs.h, Elf64_Half,
	Elf64_Quarter
From: Keir Fraser <keir@xen.org>
To: Volker Eckert <volker.eckert@citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CAE9B0C9.34361%keir@xen.org>
Thread-Topic: [Xen-devel] ELF header data types / elfstructs.h, Elf64_Half,
	Elf64_Quarter
Thread-Index: AcykjTrB58kJLn0ZGki94U/hBO/ZSQ==
In-Reply-To: <4EC3FD0A.4010105@citrix.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 16/11/2011 18:12, "Volker Eckert" <volker.eckert@citrix.com> wrote:

> Andrew, thank you for the prompt reply.
> 
>>> Please read http://wiki.xen.org/wiki/SubmittingXenPatches
>>> 
>>> Specifically, you need to make a declaration of origin.
> 
> please find the patch attached in a separate file, with a declaration of
> origin. i don't have hg installed, so it is still created using git. the
> wiki page doesn't say anything about hg being the exclusive way for
> patch submissions so i hope that is acceptable.
> 
> 
>>> It is a good idea to attach your patch as a file as quite a few mail
>>> clients mangle whitespace of the email text.
> 
> done, sorry about that.
> 
> 
>> P.S. Please match the whitespace conventions of the file you are working
>> in, which you have not done in your submitted patch.
> 
> i guess they got mangled by the mailer(?)

Yes.

 -- Keir

> as i only replaced parts of words i didn't change any whitespace - it
> was and still is 4 spaces per indentation inside xc_dom_elfloader.c and
> tabs for the rest of the files, which i just checked. unless i am
> missing something...
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 10:42:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 10:42:08 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQkQy-0007pk-6C; Wed, 16 Nov 2011 10:42:08 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQkQ7-0007cV-0B
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 10:41:15 -0800
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-16.tower-174.messagelabs.com!1321468871!1857443!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2888 invoked from network); 16 Nov 2011 18:41:11 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-16.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 16 Nov 2011 18:41:11 -0000
X-Originating-Ip: [194.89.68.22]
Received: from ydin.reaktio.net (reaktio.net [194.89.68.22])
	by smtp.tele.fi (Postfix) with ESMTP id A2A872C7A;
	Wed, 16 Nov 2011 20:41:08 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 448EA20058; Wed, 16 Nov 2011 20:41:08 +0200 (EET)
Date: Wed, 16 Nov 2011 20:41:08 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Boris Derzhavets <bderzhavets@yahoo.com>
Subject: Re: [Xen-devel] [PATCH 0 of 6] pygrub fixes to support a Fedora 16
	guest
Message-ID: <20111116184108.GM12984@reaktio.net>
References: <alpine.DEB.2.00.1110192358140.15667@vega-a.dur.ac.uk>
	<1319293366.98429.YahooMailClassic@web65903.mail.ac4.yahoo.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319293366.98429.YahooMailClassic@web65903.mail.ac4.yahoo.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: xen-devel@lists.xensource.com, Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Ian Campbell <Ian.Campbell@citrix.com>, M A Young <m.a.young@durham.ac.uk>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Sat, Oct 22, 2011 at 07:22:46AM -0700, Boris Derzhavets wrote:
>    Please, back port  to xen-4.1-testing.hg.
> 

Yep, this pygrub patch series is already in xen-unstable.hg,
and it should be backported to xen-4.1-testing.hg aswell,
so upcoming Xen 4.1.3 will support F16 PV domUs.

(It's already included in Michael's Fedora 16 xen rpms,
and works well there.)

-- Pasi


> 
>    --- On Wed, 10/19/11, M A Young <m.a.young@durham.ac.uk> wrote:
> 
>      From: M A Young <m.a.young@durham.ac.uk>
>      Subject: [Xen-devel] [PATCH 0 of 6] pygrub fixes to support a Fedora 16
>      guest
>      To: xen-devel@lists.xensource.com
>      Cc: "Ian Campbell" <Ian.Campbell@citrix.com>
>      Date: Wednesday, October 19, 2011, 7:02 PM
> 
>      This series contains patches that may be needed to allow pygrub to boot
>      a Fedora 16 guest.
> 
>      By default, Fedora 16 has GPT partitions and uses grub2. The first GPT
>      partition is a grub2 boot partition to store the grub2 code. The second
>      GPT partition contains the /boot filesystem with the kernel and
>      initramfs files and grub2 configuration files. The remaining space is an
>      LVM partition containing the remaining file systems.
> 
>      The first patch allows pygrub to check all the GPT partitions, rather
>      than just the first. This is a repost of the patch I submitted a few
>      days ago with a slightly edited introductory text.
> 
>      The second patch allows pygrub to find the grub2 configuration file
>      which are in the /boot/grub2 directory on Fedora 16.
> 
>      The third patch allows pygrub to handle partition references such as
>      (hd0,gpt2) which occur in the Fedora 16 grub2 configuration file.
> 
>      The fourth patch allows pygrub to parse grub2 configuration files with
>      sub menus by ignoring the submenu line and the corresponding } line. A
>      default Fedora 16 grub2 configuration file doesn't have sub menus but
>      they do occur if the xen hypervisor is installed on the guest.
> 
>      The fifth patch allows pygrub to parse grub2 configurations with the
>      line
>      set default="${saved_entry}"
>      which can occur in the Fedora 16 grub2 configuration file.
> 
>      The final patch adds a sample Fedora 16 grub2 configuration file
>      containing the problems fixed by patches 3,4 and 5.
> 
>          Michael Young
> 
>      _______________________________________________
>      Xen-devel mailing list
>      [1]Xen-devel@lists.xensource.com
>      [2]http://lists.xensource.com/xen-devel
> 
> References
> 
>    Visible links
>    1. file:///mc/compose?to=Xen-devel@lists.xensource.com
>    2. http://lists.xensource.com/xen-devel

> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 10:54:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 10:54:17 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQkcj-0001IH-2c; Wed, 16 Nov 2011 10:54:17 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQkaQ-0000Un-GH
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 10:51:54 -0800
X-Env-Sender: andrew.pounce@citrix.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1321469511!4521125!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4220 invoked from network); 16 Nov 2011 18:51:51 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 18:51:51 -0000
X-IronPort-AV: E=Sophos;i="4.69,522,1315180800"; 
   d="scan'208";a="8971234"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 18:51:51 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 16 Nov 2011 18:51:51 +0000
Received: from dust.cam.xci-test.com ([10.80.248.95] helo=dust)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<andrew.pounce@citrix.com>)	id 1RQkaM-0007rm-MQ	for
	xen-devel@lists.xensource.com; Wed, 16 Nov 2011 18:51:50 +0000
Received: from andrewpou by dust with local (Exim 4.76)	(envelope-from
	<andrew.pounce@citrix.com>)	id 1RQkaM-0005AM-Hi	for
	xen-devel@lists.xensource.com; Wed, 16 Nov 2011 18:51:50 +0000
Date: Wed, 16 Nov 2011 18:51:50 +0000
From: Andrew Pounce <andrew.pounce@citrix.com>
To: xen-devel@lists.xensource.com
Message-ID: <20111116185150.GB19282@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
User-Agent: Mutt/1.5.21 (2010-09-15)
Subject: [Xen-devel] xen.org list server move.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

The xen.org list server is moving home on Thursday 17th November 2011.

This will be happening during the UK daytime and will hopefully be reasonably seamless.  You may find that mailing list options or membership changes may not change as expected during this period.

Any outages will be kept to a minimum - please bear with us while this is taking place.

Thanks

 Andrew



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 11:26:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 11:26:28 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQl7r-0002JL-2O; Wed, 16 Nov 2011 11:26:27 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQl6s-00025x-K1
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 11:25:27 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1321471523!4469813!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18775 invoked from network); 16 Nov 2011 19:25:23 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 19:25:23 -0000
X-IronPort-AV: E=Sophos;i="4.69,522,1315180800"; 
   d="scan'208";a="8971534"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 19:25:22 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 16 Nov 2011 19:25:22 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RQl6o-00083t-FT;
	Wed, 16 Nov 2011 19:25:22 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RQl6d-0008Eh-7y;
	Wed, 16 Nov 2011 19:25:11 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Wed, 16 Nov 2011 19:25:02 +0000
Message-ID: <1321471508-31633-1-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 0/6] IOMMU, vtd and iotlb flush rework (v8)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


In one of my previous email I detailed a bug I was seeing when passing
through a Intel GPU on a guest that has more that 4G or RAM.

Allen suggested that I go for the Plan B but after a discussion with Tim
we agreed that Plan B was way to disruptive in term of code change.

This patch series implements Plan A.

http://xen.1045712.n5.nabble.com/VTD-Intel-iommu-IOTLB-flush-really-slow-td4952866.html

Changes between v7 and v8:
        - Rebase on new add_to_physmap from Andres Lagar-Cavilla
        - Only do copy_to_guest on the new XENMAPSPACE (XENMAPSPACE_gmfn_range).
        - Convert the xatp argument to a pointer in xenmem_add_to_physmap.
        - Modify xenmem_add_to_physmap so it doesn't touchs the input (xatp is const now).

Changes between v6 and v7:
       - xenmem_add_to_physmap_once can't take a pointer on xatp because
         it modifies .idx and .gpfn.
       - Cancel hypercall continuation in the compat layer if the copy_to_guest
         failed.

Changes between v5 and v6:
      - Rework the patch queue to make it more readable.
      - Modify xatp in place in xenmem_add_to_physmap
      - Only check for preemption if we are not at the last iteration
      - Copy xatp guest handler back to the guest only in case of continuation
      - Add continuation only when dealing with the new xenmem space
        (XENMAPSPACE_gmfn_range).

Changes between v4 and v5:
      - Fix hypercall continuation for add_to_physmap in compat mode.

Changes between v3 and v4:
      - Move the loop for gmfn_range from arch_memory_op to xenmem_add_to_physmap.
      - Add a comment to comment to explain the purpose of iommu_dont_flush_iotlb.

Changes between v2 and v3:
      - Check for the presence iotlb_flush_all callback before calling it.

Changes between v1 and v2:
      - Move size in struct xen_add_to_physmap in padding between .domid and .space.
      - Store iommu_dont_flush per cpu
      - Change the code in hvmloader to relocate by batch of 64K, .size is now 16 bits.

Jean Guyader (6):
  vtd: Refactor iotlb flush code
  iommu: Introduce iommu_flush and iommu_flush_all.
  add_to_physmap: Move the code for XENMEM_add_to_physmap
  mm: New XENMEM space, XENMAPSPACE_gmfn_range
  hvmloader: Change memory relocation loop when overlap with PCI hole
  Introduce per cpu flag (iommu_dont_flush_iotlb) to avoid unnecessary
    iotlb flush

 tools/firmware/hvmloader/pci.c      |   20 +++-
 xen/arch/x86/mm.c                   |  212 +++++++++++++++++++++++------------
 xen/arch/x86/x86_64/compat/mm.c     |   18 +++
 xen/drivers/passthrough/iommu.c     |   25 ++++
 xen/drivers/passthrough/vtd/iommu.c |  100 ++++++++++-------
 xen/include/public/memory.h         |    4 +
 xen/include/xen/iommu.h             |   17 +++
 7 files changed, 277 insertions(+), 119 deletions(-)


--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Wed Nov 16 11:27:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 11:27:39 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQl91-0002gl-Bv; Wed, 16 Nov 2011 11:27:39 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQl6t-00025z-0P
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 11:25:28 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1321471523!4469813!2
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18779 invoked from network); 16 Nov 2011 19:25:23 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 19:25:23 -0000
X-IronPort-AV: E=Sophos;i="4.69,522,1315180800"; 
   d="scan'208";a="8971535"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 19:25:23 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 16 Nov 2011 19:25:22 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RQl6o-00083w-Kk;
	Wed, 16 Nov 2011 19:25:22 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RQl6d-0008Ej-CH;
	Wed, 16 Nov 2011 19:25:11 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Wed, 16 Nov 2011 19:25:03 +0000
Message-ID: <1321471508-31633-2-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1321471508-31633-1-git-send-email-jean.guyader@eu.citrix.com>
References: <1321471508-31633-1-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 1/6] vtd: Refactor iotlb flush code
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Factorize the iotlb flush code from map_page and unmap_page into
it's own function.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/drivers/passthrough/vtd/iommu.c |   86 +++++++++++++++++-----------------
 1 files changed, 43 insertions(+), 43 deletions(-)


--------------true
Content-Type: text/x-patch; name="0001-vtd-Refactor-iotlb-flush-code.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0001-vtd-Refactor-iotlb-flush-code.patch"

diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index d125b93..97c7ffa 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -579,16 +579,53 @@ static void iommu_flush_all(void)
     }
 }
 
+static void __intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn,
+        int dma_old_pte_present, unsigned int page_count)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+    struct acpi_drhd_unit *drhd;
+    struct iommu *iommu;
+    int flush_dev_iotlb;
+    int iommu_domid;
+
+    /*
+     * No need pcideves_lock here because we have flush
+     * when assign/deassign device
+     */
+    for_each_drhd_unit ( drhd )
+    {
+        iommu = drhd->iommu;
+
+        if ( !test_bit(iommu->index, &hd->iommu_bitmap) )
+            continue;
+
+        flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
+        iommu_domid= domain_iommu_domid(d, iommu);
+        if ( iommu_domid == -1 )
+            continue;
+
+        if ( page_count > 1 || gfn == -1 )
+        {
+            if ( iommu_flush_iotlb_dsi(iommu, iommu_domid,
+                        0, flush_dev_iotlb) )
+                iommu_flush_write_buffer(iommu);
+        }
+        else
+        {
+            if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
+                        (paddr_t)gfn << PAGE_SHIFT_4K, 0,
+                        !dma_old_pte_present, flush_dev_iotlb) )
+                iommu_flush_write_buffer(iommu);
+        }
+    }
+}
+
 /* clear one page's page table */
 static void dma_pte_clear_one(struct domain *domain, u64 addr)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(domain);
-    struct acpi_drhd_unit *drhd;
-    struct iommu *iommu;
     struct dma_pte *page = NULL, *pte = NULL;
     u64 pg_maddr;
-    int flush_dev_iotlb;
-    int iommu_domid;
     struct mapped_rmrr *mrmrr;
 
     spin_lock(&hd->mapping_lock);
@@ -614,21 +651,7 @@ static void dma_pte_clear_one(struct domain *domain, u64 addr)
     spin_unlock(&hd->mapping_lock);
     iommu_flush_cache_entry(pte, sizeof(struct dma_pte));
 
-    /* No need pcidevs_lock here since do that on assign/deassign device*/
-    for_each_drhd_unit ( drhd )
-    {
-        iommu = drhd->iommu;
-        if ( test_bit(iommu->index, &hd->iommu_bitmap) )
-        {
-            flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
-            iommu_domid= domain_iommu_domid(domain, iommu);
-            if ( iommu_domid == -1 )
-                continue;
-            if ( iommu_flush_iotlb_psi(iommu, iommu_domid, addr,
-                                       0, 0, flush_dev_iotlb) )
-                iommu_flush_write_buffer(iommu);
-        }
-    }
+    __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
 
     unmap_vtd_domain_page(page);
 
@@ -1678,12 +1701,8 @@ static int intel_iommu_map_page(
     unsigned int flags)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(d);
-    struct acpi_drhd_unit *drhd;
-    struct iommu *iommu;
     struct dma_pte *page = NULL, *pte = NULL, old, new = { 0 };
     u64 pg_maddr;
-    int flush_dev_iotlb;
-    int iommu_domid;
 
     /* Do nothing if VT-d shares EPT page table */
     if ( iommu_use_hap_pt(d) )
@@ -1725,26 +1744,7 @@ static int intel_iommu_map_page(
     spin_unlock(&hd->mapping_lock);
     unmap_vtd_domain_page(page);
 
-    /*
-     * No need pcideves_lock here because we have flush
-     * when assign/deassign device
-     */
-    for_each_drhd_unit ( drhd )
-    {
-        iommu = drhd->iommu;
-
-        if ( !test_bit(iommu->index, &hd->iommu_bitmap) )
-            continue;
-
-        flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
-        iommu_domid= domain_iommu_domid(d, iommu);
-        if ( iommu_domid == -1 )
-            continue;
-        if ( iommu_flush_iotlb_psi(iommu, iommu_domid,
-                                   (paddr_t)gfn << PAGE_SHIFT_4K, 0,
-                                   !dma_pte_present(old), flush_dev_iotlb) )
-            iommu_flush_write_buffer(iommu);
-    }
+    __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
 
     return 0;
 }

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Wed Nov 16 11:28:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 11:28:32 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQl9s-000347-At; Wed, 16 Nov 2011 11:28:32 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQl6t-000260-0l
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 11:25:29 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1321471523!4469813!3
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18785 invoked from network); 16 Nov 2011 19:25:23 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 19:25:23 -0000
X-IronPort-AV: E=Sophos;i="4.69,522,1315180800"; 
   d="scan'208";a="8971536"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 19:25:23 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 16 Nov 2011 19:25:23 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RQl6o-00083z-PA;
	Wed, 16 Nov 2011 19:25:22 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RQl6d-0008Em-IA;
	Wed, 16 Nov 2011 19:25:11 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Wed, 16 Nov 2011 19:25:04 +0000
Message-ID: <1321471508-31633-3-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1321471508-31633-2-git-send-email-jean.guyader@eu.citrix.com>
References: <1321471508-31633-1-git-send-email-jean.guyader@eu.citrix.com>
	<1321471508-31633-2-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 2/6] iommu: Introduce iommu_flush and
	iommu_flush_all.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/drivers/passthrough/iommu.c     |   20 ++++++++++++++++++++
 xen/drivers/passthrough/vtd/iommu.c |   12 ++++++++++++
 xen/include/xen/iommu.h             |    5 +++++
 3 files changed, 37 insertions(+), 0 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0002-iommu-Introduce-iommu_flush-and-iommu_flush_all.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0002-iommu-Introduce-iommu_flush-and-iommu_flush_all.patch"

diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index cd6174d..ca7b37b 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -301,6 +301,26 @@ int iommu_unmap_page(struct domain *d, unsigned long gfn)
     return hd->platform_ops->unmap_page(d, gfn);
 }
 
+void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+    if ( !iommu_enabled || !hd->platform_ops || !hd->platform_ops->iotlb_flush )
+        return;
+
+    hd->platform_ops->iotlb_flush(d, gfn, page_count);
+}
+
+void iommu_iotlb_flush_all(struct domain *d)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+    if ( !iommu_enabled || !hd->platform_ops || !hd->platform_ops->iotlb_flush_all )
+        return;
+
+    hd->platform_ops->iotlb_flush_all(d);
+}
+
 /* caller should hold the pcidevs_lock */
 int deassign_device(struct domain *d, u16 seg, u8 bus, u8 devfn)
 {
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 97c7ffa..f5d48ec 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -620,6 +620,16 @@ static void __intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn,
     }
 }
 
+static void intel_iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count)
+{
+    __intel_iommu_iotlb_flush(d, gfn, 1, page_count);
+}
+
+static void intel_iommu_iotlb_flush_all(struct domain *d)
+{
+    __intel_iommu_iotlb_flush(d, 0, 0, 0);
+}
+
 /* clear one page's page table */
 static void dma_pte_clear_one(struct domain *domain, u64 addr)
 {
@@ -2331,6 +2341,8 @@ const struct iommu_ops intel_iommu_ops = {
     .resume = vtd_resume,
     .share_p2m = iommu_set_pgd,
     .crash_shutdown = vtd_crash_shutdown,
+    .iotlb_flush = intel_iommu_iotlb_flush,
+    .iotlb_flush_all = intel_iommu_iotlb_flush_all,
 };
 
 /*
diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
index 837e60d..a1034df 100644
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -139,6 +139,8 @@ struct iommu_ops {
     void (*resume)(void);
     void (*share_p2m)(struct domain *d);
     void (*crash_shutdown)(void);
+    void (*iotlb_flush)(struct domain *d, unsigned long gfn, unsigned int page_count);
+    void (*iotlb_flush_all)(struct domain *d);
 };
 
 void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value);
@@ -155,4 +157,7 @@ void iommu_share_p2m_table(struct domain *d);
 
 int iommu_do_domctl(struct xen_domctl *, XEN_GUEST_HANDLE(xen_domctl_t));
 
+void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count);
+void iommu_iotlb_flush_all(struct domain *d);
+
 #endif /* _IOMMU_H_ */

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Wed Nov 16 11:30:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 11:30:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQlBV-0003YX-Q6; Wed, 16 Nov 2011 11:30:13 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQl6t-000263-61
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 11:25:29 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1321471523!4469813!6
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18812 invoked from network); 16 Nov 2011 19:25:23 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 19:25:23 -0000
X-IronPort-AV: E=Sophos;i="4.69,522,1315180800"; 
   d="scan'208";a="8971539"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 19:25:23 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 16 Nov 2011 19:25:23 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RQl6p-000845-2U;
	Wed, 16 Nov 2011 19:25:23 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RQl6d-0008Es-Pq;
	Wed, 16 Nov 2011 19:25:11 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Wed, 16 Nov 2011 19:25:06 +0000
Message-ID: <1321471508-31633-5-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1321471508-31633-4-git-send-email-jean.guyader@eu.citrix.com>
References: <1321471508-31633-1-git-send-email-jean.guyader@eu.citrix.com>
	<1321471508-31633-2-git-send-email-jean.guyader@eu.citrix.com>
	<1321471508-31633-3-git-send-email-jean.guyader@eu.citrix.com>
	<1321471508-31633-4-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] 
	[PATCH 4/6] mm: New XENMEM space, XENMAPSPACE_gmfn_range
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


XENMAPSPACE_gmfn_range is like XENMAPSPACE_gmfn but it runs on
a range of pages. The size of the range is defined in a new field.

This new field .size is located in the 16 bits padding between .domid
and .space in struct xen_add_to_physmap to stay compatible with older
versions.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c               |   55 ++++++++++++++++++++++++++++++++++++---
 xen/arch/x86/x86_64/compat/mm.c |   15 ++++++++++
 xen/include/public/memory.h     |    4 +++
 3 files changed, 70 insertions(+), 4 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0004-mm-New-XENMEM-space-XENMAPSPACE_gmfn_range.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0004-mm-New-XENMEM-space-XENMAPSPACE_gmfn_range.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index f093e93..44a444e 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4677,8 +4677,8 @@ static int handle_iomem_range(unsigned long s, unsigned long e, void *p)
     return 0;
 }
 
-static int xenmem_add_to_physmap(struct domain *d,
-                                 const struct xen_add_to_physmap *xatp)
+static int xenmem_add_to_physmap_once(struct domain *d,
+                                      const struct xen_add_to_physmap *xatp)
 {
     struct page_info *page = NULL;
     unsigned long gfn = 0; /* gcc ... */
@@ -4717,6 +4717,7 @@ static int xenmem_add_to_physmap(struct domain *d,
 
             spin_unlock(&d->grant_table->lock);
             break;
+        case XENMAPSPACE_gmfn_range:
         case XENMAPSPACE_gmfn:
         {
             p2m_type_t p2mt;
@@ -4744,7 +4745,8 @@ static int xenmem_add_to_physmap(struct domain *d,
     {
         if ( page )
             put_page(page);
-        if ( xatp->space == XENMAPSPACE_gmfn )
+        if ( xatp->space == XENMAPSPACE_gmfn ||
+             xatp->space == XENMAPSPACE_gmfn_range )
             put_gfn(d, gfn);
         rcu_unlock_domain(d);
         return -EINVAL;
@@ -4779,7 +4781,8 @@ static int xenmem_add_to_physmap(struct domain *d,
     rc = guest_physmap_add_page(d, xatp->gpfn, mfn, PAGE_ORDER_4K);
 
     /* In the XENMAPSPACE_gmfn, we took a ref and locked the p2m at the top */
-    if ( xatp->space == XENMAPSPACE_gmfn )
+    if ( xatp->space == XENMAPSPACE_gmfn ||
+         xatp->space == XENMAPSPACE_gmfn_range )
         put_gfn(d, gfn);
     domain_unlock(d);
 
@@ -4788,6 +4791,37 @@ static int xenmem_add_to_physmap(struct domain *d,
     return rc;
 }
 
+static int xenmem_add_to_physmap(struct domain *d,
+                                 struct xen_add_to_physmap *xatp)
+{
+    int rc = 0;
+
+    if ( xatp->space == XENMAPSPACE_gmfn_range )
+    {
+        while ( xatp->size > 0 )
+        {
+            rc = xenmem_add_to_physmap_once(d, xatp);
+            if ( rc < 0 )
+                return rc;
+
+            xatp->idx++;
+            xatp->gpfn++;
+            xatp->size--;
+
+            /* Check for continuation if it's not the last interation */
+            if ( xatp->size > 0 && hypercall_preempt_check() )
+            {
+                rc = -EAGAIN;
+                break;
+            }
+        }
+
+        return rc;
+    }
+
+    return xenmem_add_to_physmap_once(d, xatp);
+}
+
 long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
 {
     int rc;
@@ -4816,6 +4850,19 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
 
         rcu_unlock_domain(d);
 
+        if ( xatp.space == XENMAPSPACE_gmfn_range )
+        {
+            if ( rc )
+            {
+                if ( copy_to_guest(arg, &xatp, 1) )
+                    return -EFAULT;
+            }
+
+            if ( rc == -EAGAIN )
+                rc = hypercall_create_continuation(
+                        __HYPERVISOR_memory_op, "ih", op, arg);
+        }
+
         return rc;
     }
 
diff --git a/xen/arch/x86/x86_64/compat/mm.c b/xen/arch/x86/x86_64/compat/mm.c
index 3ef08a5..bea94fe 100644
--- a/xen/arch/x86/x86_64/compat/mm.c
+++ b/xen/arch/x86/x86_64/compat/mm.c
@@ -64,6 +64,21 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
         XLAT_add_to_physmap(nat, &cmp);
         rc = arch_memory_op(op, guest_handle_from_ptr(nat, void));
 
+        if ( cmp.space == XENMAPSPACE_gmfn_range )
+        {
+            if ( rc )
+            {
+                XLAT_add_to_physmap(&cmp, nat);
+                if ( copy_to_guest(arg, &cmp, 1) )
+                {
+                    hypercall_cancel_continuation();
+                    return -EFAULT;
+                }
+            }
+            if ( rc == __HYPERVISOR_memory_op )
+                hypercall_xlat_continuation(NULL, 0x2, nat, arg);
+        }
+
         break;
     }
 
diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h
index 08355e3..c5b78a8 100644
--- a/xen/include/public/memory.h
+++ b/xen/include/public/memory.h
@@ -208,10 +208,14 @@ struct xen_add_to_physmap {
     /* Which domain to change the mapping for. */
     domid_t domid;
 
+    /* Number of pages to go through for gmfn_range */
+    uint16_t    size;
+
     /* Source mapping space. */
 #define XENMAPSPACE_shared_info 0 /* shared info page */
 #define XENMAPSPACE_grant_table 1 /* grant table page */
 #define XENMAPSPACE_gmfn        2 /* GMFN */
+#define XENMAPSPACE_gmfn_range  3 /* GMFN range */
     unsigned int space;
 
 #define XENMAPIDX_grant_table_status 0x80000000

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Wed Nov 16 11:31:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 11:31:26 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQlCg-0003w6-LX; Wed, 16 Nov 2011 11:31:26 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQl6t-000264-9R
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 11:25:28 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1321471523!4469813!7
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18823 invoked from network); 16 Nov 2011 19:25:24 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 19:25:24 -0000
X-IronPort-AV: E=Sophos;i="4.69,522,1315180800"; 
   d="scan'208";a="8971540"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 19:25:23 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 16 Nov 2011 19:25:23 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RQl6p-00084B-Ah;
	Wed, 16 Nov 2011 19:25:23 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RQl6e-0008Ey-3B;
	Wed, 16 Nov 2011 19:25:12 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Wed, 16 Nov 2011 19:25:08 +0000
Message-ID: <1321471508-31633-7-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1321471508-31633-6-git-send-email-jean.guyader@eu.citrix.com>
References: <1321471508-31633-1-git-send-email-jean.guyader@eu.citrix.com>
	<1321471508-31633-2-git-send-email-jean.guyader@eu.citrix.com>
	<1321471508-31633-3-git-send-email-jean.guyader@eu.citrix.com>
	<1321471508-31633-4-git-send-email-jean.guyader@eu.citrix.com>
	<1321471508-31633-5-git-send-email-jean.guyader@eu.citrix.com>
	<1321471508-31633-6-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 6/6] Introduce per cpu flag
	(iommu_dont_flush_iotlb) to avoid unnecessary iotlb flush
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Add cpu flag that will be checked by the iommu low level code
to skip iotlb flushes. iommu_iotlb_flush shall be called explicitly.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c                   |   12 ++++++++++++
 xen/drivers/passthrough/iommu.c     |    5 +++++
 xen/drivers/passthrough/vtd/iommu.c |    6 ++++--
 xen/include/xen/iommu.h             |   12 ++++++++++++
 4 files changed, 33 insertions(+), 2 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0006-Introduce-per-cpu-flag-iommu_dont_flush_iotlb-to-avo.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0006-Introduce-per-cpu-flag-iommu_dont_flush_iotlb-to-avo.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 44a444e..23afda9 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4794,10 +4794,15 @@ static int xenmem_add_to_physmap_once(struct domain *d,
 static int xenmem_add_to_physmap(struct domain *d,
                                  struct xen_add_to_physmap *xatp)
 {
+    struct xen_add_to_physmap start_xatp;
     int rc = 0;
 
     if ( xatp->space == XENMAPSPACE_gmfn_range )
     {
+        if ( need_iommu(d) )
+            this_cpu(iommu_dont_flush_iotlb) = 1;
+
+        start_xatp = *xatp;
         while ( xatp->size > 0 )
         {
             rc = xenmem_add_to_physmap_once(d, xatp);
@@ -4816,6 +4821,13 @@ static int xenmem_add_to_physmap(struct domain *d,
             }
         }
 
+        if ( need_iommu(d) )
+        {
+            this_cpu(iommu_dont_flush_iotlb) = 0;
+            iommu_iotlb_flush(d, start_xatp.idx, start_xatp.size - xatp->size);
+            iommu_iotlb_flush(d, start_xatp.gpfn, start_xatp.size - xatp->size);
+        }
+
         return rc;
     }
 
diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index ca7b37b..bacca11 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -52,6 +52,8 @@ bool_t __read_mostly iommu_hap_pt_share = 1;
 bool_t __read_mostly iommu_debug;
 bool_t __read_mostly amd_iommu_perdev_intremap;
 
+DEFINE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
+
 static void __init parse_iommu_param(char *s)
 {
     char *ss;
@@ -227,6 +229,7 @@ static int iommu_populate_page_table(struct domain *d)
 
     spin_lock(&d->page_alloc_lock);
 
+    this_cpu(iommu_dont_flush_iotlb) = 1;
     page_list_for_each ( page, &d->page_list )
     {
         if ( is_hvm_domain(d) ||
@@ -244,6 +247,8 @@ static int iommu_populate_page_table(struct domain *d)
             }
         }
     }
+    this_cpu(iommu_dont_flush_iotlb) = 0;
+    iommu_iotlb_flush_all(d);
     spin_unlock(&d->page_alloc_lock);
     return 0;
 }
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index f5d48ec..d66db18 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -661,7 +661,8 @@ static void dma_pte_clear_one(struct domain *domain, u64 addr)
     spin_unlock(&hd->mapping_lock);
     iommu_flush_cache_entry(pte, sizeof(struct dma_pte));
 
-    __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
+    if ( !this_cpu(iommu_dont_flush_iotlb) )
+        __intel_iommu_iotlb_flush(domain, addr >> PAGE_SHIFT_4K , 0, 1);
 
     unmap_vtd_domain_page(page);
 
@@ -1754,7 +1755,8 @@ static int intel_iommu_map_page(
     spin_unlock(&hd->mapping_lock);
     unmap_vtd_domain_page(page);
 
-    __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
+    if ( !this_cpu(iommu_dont_flush_iotlb) )
+        __intel_iommu_iotlb_flush(d, gfn, dma_pte_present(old), 1);
 
     return 0;
 }
diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
index a1034df..6f7fbf7 100644
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -160,4 +160,16 @@ int iommu_do_domctl(struct xen_domctl *, XEN_GUEST_HANDLE(xen_domctl_t));
 void iommu_iotlb_flush(struct domain *d, unsigned long gfn, unsigned int page_count);
 void iommu_iotlb_flush_all(struct domain *d);
 
+/*
+ * The purpose of the iommu_dont_flush_iotlb optional cpu flag is to
+ * avoid unecessary iotlb_flush in the low level IOMMU code.
+ *
+ * iommu_map_page/iommu_unmap_page must flush the iotlb but somethimes
+ * this operation can be really expensive. This flag will be set by the
+ * caller to notify the low level IOMMU code to avoid the iotlb flushes.
+ * iommu_iotlb_flush/iommu_iotlb_flush_all will be explicitly called by
+ * the caller.
+ */
+DECLARE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
+
 #endif /* _IOMMU_H_ */

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Wed Nov 16 11:32:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 11:32:27 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQlDd-0004JU-FR; Wed, 16 Nov 2011 11:32:26 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQl6t-000262-4L
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 11:25:28 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1321471523!4469813!5
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18800 invoked from network); 16 Nov 2011 19:25:23 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 19:25:23 -0000
X-IronPort-AV: E=Sophos;i="4.69,522,1315180800"; 
   d="scan'208";a="8971538"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 19:25:23 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 16 Nov 2011 19:25:23 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RQl6p-000848-5n;
	Wed, 16 Nov 2011 19:25:23 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RQl6d-0008Ev-W9;
	Wed, 16 Nov 2011 19:25:12 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Wed, 16 Nov 2011 19:25:07 +0000
Message-ID: <1321471508-31633-6-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1321471508-31633-5-git-send-email-jean.guyader@eu.citrix.com>
References: <1321471508-31633-1-git-send-email-jean.guyader@eu.citrix.com>
	<1321471508-31633-2-git-send-email-jean.guyader@eu.citrix.com>
	<1321471508-31633-3-git-send-email-jean.guyader@eu.citrix.com>
	<1321471508-31633-4-git-send-email-jean.guyader@eu.citrix.com>
	<1321471508-31633-5-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 5/6] hvmloader: Change memory relocation loop
	when overlap with PCI hole
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Change the way we relocate the memory page if they overlap with pci hole.
Use new map space (XENMAPSPACE_gmfn_range) to move the loop into xen.

This code usually get triggered when a device is pass through to a guest
and the PCI hole has to be extended to have enough room to map the device BARs.
The PCI hole will starts lower and it might overlap with some RAM that has been
alocated for the guest. That usually happen if the guest has more than 4G of RAM.
We have to relocate those pages in high mem otherwise they won't be accessible.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 tools/firmware/hvmloader/pci.c |   20 ++++++++++++++------
 1 files changed, 14 insertions(+), 6 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0005-hvmloader-Change-memory-relocation-loop-when-overlap.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0005-hvmloader-Change-memory-relocation-loop-when-overlap.patch"

diff --git a/tools/firmware/hvmloader/pci.c b/tools/firmware/hvmloader/pci.c
index 29ec011..62aeff2 100644
--- a/tools/firmware/hvmloader/pci.c
+++ b/tools/firmware/hvmloader/pci.c
@@ -50,6 +50,7 @@ void pci_setup(void)
         uint32_t devfn, bar_reg, bar_sz;
     } *bars = (struct bars *)scratch_start;
     unsigned int i, nr_bars = 0;
+    unsigned long pci_mem_reloc_pg;
 
     /* Program PCI-ISA bridge with appropriate link routes. */
     isa_irq = 0;
@@ -185,18 +186,25 @@ void pci_setup(void)
             ((pci_mem_start << 1) != 0) )
         pci_mem_start <<= 1;
 
-    while ( (pci_mem_start >> PAGE_SHIFT) < hvm_info->low_mem_pgend )
+    /* Relocate RAM that overlaps (in 64K chunks) */
+    pci_mem_reloc_pg = (pci_mem_start >> PAGE_SHIFT);
+    while (pci_mem_reloc_pg < hvm_info->low_mem_pgend)
     {
         struct xen_add_to_physmap xatp;
-        if ( hvm_info->high_mem_pgend == 0 )
-            hvm_info->high_mem_pgend = 1ull << (32 - PAGE_SHIFT);
+        unsigned int size = hvm_info->low_mem_pgend - pci_mem_reloc_pg;
         xatp.domid = DOMID_SELF;
-        xatp.space = XENMAPSPACE_gmfn;
-        xatp.idx   = --hvm_info->low_mem_pgend;
-        xatp.gpfn  = hvm_info->high_mem_pgend++;
+        xatp.space = XENMAPSPACE_gmfn_range;
+        xatp.idx = pci_mem_reloc_pg;
+        xatp.gpfn = hvm_info->high_mem_pgend;
+        size = size > ((1 << 16) - 1) ? ((1 << 16) - 1) : size;
+        xatp.size = size;
+
         if ( hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0 )
             BUG();
+        pci_mem_reloc_pg += size;
+        hvm_info->high_mem_pgend += size;
     }
+    hvm_info->low_mem_pgend = pci_mem_start >> PAGE_SHIFT;
 
     mem_resource.base = pci_mem_start;
     mem_resource.max = pci_mem_end;

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Wed Nov 16 11:33:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 11:33:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQlEX-0004hp-Lz; Wed, 16 Nov 2011 11:33:21 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQl6t-000261-2n
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 11:25:29 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1321471523!4469813!4
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18791 invoked from network); 16 Nov 2011 19:25:23 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 19:25:23 -0000
X-IronPort-AV: E=Sophos;i="4.69,522,1315180800"; 
   d="scan'208";a="8971537"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 19:25:23 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 16 Nov 2011 19:25:23 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RQl6o-000842-TU;
	Wed, 16 Nov 2011 19:25:22 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RQl6d-0008Ep-MY;
	Wed, 16 Nov 2011 19:25:11 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Wed, 16 Nov 2011 19:25:05 +0000
Message-ID: <1321471508-31633-4-git-send-email-jean.guyader@eu.citrix.com>
X-Mailer: git-send-email 1.6.3.3
In-Reply-To: <1321471508-31633-3-git-send-email-jean.guyader@eu.citrix.com>
References: <1321471508-31633-1-git-send-email-jean.guyader@eu.citrix.com>
	<1321471508-31633-2-git-send-email-jean.guyader@eu.citrix.com>
	<1321471508-31633-3-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------true"
Cc: tim@xen.org, allen.m.kay@intel.com, keir@xen.org,
	Jean Guyader <jean.guyader@eu.citrix.com>, JBeulich@suse.com
Subject: [Xen-devel] [PATCH 3/6] add_to_physmap: Move the code for
	XENMEM_add_to_physmap
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------true
Content-Type: text/plain; charset="UTF-8"; format=fixed
Content-Transfer-Encoding: 8bit


Move the code for the XENMEM_add_to_physmap case into it's own
function (xenmem_add_to_physmap).

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 xen/arch/x86/mm.c |  161 ++++++++++++++++++++++++++++------------------------
 1 files changed, 87 insertions(+), 74 deletions(-)


--------------true
Content-Type: text/x-patch;
	name="0003-add_to_physmap-Move-the-code-for-XENMEM_add_to_physm.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
	filename="0003-add_to_physmap-Move-the-code-for-XENMEM_add_to_physm.patch"

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index a41a1d6..f093e93 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4677,37 +4677,18 @@ static int handle_iomem_range(unsigned long s, unsigned long e, void *p)
     return 0;
 }
 
-long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
+static int xenmem_add_to_physmap(struct domain *d,
+                                 const struct xen_add_to_physmap *xatp)
 {
     struct page_info *page = NULL;
     unsigned long gfn = 0; /* gcc ... */
+    unsigned long prev_mfn, mfn = 0, gpfn, idx;
     int rc;
 
-    switch ( op )
+    switch ( xatp->space )
     {
-    case XENMEM_add_to_physmap:
-    {
-        struct xen_add_to_physmap xatp;
-        unsigned long prev_mfn, mfn = 0, gpfn;
-        struct domain *d;
-
-        if ( copy_from_guest(&xatp, arg, 1) )
-            return -EFAULT;
-
-        rc = rcu_lock_target_domain_by_id(xatp.domid, &d);
-        if ( rc != 0 )
-            return rc;
-
-        if ( xsm_add_to_physmap(current->domain, d) )
-        {
-            rcu_unlock_domain(d);
-            return -EPERM;
-        }
-
-        switch ( xatp.space )
-        {
         case XENMAPSPACE_shared_info:
-            if ( xatp.idx == 0 )
+            if ( xatp->idx == 0 )
                 mfn = virt_to_mfn(d->shared_info);
             break;
         case XENMAPSPACE_grant_table:
@@ -4716,21 +4697,22 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
             if ( d->grant_table->gt_version == 0 )
                 d->grant_table->gt_version = 1;
 
+            idx = xatp->idx;
             if ( d->grant_table->gt_version == 2 &&
-                 (xatp.idx & XENMAPIDX_grant_table_status) )
+                 (xatp->idx & XENMAPIDX_grant_table_status) )
             {
-                xatp.idx &= ~XENMAPIDX_grant_table_status;
-                if ( xatp.idx < nr_status_frames(d->grant_table) )
-                    mfn = virt_to_mfn(d->grant_table->status[xatp.idx]);
+                idx &= ~XENMAPIDX_grant_table_status;
+                if ( xatp->idx < nr_status_frames(d->grant_table) )
+                    mfn = virt_to_mfn(d->grant_table->status[idx]);
             }
             else
             {
-                if ( (xatp.idx >= nr_grant_frames(d->grant_table)) &&
-                     (xatp.idx < max_nr_grant_frames) )
-                    gnttab_grow_table(d, xatp.idx + 1);
+                if ( (idx >= nr_grant_frames(d->grant_table)) &&
+                     (idx < max_nr_grant_frames) )
+                    gnttab_grow_table(d, idx + 1);
 
-                if ( xatp.idx < nr_grant_frames(d->grant_table) )
-                    mfn = virt_to_mfn(d->grant_table->shared_raw[xatp.idx]);
+                if ( idx < nr_grant_frames(d->grant_table) )
+                    mfn = virt_to_mfn(d->grant_table->shared_raw[idx]);
             }
 
             spin_unlock(&d->grant_table->lock);
@@ -4738,9 +4720,9 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
         case XENMAPSPACE_gmfn:
         {
             p2m_type_t p2mt;
-            gfn = xatp.idx;
+            gfn = xatp->idx;
 
-            xatp.idx = mfn_x(get_gfn_unshare(d, xatp.idx, &p2mt));
+            idx = mfn_x(get_gfn_unshare(d, xatp->idx, &p2mt));
             /* If the page is still shared, exit early */
             if ( p2m_is_shared(p2mt) )
             {
@@ -4748,58 +4730,89 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
                 rcu_unlock_domain(d);
                 return -ENOMEM;
             }
-            if ( !get_page_from_pagenr(xatp.idx, d) )
+            if ( !get_page_from_pagenr(idx, d) )
                 break;
-            mfn = xatp.idx;
+            mfn = idx;
             page = mfn_to_page(mfn);
             break;
         }
         default:
             break;
-        }
-
-        if ( !paging_mode_translate(d) || (mfn == 0) )
-        {
-            if ( page )
-                put_page(page);
-            if ( xatp.space == XENMAPSPACE_gmfn )
-                put_gfn(d, gfn);
-            rcu_unlock_domain(d);
-            return -EINVAL;
-        }
-
-        domain_lock(d);
+    }
 
+    if ( !paging_mode_translate(d) || (mfn == 0) )
+    {
         if ( page )
             put_page(page);
+        if ( xatp->space == XENMAPSPACE_gmfn )
+            put_gfn(d, gfn);
+        rcu_unlock_domain(d);
+        return -EINVAL;
+    }
 
-        /* Remove previously mapped page if it was present. */
-        prev_mfn = get_gfn_untyped(d, xatp.gpfn);
-        if ( mfn_valid(prev_mfn) )
-        {
-            if ( is_xen_heap_mfn(prev_mfn) )
-                /* Xen heap frames are simply unhooked from this phys slot. */
-                guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, PAGE_ORDER_4K);
-            else
-                /* Normal domain memory is freed, to avoid leaking memory. */
-                guest_remove_page(d, xatp.gpfn);
-        }
-        /* In the XENMAPSPACE_gmfn case we still hold a ref on the old page. */
-        put_gfn(d, xatp.gpfn);
+    domain_lock(d);
+
+    if ( page )
+        put_page(page);
+
+    /* Remove previously mapped page if it was present. */
+    prev_mfn = get_gfn_untyped(d, xatp->gpfn);
+    if ( mfn_valid(prev_mfn) )
+    {
+        if ( is_xen_heap_mfn(prev_mfn) )
+            /* Xen heap frames are simply unhooked from this phys slot. */
+            guest_physmap_remove_page(d, xatp->gpfn, prev_mfn, PAGE_ORDER_4K);
+        else
+            /* Normal domain memory is freed, to avoid leaking memory. */
+            guest_remove_page(d, xatp->gpfn);
+    }
+    /* In the XENMAPSPACE_gmfn case we still hold a ref on the old page. */
+    put_gfn(d, xatp->gpfn);
 
-        /* Unmap from old location, if any. */
-        gpfn = get_gpfn_from_mfn(mfn);
-        ASSERT( gpfn != SHARED_M2P_ENTRY );
-        if ( gpfn != INVALID_M2P_ENTRY )
-            guest_physmap_remove_page(d, gpfn, mfn, PAGE_ORDER_4K);
+    /* Unmap from old location, if any. */
+    gpfn = get_gpfn_from_mfn(mfn);
+    ASSERT( gpfn != SHARED_M2P_ENTRY );
+    if ( gpfn != INVALID_M2P_ENTRY )
+        guest_physmap_remove_page(d, gpfn, mfn, PAGE_ORDER_4K);
 
-        /* Map at new location. */
-        rc = guest_physmap_add_page(d, xatp.gpfn, mfn, PAGE_ORDER_4K);
+    /* Map at new location. */
+    rc = guest_physmap_add_page(d, xatp->gpfn, mfn, PAGE_ORDER_4K);
 
-        /* In the XENMAPSPACE_gmfn, we took a ref and locked the p2m at the top */
-        if ( xatp.space == XENMAPSPACE_gmfn )
-            put_gfn(d, gfn);
-        domain_unlock(d);
+    /* In the XENMAPSPACE_gmfn, we took a ref and locked the p2m at the top */
+    if ( xatp->space == XENMAPSPACE_gmfn )
+        put_gfn(d, gfn);
+    domain_unlock(d);
+
+    rcu_unlock_domain(d);
+
+    return rc;
+}
+
+long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
+{
+    int rc;
+
+    switch ( op )
+    {
+    case XENMEM_add_to_physmap:
+    {
+        struct xen_add_to_physmap xatp;
+        struct domain *d;
+
+        if ( copy_from_guest(&xatp, arg, 1) )
+            return -EFAULT;
+
+        rc = rcu_lock_target_domain_by_id(xatp.domid, &d);
+        if ( rc != 0 )
+            return rc;
+
+        if ( xsm_add_to_physmap(current->domain, d) )
+        {
+            rcu_unlock_domain(d);
+            return -EPERM;
+        }
+
+        rc = xenmem_add_to_physmap(d, &xatp);
 
         rcu_unlock_domain(d);
 

--------------true
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------true--


From xen-devel-bounces@lists.xensource.com Wed Nov 16 13:08:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 13:08:44 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQmip-0007ka-Aw; Wed, 16 Nov 2011 13:08:43 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQmi4-0007Y0-T6
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 13:07:57 -0800
X-Env-Sender: kthawan@gmail.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1321477673!4518234!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11387 invoked from network); 16 Nov 2011 21:07:53 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-4.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 21:07:53 -0000
Received: by eyb6 with SMTP id 6so1599619eyb.30
	for <xen-devel@lists.xensource.com>;
	Wed, 16 Nov 2011 13:07:53 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=V9EHZfZUwzvcIcOOX3V9Fa7CW6jVV+9zEwldR8GDcxg=;
	b=ktqSWvOAGZGhcRtQLi6HrYZokkujM+EZYPgR6VxZITrMd8S4LNFlTkwRCRzFmkc3vF
	BnOGDKoVEJWjgH/IoO9flee5mAyAT7HJnKD7hdLdoX9VvJ+fmdpE4lMx3mAe4j8jrml2
	FrpFyJFzr+UQmRLb1TkMr5tmvRuYBLcgEZ32U=
MIME-Version: 1.0
Received: by 10.14.14.26 with SMTP id c26mr2442853eec.208.1321477673177; Wed,
	16 Nov 2011 13:07:53 -0800 (PST)
Received: by 10.14.185.144 with HTTP; Wed, 16 Nov 2011 13:07:53 -0800 (PST)
Date: Wed, 16 Nov 2011 15:07:53 -0600
Message-ID: <CAHk9V6eY1teYtHSXiZxPk1m29uiekw8BXn8U+6YGWDy+N4fS6Q@mail.gmail.com>
From: Thawan Kooburat <kthawan@gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1
Subject: [Xen-devel] Problem correlating TSC read from domU with Xentrace's
	TSC
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi,

I am trying to correlating performance issue in guest VM with the
scheduling trace from Xentrace. User-mode application in guest VM
periodically dump APIC ID and RDTSC into trace. I also start Xentrace
in Dom0 during the same period.

However, I notice that range of TSC values report both trace is
completely disjointed. TSC values from Xentrace is always greater than
what  guest VM see, even if I start capturing Xen's trace 30s before
capturing trace in guest VM.

I understand that Xen don't emulate rdtsc() for PV guest and Xentrace
also read rdtsc() during __insert_record(). However, I don't
understand what cause my issue.  Any suggestion?   I am using Xen
4.1.1 on Fedora 15


-- 
Thawan Kooburat

Graduate Student
Department of Computer Science
UW-Madison

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 14:04:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 14:04:55 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQnbC-0001Hv-4Q; Wed, 16 Nov 2011 14:04:54 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQnWk-00010n-GH
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 14:00:34 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1321480814!4552654!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7801 invoked from network); 16 Nov 2011 22:00:14 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 22:00:14 -0000
X-IronPort-AV: E=Sophos;i="4.69,523,1315180800"; 
   d="scan'208";a="8972966"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 22:00:13 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 16 Nov 2011 22:00:13 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RQnWf-0000Tu-66;
	Wed, 16 Nov 2011 22:00:13 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RQnWe-0003QX-TH;
	Wed, 16 Nov 2011 22:00:12 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9804-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 16 Nov 2011 22:00:12 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.0-testing test] 9804: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9804 xen-4.0-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9804/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf      5 xen-boot                   fail REGR. vs. 9757

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  8 debian-fixup                fail never pass
 test-amd64-i386-xl-multivcpu 15 guest-stop                   fail   never pass
 test-amd64-i386-xl-credit2   15 guest-stop                   fail   never pass
 test-amd64-amd64-xl          15 guest-stop                   fail   never pass
 test-amd64-i386-xl           15 guest-stop                   fail   never pass
 test-i386-i386-xl            15 guest-stop                   fail   never pass
 test-amd64-i386-rhel6hvm-amd  7 redhat-install               fail   never pass
 test-amd64-i386-rhel6hvm-intel  7 redhat-install               fail never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1  7 windows-install              fail  never pass
 test-i386-i386-xl-win         7 windows-install              fail   never pass
 test-amd64-amd64-xl-win       7 windows-install              fail   never pass

version targeted for testing:
 xen                  c16b0a997a05
baseline version:
 xen                  cdff7052bad8

------------------------------------------------------------
People who touched revisions under test:
  Gianluca Guida <gianluca.guida@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Mark Langsdorf <mark.langsdorf@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   21553:c16b0a997a05
tag:         tip
user:        Gianluca Guida <gianluca.guida@citrix.com>
date:        Wed Nov 16 16:40:05 2011 +0000
    
    [shadow] Disable higher level pagetables early unshadow only when the "process dying" hypercall is used.
    
    This patch fixes a performance problem in fully virtualized guests.
    
    Signed-off-by: Gianluca Guida <gianluca.guida@citrix.com>
    Tested-by: Jan Beulich <jbeulich@suse.com>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   24148:3ecc8fef4281
    xen-unstable date:        Wed Nov 16 15:19:33 2011 +0000
    
    
changeset:   21552:cdff7052bad8
user:        Mark Langsdorf <mark.langsdorf@amd.com>
date:        Sat Nov 12 16:15:19 2011 +0000
    
    x86/amd: Eliminate cache flushing when entering C3 on select AMD processors
    
    AMD Fam15h processors have a shared cache. It does not need=
    to be be flushed when entering C3 and doing so causes reduces
    performance. Modify acpi_processor_power_init_bm_check to
    prevent these processors from flushing when entering C3.
    
    Signed-off-by: Mark Langsdorf <mark.langsdorf@amd.com>
    xen-unstable changeset:   23511:450f1d198e1e
    xen-unstable date:        Tue Jun 14 12:46:29 2011 +0100
    Committed-by: Keir Fraser <keir@xen.org>
    
    
(qemu changes not included)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 14:23:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 14:23:59 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQntf-00020N-4G; Wed, 16 Nov 2011 14:23:59 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQnso-0001o9-SJ
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 14:23:07 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1321482183!3449144!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29626 invoked from network); 16 Nov 2011 22:23:03 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 22:23:03 -0000
X-IronPort-AV: E=Sophos;i="4.69,523,1315180800"; 
   d="scan'208";a="8973174"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Nov 2011 22:23:03 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Wed, 16 Nov 2011 22:23:03 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RQnsk-0000c7-Ui;
	Wed, 16 Nov 2011 22:23:02 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RQnsk-0006FN-U3;
	Wed, 16 Nov 2011 22:23:02 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9805-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 16 Nov 2011 22:23:02 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9805: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9805 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9805/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-pv             5 xen-boot                   fail REGR. vs. 9756
 test-amd64-amd64-xl-sedf      5 xen-boot                   fail REGR. vs. 9756
 test-amd64-amd64-pv           5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-xl-multivcpu  5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-rhel6hvm-intel  5 xen-boot                 fail REGR. vs. 9756
 test-amd64-i386-pv            5 xen-boot                   fail REGR. vs. 9756
 test-amd64-amd64-xl-pcipt-intel  5 xen-boot                fail REGR. vs. 9756
 test-i386-i386-xl             5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-xl-credit2    5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-rhel6hvm-amd  5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-xl            5 xen-boot                   fail REGR. vs. 9756
 test-amd64-amd64-xl           5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-xl-win-vcpus1  5 xen-boot                  fail REGR. vs. 9756
 test-amd64-amd64-win          5 xen-boot                   fail REGR. vs. 9756
 test-i386-i386-xl-win         5 xen-boot                   fail REGR. vs. 9756
 test-amd64-amd64-pair         8 xen-boot/dst_host          fail REGR. vs. 9756
 test-amd64-amd64-pair         7 xen-boot/src_host          fail REGR. vs. 9756
 test-i386-i386-pair           7 xen-boot/src_host          fail REGR. vs. 9756
 test-i386-i386-pair           8 xen-boot/dst_host          fail REGR. vs. 9756
 test-amd64-i386-pair          8 xen-boot/dst_host          fail REGR. vs. 9756
 test-amd64-i386-pair          7 xen-boot/src_host          fail REGR. vs. 9756
 test-amd64-i386-win-vcpus1    5 xen-boot                   fail REGR. vs. 9756
 test-amd64-amd64-xl-win       5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-win           5 xen-boot                   fail REGR. vs. 9756
 test-i386-i386-win            5 xen-boot                   fail REGR. vs. 9756

version targeted for testing:
 xen                  51f58b210447
baseline version:
 xen                  9702967e89dd

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Gianluca Guida <gianluca.guida@citrix.com>
  Ian Campbell <ian.campbell@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Stefano Stabellini <stefano.stabellini@eu.citrix.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        fail    
 test-amd64-i386-pair                                         fail    
 test-i386-i386-pair                                          fail    
 test-amd64-amd64-pv                                          fail    
 test-amd64-i386-pv                                           fail    
 test-i386-i386-pv                                            fail    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   23186:51f58b210447
tag:         tip
user:        Jan Beulich <jbeulich@suse.com>
date:        Wed Nov 16 16:39:02 2011 +0000
    
    x86-64/test_x86_emulate: fix blowfish test
    
    Incorrect register usage in the _start() wrapper caused the 64-bit
    execution emulation to fail.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   24149:753b21aa4087
    xen-unstable date:        Wed Nov 16 15:20:25 2011 +0000
    
    
changeset:   23185:efd132eee40c
user:        Gianluca Guida <gianluca.guida@citrix.com>
date:        Wed Nov 16 16:38:27 2011 +0000
    
    [shadow] Disable higher level pagetables early unshadow only when the "process dying" hypercall is used.
    
    This patch fixes a performance problem in fully virtualized guests.
    
    Signed-off-by: Gianluca Guida <gianluca.guida@citrix.com>
    Tested-by: Jan Beulich <jbeulich@suse.com>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   24148:3ecc8fef4281
    xen-unstable date:        Wed Nov 16 15:19:33 2011 +0000
    
    
changeset:   23184:4a91cf045893
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Wed Nov 16 16:37:49 2011 +0000
    
    xen: avoid crash enabling turbo mode
    
    On a system which has not had P-state information pushed down into the
    hypervisor running "xenpm enable-turbo-mode" will reliably crash the
    host.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Jan Beulich <jbeulich@suse.com>
    xen-unstable changeset:   24144:cd3ef25f207a
    xen-unstable date:        Tue Nov 15 14:24:38 2011 +0100
    Committed-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23183:98ba0aceaf30
user:        Stefano Stabellini <stefano.stabellini@eu.citrix.com>
date:        Wed Nov 16 16:33:58 2011 +0000
    
    x86: re-inject emulated level pirqs in PV on HVM guests if still asserted
    
    PV on HVM guests can loose level interrupts coming from emulated
    devices if they have been remapped onto event channels.  The reason is
    that we are missing the code to inject a pirq again in the guest when
    the guest EOIs it, if it corresponds to an emulated level interrupt
    and the interrupt is still asserted.
    
    Fix this issue and also return error when the guest tries to get the
    irq_status of a non-existing pirq.
    
    Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   24007:0526644ad2a6
    xen-unstable date:        Thu Oct 27 16:07:18 2011 +0100
    
    
changeset:   23182:9702967e89dd
user:        Andrew Cooper <andrew.cooper3@citrix.com>
date:        Sat Nov 12 16:14:02 2011 +0000
    
    Revert c/s 23666:b96f8bdcaa15 KEXEC: disconnect all PCI devices from the PCI bus on crash
    
    It turns out that this causes all mannor of problems on certain
    motherboards (so far with no pattern I can discern)
    
    Problems include:
    * Hanging forever checking hlt instruction.
    * Panics when trying to change switch root device
    * Drivers hanging when trying to check for interrupts.
    
    From: Andrew Cooper <andrew.cooper3@citrix.com>
    Signed-off-by: Keir Fraser <keir@xen.org>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   24137:0844b17df7a9
    xen-unstable date:        Fri Nov 11 18:14:35 2011 +0000
    
    
(qemu changes not included)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-users-bounces@lists.xensource.com Wed Nov 16 15:30:49 2011
Return-path: <xen-users-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 15:30:49 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQowL-0006yM-3S; Wed, 16 Nov 2011 15:30:49 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQoue-0006dH-KC
	for xen-users@lists.xensource.com; Wed, 16 Nov 2011 15:29:08 -0800
X-Env-Sender: jim_burn@bellsouth.net
X-Msg-Ref: server-2.tower-27.messagelabs.com!1321486102!63504763!1
X-Originating-IP: [66.94.237.211]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4954 invoked from network); 16 Nov 2011 23:28:23 -0000
Received: from nm10.access.bullet.mail.mud.yahoo.com (HELO
	nm10.access.bullet.mail.mud.yahoo.com) (66.94.237.211)
	by server-2.tower-27.messagelabs.com with SMTP;
	16 Nov 2011 23:28:23 -0000
Received: from [66.94.237.195] by nm10.access.bullet.mail.mud.yahoo.com with
	NNFMP; 16 Nov 2011 23:28:59 -0000
Received: from [98.139.221.50] by tm6.access.bullet.mail.mud.yahoo.com with
	NNFMP; 16 Nov 2011 23:28:59 -0000
Received: from [127.0.0.1] by smtp103.sbc.mail.bf1.yahoo.com with NNFMP;
	16 Nov 2011 23:28:59 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bellsouth.net; s=s1024;
	t=1321486139; bh=cc+WAv1+wpvVbkF0b/gsMv4vACx4gOypSS1rx2TQLMM=;
	h=X-Yahoo-Newman-Id:X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Received:From:To:Cc:Subject:Date:Message-ID:User-Agent:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Content-Type;
	b=Obr3OxPkq4hJJ+CggolopsaHzit1zmScaqf4qwC/vY6rSFT3UjcaQCpLc5iEvRGImMYT+Meu4i2QmjPwppRDbMbfRjlkcvCXA2HPDYpnLDTP9a71bsi/GCploAKMrnq/vNbDnJ+A3DZgwDqqdQy/pZ47cnq/AJyqtawq+eSLKxM=
X-Yahoo-Newman-Id: 737253.14085.bm@smtp103.sbc.mail.bf1.yahoo.com
X-Yahoo-Newman-Property: ymail-3
X-YMail-OSG: 8v_xOZgVM1lxpDQBUkeCyiWTKqCEx.EGMvaZuGzxHr7zRTm
	qLrXb_iZXqHlBAn_GKwn6ZbuEm.g7iwXjeSy4Oo.nB2l2EaeCwlaTF5bBAxN
	2MxxppllP9FWOBdd3NEPRhPQ9726.piryCie8_e7yzyhUqt_aF_PeSz1w9Yj
	iyGZfwjZa58_0i_r9nLz5o4aDq737GD1qxETKiwHhuQiH5a7dfJksgPVYr7m
	ZWDJtMxBZ7NeCrBu7XLvvB3Sp5sSc_cVmzvCzm3L0Ue7ZutHq6JfUUn7oT1E
	B.tS312_4VOa.KMeypJZNNwDX_PRegTvarXboqnCqeGrWhB.U3j_GYFFWf.Y
	KHhEgCAMZuxKijK1lbkRCmHUMU7FylJpzt3t7HlNIi3l6AZpAB53bVfjRRT4
	nHrhKVVtJeZ9ZEtorOiFl4rt.UwLWCFy_wdu8obhJjDavrrIzsx3vy4B6.pG
	0mudj2kgNTCXG8RUNkU5K5YdDQOthn6g.rB1KZh0aGPFseecOSCjU7jSf5MZ
	r0ne1qzaoljwDZt3fOrDjzJLf2c0-
X-Yahoo-SMTP: g0AhWW2swBA2djJKuhuwxPlPqLrHlDrycdPnfR9kZNrpKCA-
Received: from dell4550.localnet (jim_burn@72.145.175.45 with plain)
	by smtp103.sbc.mail.bf1.yahoo.com with SMTP;
	16 Nov 2011 15:28:59 -0800 PST
From: jim burns <jim_burn@bellsouth.net>
To: xen-users@lists.xensource.com, xen-devel@lists.xensource.com
Date: Wed, 16 Nov 2011 18:28:47 -0500
Message-ID: <3049363.ivXYWEmP59@dell4550>
User-Agent: KMail/4.7.3 (Linux/2.6.37.6-0.9-default; KDE/4.7.3; i686; ; )
In-Reply-To: <CAP8Jb=r68A5j5FGFv=xePqM_n1PA8JiEUhxtjCxmMu2EvvCwEQ@mail.gmail.com>
References: <7877809.94pu0BOf0I@dell4550> <2018795.uE019qUBdA@dell4550>
	<CAP8Jb=r68A5j5FGFv=xePqM_n1PA8JiEUhxtjCxmMu2EvvCwEQ@mail.gmail.com>
MIME-Version: 1.0
Content-Transfer-Encoding: 7Bit
Content-Type: text/plain; charset="us-ascii"
Cc: Flavio <fbcyborg@gmail.com>,
	Pasi =?ISO-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>,
	"Fajar A. Nugraha" <list@fajar.net>
Subject: [Xen-users] BAR 0: cirrusfb load errors prevent hvm domu from
	getting resolutions above 800x600
X-BeenThere: xen-users@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen user discussion <xen-users.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-users>,
	<mailto:xen-users-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-users@lists.xensource.com>
List-Help: <mailto:xen-users-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-users>,
	<mailto:xen-users-request@lists.xensource.com?subject=subscribe>
Sender: xen-users-bounces@lists.xensource.com
Errors-To: xen-users-bounces@lists.xensource.com

Flavio is having a problem getting a functional cirrus emulation (stdvga=0) in 
his opensuse 11.4 hvm domu. He has two kernels installed on the virtual disk - 
suse's 2.6.37, and a hand compiled 3.1, with all the xen frontends builtin. 
Both kernels have the same problem with the cirrusfb driver.

Here are the relevant messages from the 2.6.37 kernel:

[    0.201973] pci 0000:00:02.0: [1013:00b8] type 0 class 0x000300
[    0.202546] pci 0000:00:02.0: reg 10: [mem 0xf0000000-0xf1ffffff pref]
[    0.203075] pci 0000:00:02.0: reg 14: [mem 0xf3000000-0xf3000fff]
[...]
[    0.453890] vgaarb: device added: 
PCI:0000:00:02.0,decodes=io+mem,owns=io+mem,locks=none
[    0.453894] vgaarb: loaded
[...]
[    0.492167] pci 0000:00:02.0: Boot video device
[...]
[    0.667812] vesafb: framebuffer at 0xf0000000, mapped to 
0xffffc90000580000, using 1875k, total 4096k
[    0.667815] vesafb: mode is 800x600x16, linelength=1600, pages=3
[    0.667817] vesafb: scrolling: redraw
[    0.667820] vesafb: Truecolor: size=0:5:6:5, shift=0:11:5:0
[    0.668044] bootsplash 3.1.6-2004/03/31: looking for picture...
[    0.668047] bootsplash: silentjpeg size 124451 bytes
[    0.674284] bootsplash: ...found (800x600, 62872 bytes, v3).
[    0.688156] Console: switching to colour frame buffer device 96x33
[    0.701329] fb0: VESA VGA frame buffer device
[...]
[   32.626308] cirrusfb 0000:00:02.0: BAR 0: can't reserve [mem 
0xf0000000-0xf1ffffff pref]
[   32.626312] cirrusfb 0000:00:02.0: cannot reserve region 0xf0000000, abort
[   32.626324] cirrusfb: probe of 0000:00:02.0 failed with error -16

So cirrusfb is trying to reserve memory the pci device already has, and 
controlled by the builtin vesa kernel driver. I would think vesa should hand 
off the device to cirrusfb? Here's what happens on my bare metal opensuse 11.4 
machine, with a radeon card:

<7>[    0.131665] pci 0000:01:00.0: [1002:5960] type 0 class 0x000300
<7>[    0.131682] pci 0000:01:00.0: reg 10: [mem 0xf0000000-0xf7ffffff pref]
<7>[    0.131691] pci 0000:01:00.0: reg 14: [io  0xec00-0xecff]
<7>[    0.131700] pci 0000:01:00.0: reg 18: [mem 0xff8f0000-0xff8fffff]
<7>[    0.131726] pci 0000:01:00.0: reg 30: [mem 0x80000000-0x8001ffff pref]
<7>[    0.131747] pci 0000:01:00.0: supports D1 D2
[...]
<6>[    0.162384] vgaarb: device added: 
PCI:0000:01:00.0,decodes=io+mem,owns=io+mem,locks=none
<6>[    0.162396] vgaarb: loaded
[...]
<6>[    0.222150] pci 0000:01:00.0: no compatible bridge window for [mem 
0x80000000-0x8001ffff pref]
<6>[    0.222224] pci 0000:01:00.0: BAR 6: assigned [mem 0xff800000-0xff81ffff 
pref]
[...]
<7>[    0.225419] pci 0000:01:00.0: Boot video device
[...]
<4>[    0.629101] vesafb: cannot reserve video memory at 0xf0000000
<6>[    0.630029] vesafb: framebuffer at 0xf0000000, mapped to 0xf8080000, 
using 5120k, total 262144k
<6>[    0.630038] vesafb: mode is 1280x1024x16, linelength=2560, pages=101
<6>[    0.630043] vesafb: protected mode interface info at c000:56f7
<6>[    0.630049] vesafb: pmi: set display start = c00c578b, set palette = 
c00c57d7
<6>[    0.630054] vesafb: pmi: ports = e010 e016 e054 e038 e03c e05c e000 e004 
e0b0 e0b2 e0b4 
<6>[    0.630069] vesafb: scrolling: redraw
<6>[    0.630075] vesafb: Truecolor: size=0:5:6:5, shift=0:11:5:0
[...]
<6>[    0.814211] fb0: VESA VGA frame buffer device
[...]
<6>[  259.930780] [drm] radeon defaulting to kernel modesetting.
<6>[  259.952873] [drm] radeon kernel modesetting enabled.
<7>[  259.974306] checking generic (f0000000 10000000) vs hw (f0000000 
8000000)
<3>[  259.974310] fb: conflicting fb hw usage radeondrmfb vs VESA VGA - 
removing generic driver

In other words, the kernel causes vesafb to relinquish control to radeon, 
which is not happening in Flavio's cirrusfb case.

I've already had him try stdvga=1, videoram=8 & 16 & 32. lspci -vvv tells us 
the Region 0 memory size for the video device keeps increasing for 8 & 16, but 
stays at 16M for videoram=32, so stdvga=1 does not help him. It also says 
there is no kernel module - in other words, the builtin vesa driver is still 
in charge.

So, does anybody know how to correct BAR errors for an emulated device? It's 
not like I can put it in a different virtual pci slot.

Thanx.

His 2.6.37 dmesg: http://pastebin.com/vNpumSik
His 3.1.0  dmesg: http://pastebin.com/ikKPe6n3

His hvm config:

kernel = "/usr/lib/xen/boot/hvmloader"
builder='hvm'
memory = 1024

shadow_memory = 8
name = "opensuse-11.4"
vif = [ 'type=ioemu, mac=00:16:3e:00:00:21, bridge=xenbr0' ]
acpi = 1
apic = 1
disk = [ 'file:/mnt/xen/vmstore/opensuse-11.4/opensuse-11.4.img,hda,w' ]

boot="dc"
sdl=0
vnc=1
vncconsole=1
vncpasswd=''
vnclisten="192.168.1.100"
stdvga=0
videoram=16
keymap="it"

serial='pty'
usbdevice='tablet'


_______________________________________________
Xen-users mailing list
Xen-users@lists.xensource.com
http://lists.xensource.com/xen-users

From xen-devel-bounces@lists.xensource.com Wed Nov 16 15:52:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 15:52:15 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQpH4-0008D4-Ta; Wed, 16 Nov 2011 15:52:14 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQpGL-00080U-Eq
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 15:51:29 -0800
X-Env-Sender: dan.magenheimer@oracle.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1321487466!48586222!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22060 invoked from network); 16 Nov 2011 23:51:08 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-13.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 16 Nov 2011 23:51:08 -0000
Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pAGNpMdc020459
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 16 Nov 2011 23:51:23 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pAGNpMju011761
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 16 Nov 2011 23:51:22 GMT
Received: from abhmt107.oracle.com (abhmt107.oracle.com [141.146.116.59])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pAGNpGMP029896; Wed, 16 Nov 2011 17:51:16 -0600
MIME-Version: 1.0
Message-ID: <2650416a-630f-45b7-956e-f45a81e81f0f@default>
Date: Wed, 16 Nov 2011 15:51:14 -0800 (PST)
From: Dan Magenheimer <dan.magenheimer@oracle.com>
To: Thawan Kooburat <kthawan@gmail.com>, xen-devel@lists.xensource.com
Subject: RE: [Xen-devel] Problem correlating TSC read from domU with
	Xentrace's TSC
References: <CAHk9V6eY1teYtHSXiZxPk1m29uiekw8BXn8U+6YGWDy+N4fS6Q@mail.gmail.com>
In-Reply-To: <CAHk9V6eY1teYtHSXiZxPk1m29uiekw8BXn8U+6YGWDy+N4fS6Q@mail.gmail.com>
X-Priority: 3
X-Mailer: Oracle Beehive Extensions for Outlook 2.0.1.4.1.0  (410211) [OL
	12.0.6607.1000]
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090202.4EC44C7B.01AD,ss=1,re=0.000,fgs=0
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


> I am trying to correlating performance issue in guest VM with the
> scheduling trace from Xentrace. User-mode application in guest VM
> periodically dump APIC ID and RDTSC into trace. I also start Xentrace
> in Dom0 during the same period.
>=20
> However, I notice that range of TSC values report both trace is
> completely disjointed. TSC values from Xentrace is always greater than
> what  guest VM see, even if I start capturing Xen's trace 30s before
> capturing trace in guest VM.
>=20
> I understand that Xen don't emulate rdtsc() for PV guest and Xentrace
> also read rdtsc() during __insert_record(). However, I don't
> understand what cause my issue.  Any suggestion?   I am using Xen
> 4.1.1 on Fedora 15

Hi Thawan --

Depending on the underlying hardware, Xen may emulate rdtsc
for PV guests.  To force this off, set tsc_mode=3D2 in your
guest vm.cfg file (and reboot).  For more info on tsc_mode
see tscmode.txt in the Xen source tree (or google for it).

Dan

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 16:28:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 16:28:02 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQppi-0000oA-DC; Wed, 16 Nov 2011 16:28:02 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQpok-0000aq-7K
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 16:27:02 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1321489595!44910594!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27216 invoked from network); 17 Nov 2011 00:26:35 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 00:26:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,523,1315180800"; 
   d="scan'208";a="8974008"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Nov 2011 00:26:58 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 17 Nov 2011 00:26:58 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RQpof-0001Iv-N1;
	Thu, 17 Nov 2011 00:26:57 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RQpof-0001xL-MV;
	Thu, 17 Nov 2011 00:26:57 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9806-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 17 Nov 2011 00:26:57 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9806: tolerable FAIL - PUSHED
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9806 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9806/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  644ca5d3ec43
baseline version:
 xen                  fd3567cafe1c

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Gianluca Guida <gianluca.guida@citrix.com>
  Ian Campbell <ian.campbell@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Stefano Stabellini <stefano.stabellini@eu.citrix.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     pass    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Pushing revision :

+ branch=xen-unstable
+ revision=644ca5d3ec43
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x '!=' x/export/home/osstest/repos/lock ']'
++ OSSTEST_REPOS_LOCK_LOCKED=/export/home/osstest/repos/lock
++ exec with-lock-ex -w /export/home/osstest/repos/lock ./ap-push xen-unstable 644ca5d3ec43
+ branch=xen-unstable
+ revision=644ca5d3ec43
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x/export/home/osstest/repos/lock '!=' x/export/home/osstest/repos/lock ']'
+ : xen@xenbits.xensource.com
+ : xen@xenbits.xensource.com:git/linux-pvops
+ : master
+ : tested/2.6.39.x
+ case "$branch" in
+ cd /export/home/osstest/repos/xen-unstable.hg
+ hg push -r 644ca5d3ec43 ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
pushing to ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 7 changesets with 12 changes to 9 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 16:57:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 16:57:49 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQqIW-000260-Rb; Wed, 16 Nov 2011 16:57:48 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQqHS-0001rW-LF
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 16:56:43 -0800
X-Env-Sender: samuel.thibault@ens-lyon.org
X-Msg-Ref: server-13.tower-182.messagelabs.com!1321491398!2905672!1
X-Originating-IP: [80.67.169.19]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4989 invoked from network); 17 Nov 2011 00:56:38 -0000
Received: from solo.fdn.fr (HELO solo.fdn.fr) (80.67.169.19)
	by server-13.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 17 Nov 2011 00:56:38 -0000
Received: from type.ipv6 (youpi.is-a-geek.org [80.67.176.89])
	(using TLSv1 with cipher AES256-SHA (256/256 bits))
	(Client did not present a certificate)
	by solo.fdn.fr (Postfix) with ESMTPS id CF225443A6
	for <xen-devel@lists.xensource.com>;
	Thu, 17 Nov 2011 01:56:37 +0100 (CET)
Received: from samy by type.ipv6 with local (Exim 4.77)
	(envelope-from <samuel.thibault@ens-lyon.org>) id 1RQqHM-0000UP-Ib
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 01:56:36 +0100
Resent-From: Samuel Thibault <samuel.thibault@ens-lyon.org>
Resent-Date: Thu, 17 Nov 2011 01:56:36 +0100
Resent-Message-ID: <20111117005636.GQ4275@type.famille.thibault.fr>
Resent-To: xen-devel@lists.xensource.com
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
	type.bordeaux.inria.fr
X-Spam-Level: 
X-Spam-Status: No, score=-1.8 required=8.0 tests=BAYES_00,FREEMAIL_FROM,
	TVD_RCVD_SPACE_BRACKET, T_DKIM_INVALID autolearn=disabled version=3.3.2
X-Spam-Language: 
Received: from iona.labri.fr [147.210.8.143]
	by type.bordeaux.inria.fr with IMAP (fetchmail-6.3.21)
	for <samy@localhost> (single-drop);
	Thu, 17 Nov 2011 01:55:03 +0100 (CET)
Received: from iona.labri.fr ([unix socket]) by iona.labri.fr with LMTPA;
	Thu, 17 Nov 2011 01:55:03 +0100
X-Sieve: CMU Sieve 2.3
Received: from localhost (localhost [127.0.0.1])
	by iona.labri.fr (Postfix) with ESMTP id 52C0CE27
	for <samuel.thibault@labri.fr>; Thu, 17 Nov 2011 01:55:03 +0100 (CET)
X-Virus-Scanned: amavisd-new at labri.fr
X-Amavis-OS-Fingerprint: Linux 2.6 (newer, 1) (up: 2727 hrs), (distance 11,
	link: ethernet/modem), [140.77.166.68:41508]
Authentication-Results: iona.labri.fr (amavisd-new); dkim=pass
	header.i=@gmail.com
Received: from iona.labri.fr ([127.0.0.1])
	by localhost (iona.labri.fr [127.0.0.1]) (amavisd-new, port 10024)
	with LMTP id REk6UdguJ+Qz for <samuel.thibault@labri.fr>;
	Thu, 17 Nov 2011 01:55:03 +0100 (CET)
Received: from toccata.ens-lyon.org (toccata.ens-lyon.org [140.77.166.68])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(Client did not present a certificate)
	by iona.labri.fr (Postfix) with ESMTPS id 2DDDADD8
	for <samuel.thibault@labri.fr>; Thu, 17 Nov 2011 01:55:03 +0100 (CET)
Received: from localhost (localhost [127.0.0.1])
	by toccata.ens-lyon.org (Postfix) with ESMTP id CD5278407D
	for <samuel.thibault@labri.fr>; Thu, 17 Nov 2011 01:55:02 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at toccata.ens-lyon.org
Received: from toccata.ens-lyon.org ([127.0.0.1])
	by localhost (toccata.ens-lyon.org [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id BQan-F+LLWyo for <samuel.thibault@labri.fr>;
	Thu, 17 Nov 2011 01:55:02 +0100 (CET)
Received: from mail-bw0-f53.google.com (mail-bw0-f53.google.com
	[209.85.214.53]) (using TLSv1 with cipher RC4-MD5 (128/128 bits))
	(No client certificate requested)
	by toccata.ens-lyon.org (Postfix) with ESMTPS id 83FE58407A
	for <samuel.thibault@ens-lyon.org>;
	Thu, 17 Nov 2011 01:54:52 +0100 (CET)
Received: by bkaq10 with SMTP id q10so1620217bka.40
	for <samuel.thibault@ens-lyon.org>;
	Wed, 16 Nov 2011 16:54:52 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=message-id:date:from:user-agent:mime-version:to:cc:subject
	:x-enigmail-version:content-type;
	bh=OaIk2exiOdmmJPS0ZlcsnaGyV6Ijr74D/FJpx5WH7mQ=;
	b=ocSVcUA1fVvkVEZxyL1o9DzT72e0E9mgSwPCRbS00wQPgXl07ZDROkAx0Hnaj+LfAu
	KmhQGyJk4AgB6t5V1Ld3nyMACyF4MA36i83tziytkkiksi2jRV71DNKACBtOHDq9nYqi
	Jh3KElCZLXIdL094fWUfNFEA+6TLu8fCvx6xc=
Received: by 10.205.119.207 with SMTP id fv15mr31320902bkc.100.1321491291876; 
	Wed, 16 Nov 2011 16:54:51 -0800 (PST)
Received: from debian.x201.phnet (109-234.197-178.cust.bluewin.ch.
	[178.197.234.109])
	by mx.google.com with ESMTPS id a10sm370295fam.20.2011.11.16.16.54.50
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 16 Nov 2011 16:54:50 -0800 (PST)
Message-ID: <4EC45B57.80602@gmail.com>
Date: Thu, 17 Nov 2011 01:54:47 +0100
From: =?UTF-8?B?VmxhZGltaXIgJ8+GLWNvZGVyL3BoY29kZXInIFNlcmJpbmVua28=?=
	<phcoder@gmail.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20111010 Iceowl/1.0b2 Icedove/3.1.15
MIME-Version: 1.0
To: The development of GRUB 2 <grub-devel@gnu.org>
X-Enigmail-Version: 1.1.2
Cc: Samuel Thibault <samuel.thibault@ens-lyon.org>
Subject: [Xen-devel] Xen branches
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1849551276=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
--===============1849551276==
Content-Type: multipart/signed; micalg=pgp-sha512;
	protocol="application/pgp-signature";
	boundary="------------enig4F4FDF185E23DD64D9FC5EB8"

This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
--------------enig4F4FDF185E23DD64D9FC5EB8
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Hello, all. I have push some work for paravirtualised GRUB2 to XEN
branch: http://bzr.savannah.gnu.org/lh/grub/branches/xen. Currently only
x86-64 (I'm much less interested in i386). What works:
- modules, normal mode, console, date, all of the all-platform commands
(not all are tested though)
What doesn't (not implemented):
-network
-disks
-loaders
-most of platform-specific commands (well as expected, xen is a separate
platforms so its platform-specific commands will be different if any)
What's kludgy:
-Finding and checking xen headers (/usr/include hardcoded, no checking,
also it's so annoying that xen mixes its kernels intended for standalone
environment with standard userspace headers)
-Stack. Right now I just allocate space in .bss.
-Heap. Likewise.

--=20
Regards
Vladimir '=CF=86-coder/phcoder' Serbinenko



--------------enig4F4FDF185E23DD64D9FC5EB8
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iF4EAREKAAYFAk7EW1cACgkQNak7dOguQgn46AD+LMykk+ptgBcMRvxdtxUTCoAP
2O2JzrifP+zrY2wPWhYA/iBAWnUnI+W84AbHx2PoiGE2Y2n13G4x76q/eX6IKC1v
=V7rX
-----END PGP SIGNATURE-----

--------------enig4F4FDF185E23DD64D9FC5EB8--



--===============1849551276==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1849551276==--



From xen-devel-bounces@lists.xensource.com Wed Nov 16 17:05:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 17:05:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQqPq-0002ZW-WA; Wed, 16 Nov 2011 17:05:23 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQqKc-0002IS-Oe
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 17:00:23 -0800
X-Env-Sender: samuel.thibault@ens-lyon.org
X-Msg-Ref: server-6.tower-174.messagelabs.com!1321491591!1866137!1
X-Originating-IP: [80.67.169.19]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18173 invoked from network); 17 Nov 2011 00:59:51 -0000
Received: from solo.fdn.fr (HELO solo.fdn.fr) (80.67.169.19)
	by server-6.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 17 Nov 2011 00:59:51 -0000
Received: from type.ipv6 (youpi.is-a-geek.org [80.67.176.89])
	(using TLSv1 with cipher AES256-SHA (256/256 bits))
	(Client did not present a certificate)
	by solo.fdn.fr (Postfix) with ESMTPS id 5E2F6444C6;
	Thu, 17 Nov 2011 01:59:50 +0100 (CET)
Received: from samy by type.ipv6 with local (Exim 4.77)
	(envelope-from <samuel.thibault@ens-lyon.org>)
	id 1RQqKT-0000Up-I9; Thu, 17 Nov 2011 01:59:49 +0100
Date: Thu, 17 Nov 2011 01:59:49 +0100
From: Samuel Thibault <samuel.thibault@ens-lyon.org>
To: Vladimir =?utf-8?Q?'=CF=86-coder=2Fphcoder'?= Serbinenko
	<phcoder@gmail.com>
Message-ID: <20111117005949.GR4275@type.famille.thibault.fr>
Mail-Followup-To: Samuel Thibault <samuel.thibault@ens-lyon.org>,
	Vladimir =?utf-8?Q?'=CF=86-coder=2Fphcoder'?= Serbinenko
	<phcoder@gmail.com>, 
	The development of GRUB 2 <grub-devel@gnu.org>,
	xen-devel@lists.xensource.com
References: <4EC45B57.80602@gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <4EC45B57.80602@gmail.com>
User-Agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30)
Cc: The development of GRUB 2 <grub-devel@gnu.org>,
	xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: [Grub2] Xen branches
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Nice!

Vladimir 'Ï†-coder/phcoder' Serbinenko, le Thu 17 Nov 2011 01:54:47 +0100, a Ã©crit :
> -network
> -disks

It can be useful to just re-use the drivers from Mini-OS, but you may
want to reimplement them.

> -loaders

I strongly recommend to re-use libxc's code, and use my kexec code to
actually switch from within the PV domain.

Samuel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 19:35:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 19:35:21 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQsky-0006OJ-JT; Wed, 16 Nov 2011 19:35:21 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQsjv-0006BC-9T
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 19:34:15 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1321500852!4529089!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4786 invoked from network); 17 Nov 2011 03:34:12 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 03:34:12 -0000
X-IronPort-AV: E=Sophos;i="4.69,524,1315180800"; 
   d="scan'208";a="8975926"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Nov 2011 03:34:10 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 17 Nov 2011 03:34:10 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RQsjq-0002Lc-Fs;
	Thu, 17 Nov 2011 03:34:10 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RQsjq-0006Dd-FO;
	Thu, 17 Nov 2011 03:34:10 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9808-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 17 Nov 2011 03:34:10 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.0-testing test] 9808: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9808 xen-4.0-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9808/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     11 guest-localmigrate         fail REGR. vs. 9757

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  8 debian-fixup                fail never pass
 test-amd64-i386-xl-multivcpu 15 guest-stop                   fail   never pass
 test-amd64-amd64-xl          15 guest-stop                   fail   never pass
 test-amd64-i386-xl           15 guest-stop                   fail   never pass
 test-i386-i386-xl            15 guest-stop                   fail   never pass
 test-amd64-i386-xl-credit2    5 xen-boot                     fail    like 9757
 test-amd64-i386-rhel6hvm-amd  7 redhat-install               fail   never pass
 test-amd64-i386-rhel6hvm-intel  7 redhat-install               fail never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win         7 windows-install              fail   never pass
 test-amd64-i386-xl-win-vcpus1  7 windows-install              fail  never pass
 test-amd64-amd64-xl-win       7 windows-install              fail   never pass

version targeted for testing:
 xen                  c16b0a997a05
baseline version:
 xen                  cdff7052bad8

------------------------------------------------------------
People who touched revisions under test:
  Gianluca Guida <gianluca.guida@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Mark Langsdorf <mark.langsdorf@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   21553:c16b0a997a05
tag:         tip
user:        Gianluca Guida <gianluca.guida@citrix.com>
date:        Wed Nov 16 16:40:05 2011 +0000
    
    [shadow] Disable higher level pagetables early unshadow only when the "process dying" hypercall is used.
    
    This patch fixes a performance problem in fully virtualized guests.
    
    Signed-off-by: Gianluca Guida <gianluca.guida@citrix.com>
    Tested-by: Jan Beulich <jbeulich@suse.com>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   24148:3ecc8fef4281
    xen-unstable date:        Wed Nov 16 15:19:33 2011 +0000
    
    
changeset:   21552:cdff7052bad8
user:        Mark Langsdorf <mark.langsdorf@amd.com>
date:        Sat Nov 12 16:15:19 2011 +0000
    
    x86/amd: Eliminate cache flushing when entering C3 on select AMD processors
    
    AMD Fam15h processors have a shared cache. It does not need=
    to be be flushed when entering C3 and doing so causes reduces
    performance. Modify acpi_processor_power_init_bm_check to
    prevent these processors from flushing when entering C3.
    
    Signed-off-by: Mark Langsdorf <mark.langsdorf@amd.com>
    xen-unstable changeset:   23511:450f1d198e1e
    xen-unstable date:        Tue Jun 14 12:46:29 2011 +0100
    Committed-by: Keir Fraser <keir@xen.org>
    
    
(qemu changes not included)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 19:46:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 19:46:50 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQsw6-0006vc-C9; Wed, 16 Nov 2011 19:46:50 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQsvJ-0006j0-JZ
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 19:46:02 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1321501544!45964404!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25415 invoked from network); 17 Nov 2011 03:45:44 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 03:45:44 -0000
X-IronPort-AV: E=Sophos;i="4.69,524,1315180800"; 
   d="scan'208";a="8976000"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Nov 2011 03:45:37 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 17 Nov 2011 03:45:36 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RQsuu-0002PI-LZ;
	Thu, 17 Nov 2011 03:45:36 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RQsuu-0005hg-L8;
	Thu, 17 Nov 2011 03:45:36 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9810-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 17 Nov 2011 03:45:36 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9810: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9810 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9810/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-pv             5 xen-boot                   fail REGR. vs. 9756
 test-amd64-amd64-pv           5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-xl-multivcpu  5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-pv            5 xen-boot                   fail REGR. vs. 9756
 test-amd64-amd64-xl-pcipt-intel  5 xen-boot                fail REGR. vs. 9756
 test-amd64-i386-rhel6hvm-intel  5 xen-boot                 fail REGR. vs. 9756
 test-i386-i386-xl             5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-rhel6hvm-amd  5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-xl-credit2    5 xen-boot                   fail REGR. vs. 9756
 test-amd64-amd64-xl-sedf      5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-xl            5 xen-boot                   fail REGR. vs. 9756
 test-amd64-amd64-xl           5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-xl-win-vcpus1  5 xen-boot                  fail REGR. vs. 9756
 test-amd64-amd64-win          5 xen-boot                   fail REGR. vs. 9756
 test-i386-i386-xl-win         5 xen-boot                   fail REGR. vs. 9756
 test-amd64-amd64-pair         8 xen-boot/dst_host          fail REGR. vs. 9756
 test-amd64-amd64-pair         7 xen-boot/src_host          fail REGR. vs. 9756
 test-i386-i386-pair           7 xen-boot/src_host          fail REGR. vs. 9756
 test-i386-i386-pair           8 xen-boot/dst_host          fail REGR. vs. 9756
 test-amd64-i386-pair          8 xen-boot/dst_host          fail REGR. vs. 9756
 test-amd64-i386-pair          7 xen-boot/src_host          fail REGR. vs. 9756
 test-amd64-i386-win-vcpus1    5 xen-boot                   fail REGR. vs. 9756
 test-amd64-amd64-xl-win       5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-win           5 xen-boot                   fail REGR. vs. 9756
 test-i386-i386-win            5 xen-boot                   fail REGR. vs. 9756

version targeted for testing:
 xen                  51f58b210447
baseline version:
 xen                  9702967e89dd

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Gianluca Guida <gianluca.guida@citrix.com>
  Ian Campbell <ian.campbell@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Stefano Stabellini <stefano.stabellini@eu.citrix.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        fail    
 test-amd64-i386-pair                                         fail    
 test-i386-i386-pair                                          fail    
 test-amd64-amd64-pv                                          fail    
 test-amd64-i386-pv                                           fail    
 test-i386-i386-pv                                            fail    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   23186:51f58b210447
tag:         tip
user:        Jan Beulich <jbeulich@suse.com>
date:        Wed Nov 16 16:39:02 2011 +0000
    
    x86-64/test_x86_emulate: fix blowfish test
    
    Incorrect register usage in the _start() wrapper caused the 64-bit
    execution emulation to fail.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   24149:753b21aa4087
    xen-unstable date:        Wed Nov 16 15:20:25 2011 +0000
    
    
changeset:   23185:efd132eee40c
user:        Gianluca Guida <gianluca.guida@citrix.com>
date:        Wed Nov 16 16:38:27 2011 +0000
    
    [shadow] Disable higher level pagetables early unshadow only when the "process dying" hypercall is used.
    
    This patch fixes a performance problem in fully virtualized guests.
    
    Signed-off-by: Gianluca Guida <gianluca.guida@citrix.com>
    Tested-by: Jan Beulich <jbeulich@suse.com>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   24148:3ecc8fef4281
    xen-unstable date:        Wed Nov 16 15:19:33 2011 +0000
    
    
changeset:   23184:4a91cf045893
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Wed Nov 16 16:37:49 2011 +0000
    
    xen: avoid crash enabling turbo mode
    
    On a system which has not had P-state information pushed down into the
    hypervisor running "xenpm enable-turbo-mode" will reliably crash the
    host.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Jan Beulich <jbeulich@suse.com>
    xen-unstable changeset:   24144:cd3ef25f207a
    xen-unstable date:        Tue Nov 15 14:24:38 2011 +0100
    Committed-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23183:98ba0aceaf30
user:        Stefano Stabellini <stefano.stabellini@eu.citrix.com>
date:        Wed Nov 16 16:33:58 2011 +0000
    
    x86: re-inject emulated level pirqs in PV on HVM guests if still asserted
    
    PV on HVM guests can loose level interrupts coming from emulated
    devices if they have been remapped onto event channels.  The reason is
    that we are missing the code to inject a pirq again in the guest when
    the guest EOIs it, if it corresponds to an emulated level interrupt
    and the interrupt is still asserted.
    
    Fix this issue and also return error when the guest tries to get the
    irq_status of a non-existing pirq.
    
    Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   24007:0526644ad2a6
    xen-unstable date:        Thu Oct 27 16:07:18 2011 +0100
    
    
changeset:   23182:9702967e89dd
user:        Andrew Cooper <andrew.cooper3@citrix.com>
date:        Sat Nov 12 16:14:02 2011 +0000
    
    Revert c/s 23666:b96f8bdcaa15 KEXEC: disconnect all PCI devices from the PCI bus on crash
    
    It turns out that this causes all mannor of problems on certain
    motherboards (so far with no pattern I can discern)
    
    Problems include:
    * Hanging forever checking hlt instruction.
    * Panics when trying to change switch root device
    * Drivers hanging when trying to check for interrupts.
    
    From: Andrew Cooper <andrew.cooper3@citrix.com>
    Signed-off-by: Keir Fraser <keir@xen.org>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   24137:0844b17df7a9
    xen-unstable date:        Fri Nov 11 18:14:35 2011 +0000
    
    
(qemu changes not included)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 21:41:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 21:41:11 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQuik-0000kk-Iz; Wed, 16 Nov 2011 21:41:10 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQuhr-0000Xo-4A
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 21:40:15 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1321508411!4534506!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13087 invoked from network); 17 Nov 2011 05:40:11 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 05:40:11 -0000
X-IronPort-AV: E=Sophos;i="4.69,524,1315180800"; 
   d="scan'208";a="8976887"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Nov 2011 05:40:10 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 17 Nov 2011 05:40:10 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RQuhm-00032u-E3;
	Thu, 17 Nov 2011 05:40:10 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RQuhm-0006Gj-DY;
	Thu, 17 Nov 2011 05:40:10 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9817-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 17 Nov 2011 05:40:10 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9817: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9817 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9817/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf      5 xen-boot                   fail REGR. vs. 9806

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  dbdc840f8f62
baseline version:
 xen                  644ca5d3ec43

------------------------------------------------------------
People who touched revisions under test:
  Ian Campbell <ian.campbell@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   24154:dbdc840f8f62
tag:         tip
user:        Keir Fraser <keir@xen.org>
date:        Wed Nov 16 18:21:14 2011 +0000
    
    elf: Fix Elf64 types and structs to match the specification.
    
    The layouts were actually correct, but the type names were a bit
    messed up.
    
    Original patch by Volker Eckert <volker.eckert@citrix.com>
    Signed-off-by: Keir Fraser <keir@xen.org>
    
    
changeset:   24153:644ca5d3ec43
user:        Jan Beulich <jbeulich@suse.com>
date:        Wed Nov 16 16:04:31 2011 +0000
    
    x86/emulator: add feature checks for newer instructions
    
    Certain instructions were introduced only after the i686 or original
    x86-64 architecture, so we should not try to emulate them if the guest
    is not seeing the respective feature enabled (or, worse, if the
    underlying hardware doesn't support them). This affects fisttp,
    movnti, and cmpxchg16b.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Signed-off-by: Keir Fraser <keir@xen.org>
    
    
========================================
commit 52834188eedfbbca5636fd869d4c86b3b3044439
Author: Ian Campbell <ian.campbell@citrix.com>
Date:   Tue Nov 1 18:42:55 2011 +0000

    qemu-xen: remove i386-dm/README.hvm-pv-magic-ioport-disable
    
    I have just proposed a patch to add this to xen-unstable.hg as
    docs/misc/hvm-emulated-unplug.markdown. This repo is not a place where people
    look for docs, plus we are transitioning to upstream qemu.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 21:53:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 21:53:20 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQuuV-0001Mv-0a; Wed, 16 Nov 2011 21:53:19 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQuth-00019z-DR
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 21:52:29 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1321509145!1892294!1
X-Originating-IP: [80.70.172.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29431 invoked from network); 17 Nov 2011 05:52:26 -0000
Received: from dgate10.ts.fujitsu.com (HELO dgate10.ts.fujitsu.com)
	(80.70.172.49)
	by server-5.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 05:52:26 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Message-ID:Date:From:Organization:
	User-Agent:MIME-Version:To:Subject:References:In-Reply-To:
	Content-Type:Content-Transfer-Encoding;
	b=sPJV5WsodJDDcOUHhEEFyKAGcpJNXDRri36ta96FC0J38kqdMLRS1uHP
	FTKZNv5ju7jNVmRZgCw2Q6Re9I3ExbaxXnIOQ1mkoSVdLAykH7zl1zSLo
	MHIuDaElPsypi/j0OgYk/BGod+yNmuenxTXYbgHRu0DintA4nGErwp2sy
	f6k8WS3yx0CCi9sxkLhywn/Q24IG4HN7TkxgBLWBGy4bU2tVgArh21PtY
	HcdnvDkgVweN2AZtiQ2/9dJ/c+W8i;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1321509146; x=1353045146;
	h=message-id:date:from:mime-version:to:subject:references:
	in-reply-to:content-transfer-encoding;
	bh=NQkz5Y1iP+kBVAWUdnslSi6SzHpLvb6DWqnviDFI7Vo=;
	b=W87CZysYboDkTpvxWpylv9+GFAxDB00sNTmLl8S5FCd+8U+oHsY26Nx/
	LeOrVKs1R/f3lbY5qbAq1q6i4q4Q7PLMWaIzzUzbqDh0qkTbSqxWztCQn
	URcCtfmISHvB/6zGlqQgEN8/yPXYe/itGfKDSmDmGR4sHxNxQDT5f7ZPP
	+I70wM7oZjx38FjE+QgOzlQYqGwJmmj8HSW0hLTITuWw4fjhGKntqmdyR
	RJdi8/kj6ZAWfqrqopNTGo+IN1P9o;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,524,1315173600"; d="scan'208";a="93328339"
Received: from abgdgate40u.abg.fsc.net ([172.25.138.90])
	by dgate10u.abg.fsc.net with ESMTP; 17 Nov 2011 06:52:26 +0100
X-IronPort-AV: E=Sophos;i="4.69,524,1315173600"; d="scan'208";a="123602211"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate40u.abg.fsc.net with ESMTP; 17 Nov 2011 06:52:25 +0100
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id AF4983FF355
	for <xen-devel@lists.xensource.com>;
	Thu, 17 Nov 2011 06:52:25 +0100 (CET)
Message-ID: <4EC4A119.8070209@ts.fujitsu.com>
Date: Thu, 17 Nov 2011 06:52:25 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
Organization: Fujitsu Technology Solutions
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20111010 Iceowl/1.0b2 Icedove/3.1.15
MIME-Version: 1.0
To: xen-devel@lists.xensource.com
Subject: Re: [Xen-devel] [PATCH] add xl sched-credit2 sub command
References: <123596ca8b29d3fd9922.1321279510@nehalem1>
In-Reply-To: <123596ca8b29d3fd9922.1321279510@nehalem1>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 11/14/2011 03:05 PM, Juergen Gross wrote:
> Adds the sched-credit2 sub command to xl.
>
> Signed-off-by: juergen.gross@ts.fujitsu.com

Long options are missing (I just copied it from sched-credit).

I'll repost a revised version of this patch as part of a series including
support of cpupools and sched-sedf.


Juergen

-- 
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: juergen.gross@ts.fujitsu.com
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 22:06:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 22:06:14 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQv6z-0001wy-MD; Wed, 16 Nov 2011 22:06:14 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQv2Q-0001gf-UX
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 22:01:34 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1321509669!48605923!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26799 invoked from network); 17 Nov 2011 06:01:09 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 06:01:09 -0000
X-IronPort-AV: E=Sophos;i="4.69,524,1315180800"; 
   d="scan'208";a="8977116"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Nov 2011 06:01:27 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 17 Nov 2011 06:01:27 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RQv2M-0003AM-VV;
	Thu, 17 Nov 2011 06:01:27 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RQv2B-0000Wb-LD;
	Thu, 17 Nov 2011 06:01:15 +0000
Date: Thu, 17 Nov 2011 06:01:15 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <20111117060115.GA1901@spongy.cam.xci-test.com>
References: <1320695635-4208-1-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
In-Reply-To: <1320695635-4208-1-git-send-email-jean.guyader@eu.citrix.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: "jwcart2@tycho.nsa.gov" <jwcart2@tycho.nsa.gov>,
	Jean Guyader <Jean.Guyader@citrix.com>
Subject: [Xen-devel] Re: [PATCH] xsm: Add support for HVMOP_track_dirty_vram.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 07/11 07:53, Jean Guyader wrote:
> 
> Xen try to inforce the xsm policy when a HVMOP_track_dirty_vram
> is received (xen/arch/x86/hvm/hvm.c:3637). It was failing because
> in flask_hvmcontext, xsm didn't have any case for this operation.
> 
> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>

Can this patch go to 4.1 as well?

Thanks,
Jean

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Nov 16 22:07:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 16 Nov 2011 22:07:41 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQv8O-0002KT-S1; Wed, 16 Nov 2011 22:07:40 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQv2q-0001gw-AP
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 22:02:03 -0800
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1321509686!48802389!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8928 invoked from network); 17 Nov 2011 06:01:26 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 06:01:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,525,1315180800"; 
   d="scan'208";a="8977119"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Nov 2011 06:01:53 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 17 Nov 2011 06:01:53 +0000
Received: from spongy.cam.xci-test.com ([10.80.248.53])	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<jean.guyader@eu.citrix.com>)	id 1RQv2n-0003Af-1I;
	Thu, 17 Nov 2011 06:01:53 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RQv2b-0000Wj-Mr;
	Thu, 17 Nov 2011 06:01:41 +0000
Date: Thu, 17 Nov 2011 06:01:41 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <20111117060141.GB1901@spongy.cam.xci-test.com>
References: <1320945463-13844-1-git-send-email-jean.guyader@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
In-Reply-To: <1320945463-13844-1-git-send-email-jean.guyader@eu.citrix.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: Jean Guyader <Jean.Guyader@citrix.com>,
	"JBeulich@suse.com" <JBeulich@suse.com>
Subject: [Xen-devel] Re: [PATCH] Hypercall continuation cancelation in
 compat mode for XENMEM_get/set_pod_target.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 10/11 05:17, Jean Guyader wrote:
> 
> If copy_to_guest failed in the compat code after a continuation as been
> done in the native code we need to cancel it so we won't reexecute the
> hypercall but return from the hypercall with the appropriate error.
> 
> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>

Did that make it into 4.1?

Jean

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 00:03:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 00:03:25 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQwwN-0004ZB-UA; Thu, 17 Nov 2011 00:03:23 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQwvO-0004MP-L4
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 00:02:23 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1321516938!4585184!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18416 invoked from network); 17 Nov 2011 08:02:19 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-7.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 17 Nov 2011 08:02:19 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 17 Nov 2011 08:02:18 +0000
Message-Id: <4EC4CD99020000780006178D@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 
Date: Thu, 17 Nov 2011 08:02:16 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: <Jean.Guyader@citrix.com>, "Jean Guyader" <jean.guyader@eu.citrix.com>,
	"Keir Fraser" <keir@xen.org>
References: <1320945463-13844-1-git-send-email-jean.guyader@eu.citrix.com>
	<20111117060141.GB1901@spongy.cam.xci-test.com>
In-Reply-To: <20111117060141.GB1901@spongy.cam.xci-test.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH] Hypercall continuation cancelation in
 compat mode for XENMEM_get/set_pod_target.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 17.11.11 at 07:01, Jean Guyader <jean.guyader@eu.citrix.com> wrote:
> On 10/11 05:17, Jean Guyader wrote:
>>=20
>> If copy_to_guest failed in the compat code after a continuation as been
>> done in the native code we need to cancel it so we won't reexecute the
>> hypercall but return from the hypercall with the appropriate error.
>>=20
>> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
>=20
> Did that make it into 4.1?
>=20
> Jean

Not so far - Keir?

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 00:10:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 00:10:44 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQx3U-00051s-Kg; Thu, 17 Nov 2011 00:10:44 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQx30-0004qJ-WC
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 00:10:15 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1321517411!4586307!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10425 invoked from network); 17 Nov 2011 08:10:11 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-7.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 17 Nov 2011 08:10:11 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 17 Nov 2011 08:10:10 +0000
Message-Id: <4EC4CF70020000780006179B@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 
Date: Thu, 17 Nov 2011 08:10:08 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "jim burns" <jim_burn@bellsouth.net>
Subject: Re: [Xen-devel] BAR 0: cirrusfb load errors prevent hvm domu
	from getting resolutions above 800x600
References: <7877809.94pu0BOf0I@dell4550> <2018795.uE019qUBdA@dell4550>
	<CAP8Jb=r68A5j5FGFv=xePqM_n1PA8JiEUhxtjCxmMu2EvvCwEQ@mail.gmail.com>
	<3049363.ivXYWEmP59@dell4550>
In-Reply-To: <3049363.ivXYWEmP59@dell4550>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Flavio <fbcyborg@gmail.com>, xen-devel@lists.xensource.com,
	"Fajar A. Nugraha" <list@fajar.net>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 17.11.11 at 00:28, jim burns <jim_burn@bellsouth.net> wrote:

Sounds more like a kernel problem.

> <4>[    0.629101] vesafb: cannot reserve video memory at 0xf0000000

This doesn't tell what component did the reservation before this point,
but that's what he/you will need to find out. And then compare with
the cirrusfb case.

One significant difference of course is the DRM base fb driver in the
radeon case - to compare apples with apples, DRM should really be
removed from the picture.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 00:33:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 00:33:32 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQxPY-0006Qf-8Q; Thu, 17 Nov 2011 00:33:32 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQxNy-0006Cf-Tz
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 00:31:55 -0800
X-Env-Sender: jim_burn@bellsouth.net
X-Msg-Ref: server-4.tower-174.messagelabs.com!1321518710!1915194!1
X-Originating-IP: [66.94.237.136]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15306 invoked from network); 17 Nov 2011 08:31:51 -0000
Received: from nm3-vm0.access.bullet.mail.mud.yahoo.com (HELO
	nm3-vm0.access.bullet.mail.mud.yahoo.com) (66.94.237.136)
	by server-4.tower-174.messagelabs.com with SMTP;
	17 Nov 2011 08:31:51 -0000
Received: from [66.94.237.194] by nm3.access.bullet.mail.mud.yahoo.com with
	NNFMP; 17 Nov 2011 08:31:50 -0000
Received: from [66.94.237.102] by tm5.access.bullet.mail.mud.yahoo.com with
	NNFMP; 17 Nov 2011 08:31:50 -0000
Received: from [127.0.0.1] by omp1007.access.mail.mud.yahoo.com with NNFMP;
	17 Nov 2011 08:31:50 -0000
X-Yahoo-Newman-Id: 379108.32807.bm@omp1007.access.mail.mud.yahoo.com
Received: (qmail 51621 invoked from network); 17 Nov 2011 08:31:50 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bellsouth.net; s=s1024;
	t=1321518710; bh=g1zafPkqVRtZMpV6dQaqjsSVDbRCAhF2mKF7aumZQZU=;
	h=X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Received:From:To:Cc:Subject:Date:Message-ID:User-Agent:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Content-Type;
	b=LIixORRXdAERdo4oe6BWYmj+Grtragxpq81PnSXzn0tf5gBjSpsvi7zEmAVmY+jbR9I8MrC+0aGIxfEa23d425WEdRtZ3E7tj8D+94THSHeVFFDEGJU1RZCRqOy2lGoz18USjgCjC7oFv5angPMBnVkOtbQbINRz6YVf0DFOj1A=
X-Yahoo-Newman-Property: ymail-3
X-YMail-OSG: eO2mXvIVM1k2XS9OLquf3cl2k7JiB2ZPTsD8rwZwV8pfKc8
	FZxokY0dmo5JLES4_E2yjkh81a9wvWvHGoMvz5EW7tFI0U0dgXxnaFzBsLsM
	LnHEdKpFL_UKjrXKQmAyNRTwBDYpquiVb9xgiccqhtEwGLoHHddKuqfc7ChD
	VudbQiaktrS0ciKR09dGE_nUFd8IqvWfIEBMY5zrepGbId9_5IMqIv3c3G3b
	bCbO_dmeQWjPSsbRvbpLqegprcQai40MBYNYdOkOLlaxNko3.OiKCxlIy5qL
	.ihy.LPF1YIv7LsYNOmOeMa.odtiddse5EiTU0PHgVwZZAS8_k9paiWvoima
	nj9F9xUV4bxM6nC0.n0eGij2rvfFFdHgmyBX4M3yRE5cW0FxdbBGkehPr10.
	.zeWpuY5xyBvwa1xZSGCkLD527wBeIXBhhAEE
X-Yahoo-SMTP: g0AhWW2swBA2djJKuhuwxPlPqLrHlDrycdPnfR9kZNrpKCA-
Received: from dell4550.localnet (jim_burn@72.145.175.45 with plain)
	by smtp108.sbc.mail.mud.yahoo.com with SMTP;
	17 Nov 2011 00:31:50 -0800 PST
From: jim burns <jim_burn@bellsouth.net>
To: Jan Beulich <JBeulich@suse.com>, xen-devel@lists.xensource.com,
	xen-users@lists.xensource.com
Subject: Re: UNS: Re: [Xen-devel] BAR 0: cirrusfb load errors prevent hvm domu
	from getting resolutions above 800x600
Date: Thu, 17 Nov 2011 03:31:41 -0500
Message-ID: <1474452.Ubr0mjN0Wq@dell4550>
User-Agent: KMail/4.7.3 (Linux/2.6.37.6-0.9-default; KDE/4.7.3; i686; ; )
In-Reply-To: <4EC4CF70020000780006179B@nat28.tlf.novell.com>
References: <7877809.94pu0BOf0I@dell4550> <3049363.ivXYWEmP59@dell4550>
	<4EC4CF70020000780006179B@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Transfer-Encoding: 7Bit
Content-Type: text/plain; charset="us-ascii"
Cc: Flavio <fbcyborg@gmail.com>, "Fajar A. Nugraha" <list@fajar.net>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu November 17 2011, 8:10:08 AM, Jan Beulich wrote:
> >>> On 17.11.11 at 00:28, jim burns <jim_burn@bellsouth.net> wrote:
> Sounds more like a kernel problem.
> 
> > <4>[    0.629101] vesafb: cannot reserve video memory at 0xf0000000
> 
> This doesn't tell what component did the reservation before this point,
> but that's what he/you will need to find out. And then compare with
> the cirrusfb case.

I thought that's what this meant:

[    0.667812] vesafb: framebuffer at 0xf0000000, mapped to 
0xffffc90000580000, using 1875k, total 4096k

Looks like vesafb reserved it.

> One significant difference of course is the DRM base fb driver in the
> radeon case - to compare apples with apples, DRM should really be
> removed from the picture.

True. I was just pointing out that there is a mechanism for vesafb handing off 
control to another video driver:

<3>[  259.974310] fb: conflicting fb hw usage radeondrmfb vs VESA VGA - 
removing generic driver

Any ideas where to go from here? Thanx.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 00:38:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 00:38:12 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQxU4-0007Z4-5l; Thu, 17 Nov 2011 00:38:12 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQxOc-0006Ig-2Y
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 00:32:34 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1321518750!4527468!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2344 invoked from network); 17 Nov 2011 08:32:31 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-2.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 17 Nov 2011 08:32:31 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 17 Nov 2011 08:32:30 +0000
Message-Id: <4EC4D4AE02000078000617B3@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 
Date: Thu, 17 Nov 2011 08:32:30 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Stefano Stabellini" <stefano.stabellini@eu.citrix.com>,
	"Keir Fraser" <keir@xen.org>
Subject: Re: [Xen-devel] [xen-4.1-testing test] 9805: regressions -
 FAIL
References: <osstest-9805-mainreport@xen.org>
In-Reply-To: <osstest-9805-mainreport@xen.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: xen-devel@lists.xensource.com, ian.jackson@eu.citrix.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 16.11.11 at 23:23, xen.org <ian.jackson@eu.citrix.com> wrote:
> flight 9805 xen-4.1-testing real [real]
> http://www.chiark.greenend.org.uk/~xensrcts/logs/9805/=20
>=20
> Regressions :-(
>=20
> Tests which did not succeed and are blocking:
>  test-i386-i386-pv             5 xen-boot                   fail REGR. =
vs. 9756
>  test-amd64-amd64-xl-sedf      5 xen-boot                   fail REGR. =
vs. 9756
>  test-amd64-amd64-pv           5 xen-boot                   fail REGR. =
vs. 9756
>  test-amd64-i386-xl-multivcpu  5 xen-boot                   fail REGR. =
vs. 9756
>  test-amd64-i386-rhel6hvm-intel  5 xen-boot                 fail REGR. =
vs. 9756
>  test-amd64-i386-pv            5 xen-boot                   fail REGR. =
vs. 9756
>  test-amd64-amd64-xl-pcipt-intel  5 xen-boot                fail REGR. =
vs. 9756
>  test-i386-i386-xl             5 xen-boot                   fail REGR. =
vs. 9756
>  test-amd64-i386-xl-credit2    5 xen-boot                   fail REGR. =
vs. 9756
>  test-amd64-i386-rhel6hvm-amd  5 xen-boot                   fail REGR. =
vs. 9756
>  test-amd64-i386-xl            5 xen-boot                   fail REGR. =
vs. 9756
>  test-amd64-amd64-xl           5 xen-boot                   fail REGR. =
vs. 9756
>  test-amd64-i386-xl-win-vcpus1  5 xen-boot                  fail REGR. =
vs. 9756
>  test-amd64-amd64-win          5 xen-boot                   fail REGR. =
vs. 9756
>  test-i386-i386-xl-win         5 xen-boot                   fail REGR. =
vs. 9756
>  test-amd64-amd64-pair         8 xen-boot/dst_host          fail REGR. =
vs. 9756
>  test-amd64-amd64-pair         7 xen-boot/src_host          fail REGR. =
vs. 9756
>  test-i386-i386-pair           7 xen-boot/src_host          fail REGR. =
vs. 9756
>  test-i386-i386-pair           8 xen-boot/dst_host          fail REGR. =
vs. 9756
>  test-amd64-i386-pair          8 xen-boot/dst_host          fail REGR. =
vs. 9756
>  test-amd64-i386-pair          7 xen-boot/src_host          fail REGR. =
vs. 9756
>  test-amd64-i386-win-vcpus1    5 xen-boot                   fail REGR. =
vs. 9756
>  test-amd64-amd64-xl-win       5 xen-boot                   fail REGR. =
vs. 9756
>  test-amd64-i386-win           5 xen-boot                   fail REGR. =
vs. 9756
>  test-i386-i386-win            5 xen-boot                   fail REGR. =
vs. 9756

This is due to a bad backport of c/s 24007:0526644ad2a6: In -unstable,
evtchn_unmask() must be called with d->event_lock held, while in 4.1
the function acquires the lock (and now gets called with the lock already
held from do_physdev_op()'s case PHYSDEVOP_eoi). The change dates
back to 23573:584c2e5e03d9, which hardly is a candidate for backporting
(but maybe the locking change needs to be pulled out of there).

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 00:54:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 00:54:12 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQxjX-0008Hj-T6; Thu, 17 Nov 2011 00:54:11 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQxib-000857-SI
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 00:53:14 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1321519963!48823042!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5537 invoked from network); 17 Nov 2011 08:52:43 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 08:52:43 -0000
X-IronPort-AV: E=Sophos;i="4.69,525,1315180800"; 
   d="scan'208";a="8979704"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Nov 2011 08:53:10 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 17 Nov 2011 08:53:10 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RQxiY-0004IW-CR;
	Thu, 17 Nov 2011 08:53:10 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RQxiY-0006th-BF;
	Thu, 17 Nov 2011 08:53:10 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9827-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 17 Nov 2011 08:53:10 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.0-testing test] 9827: regressions - FAIL
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9827 xen-4.0-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9827/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     11 guest-localmigrate fail in 9808 REGR. vs. 9757

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf      5 xen-boot                     fail pass in 9808
 test-amd64-amd64-xl           9 guest-start                  fail pass in 9808

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  8 debian-fixup                fail never pass
 test-amd64-i386-xl           15 guest-stop                   fail   never pass
 test-i386-i386-xl            15 guest-stop                   fail   never pass
 test-amd64-i386-xl-multivcpu 15 guest-stop                   fail   never pass
 test-amd64-i386-xl-credit2   14 guest-localmigrate/x10    fail blocked in 9757
 test-amd64-i386-rhel6hvm-intel  7 redhat-install               fail never pass
 test-amd64-i386-rhel6hvm-amd  7 redhat-install               fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win         7 windows-install              fail   never pass
 test-amd64-amd64-xl-win       7 windows-install              fail   never pass
 test-amd64-i386-xl-win-vcpus1  7 windows-install              fail  never pass
 test-amd64-amd64-xl          15 guest-stop             fail in 9808 never pass
 test-amd64-i386-xl-credit2    5 xen-boot                fail in 9808 like 9757

version targeted for testing:
 xen                  c16b0a997a05
baseline version:
 xen                  cdff7052bad8

------------------------------------------------------------
People who touched revisions under test:
  Gianluca Guida <gianluca.guida@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Mark Langsdorf <mark.langsdorf@amd.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   21553:c16b0a997a05
tag:         tip
user:        Gianluca Guida <gianluca.guida@citrix.com>
date:        Wed Nov 16 16:40:05 2011 +0000
    
    [shadow] Disable higher level pagetables early unshadow only when the "process dying" hypercall is used.
    
    This patch fixes a performance problem in fully virtualized guests.
    
    Signed-off-by: Gianluca Guida <gianluca.guida@citrix.com>
    Tested-by: Jan Beulich <jbeulich@suse.com>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   24148:3ecc8fef4281
    xen-unstable date:        Wed Nov 16 15:19:33 2011 +0000
    
    
changeset:   21552:cdff7052bad8
user:        Mark Langsdorf <mark.langsdorf@amd.com>
date:        Sat Nov 12 16:15:19 2011 +0000
    
    x86/amd: Eliminate cache flushing when entering C3 on select AMD processors
    
    AMD Fam15h processors have a shared cache. It does not need=
    to be be flushed when entering C3 and doing so causes reduces
    performance. Modify acpi_processor_power_init_bm_check to
    prevent these processors from flushing when entering C3.
    
    Signed-off-by: Mark Langsdorf <mark.langsdorf@amd.com>
    xen-unstable changeset:   23511:450f1d198e1e
    xen-unstable date:        Tue Jun 14 12:46:29 2011 +0100
    Committed-by: Keir Fraser <keir@xen.org>
    
    
(qemu changes not included)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 01:09:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 01:09:08 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQxxy-0000SN-1S; Thu, 17 Nov 2011 01:09:06 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQxvy-0000Dh-RR
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 01:07:20 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1321520818!1894506!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25424 invoked from network); 17 Nov 2011 09:06:59 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 09:06:59 -0000
Received: by wwp14 with SMTP id 14so2029466wwp.24
	for <xen-devel@lists.xensource.com>;
	Thu, 17 Nov 2011 01:06:58 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=wlgArkE5T8d0xIia/EZ82+QEUk3PEIXQhxaWlIoz8zo=;
	b=BYU2Hovj2tyX9ok3DR7fBCgfJ47MwStmpPf06pZdpzeii+oEpH3tsvPuGXrpDgLCkA
	tMjtbRO6jGR3MAKO3Lzkg7NyQu/BsyMYJnyma9gGbrNI9RGmWYR9uuPbVPV3yz5jndQb
	1NoJ1oHAVIXh/tj785pdWroqjIGwUVvJHVVPE=
Received: by 10.216.135.79 with SMTP id t57mr6556709wei.4.1321520818562;
	Thu, 17 Nov 2011 01:06:58 -0800 (PST)
Received: from [192.168.1.71]
	(host86-129-245-239.range86-129.btcentralplus.com. [86.129.245.239])
	by mx.google.com with ESMTPS id eu16sm35973059wbb.7.2011.11.17.01.06.54
	(version=SSLv3 cipher=OTHER); Thu, 17 Nov 2011 01:06:56 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Thu, 17 Nov 2011 09:06:51 +0000
Subject: Re: [Xen-devel] [xen-4.1-testing test] 9805: regressions - FAIL
From: Keir Fraser <keir.xen@gmail.com>
To: Jan Beulich <JBeulich@suse.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Message-ID: <CAEA7F2B.250F3%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [xen-4.1-testing test] 9805: regressions - FAIL
Thread-Index: AcylCD5G26fShBXPMkaLaJsf3L/nAw==
In-Reply-To: <4EC4D4AE02000078000617B3@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: xen-devel@lists.xensource.com, Ian Jackson <Ian.Jackson@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 17/11/2011 08:32, "Jan Beulich" <JBeulich@suse.com> wrote:

> This is due to a bad backport of c/s 24007:0526644ad2a6: In -unstable,
> evtchn_unmask() must be called with d->event_lock held, while in 4.1
> the function acquires the lock (and now gets called with the lock already
> held from do_physdev_op()'s case PHYSDEVOP_eoi). The change dates
> back to 23573:584c2e5e03d9, which hardly is a candidate for backporting
> (but maybe the locking change needs to be pulled out of there).

Interestingly, Ubuntu's 4.1 fix has exactly the same problem.

I'll revert the patch until someone has time to actually implement and test
a working patch against our vanilla 4.1-testing tree.

 -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 01:10:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 01:10:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQxze-0000pk-Uq; Thu, 17 Nov 2011 01:10:50 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQxwY-0000ER-6p
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 01:07:39 -0800
X-Env-Sender: samuel.thibault@ens-lyon.org
X-Msg-Ref: server-5.tower-21.messagelabs.com!1321520855!3007459!1
X-Originating-IP: [80.67.169.19]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9258 invoked from network); 17 Nov 2011 09:07:35 -0000
Received: from solo.fdn.fr (HELO solo.fdn.fr) (80.67.169.19)
	by server-5.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 17 Nov 2011 09:07:35 -0000
Received: from type.ipv6 (youpi.is-a-geek.org [80.67.176.89])
	(using TLSv1 with cipher AES256-SHA (256/256 bits))
	(Client did not present a certificate)
	by solo.fdn.fr (Postfix) with ESMTPS id 972BC443FF;
	Thu, 17 Nov 2011 10:07:34 +0100 (CET)
Received: from samy by type.ipv6 with local (Exim 4.77)
	(envelope-from <samuel.thibault@ens-lyon.org>)
	id 1RQxwO-0002G4-UJ; Thu, 17 Nov 2011 10:07:28 +0100
Date: Thu, 17 Nov 2011 10:07:28 +0100
From: Samuel Thibault <samuel.thibault@ens-lyon.org>
To: Vladimir =?utf-8?Q?'=CF=86-coder=2Fphcoder'?= Serbinenko
	<phcoder@gmail.com>
Message-ID: <20111117090728.GX4275@type.famille.thibault.fr>
Mail-Followup-To: Samuel Thibault <samuel.thibault@ens-lyon.org>,
	Vladimir =?utf-8?Q?'=CF=86-coder=2Fphcoder'?= Serbinenko
	<phcoder@gmail.com>, 
	The development of GRUB 2 <grub-devel@gnu.org>,
	xen-devel@lists.xensource.com
References: <4EC45B57.80602@gmail.com>
	<20111117005949.GR4275@type.famille.thibault.fr>
	<4EC4681E.1070104@gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <4EC4681E.1070104@gmail.com>
User-Agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30)
Cc: The development of GRUB 2 <grub-devel@gnu.org>,
	xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: [Grub2] Xen branches
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Vladimir 'Ï†-coder/phcoder' Serbinenko, le Thu 17 Nov 2011 02:49:18 +0100, a Ã©crit :
> On 17.11.2011 01:59, Samuel Thibault wrote:
> > Nice!
> Thanks.
> > Vladimir 'Ï†-coder/phcoder' Serbinenko, le Thu 17 Nov 2011 01:54:47 +0100, a Ã©crit :
> >> -network
> >> -disks
> > It can be useful to just re-use the drivers from Mini-OS, but you may
> > want to reimplement them.
> >
> They don't seem to be difficult to implement judging from the spec.

Well, the evil lies in the details :)

> On the other hand making MiniOS building system work nicely with ours
> sounds like hell.

Probably, indeed. Grub1 was not too hard because its building system was
quite simple.

> >> -loaders
> > I strongly recommend to re-use libxc's code, and use my kexec code to
> > actually switch from within the PV domain.
> >
> I'm not that far yet. But I've seen kexec call and I suppose it can be
> used pretty straighforwardely.

Ok.

Samuel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 01:16:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 01:16:17 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQy4v-0001Gu-Rb; Thu, 17 Nov 2011 01:16:17 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQy4U-00014c-87
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 01:15:50 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1321521346!3008985!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6445 invoked from network); 17 Nov 2011 09:15:46 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-5.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 09:15:46 -0000
Received: by wyg24 with SMTP id 24so2276668wyg.30
	for <xen-devel@lists.xensource.com>;
	Thu, 17 Nov 2011 01:15:46 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=yi1Q/HLa6jUIie1hSTwmuhX8wVtrVHyTWCHlnMaxIVc=;
	b=mCh7LfeCPwG4zE8cDEOwnP8Rlgw/en0qQq1INioC9cOf7dRP195PcHUvGR1TM4QQHo
	WiuuoiVVmSKEGw+eVCd3WKzP1p6+vsEgpKC9A+1Kph3GEShhiLHdXhhc3jae6iPnzVFS
	7eqELM/n2+N9usVIP6pSebYRJz/mkM/06i9TQ=
Received: by 10.216.135.91 with SMTP id t69mr6227328wei.63.1321521346402;
	Thu, 17 Nov 2011 01:15:46 -0800 (PST)
Received: from [192.168.1.3] (host86-129-245-239.range86-129.btcentralplus.com.
	[86.129.245.239])
	by mx.google.com with ESMTPS id a27sm35981135wbp.16.2011.11.17.01.15.42
	(version=SSLv3 cipher=OTHER); Thu, 17 Nov 2011 01:15:45 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Thu, 17 Nov 2011 09:15:35 +0000
Subject: Re: [Xen-devel] Re: [PATCH] xsm: Add support for
	HVMOP_track_dirty_vram.
From: Keir Fraser <keir@xen.org>
To: Jean Guyader <jean.guyader@eu.citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CAEA8137.343AD%keir@xen.org>
Thread-Topic: [Xen-devel] Re: [PATCH] xsm: Add support for
	HVMOP_track_dirty_vram.
Thread-Index: AcylCXaavltQN47KukmxgX19MbDw5g==
In-Reply-To: <20111117060115.GA1901@spongy.cam.xci-test.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: "jwcart2@tycho.nsa.gov" <jwcart2@tycho.nsa.gov>,
	Jean Guyader <Jean.Guyader@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 17/11/2011 06:01, "Jean Guyader" <jean.guyader@eu.citrix.com> wrote:

> On 07/11 07:53, Jean Guyader wrote:
>> 
>> Xen try to inforce the xsm policy when a HVMOP_track_dirty_vram
>> is received (xen/arch/x86/hvm/hvm.c:3637). It was failing because
>> in flask_hvmcontext, xsm didn't have any case for this operation.
>> 
>> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> 
> Can this patch go to 4.1 as well?

Done.

> Thanks,
> Jean
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 01:17:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 01:17:10 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQy5m-0001eA-BN; Thu, 17 Nov 2011 01:17:10 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQy4W-00014d-Sa
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 01:15:53 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1321521346!3008985!2
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6697 invoked from network); 17 Nov 2011 09:15:49 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-5.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 09:15:49 -0000
Received: by mail-wy0-f171.google.com with SMTP id 24so2276668wyg.30
	for <xen-devel@lists.xensource.com>;
	Thu, 17 Nov 2011 01:15:49 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=O0KeFDVHcPOGEeoyL+SQg0eWTS64r34h5MayOAteuv4=;
	b=AyyNvcVZpmqRBFI3uJnQcLcYO12Y6EdaLHN/AArKX5tERtvm3xHM2S5SuxYtsLyke+
	i/IY0dSh2/wnsYlWL1bwqkF/yfj06WragKr0atZQED0J9IWIVJ3i2jfWhOS+Qm0fVUiQ
	PYrPL8wRBFP1ZhbMOGJA6mph36S8FlXyfQb6k=
Received: by 10.227.206.81 with SMTP id ft17mr22320188wbb.23.1321521349299;
	Thu, 17 Nov 2011 01:15:49 -0800 (PST)
Received: from [192.168.1.3] (host86-129-245-239.range86-129.btcentralplus.com.
	[86.129.245.239])
	by mx.google.com with ESMTPS id a27sm35981135wbp.16.2011.11.17.01.15.47
	(version=SSLv3 cipher=OTHER); Thu, 17 Nov 2011 01:15:48 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Thu, 17 Nov 2011 09:15:46 +0000
Subject: Re: [Xen-devel] Re: [PATCH] Hypercall continuation cancelation in
	compat mode for XENMEM_get/set_pod_target.
From: Keir Fraser <keir@xen.org>
To: Jean Guyader <jean.guyader@eu.citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CAEA8142.343AE%keir@xen.org>
Thread-Topic: [Xen-devel] Re: [PATCH] Hypercall continuation cancelation in
	compat mode for XENMEM_get/set_pod_target.
Thread-Index: AcylCX0oQBnb3M0cgka6/3QTLl+0gQ==
In-Reply-To: <20111117060141.GB1901@spongy.cam.xci-test.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: "JBeulich@suse.com" <JBeulich@suse.com>,
	Jean Guyader <Jean.Guyader@citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 17/11/2011 06:01, "Jean Guyader" <jean.guyader@eu.citrix.com> wrote:

> On 10/11 05:17, Jean Guyader wrote:
>> 
>> If copy_to_guest failed in the compat code after a continuation as been
>> done in the native code we need to cancel it so we won't reexecute the
>> hypercall but return from the hypercall with the appropriate error.
>> 
>> Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
> 
> Did that make it into 4.1?

Done.

> Jean
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 01:21:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 01:21:12 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQy9f-00024f-Vm; Thu, 17 Nov 2011 01:21:12 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQy90-0001s9-To
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 01:20:31 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1321521625!3485435!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13798 invoked from network); 17 Nov 2011 09:20:26 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 09:20:26 -0000
Received: by wwp14 with SMTP id 14so2048894wwp.24
	for <xen-devel@lists.xensource.com>;
	Thu, 17 Nov 2011 01:20:25 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=uvbr8N+AWZJAmpMf2Qo+89gqmvg+gA6LoeHEugXKuM4=;
	b=F/i/8SWHRXCWJl1FQysTa+gP1zmcVA3GB2qLehysHFQ/bpC6xkO7Q7RO8wJNfRGNiT
	7QvolF9Cop4fHQyeZ/WXy2U2kO5V39kHjWnu9f2qdp5Vuy9P6tF6Z+NumvKCSQxO5xAr
	UI3cgxNeQJpAVcE7ZXoa+fMRg2xs2NRZnwv2s=
Received: by 10.216.21.74 with SMTP id q52mr1255089weq.36.1321521625617;
	Thu, 17 Nov 2011 01:20:25 -0800 (PST)
Received: from [192.168.1.3] (host86-129-245-239.range86-129.btcentralplus.com.
	[86.129.245.239])
	by mx.google.com with ESMTPS id hq5sm17948486wib.7.2011.11.17.01.20.20
	(version=SSLv3 cipher=OTHER); Thu, 17 Nov 2011 01:20:24 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Thu, 17 Nov 2011 09:20:18 +0000
From: Keir Fraser <keir@xen.org>
To: Jean Guyader <jean.guyader@eu.citrix.com>, <xen-devel@lists.xensource.com>
Message-ID: <CAEA8252.343B3%keir@xen.org>
Thread-Topic: [PATCH 0/6] IOMMU, vtd and iotlb flush rework (v8)
Thread-Index: AcylCh9IfCUEIzJP2EmLf72UxZbYcw==
In-Reply-To: <1321471508-31633-1-git-send-email-jean.guyader@eu.citrix.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: allen.m.kay@intel.com, tim@xen.org, JBeulich@suse.com
Subject: [Xen-devel] Re: [PATCH 0/6] IOMMU, vtd and iotlb flush rework (v8)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 16/11/2011 19:25, "Jean Guyader" <jean.guyader@eu.citrix.com> wrote:

> 
> In one of my previous email I detailed a bug I was seeing when passing
> through a Intel GPU on a guest that has more that 4G or RAM.
> 
> Allen suggested that I go for the Plan B but after a discussion with Tim
> we agreed that Plan B was way to disruptive in term of code change.
> 
> This patch series implements Plan A.

I'll check these in when they get an Ack from Jan.

 -- Keir

> http://xen.1045712.n5.nabble.com/VTD-Intel-iommu-IOTLB-flush-really-slow-td495
> 2866.html
> 
> Changes between v7 and v8:
>         - Rebase on new add_to_physmap from Andres Lagar-Cavilla
>         - Only do copy_to_guest on the new XENMAPSPACE
> (XENMAPSPACE_gmfn_range).
>         - Convert the xatp argument to a pointer in xenmem_add_to_physmap.
>         - Modify xenmem_add_to_physmap so it doesn't touchs the input (xatp is
> const now).
> 
> Changes between v6 and v7:
>        - xenmem_add_to_physmap_once can't take a pointer on xatp because
>          it modifies .idx and .gpfn.
>        - Cancel hypercall continuation in the compat layer if the
> copy_to_guest
>          failed.
> 
> Changes between v5 and v6:
>       - Rework the patch queue to make it more readable.
>       - Modify xatp in place in xenmem_add_to_physmap
>       - Only check for preemption if we are not at the last iteration
>       - Copy xatp guest handler back to the guest only in case of continuation
>       - Add continuation only when dealing with the new xenmem space
>         (XENMAPSPACE_gmfn_range).
> 
> Changes between v4 and v5:
>       - Fix hypercall continuation for add_to_physmap in compat mode.
> 
> Changes between v3 and v4:
>       - Move the loop for gmfn_range from arch_memory_op to
> xenmem_add_to_physmap.
>       - Add a comment to comment to explain the purpose of
> iommu_dont_flush_iotlb.
> 
> Changes between v2 and v3:
>       - Check for the presence iotlb_flush_all callback before calling it.
> 
> Changes between v1 and v2:
>       - Move size in struct xen_add_to_physmap in padding between .domid and
> .space.
>       - Store iommu_dont_flush per cpu
>       - Change the code in hvmloader to relocate by batch of 64K, .size is now
> 16 bits.
> 
> Jean Guyader (6):
>   vtd: Refactor iotlb flush code
>   iommu: Introduce iommu_flush and iommu_flush_all.
>   add_to_physmap: Move the code for XENMEM_add_to_physmap
>   mm: New XENMEM space, XENMAPSPACE_gmfn_range
>   hvmloader: Change memory relocation loop when overlap with PCI hole
>   Introduce per cpu flag (iommu_dont_flush_iotlb) to avoid unnecessary
>     iotlb flush
> 
>  tools/firmware/hvmloader/pci.c      |   20 +++-
>  xen/arch/x86/mm.c                   |  212
> +++++++++++++++++++++++------------
>  xen/arch/x86/x86_64/compat/mm.c     |   18 +++
>  xen/drivers/passthrough/iommu.c     |   25 ++++
>  xen/drivers/passthrough/vtd/iommu.c |  100 ++++++++++-------
>  xen/include/public/memory.h         |    4 +
>  xen/include/xen/iommu.h             |   17 +++
>  7 files changed, 277 insertions(+), 119 deletions(-)
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 01:39:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 01:39:49 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQyRh-0002i3-NV; Thu, 17 Nov 2011 01:39:49 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQyQx-0002VP-LU
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 01:39:03 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1321522708!44285212!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17686 invoked from network); 17 Nov 2011 09:38:28 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-10.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 17 Nov 2011 09:38:28 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 17 Nov 2011 09:38:59 +0000
Message-Id: <4EC4E44002000078000617F9@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 
Date: Thu, 17 Nov 2011 09:38:56 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "jim burns" <jim_burn@bellsouth.net>
Subject: Re: UNS: Re: [Xen-devel] BAR 0: cirrusfb load errors prevent
	hvm domu from getting resolutions above 800x600
References: <7877809.94pu0BOf0I@dell4550> <3049363.ivXYWEmP59@dell4550>
	<4EC4CF70020000780006179B@nat28.tlf.novell.com>
	<1474452.Ubr0mjN0Wq@dell4550>
In-Reply-To: <1474452.Ubr0mjN0Wq@dell4550>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Flavio <fbcyborg@gmail.com>, xen-devel@lists.xensource.com,
	"Fajar A. Nugraha" <list@fajar.net>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 17.11.11 at 09:31, jim burns <jim_burn@bellsouth.net> wrote:
> On Thu November 17 2011, 8:10:08 AM, Jan Beulich wrote:
>> >>> On 17.11.11 at 00:28, jim burns <jim_burn@bellsouth.net> wrote:
>> Sounds more like a kernel problem.
>>=20
>> > <4>[    0.629101] vesafb: cannot reserve video memory at 0xf0000000
>>=20
>> This doesn't tell what component did the reservation before this point,
>> but that's what he/you will need to find out. And then compare with
>> the cirrusfb case.
>=20
> I thought that's what this meant:
>=20
> [    0.667812] vesafb: framebuffer at 0xf0000000, mapped to=20
> 0xffffc90000580000, using 1875k, total 4096k
>=20
> Looks like vesafb reserved it.

No - the absence of the former message means it reserved it. But its
presence does not provide information on what, in that case, managed
to reserve it before. But that's what you want to hunt down.

>> One significant difference of course is the DRM base fb driver in the
>> radeon case - to compare apples with apples, DRM should really be
>> removed from the picture.
>=20
> True. I was just pointing out that there is a mechanism for vesafb =
handing=20
> off=20
> control to another video driver:
>=20
> <3>[  259.974310] fb: conflicting fb hw usage radeondrmfb vs VESA VGA =
-=20
> removing generic driver
>=20
> Any ideas where to go from here? Thanx.

You could have looked at this easily yourself - cirrusfb_register() (which
is what calls register_framebuffer(), which is where above message
originates from) gets called from cirrusfb_pci_register() only *after*
that function tried to reserve its resources via pci_request_regions().
(This is in 3.2-rc2, so even the most current driver isn't capable of
doing this sort of handshake, and afaict that's no different on native,
so not a Xen issue at all.)

Btw., looking at the title again - I don't think you need cirrusfb to
get higher resolutions, at least not if you're talking about X (only if
you merely care about the text consoles this would be the case),
as long as a respective X driver is present.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 01:42:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 01:42:56 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQyUi-0003En-3o; Thu, 17 Nov 2011 01:42:56 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQyU0-00032d-1x
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 01:42:12 -0800
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1321522928!4599146!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25793 invoked from network); 17 Nov 2011 09:42:09 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-8.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 17 Nov 2011 09:42:09 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 17 Nov 2011 09:42:08 +0000
Message-Id: <4EC4E4FB0200007800061801@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 
Date: Thu, 17 Nov 2011 09:42:03 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jean Guyader" <jean.guyader@eu.citrix.com>, "Keir Fraser" <keir@xen.org>
References: <1321471508-31633-1-git-send-email-jean.guyader@eu.citrix.com>
	<CAEA8252.343B3%keir@xen.org>
In-Reply-To: <CAEA8252.343B3%keir@xen.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: tim@xen.org, xen-devel@lists.xensource.com, allen.m.kay@intel.com
Subject: [Xen-devel] Re: [PATCH 0/6] IOMMU, vtd and iotlb flush rework (v8)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 17.11.11 at 10:20, Keir Fraser <keir@xen.org> wrote:
> On 16/11/2011 19:25, "Jean Guyader" <jean.guyader@eu.citrix.com> wrote:
>=20
>>=20
>> In one of my previous email I detailed a bug I was seeing when passing
>> through a Intel GPU on a guest that has more that 4G or RAM.
>>=20
>> Allen suggested that I go for the Plan B but after a discussion with =
Tim
>> we agreed that Plan B was way to disruptive in term of code change.
>>=20
>> This patch series implements Plan A.
>=20
> I'll check these in when they get an Ack from Jan.

While they now look fine to me, I didn't really plan on acking these; I
would rather have Tim expected to for the mm parts, and I think
Allen did already do so for the passthrough changes.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 01:43:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 01:43:57 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQyVh-0003bw-33; Thu, 17 Nov 2011 01:43:57 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQyUT-00038Y-A3
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 01:42:42 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1321522926!44285968!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32466 invoked from network); 17 Nov 2011 09:42:06 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 09:42:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,526,1315180800"; 
   d="scan'208";a="8981383"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Nov 2011 09:42:38 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 17 Nov 2011 09:42:38 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RQyUP-0004ZA-Ru;
	Thu, 17 Nov 2011 09:42:37 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RQyUP-0005cQ-PR;
	Thu, 17 Nov 2011 09:42:37 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9829-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 17 Nov 2011 09:42:37 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9829: regressions - trouble:
	broken/fail/pass
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9829 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9829/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-pv             5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-pv            5 xen-boot                   fail REGR. vs. 9756
 test-amd64-amd64-xl-pcipt-intel  5 xen-boot                fail REGR. vs. 9756
 test-amd64-i386-rhel6hvm-intel  5 xen-boot                 fail REGR. vs. 9756
 test-i386-i386-xl             5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-xl-multivcpu  5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-rhel6hvm-amd  5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-xl-credit2    5 xen-boot                   fail REGR. vs. 9756
 test-amd64-amd64-xl-sedf      5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-xl            5 xen-boot                   fail REGR. vs. 9756
 test-amd64-amd64-xl           5 xen-boot                   fail REGR. vs. 9756
 test-amd64-amd64-pv           5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-xl-win-vcpus1  5 xen-boot                  fail REGR. vs. 9756
 test-amd64-amd64-win          5 xen-boot                   fail REGR. vs. 9756
 test-i386-i386-xl-win         5 xen-boot                   fail REGR. vs. 9756
 test-i386-i386-pair           7 xen-boot/src_host          fail REGR. vs. 9756
 test-i386-i386-pair           8 xen-boot/dst_host          fail REGR. vs. 9756
 test-amd64-i386-pair          8 xen-boot/dst_host          fail REGR. vs. 9756
 test-amd64-i386-pair          7 xen-boot/src_host          fail REGR. vs. 9756
 test-amd64-i386-win-vcpus1    5 xen-boot                   fail REGR. vs. 9756
 test-amd64-amd64-xl-win       5 xen-boot                   fail REGR. vs. 9756
 test-amd64-i386-win           5 xen-boot                   fail REGR. vs. 9756
 test-i386-i386-win            5 xen-boot                   fail REGR. vs. 9756
 test-amd64-amd64-pair         3 host-install/src_host(3)     broken

version targeted for testing:
 xen                  51f58b210447
baseline version:
 xen                  9702967e89dd

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Gianluca Guida <gianluca.guida@citrix.com>
  Ian Campbell <ian.campbell@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Stefano Stabellini <stefano.stabellini@eu.citrix.com>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          fail    
 test-amd64-i386-xl                                           fail    
 test-i386-i386-xl                                            fail    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 fail    
 test-amd64-amd64-pair                                        broken  
 test-amd64-i386-pair                                         fail    
 test-i386-i386-pair                                          fail    
 test-amd64-amd64-pv                                          fail    
 test-amd64-i386-pv                                           fail    
 test-i386-i386-pv                                            fail    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.

------------------------------------------------------------
changeset:   23186:51f58b210447
tag:         tip
user:        Jan Beulich <jbeulich@suse.com>
date:        Wed Nov 16 16:39:02 2011 +0000
    
    x86-64/test_x86_emulate: fix blowfish test
    
    Incorrect register usage in the _start() wrapper caused the 64-bit
    execution emulation to fail.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   24149:753b21aa4087
    xen-unstable date:        Wed Nov 16 15:20:25 2011 +0000
    
    
changeset:   23185:efd132eee40c
user:        Gianluca Guida <gianluca.guida@citrix.com>
date:        Wed Nov 16 16:38:27 2011 +0000
    
    [shadow] Disable higher level pagetables early unshadow only when the "process dying" hypercall is used.
    
    This patch fixes a performance problem in fully virtualized guests.
    
    Signed-off-by: Gianluca Guida <gianluca.guida@citrix.com>
    Tested-by: Jan Beulich <jbeulich@suse.com>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   24148:3ecc8fef4281
    xen-unstable date:        Wed Nov 16 15:19:33 2011 +0000
    
    
changeset:   23184:4a91cf045893
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Wed Nov 16 16:37:49 2011 +0000
    
    xen: avoid crash enabling turbo mode
    
    On a system which has not had P-state information pushed down into the
    hypervisor running "xenpm enable-turbo-mode" will reliably crash the
    host.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Jan Beulich <jbeulich@suse.com>
    xen-unstable changeset:   24144:cd3ef25f207a
    xen-unstable date:        Tue Nov 15 14:24:38 2011 +0100
    Committed-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23183:98ba0aceaf30
user:        Stefano Stabellini <stefano.stabellini@eu.citrix.com>
date:        Wed Nov 16 16:33:58 2011 +0000
    
    x86: re-inject emulated level pirqs in PV on HVM guests if still asserted
    
    PV on HVM guests can loose level interrupts coming from emulated
    devices if they have been remapped onto event channels.  The reason is
    that we are missing the code to inject a pirq again in the guest when
    the guest EOIs it, if it corresponds to an emulated level interrupt
    and the interrupt is still asserted.
    
    Fix this issue and also return error when the guest tries to get the
    irq_status of a non-existing pirq.
    
    Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   24007:0526644ad2a6
    xen-unstable date:        Thu Oct 27 16:07:18 2011 +0100
    
    
changeset:   23182:9702967e89dd
user:        Andrew Cooper <andrew.cooper3@citrix.com>
date:        Sat Nov 12 16:14:02 2011 +0000
    
    Revert c/s 23666:b96f8bdcaa15 KEXEC: disconnect all PCI devices from the PCI bus on crash
    
    It turns out that this causes all mannor of problems on certain
    motherboards (so far with no pattern I can discern)
    
    Problems include:
    * Hanging forever checking hlt instruction.
    * Panics when trying to change switch root device
    * Drivers hanging when trying to check for interrupts.
    
    From: Andrew Cooper <andrew.cooper3@citrix.com>
    Signed-off-by: Keir Fraser <keir@xen.org>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   24137:0844b17df7a9
    xen-unstable date:        Fri Nov 11 18:14:35 2011 +0000
    
    
(qemu changes not included)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 02:00:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 02:00:34 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQyll-0004Ec-2L; Thu, 17 Nov 2011 02:00:34 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQyjD-00040S-Au
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 01:57:57 -0800
X-Env-Sender: stefan.bader@canonical.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1321523872!4542010!1
X-Originating-IP: [91.189.89.112]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8658 invoked from network); 17 Nov 2011 09:57:52 -0000
Received: from youngberry.canonical.com (HELO youngberry.canonical.com)
	(91.189.89.112) by server-2.tower-21.messagelabs.com with SMTP;
	17 Nov 2011 09:57:52 -0000
Received: from p5b2e5a52.dip.t-dialin.net ([91.46.90.82] helo=[192.168.2.5])
	by youngberry.canonical.com with esmtpsa
	(TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71)
	(envelope-from <stefan.bader@canonical.com>)
	id 1RQyj8-0007Li-3K; Thu, 17 Nov 2011 09:57:50 +0000
Message-ID: <4EC4DA9C.60600@canonical.com>
Date: Thu, 17 Nov 2011 10:57:48 +0100
From: Stefan Bader <stefan.bader@canonical.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20111031 Thunderbird/7.0.1
MIME-Version: 1.0
To: Keir Fraser <keir.xen@gmail.com>
Subject: Re: [Xen-devel] [xen-4.1-testing test] 9805: regressions - FAIL
References: <CAEA7F2B.250F3%keir.xen@gmail.com>
In-Reply-To: <CAEA7F2B.250F3%keir.xen@gmail.com>
X-Enigmail-Version: 1.4a1pre
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: xen-devel@lists.xensource.com, Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Jan Beulich <JBeulich@suse.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 17.11.2011 10:06, Keir Fraser wrote:
> On 17/11/2011 08:32, "Jan Beulich" <JBeulich@suse.com> wrote:
> 
>> This is due to a bad backport of c/s 24007:0526644ad2a6: In -unstable,
>> evtchn_unmask() must be called with d->event_lock held, while in 4.1
>> the function acquires the lock (and now gets called with the lock already
>> held from do_physdev_op()'s case PHYSDEVOP_eoi). The change dates
>> back to 23573:584c2e5e03d9, which hardly is a candidate for backporting
>> (but maybe the locking change needs to be pulled out of there).
> 
> Interestingly, Ubuntu's 4.1 fix has exactly the same problem.
> 

Hm, yes we should. I am pretty sure I hit that code path often enough, Wonder
why I never saw any dead lock there...

--Stefan

> I'll revert the patch until someone has time to actually implement and test
> a working patch against our vanilla 4.1-testing tree.
> 
>  -- Keir
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 02:14:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 02:14:23 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQyz9-0004mK-Fy; Thu, 17 Nov 2011 02:14:23 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQyyA-0004ZU-CO
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 02:13:25 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1321524799!3502266!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1155 invoked from network); 17 Nov 2011 10:13:19 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-9.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 10:13:19 -0000
Received: by wyg24 with SMTP id 24so2371445wyg.30
	for <xen-devel@lists.xensource.com>;
	Thu, 17 Nov 2011 02:13:19 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=x7mqjdbc/wQB1oNaTv86QGMTMV9yyTfl0ytnEXkIm/g=;
	b=CqRebj/iNgDGadOhlwpN+jyFcT6Bbft+z+53GJ1J0hn1WhHiuYwqwQ/vTMTN43QKPP
	UbZTj6vm3Zvz91lvN3pf4d5z8T1f+jLQvlNJjg1SjC8jt3rnBcFEPQ8+diE528iEUOio
	g2AknhXoijhx1apoo5eDNWJkwsuUNzapTjybk=
Received: by 10.180.19.42 with SMTP id b10mr41122744wie.39.1321524799038;
	Thu, 17 Nov 2011 02:13:19 -0800 (PST)
Received: from [192.168.1.3] (host86-129-245-239.range86-129.btcentralplus.com.
	[86.129.245.239])
	by mx.google.com with ESMTPS id hq5sm18032923wib.7.2011.11.17.02.13.17
	(version=SSLv3 cipher=OTHER); Thu, 17 Nov 2011 02:13:18 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Thu, 17 Nov 2011 10:13:10 +0000
Subject: Re: [Xen-devel] [xen-4.1-testing test] 9805: regressions - FAIL
From: Keir Fraser <keir@xen.org>
To: Stefan Bader <stefan.bader@canonical.com>
Message-ID: <CAEA8EB6.343DD%keir@xen.org>
Thread-Topic: [Xen-devel] [xen-4.1-testing test] 9805: regressions - FAIL
Thread-Index: AcylEYHxXLkhkfqLjEy3WDxf11lhhg==
In-Reply-To: <4EC4DA9C.60600@canonical.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: xen-devel@lists.xensource.com, Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Jan Beulich <JBeulich@suse.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 17/11/2011 09:57, "Stefan Bader" <stefan.bader@canonical.com> wrote:

>>> This is due to a bad backport of c/s 24007:0526644ad2a6: In -unstable,
>>> evtchn_unmask() must be called with d->event_lock held, while in 4.1
>>> the function acquires the lock (and now gets called with the lock already
>>> held from do_physdev_op()'s case PHYSDEVOP_eoi). The change dates
>>> back to 23573:584c2e5e03d9, which hardly is a candidate for backporting
>>> (but maybe the locking change needs to be pulled out of there).
>> 
>> Interestingly, Ubuntu's 4.1 fix has exactly the same problem.
>> 
> 
> Hm, yes we should. I am pretty sure I hit that code path often enough, Wonder
> why I never saw any dead lock there...

Perhaps your dom0 kernel doesn't register a pirq_eoi_map.

 -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 02:29:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 02:29:38 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQzDt-0005ME-B4; Thu, 17 Nov 2011 02:29:37 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RQzD7-00059m-Vp
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 02:28:50 -0800
X-Env-Sender: stefan.bader@canonical.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1321525699!53122434!1
X-Originating-IP: [91.189.89.112]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9698 invoked from network); 17 Nov 2011 10:28:19 -0000
Received: from youngberry.canonical.com (HELO youngberry.canonical.com)
	(91.189.89.112) by server-9.tower-27.messagelabs.com with SMTP;
	17 Nov 2011 10:28:19 -0000
Received: from p5b2e5a52.dip.t-dialin.net ([91.46.90.82] helo=[192.168.2.5])
	by youngberry.canonical.com with esmtpsa
	(TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71)
	(envelope-from <stefan.bader@canonical.com>)
	id 1RQzD4-00007x-AL; Thu, 17 Nov 2011 10:28:46 +0000
Message-ID: <4EC4E1DD.1030309@canonical.com>
Date: Thu, 17 Nov 2011 11:28:45 +0100
From: Stefan Bader <stefan.bader@canonical.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20111031 Thunderbird/7.0.1
MIME-Version: 1.0
To: Keir Fraser <keir@xen.org>
Subject: Re: [Xen-devel] [xen-4.1-testing test] 9805: regressions - FAIL
References: <CAEA8EB6.343DD%keir@xen.org>
In-Reply-To: <CAEA8EB6.343DD%keir@xen.org>
X-Enigmail-Version: 1.4a1pre
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: xen-devel@lists.xensource.com, Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Jan Beulich <JBeulich@suse.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 17.11.2011 11:13, Keir Fraser wrote:
> On 17/11/2011 09:57, "Stefan Bader" <stefan.bader@canonical.com> wrote:
> 
>>>> This is due to a bad backport of c/s 24007:0526644ad2a6: In -unstable,
>>>> evtchn_unmask() must be called with d->event_lock held, while in 4.1
>>>> the function acquires the lock (and now gets called with the lock already
>>>> held from do_physdev_op()'s case PHYSDEVOP_eoi). The change dates
>>>> back to 23573:584c2e5e03d9, which hardly is a candidate for backporting
>>>> (but maybe the locking change needs to be pulled out of there).
>>>
>>> Interestingly, Ubuntu's 4.1 fix has exactly the same problem.
>>>
>>
>> Hm, yes we should. I am pretty sure I hit that code path often enough, Wonder
>> why I never saw any dead lock there...
> 
> Perhaps your dom0 kernel doesn't register a pirq_eoi_map.
> 
Would be the only explanation. And quite possible. Heck, I would need to know
what that is used for anyway. :/ The kernel is 3.0 based the interrupt I was
looking at just was a normal apic emulated through events one...

-Stefan
>  -- Keir
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 02:32:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 02:32:55 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQzH5-0005mZ-8T; Thu, 17 Nov 2011 02:32:55 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQzGV-0005Zk-SW
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 02:32:20 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1321525936!1929165!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27906 invoked from network); 17 Nov 2011 10:32:16 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 10:32:16 -0000
X-IronPort-AV: E=Sophos;i="4.69,526,1315180800"; 
   d="scan'208";a="8983100"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Nov 2011 10:32:16 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 17 Nov 2011 10:32:16 +0000
Date: Thu, 17 Nov 2011 10:32:57 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Stefan Bader <stefan.bader@canonical.com>
Subject: Re: [Xen-devel] [xen-4.1-testing test] 9805: regressions - FAIL
In-Reply-To: <4EC4E1DD.1030309@canonical.com>
Message-ID: <alpine.DEB.2.00.1111171031490.3519@kaball-desktop>
References: <CAEA8EB6.343DD%keir@xen.org> <4EC4E1DD.1030309@canonical.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Keir \(Xen.org\)" <keir@xen.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>, Jan, Beulich <JBeulich@suse.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 17 Nov 2011, Stefan Bader wrote:
> On 17.11.2011 11:13, Keir Fraser wrote:
> > On 17/11/2011 09:57, "Stefan Bader" <stefan.bader@canonical.com> wrote:
> > 
> >>>> This is due to a bad backport of c/s 24007:0526644ad2a6: In -unstable,
> >>>> evtchn_unmask() must be called with d->event_lock held, while in 4.1
> >>>> the function acquires the lock (and now gets called with the lock already
> >>>> held from do_physdev_op()'s case PHYSDEVOP_eoi). The change dates
> >>>> back to 23573:584c2e5e03d9, which hardly is a candidate for backporting
> >>>> (but maybe the locking change needs to be pulled out of there).
> >>>
> >>> Interestingly, Ubuntu's 4.1 fix has exactly the same problem.
> >>>
> >>
> >> Hm, yes we should. I am pretty sure I hit that code path often enough, Wonder
> >> why I never saw any dead lock there...
> > 
> > Perhaps your dom0 kernel doesn't register a pirq_eoi_map.
> > 
> Would be the only explanation. And quite possible. Heck, I would need to know
> what that is used for anyway. :/ The kernel is 3.0 based the interrupt I was
> looking at just was a normal apic emulated through events one...

Same here, I don't have any dom0 kernels that support it.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 02:36:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 02:36:47 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQzKp-0006Fp-Sg; Thu, 17 Nov 2011 02:36:47 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQzKF-00063h-8V
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 02:36:12 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1321526167!1931306!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5565 invoked from network); 17 Nov 2011 10:36:07 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 10:36:07 -0000
X-IronPort-AV: E=Sophos;i="4.69,526,1315180800"; 
   d="scan'208";a="8983271"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Nov 2011 10:35:49 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Thu, 17 Nov 2011 10:35:49 +0000
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "annie.li@oracle.com" <annie.li@oracle.com>
Date: Thu, 17 Nov 2011 10:35:48 +0000
In-Reply-To: <1321451304-13559-1-git-send-email-annie.li@oracle.com>
References: <4EC3B62F.6080702@oracle.com>
	<1321451304-13559-1-git-send-email-annie.li@oracle.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1321526148.3664.263.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"konrad.wilk@oracle.com" <konrad.wilk@oracle.com>,
	"kurt.hackel@oracle.com" <kurt.hackel@oracle.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Durrant <Paul.Durrant@citrix.com>, Paul
Subject: [Xen-devel] Re: [PATCH 1/3] xen/granttable: Introducing grant table
	V2 stucture
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, 2011-11-16 at 13:48 +0000, annie.li@oracle.com wrote:
> From: Annie Li <annie.li@oracle.com>
> 
> This patch introduces new structures of grant table V2, grant table V2 is an
> extension from V1. Grant table is shared between guest and Xen, and Xen is
> responsible to do corresponding work for grant operations, such as: figure
> out guest's grant table version, perform different actions based on
> different grant table version, etc. Although full-page structure of V2
> is different from V1, it play the same role as V1.
> 
> Signed-off-by: Annie Li <annie.li@oracle.com>
> ---
>  arch/x86/xen/grant-table.c          |    7 +-
>  drivers/xen/grant-table.c           |  181 +++++++++++++++++++++++++++--------
>  include/xen/grant_table.h           |    4 +-
>  include/xen/interface/grant_table.h |  167 +++++++++++++++++++++++++++++++-
>  include/xen/interface/xen.h         |    2 +
>  5 files changed, 311 insertions(+), 50 deletions(-)
> 
> diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c
> index 6bbfd7a..c6ab2e7 100644
> --- a/arch/x86/xen/grant-table.c
> +++ b/arch/x86/xen/grant-table.c
> @@ -64,10 +64,10 @@ static int unmap_pte_fn(pte_t *pte, struct page *pmd_page,
> 
>  int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
>                            unsigned long max_nr_gframes,
> -                          struct grant_entry **__shared)
> +                          void **__shared)
>  {
>         int rc;
> -       struct grant_entry *shared = *__shared;
> +       void *shared = *__shared;
> 
>         if (shared == NULL) {
>                 struct vm_struct *area =
> @@ -83,8 +83,7 @@ int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
>         return rc;
>  }
> 
> -void arch_gnttab_unmap_shared(struct grant_entry *shared,
> -                             unsigned long nr_gframes)
> +void arch_gnttab_unmap_shared(void *shared, unsigned long nr_gframes)
>  {
>         apply_to_page_range(&init_mm, (unsigned long)shared,
>                             PAGE_SIZE * nr_gframes, unmap_pte_fn, NULL);
> diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
> index bf1c094..1bd9d5f 100644
> --- a/drivers/xen/grant-table.c
> +++ b/drivers/xen/grant-table.c
> @@ -53,7 +53,7 @@
>  /* External tools reserve first few grant table entries. */
>  #define NR_RESERVED_ENTRIES 8
>  #define GNTTAB_LIST_END 0xffffffff
> -#define GREFS_PER_GRANT_FRAME (PAGE_SIZE / sizeof(struct grant_entry))
> +#define GREFS_PER_GRANT_FRAME (PAGE_SIZE / sizeof(struct grant_entry_v1))
> 
>  static grant_ref_t **gnttab_list;
>  static unsigned int nr_grant_frames;
> @@ -64,7 +64,61 @@ static DEFINE_SPINLOCK(gnttab_list_lock);
>  unsigned long xen_hvm_resume_frames;
>  EXPORT_SYMBOL_GPL(xen_hvm_resume_frames);
> 
> -static struct grant_entry *shared;
> +static union {
> +       struct grant_entry_v1 *v1;
> +       void *addr;
> +} gnttab_shared;
> +
> +/*This is a structure of function pointers for grant table*/
> +static struct {
> +       /*
> +        * Mapping a list of frames for storing grant entries. First input
> +        * parameter is used to storing grant table address when grant table
> +        * being setup, second parameter is the number of frames to map grant
> +        * table. Returning GNTST_okay means success and negative value means
> +        * failure.
> +        */
> +       int (*map_frames)(unsigned long *, unsigned int);
> +       /*
> +        * Release a list of frames which are mapped in map_frames for grant
> +        * entry status.
> +        */
> +       void (*unmap_frames)(void);
> +       /*
> +        * Introducing a valid entry into the grant table, granting the frame
> +        * of this grant entry to domain for accessing, or transfering, or
> +        * transitively accessing. First input parameter is reference of this
> +        * introduced grant entry, second one is domid of granted domain, third
> +        * one is the frame to be granted, and the last one is status of the
> +        * grant entry to be updated.
> +        */
> +       void (*update_entry)(grant_ref_t, domid_t, unsigned long, unsigned);
> +       /*
> +        * Stop granting a grant entry to domain for accessing. First input
> +        * parameter is reference of a grant entry whose grant access will be
> +        * stopped, second one is not in use now. If the grant entry is
> +        * currently mapped for reading or writing, just return failure(==0)
> +        * directly and don't tear down the grant access. Otherwise, stop grant
> +        * access for this entry and return success(==1).
> +        */
> +       int (*end_foreign_access_ref)(grant_ref_t, int);
> +       /*
> +        * Stop granting a grant entry to domain for transfer. If tranfer has
> +        * not started, just reclaim the grant entry and return failure(==0).
> +        * Otherwise, wait for the transfer to complete and then return the
> +        * frame.
> +        */
> +       unsigned long (*end_foreign_transfer_ref)(grant_ref_t);
> +       /*
> +        * Query the status of a grant entry. Input parameter is reference of
> +        * queried grant entry, return value is the status of queried entry.
> +        * Detailed status(writing/reading) can be gotten from the return value
> +        * by bit operations.
> +        */
> +       int (*query_foreign_access)(grant_ref_t);
> +} gnttab_interface;
> +
> +static int grant_table_version;
> 
>  static struct gnttab_free_callback *gnttab_free_callback_list;
> 
> @@ -142,23 +196,23 @@ static void put_free_entry(grant_ref_t ref)
>         spin_unlock_irqrestore(&gnttab_list_lock, flags);
>  }
> 
> -static void update_grant_entry(grant_ref_t ref, domid_t domid,
> -                              unsigned long frame, unsigned flags)
> +/*
> + * Introducing a valid entry into the grant table:
> + *  1. Write ent->domid.
> + *  2. Write ent->frame:
> + *      GTF_permit_access:   Frame to which access is permitted.
> + *      GTF_accept_transfer: Pseudo-phys frame slot being filled by new
> + *                           frame, or zero if none.
> + *  3. Write memory barrier (WMB).
> + *  4. Write ent->flags, inc. valid type.
> + */
> +static void update_grant_entry_v1(grant_ref_t ref, domid_t domid,
> +                                 unsigned long frame, unsigned flags)
>  {
> -       /*
> -        * Introducing a valid entry into the grant table:
> -        *  1. Write ent->domid.
> -        *  2. Write ent->frame:
> -        *      GTF_permit_access:   Frame to which access is permitted.
> -        *      GTF_accept_transfer: Pseudo-phys frame slot being filled by new
> -        *                           frame, or zero if none.
> -        *  3. Write memory barrier (WMB).
> -        *  4. Write ent->flags, inc. valid type.
> -        */
> -       shared[ref].frame = frame;
> -       shared[ref].domid = domid;
> +       gnttab_shared.v1[ref].domid = domid;
> +       gnttab_shared.v1[ref].frame = frame;
>         wmb();
> -       shared[ref].flags = flags;
> +       gnttab_shared.v1[ref].flags = flags;
>  }
> 
>  /*
> @@ -167,7 +221,7 @@ static void update_grant_entry(grant_ref_t ref, domid_t domid,
>  void gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t domid,
>                                      unsigned long frame, int readonly)
>  {
> -       update_grant_entry(ref, domid, frame,
> +       gnttab_interface.update_entry(ref, domid, frame,
>                            GTF_permit_access | (readonly ? GTF_readonly : 0));
>  }
>  EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_ref);
> @@ -187,31 +241,40 @@ int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
>  }
>  EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access);
> 
> -int gnttab_query_foreign_access(grant_ref_t ref)
> +static int gnttab_query_foreign_access_v1(grant_ref_t ref)
>  {
> -       u16 nflags;
> -
> -       nflags = shared[ref].flags;
> +       return gnttab_shared.v1[ref].flags & (GTF_reading|GTF_writing);
> +}
> -       return nflags & (GTF_reading|GTF_writing);
> +int gnttab_query_foreign_access(grant_ref_t ref)
> +{
> +       return gnttab_interface.query_foreign_access(ref);
>  }
>  EXPORT_SYMBOL_GPL(gnttab_query_foreign_access);
> 
> -int gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly)
> +static int gnttab_end_foreign_access_ref_v1(grant_ref_t ref, int readonly)
>  {
>         u16 flags, nflags;
> +       u16 *pflags;
> 
> -       nflags = shared[ref].flags;
> +       pflags = &gnttab_shared.v1[ref].flags;
> +       nflags = *pflags;
>         do {
>                 flags = nflags;
>                 if (flags & (GTF_reading|GTF_writing)) {
>                         printk(KERN_ALERT "WARNING: g.e. still in use!\n");
>                         return 0;
>                 }
> -       } while ((nflags = sync_cmpxchg(&shared[ref].flags, flags, 0)) != flags);
> +       } while ((nflags = sync_cmpxchg(&gnttab_shared.v1[ref].flags, flags, 0))
> +                       != flags);

I think this is one of those cases where strictly adhering to an
80-column rule hurts the readability of the code.

If you had left the static global as "shared" rather than
"gnttab_shared" you wouldn't have this issue. If you want a more
descriptive name why not just call it "gnttab"?

> 
>         return 1;
>  }
> +
> +int gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly)
> +{
> +       return gnttab_interface.end_foreign_access_ref(ref, readonly);
> +}
>  EXPORT_SYMBOL_GPL(gnttab_end_foreign_access_ref);
> 
>  void gnttab_end_foreign_access(grant_ref_t ref, int readonly,
> @@ -246,37 +309,45 @@ EXPORT_SYMBOL_GPL(gnttab_grant_foreign_transfer);
>  void gnttab_grant_foreign_transfer_ref(grant_ref_t ref, domid_t domid,
>                                        unsigned long pfn)
>  {
> -       update_grant_entry(ref, domid, pfn, GTF_accept_transfer);
> +       gnttab_interface.update_entry(ref, domid, pfn, GTF_accept_transfer);
>  }
>  EXPORT_SYMBOL_GPL(gnttab_grant_foreign_transfer_ref);
> 
> -unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref)
> +static unsigned long gnttab_end_foreign_transfer_ref_v1(grant_ref_t ref)
>  {
>         unsigned long frame;
>         u16           flags;
> +       u16          *pflags;
> +
> +       pflags = &gnttab_shared.v1[ref].flags;

It would be nice if these refactoring bits could be separated out from
the more mechanical renaming and abstracting to fn pointer aspects of
the patch.
> 
>         /*
>          * If a transfer is not even yet started, try to reclaim the grant
>          * reference and return failure (== 0).
>          */
> -       while (!((flags = shared[ref].flags) & GTF_transfer_committed)) {
> -               if (sync_cmpxchg(&shared[ref].flags, flags, 0) == flags)
> +       while (!((flags = *pflags) & GTF_transfer_committed)) {
> +               if (sync_cmpxchg(pflags, flags, 0) == flags)
>                         return 0;
>                 cpu_relax();
>         }
> 
>         /* If a transfer is in progress then wait until it is completed. */
>         while (!(flags & GTF_transfer_completed)) {
> -               flags = shared[ref].flags;
> +               flags = *pflags;
>                 cpu_relax();
>         }
> 
>         rmb();  /* Read the frame number /after/ reading completion status. */
> -       frame = shared[ref].frame;
> +       frame = gnttab_shared.v1[ref].frame;
>         BUG_ON(frame == 0);
> 
>         return frame;
>  }
> +
> +unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref)
> +{
> +       return gnttab_interface.end_foreign_transfer_ref(ref);
> +}
>  EXPORT_SYMBOL_GPL(gnttab_end_foreign_transfer_ref);
> 
>  unsigned long gnttab_end_foreign_transfer(grant_ref_t ref)
> @@ -520,6 +591,23 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
>  }
>  EXPORT_SYMBOL_GPL(gnttab_unmap_refs);
> 
> +static int gnttab_map_frames_v1(unsigned long *frames, unsigned int nr_gframes)
> +{
> +       int rc;
> +
> +       rc = arch_gnttab_map_shared(frames, nr_gframes,
> +                                   gnttab_max_grant_frames(),
> +                                   &gnttab_shared.addr);
> +       BUG_ON(rc);
> +
> +       return 0;
> +}
> +
> +static void gnttab_unmap_frames_v1(void)
> +{
> +       arch_gnttab_unmap_shared(gnttab_shared.addr, nr_grant_frames);
> +}
> +
>  static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
>  {
>         struct gnttab_setup_table setup;
> @@ -567,19 +655,33 @@ static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
> 
>         BUG_ON(rc || setup.status);
> 
> -       rc = arch_gnttab_map_shared(frames, nr_gframes, gnttab_max_grant_frames(),
> -                                   &shared);
> -       BUG_ON(rc);
> +       rc = gnttab_interface.map_frames(frames, nr_gframes);

Nothing checks rc here now?

In fact the gnttab_map_frames_v1 function has its own BUG_ON(rc) and
always returns 0 if it returns at all so perhaps that hook should be
returning void?

> 
>         kfree(frames);
> 
>         return 0;
>  }
> 
> +static void gnttab_request_version(void)
> +{
> +       grant_table_version = 1;
> +       gnttab_interface.map_frames = gnttab_map_frames_v1;
> +       gnttab_interface.unmap_frames = gnttab_unmap_frames_v1;
> +       gnttab_interface.update_entry = update_grant_entry_v1;
> +       gnttab_interface.end_foreign_access_ref =
> +                                       gnttab_end_foreign_access_ref_v1;
> +       gnttab_interface.end_foreign_transfer_ref =
> +                                       gnttab_end_foreign_transfer_ref_v1;
> +       gnttab_interface.query_foreign_access = gnttab_query_foreign_access_v1;

The more normal way to do this would be to make gnttab_interface a
pointer, define gnttab_v1_ops and do:
	gnttab_interface = &gnttab_v1_ops;
or if the pointer overhead is significant remove that and just do a
struct assignment:
	gnttab_interface = gnttab_v1_ops;

> +       printk(KERN_INFO "Grant tables using version %d layout.\n",
> +               grant_table_version);
> +}
> +
>  int gnttab_resume(void)
>  {
>         unsigned int max_nr_gframes;
> 
> +       gnttab_request_version();
>         max_nr_gframes = gnttab_max_grant_frames();
>         if (max_nr_gframes < nr_grant_frames)
>                 return -ENOSYS;
> @@ -587,9 +689,10 @@ int gnttab_resume(void)
>         if (xen_pv_domain())
>                 return gnttab_map(0, nr_grant_frames - 1);
> 
> -       if (!shared) {
> -               shared = ioremap(xen_hvm_resume_frames, PAGE_SIZE * max_nr_gframes);
> -               if (shared == NULL) {
> +       if (gnttab_shared.addr == NULL) {
> +               gnttab_shared.addr = ioremap(xen_hvm_resume_frames,
> +                                               PAGE_SIZE * max_nr_gframes);
> +               if (gnttab_shared.addr == NULL) {
>                         printk(KERN_WARNING
>                                         "Failed to ioremap gnttab share frames!");
>                         return -ENOMEM;
> @@ -603,7 +706,7 @@ int gnttab_resume(void)
> 
>  int gnttab_suspend(void)
>  {
> -       arch_gnttab_unmap_shared(shared, nr_grant_frames);
> +       gnttab_interface.unmap_frames();
>         return 0;
>  }
> 
> diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
> index 11e2dfc..c7a40f8 100644
> --- a/include/xen/grant_table.h
> +++ b/include/xen/grant_table.h
> @@ -145,8 +145,8 @@ gnttab_set_unmap_op(struct gnttab_unmap_grant_ref *unmap, phys_addr_t addr,
> 
>  int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
>                            unsigned long max_nr_gframes,
> -                          struct grant_entry **__shared);
> -void arch_gnttab_unmap_shared(struct grant_entry *shared,
> +                          void **__shared);
> +void arch_gnttab_unmap_shared(void *shared,
>                               unsigned long nr_gframes);
> 
>  extern unsigned long xen_hvm_resume_frames;
> diff --git a/include/xen/interface/grant_table.h b/include/xen/interface/grant_table.h
> index 39e5717..a17d844 100644
> --- a/include/xen/interface/grant_table.h
> +++ b/include/xen/interface/grant_table.h
> @@ -85,12 +85,22 @@
>   */
> 
>  /*
> + * Reference to a grant entry in a specified domain's grant table.
> + */
> +typedef uint32_t grant_ref_t;
> +
> +/*
>   * A grant table comprises a packed array of grant entries in one or more
>   * page frames shared between Xen and a guest.
>   * [XEN]: This field is written by Xen and read by the sharing guest.
>   * [GST]: This field is written by the guest and read by Xen.
>   */
> -struct grant_entry {
> +
> +/*
> + * Version 1 of the grant table entry structure is maintained purely
> + * for backwards compatibility.  New guests should use version 2.
> + */
> +struct grant_entry_v1 {
>      /* GTF_xxx: various type and flag information.  [XEN,GST] */
>      uint16_t flags;
>      /* The domain being granted foreign privileges. [GST] */
> @@ -108,10 +118,13 @@ struct grant_entry {
>   *  GTF_permit_access: Allow @domid to map/access @frame.
>   *  GTF_accept_transfer: Allow @domid to transfer ownership of one page frame
>   *                       to this guest. Xen writes the page number to @frame.
> + *  GTF_transitive: Allow @domid to transitively access a subrange of
> + *                  @trans_grant in @trans_domid.  No mappings are allowed.
>   */
>  #define GTF_invalid         (0U<<0)
>  #define GTF_permit_access   (1U<<0)
>  #define GTF_accept_transfer (2U<<0)
> +#define GTF_transitive      (3U<<0)
>  #define GTF_type_mask       (3U<<0)
> 
>  /*
> @@ -119,6 +132,9 @@ struct grant_entry {
>   *  GTF_readonly: Restrict @domid to read-only mappings and accesses. [GST]
>   *  GTF_reading: Grant entry is currently mapped for reading by @domid. [XEN]
>   *  GTF_writing: Grant entry is currently mapped for writing by @domid. [XEN]
> + *  GTF_sub_page: Grant access to only a subrange of the page.  @domid
> + *                will only be allowed to copy from the grant, and not
> + *                map it. [GST]
>   */
>  #define _GTF_readonly       (2)
>  #define GTF_readonly        (1U<<_GTF_readonly)
> @@ -126,6 +142,8 @@ struct grant_entry {
>  #define GTF_reading         (1U<<_GTF_reading)
>  #define _GTF_writing        (4)
>  #define GTF_writing         (1U<<_GTF_writing)
> +#define _GTF_sub_page       (8)
> +#define GTF_sub_page        (1U<<_GTF_sub_page)
> 
>  /*
>   * Subflags for GTF_accept_transfer:
> @@ -142,15 +160,81 @@ struct grant_entry {
>  #define _GTF_transfer_completed (3)
>  #define GTF_transfer_completed  (1U<<_GTF_transfer_completed)
> 
> +/*
> + * Version 2 grant table entries.  These fulfil the same role as
> + * version 1 entries, but can represent more complicated operations.
> + * Any given domain will have either a version 1 or a version 2 table,
> + * and every entry in the table will be the same version.
> + *
> + * The interface by which domains use grant references does not depend
> + * on the grant table version in use by the other domain.
> + */
> 
> -/***********************************
> - * GRANT TABLE QUERIES AND USES
> +/*
> + * Version 1 and version 2 grant entries share a common prefix.  The
> + * fields of the prefix are documented as part of struct
> + * grant_entry_v1.
>   */
> +struct grant_entry_header {
> +    uint16_t flags;
> +    domid_t  domid;
> +};
> 
>  /*
> - * Reference to a grant entry in a specified domain's grant table.
> + * Version 2 of the grant entry structure, here is an union because three
> + * different types are suppotted: full_page, sub_page and transitive.
> + */
> +union grant_entry_v2 {
> +    struct grant_entry_header hdr;
> +
> +    /*
> +     * This member is used for V1-style full page grants, where either:
> +     *
> +     * -- hdr.type is GTF_accept_transfer, or
> +     * -- hdr.type is GTF_permit_access and GTF_sub_page is not set.
> +     *
> +     * In that case, the frame field has the same semantics as the
> +     * field of the same name in the V1 entry structure.
> +     */
> +    struct {
> +       struct grant_entry_header hdr;
> +       uint32_t pad0;
> +       uint64_t frame;
> +    } full_page;
> +
> +    /*
> +     * If the grant type is GTF_grant_access and GTF_sub_page is set,
> +     * @domid is allowed to access bytes [@page_off,@page_off+@length)
> +     * in frame @frame.
> +     */
> +    struct {
> +       struct grant_entry_header hdr;
> +       uint16_t page_off;
> +       uint16_t length;
> +       uint64_t frame;
> +    } sub_page;
> +
> +    /*
> +     * If the grant is GTF_transitive, @domid is allowed to use the
> +     * grant @gref in domain @trans_domid, as if it was the local
> +     * domain.  Obviously, the transitive access must be compatible
> +     * with the original grant.
> +     */
> +    struct {
> +       struct grant_entry_header hdr;
> +       domid_t trans_domid;
> +       uint16_t pad0;
> +       grant_ref_t gref;
> +    } transitive;
> +
> +    uint32_t __spacer[4]; /* Pad to a power of two */
> +};
> +
> +typedef uint16_t grant_status_t;
> +
> +/***********************************
> + * GRANT TABLE QUERIES AND USES
>   */
> -typedef uint32_t grant_ref_t;
> 
>  /*
>   * Handle to track a mapping created via a grant reference.
> @@ -322,6 +406,79 @@ struct gnttab_query_size {
>  DEFINE_GUEST_HANDLE_STRUCT(gnttab_query_size);
> 
>  /*
> + * GNTTABOP_unmap_and_replace: Destroy one or more grant-reference mappings
> + * tracked by <handle> but atomically replace the page table entry with one
> + * pointing to the machine address under <new_addr>.  <new_addr> will be
> + * redirected to the null entry.
> + * NOTES:
> + *  1. The call may fail in an undefined manner if either mapping is not
> + *     tracked by <handle>.
> + *  2. After executing a batch of unmaps, it is guaranteed that no stale
> + *     mappings will remain in the device or host TLBs.
> + */
> +#define GNTTABOP_unmap_and_replace    7
> +struct gnttab_unmap_and_replace {
> +    /* IN parameters. */
> +    uint64_t host_addr;
> +    uint64_t new_addr;
> +    grant_handle_t handle;
> +    /* OUT parameters. */
> +    int16_t  status;              /* GNTST_* */
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(gnttab_unmap_and_replace);
> +
> +/*
> + * GNTTABOP_set_version: Request a particular version of the grant
> + * table shared table structure.  This operation can only be performed
> + * once in any given domain.  It must be performed before any grants
> + * are activated; otherwise, the domain will be stuck with version 1.
> + * The only defined versions are 1 and 2.
> + */
> +#define GNTTABOP_set_version          8
> +struct gnttab_set_version {
> +    /* IN parameters */
> +    uint32_t version;
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(gnttab_set_version);
> +
> +/*
> + * GNTTABOP_get_status_frames: Get the list of frames used to store grant
> + * status for <dom>. In grant format version 2, the status is separated
> + * from the other shared grant fields to allow more efficient synchronization
> + * using barriers instead of atomic cmpexch operations.
> + * <nr_frames> specify the size of vector <frame_list>.
> + * The frame addresses are returned in the <frame_list>.
> + * Only <nr_frames> addresses are returned, even if the table is larger.
> + * NOTES:
> + *  1. <dom> may be specified as DOMID_SELF.
> + *  2. Only a sufficiently-privileged domain may specify <dom> != DOMID_SELF.
> + */
> +#define GNTTABOP_get_status_frames     9
> +struct gnttab_get_status_frames {
> +    /* IN parameters. */
> +    uint32_t nr_frames;
> +    domid_t  dom;
> +    /* OUT parameters. */
> +    int16_t  status;              /* GNTST_* */
> +    GUEST_HANDLE(uint64_t) frame_list;
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(gnttab_get_status_frames);
> +
> +/*
> + * GNTTABOP_get_version: Get the grant table version which is in
> + * effect for domain <dom>.
> + */
> +#define GNTTABOP_get_version          10
> +struct gnttab_get_version {
> +    /* IN parameters */
> +    domid_t dom;
> +    uint16_t pad;
> +    /* OUT parameters */
> +    uint32_t version;
> +};
> +DEFINE_GUEST_HANDLE_STRUCT(gnttab_get_version);
> +
> +/*
>   * Bitfield values for update_pin_status.flags.
>   */
>   /* Map the grant entry for access by I/O devices. */
> diff --git a/include/xen/interface/xen.h b/include/xen/interface/xen.h
> index 6a6e914..710afe0 100644
> --- a/include/xen/interface/xen.h
> +++ b/include/xen/interface/xen.h
> @@ -523,6 +523,8 @@ struct tmem_op {
>         } u;
>  };
> 
> +DEFINE_GUEST_HANDLE(uint64_t);

The kernel uses uN style types rather than the uintN_t style ones,
although include/xen/interface/grant_table.h seems not to adhere to that
at the moment. It might be worth cleaning that up as you go passed.

> +
>  #else /* __ASSEMBLY__ */
> 
>  /* In assembly code we cannot use C numeric constant suffixes. */
> --
> 1.7.6.4
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 02:39:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 02:39:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQzNA-0006ka-TE; Thu, 17 Nov 2011 02:39:12 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQzMi-0006YQ-3q
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 02:38:44 -0800
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1321526230!3872601!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1073 invoked from network); 17 Nov 2011 10:37:10 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-16.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 10:37:10 -0000
Received: by wwp14 with SMTP id 14so2161740wwp.24
	for <xen-devel@lists.xensource.com>;
	Thu, 17 Nov 2011 02:37:10 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:user-agent:date:subject:from:to:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=hL4Ao3dxTlyApjFSYlrvPeBgWLskkjiiCciMwE5/2D8=;
	b=Wi/ks5trmsT5XuzHVc0jKNVwITbocGw1MVz+D1T+1feSN2jDcXCv51Wn3n9AB/O/f8
	OA7+z9EqFfA9dvyCibkdKIcly+1VqsvxHxDSQEYZlojWulw2Wj8P8XpS28SupqdwiuKR
	KnYzUa4lvQYTrcvxxsK/dsAdCVtUuEGRhLnCQ=
Received: by 10.227.199.132 with SMTP id es4mr24002528wbb.5.1321526230123;
	Thu, 17 Nov 2011 02:37:10 -0800 (PST)
Received: from [192.168.1.3] (host86-129-245-239.range86-129.btcentralplus.com.
	[86.129.245.239])
	by mx.google.com with ESMTPS id b5sm36238556wbh.4.2011.11.17.02.37.08
	(version=SSLv3 cipher=OTHER); Thu, 17 Nov 2011 02:37:09 -0800 (PST)
User-Agent: Microsoft-Entourage/12.31.0.110725
Date: Thu, 17 Nov 2011 10:37:01 +0000
Subject: Re: [Xen-devel] [xen-4.1-testing test] 9805: regressions - FAIL
From: Keir Fraser <keir@xen.org>
To: Stefan Bader <stefan.bader@canonical.com>
Message-ID: <CAEA944D.343E5%keir@xen.org>
Thread-Topic: [Xen-devel] [xen-4.1-testing test] 9805: regressions - FAIL
Thread-Index: AcylFNbiStKbLeoHE02SmhRQQ+lXbA==
In-Reply-To: <4EC4E1DD.1030309@canonical.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: xen-devel@lists.xensource.com, Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Jan Beulich <JBeulich@suse.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 17/11/2011 10:28, "Stefan Bader" <stefan.bader@canonical.com> wrote:

>>> Hm, yes we should. I am pretty sure I hit that code path often enough,
>>> Wonder
>>> why I never saw any dead lock there...
>> 
>> Perhaps your dom0 kernel doesn't register a pirq_eoi_map.
>> 
> Would be the only explanation. And quite possible. Heck, I would need to know
> what that is used for anyway. :/ The kernel is 3.0 based the interrupt I was
> looking at just was a normal apic emulated through events one...

Our automated tests still use 2.6.32. It wouldn't surprise me if upstream
Linux 3 doesn't have the pirq_eoi_map stuff; it's an optimisation rather
than core absolutely-required functionality.

It's the dom0 PV kernel that matters in this case by the way, not the kernel
that you are running in HVM mode as a domU.

 -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 02:42:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 02:42:51 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQzQh-0007AX-NX; Thu, 17 Nov 2011 02:42:51 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQzQF-0006yr-0c
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 02:42:23 -0800
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1321526539!3510802!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13584 invoked from network); 17 Nov 2011 10:42:20 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 10:42:20 -0000
X-IronPort-AV: E=Sophos;i="4.69,526,1315180800"; 
   d="scan'208";a="8983485"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Nov 2011 10:42:19 +0000
Received: from kaball.uk.xensource.com (10.80.2.59) by
	LONPMAILMX01.citrite.net (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 17 Nov 2011 10:42:19 +0000
Date: Thu, 17 Nov 2011 10:43:01 +0000
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Keir Fraser <keir@xen.org>
Subject: Re: [Xen-devel] [xen-4.1-testing test] 9805: regressions - FAIL
In-Reply-To: <CAEA944D.343E5%keir@xen.org>
Message-ID: <alpine.DEB.2.00.1111171038310.3519@kaball-desktop>
References: <CAEA944D.343E5%keir@xen.org>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Stefan Bader <stefan.bader@canonical.com>, Jan, Beulich <JBeulich@suse.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 17 Nov 2011, Keir Fraser wrote:
> On 17/11/2011 10:28, "Stefan Bader" <stefan.bader@canonical.com> wrote:
> 
> >>> Hm, yes we should. I am pretty sure I hit that code path often enough,
> >>> Wonder
> >>> why I never saw any dead lock there...
> >> 
> >> Perhaps your dom0 kernel doesn't register a pirq_eoi_map.
> >> 
> > Would be the only explanation. And quite possible. Heck, I would need to know
> > what that is used for anyway. :/ The kernel is 3.0 based the interrupt I was
> > looking at just was a normal apic emulated through events one...
> 
> Our automated tests still use 2.6.32. It wouldn't surprise me if upstream
> Linux 3 doesn't have the pirq_eoi_map stuff; it's an optimisation rather
> than core absolutely-required functionality.
> 
> It's the dom0 PV kernel that matters in this case by the way, not the kernel
> that you are running in HVM mode as a domU.

In any case considering that the PHYSDEVOP_eoi case wasn't protected by
a lock before this patch, we could just add the spinlock around the new
code only, to protect accesses to the pirq_emuirq array.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 03:08:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 03:08:12 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQzpD-0007vc-6T; Thu, 17 Nov 2011 03:08:11 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQzk5-0007eF-1K
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 03:03:05 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1321527768!3815305!2
X-Originating-IP: [80.70.172.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29312 invoked from network); 17 Nov 2011 11:02:49 -0000
Received: from dgate10.ts.fujitsu.com (HELO dgate10.ts.fujitsu.com)
	(80.70.172.49)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 11:02:49 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Content-Type:MIME-Version:Subject:
	X-Mercurial-Node:Message-Id:In-Reply-To:Date:From:To;
	b=SNGeWdyOIXPKCWC+k5pra5kHd+eiuoEZKtxSIKLnwf9zhyhVFHfgymdT
	G27DG/fAkOQ1r85xM5apDW0teuSsAmqRJv8HDTWVLA25dxv4tRfm+pHTr
	BJFTFKxdygak/cRr8Y9dF2Vl85oXdJR63eIi2PiwFhVmybzzokThoe8EZ
	zisgCsZqG4h4vnJalktpJjoQK+1BEBejwpKrjwMQ9X06xQX4CORNAauUv
	nZOv9tAoDJvq9BliLHh8+CEqlxC7o;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1321527770; x=1353063770;
	h=mime-version:subject:message-id:in-reply-to:date:from:to;
	bh=yAzaVZMMpSnP9qqlNVivwoQZVJj+dcSUcqZpIMkpyHQ=;
	b=NPBuVROjaJQWyzjpaylJQ63Gmypb/IUm0QfgbrWkdIzaN8ycy50Fz5Ut
	z5i6DQV7PN6lIhvGGX48+Y7e/N9m6ck+L+TrarIbjMoz4IJmtYxjd2V5w
	cheAmvMlCiE5pke7WNzuV+gHlntaJzNNtnw7jcW64zRHlzwjI/T0f5JVj
	nva4jUb7wpU9UArWJlisQDy5u6fGL/wHB82qYu7ISX5jhICZq0ngkVbBX
	Q3K5u85iiNTZLg5h1Qow/juz8Ym5r;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,525,1315173600"; d="scan'208";a="93372007"
Received: from abgdgate40u.abg.fsc.net ([172.25.138.90])
	by dgate10u.abg.fsc.net with ESMTP; 17 Nov 2011 12:02:48 +0100
X-IronPort-AV: E=Sophos;i="4.69,526,1315173600"; d="scan'208";a="123621038"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate40u.abg.fsc.net with ESMTP; 17 Nov 2011 12:02:47 +0100
Received: from [172.17.21.25] (nehalem1.osd.mch.fsc.net [172.17.21.25])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id D2B6C95B158;
	Thu, 17 Nov 2011 12:02:47 +0100 (CET)
Content-Type: multipart/mixed; boundary="===============1752959235369208989=="
MIME-Version: 1.0
X-Mercurial-Node: 714852e181d3c1fdb1cde4f28a592110a9c7cf0d
Message-Id: <714852e181d3c1fdb1cd.1321527028@nehalem1>
In-Reply-To: <patchbomb.1321527024@nehalem1>
Date: Thu, 17 Nov 2011 11:50:28 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 4 of 5] [mq]: sched-credit-errtxt
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1752959235369208989==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

Patch subject is complete summary.


1 file changed, 1 insertion(+), 1 deletion(-)
tools/libxl/libxl.c |    2 +-



--===============1752959235369208989==
Content-Type: text/x-patch; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=xen-staging.hg-5.patch

# HG changeset patch
# User Juergen Gross <juergen.gross@ts.fujitsu.com>
# Date 1321520316 -3600
# Node ID 714852e181d3c1fdb1cde4f28a592110a9c7cf0d
# Parent  f88a51e4877548c6dc231ec1db409f84b6909816
[mq]: sched-credit-errtxt

diff -r f88a51e48775 -r 714852e181d3 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Nov 17 09:56:25 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Nov 17 09:58:36 2011 +0100
@@ -2679,7 +2679,7 @@ int libxl_sched_credit_domain_get(libxl_
 
     rc = xc_sched_credit_domain_get(ctx->xch, domid, &sdom);
     if (rc != 0) {
-        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "setting domain sched credit");
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain sched credit");
         return ERROR_FAIL;
     }
 

--===============1752959235369208989==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1752959235369208989==--


From xen-devel-bounces@lists.xensource.com Thu Nov 17 03:10:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 03:10:52 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQzrn-0008Jx-At; Thu, 17 Nov 2011 03:10:51 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQzk3-0007eC-U2
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 03:03:05 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1321527768!1868947!2
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6427 invoked from network); 17 Nov 2011 11:02:48 -0000
Received: from dgate20.ts.fujitsu.com (HELO dgate20.ts.fujitsu.com)
	(80.70.172.51)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 11:02:48 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Content-Type:MIME-Version:Subject:
	X-Mercurial-Node:Message-Id:In-Reply-To:Date:From:To;
	b=GmKzKxXeVfs+9i+YKUUetGtsmbpQ7WI7vexk4j1v740rH7u6lvJRYo7d
	TP+MXUepAm8QleUSNUivV8JIxPRcu4hsK0/WzBFgxcEfiwOrcd8sWkfaA
	dVo3nlFykSaNBfLzQxE86EVtBOfaU5UtB99rACEEL9Wwe9ZqXNxsTlw7+
	nofMDImXn0e146G6mJklZczKx3XbP4nUDdMF6vfsIFlho1kB6J5n9f1Dn
	zqdGDpH37HLQZf/PZDXPWQrsb3t1o;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1321527768; x=1353063768;
	h=mime-version:subject:message-id:in-reply-to:date:from:to;
	bh=XvTHrLvOvaR5gBifwGTJrmNMF3uz9bHzCAaKJykOmWc=;
	b=KMf0Z4i54OHgjxZmdUhhCKu4V2KQL+PGF2Ma5iYWrOUAItEIfPfIRfqA
	09sgPVekkQewrZErihN7sMZLMIScXNjzQtWxsBLkxRyc7j2bF9z42dlDw
	eCHsSSmTfEo9PlgTiua/9/StpcLCg59j07AmWdGkhGnnU11344cpAvood
	KgBAP9pP771tpvNtKyva2ANFU7jRs4qQJta7pT0cH3bUqwI0nKX/Mm230
	mMF13wtKUml/wHgbkqVXeKgwaOThd;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,525,1315173600"; d="scan'208";a="79240385"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate20u.abg.fsc.net with ESMTP; 17 Nov 2011 12:02:47 +0100
X-IronPort-AV: E=Sophos;i="4.69,525,1315173600"; d="scan'208";a="123228210"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 17 Nov 2011 12:02:47 +0100
Received: from [172.17.21.25] (nehalem1.osd.mch.fsc.net [172.17.21.25])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id A9A7495B158;
	Thu, 17 Nov 2011 12:02:47 +0100 (CET)
Content-Type: multipart/mixed; boundary="===============4321059742825423872=="
MIME-Version: 1.0
X-Mercurial-Node: b83edf5a1c9483b908dacfb5e02033071c7aca3e
Message-Id: <b83edf5a1c9483b908da.1321527025@nehalem1>
In-Reply-To: <patchbomb.1321527024@nehalem1>
Date: Thu, 17 Nov 2011 11:50:25 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 1 of 5] [mq]: sched-credit-options
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============4321059742825423872==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

Patch subject is complete summary.


2 files changed, 26 insertions(+), 7 deletions(-)
docs/man/xl.pod.1        |   15 ++++++++++-----
tools/libxl/xl_cmdimpl.c |   18 ++++++++++++++++--



--===============4321059742825423872==
Content-Type: text/x-patch; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=xen-staging.hg-5.patch

# HG changeset patch
# User Juergen Gross <juergen.gross@ts.fujitsu.com>
# Date 1321512799 -3600
# Node ID b83edf5a1c9483b908dacfb5e02033071c7aca3e
# Parent  fd3567cafe1c7ccd0ddba0ad7fb067d435e13529
[mq]: sched-credit-options

diff -r fd3567cafe1c -r b83edf5a1c94 docs/man/xl.pod.1
--- a/docs/man/xl.pod.1	Tue Nov 15 14:50:18 2011 +0100
+++ b/docs/man/xl.pod.1	Thu Nov 17 07:53:19 2011 +0100
@@ -579,25 +579,30 @@ default B<credit> is used for scheduling
 
 =over 4
 
-=item B<sched-credit> [ B<-d> I<domain-id> [ B<-w>[B<=>I<WEIGHT>] | B<-c>[B<=>I<CAP>] ] ]
+=item B<sched-credit> [I<OPTIONS>]
 
-Set credit scheduler parameters.  The credit scheduler is a
+Set or get credit scheduler parameters.  The credit scheduler is a
 proportional fair share CPU scheduler built from the ground up to be
 work conserving on SMP hosts.
 
 Each domain (including Domain0) is assigned a weight and a cap.
 
-B<PARAMETERS>
+B<OPTIONS>
 
 =over 4
 
-=item I<WEIGHT>
+=item B<-d DOMAIN>, B<--domain=DOMAIN>
+
+Specify domain for which scheduler parameters are to be modified or retrieved.
+Mandatory for modifying scheduler parameters.
+
+=item B<-w WEIGHT>, B<--weight=WEIGHT>
 
 A domain with a weight of 512 will get twice as much CPU as a domain
 with a weight of 256 on a contended host. Legal weights range from 1
 to 65535 and the default is 256.
 
-=item I<CAP>
+=item B<-c CAP>, B<--cap=CAP>
 
 The cap optionally fixes the maximum amount of CPU a domain will be
 able to consume, even if the host system has idle CPU cycles. The cap
diff -r fd3567cafe1c -r b83edf5a1c94 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Tue Nov 15 14:50:18 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Thu Nov 17 07:53:19 2011 +0100
@@ -3716,8 +3716,19 @@ int main_sched_credit(int argc, char **a
     const char *dom = NULL;
     int weight = 256, cap = 0, opt_w = 0, opt_c = 0;
     int opt, rc;
-
-    while ((opt = def_getopt(argc, argv, "d:w:c:", "sched-credit", 0)) != -1) {
+    int option_index = 0;
+    static struct option long_options[] = {
+        {"domain", 1, 0, 'd'},
+        {"weight", 1, 0, 'w'},
+        {"cap", 1, 0, 'c'},
+        {"help", 0, 0, 'h'},
+        {0, 0, 0, 0}
+    };
+
+    while (1) {
+        opt = getopt_long(argc, argv, "d:w:c:h", long_options, &option_index);
+        if (opt == -1)
+            break;
         switch (opt) {
         case 0: case 2:
             return opt;
@@ -3732,6 +3743,9 @@ int main_sched_credit(int argc, char **a
             cap = strtol(optarg, NULL, 10);
             opt_c = 1;
             break;
+        case 'h':
+            help("sched-credit");
+            return 0;
         }
     }
 

--===============4321059742825423872==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============4321059742825423872==--


From xen-devel-bounces@lists.xensource.com Thu Nov 17 03:12:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 03:12:22 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQztG-0000Gz-KE; Thu, 17 Nov 2011 03:12:22 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQzk5-0007eE-1G
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 03:03:05 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1321527768!3815305!1
X-Originating-IP: [80.70.172.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29285 invoked from network); 17 Nov 2011 11:02:49 -0000
Received: from dgate10.ts.fujitsu.com (HELO dgate10.ts.fujitsu.com)
	(80.70.172.49)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 11:02:49 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Content-Type:MIME-Version:Subject:
	X-Mercurial-Node:Message-Id:In-Reply-To:Date:From:To;
	b=lW7qxEA8LnfsWZOL+oPNxzMJkrQz+pbUPxL7qB8d3OhqgRWzxDGU//WD
	WDMhs2NuZtXgx9doGHQzTkaQqZbXGIE+Eb/dzsu8r1GTbKqyJvWdo4I3O
	5XnhT1fj+sXatSYmUHDtmMmuqT3Rtf4O34G2CqCeOqzw1fXkn0ZSPCgv3
	j7N0uutQPiGnlw/zphZ5lprXvFS6g/3EEtK2FT+fLeH7Tz9Mw5YmDW8Em
	Ci7vaWzjiCejz1rtoMS2XXUJXhyy0;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1321527769; x=1353063769;
	h=mime-version:subject:message-id:in-reply-to:date:from:to;
	bh=u/QyRvrAZ0wfELoBXTfxrjVcD2p27ZxSDT1yRJipMcA=;
	b=bbknIoSLrg+UuK3QrMXgOvwh8DEQfXWb6yhAhFKl+5nVhneMUBuAX80G
	75RJTyFfdtxHLiaALnCQfVpaQGjUTw6Pcju0GMK/qpMgLERU0n9WCCfnA
	HC8SJcN6QTOUUaIYGo7u8SUaaWJdl6qNH1JZ9kh9PdzuZuAp/kZdGc99t
	VlgQiAFIj6dgBi6K1aDI5FgkkUtSu6DBZr6FzRTPlcm9TouSMld0VWcJS
	Cq/uHy4dFJQnrkeuzMmxUaj3wQRTL;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,525,1315173600"; d="scan'208";a="93372005"
Received: from abgdgate40u.abg.fsc.net ([172.25.138.90])
	by dgate10u.abg.fsc.net with ESMTP; 17 Nov 2011 12:02:48 +0100
X-IronPort-AV: E=Sophos;i="4.69,526,1315173600"; d="scan'208";a="123621037"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate40u.abg.fsc.net with ESMTP; 17 Nov 2011 12:02:47 +0100
Received: from [172.17.21.25] (nehalem1.osd.mch.fsc.net [172.17.21.25])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id C54BB95AB9F;
	Thu, 17 Nov 2011 12:02:47 +0100 (CET)
Content-Type: multipart/mixed; boundary="===============0738780962352054654=="
MIME-Version: 1.0
X-Mercurial-Node: f88a51e4877548c6dc231ec1db409f84b6909816
Message-Id: <f88a51e4877548c6dc23.1321527027@nehalem1>
In-Reply-To: <patchbomb.1321527024@nehalem1>
Date: Thu, 17 Nov 2011 11:50:27 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 3 of 5] [mq]: sched-credit2
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0738780962352054654==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

Patch subject is complete summary.


7 files changed, 213 insertions(+)
docs/man/xl.pod.1           |   29 ++++++++++
tools/libxl/libxl.c         |   48 +++++++++++++++++
tools/libxl/libxl.h         |    4 +
tools/libxl/libxl_types.idl |    4 +
tools/libxl/xl.h            |    1 
tools/libxl/xl_cmdimpl.c    |  119 +++++++++++++++++++++++++++++++++++++++++++
tools/libxl/xl_cmdtable.c   |    8 ++



--===============0738780962352054654==
Content-Type: text/x-patch; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=xen-staging.hg-5.patch

# HG changeset patch
# User Juergen Gross <juergen.gross@ts.fujitsu.com>
# Date 1321520185 -3600
# Node ID f88a51e4877548c6dc231ec1db409f84b6909816
# Parent  8ce33d756b39abdcffc7a3ccc45f85c0a9a79ccd
[mq]: sched-credit2

diff -r 8ce33d756b39 -r f88a51e48775 docs/man/xl.pod.1
--- a/docs/man/xl.pod.1	Thu Nov 17 09:36:52 2011 +0100
+++ b/docs/man/xl.pod.1	Thu Nov 17 09:56:25 2011 +0100
@@ -616,6 +616,35 @@ Restrict output to domains in the specif
 
 =back
 
+=item B<sched-credit2> [I<OPTIONS>]
+
+Set or get credit2 scheduler parameters.  The credit2 scheduler is a
+proportional fair share CPU scheduler built from the ground up to be
+work conserving on SMP hosts.
+
+Each domain (including Domain0) is assigned a weight.
+
+B<OPTIONS>
+
+=over 4
+
+=item B<-d DOMAIN>, B<--domain=DOMAIN>
+
+Specify domain for which scheduler parameters are to be modified or retrieved.
+Mandatory for modifying scheduler parameters.
+
+=item B<-w WEIGHT>, B<--weight=WEIGHT>
+
+A domain with a weight of 512 will get twice as much CPU as a domain
+with a weight of 256 on a contended host. Legal weights range from 1
+to 65535 and the default is 256.
+
+=item B<-p CPUPOOL>, B<--cpupool=CPUPOOL>
+
+Restrict output to domains in the specified cpupool.
+
+=back
+
 =back
 
 =head1 CPUPOOLS COMMANDS
diff -r 8ce33d756b39 -r f88a51e48775 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Nov 17 09:36:52 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Nov 17 09:56:25 2011 +0100
@@ -2729,6 +2729,54 @@ int libxl_sched_credit_domain_set(libxl_
     return 0;
 }
 
+int libxl_sched_credit2_domain_get(libxl_ctx *ctx, uint32_t domid, libxl_sched_credit2 *scinfo)
+{
+    struct xen_domctl_sched_credit2 sdom;
+    int rc;
+
+    rc = xc_sched_credit2_domain_get(ctx->xch, domid, &sdom);
+    if (rc != 0) {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain sched credit2");
+        return ERROR_FAIL;
+    }
+
+    scinfo->weight = sdom.weight;
+
+    return 0;
+}
+
+int libxl_sched_credit2_domain_set(libxl_ctx *ctx, uint32_t domid, libxl_sched_credit2 *scinfo)
+{
+    struct xen_domctl_sched_credit2 sdom;
+    xc_domaininfo_t domaininfo;
+    int rc;
+
+    rc = xc_domain_getinfolist(ctx->xch, domid, 1, &domaininfo);
+    if (rc < 0) {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain info list");
+        return ERROR_FAIL;
+    }
+    if (rc != 1 || domaininfo.domain != domid)
+        return ERROR_INVAL;
+
+
+    if (scinfo->weight < 1 || scinfo->weight > 65535) {
+        LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc,
+            "Cpu weight out of range, valid values are within range from 1 to 65535");
+        return ERROR_INVAL;
+    }
+
+    sdom.weight = scinfo->weight;
+
+    rc = xc_sched_credit2_domain_set(ctx->xch, domid, &sdom);
+    if ( rc < 0 ) {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "setting domain sched credit2");
+        return ERROR_FAIL;
+    }
+
+    return 0;
+}
+
 static int trigger_type_from_string(char *trigger_name)
 {
     if (!strcmp(trigger_name, "nmi"))
diff -r 8ce33d756b39 -r f88a51e48775 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Thu Nov 17 09:36:52 2011 +0100
+++ b/tools/libxl/libxl.h	Thu Nov 17 09:56:25 2011 +0100
@@ -567,6 +567,10 @@ int libxl_sched_credit_domain_get(libxl_
                                   libxl_sched_credit *scinfo);
 int libxl_sched_credit_domain_set(libxl_ctx *ctx, uint32_t domid,
                                   libxl_sched_credit *scinfo);
+int libxl_sched_credit2_domain_get(libxl_ctx *ctx, uint32_t domid,
+                                   libxl_sched_credit2 *scinfo);
+int libxl_sched_credit2_domain_set(libxl_ctx *ctx, uint32_t domid,
+                                   libxl_sched_credit2 *scinfo);
 int libxl_send_trigger(libxl_ctx *ctx, uint32_t domid,
                        char *trigger_name, uint32_t vcpuid);
 int libxl_send_sysrq(libxl_ctx *ctx, uint32_t domid, char sysrq);
diff -r 8ce33d756b39 -r f88a51e48775 tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl	Thu Nov 17 09:36:52 2011 +0100
+++ b/tools/libxl/libxl_types.idl	Thu Nov 17 09:56:25 2011 +0100
@@ -373,3 +373,7 @@ libxl_sched_credit = Struct("sched_credi
     ("weight", integer),
     ("cap", integer),
     ], dispose_fn=None)
+
+libxl_sched_credit2 = Struct("sched_credit2", [
+    ("weight", integer),
+    ], dispose_fn=None)
diff -r 8ce33d756b39 -r f88a51e48775 tools/libxl/xl.h
--- a/tools/libxl/xl.h	Thu Nov 17 09:36:52 2011 +0100
+++ b/tools/libxl/xl.h	Thu Nov 17 09:56:25 2011 +0100
@@ -55,6 +55,7 @@ int main_memmax(int argc, char **argv);
 int main_memmax(int argc, char **argv);
 int main_memset(int argc, char **argv);
 int main_sched_credit(int argc, char **argv);
+int main_sched_credit2(int argc, char **argv);
 int main_domid(int argc, char **argv);
 int main_domname(int argc, char **argv);
 int main_rename(int argc, char **argv);
diff -r 8ce33d756b39 -r f88a51e48775 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Thu Nov 17 09:36:52 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Thu Nov 17 09:56:25 2011 +0100
@@ -3719,6 +3719,53 @@ static int sched_credit_domain_output(
     return 0;
 }
 
+static int sched_credit2_domain_get(
+    int domid, libxl_sched_credit2 *scinfo)
+{
+    int rc;
+
+    rc = libxl_sched_credit2_domain_get(ctx, domid, scinfo);
+    if (rc)
+        fprintf(stderr, "libxl_sched_credit2_domain_get failed.\n");
+
+    return rc;
+}
+
+static int sched_credit2_domain_set(
+    int domid, libxl_sched_credit2 *scinfo)
+{
+    int rc;
+
+    rc = libxl_sched_credit2_domain_set(ctx, domid, scinfo);
+    if (rc)
+        fprintf(stderr, "libxl_sched_credit2_domain_set failed.\n");
+
+    return rc;
+}
+
+static int sched_credit2_domain_output(
+    int domid)
+{
+    char *domname;
+    libxl_sched_credit2 scinfo;
+    int rc;
+
+    if (domid < 0) {
+        printf("%-33s %4s %6s\n", "Name", "ID", "Weight");
+        return 0;
+    }
+    rc = sched_credit2_domain_get(domid, &scinfo);
+    if (rc)
+        return rc;
+    domname = libxl_domid_to_name(ctx, domid);
+    printf("%-33s %4d %6d\n",
+        domname,
+        domid,
+        scinfo.weight);
+    free(domname);
+    return 0;
+}
+
 static int sched_domain_output(
     uint32_t sched, int (*output)(int), const char *cpupool)
 {
@@ -3845,6 +3892,78 @@ int main_sched_credit(int argc, char **a
             if (opt_c)
                 scinfo.cap = cap;
             rc = sched_credit_domain_set(domid, &scinfo);
+            if (rc)
+                return -rc;
+        }
+    }
+
+    return 0;
+}
+
+int main_sched_credit2(int argc, char **argv)
+{
+    libxl_sched_credit2 scinfo;
+    const char *dom = NULL;
+    const char *cpupool = NULL;
+    int weight = 256, opt_w = 0;
+    int opt, rc;
+    int option_index = 0;
+    static struct option long_options[] = {
+        {"domain", 1, 0, 'd'},
+        {"weight", 1, 0, 'w'},
+        {"cpupool", 1, 0, 'p'},
+        {"help", 0, 0, 'h'},
+        {0, 0, 0, 0}
+    };
+
+    while (1) {
+        opt = getopt_long(argc, argv, "d:w:p:h", long_options, &option_index);
+        if (opt == -1)
+            break;
+        switch (opt) {
+        case 0: case 2:
+            return opt;
+        case 'd':
+            dom = optarg;
+            break;
+        case 'w':
+            weight = strtol(optarg, NULL, 10);
+            opt_w = 1;
+            break;
+        case 'p':
+            cpupool = optarg;
+            break;
+        case 'h':
+            help("sched-credit");
+            return 0;
+        }
+    }
+
+    if (cpupool && (dom || opt_w)) {
+        fprintf(stderr, "Specifying a cpupool is not allowed with other options.\n");
+        return 1;
+    }
+    if (!dom && opt_w) {
+        fprintf(stderr, "Must specify a domain.\n");
+        return 1;
+    }
+
+    if (!dom) { /* list all domain's credit scheduler info */
+        return -sched_domain_output(XEN_SCHEDULER_CREDIT2, sched_credit2_domain_output, cpupool);
+    } else {
+        find_domain(dom);
+
+        rc = sched_credit2_domain_get(domid, &scinfo);
+        if (rc)
+            return -rc;
+
+        if (!opt_w) { /* output credit2 scheduler info */
+            sched_credit2_domain_output(-1);
+            return -sched_credit2_domain_output(domid);
+        } else { /* set credit2 scheduler paramaters */
+            if (opt_w)
+                scinfo.weight = weight;
+            rc = sched_credit2_domain_set(domid, &scinfo);
             if (rc)
                 return -rc;
         }
diff -r 8ce33d756b39 -r f88a51e48775 tools/libxl/xl_cmdtable.c
--- a/tools/libxl/xl_cmdtable.c	Thu Nov 17 09:36:52 2011 +0100
+++ b/tools/libxl/xl_cmdtable.c	Thu Nov 17 09:56:25 2011 +0100
@@ -196,6 +196,14 @@ struct cmd_spec cmd_table[] = {
       "-d DOMAIN, --domain=DOMAIN     Domain to modify\n"
       "-w WEIGHT, --weight=WEIGHT     Weight (int)\n"
       "-c CAP, --cap=CAP              Cap (int)\n"
+      "-p CPUPOOL, --cpupool=CPUPOOL  Restrict output to CPUPOOL"
+    },
+    { "sched-credit2",
+      &main_sched_credit2, 0,
+      "Get/set credit2 scheduler parameters",
+      "[-d <Domain> [-w[=WEIGHT]]] [-p CPUPOOL]",
+      "-d DOMAIN, --domain=DOMAIN     Domain to modify\n"
+      "-w WEIGHT, --weight=WEIGHT     Weight (int)\n"
       "-p CPUPOOL, --cpupool=CPUPOOL  Restrict output to CPUPOOL"
     },
     { "domid",

--===============0738780962352054654==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0738780962352054654==--


From xen-devel-bounces@lists.xensource.com Thu Nov 17 03:13:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 03:13:17 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQzu9-0000ei-Jd; Thu, 17 Nov 2011 03:13:17 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQzk3-0007eB-U1
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 03:03:04 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1321527768!1868947!1
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6422 invoked from network); 17 Nov 2011 11:02:48 -0000
Received: from dgate20.ts.fujitsu.com (HELO dgate20.ts.fujitsu.com)
	(80.70.172.51)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 11:02:48 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Content-Type:MIME-Version:
	Content-Transfer-Encoding:Subject:Message-Id:Date:From:To;
	b=c8Xn2ls1uomoFNk3ut1SXRBR6ztxOsEIsidXRBnnPZdRLr+mpohJBmHe
	qFozL0TpngFVxydceKTRfBLWEFBTSoSu1COApK/h7lk1QNyGs1carvgbp
	25XWJlsgdbTkN4hwymiuCIChZRfjt7XXTh7zTBGUpWUD6CIFuQ/P9au6K
	GWNS/uQIbvEgXA39R5yaal6jfk5bSRmTLSJjnNsD3tXLt4uVrv8b2Pykg
	DgzcrXDA1ZO/9Vac3OBOeGixrqx+Y;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1321527768; x=1353063768;
	h=mime-version:content-transfer-encoding:subject:
	message-id:date:from:to;
	bh=dxOXMyb9NZfd5q4YG6E2nioxB6jph7Y766lYU+d1epE=;
	b=LSQe/OvM9nXw+uMFnqlkj1jcAoJ8bDlkPz0Hwfd5fPnEs5eFFx+rUjFp
	GrCFCJn2KIyKMGuN7rTBDurdVpy3TW5k70DKITFaFNWl1059U6txhUYFx
	EgskulvMp+1AmOpCX5yAjLyqN8N8sgM5g1kVpXsR/XOLi4CacPmUAaQzL
	c0MvpJZvFcIEc32kb0yLVkal7bN7Tld3zik0V4ghNFQJpR355trJKyC2Y
	won0YboBIQZ/1+3WEvxL/Qxl28N0H;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,525,1315173600"; d="scan'208";a="79240384"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate20u.abg.fsc.net with ESMTP; 17 Nov 2011 12:02:47 +0100
X-IronPort-AV: E=Sophos;i="4.69,525,1315173600"; d="scan'208";a="123228211"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 17 Nov 2011 12:02:47 +0100
Received: from [172.17.21.25] (nehalem1.osd.mch.fsc.net [172.17.21.25])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id 9C07295AB9F;
	Thu, 17 Nov 2011 12:02:47 +0100 (CET)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1321527024@nehalem1>
Date: Thu, 17 Nov 2011 11:50:24 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 0 of 5] xl scheduler support
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This patch series enhances scheduler support of xl.

Patch 1: xl sched-credit: support long options
Patch 2: Support cpupools in xl sched-credit
Patch 3: Support of xl sched-credit2
Patch 4: Correct error message in libxl_sched_credit_domain_get()
Patch 5: Support of xl sched-sedf

7 files changed, 622 insertions(+), 38 deletions(-)
docs/man/xl.pod.1           |   90 ++++++++-
tools/libxl/libxl.c         |  100 ++++++++++
tools/libxl/libxl.h         |    8 
tools/libxl/libxl_types.idl |   13 +
tools/libxl/xl.h            |    2 
tools/libxl/xl_cmdimpl.c    |  418 +++++++++++++++++++++++++++++++++++++++----
tools/libxl/xl_cmdtable.c   |   29 ++

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 03:14:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 03:14:13 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQzv3-000126-Ob; Thu, 17 Nov 2011 03:14:13 -0800
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQzk5-0007eG-2D
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 03:03:05 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1321527768!3815305!3
X-Originating-IP: [80.70.172.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29348 invoked from network); 17 Nov 2011 11:02:49 -0000
Received: from dgate10.ts.fujitsu.com (HELO dgate10.ts.fujitsu.com)
	(80.70.172.49)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 11:02:49 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Content-Type:MIME-Version:Subject:
	X-Mercurial-Node:Message-Id:In-Reply-To:Date:From:To;
	b=LKMoSYtkmREDe5AGxuMVVdVWvLQXB15vZyCim6wvmdgqTOTk6bwSDpUe
	Dz2GVLVxgeAlJ9o8DEEhI1Ypmb+Kf+sOJc5bsKhqOO3TZLdlDkbFWd9xl
	3OUfZ4oy0ZRmMwTs5TlDJGHXtSfbi08jtgr1gOLYzZyCkTobLcswO//tO
	dJS+njDZjzEMmqlqV0mnE9t3JjQLJeviJ/zrlX6Uj/un2mHgoZ20MI98k
	VKUNEzsOzT2hA/odpl5i1oTO0mXx4;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1321527770; x=1353063770;
	h=mime-version:subject:message-id:in-reply-to:date:from:to;
	bh=UINah19GU2AozXGhm4APDGnv1l7L40C+3lca5dt/h7c=;
	b=kAiyVfrsaPKGYKIKjbrkcvO3o/yZ67xq6WfsC9IM9IZdVFwRs2srJRe7
	9O6BI8HWpO/POHZvoApQpROFooQxGwVv/bOcxY0ecFOULNJJIkYakowv+
	e/BVbGdQ2Wfwx/P/mpzVXzGyXDyP+FAu6nCjMGTgFV8QWePMe6EDQ37Nz
	7YjQZKREgJcmlXvzqp/1qKPDhc4UYIaFW423MP8eI7ET+kYcrq/cQZ7FT
	CNgPwp1le4tg7EB7DweZzBR7XQD1X;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,525,1315173600"; d="scan'208";a="93372008"
Received: from abgdgate40u.abg.fsc.net ([172.25.138.90])
	by dgate10u.abg.fsc.net with ESMTP; 17 Nov 2011 12:02:48 +0100
X-IronPort-AV: E=Sophos;i="4.69,526,1315173600"; d="scan'208";a="123621041"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate40u.abg.fsc.net with ESMTP; 17 Nov 2011 12:02:47 +0100
Received: from [172.17.21.25] (nehalem1.osd.mch.fsc.net [172.17.21.25])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id E003795AB9F;
	Thu, 17 Nov 2011 12:02:47 +0100 (CET)
Content-Type: multipart/mixed; boundary="===============5201636525507711880=="
MIME-Version: 1.0
X-Mercurial-Node: 0d1eb69dbd1c691b3bee9f95a40c5b000b3a8705
Message-Id: <0d1eb69dbd1c691b3bee.1321527029@nehalem1>
In-Reply-To: <patchbomb.1321527024@nehalem1>
Date: Thu, 17 Nov 2011 11:50:29 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 5 of 5] [mq]: sched-sedf
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============5201636525507711880==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

Patch subject is complete summary.


7 files changed, 284 insertions(+)
docs/man/xl.pod.1           |   42 +++++++++++
tools/libxl/libxl.c         |   49 ++++++++++++
tools/libxl/libxl.h         |    4 +
tools/libxl/libxl_types.idl |    8 ++
tools/libxl/xl.h            |    1 
tools/libxl/xl_cmdimpl.c    |  164 +++++++++++++++++++++++++++++++++++++++++++
tools/libxl/xl_cmdtable.c   |   16 ++++



--===============5201636525507711880==
Content-Type: text/x-patch; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=xen-staging.hg-5.patch

# HG changeset patch
# User Juergen Gross <juergen.gross@ts.fujitsu.com>
# Date 1321526262 -3600
# Node ID 0d1eb69dbd1c691b3bee9f95a40c5b000b3a8705
# Parent  714852e181d3c1fdb1cde4f28a592110a9c7cf0d
[mq]: sched-sedf

diff -r 714852e181d3 -r 0d1eb69dbd1c docs/man/xl.pod.1
--- a/docs/man/xl.pod.1	Thu Nov 17 09:58:36 2011 +0100
+++ b/docs/man/xl.pod.1	Thu Nov 17 11:37:42 2011 +0100
@@ -645,6 +645,48 @@ Restrict output to domains in the specif
 
 =back
 
+=item B<sched-sedf> [I<OPTIONS>]
+
+Set or get Simple EDF (Earliest Deadline First) scheduler parameters. This
+scheduler provides weighted CPU sharing in an intuitive way and uses
+realtime-algorithms to ensure time guarantees.  For more information see
+docs/misc/sedf_scheduler_mini-HOWTO.txt in the Xen distribution.
+
+B<OPTIONS>
+
+=over 4
+
+=item B<-d DOMAIN>, B<--domain=DOMAIN>
+
+Specify domain for which scheduler parameters are to be modified or retrieved.
+Mandatory for modifying scheduler parameters.
+
+=item B<-p PERIOD>, B<--period=PERIOD>
+
+The normal EDF scheduling usage in milliseconds.
+
+=item B<-s SLICE>, B<--slice=SLICE>
+
+The normal EDF scheduling usage in milliseconds.
+
+=item B<-l LATENCY>, B<--latency=LATENCY>
+
+Scaled period if domain is doing heavy I/O.
+
+=item B<-e EXTRA>, B<--extra=EXTRA>
+
+Flag for allowing domain to run in extra time (0 or 1).
+
+=item B<-w WEIGHT>, B<--weight=WEIGHT>
+
+Another way of setting CPU slice.
+
+=item B<-c CPUPOOL>, B<--cpupool=CPUPOOL>
+
+Restrict output to domains in the specified cpupool.
+
+=back
+
 =back
 
 =head1 CPUPOOLS COMMANDS
diff -r 714852e181d3 -r 0d1eb69dbd1c tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Nov 17 09:58:36 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Nov 17 11:37:42 2011 +0100
@@ -2777,6 +2777,55 @@ int libxl_sched_credit2_domain_set(libxl
     return 0;
 }
 
+int libxl_sched_sedf_domain_get(libxl_ctx *ctx, uint32_t domid, libxl_sched_sedf *scinfo)
+{
+    uint64_t period;
+    uint64_t slice;
+    uint64_t latency;
+    uint16_t extratime;
+    uint16_t weight;
+    int rc;
+
+    rc = xc_sedf_domain_get(ctx->xch, domid, &period, &slice, &latency, &extratime, &weight);
+    if (rc != 0) {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain sched sedf");
+        return ERROR_FAIL;
+    }
+
+    scinfo->period = period / 1000000;
+    scinfo->slice = slice / 1000000;
+    scinfo->latency = latency / 1000000;
+    scinfo->extratime = extratime;
+    scinfo->weight = weight;
+
+    return 0;
+}
+
+int libxl_sched_sedf_domain_set(libxl_ctx *ctx, uint32_t domid, libxl_sched_sedf *scinfo)
+{
+    xc_domaininfo_t domaininfo;
+    int rc;
+
+    rc = xc_domain_getinfolist(ctx->xch, domid, 1, &domaininfo);
+    if (rc < 0) {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain info list");
+        return ERROR_FAIL;
+    }
+    if (rc != 1 || domaininfo.domain != domid)
+        return ERROR_INVAL;
+
+
+    rc = xc_sedf_domain_set(ctx->xch, domid, scinfo->period * 1000000,
+                            scinfo->slice * 1000000, scinfo->latency * 1000000,
+                            scinfo->extratime, scinfo->weight);
+    if ( rc < 0 ) {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "setting domain sched sedf");
+        return ERROR_FAIL;
+    }
+
+    return 0;
+}
+
 static int trigger_type_from_string(char *trigger_name)
 {
     if (!strcmp(trigger_name, "nmi"))
diff -r 714852e181d3 -r 0d1eb69dbd1c tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Thu Nov 17 09:58:36 2011 +0100
+++ b/tools/libxl/libxl.h	Thu Nov 17 11:37:42 2011 +0100
@@ -571,6 +571,10 @@ int libxl_sched_credit2_domain_get(libxl
                                    libxl_sched_credit2 *scinfo);
 int libxl_sched_credit2_domain_set(libxl_ctx *ctx, uint32_t domid,
                                    libxl_sched_credit2 *scinfo);
+int libxl_sched_sedf_domain_get(libxl_ctx *ctx, uint32_t domid,
+                                libxl_sched_sedf *scinfo);
+int libxl_sched_sedf_domain_set(libxl_ctx *ctx, uint32_t domid,
+                                libxl_sched_sedf *scinfo);
 int libxl_send_trigger(libxl_ctx *ctx, uint32_t domid,
                        char *trigger_name, uint32_t vcpuid);
 int libxl_send_sysrq(libxl_ctx *ctx, uint32_t domid, char sysrq);
diff -r 714852e181d3 -r 0d1eb69dbd1c tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl	Thu Nov 17 09:58:36 2011 +0100
+++ b/tools/libxl/libxl_types.idl	Thu Nov 17 11:37:42 2011 +0100
@@ -377,3 +377,11 @@ libxl_sched_credit2 = Struct("sched_cred
 libxl_sched_credit2 = Struct("sched_credit2", [
     ("weight", integer),
     ], dispose_fn=None)
+
+libxl_sched_sedf = Struct("sched_sedf", [
+    ("period", integer),
+    ("slice", integer),
+    ("latency", integer),
+    ("extratime", integer),
+    ("weight", integer),
+    ], dispose_fn=None)
diff -r 714852e181d3 -r 0d1eb69dbd1c tools/libxl/xl.h
--- a/tools/libxl/xl.h	Thu Nov 17 09:58:36 2011 +0100
+++ b/tools/libxl/xl.h	Thu Nov 17 11:37:42 2011 +0100
@@ -56,6 +56,7 @@ int main_memset(int argc, char **argv);
 int main_memset(int argc, char **argv);
 int main_sched_credit(int argc, char **argv);
 int main_sched_credit2(int argc, char **argv);
+int main_sched_sedf(int argc, char **argv);
 int main_domid(int argc, char **argv);
 int main_domname(int argc, char **argv);
 int main_rename(int argc, char **argv);
diff -r 714852e181d3 -r 0d1eb69dbd1c tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Thu Nov 17 09:58:36 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Thu Nov 17 11:37:42 2011 +0100
@@ -3766,6 +3766,57 @@ static int sched_credit2_domain_output(
     return 0;
 }
 
+static int sched_sedf_domain_get(
+    int domid, libxl_sched_sedf *scinfo)
+{
+    int rc;
+
+    rc = libxl_sched_sedf_domain_get(ctx, domid, scinfo);
+    if (rc)
+        fprintf(stderr, "libxl_sched_sedf_domain_get failed.\n");
+
+    return rc;
+}
+
+static int sched_sedf_domain_set(
+    int domid, libxl_sched_sedf *scinfo)
+{
+    int rc;
+
+    rc = libxl_sched_sedf_domain_set(ctx, domid, scinfo);
+    if (rc)
+        fprintf(stderr, "libxl_sched_sedf_domain_set failed.\n");
+
+    return rc;
+}
+
+static int sched_sedf_domain_output(
+    int domid)
+{
+    char *domname;
+    libxl_sched_sedf scinfo;
+    int rc;
+
+    if (domid < 0) {
+        printf("%-33s %4s %6s %-6s %7s %5s %6s\n", "Name", "ID", "Period", "Slice", "Latency", "Extra", "Weight");
+        return 0;
+    }
+    rc = sched_sedf_domain_get(domid, &scinfo);
+    if (rc)
+        return rc;
+    domname = libxl_domid_to_name(ctx, domid);
+    printf("%-33s %4d %6d %6d %7d %5d %6d\n",
+        domname,
+        domid,
+        scinfo.period,
+        scinfo.slice,
+        scinfo.latency,
+        scinfo.extratime,
+        scinfo.weight);
+    free(domname);
+    return 0;
+}
+
 static int sched_domain_output(
     uint32_t sched, int (*output)(int), const char *cpupool)
 {
@@ -3964,6 +4015,119 @@ int main_sched_credit2(int argc, char **
             if (opt_w)
                 scinfo.weight = weight;
             rc = sched_credit2_domain_set(domid, &scinfo);
+            if (rc)
+                return -rc;
+        }
+    }
+
+    return 0;
+}
+
+int main_sched_sedf(int argc, char **argv)
+{
+    libxl_sched_sedf scinfo;
+    const char *dom = NULL;
+    const char *cpupool = NULL;
+    int period = 0, opt_p = 0;
+    int slice = 0, opt_s = 0;
+    int latency = 0, opt_l = 0;
+    int extra = 0, opt_e = 0;
+    int weight = 0, opt_w = 0;
+    int opt, rc;
+    int option_index = 0;
+    static struct option long_options[] = {
+        {"period", 1, 0, 'p'},
+        {"slice", 1, 0, 's'},
+        {"latency", 1, 0, 'l'},
+        {"extra", 1, 0, 'e'},
+        {"weight", 1, 0, 'w'},
+        {"cpupool", 1, 0, 'c'},
+        {"help", 0, 0, 'h'},
+        {0, 0, 0, 0}
+    };
+
+    while (1) {
+        opt = getopt_long(argc, argv, "d:p:s:l:e:w:c:h", long_options, &option_index);
+        if (opt == -1)
+            break;
+        switch (opt) {
+        case 0: case 2:
+            return opt;
+        case 'd':
+            dom = optarg;
+            break;
+        case 'p':
+            period = strtol(optarg, NULL, 10);
+            opt_p = 1;
+            break;
+        case 's':
+            slice = strtol(optarg, NULL, 10);
+            opt_s = 1;
+            break;
+        case 'l':
+            latency = strtol(optarg, NULL, 10);
+            opt_l = 1;
+            break;
+        case 'e':
+            extra = strtol(optarg, NULL, 10);
+            opt_e = 1;
+            break;
+        case 'w':
+            weight = strtol(optarg, NULL, 10);
+            opt_w = 1;
+            break;
+        case 'c':
+            cpupool = optarg;
+            break;
+        case 'h':
+            help("sched-sedf");
+            return 0;
+        }
+    }
+
+    if (cpupool && (dom || opt_p || opt_s || opt_l || opt_e || opt_w)) {
+        fprintf(stderr, "Specifying a cpupool is not allowed with other options.\n");
+        return 1;
+    }
+    if (!dom && (opt_p || opt_s || opt_l || opt_e || opt_w)) {
+        fprintf(stderr, "Must specify a domain.\n");
+        return 1;
+    }
+    if (opt_w && (opt_p || opt_s)) {
+        fprintf(stderr, "Specifying a weight AND period or slice is not allowed.\n");
+    }
+
+    if (!dom) { /* list all domain's credit scheduler info */
+        return -sched_domain_output(XEN_SCHEDULER_SEDF, sched_sedf_domain_output, cpupool);
+    } else {
+        find_domain(dom);
+
+        rc = sched_sedf_domain_get(domid, &scinfo);
+        if (rc)
+            return -rc;
+
+        if (!opt_p && !opt_s && !opt_l && !opt_e && !opt_w) { /* output sedf scheduler info */
+            sched_sedf_domain_output(-1);
+            return -sched_sedf_domain_output(domid);
+        } else { /* set sedf scheduler paramaters */
+            if (opt_p) {
+                scinfo.period = period;
+                scinfo.weight = 0;
+            }
+            if (opt_s) {
+                scinfo.slice = slice;
+                scinfo.weight = 0;
+            }
+            if (opt_l)
+                scinfo.latency = latency;
+            if (opt_e)
+                scinfo.extratime = extra;
+            if (opt_w) {
+                scinfo.weight = weight;
+                scinfo.period = 0;
+                scinfo.slice = 0;
+            }
+            rc = sched_sedf_domain_set(domid, &scinfo);
             if (rc)
                 return -rc;
         }
diff -r 714852e181d3 -r 0d1eb69dbd1c tools/libxl/xl_cmdtable.c
--- a/tools/libxl/xl_cmdtable.c	Thu Nov 17 09:58:36 2011 +0100
+++ b/tools/libxl/xl_cmdtable.c	Thu Nov 17 11:37:42 2011 +0100
@@ -205,6 +205,22 @@ struct cmd_spec cmd_table[] = {
       "-d DOMAIN, --domain=DOMAIN     Domain to modify\n"
       "-w WEIGHT, --weight=WEIGHT     Weight (int)\n"
       "-p CPUPOOL, --cpupool=CPUPOOL  Restrict output to CPUPOOL"
+    },
+    { "sched-sedf",
+      &main_sched_sedf, 0,
+      "Get/set sedf scheduler parameters",
+      "[options]",
+      "-d DOMAIN, --domain=DOMAIN     Domain to modify\n"
+      "-p MS, --period=MS             Relative deadline(ms)\n"
+      "-s MS, --slice=MS              Worst-case execution time(ms). (slice <\n"
+      "                               period)\n"
+      "-l MS, --latency=MS            Scaled period (ms) when domain performs\n"
+      "                               heavy I/O\n"
+      "-e FLAG, --extra=FLAG          Flag (0 or 1) controls if domain can run\n"
+      "                               in extra time\n"
+      "-w FLOAT, --weight=FLOAT       CPU Period/slice (do not set with\n"
+      "                               --period/--slice)\n"
+      "-c CPUPOOL, --cpupool=CPUPOOL  Restrict output to CPUPOOL"
     },
     { "domid",
       &main_domid, 0,

--===============5201636525507711880==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============5201636525507711880==--


From xen-devel-bounces@lists.xensource.com Thu Nov 17 03:15:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 03:15:09 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQzvx-0001PT-3Q; Thu, 17 Nov 2011 03:15:09 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQzk3-0007eD-U3
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 03:03:05 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1321527768!1868947!3
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6438 invoked from network); 17 Nov 2011 11:02:48 -0000
Received: from dgate20.ts.fujitsu.com (HELO dgate20.ts.fujitsu.com)
	(80.70.172.51)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 11:02:48 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Content-Type:MIME-Version:Subject:
	X-Mercurial-Node:Message-Id:In-Reply-To:Date:From:To;
	b=j5b80mFBVWKErvf9NzO+oqv0nBEpWglti2J9VhsMb2wQ+IEh/lQ5FNoM
	Fych7qrACn3eWlm23aZDZT0apjUCyXNJJKdTPX0H4ttdc/ptw/8LH/oDO
	eQp24Ks3tWE+yb2J0hEOJdpC62+pwH386eOAGVG6IBvREd5bgHmzSBGr+
	7JMvxIQyuggy/D5DMFJlbVgPbTiJ6ClwMwd3vd0+8cvik0Po4SirKnjmE
	7nxENlSQ+grgRweYIBBt8FPRCyZBj;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1321527768; x=1353063768;
	h=mime-version:subject:message-id:in-reply-to:date:from:to;
	bh=Pz2Zt1qzBq2v1s8bOM/0Q2MBQJZaLd1LdZsxm+jeiGw=;
	b=esC+VgowvhR1P8iyztFjyCyOJU9IFDU4hxF1U3w0MGOKnlH4bTSWspky
	9Z9w4cgQZjsCSPS5IQOmRNgkpF5qHxkk1M7E+ubaXvd14KoLijfQQdc8h
	b49mOa2KoyOi3s73q0yeSCnSnZGn6NV3jxW9b2XWGZAFc2vhme2muuWNe
	wpH8D83H9hs0RJK6MESWaVc9ynBRpbiIsPooc0y+NSfSaMglbNTphcD9A
	9fRXKmbCsR54JmaJhSuVcYvuhC4VD;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,525,1315173600"; d="scan'208";a="79240386"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate20u.abg.fsc.net with ESMTP; 17 Nov 2011 12:02:47 +0100
X-IronPort-AV: E=Sophos;i="4.69,525,1315173600"; d="scan'208";a="123228212"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 17 Nov 2011 12:02:47 +0100
Received: from [172.17.21.25] (nehalem1.osd.mch.fsc.net [172.17.21.25])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id B697095B159;
	Thu, 17 Nov 2011 12:02:47 +0100 (CET)
Content-Type: multipart/mixed; boundary="===============0977424897852171062=="
MIME-Version: 1.0
X-Mercurial-Node: 8ce33d756b39abdcffc7a3ccc45f85c0a9a79ccd
Message-Id: <8ce33d756b39abdcffc7.1321527026@nehalem1>
In-Reply-To: <patchbomb.1321527024@nehalem1>
Date: Thu, 17 Nov 2011 11:50:26 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 2 of 5] [mq]: sched-cpupools
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0977424897852171062==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

Patch subject is complete summary.


5 files changed, 98 insertions(+), 30 deletions(-)
docs/man/xl.pod.1           |    4 +
tools/libxl/libxl.c         |    1 
tools/libxl/libxl_types.idl |    1 
tools/libxl/xl_cmdimpl.c    |  117 ++++++++++++++++++++++++++++++++-----------
tools/libxl/xl_cmdtable.c   |    5 +



--===============0977424897852171062==
Content-Type: text/x-patch; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=xen-staging.hg-5.patch

# HG changeset patch
# User Juergen Gross <juergen.gross@ts.fujitsu.com>
# Date 1321519012 -3600
# Node ID 8ce33d756b39abdcffc7a3ccc45f85c0a9a79ccd
# Parent  b83edf5a1c9483b908dacfb5e02033071c7aca3e
[mq]: sched-cpupools

diff -r b83edf5a1c94 -r 8ce33d756b39 docs/man/xl.pod.1
--- a/docs/man/xl.pod.1	Thu Nov 17 07:53:19 2011 +0100
+++ b/docs/man/xl.pod.1	Thu Nov 17 09:36:52 2011 +0100
@@ -610,6 +610,10 @@ 50 is half a CPU, 400 is 4 CPUs, etc. Th
 50 is half a CPU, 400 is 4 CPUs, etc. The default, 0, means there is
 no upper cap.
 
+=item B<-p CPUPOOL>, B<--cpupool=CPUPOOL>
+
+Restrict output to domains in the specified cpupool.
+
 =back
 
 =back
diff -r b83edf5a1c94 -r 8ce33d756b39 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Nov 17 07:53:19 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Nov 17 09:36:52 2011 +0100
@@ -361,6 +361,7 @@ static void xcinfo2xlinfo(const xc_domai
     xlinfo->cpu_time = xcinfo->cpu_time;
     xlinfo->vcpu_max_id = xcinfo->max_vcpu_id;
     xlinfo->vcpu_online = xcinfo->nr_online_vcpus;
+    xlinfo->cpupool = xcinfo->cpupool;
 }
 
 libxl_dominfo * libxl_list_domain(libxl_ctx *ctx, int *nb_domain)
diff -r b83edf5a1c94 -r 8ce33d756b39 tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl	Thu Nov 17 07:53:19 2011 +0100
+++ b/tools/libxl/libxl_types.idl	Thu Nov 17 09:36:52 2011 +0100
@@ -109,6 +109,7 @@ SHUTDOWN_* constant."""),
     ("cpu_time",    uint64),
     ("vcpu_max_id", uint32),
     ("vcpu_online", uint32),
+    ("cpupool",     uint32),
     ], dispose_fn=None)
 
 libxl_cpupoolinfo = Struct("cpupoolinfo", [
diff -r b83edf5a1c94 -r 8ce33d756b39 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Thu Nov 17 07:53:19 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Thu Nov 17 09:36:52 2011 +0100
@@ -3695,25 +3695,90 @@ static int sched_credit_domain_set(
     return rc;
 }
 
-static void sched_credit_domain_output(
-    int domid, libxl_sched_credit *scinfo)
+static int sched_credit_domain_output(
+    int domid)
 {
     char *domname;
+    libxl_sched_credit scinfo;
+    int rc;
+
+    if (domid < 0) {
+        printf("%-33s %4s %6s %4s\n", "Name", "ID", "Weight", "Cap");
+        return 0;
+    }
+    rc = sched_credit_domain_get(domid, &scinfo);
+    if (rc)
+        return rc;
     domname = libxl_domid_to_name(ctx, domid);
     printf("%-33s %4d %6d %4d\n",
         domname,
         domid,
-        scinfo->weight,
-        scinfo->cap);
+        scinfo.weight,
+        scinfo.cap);
     free(domname);
+    return 0;
+}
+
+static int sched_domain_output(
+    uint32_t sched, int (*output)(int), const char *cpupool)
+{
+    libxl_dominfo *info;
+    libxl_cpupoolinfo *poolinfo = NULL;
+    uint32_t poolid;
+    char *poolname;
+    int nb_domain, n_pools = 0, i, p;
+    int rc = 0;
+
+    if (cpupool) {
+        if (cpupool_qualifier_to_cpupoolid(cpupool, &poolid, NULL) ||
+            !libxl_cpupoolid_to_name(ctx, poolid)) {
+            fprintf(stderr, "unknown cpupool \'%s\'\n", cpupool);
+            return -ERROR_FAIL;
+        }
+    }
+
+    info = libxl_list_domain(ctx, &nb_domain);
+    if (!info) {
+        fprintf(stderr, "libxl_domain_infolist failed.\n");
+        return 1;
+    }
+    poolinfo = libxl_list_cpupool(ctx, &n_pools);
+    if (!poolinfo) {
+        fprintf(stderr, "error getting cpupool info\n");
+        return -ERROR_NOMEM;
+    }
+
+    for (p = 0; !rc && (p < n_pools); p++) {
+        if ((poolinfo[p].sched_id != sched) ||
+            (cpupool && (poolid != poolinfo[p].poolid)))
+            continue;
+
+        poolname = libxl_cpupoolid_to_name(ctx, poolinfo[p].poolid);
+        printf("Cpupool %s:\n", poolname);
+        free(poolname);
+
+        output(-1);
+        for (i = 0; i < nb_domain; i++) {
+            if (info[i].cpupool != poolinfo[p].poolid)
+                continue;
+            rc = output(info[i].domid);
+            if (rc)
+                break;
+        }
+    }
+    if (poolinfo) {
+        for (p = 0; p < n_pools; p++) {
+            libxl_cpupoolinfo_dispose(poolinfo + p);
+        }
+    }
+    return 0;
 }
 
 int main_sched_credit(int argc, char **argv)
 {
-    libxl_dominfo *info;
     libxl_sched_credit scinfo;
-    int nb_domain, i;
-    const char *dom = NULL;
+    const char *dom = NULL;
+    const char *cpupool = NULL;
     int weight = 256, cap = 0, opt_w = 0, opt_c = 0;
     int opt, rc;
     int option_index = 0;
@@ -3721,12 +3786,13 @@ int main_sched_credit(int argc, char **a
         {"domain", 1, 0, 'd'},
         {"weight", 1, 0, 'w'},
         {"cap", 1, 0, 'c'},
-        {"help", 0, 0, 'h'},
-        {0, 0, 0, 0}
-    };
-
-    while (1) {
-        opt = getopt_long(argc, argv, "d:w:c:h", long_options, &option_index);
+        {"cpupool", 1, 0, 'p'},
+        {"help", 0, 0, 'h'},
+        {0, 0, 0, 0}
+    };
+
+    while (1) {
+        opt = getopt_long(argc, argv, "d:w:c:p:h", long_options, &option_index);
         if (opt == -1)
             break;
         switch (opt) {
@@ -3743,31 +3809,26 @@ int main_sched_credit(int argc, char **a
             cap = strtol(optarg, NULL, 10);
             opt_c = 1;
             break;
+        case 'p':
+            cpupool = optarg;
+            break;
         case 'h':
             help("sched-credit");
             return 0;
         }
     }
 
+    if (cpupool && (dom || opt_w || opt_c)) {
+        fprintf(stderr, "Specifying a cpupool is not allowed with other options.\n");
+        return 1;
+    }
     if (!dom && (opt_w || opt_c)) {
         fprintf(stderr, "Must specify a domain.\n");
         return 1;
     }
 
     if (!dom) { /* list all domain's credit scheduler info */
-        info = libxl_list_domain(ctx, &nb_domain);
-        if (!info) {
-            fprintf(stderr, "libxl_domain_infolist failed.\n");
-            return 1;
-        }
-
-        printf("%-33s %4s %6s %4s\n", "Name", "ID", "Weight", "Cap");
-        for (i = 0; i < nb_domain; i++) {
-            rc = sched_credit_domain_get(info[i].domid, &scinfo);
-            if (rc)
-                return -rc;
-            sched_credit_domain_output(info[i].domid, &scinfo);
-        }
+        return -sched_domain_output(XEN_SCHEDULER_CREDIT, sched_credit_domain_output, cpupool);
     } else {
         find_domain(dom);
 
@@ -3776,8 +3837,8 @@ int main_sched_credit(int argc, char **a
             return -rc;
 
         if (!opt_w && !opt_c) { /* output credit scheduler info */
-            printf("%-33s %4s %6s %4s\n", "Name", "ID", "Weight", "Cap");
-            sched_credit_domain_output(domid, &scinfo);
+            sched_credit_domain_output(-1);
+            return -sched_credit_domain_output(domid);
         } else { /* set credit scheduler paramaters */
             if (opt_w)
                 scinfo.weight = weight;
diff -r b83edf5a1c94 -r 8ce33d756b39 tools/libxl/xl_cmdtable.c
--- a/tools/libxl/xl_cmdtable.c	Thu Nov 17 07:53:19 2011 +0100
+++ b/tools/libxl/xl_cmdtable.c	Thu Nov 17 09:36:52 2011 +0100
@@ -192,10 +192,11 @@ struct cmd_spec cmd_table[] = {
     { "sched-credit",
       &main_sched_credit, 0,
       "Get/set credit scheduler parameters",
-      "[-d <Domain> [-w[=WEIGHT]|-c[=CAP]]]",
+      "[-d <Domain> [-w[=WEIGHT]|-c[=CAP]]] [-p CPUPOOL]",
       "-d DOMAIN, --domain=DOMAIN     Domain to modify\n"
       "-w WEIGHT, --weight=WEIGHT     Weight (int)\n"
-      "-c CAP, --cap=CAP              Cap (int)"
+      "-c CAP, --cap=CAP              Cap (int)\n"
+      "-p CPUPOOL, --cpupool=CPUPOOL  Restrict output to CPUPOOL"
     },
     { "domid",
       &main_domid, 0,

--===============0977424897852171062==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0977424897852171062==--


From xen-devel-bounces@lists.xensource.com Thu Nov 17 03:16:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 03:16:48 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQzxY-00020E-6W; Thu, 17 Nov 2011 03:16:48 -0800
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQkYl-0000Kv-Vj
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 10:50:12 -0800
X-Env-Sender: jethomas100@gmail.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1321469389!48565173!1
X-Originating-IP: [209.85.213.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25120 invoked from network); 16 Nov 2011 18:49:50 -0000
Received: from mail-yx0-f171.google.com (HELO mail-yx0-f171.google.com)
	(209.85.213.171)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 18:49:50 -0000
Received: by yenl7 with SMTP id l7so14420yen.30
	for <xen-devel@lists.xensource.com>;
	Wed, 16 Nov 2011 10:50:07 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type;
	bh=gLXnsdN6+bHHeN9SNccnFu8u7u2jmZ+9+2brbYjLW5I=;
	b=F/xHoq7D905QcYov7X6GujIQ6Mzt4cB05ip3yHRZKudiFDDT6+bOMa6c1SVl/1V32R
	TMy0I8xTEORYAklrCiQ4R4+lUsp/xdeEPqLJ/jtMxySCh6eWKo6x14GoULHXoK+a1Zd3
	BKuCq9w8UObfa1nhy9h+Aj/CctHTW9Ia45Y7U=
MIME-Version: 1.0
Received: by 10.50.196.193 with SMTP id io1mr34285423igc.3.1321469407181; Wed,
	16 Nov 2011 10:50:07 -0800 (PST)
Received: by 10.50.186.195 with HTTP; Wed, 16 Nov 2011 10:50:07 -0800 (PST)
In-Reply-To: <20111116170034.GC2793@phenom.dumpdata.com>
References: <CABKwQ+pT7LFqmnfGoK5YVsmzqomYjnA6t0jr=RyTVoTjFUDNLw@mail.gmail.com>
	<20111116170034.GC2793@phenom.dumpdata.com>
Date: Wed, 16 Nov 2011 10:50:07 -0800
Message-ID: <CABKwQ+q5a-FNxho8LfX=LSNY9xHHAYOHeGb97r==sez+buwa=g@mail.gmail.com>
Subject: Re: [Xen-devel] VMM Architecture documentation
From: Jason Thomas <jethomas100@gmail.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-Mailman-Approved-At: Thu, 17 Nov 2011 03:10:04 -0800
Cc: xen-devel@lists.xensource.com
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0579286222=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0579286222==
Content-Type: multipart/alternative; boundary=14dae93411f598ba3204b1de92e8

--14dae93411f598ba3204b1de92e8
Content-Type: text/plain; charset=ISO-8859-1

On Wed, Nov 16, 2011 at 9:00 AM, Konrad Rzeszutek Wilk <
konrad.wilk@oracle.com> wrote:

> On Tue, Nov 15, 2011 at 10:12:14AM -0800, Jason Thomas wrote:
> > I am looking for a low level description of the VMM architecture, if one
> > exists. Specifically which modules are required for 32 bit guests and
> which
> > are needed for 64 bit guests. Does this exist or do I have to sift
> through
> > the source code to find the differences?
>
> We are kind of working through to make that easier to read.
>
> But I am not actually sure what you mean by 'modules'?
>

I am looking to get a more modular view of the Xen architecture.  What Xen
VMM components are required to support a 32 bit guest, what components are
required to support 64 bit guest. Are there components that both the 32 bit
and the 64 bit guests share? How does HVM come into this (i.e. what code
supports the usage of HVM and what code is no longer needed if HVM is used)?

Is there a document out there that depicts this, or is it something you get
by going through the source code?

--14dae93411f598ba3204b1de92e8
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<br><br><div class=3D"gmail_quote">On Wed, Nov 16, 2011 at 9:00 AM, Konrad =
Rzeszutek Wilk <span dir=3D"ltr">&lt;<a href=3D"mailto:konrad.wilk@oracle.c=
om">konrad.wilk@oracle.com</a>&gt;</span> wrote:<br><blockquote class=3D"gm=
ail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-le=
ft:1ex;">
<div><div></div><div class=3D"h5">On Tue, Nov 15, 2011 at 10:12:14AM -0800,=
 Jason Thomas wrote:<br>
&gt; I am looking for a low level description of the VMM architecture, if o=
ne<br>
&gt; exists. Specifically which modules are required for 32 bit guests and =
which<br>
&gt; are needed for 64 bit guests. Does this exist or do I have to sift thr=
ough<br>
&gt; the source code to find the differences?<br>
<br>
</div></div>We are kind of working through to make that easier to read.<br>
<br>
But I am not actually sure what you mean by &#39;modules&#39;?<br>
</blockquote></div><br>I am looking to get a more modular view of the Xen a=
rchitecture. <span style=3D"font-size:11.0pt;font-family:&quot;Calibri&quot=
;,&quot;sans-serif&quot;;
mso-fareast-font-family:Calibri;mso-fareast-theme-font:minor-latin;mso-ansi=
-language:
EN-US;mso-fareast-language:EN-US;mso-bidi-language:AR-SA"><span style=3D"ms=
o-spacerun:yes">=A0</span>What Xen VMM components are required to
support a 32 bit guest, what components are required to support 64 bit gues=
t.
Are there components that both the 32 bit and the 64 bit guests share? How =
does
HVM come into this (i.e. what code supports the usage of HVM and what code =
is
no longer needed if HVM is used)?<br><br>Is there a document out there that=
 depicts this, or is it something you get by going through the source code?=
<br><br></span>

--14dae93411f598ba3204b1de92e8--


--===============0579286222==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============0579286222==--


From xen-devel-bounces@lists.xensource.com Thu Nov 17 03:18:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 03:18:20 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RQzz1-0002Oo-Sc; Thu, 17 Nov 2011 03:18:20 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQm3g-0006B4-Nf
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 12:26:13 -0800
X-Env-Sender: theubaz@gmail.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1321475167!4494790!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27031 invoked from network); 16 Nov 2011 20:26:09 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-16.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Nov 2011 20:26:09 -0000
Received: by iaby12 with SMTP id y12so1388260iab.30
	for <xen-devel@lists.xensource.com>;
	Wed, 16 Nov 2011 12:26:07 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=AWv3LS/Fs8jpFUHUcZnwxRrhXQiqEpJKFY+5+Caxm9s=;
	b=HuEIT1L8cvRAcjP1RroZ1q6SKbAR4+Xq/zvuguC/M1jpAo67Jf1WMlqjQhOEIMJDYX
	3go0HuLfKA7lZg3xV+S14ho1nyX0viC/JTrnUjxUWuBB/eeK6OYtL7aPMRzIP3QO9Bm5
	ohEuj6fv21YHJHAuMfz7e+iW3SnYQREzVizHw=
MIME-Version: 1.0
Received: by 10.42.135.69 with SMTP id o5mr34456349ict.34.1321475167010; Wed,
	16 Nov 2011 12:26:07 -0800 (PST)
Received: by 10.42.243.200 with HTTP; Wed, 16 Nov 2011 12:26:06 -0800 (PST)
Date: Wed, 16 Nov 2011 15:26:06 -0500
Message-ID: <CAH5ygH1OyxSRZaGC1RVCeg3tmZSERwhqjSA-bwyVHN9PtKC4yQ@mail.gmail.com>
From: John Sherwood <theubaz@gmail.com>
To: xen-devel@lists.xensource.com
X-Mailman-Approved-At: Thu, 17 Nov 2011 03:10:03 -0800
Subject: [Xen-devel] extending qemu-dm
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1824430393=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1824430393==
Content-Type: multipart/alternative; boundary=90e6ba6e836ce8bf8204b1dfe9f7

--90e6ba6e836ce8bf8204b1dfe9f7
Content-Type: text/plain; charset=ISO-8859-1

Hello,

I'm working on a project and trying to pass through a PS/2 mouse + keyboard
to a hardware VM.  I've played with numerous things (including the obvious,
using USB), but after finding no alternative, it seems like the best way to
approach this would be to modify qemu-dm to pipe through data from
/dev/input/eventwhatever to the keyboard/mouse that qemu provides (and then
using this version of qemu-dm only for this special case).

I've been looking through the 4.1.0 source, specifically in
tools/ioemu-qemu-xen, and it appears that I'd want to (for the keyboard)
pass key codes from /dev/input through the kbd_put_keycode function.  From
what I can tell, I'd probably want to split off a thread to do this
somewhere in main() in vl.c.  I was hoping that I could get some
confirmation about whether I'm looking in the right places and/or
suggestions about how to cleanly implement this.  Odds are I won't be able
to go the whole 9 yards and implement configuration options for xm or
command line switches for qemu-dm, but I would suspect that someone,
somewhere, someday will also want this kind of ability.  If it's already
possible to pass through PS/2 devices without getting nuts in QEMU, that's
cool too :)

--90e6ba6e836ce8bf8204b1dfe9f7
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hello,<br><br>I&#39;m working on a project and trying to pass through a PS/=
2 mouse + keyboard to a hardware VM.=A0 I&#39;ve played with numerous thing=
s (including the obvious, using USB), but after finding no alternative, it =
seems like the best way to approach this would be to modify qemu-dm to pipe=
 through data from /dev/input/eventwhatever to the keyboard/mouse that qemu=
 provides (and then using this version of qemu-dm only for this special cas=
e).<br>
<br>I&#39;ve been looking through the 4.1.0 source, specifically in tools/i=
oemu-qemu-xen, and it appears that I&#39;d want to (for the keyboard) pass =
key codes from /dev/input through the kbd_put_keycode function.=A0 From wha=
t I can tell, I&#39;d probably want to split off a thread to do this somewh=
ere in main() in vl.c.=A0 I was hoping that I could get some confirmation a=
bout whether I&#39;m looking in the right places and/or suggestions about h=
ow to cleanly implement this.=A0 Odds are I won&#39;t be able to go the who=
le 9 yards and implement configuration options for xm or command line switc=
hes for qemu-dm, but I would suspect that someone, somewhere, someday will =
also want this kind of ability.=A0 If it&#39;s already possible to pass thr=
ough PS/2 devices without getting nuts in QEMU, that&#39;s cool too :)<br>

--90e6ba6e836ce8bf8204b1dfe9f7--


--===============1824430393==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============1824430393==--


From xen-devel-bounces@lists.xensource.com Thu Nov 17 03:19:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 03:19:20 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RR000-0002m5-T1; Thu, 17 Nov 2011 03:19:20 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQr6d-0003pZ-4a
	for xen-devel@lists.xensource.com; Wed, 16 Nov 2011 17:49:35 -0800
X-Env-Sender: phcoder@gmail.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1321494571!1872432!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16111 invoked from network); 17 Nov 2011 01:49:31 -0000
Received: from mail-bw0-f43.google.com (HELO mail-bw0-f43.google.com)
	(209.85.214.43)
	by server-7.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 01:49:31 -0000
Received: by bkbzt12 with SMTP id zt12so1818837bkb.30
	for <xen-devel@lists.xensource.com>;
	Wed, 16 Nov 2011 17:49:31 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=message-id:date:from:user-agent:mime-version:to:subject:references
	:in-reply-to:x-enigmail-version:content-type;
	bh=EaGYkk7dUDSvuBxf4oama4Xs76Lon277XS8o0CV5ksE=;
	b=cUODNtCOoPMHn5nNMxFO2GKkRtmb1xZyhsce8gkP80MPpmCEPs2W/ZqD5GnMx3sKGT
	+/WyvVw0zlTBpKVXAEQgWnwa36nJFMJ41iicm26ImWqL23sysZ/Fn/EAdcPLPeqqjGPs
	ojJLMBbRsxfGV2g34qPAaU80kwdX9IkL+XDwk=
Received: by 10.205.132.16 with SMTP id hs16mr31127401bkc.7.1321494571444;
	Wed, 16 Nov 2011 17:49:31 -0800 (PST)
Received: from debian.x201.phnet (115-232.197-178.cust.bluewin.ch.
	[178.197.232.115])
	by mx.google.com with ESMTPS id e20sm512480fab.2.2011.11.16.17.49.29
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 16 Nov 2011 17:49:30 -0800 (PST)
Message-ID: <4EC4681E.1070104@gmail.com>
Date: Thu, 17 Nov 2011 02:49:18 +0100
From: =?UTF-8?B?VmxhZGltaXIgJ8+GLWNvZGVyL3BoY29kZXInIFNlcmJpbmVua28=?=
	<phcoder@gmail.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20111010 Iceowl/1.0b2 Icedove/3.1.15
MIME-Version: 1.0
To: Samuel Thibault <samuel.thibault@ens-lyon.org>, 
	The development of GRUB 2 <grub-devel@gnu.org>,
	xen-devel@lists.xensource.com
References: <4EC45B57.80602@gmail.com>
	<20111117005949.GR4275@type.famille.thibault.fr>
In-Reply-To: <20111117005949.GR4275@type.famille.thibault.fr>
X-Enigmail-Version: 1.1.2
X-Mailman-Approved-At: Thu, 17 Nov 2011 03:10:03 -0800
Cc: 
Subject: [Xen-devel] Re: [Grub2] Xen branches
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============2086960396=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
--===============2086960396==
Content-Type: multipart/signed; micalg=pgp-sha512;
	protocol="application/pgp-signature";
	boundary="------------enigC421A44E4F79C88FBD7A0766"

This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
--------------enigC421A44E4F79C88FBD7A0766
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

On 17.11.2011 01:59, Samuel Thibault wrote:
> Nice!
Thanks.
> Vladimir '=CF=86-coder/phcoder' Serbinenko, le Thu 17 Nov 2011 01:54:47=
 +0100, a =C3=A9crit :
>> -network
>> -disks
> It can be useful to just re-use the drivers from Mini-OS, but you may
> want to reimplement them.
>
They don't seem to be difficult to implement judging from the spec. On
the other hand making MiniOS building system work nicely with ours
sounds like hell.
>> -loaders
> I strongly recommend to re-use libxc's code, and use my kexec code to
> actually switch from within the PV domain.
>
I'm not that far yet. But I've seen kexec call and I suppose it can be
used pretty straighforwardely.
> Samuel
>


--=20
Regards
Vladimir '=CF=86-coder/phcoder' Serbinenko



--------------enigC421A44E4F79C88FBD7A0766
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iF4EAREKAAYFAk7EaCcACgkQNak7dOguQglVKgD+P7ZezLKFW0oLnD5zU0aNugo9
IQNCbt5WI49dqWCE14gA/jL6Eu0jrz5yhs1MtxhDb2SUSqiAxdMdgcBWDsJGBNS9
=wes5
-----END PGP SIGNATURE-----

--------------enigC421A44E4F79C88FBD7A0766--


--===============2086960396==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============2086960396==--


From xen-devel-bounces@lists.xensource.com Thu Nov 17 03:20:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 03:20:29 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RR017-00039r-4b; Thu, 17 Nov 2011 03:20:29 -0800
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQzv9-00013S-A5
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 03:14:20 -0800
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1321528455!3505978!1
X-Originating-IP: [80.70.172.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20637 invoked from network); 17 Nov 2011 11:14:16 -0000
Received: from dgate10.ts.fujitsu.com (HELO dgate10.ts.fujitsu.com)
	(80.70.172.49)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 11:14:16 -0000
DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns;
	h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV:
	Received:Received:Message-ID:Date:From:Organization:
	User-Agent:MIME-Version:To:Subject:References:In-Reply-To:
	Content-Type:Content-Transfer-Encoding;
	b=Se5DP+vvUKqZEJPDuv97ay4WPbU52n2pAdxQgpkl1QKyRbaemJPDjFRs
	ds6InZ9WGIS6MD8MjeY9XymH3Yyaux/2+qBUCTJXFdBBlP7V4z8Nf5ynP
	ZY5zApc2dQX5LYo8vbbNavaboMoc3PHE7ughlZCMvoTTqZGQeACtc2Nrn
	HK5l7KswSVaaIYc1Peg5a8mgR0B6oU3XD/1osx6gf6geNPoxgUvAz5PQ6
	VH9Ej8opw71Qd/06BPP8Fu+C5Cf8P;
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
	d=ts.fujitsu.com; i=juergen.gross@ts.fujitsu.com;
	q=dns/txt; s=s1536b; t=1321528454; x=1353064454;
	h=message-id:date:from:mime-version:to:subject:references:
	in-reply-to:content-transfer-encoding;
	bh=hUxiAjtoRWYUQmY3nn9UPNgYXaJpaid9KTF/6mfxF6k=;
	b=rd1VJGnHOU7Jt53ezhwoLmQceudyft4clx9U8y75XLIeNnjXc7FQvGJw
	MuT5cqOVHX8nh0lE/aKZ1i5vCiJgFpWapzTLJ19HlQkDwGar/qGRXSmGm
	GJl7XO4uzFBUwvHDL+bEyH7l2rU0qigV9MPJMfvKf5KHlCEExrlljAxE4
	T/bXKCKBmVnXUVZql+zz+cSRcUEj1O/ZUqzI8HBcQ7Ab3lWsKAwetUVAK
	F+4quFBkzvihlGHKD/qWl5j7EUo1T;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,525,1315173600"; d="scan'208";a="93374084"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate10u.abg.fsc.net with ESMTP; 17 Nov 2011 12:14:14 +0100
X-IronPort-AV: E=Sophos;i="4.69,525,1315173600"; d="scan'208";a="123228779"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 17 Nov 2011 12:14:10 +0100
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id F0A5795AB9F
	for <xen-devel@lists.xensource.com>;
	Thu, 17 Nov 2011 12:14:10 +0100 (CET)
Message-ID: <4EC4EC82.9040308@ts.fujitsu.com>
Date: Thu, 17 Nov 2011 12:14:10 +0100
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
Organization: Fujitsu Technology Solutions
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20111010 Iceowl/1.0b2 Icedove/3.1.15
MIME-Version: 1.0
To: xen-devel@lists.xensource.com
Subject: Re: [Xen-devel] [PATCH 0 of 5] xl scheduler support
References: <patchbomb.1321527024@nehalem1>
In-Reply-To: <patchbomb.1321527024@nehalem1>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Please ignore, hg configuration problems!


On 11/17/2011 11:50 AM, Juergen Gross wrote:
> This patch series enhances scheduler support of xl.
>
> Patch 1: xl sched-credit: support long options
> Patch 2: Support cpupools in xl sched-credit
> Patch 3: Support of xl sched-credit2
> Patch 4: Correct error message in libxl_sched_credit_domain_get()
> Patch 5: Support of xl sched-sedf
>
> 7 files changed, 622 insertions(+), 38 deletions(-)
> docs/man/xl.pod.1           |   90 ++++++++-
> tools/libxl/libxl.c         |  100 ++++++++++
> tools/libxl/libxl.h         |    8
> tools/libxl/libxl_types.idl |   13 +
> tools/libxl/xl.h            |    2
> tools/libxl/xl_cmdimpl.c    |  418 +++++++++++++++++++++++++++++++++++++++----
> tools/libxl/xl_cmdtable.c   |   29 ++
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>
>


-- 
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: juergen.gross@ts.fujitsu.com
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 03:21:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 03:21:44 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RR02K-0003YL-Ly; Thu, 17 Nov 2011 03:21:44 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQzxT-0001yb-In
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 03:16:44 -0800
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1321528600!4625879!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32460 invoked from network); 17 Nov 2011 11:16:40 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 11:16:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,526,1315180800"; 
   d="scan'208";a="8984634"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Nov 2011 11:16:40 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Thu, 17 Nov 2011 11:16:40 +0000
Subject: Re: [Xen-devel] [PATCH 1 of 5] [mq]: sched-credit-options
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Juergen Gross <juergen.gross@ts.fujitsu.com>
Date: Thu, 17 Nov 2011 11:16:39 +0000
In-Reply-To: <b83edf5a1c9483b908da.1321527025@nehalem1>
References: <b83edf5a1c9483b908da.1321527025@nehalem1>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1321528600.3664.264.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-11-17 at 10:50 +0000, Juergen Gross wrote:
> Patch subject is complete summary.

I think you've forgotten to qrefresh to pickup the real summary or
something (for all mails).

Ian.

> 
> 
> 2 files changed, 26 insertions(+), 7 deletions(-)
> docs/man/xl.pod.1        |   15 ++++++++++-----
> tools/libxl/xl_cmdimpl.c |   18 ++++++++++++++++--
> 
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 03:22:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 03:22:50 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RR03N-0003xR-Vi; Thu, 17 Nov 2011 03:22:50 -0800
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RQzzt-0002is-NA
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 03:19:14 -0800
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1321528750!1918104!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2847 invoked from network); 17 Nov 2011 11:19:10 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 11:19:10 -0000
X-IronPort-AV: E=Sophos;i="4.69,526,1315180800"; 
   d="scan'208";a="8984747"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Nov 2011 11:19:10 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.137.0; Thu, 17 Nov 2011 11:19:10 +0000
Received: from [10.80.248.135] (helo=woking.xci-test.com)	by
	norwich.cam.xci-test.com with esmtp (Exim 4.72)	(envelope-from
	<ian.jackson@eu.citrix.com>)	id 1RQzzp-00052h-JM;
	Thu, 17 Nov 2011 11:19:09 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RQzzp-0008S9-IV;
	Thu, 17 Nov 2011 11:19:09 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9832-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 17 Nov 2011 11:19:09 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9832: tolerable FAIL - PUSHED
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

flight 9832 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9832/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                fail never pass
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  dbdc840f8f62
baseline version:
 xen                  644ca5d3ec43

------------------------------------------------------------
People who touched revisions under test:
  Ian Campbell <ian.campbell@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     pass    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Pushing revision :

+ branch=xen-unstable
+ revision=dbdc840f8f62
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x '!=' x/export/home/osstest/repos/lock ']'
++ OSSTEST_REPOS_LOCK_LOCKED=/export/home/osstest/repos/lock
++ exec with-lock-ex -w /export/home/osstest/repos/lock ./ap-push xen-unstable dbdc840f8f62
+ branch=xen-unstable
+ revision=dbdc840f8f62
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x/export/home/osstest/repos/lock '!=' x/export/home/osstest/repos/lock ']'
+ : xen@xenbits.xensource.com
+ : xen@xenbits.xensource.com:git/linux-pvops
+ : master
+ : tested/2.6.39.x
+ case "$branch" in
+ cd /export/home/osstest/repos/xen-unstable.hg
+ hg push -r dbdc840f8f62 ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
pushing to ssh://xen@xenbits.xensource.com/HG/xen-unstable.hg
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 2 changes to 2 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 03:24:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 03:24:00 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RR04W-0004Te-OH; Thu, 17 Nov 2011 03:24:00 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RR03d-00044Y-HW
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 03:23:07 -0800
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1321528981!4587230!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14932 invoked from network); 17 Nov 2011 11:23:02 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Nov 2011 11:23:02 -0000
X-IronPort-AV: E=Sophos;i="4.69,526,1315195200"; d="scan'208";a="170960703"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Nov 2011 06:23:00 -0500
Received: from [10.80.2.18] (10.80.2.18) by FTLPMAILMX02.citrite.net
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Thu, 17 Nov 2011
	06:23:00 -0500
Message-ID: <4EC4EE93.3040303@citrix.com>
Date: Thu, 17 Nov 2011 11:22:59 +0000
From: Andrew Cooper <andrew.cooper3@citrix.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110921 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 1 of 5] [mq]: sched-credit-options
References: <b83edf5a1c9483b908da.1321527025@nehalem1>
	<1321528600.3664.264.camel@zakaz.uk.xensource.com>
In-Reply-To: <1321528600.3664.264.camel@zakaz.uk.xensource.com>
X-Enigmail-Version: 1.1.2
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 7bit
Cc: Juergen Gross <juergen.gross@ts.fujitsu.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 17/11/11 11:16, Ian Campbell wrote:
> On Thu, 2011-11-17 at 10:50 +0000, Juergen Gross wrote:
>> Patch subject is complete summary.
> I think you've forgotten to qrefresh to pickup the real summary or
> something (for all mails).
>
> Ian.

Depending on which options you pass to patchbomb, you sometimes have to
pop and push all before comments get picked up.

~Andrew (who will make an alteration to the relevant web page to this
effect)

>>
>> 2 files changed, 26 insertions(+), 7 deletions(-)
>> docs/man/xl.pod.1        |   15 ++++++++++-----
>> tools/libxl/xl_cmdimpl.c |   18 ++++++++++++++++--
>>
>>
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Nov 17 03:32:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 17 Nov 2011 03:32:43 -0800
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RR0Cx-00056X-Mf; Thu, 17 Nov 2011 03:32:43 -0800
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RR0CX-0004uc-Nf
	for xen-devel@lists.xensource.com; Thu, 17 Nov 2011 03:32:18 -0800
X-Env-Sender: linux@eikelenboom.it
X-Msg-Ref: server-15.tower-21.messagelabs.com!1321529534!4580566!1
X-Originating-IP: [188.40.164.121]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20693 invoked from network); 17 Nov 2011 11:32:14 -0000
Received: from static.121.164.40.188.clients.your-server.de (HELO
	smtp.eikelenboom.it) (188.40.164.121)
	by server-15.tower-21.messagelabs.com with AES256-SHA encrypted SMTP;
	17 Nov 2011 11:32:14 -0000
Received: from 31-73-ftth.onsneteindhoven.nl ([88.159.73.31]:50780
	helo=[172.16.1.220])
	by smtp.eikelenboom.it with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32)
	(Exim 4.72) (envelope-from <linux@eikelenboom.it>)
	id 1RR09Z-0002nE-Ly; Thu, 17 Nov 2011 12:29:13 +0100
Date: Thu, 17 Nov 2011 12:32:11 +0100
From: Sander Eikelenboom <linux@eikelenboom.it>
Organization: Eikelenboom IT services
X-Priority: 3 (Normal)
Message-ID: <496217016.20111117123211@eikelenboom.it>
To: Keir Fraser <keir@xen.org>
Subject: Re: [Xen-devel] [xen-4.1-testing test] 9805: regressions - FAIL
In-Reply-To: <CAEA944D.343E5%keir@xen.org>
References: <4EC4E1DD.1030309@canonical.com> <CAEA944D.343E5%keir@xen.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: quoted-printable
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Stefan Bader <stefan.bader@canonical.com>, Jan Beulich <JBeulich@suse.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hello Keir,

Thursday, November 17, 2011, 11:37:01 AM, you wrote:

> On 17/11/2011 10:28, "Stefan Bader" <stefan.bader@canonical.com> wrote:

>>>> Hm, yes we should. I am pretty sure I hit that code path often enough,
>>>> Wonder
>>>> why I never saw any dead lock there...
>>>=20
>>> Perhaps your dom0 kernel doesn't register a pirq_eoi_map.
>>>=20
>> Would be the only explanation. And quite possible. Heck, I would need to=
 know
>> what that is used for anyway. :/ The kernel is 3.0 based the interrupt I=
 was
>> looking at just was a normal apic emulated through events one...

> Our automated tests still use 2.6.32. It wouldn't surprise me if upstream
> Linux 3 doesn't have the pirq_eoi_map stuff; it's an optimisation rather
> than core absolutely-required functionality.

Don't know how much room (time wise) the machines that do the automated tes=
ting have, but additional tests based on latest 3.x and/or konrad's linux-n=
ext branch should perhaps be considered ?
Especially since they upstream path is getting more and more feature comple=
te and usable.

--
Sander

> It's the dom0 PV kernel that matters in this case by the way, not the ker=
nel
> that you are running in HVM mode as a domU.

>  -- Keir







--=20
Best regards,
 Sander                            mailto:linux@eikelenboom.it


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

